@lmctl-ai/lmctl 0.1.49 → 0.1.51
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli/index.js +129 -124
- package/package.json +1 -1
package/dist/cli/index.js
CHANGED
|
@@ -456,7 +456,7 @@ var PT=Object.defineProperty;var b=(t,e)=>()=>(t&&(e=t(t=0)),e);var ce=(t,e)=>{f
|
|
|
456
456
|
ALTER TABLE team_connection_v37 RENAME TO team_connection;
|
|
457
457
|
`),t.pragma("user_version = 37"),r=37),r<38&&r!==0&&(ve(t,"agent_inflight").has("active_count")||t.exec("ALTER TABLE agent_inflight ADD COLUMN active_count INTEGER NOT NULL DEFAULT 1;"),t.exec("DROP TABLE IF EXISTS team_connection;"),t.pragma("user_version = 38"),r=38),r<39&&r!==0&&(ve(t,"agent_inflight").has("holder_pid")||t.exec("ALTER TABLE agent_inflight ADD COLUMN holder_pid INTEGER;"),t.pragma("user_version = 39"),r=39),Gk(tv)}function ve(t,e){let r=t.prepare(`PRAGMA table_info(${e})`).all();return new Set(r.map(n=>n.name))}function nv(t,e){return t.prepare("SELECT name FROM sqlite_master WHERE type = 'table' AND name = ?").get(e)!==void 0}function Zf(t){let e=t.pragma("user_version",{simple:!0});return typeof e=="number"?e:0}function sv(){return process.env.LMCTL_DB??zk(Yk(),".lmctl","state.db")}var zf,ev,tv,al,cl=b(()=>{"use strict";il();zf=Kf(Zk(import.meta.url)),ev=Yf(zf,"schema.sql"),tv=Yf(zf,"migrations"),al=39;if(process.argv[1]&&import.meta.url===Qk(process.argv[1]).href){let t=ll({dbPath:process.argv[2]??sv()});try{process.stdout.write(`migrated user_version=${Zf(t)}
|
|
458
458
|
`)}finally{t.close()}}});function Ur(t){return typeof t=="string"&&ov.has(t)}function tm(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: ${Zs[0]}`,` STANCE: ${Zs[1]}`,` STANCE: ${Zs[2]}`,` STANCE: ${Qf}: <one short sentence: why no declared outcome fits>`,"Never invent a different outcome; never leave the STANCE line out."].join(`
|
|
459
|
-
`)}var Qf,Zs,ov,Dn,em,ul,Qs,Pn=b(()=>{"use strict";Qf="other",Zs=["not_enough_information","dont_know","other_work"],ov=new Set([Qf,...Zs]),Dn="@abort",em="invalid_decision",ul="escalation_aborted",Qs="workflow_escalation"});import{randomUUID as iv}from"node:crypto";function Ie(t){return t.provider_resolved??t.provider}function
|
|
459
|
+
`)}var Qf,Zs,ov,Dn,em,ul,Qs,Pn=b(()=>{"use strict";Qf="other",Zs=["not_enough_information","dont_know","other_work"],ov=new Set([Qf,...Zs]),Dn="@abort",em="invalid_decision",ul="escalation_aborted",Qs="workflow_escalation"});import{randomUUID as iv}from"node:crypto";function Ie(t){return t.provider_resolved??t.provider}function P(){return new Date().toISOString()}function pe(t){return new dl(ll({dbPath:t.path}))}function rm(t,e,r){let n=nm(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 nm(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 nm(t){let e=av(t),r=e===null?null:lv(e,"states");if(r===null)return[];let n=[];for(let s of Object.values(r))fl(s)&&s.type==="Subflow"&&typeof s.workflow_name=="string"&&s.workflow_name.length>0&&n.push(s.workflow_name);return n}function av(t){try{let e=JSON.parse(t);return fl(e)?e:null}catch{return null}}function lv(t,e){let r=t[e];return fl(r)?r:null}function fl(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function cv(t){return{insertWorkflow:t.prepare(`
|
|
460
460
|
INSERT INTO workflow (name, version, definition_schema_version, definition, created_at)
|
|
461
461
|
VALUES (?, ?, ?, ?, ?)
|
|
462
462
|
`),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(`
|
|
@@ -961,7 +961,7 @@ var PT=Object.defineProperty;var b=(t,e)=>()=>(t&&(e=t(t=0)),e);var ce=(t,e)=>{f
|
|
|
961
961
|
AND sender_teamfile = ?
|
|
962
962
|
AND sender_alias = ?
|
|
963
963
|
AND active_count > 1
|
|
964
|
-
`),clearAgentInflightOlderThan:t.prepare("DELETE FROM agent_inflight WHERE started_at < ?")}}function uv(t,e){return e===void 0?{resumed:!1,reason:t}:{resumed:!1,reason:t,valid:e}}var dl,Pe=b(()=>{"use strict";cl();Pn();dl=class{db;stmts;claimTxn;claimWithConcurrencyTxn;claimByIdWithConcurrencyTxn;resumeRunTxn;resumeInteractiveTxn;resumeEscalationTxn;tryAcquireAgentInflightTxn;constructor(e){e.pragma("foreign_keys = ON"),this.db=e,this.stmts=cv(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 p=this.getJob(a.id);return{claimed:!1,reason:p?.locked_until!==null&&p?.locked_until!==void 0&&p.locked_until>=o?"locked":"not_claimable",job_id:r,status:p?.status??a.status,locked_by:p?.locked_by??a.locked_by,locked_until:p?.locked_until??a.locked_until}}let m=this.getJob(a.id);return m===null?{claimed:!1,reason:"not_found",job_id:r}:{claimed:!0,job:m}}),this.resumeRunTxn=e.transaction((r,n,s)=>uv("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!==Qs)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!==Dn&&!a.includes(n))return{resumed:!1,reason:em};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.tryAcquireAgentInflightTxn=(r,n={})=>{this.db.exec("BEGIN IMMEDIATE");try{let s=n.reclaim_observed,o=this.stmts.acquireAgentInflight.get({...r,holder_pid:process.pid,stale_before:n.stale_before??null,force:n.force===!0?1:0,reclaim_observed_sender_teamfile:s?.sender_teamfile??null,reclaim_observed_sender_alias:s?.sender_alias??null,reclaim_observed_started_at:s?.started_at??null,reclaim_observed_holder_is_null:s?.holder_pid===null?1:0,reclaim_observed_holder_pid:typeof s?.holder_pid=="number"?s.holder_pid:null}),i=o!==void 0?{acquired:!0,current:o}:{acquired:!1,current:this.getAgentInflight(r.receiver_teamfile,r.receiver_alias)??(()=>{throw new Error("agent_inflight conflict row disappeared during acquire")})()};return this.db.exec("COMMIT"),i}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){rm(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){rm(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=iv(),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()}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}listAgentInflight(){return this.stmts.listAgentInflight.all()}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 dv}from"node:fs";import{resolve as fv}from"node:path";function ml(t){let e=fv(t);try{return dv(e)}catch{return e}}var sm=b(()=>{"use strict"});import{platform as om}from"node:os";function _t(t){let e=new Fn;for(let r of t)e.registerAdapter(r);return e}var Fn,pl=b(()=>{"use strict";sm();Fn=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=ml(e.workspace);o=o.filter(a=>ml(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=om()==="darwin"||om()==="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 im}from"node:fs";import{createInterface as am}from"node:readline";import{stat as mv}from"node:fs/promises";import{homedir as pv}from"node:os";async function*Fe(t){let e=im(t,{encoding:"utf-8"}),r=am({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 Le(t,e){let r=[],n=im(t,{encoding:"utf-8"}),s=am({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 mv(t);return{createdAt:e.birthtime,modifiedAt:e.mtime}}function de(t){return t.replace(/\\n/g,`
|
|
964
|
+
`),clearAgentInflightOlderThan:t.prepare("DELETE FROM agent_inflight WHERE started_at < ?")}}function uv(t,e){return e===void 0?{resumed:!1,reason:t}:{resumed:!1,reason:t,valid:e}}var dl,Pe=b(()=>{"use strict";cl();Pn();dl=class{db;stmts;claimTxn;claimWithConcurrencyTxn;claimByIdWithConcurrencyTxn;resumeRunTxn;resumeInteractiveTxn;resumeEscalationTxn;tryAcquireAgentInflightTxn;constructor(e){e.pragma("foreign_keys = ON"),this.db=e,this.stmts=cv(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 p=this.getJob(a.id);return{claimed:!1,reason:p?.locked_until!==null&&p?.locked_until!==void 0&&p.locked_until>=o?"locked":"not_claimable",job_id:r,status:p?.status??a.status,locked_by:p?.locked_by??a.locked_by,locked_until:p?.locked_until??a.locked_until}}let m=this.getJob(a.id);return m===null?{claimed:!1,reason:"not_found",job_id:r}:{claimed:!0,job:m}}),this.resumeRunTxn=e.transaction((r,n,s)=>uv("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!==Qs)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!==Dn&&!a.includes(n))return{resumed:!1,reason:em};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.tryAcquireAgentInflightTxn=(r,n={})=>{this.db.exec("BEGIN IMMEDIATE");try{let s=n.reclaim_observed,o=this.stmts.acquireAgentInflight.get({...r,holder_pid:process.pid,stale_before:n.stale_before??null,force:n.force===!0?1:0,reclaim_observed_sender_teamfile:s?.sender_teamfile??null,reclaim_observed_sender_alias:s?.sender_alias??null,reclaim_observed_started_at:s?.started_at??null,reclaim_observed_holder_is_null:s?.holder_pid===null?1:0,reclaim_observed_holder_pid:typeof s?.holder_pid=="number"?s.holder_pid:null}),i=o!==void 0?{acquired:!0,current:o}:{acquired:!1,current:this.getAgentInflight(r.receiver_teamfile,r.receiver_alias)??(()=>{throw new Error("agent_inflight conflict row disappeared during acquire")})()};return this.db.exec("COMMIT"),i}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){rm(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,P()),n=this.getWorkflow(Number(r.lastInsertRowid)),s=this.stmts.insertWorkflowVersion.run(n.id,n.version,e.definition,e.author??null,P());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){rm(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,P());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,P())}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,P());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,P()),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,P(),e),this.stmts.getTriggerInstance.get(e)??null}setTriggerFailure(e,r){return this.stmts.setTriggerFailure.run(P(),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,P());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,P());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,P(),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,P());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",P());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,P());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=P(),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,P(),e)??null}claimIssue(e,r){return this.stmts.claimIssue.get(r,P(),e)??null}closeIssue(e,r,n){let s=P(),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,P(),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,P(),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=P();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,P(),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,P(),e).changes===0)throw new Error(`webui_session not found: ${e}`);return this.stmts.getWebuiSession.get(e)}createChatbotSession(e,r){let n=iv(),s=P();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=P(),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,P())}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??P(),e.dedupe_key??null,e.concurrency_key??null,P());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=P(),n=new Date(Date.now()+e.lease_ms).toISOString();return this.claimTxn(e.worker_id,n,r)}claimNextJobWithConcurrency(e){let r=P(),n=new Date(Date.now()+e.lease_ms).toISOString();return this.claimWithConcurrencyTxn(e.worker_id,n,r,e.evaluator)}claimJobByIdWithConcurrency(e){let r=P(),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:P();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,P()),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,P()),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??P(),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,P());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=P(),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,P(),e.id),this.getWebProject(e.id))}softDeleteWebProject(e){return this.stmts.softDeleteWebProject.run(P(),e).changes===1}loadMailboxCursor(e,r){return this.stmts.loadMailboxCursor.get(e,r)??null}saveMailboxCursor(e){this.stmts.saveMailboxCursor.run(e.user_id,e.mailbox_key,e.last_processed_version_id,e.last_processed_seq??null,e.last_processed_at)}addUsage(e){this.stmts.addUsage.run(e.user_id,e.device_id,e.period,e.put,e.get,e.list,e.updated_at)}loadUsage(e,r,n){return this.stmts.loadUsage.get(e,r,n)??null}sumUsageForPeriod(e,r){let n=this.stmts.sumUsageForPeriod.get(e,r);return{put:n?.put??0,get:n?.get??0,list:n?.list??0}}upsertRootTeam(e){this.stmts.upsertRootTeam.run(e.teamfile_path,e.name,e.raw_text,e.raw_sha256,e.registered_at,e.last_seeded_at)}getRootTeam(e){return this.stmts.getRootTeam.get(e)??null}listRootTeams(){return this.stmts.listRootTeams.all()}insertTeamChatLog(e){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}listAgentInflight(){return this.stmts.listAgentInflight.all()}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,P(),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,P())}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,P());return this.stmts.getStep.get(r.lastInsertRowid)}finishStep(e,r,n){return this.stmts.finishStep.run(r??null,n??null,P(),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??P(),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,P());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,P()).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,P()),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,P());return this.stmts.getAttention.get(r.lastInsertRowid)}acknowledgeAttention(e){return this.stmts.ackAttention.run(P(),e),this.stmts.getAttention.get(e)??null}upsertDurableMemory(e){let r=P();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??P());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,P())}resumeEscalation(e,r){return this.resumeEscalationTxn(e,r,P())}}});import{realpathSync as dv}from"node:fs";import{resolve as fv}from"node:path";function ml(t){let e=fv(t);try{return dv(e)}catch{return e}}var sm=b(()=>{"use strict"});import{platform as om}from"node:os";function _t(t){let e=new Fn;for(let r of t)e.registerAdapter(r);return e}var Fn,pl=b(()=>{"use strict";sm();Fn=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=ml(e.workspace);o=o.filter(a=>ml(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=om()==="darwin"||om()==="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 im}from"node:fs";import{createInterface as am}from"node:readline";import{stat as mv}from"node:fs/promises";import{homedir as pv}from"node:os";async function*Fe(t){let e=im(t,{encoding:"utf-8"}),r=am({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 Le(t,e){let r=[],n=im(t,{encoding:"utf-8"}),s=am({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 mv(t);return{createdAt:e.birthtime,modifiedAt:e.mtime}}function de(t){return t.replace(/\\n/g,`
|
|
965
965
|
`).replace(/\\t/g," ").replace(/\\r/g,"\r")}function V(t,e){return t.length<=e?t:t.slice(0,e-3)+"..."}var Te,Jt=b(()=>{"use strict";Te=pv()});import{readdir as eo,stat as lm,unlink as hv}from"node:fs/promises";import{join as Wr,basename as cm}from"node:path";function _v(t){return t==="file-history-snapshot"||t==="progress"||t==="system"||t==="queue-operation"}function gv(t){if(t.type==="system"){let e=t.message?.content;if(typeof e=="string"&&e.trim())return de(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 um(t){let e=0,r=0,n=0,s=0,o=0,i=0,a;for await(let l of Fe(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,m=u.cache_read_input_tokens||0,p=u.output_tokens||0;r+=d+f+m,n+=m,s+=f,o+=p;let h=d+f+m;h&&(i=h),a={inputTokens:d,cacheWriteInputTokens:f,cachedInputTokens:m,outputTokens:p}}}}return{messageCount:e,totalInputTokens:r,totalCacheReadInputTokens:n,totalCacheWriteInputTokens:s,totalOutputTokens:o,lastInputTokens:i,lastTokenUsage:a}}var to,dm=b(()=>{"use strict";Jt();to=class{name="claude";claudeDir;projectsDir;constructor(e={}){this.claudeDir=e.claudeDir||Wr(Te,".claude"),this.projectsDir=Wr(this.claudeDir,"projects")}getWatchPaths(){return[{directory:this.projectsDir,filePattern:/\.jsonl$/}]}async discoverSessions(){let e=[],r;try{r=await eo(this.projectsDir)}catch{return e}for(let n of r){let s=Wr(this.projectsDir,n);if(!(await lm(s).catch(()=>null))?.isDirectory())continue;let i;try{i=await eo(s)}catch{continue}for(let a of i){if(!a.endsWith(".jsonl"))continue;let l=cm(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 Le(e,50),s=await Ne(e),o="",i,a,l,c,u,d;for(let m of n)if(!_v(m.type)&&(!o&&m.cwd&&(o=m.cwd),!i&&m.slug&&(i=m.slug),!a&&m.version&&(a=m.version),!d&&m.timestamp&&(d=new Date(m.timestamp)),m.type==="assistant"&&m.message?.model&&(l=m.message.model),m.type==="user"&&!m.isMeta&&m.message)){let p=m.message.content;if(typeof p=="string"){if(p.includes("<command-name>")||p.includes("<local-command-"))continue;c||(c=V(p.trim(),80)),u=V(p.trim(),80)}}if(!o)return null;let f=await um(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,m=e;for await(let h of Fe(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&&(m=h.sessionId),h.type==="system"||h.type==="progress"||h.type==="queue-operation"){s.push({role:"system",timestamp:new Date(h.timestamp||0),content:gv(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=V(_.trim(),80)),d=V(_.trim(),80),s.push({role:"user",timestamp:g,content:de(_.trim())})}else if(Array.isArray(_)){for(let T of _)if(T.type==="tool_result"){let E=typeof T.content=="string"?de(T.content):JSON.stringify(T.content);s.push({role:"tool_result",timestamp:g,content:E,toolCallId:T.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 T of _)T.type==="text"&&T.text?s.push({role:"assistant",timestamp:g,content:de(T.text),model:h.message.model}):T.type==="tool_use"?s.push({role:"tool_use",timestamp:g,content:T.name||"unknown tool",toolName:T.name,toolInput:JSON.stringify(T.input,null,2),toolCallId:T.id,model:h.message.model}):T.type==="thinking"&&T.thinking&&s.push({role:"thinking",timestamp:g,content:T.thinking})}}if(!o)return null;let p=await um(r);return{provider:"claude",sessionId:m,slug:i,cwd:o,createdAt:f||n.createdAt,modifiedAt:n.modifiedAt,model:l,cliVersion:a,startCommand:"claude",gitBranch:c,firstUserMessage:u,lastUserMessage:d,messageCount:p.messageCount,filePath:r,totalInputTokens:p.totalInputTokens||void 0,totalCachedInputTokens:p.totalCacheReadInputTokens||void 0,totalCacheWriteInputTokens:p.totalCacheWriteInputTokens||void 0,totalOutputTokens:p.totalOutputTokens||void 0,lastInputTokens:p.lastInputTokens||void 0,lastTokenUsage:p.lastTokenUsage,messages:s}}async resolveSessionPath(e){return this.resolveSessionFile(e)}async deleteSession(e){let r=await this.resolveSessionFile(e);return r?(await hv(r),!0):!1}async resolveSessionFile(e){let r;try{r=await eo(this.projectsDir)}catch{return null}let n=[];for(let i of r){let a=Wr(this.projectsDir,i);if(!(await lm(a).catch(()=>null))?.isDirectory())continue;let c;try{c=await eo(a)}catch{continue}for(let u of c){if(!u.endsWith(".jsonl"))continue;let d=cm(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 Le(i.filePath,20);for(let l of a)if(l.slug&&l.slug===e)return i.filePath}return null}}});function ro(t){return"'"+t.replace(/'/g,"'\\''")+"'"}function yv(t,e,r){if(!r)return"";let n=t.tools[e]??hl[e],s=n?.profiles?.[r]?.flags??hl[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 fm(t,e){return!!t.tools[e]}function mm(t,e,r,n,s){let o=t.tools[e]??hl[e],i;if(o?.agent){let l=ro(n);i=o.agent.replace(/\{\{session_id\}\}/g,r).replace(/\{\{prompt\}\}/g,l)}else{let l=wv[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(ro).join(" ");i=`printf '%s\\n' ${ro(n)} | ${u}`}else i=c.map(ro).join(" ")}let a=yv(t,e,s);return a&&(i+=" "+a),i}var hl,wv,pm=b(()=>{"use strict";hl={claude:{start:"claude",resume:"claude --resume {{session_id}} --dangerously-skip-permissions",profiles:{default:{description:"Default profile",flags:""}}},codex:{start:"codex",resume:"codex resume {{session_id}} --dangerously-bypass-approvals-and-sandbox",profiles:{default:{description:"Default profile",flags:""}}},opencode:{start:"opencode",resume:"opencode --session {{session_id}}",profiles:{default:{description:"Default profile",flags:""}}},gemini:{start:"gemini",resume:"gemini --resume {{session_id}} -y",profiles:{default:{description:"Default profile",flags:""}}},copilot:{start:"copilot",resume:"copilot --resume={{session_id}} --yolo",profiles:{default:{description:"Default profile",flags:""}}},qwen:{start:"qwen",resume:"qwen --resume {{session_id}} --approval-mode yolo",profiles:{default:{description:"Default profile",flags:""}}},agy:{start:"agy",resume:"agy --conversation {{session_id}} --dangerously-skip-permissions",profiles:{default:{description:"Default profile",flags:""}}}},wv={claude:{mode:"argv",argv:["claude","-p","{{prompt}}","--resume","{{session_id}}"]},codex:{mode:"argv",argv:["codex","exec","--dangerously-bypass-approvals-and-sandbox","--skip-git-repo-check","resume","{{session_id}}","{{prompt}}"]},opencode:{mode:"argv",argv:["opencode","run","--session","{{session_id}}","{{prompt}}"]},gemini:{mode:"argv",argv:["gemini","-p","{{prompt}}","--resume","{{session_id}}"]},copilot:{mode:"argv",argv:["gh","copilot","--","--resume={{session_id}}","-p","{{prompt}}","-s","--allow-all-tools"]},qwen:{mode:"argv",argv:["qwen","-p","{{prompt}}","--resume","{{session_id}}","--approval-mode","yolo"]},agy:{mode:"argv",argv:["agy","--conversation","{{session_id}}","-p","{{prompt}}","--dangerously-skip-permissions","--print-timeout","8h"]}}});function hm(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 _m=b(()=>{"use strict"});var Ev,xe,no,Nt=b(()=>{"use strict";Ev="ACK: waiting for explicit lmctl task.",xe=`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: ${Ev}`,no=`send this exact lmctl seed instruction: "${xe}"`});function Ke(t,e){return e===void 0||e.length===0?t:{...t??process.env,[_l]:e}}var _l,Xt=b(()=>{"use strict";_l="LMCTL_SELF_SESSIONID"});import{spawn as gm}from"node:child_process";import{mkdirSync as bv}from"node:fs";var gl,Oe,Gt=b(()=>{"use strict";pm();_m();Nt();Xt();gl=class t extends Error{cancelReason;constructor(e,r){super(e),this.name="TurnAbortError",this.cancelReason=r,Object.setPrototypeOf(this,t.prototype)}},Oe=class t{name;capabilities;injection;provider;binary;seedArgs;seedStdin;resumeTemplate;startTemplate;transportFn;constructor(e){this.name=e.provider.name,this.provider=e.provider,this.capabilities=e.capabilities,this.injection=e.injection,this.binary=e.binary,this.seedArgs=e.seedArgs,this.seedStdin=e.seedStdin,this.resumeTemplate=e.resumeTemplate,this.startTemplate=e.startTemplate,this.transportFn=e.transport}discover(){return this.provider.discoverSessions()}load(e){return this.provider.loadSession(e)}resolvePath(e){return this.provider.resolveSessionPath(e)}delete(e){return this.provider.deleteSession(e)}getWatchPaths(){return this.provider.getWatchPaths?.()??[]}seedArgsFor(e){let r=e?.prompt;return r===void 0?this.seedArgs:this.seedArgs.map(n=>n===xe?r:n)}seed(e,r){return bv(e,{recursive:!0}),new Promise(n=>{let s;try{s=gm(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}
|
|
966
966
|
`: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:no,lsCommand:`lmctl ls --provider ${this.name} --sessiondir ${e}`}}static DEFAULT_IDLE_TIMEOUT_MS=8*60*60*1e3;sendTurn(e,r){if(r.userConfig&&fm(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:p=>{a+=p,c(),n.onDelta?.(p)},onProgress:p=>{p.kind!=="api_retry"&&c(),n.onProgress?.(p)}},f=this.transportFn(r,d).then(p=>(u(),{...p,status:"ok"})).catch(p=>{throw u(),i==="external"?new gl("Turn cancelled","external"):p}),m=new Promise(p=>{l=p});return Promise.race([f,m])}runOneShotAgent(e,r,n){let s=mm(r.userConfig,this.name,r.sessionId,e,r.profile),o=Date.now();return new Promise((i,a)=>{let l=hm(r.env),c=gm(s,{shell:!0,cwd:r.cwd,env:Ke(r.env,r.sessionId),stdio:["pipe","pipe","pipe"]}),u=!1,d=!1,f=setTimeout(()=>{d=!0,c.kill()},l),m="",p="";if(c.stdout?.on("data",h=>{let g=h.toString();m+=g,r.onDelta?.(g)}),c.stderr?.on("data",h=>{p+=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:m.trim(),sessionId:r.sessionId,durationMs:g}):a(new Error(p.trim().slice(0,200)||`Agent command exited with code ${h}`))}),c.on("error",h=>{u||(u=!0,clearTimeout(f),a(h))})})}}});function oo(t,e){let r;if(e&&typeof e=="object"){let n=e.code;typeof n=="number"&&(r=n)}return new $t(t,r,e)}var Ye,ye,xt,so,$t,Br=b(()=>{"use strict";Ye=class extends Error{constructor(e,r){super(e,r),this.name=this.constructor.name}},ye=class extends Ye{},xt=class extends Ye{exitCode;signal;stderr;constructor(e,r,n=null,s){super(e),this.exitCode=r,this.signal=n,this.stderr=s}},so=class extends Ye{line;constructor(e,r,n){super(e,{cause:n}),this.line=r}},$t=class extends Ye{rpcCode;rpcData;constructor(e,r,n){super(e),r!==void 0&&(this.rpcCode=r),n!==void 0&&(this.rpcData=n)}}});import*as yl from"node:child_process";function Tv(t){if(typeof yl.spawnSync=="function")try{yl.spawnSync("taskkill",["/T","/F","/PID",String(t)],{windowsHide:!0})}catch{}}function wm(t){return t.exitCode!==null||t.signalCode!==null}function wl(t,e){return wm(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 it(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??Tv;if(wm(t))return{signal:"natural",elapsedMs:Date.now()-r};if(n&&t.stdin&&!t.stdin.destroyed)try{t.stdin.end()}catch{}if(await wl(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 wl(t,o))return{signal:"SIGTERM",elapsedMs:Date.now()-r};if(i!=="win32")try{t.kill("SIGKILL")}catch{}return await wl(t,Sv)?{signal:"SIGKILL",elapsedMs:Date.now()-r}:{signal:"abandoned",elapsedMs:Date.now()-r}}var Sv,io=b(()=>{"use strict";Sv=1e3});function ym(t){Se()&&process.stderr.write(`[debug] ${t}
|
|
967
967
|
`)}function qr(t,e){let r=vv[t];if(r)return r[e]??r.yolo}function Nv(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 Vt(t,e,r="yolo"){if(Iv.has(t)){ym(`YOLO ${t} [mode=${r}]: ${t==="codex"?`JSON-RPC params (approvalPolicy=never, sandbox=${r==="plan"?"read-only":"danger-full-access"})`:t==="opencode"?".opencode/opencode.json (permission=allow)":"protocol/config (out-of-band)"} \u2014 no argv flag`);return}let n=r==="plan"?qr(t,"plan"):kv[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 Z({event:"yolo_assert_failed",provider:t,reason:"unconfigured_provider",args:e.join(" "),message:s}),new ye(s)}if(!Nv(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 Z({event:"yolo_assert_failed",provider:t,reason:"flag_missing",required_flag:s,mode:r,args:e.join(" "),message:o}),new ye(o)}ym(`YOLO ${t} [mode=${r}]: argv flag '${n.join(" ")}'`)}var kv,vv,Iv,Un=b(()=>{"use strict";Br();je();kv={claude:["--dangerously-skip-permissions"],qwen:["--approval-mode","yolo"],gemini:["-y"],copilot:["--yolo"],agy:["--dangerously-skip-permissions"]},vv={claude:{yolo:["--dangerously-skip-permissions"],plan:["--permission-mode","plan"]},qwen:{yolo:["--approval-mode","yolo"],plan:["--approval-mode","plan"]},gemini:{yolo:["-y"],plan:["--approval-mode","plan"]},copilot:{yolo:["--yolo"],plan:["--yolo"]},agy:{yolo:["--dangerously-skip-permissions"],plan:["--dangerously-skip-permissions"]}};Iv=new Set(["codex","opencode"])});import{spawn as xv}from"node:child_process";import{existsSync as $v}from"node:fs";function Av(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(`
|
|
@@ -978,25 +978,25 @@ ${r}`:r}function Em(t,e){return new Promise((r,n)=>{let s=e.tool||"claude",o=e.b
|
|
|
978
978
|
One possible cause: Codex stopped before delivering a terminal turn/completed event.`;return e?`Original provider error:
|
|
979
979
|
${e}
|
|
980
980
|
|
|
981
|
-
${r}`:r}function n0(t,e){let r=e0(t);return r.willRetry||(e.pendingCodexError=r.turnError),r}function s0(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 Tm(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)}`);let i=e.isLead??e.alias?.toLowerCase()==="lead";i&&o.push(...lo()),Se()&&ot(JSON.stringify({event:"codex_mcp_inject",alias:e.alias??null,isLead:i,injected:i}));let a=e.permissionMode??"yolo",l=Kv(a);try{Vt("codex",o,a)}catch(
|
|
982
|
-
`)})}function
|
|
983
|
-
`)}d.on("line",
|
|
984
|
-
`);let
|
|
981
|
+
${r}`:r}function n0(t,e){let r=e0(t);return r.willRetry||(e.pendingCodexError=r.turnError),r}function s0(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 Tm(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)}`);let i=e.isLead??e.alias?.toLowerCase()==="lead";i&&o.push(...lo()),Se()&&ot(JSON.stringify({event:"codex_mcp_inject",alias:e.alias??null,isLead:i,injected:i}));let a=e.permissionMode??"yolo",l=Kv(a);try{Vt("codex",o,a)}catch(D){return n(D)}if(e.cwd&&!Xv(e.cwd))return Z({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 c=Hv(s,o,{cwd:e.cwd,stdio:["pipe","pipe","pipe"],env:Ke(e.env,e.threadId)}),u=!1;if(e.signal){if(e.signal.aborted)return u=!0,Z({event:"transport_abort",provider:"codex",phase:"pre_spawn"}),it(c).catch(()=>{}),n(new Error("Aborted"));e.signal.addEventListener("abort",()=>{u=!0,Z({event:"transport_abort",provider:"codex"}),it(c).catch(()=>{}),n(new Error("Aborted"))},{once:!0})}let d=Jv({input:c.stdout}),f=new Map,m=1,p=e.threadId||"",h="",g=!1,_=!1,T=Date.now(),E=Zv(),k=t0();function $(D,C={}){return new Promise((H,R)=>{let U=m++;f.set(U,{resolve:H,reject:R});let z=JSON.stringify({jsonrpc:"2.0",id:U,method:D,params:C});c.stdin?.write(z+`
|
|
982
|
+
`)})}function N(D,C={}){let H=JSON.stringify({jsonrpc:"2.0",method:D,params:C});c.stdin?.write(H+`
|
|
983
|
+
`)}d.on("line",D=>{let C;try{C=JSON.parse(D)}catch{return}if(typeof C.id=="number"&&f.has(C.id)){let U=f.get(C.id);if(f.delete(C.id),C.error){let z=C.error,v=typeof z?.message=="string"&&z.message.length>0?z.message:JSON.stringify(C.error);U.reject(oo(`codex app-server error: ${v}`,z))}else U.resolve(C);e.onEvent?.(C);return}let H=C.method;if(!H){e.onEvent?.(C);return}if(H==="thread/started"){let z=C.params?.thread;z?.id&&(p=z.id)}let R=Se()?U=>{Kt("item.text/buffer-mismatch",{itemId:U.itemId,threadId:U.threadId??null,turnId:U.turnId??null,expectedFromItemText:U.expectedFromItemText,gotFromBuffer:U.gotFromBuffer,expectedLen:U.expectedFromItemText.length,gotLen:U.gotFromBuffer.length})}:void 0;if(H==="turn/started"){let U=C.params,z=U?.turn;z?.id&&(h=z.id),Sm(C,E,e.onDelta,R),Se()&&Kt("turn/started",{params:U??null})}if(Se()&&(H==="item/started"||H==="item/completed")){let U=C.params;U?.item?.type==="agentMessage"&&Kt(H,{params:U??null})}if(H==="item/started"||H==="item/agentMessage/delta"||H==="item/completed"){if(H==="item/agentMessage/delta"){let U=C.params;Se()&&Kt("agentMessage/delta",{params:U??null})}Sm(C,E,e.onDelta,R)}if(H==="turn/completed"){let U=C.params;if(Se())for(let[v,I]of E.agentItems.entries())I.buffer&&Kt("turn/completed/unflushed-item",{itemId:v,phase:I.phase,bufferLen:I.buffer.length});Qv(E),Se()&&Kt("turn/completed",{params:U??null});let z=s0(C,k);z.shouldReject?(Se()&&Kt("turn/completed/terminal-reject",{message:z.turnError.message}),_=!0,g=!0,c.stdin?.end(),n(z.turnError)):(g=!0,c.stdin?.end())}if(H==="error"){let U=n0(C,k);if(Se()){let z=C.params,v=z?.error,I=typeof v?.message=="string"?v.message:"(no message)";Kt(U.willRetry?"error/retry":"error/terminal-deferred",{message:I,willRetry:U.willRetry,params:z??null})}}e.onEvent?.(C)});let A="";c.stderr?.on("data",D=>{A+=D.toString()}),c.on("error",D=>{Z({event:"transport_error",provider:"codex",error_class:"TransportConnectionError",error_message:D.message}),n(new ye(`Failed to spawn codex app-server: ${D.message}`,{cause:D}))}),c.on("exit",D=>{if(!u&&!_){if(g){r({result:E.resultText,threadId:p,turnId:h,durationMs:Date.now()-T,exitCode:D});return}if(k.pendingCodexError){n(k.pendingCodexError);return}Z({event:"transport_error",provider:"codex",error_class:"Error",reason:"provider_no_result",exit_code:D,stderr_tail:A.slice(0,500)}),n(new Error(r0({exitCode:D,stderr:A})))}}),(async()=>{try{if(await $("initialize",zv()),N("initialized",{}),e.threadId)try{let D=$("thread/resume",{threadId:e.threadId,sandbox:l,approvalPolicy:"never",...e.model?{model:e.model}:{}}),C=new Promise((H,R)=>setTimeout(()=>R(new Error("resume timeout")),5e3));await Promise.race([D,C]),p=e.threadId}catch{process.stderr.write(`[codex] thread/resume failed, creating new thread
|
|
984
|
+
`);let C=(await $("thread/start",{cwd:e.cwd,approvalPolicy:"never",sandbox:l,...e.model?{model:e.model}:{}})).result?.thread;C?.id&&(p=C.id)}else{let C=(await $("thread/start",{cwd:e.cwd,approvalPolicy:"never",sandbox:l,...e.model?{model:e.model}:{}})).result?.thread;C?.id&&(p=C.id)}await $("turn/start",{threadId:p,input:[{type:"text",text:t}],...e.model?{model:e.model}:{}})}catch(D){it(c).catch(()=>{}),n(D instanceof Error?D:new Error(String(D)))}})()})}var Yv,km=b(()=>{"use strict";je();je();Br();io();Un();El();je();Xt();Yv=(()=>{try{let t=new URL("../../../package.json",import.meta.url),e=JSON.parse(Gv(Vv(t),"utf8"));return typeof e.version=="string"?e.version:"0.0.0"}catch{return"0.0.0"}})()});function Yt(t,e=["high","xhigh"]){return{name:t,reasoning:!0,provider:{npm:"@ai-sdk/github-copilot"},variants:Object.fromEntries(e.map(r=>[r,{reasoningEffort:r,reasoningSummary:"auto",include:["reasoning.encrypted_content"]}]))}}function bl(){return structuredClone({"github-copilot":{npm:"@ai-sdk/openai-compatible",name:"GitHub Copilot",options:{baseURL:"https://api.githubcopilot.com"},models:vm},deepseek:{npm:"@ai-sdk/openai-compatible",name:"DeepSeek",options:{baseURL:"https://api.deepseek.com/v1",apiKey:"{env:DEEPSEEK_API_KEY}"},models:Object.fromEntries(Im.map(t=>[t,{name:t}]))},openrouter:{npm:"@ai-sdk/openai-compatible",name:"OpenRouter",options:{baseURL:"https://openrouter.ai/api/v1",apiKey:"{env:OPENROUTER_API_KEY}"},models:Object.fromEntries(Nm.map(t=>[t,{name:t}]))}})}function xm(){return[...Object.keys(vm).map(t=>`github-copilot/${t}`),...Im.map(t=>`deepseek/${t}`),...Nm.map(t=>`openrouter/${t}`)].sort()}var vm,Im,Nm,Sl=b(()=>{"use strict";vm={"gpt-4.1":{name:"GPT-4.1"},"gpt-4.1-2025-04-14":{name:"GPT-4.1 (2025-04-14)"},"gpt-4o-mini":{name:"GPT-4o mini"},"gpt-4o-mini-2024-07-18":{name:"GPT-4o mini (2024-07-18)"},"gpt-5-mini":Yt("GPT-5 mini",["high"]),"gpt-5.2":Yt("GPT-5.2"),"gpt-5.2-codex":Yt("GPT-5.2 Codex"),"gpt-5.3-codex":Yt("GPT-5.3 Codex"),"gpt-5.4":Yt("GPT-5.4"),"gpt-5.4-mini":Yt("GPT-5.4 mini"),"gpt-5.4-nano":Yt("GPT-5.4 nano"),"gpt-5.5":Yt("GPT-5.5")},Im=["deepseek-chat","deepseek-reasoner","deepseek-v4-flash","deepseek-v4-pro"],Nm=["qwen/qwen3-coder","qwen/qwen3-coder-plus","qwen/qwen3-coder-flash","qwen/qwen3.5-9b","qwen/qwen3.5-397b-a17b","qwen/qwen3.5-plus-20260420","qwen/qwen3.6-flash","qwen/qwen3.6-plus","qwen/qwen3.6-max-preview","qwen/qwen3.7-plus"]});import{existsSync as Rm,mkdirSync as o0,readFileSync as Om,writeFileSync as $m}from"node:fs";import{join as Wn,resolve as i0}from"node:path";function Am(){return{type:"local",command:["lmctl","mcp"],enabled:!0,timeout:a0}}function l0(t,e){return JSON.stringify(t)===JSON.stringify(e)}function co(t){return structuredClone(t)}function Lm(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 Tl(t,e,r={existsSync:Rm,readFileSync:Om}){let n=[];for(let s of t){if(s.provider.trim().toLowerCase()!=="opencode")continue;let o=i0(e,s.sessiondir??e);for(let i of c0(o)){let a=u0(i,r);a!==void 0&&Object.prototype.hasOwnProperty.call(a,"permission")&&(Lm(a.permission)||n.push(`[${s.alias}] ${i} sets a non-allow \`permission\`, which opencode merges over lmctl's YOLO (.opencode/opencode.json permission:"allow") \u2014 the member may hang on permission prompts. Set \`permission: "allow"\` in that file (or remove the key).`))}}return n}function c0(t){return[Wn(t,".opencode","opencode.jsonc"),Wn(t,"opencode.jsonc"),Wn(t,"opencode.json")]}function u0(t,e){try{if(!e.existsSync(t))return;let r=e.readFileSync(t,"utf-8"),n=JSON.parse(d0(r));return n===null||typeof n!="object"||Array.isArray(n)?void 0:n}catch{return}}function d0(t){let e="",r=!1,n="",s=!1;for(let o=0;o<t.length;o+=1){let i=t[o],a=t[o+1];if(r){e+=i,s?s=!1:i==="\\"?s=!0:i===n&&(r=!1,n="");continue}if(i==='"'||i==="'"){r=!0,n=i,e+=i;continue}if(i==="/"&&a==="/"){for(;o<t.length&&t[o]!==`
|
|
985
985
|
`;)o+=1;o<t.length&&(e+=t[o]);continue}if(i==="/"&&a==="*"){for(o+=2;o<t.length&&!(t[o]==="*"&&t[o+1]==="/");)o+=1;o+=1;continue}e+=i}return e.replace(/,\s*([}\]])/g,"$1")}function uo(t,e={}){let r=Wn(t,".opencode"),n=Wn(r,"opencode.json");if(Hr("lmctl","lmctl_chat",e),!Rm(n)){o0(r,{recursive:!0});let l=JSON.stringify({permission:"allow",provider:bl(),mcp:{lmctl:Am()}},null,2);return $m(n,l+`
|
|
986
986
|
`,"utf-8"),!0}let s;try{s=JSON.parse(Om(n,"utf-8"))}catch{return console.log(jm.yellow(` .opencode/opencode.json at ${n} is malformed \u2014 skipping opencode config install.`)),!1}if(typeof s!="object"||s===null)return console.log(jm.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),Lm(s.permission)||Z({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.`}),f0(s)&&(o=!0);let i=s.mcp&&typeof s.mcp=="object"&&!Array.isArray(s.mcp)?{...s.mcp}:{},a=Am();return l0(i.lmctl,a)||(i.lmctl=a,s.mcp=i,o=!0),o&&$m(n,JSON.stringify(s,null,2)+`
|
|
987
987
|
`,"utf-8"),o}function f0(t){let e=bl(),r=jt(t.provider)?t.provider:{},n=!jt(t.provider);for(let[s,o]of Object.entries(e)){let i=r[s];if(i===void 0){r[s]=co(o),n=!0;continue}if(!jt(i))continue;let a={...i};a.npm===void 0&&(a.npm=o.npm,n=!0),a.name===void 0&&(a.name=o.name,n=!0);let l=jt(a.options)?{...a.options}:{};for(let[u,d]of Object.entries(o.options))l[u]===void 0&&(l[u]=co(d),n=!0);a.options=l;let c=jt(a.models)?{...a.models}:{};for(let[u,d]of Object.entries(o.models)){if(c[u]===void 0){c[u]=co(d),n=!0;continue}let f=c[u];if(jt(f)&&jt(d)){let m={...f};Cm(m,d)&&(c[u]=m,n=!0)}}a.models=c,r[s]=a}return n&&(t.provider=r),n}function jt(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function Cm(t,e){let r=!1;for(let[n,s]of Object.entries(e)){if(t[n]===void 0){t[n]=co(s),r=!0;continue}jt(t[n])&&jt(s)&&Cm(t[n],s)&&(r=!0)}return r}var jm,a0,fo=b(()=>{"use strict";je();Sl();ao();jm={yellow:t=>t},a0=864e5});import{spawn as m0}from"node:child_process";import{existsSync as p0}from"node:fs";import{createInterface as h0}from"node:readline";function _0(t){let e=t.stderr.trim().slice(0,500),r=`lmctl: ${t.tool} ACP process exited with code ${t.exitCode} before completing the prompt.
|
|
988
988
|
One possible cause: the provider process failed before a complete ACP response was delivered.`;return e?`Original provider error:
|
|
989
989
|
${e}
|
|
990
990
|
|
|
991
|
-
${r}`:r}function k0(t){let e=[...t.matchAll(y0)];if(e.length>0){let r=e[e.length-1],n=(r.index??0)+r[0].length;return Mm(t.slice(n).trimStart())}return Mm(v0(t.replace(E0,"")))}function v0(t){let e=b0.exec(t);if(e===null)return t;let r=t.slice(e[0].length),n=[...r.matchAll(S0)];if(n.length<2)return t;let s=n[0],o=(s.index??0)+s[0].length;return r.slice(o).trimStart()}function Mm(t){let e=[...t.matchAll(T0)];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 Pm(t,e){let r=g0[e.tool];return r?new Promise((n,s)=>{let o=e.binaryPath||r.binary;if(e.tool==="opencode")try{uo(e.cwd)}catch(
|
|
992
|
-
`);e.model&&e.tool==="gemini"&&a.push("--model",e.model);let l=e.tool==="copilot"?"yolo":i;try{Vt(e.tool,a,l)}catch(
|
|
993
|
-
`),e.cwd&&!p0(e.cwd))return Z({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=m0(o,a,{cwd:e.cwd,stdio:["pipe","pipe","pipe"],env:Ke(e.env,e.sessionId)}),u=Date.now(),d=!1;if(e.signal){if(e.signal.aborted)return d=!0,Z({event:"transport_abort",provider:e.tool,phase:"pre_spawn"}),it(c).catch(()=>{}),s(new Error("Aborted"));e.signal.addEventListener("abort",()=>{d=!0,Z({event:"transport_abort",provider:e.tool,elapsed_ms:Date.now()-u}),it(c).catch(()=>{}),s(new Error("Aborted"))},{once:!0})}let f=h0({input:c.stdout}),m=new Map,p=e.sessionId||"",h="",g="",_=!1;function
|
|
994
|
-
`)})}f.on("line",
|
|
995
|
-
`);return}if(
|
|
996
|
-
`)}(async()=>{try{if(await
|
|
997
|
-
`),p=(await
|
|
998
|
-
`)}if(e.effort&&e.tool==="opencode")try{await
|
|
999
|
-
`)}pt(`acp: prompt sent (${t.length} chars)`),g=(await
|
|
991
|
+
${r}`:r}function k0(t){let e=[...t.matchAll(y0)];if(e.length>0){let r=e[e.length-1],n=(r.index??0)+r[0].length;return Mm(t.slice(n).trimStart())}return Mm(v0(t.replace(E0,"")))}function v0(t){let e=b0.exec(t);if(e===null)return t;let r=t.slice(e[0].length),n=[...r.matchAll(S0)];if(n.length<2)return t;let s=n[0],o=(s.index??0)+s[0].length;return r.slice(o).trimStart()}function Mm(t){let e=[...t.matchAll(T0)];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 Pm(t,e){let r=g0[e.tool];return r?new Promise((n,s)=>{let o=e.binaryPath||r.binary;if(e.tool==="opencode")try{uo(e.cwd)}catch(N){Z({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=qr("gemini","plan"),A=qr("gemini","yolo");a=a.filter(D=>!(A??[]).includes(D)),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.
|
|
992
|
+
`);e.model&&e.tool==="gemini"&&a.push("--model",e.model);let l=e.tool==="copilot"?"yolo":i;try{Vt(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.
|
|
993
|
+
`),e.cwd&&!p0(e.cwd))return Z({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=m0(o,a,{cwd:e.cwd,stdio:["pipe","pipe","pipe"],env:Ke(e.env,e.sessionId)}),u=Date.now(),d=!1;if(e.signal){if(e.signal.aborted)return d=!0,Z({event:"transport_abort",provider:e.tool,phase:"pre_spawn"}),it(c).catch(()=>{}),s(new Error("Aborted"));e.signal.addEventListener("abort",()=>{d=!0,Z({event:"transport_abort",provider:e.tool,elapsed_ms:Date.now()-u}),it(c).catch(()=>{}),s(new Error("Aborted"))},{once:!0})}let f=h0({input:c.stdout}),m=new Map,p=e.sessionId||"",h="",g="",_=!1,T=!1;function E(N,A={}){return new Promise((D,C)=>{let H=w0++;m.set(H,{resolve:D,reject:C});let R=JSON.stringify({jsonrpc:"2.0",id:H,method:N,params:A});It({event:"acp_send",direction:"SEND",provider:e.tool,method:N,id:H,params:A}),c.stdin?.write(R+`
|
|
994
|
+
`)})}f.on("line",N=>{let A;try{A=JSON.parse(N)}catch{return}if(It({event:"acp_recv",direction:"RECV",provider:e.tool,id:typeof A.id=="number"?A.id:void 0,method:typeof A.method=="string"?A.method:void 0,preview:JSON.stringify(A).slice(0,300)}),e.onEvent?.(A),typeof A.id=="number"&&m.has(A.id)){let C=m.get(A.id);if(m.delete(A.id),A.error){let H=A.error,R=typeof H?.message=="string"&&H.message.length>0?H.message:JSON.stringify(A.error);C.reject(oo(`ACP RPC error: ${R}`,H))}else C.resolve(A);return}let D=A.method;if(D){if(typeof A.id=="number"){Z({event:"acp_unhandled_request",provider:e.tool,method:D,id:A.id,params:A.params});let C=JSON.stringify({jsonrpc:"2.0",id:A.id,error:{code:-32601,message:`Method not found: ${D} (lmctl does not implement server-side ACP methods)`}});It({event:"acp_send",direction:"SEND",provider:e.tool,replyTo:A.id,error:"method not found"}),c.stdin?.write(C+`
|
|
995
|
+
`);return}if(D==="session/update"){let H=A.params?.update;if(H?.sessionUpdate==="agent_message_chunk"){let U=H.content?.text||"";U&&T&&(h+=U,e.onDelta?.(U))}}}});let k="";c.stderr?.on("data",N=>{k+=N.toString()}),c.on("error",N=>{Z({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"?k0(h):h,sessionId:p,durationMs:Date.now()-u,stopReason:g,exitCode:N}):(Z({event:"transport_error",provider:e.tool,error_class:"Error",reason:"provider_no_result",exit_code:N,stderr_tail:k.slice(0,500),elapsed_ms:Date.now()-u}),s(new Error(_0({tool:e.tool,exitCode:N,stderr:k})))))});function $(N,A={}){let D=JSON.stringify({jsonrpc:"2.0",method:N,params:A});c.stdin?.write(D+`
|
|
996
|
+
`)}(async()=>{try{if(await E("initialize",{protocolVersion:1,clientInfo:{name:"lmctl",version:"0.1.0"},clientCapabilities:{}}),$("notifications/initialized"),e.sessionId)try{p=(await E("session/load",{sessionId:e.sessionId,cwd:e.cwd,mcpServers:[]})).result?.sessionId||e.sessionId}catch(A){if(e.requireResume)throw new Error(`Cannot resume session ${e.sessionId} via ACP: ${A instanceof Error?A.message:String(A)}`);process.stderr.write(`[acp] session/load failed for ${e.sessionId}, creating new session
|
|
997
|
+
`),p=(await E("session/new",{cwd:e.cwd,mcpServers:[]})).result?.sessionId||""}else p=(await E("session/new",{cwd:e.cwd,mcpServers:[]})).result?.sessionId||"";if(e.model&&e.tool==="opencode")try{await E("session/set_config_option",{sessionId:p,configId:"model",value:e.model}),pt(`acp: set_config_option(model=${e.model}) ok`)}catch(A){let D=A instanceof Error?A.message:String(A);process.stderr.write(`[acp] set_config_option(model=${e.model}) failed: ${D}
|
|
998
|
+
`)}if(e.effort&&e.tool==="opencode")try{await E("session/set_config_option",{sessionId:p,configId:"effort",value:e.effort}),pt(`acp: set_config_option(effort=${e.effort}) ok`)}catch(A){let D=A instanceof Error?A.message:String(A);process.stderr.write(`[acp] set_config_option(effort=${e.effort}) failed: ${D}
|
|
999
|
+
`)}h="",T=!0,pt(`acp: prompt sent (${t.length} chars)`),g=(await E("session/prompt",{sessionId:p,prompt:[{type:"text",text:t}]})).result?.stopReason||"",_=!0,pt(`acp: result received (${h.length} chars, stopReason=${g})`),c.stdin?.end()}catch(N){it(c).catch(()=>{}),s(N instanceof Error?N:new Error(String(N)))}})()}):Promise.reject(new Error(`No ACP config for tool "${e.tool}"`))}var g0,w0,Dm,y0,E0,b0,S0,T0,Fm=b(()=>{"use strict";je();Br();io();Un();fo();je();Xt();g0={gemini:{binary:"gemini",args:["--acp","-y","--skip-trust"]},copilot:{binary:"copilot",args:["--acp","--yolo"]},opencode:{binary:"opencode",args:["acp"]}},w0=1,Dm="(?:png|jpe?g|webp|heic|pdf)",y0=new RegExp(`\\bSTANCE:\\s*\\S+_\\d{6,}\\.${Dm}\\s*`,"gi"),E0=new RegExp(`^ACK:\\s*waiting for explicit lmctl task\\.\\d{6,}\\.${Dm}\\s*`,"i"),b0=/^ACK:\s*waiting for explicit lmctl task[._]?\s*/i,S0=/^STANCE:\s+\S+\s*$/gim,T0=/\[Thought:\s*true\]\s*/gi});function he(t,e=120){let r=t.replace(/\s+/g," ").trim();return r.length>e?r.slice(0,e-1)+"\u2026":r}function Um(t,e){return r=>{if(r.kind==="tool_use"&&typeof r.id=="string"){if(t.size>=I0){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 N0(){let t=new Map;return(e,r)=>{x0(e,Um(t,r))}}function x0(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(he(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(he(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:he(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=he(JSON.stringify(c))),e({kind:"tool_use",tool:a,summary:he(u),id:l,raw:o})}else if(i==="thinking"){let a=o.thinking||"";e({kind:"thinking",summary:he(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(`
|
|
1000
1000
|
`).length} lines, ${d.length} chars`;else if(Array.isArray(d)){let f=d.map(m=>typeof m=="object"&&m&&"text"in m?m.text:"").filter(Boolean).join("");f&&(u=`${f.split(`
|
|
1001
1001
|
`).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 mo(t,e){let r=e.binary==="qwen"?"qwen":"claude",n=e.onProgress?N0():void 0,s=await Em(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 $0(){let t=new Map;return(e,r)=>{j0(e,Um(t,r))}}function j0(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:he(a)});return}if(o==="agent_thought_chunk"){let a=s.content?.text||"";e({kind:"thinking",summary:he(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=he(JSON.stringify(c))),e({kind:"tool_use",tool:i,summary:he(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 ${he(c,80)}`:"running\u2026";e({kind:"other",summary:u,id:a})}return}e({kind:"other",summary:o})}}async function Jr(t,e){let r=e.acpTool||e.binary;e.model&&r==="copilot"&&It({event:"model_ignored",provider:r,model:e.model,reason:"copilot --acp does not implement per-session model selection"});let n=e.onProgress?$0():void 0,s=await Pm(t,{tool:r,sessionId:e.sessionId,cwd:e.cwd,env:e.env,binaryPath:e.progPath,model:e.model,effort:e.effort,alias:e.alias,permissionMode:e.permissionMode,onDelta:e.onDelta,onEvent:n?o=>n(o,e.onProgress):void 0,signal:e.signal});return{text:s.result,sessionId:s.sessionId,durationMs:s.durationMs,stopReason:s.stopReason}}function A0(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: ${he(i,120)}`}:{kind:"other",summary:`codex error: ${he(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:he(c||"(command)"),id:a});else{let u=s.exitCode,d=s.status||"",f=typeof s.durationMs=="number"?s.durationMs:void 0,m=typeof u=="number"?`exit ${u}`:d||"done",p=[];typeof u=="number"?p.push(`exit ${u}`):d&&p.push(d),typeof f=="number"&&p.push(`${Math.round(f/1e3)}s`),e({kind:"tool_result",summary:p.join(", ")||"done",status:m,elapsedMs:f,id:a})}return}case"fileChange":{let a=typeof s.id=="string"?s.id:void 0;if(i){let l=s.changes,c=Array.isArray(l)?l.map(u=>u.path||"").filter(Boolean).join(", "):"";e({kind:"tool_use",tool:"FileChange",summary:he(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:he(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:he(s)}:{kind:"text",summary:he(s)})}return}if(r==="item/reasoning/summaryTextDelta"||r==="item/reasoning/textDelta"){let s=n?.delta||"";s&&e({kind:"thinking",summary:he(s)});return}if(r==="item/commandExecution/outputDelta"){let s=(typeof n?.delta=="string"?n.delta:"")||"";if(s){let o=s.split(`
|
|
1002
1002
|
`).filter(l=>l.length>0),i=o[o.length-1]||"",a=o.length>1?`${o.length} lines: ${he(i,60)}`:he(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(`
|
|
@@ -1006,10 +1006,10 @@ ${r}`:r}function k0(t){let e=[...t.matchAll(y0)];if(e.length>0){let r=e[e.length
|
|
|
1006
1006
|
`,resumeTemplate:"codex resume {{session_id}}",startTemplate:"codex",transport:Wm})}seedArgsFor(e){let r=super.seedArgsFor(e);return e?.model?[...r.slice(0,-1),"--model",e.model,r[r.length-1]]:r}}});function Hn(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 _o(t){let e=Hn(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(`
|
|
1007
1007
|
`).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?D0(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 D0(t,e){for(let[r,n]of Object.entries(e))if(n!==void 0){if(r==="tokens"&&Xm(t.tokens)&&Xm(n)){t.tokens={...t.tokens,...n};continue}t[r]=n}}function Xm(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function Gm(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(`
|
|
1008
1008
|
`)+`
|
|
1009
|
-
`}var jl=b(()=>{"use strict"});import{createHash as P0}from"node:crypto";import{readdir as Jn,readFile as Vm,stat as go,unlink as F0}from"node:fs/promises";import{join as He,basename as U0,dirname as W0}from"node:path";import{cwd as B0}from"node:process";function Km(t){return t?typeof t=="string"?t:Array.isArray(t)?t.map(e=>e.text||"").join(""):"":""}function Ym(t){return t==="user"}function Al(t){return t==="gemini"||t==="assistant"}function Er(t,e=new Date(0)){if(!t)return e;let r=new Date(t);return Number.isNaN(r.getTime())?e:r}function q0(t){return`${t.sessionId}\0${t.cwd}`}function H0(t,e){let r=t.filePaths??[t.filePath],n=e.filePaths??[e.filePath],s=[...new Set([...r,...n])],o=e.modifiedAt.getTime()>=t.modifiedAt.getTime()?e:t;return{...o,createdAt:t.createdAt.getTime()<=e.createdAt.getTime()?t.createdAt:e.createdAt,modifiedAt:o.modifiedAt,filePath:o.filePath,filePaths:s}}function wo(t){let e=Number(t??0);return Number.isFinite(e)?Math.max(0,Math.round(e)):0}function zm(t){let e=0,r=0,n=0,s=0,o=0,i;for(let a of t){if(!Al(a.type)||!a.tokens)continue;let l=wo(a.tokens.input),c=wo(a.tokens.cached),u=Math.max(l-c,0),d=wo(a.tokens.output),f=wo(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 J0(t){return P0("sha256").update(t).digest("hex")}function Xn(t,e){let r=e;for(;r&&!t.has(r);){t.add(r);let n=W0(r);if(n===r)break;r=n}}var yo,Zm=b(()=>{"use strict";Jt();jl();je();yo=class{name="gemini";workspaceHashMap;geminiProjectsFile;geminiTmpDir;claudeProjectsDir;codexSessionDirs;extraWorkspacePaths;constructor(e={}){let r=e.geminiDir||He(Te,".gemini");this.geminiProjectsFile=He(r,"projects.json"),this.geminiTmpDir=He(r,"tmp");let n=e.claudeDir||He(Te,".claude");this.claudeProjectsDir=He(n,"projects");let s=[He(Te,".codex"),He(Te,".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=>He(i,"sessions")),this.extraWorkspacePaths=e.extraWorkspacePaths||[]}getWatchPaths(){return[{directory:this.geminiTmpDir,filePattern:/\.jsonl?$/}]}async discoverSessions(){let e=await this.findSessionFiles(),r=new Map;for(let n of e)try{let s=await this.extractSummary(n);if(!s)continue;let o=q0(s),i=r.get(o);r.set(o,i?H0(i,s):s)}catch{}return[...r.values()]}async loadSession(e){let r=await this.resolveSessionFile(e);if(!r)return null;let n;try{n=await this.readSessionFile(r)}catch{return null}if(!n)return null;let s=await 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 _=Er(g.timestamp),T=g.type,E=de(Km(g.content));if(Ym(T)){let
|
|
1010
|
-
`).trim();
|
|
1009
|
+
`}var jl=b(()=>{"use strict"});import{createHash as P0}from"node:crypto";import{readdir as Jn,readFile as Vm,stat as go,unlink as F0}from"node:fs/promises";import{join as He,basename as U0,dirname as W0}from"node:path";import{cwd as B0}from"node:process";function Km(t){return t?typeof t=="string"?t:Array.isArray(t)?t.map(e=>e.text||"").join(""):"":""}function Ym(t){return t==="user"}function Al(t){return t==="gemini"||t==="assistant"}function Er(t,e=new Date(0)){if(!t)return e;let r=new Date(t);return Number.isNaN(r.getTime())?e:r}function q0(t){return`${t.sessionId}\0${t.cwd}`}function H0(t,e){let r=t.filePaths??[t.filePath],n=e.filePaths??[e.filePath],s=[...new Set([...r,...n])],o=e.modifiedAt.getTime()>=t.modifiedAt.getTime()?e:t;return{...o,createdAt:t.createdAt.getTime()<=e.createdAt.getTime()?t.createdAt:e.createdAt,modifiedAt:o.modifiedAt,filePath:o.filePath,filePaths:s}}function wo(t){let e=Number(t??0);return Number.isFinite(e)?Math.max(0,Math.round(e)):0}function zm(t){let e=0,r=0,n=0,s=0,o=0,i;for(let a of t){if(!Al(a.type)||!a.tokens)continue;let l=wo(a.tokens.input),c=wo(a.tokens.cached),u=Math.max(l-c,0),d=wo(a.tokens.output),f=wo(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 J0(t){return P0("sha256").update(t).digest("hex")}function Xn(t,e){let r=e;for(;r&&!t.has(r);){t.add(r);let n=W0(r);if(n===r)break;r=n}}var yo,Zm=b(()=>{"use strict";Jt();jl();je();yo=class{name="gemini";workspaceHashMap;geminiProjectsFile;geminiTmpDir;claudeProjectsDir;codexSessionDirs;extraWorkspacePaths;constructor(e={}){let r=e.geminiDir||He(Te,".gemini");this.geminiProjectsFile=He(r,"projects.json"),this.geminiTmpDir=He(r,"tmp");let n=e.claudeDir||He(Te,".claude");this.claudeProjectsDir=He(n,"projects");let s=[He(Te,".codex"),He(Te,".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=>He(i,"sessions")),this.extraWorkspacePaths=e.extraWorkspacePaths||[]}getWatchPaths(){return[{directory:this.geminiTmpDir,filePattern:/\.jsonl?$/}]}async discoverSessions(){let e=await this.findSessionFiles(),r=new Map;for(let n of e)try{let s=await this.extractSummary(n);if(!s)continue;let o=q0(s),i=r.get(o);r.set(o,i?H0(i,s):s)}catch{}return[...r.values()]}async loadSession(e){let r=await this.resolveSessionFile(e);if(!r)return null;let n;try{n=await this.readSessionFile(r)}catch{return null}if(!n)return null;let s=await 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 _=Er(g.timestamp),T=g.type,E=de(Km(g.content));if(Ym(T)){let $=E.trim();$&&(u||(u=V($,80)),d=V($,80)),o.push({role:"user",timestamp:_,content:$||E});continue}if(Al(T)){g.model&&(f=g.model);for(let $ of g.thoughts||[]){let N=[$.subject,$.description].filter(Boolean).join(`
|
|
1010
|
+
`).trim();N&&o.push({role:"thinking",timestamp:Er($.timestamp,_),content:de(N)})}o.push({role:"assistant",timestamp:_,content:E,model:g.model});continue}let k=T?`[${T}] `:"";o.push({role:"system",timestamp:_,content:`${k}${E}`.trim()})}let m=Er(n.startTime,s.createdAt),p=Er(n.lastUpdated,s.modifiedAt),h=zm(i);return{provider:"gemini",sessionId:a,cwd:c,createdAt:m,modifiedAt:p,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 m of s)if(Ym(m.type)){d++;let p=Km(m.content).trim();p&&(l||(l=V(de(p),80)),c=V(de(p),80))}else Al(m.type)&&(d++,m.model&&(u=m.model));let f=zm(s);return{provider:"gemini",sessionId:o,cwd:a,createdAt:Er(r.startTime,n.createdAt),modifiedAt:Er(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 Vm(e,"utf-8");if(Hn(r)==="unknown")return Z({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 _o(r)}catch{return null}}extractSessionIdFromFilename(e){let r=U0(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 Jn(this.geminiTmpDir)}catch{return e}for(let n of r){let s=He(this.geminiTmpDir,n,"chats");if(!(await go(s).catch(()=>null))?.isDirectory())continue;let i;try{i=await Jn(s)}catch{continue}for(let a of i)a.startsWith("session-")&&(!a.endsWith(".json")&&!a.endsWith(".jsonl")||e.push(He(s,a)))}return e}async resolveSessionPath(e){return this.resolveSessionFile(e)}async deleteSession(e){let r=await this.resolveSessionFile(e);return r?(await F0(r),!0):!1}async resolveSessionFile(e){let r=await this.findSessionFiles(),n=[];for(let s of r){let o=await this.readSessionFile(s).catch(()=>null),i=this.extractSessionIdFromFilename(s),a=o?.sessionId||i,l=a===e||a.startsWith(e),c=i===e||i.startsWith(e)||i.length>=8&&e.startsWith(i);if(!l&&!c)continue;let u=await Ne(s).catch(()=>({createdAt:new Date(0),modifiedAt:new Date(0)}));n.push({filePath:s,modifiedAt:Er(o?.lastUpdated,u.modifiedAt)})}return n.sort((s,o)=>{let i=o.modifiedAt.getTime()-s.modifiedAt.getTime();return i!==0?i:o.filePath.localeCompare(s.filePath)}),n[0]?.filePath??null}async resolveWorkspace(e){return e?(await this.getWorkspaceHashMap()).get(e)||`[hash:${e.slice(0,16)}]`:"(unknown workspace)"}async getWorkspaceHashMap(){if(this.workspaceHashMap)return this.workspaceHashMap;let e=new Set;Xn(e,B0());for(let n of this.extraWorkspacePaths)Xn(e,n);for(let n of await this.collectGeminiProjectPaths())Xn(e,n);for(let n of await this.collectCodexCwds())Xn(e,n);for(let n of await this.collectClaudeCwds())Xn(e,n);let r=new Map;for(let n of e)r.set(J0(n),n);return this.workspaceHashMap=r,r}async collectGeminiProjectPaths(){let e;try{e=await Vm(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 Le(s,1).catch(()=>[]))[0]?.payload?.cwd;i&&e.add(i)}}return[...e]}async collectClaudeCwds(){let e=new Set,r;try{r=await Jn(this.claudeProjectsDir)}catch{return[]}for(let n of r){let s=He(this.claudeProjectsDir,n);if(!(await go(s).catch(()=>null))?.isDirectory())continue;let i;try{i=await Jn(s)}catch{continue}for(let a of i){if(!a.endsWith(".jsonl"))continue;let l=He(s,a),u=(await Le(l,1).catch(()=>[]))[0]?.cwd;u&&e.add(u)}}return[...e]}async findJsonlFiles(e){let r=[];if(!(await go(e).catch(()=>null))?.isDirectory())return r;let s;try{s=await Jn(e)}catch{return r}for(let o of s){let i=He(e,o),a=await go(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 X0,writeFileSync as G0,mkdirSync as V0}from"node:fs";import{join as K0,dirname as Y0}from"node:path";import{randomUUID as z0}from"node:crypto";function Ol(t){return new Rl(t)}var Rl,Ll=b(()=>{"use strict";Zm();Gt();yr();Nt();jl();Rl=class extends Oe{constructor(e){super({provider:new yo(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",xe,"-y","--skip-trust"],resumeTemplate:"gemini --resume {{session_id}} --skip-trust",startTemplate:"gemini --skip-trust",transport:(r,n)=>Jr(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(`
|
|
1011
1011
|
`)}manualSeedHint(e){return{launchCommand:`cd ${e} && gemini --skip-trust`,postLaunchNote:no,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=X0(n,"utf-8"),o=Hn(s),i=_o(s),a=z0();i.sessionId=a,i.kind="main";let l=Y0(n),c=new Date().toISOString().replace(/[:.]/g,"-").slice(0,19),u=o==="jsonl"?".jsonl":".json",d=`session-${c}-${a.slice(0,8)}${u}`,f=K0(l,d);return V0(l,{recursive:!0}),G0(f,Gm(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 Qm,readFile as Z0,rm as Q0,stat as Xr}from"node:fs/promises";import{basename as eI,join as at}from"node:path";function tI(t){let e={};for(let r of t.split(`
|
|
1012
|
-
`)){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 br(t){if(!t)return;let e=new Date(t);return Number.isNaN(e.getTime())?void 0:e}async function rI(t){let e=0;for await(let r of Fe(t))(r.type==="user.message"||r.type==="assistant.message"&&(r.data?.content||"").trim())&&e++;return e}var Eo,ep=b(()=>{"use strict";Jt();Eo=class{name="copilot";sessionStateDir;constructor(e={}){let r=e.copilotDir||at(Te,".copilot");this.sessionStateDir=at(r,"session-state")}getWatchPaths(){return[{directory:this.sessionStateDir,filePattern:/events\.jsonl$/}]}async discoverSessions(){let e=[],r;try{r=await Qm(this.sessionStateDir)}catch{return e}for(let n of r){let s=at(this.sessionStateDir,n);if((await Xr(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=at(r,"events.jsonl"),o=await Xr(s).catch(()=>null),i=o?s:at(r,"workspace.yaml"),a=await Ne(o?s:r),l=[],c=n?.cwd||"(unknown workspace)",u,d,f,m,p,h,g=n?.id||eI(r)||e;if(o)for await(let _ of Fe(s)){let T=br(_.timestamp)||a.modifiedAt;if(_.type==="session.start"&&_.data){_.data.sessionId&&(g=_.data.sessionId),_.data.copilotVersion&&(d=_.data.copilotVersion),_.data.startTime&&(h=br(_.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 E=_.data.content||"",
|
|
1012
|
+
`)){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 br(t){if(!t)return;let e=new Date(t);return Number.isNaN(e.getTime())?void 0:e}async function rI(t){let e=0;for await(let r of Fe(t))(r.type==="user.message"||r.type==="assistant.message"&&(r.data?.content||"").trim())&&e++;return e}var Eo,ep=b(()=>{"use strict";Jt();Eo=class{name="copilot";sessionStateDir;constructor(e={}){let r=e.copilotDir||at(Te,".copilot");this.sessionStateDir=at(r,"session-state")}getWatchPaths(){return[{directory:this.sessionStateDir,filePattern:/events\.jsonl$/}]}async discoverSessions(){let e=[],r;try{r=await Qm(this.sessionStateDir)}catch{return e}for(let n of r){let s=at(this.sessionStateDir,n);if((await Xr(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=at(r,"events.jsonl"),o=await Xr(s).catch(()=>null),i=o?s:at(r,"workspace.yaml"),a=await Ne(o?s:r),l=[],c=n?.cwd||"(unknown workspace)",u,d,f,m,p,h,g=n?.id||eI(r)||e;if(o)for await(let _ of Fe(s)){let T=br(_.timestamp)||a.modifiedAt;if(_.type==="session.start"&&_.data){_.data.sessionId&&(g=_.data.sessionId),_.data.copilotVersion&&(d=_.data.copilotVersion),_.data.startTime&&(h=br(_.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 E=_.data.content||"",k=E.trim();k&&(m||(m=V(k,80)),p=V(k,80)),l.push({role:"user",timestamp:T,content:de(k||E)});continue}if(_.type==="assistant.message"&&_.data){let E=(_.data.content||"").trim();if(E&&l.push({role:"assistant",timestamp:T,content:de(E),model:u}),_.data.toolRequests)for(let k of _.data.toolRequests)l.push({role:"tool_use",timestamp:T,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 E=_.data.result?.content||"",k=_.data.result?.detailedContent||"";l.push({role:"tool_result",timestamp:T,content:de(E),toolDetailedContent:k?de(k):void 0,toolCallId:_.data.toolCallId});continue}if(_.type==="assistant.reasoning"&&_.data?.content){l.push({role:"thinking",timestamp:T,content:de(_.data.content)});continue}if(_.type==="session.error"||_.type==="session.warning"||_.type==="session.info"||_.type==="system.message"){let E=_.data?.message||"";E.trim()&&l.push({role:"system",timestamp:T,content:de(E)});continue}}if(!m){let _=(n?.summary||"").trim();_&&(m=V(_,80))}return{provider:"copilot",sessionId:g,cwd:c,createdAt:h??br(n?.created_at)??a.createdAt,modifiedAt:br(n?.updated_at)??a.modifiedAt,model:u,cliVersion:d,startCommand:"copilot",gitBranch:f,firstUserMessage:m,lastUserMessage:p,messageCount:l.filter(_=>_.role==="user"||_.role==="assistant").length,filePath:i,messages:l}}async extractSummary(e,r){let n=await this.readWorkspaceYaml(e),s=at(e,"events.jsonl"),o=await Xr(s).catch(()=>null),i=o?s:at(e,"workspace.yaml"),a=await Ne(o?s:e),l=o?await Le(s,20):[],c=n?.id||r,u=n?.cwd||"(unknown workspace)",d,f,m,p,h;for(let _ of l)if(_.type==="session.start"&&_.data&&(_.data.sessionId&&(c=_.data.sessionId),_.data.copilotVersion&&(f=_.data.copilotVersion),_.data.startTime&&(m=br(_.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 T=(_.data.content||"").trim();T&&(p||(p=V(T,80)),h=V(T,80))}if(!p){let _=(n?.summary||"").trim();_&&(p=V(_,80))}let g=o?await rI(s):0;return{provider:"copilot",sessionId:c,cwd:u,createdAt:m??br(n?.created_at)??a.createdAt,modifiedAt:br(n?.updated_at)??a.modifiedAt,model:d,cliVersion:f,startCommand:"copilot",firstUserMessage:p,lastUserMessage:h,messageCount:g,filePath:i}}async readWorkspaceYaml(e){let r=at(e,"workspace.yaml");try{let n=await Z0(r,"utf-8");return tI(n)}catch{return null}}async resolveSessionPath(e){return this.resolveSessionDir(e)}async deleteSession(e){let r=await this.resolveSessionDir(e);return r?(await Q0(r,{recursive:!0}),!0):!1}async resolveSessionDir(e){let r;try{r=await Qm(this.sessionStateDir)}catch{return null}if(r.includes(e)){let s=at(this.sessionStateDir,e);if((await Xr(s).catch(()=>null))?.isDirectory())return s}let n=[];for(let s of r)if(s.startsWith(e)){let o=at(this.sessionStateDir,s);(await Xr(o).catch(()=>null))?.isDirectory()&&n.push(o)}if(n.length===1)return n[0];for(let s of r){let o=at(this.sessionStateDir,s);if(!(await Xr(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 Cl(t){return new Oe({provider:new Eo(t),capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!0,canCancel:!0},injection:{leaderMode:"prompt-append"},binary:"copilot",seedArgs:["-p",xe,"--yolo"],resumeTemplate:"copilot --resume={{session_id}}",startTemplate:"copilot",transport:(e,r)=>Jr(e,{...r,acpTool:"copilot"})})}var Ml=b(()=>{"use strict";ep();Gt();yr();Nt()});import{existsSync as tp}from"node:fs";import{join as bo}from"node:path";import{createRequire as nI}from"node:module";function rp(){return Dl===null&&(Dl=nI(import.meta.url)("node:sqlite").DatabaseSync),Dl}function sI(){let t=process.env.XDG_DATA_HOME||bo(Te,".local","share"),e=process.env.XDG_CONFIG_HOME||bo(Te,".config");return[bo(t,"opencode","opencode.db"),bo(e,"opencode","opencode.db")]}var Dl,So,np=b(()=>{"use strict";Jt();Dl=null;So=class{name="opencode";dbPath;constructor(e){e?.dbPath?this.dbPath=e.dbPath:this.dbPath=sI().find(r=>tp(r))??null}openDb(){return!this.dbPath||!tp(this.dbPath)?null:new(rp())(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,
|
|
1013
1013
|
s.time_created, s.time_updated
|
|
1014
1014
|
FROM session s
|
|
1015
1015
|
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
|
|
@@ -1082,7 +1082,7 @@ ${r}`:r}function k0(t){let e=[...t.matchAll(y0)];if(e.length>0){let r=e[e.length
|
|
|
1082
1082
|
JOIN run r ON r.id = s.run_id
|
|
1083
1083
|
JOIN job j ON j.id = r.job_id
|
|
1084
1084
|
WHERE j.project_id = ? AND s.outcome IS NOT NULL
|
|
1085
|
-
${n!==null?"AND r.started_at >= ?":""}`,...s),i=new Map,a=0,l=0;for(let E of o){let
|
|
1085
|
+
${n!==null?"AND r.started_at >= ?":""}`,...s),i=new Map,a=0,l=0;for(let E of o){let k=i.get(E.state_name)??{total:0,rc:0};k.total++,E.outcome==="request_changes"&&k.rc++,i.set(E.state_name,k),a++,E.outcome==="request_changes"&&l++}let c=[...i.entries()].map(([E,k])=>({state_name:E,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,
|
|
1086
1086
|
CAST((julianday(s.ended_at) - julianday(s.started_at)) * 86400000 AS INTEGER) AS duration_ms
|
|
1087
1087
|
FROM step s
|
|
1088
1088
|
JOIN run r ON r.id = s.run_id
|
|
@@ -1094,14 +1094,14 @@ ${r}`:r}function k0(t){let e=[...t.matchAll(y0)];if(e.length>0){let r=e[e.length
|
|
|
1094
1094
|
JOIN job j ON j.id = r.job_id
|
|
1095
1095
|
WHERE j.project_id = ? AND s.ended_at IS NULL
|
|
1096
1096
|
${n!==null?"AND r.started_at >= ?":""}
|
|
1097
|
-
GROUP BY s.state_name`,...f),p=new Map;for(let E of d){let
|
|
1097
|
+
GROUP BY s.state_name`,...f),p=new Map;for(let E of d){let k=p.get(E.state_name)??{lt5:0,btw5_15:0,btw15_60:0,gt60:0,noEnd:0},$=E.duration_ms;$<3e5?k.lt5++:$<9e5?k.btw5_15++:$<36e5?k.btw15_60++:k.gt60++,p.set(E.state_name,k)}for(let E of m){let k=p.get(E.state_name)??{lt5:0,btw5_15:0,btw15_60:0,gt60:0,noEnd:0};k.noEnd+=E.cnt,p.set(E.state_name,k)}let h=[...p.entries()].map(([E,k])=>({state_name:E,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
|
|
1098
1098
|
FROM step s
|
|
1099
1099
|
JOIN run r ON r.id = s.run_id
|
|
1100
1100
|
JOIN job j ON j.id = r.job_id
|
|
1101
1101
|
WHERE j.project_id = ?
|
|
1102
1102
|
${n!==null?"AND r.started_at >= ?":""}
|
|
1103
1103
|
GROUP BY s.run_id, s.state_name
|
|
1104
|
-
HAVING COUNT(*) > 1`,...s),_=new Map;for(let E of g){let
|
|
1104
|
+
HAVING COUNT(*) > 1`,...s),_=new Map;for(let E of g){let k=_.get(E.state_name)??{runs:0,total_attempts:0};k.runs++,k.total_attempts+=E.attempt_count,_.set(E.state_name,k)}let T=[..._.entries()].map(([E,k])=>({state_name:E,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:T}}function _c(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
|
|
1105
1105
|
FROM session_event se
|
|
1106
1106
|
JOIN run r ON r.id = se.run_id
|
|
1107
1107
|
JOIN job j ON j.id = r.job_id
|
|
@@ -1144,17 +1144,17 @@ ${r}`:r}function k0(t){let e=[...t.matchAll(y0)];if(e.length>0){let r=e[e.length
|
|
|
1144
1144
|
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((p,h)=>p+h,0)/u.length:null,f=u.length>0?u[Math.floor(u.length*.5)]??null:null,m=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:m}})}function Hp(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 zr(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?Hp(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
|
|
1145
1145
|
FROM interactive_session
|
|
1146
1146
|
WHERE run_id = ? AND status = 'waiting_operator'
|
|
1147
|
-
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 m=new Set,p=[...o.nodes];for(let g of i){let _=a(g.state_name);!o.nodes.includes(_)&&!p.includes(_)&&p.push(_)}d!==null&&!p.includes(d)&&p.push(d);let h=[];for(let g of p){if(m.has(g))continue;m.add(g);let _=g===d,T=l.get(g),E="pending",
|
|
1147
|
+
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 m=new Set,p=[...o.nodes];for(let g of i){let _=a(g.state_name);!o.nodes.includes(_)&&!p.includes(_)&&p.push(_)}d!==null&&!p.includes(d)&&p.push(d);let h=[];for(let g of p){if(m.has(g))continue;m.add(g);let _=g===d,T=l.get(g),E="pending",k=null;if(g.startsWith("@terminal:"))E=r.terminal_state===g.slice(10)?"done":"pending";else if(T!==void 0&&(T.ended_at===null?E=_&&u===g?"paused":"running":T.outcome===null?E="failed":E="done",T.ended_at!==null)){let $=Date.parse(T.started_at),N=Date.parse(T.ended_at);!Number.isNaN($)&&!Number.isNaN(N)&&(k=N-$)}_&&u===g&&(E="paused"),h.push({id:g,status:E,is_current:_,elapsed_ms:k,prompt:_&&E==="paused"?f:null,expected:_&&E==="paused"?"free_text":null})}return{run_id:e,workflow_name:n?.name??null,workflow_version:n?.version??null,workflow_version_id:r.workflow_version_id,project:s,paused:r.paused_at!==null&&r.terminal_state===null,terminal_state:r.terminal_state,current_state:d,nodes:h}}function Uo(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(...XI(o));return`${e.join(`
|
|
1148
1148
|
`)}
|
|
1149
|
-
`}function XI(t){let e=[],r=GI(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 GI(t){switch(t){case"done":return"[x]";case"failed":return"[!]";case"paused":return"[*]";case"running":return"[>]";case"pending":return"[ ]";default:return" "}}function Wo(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?Hp(o.definition):{schema:"unknown",nodes:[],nodeTypes:new Map,nameToId:new Map},u
|
|
1149
|
+
`}function XI(t){let e=[],r=GI(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 GI(t){switch(t){case"done":return"[x]";case"failed":return"[!]";case"paused":return"[*]";case"running":return"[>]";case"pending":return"[ ]";default:return" "}}function Wo(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?Hp(o.definition):{schema:"unknown",nodes:[],nodeTypes:new Map,nameToId:new Map},u=$=>c.schema==="v3"&&c.nameToId.has($)?c.nameToId.get($):$,d=t.query("SELECT * FROM step WHERE run_id = ? ORDER BY id ASC",e),f=new Map;for(let $ of d)f.set(u($.state_name),$);let m=t.query("SELECT * FROM interactive_session WHERE run_id = ? ORDER BY id ASC",e),p=new Map;for(let $ of m)p.set(u($.state_name),$);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 $ of t.query(`SELECT step_id, MAX(timestamp_ms) AS timestamp_ms
|
|
1150
1150
|
FROM session_event
|
|
1151
1151
|
WHERE run_id = ? AND step_id IS NOT NULL
|
|
1152
|
-
GROUP BY step_id`,e))
|
|
1152
|
+
GROUP BY step_id`,e))$.step_id!==null&&h.set($.step_id,$.timestamp_ms);let _=VI(c,d,u),T=KI(s.current_state),E=t.query(`SELECT kind, severity, payload
|
|
1153
1153
|
FROM attention
|
|
1154
1154
|
WHERE run_id = ?
|
|
1155
1155
|
AND kind = 'session_hung'
|
|
1156
1156
|
AND acknowledged_at IS NULL
|
|
1157
|
-
ORDER BY id ASC`,e).map(
|
|
1157
|
+
ORDER BY id ASC`,e).map($=>({kind:$.kind,severity:$.severity,payload:rN($.payload)})),k=_.map($=>{let N=f.get($),A=p.get($),D=YI(s,$,T,N,A),C=N===void 0?null:Date.parse(N.started_at),H=N?.ended_at===null||N===void 0?null:Date.parse(N.ended_at),R=N===void 0||Number.isNaN(C??NaN)?null:H!==null&&!Number.isNaN(H)?H-C:D==="running"||D==="paused"?n-C:null,U=N===void 0?null:h.get(N.id)??null,z=nN(A?.last_activity_at??null,U,g),v=o===null||A===void 0?void 0:QI(t,s.team_id,o.definition,A.state_name,N?.state_name??$);return{step_id:N?.id??null,state_id:$,status:D,started_at:N?.started_at??null,ended_at:N?.ended_at??null,last_activity_at:z,elapsed_ms:R,...v!==void 0?{member:v}:{},...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:ZI(s,a,k),submitted_at:a?.enqueued_at??s.started_at,nodes:k,current_node_index:zI(k,s.terminal_state!==null),related_attentions:E}}function Bo(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} (${Rp(Date.parse(t.submitted_at),r)} ago)`;n.push(`project: ${t.project??"?"} | submitted: ${i}`),n.push(""),n.push("timeline:"),n.push(`${Ap(t.submitted_at,t.submitted_at)} submit`);for(let a of t.nodes){let l=a.started_at===null?"[ ]":Ap(t.submitted_at,a.started_at),c=a.status.padEnd(7),u=a.elapsed_ms===null?"":` elapsed ${qo(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 ${Rp(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}${sN(a.payload)}`)}return`${n.join(`
|
|
1158
1158
|
`)}
|
|
1159
1159
|
`}function VI(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 KI(t){return t===null?null:t.startsWith("__paused__:")?t.slice(11):t}function YI(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 zI(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 ZI(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 QI(t,e,r,n,s){let o=eN(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:Ie(i)}}function eN(t,e,r){let n=tN(t);if(n===null)return null;if(Array.isArray(n.steps)){let s=n.steps.find(a=>Zt(a)?a.id===e||a.name===e||a.name===r:!1),o=Zt(s?.members)?s.members:null,i=o!==null&&Zt(o.agent)?o.agent:null;return typeof i?.alias=="string"?i.alias:null}if(Zt(n.states)){let s=n.states[e]??n.states[r];if(!Zt(s))return null;let o=Zt(s.agent)?s.agent:null;return typeof o?.alias=="string"?o.alias:null}return null}function tN(t){try{let e=JSON.parse(t);return Zt(e)?e:null}catch{return null}}function rN(t){if(t===null)return null;try{return JSON.parse(t)}catch{return t}}function Zt(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function nN(...t){let e=t.filter(r=>r!==null&&Number.isFinite(r));return e.length===0?null:Math.max(...e)}function Ap(t,e){let r=Date.parse(t),n=Date.parse(e);return Number.isNaN(r)||Number.isNaN(n)?"[+? ]":`[+${qo(Math.max(0,n-r)).padEnd(6)}]`}function Rp(t,e){return Number.isNaN(t)?"?":qo(Math.max(0,e-t))}function qo(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 sN(t){if(!Zt(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"?`, ${qo(t.elapsed_ms)} elapsed`:"",o=r===null?"":` (${r}${n===null?"":` ${n}`}${s})`;return`${e}${o}`}var Wp,Ot=b(()=>{"use strict";Pe();Wp=`SELECT a.id AS attention_id,
|
|
1160
1160
|
a.kind AS kind,
|
|
@@ -1395,25 +1395,25 @@ Don't dump all of durable-memory into your context. The pattern is index-first,
|
|
|
1395
1395
|
`,"utf8"),be.renameSync(r,t)}catch(n){try{be.unlinkSync(r)}catch{}throw n}}function p$(t,e){be.mkdirSync(rs(t),{recursive:!0});let r=Ue(rs(t),`.mcp-config.${process.pid}.${Date.now()}.${Math.random().toString(16).slice(2)}.tmp`);try{be.writeFileSync(r,e,"utf8"),be.renameSync(r,t)}catch(n){try{be.unlinkSync(r)}catch{}throw n}}function bh(t){return jc(Ue(t,".mcp.json"))}function h$(t,e){let r=Ue(t,".mcp.json");nr(r,"mcpServers",[e])}function nr(t,e,r){try{if(!be.existsSync(t))return;let n=JSON.parse(be.readFileSync(t,"utf8"));if(!ct(n)||!ct(n[e]))return;let s={...n[e]},o=[];for(let i of r)Object.prototype.hasOwnProperty.call(s,i)&&(delete s[i],o.push(i));if(o.length===0)return;n[e]=s,vh(t,n),Z({event:"mcp_cleanup",path:t,removed:o})}catch{}}function _$(t){let e=kh??Th();switch(t){case"copilot":nr(ai(e),"mcpServers",[rr]);return;case"claude":nr(Ue(e,".claude.json"),"mcpServers",[rr]);return;case"gemini":nr(Ue(e,".gemini","settings.json"),"mcpServers",[rr]);return;case"qwen":nr(Ue(e,".qwen","settings.json"),"mcpServers",[rr]);return;case"agy":nr(Ue(e,".gemini","antigravity-cli","settings.json"),"mcpServers",[rr]);return;case"opencode":nr(Ue(e,".config","opencode","opencode.json"),"mcp",[rr]);return;case"codex":g$(Ue(e,".codex","config.toml"),rr);return;default:return}}function g$(t,e){try{if(!be.existsSync(t))return;let n=be.readFileSync(t,"utf8").split(/\n/),s=[],o=new Set,i=!1;for(let a of n){let l=w$(a);if(l===null)return;if(l!==void 0){if(Sh(l,e)){i=!0,o.add(e);continue}i=!1,s.push(a);continue}if(i){if(/^\s*(?:#.*)?$/.test(a)){s.push(a);continue}o.add(e);continue}let c=y$(a);if(c===null)return;if(c!==void 0&&Sh(c,e)){o.add(e);continue}s.push(a)}if(o.size===0)return;p$(t,s.join(`
|
|
1396
1396
|
`)),Z({event:"mcp_cleanup",path:t,removed:[...o]})}catch{}}function Sh(t,e){return t.length>=2&&t[0]==="mcp_servers"&&t[1]===e}function w$(t){if(!/^\s*\[/.test(t))return;let e=/^\s*\[([^\]\r\n]+)\]\s*(?:#.*)?$/.exec(t);return e===null?null:Ih(e[1])}function y$(t){let e=t.indexOf("=");if(e<0)return;let r=t.slice(0,e).trim();if(!(r.length===0||!r.startsWith("mcp_servers")))return Ih(r)}function Ih(t){let e=[],r=0,n=()=>{for(;r<t.length&&/\s/.test(t[r]);)r+=1};for(;r<t.length;){if(n(),r>=t.length)return null;if(t[r]==='"'){r+=1;let s="",o=!1;for(;r<t.length;){let i=t[r];if(i==="\\"){if(r+1>=t.length)return null;s+=t[r+1],r+=2;continue}if(i==='"'){r+=1,o=!0;break}s+=i,r+=1}if(!o)return null;e.push(s)}else{let s=r;for(;r<t.length&&/[A-Za-z0-9_-]/.test(t[r]);)r+=1;if(r===s)return null;e.push(t.slice(s,r))}if(n(),r>=t.length)break;if(t[r]!==".")return null;r+=1}return e.length>0?e:null}function jc(t){try{if(!be.existsSync(t))return!1;let e=JSON.parse(be.readFileSync(t,"utf8"));if(!ct(e)||!ct(e.mcpServers))return!1;let r=ct(e.mcpServers[ns])?e.mcpServers[ns]:void 0;return Nh(r,Ac())}catch{return!1}}function Nh(t,e){return t!==void 0&&si(t)===si(e)}function si(t){return Array.isArray(t)?`[${t.map(e=>si(e)).join(",")}]`:ct(t)?`{${Object.keys(t).sort().map(e=>`${JSON.stringify(e)}:${si(t[e])}`).join(",")}}`:JSON.stringify(t)}function ct(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}var ns,rr,d$,be,kh,ss=b(()=>{"use strict";je();ns="lmctl",rr="lmctl0",d$={existsSync:s$,mkdirSync:o$,readFileSync:i$,writeFileSync:c$,renameSync:a$,unlinkSync:l$},be=d$});import{spawnSync as Oh}from"node:child_process";import{cpSync as xh,existsSync as Mc,mkdirSync as Lh,mkdtempSync as E$,readFileSync as Ch,statSync as b$,writeFileSync as Lc}from"node:fs";import{homedir as S$,tmpdir as T$}from"node:os";import{basename as $h,join as Ze}from"node:path";function Lt(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}function Cc(t,e,r){if(Array.isArray(t)){for(let n of t)Cc(n,e,r);return}if(Lt(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))Cc(n,e,r)}}function N$(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(!(!Lt(a)||!Array.isArray(a.steps)))for(let l of a.steps)Lt(l)&&l.members!==void 0&&Cc(l.members,e.alias,r)}let s=o=>{let i=new Map;for(let a of o)i.set(I$(a),a);return[...i.values()]};return{mcp:s(r.mcp),skills:s(r.skills)}}async function Mh(t,e){let r;try{r=await fetch(t,{signal:AbortSignal.timeout(k$)})}catch(s){throw new Qe(e,`fetch ${t} failed: ${s.message}`)}if(!r.ok)throw new Qe(e,`fetch ${t} \u2192 HTTP ${r.status}`);let n=await r.text();if(n.length>jh)throw new Qe(e,`fetched ${t} exceeds ${jh} bytes`);return n}async function x$(t,e){if(typeof t!="string")return[t];tr(t)&&(t=await ts(t));let r;if(Dc.test(t))r=await Mh(t,e);else{if(!Mc(t))throw new Qe(e,`mcp file not found: ${t}`);r=Ch(t,"utf8")}let n;try{n=JSON.parse(r)}catch{throw new Qe(e,`mcp source is not JSON: ${t}`)}if(Lt(n)&&Lt(n.mcpServers))return Object.entries(n.mcpServers).map(([s,o])=>({name:s,...Lt(o)?o:{}}));if(Lt(n)&&typeof n.name=="string")return[n];throw new Qe(e,`mcp source ${t} is neither {mcpServers:{\u2026}} nor a {name,\u2026} server`)}function ci(t){return t.type==="http"||t.type==="sse"||t.url!==void 0&&t.command===void 0}function li(t,e,r,n){let s=Oh(t,e,{cwd:r,encoding:"utf8",timeout:6e4});if(s.error)throw new Qe(n,`spawn ${t} failed: ${s.error.message}`);if(s.status!==0)throw new Qe(n,`${t} ${e.slice(0,3).join(" ")} exited ${s.status}: ${(s.stderr??"").trim().slice(0,200)}`)}function $$(t,e,r){Oh(t,e,{cwd:r,encoding:"utf8",timeout:6e4})}function j$(t,e){return t==="claude"?["mcp","remove",e,"--scope","user"]:["mcp","remove",e]}function A$(t){let e=["mcp","add"];if(ci(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 R$(t){if(ci(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 O$(t){let e=Ze(process.env.XDG_CONFIG_HOME??Ze(sn(),".config"),"opencode"),r=Ze(e,"opencode.json"),n={};if(Mc(r))try{let o=JSON.parse(Ch(r,"utf8"));Lt(o)&&(n=o)}catch{}let s=Lt(n.mcp)?{...n.mcp}:{};for(let o of t){let{name:i,...a}=o;s[i]=ci(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"),Lh(e,{recursive:!0}),Lc(r,`${JSON.stringify(n,null,2)}
|
|
1397
1397
|
`,"utf8")}function L$(t,e){let r={};for(let n of t)r[n.name]=ci(n)?{type:n.type==="sse"?"sse":"http",url:n.url,...n.headers?{headers:n.headers}:{}}:{type:"stdio",command:n.command,args:n.args??[],...n.env?{env:n.env}:{}};try{Oc(ai(sn()),r)}catch(n){throw new Qe(e,`copilot MCP config install failed: ${n instanceof Error?n.message:String(n)}`)}}function C$(t){if(typeof t!="string")return t.name;let e=$h(t.replace(/\/+$/,""));return e.toLowerCase()==="skill.md"?$h(t.replace(/\/skill\.md$/i,"")):e}async function Ah(t,e,r){let n=C$(t),s=Ze(e,n);if(Lh(s,{recursive:!0}),typeof t!="string")return Lc(Ze(s,"SKILL.md"),t.content,"utf8"),{name:n,dir:s};if(tr(t)&&(t=await ts(t)),Dc.test(t))return Lc(Ze(s,"SKILL.md"),await Mh(t,r),"utf8"),{name:n,dir:s};if(!Mc(t))throw new Qe(r,`skill path not found: ${t}`);return b$(t).isDirectory()?(xh(t,s,{recursive:!0}),{name:n,dir:s}):(xh(t,Ze(s,"SKILL.md")),{name:n,dir:s})}async function ui(t){let{dal:e,member:r,stderr:n}=t,s=N$(e,r);if(s.mcp.length===0&&s.skills.length===0)return;let o=Ie(r),i=r.sessiondir||process.cwd(),a=l=>{n.write(`[seed:${r.alias}] ${l}
|
|
1398
|
-
`)};if(s.mcp.length>0){let l=[];for(let c of s.mcp)l.push(...await x$(c,r.alias));if(o==="opencode")O$(l);else if(o==="copilot")L$(l,r.alias);else if(o==="claude"||o==="gemini"||o==="qwen"||o==="agy"||o==="codex")for(let c of l)if($$(o,j$(o,c.name),i),o==="claude"){let{name:u,...d}=c;li("claude",["mcp","add-json",u,JSON.stringify(d),"--scope","user"],i,r.alias)}else o==="codex"?li("codex",R$(c),i,r.alias):li(o,A$(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","agy","codex","copilot"].includes(o)&&a(`installed ${l.length} MCP server(s) into ${o} (idempotent).`)}if(s.skills.length>0)if(v$.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"||o==="agy"){let l=E$(Ze(T$(),`lmctl-skill-${r.alias}-`));for(let c of s.skills){let u=typeof c=="string"&&!Dc.test(c)?c:(await Ah(c,l,r.alias)).dir;li(o,["skills","install",u,"--scope","user","--consent"],i,r.alias)}a(`installed ${s.skills.length} skill(s) via \`${o} skills install --scope user\` (idempotent).`)}else if(Rh[o]!==void 0){let l=Rh[o]();for(let c of s.skills)await Ah(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 Qe,Dc,k$,jh,v$,I$,sn,Rh,Pc=b(()=>{"use strict";Pe();$c();ss();Qe=class extends Error{alias;constructor(e,r){super(`capability install failed for ${e}: ${r}`),this.alias=e,this.name="CapabilityInstallError"}},Dc=/^https?:\/\//i,k$=8e3,jh=1e6,v$=new Set(["opencode"]),I$=t=>JSON.stringify(t),sn=()=>process.env.HOME??S$();Rh={claude:()=>Ze(sn(),".claude","skills"),qwen:()=>Ze(sn(),".qwen","skills"),codex:()=>Ze(sn(),".codex","skills"),copilot:()=>Ze(sn(),".copilot","skills")}});async function
|
|
1398
|
+
`)};if(s.mcp.length>0){let l=[];for(let c of s.mcp)l.push(...await x$(c,r.alias));if(o==="opencode")O$(l);else if(o==="copilot")L$(l,r.alias);else if(o==="claude"||o==="gemini"||o==="qwen"||o==="agy"||o==="codex")for(let c of l)if($$(o,j$(o,c.name),i),o==="claude"){let{name:u,...d}=c;li("claude",["mcp","add-json",u,JSON.stringify(d),"--scope","user"],i,r.alias)}else o==="codex"?li("codex",R$(c),i,r.alias):li(o,A$(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","agy","codex","copilot"].includes(o)&&a(`installed ${l.length} MCP server(s) into ${o} (idempotent).`)}if(s.skills.length>0)if(v$.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"||o==="agy"){let l=E$(Ze(T$(),`lmctl-skill-${r.alias}-`));for(let c of s.skills){let u=typeof c=="string"&&!Dc.test(c)?c:(await Ah(c,l,r.alias)).dir;li(o,["skills","install",u,"--scope","user","--consent"],i,r.alias)}a(`installed ${s.skills.length} skill(s) via \`${o} skills install --scope user\` (idempotent).`)}else if(Rh[o]!==void 0){let l=Rh[o]();for(let c of s.skills)await Ah(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 Qe,Dc,k$,jh,v$,I$,sn,Rh,Pc=b(()=>{"use strict";Pe();$c();ss();Qe=class extends Error{alias;constructor(e,r){super(`capability install failed for ${e}: ${r}`),this.alias=e,this.name="CapabilityInstallError"}},Dc=/^https?:\/\//i,k$=8e3,jh=1e6,v$=new Set(["opencode"]),I$=t=>JSON.stringify(t),sn=()=>process.env.HOME??S$();Rh={claude:()=>Ze(sn(),".claude","skills"),qwen:()=>Ze(sn(),".qwen","skills"),codex:()=>Ze(sn(),".codex","skills"),copilot:()=>Ze(sn(),".copilot","skills")}});async function G(t,e){if(t.dal!==void 0)return e(t.dal);let r=pe({path:ue()});try{return await e(r)}finally{r.close()}}function F(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 M(t,e){return t.flags[e]===!0}function q(t,e){t.stdout.write(`${JSON.stringify(e,null,2)}
|
|
1399
1399
|
`)}function w(t,e){return t.stderr.write(`error: ${e}
|
|
1400
1400
|
`),1}function me(t,e){let r=e instanceof Error?e.message:String(e);return t.stderr.write(`internal error: ${r}
|
|
1401
|
-
`),2}var $e=b(()=>{"use strict";Pe();Ve()});var Wh={};ce(Wh,{defaultTeamNameForProject:()=>ej,resolveAlias:()=>mi,resolveProject:()=>di,resolveTeam:()=>fi,runCode:()=>P$});import{execFileSync as M$}from"node:child_process";import{basename as D$,resolve as Dh}from"node:path";import*as Uc from"node:readline";import{setTimeout as Fc}from"node:timers/promises";async function P$(t,e){let[r,...n]=t;if(r==="--help"||r==="-h"||r===void 0)return F$(e);if(r==="chat"&&(n.includes("--help")||n.includes("-h")))return Fh(e);if(r==="spec"&&(n.includes("--help")||n.includes("-h")))return V$(e);try{return await
|
|
1402
|
-
`)),0}function U$(t,e,r){let[n,...s]=t;switch(n){case"add":return W$(s,e,r);case"list":return B$(s,e,r);case"show":return q$(s,e,r);case"rm":return H$(s,e,r);default:return w(e,"usage: lmctl code team <add|list|show|rm>")}}function W$(t,e,r){let n=
|
|
1403
|
-
`),0}function B$(t,e,r){let n=
|
|
1404
|
-
`);return 0}function q$(t,e,r){let n=
|
|
1401
|
+
`),2}var $e=b(()=>{"use strict";Pe();Ve()});var Wh={};ce(Wh,{defaultTeamNameForProject:()=>ej,resolveAlias:()=>mi,resolveProject:()=>di,resolveTeam:()=>fi,runCode:()=>P$});import{execFileSync as M$}from"node:child_process";import{basename as D$,resolve as Dh}from"node:path";import*as Uc from"node:readline";import{setTimeout as Fc}from"node:timers/promises";async function P$(t,e){let[r,...n]=t;if(r==="--help"||r==="-h"||r===void 0)return F$(e);if(r==="chat"&&(n.includes("--help")||n.includes("-h")))return Fh(e);if(r==="spec"&&(n.includes("--help")||n.includes("-h")))return V$(e);try{return await G(e,async s=>{switch(r){case"team":return U$(n,e,s);case"chat":return J$(n,e,s);case"spec":return X$(n,e,s);default:return w(e,"usage: lmctl code <team|chat|spec> ...")}})}catch(s){return me(e,s)}}function F$(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(`
|
|
1402
|
+
`)),0}function U$(t,e,r){let[n,...s]=t;switch(n){case"add":return W$(s,e,r);case"list":return B$(s,e,r);case"show":return q$(s,e,r);case"rm":return H$(s,e,r);default:return w(e,"usage: lmctl code team <add|list|show|rm>")}}function W$(t,e,r){let n=F(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=on(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 M(n,"--json")?q(e,a):e.stdout.write(`added member ${a.alias} to ${i.team.name}
|
|
1403
|
+
`),0}function B$(t,e,r){let n=F(t,["--project","--team"]);if(n.error!==void 0)return w(e,n.error);let s=on(e,r,x(n,"--project"),x(n,"--team"));if(typeof s=="number")return s;let o=Uh(r.listTeamMembers(s.team.id));if(M(n,"--json"))q(e,o);else for(let i of o)e.stdout.write(`${i.alias} ${i.role} ${Ie(i)} ${i.sessionid??"(unseeded)"}
|
|
1404
|
+
`);return 0}function q$(t,e,r){let n=F(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=on(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}`):(M(n,"--json")?q(e,i):(e.stdout.write(`member ${i.alias}
|
|
1405
1405
|
`),e.stdout.write(`role: ${i.role}
|
|
1406
1406
|
`),e.stdout.write(`provider: ${Ie(i)}
|
|
1407
1407
|
`),e.stdout.write(`model: ${i.model??"(default)"}
|
|
1408
1408
|
`),e.stdout.write(`sessionid: ${i.sessionid??"(unseeded)"}
|
|
1409
1409
|
`),e.stdout.write(`sessiondir: ${i.sessiondir}
|
|
1410
|
-
`)),0)}function H$(t,e,r){let n=
|
|
1411
|
-
`),0}async function J$(t,e,r){if(t.includes("--help")||t.includes("-h"))return Fh(e);let n=
|
|
1410
|
+
`)),0)}function H$(t,e,r){let n=F(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=on(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 M(n,"--json")?q(e,a):e.stdout.write(`retired member ${i.alias}
|
|
1411
|
+
`),0}async function J$(t,e,r){if(t.includes("--help")||t.includes("-h"))return Fh(e);let n=F(t,["--project","--team","--alias"]);if(n.error!==void 0)return w(e,n.error);let s=on(e,r,x(n,"--project"),x(n,"--team"));if(typeof s=="number")return s;let o=mi(e,r,s.team,x(n,"--alias"));if(typeof o=="number")return o;let i=await Q$(e,r,s.project,o);e.stdout.write(`[${i.alias}@${s.project.name}] type /help for commands
|
|
1412
1412
|
`);let a=e.stdin??process.stdin,l=Uc.createInterface({input:a,terminal:!1}),c=i;os(e,c,s.project);try{for await(let u of l){let d=u.trim();if(d.length===0){os(e,c,s.project);continue}if(d==="/exit")return e.stdout.write(`[bye]
|
|
1413
1413
|
`),0;if(d==="/help"){Z$(e),os(e,c,s.project);continue}if(d.startsWith("/")){e.stderr.write(`unknown command: ${d}
|
|
1414
1414
|
`),os(e,c,s.project);continue}e.stdout.write(`[${c.alias}@${s.project.name}] (thinking...)
|
|
1415
1415
|
`);let f=await Vr({sessionid:c.sessionid,sessiondir:c.sessiondir,prompt:d,dal:r,team_member_id:c.id});e.stdout.write(`${f.text.trimEnd()}
|
|
1416
|
-
`);let m=r.findTeamMemberByAlias(s.team.id,c.alias);m!==null&&(c=m),os(e,c,s.project)}}finally{l.close()}return 0}async function X$(t,e,r){let n=
|
|
1416
|
+
`);let m=r.findTeamMemberByAlias(s.team.id,c.alias);m!==null&&(c=m),os(e,c,s.project)}}finally{l.close()}return 0}async function X$(t,e,r){let n=F(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=on(e,r,x(n,"--project"),x(n,"--team"));if(typeof o=="number")return o;let i=x(n,"--template")??Ph,a=r.getWorkflowByName(i);if(a===null)return w(e,`workflow not found: ${i}`);let l=x(n,"--slug")??z$(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 m=G$(r,e),p=await is(m,"/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 ${p.id} for ${o.project.name}/${l}
|
|
1417
1417
|
`),K$(e,m,p.id)}function G$(t,e){let r=zn(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 V$(t){return t.stdout.write(["usage: lmctl code spec <task-description> [options]","","options:"," --slug S default: slugified task description",` --template W default: ${Ph}`," --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(`
|
|
1418
1418
|
`)),0}async function K$(t,e,r){let n=null;for(let s=0;s<1e3;s+=1){let o=await is(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)"}
|
|
1419
1419
|
`),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)"}
|
|
@@ -1430,8 +1430,8 @@ Don't dump all of durable-memory into your context. The pattern is index-first,
|
|
|
1430
1430
|
`),await ui({dal:e,member:o,stderr:t.stderr});let a=o.role_prompt??"",l=a.length>0?`${a}
|
|
1431
1431
|
|
|
1432
1432
|
${Qr}`:Qr;return e.setMemberPromptSnapshot(o.id,l)??o}function ej(t){return`${D$(t.local_path)}-code`}var Ph,Wc=b(()=>{"use strict";Gn();$o();Qn();Ec();bc();Pe();tn();Pc();$e();wc();Ph="spec-driven-task"});import Bh from"jexl";function sr(t){Bh.compile(qh(t))}async function $r(t,e){return Bh.eval(qh(t),e)}function qh(t){return t.replace(/([A-Za-z_$][\w$.[\]]*)\.includes\(([^()]+)\)/g,"($2 in $1)")}var an=b(()=>{"use strict"});import{z as y}from"zod";function Vc(t){let e=t.trim();return e.startsWith("={{")&&e.endsWith("}}")?e.slice(3,-2).trim():t}var tj,Hh,Bc,qc,Hc,Jc,Xc,Gc,Jh,rj,nj,sj,as,oj,pi,hi,_i,gi,wi,Xh,ij,aj,lj,cj,yi,ln=b(()=>{"use strict";an();tj=y.object({kind:y.enum(["success","neutral","failure"])}),Hh=y.enum(["string","number","boolean","object","array"]),Bc=y.object({name:y.string().min(1),type:Hh,required:y.boolean().optional(),default:y.unknown().optional(),description:y.string().optional()}),qc=y.object({name:y.string().min(1),type:Hh,source_step_id:y.string().min(1),source_field:y.string().min(1),description:y.string().optional()}),Hc=y.object({id:y.string().min(1),type:y.string().min(1),parameters:y.record(y.string(),y.unknown()).default({})}),Jc="__failure__",Xc=y.object({tools:y.array(y.string().min(1)).optional(),auth:y.array(y.string().min(1)).optional()}).strict().optional(),Gc=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(),Jh=y.object({type:y.literal("AssertRepoClean"),fail_message:y.string().min(1).optional(),next:y.string().min(1)}),rj=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(),nj=y.union([y.string().min(1),rj]),sj=y.union([y.string().min(1),y.object({name:y.string().min(1),content:y.string().min(1)}).strict()]),as=y.object({team:y.string().min(1),alias:y.string().min(1),prompt_template:y.string().optional(),mcp:y.array(nj).optional(),skills:y.array(sj).optional()}),oj=y.object({kind:y.literal("shell"),command:y.string().min(1),description:y.string().optional()}),pi=y.object({type:y.literal("Review"),state_name:y.string().min(1),coder:as,pre_checks:y.array(oj).optional(),reviewers:y.array(as.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"})}),hi=y.object({type:y.literal("Consolidate"),state_name:y.string().min(1),researchers:y.array(as.extend({topic:y.string().min(1)})).optional(),consolidator:as,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()}),_i=y.object({type:y.literal("Interactive"),state_name:y.string().min(1),agent:as.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()}),gi=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)}),wi=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()}),Xh=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{sr(Vc(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}`})}}),ij=y.discriminatedUnion("type",[Jh,pi,hi,_i,gi,wi,Xh]),aj=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:ij,outcomes:y.object({all_ok:y.string().min(1),any_failed:y.string().optional()})}).superRefine((t,e)=>{try{sr(Vc(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}`})}}),lj=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{sr(Vc(n))}catch(s){let o=s instanceof Error?s.message:"invalid expression";e.addIssue({code:"custom",path:["inputs",r],message:`invalid jexl expression: ${o}`})}}),cj=y.discriminatedUnion("type",[Jh,pi,hi,_i,gi,wi,Xh,aj,lj]),yi=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),cj),terminals:y.record(y.string().min(1),tj),errors:Gc,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(Bc).optional(),outputs:y.array(qc).optional(),triggers:y.array(Hc).optional(),read_only:y.boolean().optional(),requires:Xc}).superRefine((t,e)=>{t.definition_schema_version===1&&t.errors!==void 0&&e.addIssue({code:"custom",path:["errors"],message:"errors block requires definition_schema_version: 2"}),t.definition_schema_version===1&&t.concurrency_key!==void 0&&e.addIssue({code:"custom",path:["concurrency_key"],message:"concurrency_key requires definition_schema_version: 2"}),t.definition_schema_version===1&&t.default_task_timeout_ms!==void 0&&e.addIssue({code:"custom",path:["default_task_timeout_ms"],message:"default_task_timeout_ms requires definition_schema_version: 2"})})});import{z as Q}from"zod";var uj,Ei,dj,fj,mj,yt,cn=b(()=>{"use strict";ln();uj=/^s-[a-z0-9-]+-[a-f0-9]{4}$/,Ei=Q.string().regex(uj),dj=Q.object({step_id:Ei,type:Q.literal("main"),index:Q.number().int().min(0)}),fj=Q.record(Ei,Q.record(Q.string().min(1),Q.array(Q.array(dj)))),mj=Q.object({id:Ei,name:Q.string().min(1),type:Q.string().min(1),typeVersion:Q.number().int().positive().default(1),parameters:Q.record(Q.string(),Q.unknown()).default({}),members:Q.record(Q.string(),Q.unknown()).optional(),estimated_duration_ms:Q.number().int().nonnegative().optional()}),yt=Q.object({schema_version:Q.literal("lmctl/v3"),definition_schema_version:Q.literal(3),name:Q.string().min(1),version:Q.number().int().positive(),description:Q.string().optional(),estimated_duration_ms:Q.number().int().nonnegative().optional(),default_task_timeout_ms:Q.number().int().positive().max(216e5).optional(),concurrency_key:Q.string().min(1).optional(),concurrent_limit:Q.number().int().positive().optional(),errors:Gc,inputs:Q.array(Bc).optional(),outputs:Q.array(qc).optional(),steps:Q.array(mj).min(1),connections:fj.default({}),entry_step_id:Ei,triggers:Q.array(Hc).optional(),read_only:Q.boolean().optional(),requires:Xc}).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 bi(t){return Yc(t)}function Yc(t){if(Array.isArray(t))return t.map(Yc);if(t===null||typeof t!="object")return t;let e=t,r={};for(let n of Object.keys(e))r[n]=Yc(e[n]);if(typeof r.type=="string"){let n=hj[r.type];n!==void 0&&(r.type=n)}return r}var Kc,pj,hj,zc=b(()=>{"use strict";Kc="lmctl.builtin.",pj={Review:`${Kc}Review`,Research:`${Kc}Research`,Consolidate:`${Kc}Consolidate`},hj=Object.fromEntries(Object.entries(pj).map(([t,e])=>[e,t]))});import{readFileSync as _j}from"node:fs";function Kh(t){return gj(t)}function gj(t){let e=bi(Ej(t));if(yj(e),Yh(e)===3)return wj(e);let r=yi.safeParse(e);if(!r.success)throw new Ct({errors:r.error.issues.map(s=>({path:s.path.length===0?"$":s.path.map(String).join("."),message:s.message}))});let n=bj(r.data);if(n.errors.length>0||n.unresolvedRefs.length>0)throw new Ct(n);return r.data}function wj(t){let e=yt.safeParse(t);if(!e.success)throw new Ct({errors:e.error.issues.map(r=>({path:r.path.length===0?"$":r.path.map(String).join("."),message:r.message}))});return e.data}function yj(t){if(typeof t!="object"||t===null||!("definition_schema_version"in t))return;let e=Yh(t);if(!(e===null||Gh.includes(e)))throw new Ct({errors:[{path:"definition_schema_version",message:`unsupported definition_schema_version ${e}; supported versions: ${Gh.join(", ")}`}]})}function Yh(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 Ej(t){if(typeof t!="string")return t;let e=t.trim();return t.includes(`
|
|
1433
|
-
`)||e.startsWith("{")||e.startsWith("[")?Vh(t,"$"):e.endsWith(".json")?Vh(_j(e,"utf8"),e):t}function Vh(t,e){try{return JSON.parse(t)}catch(r){let n=r instanceof Error?r.message:"invalid JSON";throw new Ct({errors:[{path:e,message:`invalid JSON: ${n}`}]})}}function bj(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"}),Sj(t,n,r);for(let[s,o]of Object.entries(t.states))new Set(Object.keys(t.terminals));return{errors:e,unresolvedRefs:r}}function Sj(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 Gh,Ct,zh=b(()=>{"use strict";ln();cn();zc();Gh=[1,2,3],Ct=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 Tj}from"node:crypto";function Zh(t,e){let r=kj(e),n=Tj("sha1").update(`${t}:${e}`).digest("hex").slice(0,4);return`s-${r}-${n}`}function kj(t){let e=t.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"");return e.length>0?e:"step"}var Qh=b(()=>{"use strict";cn()});function Nj(t,e){let r=Ij[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 n_(t){let e=[],r=(
|
|
1434
|
-
`),s=[];for(let N=0;N<n.length;N+=1){let R=jj(n[N]).trim();R.length>0&&s.push({n:N+1,text:R})}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,m={},p=new Map,h=new Map,g=new Map,_=(N,x,R,H,U,L)=>{l.has(N)&&r(H,`duplicate step/terminal id: ${N}`),/^[A-Za-z][\w-]*$/.test(N)||r(H,`invalid id (must start with a letter): ${N}`),l.set(N,{declId:N,type:x,params:R,line:H,isTerminal:U,...L?{members:L}:{}}),u.push(N)},T=N=>{let x=[],R=N+1;for(;R<s.length;R+=1){let H=/^([A-Za-z][\w-]*|default)\s*->\s*([A-Za-z][\w-]*)$/.exec(s[R].text);if(H===null)break;x.push({label:H[1],dst:H[2]})}return{branches:x,nextIdx:R-1}};for(let N=1;N<s.length;N+=1){let{n:x,text:R}=s[N],H=R.split(/\s+/,1)[0];if(/^meta\s*\(/.test(R)){N!==1&&r(x,"`meta(...)` must be the preamble \u2014 the FIRST line after the `workflow` header (at most one, before any construct)");let U=/^meta\s*\((.*)\)\s*$/.exec(R)??r(x,`malformed \`meta\` (expected \`meta({ "requires"?:\u2026, "default_task_timeout_ms"?:\u2026, "errors"?:\u2026, "concurrency_key"?:\u2026, "concurrent_limit"?:\u2026 })\`): ${R}`),L=or(U[1],x,r);for(let te of Object.keys(L))t_.has(te)||r(x,`unknown \`meta\` key \`${te}\` \u2014 only workflow-level runtime metadata is allowed: ${[...t_].join(", ")} (no grammar inflation; bounded)`);m=L;continue}if(H==="step"){let U=/^step\s+([A-Za-z][\w-]*)\s*=\s*([a-z][a-z0-9-]*)\s*\((.*)\)\s*$/.exec(R)??r(x,`malformed \`step\` (expected \`step <id> = <archetype>(k=v, ...)\`): ${R}`),L=U[1],te=U[2],_e=U[3],ie=e_[te];ie===void 0&&r(x,`unknown step type: ${te} (supported \`step\` archetypes: ${Object.keys(e_).join(", ")}; choice/terminal/loop/foreach/call/decide have their own constructs)`);let{params:we,members:Tt}=Nj(ie,or(_e,x,r));_(L,ie,we,x,!1,Object.keys(Tt).length>0?Tt:void 0);continue}if(H==="trigger"){let U=/^trigger\s+([A-Za-z][\w-]*)\s*=\s*([a-z][a-z0-9-]*)\s*\((.*)\)\s*$/.exec(R)??r(x,`malformed \`trigger\` (expected \`trigger <id> = <trigger-type>({ ...json... })\`): ${R}`),L=U[1],te=U[2],_e=U[3],ie=r_[te];ie===void 0&&r(x,`unknown trigger type: ${te} (registered trigger archetypes: ${Object.keys(r_).join(", ")})`),p.has(L)&&r(x,`duplicate trigger id: ${L}`),p.set(L,{id:L,type:ie,parameters:or(_e,x,r)});continue}if(H==="mcp"||H==="skill"){let U=new RegExp(`^${H}\\s+([A-Za-z][\\w-]*)\\s*=\\s*(.+)$`).exec(R)??r(x,`malformed \`${H}\` decl (expected \`${H} <name> = {json} | ${H} <name> = "<file|url>"\`): ${R}`),L=U[1],te=U[2].trim(),_e=H==="mcp"?h:g;_e.has(L)&&r(x,`duplicate ${H} declaration: ${L}`);let ie;if(te.startsWith("{")){let we=or(te,x,r);H==="mcp"?ie={...we,name:L}:((typeof we.content!="string"||we.content.length===0)&&r(x,`\`skill ${L}\`: inline form requires a non-empty string \`content\` (a SKILL.md body)`),ie={name:L,content:we.content})}else{let we=s_(te);(typeof we!="string"||we.length===0)&&r(x,`\`${H} ${L}\`: string form must be a non-empty file path or http(s) URL`),ie=we}_e.set(L,ie);continue}if(H==="terminal"){let U=/^terminal\s+([A-Za-z][\w-]*)\s*=\s*([A-Za-z][\w-]*)(?:\s+(success|failure|neutral))?\s*$/.exec(R)??r(x,`malformed \`terminal\` (expected \`terminal <id> = <name> [success|failure|neutral]\`): ${R}`);_(U[1],"lmctl/terminal",{name:U[2],kind:U[3]??"neutral"},x,!0);continue}if(H==="seq"){let L=R.slice(3).trim().split(/\s*(->|-[a-z0-9_]+->)\s*/).map(te=>te.trim()).filter(te=>te.length>0);(L.length<3||L.length%2===0)&&r(x,`malformed \`seq\` (expected \`<id> -> <id> [ -> <id> ... ]\`, optional \`-<port>->\`): ${R}`);for(let te=0;te+2<L.length+1&&!(te+2>L.length-1);te+=2){let _e=L[te],ie=L[te+1],we=L[te+2],Tt=ie==="->"?"main":ie.slice(1,-2);c.push({srcDeclId:_e,port:Tt,dstDeclId:we,line:x})}continue}if(H==="choice"){let L=(/^choice\s+([A-Za-z][\w-]*)\s*:$/.exec(R)??r(x,`malformed \`choice\` (expected \`choice <id>:\` then \`when <predicate> -<port>-> <id>\` lines): ${R}`))[1],te=[],_e,ie=N+1;for(;ie<s.length;ie+=1){let we=s[ie].text,Tt=/^when\s+(.+)\s+-([a-z0-9_]+)->\s+([A-Za-z][\w-]*)$/.exec(we);if(Tt!==null){_e!==void 0&&r(s[ie].n,`\`choice ${L}\`: a \`when\` branch may not follow \`default\` (branches are ordered, default is the fallback)`);let jn=Tt[2];te.push({when:Tt[1].trim(),next:`@terminal:${jn}`}),c.push({srcDeclId:L,port:jn,dstDeclId:Tt[3],line:s[ie].n});continue}let Ja=/^default\s+-([a-z0-9_]+)->\s+([A-Za-z][\w-]*)$/.exec(we);if(Ja!==null){_e!==void 0&&r(s[ie].n,`\`choice ${L}\` has more than one \`default\``);let jn=Ja[1];_e=`@terminal:${jn}`,c.push({srcDeclId:L,port:jn,dstDeclId:Ja[2],line:s[ie].n});continue}break}te.length===0&&r(x,`\`choice ${L}\` has no \`when\` branches (need \u22651 \`when <jexl-predicate> -<port>-> <id>\`)`),_(L,"lmctl/choice",{branches:te,..._e!==void 0?{default_next:_e}:{}},x,!1),N=ie-1;continue}if(H==="loop"){let U=/^loop\s+([A-Za-z][\w-]*)\s*=\s*loop\s*\((.*)\)\s*$/.exec(R)??r(x,`malformed \`loop\` (expected \`loop <id> = loop(k=v, ...)\`): ${R}`);_(U[1],"lmctl/loop",or(U[2],x,r),x,!1);continue}if(H==="foreach"){let U=/^foreach\s+([A-Za-z][\w-]*)\s*=\s*foreach\s*\((.*)\)\s*$/.exec(R)??r(x,`malformed \`foreach\` (expected \`foreach <id> = foreach(items=<expr>, ...)\`): ${R}`),L=or(U[2],x,r);"mode"in L&&r(x,"foreach is SEQUENTIAL-ONLY: `mode` is not permitted (single-thread; durable-memory/composition-language-design.md \xA7Execution model)"),_(U[1],"lmctl/foreach",L,x,!1);continue}if(H==="call"){let U=/^call\s+([A-Za-z][\w-]*)\s*=\s*call\s*\((.*)\)\s*$/.exec(R)??r(x,`malformed \`call\` (expected \`call <id> = call(workflow=<name>, ...)\`): ${R}`),L=U[1],te=or(U[2],x,r),_e=te.workflow;(typeof _e!="string"||_e.length===0)&&r(x,`\`call ${L}\` requires a \`workflow=<name>\` argument`);let{workflow:ie,...we}=te;_(L,"lmctl/subflow",{workflow_name:_e,...we},x,!1),d.push({declId:L,target:_e,line:x});continue}if(H==="decide"){let U=/^decide\s+([A-Za-z][\w-]*)\s+by\s+agent\s*\((.*)\)\s*:$/.exec(R)??r(x,`malformed \`decide\` (expected \`decide <id> by agent(k=v, ...):\`): ${R}`),L=U[1],te=or(U[2],x,r),{branches:_e,nextIdx:ie}=T(N);_e.length===0&&r(x,`\`decide ${L}\` has no outcomes (need at least one \`<outcome> -> <id>\`)`),_(L,"lmctl/interactive",{termination:{operator_signal:!0}},x,!1,{agent:te});for(let we of _e)c.push({srcDeclId:L,port:we.label,dstDeclId:we.dst,line:x});N=ie;continue}if(H==="entry"){let U=/^entry\s+([A-Za-z][\w-]*)$/.exec(R)??r(x,`malformed \`entry\` (expected \`entry <id>\`): ${R}`);f!==void 0&&r(x,`duplicate \`entry\` (already set to ${f})`),f=U[1];continue}r(x,`unknown statement \`${H}\` (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 E=N=>{if(Array.isArray(N)){for(let R of N)E(R);return}if(typeof N!="object"||N===null)return;let x=N;if(typeof x.alias=="string")for(let[R,H]of[["mcp",h],["skills",g]]){let U=x[R];Array.isArray(U)&&(x[R]=U.map(L=>typeof L=="string"&&H.has(L)?structuredClone(H.get(L)):L))}for(let R of Object.values(x))E(R)};for(let N of u){let x=l.get(N);x.members!==void 0&&E(x.members)}let v=N=>Zh(i,N),I=u.map(N=>{let x=l.get(N);return{id:v(N),name:N,type:x.type,typeVersion:1,parameters:x.params,...x.members?{members:x.members}:{}}}),k={};for(let N of c){l.has(N.srcDeclId)||r(N.line,`edge source references undeclared step: ${N.srcDeclId}`),l.has(N.dstDeclId)||r(N.line,`dangling edge target: ${N.dstDeclId} is not declared`),l.get(N.srcDeclId).isTerminal&&r(N.line,`terminal \`${N.srcDeclId}\` cannot have an outgoing edge`);let x=v(N.srcDeclId);k[x]??={},k[x][N.port]!==void 0&&r(N.line,`duplicate edge port \`${N.port}\` on step \`${N.srcDeclId}\``),k[x][N.port]=[[{step_id:v(N.dstDeclId),type:"main",index:0}]]}for(let N of u){let x=l.get(N);xj.has(x.type)||r(x.line,`unknown archetype \`${x.type}\` for step \`${N}\` \u2014 not a registered builtin (src/engine/archetypes/index.ts:17-32)`)}for(let N of d)N.target===i&&r(N.line,`subflow cycle: \`call ${N.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 P=new Map;for(let N of c){let x=P.get(N.srcDeclId);x===void 0?P.set(N.srcDeclId,[N.dstDeclId]):x.push(N.dstDeclId)}for(let N of u){let x=l.get(N);if(x.type!=="lmctl/loop")continue;let R=x.params.body;if(typeof R=="string"&&l.has(R)){let H=P.get(N);H===void 0?P.set(N,[R]):H.push(R)}}let q=new Set([f]),O=[f];for(;O.length>0;){let N=O.shift();for(let x of P.get(N)??[])q.has(x)||(q.add(x),O.push(x))}for(let N of u)q.has(N)||r(l.get(N).line,`step \`${N}\` is unreachable from entry \`${f}\``);let G=new Map;for(let N of c){let x=G.get(N.srcDeclId);x===void 0&&(x=new Set,G.set(N.srcDeclId,x)),x.add(N.port)}let A=new Set(["approve","request_changes","fail_pre_check","max_loops_exceeded"]);for(let N of u){let x=l.get(N);if(x.isTerminal)continue;let R=G.get(N)??new Set;if(x.type==="lmctl/review"){let U=[...R].some(L=>!A.has(L));!R.has("approve")&&!U&&r(x.line,`uncovered outcome: review step \`${N}\` wires neither \`approve\` nor any stance outcome \u2014 route \`approve\` (\`seq ${N} -approve-> <target>\`) or a stance port (run.ts:423-438 synthesizes outcomes_from_stance; review.ts:88-102 routes a stance before default approve)`);continue}let H=$j[x.type];if(H!==void 0)for(let U of H)R.has(U)||r(x.line,`uncovered outcome: required outcome \`${U}\` of step \`${N}\` (\`${x.type}\`) has no connection \u2014 route it (\`seq ${N} -${U}-> <target|terminal>\`)`);else R.size===0&&r(x.line,`uncovered outcome: non-terminal step \`${N}\` (\`${x.type}\`) has no outgoing connection \u2014 wire it with \`seq\` or route to a \`terminal\``)}for(let N of u){let x=l.get(N),R=vj[x.type];if(R===void 0)continue;let H={...x.params,...x.members??{},type:R.v2type,state_name:N,...Object.keys(R.outcomes).length>0?{outcomes:R.outcomes}:{}},U=R.schema.safeParse(H);if(!U.success){let L=U.error.issues[0],te=L.path.length===0?"$":L.path.map(String).join(".");r(x.line,`step \`${N}\` (\`${x.type}\`) has invalid params for archetype \`${R.v2type}\` at \`${te}\`: ${L.message} \u2014 this would crash the engine (it derefs this field unguarded). Provide it via the structured form: \`step ${N} = ${x.type.replace("lmctl/","")}({ ... })\``)}}let F={schema_version:"lmctl/v3",definition_schema_version:3,name:i,version:a,...m,...p.size>0?{triggers:[...p.values()]}:{},steps:I,connections:k,entry_step_id:v(f)},z=yt.safeParse(F);if(!z.success)throw new un(z.error.issues.map(N=>({line:s[0].n,message:`emitted V3 invalid at ${N.path.length===0?"$":N.path.map(String).join(".")}: ${N.message}`})));return z.data}function jj(t){let e=null;for(let r=0;r<t.length;r+=1){let n=t[r];if(e!==null){if(n==="\\"){r+=1;continue}n===e&&(e=null);continue}if(n==='"'||n==="'"){e=n;continue}if(n==="#")return t.slice(0,r)}return t}function or(t,e,r){let n=t.trim();if(n.length===0)return{};if(n.startsWith("{")){let 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 Aj(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]=s_(l)}return s}function Aj(t){return t.split(",").map(e=>e.trim()).filter(e=>e.length>0)}function s_(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 vj,Ij,e_,un,xj,$j,t_,r_,o_=b(()=>{"use strict";cn();Qh();ln();vj={"lmctl/review":{v2type:"Review",outcomes:{approve:"_"},schema:pi},"lmctl/consolidate":{v2type:"Consolidate",outcomes:{ok:"_"},schema:hi},"lmctl/interactive":{v2type:"Interactive",outcomes:{done:"_"},schema:_i},"lmctl/loop":{v2type:"Loop",outcomes:{ok:"_"},schema:gi},"lmctl/shell-step":{v2type:"ShellStep",outcomes:{},schema:wi}},Ij={"lmctl/review":["coder","reviewers"],"lmctl/consolidate":["researchers","consolidator"],"lmctl/interactive":["agent"]};e_={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"},un=class extends Error{issues;constructor(e){super(`composition DSL compile failed:
|
|
1433
|
+
`)||e.startsWith("{")||e.startsWith("[")?Vh(t,"$"):e.endsWith(".json")?Vh(_j(e,"utf8"),e):t}function Vh(t,e){try{return JSON.parse(t)}catch(r){let n=r instanceof Error?r.message:"invalid JSON";throw new Ct({errors:[{path:e,message:`invalid JSON: ${n}`}]})}}function bj(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"}),Sj(t,n,r);for(let[s,o]of Object.entries(t.states))new Set(Object.keys(t.terminals));return{errors:e,unresolvedRefs:r}}function Sj(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 Gh,Ct,zh=b(()=>{"use strict";ln();cn();zc();Gh=[1,2,3],Ct=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 Tj}from"node:crypto";function Zh(t,e){let r=kj(e),n=Tj("sha1").update(`${t}:${e}`).digest("hex").slice(0,4);return`s-${r}-${n}`}function kj(t){let e=t.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"");return e.length>0?e:"step"}var Qh=b(()=>{"use strict";cn()});function Nj(t,e){let r=Ij[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 n_(t){let e=[],r=(v,I)=>{throw new un([{line:v,message:I}])},n=t.split(`
|
|
1434
|
+
`),s=[];for(let v=0;v<n.length;v+=1){let O=jj(n[v]).trim();O.length>0&&s.push({n:v+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,m={},p=new Map,h=new Map,g=new Map,_=(v,I,O,J,W,L)=>{l.has(v)&&r(J,`duplicate step/terminal id: ${v}`),/^[A-Za-z][\w-]*$/.test(v)||r(J,`invalid id (must start with a letter): ${v}`),l.set(v,{declId:v,type:I,params:O,line:J,isTerminal:W,...L?{members:L}:{}}),u.push(v)},T=v=>{let I=[],O=v+1;for(;O<s.length;O+=1){let J=/^([A-Za-z][\w-]*|default)\s*->\s*([A-Za-z][\w-]*)$/.exec(s[O].text);if(J===null)break;I.push({label:J[1],dst:J[2]})}return{branches:I,nextIdx:O-1}};for(let v=1;v<s.length;v+=1){let{n:I,text:O}=s[v],J=O.split(/\s+/,1)[0];if(/^meta\s*\(/.test(O)){v!==1&&r(I,"`meta(...)` must be the preamble \u2014 the FIRST line after the `workflow` header (at most one, before any construct)");let W=/^meta\s*\((.*)\)\s*$/.exec(O)??r(I,`malformed \`meta\` (expected \`meta({ "requires"?:\u2026, "default_task_timeout_ms"?:\u2026, "errors"?:\u2026, "concurrency_key"?:\u2026, "concurrent_limit"?:\u2026 })\`): ${O}`),L=or(W[1],I,r);for(let te of Object.keys(L))t_.has(te)||r(I,`unknown \`meta\` key \`${te}\` \u2014 only workflow-level runtime metadata is allowed: ${[...t_].join(", ")} (no grammar inflation; bounded)`);m=L;continue}if(J==="step"){let W=/^step\s+([A-Za-z][\w-]*)\s*=\s*([a-z][a-z0-9-]*)\s*\((.*)\)\s*$/.exec(O)??r(I,`malformed \`step\` (expected \`step <id> = <archetype>(k=v, ...)\`): ${O}`),L=W[1],te=W[2],_e=W[3],ie=e_[te];ie===void 0&&r(I,`unknown step type: ${te} (supported \`step\` archetypes: ${Object.keys(e_).join(", ")}; choice/terminal/loop/foreach/call/decide have their own constructs)`);let{params:we,members:Tt}=Nj(ie,or(_e,I,r));_(L,ie,we,I,!1,Object.keys(Tt).length>0?Tt:void 0);continue}if(J==="trigger"){let W=/^trigger\s+([A-Za-z][\w-]*)\s*=\s*([a-z][a-z0-9-]*)\s*\((.*)\)\s*$/.exec(O)??r(I,`malformed \`trigger\` (expected \`trigger <id> = <trigger-type>({ ...json... })\`): ${O}`),L=W[1],te=W[2],_e=W[3],ie=r_[te];ie===void 0&&r(I,`unknown trigger type: ${te} (registered trigger archetypes: ${Object.keys(r_).join(", ")})`),p.has(L)&&r(I,`duplicate trigger id: ${L}`),p.set(L,{id:L,type:ie,parameters:or(_e,I,r)});continue}if(J==="mcp"||J==="skill"){let W=new RegExp(`^${J}\\s+([A-Za-z][\\w-]*)\\s*=\\s*(.+)$`).exec(O)??r(I,`malformed \`${J}\` decl (expected \`${J} <name> = {json} | ${J} <name> = "<file|url>"\`): ${O}`),L=W[1],te=W[2].trim(),_e=J==="mcp"?h:g;_e.has(L)&&r(I,`duplicate ${J} declaration: ${L}`);let ie;if(te.startsWith("{")){let we=or(te,I,r);J==="mcp"?ie={...we,name:L}:((typeof we.content!="string"||we.content.length===0)&&r(I,`\`skill ${L}\`: inline form requires a non-empty string \`content\` (a SKILL.md body)`),ie={name:L,content:we.content})}else{let we=s_(te);(typeof we!="string"||we.length===0)&&r(I,`\`${J} ${L}\`: string form must be a non-empty file path or http(s) URL`),ie=we}_e.set(L,ie);continue}if(J==="terminal"){let W=/^terminal\s+([A-Za-z][\w-]*)\s*=\s*([A-Za-z][\w-]*)(?:\s+(success|failure|neutral))?\s*$/.exec(O)??r(I,`malformed \`terminal\` (expected \`terminal <id> = <name> [success|failure|neutral]\`): ${O}`);_(W[1],"lmctl/terminal",{name:W[2],kind:W[3]??"neutral"},I,!0);continue}if(J==="seq"){let L=O.slice(3).trim().split(/\s*(->|-[a-z0-9_]+->)\s*/).map(te=>te.trim()).filter(te=>te.length>0);(L.length<3||L.length%2===0)&&r(I,`malformed \`seq\` (expected \`<id> -> <id> [ -> <id> ... ]\`, optional \`-<port>->\`): ${O}`);for(let te=0;te+2<L.length+1&&!(te+2>L.length-1);te+=2){let _e=L[te],ie=L[te+1],we=L[te+2],Tt=ie==="->"?"main":ie.slice(1,-2);c.push({srcDeclId:_e,port:Tt,dstDeclId:we,line:I})}continue}if(J==="choice"){let L=(/^choice\s+([A-Za-z][\w-]*)\s*:$/.exec(O)??r(I,`malformed \`choice\` (expected \`choice <id>:\` then \`when <predicate> -<port>-> <id>\` lines): ${O}`))[1],te=[],_e,ie=v+1;for(;ie<s.length;ie+=1){let we=s[ie].text,Tt=/^when\s+(.+)\s+-([a-z0-9_]+)->\s+([A-Za-z][\w-]*)$/.exec(we);if(Tt!==null){_e!==void 0&&r(s[ie].n,`\`choice ${L}\`: a \`when\` branch may not follow \`default\` (branches are ordered, default is the fallback)`);let jn=Tt[2];te.push({when:Tt[1].trim(),next:`@terminal:${jn}`}),c.push({srcDeclId:L,port:jn,dstDeclId:Tt[3],line:s[ie].n});continue}let Ja=/^default\s+-([a-z0-9_]+)->\s+([A-Za-z][\w-]*)$/.exec(we);if(Ja!==null){_e!==void 0&&r(s[ie].n,`\`choice ${L}\` has more than one \`default\``);let jn=Ja[1];_e=`@terminal:${jn}`,c.push({srcDeclId:L,port:jn,dstDeclId:Ja[2],line:s[ie].n});continue}break}te.length===0&&r(I,`\`choice ${L}\` has no \`when\` branches (need \u22651 \`when <jexl-predicate> -<port>-> <id>\`)`),_(L,"lmctl/choice",{branches:te,..._e!==void 0?{default_next:_e}:{}},I,!1),v=ie-1;continue}if(J==="loop"){let W=/^loop\s+([A-Za-z][\w-]*)\s*=\s*loop\s*\((.*)\)\s*$/.exec(O)??r(I,`malformed \`loop\` (expected \`loop <id> = loop(k=v, ...)\`): ${O}`);_(W[1],"lmctl/loop",or(W[2],I,r),I,!1);continue}if(J==="foreach"){let W=/^foreach\s+([A-Za-z][\w-]*)\s*=\s*foreach\s*\((.*)\)\s*$/.exec(O)??r(I,`malformed \`foreach\` (expected \`foreach <id> = foreach(items=<expr>, ...)\`): ${O}`),L=or(W[2],I,r);"mode"in L&&r(I,"foreach is SEQUENTIAL-ONLY: `mode` is not permitted (single-thread; durable-memory/composition-language-design.md \xA7Execution model)"),_(W[1],"lmctl/foreach",L,I,!1);continue}if(J==="call"){let W=/^call\s+([A-Za-z][\w-]*)\s*=\s*call\s*\((.*)\)\s*$/.exec(O)??r(I,`malformed \`call\` (expected \`call <id> = call(workflow=<name>, ...)\`): ${O}`),L=W[1],te=or(W[2],I,r),_e=te.workflow;(typeof _e!="string"||_e.length===0)&&r(I,`\`call ${L}\` requires a \`workflow=<name>\` argument`);let{workflow:ie,...we}=te;_(L,"lmctl/subflow",{workflow_name:_e,...we},I,!1),d.push({declId:L,target:_e,line:I});continue}if(J==="decide"){let W=/^decide\s+([A-Za-z][\w-]*)\s+by\s+agent\s*\((.*)\)\s*:$/.exec(O)??r(I,`malformed \`decide\` (expected \`decide <id> by agent(k=v, ...):\`): ${O}`),L=W[1],te=or(W[2],I,r),{branches:_e,nextIdx:ie}=T(v);_e.length===0&&r(I,`\`decide ${L}\` has no outcomes (need at least one \`<outcome> -> <id>\`)`),_(L,"lmctl/interactive",{termination:{operator_signal:!0}},I,!1,{agent:te});for(let we of _e)c.push({srcDeclId:L,port:we.label,dstDeclId:we.dst,line:I});v=ie;continue}if(J==="entry"){let W=/^entry\s+([A-Za-z][\w-]*)$/.exec(O)??r(I,`malformed \`entry\` (expected \`entry <id>\`): ${O}`);f!==void 0&&r(I,`duplicate \`entry\` (already set to ${f})`),f=W[1];continue}r(I,`unknown statement \`${J}\` (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 E=v=>{if(Array.isArray(v)){for(let O of v)E(O);return}if(typeof v!="object"||v===null)return;let I=v;if(typeof I.alias=="string")for(let[O,J]of[["mcp",h],["skills",g]]){let W=I[O];Array.isArray(W)&&(I[O]=W.map(L=>typeof L=="string"&&J.has(L)?structuredClone(J.get(L)):L))}for(let O of Object.values(I))E(O)};for(let v of u){let I=l.get(v);I.members!==void 0&&E(I.members)}let k=v=>Zh(i,v),$=u.map(v=>{let I=l.get(v);return{id:k(v),name:v,type:I.type,typeVersion:1,parameters:I.params,...I.members?{members:I.members}:{}}}),N={};for(let v of c){l.has(v.srcDeclId)||r(v.line,`edge source references undeclared step: ${v.srcDeclId}`),l.has(v.dstDeclId)||r(v.line,`dangling edge target: ${v.dstDeclId} is not declared`),l.get(v.srcDeclId).isTerminal&&r(v.line,`terminal \`${v.srcDeclId}\` cannot have an outgoing edge`);let I=k(v.srcDeclId);N[I]??={},N[I][v.port]!==void 0&&r(v.line,`duplicate edge port \`${v.port}\` on step \`${v.srcDeclId}\``),N[I][v.port]=[[{step_id:k(v.dstDeclId),type:"main",index:0}]]}for(let v of u){let I=l.get(v);xj.has(I.type)||r(I.line,`unknown archetype \`${I.type}\` for step \`${v}\` \u2014 not a registered builtin (src/engine/archetypes/index.ts:17-32)`)}for(let v of d)v.target===i&&r(v.line,`subflow cycle: \`call ${v.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 v of c){let I=A.get(v.srcDeclId);I===void 0?A.set(v.srcDeclId,[v.dstDeclId]):I.push(v.dstDeclId)}for(let v of u){let I=l.get(v);if(I.type!=="lmctl/loop")continue;let O=I.params.body;if(typeof O=="string"&&l.has(O)){let J=A.get(v);J===void 0?A.set(v,[O]):J.push(O)}}let D=new Set([f]),C=[f];for(;C.length>0;){let v=C.shift();for(let I of A.get(v)??[])D.has(I)||(D.add(I),C.push(I))}for(let v of u)D.has(v)||r(l.get(v).line,`step \`${v}\` is unreachable from entry \`${f}\``);let H=new Map;for(let v of c){let I=H.get(v.srcDeclId);I===void 0&&(I=new Set,H.set(v.srcDeclId,I)),I.add(v.port)}let R=new Set(["approve","request_changes","fail_pre_check","max_loops_exceeded"]);for(let v of u){let I=l.get(v);if(I.isTerminal)continue;let O=H.get(v)??new Set;if(I.type==="lmctl/review"){let W=[...O].some(L=>!R.has(L));!O.has("approve")&&!W&&r(I.line,`uncovered outcome: review step \`${v}\` wires neither \`approve\` nor any stance outcome \u2014 route \`approve\` (\`seq ${v} -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 J=$j[I.type];if(J!==void 0)for(let W of J)O.has(W)||r(I.line,`uncovered outcome: required outcome \`${W}\` of step \`${v}\` (\`${I.type}\`) has no connection \u2014 route it (\`seq ${v} -${W}-> <target|terminal>\`)`);else O.size===0&&r(I.line,`uncovered outcome: non-terminal step \`${v}\` (\`${I.type}\`) has no outgoing connection \u2014 wire it with \`seq\` or route to a \`terminal\``)}for(let v of u){let I=l.get(v),O=vj[I.type];if(O===void 0)continue;let J={...I.params,...I.members??{},type:O.v2type,state_name:v,...Object.keys(O.outcomes).length>0?{outcomes:O.outcomes}:{}},W=O.schema.safeParse(J);if(!W.success){let L=W.error.issues[0],te=L.path.length===0?"$":L.path.map(String).join(".");r(I.line,`step \`${v}\` (\`${I.type}\`) has invalid params for archetype \`${O.v2type}\` at \`${te}\`: ${L.message} \u2014 this would crash the engine (it derefs this field unguarded). Provide it via the structured form: \`step ${v} = ${I.type.replace("lmctl/","")}({ ... })\``)}}let U={schema_version:"lmctl/v3",definition_schema_version:3,name:i,version:a,...m,...p.size>0?{triggers:[...p.values()]}:{},steps:$,connections:N,entry_step_id:k(f)},z=yt.safeParse(U);if(!z.success)throw new un(z.error.issues.map(v=>({line:s[0].n,message:`emitted V3 invalid at ${v.path.length===0?"$":v.path.map(String).join(".")}: ${v.message}`})));return z.data}function jj(t){let e=null;for(let r=0;r<t.length;r+=1){let n=t[r];if(e!==null){if(n==="\\"){r+=1;continue}n===e&&(e=null);continue}if(n==='"'||n==="'"){e=n;continue}if(n==="#")return t.slice(0,r)}return t}function or(t,e,r){let n=t.trim();if(n.length===0)return{};if(n.startsWith("{")){let 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 Aj(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]=s_(l)}return s}function Aj(t){return t.split(",").map(e=>e.trim()).filter(e=>e.length>0)}function s_(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 vj,Ij,e_,un,xj,$j,t_,r_,o_=b(()=>{"use strict";cn();Qh();ln();vj={"lmctl/review":{v2type:"Review",outcomes:{approve:"_"},schema:pi},"lmctl/consolidate":{v2type:"Consolidate",outcomes:{ok:"_"},schema:hi},"lmctl/interactive":{v2type:"Interactive",outcomes:{done:"_"},schema:_i},"lmctl/loop":{v2type:"Loop",outcomes:{ok:"_"},schema:gi},"lmctl/shell-step":{v2type:"ShellStep",outcomes:{},schema:wi}},Ij={"lmctl/review":["coder","reviewers"],"lmctl/consolidate":["researchers","consolidator"],"lmctl/interactive":["agent"]};e_={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"},un=class extends Error{issues;constructor(e){super(`composition DSL compile failed:
|
|
1435
1435
|
${e.map(r=>` line ${r.line}: ${r.message}`).join(`
|
|
1436
1436
|
`)}`),this.issues=e,this.name="DslCompileError"}},xj=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"]),$j={"lmctl/consolidate":["ok"],"lmctl/interactive":["done"],"lmctl/loop":["ok"],"lmctl/foreach":["all_ok"]},t_=new Set(["requires","default_task_timeout_ms","errors","concurrency_key","concurrent_limit"]),r_={"trigger-schedule":"lmctl/trigger-schedule","trigger-gh-issue":"lmctl/trigger-gh-issue"}});import{readFileSync as Rj}from"node:fs";function Oj(){let t=process.env.LMCTL_DSL;return t===void 0?!0:!["0","false","off"].includes(t.trim().toLowerCase())}function Lj(t){for(let e of t.split(`
|
|
1437
1437
|
`)){let r=e.replace(/#.*/,"").trim();if(r.length!==0)return/^workflow\s+\S+\s+v\d+\s*$/.test(r)}return!1}function Ce(t){if(typeof t=="string"&&Oj()&&Lj(t)){let r;try{r=n_(t)}catch(s){throw s instanceof un?new Mt(s.issues.map(o=>({path:`dsl:${o.line}`,message:o.message}))):s}let n=yt.safeParse(r);if(!n.success)throw new Mt(n.error.issues.map(s=>({path:s.path.length===0?"$":s.path.map(String).join("."),message:s.message})));return n.data}let e=bi(Mj(t));if(Dj(e)&&e.definition_schema_version===3){let r=yt.safeParse(e);if(!r.success)throw new Mt(r.error.issues.map(n=>({path:n.path.length===0?"$":n.path.map(String).join("."),message:n.message})));return r.data}return Cj(e)}function Cj(t){let e=yi.safeParse(t);if(!e.success)throw new Mt(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 Mt([{path:`states.${s}`,message:`v2 workflows (primitive_version: 2) may not use v1 primitive type: ${o.type}`}]);try{return Kh(r)}catch(s){throw s instanceof Ct?new Zc(s):s}}function Mj(t){if(typeof t!="string")return t;let e=t.trim();return t.includes(`
|
|
@@ -1444,7 +1444,7 @@ ${n}`}function mA(t,e,r,n){let s=jr(t,du),o=`- [${e}.md](${e}.md)${n!==null?` \u
|
|
|
1444
1444
|
`)?`${i}
|
|
1445
1445
|
${o}
|
|
1446
1446
|
`:`${i}${o}
|
|
1447
|
-
`,uu(s,i,"utf8")}function pA(t,e){let r=jr(t,du);if(!mn(r))return;let n=xi(r,"utf8"),s=new RegExp(`^- \\[${S_(e)}\\.md\\].*$\\r?\\n?`,"m");s.test(n)&&uu(r,n.replace(s,""),"utf8")}function S_(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function hA(t){return t==="user"||t==="feedback"||t==="project"||t==="reference"}function ut(t,e){return t.durable_memory_mode==="db"?new cu(e,t.id):new lu(t.local_path)}var dA,du,E_,lu,cu,fu=b(()=>{"use strict";dA=/^[a-zA-Z0-9_-]+$/;du="MEMORY.md",E_="1970-01-01T00:00:00.000Z",lu=class{dir;constructor(e){this.dir=jr(e,"durable-memory")}read(e){et(e);let r=jr(this.dir,`${e}.md`);if(!mn(r))return null;let n=xi(r,"utf8");return b_(e,n)}write(e){et(e.name),lA(this.dir,{recursive:!0});let r=jr(this.dir,`${e.name}.md`),n=!mn(r),s=fA(e.name,e.type,e.description??null,e.body);return uu(r,s,"utf8"),mA(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){et(e);let r=jr(this.dir,`${e}.md`);return mn(r)?(uA(r),pA(this.dir,e),!0):!1}listFiles(){if(!mn(this.dir))return[];let e=cA(this.dir).filter(n=>n.endsWith(".md")&&n!==du),r=[];for(let n of e){let s=n.slice(0,-3),o=xi(jr(this.dir,n),"utf8"),i=b_(s,o);i!==null&&r.push(i)}return r.sort((n,s)=>n.name.localeCompare(s.name))}};cu=class{dal;projectId;constructor(e,r){this.dal=e,this.projectId=r}read(e){et(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){et(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 et(e),this.dal.deleteDurableMemory(this.projectId,e)}}});function k_(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=ut(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=ut(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||!T_.has(a))return n.json({error:`invalid type: must be one of ${[...T_].join("|")}`},400);if(l===null)return n.json({error:"missing name"},400);if(c===null)return n.json({error:"missing body"},400);let d=ut(o,r),f;try{({created:f}=d.write({type:a,name:l,description:u,body:c}))}catch(m){return n.json({error:m.message},400)}return n.json({success:!0,created_or_updated:f?"created":"updated"})}),t.get("/api/durable-memory/list/:project_id",n=>{let s=Number(n.req.param("project_id")),o=r.getProject(s);if(o===null)return n.json({error:"project not found"},404);let i=ut(o,r),a=n.req.query("type");return n.json(i.list(a))})}var T_,v_=b(()=>{"use strict";fu();T_=new Set(["user","feedback","project","reference"])});function gA(t){let e=4294967295;for(let r=0;r<t.length;r+=1)e=(_A[(e^t[r])&255]^e>>>8)>>>0;return(e^4294967295)>>>0}function wA(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 I_(t,e=new Date){let{time:r,date:n}=wA(e),s=[],o=[],i=0,a=new TextEncoder;for(let h of t){let g=a.encode(h.name),_=gA(h.data),T=h.data.length,E=new Uint8Array(30+g.length),v=new DataView(E.buffer);v.setUint32(0,67324752,!0),v.setUint16(4,20,!0),v.setUint16(6,0,!0),v.setUint16(8,0,!0),v.setUint16(10,r,!0),v.setUint16(12,n,!0),v.setUint32(14,_,!0),v.setUint32(18,T,!0),v.setUint32(22,T,!0),v.setUint16(26,g.length,!0),v.setUint16(28,0,!0),E.set(g,30),s.push(E,h.data);let I=new Uint8Array(46+g.length),k=new DataView(I.buffer);k.setUint32(0,33639248,!0),k.setUint16(4,20,!0),k.setUint16(6,20,!0),k.setUint16(8,0,!0),k.setUint16(10,0,!0),k.setUint16(12,r,!0),k.setUint16(14,n,!0),k.setUint32(16,_,!0),k.setUint32(20,T,!0),k.setUint32(24,T,!0),k.setUint16(28,g.length,!0),k.setUint16(30,0,!0),k.setUint16(32,0,!0),k.setUint16(34,0,!0),k.setUint16(36,0,!0),k.setUint32(38,0,!0),k.setUint32(42,i,!0),I.set(g,46),o.push(I),i+=E.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,m=new Uint8Array(f),p=0;for(let h of s)m.set(h,p),p+=h.length;for(let h of o)m.set(h,p),p+=h.length;return m.set(u,p),m}var _A,N_=b(()=>{"use strict";_A=(()=>{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 Ai,mkdirSync as yA,readdirSync as EA,readFileSync as j_,statSync as bA,unlinkSync as SA,writeFileSync as TA}from"node:fs";import{join as us}from"node:path";function A_(t,e){let{dal:r}=e;t.post("/api/projects",async n=>{let s=await dt(n);if(typeof s=="string")return j(n,s,400);let o=ae(s,"name"),i=ae(s,"local_path");if(o===null||o.length===0)return j(n,"missing or empty name",400);if(i===null||i.length===0)return j(n,"missing or empty local_path",400);if(r.findProjectByName(o)!==null)return j(n,`project already exists: ${o}`,409);let a=ae(s,"workflow_name")??"bugfix",l,c=ae(s,"team_name");if(c!==null&&c.length>0){let d=r.findTeamByName(c);if(d===null)return j(n,`team not found: ${c}`,404);l=d.id}else{let d=r.listTeams();if(d.length===0)return j(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:ae(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 j(n,"project not found",404);let o=await dt(n);if(typeof o=="string")return j(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 j(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 j(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 j(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 j(n,"intake_config must be a JSON object, string, or null",400)}let a=r.updateProjectSettings(s.id,i);return a===null?j(n,"project not found",404):n.json(a)}),t.post("/api/teams",async n=>{let s=await dt(n);if(typeof s=="string")return j(n,s,400);let o=ae(s,"name");if(o===null||o.length===0)return j(n,"missing or empty name",400);if(r.findTeamByName(o)!==null)return j(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 j(n,"team not found",404);let o=await dt(n);if(typeof o=="string")return j(n,o,400);let i=ae(o,"alias"),a=ae(o,"provider");if(i===null||i.length===0)return j(n,"missing or empty alias",400);if(a===null||a.length===0)return j(n,"missing or empty provider",400);if(r.findTeamMemberByAlias(s.id,i)!==null)return j(n,`member already exists: ${i}`,409);let l=ae(o,"model"),c=r.insertTeamMember({team_id:s.id,alias:i,provider:a,model:l,sessiondir:`.lmctl/sessions/${s.name}/${i}`}),u=ae(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 j(n,"team not found",404);let o=r.findTeamMemberByAlias(s.id,n.req.param("alias"));if(o===null)return j(n,"member not found",404);let i=await dt(n);if(typeof i=="string")return j(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 j(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 j(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 j(n,"provider must be a non-empty string",400);a.provider=c}if(Object.keys(a).length===0)return j(n,"no updatable fields provided",400);let l=r.updateTeamMemberMeta(o.id,a);return l===null?j(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 j(n,"project not found",404);let o=ut(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 j(n,"project not found",404);let o=await dt(n);if(typeof o=="string")return j(n,o,400);let i=ae(o,"name"),a=ae(o,"body"),l=ae(o,"type");if(i===null||i.length===0)return j(n,"missing or empty name",400);if(a===null)return j(n,"missing body",400);if(l===null||!$i.includes(l))return j(n,`invalid type: must be one of ${$i.join("|")}`,400);try{et(i)}catch(d){return j(n,d.message,400)}let c=ut(s,r);try{if(c.read(i)!==null)return j(n,`chapter already exists: ${i}`,409)}catch(d){return j(n,d.message,400)}try{c.write({type:l,name:i,description:ae(o,"description"),body:a})}catch(d){return j(n,d.message,400)}let u=c.read(i);return u===null?j(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 j(n,"project not found",404);let o=ut(s,r),i;try{i=o.read(n.req.param("chapter"))}catch(a){return j(n,a.message,400)}return i===null?j(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 j(n,"project not found",404);let o=n.req.param("chapter"),i=await dt(n);if(typeof i=="string")return j(n,i,400);let a=ut(s,r),l;try{l=a.read(o)}catch(m){return j(n,m.message,400)}if(l===null)return j(n,"chapter not found",404);let c=ae(i,"body")??l.body,u=Object.prototype.hasOwnProperty.call(i,"description")?ae(i,"description"):l.description,d=ae(i,"type")??l.type;if(!$i.includes(d))return j(n,`invalid type: must be one of ${$i.join("|")}`,400);try{a.write({type:d,name:o,description:u,body:c})}catch(m){return j(n,m.message,400)}let f=a.read(o);return f===null?j(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 j(n,"project not found",404);let o=ut(s,r),i;try{i=o.delete(n.req.param("chapter"))}catch(a){return j(n,a.message,400)}return i?n.json({removed:!0}):j(n,"chapter not found",404)}),t.get("/api/projects/:name/ai-test",n=>{let s=r.findProjectByName(n.req.param("name"));return s===null?j(n,"project not found",404):n.json(vA(s.local_path))}),t.post("/api/projects/:name/ai-test",async n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return j(n,"project not found",404);let o=await dt(n);if(typeof o=="string")return j(n,o,400);let i=ae(o,"name"),a=ae(o,"body"),l=ae(o,"type");if(i===null||i.length===0)return j(n,"missing or empty name",400);if(a===null)return j(n,"missing body",400);if(l===null||!ji.has(l))return j(n,`invalid type: must be one of ${[...ji].join("|")}`,400);try{et(i)}catch(f){return j(n,f.message,400)}let c=ls(s.local_path),u=us(c,`${i}.md`);if(Ai(u))return j(n,`chapter already exists: ${i}`,409);yA(c,{recursive:!0}),$_(u,i,l,ae(o,"description"),a);let d=cs(c,i);return d===null?j(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 j(n,"project not found",404);try{et(n.req.param("chapter"))}catch(i){return j(n,i.message,400)}let o=cs(ls(s.local_path),n.req.param("chapter"));return o===null?j(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 j(n,"project not found",404);let o=n.req.param("chapter");try{et(o)}catch(m){return j(n,m.message,400)}let i=ls(s.local_path),a=cs(i,o);if(a===null)return j(n,"chapter not found",404);let l=await dt(n);if(typeof l=="string")return j(n,l,400);let c=ae(l,"body")??a.body,u=Object.prototype.hasOwnProperty.call(l,"description")?ae(l,"description"):a.description,d=ae(l,"type")??a.type;if(!ji.has(d))return j(n,`invalid type: must be one of ${[...ji].join("|")}`,400);$_(us(i,`${o}.md`),o,d,u,c);let f=cs(i,o);return f===null?j(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 j(n,"project not found",404);let o=n.req.param("chapter");try{et(o)}catch(a){return j(n,a.message,400)}let i=us(ls(s.local_path),`${o}.md`);return Ai(i)?(SA(i),n.json({removed:!0})):j(n,"chapter not found",404)}),t.get("/api/tokens",n=>n.json([])),t.post("/api/tokens",n=>j(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 dt(n);return typeof s=="string"?j(n,s,400):n.json({accepted:s,note:"settings persistence not yet implemented"})}),t.get("/api/chat/sessions",n=>n.json(r.listChatbotSessions(x_))),t.post("/api/chat/sessions",async n=>{let s=await kA(n);if(typeof s=="string")return j(n,s,400);let o=s!==null?ae(s,"title"):null,i=r.createChatbotSession(x_,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?j(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 j(n,"chat session not found",404);let o=await dt(n);if(typeof o=="string")return j(n,o,400);let i=ae(o,"role"),a=ae(o,"content");if(i===null||i!=="user"&&i!=="assistant"&&i!=="tool")return j(n,"role must be one of user|assistant|tool",400);if(a===null)return j(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 j(n,"invalid run id",400);if(r.getRun(s)===null)return j(n,"run not found",404);let i=Ir(r,s),a=[];for(let c of i){let u=NA(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=j_(c.path),m=f.buffer.slice(f.byteOffset,f.byteOffset+f.byteLength);d=new Uint8Array(m)}catch{d=new Uint8Array(0)}d!==null&&a.push({name:u,data:d})}let l=I_(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 j(t,e,r){return t.json({error:e},r)}async function dt(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 kA(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 ae(t,e){let r=t[e];return typeof r!="string"?null:r}function ls(t){return us(t,"ai-test")}function cs(t,e){let r=us(t,`${e}.md`);if(!Ai(r))return null;let n=j_(r,"utf8"),s=IA(n),o=bA(r).mtime.toISOString();return{name:e,type:s.type,description:s.description,body:s.body,updated_at:o}}function vA(t){let e=ls(t);return Ai(e)?EA(e).filter(r=>r.endsWith(".md")&&r!=="index.md").map(r=>r.slice(0,-3)).sort().map(r=>{let n=cs(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 $_(t,e,r,n,s){let o=n!==null&&n.length>0?`
|
|
1447
|
+
`,uu(s,i,"utf8")}function pA(t,e){let r=jr(t,du);if(!mn(r))return;let n=xi(r,"utf8"),s=new RegExp(`^- \\[${S_(e)}\\.md\\].*$\\r?\\n?`,"m");s.test(n)&&uu(r,n.replace(s,""),"utf8")}function S_(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function hA(t){return t==="user"||t==="feedback"||t==="project"||t==="reference"}function ut(t,e){return t.durable_memory_mode==="db"?new cu(e,t.id):new lu(t.local_path)}var dA,du,E_,lu,cu,fu=b(()=>{"use strict";dA=/^[a-zA-Z0-9_-]+$/;du="MEMORY.md",E_="1970-01-01T00:00:00.000Z",lu=class{dir;constructor(e){this.dir=jr(e,"durable-memory")}read(e){et(e);let r=jr(this.dir,`${e}.md`);if(!mn(r))return null;let n=xi(r,"utf8");return b_(e,n)}write(e){et(e.name),lA(this.dir,{recursive:!0});let r=jr(this.dir,`${e.name}.md`),n=!mn(r),s=fA(e.name,e.type,e.description??null,e.body);return uu(r,s,"utf8"),mA(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){et(e);let r=jr(this.dir,`${e}.md`);return mn(r)?(uA(r),pA(this.dir,e),!0):!1}listFiles(){if(!mn(this.dir))return[];let e=cA(this.dir).filter(n=>n.endsWith(".md")&&n!==du),r=[];for(let n of e){let s=n.slice(0,-3),o=xi(jr(this.dir,n),"utf8"),i=b_(s,o);i!==null&&r.push(i)}return r.sort((n,s)=>n.name.localeCompare(s.name))}};cu=class{dal;projectId;constructor(e,r){this.dal=e,this.projectId=r}read(e){et(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){et(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 et(e),this.dal.deleteDurableMemory(this.projectId,e)}}});function k_(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=ut(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=ut(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||!T_.has(a))return n.json({error:`invalid type: must be one of ${[...T_].join("|")}`},400);if(l===null)return n.json({error:"missing name"},400);if(c===null)return n.json({error:"missing body"},400);let d=ut(o,r),f;try{({created:f}=d.write({type:a,name:l,description:u,body:c}))}catch(m){return n.json({error:m.message},400)}return n.json({success:!0,created_or_updated:f?"created":"updated"})}),t.get("/api/durable-memory/list/:project_id",n=>{let s=Number(n.req.param("project_id")),o=r.getProject(s);if(o===null)return n.json({error:"project not found"},404);let i=ut(o,r),a=n.req.query("type");return n.json(i.list(a))})}var T_,v_=b(()=>{"use strict";fu();T_=new Set(["user","feedback","project","reference"])});function gA(t){let e=4294967295;for(let r=0;r<t.length;r+=1)e=(_A[(e^t[r])&255]^e>>>8)>>>0;return(e^4294967295)>>>0}function wA(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 I_(t,e=new Date){let{time:r,date:n}=wA(e),s=[],o=[],i=0,a=new TextEncoder;for(let h of t){let g=a.encode(h.name),_=gA(h.data),T=h.data.length,E=new Uint8Array(30+g.length),k=new DataView(E.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,T,!0),k.setUint32(22,T,!0),k.setUint16(26,g.length,!0),k.setUint16(28,0,!0),E.set(g,30),s.push(E,h.data);let $=new Uint8Array(46+g.length),N=new DataView($.buffer);N.setUint32(0,33639248,!0),N.setUint16(4,20,!0),N.setUint16(6,20,!0),N.setUint16(8,0,!0),N.setUint16(10,0,!0),N.setUint16(12,r,!0),N.setUint16(14,n,!0),N.setUint32(16,_,!0),N.setUint32(20,T,!0),N.setUint32(24,T,!0),N.setUint16(28,g.length,!0),N.setUint16(30,0,!0),N.setUint16(32,0,!0),N.setUint16(34,0,!0),N.setUint16(36,0,!0),N.setUint32(38,0,!0),N.setUint32(42,i,!0),$.set(g,46),o.push($),i+=E.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,m=new Uint8Array(f),p=0;for(let h of s)m.set(h,p),p+=h.length;for(let h of o)m.set(h,p),p+=h.length;return m.set(u,p),m}var _A,N_=b(()=>{"use strict";_A=(()=>{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 Ai,mkdirSync as yA,readdirSync as EA,readFileSync as j_,statSync as bA,unlinkSync as SA,writeFileSync as TA}from"node:fs";import{join as us}from"node:path";function A_(t,e){let{dal:r}=e;t.post("/api/projects",async n=>{let s=await dt(n);if(typeof s=="string")return j(n,s,400);let o=ae(s,"name"),i=ae(s,"local_path");if(o===null||o.length===0)return j(n,"missing or empty name",400);if(i===null||i.length===0)return j(n,"missing or empty local_path",400);if(r.findProjectByName(o)!==null)return j(n,`project already exists: ${o}`,409);let a=ae(s,"workflow_name")??"bugfix",l,c=ae(s,"team_name");if(c!==null&&c.length>0){let d=r.findTeamByName(c);if(d===null)return j(n,`team not found: ${c}`,404);l=d.id}else{let d=r.listTeams();if(d.length===0)return j(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:ae(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 j(n,"project not found",404);let o=await dt(n);if(typeof o=="string")return j(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 j(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 j(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 j(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 j(n,"intake_config must be a JSON object, string, or null",400)}let a=r.updateProjectSettings(s.id,i);return a===null?j(n,"project not found",404):n.json(a)}),t.post("/api/teams",async n=>{let s=await dt(n);if(typeof s=="string")return j(n,s,400);let o=ae(s,"name");if(o===null||o.length===0)return j(n,"missing or empty name",400);if(r.findTeamByName(o)!==null)return j(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 j(n,"team not found",404);let o=await dt(n);if(typeof o=="string")return j(n,o,400);let i=ae(o,"alias"),a=ae(o,"provider");if(i===null||i.length===0)return j(n,"missing or empty alias",400);if(a===null||a.length===0)return j(n,"missing or empty provider",400);if(r.findTeamMemberByAlias(s.id,i)!==null)return j(n,`member already exists: ${i}`,409);let l=ae(o,"model"),c=r.insertTeamMember({team_id:s.id,alias:i,provider:a,model:l,sessiondir:`.lmctl/sessions/${s.name}/${i}`}),u=ae(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 j(n,"team not found",404);let o=r.findTeamMemberByAlias(s.id,n.req.param("alias"));if(o===null)return j(n,"member not found",404);let i=await dt(n);if(typeof i=="string")return j(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 j(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 j(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 j(n,"provider must be a non-empty string",400);a.provider=c}if(Object.keys(a).length===0)return j(n,"no updatable fields provided",400);let l=r.updateTeamMemberMeta(o.id,a);return l===null?j(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 j(n,"project not found",404);let o=ut(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 j(n,"project not found",404);let o=await dt(n);if(typeof o=="string")return j(n,o,400);let i=ae(o,"name"),a=ae(o,"body"),l=ae(o,"type");if(i===null||i.length===0)return j(n,"missing or empty name",400);if(a===null)return j(n,"missing body",400);if(l===null||!$i.includes(l))return j(n,`invalid type: must be one of ${$i.join("|")}`,400);try{et(i)}catch(d){return j(n,d.message,400)}let c=ut(s,r);try{if(c.read(i)!==null)return j(n,`chapter already exists: ${i}`,409)}catch(d){return j(n,d.message,400)}try{c.write({type:l,name:i,description:ae(o,"description"),body:a})}catch(d){return j(n,d.message,400)}let u=c.read(i);return u===null?j(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 j(n,"project not found",404);let o=ut(s,r),i;try{i=o.read(n.req.param("chapter"))}catch(a){return j(n,a.message,400)}return i===null?j(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 j(n,"project not found",404);let o=n.req.param("chapter"),i=await dt(n);if(typeof i=="string")return j(n,i,400);let a=ut(s,r),l;try{l=a.read(o)}catch(m){return j(n,m.message,400)}if(l===null)return j(n,"chapter not found",404);let c=ae(i,"body")??l.body,u=Object.prototype.hasOwnProperty.call(i,"description")?ae(i,"description"):l.description,d=ae(i,"type")??l.type;if(!$i.includes(d))return j(n,`invalid type: must be one of ${$i.join("|")}`,400);try{a.write({type:d,name:o,description:u,body:c})}catch(m){return j(n,m.message,400)}let f=a.read(o);return f===null?j(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 j(n,"project not found",404);let o=ut(s,r),i;try{i=o.delete(n.req.param("chapter"))}catch(a){return j(n,a.message,400)}return i?n.json({removed:!0}):j(n,"chapter not found",404)}),t.get("/api/projects/:name/ai-test",n=>{let s=r.findProjectByName(n.req.param("name"));return s===null?j(n,"project not found",404):n.json(vA(s.local_path))}),t.post("/api/projects/:name/ai-test",async n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return j(n,"project not found",404);let o=await dt(n);if(typeof o=="string")return j(n,o,400);let i=ae(o,"name"),a=ae(o,"body"),l=ae(o,"type");if(i===null||i.length===0)return j(n,"missing or empty name",400);if(a===null)return j(n,"missing body",400);if(l===null||!ji.has(l))return j(n,`invalid type: must be one of ${[...ji].join("|")}`,400);try{et(i)}catch(f){return j(n,f.message,400)}let c=ls(s.local_path),u=us(c,`${i}.md`);if(Ai(u))return j(n,`chapter already exists: ${i}`,409);yA(c,{recursive:!0}),$_(u,i,l,ae(o,"description"),a);let d=cs(c,i);return d===null?j(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 j(n,"project not found",404);try{et(n.req.param("chapter"))}catch(i){return j(n,i.message,400)}let o=cs(ls(s.local_path),n.req.param("chapter"));return o===null?j(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 j(n,"project not found",404);let o=n.req.param("chapter");try{et(o)}catch(m){return j(n,m.message,400)}let i=ls(s.local_path),a=cs(i,o);if(a===null)return j(n,"chapter not found",404);let l=await dt(n);if(typeof l=="string")return j(n,l,400);let c=ae(l,"body")??a.body,u=Object.prototype.hasOwnProperty.call(l,"description")?ae(l,"description"):a.description,d=ae(l,"type")??a.type;if(!ji.has(d))return j(n,`invalid type: must be one of ${[...ji].join("|")}`,400);$_(us(i,`${o}.md`),o,d,u,c);let f=cs(i,o);return f===null?j(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 j(n,"project not found",404);let o=n.req.param("chapter");try{et(o)}catch(a){return j(n,a.message,400)}let i=us(ls(s.local_path),`${o}.md`);return Ai(i)?(SA(i),n.json({removed:!0})):j(n,"chapter not found",404)}),t.get("/api/tokens",n=>n.json([])),t.post("/api/tokens",n=>j(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 dt(n);return typeof s=="string"?j(n,s,400):n.json({accepted:s,note:"settings persistence not yet implemented"})}),t.get("/api/chat/sessions",n=>n.json(r.listChatbotSessions(x_))),t.post("/api/chat/sessions",async n=>{let s=await kA(n);if(typeof s=="string")return j(n,s,400);let o=s!==null?ae(s,"title"):null,i=r.createChatbotSession(x_,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?j(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 j(n,"chat session not found",404);let o=await dt(n);if(typeof o=="string")return j(n,o,400);let i=ae(o,"role"),a=ae(o,"content");if(i===null||i!=="user"&&i!=="assistant"&&i!=="tool")return j(n,"role must be one of user|assistant|tool",400);if(a===null)return j(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 j(n,"invalid run id",400);if(r.getRun(s)===null)return j(n,"run not found",404);let i=Ir(r,s),a=[];for(let c of i){let u=NA(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=j_(c.path),m=f.buffer.slice(f.byteOffset,f.byteOffset+f.byteLength);d=new Uint8Array(m)}catch{d=new Uint8Array(0)}d!==null&&a.push({name:u,data:d})}let l=I_(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 j(t,e,r){return t.json({error:e},r)}async function dt(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 kA(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 ae(t,e){let r=t[e];return typeof r!="string"?null:r}function ls(t){return us(t,"ai-test")}function cs(t,e){let r=us(t,`${e}.md`);if(!Ai(r))return null;let n=j_(r,"utf8"),s=IA(n),o=bA(r).mtime.toISOString();return{name:e,type:s.type,description:s.description,body:s.body,updated_at:o}}function vA(t){let e=ls(t);return Ai(e)?EA(e).filter(r=>r.endsWith(".md")&&r!=="index.md").map(r=>r.slice(0,-3)).sort().map(r=>{let n=cs(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 $_(t,e,r,n,s){let o=n!==null&&n.length>0?`
|
|
1448
1448
|
description: ${n}`:"",i=`---
|
|
1449
1449
|
name: ${e}${o}
|
|
1450
1450
|
type: ${r}
|
|
@@ -1514,23 +1514,23 @@ ${s}`;TA(t,i,"utf8")}function IA(t){let e=t.match(/^---\r?\n([\s\S]*?)\r?\n---\r
|
|
|
1514
1514
|
JOIN step s ON s.id = sa.step_id
|
|
1515
1515
|
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
|
|
1516
1516
|
JOIN step s ON s.id = sa.step_id
|
|
1517
|
-
WHERE s.run_id = ? ORDER BY sa.id ASC`,t),l=new Map;for(let
|
|
1518
|
-
WHERE project_id = ? AND detected_at >= ? AND detected_at <= ? ORDER BY detected_at ASC`,E,g,_):[],
|
|
1519
|
-
FROM session_size WHERE observed_at >= ? AND observed_at <= ?`,n.started_at,n.ended_at??new Date().toISOString())[0],
|
|
1517
|
+
WHERE s.run_id = ? ORDER BY sa.id ASC`,t),l=new Map;for(let R of a){let U=l.get(R.step_id)??[];U.push({kind:R.kind,id:R.id}),l.set(R.step_id,U)}let c=i.map(R=>({id:R.id,state_name:R.state_name,outcome:R.outcome,duration_ms:R.started_at!==null&&R.ended_at!==null?Math.max(0,new Date(R.ended_at).getTime()-new Date(R.started_at).getTime()):null,artifacts:l.get(R.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 R of d)try{let U=JSON.parse(R.payload);typeof U.elapsedMs=="number"&&U.elapsedMs>0&&(f+=U.elapsedMs)}catch{}let m=u.map(R=>({kind:R.kind,count:R.count,total_elapsed_ms:R.kind==="tool_result"?f:0})),p=c.filter(R=>R.outcome==="request_changes"),h=[...new Set(p.map(R=>R.state_name))],g=new Date(n.started_at).getTime(),_=n.ended_at!==null?new Date(n.ended_at).getTime():Date.now(),E=e.query("SELECT project_id FROM job WHERE id = ?",n.job_id)[0]?.project_id??null,k=E!==null?e.query(`SELECT id, signal_kind, severity, description, detected_at FROM drift_signal
|
|
1518
|
+
WHERE project_id = ? AND detected_at >= ? AND detected_at <= ? ORDER BY detected_at ASC`,E,g,_):[],N=e.query(`SELECT SUM(input_tokens) AS input, SUM(output_tokens) AS output
|
|
1519
|
+
FROM session_size WHERE observed_at >= ? AND observed_at <= ?`,n.started_at,n.ended_at??new Date().toISOString())[0],A=N?.input!==null&&N?.input!==void 0?`input: ${N.input}, output: ${N.output??0}`:"n/a",D=e.getWorkflow(n.workflow_id),C=n.started_at!==null&&n.ended_at!==null?Math.max(0,new Date(n.ended_at).getTime()-new Date(n.started_at).getTime()):null,H={run_id:t,workflow_name:D?.name??null,started_at:n.started_at,ended_at:n.ended_at,terminal_state:n.terminal_state,duration_ms:C,steps:c,tool_stats:m,reviewer_interventions:{count:p.length,state_names:h},drift_signals:k,token_totals:A};e.insertStepArtifact({step_id:o,kind:"run_report",content:JSON.stringify(H)})}var L_=b(()=>{"use strict"});import{spawnSync as M_}from"node:child_process";function pu(t){return jA[t]??`no install hint; ensure '${t}' is on PATH`}function AA(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 C_(t){return M_("which",[t],{encoding:"utf8"}).status===0}function D_(t){if(t===void 0)return null;for(let e of t.tools??[])if(!C_(e)){let r=pu(e);return{kind:"missing_tool",tool:e,install_hint:r,message:`missing dependency: ${e}; ${r}`}}for(let e of t.auth??[]){if(!C_(e)){let s=pu(e);return{kind:"missing_tool",tool:e,install_hint:s,message:`missing dependency: ${e}; ${s}`}}let r=AA(e);if(r===null)continue;let n=M_(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:pu(e),message:`${e} not authenticated; run \`${e} login\` or equivalent`,detail:s.length>0?s:void 0}}}return null}var jA,P_=b(()=>{"use strict";jA={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 RA,readdirSync as OA,readFileSync as LA}from"node:fs";import{join as F_}from"node:path";function CA(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(`
|
|
1520
1520
|
`).map(o=>o.replace(/^\s*-\s+/,"").trim()).filter(Boolean):[]}function U_(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 W_(t,e){if(e.length===0)return null;let r=F_(t,"durable-memory");if(!RA(r))return null;let n;try{n=OA(r).filter(o=>o.endsWith(".md")&&o!=="index.md")}catch{return null}let s=[];for(let o of n)try{let i=LA(F_(r,o),"utf8");if(CA(i).some(l=>e.includes(l))){let l=U_(i,"name")??o.replace(".md",""),c=U_(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 B_=b(()=>{"use strict"});function gu(t){let e=t.trim().replace(MA,"").trim();for(let r=0;r<4;r+=1){let n=DA.exec(e);if(n===null)break;e=n[2].trim()}return e}function q_(t){let e=t.trim(),r=PA.exec(e);if(r!==null)return r[2];let n=FA.exec(e);return n!==null?n[0]:null}function ds(t,e){let r=t.split(`
|
|
1521
1521
|
`),n=null,s=-1;for(let i=0;i<r.length;i+=1){let a=gu(r[i]),l=hu.exec(a);if(l===null)continue;let c=l[1].trim();if(_u.test(c))continue;let u=q_(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=gu(r[i]),l=hu.exec(a);if(l===null)break;let c=_u.exec(l[1].trim());if(c===null)break;o[c[1]]=c[2].trim()}return{outcome:n,evidence:o}}function H_(t){let e=t.split(`
|
|
1522
|
-
`),r=null;for(let n=0;n<e.length;n+=1){let s=gu(e[n]),o=hu.exec(s);if(o===null)continue;let i=o[1].trim();if(_u.test(i))continue;let a=q_(i);if(a===null||!Ur(a))continue;let c=i.slice(i.indexOf(a)+a.length).replace(/^[`*_:\s\-–—]+/,"").trim();r={token:a,reason:c}}return r}var MA,DA,hu,_u,PA,FA,wu=b(()=>{"use strict";Pn();MA=/^#{1,6}\s+/,DA=/^(```|\*\*|__|`|\*|_)([\s\S]+?)\1$/,hu=/^STANCE:\s+(.+)$/,_u=/^([A-Z][A-Z0-9_]*):\s*(.+)$/,PA=/^(```|\*\*|__|`|\*|_)([A-Za-z0-9_-]+)\1/,FA=/^[A-Za-z0-9_-]+/});function J_(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 X_=b(()=>{"use strict"});import{readFileSync as UA}from"node:fs";import{dirname as WA,join as BA}from"node:path";import{fileURLToPath as qA}from"node:url";function XA(t){return t.rules.map(e=>({command:e.command,subcommands:e.argv_patterns.map(r=>r.trim().split(/\s+/)),kind:e.kind}))}function YA(t){let e=[],r=[];for(let n of t)HA.has(n)?(r.length>0&&e.push(r),r=[]):r.push(n);return r.length>0&&e.push(r),e}function zA(t,e){if(t.length===0)return{matched:!1};let r=0;for(;r<t.length&&JA.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 ZA(t,e){if(t.length===0)return{matched:!1};let r=YA(t);for(let n of r){let s=zA(n,e);if(s.matched)return s}return{matched:!1}}function yu(t){return ZA(t,KA)}function QA(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 Eu(t){return QA(t).split(" ").filter(e=>e.length>0)}var HA,JA,GA,VA,KA,G_=b(()=>{"use strict";HA=new Set(["&&","||",";","|",">",">>","<","<<"]),JA=/^[A-Za-z_][A-Za-z0-9_]*=/;GA=WA(qA(import.meta.url)),VA=JSON.parse(UA(BA(GA,"side_effect_classifier.json"),"utf-8")),KA=XA(VA)});function Ri(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 V_(t,e){try{return await $r(bu(t)??t,Ri(e))===!0}catch{return!1}}async function Oi(t,e){try{return await $r(bu(t)??t,Ri(e))}catch{return}}async function K_(t,e){if(typeof t!="string")return t;let r=bu(t);if(r===null)return t;try{return await $r(r,Ri(e))}catch{return}}async function Y_(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+=eR(await $r(a,Ri(e)))}catch{n+=""}s=i+o[0].length}return n+=t.slice(s),n}function bu(t){let e=t.trim();return!e.startsWith("={{")||!e.endsWith("}}")?null:e.slice(3,-2).trim()}function eR(t){return t==null?"":typeof t=="string"?t:JSON.stringify(t)}var fs=b(()=>{"use strict";an()});import{existsSync as z_,readdirSync as Z_,readFileSync as tR,statSync as Q_}from"node:fs";import{join as Ci}from"node:path";function eg(t,e,r,n){return Object.assign(t,{stateId:e,state:r,displayName:n})}function
|
|
1523
|
-
\u2026[truncated ${t.length-8e3} chars]`:t}function Y(t,e,r,n){t.outcomes[e]=n,r!==e&&(t.outcomes[r]=n)}function ee(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 tg(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=ir(t.job.payload)?.[n];if(Array.isArray(o)&&o.every(i=>typeof i=="string"))return o}return null}async function Xe(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=ir(e.job.payload);return i===null?"":JSON.stringify(i)}if(o.startsWith("job_payload.")){let i=o.slice(12),l=ir(e.job.payload)?.[i];return l==null?"":String(l)}if(o.startsWith("outcomes.")){let i=nR(e.outcomes,o.slice(9));return i==null?"":typeof i=="string"?i:JSON.stringify(i)}return""});return Y_(n,e)}function nR(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 ir(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 ps(t){let{context:e,stateId:r,member:n,prompt:s,stepId:o,timeoutMs:i,writesToProjectPath:a}=t,l=J_(e.dal,e.run_id,()=>o),c=Su(e,r),u={violation:null},d=T=>{if(l(T),u.violation===null&&T.kind==="tool_use"&&T.tool==="Bash"&&T.summary){let E=Eu(T.summary),
|
|
1522
|
+
`),r=null;for(let n=0;n<e.length;n+=1){let s=gu(e[n]),o=hu.exec(s);if(o===null)continue;let i=o[1].trim();if(_u.test(i))continue;let a=q_(i);if(a===null||!Ur(a))continue;let c=i.slice(i.indexOf(a)+a.length).replace(/^[`*_:\s\-–—]+/,"").trim();r={token:a,reason:c}}return r}var MA,DA,hu,_u,PA,FA,wu=b(()=>{"use strict";Pn();MA=/^#{1,6}\s+/,DA=/^(```|\*\*|__|`|\*|_)([\s\S]+?)\1$/,hu=/^STANCE:\s+(.+)$/,_u=/^([A-Z][A-Z0-9_]*):\s*(.+)$/,PA=/^(```|\*\*|__|`|\*|_)([A-Za-z0-9_-]+)\1/,FA=/^[A-Za-z0-9_-]+/});function J_(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 X_=b(()=>{"use strict"});import{readFileSync as UA}from"node:fs";import{dirname as WA,join as BA}from"node:path";import{fileURLToPath as qA}from"node:url";function XA(t){return t.rules.map(e=>({command:e.command,subcommands:e.argv_patterns.map(r=>r.trim().split(/\s+/)),kind:e.kind}))}function YA(t){let e=[],r=[];for(let n of t)HA.has(n)?(r.length>0&&e.push(r),r=[]):r.push(n);return r.length>0&&e.push(r),e}function zA(t,e){if(t.length===0)return{matched:!1};let r=0;for(;r<t.length&&JA.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 ZA(t,e){if(t.length===0)return{matched:!1};let r=YA(t);for(let n of r){let s=zA(n,e);if(s.matched)return s}return{matched:!1}}function yu(t){return ZA(t,KA)}function QA(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 Eu(t){return QA(t).split(" ").filter(e=>e.length>0)}var HA,JA,GA,VA,KA,G_=b(()=>{"use strict";HA=new Set(["&&","||",";","|",">",">>","<","<<"]),JA=/^[A-Za-z_][A-Za-z0-9_]*=/;GA=WA(qA(import.meta.url)),VA=JSON.parse(UA(BA(GA,"side_effect_classifier.json"),"utf-8")),KA=XA(VA)});function Ri(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 V_(t,e){try{return await $r(bu(t)??t,Ri(e))===!0}catch{return!1}}async function Oi(t,e){try{return await $r(bu(t)??t,Ri(e))}catch{return}}async function K_(t,e){if(typeof t!="string")return t;let r=bu(t);if(r===null)return t;try{return await $r(r,Ri(e))}catch{return}}async function Y_(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+=eR(await $r(a,Ri(e)))}catch{n+=""}s=i+o[0].length}return n+=t.slice(s),n}function bu(t){let e=t.trim();return!e.startsWith("={{")||!e.endsWith("}}")?null:e.slice(3,-2).trim()}function eR(t){return t==null?"":typeof t=="string"?t:JSON.stringify(t)}var fs=b(()=>{"use strict";an()});import{existsSync as z_,readdirSync as Z_,readFileSync as tR,statSync as Q_}from"node:fs";import{join as Ci}from"node:path";function eg(t,e,r,n){return Object.assign(t,{stateId:e,state:r,displayName:n})}function X(t,e){return t.dal.insertStep({...e,parent_step_id:t.parent_step_id})}function K(t,e){return e.startsWith("@terminal:")?{kind:"terminal",terminal:e.slice(10)}:t.states[e]===void 0?{kind:"escalate",token:e,reason:`unknown state ref '${e}'`}:{kind:"state",state:e}}function tt(t,e,r,n,s={}){let o=P(),i=X(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,`${ms}${e.id}`,o);let a=t.dal.getRun(t.run_id),l=Ur(r)?"generic":"unhandled";return t.dal.raiseAttention({kind:Qs,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:rR(s.agent_output??n),paused_at:o,created_at:o})}),t.dal.pauseJob(t.job.id),{kind:"paused"}}function rR(t){return t.length>8e3?`${t.slice(0,8e3)}
|
|
1523
|
+
\u2026[truncated ${t.length-8e3} chars]`:t}function Y(t,e,r,n){t.outcomes[e]=n,r!==e&&(t.outcomes[r]=n)}function ee(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 tg(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=ir(t.job.payload)?.[n];if(Array.isArray(o)&&o.every(i=>typeof i=="string"))return o}return null}async function Xe(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=ir(e.job.payload);return i===null?"":JSON.stringify(i)}if(o.startsWith("job_payload.")){let i=o.slice(12),l=ir(e.job.payload)?.[i];return l==null?"":String(l)}if(o.startsWith("outcomes.")){let i=nR(e.outcomes,o.slice(9));return i==null?"":typeof i=="string"?i:JSON.stringify(i)}return""});return Y_(n,e)}function nR(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 ir(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 ps(t){let{context:e,stateId:r,member:n,prompt:s,stepId:o,timeoutMs:i,writesToProjectPath:a}=t,l=J_(e.dal,e.run_id,()=>o),c=Su(e,r),u={violation:null},d=T=>{if(l(T),u.violation===null&&T.kind==="tool_use"&&T.tool==="Bash"&&T.summary){let E=Eu(T.summary),k=yu(E);k.matched&&!c&&(u.violation={summary:T.summary,kind:k.kind})}},f=new Date(Date.now()-1),m=0,p=0,h=T=>{d(T),sR(T,(E,k)=>{m+=E,p+=k})},g=await Vr({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:Ie(n),model:n.model??"unknown",tokens_in:m,tokens_out:p,wall_time_ms:g.ms})}),oR(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&&Tu(e.project.local_path,f)?{kind:"g2_violation"}:{kind:"ok",text:g.text,ms:g.ms,argv:g.argv}}function sR(t,e){let r=t.raw;if(r==null)return;let s=r.message?.usage;if(s!==void 0){let i=Li(s.input_tokens),a=Li(s.output_tokens);(i>0||a>0)&&e(i,a);return}let o=r.usage;if(o!==void 0){let i=Li(o.input_tokens),a=Li(o.output_tokens);(i>0||a>0)&&e(i,a)}}function Li(t){return typeof t=="number"&&Number.isFinite(t)&&t>=0?t:0}async function Dt(t,e,r,n){if(r.sessionid===null)return;let s=`${e}:write_back`,o=X(t,{run_id:t.run_id,state_name:s});t.steps_executed+=1;let a=`This state completed successfully.${typeof n=="string"?` Category hint: "${n}".`:""} Did you learn anything worth preserving in durable-memory? If yes, use Write to create/update an entry under <project>/durable-memory/<descriptive-name>.md. Include YAML frontmatter (name/description/type[/tags]). Be brief \u2014 one entry per insight. If you didn't learn anything new, respond with \`STANCE: no_writeback\` and the engine moves on.`;try{let l=await ps({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 pn(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=X(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(tm(s)),l!=null&&l.length>0&&d.push(l);let f=r.prompt_template!==void 0?await Xe(r.prompt_template,t,e):"";f.length>0&&d.push(f),n!==null&&n.length>0&&d.push(n);let m=d.join(`
|
|
1524
1524
|
|
|
1525
1525
|
`);try{let p=await ps({context:t,stateId:e,member:c,prompt:m,stepId:u.id,timeoutMs:i,writesToProjectPath:a});if(p.kind==="g3_violation"||p.kind==="g2_violation"){let g=p.kind==="g3_violation"?`policy_violation:side_effect_without_pause:${p.violationKind}`:"policy_violation:writes_to_project_path";return t.dal.insertSessionEvent({run_id:t.run_id,step_id:u.id,kind:"policy_violation",timestamp_ms:Date.now(),payload:JSON.stringify(p.kind==="g3_violation"?{violation:"side_effect_without_pause",state_id:e,kind:p.violationKind,command_summary:p.summary,message:`State ${e} ran a classified side-effect command (${p.violationKind}) without a preceding approved Pause`}:{violation:"writes_to_project_path",state_id:e,message:`State ${e} wrote to project.local_path without writes_to_project_path: true`})}),t.dal.finishStep(u.id,null,g),{outcome:null,text:"",status_detail:g}}if(t.dal.insertStepArtifact({step_id:u.id,kind:`${e}_transcript`,content:p.text}),t.transcripts[e]=p.text,!o)return t.dal.finishStep(u.id,"done",`chat_ms=${p.ms}`),t.outcomes[e]="done",{outcome:"done",text:p.text,status_detail:`chat_ms=${p.ms}`};let h=ds(p.text,s);return t.dal.finishStep(u.id,h.outcome,h.outcome!==null?`chat_ms=${p.ms}`:h.reason),h.outcome!==null&&(t.outcomes[e]=h.outcome),{outcome:h.outcome,text:p.text,status_detail:h.outcome!==null?`chat_ms=${p.ms}`:h.reason}}catch(p){let h=p instanceof Ee?`chat_${p.kind}`:"chat_other";return t.dal.finishStep(u.id,null,h),{outcome:null,text:"",status_detail:h}}}function hn(t,e){return(e?.length??0)>0?W_(t.project.local_path,e):null}function rg(t){return yu(Eu(t))}function Su(t,e){let r=t.dal.query(`SELECT state_name, outcome FROM step
|
|
1526
1526
|
WHERE run_id = ? AND state_name != ? AND ended_at IS NOT NULL
|
|
1527
1527
|
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 Tu(t,e){if(!z_(t))return!1;let r=Ci(t,"durable-memory");function n(s){let o;try{o=Z_(s,{withFileTypes:!0})}catch{return!1}for(let i of o){if(i.name===".git")continue;let a=Ci(s,i.name);if(a!==r)if(i.isDirectory()){if(n(a))return!0}else try{if(Q_(a).mtime>e)return!0}catch{}}return!1}return n(t)}function oR(t,e,r){let n=Ci(t.local_path,"durable-memory");if(!z_(n))return;let s;try{s=Z_(n)}catch{return}for(let o of s){if(!o.endsWith(".md")||o==="MEMORY.md")continue;let i=Ci(n,o),a;try{a=Q_(i).mtime}catch{continue}if(a<=r)continue;let l;try{l=tR(i,"utf8")}catch{continue}let c=aR(l);if(c===null){process.stderr.write(`[durable-memory-sync] warning: ${o} has no valid frontmatter, skipping
|
|
1528
|
-
`);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 aR(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||!iR.has(l)?null:{name:a,type:l,description:i?.[1]?.trim()??null,body:n}}var ms,iR,We=b(()=>{"use strict";Pe();ln();Gn();B_();wu();Pn();X_();G_();fs();ms="__paused__:";iR=new Set(["user","feedback","project","reference"])});import{spawnSync as ng}from"node:child_process";function lR(t,e){let r=t.stateId,n=t.displayName,s=
|
|
1528
|
+
`);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 aR(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||!iR.has(l)?null:{name:a,type:l,description:i?.[1]?.trim()??null,body:n}}var ms,iR,We=b(()=>{"use strict";Pe();ln();Gn();B_();wu();Pn();X_();G_();fs();ms="__paused__:";iR=new Set(["user","feedback","project","reference"])});import{spawnSync as ng}from"node:child_process";function lR(t,e){let r=t.stateId,n=t.displayName,s=X(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1;let o=t.project.local_path,i=ng("git",["diff","--quiet"],{cwd:o}).status!==0,a=ng("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),Y(t,r,n,Jc),{kind:"terminal",terminal:ee(t.workflow)}}return t.dal.finishStep(s.id,"clean","repo_clean"),Y(t,r,n,"clean"),K(t.workflow,e.next)}var sg,og=b(()=>{"use strict";We();sg={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=>lR(t,t.state)}});async function cR(t,e){let r=t.stateId,n=t.displayName,s=X(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1;for(let o of e.branches)if(await V_(o.when,t))return t.dal.finishStep(s.id,"matched",o.when),Y(t,r,n,"matched"),K(t.workflow,o.next);return t.dal.finishStep(s.id,"no_match","choice_no_match"),Y(t,r,n,"no_match"),e.default_next!==void 0?K(t.workflow,e.default_next):{kind:"terminal",terminal:t.workflow.terminals.no_match?"no_match":ee(t.workflow)}}var ig,ag=b(()=>{"use strict";We();fs();ig={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=>cR(t,t.state)}});async function uR(t,e){let r=t.stateId,n=t.displayName,s=t.workflow.default_task_timeout_ms,o=e.researchers??[],i=hn(t,e.durable_memory_tags),a=new Array(o.length).fill(null);await Promise.all(o.map(async(m,p)=>{let h=`${n}:researcher_${m.alias}[${p}]`,g=await pn(t,h,m,`TOPIC: ${m.topic}`,[],!1,s,!1,i);g.text.length>0&&(a[p]=g.text)}));let l=a.map((m,p)=>m!==null?`# Research ${p+1}: ${o[p]?.topic??""}
|
|
1529
1529
|
${m}`:null).filter(m=>m!==null).join(`
|
|
1530
1530
|
|
|
1531
|
-
`),c=`${n}:consolidator`,u=await pn(t,c,e.consolidator,l.length>0?l:null,["ok","error"],!0,s,!1,i),d=
|
|
1531
|
+
`),c=`${n}:consolidator`,u=await pn(t,c,e.consolidator,l.length>0?l:null,["ok","error"],!0,s,!1,i),d=X(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"&&Y(t,r,n,"error");let m=e.outcomes.error;return m!==void 0?K(t.workflow,m):{kind:"terminal",terminal:ee(t.workflow)}}let f=e.research_artifact_prefix??n;if(t.dal.insertStepArtifact({step_id:d.id,kind:`${f}_consolidated`,content:u.text}),t.dal.finishStep(d.id,"ok","consolidated"),Y(t,r,n,"ok"),e.write_back_durable_memory){let m=t.membersByAlias.get(e.consolidator.alias);m!==void 0&&await Dt(t,n,m,e.write_back_durable_memory)}return K(t.workflow,e.outcomes.ok)}var lg,cg=b(()=>{"use strict";We();lg={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=>uR(t,t.state)}});async function dR(t,e){let r=t.stateId,n=t.displayName,s=X(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1;let o=t.progress_step_id;t.progress_step_id=s.id;try{let i=await Oi(e.items_from,t),a=hR(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?K(t.workflow,f):{kind:"terminal",terminal:ee(t.workflow)}}let l={routed:null},c=e.mode==="parallel"?await mR(t,e,s.id,a,l):await fR(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})),Y(t,r,n,d),u){let f=e.outcomes.any_failed;return f!==void 0?K(t.workflow,f):{kind:"terminal",terminal:ee(t.workflow)}}return K(t.workflow,e.outcomes.all_ok)}finally{t.progress_step_id=o}}async function fR(t,e,r,n,s){let o=[];for(let i=0;i<n.length;i+=1){let a=await dg(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 mR(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 dg(t,e,r,n[l],l,s)}});return await Promise.all(a),o}async function dg(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__":pR(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 pR(t){return t==null?null:typeof t=="string"?t:JSON.stringify(t)}function hR(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 ug,fg=b(()=>{"use strict";We();fs();ug={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=>dR(t,t.state)}});async function _R(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=X(t,{run_id:t.run_id,state_name:n});return t.steps_executed+=1,t.dal.finishStep(f.id,null,`missing_agent:${e.agent.alias}`),{kind:"terminal",terminal:ee(t.workflow)}}let i=hn(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 Dt(t,n,o,e.write_back_durable_memory),K(t.workflow,e.outcomes.done);if(a.status==="waiting_agent"){if(a.turn_count>=e.termination.max_turns){t.dal.finishStep(a.step_id,"timeout",`max_turns=${e.termination.max_turns}`),Y(t,r,n,"timeout");let m=e.outcomes.timeout;return m!==void 0?K(t.workflow,m):{kind:"terminal",terminal:ee(t.workflow)}}let f=a.last_operator_input??"";try{let m=await ps({context:t,stateId:n,member:o,prompt:f,stepId:a.step_id,timeoutMs:s,writesToProjectPath:!1});if(m.kind==="g3_violation"||m.kind==="g2_violation"){let p=m.kind==="g3_violation"?`policy_violation:side_effect_without_pause:${m.violationKind}`:"policy_violation:writes_to_project_path";return t.dal.insertSessionEvent({run_id:t.run_id,step_id:a.step_id,kind:"policy_violation",timestamp_ms:Date.now(),payload:JSON.stringify(m.kind==="g3_violation"?{violation:"side_effect_without_pause",state_id:n,kind:m.violationKind,command_summary:m.summary,message:`State ${n} ran a classified side-effect command (${m.violationKind}) without a preceding approved gate`}:{violation:"writes_to_project_path",state_id:n,message:`State ${n} wrote to project.local_path without writes_to_project_path: true`})}),t.dal.finishStep(a.step_id,null,p),{kind:"terminal",terminal:ee(t.workflow)}}return t.dal.setInteractiveAgentOutput(a.id,m.text,"waiting_operator"),e.termination.agent_signal!==void 0&&m.text.includes(e.termination.agent_signal)?(e.artifact_name!==void 0&&t.dal.insertStepArtifact({step_id:a.step_id,kind:e.artifact_name,content:m.text}),t.dal.finishStep(a.step_id,"done","agent_signal"),Y(t,r,n,"done"),e.write_back_durable_memory&&await Dt(t,n,o,e.write_back_durable_memory),K(t.workflow,e.outcomes.done)):(mg({context:t,state:e,stateId:r,displayName:n,stepId:a.step_id,agentText:m.text}),{kind:"paused"})}catch(m){let p=m instanceof Ee?`chat_${m.kind}`:"chat_other";return t.dal.finishStep(a.step_id,null,p),{kind:"terminal",terminal:ee(t.workflow)}}}return{kind:"paused"}}let l=X(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 Xe(e.agent.initial_prompt_template,t,n),d=i?`${i}
|
|
1532
1532
|
|
|
1533
|
-
${u}`:u;try{let f=await ps({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 m=f.kind==="g3_violation"?`policy_violation:side_effect_without_pause:${f.violationKind}`:"policy_violation:writes_to_project_path";return t.dal.insertSessionEvent({run_id:t.run_id,step_id:l.id,kind:"policy_violation",timestamp_ms:Date.now(),payload:JSON.stringify(f.kind==="g3_violation"?{violation:"side_effect_without_pause",state_id:n,kind:f.violationKind,command_summary:f.summary,message:`State ${n} ran a classified side-effect command (${f.violationKind}) without a preceding approved gate`}:{violation:"writes_to_project_path",state_id:n,message:`State ${n} wrote to project.local_path without writes_to_project_path: true`})}),t.dal.finishStep(l.id,null,m),{kind:"terminal",terminal:ee(t.workflow)}}return t.dal.setInteractiveAgentOutput(c.id,f.text,"waiting_operator"),e.artifact_name!==void 0&&t.dal.insertStepArtifact({step_id:l.id,kind:e.artifact_name,content:f.text}),e.termination.agent_signal!==void 0&&f.text.includes(e.termination.agent_signal)?(t.dal.finishStep(l.id,"done","agent_signal"),t.outcomes[n]="done",e.write_back_durable_memory&&await Dt(t,n,o,e.write_back_durable_memory),K(t.workflow,e.outcomes.done)):(mg({context:t,state:e,stateId:r,displayName:n,stepId:l.id,agentText:f.text}),{kind:"paused"})}catch(f){let m=f instanceof Ee?`chat_${f.kind}`:"chat_other";return t.dal.finishStep(l.id,null,m),{kind:"terminal",terminal:ee(t.workflow)}}}function mg(t){let{context:e,state:r,stateId:n,displayName:s,stepId:o,agentText:i}=t,a=
|
|
1533
|
+
${u}`:u;try{let f=await ps({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 m=f.kind==="g3_violation"?`policy_violation:side_effect_without_pause:${f.violationKind}`:"policy_violation:writes_to_project_path";return t.dal.insertSessionEvent({run_id:t.run_id,step_id:l.id,kind:"policy_violation",timestamp_ms:Date.now(),payload:JSON.stringify(f.kind==="g3_violation"?{violation:"side_effect_without_pause",state_id:n,kind:f.violationKind,command_summary:f.summary,message:`State ${n} ran a classified side-effect command (${f.violationKind}) without a preceding approved gate`}:{violation:"writes_to_project_path",state_id:n,message:`State ${n} wrote to project.local_path without writes_to_project_path: true`})}),t.dal.finishStep(l.id,null,m),{kind:"terminal",terminal:ee(t.workflow)}}return t.dal.setInteractiveAgentOutput(c.id,f.text,"waiting_operator"),e.artifact_name!==void 0&&t.dal.insertStepArtifact({step_id:l.id,kind:e.artifact_name,content:f.text}),e.termination.agent_signal!==void 0&&f.text.includes(e.termination.agent_signal)?(t.dal.finishStep(l.id,"done","agent_signal"),t.outcomes[n]="done",e.write_back_durable_memory&&await Dt(t,n,o,e.write_back_durable_memory),K(t.workflow,e.outcomes.done)):(mg({context:t,state:e,stateId:r,displayName:n,stepId:l.id,agentText:f.text}),{kind:"paused"})}catch(f){let m=f instanceof Ee?`chat_${f.kind}`:"chat_other";return t.dal.finishStep(l.id,null,m),{kind:"terminal",terminal:ee(t.workflow)}}}function mg(t){let{context:e,state:r,stateId:n,displayName:s,stepId:o,agentText:i}=t,a=P();e.dal.setRunPausedState(e.run_id,`${ms}${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(gR({context:e,stateId:s,state:r,stepId:o,agentText:i,pausedAt:a}))}),e.dal.pauseJob(e.job.id)}function gR(t){let{context:e,stateId:r,state:n,stepId:s,agentText:o,pausedAt:i}=t,a=e.dal.getRun(e.run_id),l=wR(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:yR(o,3),paused_at:i,created_run_inputs:ir(e.job.payload)}}function wR(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 yR(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 pg,hg=b(()=>{"use strict";Gn();We();pg={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=>_R(t,t.state)}});async function ER(t,e){let r=t.stateId,n=t.displayName,s=tg(t,e.over);if(s===null){let d=X(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?K(t.workflow,f):{kind:"terminal",terminal:ee(t.workflow)}}let o=t.workflow.states[e.body];if(o===void 0){let d=X(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:ee(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],m=`${n}[${d}]`,p=t.iteration;t.iteration={item:f,index:d};let h;try{h=await t.dispatchState(m,o,{iteration:{item:f,index:d}})}finally{t.iteration=p}if(h.kind==="paused"||h.kind==="escalate")return h;let g=bR(t.outcomes[m]);if(a.push({index:d,value:f,outcome:g}),g===null&&e.stop_on_error){l=!0;break}}let c=X(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})),Y(t,r,n,u),l){let d=e.outcomes.error;return d!==void 0?K(t.workflow,d):{kind:"terminal",terminal:ee(t.workflow)}}return K(t.workflow,e.outcomes.ok)}function bR(t){return t==null?null:typeof t=="string"?t:JSON.stringify(t)}var _g,gg=b(()=>{"use strict";We();_g={description:{displayName:"Loop",name:"loop",namespace:"lmctl",group:["flow-control"],version:[1],inputs:[{name:"main"}],outputs:[{name:"main"}],properties:[],builtin:!0},execute:async t=>ER(t,t.state)}});import{createHash as SR}from"node:crypto";import{existsSync as TR,mkdirSync as kR,readFileSync as vR,writeFileSync as IR}from"node:fs";import{dirname as NR,isAbsolute as yg,normalize as xR,resolve as hs}from"node:path";import{Document as $R,ExternalHyperlink as jR,HeadingLevel as _n,LevelFormat as AR,Packer as RR,Paragraph as ft,Table as OR,TableCell as LR,TableRow as CR,TextRun as mt,WidthType as MR}from"docx";import{marked as DR}from"marked";async function PR(t,e){let r=t.stateId,n=t.displayName,s=X(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1;try{let o=await FR(t,e,n),i=await UR(t,e),a=await WR(t,e.title),l=await XR(o,a??t.workflow.name);if(l.length===0)throw new Error("rendered DOCX buffer was empty");return kR(NR(i),{recursive:!0}),IR(i,l),t.dal.insertStepArtifact({step_id:s.id,kind:"render_docx",path:i,sha:SR("sha256").update(l).digest("hex"),provider_call_mode:"library"}),t.dal.finishStep(s.id,"done",`wrote:${i}`),Y(t,r,n,{output_path:i,path:i,bytes:l.length}),K(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),Y(t,r,n,{error:i}),K(t.workflow,e.outcomes?.error??"@terminal:error")}}async function FR(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 Xe(e.markdown_source,t,r)).trim(),o=(n.length===0?JR(t,e.markdown_source):null)??n;if(o.length===0)throw new Error("markdown_source resolved empty");let i=qR(t.project.local_path,o);if(i!==null){if(!TR(i))throw new Error(`markdown_source file not found: ${i}`);return Mi(vR(i,"utf8"))}return Mi(o)}async function UR(t,e){if(typeof e.output_path!="string"||e.output_path.trim().length===0)throw new Error("output_path is required");let r=(await Xe(e.output_path,t,t.stateId)).trim();if(r.length===0)throw new Error("output_path resolved empty");let n=BR(t.project.local_path,r);if(!n.endsWith(".docx"))throw new Error(`output_path must end with .docx: ${n}`);return n}async function WR(t,e){if(typeof e!="string"||e.trim().length===0)return null;let r=(await Xe(e,t,t.stateId)).trim();return r.length===0?null:r}function BR(t,e){let r=hs(t);return xR(yg(e)?hs(e):hs(r,e))}function qR(t,e){return HR(e)?yg(e)?hs(e):hs(t,e):null}function HR(t){return t.endsWith(".md")||t.endsWith(".markdown")||t.startsWith("./")||t.startsWith("../")||t.startsWith("/")}function JR(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 Mi(s);let o=t.dal.query(`SELECT sa.content
|
|
1534
1534
|
FROM step_artifact sa
|
|
1535
1535
|
JOIN step s ON s.id = sa.step_id
|
|
1536
1536
|
WHERE s.run_id = ?
|
|
@@ -1538,11 +1538,11 @@ ${u}`:u;try{let f=await ps({context:t,stateId:n,member:o,prompt:d,stepId:l.id,ti
|
|
|
1538
1538
|
AND sa.content IS NOT NULL
|
|
1539
1539
|
ORDER BY sa.id DESC
|
|
1540
1540
|
LIMIT 1`,t.run_id,`${n}:coder[%`);return o[0]?.content===void 0?null:Mi(o[0].content)}function Mi(t){return t.replace(/\n*STANCE:\s+\S+\s*$/,"").trimEnd()}async function XR(t,e){let r=bg(DR.lexer(t,{gfm:!0})),n=new $R({title:e,numbering:{config:[{reference:"ordered-list",levels:[{level:0,format:AR.DECIMAL,text:"%1."}]}]},sections:[{children:r.length===0?[new ft("")]:r}]});return RR.toBuffer(n)}function bg(t){let e=[];for(let r of t)switch(r.type){case"space":break;case"heading":e.push(new ft({heading:QR(r.depth),children:lr(ar(r))}));break;case"paragraph":e.push(new ft({children:lr(ar(r))}));break;case"text":e.push(new ft({children:ar(r).length===0?[new mt(r.text)]:lr(ar(r))}));break;case"blockquote":e.push(...bg(ar(r)).map(n=>n instanceof ft?n:new ft({children:[new mt(r.text)]})));break;case"list":YR(r)&&e.push(...GR(r));break;case"table":zR(r)&&e.push(VR(r));break;case"code":ZR(r)&&e.push(...KR(r));break;case"hr":e.push(new ft(""));break;case"html":r.text.trim().length>0&&e.push(new ft({children:[new mt(r.text)]}));break;default:break}return e}function lr(t,e){let r=[];for(let n of t)switch(n.type){case"text":case"escape":r.push(new mt({text:n.text,...ku(e)}));break;case"strong":r.push(...lr(ar(n),{...e,bold:!0}));break;case"em":r.push(...lr(ar(n),{...e,italics:!0}));break;case"codespan":r.push(new mt({text:n.text,...ku({...e,code:!0})}));break;case"link":r.push(new jR({link:n.href,children:lr(ar(n),{...e})}));break;case"br":r.push(new mt({text:"",break:1}));break;case"image":r.push(new mt({text:`[image: ${n.text}]`,italics:!0}));break;case"del":r.push(new mt({text:n.text,strike:!0}));break;default:r.push(new mt({text:n.raw,...ku(e)}));break}return r.length===0?[new mt("")]:r}function ku(t){return{...t?.bold===!0?{bold:!0}:{},...t?.italics===!0?{italics:!0}:{},...t?.code===!0?{font:"Courier New"}:{}}}function GR(t){return t.items.map(e=>new ft({children:lr(e.tokens.length===1&&e.tokens[0]?.type==="text"?[{...e.tokens[0],text:wg(e)+e.tokens[0].text}]:[{type:"text",raw:e.text,text:wg(e)+e.text}]),...t.ordered?{numbering:{reference:"ordered-list",level:0}}:{bullet:{level:0}}}))}function wg(t){return t.task?`[${t.checked?"x":" "}] `:""}function VR(t){let e=[t.header,...t.rows].map(r=>new CR({children:r.map(n=>new LR({children:[new ft({children:lr(n.tokens,n.header?{bold:!0}:void 0)})]}))}));return new OR({width:{size:100,type:MR.PERCENTAGE},rows:e})}function KR(t){return t.text.split(`
|
|
1541
|
-
`).map(r=>new ft({children:[new mt({text:r.length===0?" ":r,font:"Courier New"})]}))}function ar(t){let e=t.tokens;return Array.isArray(e)?e:[]}function YR(t){return t.type==="list"&&Array.isArray(t.items)}function zR(t){let e=t;return t.type==="table"&&Array.isArray(e.header)&&Array.isArray(e.rows)}function ZR(t){return t.type==="code"&&typeof t.text=="string"}function QR(t){switch(t){case 1:return _n.HEADING_1;case 2:return _n.HEADING_2;case 3:return _n.HEADING_3;case 4:return _n.HEADING_4;case 5:return _n.HEADING_5;default:return _n.HEADING_6}}var Eg,Sg=b(()=>{"use strict";We();Eg={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=>PR(t,t.state)}});import{createHash as eO}from"node:crypto";import{existsSync as tO,mkdirSync as rO,readFileSync as Tg,statSync as nO}from"node:fs";import{dirname as sO,isAbsolute as kg,normalize as oO,resolve as _s}from"node:path";import{marked as iO}from"marked";import aO from"write-excel-file/node";async function lO(t,e){let r=t.stateId,n=t.displayName,s=
|
|
1542
|
-
${a}`:null,c,l,s,e.writes_to_project_path===!0,o);if(l){let g=H_(p.text);if(g!==null){let _=
|
|
1543
|
-
${p.text}`,["approve","request_changes"],!0,s,e.writes_to_project_path===!0)));if(h.every(g=>g.outcome==="approve")){let g=
|
|
1541
|
+
`).map(r=>new ft({children:[new mt({text:r.length===0?" ":r,font:"Courier New"})]}))}function ar(t){let e=t.tokens;return Array.isArray(e)?e:[]}function YR(t){return t.type==="list"&&Array.isArray(t.items)}function zR(t){let e=t;return t.type==="table"&&Array.isArray(e.header)&&Array.isArray(e.rows)}function ZR(t){return t.type==="code"&&typeof t.text=="string"}function QR(t){switch(t){case 1:return _n.HEADING_1;case 2:return _n.HEADING_2;case 3:return _n.HEADING_3;case 4:return _n.HEADING_4;case 5:return _n.HEADING_5;default:return _n.HEADING_6}}var Eg,Sg=b(()=>{"use strict";We();Eg={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=>PR(t,t.state)}});import{createHash as eO}from"node:crypto";import{existsSync as tO,mkdirSync as rO,readFileSync as Tg,statSync as nO}from"node:fs";import{dirname as sO,isAbsolute as kg,normalize as oO,resolve as _s}from"node:path";import{marked as iO}from"marked";import aO from"write-excel-file/node";async function lO(t,e){let r=t.stateId,n=t.displayName,s=X(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1;try{let o=await cO(t,e),i=uO(e.input_format),a=await dO(t,e),l=await fO(t,e.title),c=i==="markdown"?bO(o):_O(o);await SO({sheets:c.length===0?[{name:"Sheet1",headers:[],rows:[]}]:c,outputPath:a,title:l??t.workflow.name});let u=nO(a).size;if(u===0)throw new Error("rendered XLSX file was empty");let d=eO("sha256").update(Tg(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}`),Y(t,r,n,{output_path:a,path:a,bytes:u}),K(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),Y(t,r,n,{error:i}),K(t.workflow,e.outcomes?.error??"@terminal:error")}}async function cO(t,e){if(typeof e.source!="string"||e.source.trim().length===0)return"";let r=(await Xe(e.source,t,t.stateId)).trim(),n=pO(t.project.local_path,r);if(n!==null){if(!tO(n))throw new Error(`source file not found: ${n}`);return Tg(n,"utf8")}return r}function uO(t){if(t==null||t==="")return"json";if(t==="json"||t==="markdown")return t;throw new Error(`unsupported input_format: ${String(t)}`)}async function dO(t,e){if(typeof e.output_path!="string"||e.output_path.trim().length===0)throw new Error("output_path is required");let r=(await Xe(e.output_path,t,t.stateId)).trim();if(r.length===0)throw new Error("output_path resolved empty");let n=mO(t.project.local_path,r);if(!n.endsWith(".xlsx"))throw new Error(`output_path must end with .xlsx: ${n}`);return n}async function fO(t,e){if(typeof e!="string"||e.trim().length===0)return null;let r=(await Xe(e,t,t.stateId)).trim();return r.length===0?null:r}function mO(t,e){let r=_s(t);return oO(kg(e)?_s(e):_s(r,e))}function pO(t,e){return hO(e)?kg(e)?_s(e):_s(t,e):null}function hO(t){return t.endsWith(".json")||t.endsWith(".md")||t.endsWith(".markdown")||t.startsWith("./")||t.startsWith("../")||t.startsWith("/")}function _O(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(!Di(e)||!Array.isArray(e.sheets))throw new Error("JSON source must be an object with sheets[]");return e.sheets.map((r,n)=>gO(r,n))}function gO(t,e){if(!Di(t))throw new Error(`sheets[${e}] must be an object`);let r=wO(t.headers,`sheets[${e}].headers`),n=yO(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:EO(t.styles)}}function wO(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 yO(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 EO(t){if(!Di(t)||!Di(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 bO(t){let e=iO.lexer(t,{gfm:!0}),r=[],n=null;for(let s of e){if($O(s)){n=s.text;continue}jO(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 SO(t){rO(sO(t.outputPath),{recursive:!0});let e=new Set,r=t.sheets.map(n=>({sheet:IO(n.name,e),data:TO(n),columns:vO(n)}));await aO(r).toFile(t.outputPath)}function TO(t){let e=[];if(t.headers.length>0){let r=xO(t.headerStyle?.fill);e.push(t.headers.map(n=>({value:n,type:String,fontWeight:t.headerStyle?.bold===!1?void 0:"bold",backgroundColor:r??void 0})))}for(let r of t.rows)e.push(r.map(kO));return e.length===0?[[{}]]:e}function kO(t){return t===null?{}:typeof t=="string"?{value:t,type:String}:typeof t=="number"?{value:t,type:Number}:typeof t=="boolean"?{value:t,type:Boolean}:{}}function vO(t){let e=Math.max(t.headers.length,...t.rows.map(n=>n.length),1),r=[];for(let n=1;n<=e;n+=1){let s=[t.headers[n-1],...t.rows.map(i=>i[n-1])],o=Math.min(60,Math.max(10,...s.map(i=>String(i??"").length+2)));r.push({width:o})}return r}function IO(t,e){let r=NO(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 NO(t){let e=t.replace(/[\[\]:*?/\\]/g," ").trim();return(e.length===0?"Sheet":e).slice(0,31)}function xO(t){if(t===void 0)return null;let e=t.startsWith("#")?t.slice(1):t;return/^[0-9a-fA-F]{6}$/.test(e)?`#${e.toUpperCase()}`:null}function $O(t){return t.type==="heading"&&typeof t.text=="string"}function jO(t){let e=t;return t.type==="table"&&Array.isArray(e.header)&&Array.isArray(e.rows)}function Di(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}var vg,Ig=b(()=>{"use strict";We();vg={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=>lO(t,t.state)}});import{spawnSync as AO}from"node:child_process";async function OO(t,e){let r=t.stateId,n=t.displayName,s=t.workflow.default_task_timeout_ms;for(let f of e.pre_checks??[])if(AO("sh",["-c",f.command],{cwd:t.project.local_path}).status!==0){let p=X(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1,t.dal.finishStep(p.id,"fail_pre_check",`pre_check_failed:${f.description??f.command}`),Y(t,r,n,"fail_pre_check");let h=e.outcomes.fail_pre_check;return h!==void 0?K(t.workflow,h):{kind:"terminal",terminal:ee(t.workflow)}}let o=hn(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 m=`${n}:coder[${f}]`,p=await pn(t,m,e.coder,a!==null?`PRIOR REVIEW FEEDBACK:
|
|
1542
|
+
${a}`:null,c,l,s,e.writes_to_project_path===!0,o);if(l){let g=H_(p.text);if(g!==null){let _=X(t,{run_id:t.run_id,state_name:n});return t.steps_executed+=1,t.dal.finishStep(_.id,null,`escalation_vocab:${g.token}`),{kind:"escalate",token:g.token,reason:g.reason.length>0?`${g.token}: ${g.reason}`:g.token}}}if(p.outcome===null){let g=X(t,{run_id:t.run_id,state_name:n});return t.steps_executed+=1,t.dal.finishStep(g.id,null,p.status_detail),{kind:"escalate",token:"",reason:`coder_no_outcome:${p.status_detail}`}}if(i.length===0){if(e.outcomes_from_stance!==void 0){let T=Object.keys(e.outcomes_from_stance),E=ds(p.text,T);if(E.outcome===null){let $=X(t,{run_id:t.run_id,state_name:n});return t.steps_executed+=1,t.dal.finishStep($.id,null,`unhandled_stance:${E.reason}`),{kind:"escalate",token:"",reason:`no_stance:${E.reason}`}}let k=X(t,{run_id:t.run_id,state_name:n});return t.steps_executed+=1,t.dal.finishStep(k.id,E.outcome,"outcomes_from_stance"),Y(t,r,n,E.outcome),K(t.workflow,e.outcomes_from_stance[E.outcome])}let g=ds(p.text,RO);if(g.outcome!==null){let T=X(t,{run_id:t.run_id,state_name:n});return t.steps_executed+=1,t.dal.finishStep(T.id,g.outcome,"default_failure_stance"),Y(t,r,n,g.outcome),{kind:"escalate",token:g.outcome,reason:`failure_stance:${g.outcome}`}}let _=X(t,{run_id:t.run_id,state_name:n});if(t.steps_executed+=1,t.dal.finishStep(_.id,"approve","no_reviewers"),Y(t,r,n,"approve"),e.write_back_durable_memory){let T=t.membersByAlias.get(e.coder.alias);T!==void 0&&await Dt(t,n,T,e.write_back_durable_memory)}return K(t.workflow,e.outcomes.approve)}let h=await Promise.all(i.map(g=>pn(t,`${n}:reviewer_${g.alias}[${f}]`,g,`CODER OUTPUT:
|
|
1543
|
+
${p.text}`,["approve","request_changes"],!0,s,e.writes_to_project_path===!0)));if(h.every(g=>g.outcome==="approve")){let g=X(t,{run_id:t.run_id,state_name:n});if(t.steps_executed+=1,t.dal.finishStep(g.id,"approve",`loop=${f}`),Y(t,r,n,"approve"),e.write_back_durable_memory){let _=t.membersByAlias.get(e.coder.alias);_!==void 0&&await Dt(t,n,_,e.write_back_durable_memory)}return K(t.workflow,e.outcomes.approve)}if(a=h.filter(g=>g.outcome==="request_changes").map(g=>g.text).join(`
|
|
1544
1544
|
|
|
1545
|
-
`),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}`),Y(t,r,n,"max_loops_exceeded");let d=e.outcomes.max_loops_exceeded;return d!==void 0?K(t.workflow,d):{kind:"terminal",terminal:ee(t.workflow)}}var RO,Ng,xg=b(()=>{"use strict";wu();We();RO=["blocked","failed","aborted"],Ng={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=>OO(t,t.state)}});import{spawnSync as LO}from"node:child_process";async function CO(t,e){let r=t.stateId,n=t.displayName,s=await Xe(e.command,t,n),o=Su(t,n),i=rg(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:ee(t.workflow)}}let a=new Date(Date.now()-1),l=typeof e.timeout_ms=="number"&&e.timeout_ms>0,c=LO("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:ee(t.workflow)});if(e.writes_to_project_path!==!0&&t.project.local_path.trim().length>0&&Tu(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:ee(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 m=String(c.status),p=e.outcomes_from_exit[m]??e.outcomes_from_exit.default;return p===void 0?(t.dal.insertStepArtifact({step_id:u.id,kind:"unhandled_exit",content:m}),t.dal.finishStep(u.id,null,`shell_step_unhandled_exit:${m}`),{kind:"terminal",terminal:"shell_step_unhandled_exit"}):(t.dal.finishStep(u.id,m,`exit=${c.status}`),Y(t,r,n,m),K(t.workflow,p))}var $g,jg=b(()=>{"use strict";We();$g={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=>CO(t,t.state)}});async function MO(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:ee(t.workflow)};let i=Ce(o.definition),a=await DO(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:ee(t.workflow)};Y(t,r,n,PO(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:ee(t.workflow)}:K(t.workflow,u)}async function DO(t,e){let r={};for(let[n,s]of Object.entries(e.inputs??{})){let o=await K_(s,t);r[n]=o===s?await Oi(s,t):o}return r}function PO(t,e,r){let n={};for(let s of r)n[s.name]=FO(t,e,s);return n}function FO(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=UO(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 UO(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 Ag,Rg=b(()=>{"use strict";dn();We();fs();Ag={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=>MO(t,t.state)}});function WO(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"),Y(t,r,n,s),{kind:"terminal",terminal:s}}var Og,Lg=b(()=>{"use strict";We();Og={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=>WO(t,t.state)}});async function BO(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=qO(t.cursor),a=o.filter(HO).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 qO(t){if(t===void 0)return 0;let e=Number(t);return Number.isFinite(e)?e:0}function HO(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 Cg,Mg=b(()=>{"use strict";Cg={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=>BO(t)}});async function JO(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 Dg,Pg=b(()=>{"use strict";Dg={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=>JO(t)}});function Fg(t){t.register(sg),t.register(Ng),t.register(lg),t.register(pg),t.register(_g),t.register(Eg),t.register(vg),t.register($g),t.register(ig),t.register(ug),t.register(Ag),t.register(Og),t.register(Dg),t.register(Cg)}var Ug=b(()=>{"use strict";og();ag();cg();fg();hg();gg();Sg();Ig();xg();jg();Rg();Lg();Mg();Pg()});function Fi(){return Pi===null&&(Pi=new vu,Fg(Pi)),Pi}var XO,vu,Pi,Iu=b(()=>{"use strict";Ug();XO={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"},vu=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:XO[e];return r?this.types.get(r):void 0}list(){return Array.from(this.types.values())}},Pi=null});async function qg(t){Vg(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=VO(e.definition,t.workflow),s=t.job.run_id===null?null:t.dal.getRun(t.job.run_id),o=gs(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=D_(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(m=>[m.alias,m]));if(gs(n)){let m=Nu({dal:t.dal,workflow:Wi(n),job:t.job,project:r,run:i,membersByAlias:c,outcomes:s!==null&&i===s?t.dal.listLatestStepOutcomesByState(i.id):{},inputs:ir(t.job.payload)??{},team_id:t.team.id}),p=await Jg(n,m,i.current_state??n.entry_step_id);return Bg(t.dal,r.id,i.id,n.name,p),p}let u=s!==null&&i===s?t.dal.listLatestStepOutcomesByState(i.id):{},d=Nu({dal:t.dal,workflow:n,job:t.job,project:r,run:i,membersByAlias:c,outcomes:u,inputs:ir(t.job.payload)??{},team_id:t.team.id}),f=await Hg(d,i.current_state??n.start_at);return Bg(t.dal,r.id,i.id,n.name,f),f}function Bg(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),p=(f.terminals??{})[o];if(p!==void 0&&typeof p.kind=="string"&&(p.kind==="success"||p.kind==="failure"||p.kind==="neutral")&&(i=p.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 Nu(t){let e={dal:t.dal,workflow:t.workflow,job:t.job,project:t.project,run_id:t.run.id,membersByAlias:t.membersByAlias,inputs:t.inputs,outcomes:t.outcomes,transcripts:{},progress_step_id:null,steps_executed:0,last_state_id:null,errors_block_fired:!1,iteration:null,parent_step_id:null,dispatchState:async(r,n,s)=>{let 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 xu(e,r,n,s?.display_name??r)}finally{e.parent_step_id=o,e.iteration=i}},runChildWorkflow:async(r,n,s)=>{Vg(n);let o=gs(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=Nu({dal:t.dal,workflow:gs(n)?Wi(n):n,job:t.job,project:t.project,run:i,membersByAlias:t.membersByAlias,outcomes:{},inputs:s,team_id:t.team_id});return gs(n)?Jg(n,a,i.current_state??n.entry_step_id):Hg(a,i.current_state??n.start_at)}};return e}async function Hg(t,e){let r=e;if(r.startsWith(ms))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 Pt(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=Ui(t,ee(t.workflow));if(l.kind==="paused")return Me(t);if(l.kind==="escalate")return tt(t,{id:r,name:r,type:"unknown"},l.token,l.reason),Me(t);if(l.kind==="terminal")return Pt(t,l.terminal);r=l.state;continue}let i,a=Gg(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"),Y(t,r,r,a),a===Dn)return Pt(t,ul);let c=o.outcomes?.[a];i=c!==void 0?K(t.workflow,c):tt(t,{id:r,name:r,type:o.type},a,`no declared edge for resumed outcome '${a}' from state '${r}'`)}else i=await xu(t,r,o);if(i.kind==="paused")return Me(t);if(i.kind==="escalate")return tt(t,{id:r,name:r,type:o.type},i.token,i.reason),Me(t);if(i.kind==="terminal"){let l=Ui(t,i.terminal);if(l.kind==="paused")return Me(t);if(l.kind==="escalate")return tt(t,{id:r,name:r,type:o.type},l.token,l.reason),Me(t);if(l.kind==="terminal")return Pt(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=Ui(t,ee(t.workflow));return n.kind==="terminal"?Pt(t,n.terminal):Pt(t,ee(t.workflow))}async function Jg(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 tt(e,{id:o,name:o,type:"unknown"},"",`internal:unknown v3 step '${o}'`),Me(e);let l=Gg(e,a.id);if(l!==null){let m=J(e,{run_id:e.run_id,state_name:a.name});if(e.steps_executed+=1,e.dal.finishStep(m.id,l,"escalation_resume"),Y(e,a.id,a.name,l),l===Dn)return Pt(e,ul);let p=Object.keys(t.connections[a.id]??{}),h=t.connections[a.id]?.[l]?.[0]?.[0]?.step_id??t.connections[a.id]?.main?.[0]?.[0]?.step_id;if(h===void 0)return tt(e,{id:a.id,name:a.name,type:a.type},l,`no declared edge for resumed outcome '${l}' from step '${a.id}'`,{declared_outcomes:p}),Me(e);o=h;continue}let c=await GO(e,t,a);if(c.kind==="paused")return Me(e);let u=Object.keys(t.connections[a.id]??{});if(c.kind==="escalate")return tt(e,{id:a.id,name:a.name,type:a.type},c.token,c.reason,{declared_outcomes:u}),Me(e);let d=c.kind==="terminal"?c.terminal:c.state;if(a.type==="lmctl/terminal"){let m=e.workflow;e.workflow=Wi(t,a);try{let p=Ui(e,d);if(p.kind==="paused")return Me(e);if(p.kind==="escalate")return tt(e,{id:a.id,name:a.name,type:a.type},p.token,p.reason),Me(e);if(p.kind==="terminal")return Pt(e,p.terminal);let h=s.get(p.state);if(h===void 0)return tt(e,{id:a.id,name:a.name,type:a.type},"",`internal:unknown v3 error handler step '${p.state}'`),Me(e);o=h.id;continue}finally{e.workflow=m}}if(Ur(d))return tt(e,{id:a.id,name:a.name,type:a.type},d,`generic escalation '${d}' from step '${a.id}'`,{declared_outcomes:u}),Me(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 tt(e,{id:a.id,name:a.name,type:a.type},d,`no declared edge for outcome '${d}' from step '${a.id}'`,{declared_outcomes:u}),Me(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})}),Pt(e,"aborted")}async function GO(t,e,r){let n=Xg(e,r),s=t.workflow;t.workflow=Wi(e,r);try{return await xu(t,r.id,n,r.name)}finally{t.workflow=s}}function Xg(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 xu(t,e,r,n){let s=Fi().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?zO(t,s):void 0,t.progress_step_id=null;try{return await s.execute(eg(t,e,r,n??e))}finally{t.emit_progress=o,t.progress_step_id=i}}function VO(t,e){try{let r=JSON.parse(t);if(YO(r)&&r.definition_schema_version===3)return yt.parse(r)}catch{return e}return e}function gs(t){return t.definition_schema_version===3}function Wi(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]=Xg(t,o))}return e?.type==="lmctl/terminal"&&typeof e.parameters.name=="string"&&(n[e.parameters.name]={kind:KO(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 KO(t){return t==="success"||t==="failure"||t==="neutral"?t:"neutral"}function YO(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function zO(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 Pt(t,e){t.dal.setRunTerminalState(t.run_id,e);try{O_(t.run_id,t.dal)}catch{}return{run_id:t.run_id,terminal_state:e,steps_executed:t.steps_executed}}function Me(t){return{run_id:t.run_id,terminal_state:null,steps_executed:t.steps_executed,paused:!0}}function Gg(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 Ui(t,e){if(!ZO(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&&QO(t,e,r.on_unhandled_failure),{kind:"terminal",terminal:e}))}function ZO(t,e){return t.definition_schema_version===2&&t.terminals[e]?.kind==="failure"}function QO(t,e,r){let n=eL(t),s=r.capture_evidence&&n!==null?tL(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 eL(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 tL(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 Vg(t){if(!Wg.includes(t.definition_schema_version))throw new Error(`unsupported definition_schema_version ${t.definition_schema_version}; supported versions: ${Wg.join(", ")}`)}var Wg,Kg=b(()=>{"use strict";cn();L_();P_();We();Iu();Pn();Wg=[1,2,3]});import{readFileSync as rL,readdirSync as nL}from"node:fs";import{basename as sL,join as oL,resolve as iL}from"node:path";function Zg(t={}){let e=iL(t.workflowsDir??"workflows"),r=nL(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=>aL(oL(e,n)))}}function aL(t){let e=sL(t);try{let r=rL(t,"utf8"),n=Ce(r);return tw(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:rw(r)}}}function Qg(t,e){try{let r=Ce(e);return tw(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:rw(r)}}}function ew(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(`
|
|
1545
|
+
`),e.loop_feedback_artifact!==void 0){let g=X(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=X(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}`),Y(t,r,n,"max_loops_exceeded");let d=e.outcomes.max_loops_exceeded;return d!==void 0?K(t.workflow,d):{kind:"terminal",terminal:ee(t.workflow)}}var RO,Ng,xg=b(()=>{"use strict";wu();We();RO=["blocked","failed","aborted"],Ng={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=>OO(t,t.state)}});import{spawnSync as LO}from"node:child_process";async function CO(t,e){let r=t.stateId,n=t.displayName,s=await Xe(e.command,t,n),o=Su(t,n),i=rg(s);if(i.matched&&!o){let h=X(t,{run_id:t.run_id,state_name:n});return t.steps_executed+=1,t.dal.insertSessionEvent({run_id:t.run_id,step_id:h.id,kind:"policy_violation",timestamp_ms:Date.now(),payload:JSON.stringify({violation:"side_effect_without_pause",state_id:n,kind: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:ee(t.workflow)}}let a=new Date(Date.now()-1),l=typeof e.timeout_ms=="number"&&e.timeout_ms>0,c=LO("sh",["-c",s],{cwd:t.project.local_path,...l?{timeout:e.timeout_ms}:{},encoding:"utf8",env:{...process.env}}),u=X(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:ee(t.workflow)});if(e.writes_to_project_path!==!0&&t.project.local_path.trim().length>0&&Tu(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:ee(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 m=String(c.status),p=e.outcomes_from_exit[m]??e.outcomes_from_exit.default;return p===void 0?(t.dal.insertStepArtifact({step_id:u.id,kind:"unhandled_exit",content:m}),t.dal.finishStep(u.id,null,`shell_step_unhandled_exit:${m}`),{kind:"terminal",terminal:"shell_step_unhandled_exit"}):(t.dal.finishStep(u.id,m,`exit=${c.status}`),Y(t,r,n,m),K(t.workflow,p))}var $g,jg=b(()=>{"use strict";We();$g={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=>CO(t,t.state)}});async function MO(t,e){let r=t.stateId,n=t.displayName,s=X(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1;let 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:ee(t.workflow)};let i=Ce(o.definition),a=await DO(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:ee(t.workflow)};Y(t,r,n,PO(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:ee(t.workflow)}:K(t.workflow,u)}async function DO(t,e){let r={};for(let[n,s]of Object.entries(e.inputs??{})){let o=await K_(s,t);r[n]=o===s?await Oi(s,t):o}return r}function PO(t,e,r){let n={};for(let s of r)n[s.name]=FO(t,e,s);return n}function FO(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=UO(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 UO(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 Ag,Rg=b(()=>{"use strict";dn();We();fs();Ag={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=>MO(t,t.state)}});function WO(t,e){let r=t.stateId,n=t.displayName,s=e.name??n,o=X(t,{run_id:t.run_id,state_name:n});return t.steps_executed+=1,t.dal.finishStep(o.id,s,e.kind??"neutral"),Y(t,r,n,s),{kind:"terminal",terminal:s}}var Og,Lg=b(()=>{"use strict";We();Og={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=>WO(t,t.state)}});async function BO(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=qO(t.cursor),a=o.filter(HO).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 qO(t){if(t===void 0)return 0;let e=Number(t);return Number.isFinite(e)?e:0}function HO(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 Cg,Mg=b(()=>{"use strict";Cg={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=>BO(t)}});async function JO(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 Dg,Pg=b(()=>{"use strict";Dg={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=>JO(t)}});function Fg(t){t.register(sg),t.register(Ng),t.register(lg),t.register(pg),t.register(_g),t.register(Eg),t.register(vg),t.register($g),t.register(ig),t.register(ug),t.register(Ag),t.register(Og),t.register(Dg),t.register(Cg)}var Ug=b(()=>{"use strict";og();ag();cg();fg();hg();gg();Sg();Ig();xg();jg();Rg();Lg();Mg();Pg()});function Fi(){return Pi===null&&(Pi=new vu,Fg(Pi)),Pi}var XO,vu,Pi,Iu=b(()=>{"use strict";Ug();XO={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"},vu=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:XO[e];return r?this.types.get(r):void 0}list(){return Array.from(this.types.values())}},Pi=null});async function qg(t){Vg(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=VO(e.definition,t.workflow),s=t.job.run_id===null?null:t.dal.getRun(t.job.run_id),o=gs(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=D_(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(m=>[m.alias,m]));if(gs(n)){let m=Nu({dal:t.dal,workflow:Wi(n),job:t.job,project:r,run:i,membersByAlias:c,outcomes:s!==null&&i===s?t.dal.listLatestStepOutcomesByState(i.id):{},inputs:ir(t.job.payload)??{},team_id:t.team.id}),p=await Jg(n,m,i.current_state??n.entry_step_id);return Bg(t.dal,r.id,i.id,n.name,p),p}let u=s!==null&&i===s?t.dal.listLatestStepOutcomesByState(i.id):{},d=Nu({dal:t.dal,workflow:n,job:t.job,project:r,run:i,membersByAlias:c,outcomes:u,inputs:ir(t.job.payload)??{},team_id:t.team.id}),f=await Hg(d,i.current_state??n.start_at);return Bg(t.dal,r.id,i.id,n.name,f),f}function Bg(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),p=(f.terminals??{})[o];if(p!==void 0&&typeof p.kind=="string"&&(p.kind==="success"||p.kind==="failure"||p.kind==="neutral")&&(i=p.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 Nu(t){let e={dal:t.dal,workflow:t.workflow,job:t.job,project:t.project,run_id:t.run.id,membersByAlias:t.membersByAlias,inputs:t.inputs,outcomes:t.outcomes,transcripts:{},progress_step_id:null,steps_executed:0,last_state_id:null,errors_block_fired:!1,iteration:null,parent_step_id:null,dispatchState:async(r,n,s)=>{let 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 xu(e,r,n,s?.display_name??r)}finally{e.parent_step_id=o,e.iteration=i}},runChildWorkflow:async(r,n,s)=>{Vg(n);let o=gs(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=Nu({dal:t.dal,workflow:gs(n)?Wi(n):n,job:t.job,project:t.project,run:i,membersByAlias:t.membersByAlias,outcomes:{},inputs:s,team_id:t.team_id});return gs(n)?Jg(n,a,i.current_state??n.entry_step_id):Hg(a,i.current_state??n.start_at)}};return e}async function Hg(t,e){let r=e;if(r.startsWith(ms))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 Pt(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=Ui(t,ee(t.workflow));if(l.kind==="paused")return Me(t);if(l.kind==="escalate")return tt(t,{id:r,name:r,type:"unknown"},l.token,l.reason),Me(t);if(l.kind==="terminal")return Pt(t,l.terminal);r=l.state;continue}let i,a=Gg(t,r);if(a!==null){let l=X(t,{run_id:t.run_id,state_name:r});if(t.steps_executed+=1,t.dal.finishStep(l.id,a,"escalation_resume"),Y(t,r,r,a),a===Dn)return Pt(t,ul);let c=o.outcomes?.[a];i=c!==void 0?K(t.workflow,c):tt(t,{id:r,name:r,type:o.type},a,`no declared edge for resumed outcome '${a}' from state '${r}'`)}else i=await xu(t,r,o);if(i.kind==="paused")return Me(t);if(i.kind==="escalate")return tt(t,{id:r,name:r,type:o.type},i.token,i.reason),Me(t);if(i.kind==="terminal"){let l=Ui(t,i.terminal);if(l.kind==="paused")return Me(t);if(l.kind==="escalate")return tt(t,{id:r,name:r,type:o.type},l.token,l.reason),Me(t);if(l.kind==="terminal")return Pt(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=Ui(t,ee(t.workflow));return n.kind==="terminal"?Pt(t,n.terminal):Pt(t,ee(t.workflow))}async function Jg(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 tt(e,{id:o,name:o,type:"unknown"},"",`internal:unknown v3 step '${o}'`),Me(e);let l=Gg(e,a.id);if(l!==null){let m=X(e,{run_id:e.run_id,state_name:a.name});if(e.steps_executed+=1,e.dal.finishStep(m.id,l,"escalation_resume"),Y(e,a.id,a.name,l),l===Dn)return Pt(e,ul);let p=Object.keys(t.connections[a.id]??{}),h=t.connections[a.id]?.[l]?.[0]?.[0]?.step_id??t.connections[a.id]?.main?.[0]?.[0]?.step_id;if(h===void 0)return tt(e,{id:a.id,name:a.name,type:a.type},l,`no declared edge for resumed outcome '${l}' from step '${a.id}'`,{declared_outcomes:p}),Me(e);o=h;continue}let c=await GO(e,t,a);if(c.kind==="paused")return Me(e);let u=Object.keys(t.connections[a.id]??{});if(c.kind==="escalate")return tt(e,{id:a.id,name:a.name,type:a.type},c.token,c.reason,{declared_outcomes:u}),Me(e);let d=c.kind==="terminal"?c.terminal:c.state;if(a.type==="lmctl/terminal"){let m=e.workflow;e.workflow=Wi(t,a);try{let p=Ui(e,d);if(p.kind==="paused")return Me(e);if(p.kind==="escalate")return tt(e,{id:a.id,name:a.name,type:a.type},p.token,p.reason),Me(e);if(p.kind==="terminal")return Pt(e,p.terminal);let h=s.get(p.state);if(h===void 0)return tt(e,{id:a.id,name:a.name,type:a.type},"",`internal:unknown v3 error handler step '${p.state}'`),Me(e);o=h.id;continue}finally{e.workflow=m}}if(Ur(d))return tt(e,{id:a.id,name:a.name,type:a.type},d,`generic escalation '${d}' from step '${a.id}'`,{declared_outcomes:u}),Me(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 tt(e,{id:a.id,name:a.name,type:a.type},d,`no declared edge for outcome '${d}' from step '${a.id}'`,{declared_outcomes:u}),Me(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})}),Pt(e,"aborted")}async function GO(t,e,r){let n=Xg(e,r),s=t.workflow;t.workflow=Wi(e,r);try{return await xu(t,r.id,n,r.name)}finally{t.workflow=s}}function Xg(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 xu(t,e,r,n){let s=Fi().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?zO(t,s):void 0,t.progress_step_id=null;try{return await s.execute(eg(t,e,r,n??e))}finally{t.emit_progress=o,t.progress_step_id=i}}function VO(t,e){try{let r=JSON.parse(t);if(YO(r)&&r.definition_schema_version===3)return yt.parse(r)}catch{return e}return e}function gs(t){return t.definition_schema_version===3}function Wi(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]=Xg(t,o))}return e?.type==="lmctl/terminal"&&typeof e.parameters.name=="string"&&(n[e.parameters.name]={kind:KO(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 KO(t){return t==="success"||t==="failure"||t==="neutral"?t:"neutral"}function YO(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function zO(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 Pt(t,e){t.dal.setRunTerminalState(t.run_id,e);try{O_(t.run_id,t.dal)}catch{}return{run_id:t.run_id,terminal_state:e,steps_executed:t.steps_executed}}function Me(t){return{run_id:t.run_id,terminal_state:null,steps_executed:t.steps_executed,paused:!0}}function Gg(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 Ui(t,e){if(!ZO(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&&QO(t,e,r.on_unhandled_failure),{kind:"terminal",terminal:e}))}function ZO(t,e){return t.definition_schema_version===2&&t.terminals[e]?.kind==="failure"}function QO(t,e,r){let n=eL(t),s=r.capture_evidence&&n!==null?tL(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 eL(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 tL(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 Vg(t){if(!Wg.includes(t.definition_schema_version))throw new Error(`unsupported definition_schema_version ${t.definition_schema_version}; supported versions: ${Wg.join(", ")}`)}var Wg,Kg=b(()=>{"use strict";cn();L_();P_();We();Iu();Pn();Wg=[1,2,3]});import{readFileSync as rL,readdirSync as nL}from"node:fs";import{basename as sL,join as oL,resolve as iL}from"node:path";function Zg(t={}){let e=iL(t.workflowsDir??"workflows"),r=nL(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=>aL(oL(e,n)))}}function aL(t){let e=sL(t);try{let r=rL(t,"utf8"),n=Ce(r);return tw(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:rw(r)}}}function Qg(t,e){try{let r=Ce(e);return tw(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:rw(r)}}}function ew(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(`
|
|
1546
1546
|
`)}
|
|
1547
1547
|
`}function tw(t,e){let r=cL(e),n=uL(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=lL(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 lL(t){return(t??[]).filter(e=>e.required===!0&&e.default===void 0).map(e=>e.name)}function cL(t){return $u(t)?t.entry_step_id:t.start_at}function uL(t){return $u(t)?t.steps.find(e=>e.id===t.entry_step_id)?.type??null:t.states[t.start_at]?.type??null}function $u(t){return t.definition_schema_version===3}function rw(t){return t instanceof Mt?t.issues.map(e=>`${e.path}: ${e.message}`).join("; "):t instanceof SyntaxError?`JSON parse failed: ${t.message}`:t instanceof Error?t.message:String(t)}function nw(t){let e=new Set;if($u(t))for(let r of t.steps){let n=r.members??{};Yg(n,e)}else for(let r of Object.values(t.states))Yg(r,e);return[...e].sort()}function Yg(t,e){let r=["coder","agent","consolidator"],n=["reviewers","researchers"];for(let s of r){let o=t[s],i=zg(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=zg(i);a!==null&&e.add(a)}}}function zg(t){if(t===null||typeof t!="object")return null;let e=t.alias;return typeof e=="string"&&e.length>0?e:null}var Bi=b(()=>{"use strict";dn()});function dL({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,qi)[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}=fL(t,r,i);if(a<20)continue;let c=i??"initial",u=`${ws}:${r.id}:${c}`;t.enqueueJob({project_id:r.id,source:qi,source_ref:ws,payload:JSON.stringify({kind:ws,project_id:r.id,completed_sessions:a,max_run_id:l,since_run_id:i}),dedupe_key:u})}}function fL(t,e,r){let n=t.query(`SELECT COUNT(*) AS cnt, MAX(r.id) AS max_id
|
|
1548
1548
|
FROM run r
|
|
@@ -1640,7 +1640,7 @@ ${p.text}`,["approve","request_changes"],!0,s,e.writes_to_project_path===!0)));i
|
|
|
1640
1640
|
<label>Token <input name="token" type="password"></label>
|
|
1641
1641
|
<button type="submit">Login</button>
|
|
1642
1642
|
</form>
|
|
1643
|
-
`))),e.post("/login",async s=>{let o=await s.req.parseBody(),i=typeof o.token=="string"?o.token:"";return __(i)?(au(s,i),s.redirect("/",302)):s.html(Ae("Login","<p>Invalid token</p>"),401)}),e.post("/logout",s=>(g_(s),s.redirect("/login",302))),pw(e,{dal:t.dal}),cy(e,{dal:t.dal}),Aw(e,{dal:t.dal}),Bw(e,{terminalSessionManager:t.terminalSessionManager}),Vw(e,{persistentSessionManager:t.persistentSessionManager}),e.post("/api/teams/:team_name/refresh",async s=>{let o=Kn(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),m=f.filter(p=>p.state!=="idle");if(m.length>0)return{ok:!1,nonIdle:m.map(p=>({alias:p.alias,state:p.state}))};for(let p of f)t.dal.setMemberState(p.id,"in_chat","refreshing");return a=f.map(p=>({id:p.id,alias:p.alias})),{ok:!0}})();if(!c.ok){let f=c.nonIdle.map(m=>`${m.alias}:${m.state}`).join(", ");return s.text(`refresh refused: non-idle members: ${f}`,409)}let u=[],d=[];for(let f of a)try{await lc(t.dal,o,f.alias),t.dal.setMemberState(f.id,"idle",null),u.push(f.alias)}catch(m){let p=m instanceof Error?m.message:String(m);t.dal.setMemberState(f.id,"attention_needed",`refresh failed: ${p}`),d.push({alias:f.alias,error:p})}return W(s,{team:o,seeded:u,failed:d},f=>`<p>refreshed team ${S(f.team)}: seeded [${f.seeded.map(m=>S(m)).join(", ")}]${f.failed.length>0?` failed [${f.failed.map(m=>`${S(m.alias)}: ${S(m.error)}`).join(", ")}]`:""}</p>`)}),k_(e,{dal:t.dal}),A_(e,{dal:t.dal}),e.get("/api/status",s=>W(s,Co(t.dal),OM)),e.get("/api/projects",s=>W(s,Mo(t.dal),LM)),e.get("/api/teams",s=>W(s,Op(t.dal),DM)),e.get("/api/workflows",s=>W(s,Do(t.dal),PM)),e.get("/api/workflows/verify",s=>{let o=Zg();return s.req.header("accept")?.includes("text/plain")?s.text(ew(o)):s.json(o)}),e.get("/api/jobs",s=>W(s,Lp(t.dal,{status:s.req.query("status")}),FM)),e.post("/api/uploads",s=>_y(s,t.dal)),e.get("/api/jobs/:id",s=>{let o=Po(t.dal,re(s,"id"));return o===null?s.notFound():W(s,o,le)}),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 W(s,d,le)}),e.post("/api/jobs/:id/run",async s=>{let{runJobById:o}=await Promise.resolve().then(()=>(Es(),uw)),i=Po(t.dal,re(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():W(s,o,le)}),e.get("/api/projects/:name/workflows",s=>{let o=t.dal.findProjectByName(s.req.param("name"));return o===null?s.notFound():W(s,t.dal.listProjectWorkflows(o.id),CM)}),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 Sn(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{sr(u)}catch{return s.text("invalid condition",400)}let d=$M(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,m=t.dal.insertProjectWorkflow({project_id:o.id,workflow_id:c.id,condition:u,parameters_override:d,priority:f});return W(s,m,le)}),e.get("/api/projects/workflows/:id",s=>{let o=t.dal.getProjectWorkflow(re(s,"id"));return o===null?s.notFound():W(s,o,le)}),e.delete("/api/projects/workflows/:id",s=>t.dal.removeProjectWorkflow(re(s,"id"))?W(s,{removed:!0},le):s.notFound()),e.post("/api/projects/workflows/:id/enable",s=>{let o=t.dal.setProjectWorkflowEnabled(re(s,"id"),!0);return o===null?s.notFound():W(s,o,le)}),e.post("/api/projects/workflows/:id/disable",s=>{let o=t.dal.setProjectWorkflowEnabled(re(s,"id"),!1);return o===null?s.notFound():W(s,o,le)}),e.get("/api/projects/:name/issues",s=>{let o=t.dal.findProjectByName(s.req.param("name"));if(o===null)return s.notFound();let i=yy(s.req.query("status"),jM);if(typeof i=="string")return s.text(i,400);let a=yy(s.req.query("severity"),Iy);return typeof a=="string"?s.text(a,400):W(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")}:{}}),MM)}),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 Sn(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=AM(i.severity);if(typeof c=="object")return s.text(c.error,400);let u=RM(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 W(s,d,le)}),e.get("/api/issues/:id",s=>{let o=t.dal.getIssue(re(s,"id"));return o===null?s.notFound():W(s,o,le)}),e.post("/api/issues/:id/claim",async s=>{let o=re(s,"id"),i=t.dal.getIssue(o);if(i===null)return s.notFound();let a=await Sn(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):W(s,c,le)}),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 Sn(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):W(s,l,le)}),e.post("/api/issues/:id/close",async s=>{let o=t.dal.getIssue(re(s,"id"));if(o===null)return s.notFound();let i=await Sn(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 W(s,t.dal.closeIssue(re(s,"id"),a,typeof i.commit_hash=="string"?i.commit_hash:null),le)}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(re(s,"id"));if(o===null)return s.notFound();let i=await Sn(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 W(s,t.dal.reopenIssue(re(s,"id"),a),le)}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 W(s,{...o,owner:a,repo:l},le)}),e.get("/api/runs/:run_id/artifacts",s=>{let o=re(s,"run_id"),i=s.req.query("kind"),a=Ir(t.dal,o,i);return W(s,a,le)}),e.get("/api/runs/:run_id/artifacts/:kind",async s=>{let o=re(s,"run_id"),i=s.req.param("kind"),a=Ir(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):W(s,l,le);if(l.path!==null&&l.path!==void 0){if(c)try{let{readFileSync:u}=await import("node:fs"),d=NM(l.path);if(xM(d)){let h=u(l.path,"utf8");return s.body(h,200,{"Content-Type":d})}let f=u(l.path),m=f.buffer.slice(f.byteOffset,f.byteOffset+f.byteLength),p=gM(l.path);return s.body(m,200,{"Content-Type":d,"Content-Disposition":`attachment; filename="${p}"`})}catch(u){return s.text(`failed to read artifact path: ${u.message}`,500)}return W(s,l,le)}return W(s,l,le)}),e.get("/api/runs",s=>W(s,Yr(t.dal,{limit:Zu(s,"limit")??100}),UM)),e.get("/api/runs/:id",s=>{let o=vr(t.dal,re(s,"id"));return o===null?s.notFound():W(s,o,WM)}),e.get("/api/runs/:id/where",s=>{let o=zr(t.dal,re(s,"id"));return o===null?s.notFound():s.req.header("accept")?.includes("text/plain")?s.text(Uo(o)):s.json(o)}),e.get("/api/runs/:id/timeline",s=>{let o=Wo(t.dal,re(s,"id"));return o===null?s.notFound():s.req.header("accept")?.includes("text/plain")?s.text(Bo(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(re(s,"id"),o);return!i.resumed&&i.reason==="run_not_found"?s.notFound():i.resumed?(ua(t.daemon),W(s,i,Ey)):W(s,i,Ey,400)}),e.post("/api/interactive/:step_id/respond",async s=>{let o=re(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?(ua(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=>wy(s,t.dal,o=>W(s,o,qM))),e.get("/api/runs/:id/steps/:step_id/transcript",s=>{let o=Pp(t.dal,re(s,"id"),re(s,"step_id"));return o===null?s.notFound():vy(s)?s.html(`<pre>${S(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=>wy(s,t.dal,o=>{let i=zw(o);return W(s,i,a=>fe(["role","text"],a.map(l=>[S(l.role),S(l.text)])))})),e.get("/api/external-objects",s=>W(s,Fp(t.dal,{type:s.req.query("type")}),HM)),e.get("/api/external-signals",s=>W(s,Up(t.dal,{unhandled:s.req.query("unhandled")==="true"}),JM)),e.get("/api/attentions",s=>W(s,Qt(t.dal,{unacked:s.req.query("unacked")==="true"}),XM)),e.post("/api/attentions/:id/ack",s=>{let o=t.dal.acknowledgeAttention(re(s,"id"));return o===null?s.notFound():W(s,o,i=>`<p>acknowledged attention ${S(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=Fo(t.dal,l);return W(s,c,u=>`<h1>Escalations</h1>${fe(["attention_id","project","run","workflow","state","prompt"],u.map(d=>[S(d.attention_id),S(d.project),S(d.run_id),S(d.workflow_name),S(d.state_name),S((d.prompt??"").slice(0,120))]))}`)}),e.get("/api/escalations/:id",s=>{let o=wt(t.dal,re(s,"id"));return o===null?s.notFound():W(s,o,le)}),e.post("/api/escalations/:id/respond",async s=>{let o=re(s,"id"),i,a=!1;if((s.req.header("content-type")??"").includes("application/json"))try{let m=await s.req.json();typeof m.input=="string"&&(i=m.input),m.done===!0&&(a=!0)}catch{return s.text("invalid JSON body",400)}else{let m=await s.req.parseBody().catch(()=>({}));typeof m.input=="string"&&(i=m.input),(m.done==="true"||m.done===!0)&&(a=!0)}if(i===void 0)return s.text("missing input",400);let c=wt(t.dal,o);if(c===null)return s.notFound();let u=Qt(t.dal).find(m=>m.id===o);if(u===void 0)return s.notFound();if(u.kind==="workflow_escalation"){let m=t.dal.resumeEscalation(o,i);if(!m.resumed)return s.json({ok:!1,reason:m.reason},400);ua(t.daemon);let p=Qt(t.dal).find(h=>h.id===o);return s.json({ok:!0,attention_id:o,run_id:m.run.id,decision:i,session_status:"escalation_resumed",acknowledged_at:p?.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 ua(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=Cp(t.dal,{status:i,pr_url:o});return W(s,a,GM)}),e.get("/api/submitted-prs/:id",s=>{let o=re(s,"id"),i=Mp(t.dal,o);return i===null?s.notFound():W(s,i,VM)}),e.get("/api/sessions",s=>W(s,t.dal.latestSessionSizes(),by)),e.get("/api/sessions/:team_name/:alias/history",s=>{let o=Kn(s.req.param("team_name"));return W(s,t.dal.sessionSizeHistory(o,s.req.param("alias")),by)}),e.post("/api/sessions/:team_name/:alias/compact",async s=>{let o=Kn(s.req.param("team_name"));try{let i=await Ip(t.dal,o,s.req.param("alias"));return W(s,i,a=>Sy("compacted",a.row))}catch(i){if(i instanceof Vn)return s.text(i.message,409);throw i}}),e.post("/api/sessions/:team_name/:alias/refresh",async s=>{let o=Kn(s.req.param("team_name")),i=await lc(t.dal,o,s.req.param("alias"));return W(s,i,a=>Sy(`refreshed ${a.sessionid}`,a.row))}),e.get("/api/intake/state",s=>W(s,r,Ty)),e.post("/api/intake/scan",async s=>(r=await fn(t.dal),W(s,r,Ty))),e.get("/api/stats/run-throughput",s=>W(s,qp(t.dal),KM)),e.get("/api/daemon/state",s=>W(s,t.daemon?.state??null,YM)),e.post("/api/daemon/cycle",async s=>{if(t.daemon===void 0)return W(s,{disabled:!0},le);let o=await t.daemon.runCycle();return W(s,{state:t.daemon.state,result:o},le)}),e.get("/metrics/:project_id",s=>{let o=re(s,"project_id"),i=t.dal.getProject(o);if(i===null)return s.notFound();let a=hc(t.dal,o),l=_c(t.dal,{project_id:o});return s.html(Ae(`Metrics \u2014 ${i.name}`,zM(i.name,a,l)))}),e.get("/api/metrics/reviewer/:project_id",s=>{let o=re(s,"project_id");if(t.dal.getProject(o)===null)return s.notFound();let i=Zu(s,"since_days");return s.json(hc(t.dal,o,i))}),e.get("/api/metrics/tools/:project_id",s=>{let o=re(s,"project_id");if(t.dal.getProject(o)===null)return s.notFound();let i=Zu(s,"since_days");return s.json(_c(t.dal,{project_id:o,since_days:i}))}),e.post("/api/drift/:id/ack",s=>{let o=t.dal.acknowledgeDriftSignal(re(s,"id"));return o===null?s.notFound():s.json({id:o.id,acknowledged_at:o.acknowledged_at})}),e}function wy(t,e,r){let n=pc(e,re(t,"id"),re(t,"step_id"));return n===null?t.notFound():r(n)}function ua(t){t!==void 0&&t.runCycle().catch(()=>{})}function W(t,e,r,n=200){return vy(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 vy(t){let e=t.req.header("accept")??"";return e.includes("text/html")&&!e.includes("application/json")}function vM(){let t=process.env.LMCTL_WEBUI_DIST;if(t!==void 0)return ca(`${t}/index.html`)?Qu(t):null;let e="src/serve/webui-dist";if(ca(`${e}/index.html`))return e;let r="dist/serve/webui-dist";if(ca(`${r}/index.html`))return r;let n=bM(wM(TM(import.meta.url)),"webui-dist");return ca(`${n}/index.html`)?Qu(n):null}function Qu(t){if(!EM(t))return t;let e=SM(process.cwd(),t);return e.length===0?".":e}function IM(){return async(t,e)=>{await e(),t.header("Cache-Control","no-store")}}function re(t,e){return Number(t.req.param(e))}function Zu(t,e){let r=t.req.query(e);if(r===void 0)return;let n=Number(r);return Number.isInteger(n)&&n>0?n:void 0}function NM(t){switch(yM(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 xM(t){return!!(t.startsWith("text/")||t.startsWith("application/json")||t.startsWith("application/xml"))}async function Sn(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 $M(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 yy(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 AM(t){if(t!=null)return typeof t=="string"&&Iy.includes(t)?t:{error:`invalid severity: ${String(t)}`}}function RM(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 OM(t){return`<h1>Status</h1><div class="grid">
|
|
1643
|
+
`))),e.post("/login",async s=>{let o=await s.req.parseBody(),i=typeof o.token=="string"?o.token:"";return __(i)?(au(s,i),s.redirect("/",302)):s.html(Ae("Login","<p>Invalid token</p>"),401)}),e.post("/logout",s=>(g_(s),s.redirect("/login",302))),pw(e,{dal:t.dal}),cy(e,{dal:t.dal}),Aw(e,{dal:t.dal}),Bw(e,{terminalSessionManager:t.terminalSessionManager}),Vw(e,{persistentSessionManager:t.persistentSessionManager}),e.post("/api/teams/:team_name/refresh",async s=>{let o=Kn(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),m=f.filter(p=>p.state!=="idle");if(m.length>0)return{ok:!1,nonIdle:m.map(p=>({alias:p.alias,state:p.state}))};for(let p of f)t.dal.setMemberState(p.id,"in_chat","refreshing");return a=f.map(p=>({id:p.id,alias:p.alias})),{ok:!0}})();if(!c.ok){let f=c.nonIdle.map(m=>`${m.alias}:${m.state}`).join(", ");return s.text(`refresh refused: non-idle members: ${f}`,409)}let u=[],d=[];for(let f of a)try{await lc(t.dal,o,f.alias),t.dal.setMemberState(f.id,"idle",null),u.push(f.alias)}catch(m){let p=m instanceof Error?m.message:String(m);t.dal.setMemberState(f.id,"attention_needed",`refresh failed: ${p}`),d.push({alias:f.alias,error:p})}return B(s,{team:o,seeded:u,failed:d},f=>`<p>refreshed team ${S(f.team)}: seeded [${f.seeded.map(m=>S(m)).join(", ")}]${f.failed.length>0?` failed [${f.failed.map(m=>`${S(m.alias)}: ${S(m.error)}`).join(", ")}]`:""}</p>`)}),k_(e,{dal:t.dal}),A_(e,{dal:t.dal}),e.get("/api/status",s=>B(s,Co(t.dal),OM)),e.get("/api/projects",s=>B(s,Mo(t.dal),LM)),e.get("/api/teams",s=>B(s,Op(t.dal),DM)),e.get("/api/workflows",s=>B(s,Do(t.dal),PM)),e.get("/api/workflows/verify",s=>{let o=Zg();return s.req.header("accept")?.includes("text/plain")?s.text(ew(o)):s.json(o)}),e.get("/api/jobs",s=>B(s,Lp(t.dal,{status:s.req.query("status")}),FM)),e.post("/api/uploads",s=>_y(s,t.dal)),e.get("/api/jobs/:id",s=>{let o=Po(t.dal,re(s,"id"));return o===null?s.notFound():B(s,o,le)}),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 B(s,d,le)}),e.post("/api/jobs/:id/run",async s=>{let{runJobById:o}=await Promise.resolve().then(()=>(Es(),uw)),i=Po(t.dal,re(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():B(s,o,le)}),e.get("/api/projects/:name/workflows",s=>{let o=t.dal.findProjectByName(s.req.param("name"));return o===null?s.notFound():B(s,t.dal.listProjectWorkflows(o.id),CM)}),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 Sn(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{sr(u)}catch{return s.text("invalid condition",400)}let d=$M(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,m=t.dal.insertProjectWorkflow({project_id:o.id,workflow_id:c.id,condition:u,parameters_override:d,priority:f});return B(s,m,le)}),e.get("/api/projects/workflows/:id",s=>{let o=t.dal.getProjectWorkflow(re(s,"id"));return o===null?s.notFound():B(s,o,le)}),e.delete("/api/projects/workflows/:id",s=>t.dal.removeProjectWorkflow(re(s,"id"))?B(s,{removed:!0},le):s.notFound()),e.post("/api/projects/workflows/:id/enable",s=>{let o=t.dal.setProjectWorkflowEnabled(re(s,"id"),!0);return o===null?s.notFound():B(s,o,le)}),e.post("/api/projects/workflows/:id/disable",s=>{let o=t.dal.setProjectWorkflowEnabled(re(s,"id"),!1);return o===null?s.notFound():B(s,o,le)}),e.get("/api/projects/:name/issues",s=>{let o=t.dal.findProjectByName(s.req.param("name"));if(o===null)return s.notFound();let i=yy(s.req.query("status"),jM);if(typeof i=="string")return s.text(i,400);let a=yy(s.req.query("severity"),Iy);return typeof a=="string"?s.text(a,400):B(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")}:{}}),MM)}),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 Sn(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=AM(i.severity);if(typeof c=="object")return s.text(c.error,400);let u=RM(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 B(s,d,le)}),e.get("/api/issues/:id",s=>{let o=t.dal.getIssue(re(s,"id"));return o===null?s.notFound():B(s,o,le)}),e.post("/api/issues/:id/claim",async s=>{let o=re(s,"id"),i=t.dal.getIssue(o);if(i===null)return s.notFound();let a=await Sn(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):B(s,c,le)}),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 Sn(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):B(s,l,le)}),e.post("/api/issues/:id/close",async s=>{let o=t.dal.getIssue(re(s,"id"));if(o===null)return s.notFound();let i=await Sn(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 B(s,t.dal.closeIssue(re(s,"id"),a,typeof i.commit_hash=="string"?i.commit_hash:null),le)}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(re(s,"id"));if(o===null)return s.notFound();let i=await Sn(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 B(s,t.dal.reopenIssue(re(s,"id"),a),le)}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 B(s,{...o,owner:a,repo:l},le)}),e.get("/api/runs/:run_id/artifacts",s=>{let o=re(s,"run_id"),i=s.req.query("kind"),a=Ir(t.dal,o,i);return B(s,a,le)}),e.get("/api/runs/:run_id/artifacts/:kind",async s=>{let o=re(s,"run_id"),i=s.req.param("kind"),a=Ir(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):B(s,l,le);if(l.path!==null&&l.path!==void 0){if(c)try{let{readFileSync:u}=await import("node:fs"),d=NM(l.path);if(xM(d)){let h=u(l.path,"utf8");return s.body(h,200,{"Content-Type":d})}let f=u(l.path),m=f.buffer.slice(f.byteOffset,f.byteOffset+f.byteLength),p=gM(l.path);return s.body(m,200,{"Content-Type":d,"Content-Disposition":`attachment; filename="${p}"`})}catch(u){return s.text(`failed to read artifact path: ${u.message}`,500)}return B(s,l,le)}return B(s,l,le)}),e.get("/api/runs",s=>B(s,Yr(t.dal,{limit:Zu(s,"limit")??100}),UM)),e.get("/api/runs/:id",s=>{let o=vr(t.dal,re(s,"id"));return o===null?s.notFound():B(s,o,WM)}),e.get("/api/runs/:id/where",s=>{let o=zr(t.dal,re(s,"id"));return o===null?s.notFound():s.req.header("accept")?.includes("text/plain")?s.text(Uo(o)):s.json(o)}),e.get("/api/runs/:id/timeline",s=>{let o=Wo(t.dal,re(s,"id"));return o===null?s.notFound():s.req.header("accept")?.includes("text/plain")?s.text(Bo(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(re(s,"id"),o);return!i.resumed&&i.reason==="run_not_found"?s.notFound():i.resumed?(ua(t.daemon),B(s,i,Ey)):B(s,i,Ey,400)}),e.post("/api/interactive/:step_id/respond",async s=>{let o=re(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?(ua(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=>wy(s,t.dal,o=>B(s,o,qM))),e.get("/api/runs/:id/steps/:step_id/transcript",s=>{let o=Pp(t.dal,re(s,"id"),re(s,"step_id"));return o===null?s.notFound():vy(s)?s.html(`<pre>${S(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=>wy(s,t.dal,o=>{let i=zw(o);return B(s,i,a=>fe(["role","text"],a.map(l=>[S(l.role),S(l.text)])))})),e.get("/api/external-objects",s=>B(s,Fp(t.dal,{type:s.req.query("type")}),HM)),e.get("/api/external-signals",s=>B(s,Up(t.dal,{unhandled:s.req.query("unhandled")==="true"}),JM)),e.get("/api/attentions",s=>B(s,Qt(t.dal,{unacked:s.req.query("unacked")==="true"}),XM)),e.post("/api/attentions/:id/ack",s=>{let o=t.dal.acknowledgeAttention(re(s,"id"));return o===null?s.notFound():B(s,o,i=>`<p>acknowledged attention ${S(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=Fo(t.dal,l);return B(s,c,u=>`<h1>Escalations</h1>${fe(["attention_id","project","run","workflow","state","prompt"],u.map(d=>[S(d.attention_id),S(d.project),S(d.run_id),S(d.workflow_name),S(d.state_name),S((d.prompt??"").slice(0,120))]))}`)}),e.get("/api/escalations/:id",s=>{let o=wt(t.dal,re(s,"id"));return o===null?s.notFound():B(s,o,le)}),e.post("/api/escalations/:id/respond",async s=>{let o=re(s,"id"),i,a=!1;if((s.req.header("content-type")??"").includes("application/json"))try{let m=await s.req.json();typeof m.input=="string"&&(i=m.input),m.done===!0&&(a=!0)}catch{return s.text("invalid JSON body",400)}else{let m=await s.req.parseBody().catch(()=>({}));typeof m.input=="string"&&(i=m.input),(m.done==="true"||m.done===!0)&&(a=!0)}if(i===void 0)return s.text("missing input",400);let c=wt(t.dal,o);if(c===null)return s.notFound();let u=Qt(t.dal).find(m=>m.id===o);if(u===void 0)return s.notFound();if(u.kind==="workflow_escalation"){let m=t.dal.resumeEscalation(o,i);if(!m.resumed)return s.json({ok:!1,reason:m.reason},400);ua(t.daemon);let p=Qt(t.dal).find(h=>h.id===o);return s.json({ok:!0,attention_id:o,run_id:m.run.id,decision:i,session_status:"escalation_resumed",acknowledged_at:p?.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 ua(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=Cp(t.dal,{status:i,pr_url:o});return B(s,a,GM)}),e.get("/api/submitted-prs/:id",s=>{let o=re(s,"id"),i=Mp(t.dal,o);return i===null?s.notFound():B(s,i,VM)}),e.get("/api/sessions",s=>B(s,t.dal.latestSessionSizes(),by)),e.get("/api/sessions/:team_name/:alias/history",s=>{let o=Kn(s.req.param("team_name"));return B(s,t.dal.sessionSizeHistory(o,s.req.param("alias")),by)}),e.post("/api/sessions/:team_name/:alias/compact",async s=>{let o=Kn(s.req.param("team_name"));try{let i=await Ip(t.dal,o,s.req.param("alias"));return B(s,i,a=>Sy("compacted",a.row))}catch(i){if(i instanceof Vn)return s.text(i.message,409);throw i}}),e.post("/api/sessions/:team_name/:alias/refresh",async s=>{let o=Kn(s.req.param("team_name")),i=await lc(t.dal,o,s.req.param("alias"));return B(s,i,a=>Sy(`refreshed ${a.sessionid}`,a.row))}),e.get("/api/intake/state",s=>B(s,r,Ty)),e.post("/api/intake/scan",async s=>(r=await fn(t.dal),B(s,r,Ty))),e.get("/api/stats/run-throughput",s=>B(s,qp(t.dal),KM)),e.get("/api/daemon/state",s=>B(s,t.daemon?.state??null,YM)),e.post("/api/daemon/cycle",async s=>{if(t.daemon===void 0)return B(s,{disabled:!0},le);let o=await t.daemon.runCycle();return B(s,{state:t.daemon.state,result:o},le)}),e.get("/metrics/:project_id",s=>{let o=re(s,"project_id"),i=t.dal.getProject(o);if(i===null)return s.notFound();let a=hc(t.dal,o),l=_c(t.dal,{project_id:o});return s.html(Ae(`Metrics \u2014 ${i.name}`,zM(i.name,a,l)))}),e.get("/api/metrics/reviewer/:project_id",s=>{let o=re(s,"project_id");if(t.dal.getProject(o)===null)return s.notFound();let i=Zu(s,"since_days");return s.json(hc(t.dal,o,i))}),e.get("/api/metrics/tools/:project_id",s=>{let o=re(s,"project_id");if(t.dal.getProject(o)===null)return s.notFound();let i=Zu(s,"since_days");return s.json(_c(t.dal,{project_id:o,since_days:i}))}),e.post("/api/drift/:id/ack",s=>{let o=t.dal.acknowledgeDriftSignal(re(s,"id"));return o===null?s.notFound():s.json({id:o.id,acknowledged_at:o.acknowledged_at})}),e}function wy(t,e,r){let n=pc(e,re(t,"id"),re(t,"step_id"));return n===null?t.notFound():r(n)}function ua(t){t!==void 0&&t.runCycle().catch(()=>{})}function B(t,e,r,n=200){return vy(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 vy(t){let e=t.req.header("accept")??"";return e.includes("text/html")&&!e.includes("application/json")}function vM(){let t=process.env.LMCTL_WEBUI_DIST;if(t!==void 0)return ca(`${t}/index.html`)?Qu(t):null;let e="src/serve/webui-dist";if(ca(`${e}/index.html`))return e;let r="dist/serve/webui-dist";if(ca(`${r}/index.html`))return r;let n=bM(wM(TM(import.meta.url)),"webui-dist");return ca(`${n}/index.html`)?Qu(n):null}function Qu(t){if(!EM(t))return t;let e=SM(process.cwd(),t);return e.length===0?".":e}function IM(){return async(t,e)=>{await e(),t.header("Cache-Control","no-store")}}function re(t,e){return Number(t.req.param(e))}function Zu(t,e){let r=t.req.query(e);if(r===void 0)return;let n=Number(r);return Number.isInteger(n)&&n>0?n:void 0}function NM(t){switch(yM(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 xM(t){return!!(t.startsWith("text/")||t.startsWith("application/json")||t.startsWith("application/xml"))}async function Sn(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 $M(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 yy(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 AM(t){if(t!=null)return typeof t=="string"&&Iy.includes(t)?t:{error:`invalid severity: ${String(t)}`}}function RM(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 OM(t){return`<h1>Status</h1><div class="grid">
|
|
1644
1644
|
<div class="metric"><strong>${t.jobs.queued}</strong><br>queued jobs</div>
|
|
1645
1645
|
<div class="metric"><strong>${t.jobs.done}</strong><br>done jobs</div>
|
|
1646
1646
|
<div class="metric"><strong>${t.runs.active}</strong><br>active runs</div>
|
|
@@ -1693,7 +1693,7 @@ ${p.text}`,["approve","request_changes"],!0,s,e.writes_to_project_path===!0)));i
|
|
|
1693
1693
|
`);if(e[0]!=="---")throw new bt("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 bt(`malformed frontmatter line ${i+1}: ${JSON.stringify(a)} (expected "key: value" or "---")`);let c=l[1],u=l[2].trim();if(!SD.has(c))throw new bt(`unknown frontmatter key "${c}" \u2014 allowed keys: ${ha.join(", ")}`);r[c]=u}if(n===-1)throw new bt("frontmatter not closed (missing trailing `---` on its own line)");for(let i of ha)if(r[i]===void 0)throw new bt(`missing required frontmatter key "${i}" \u2014 required: ${ha.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 ha,SD,bt,mE=b(()=>{"use strict";ha=["title","description","members"],SD=new Set(ha),bt=class extends Error{constructor(e){super(e),this.name="FrontmatterError"}}});import{readFileSync as TD,writeFileSync as YK,renameSync as zK,existsSync as hE}from"node:fs";import{basename as kD,resolve as Tn,dirname as Ed}from"node:path";function ID(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 ND(t){return/^\s*_MEMBER_\s+\S/.test(t)}function xD(t){return/^\s*_SESSION_\s+\S/.test(t)}function $D(t){return/^\s*_CONNECT_(?:\s|$)/.test(t)}function jD(t){return/^\s*_SKILL_(?:\s|$)/.test(t)}function Sd(t){let e=kD(t);return e.endsWith(".lmctl")?e.slice(0,-6):e}function Re(t){let e=TD(t,"utf-8"),r=Ed(Tn(t)),n=Td(e,Sd(t),{baseDir:r,sourcePath:Tn(t)});for(let s of n.members)s.sessiondir&&!s.sessiondir.startsWith("/")&&(s.sessiondir=Tn(r,s.sessiondir));return n}function Td(t,e,r={}){let n=[],s=[],o=[],i=[];r.sourcePath,r.baseDir;let a=t;if(a.startsWith("#teamfile:")){let u=a.indexOf(`
|
|
1694
1694
|
`);a=u>=0?a.slice(u+1):""}let l=null;if(a.startsWith("---"))try{l=fE(a)}catch(u){if(u instanceof bt)i.push(`frontmatter: ${u.message}`);else throw u}let c=t.split(`
|
|
1695
1695
|
`);for(let u=0;u<c.length;u++){let d=c[u],f=u+1;if(xD(d))throw new Error(`line ${f}: _SESSION_ is the legacy prefix. Rename to _MEMBER_. (line: ${d.trim()})`);if($D(d)){s.push(f);continue}if(jD(d)){let g=d.replace(/^\s*_SKILL_\s*/,"").trim(),_=g.length===0?[]:g.split(/\s+/u);if(_.length!==1){i.push(`line ${f}: _SKILL_ requires exactly one https:// URL or local path: ${d.trim()}`);continue}let T=_[0];try{if(new URL(T).protocol!=="https:"){i.push(`line ${f}: _SKILL_ URL must use https:// or a local path: ${T}`);continue}}catch{if(/^[A-Za-z][A-Za-z0-9+.-]*:/u.test(T)&&!/^[A-Za-z]:[\\/]/u.test(T)){i.push(`line ${f}: _SKILL_ URL must use https:// or a local path: ${T}`);continue}}o.push(T);continue}if(!ND(d))continue;let m=ID(d);for(let g of Object.keys(m))if(!pE.includes(g))throw new Error(`line ${f}: unknown key "${g}" on _MEMBER_ line: ${d.trim()}
|
|
1696
|
-
allowed keys: ${pE.join(", ")}`);if(!m.provider&&!m.teamfile){i.push(`line ${f}: member line missing provider (or teamfile): ${d.trim()}`);continue}let h={alias:m.alias||`member${n.length+1}`,provider:m.provider||"",extra:{}};m.sessionid&&(h.session=m.sessionid),Object.prototype.hasOwnProperty.call(m,"sessiondir")&&(h.sessiondir=m.sessiondir),m.teamfile&&(h.teamfile=m.teamfile),m.model&&(h.model=m.model),m.effort&&(h.effort=m.effort),n.push(h)}return{name:e,members:n,deprecatedConnectLines:s,skillUrls:o,rawText:t,parseErrors:i,frontmatter:l}}function kd(t,e){let r=[];for(let o of t.parseErrors){let i=o.includes("_CONNECT_")?"connect":o.includes("_SKILL_")?"skill":"session";r.push({field:i,message:o})}let n=t.members.filter(o=>o.alias.toLowerCase()===bd.toLowerCase());n.length>1&&r.push({field:bd,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?Tn(e,o.teamfile):Tn(o.teamfile);if(!hE(a))r.push({field:o.alias,message:`Teamfile not found: ${a}`});else{let l=Re(a),c=St(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 vD.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 St(t){return t.members.find(e=>e.alias.toLowerCase()===bd.toLowerCase())}function vd(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=Tn(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),!hE(o))throw new Error(`Teamfile not found: ${o} (referenced by alias "${t.alias}")`);let a=Re(o),l=St(a);if(!l)throw new Error(`Team at ${o} has no lead session`);if(l.teamfile)return vd(l,Ed(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||Ed(o),alias:t.alias,resolvedFrom:o,model:l.model,effort:l.effort}}function _a(t,e){return t.members.find(r=>r.alias===e)??t.members.find(r=>r.alias.toLowerCase()===e.toLowerCase())}var bd,vD,pE,Ut=b(()=>{"use strict";mE();bd="Lead",vD=new Set(["claude","codex","opencode","gemini","copilot","qwen","agy","ClaudeMock"]);pE=["alias","provider","sessionid","sessiondir","teamfile","model","effort"]});import{existsSync as AD,realpathSync as RD}from"node:fs";import{dirname as OD}from"node:path";function Id(t){LD(t).catch(e=>{t.log?.(`[mailbox] prompt trigger failed: ${e instanceof Error?e.message:String(e)}`)})}async function LD(t){let e=t.payload.root_teamfile;try{e=RD(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 kn(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 kn(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=CD(e);if("error"in r)return await kn(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()-PD(t.env??process.env)).toISOString()});if(!s.acquired){let o=DD(r.alias,s.current);return await kn(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??Tr)({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 kn(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 kn(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 CD(t){if(!AD(t))return{error:`prompt root missing/unreadable: ${t}`};let e=Re(t);if(e.parseErrors.length>0)return{error:`prompt root parse error: ${e.parseErrors.join("; ")}`};let r=St(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??OD(t)}}async function kn(t,e){let r=wE(e.message),n=e.response===null?null:wE(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 wE(t){return t.length<=_E?{text:t,truncated:!1}:{text:t.slice(0,_E),truncated:!0}}function MD(t,e){return`${t} is servicing ${e.sender_alias} (${e.sender_teamfile}) since ${e.started_at}`}function DD(t,e){return e.sender_teamfile.startsWith("prompt:")?`${t} is busy servicing another prompt since ${e.started_at}`:MD(t,e)}function PD(t=process.env){let e=t.LMCTL_INFLIGHT_TTL_MS;if(e===void 0||e.trim()==="")return gE;let r=Number(e);return!Number.isFinite(r)||r<=0?gE:r}var _E,gE,yE=b(()=>{"use strict";Rt();Ut();_E=256*1024,gE=30*60*1e3});import{chmodSync as vE,existsSync as FD,mkdirSync as IE,readFileSync as Ea,writeFileSync as NE}from"node:fs";import{dirname as Nd,resolve as ga,join as xE}from"node:path";import{fileURLToPath as UD}from"node:url";import{homedir as $E}from"node:os";import{CognitoIdentityClient as WD,GetIdCommand as BD}from"@aws-sdk/client-cognito-identity";import{fromCognitoIdentity as EE}from"@aws-sdk/credential-provider-cognito-identity";import{GetObjectCommand as qD,ListObjectsV2Command as HD,PutObjectCommand as JD,S3Client as bE}from"@aws-sdk/client-s3";function Ns(t={}){let e=t.env??process.env,r=t.tfstatePath!==void 0?[t.tfstatePath]:YD(t.selfUrl),n={},s;for(let I of r)if(FD(I)){n=KD(I),s=I;break}let o=(...I)=>{for(let k of I)if(typeof k=="string"&&k!=="")return k},i=o(e.LMCTL_NEXT_IDENTITY_POOL_ID,n.LMCTL_NEXT_IDENTITY_POOL_ID)??XD,a=o(e.LMCTL_NEXT_COGNITO_USER_POOL_ID,n.LMCTL_NEXT_COGNITO_USER_POOL_ID)??GD,l=o(e.LMCTL_NEXT_MAILBOX_BUCKET,e.LMCTL_NEXT_POLICY_BUCKET,n.LMCTL_NEXT_MAILBOX_BUCKET,n.LMCTL_NEXT_POLICY_BUCKET)??VD,c=o(e.AWS_REGION,e.AWS_DEFAULT_REGION)??"us-east-1",u=o(e.LMCTL_NEXT_COGNITO_CLIENT_ID,n.LMCTL_NEXT_COGNITO_CLIENT_ID)??ba,d=[];i===void 0&&d.push("LMCTL_NEXT_IDENTITY_POOL_ID"),a===void 0&&d.push("LMCTL_NEXT_COGNITO_USER_POOL_ID"),l===void 0&&d.push("LMCTL_NEXT_MAILBOX_BUCKET");let f={missing:d,tfstateCandidatesChecked:r,...s!==void 0?{tfstatePathUsed:s}:{}};if(d.length>0)return f;let m=e.LMCTL_MAILBOX_POLL_MS,p=m!==void 0&&m.length>0?Number(m):void 0,h=ya(e.LMCTL_MAILBOX_READ_INTERVAL_SECONDS),g=ya(e.LMCTL_MAILBOX_HEARTBEAT_IDLE_SECONDS),_=ya(e.LMCTL_MAILBOX_BACKOFF_READ_INTERVAL_SECONDS),T=ya(e.LMCTL_MAILBOX_CHATLOG_POLL_SECONDS),E=o(e.LMCTL_MAILBOX_KEY),v=o(e.LMCTL_TOKEN_PATH);return f.config={identityPoolId:i,cognitoUserPoolId:a,cognitoClientId:u,region:c,mailboxBucket:l,...typeof p=="number"&&Number.isFinite(p)&&p>=100?{pollIntervalMs:p}:{},...h!==void 0?{readIntervalMs:h}:{},...g!==void 0?{heartbeatIdleMs:g}:{},..._!==void 0?{backoffReadIntervalMs:_}:{},...T!==void 0?{chatLogPollIntervalMs:T}:{},...E!==void 0?{mailboxKey:E}:{},...v!==void 0?{tokenPath:v}:{}},f}function KD(t){try{let e=Ea(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 YD(t){let e=Nd(UD(t??import.meta.url));return[ga(e,"..","..","..","..","infra","terraform","terraform.tfstate"),ga(e,"..","..","..","..","..","infra","terraform","terraform.tfstate"),ga(e,"..","..","..","infra","terraform","terraform.tfstate"),ga(e,"..","..","infra","terraform","terraform.tfstate")]}function ya(t){if(t===void 0||t==="")return;let e=Number(t);if(!(!Number.isFinite(e)||e<=0))return e*1e3}function zD(t){let e=ZD(t.intervalMs)??jE,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 m={kind:"daemon_event",event:"chat_log",ts:n(),entry:{id:f.id,root_teamfile:f.root_teamfile,sender_teamfile:f.sender_teamfile,sender_alias:f.sender_alias,receiver_teamfile:f.receiver_teamfile,receiver_alias:f.receiver_alias,message:f.message,response:f.response,status:f.status,created_at:f.created_at}};await t.publishDaemonEvent(m),s!==null&&s.save({cursor_key:s.key,last_pushed_id:f.id,updated_at:new Date(n()).toISOString()}),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 ZD(t){return typeof t=="number"&&Number.isFinite(t)&&t>0?t:void 0}async function AE(t){let e=t.tokenPath??xE($E(),".lmctl","cli-tokens.json"),r=TE(t.tokenPath);if(eE(r.cognito?.idToken)&&gd()!==null)try{await dE({region:t.region,clientId:t.cognitoClientId??ba,cliTokensPath:e}),r=TE(t.tokenPath),t.log?.("[mx-mailbox] refreshed IdToken from device-auth refresh token")}catch(A){let F=A instanceof Error?A.message:String(A);t.log?.(`[mx-mailbox] device-auth refresh failed: ${F}`)}if(r.cognito===void 0)throw new Error("agent_mailbox_not_logged_in: ~/.lmctl/cli-tokens.json has no cognito tokens; run `webcli login` or `lmctl device login` first");let n=r.cognito.idToken;if(typeof n!="string"||n==="")throw new Error("agent_mailbox_no_id_token: cli-tokens.json's cognito.idToken is empty; run `webcli login` or `lmctl device login` first");let s=`cognito-idp.${t.region}.amazonaws.com/${t.cognitoUserPoolId}`,o=r.cognito.identityId,i=!1;o===void 0||o===""?o=await kE({tokenPath:e,region:t.region,identityPoolId:t.identityPoolId,idpProvider:s,idToken:n,log:t.log}):(i=!0,t.log?.(`[mx-mailbox] using cached identityId from cli-tokens (skipping GetId) for ${o}`));let a=EE({identityId:o,logins:{[s]:n},clientConfig:{region:t.region}}),l=new bE({region:t.region,credentials:a}),c={ListObjectsV2Command:HD,GetObjectCommand:qD,PutObjectCommand:JD},u=ks(n),d=u??o,f=t.deviceId,m=wn({identityId:o,userId:u,deviceId:f,mailboxKey:t.mailboxKey}),p=t.cursorStore,h;if(p!==void 0){let A=p.loadMailboxCursor(d,m);if(A!==null)h=A.last_processed_seq??void 0,t.log?.(`[mx-mailbox] resumed seq cursor=${h??"(sentinel)"} for user_id=${d}`);else{let F=!1,z=0;for(;!F&&z<2;){z+=1;try{let N=Gi(m,"web"),x=0,R;do{let H=await l.send(new c.ListObjectsV2Command({Bucket:t.mailboxBucket,Prefix:N,MaxKeys:1e3,...R!==void 0?{ContinuationToken:R}:{}}));for(let U of H.Contents??[]){let L=Vi(U.Key??"",m,"web");L!==void 0&&L>x&&(x=L)}R=H.IsTruncated===!0?H.NextContinuationToken:void 0}while(R!==void 0);h=x,t.log?.(`[mx-mailbox] cold start: seeded seq cursor=${x} for user_id=${d}`),F=!0}catch(N){let x=N instanceof Error?N.message:String(N);if(i&&z===1&&tP(N)){t.log?.(`[mx-mailbox] cached identityId rejected by cognito (${x}); clearing + refreshing`),eP(e),i=!1,o=await kE({tokenPath:e,region:t.region,identityPoolId:t.identityPoolId,idpProvider:s,idToken:n,log:t.log}),a=EE({identityId:o,logins:{[s]:n},clientConfig:{region:t.region}}),l=new bE({region:t.region,credentials:a}),m=wn({identityId:o,userId:u,deviceId:f,mailboxKey:t.mailboxKey});continue}t.log?.(`[mx-mailbox] cold start seq probe failed: ${x}`);break}}p.saveMailboxCursor({user_id:d,mailbox_key:m,last_processed_version_id:null,last_processed_seq:h??null,last_processed_at:new Date().toISOString()})}}let g=null,_=t.terminalSessionManager,T=t.persistentSessionManager,E=t.promptTriggerStore,v=new fa,I=new Or({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:A=>v.record(A),onMessage:async A=>{if(_!==void 0&&cd(A.payload)){_.onInbound(A.payload);return}if(T!==void 0&&ud(A.payload)){await T.onInbound(A.payload);return}if(!fd(A.payload)){if(E!==void 0&&md(A.payload)){Id({store:E,payload:A.payload,log:t.log});return}g!==null&&await g.handleIncoming(A.payload,A)}},...p!==void 0?{onCursorAdvance:A=>{p.saveMailboxCursor({user_id:d,mailbox_key:m,last_processed_version_id:null,last_processed_seq:A,last_processed_at:new Date().toISOString()})}}:{},...h!==void 0?{cursor:h}:{},...t.pollIntervalMs!==void 0?{pollIntervalMs:t.pollIntervalMs}:{},...t.readIntervalMs!==void 0?{readIntervalMs:t.readIntervalMs}:{},...t.heartbeatIdleMs!==void 0?{heartbeatIdleMs:t.heartbeatIdleMs}:{},...t.backoffReadIntervalMs!==void 0?{backoffReadIntervalMs:t.backoffReadIntervalMs}:{}});g=new Ts({client:I,...t.log!==void 0?{log:t.log}:{}}),_!==void 0&&_.setPublish(async A=>I.putMessage({conversation_id:`terminal:${A.session_id}`,payload:A})),T!==void 0&&T.setPublish(async A=>I.putMessage({conversation_id:`provider:${A.session_id}`,payload:A}));let k=A=>I.putMessage({conversation_id:dd,payload:A});I.start();let P=t.chatLogTailStore===void 0?void 0:zD({store:t.chatLogTailStore,publishDaemonEvent:k,cursorKey:m,intervalMs:t.chatLogPollIntervalMs??t.readIntervalMs??t.pollIntervalMs??jE,log:t.log});t.log?.(`[mx-mailbox] agent polling ${m} (bucket=${t.mailboxBucket})`);let q=t.deviceId??o,O=`${d}/usage/`,G;return G=t.usageStore===void 0?void 0:Jy({meter:v,store:t.usageStore,userId:d,deviceId:q,ceilingUsd:t.usageQuotaUsd??1/0,onQuotaExceeded:({period:A,costUsd:F,ceilingUsd:z})=>{t.log?.(`[usage] month ${A} cost $${F.toFixed(4)} >= ceiling $${z} \u2014 blocking mailbox`),I.stop().catch(()=>{}),G?.stop()},publishOwnRollup:async(A,F)=>{await l.send(new c.PutObjectCommand({Bucket:t.mailboxBucket,Key:`${O}${q}-${A}.json`,Body:JSON.stringify({...F,updated_at:new Date().toISOString()}),ContentType:"application/json"}))},readUserTotal:async A=>{let F={put:0,get:0,list:0},z;do{let N=await l.send(new c.ListObjectsV2Command({Bucket:t.mailboxBucket,Prefix:O,MaxKeys:1e3,...z!==void 0?{ContinuationToken:z}:{}}));for(let x of N.Contents??[]){let R=x.Key??"";if(R.endsWith(`-${A}.json`))try{let H=await l.send(new c.GetObjectCommand({Bucket:t.mailboxBucket,Key:R}));if(H.Body===void 0)continue;let U=JSON.parse(await H.Body.transformToString("utf-8"));F.put+=U.put??0,F.get+=U.get??0,F.list+=U.list??0}catch{}}z=N.IsTruncated===!0?N.NextContinuationToken:void 0}while(z!==void 0);return F},intervalMs:t.usageFlushIntervalMs??36e5,...t.log!==void 0?{log:t.log}:{}}),{identityId:o,mailbox:I,fetchClient:g,publishDaemonEvent:k,async stop(){P?.stop(),G!==void 0&&(await G.flushNow().catch(()=>{}),G.stop()),await g.stop().catch(()=>{}),await I.stop().catch(()=>{})}}}async function RE(t){let e=t.s3!==void 0&&t.commands!==void 0?{s3:t.s3,commands:t.commands}:da(t.rootDir),r=wn({identityId:Is,userId:Is,deviceId:SE}),n=null,s=t.terminalSessionManager,o=t.persistentSessionManager,i=t.promptTriggerStore,a=new Or({bucket:"local",identityId:Is,userId:Is,deviceId:SE,s3:e.s3,commands:e.commands,selfRole:"agent",onMessage:async c=>{if(s!==void 0&&cd(c.payload)){s.onInbound(c.payload);return}if(o!==void 0&&ud(c.payload)){await o.onInbound(c.payload);return}if(!fd(c.payload)){if(i!==void 0&&md(c.payload)){Id({store:i,payload:c.payload,log:t.log});return}n!==null&&await n.handleIncoming(c.payload,c)}},pollIntervalMs:t.pollIntervalMs??wa,readIntervalMs:t.readIntervalMs??wa,heartbeatIdleMs:t.heartbeatIdleMs??wa,backoffReadIntervalMs:t.backoffReadIntervalMs??wa});n=new Ts({client:a,...t.log!==void 0?{log:t.log}:{}}),s!==void 0&&s.setPublish(async c=>a.putMessage({conversation_id:`terminal:${c.session_id}`,payload:c})),o!==void 0&&o.setPublish(async c=>a.putMessage({conversation_id:`provider:${c.session_id}`,payload:c}));let l=c=>a.putMessage({conversation_id:dd,payload:c});return a.start(),t.log?.(`[local-webui] agent polling ${r} (local-fs ${t.rootDir})`),{identityId:Is,mailbox:a,fetchClient:n,publishDaemonEvent:l,async stop(){await n.stop().catch(()=>{}),await a.stop().catch(()=>{})}}}function TE(t){let e=t??xE($E(),".lmctl","cli-tokens.json");try{let r=Ea(e,"utf8");return JSON.parse(r)}catch{return{}}}function QD(t,e){if(e===void 0||e==="")return;let r={};try{let s=Ea(t,"utf8");r=JSON.parse(s)}catch{}if(r.cognito===void 0)return;let n={...r,cognito:{...r.cognito,identityId:e}};IE(Nd(t),{recursive:!0,mode:448}),NE(t,JSON.stringify(n,null,2));try{vE(t,384)}catch{}}function eP(t){let e={};try{let n=Ea(t,"utf8");e=JSON.parse(n)}catch{return}if(e.cognito===void 0)return;let r={...e,cognito:{...e.cognito}};delete r.cognito.identityId,IE(Nd(t),{recursive:!0,mode:448}),NE(t,JSON.stringify(r,null,2));try{vE(t,384)}catch{}}async function kE(t){t.log?.("[mx-mailbox] cli-tokens has no identityId; calling GetId");let r=await new WD({region:t.region}).send(new BD({IdentityPoolId:t.identityPoolId,Logins:{[t.idpProvider]:t.idToken}}));if(r.IdentityId===void 0||r.IdentityId==="")throw new Error("cognito_getid_no_identity_id");try{QD(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 tP(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 jE,wa,ba,XD,GD,VD,Is,SE,xd=b(()=>{"use strict";Zi();sd();ad();Xy();Vy();Ky();Yy();zy();pd();Ki();hd();yd();yE();jE=3e3,wa=1e3,ba="79u5jhkk46qofog661c9i0bdcs",XD="us-east-1:69636ff0-e008-4cbc-853d-180e5526a198",GD="us-east-1_4iUdFggDn",VD="lmctl-next-preview-mailbox-254332045686";Is="local",SE="local"});import{spawn as Rd}from"node:child_process";import{createInterface as OE}from"node:readline";var $d,jd,Ad,LE,CE=b(()=>{"use strict";fo();je();$d=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=Rd(e.command,e.args,{cwd:e.cwd??process.cwd(),env:e.env??process.env,stdio:["pipe","pipe","pipe"]});if(this.child=n,this.rl=OE({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+`
|
|
1696
|
+
allowed keys: ${pE.join(", ")}`);if(!m.provider&&!m.teamfile){i.push(`line ${f}: member line missing provider (or teamfile): ${d.trim()}`);continue}let h={alias:m.alias||`member${n.length+1}`,provider:m.provider||"",extra:{}};m.sessionid&&(h.session=m.sessionid),Object.prototype.hasOwnProperty.call(m,"sessiondir")&&(h.sessiondir=m.sessiondir),m.teamfile&&(h.teamfile=m.teamfile),m.model&&(h.model=m.model),m.effort&&(h.effort=m.effort),n.push(h)}return{name:e,members:n,deprecatedConnectLines:s,skillUrls:o,rawText:t,parseErrors:i,frontmatter:l}}function kd(t,e){let r=[];for(let o of t.parseErrors){let i=o.includes("_CONNECT_")?"connect":o.includes("_SKILL_")?"skill":"session";r.push({field:i,message:o})}let n=t.members.filter(o=>o.alias.toLowerCase()===bd.toLowerCase());n.length>1&&r.push({field:bd,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?Tn(e,o.teamfile):Tn(o.teamfile);if(!hE(a))r.push({field:o.alias,message:`Teamfile not found: ${a}`});else{let l=Re(a),c=St(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 vD.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 St(t){return t.members.find(e=>e.alias.toLowerCase()===bd.toLowerCase())}function vd(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=Tn(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),!hE(o))throw new Error(`Teamfile not found: ${o} (referenced by alias "${t.alias}")`);let a=Re(o),l=St(a);if(!l)throw new Error(`Team at ${o} has no lead session`);if(l.teamfile)return vd(l,Ed(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||Ed(o),alias:t.alias,resolvedFrom:o,model:l.model,effort:l.effort}}function _a(t,e){return t.members.find(r=>r.alias===e)??t.members.find(r=>r.alias.toLowerCase()===e.toLowerCase())}var bd,vD,pE,Ut=b(()=>{"use strict";mE();bd="Lead",vD=new Set(["claude","codex","opencode","gemini","copilot","qwen","agy","ClaudeMock"]);pE=["alias","provider","sessionid","sessiondir","teamfile","model","effort"]});import{existsSync as AD,realpathSync as RD}from"node:fs";import{dirname as OD}from"node:path";function Id(t){LD(t).catch(e=>{t.log?.(`[mailbox] prompt trigger failed: ${e instanceof Error?e.message:String(e)}`)})}async function LD(t){let e=t.payload.root_teamfile;try{e=RD(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 kn(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 kn(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=CD(e);if("error"in r)return await kn(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()-PD(t.env??process.env)).toISOString()});if(!s.acquired){let o=DD(r.alias,s.current);return await kn(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??Tr)({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 kn(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 kn(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 CD(t){if(!AD(t))return{error:`prompt root missing/unreadable: ${t}`};let e=Re(t);if(e.parseErrors.length>0)return{error:`prompt root parse error: ${e.parseErrors.join("; ")}`};let r=St(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??OD(t)}}async function kn(t,e){let r=wE(e.message),n=e.response===null?null:wE(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 wE(t){return t.length<=_E?{text:t,truncated:!1}:{text:t.slice(0,_E),truncated:!0}}function MD(t,e){return`${t} is servicing ${e.sender_alias} (${e.sender_teamfile}) since ${e.started_at}`}function DD(t,e){return e.sender_teamfile.startsWith("prompt:")?`${t} is busy servicing another prompt since ${e.started_at}`:MD(t,e)}function PD(t=process.env){let e=t.LMCTL_INFLIGHT_TTL_MS;if(e===void 0||e.trim()==="")return gE;let r=Number(e);return!Number.isFinite(r)||r<=0?gE:r}var _E,gE,yE=b(()=>{"use strict";Rt();Ut();_E=256*1024,gE=30*60*1e3});import{chmodSync as vE,existsSync as FD,mkdirSync as IE,readFileSync as Ea,writeFileSync as NE}from"node:fs";import{dirname as Nd,resolve as ga,join as xE}from"node:path";import{fileURLToPath as UD}from"node:url";import{homedir as $E}from"node:os";import{CognitoIdentityClient as WD,GetIdCommand as BD}from"@aws-sdk/client-cognito-identity";import{fromCognitoIdentity as EE}from"@aws-sdk/credential-provider-cognito-identity";import{GetObjectCommand as qD,ListObjectsV2Command as HD,PutObjectCommand as JD,S3Client as bE}from"@aws-sdk/client-s3";function Ns(t={}){let e=t.env??process.env,r=t.tfstatePath!==void 0?[t.tfstatePath]:YD(t.selfUrl),n={},s;for(let $ of r)if(FD($)){n=KD($),s=$;break}let o=(...$)=>{for(let N of $)if(typeof N=="string"&&N!=="")return N},i=o(e.LMCTL_NEXT_IDENTITY_POOL_ID,n.LMCTL_NEXT_IDENTITY_POOL_ID)??XD,a=o(e.LMCTL_NEXT_COGNITO_USER_POOL_ID,n.LMCTL_NEXT_COGNITO_USER_POOL_ID)??GD,l=o(e.LMCTL_NEXT_MAILBOX_BUCKET,e.LMCTL_NEXT_POLICY_BUCKET,n.LMCTL_NEXT_MAILBOX_BUCKET,n.LMCTL_NEXT_POLICY_BUCKET)??VD,c=o(e.AWS_REGION,e.AWS_DEFAULT_REGION)??"us-east-1",u=o(e.LMCTL_NEXT_COGNITO_CLIENT_ID,n.LMCTL_NEXT_COGNITO_CLIENT_ID)??ba,d=[];i===void 0&&d.push("LMCTL_NEXT_IDENTITY_POOL_ID"),a===void 0&&d.push("LMCTL_NEXT_COGNITO_USER_POOL_ID"),l===void 0&&d.push("LMCTL_NEXT_MAILBOX_BUCKET");let f={missing:d,tfstateCandidatesChecked:r,...s!==void 0?{tfstatePathUsed:s}:{}};if(d.length>0)return f;let m=e.LMCTL_MAILBOX_POLL_MS,p=m!==void 0&&m.length>0?Number(m):void 0,h=ya(e.LMCTL_MAILBOX_READ_INTERVAL_SECONDS),g=ya(e.LMCTL_MAILBOX_HEARTBEAT_IDLE_SECONDS),_=ya(e.LMCTL_MAILBOX_BACKOFF_READ_INTERVAL_SECONDS),T=ya(e.LMCTL_MAILBOX_CHATLOG_POLL_SECONDS),E=o(e.LMCTL_MAILBOX_KEY),k=o(e.LMCTL_TOKEN_PATH);return f.config={identityPoolId:i,cognitoUserPoolId:a,cognitoClientId:u,region:c,mailboxBucket:l,...typeof p=="number"&&Number.isFinite(p)&&p>=100?{pollIntervalMs:p}:{},...h!==void 0?{readIntervalMs:h}:{},...g!==void 0?{heartbeatIdleMs:g}:{},..._!==void 0?{backoffReadIntervalMs:_}:{},...T!==void 0?{chatLogPollIntervalMs:T}:{},...E!==void 0?{mailboxKey:E}:{},...k!==void 0?{tokenPath:k}:{}},f}function KD(t){try{let e=Ea(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 YD(t){let e=Nd(UD(t??import.meta.url));return[ga(e,"..","..","..","..","infra","terraform","terraform.tfstate"),ga(e,"..","..","..","..","..","infra","terraform","terraform.tfstate"),ga(e,"..","..","..","infra","terraform","terraform.tfstate"),ga(e,"..","..","infra","terraform","terraform.tfstate")]}function ya(t){if(t===void 0||t==="")return;let e=Number(t);if(!(!Number.isFinite(e)||e<=0))return e*1e3}function zD(t){let e=ZD(t.intervalMs)??jE,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 m={kind:"daemon_event",event:"chat_log",ts:n(),entry:{id:f.id,root_teamfile:f.root_teamfile,sender_teamfile:f.sender_teamfile,sender_alias:f.sender_alias,receiver_teamfile:f.receiver_teamfile,receiver_alias:f.receiver_alias,message:f.message,response:f.response,status:f.status,created_at:f.created_at}};await t.publishDaemonEvent(m),s!==null&&s.save({cursor_key:s.key,last_pushed_id:f.id,updated_at:new Date(n()).toISOString()}),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 ZD(t){return typeof t=="number"&&Number.isFinite(t)&&t>0?t:void 0}async function AE(t){let e=t.tokenPath??xE($E(),".lmctl","cli-tokens.json"),r=TE(t.tokenPath);if(eE(r.cognito?.idToken)&&gd()!==null)try{await dE({region:t.region,clientId:t.cognitoClientId??ba,cliTokensPath:e}),r=TE(t.tokenPath),t.log?.("[mx-mailbox] refreshed IdToken from device-auth refresh token")}catch(R){let U=R instanceof Error?R.message:String(R);t.log?.(`[mx-mailbox] device-auth refresh failed: ${U}`)}if(r.cognito===void 0)throw new Error("agent_mailbox_not_logged_in: ~/.lmctl/cli-tokens.json has no cognito tokens; run `webcli login` or `lmctl device login` first");let n=r.cognito.idToken;if(typeof n!="string"||n==="")throw new Error("agent_mailbox_no_id_token: cli-tokens.json's cognito.idToken is empty; run `webcli login` or `lmctl device login` first");let s=`cognito-idp.${t.region}.amazonaws.com/${t.cognitoUserPoolId}`,o=r.cognito.identityId,i=!1;o===void 0||o===""?o=await kE({tokenPath:e,region:t.region,identityPoolId:t.identityPoolId,idpProvider:s,idToken:n,log:t.log}):(i=!0,t.log?.(`[mx-mailbox] using cached identityId from cli-tokens (skipping GetId) for ${o}`));let a=EE({identityId:o,logins:{[s]:n},clientConfig:{region:t.region}}),l=new bE({region:t.region,credentials:a}),c={ListObjectsV2Command:HD,GetObjectCommand:qD,PutObjectCommand:JD},u=ks(n),d=u??o,f=t.deviceId,m=wn({identityId:o,userId:u,deviceId:f,mailboxKey:t.mailboxKey}),p=t.cursorStore,h;if(p!==void 0){let R=p.loadMailboxCursor(d,m);if(R!==null)h=R.last_processed_seq??void 0,t.log?.(`[mx-mailbox] resumed seq cursor=${h??"(sentinel)"} for user_id=${d}`);else{let U=!1,z=0;for(;!U&&z<2;){z+=1;try{let v=Gi(m,"web"),I=0,O;do{let J=await l.send(new c.ListObjectsV2Command({Bucket:t.mailboxBucket,Prefix:v,MaxKeys:1e3,...O!==void 0?{ContinuationToken:O}:{}}));for(let W of J.Contents??[]){let L=Vi(W.Key??"",m,"web");L!==void 0&&L>I&&(I=L)}O=J.IsTruncated===!0?J.NextContinuationToken:void 0}while(O!==void 0);h=I,t.log?.(`[mx-mailbox] cold start: seeded seq cursor=${I} for user_id=${d}`),U=!0}catch(v){let I=v instanceof Error?v.message:String(v);if(i&&z===1&&tP(v)){t.log?.(`[mx-mailbox] cached identityId rejected by cognito (${I}); clearing + refreshing`),eP(e),i=!1,o=await kE({tokenPath:e,region:t.region,identityPoolId:t.identityPoolId,idpProvider:s,idToken:n,log:t.log}),a=EE({identityId:o,logins:{[s]:n},clientConfig:{region:t.region}}),l=new bE({region:t.region,credentials:a}),m=wn({identityId:o,userId:u,deviceId:f,mailboxKey:t.mailboxKey});continue}t.log?.(`[mx-mailbox] cold start seq probe failed: ${I}`);break}}p.saveMailboxCursor({user_id:d,mailbox_key:m,last_processed_version_id:null,last_processed_seq:h??null,last_processed_at:new Date().toISOString()})}}let g=null,_=t.terminalSessionManager,T=t.persistentSessionManager,E=t.promptTriggerStore,k=new fa,$=new Or({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:R=>k.record(R),onMessage:async R=>{if(_!==void 0&&cd(R.payload)){_.onInbound(R.payload);return}if(T!==void 0&&ud(R.payload)){await T.onInbound(R.payload);return}if(!fd(R.payload)){if(E!==void 0&&md(R.payload)){Id({store:E,payload:R.payload,log:t.log});return}g!==null&&await g.handleIncoming(R.payload,R)}},...p!==void 0?{onCursorAdvance:R=>{p.saveMailboxCursor({user_id:d,mailbox_key:m,last_processed_version_id:null,last_processed_seq:R,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 Ts({client:$,...t.log!==void 0?{log:t.log}:{}}),_!==void 0&&_.setPublish(async R=>$.putMessage({conversation_id:`terminal:${R.session_id}`,payload:R})),T!==void 0&&T.setPublish(async R=>$.putMessage({conversation_id:`provider:${R.session_id}`,payload:R}));let N=R=>$.putMessage({conversation_id:dd,payload:R});$.start();let A=t.chatLogTailStore===void 0?void 0:zD({store:t.chatLogTailStore,publishDaemonEvent:N,cursorKey:m,intervalMs:t.chatLogPollIntervalMs??t.readIntervalMs??t.pollIntervalMs??jE,log:t.log});t.log?.(`[mx-mailbox] agent polling ${m} (bucket=${t.mailboxBucket})`);let D=t.deviceId??o,C=`${d}/usage/`,H;return H=t.usageStore===void 0?void 0:Jy({meter:k,store:t.usageStore,userId:d,deviceId:D,ceilingUsd:t.usageQuotaUsd??1/0,onQuotaExceeded:({period:R,costUsd:U,ceilingUsd:z})=>{t.log?.(`[usage] month ${R} cost $${U.toFixed(4)} >= ceiling $${z} \u2014 blocking mailbox`),$.stop().catch(()=>{}),H?.stop()},publishOwnRollup:async(R,U)=>{await l.send(new c.PutObjectCommand({Bucket:t.mailboxBucket,Key:`${C}${D}-${R}.json`,Body:JSON.stringify({...U,updated_at:new Date().toISOString()}),ContentType:"application/json"}))},readUserTotal:async R=>{let U={put:0,get:0,list:0},z;do{let v=await l.send(new c.ListObjectsV2Command({Bucket:t.mailboxBucket,Prefix:C,MaxKeys:1e3,...z!==void 0?{ContinuationToken:z}:{}}));for(let I of v.Contents??[]){let O=I.Key??"";if(O.endsWith(`-${R}.json`))try{let J=await l.send(new c.GetObjectCommand({Bucket:t.mailboxBucket,Key:O}));if(J.Body===void 0)continue;let W=JSON.parse(await J.Body.transformToString("utf-8"));U.put+=W.put??0,U.get+=W.get??0,U.list+=W.list??0}catch{}}z=v.IsTruncated===!0?v.NextContinuationToken:void 0}while(z!==void 0);return U},intervalMs:t.usageFlushIntervalMs??36e5,...t.log!==void 0?{log:t.log}:{}}),{identityId:o,mailbox:$,fetchClient:g,publishDaemonEvent:N,async stop(){A?.stop(),H!==void 0&&(await H.flushNow().catch(()=>{}),H.stop()),await g.stop().catch(()=>{}),await $.stop().catch(()=>{})}}}async function RE(t){let e=t.s3!==void 0&&t.commands!==void 0?{s3:t.s3,commands:t.commands}:da(t.rootDir),r=wn({identityId:Is,userId:Is,deviceId:SE}),n=null,s=t.terminalSessionManager,o=t.persistentSessionManager,i=t.promptTriggerStore,a=new Or({bucket:"local",identityId:Is,userId:Is,deviceId:SE,s3:e.s3,commands:e.commands,selfRole:"agent",onMessage:async c=>{if(s!==void 0&&cd(c.payload)){s.onInbound(c.payload);return}if(o!==void 0&&ud(c.payload)){await o.onInbound(c.payload);return}if(!fd(c.payload)){if(i!==void 0&&md(c.payload)){Id({store:i,payload:c.payload,log:t.log});return}n!==null&&await n.handleIncoming(c.payload,c)}},pollIntervalMs:t.pollIntervalMs??wa,readIntervalMs:t.readIntervalMs??wa,heartbeatIdleMs:t.heartbeatIdleMs??wa,backoffReadIntervalMs:t.backoffReadIntervalMs??wa});n=new Ts({client:a,...t.log!==void 0?{log:t.log}:{}}),s!==void 0&&s.setPublish(async c=>a.putMessage({conversation_id:`terminal:${c.session_id}`,payload:c})),o!==void 0&&o.setPublish(async c=>a.putMessage({conversation_id:`provider:${c.session_id}`,payload:c}));let l=c=>a.putMessage({conversation_id:dd,payload:c});return a.start(),t.log?.(`[local-webui] agent polling ${r} (local-fs ${t.rootDir})`),{identityId:Is,mailbox:a,fetchClient:n,publishDaemonEvent:l,async stop(){await n.stop().catch(()=>{}),await a.stop().catch(()=>{})}}}function TE(t){let e=t??xE($E(),".lmctl","cli-tokens.json");try{let r=Ea(e,"utf8");return JSON.parse(r)}catch{return{}}}function QD(t,e){if(e===void 0||e==="")return;let r={};try{let s=Ea(t,"utf8");r=JSON.parse(s)}catch{}if(r.cognito===void 0)return;let n={...r,cognito:{...r.cognito,identityId:e}};IE(Nd(t),{recursive:!0,mode:448}),NE(t,JSON.stringify(n,null,2));try{vE(t,384)}catch{}}function eP(t){let e={};try{let n=Ea(t,"utf8");e=JSON.parse(n)}catch{return}if(e.cognito===void 0)return;let r={...e,cognito:{...e.cognito}};delete r.cognito.identityId,IE(Nd(t),{recursive:!0,mode:448}),NE(t,JSON.stringify(r,null,2));try{vE(t,384)}catch{}}async function kE(t){t.log?.("[mx-mailbox] cli-tokens has no identityId; calling GetId");let r=await new WD({region:t.region}).send(new BD({IdentityPoolId:t.identityPoolId,Logins:{[t.idpProvider]:t.idToken}}));if(r.IdentityId===void 0||r.IdentityId==="")throw new Error("cognito_getid_no_identity_id");try{QD(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 tP(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 jE,wa,ba,XD,GD,VD,Is,SE,xd=b(()=>{"use strict";Zi();sd();ad();Xy();Vy();Ky();Yy();zy();pd();Ki();hd();yd();yE();jE=3e3,wa=1e3,ba="79u5jhkk46qofog661c9i0bdcs",XD="us-east-1:69636ff0-e008-4cbc-853d-180e5526a198",GD="us-east-1_4iUdFggDn",VD="lmctl-next-preview-mailbox-254332045686";Is="local",SE="local"});import{spawn as Rd}from"node:child_process";import{createInterface as OE}from"node:readline";var $d,jd,Ad,LE,CE=b(()=>{"use strict";fo();je();$d=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=Rd(e.command,e.args,{cwd:e.cwd??process.cwd(),env:e.env??process.env,stdio:["pipe","pipe","pipe"]});if(this.child=n,this.rl=OE({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+`
|
|
1697
1697
|
`)}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+`
|
|
1698
1698
|
`)}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}}}},jd=class{child;ctx;buffer="";sessionIdSeen;closed=!1;async start(e,r){this.ctx=r;let n=Rd(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(`
|
|
1699
1699
|
`);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+`
|
|
@@ -1703,12 +1703,12 @@ ${p.text}`,["approve","request_changes"],!0,s,e.writes_to_project_path===!0)));i
|
|
|
1703
1703
|
`)}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}})}}},LE=t=>{switch(t){case"codex":return new $d;case"claude":case"qwen":return new jd;case"gemini":case"copilot":case"opencode":return new Ad;default:throw new Error(`no_persistent_adapter_for_provider: ${t}`)}}});import{randomUUID as rP}from"node:crypto";import{existsSync as L8,mkdirSync as nP,readFileSync as sP,writeFileSync as oP}from"node:fs";import{homedir as iP}from"node:os";import{dirname as aP,join as lP}from"node:path";function Sa(){return process.env.LMCTL_DEVICE_FILE??lP(iP(),".lmctl","device.json")}function Lr(t=Sa()){let e=process.env.LMCTL_DEVICE_ID;if(e!==void 0&&e!=="")return{device_id:e,created_at:"env"};try{let r=JSON.parse(sP(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 Od(t=Sa()){let e=Lr(t);if(e!==null&&e.created_at!=="env")return e;let r={device_id:rP(),created_at:new Date().toISOString()};return nP(aP(t),{recursive:!0}),oP(t,`${JSON.stringify(r,null,2)}
|
|
1704
1704
|
`,{encoding:"utf8",mode:384}),r}var Ld=b(()=>{"use strict"});import*as ME from"node:child_process";function uP(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 Cd(t,e={}){let r=e.spawnSync===void 0&&process.env[dP]==="1",n=e.spawnSync??ME.spawnSync,s=new Set,o=[];for(let i of t){if(s.has(i))continue;s.add(i);let a=Ta[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=uP(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 DE(t){if(t.binary==="<unknown>")return`unknown provider "${t.provider}" \u2014 no binary mapping (allowed: ${Object.keys(Ta).join(", ")})`;let e=cP[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 Ta,cP,dP,PE=b(()=>{"use strict";Ta={claude:"claude",codex:"codex",copilot:"copilot",gemini:"gemini",opencode:"opencode",qwen:"qwen",agy:"agy"},cP={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",agy:"https://antigravity.google"};dP="LMCTL_SKIP_BINARY_CHECK"});var VE={};ce(VE,{ProviderBinaryPreflightError:()=>ka,__setProviderBinaryCheckForTest:()=>EP,bootstrapAgentRestMailbox:()=>WE,publishRegisteredWorkflowsOnStart:()=>UE,resolveLocalMailboxDir:()=>XE,resolveLocalWebuiDir:()=>JE,resolveServeConfig:()=>BE,runProviderBinaryPreflight:()=>HE,runServe:()=>_P,validateServeArgs:()=>GE});import{randomBytes as fP}from"node:crypto";import{existsSync as mP}from"node:fs";import{homedir as pP}from"node:os";import{isAbsolute as FE,resolve as Md}from"node:path";async function _P(t,e={stdout:process.stdout,stderr:process.stderr}){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(hP),0;let r=GE(t,process.env);if(typeof r=="string")return e.stderr.write(`error: ${r}
|
|
1705
1705
|
`),2;try{HE(e)}catch(E){return 1}let n=pe({path:ue()}),s={portCli:bP(t)},o;try{o=BE({dal:n,cli:s,env:process.env,parsed:r,io:e})}catch(E){return n.close(),e.stderr.write(`error: ${E instanceof Error?E.message:String(E)}
|
|
1706
|
-
`),2}process.env.LMCTL_API_URL=o.apiUrl,process.env.LMCTL_API_TOKEN=o.apiToken,process.env.LMCTL_API_PORT=String(o.port),Cy(n);let i;if(r.localWebui!==void 0){let E=JE(r.localWebui.dir,process.env);if(E===null)return e.stderr.write("error: --webui requires a local SPA build directory: pass `lmctl serve --webui <dir>` or set LMCTL_LOCAL_WEBUI_DIR to a directory containing index.html\n"),n.close(),2;let
|
|
1706
|
+
`),2}process.env.LMCTL_API_URL=o.apiUrl,process.env.LMCTL_API_TOKEN=o.apiToken,process.env.LMCTL_API_PORT=String(o.port),Cy(n);let i;if(r.localWebui!==void 0){let E=JE(r.localWebui.dir,process.env);if(E===null)return e.stderr.write("error: --webui requires a local SPA build directory: pass `lmctl serve --webui <dir>` or set LMCTL_LOCAL_WEBUI_DIR to a directory containing index.html\n"),n.close(),2;let k=XE(process.env),{s3:$,commands:N}=da(k);i={webuiDir:E,rootDir:k,s3:$,commands:N},e.stdout.write(`local webui: serving SPA from ${E}; mailbox store ${k}
|
|
1707
1707
|
`)}let a=r.noDaemon?void 0:Oy({dal:n,intervalMs:Ss()}),l=i!==void 0?{missing:[],tfstateCandidatesChecked:[]}:Ns({env:process.env});l.missing.length>0&&e.stderr.write(`[lmctl-next-agent] mailbox transport not configured: missing ${l.missing.join(", ")}; running without cloud sync`+(l.tfstatePathUsed===void 0?` (no terraform.tfstate found; checked ${l.tfstateCandidatesChecked.length} candidate path${l.tfstateCandidatesChecked.length===1?"":"s"})`:` (terraform.tfstate at ${l.tfstatePathUsed} did not supply the missing fields)`)+`
|
|
1708
1708
|
`);let c=await yP({log:E=>e.stderr.write(`${E}
|
|
1709
1709
|
`)}),u=new na({adapterFactory:LE,publish:async()=>{throw new Error("persistent_publish_not_wired: mailbox runtime has not bound the publish hook yet")},log:E=>e.stderr.write(`${E}
|
|
1710
1710
|
`)}),d=Lr()?.device_id,f=ky({dal:n,daemon:a,...l.config!==void 0?{webuiRuntimeConfig:gP(l.config,d)}:{},...c!==void 0?{terminalSessionManager:c}:{},persistentSessionManager:u,...i!==void 0?{localWebui:{webuiDir:i.webuiDir,localMailbox:{s3:i.s3,commands:i.commands}}}:{}}),m=process.env.LMCTL_USAGE_QUOTA_USD,p=m!==void 0&&m!==""?Number(m):NaN,h=Number.isFinite(p)&&p>0?p:void 0,g=await WE({dal:n,app:f,io:e,mailbox:l.config===void 0?void 0:{...l.config,cursorStore:n,chatLogTailStore:n,promptTriggerStore:n,usageStore:n,...h!==void 0?{usageQuotaUsd:h}:{},...d!==void 0?{deviceId:d}:{}},...i!==void 0?{localMailbox:{rootDir:i.rootDir,s3:i.s3,commands:i.commands,promptTriggerStore:n}}:{},...c!==void 0?{terminalSessionManager:c}:{},persistentSessionManager:u});await UE({dal:n,mailbox:g.mailbox,io:e});let{serve:_}=await import("@hono/node-server"),T=_({fetch:f.fetch,port:o.port,hostname:r.bind});return e.stdout.write(`listening on ${r.bind}:${o.port}
|
|
1711
|
-
`),await new Promise(E=>{let
|
|
1711
|
+
`),await new Promise(E=>{let k=()=>{(async()=>(a!==void 0&&await a.stop(),T.close(),await g.stop(),c!==void 0&&await c.stop(),await u.stop(),n.close(),E()))()};process.once("SIGTERM",k),process.once("SIGINT",k)}),0}function gP(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 UE(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)}
|
|
1712
1712
|
`)}}async function WE(t){let e;if(t.mailbox!==void 0||t.localMailbox!==void 0)try{e=t.localMailbox!==void 0?await RE({...t.localMailbox,log:r=>t.io?.stderr.write(`${r}
|
|
1713
1713
|
`),...t.terminalSessionManager!==void 0?{terminalSessionManager:t.terminalSessionManager}:{},...t.persistentSessionManager!==void 0?{persistentSessionManager:t.persistentSessionManager}:{}}):await AE({...t.mailbox,log:r=>t.io?.stderr.write(`${r}
|
|
1714
1714
|
`),...t.terminalSessionManager!==void 0?{terminalSessionManager:t.terminalSessionManager}:{},...t.persistentSessionManager!==void 0?{persistentSessionManager:t.persistentSessionManager}:{}}),e.fetchClient.onRequest(f_({app:t.app,log:r=>t.io?.stderr.write(`${r}
|
|
@@ -1729,7 +1729,7 @@ services. Help exits before any port binding or daemon startup.
|
|
|
1729
1729
|
local identity. Mailbox store defaults to
|
|
1730
1730
|
~/.lmctl/local-mailbox/ ($LMCTL_LOCAL_MAILBOX_DIR overrides).
|
|
1731
1731
|
`;ka=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}},qE=Cd});var YE={};ce(YE,{runIntake:()=>kP});async function kP(t,e){let[r,...n]=t;return r==="--help"||r==="-h"||r==="help"?(e.stdout.write(TP),0):r==="scan"?vP(n,e):r==="config"?IP(n,e):(e.stderr.write(`usage: lmctl intake <scan|config> ...
|
|
1732
|
-
`),1)}async function vP(t,e){let r=
|
|
1732
|
+
`),1)}async function vP(t,e){let r=F(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 G(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 nu({dal:s,project:o});return q(e,{project_id:o.id,project_name:o.name,...i}),0}return q(e,await fn(s)),0})}async function IP(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=F(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 G(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 q(e,d),0})}var TP,zE=b(()=>{"use strict";vi();$e();TP=`usage: lmctl intake <scan|config> ...
|
|
1733
1733
|
|
|
1734
1734
|
Scan configured project GitHub issues into lmctl, or update per-project
|
|
1735
1735
|
intake settings such as enabled state, labels, and issue state filters.
|
|
@@ -1743,7 +1743,7 @@ intake settings such as enabled state, labels, and issue state filters.
|
|
|
1743
1743
|
`),t.length===0?2:0;let r=GP(t);if(typeof r=="string")return e.stderr.write(`error: ${r}
|
|
1744
1744
|
${wb}
|
|
1745
1745
|
`),2;if(r.runFlag!==void 0){let f=Number.parseInt(r.runFlag,10);return!Number.isFinite(f)||f<=0||String(f)!==r.runFlag?(e.stderr.write(`error: invalid --run "${r.runFlag}" (expected a positive integer run id)
|
|
1746
|
-
`),2):await
|
|
1746
|
+
`),2):await G(e,async m=>{let p=m.getRun(f);if(p===null)return e.stderr.write(`error: run ${f}: not found
|
|
1747
1747
|
`),1;if(p.terminal_state!==null&&p.terminal_state.length>0)return w(e,`run ${f}: already terminal (${p.terminal_state}); chat --run cannot resume a terminated run`);let h=sa(m,f);if(h===null)return e.stderr.write(`error: run ${f}: no pending operator-answerable attention (chat --run only resumes paused runs)
|
|
1748
1748
|
`),1;if(h.kind==="workflow_escalation"){if(r.done)return e.stderr.write(`error: --done is not valid for workflow_escalation (the decision itself is terminal)
|
|
1749
1749
|
`),2;let g=m.resumeEscalation(h.attention_id,r.prompt);return g.resumed===!0?(e.stdout.write(`run ${f}: escalation resumed (decision: ${r.prompt})
|
|
@@ -1755,8 +1755,8 @@ ${wb}
|
|
|
1755
1755
|
`),1})}let n=ur(HP,{target:r.target,alias:r.alias,flags:{session:r.sessionFlag,provider:r.providerFlag}});if(n.mode==="error")return e.stderr.write(`error: ${n.message}
|
|
1756
1756
|
`),2;if(n.mode==="managed")return e.stderr.write(`error: chat managed mode requires --run <id>
|
|
1757
1757
|
`),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)
|
|
1758
|
-
`),2;let f=n.alias;try{let m=await
|
|
1759
|
-
`),s={provider:m.provider,sessionId:m.sessionid,cwd:m.sessiondir,alias:m.alias,isLead:m.isLead,...m.model!==void 0?{model:m.model}:{},...m.effort!==void 0?{effort:m.effort}:{}},oi(e,m.isLead,m.alias,m.provider,m.sessiondir);try{ii(e,Re(n.teamfile),n.teamfile)}catch{}if(o={root_teamfile:g,sender_teamfile:h.teamfile,sender_alias:h.alias,receiver_teamfile:p,receiver_alias:m.alias,policy:_},r.fromFlag!==void 0&&h.teamfile!==p){let E=await
|
|
1758
|
+
`),2;let f=n.alias;try{let m=await G(e,E=>Wt(n.teamfile,f,E)),p=m.teamfile,h=await G(e,E=>VP(r.fromFlag,p,E)),g=await KP(e,{explicitRoot:r.rootFlag,sender:h,receiverTeamfile:p,operatorOrigin:r.fromFlag===void 0}),_=r.fromFlag===void 0?null:await YP(e,{rootTeamfile:g,sender:h,receiverTeamfile:p,receiverAlias:m.alias});_!==null&&!_.allowed&&e.stderr.write(`warning: out-of-policy chat send: ${_.reason}
|
|
1759
|
+
`),s={provider:m.provider,sessionId:m.sessionid,cwd:m.sessiondir,alias:m.alias,isLead:m.isLead,...m.model!==void 0?{model:m.model}:{},...m.effort!==void 0?{effort:m.effort}:{}},oi(e,m.isLead,m.alias,m.provider,m.sessiondir);try{ii(e,Re(n.teamfile),n.teamfile)}catch{}if(o={root_teamfile:g,sender_teamfile:h.teamfile,sender_alias:h.alias,receiver_teamfile:p,receiver_alias:m.alias,policy:_},r.fromFlag!==void 0&&h.teamfile!==p){let E=await G(e,k=>db(k,{root:g,sender:h,receiverTeamfile:p,receiverAlias:m.alias,now:new Date}));if(E.stop){let k=mb(E.chain);return await $a(e,{...o,message:r.prompt,response:null,status:"error",error_detail:k}),e.stderr.write(`${k}
|
|
1760
1760
|
`),1}}let T=await QP(e,{receiver_teamfile:p,receiver_alias:m.alias,sender_teamfile:h.teamfile,sender_alias:h.alias,force:r.force===!0});if(!T.acquired){let E=n1(m.alias,T.current);return await $a(e,{...o,message:r.prompt,response:null,status:"error",error_detail:E}),e.stderr.write(`error: ${E}
|
|
1761
1761
|
`),1}i=T.lease}catch(m){let p=m instanceof Error?m.message:String(m);return e.stderr.write(`error: ${p}
|
|
1762
1762
|
`),m instanceof ge,1}}else{if(r.force===!0)return e.stderr.write(`error: --force is only valid for AI-team chat
|
|
@@ -1766,8 +1766,8 @@ ${wb}
|
|
|
1766
1766
|
`):e.stdout.write(`${m.text}${m.text.endsWith(`
|
|
1767
1767
|
`)?"":`
|
|
1768
1768
|
`}`),m.status==="stalled"?1:0}catch(f){let m=f instanceof Error?f.message:String(f);return o!==null&&await $a(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: ${m}`:m}),e.stderr.write(`error: ${m}
|
|
1769
|
-
`),1}finally{i!==null&&await r1(e,i)}}function XP(t,e){return t.slice(-e)}function GP(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 T=Eb(_);if(typeof T=="string")return T;n=T;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,m;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>"';m=e[0]}else if(e.length===2)d=e[0],m=e[1];else if(e.length===3)d=e[0],f=e[1],m=e[2];else return`too many positionals (${e.length}); expected at most <teamfile> <alias> <prompt>`;if(u)return"--done requires --run";let p={prompt:m,permissionMode:r};return d!==void 0&&(p.target=d),f!==void 0&&(p.alias=f),n!==void 0&&(p.idleTimeoutMs=n),s!==void 0&&(p.sessionFlag=s),o!==void 0&&(p.providerFlag=o),i!==void 0&&(p.fromFlag=i),a!==void 0&&(p.rootFlag=a),l&&(p.force=!0),p}function VP(t,e,r){if(t===void 0)return{teamfile:e,alias:"operator"};let n=js(t);if(n===null)throw new ge("--from must be <teamfile.lmctl>:<alias>");let s=Cr(n.teamfile),o=$s(s,r);if(o.parseErrors.length>0)throw new ge(`--from ${n.teamfile}: ${o.parseErrors.join("; ")}`);let i=_a(o,n.alias);if(i===void 0)throw new ge(`--from alias "${n.alias}" not found in ${n.teamfile}`);return{teamfile:s,alias:i.alias}}async function KP(t,e){return e.explicitRoot!==void 0?Cr(e.explicitRoot):e.operatorOrigin?e.receiverTeamfile:await
|
|
1770
|
-
`)}}function n1(t,e){return`${t} is servicing ${e.sender_alias} (${e.sender_teamfile}) since ${e.started_at}`}async function $a(t,e){let r=yb(e.message),n=e.response===null?null:yb(e.response);try{await
|
|
1769
|
+
`),1}finally{i!==null&&await r1(e,i)}}function XP(t,e){return t.slice(-e)}function GP(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 T=Eb(_);if(typeof T=="string")return T;n=T;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,m;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>"';m=e[0]}else if(e.length===2)d=e[0],m=e[1];else if(e.length===3)d=e[0],f=e[1],m=e[2];else return`too many positionals (${e.length}); expected at most <teamfile> <alias> <prompt>`;if(u)return"--done requires --run";let p={prompt:m,permissionMode:r};return d!==void 0&&(p.target=d),f!==void 0&&(p.alias=f),n!==void 0&&(p.idleTimeoutMs=n),s!==void 0&&(p.sessionFlag=s),o!==void 0&&(p.providerFlag=o),i!==void 0&&(p.fromFlag=i),a!==void 0&&(p.rootFlag=a),l&&(p.force=!0),p}function VP(t,e,r){if(t===void 0)return{teamfile:e,alias:"operator"};let n=js(t);if(n===null)throw new ge("--from must be <teamfile.lmctl>:<alias>");let s=Cr(n.teamfile),o=$s(s,r);if(o.parseErrors.length>0)throw new ge(`--from ${n.teamfile}: ${o.parseErrors.join("; ")}`);let i=_a(o,n.alias);if(i===void 0)throw new ge(`--from alias "${n.alias}" not found in ${n.teamfile}`);return{teamfile:s,alias:i.alias}}async function KP(t,e){return e.explicitRoot!==void 0?Cr(e.explicitRoot):e.operatorOrigin?e.receiverTeamfile:await G(t,r=>fb(r,{sender:e.sender,now:new Date})??e.receiverTeamfile)}async function YP(t,e){return await G(t,r=>ab({rootTeamfile:e.rootTeamfile,fromTeamfile:e.sender.teamfile,fromAlias:e.sender.alias,toTeamfile:e.receiverTeamfile,toAlias:e.receiverAlias,registry:zP(r,e.sender.teamfile,e.receiverTeamfile)}))}function zP(t,e,r){return{teams:[e,r].map(s=>ZP(s,t))}}function ZP(t,e){let r=$s(t,e),n=St(r);return{teamfile:t,aliases:r.members.map(s=>s.alias),leadAlias:n?.alias??null}}async function QP(t,e){let r=new Date().toISOString(),n=new Date(Date.now()-Na()).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 G(t,o=>{let i=Se(),a=i?o.getAgentInflight(e.receiver_teamfile,e.receiver_alias):null,l=o.tryAcquireAgentInflight(s,{stale_before:n,force:e.force});if(l.acquired){if(i){let c=a===null?null:e.force?"force":a.started_at<n?"stale":null;ot(JSON.stringify({event:"inflight_acquire",receiver:{teamfile:e.receiver_teamfile,alias:e.receiver_alias},sender:{teamfile:e.sender_teamfile,alias:e.sender_alias},result:c===null?"acquired":"reclaimed",...c===null?{}:{reclaim_reason:c,holder:xa(a)}}))}return{acquired:!0,lease:l.current??s}}if(!l.acquired&&e1(l.current)){let c=o.tryAcquireAgentInflight(s,{stale_before:n,reclaim_observed:{sender_teamfile:l.current.sender_teamfile,sender_alias:l.current.sender_alias,started_at:l.current.started_at,holder_pid:l.current.holder_pid}});return c.acquired?(i&&ot(JSON.stringify({event:"inflight_acquire",receiver:{teamfile:e.receiver_teamfile,alias:e.receiver_alias},sender:{teamfile:e.sender_teamfile,alias:e.sender_alias},result:"reclaimed",reclaim_reason:l.current.holder_pid===null?"null-holder":"dead-pid",holder:xa(l.current)})),{acquired:!0,lease:c.current??s}):(i&&ot(JSON.stringify({event:"inflight_acquire",receiver:{teamfile:e.receiver_teamfile,alias:e.receiver_alias},sender:{teamfile:e.sender_teamfile,alias:e.sender_alias},result:"rejected",holder:xa(c.current)})),{acquired:!1,current:c.current})}return i&&ot(JSON.stringify({event:"inflight_acquire",receiver:{teamfile:e.receiver_teamfile,alias:e.receiver_alias},sender:{teamfile:e.sender_teamfile,alias:e.sender_alias},result:"rejected",holder:xa(l.current)})),{acquired:!1,current:l.current}})}function xa(t){return t===null?null:{sender_teamfile:t.sender_teamfile,sender_alias:t.sender_alias,holder_pid:t.holder_pid,started_at:t.started_at}}function e1(t){return t.holder_pid===null?!0:!t1(t.holder_pid)}function t1(t){if(!Number.isInteger(t)||t<=0)return!1;try{return process.kill(t,0),!0}catch(e){return(e!==null&&typeof e=="object"&&"code"in e?e.code:void 0)!=="ESRCH"}}async function r1(t,e){try{await G(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)}
|
|
1770
|
+
`)}}function n1(t,e){return`${t} is servicing ${e.sender_alias} (${e.sender_teamfile}) since ${e.started_at}`}async function $a(t,e){let r=yb(e.message),n=e.response===null?null:yb(e.response);try{await G(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)}
|
|
1771
1771
|
`)}}function yb(t){return t.length<=gb?{text:t,truncated:!1}:{text:t.slice(0,gb),truncated:!0}}function Eb(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 s1(t,e,r){r.kind==="tool_use"?t.stderr.write(`[${e}] tool_use ${r.tool??"tool"}${r.summary?`: ${r.summary}`:""}
|
|
1772
1772
|
`):r.kind==="tool_result"?t.stderr.write(`[${e}] tool_result${r.status?` ${r.status}`:""}${r.summary?`: ${r.summary}`:""}
|
|
1773
1773
|
`):r.kind==="api_retry"&&t.stderr.write(`[${e}] api_retry${r.summary?`: ${r.summary}`:""}
|
|
@@ -1840,7 +1840,7 @@ local config, then uses stdin/stdout for JSON-RPC frames.
|
|
|
1840
1840
|
AND payload LIKE ?
|
|
1841
1841
|
ORDER BY id DESC
|
|
1842
1842
|
LIMIT 1
|
|
1843
|
-
`).get(s,o)??null}function Rb(t,e){return new Date(t.getTime()-e*60*1e3)}function I1(t,e){return new Date(t.getTime()-e*60*60*1e3)}function Ob(t,e){return new Date(t.getTime()-e*24*60*60*1e3)}function N1(t,e){return t.length<=e?t:`${t.slice(0,e-1)}\u2026`}var Os,Lb=b(()=>{"use strict";jb();Os={stale_run_minutes:30,old_attention_days:7,old_issue_days:14,stuck_job_minutes:60,dedupe_window_hours:24}});var Mb={};ce(Mb,{renderSummary:()=>Cb,runMonitor:()=>$1});async function $1(t,e){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(x1),0;let r=
|
|
1843
|
+
`).get(s,o)??null}function Rb(t,e){return new Date(t.getTime()-e*60*1e3)}function I1(t,e){return new Date(t.getTime()-e*60*60*1e3)}function Ob(t,e){return new Date(t.getTime()-e*24*60*60*1e3)}function N1(t,e){return t.length<=e?t:`${t.slice(0,e-1)}\u2026`}var Os,Lb=b(()=>{"use strict";jb();Os={stale_run_minutes:30,old_attention_days:7,old_issue_days:14,stuck_job_minutes:60,dedupe_window_hours:24}});var Mb={};ce(Mb,{renderSummary:()=>Cb,runMonitor:()=>$1});async function $1(t,e){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(x1),0;let r=F(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=M(r,"--json"),s=M(r,"--quiet");try{return await G(e,o=>{let i=Ab(o);return n?q(e,i):s||e.stdout.write(`${Cb(i.findings)}
|
|
1844
1844
|
`),0})}catch(o){return me(e,o)}}function Cb(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} ${j1(o,i)}`)}return`monitor: ${e.length} findings (${n.join(", ")})`}function j1(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 x1,Db=b(()=>{"use strict";$e();Lb();x1=`usage: lmctl monitor [--json] [--quiet]
|
|
1845
1845
|
|
|
1846
1846
|
Scan the DB for stale runs, stuck jobs, overdue attentions, and overdue
|
|
@@ -1870,21 +1870,21 @@ addressing. The id is stored in ~/.lmctl/device.json by default.
|
|
|
1870
1870
|
'lmctl device login' authenticates this machine's 'lmctl serve' daemon to the
|
|
1871
1871
|
cloud mailbox using your user-id (Cognito sub) and an access key (refresh
|
|
1872
1872
|
token). The access key is stored in ~/.lmctl/device-auth.json (chmod 600).
|
|
1873
|
-
`});var Wb={};ce(Wb,{runTeam:()=>Y1});import{join as V1}from"node:path";async function Y1(t,e){let[r,...n]=t;if(r==="--help"||r==="-h"||r==="help")return e.stdout.write(K1),0;try{return await
|
|
1873
|
+
`});var Wb={};ce(Wb,{runTeam:()=>Y1});import{join as V1}from"node:path";async function Y1(t,e){let[r,...n]=t;if(r==="--help"||r==="-h"||r==="help")return e.stdout.write(K1),0;try{return await G(e,async s=>{switch(r){case"create":return Z1(n,e,s);case"list":return Q1(n,e,s);case"show":return eF(n,e,s);case"add-member":return tF(n,e,s);case"seed":return Ub(n,e,s,!1);case"refresh":return Ub(n,e,s,!0);case"companion":return nF(n,e,s);case"list-roots":return z1(n,e,s);default:return w(e,"usage: lmctl team <create|list|show|add-member|seed|refresh|companion|list-roots>")}})}catch(s){return me(e,s)}}function z1(t,e,r){let n=F(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 M(n,"--json")?q(e,s):e.stdout.write(s.map(o=>`${o.name??"(unnamed)"} ${o.teamfile_path} ${o.last_seeded_at??""}`).join(`
|
|
1874
1874
|
`)+(s.length>0?`
|
|
1875
1875
|
`:"")),0}function Z1(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}
|
|
1876
|
-
`),0}function Q1(t,e,r){let n=
|
|
1876
|
+
`),0}function Q1(t,e,r){let n=F(t,[]);if(n.error!==void 0)return w(e,n.error);let s=r.listTeams();return M(n,"--json")?q(e,s):e.stdout.write(`${s.map(o=>`${o.id} ${o.name}`).join(`
|
|
1877
1877
|
`)}${s.length>0?`
|
|
1878
|
-
`:""}`),0}function eF(t,e,r){let n=
|
|
1878
|
+
`:""}`),0}function eF(t,e,r){let n=F(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(M(n,"--json"))q(e,{team:o,members:i});else{e.stdout.write(`team ${o.name}
|
|
1879
1879
|
`);for(let a of i)e.stdout.write(`- ${a.alias} ${Ie(a)} ${a.sessionid??"(unseeded)"}
|
|
1880
|
-
`)}return 0}function tF(t,e,r){let n=
|
|
1881
|
-
`),0}async function Ub(t,e,r,n){let s=
|
|
1880
|
+
`)}return 0}function tF(t,e,r){let n=F(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")??V1(pr(),"sessions",o.name,i)});return M(n,"--json")?q(e,l):e.stdout.write(`added member ${l.alias} to ${o.name}
|
|
1881
|
+
`),0}async function Ub(t,e,r,n){let s=F(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=rF(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(m=>m.team_id===i.id)){if(c.has(f.workflow_name))continue;c.add(f.workflow_name);let m=r.getWorkflowByName(f.workflow_name);if(m===null)continue;let p=Qg(f.workflow_name,m.definition);if(p.status==="FAIL")return w(e,`cannot seed team \`${i.name}\`: workflow \`${f.workflow_name}\` failed verify-at-seed \u2014 ${p.note}. Fix the workflow and retry; NO members were seeded (no side-effects).`)}for(let f of r.listProjects().filter(m=>m.team_id===i.id))Go(f,r),Ko(f);let u=[],d=!1;for(let f of l){let m=await Kr({member:f,dal:r}),p=r.updateTeamMemberSession(f.id,m.sessionid);if(p!==null){let h=p.role_prompt??"",g=h.length>0?`${h}
|
|
1882
1882
|
|
|
1883
1883
|
${Qr}`:Qr;r.setMemberPromptSnapshot(f.id,g),u.push(p);let _=en(Ie(p),m.sessionid);_!==null&&e.stderr.write(`[seeded ${p.alias}] customize/compact in its native TUI:
|
|
1884
1884
|
${_}
|
|
1885
1885
|
`);try{await ui({dal:r,member:p,stderr:e.stderr})}catch(T){d=!0,e.stderr.write(`error: ${T instanceof Error?T.message:String(T)}
|
|
1886
|
-
`)}}}return
|
|
1887
|
-
`),d?1:0}function rF(t,e,r){return t.filter(n=>e!==void 0&&n.alias!==e?!1:r||n.sessionid===null)}function nF(t,e,r){let n=
|
|
1886
|
+
`)}}}return M(s,"--json")?q(e,u):e.stdout.write(`seeded ${u.length} member(s)
|
|
1887
|
+
`),d?1:0}function rF(t,e,r){return t.filter(n=>e!==void 0&&n.alias!==e?!1:r||n.sessionid===null)}function nF(t,e,r){let n=F(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)
|
|
1888
1888
|
`),0}var K1,Bb=b(()=>{"use strict";Ve();$o();Qn();Ec();Pe();tn();Pc();Bi();$e();bc();K1=`usage: lmctl team <create|list|show|add-member|seed|refresh|companion|list-roots>
|
|
1889
1889
|
|
|
1890
1890
|
Manage DB-backed teams, members, and provider session lifecycle. Use seed or
|
|
@@ -1893,7 +1893,7 @@ refresh to create/update native provider sessions for team members.
|
|
|
1893
1893
|
Root team registry:
|
|
1894
1894
|
list-roots [--json] List .lmctl root teams registered by lmctl seed.
|
|
1895
1895
|
`});var Kb={};ce(Kb,{applyMaxBytes:()=>Aa,renderMessage:()=>Gb,runTail:()=>cF});async function cF(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(`${lF}
|
|
1896
|
-
`),0;let r=
|
|
1896
|
+
`),0;let r=F(t,["--lines","--max-bytes","--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?oF:Number.parseInt(n,10);if(!Number.isFinite(s)||s<1)return w(e,`invalid --lines "${n}" (expected a positive integer)`);let o=x(r,"--max-bytes"),i=o===void 0?iF:Number.parseInt(o,10);if(!Number.isFinite(i)||i<0||o!==void 0&&String(i)!==o)return w(e,`invalid --max-bytes "${o}" (expected a non-negative integer)`);let a=M(r,"--watch"),l=x(r,"--watch-interval"),c=l===void 0?aF:Number.parseInt(l.replace(/s$/,""),10);if(!Number.isFinite(c)||c<1)return w(e,`invalid --watch-interval "${l}" (expected <N>s, N\u22651)`);if(r.positionals.length>2)return w(e,`too many positionals (${r.positionals.length}); expected [target] [alias]`);let u=x(r,"--run");if(u!==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 p=Number.parseInt(u,10);if(!Number.isFinite(p)||p<=0||String(p)!==u)return w(e,`invalid --run "${u}" (expected a positive integer run id)`);try{return await G(e,async h=>uF(e,h,p,s,i,a,c))}catch(h){return me(e,h)}}let d=ur(sF,{target:r.positionals[0],alias:r.positionals[1],flags:{session:x(r,"--session"),provider:x(r,"--provider")}});if(d.mode==="error")return w(e,d.message);if(d.mode==="managed")return w(e,"tail managed mode requires --run <id>");let f;if(d.mode==="ai-team")if(d.alias===void 0){let p;try{p=Re(d.teamfile)}catch(g){return w(e,`tail: ${g instanceof Error?g.message:String(g)}`)}let h=St(p);if(h===void 0)return w(e,`tail: ${d.teamfile} has no Lead member; pass <tf>:<alias>`);try{let g=Wt(d.teamfile,h.alias);f={provider:g.provider,sessionId:g.sessionid,cwd:g.sessiondir}}catch(g){return g instanceof ge?w(e,g.message):me(e,g)}}else try{let p=Wt(d.teamfile,d.alias);f={provider:p.provider,sessionId:p.sessionid,cwd:p.sessiondir}}catch(p){return p instanceof ge?w(e,p.message):me(e,p)}else{let p=d.sessionid,h=d.provider;if(h===void 0){let g=await zo(p);if(g.length===0)return w(e,`tail: session "${p}" not found in any provider store`);if(g.length>1)return w(e,`tail: session "${p}" matches multiple providers (${g.join(", ")}); pass --provider`);h=g[0]}f={provider:h,sessionId:p}}let m=await qb(e,f.provider,f.sessionId,s,i,-1);return m<0?1:a?await new Promise(p=>{let h=async()=>{try{let T=await qb(e,f.provider,f.sessionId,s,i,m);T>=0&&(m=T)}catch(T){e.stderr.write(`tail: ${T instanceof Error?T.message:String(T)}
|
|
1897
1897
|
`)}},g=setInterval(()=>{h()},c*1e3),_=()=>{clearInterval(g),p(0)};process.once("SIGINT",_),process.once("SIGTERM",_)}):0}async function qb(t,e,r,n,s,o){let i;try{i=await xr(r,e)}catch(u){return t.stderr.write(`tail: failed to load session: ${u instanceof Error?u.message:String(u)}
|
|
1898
1898
|
`),-1}if(i===null)return t.stderr.write(`tail: session not found: ${r} (provider=${e})
|
|
1899
1899
|
`),-1;let a=i.messages??[],l=o<0?Math.max(0,a.length-n):o+1;if(l>=a.length)return a.length-1;let c="";for(let u=l;u<a.length;u+=1)c+=`${Gb(a[u])}
|
|
@@ -1912,7 +1912,7 @@ ${i.map(a=>` ${a}`).join(`
|
|
|
1912
1912
|
|
|
1913
1913
|
Print or watch provider session messages, or follow a managed run timeline.`;Hb=`\u2026 [truncated older output \u2014 raise with --max-bytes]
|
|
1914
1914
|
`});var zb={};ce(zb,{runInfo:()=>pF});function mF(t){return t>=1e6?`${(t/1e6).toFixed(1)}M`:t>=1e3?`${Math.round(t/1e3)}K`:String(t)}async function pF(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(`${fF}
|
|
1915
|
-
`),0;let r=
|
|
1915
|
+
`),0;let r=F(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=M(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 G(e,async u=>_F(e,u,c,n))}catch(u){return me(e,u)}}let o=ur(dF,{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,"health managed mode requires --run <id>");if(o.mode==="ai-team"&&o.alias===void 0)return gF(e,o.teamfile,n);let i,a,l;if(o.mode==="ai-team")try{let c=Wt(o.teamfile,o.alias);i=c.provider,a=c.sessionid,l=c.alias}catch(c){return c instanceof ge?w(e,c.message):me(e,c)}else if(a=o.sessionid,o.provider!==void 0)i=o.provider;else{let c=await zo(a);if(c.length===0)return w(e,`health: session "${a}" not found in any provider store`);if(c.length>1)return w(e,`health: session "${a}" matches multiple providers (${c.join(", ")}); pass --provider`);i=c[0]}return hF(e,i,a,l,n)}async function hF(t,e,r,n,s){let o;try{o=await xr(r,e)}catch(a){return w(t,`health: failed to load session: ${a instanceof Error?a.message:String(a)}`)}if(o===null)return w(t,`health: session not found: ${r} (provider=${e})`);let i={provider:o.provider,sessionId:o.sessionId,cwd:o.cwd,messageCount:o.messageCount??null,...o.model!==void 0?{model:o.model}:{},...n!==void 0?{alias:n}:{},totalInputTokens:o.totalInputTokens??null,totalOutputTokens:o.totalOutputTokens??null,...o.totalCachedInputTokens!==void 0?{totalCachedInputTokens:o.totalCachedInputTokens}:{},createdAt:o.createdAt.toISOString(),modifiedAt:o.modifiedAt.toISOString()};return s?(q(t,i),0):(t.stdout.write(`Session: ${o.sessionId}
|
|
1916
1916
|
`),t.stdout.write(` Provider: ${o.provider}
|
|
1917
1917
|
`),n!==void 0&&t.stdout.write(` Alias: ${n}
|
|
1918
1918
|
`),t.stdout.write(` CWD: ${o.cwd}
|
|
@@ -1921,7 +1921,7 @@ Print or watch provider session messages, or follow a managed run timeline.`;Hb=
|
|
|
1921
1921
|
`),o.totalInputTokens===void 0||o.totalOutputTokens===void 0?t.stdout.write(" Tokens: unknown"):t.stdout.write(` Tokens: ${o.totalInputTokens} in / ${o.totalOutputTokens} out`),i.totalCachedInputTokens!==void 0&&t.stdout.write(` (cached: ${i.totalCachedInputTokens})`),t.stdout.write(`
|
|
1922
1922
|
`),t.stdout.write(` Created: ${i.createdAt}
|
|
1923
1923
|
`),t.stdout.write(` Modified: ${i.modifiedAt}
|
|
1924
|
-
`),0)}async function _F(t,e,r,n){let s=vr(e,r);if(s===null)return w(t,`health: run ${r}: not found`);let o=zr(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?(
|
|
1924
|
+
`),0)}async function _F(t,e,r,n){let s=vr(e,r);if(s===null)return w(t,`health: run ${r}: not found`);let o=zr(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?(q(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}
|
|
1925
1925
|
`),t.stdout.write(` Workflow: ${s.workflow?.name??"(unknown)"}
|
|
1926
1926
|
`),t.stdout.write(` Team: ${s.team?.name??"(unknown)"}
|
|
1927
1927
|
`),t.stdout.write(` State: ${s.current_state??"(none)"}${s.terminal_state!==null?` (terminal: ${s.terminal_state})`:""}
|
|
@@ -1932,7 +1932,7 @@ Print or watch provider session messages, or follow a managed run timeline.`;Hb=
|
|
|
1932
1932
|
`),t.stdout.write(` AgentCalls: ${i.agentCallCount}
|
|
1933
1933
|
`),t.stdout.write(` Tokens: ${i.totalInputTokens} in / ${i.totalOutputTokens} out
|
|
1934
1934
|
`),0)}async function gF(t,e,r){let n;try{n=Re(e)}catch(u){return w(t,`health: ${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 xr(u.session,u.provider)}catch(m){t.stderr.write(`warning: failed to load session "${u.session}" for ${u.alias} (${u.provider}): ${m instanceof Error?m.message:String(m)}
|
|
1935
|
-
`)}let f=d?.messageCount;s.push({alias:u.alias,provider:u.provider,sessionid:u.session,messageCount:f??null,model:d?.model??"(unknown)",lastContext:d?.lastInputTokens}),f===void 0?o=void 0:o!==void 0&&(o+=f)}if(r)return
|
|
1935
|
+
`)}let f=d?.messageCount;s.push({alias:u.alias,provider:u.provider,sessionid:u.session,messageCount:f??null,model:d?.model??"(unknown)",lastContext:d?.lastInputTokens}),f===void 0?o=void 0:o!==void 0&&(o+=f)}if(r)return q(t,{team:n.name,members:s,total:{messageCount:o??null}}),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}
|
|
1936
1936
|
`),t.stdout.write(` ${"SESSION".padEnd(i)} ${"ALIAS".padEnd(a)}${"PROVIDER".padEnd(l)}${"MODEL".padEnd(c)}${"MSGS".padStart(6)} ${"LAST CONTEXT".padStart(12)}
|
|
1937
1937
|
`);for(let u of s){let d=u.lastContext!==void 0?mF(u.lastContext):"?";t.stdout.write(` ${u.sessionid.padEnd(i)} ${u.alias.padEnd(a)}${u.provider.padEnd(l)}${u.model.padEnd(c)}${Bd(u.messageCount).padStart(6)} ${d.padStart(12)}
|
|
1938
1938
|
`)}return t.stdout.write(` ${"TOTAL".padEnd(i)} ${"".padEnd(a)}${"".padEnd(l)}${"".padEnd(c)}${Bd(o).padStart(6)}
|
|
@@ -1942,11 +1942,11 @@ Print or watch provider session messages, or follow a managed run timeline.`;Hb=
|
|
|
1942
1942
|
[--json]
|
|
1943
1943
|
|
|
1944
1944
|
Show provider session details, team rollups, or managed run state/token totals.`});var eS={};ce(eS,{runLs:()=>bF});import{resolve as qd}from"node:path";function EF(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 bF(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(`${wF}
|
|
1945
|
-
`),0;let r=
|
|
1945
|
+
`),0;let r=F(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=M(r,"--json");if(M(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(M(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 p=x(r,"--limit"),h=yF;if(p!==void 0){let _=Number.parseInt(p,10);if(!Number.isFinite(_)||_<1||String(_)!==p)return w(e,`invalid --limit "${p}" (expected a positive integer)`);if(_>Qb)return w(e,`--limit ${_} exceeds maximum (${Qb})`);h=_}let g=n==="json"||s===!0?"json":"table";try{return await G(e,async _=>SF(e,_,h,g))}catch(_){return me(e,_)}}let i=TF(n,s);if("error"in i)return w(e,i.error);let a=i.format,l=x(r,"--provider"),c=x(r,"--sessiondir"),u=M(r,"--recursive"),d=M(r,"--all"),f;try{f=await ec(l?{provider:l}:{})}catch(p){return w(e,`ls: discovery failed: ${p instanceof Error?p.message:String(p)}`)}if(!d){let p=c!==void 0?qd(c):qd(process.cwd());f=f.filter(h=>{let g=qd(h.cwd);return u?g===p||g.startsWith(`${p}/`):g===p})}if(f=EF(f),a==="json")return q(e,f.map(p=>({provider:p.provider,sessionId:p.sessionId,cwd:p.cwd,messageCount:p.messageCount,modifiedAt:p.modifiedAt.toISOString(),...p.model!==void 0?{model:p.model}:{}}))),0;if(f.length===0){if(a==="table"){let p=d?"(all)":c??process.cwd(),h=u?"under":"in";e.stdout.write(`No native sessions found ${h} ${p}.
|
|
1946
1946
|
`)}return 0}if(a==="teamfile"){for(let p of f)e.stdout.write(`_MEMBER_ alias=- provider=${p.provider} sessionid=${p.sessionId} sessiondir=${p.cwd}
|
|
1947
1947
|
`);return 0}let m=Math.max(14,...f.map(p=>p.sessionId.length));e.stdout.write(`${"SESSION".padEnd(m)} ${"PROVIDER".padEnd(10)} ${"SESSIONDIR".padEnd(36)} MODIFIED
|
|
1948
1948
|
`);for(let p of f){let h=p.cwd.length>36?`\u2026${p.cwd.slice(-35)}`:p.cwd;e.stdout.write(`${p.sessionId.padEnd(m)} ${p.provider.padEnd(10)} ${h.padEnd(36)} ${p.modifiedAt.toISOString()}
|
|
1949
|
-
`)}return 0}async function SF(t,e,r,n){let s=Yr(e,{limit:r});if(n==="json")return
|
|
1949
|
+
`)}return 0}async function SF(t,e,r,n){let s=Yr(e,{limit:r});if(n==="json")return q(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.
|
|
1950
1950
|
`),0;t.stdout.write(`${"RUN_ID".padEnd(8)} ${"WORKFLOW".padEnd(8)} ${"TEAM".padEnd(8)} ${"STATE".padEnd(20)} ${"TERMINAL".padEnd(20)} STARTED
|
|
1951
1951
|
`);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}
|
|
1952
1952
|
`)}return 0}function TF(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 wF,yF,Qb,tS=b(()=>{"use strict";Rt();$e();Ot();wF=`usage: lmctl ls [--provider <name>] [--sessiondir <path>]
|
|
@@ -1956,7 +1956,7 @@ Show provider session details, team rollups, or managed run state/token totals.`
|
|
|
1956
1956
|
List native provider sessions in scope, or list recent managed runs with --runs.`,yF=50,Qb=500});import{existsSync as nS,readFileSync as sS}from"node:fs";import{homedir as kF}from"node:os";import{dirname as vF,resolve as oS}from"node:path";import{fileURLToPath as IF}from"node:url";function Xd(t,e={}){let r=[],n=$F(e.modelSelectionDocPath);for(let s of t){let o=s.provider.trim().toLowerCase();if(s.effort&&o!=="opencode"&&r.push(`[${s.alias}] effort="${s.effort}" is ignored: effort selection is only supported for opencode.`),o==="copilot"){if(!s.model)continue;r.push(`[${s.alias}] model="${s.model}" is ignored: copilot does not support lmctl model selection.`);continue}if(o==="opencode"){if(s.effort&&!s.model&&r.push(`[${s.alias}] effort="${s.effort}" has no effect without model= on an opencode member.`),!s.model){r.push(`[${s.alias}] provider=opencode has no model= \u2014 opencode will choose its own default model, which may not be servable and isn't visible in the teamfile. Set model= explicitly (e.g. github-copilot/gpt-5.4).`);continue}let a=OF(e.opencodeConfigPath);a.missingConfigPath&&r.push(`[${s.alias}] opencode config not found at ${a.missingConfigPath}. lmctl can still validate lmctl-managed model ids, but opencode itself needs provider config/auth for use outside lmctl. Sample config: https://lmctl.com/examples/opencode.json (copy it to that path and adjust for the models your account can access).`),a.available?a.models.includes(s.model)||r.push(`[${s.alias}] model="${s.model}" is not configured for opencode. Valid configured or lmctl-managed models: ${rS(a.models)}`):r.push(`[${s.alias}] model="${s.model}" cannot be verified for opencode: ${a.reason}.`);continue}if(!s.model)continue;let i=n.get(o);if(!i){r.push(`[${s.alias}] model="${s.model}" cannot be verified for provider "${o}": `+(Oa??"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: ${rS(i)}`)}return r}function $F(t){if(!t&&Cs)return Cs;let e=new Map,r,n=t??jF();if(!nS(n))return r=`${n} not found`,t||Hd(e),t||(Cs=e),t||(Oa=r),e;let s;try{s=sS(n,"utf-8")}catch(o){return r=`${n} could not be read: ${o instanceof Error?o.message:String(o)}`,t||Hd(e),t||(Cs=e),t||(Oa=r),e}for(let[o,i]of Object.entries(NF)){let a=AF(s,i),l=RF(a);l.length>0&&e.set(o,l)}return e.size===0&&(r=`${n} has no tested model rows`),!t&&e.size===0&&Hd(e),t||(Cs=e),t||(Oa=r),e}function jF(){let t=vF(IF(import.meta.url));return oS(t,"..","..","..","durable-memory","model_selection.md")}function Hd(t){for(let[e,r]of Object.entries(xF))t.set(e,r)}function AF(t,e){let n=new RegExp(`^## ${CF(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 RF(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 OF(t){let e=t??oS(kF(),".config","opencode","opencode.json"),r=xm();if(!nS(e))return{available:!0,models:r,missingConfigPath:e};let n;try{n=JSON.parse(sS(e,"utf-8"))}catch(o){return{available:!1,models:[],reason:`${e} could not be parsed: ${o instanceof Error?o.message:String(o)}`}}let s=[...new Set([...LF(n),...r])].sort();return s.length===0?{available:!1,models:s,reason:`${e} has no provider models`}:{available:!0,models:s}}function LF(t){if(!Jd(t))return[];let e=Ra(t.provider)??Ra(t.providers);if(!e)return[];let r=new Set;for(let[n,s]of Object.entries(e)){if(!Jd(s))continue;let o=Ra(s.models)??Ra(s.model);if(o)for(let i of Object.keys(o))r.add(i.startsWith(`${n}/`)?i:`${n}/${i}`)}return[...r].sort()}function Ra(t){return Jd(t)?t:null}function Jd(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function rS(t){return t.length>0?t.join(", "):"(none)"}function CF(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}var NF,xF,Cs,Oa,iS=b(()=>{"use strict";Sl();NF={claude:"Claude",codex:"Codex",gemini:"Gemini",qwen:"Qwen",agy:"Antigravity"},xF={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"],agy:["gemini-1.5-flash","gemini-1.5-pro","gemini-3.5-flash","gemini-3.1-pro","gpt-oss-120b","gpt-4-turbo","gpt-4","gpt-3.5-turbo","claude-3-opus","claude-3-sonnet","claude-3-haiku"]},Cs=null});var Us={};ce(Us,{DEPRECATED_CONNECT_WARNING:()=>fS,GEMINI_PROVIDER_NOTICE:()=>dS,_setLintSessiondirFsOpsForTests:()=>YF,_setSkillFileOpsForTests:()=>KF,_setTeamfileSeedForTests:()=>VF,buildRootTeamRegistrationRow:()=>_S,registerRootTeam:()=>gS,runHire:()=>rU,runLint:()=>tU,runRefresh:()=>nU,runSeed:()=>pS,sha256Text:()=>hS,skillNameFromSource:()=>tf,skillNameFromUrl:()=>_U});import{createHash as MF,randomUUID as DF}from"node:crypto";import{accessSync as PF,constants as aS,existsSync as FF,mkdirSync as UF,readFileSync as Ma,realpathSync as Kd,renameSync as WF,statSync as BF,unlinkSync as qF,writeFileSync as Ps}from"node:fs";import{basename as HF,dirname as xn,isAbsolute as lS,join as Yd,resolve as dr}from"node:path";function VF(t){mS=t??(async e=>{let{seed:r}=await Promise.resolve().then(()=>(Rt(),rc)),n=await r(e);return n.success?{sessionId:n.sessionId}:{error:n.error??"provider seed failed"}})}function KF(t){Ds=t===null?zd:{...zd,...t}}function YF(t){Dr=t===null?Zd:{...Zd,...t}}function zF(t,e){let r=xn(e),n=new Set,s=[];for(let o of t){if(o.teamfile!==void 0)continue;let i=o.sessiondir??r,a=dr(i);if(n.has(a))continue;let l=ZF(a);l!==void 0&&(n.add(a),s.push(`${o.alias}: sessiondir ${a} is not writable (seed would fail: ${l}) \u2014 fix permissions or set a writable sessiondir`))}return s}function ZF(t){try{if(Dr.existsSync(t)){if(!Dr.statSync(t).isDirectory())return"ENOTDIR";Dr.accessSync(t,aS.W_OK);return}let e=QF(t);if(e===void 0)return;if(!Dr.statSync(e).isDirectory())return"ENOTDIR";Dr.accessSync(e,aS.W_OK);return}catch(e){return eU(e)??"permission check failed"}}function QF(t){let e=t;for(;;){try{if(Dr.existsSync(e))return e}catch{return}let r=xn(e);if(r===e)return;e=r}}function eU(t){if(typeof t=="object"&&t!==null&&"code"in t){let e=t.code;if(typeof e=="string"&&e.length>0)return e}}async function tU(t,e={stdout:process.stdout,stderr:process.stderr}){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(XF),0;if(t.length!==1)return e.stderr.write(`usage: lmctl lint <teamfile.lmctl>
|
|
1957
1957
|
`),2;let r=t[0],n;try{n=Re(r)}catch(i){return Be(e,`${r}: ${i instanceof Error?i.message:String(i)}`)}let s=kd(n,xn(dr(r))),o=Xd(n.members);o.push(...Tl(n.members,xn(dr(r)))),o.push(...zF(n.members,dr(r))),n.deprecatedConnectLines.length>0&&o.push(fS.replace("%s",n.deprecatedConnectLines.join(", ")));for(let i of s)e.stderr.write(`error: ${i.field}: ${i.message}
|
|
1958
1958
|
`);for(let i of n.members)ef([i],e),i.session!==void 0&&i.session.length>0&&i.sessiondir===void 0&&o.push(`${i.alias}: has a sessionid but no sessiondir \u2014 seed will fail; remove the sessionid to re-seed, or set the correct sessiondir.`),i.session!==void 0&&i.session.length<Ms&&o.push(`${i.alias}: sessionid is shorter than ${Ms} chars; run lmctl seed to refresh it`);for(let i of o)e.stderr.write(`warning: ${i}
|
|
1959
|
-
`);return await
|
|
1959
|
+
`);return await G(e,i=>{rb(r,i,a=>e.stderr.write(`${a}
|
|
1960
1960
|
`))}),s.length>0?1:(e.stdout.write(`ok
|
|
1961
1961
|
`),0)}async function pS(t,e={stdout:process.stdout,stderr:process.stderr}){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(GF),0;if(t.length!==1)return e.stderr.write(`usage: lmctl seed <teamfile.lmctl>
|
|
1962
1962
|
`),2;let r=t[0],n=dr(r),s;try{s=Kd(n)}catch(E){return Be(e,`${r}: ${E instanceof Error?E.message:String(E)}`)}let o=xn(n),i;try{i=Re(n)}catch(E){return Be(e,`${r}: ${E instanceof Error?E.message:String(E)}`)}let a=kd(i,o);if(a.length>0){ef(i.members,e);for(let E of a)e.stderr.write(`error: ${E.field}: ${E.message}
|
|
@@ -1965,18 +1965,18 @@ List native provider sessions in scope, or list recent managed runs with --runs.
|
|
|
1965
1965
|
`);let l=i.members.find(E=>E.teamfile===void 0&&E.session!==void 0&&E.session.length>0&&E.sessiondir===void 0);if(l!==void 0)return e.stderr.write(`error: ${l.alias}: has a sessionid but no sessiondir \u2014 the session's location is unknown. Remove the sessionid to re-seed fresh, or set the correct sessiondir.
|
|
1966
1966
|
`),1;let c=await fU(i.skillUrls,o,e);if(c!==0)return c;let u=Ma(n,"utf8"),d=u.split(`
|
|
1967
1967
|
`),f=oU(d),m=0,p=i.members.filter(E=>E.teamfile!==void 0?!1:E.session===void 0||E.session.length<Ms);for(let E of p)if(!yS(E.provider))return e.stderr.write(`error: ${E.alias}: invalid provider "${E.provider}"
|
|
1968
|
-
`),1;let h=i.members.find(E=>E.alias.toLowerCase()==="lead");if(h!==void 0){Hr("lmctl","lmctl_chat",{warn
|
|
1969
|
-
`)});let E=h.sessiondir??o,
|
|
1970
|
-
`):
|
|
1968
|
+
`),1;let h=i.members.find(E=>E.alias.toLowerCase()==="lead");if(h!==void 0){Hr("lmctl","lmctl_chat",{warn:$=>e.stderr.write(`${$}
|
|
1969
|
+
`)});let E=h.sessiondir??o,k=Rc(h.provider,E);k.error!==void 0?e.stderr.write(`warning: MCP bridge install failed: ${k.error}
|
|
1970
|
+
`):k.changed&&e.stdout.write(k.scope==="copilot-user"?`copilot MCP bridge installed in ${k.path}
|
|
1971
1971
|
`:`.mcp.json installed in ${E}
|
|
1972
1972
|
`)}for(let E of i.members){if(E.teamfile!==void 0)continue;if(E.session!==void 0&&E.session.length>=Ms){e.stderr.write(`warning: ${E.alias}: existing sessionid preserved; skipping
|
|
1973
|
-
`);continue}let
|
|
1974
|
-
`),1;let
|
|
1975
|
-
`),1;let
|
|
1976
|
-
`),"utf8"),e.stdout.write(`${E.alias}: seeded ${
|
|
1973
|
+
`);continue}let k=E.sessiondir??o,$=await mS({provider:E.provider,cwd:k,...E.model!==void 0?{model:E.model}:{},...E.effort!==void 0?{effort:E.effort}:{},...E.alias.toLowerCase()==="lead"?{prompt:sU(n,u,i.members)}:{}});if($.error!==void 0||$.sessionId===void 0||$.sessionId.length<Ms)return e.stderr.write(`error: ${E.alias}: seed failed${$.error!==void 0?`: ${$.error}`:"; provider did not report a sessionid"}
|
|
1974
|
+
`),1;let N=f.get(E.alias.toLowerCase());if(N===void 0)return e.stderr.write(`error: ${E.alias}: could not find matching _MEMBER_ line to update
|
|
1975
|
+
`),1;let A=cS(d[N],"sessionid",$.sessionId);E.sessiondir===void 0&&(A=cS(A,"sessiondir",o)),d[N]=A,m+=1,Ps(n,d.join(`
|
|
1976
|
+
`),"utf8"),e.stdout.write(`${E.alias}: seeded ${$.sessionId}
|
|
1977
1977
|
`)}let g=d.join(`
|
|
1978
1978
|
`),_=dU(g,Kd(n));_!==g&&Ps(n,_,"utf8"),m===0&&e.stdout.write(`no members needed seeding
|
|
1979
|
-
`);let T=new Date().toISOString();return await
|
|
1979
|
+
`);let T=new Date().toISOString();return await G(e,E=>{gS(E,{teamfilePath:s,name:i.name,rawText:_,now:T})}),0}async function rU(t,e={stdout:process.stdout,stderr:process.stderr}){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(Ca),0;let r=F(t,["--provider","--sessiondir"],[]);if(r.error!==void 0)return Vd(e,r.error,Ca);if(r.positionals.length!==2)return Vd(e,"expected <teamfile.lmctl> and <alias>",Ca);let[n,s]=r.positionals;if(!lU(s))return Be(e,`invalid alias "${s}"`);if(s.toLowerCase()==="lead")return Be(e,"hire only applies to non-Lead members");let o=x(r,"--provider");if(o===void 0)return Vd(e,"missing value for --provider",Ca);if(!yS(o))return Be(e,`invalid provider "${o}"`);let i=dr(n),a;try{a=Ma(i,"utf8")}catch(d){return Be(e,`${n}: ${d instanceof Error?d.message:String(d)}`)}if(aU(a,s))return Be(e,`${s}: alias already exists in ${i}`);let l=x(r,"--sessiondir"),c=[`_MEMBER_ alias=${Qd(s)} provider=${o}`,...l===void 0?[]:[`sessiondir=${Qd(l)}`]].join(" "),u=uU(a,c);return Ps(i,u,"utf8"),e.stdout.write(`Hired ${s} (${o}) -> ${i}
|
|
1980
1980
|
`),e.stdout.write(`Run: lmctl seed ${i}
|
|
1981
1981
|
`),0}async function nU(t,e={stdout:process.stdout,stderr:process.stderr}){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(Gd),0;let r,n;if(t.length===1){let d=js(t[0]);if(d===null)return e.stderr.write(Gd),2;r=d.teamfile,n=d.alias}else if(t.length===2)[r,n]=t;else return e.stderr.write(Gd),2;let s=dr(r),o;try{o=Ma(s,"utf8")}catch(d){return Be(e,`${r}: ${d instanceof Error?d.message:String(d)}`)}let i=o.split(`
|
|
1982
1982
|
`),a=iU(i,n);if(a===void 0)return Be(e,`${n}: no active _MEMBER_ entry found`);let l=i[a];if(Fs(l,"teamfile")!==void 0)return Be(e,`${n}: refresh only applies to provider-backed members, not teamfile= members`);let c=(e.env??process.env)[_l],u=Fs(l,"sessionid");return c!==void 0&&c.length>0&&u===c?Be(e,`${n}: cannot refresh its own running session \u2014 a meta-Lead or the operator must run this refresh.`):(i[a]=cU(l,"sessionid"),a>0&&/^\s*#CreationTime:/u.test(i[a-1])&&i.splice(a-1,1),Ps(s,i.join(`
|
|
@@ -2042,20 +2042,25 @@ Copy a teamfile and strip its session ids, producing a static editable template.
|
|
|
2042
2042
|
|
|
2043
2043
|
Examples:
|
|
2044
2044
|
lmctl clone ./backend/backend.lmctl ./backend-v2/backend-v2.lmctl
|
|
2045
|
-
`});var xS={};ce(xS,{runPlan:()=>CU});import{existsSync as $U,mkdirSync as jU,writeFileSync as AU}from"node:fs";import{basename as IS,extname as NS,join as RU,resolve as OU}from"node:path";async function CU(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(LU),0;let r=
|
|
2045
|
+
`});var xS={};ce(xS,{runPlan:()=>CU});import{existsSync as $U,mkdirSync as jU,writeFileSync as AU}from"node:fs";import{basename as IS,extname as NS,join as RU,resolve as OU}from"node:path";async function CU(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(LU),0;let r=F(t,["--team","--provider"],[]);if(r.error!==void 0)return e.stderr.write(`error: ${r.error}
|
|
2046
2046
|
`),e.stderr.write(`usage: lmctl plan [options] <directory>
|
|
2047
2047
|
`),2;if(r.positionals.length!==1)return e.stderr.write(`usage: lmctl plan [options] <directory>
|
|
2048
|
-
`),2;let n=OU(r.positionals[0]);jU(n,{recursive:!0});let s
|
|
2049
|
-
`),1):(AU(i,PU({teamName:DU(s),workdir:n,leadProvider:o}),"utf8"),e.stdout.write(`Created ${i}
|
|
2048
|
+
`),2;let n=OU(r.positionals[0]);jU(n,{recursive:!0});let s=x(r,"--team")??IS(n),o=x(r,"--provider")??"claude",i=RU(n,MU(s));return $U(i)?(e.stderr.write(`error: ${i} already exists.
|
|
2049
|
+
`),1):(AU(i,PU({teamName:DU(s),workdir:n,teamfilePath:i,leadProvider:o}),"utf8"),e.stdout.write(`Created ${i}
|
|
2050
2050
|
`),e.stdout.write(`Edit ${i}; only _MEMBER_ lines are parsed, everything else is free-form.
|
|
2051
2051
|
`),e.stdout.write(`After editing, run: lmctl lint ${i}
|
|
2052
2052
|
`),e.stdout.write(`Then run: lmctl seed ${i}
|
|
2053
|
-
`),0)}function MU(t){return NS(t)?t:`${t}.lmctl`}function DU(t){let e=NS(t);return e?IS(t,e):t}function PU(t){let{teamName:e,leadProvider:
|
|
2053
|
+
`),0)}function MU(t){return NS(t)?t:`${t}.lmctl`}function DU(t){let e=NS(t);return e?IS(t,e):t}function PU(t){let{teamName:e,teamfilePath:r,leadProvider:n}=t;return`# ${e}
|
|
2054
2054
|
|
|
2055
2055
|
# Lead, you take tasks from the operator. Clarify only when needed,
|
|
2056
2056
|
# then first use lmctl_chat to ping each of your members with a one-line
|
|
2057
2057
|
# "reply OK" to confirm the delegation channel works; then proceed with
|
|
2058
2058
|
# the task.
|
|
2059
|
+
# How to delegate to a member (two equivalent ways - the CLI never needs a tool search):
|
|
2060
|
+
# MCP tool: lmctl_chat(team="${r}", alias="Coder", prompt="your task")
|
|
2061
|
+
# CLI shell: lmctl chat "${r}" Coder "your task"
|
|
2062
|
+
# Warmup/connectivity check first: lmctl chat "${r}" Coder "reply OK"
|
|
2063
|
+
# If the lmctl_chat tool isn't immediately available in your session, just use the CLI form.
|
|
2059
2064
|
# delegate implementation to Coder, and send completed work to
|
|
2060
2065
|
# Reviewer1 for review.
|
|
2061
2066
|
# If Reviewer1 finds issues, send the work back to Coder for repair
|
|
@@ -2069,13 +2074,13 @@ Examples:
|
|
|
2069
2074
|
# reviews disagree in a way you cannot resolve, or the right technical
|
|
2070
2075
|
# decision is not obvious.
|
|
2071
2076
|
|
|
2072
|
-
_MEMBER_ alias=Lead provider=${
|
|
2077
|
+
_MEMBER_ alias=Lead provider=${n}
|
|
2073
2078
|
|
|
2074
2079
|
# members
|
|
2075
2080
|
_MEMBER_ alias=Coder provider=codex
|
|
2076
2081
|
|
|
2077
2082
|
_MEMBER_ alias=Reviewer1 provider=codex
|
|
2078
|
-
_MEMBER_ alias=Reviewer2 provider=${
|
|
2083
|
+
_MEMBER_ alias=Reviewer2 provider=${n}
|
|
2079
2084
|
_MEMBER_ alias=Reviewer3 provider=agy
|
|
2080
2085
|
|
|
2081
2086
|
# durable-memory/
|
|
@@ -2100,7 +2105,7 @@ Examples:
|
|
|
2100
2105
|
|
|
2101
2106
|
# Same shape, codex for the Lead and Reviewer2
|
|
2102
2107
|
lmctl plan ./backend --provider codex
|
|
2103
|
-
`});var RS={};ce(RS,{SIZE_WARN_EST_TOKENS:()=>Bs,estimateTokens:()=>AS,runTerminal:()=>BU});import{spawn as FU}from"node:child_process";import{statSync as UU}from"node:fs";async function BU(t,e){if(t.includes("--help")||t.includes("-h"))return GU(e);let r=
|
|
2108
|
+
`});var RS={};ce(RS,{SIZE_WARN_EST_TOKENS:()=>Bs,estimateTokens:()=>AS,runTerminal:()=>BU});import{spawn as FU}from"node:child_process";import{statSync as UU}from"node:fs";async function BU(t,e){if(t.includes("--help")||t.includes("-h"))return GU(e);let r=F(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"?M(r,i):x(r,i)!==void 0)return w(e,`--run is mutually exclusive with ${i}`);try{return await G(e,async i=>{let a=x(r,"--alias"),l=Qw(i,s,a);return"err"in l?w(e,l.err):nf(e,{provider:l.ok.provider,sessionid:l.ok.sessionid,sessiondir:l.ok.sessiondir})})}catch(i){return me(e,i)}}if(r.positionals.length>0){let s=["--team","--project","--size","--alias","--json"];for(let l of s)if(l==="--size"||l==="--json"?M(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=ur(WU,{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"):await G(e,l=>qU(e,a.teamfile,a.alias,l))}try{return await G(e,async s=>{let o=HU(e,s,r);if(typeof o=="number")return o;let i=x(r,"--alias");return M(r,"--size")?XU(e,s,o,i,M(r,"--json")):JU(e,s,o,i)})}catch(s){return me(e,s)}}async function qU(t,e,r,n){let s;try{s=Wt(e,r,n)}catch(o){return o instanceof ge?w(t,o.message):me(t,o)}oi(t,s.isLead,s.alias,s.provider,s.sessiondir);try{ii(t,Re(e),e)}catch{}return nf(t,{provider:s.provider,sessionid:s.sessionid,sessiondir:s.sessiondir,isLead:s.isLead})}async function nf(t,e){let{provider:r,sessionid:n,sessiondir:s}=e;if(!Yo(r))return w(t,`no resume incantation for provider "${r}"`);if(!fh.test(n))return w(t,"refusing to resume: malformed sessionid");let o=kc(r,n,{isLead:e.isLead});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=FU(i,a,{stdio:"inherit",cwd:s,env:Ke(process.env,n)});c.on("error",u=>{l(w(t,`failed to launch ${i}: ${u.message}`))}),c.on("exit",u=>l(u??0))})}function HU(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=di(t,e,x(r,"--project"));return typeof s=="number"?s:fi(t,e,s,void 0)}async function JU(t,e,r,n){let s=mi(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`):nf(t,{provider:Ie(s),sessionid:o,sessiondir:s.sessiondir})}function AS(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=UU(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 XU(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=Ie(a),u=null;Yo(c)&&(u=await xr(l,c));let d=AS(u),f=d.est>Bs;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?en(c,l):null})}if(s)return q(t,{estimate:!0,legend:jS,guide_tokens:Bs,members:i}),0;t.stdout.write(`session size \u2014 ESTIMATE only (nothing is changed automatically)
|
|
2104
2109
|
`),t.stdout.write(`${jS}
|
|
2105
2110
|
`);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)
|
|
2106
2111
|
`),a.over_guide&&t.stdout.write(` \u26A0 ${a.alias}: estimated ~${a.est_tokens} tokens \u2014 ESTIMATE only, exceeds the 200K guide.
|
|
@@ -2141,12 +2146,12 @@ Examples:
|
|
|
2141
2146
|
`),0}var WU,Bs,jS,OS=b(()=>{"use strict";Pe();tn();$e();Wc();vn();Ut();Xt();ss();oa();WU={name:"terminal",allowsBareTeamfile:!1,supportsRaw:!1},Bs=2e5,jS="est = rough local heuristic (~4 chars/token), NOT an exact provider token count \u2014 open the session to verify before acting."});import{resolve as sf,dirname as DS}from"node:path";function of(t,e){let r=sf(t);for(;;){let n=VU(e,r);if(n!==null)return n;let s=DS(r);if(s===r)return null;r=s}}function VU(t,e){return t.db.prepare("SELECT * FROM project WHERE local_path = ? LIMIT 1").get(e)??null}function Da(){return process.env.LMCTL_DB!==void 0&&process.env.LMCTL_DB.length>0}function Pa(){return process.env.LMCTL_WORKSPACE!==void 0&&process.env.LMCTL_WORKSPACE.length>0}function af(t){if(t.io.dal!==void 0){let o=LS(t.io.dal,t.cwd,t.projectName);if(o===null)throw new rt(CS(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(Da()||Pa()){let o=ue(),i=pe({path:o}),a=LS(i,t.cwd,t.projectName);if(a===null)throw i.close(),new rt(CS(t.projectName));return{dal:i,ownsDal:!0,dbPath:o,workspaceName:Pa()?process.env.LMCTL_WORKSPACE??null:null,project:a,matchedLocalPath:t.projectName===void 0?a.local_path:null,resolverMode:Da()?"explicit-db":"explicit-workspace"}}let e=t.projectName===void 0?FS(t.cwd):KU(t.projectName),r=US(e,t.projectName===void 0?"cwd":"project"),n=pe({path:r.candidate.db_path}),s=n.getProject(r.project.id);if(s===null)throw n.close(),new rt(`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 PS(t){if(t.io.dal!==void 0)return{dal:t.io.dal,ownsDal:!1,dbPath:":injected:",workspaceName:null,resolverMode:"injected"};if(Da()||Pa()){let n=ue();return{dal:pe({path:n}),ownsDal:!0,dbPath:n,workspaceName:Pa()?process.env.LMCTL_WORKSPACE??null:null,resolverMode:Da()?"explicit-db":"explicit-workspace"}}let e;try{e=FS(t.cwd)}catch{throw new rt("job ids are workspace-local and cwd does not resolve to a workspace DB; use --workspace <name> or --db <path>")}let r=US(e,"job-cwd");return{dal:pe({path:r.candidate.db_path}),ownsDal:!0,dbPath:r.candidate.db_path,workspaceName:r.candidate.workspace_name,resolverMode:"cwd-scan"}}function LS(t,e,r){return r!==void 0?t.findProjectByName(r):of(e,t)}function CS(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 KU(t){let e=[];for(let r of Xa())for(let n of WS(r))n.name===t&&e.push({candidate:r,project:n,matched_local_path:null,match_depth:0});if(e.length===0)throw new rt(`project not found in any workspace DB: ${t}`);return e}function FS(t){let e=YU(t),r=new Map;e.forEach((s,o)=>{r.set(s,e.length-o)});let n=[];for(let s of Xa())for(let o of WS(s)){let i=sf(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 rt("no lmctl project found for cwd in workspace DBs; pass --workspace and --project");return n}function US(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 rt(`job ids are workspace-local and cwd resolves ambiguously; use --workspace <name> or --db <path>
|
|
2142
2147
|
${MS(n)}`):new rt(`ambiguous lmctl ${e} match; use --workspace <name> --project <name>
|
|
2143
2148
|
${MS(n)}`)}function MS(t){return t.map(e=>` workspace ${e.candidate.workspace_name??"(legacy)"} project ${e.project.name} ${e.project.local_path}`).join(`
|
|
2144
|
-
`)}function YU(t){let e=[],r=sf(t);for(;;){e.push(r);let n=DS(r);if(n===r)return e;r=n}}function WS(t){let e=null;try{e=new zs(t.db_path,{readonly:!0,fileMustExist:!0});let r=Number(e.pragma("user_version",{simple:!0})??0);if(!Number.isInteger(r)||r<=0||r>al)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 rt,lf=b(()=>{"use strict";il();cl();Pe();Ve();rt=class extends Error{constructor(e){super(e),this.name="CliContextError"}}});var pf={};ce(pf,{assertNoCrossWorkflowSubflowCycle:()=>VS,firstUnregisteredArchetype:()=>mf,runWorkflow:()=>uW});import{createHash as df,randomUUID as zU}from"node:crypto";import{existsSync as ZU,readFileSync as Wa,readdirSync as QU,writeFileSync as eW}from"node:fs";import{basename as tW,join as rW,resolve as nW}from"node:path";import{pathToFileURL as sW}from"node:url";function ff(t,e){return{source_uri:sW(nW(t)).href,source_sha256:df("sha256").update(e).digest("hex")}}function HS(t){return df("sha256").update(t).digest("hex")}async function lW(t){let e=await wr(t,{description:"remote workflow URL"});return{definition:e.toString("utf8"),source_uri:t,source_sha256:HS(e),remote:!0}}async function Ua(t){if(tr(t)){let n=await ts(t),s=Wa(n,"utf8");return{definition:s,source_uri:t,source_sha256:HS(s),remote:!1}}let e=Mn(t,"remote workflow URLs");if(e!==null)throw new Error(e);if(ht(t))return lW(t);let r=Wa(t,"utf8");return{definition:r,...ff(t,r),remote:!1}}function JS(t){return Ce(t.definition)}function XS(t){if(t.definition_schema_version!==3)return null;let e=mf(t);return e!==null?`unknown archetype \`${e.type}\` (step \`${e.id}\`) \u2014 not in the live archetype registry`:null}function cW(t){let e=new Set;if(t.definition_schema_version===3)for(let r of t.steps)e.add(r.type);else for(let r of Object.values(t.states))e.add(r.type);return Array.from(e).sort()}async function uW(t,e){let[r,...n]=t;if(r==="--help"||r==="-h"||r==="help")return e.stdout.write(aW),0;try{return r==="run"?await dW(n,e):await
|
|
2145
|
-
`),0;let r=
|
|
2149
|
+
`)}function YU(t){let e=[],r=sf(t);for(;;){e.push(r);let n=DS(r);if(n===r)return e;r=n}}function WS(t){let e=null;try{e=new zs(t.db_path,{readonly:!0,fileMustExist:!0});let r=Number(e.pragma("user_version",{simple:!0})??0);if(!Number.isInteger(r)||r<=0||r>al)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 rt,lf=b(()=>{"use strict";il();cl();Pe();Ve();rt=class extends Error{constructor(e){super(e),this.name="CliContextError"}}});var pf={};ce(pf,{assertNoCrossWorkflowSubflowCycle:()=>VS,firstUnregisteredArchetype:()=>mf,runWorkflow:()=>uW});import{createHash as df,randomUUID as zU}from"node:crypto";import{existsSync as ZU,readFileSync as Wa,readdirSync as QU,writeFileSync as eW}from"node:fs";import{basename as tW,join as rW,resolve as nW}from"node:path";import{pathToFileURL as sW}from"node:url";function ff(t,e){return{source_uri:sW(nW(t)).href,source_sha256:df("sha256").update(e).digest("hex")}}function HS(t){return df("sha256").update(t).digest("hex")}async function lW(t){let e=await wr(t,{description:"remote workflow URL"});return{definition:e.toString("utf8"),source_uri:t,source_sha256:HS(e),remote:!0}}async function Ua(t){if(tr(t)){let n=await ts(t),s=Wa(n,"utf8");return{definition:s,source_uri:t,source_sha256:HS(s),remote:!1}}let e=Mn(t,"remote workflow URLs");if(e!==null)throw new Error(e);if(ht(t))return lW(t);let r=Wa(t,"utf8");return{definition:r,...ff(t,r),remote:!1}}function JS(t){return Ce(t.definition)}function XS(t){if(t.definition_schema_version!==3)return null;let e=mf(t);return e!==null?`unknown archetype \`${e.type}\` (step \`${e.id}\`) \u2014 not in the live archetype registry`:null}function cW(t){let e=new Set;if(t.definition_schema_version===3)for(let r of t.steps)e.add(r.type);else for(let r of Object.values(t.states))e.add(r.type);return Array.from(e).sort()}async function uW(t,e){let[r,...n]=t;if(r==="--help"||r==="-h"||r==="help")return e.stdout.write(aW),0;try{return r==="run"?await dW(n,e):await G(e,s=>{switch(r){case"load":return hW(n,e,s);case"author":return _W(n,e,s);case"list":return gW(n,e,s);case"sync":return wW(n,e,s);case"export":return yW(n,e,s);default:return w(e,"usage: lmctl workflow <load|author|list|sync|export|run>")}})}catch(s){return s instanceof rt?w(e,s.message):me(e,s)}}async function dW(t,e){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(`${Fa}
|
|
2150
|
+
`),0;let r=F(t,["--workflow","--project","--inputs","--job"],["--json","--verbose","--yes","--no-prompt"]);if(r.error!==void 0)return fr(e,r.error);if(r.positionals.length>1)return fr(e,Fa);let n=M(r,"--json"),s=x(r,"--workflow"),o=x(r,"--project"),i=x(r,"--job"),a=x(r,"--inputs"),l=M(r,"--verbose"),c=r.positionals[0],u=M(r,"--yes")||M(r,"--no-prompt");if(c!==void 0){if(s!==void 0||i!==void 0)return fr(e,"remote workflow URL cannot be combined with --workflow or --job");if(!Ht(c))return fr(e,Fa);if(tr(c))return BS(c,{io:e,json:n,projectName:o,inputsValue:a,verbose:l,yes:u});let m=Mn(c,"remote workflow URLs");return m!==null?w(e,m):BS(c,{io:e,json:n,projectName:o,inputsValue:a,verbose:l,yes:u})}if(s!==void 0&&i!==void 0)return fr(e,"--workflow and --job are mutually exclusive");if(s===void 0&&i===void 0)return fr(e,Fa);if(i!==void 0&&(o!==void 0||a!==void 0))return fr(e,"--job cannot be combined with --project or --inputs");if(i!==void 0){let m=fW(i);if(m===null)return fr(e,`invalid --job: ${i}`);let p=PS({cwd:process.cwd(),io:e});try{let h=await ys({dal:p.dal,job_id:m,worker_id:cf()});return uf(e,h,{json:n,workflowName:null,projectName:null,workspaceName:p.workspaceName,dbPath:p.dbPath,verbose:l})}finally{p.ownsDal&&p.dal.close()}}let d=GS(a,e);if(d===Ba)return 2;let f=af({cwd:process.cwd(),io:e,projectName:o});try{let m=f.dal.getWorkflowByName(s);if(m===null)return w(e,`workflow not found: ${s}`);let p=f.dal.enqueueJob({project_id:f.project.id,workflow_id_override:m.id,source:"cli-workflow-run",payload:JSON.stringify(d),priority:0}),h=await ys({dal:f.dal,job_id:p.id,worker_id:cf()});return uf(e,h,{json:n,workflowName:s,projectName:f.project.name,workspaceName:f.workspaceName,dbPath:f.dbPath,verbose:l})}finally{f.ownsDal&&f.dal.close()}}async function BS(t,e){let{io:r,json:n,projectName:s,inputsValue:o,verbose:i,yes:a}=e,l=GS(o,r);if(l===Ba)return 2;let c,u;try{c=await Ua(t),u=JS(c)}catch(m){return w(r,m instanceof Error?m.message:String(m))}let d=XS(u);if(d!==null)return w(r,d);if(c.remote&&!await mW(r,c,u,a))return 1;let f=af({cwd:process.cwd(),io:r,projectName:s});try{let m=f.dal.upsertWorkflow({name:u.name,definition_schema_version:u.definition_schema_version,definition:c.definition,source_uri:c.source_uri,source_sha256:c.source_sha256}),p=f.dal.enqueueJob({project_id:f.project.id,workflow_id_override:m.id,source:"cli-workflow-run",payload:JSON.stringify(l),priority:0}),h=await ys({dal:f.dal,job_id:p.id,worker_id:cf()});return uf(r,h,{json:n,workflowName:m.name,projectName:f.project.name,workspaceName:f.workspaceName,dbPath:f.dbPath,verbose:i})}finally{f.ownsDal&&f.dal.close()}}function fr(t,e){return t.stderr.write(`error: ${e}
|
|
2146
2151
|
`),2}function GS(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)}
|
|
2147
2152
|
`),Ba}return r===null||typeof r!="object"||Array.isArray(r)?(e.stderr.write(`error: --inputs must be a JSON object
|
|
2148
|
-
`),Ba):r}function fW(t){if(!/^[1-9][0-9]*$/.test(t))return null;let e=Number(t);return Number.isSafeInteger(e)?e:null}function cf(){return`cli-${process.pid}-${zU().slice(0,8)}`}function uf(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?
|
|
2149
|
-
`),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?
|
|
2153
|
+
`),Ba):r}function fW(t){if(!/^[1-9][0-9]*$/.test(t))return null;let e=Number(t);return Number.isSafeInteger(e)?e:null}function cf(){return`cli-${process.pid}-${zU().slice(0,8)}`}function uf(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?q(t,s):t.stderr.write(`error: job ${e.job_id} not claimable: ${e.reason}${e.locked_by?` (locked_by=${e.locked_by})`:""}
|
|
2154
|
+
`),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?q(t,n):e.status==="paused"?t.stdout.write(`workflow paused job=${e.job_id} run=${e.run_id}
|
|
2150
2155
|
`):e.status==="failed"?t.stderr.write(`workflow failed job=${e.job_id}
|
|
2151
2156
|
`):(t.stdout.write(`workflow completed job=${e.job_id} run=${e.run_id} terminal_state=${e.terminal_state??"null"}
|
|
2152
2157
|
`),e.terminal_state!==null&&e.terminal_state!=="done"&&e.terminal_state!=="success"&&t.stderr.write(`warning: workflow terminal_state=${e.terminal_state}
|
|
@@ -2157,43 +2162,43 @@ ${MS(n)}`)}function MS(t){return t.map(e=>` workspace ${e.candidate.workspace_n
|
|
|
2157
2162
|
`),o.remote&&e.stdout.write(`source: ${o.source_uri}
|
|
2158
2163
|
sha256: ${o.source_sha256}
|
|
2159
2164
|
`),0}function mf(t){let e=Fi();for(let r of t.steps)if(e.get(r.type)===void 0)return{id:r.id,type:r.type};return null}function qS(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 VS(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 _W(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=Wa(s,"utf8"),a;try{a=Ce(i)}catch(m){return w(e,`compile failed: ${m instanceof Error?m.message:String(m)}`)}if(a.definition_schema_version!==3)return me(e,new Error("composition DSL must compile to a v3 graph workflow"));let l=a,c=mf(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{VS(u,qS(l),m=>{let p=r.getWorkflowByName(m);if(p===null)return null;try{return qS(JSON.parse(p.definition))}catch{return null}})}catch(m){return w(e,`${m instanceof Error?m.message:String(m)}`)}let f;try{f=r.upsertWorkflow({name:u,definition_schema_version:3,definition:d,...ff(s,i)})}catch(m){return w(e,`${m instanceof Error?m.message:String(m)}`)}return r.insertCompositionUnit({name:u,version:f.version,lang:"lmctl/dsl@1",source:i,source_sha:df("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)
|
|
2160
|
-
`),0}function gW(t,e,r){let n=
|
|
2165
|
+
`),0}function gW(t,e,r){let n=F(t,[]);if(n.error!==void 0)return w(e,n.error);let s=r.listWorkflows();return M(n,"--json")?q(e,s):e.stdout.write(`${s.map(o=>`${o.name}@${o.version}`).join(`
|
|
2161
2166
|
`)}${s.length>0?`
|
|
2162
|
-
`:""}`),0}function wW(t,e,r){let n=
|
|
2163
|
-
`),0}function yW(t,e,r){let n=
|
|
2164
|
-
`,c
|
|
2167
|
+
`:""}`),0}function wW(t,e,r){let n=F(t,[]);if(n.error!==void 0)return w(e,n.error);ti({swallow:!0});let s=gh(),o=[];try{o=ZU(s)?QU(s).filter(c=>oW.some(u=>c.endsWith(u))):[]}catch{o=[]}let i=0,a=0,l=0;for(let c of[...o].sort()){let u=rW(s,c),d=Wa(u,"utf8"),f;try{f=Ce(d)}catch($){return w(e,`compile failed for ${c}: ${$ instanceof Error?$.message:String($)}`)}let m=f.name,p=typeof m=="string"&&m.length>0?m:tW(c).replace(/\.(compound\.json|lmctl)$/i,""),h=c.endsWith(".lmctl"),g=h?JSON.stringify(f):d,_=h?3:f.definition_schema_version,T=ff(u,d),E=r.getWorkflowByName(p);if(E!==null&&E.source_sha256===T.source_sha256){l+=1;continue}let k=E===null;r.upsertWorkflow({name:p,definition_schema_version:_,definition:g,...T}),k?i+=1:a+=1}return M(n,"--json")?q(e,{total:o.length,created:i,updated:a,unchanged:l}):e.stdout.write(`synced ${o.length} template(s): ${i} created, ${a} updated, ${l} unchanged
|
|
2168
|
+
`),0}function yW(t,e,r){let n=F(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:iW,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)}
|
|
2169
|
+
`,c=x(n,"--out");return c!==void 0?(eW(c,l),e.stdout.write(`exported ${o.name}@${o.version} \u2192 ${c} (inspection-only; NOT re-importable)
|
|
2165
2170
|
`)):e.stdout.write(l),0}var oW,iW,aW,Fa,Ba,hf=b(()=>{"use strict";Iu();dn();ni();$c();$e();lf();Ys();Es();oW=[".compound.json",".lmctl"],iW="INSPECTION ONLY \u2014 NOT a re-importable workflow source. Edit the basedir template then `lmctl workflow sync`; do NOT `workflow load` this file.",aW=`usage: lmctl workflow <load|author|list|sync|export|run>
|
|
2166
2171
|
|
|
2167
2172
|
Load, author, list, synchronize, inspect, or run workflow definitions. The
|
|
2168
2173
|
load subcommand accepts local JSON, lmctl:// workflow URIs, and https:// JSON
|
|
2169
2174
|
URLs. The run subcommand executes a loaded workflow/job, or one-shot runs a
|
|
2170
2175
|
remote https:// workflow after a trust prompt.
|
|
2171
|
-
`,Fa="usage: workflow run (<https-url | lmctl://workflow/<name>> [--project <name>] [--inputs <json-object>] [--yes] | --workflow <name> [--project <name>] [--inputs <json-object>] | --job <id>) [--json]";Ba=Symbol("inputs-error")});function _f(t,e){let r=EW[t],n=e("which",[t]);return n.status===0&&(n.stdout??"").toString().trim()!==""?e(t,["--version"]).status===0?{provider:t,status:"ok",detail:"installed, --version OK"}:{provider:t,status:"unverified",detail:"installed, session unverified (auth may be required)"}:r.optional?{provider:t,status:"skipped",detail:"not installed"}:{provider:t,status:"missing",detail:`not installed (install: ${r.install_hint})`,remediation:r.install_remediation}}var EW,KS=b(()=>{"use strict";EW={claude:{install_hint:"https://docs.claude.com/en/docs/claude-code",optional:!1,install_remediation:"see https://docs.claude.com/en/docs/claude-code"},codex:{install_hint:"https://github.com/openai/codex",optional:!1,install_remediation:"see https://github.com/openai/codex"},gemini:{install_hint:"https://github.com/google/generative-ai-cli",optional:!1,install_remediation:"npm i -g @google/gemini-cli"},opencode:{install_hint:"https://opencode.ai",optional:!0,install_remediation:"see https://opencode.ai"},qwen:{install_hint:"https://github.com/QwenLM/qwen-code",optional:!0,install_remediation:"npm i -g @qwen-code/qwen-code"},copilot:{install_hint:"https://docs.github.com/copilot/cli",optional:!0,install_remediation:"see https://docs.github.com/copilot/cli"},agy:{install_hint:"https://antigravity.google",optional:!0,install_remediation:"see https://antigravity.google"}}});var rT={};ce(rT,{initWorkspace:()=>eT,runWorkspace:()=>NW,setWorkspaceProvider:()=>tT});import{copyFileSync as bW,cpSync as SW,existsSync as De,mkdirSync as mr,readdirSync as wf,renameSync as TW,rmSync as qa,statSync as Ha,writeFileSync as kW}from"node:fs";import{spawnSync as vW}from"node:child_process";import{homedir as YS}from"node:os";import{dirname as yf,join as qs}from"node:path";async function NW(t,e){let[r,...n]=t;if(r==="--help"||r==="-h"||r==="help")return e.stdout.write(IW),0;switch(r){case"list":return xW(n,e);case"create":return $W(n,e);case"use":return jW(n,e);case"show":return AW(n,e);case"delete":return RW(n,e);case"migrate":return OW(n,e);case"init":return eT(n,e);case"set-provider":return tT(n,e);default:return w(e,"usage: lmctl workspace <list|create|use|show|delete|migrate|init|set-provider>")}}function ZS(){let t=Js(),e=[],r=new Set,n=_r.default,s=De(An()),o=De(vt(n));if((s||o||t===null||t===n)&&(e.push({name:n,db_path:o?Bt(n):An(),active:t===null||t===n,legacy:!o&&s}),r.add(n)),De(hr())){let i;try{i=wf(hr())}catch{i=[]}for(let a of i.sort()){if(r.has(a)||!qe(a))continue;let l=!1;try{l=Ha(vt(a)).isDirectory()}catch{l=!1}l&&(e.push({name:a,db_path:Bt(a),active:t===a,legacy:!1}),r.add(a))}}return e}function xW(t,e){let r=
|
|
2172
|
-
`)}return 0}function $W(t,e){let r=
|
|
2173
|
-
`),0}function jW(t,e){let r=
|
|
2174
|
-
`),
|
|
2175
|
-
`),0}function AW(t,e){let r=
|
|
2176
|
-
`),0}function RW(t,e){let r=
|
|
2176
|
+
`,Fa="usage: workflow run (<https-url | lmctl://workflow/<name>> [--project <name>] [--inputs <json-object>] [--yes] | --workflow <name> [--project <name>] [--inputs <json-object>] | --job <id>) [--json]";Ba=Symbol("inputs-error")});function _f(t,e){let r=EW[t],n=e("which",[t]);return n.status===0&&(n.stdout??"").toString().trim()!==""?e(t,["--version"]).status===0?{provider:t,status:"ok",detail:"installed, --version OK"}:{provider:t,status:"unverified",detail:"installed, session unverified (auth may be required)"}:r.optional?{provider:t,status:"skipped",detail:"not installed"}:{provider:t,status:"missing",detail:`not installed (install: ${r.install_hint})`,remediation:r.install_remediation}}var EW,KS=b(()=>{"use strict";EW={claude:{install_hint:"https://docs.claude.com/en/docs/claude-code",optional:!1,install_remediation:"see https://docs.claude.com/en/docs/claude-code"},codex:{install_hint:"https://github.com/openai/codex",optional:!1,install_remediation:"see https://github.com/openai/codex"},gemini:{install_hint:"https://github.com/google/generative-ai-cli",optional:!1,install_remediation:"npm i -g @google/gemini-cli"},opencode:{install_hint:"https://opencode.ai",optional:!0,install_remediation:"see https://opencode.ai"},qwen:{install_hint:"https://github.com/QwenLM/qwen-code",optional:!0,install_remediation:"npm i -g @qwen-code/qwen-code"},copilot:{install_hint:"https://docs.github.com/copilot/cli",optional:!0,install_remediation:"see https://docs.github.com/copilot/cli"},agy:{install_hint:"https://antigravity.google",optional:!0,install_remediation:"see https://antigravity.google"}}});var rT={};ce(rT,{initWorkspace:()=>eT,runWorkspace:()=>NW,setWorkspaceProvider:()=>tT});import{copyFileSync as bW,cpSync as SW,existsSync as De,mkdirSync as mr,readdirSync as wf,renameSync as TW,rmSync as qa,statSync as Ha,writeFileSync as kW}from"node:fs";import{spawnSync as vW}from"node:child_process";import{homedir as YS}from"node:os";import{dirname as yf,join as qs}from"node:path";async function NW(t,e){let[r,...n]=t;if(r==="--help"||r==="-h"||r==="help")return e.stdout.write(IW),0;switch(r){case"list":return xW(n,e);case"create":return $W(n,e);case"use":return jW(n,e);case"show":return AW(n,e);case"delete":return RW(n,e);case"migrate":return OW(n,e);case"init":return eT(n,e);case"set-provider":return tT(n,e);default:return w(e,"usage: lmctl workspace <list|create|use|show|delete|migrate|init|set-provider>")}}function ZS(){let t=Js(),e=[],r=new Set,n=_r.default,s=De(An()),o=De(vt(n));if((s||o||t===null||t===n)&&(e.push({name:n,db_path:o?Bt(n):An(),active:t===null||t===n,legacy:!o&&s}),r.add(n)),De(hr())){let i;try{i=wf(hr())}catch{i=[]}for(let a of i.sort()){if(r.has(a)||!qe(a))continue;let l=!1;try{l=Ha(vt(a)).isDirectory()}catch{l=!1}l&&(e.push({name:a,db_path:Bt(a),active:t===a,legacy:!1}),r.add(a))}}return e}function xW(t,e){let r=F(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=ZS();if(M(r,"--json"))return q(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}
|
|
2177
|
+
`)}return 0}function $W(t,e){let r=F(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(!qe(n))return w(e,`invalid workspace name: ${n} (allowed: letters, digits, '.', '-', '_'; must start with alnum; \u226464 chars)`);let s=vt(n);if(De(s))return w(e,`workspace already exists: ${n} (${s})`);let o=x(r,"--docroot")??Ga(n);mr(s,{recursive:!0}),mr(o,{recursive:!0});let i=Bt(n);mr(yf(i),{recursive:!0});let a=pe({path:i});try{a.setConfig("project.docroot",o)}finally{a.close()}let l={name:n,dir:s,db_path:i,docroot:o};return M(r,"--json")?q(e,l):e.stdout.write(`created workspace ${n} at ${s}
|
|
2178
|
+
`),0}function jW(t,e){let r=F(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(!qe(n))return w(e,`invalid workspace name: ${n}`);if(n!==_r.default&&!De(vt(n)))return w(e,`workspace not found: ${n} (run \`lmctl workspace create ${n}\` first)`);let s=Hs();return mr(yf(s),{recursive:!0}),kW(s,`${n}
|
|
2179
|
+
`),M(r,"--json")?q(e,{active:n,path:s}):e.stdout.write(`active workspace set to ${n}
|
|
2180
|
+
`),0}function AW(t,e){let r=F(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(!qe(n))return w(e,`invalid workspace name: ${n}`);let s=ZS().find(u=>u.name===n);if(s===void 0)return w(e,`workspace not found: ${n}`);let o=0;try{o=De(s.db_path)?Ha(s.db_path).size:0}catch{o=0}let i=0,a=null,l={};if(De(s.db_path)){let u=pe({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 M(r,"--json")?q(e,c):e.stdout.write(`${JSON.stringify(c,null,2)}
|
|
2181
|
+
`),0}function RW(t,e){let r=F(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(!qe(n))return w(e,`invalid workspace name: ${n}`);if(!M(r,"--confirm"))return w(e,`refusing to delete workspace ${n} without --confirm`);if(n===_r.default&&!M(r,"--force"))return w(e,"refusing to delete the default workspace without --force");if(Js()===n&&!M(r,"--force"))return w(e,`refusing to delete the active workspace (${n}) without --force`);let o=vt(n);return De(o)?(qa(o,{recursive:!0,force:!0}),M(r,"--json")?q(e,{deleted:n,dir:o}):e.stdout.write(`deleted workspace ${n}
|
|
2177
2182
|
`),0):w(e,`workspace not found: ${n}`)}function gf(t,e,r){try{TW(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
|
|
2178
|
-
`),Ha(t).isDirectory()?SW(t,e,{recursive:!0}):bW(t,e),!De(e))throw new Error(`migration copy verification failed: ${e} not present after copy`);qa(t,{recursive:!0,force:!0})}function OW(t,e){let r=
|
|
2183
|
+
`),Ha(t).isDirectory()?SW(t,e,{recursive:!0}):bW(t,e),!De(e))throw new Error(`migration copy verification failed: ${e} not present after copy`);qa(t,{recursive:!0,force:!0})}function OW(t,e){let r=F(t,[],["--json"]);if(r.error!==void 0)return w(e,r.error);let n=M(r,"--json"),s=Va(),o=hr(),i=[],a=(f,m)=>{if(n)q(e,{migrated:f,reason:m??null,actions:i});else{for(let p of i)e.stdout.write(`${p}
|
|
2179
2184
|
`);e.stdout.write(f?`migration complete
|
|
2180
2185
|
`:`${m??"nothing to migrate"}
|
|
2181
2186
|
`)}return 0};if(!De(s))return a(!1,"no legacy ~/.lmctl/profiles/ found; nothing to migrate");let l;try{l=wf(s).sort()}catch{l=[]}let c=l.filter(f=>{try{return Ha(qs(s,f)).isDirectory()}catch{return!1}});if(c.length===0)qa(s,{recursive:!0,force:!0}),i.push(`removed empty ${s}`);else if(!De(o))gf(s,o,e),i.push(`renamed ${s} -> ${o}`);else{let f=c.filter(m=>De(qs(o,m)));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\`)`);mr(o,{recursive:!0});for(let m of c)gf(qs(s,m),qs(o,m),e),i.push(`moved ${m} -> workspaces/${m}`);try{wf(s).length===0&&(qa(s,{recursive:!0,force:!0}),i.push(`removed empty ${s}`))}catch{}}let u=Of(),d=Hs();return De(u)&&(De(d)?i.push("left active-profile in place (active-workspace already exists; not clobbering)"):(gf(u,d,e),i.push("renamed active-profile -> active-workspace"))),a(!0)}function QS(t,e){return vW(t,e,{encoding:"utf8",timeout:5e3,maxBuffer:1024*1024})}function MW(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 zS(t){return t==="~"?YS():t.startsWith("~/")?qs(YS(),t.slice(2)):t}async function eT(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: ${$n.join(", ")}.`].join(`
|
|
2182
2187
|
`)+`
|
|
2183
|
-
`),0;let s=
|
|
2184
|
-
`),2;let l=r.isTty??!!process.stdin.isTTY,c=r.promptLine??MW,u=r.promptLine!==void 0||l,d=
|
|
2185
|
-
`),2),f,m
|
|
2186
|
-
`),2;f=m}else{if(!u)return d("--name");for(;;){let
|
|
2188
|
+
`),0;let s=F(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??QS,a=$n.map(N=>_f(N,o)).filter(N=>N.status==="ok"||N.status==="unverified").map(N=>N.provider);if(a.length===0)return e.stderr.write(`error: no provider CLI found on PATH; install/auth ${$n.join("|")} first
|
|
2189
|
+
`),2;let l=r.isTty??!!process.stdin.isTTY,c=r.promptLine??MW,u=r.promptLine!==void 0||l,d=N=>(e.stderr.write(`error: ${N} is required in non-interactive mode (no TTY); pass it explicitly
|
|
2190
|
+
`),2),f,m=x(s,"--name");if(m!==void 0){if(!qe(m))return e.stderr.write(`error: invalid workspace name: ${m}
|
|
2191
|
+
`),2;f=m}else{if(!u)return d("--name");for(;;){let N=(await c("Workspace name [default]: ")).trim(),A=N.length===0?"default":N;if(qe(A)){f=A;break}e.stderr.write(`invalid workspace name: ${A} (letters/digits/.-_, start alnum, \u226464)
|
|
2187
2192
|
`)}}let p=vt(f);if(De(p))return e.stderr.write(`error: workspace already exists: ${f} (${p}) \u2014 refusing to overwrite
|
|
2188
|
-
`),2;let h,g
|
|
2189
|
-
`),2;T[
|
|
2190
|
-
`)}}mr(p,{recursive:!0}),mr(h,{recursive:!0});let E=Bt(f);mr(yf(E),{recursive:!0});let
|
|
2193
|
+
`),2;let h,g=x(s,"--basedir"),_=Ga(f);if(g!==void 0)h=zS(g);else{if(!u)return d("--basedir");let N=(await c(`Base directory for this workspace's projects [${_}]: `)).trim();h=N.length===0?_:zS(N)}let T={};for(let N of["provider1","provider2","provider3"]){let A=x(s,`--${N}`),D=LW[N],C=a.includes(D)?D:a[0];if(A!==void 0){if(!a.includes(A))return e.stderr.write(`error: --${N} ${A} is not an available provider (available: ${a.join(", ")})
|
|
2194
|
+
`),2;T[N]=A;continue}if(!u)return d(`--${N}`);for(;;){let H=(await c(`${N} (${CW[N]}) [${C}]: `)).trim(),R=H.length===0?C:H;if(a.includes(R)){T[N]=R;break}e.stderr.write(`not an available provider: ${R} (available: ${a.join(", ")})
|
|
2195
|
+
`)}}mr(p,{recursive:!0}),mr(h,{recursive:!0});let E=Bt(f);mr(yf(E),{recursive:!0});let k=pe({path:E});try{k.setConfig("project.docroot",h),k.setConfig("workspace.provider1",T.provider1),k.setConfig("workspace.provider2",T.provider2),k.setConfig("workspace.provider3",T.provider3)}finally{k.close()}let $={name:f,dir:p,db_path:E,basedir:h,providers:{...T}};return M(s,"--json")?q(e,$):(e.stdout.write(`created workspace ${f} at ${p}
|
|
2191
2196
|
`),e.stdout.write(` basedir: ${h}
|
|
2192
2197
|
`),e.stdout.write(` provider1=${T.provider1} provider2=${T.provider2} provider3=${T.provider3}
|
|
2193
2198
|
`),e.stdout.write(`activate it with: lmctl workspace use ${f}
|
|
2194
2199
|
`)),0}async function tT(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: ${$n.join(", ")}.`].join(`
|
|
2195
2200
|
`)+`
|
|
2196
|
-
`),0;let s=
|
|
2201
|
+
`),0;let s=F(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)
|
|
2197
2202
|
`),2;let c=r.spawn??QS,u=$n.map(p=>_f(p,c)).filter(p=>p.status==="ok"||p.status==="unverified").map(p=>p.provider);if(u.length===0)return e.stderr.write(`error: no provider CLI found on PATH; install/auth ${$n.join("|")} first
|
|
2198
2203
|
`),2;if(!u.includes(i))return e.stderr.write(`error: ${i} is not an available provider (available: ${u.join(", ")})
|
|
2199
2204
|
`),2;let d=e.dal===void 0,f=e.dal??pe({path:ue()});try{f.setConfig(`workspace.${l}`,i)}finally{d&&f.close()}let m=Rn()??_r.default;return e.stdout.write(`workspace.${l} = ${i} (workspace: ${m})
|
|
@@ -2201,16 +2206,16 @@ remote https:// workflow after a trust prompt.
|
|
|
2201
2206
|
|
|
2202
2207
|
Manage isolated workspace state directories, active workspace selection,
|
|
2203
2208
|
legacy profile migration, and configured provider slots.
|
|
2204
|
-
`;$n=["claude","codex","gemini","qwen"],LW={provider1:"claude",provider2:"codex",provider3:"gemini"},CW={provider1:"primary implementer",provider2:"independent reviewer",provider3:"auxiliary / tie-break"}});var iT={};ce(iT,{runProject:()=>UW});import{existsSync as DW,statSync as PW}from"node:fs";import{join as oT}from"node:path";async function UW(t,e){let[r,...n]=t;if(r==="--help"||r==="-h"||r==="help")return e.stdout.write(FW),0;try{return await
|
|
2205
|
-
`),0}function qW(t,e,r){let n=
|
|
2209
|
+
`;$n=["claude","codex","gemini","qwen"],LW={provider1:"claude",provider2:"codex",provider3:"gemini"},CW={provider1:"primary implementer",provider2:"independent reviewer",provider3:"auxiliary / tie-break"}});var iT={};ce(iT,{runProject:()=>UW});import{existsSync as DW,statSync as PW}from"node:fs";import{join as oT}from"node:path";async function UW(t,e){let[r,...n]=t;if(r==="--help"||r==="-h"||r==="help")return e.stdout.write(FW),0;try{return await G(e,s=>{switch(r){case"create":return KW(n,e,s);case"list":return YW(n,e,s);case"show":return GW(n,e,s);case"status":return VW(n,e,s);case"workflow":return WW(n,e,s);default:return w(e,"usage: lmctl project <create|list|show|status|workflow>")}})}catch(s){return me(e,s)}}function WW(t,e,r){let[n,...s]=t;switch(n){case"add":return BW(s,e,r);case"list":return qW(s,e,r);case"show":return HW(s,e,r);case"remove":return JW(s,e,r);case"enable":return sT(s,e,r,!0);case"disable":return sT(s,e,r,!1);default:return w(e,"usage: lmctl project workflow <add|list|show|remove|enable|disable>")}}function BW(t,e,r){let n=F(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{sr(l)}catch{return w(e,"invalid --condition JEXL")}let c=XW(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 M(n,"--json")?q(e,f):e.stdout.write(`added project workflow ${f.id}
|
|
2210
|
+
`),0}function qW(t,e,r){let n=F(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 M(n,"--json")?q(e,i):e.stdout.write(`${i.map(a=>`${a.id} ${a.workflow_id} ${a.priority} ${a.enabled} ${a.condition??""}`).join(`
|
|
2206
2211
|
`)}${i.length>0?`
|
|
2207
|
-
`:""}`),0}function HW(t,e,r){let n=
|
|
2208
|
-
`),0)}function JW(t,e,r){let n=
|
|
2209
|
-
`),0):w(e,`project workflow not found: ${s}`)}function sT(t,e,r,n){let s=
|
|
2210
|
-
`),0)}function XW(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 Ef(t){return t===void 0||!/^\d+$/.test(t)||Number(t)<=0?"invalid id":Number(t)}function GW(t,e,r){let n=
|
|
2211
|
-
`),0}function VW(t,e,r){let n=
|
|
2212
|
-
`),0}function KW(t,e,r){let n=
|
|
2213
|
-
`),0}function YW(t,e,r){let n=
|
|
2212
|
+
`:""}`),0}function HW(t,e,r){let n=F(t,[]);if(n.error!==void 0)return w(e,n.error);let s=Ef(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}`):(M(n,"--json")?q(e,o):e.stdout.write(`${JSON.stringify(o,null,2)}
|
|
2213
|
+
`),0)}function JW(t,e,r){let n=F(t,[]);if(n.error!==void 0)return w(e,n.error);let s=Ef(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}
|
|
2214
|
+
`),0):w(e,`project workflow not found: ${s}`)}function sT(t,e,r,n){let s=F(t,[]);if(s.error!==void 0)return w(e,s.error);let o=Ef(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}`):(M(s,"--json")?q(e,a):e.stdout.write(`${n?"enabled":"disabled"} project workflow ${o}
|
|
2215
|
+
`),0)}function XW(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 Ef(t){return t===void 0||!/^\d+$/.test(t)||Number(t)<=0?"invalid id":Number(t)}function GW(t,e,r){let n=F(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 M(n,"--json")?q(e,c):e.stdout.write(`${JSON.stringify(c,null,2)}
|
|
2216
|
+
`),0}function VW(t,e,r){let n=F(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 M(n,"--json")?q(e,i):e.stdout.write(`${JSON.stringify(i,null,2)}
|
|
2217
|
+
`),0}function KW(t,e,r){let n=F(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?oT(l,u):void 0),f=x(n,"--workflow"),m=x(n,"--team");if(d===void 0||f===void 0||m===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 p=r.findTeamByName(m);if(p===null)return w(e,`team not found: ${m}`);let h=x(n,"--test-argv"),g=null;if(h!==void 0)try{let k=JSON.parse(h);if(!Array.isArray(k)||!k.every($=>typeof $=="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 T=_!==void 0?_:zW(d)||Zn(d)?"folder":"db",E=r.insertProject({name:a,local_path:d,workflow_name:f,team_id:p.id,default_branch:x(n,"--default-branch")??null,test_argv:g,durable_memory_mode:T});return M(n,"--json")?q(e,E):e.stdout.write(`created project ${E.name}
|
|
2218
|
+
`),0}function YW(t,e,r){let n=F(t,[]);if(n.error!==void 0)return w(e,n.error);let s=r.listProjects();return M(n,"--json")?q(e,s):e.stdout.write(`${s.map(o=>`${o.id} ${o.name} ${o.workflow_name}`).join(`
|
|
2214
2219
|
`)}${s.length>0?`
|
|
2215
2220
|
`:""}`),0}function zW(t){try{let e=oT(t,"durable-memory");return DW(e)&&PW(e).isDirectory()}catch{return!1}}var FW,aT=b(()=>{"use strict";$e();an();Qn();FW=`usage: lmctl project <create|list|show|status|workflow>
|
|
2216
2221
|
|
|
@@ -2239,7 +2244,7 @@ per-project workflow bindings and routing conditions.
|
|
|
2239
2244
|
`),0;let r=yT(t);if(typeof r=="string")return e.stderr.write(`error: ${r}
|
|
2240
2245
|
`),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)
|
|
2241
2246
|
`),2;if(r.upload&&r.internalS3)return e.stderr.write(`error: pick one of --upload (HQ) or --internal-s3, not both
|
|
2242
|
-
`),2;let n=lT(),s=r.outputPath??mB(n),o=r.internalS3?"internal-s3":r.upload?"hq":"local";try{return await
|
|
2247
|
+
`),2;let n=lT(),s=r.outputPath??mB(n),o=r.internalS3?"internal-s3":r.upload?"hq":"local";try{return await G(e,async i=>{let a=await Uf({dal:i,include:r.include,dbPath:ue(),intentLog:process.env.LMCTL_INTENT_LOG}),l;try{l=await hT({ticketId:n,data:a,outputPath:s,lmctlNextVersion:st(),sanitized:!r.noSanitize})}catch(d){if(d instanceof gr)return e.stderr.write(`sanitization failed: ${d.message}
|
|
2243
2248
|
`),2;throw d}let c=await gT({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)}
|
|
2244
2249
|
`):(e.stdout.write(`ticket: ${n}
|
|
2245
2250
|
`),e.stdout.write(`bundle: ${l.outputPath} (${l.bundleSizeBytes} bytes, ${l.manifest.files.length} files)
|
|
@@ -2251,12 +2256,12 @@ per-project workflow bindings and routing conditions.
|
|
|
2251
2256
|
`}function hB(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 _B(t){let e=t.replace(/\s+/g," ").trim();return e.length<=80?e:`${e.slice(0,80)}...`}async function gB(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(`${ST()}
|
|
2252
2257
|
`),0;let r=t.filter(s=>!s.startsWith("--"));if(r.length!==1)return e.stderr.write(`error: expected exactly one positional arg: <prompt_id>
|
|
2253
2258
|
`),e.stderr.write(`${ST()}
|
|
2254
|
-
`),2;let n=r[0];try{return await
|
|
2259
|
+
`),2;let n=r[0];try{return await G(e,s=>(e.stdout.write(kT(s,n)),0))}catch(s){return e.stderr.write(`diagnose-prompt failed: ${s instanceof Error?s.message:String(s)}
|
|
2255
2260
|
`),1}}function ST(){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(`
|
|
2256
2261
|
`)}var TT,kf,vf,$T=b(()=>{"use strict";ed();$e();TT=["Coder","Reviewer1","Polisher"],kf=3e4,vf=new Set(["attention_needed","paused","escalation"])});var OT={};ce(OT,{appendIntent:()=>RT,resolveIntentLogPath:()=>AT,runStatus:()=>IB});import{appendFileSync as wB,mkdirSync as yB}from"node:fs";import{homedir as EB}from"node:os";import{dirname as bB,join as SB}from"node:path";function AT(){return process.env.LMCTL_INTENT_LOG??SB(EB(),".lmctl","recent-intents.log")}function RT(t){try{let e=AT();yB(bB(e),{recursive:!0});let r=JSON.stringify({ts:t.ts??new Date().toISOString(),cwd:t.cwd??process.cwd(),verb:t.verb,args:[...t.args]});wB(e,`${r}
|
|
2257
|
-
`)}catch{}}async function IB(t,e){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(vB),0;let r=
|
|
2262
|
+
`)}catch{}}async function IB(t,e){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(vB),0;let r=F(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=M(r,"--web"),s=x(r,"--project"),o=M(r,"--json");return n&&s!==void 0?w(e,"--web and --project are mutually exclusive"):G(e,i=>{let a=NB(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.
|
|
2258
2263
|
`),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.
|
|
2259
|
-
`),1;if(a.kind==="project-not-found")return w(e,`project not found: ${a.name}`);let l=a.project,c=xB(i,l,a.source);return o?
|
|
2264
|
+
`),1;if(a.kind==="project-not-found")return w(e,`project not found: ${a.name}`);let l=a.project,c=xB(i,l,a.source);return o?q(e,c):e.stdout.write(OB(c)),RT({verb:"status",args:t}),0})}function NB(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=of(e.cwd,t);return r===null?{kind:"no-cwd-match"}:{kind:"ok",project:r,source:"cwd"}}function xB(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=$B(t,e.id,kB),a=jB(t,e.id),l=AB(t,e.id,TB);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(c=>({id:c.id,kind:c.kind,severity:c.severity,payload_summary:RB(c.payload),created_at:c.created_at}))},recent_runs:l.map(c=>({id:c.id,workflow_name:c.workflow_name,current_state:c.current_state,terminal_state:c.terminal_state,started_at:c.started_at,ended_at:c.ended_at})),context_source:r}}function $B(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 jB(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 AB(t,e,r){return t.db.prepare(`
|
|
2260
2265
|
SELECT r.*, w.name AS workflow_name
|
|
2261
2266
|
FROM run r
|
|
2262
2267
|
JOIN job j ON j.id = r.job_id
|