@lmctl-ai/lmctl 0.1.281 → 0.1.282

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. package/dist/cli/index.js +67 -63
  2. package/package.json +1 -1
package/dist/cli/index.js CHANGED
@@ -1497,7 +1497,7 @@ var ux=Object.defineProperty;var E=(t,e)=>()=>(t&&(e=t(t=0)),e);var ae=(t,e)=>{f
1497
1497
  AND status = 'running'
1498
1498
  `),...p_(t),...u_(t)}}function lR(t,e){return e===void 0?{resumed:!1,reason:t}:{resumed:!1,reason:t,valid:e}}var gc,dt=E(()=>{"use strict";oc();f_();__();g_();jt();vs();F_();ks();gc=class{db;stmts;claimTxn;claimWithConcurrencyTxn;claimByIdWithConcurrencyTxn;resumeRunTxn;resumeInteractiveTxn;resumeEscalationTxn;tryAcquireAgentInflightTxn;constructor(e){e.pragma("foreign_keys = ON"),this.db=e,this.stmts=aR(e),this.claimTxn=e.transaction((n,r,s)=>{let i=this.stmts.selectClaimableJob.get(s,s,s);return i===void 0||this.stmts.claimJob.run(n,r,s,i.id,s,s,s).changes!==1?null:this.getJob(i.id)}),this.claimWithConcurrencyTxn=e.transaction((n,r,s,i)=>{let o=this.stmts.selectClaimableJobs.all(s,s,s);for(let a of o){let l=this.getJob(a.id);if(l===null)continue;let c=i(l);if(c.concurrency_key!==null&&(l.concurrency_key_resolved!==c.concurrency_key&&this.stmts.setJobConcurrencyKey.run(c.concurrency_key,l.id),(this.stmts.countRunningByConcurrencyKey.get(c.concurrency_key,s,l.id)?.count??0)>=Math.max(1,c.concurrent_limit)))continue;if(this.stmts.claimJob.run(n,r,s,l.id,s,s,s).changes===1)return this.getJob(l.id)}return null}),this.claimByIdWithConcurrencyTxn=e.transaction((n,r,s,i,o)=>{let a=this.getJob(n);if(a===null)return{claimed:!1,reason:"not_found",job_id:n};if(a.locked_until!==null&&a.locked_until>=i)return{claimed:!1,reason:"locked",job_id:n,status:a.status,locked_by:a.locked_by,locked_until:a.locked_until};let c=a.status==="queued"&&a.available_at<=i,u=a.status==="running"&&a.locked_until!==null&&a.locked_until<i;if(!c&&!u)return{claimed:!1,reason:"not_claimable",job_id:n,status:a.status,locked_by:a.locked_by,locked_until:a.locked_until};let d=o(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,i,a.id)?.count??0)>=Math.max(1,d.concurrent_limit)))return{claimed:!1,reason:"concurrency_limit",job_id:n,status:a.status,locked_by:a.locked_by,locked_until:a.locked_until};if(this.stmts.claimJob.run(r,s,i,a.id,i,i,i).changes!==1){let p=this.getJob(a.id);return{claimed:!1,reason:p?.locked_until!==null&&p?.locked_until!==void 0&&p.locked_until>=i?"locked":"not_claimable",job_id:n,status:p?.status??a.status,locked_by:p?.locked_by??a.locked_by,locked_until:p?.locked_until??a.locked_until}}let m=this.getJob(a.id);return m===null?{claimed:!1,reason:"not_found",job_id:n}:{claimed:!0,job:m}}),this.resumeRunTxn=e.transaction((n,r,s)=>lR("state_not_found")),this.resumeInteractiveTxn=e.transaction((n,r,s,i)=>{let o=this.getInteractiveSessionByStepId(n);if(o===null)return{resumed:!1,reason:"not_found"};if(o.status!=="waiting_operator")return{resumed:!1,reason:"not_waiting_operator"};let a=this.getRun(o.run_id);if(a===null)return{resumed:!1,reason:"run_not_found"};let l=s?"done":"waiting_agent";return this.stmts.updateInteractiveSession.run(l,r,Date.now(),o.id),this.stmts.resumeRunState.run(o.state_name,a.id),this.stmts.requeuePausedJob.run(i,a.job_id),{resumed:!0,session:this.getInteractiveSessionByStepId(n),run:this.getRun(a.id),job:this.getJob(a.job_id)}}),this.resumeEscalationTxn=e.transaction((n,r,s)=>{let i=this.stmts.getAttention.get(n);if(i===void 0)return{resumed:!1,reason:"not_found"};if(i.kind!==Yi)return{resumed:!1,reason:"wrong_kind"};if(i.acknowledged_at!==null)return{resumed:!1,reason:"already_acked"};if(i.run_id===null)return{resumed:!1,reason:"run_not_found"};let o=null,a=[];if(i.payload!==null)try{let u=JSON.parse(i.payload);u.step!==void 0&&typeof u.step.id=="string"&&u.step.id.length>0&&(o=u.step.id),Array.isArray(u.declared_outcomes)&&(a=u.declared_outcomes.filter(d=>typeof d=="string"))}catch{}if(o===null)return{resumed:!1,reason:"no_step"};let l=this.getRun(i.run_id);if(l===null)return{resumed:!1,reason:"run_not_found"};if(r!==bs&&!a.includes(r))return{resumed:!1,reason:W_};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[o]=r,this.stmts.setRunPendingEscalationDecision.run(JSON.stringify(c),l.id),this.stmts.resumeRunState.run(o,l.id),this.stmts.requeuePausedJob.run(s,l.job_id),this.stmts.ackAttention.run(s,n),{resumed:!0,run:this.getRun(l.id),job:this.getJob(l.job_id)}}),this.tryAcquireAgentInflightTxn=(n,r={})=>{this.db.exec("BEGIN IMMEDIATE");try{let s=this.getAgentInflight(n.receiver_teamfile,n.receiver_alias),i=r.reclaim_observed,o=this.stmts.acquireAgentInflight.get({...n,holder_pid:process.pid,stale_before:r.stale_before??null,force:r.force===!0?1:0,reclaim_observed_sender_teamfile:i?.sender_teamfile??null,reclaim_observed_sender_alias:i?.sender_alias??null,reclaim_observed_started_at:i?.started_at??null,reclaim_observed_holder_pid:typeof i?.holder_pid=="number"?i.holder_pid:null}),a;if(o!==void 0){let l=s===null?null:r.reclaim_reason??(r.force===!0?"force":r.reclaim_observed!==void 0?"dead-pid":"stale"),c=k_(this.db,o,s,l,r.stale_before??null,r.force===!0);a={acquired:!0,current:o,lease_id:c}}else a={acquired:!1,current:this.getAgentInflight(n.receiver_teamfile,n.receiver_alias)??(()=>{throw new Error("agent_inflight conflict row disappeared during acquire")})()};return this.db.exec("COMMIT"),a}catch(s){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),s}}}close(){this.db.close()}query(e,...n){let r=e.trim().toLowerCase();if(!r.startsWith("select")&&!r.startsWith("with")&&!r.startsWith("pragma"))throw new Error("Dal.query only allows read-only SELECT/WITH/PRAGMA statements");return this.db.prepare(e).all(...n)}insertWorkflow(e){H_(e.name,e.definition,o=>this.getWorkflowByName(o));let n=this.stmts.insertWorkflow.run(e.name,e.version??1,e.definition_schema_version??1,e.definition,j()),r=this.getWorkflow(Number(n.lastInsertRowid)),s=this.stmts.insertWorkflowVersion.run(r.id,r.version,e.definition,e.author??null,j());this.stmts.updateWorkflowActiveVersion.run(s.lastInsertRowid,r.id),(e.source_uri!=null||e.source_sha256!=null)&&this.stmts.setWorkflowSource.run(e.source_uri??null,e.source_sha256??null,r.id);let i=this.getWorkflow(r.id);return this.syncWorkflowTriggers(r.id,e.definition),i}upsertWorkflow(e){H_(e.name,e.definition,o=>this.getWorkflowByName(o));let n=this.getWorkflowByName(e.name);if(n===null)return this.insertWorkflow({name:e.name,definition_schema_version:e.definition_schema_version,definition:e.definition,author:e.author,source_uri:e.source_uri,source_sha256:e.source_sha256});let s=(this.stmts.getLatestWorkflowVersion.get(n.id)?.version??n.version)+1,i=this.stmts.insertWorkflowVersion.run(n.id,s,e.definition,e.author??null,j());return this.stmts.updateWorkflowActiveVersionDefinitionAndVersion.run(Number(i.lastInsertRowid),e.definition,e.definition_schema_version??n.definition_schema_version,s,n.id),(e.source_uri!=null||e.source_sha256!=null)&&this.stmts.setWorkflowSource.run(e.source_uri??null,e.source_sha256??null,n.id),this.syncWorkflowTriggers(n.id,e.definition),this.getWorkflow(n.id)}insertCompositionUnit(e){this.stmts.insertCompositionUnit.run(e.name,e.version,e.lang,e.source,e.source_sha,e.compiled_workflow_version_id,j())}getWorkflow(e){return this.stmts.getWorkflow.get(e)??null}getWorkflowByName(e,n){return(n===void 0?this.stmts.findWorkflowLatest.get(e):this.stmts.findWorkflowVersion.get(e,n))??null}findWorkflowByName(e,n){return this.getWorkflowByName(e,n)}insertWorkflowVersion(e,n,r){let i=(this.stmts.getLatestWorkflowVersion.get(e)?.version??0)+1,o=this.stmts.insertWorkflowVersion.run(e,i,n,r??null,j());return this.stmts.getWorkflowVersion.get(o.lastInsertRowid)}activateWorkflowVersion(e,n){let r=this.getWorkflowVersionById(n);if(r===null||r.workflow_id!==e)return null;let s=1;try{let i=JSON.parse(r.definition);typeof i.definition_schema_version=="number"&&(s=i.definition_schema_version)}catch{}return this.stmts.updateWorkflowActiveVersionAndDefinition.run(n,r.definition,s,e),this.syncWorkflowTriggers(e,r.definition),this.getWorkflow(e)}getWorkflowVersionById(e){return this.stmts.getWorkflowVersion.get(e)??null}listWorkflowVersions(e){return this.stmts.listWorkflowVersions.all(e)}upsertTriggerInstance(e){return this.stmts.upsertTriggerInstance.run(e.workflow_id,e.trigger_id,e.trigger_type,e.parameters,e.enabled===!1?0:1,j()),this.stmts.getTriggerInstanceByWorkflowAndId.get(e.workflow_id,e.trigger_id)}listTriggerInstancesForWorkflow(e){return this.stmts.listTriggerInstancesForWorkflow.all(e)}listEnabledTriggerInstances(){return this.stmts.listEnabledTriggerInstances.all()}setTriggerCursor(e,n){return this.stmts.setTriggerCursor.run(n,j(),e),this.stmts.getTriggerInstance.get(e)??null}setTriggerFailure(e,n){return this.stmts.setTriggerFailure.run(j(),n,e),this.stmts.getTriggerInstance.get(e)??null}syncWorkflowTriggers(e,n){let r;try{r=JSON.parse(n)}catch{return}if(r===null||typeof r!="object"||Array.isArray(r))return;let s=r.triggers;if(Array.isArray(s))for(let i of s){if(i===null||typeof i!="object"||Array.isArray(i))continue;let o=i;typeof o.id!="string"||o.id.length===0||typeof o.type!="string"||o.type.length===0||this.upsertTriggerInstance({workflow_id:e,trigger_id:o.id,trigger_type:o.type,parameters:JSON.stringify(o.parameters??{})})}}insertTeam(e){let n=this.stmts.insertTeam.run(e.name,j());return this.stmts.getTeam.get(n.lastInsertRowid)}getTeam(e){return this.stmts.getTeam.get(e)??null}findTeamByName(e){return this.stmts.findTeamByName.get(e)??null}listTeams(){return this.stmts.listTeams.all()}insertTeamMember(e){let n=this.stmts.insertTeamMember.run(e.team_id,e.alias,e.role??"agent",e.provider,e.model??null,e.sessionid??null,e.sessiondir,j());return this.stmts.getTeamMember.get(n.lastInsertRowid)}listTeamMembers(e){return this.stmts.listTeamMembers.all(e)}findTeamMemberByAlias(e,n){return this.stmts.findTeamMemberByAlias.get(e,n)??null}updateTeamMemberSession(e,n){return this.stmts.updateTeamMemberSession.run(n,e),this.stmts.getTeamMember.get(e)??null}setMemberState(e,n,r){return this.stmts.setMemberState.run(n,r??null,j(),e),this.stmts.getTeamMember.get(e)??null}listMembersInState(e){return this.stmts.listMembersInState.all(e)}setMemberPromptSnapshot(e,n){return this.stmts.setMemberPromptSnapshot.run(n,e),this.stmts.getTeamMember.get(e)??null}setMemberProviderResolved(e,n){return this.stmts.setMemberProviderResolved.run(n,e),this.stmts.getTeamMember.get(e)??null}setMemberRolePrompt(e,n){return this.stmts.setMemberRolePrompt.run(n,e),this.stmts.getTeamMember.get(e)??null}updateTeamMemberMeta(e,n){let r=this.stmts.getTeamMember.get(e);if(r===void 0)return null;let s=Object.prototype.hasOwnProperty.call(n,"role_prompt"),i=Object.prototype.hasOwnProperty.call(n,"model"),o=Object.prototype.hasOwnProperty.call(n,"provider");return this.stmts.updateTeamMemberMeta.run(s?n.role_prompt??null:r.role_prompt,i?n.model??null:r.model,o?n.provider??r.provider:r.provider,e),this.stmts.getTeamMember.get(e)??null}insertTeamMemberCompanion(e){let n=this.stmts.insertTeamMemberCompanion.run(e.interpreter_id,e.companion_id,j());return this.stmts.getTeamMemberCompanion.get(n.lastInsertRowid)}insertProject(e){let n=this.stmts.insertProject.run(e.name,e.description??null,e.local_path,e.workflow_name,e.team_id,e.default_branch??null,e.intake_config??null,e.test_argv??null,e.test_command??null,e.durable_memory_mode??"folder",j());return this.stmts.getProject.get(n.lastInsertRowid)}listProjects(){return this.stmts.listProjects.all()}getProject(e){return this.stmts.getProject.get(e)??null}findProjectByName(e){return this.stmts.findProjectByName.get(e)??null}setProjectIntakeConfig(e,n){return this.stmts.setProjectIntakeConfig.run(n,e),this.stmts.getProject.get(e)??null}updateProjectSettings(e,n){let r=this.stmts.getProject.get(e);if(r===void 0)return null;let s=Object.prototype.hasOwnProperty.call(n,"local_path"),i=Object.prototype.hasOwnProperty.call(n,"durable_memory_mode"),o=Object.prototype.hasOwnProperty.call(n,"default_branch"),a=Object.prototype.hasOwnProperty.call(n,"intake_config");return this.stmts.updateProjectSettings.run(s?n.local_path:r.local_path,i?n.durable_memory_mode:r.durable_memory_mode,o?n.default_branch??null:r.default_branch,a?n.intake_config??null:r.intake_config,e),this.stmts.getProject.get(e)??null}listProjectsWithIntakeEnabled(){return this.stmts.listProjectsWithIntakeConfig.all().filter(e=>{if(e.intake_config===null)return!1;try{let n=JSON.parse(e.intake_config);return typeof n=="object"&&n!==null&&!Array.isArray(n)&&n.scan_github_issues===!0}catch{return!1}})}getProjectByJob(e){return this.stmts.getProjectByJob.get(e)??null}insertProjectWorkflow(e){let n=e.condition??null,r=this.stmts.findProjectWorkflowUnique.get(e.project_id,e.workflow_id,n);if(r!==void 0)return r;let s=this.stmts.insertProjectWorkflow.run(e.project_id,e.workflow_id,n,e.parameters_override??null,e.enabled===!1?0:1,e.priority??100,j());return s.changes===1?this.stmts.getProjectWorkflow.get(s.lastInsertRowid):this.stmts.findProjectWorkflowUnique.get(e.project_id,e.workflow_id,n)}getProjectWorkflow(e){return this.stmts.getProjectWorkflow.get(e)??null}listProjectWorkflows(e,n={}){return n.enabled_only===!0?this.stmts.listEnabledProjectWorkflows.all(e):this.stmts.listProjectWorkflows.all(e)}removeProjectWorkflow(e){return this.stmts.removeProjectWorkflow.run(e).changes>0}setProjectWorkflowEnabled(e,n){return this.stmts.setProjectWorkflowEnabled.run(n?1:0,e),this.getProjectWorkflow(e)}createIssue(e){let n=j(),r=this.stmts.createIssue.run(e.project_id,e.title,e.body,e.severity??"medium",e.labels??null,e.ai_test_path??null,e.source_run_id??null,n,n);return this.stmts.getIssue.get(r.lastInsertRowid)}getIssue(e){return this.stmts.getIssue.get(e)??null}listIssues(e,n={}){return this.stmts.listIssuesForProject.all(e).filter(r=>!(n.status!==void 0&&!n.status.includes(r.status)||n.severity!==void 0&&!n.severity.includes(r.severity)||n.ai_test_path!==void 0&&r.ai_test_path!==n.ai_test_path))}claimNextIssue(e,n){return this.stmts.claimNextIssue.get(n,j(),e)??null}claimIssue(e,n){return this.stmts.claimIssue.get(n,j(),e)??null}closeIssue(e,n,r){let s=j(),i=this.stmts.closeIssue.get(n,r??null,s,s,e);if(i===void 0)throw new Error(`issue not found: ${e}`);return i}reopenIssue(e,n){let r=this.stmts.reopenIssue.get(n,j(),e);if(r===void 0)throw this.getIssue(e)===null?new Error(`issue not found: ${e}`):new Error(`issue ${e} is not closed`);return r}updateIssue(e,n){let r=this.getIssue(e);if(r===null)throw new Error(`issue not found: ${e}`);let s=Object.prototype.hasOwnProperty.call(n,"labels"),i=Object.prototype.hasOwnProperty.call(n,"ai_test_path"),o=this.stmts.updateIssue.get(n.title??r.title,n.body??r.body,n.severity??r.severity,s?n.labels??null:r.labels,i?n.ai_test_path??null:r.ai_test_path,j(),e);if(o===void 0)throw new Error(`issue not found: ${e}`);return o}listWorkflows(){return this.stmts.listWorkflows.all()}getOrCreateWebuiSession(e,n){let r=this.stmts.getWebuiSession.get(e);if(r!==void 0)return r;let s=j();return this.stmts.insertWebuiSession.run(e,n,"N1",null,null,null,null,"authenticated",s,s),this.stmts.getWebuiSession.get(e)}getWebuiSession(e){return this.stmts.getWebuiSession.get(e)??null}updateWebuiSessionTransition(e,n,r,s,i){if(this.stmts.updateWebuiSessionTransition.run(n,r,s,i,j(),e).changes===0)throw new Error(`webui_session not found: ${e}`);return this.stmts.getWebuiSession.get(e)}setWebuiSessionChatbot(e,n){if(this.stmts.setWebuiSessionChatbot.run(n,j(),e).changes===0)throw new Error(`webui_session not found: ${e}`);return this.stmts.getWebuiSession.get(e)}createChatbotSession(e,n){let r=B_(),s=j();return this.stmts.insertChatbotSession.run(r,e,n??null,s,s,"active"),this.stmts.getChatbotSession.get(r)}getChatbotSession(e){return this.stmts.getChatbotSession.get(e)??null}listChatbotSessions(e){return this.stmts.listChatbotSessionsForUser.all(e)}appendChatbotMessage(e,n,r,s){let i=j(),o=this.stmts.insertChatbotMessage.run(e,n,r,s??null,i);return this.stmts.touchChatbotSession.run(i,e),this.stmts.getChatbotMessage.get(o.lastInsertRowid)}listChatbotMessages(e){return this.stmts.listChatbotMessages.all(e)}getConfig(e){return this.stmts.getConfig.get(e)?.value??null}setConfig(e,n){this.stmts.upsertConfig.run(e,n,j())}getConfigAll(){let e=this.stmts.listConfig.all(),n={};for(let r of e)n[r.key]=r.value;return n}enqueueJob(e){let n=this.stmts.insertJob.run(e.project_id,e.workflow_id_override??null,e.source,e.source_ref??null,e.payload??null,e.priority??0,e.available_at??j(),e.dedupe_key??null,e.concurrency_key??null,j());if(n.changes===1)return this.stmts.getJob.get(n.lastInsertRowid);if(e.dedupe_key===void 0||e.dedupe_key===null)throw new Error("job insert ignored without dedupe key");return this.stmts.findJobByDedupe.get(e.source,e.dedupe_key)}claimNextJob(e){let n=j(),r=new Date(Date.now()+e.lease_ms).toISOString();return this.claimTxn(e.worker_id,r,n)}claimNextJobWithConcurrency(e){let n=j(),r=new Date(Date.now()+e.lease_ms).toISOString();return this.claimWithConcurrencyTxn(e.worker_id,r,n,e.evaluator)}claimJobByIdWithConcurrency(e){let n=j(),r=new Date(Date.now()+e.lease_ms).toISOString();return this.claimByIdWithConcurrencyTxn(e.job_id,e.worker_id,r,n,e.evaluator)}releaseJob(e,n,r){let s=n==="queued"||n==="running"?null:j();return this.stmts.releaseJob.run(n,r??null,s,e),this.getJob(e)}getJob(e){return this.stmts.getJob.get(e)??null}findJobBySourceAndDedupe(e,n){return this.stmts.findJobByDedupe.get(e,n)??null}insertRun(e){let n=this.getWorkflow(e.workflow_id);if(n===null)throw new Error(`workflow not found: ${e.workflow_id}`);let r=this.stmts.insertRun.run(e.job_id,e.workflow_id,e.team_id,e.current_state??null,n.active_version_id,e.parent_run_id??null,j()),s=this.stmts.getRun.get(r.lastInsertRowid);return(e.parent_run_id===void 0||e.parent_run_id===null)&&this.stmts.setJobRun.run(s.id,e.job_id),s}setJobRun(e,n){return this.stmts.setJobRun.run(n,e),this.getJob(e)}insertPromptDispatch(e){return this.stmts.insertPromptDispatch.run(e.prompt_id,e.project_id,e.job_id,e.text,e.context_json??null,j()),this.stmts.getPromptDispatch.get(e.prompt_id)}getPromptDispatch(e){return this.stmts.getPromptDispatch.get(e)??null}setPromptDispatchCompleted(e,n){return this.stmts.setPromptDispatchCompleted.run(n??j(),e),this.getPromptDispatch(e)}getWorkspace(e){return this.stmts.getWorkspace.get(e)??null}ensureWorkspace(e={}){let n=e.id??"default";this.stmts.ensureWorkspace.run(n,e.name??"Default workspace",e.idleThresholdMs??6e5,j());let r=this.getWorkspace(n);if(r===null)throw new Error(`workspace ${n} missing after upsert`);return r}listWebProjectsActive(e){return this.stmts.listWebProjectsActive.all(e)}getWebProject(e){return this.stmts.getWebProject.get(e)??null}insertWebProject(e){let n=j(),r=this.stmts.insertWebProject.run(e.workspace_id,e.name,e.repo_path,e.config_json??null,e.linked_v4_project_id??null,n,n),s=Number(r.lastInsertRowid),i=this.getWebProject(s);if(i===null)throw new Error(`web_project ${s} missing after insert`);return i}updateWebProject(e){let n=this.getWebProject(e.id);return n===null||n.deleted_at!==null?null:(this.stmts.updateWebProject.run(e.name??n.name,e.config_json===void 0?n.config_json:e.config_json,j(),e.id),this.getWebProject(e.id))}softDeleteWebProject(e){return this.stmts.softDeleteWebProject.run(j(),e).changes===1}loadMailboxCursor(e,n){return this.stmts.loadMailboxCursor.get(e,n)??null}saveMailboxCursor(e){this.stmts.saveMailboxCursor.run(e.user_id,e.mailbox_key,e.last_processed_version_id,e.last_processed_seq??null,e.last_processed_at)}addUsage(e){this.stmts.addUsage.run(e.user_id,e.device_id,e.period,e.put,e.get,e.list,e.updated_at)}loadUsage(e,n,r){return this.stmts.loadUsage.get(e,n,r)??null}sumUsageForPeriod(e,n){let r=this.stmts.sumUsageForPeriod.get(e,n);return{put:r?.put??0,get:r?.get??0,list:r?.list??0}}upsertRootTeam(e){this.stmts.upsertRootTeam.run(e.teamfile_path,e.name,e.raw_text,e.raw_sha256,e.registered_at,e.last_seeded_at)}getRootTeam(e){return this.stmts.getRootTeam.get(e)??null}listRootTeams(){return this.stmts.listRootTeams.all()}insertTeamChatLog(e){return this.db.transaction(()=>{let n=this.stmts.insertTeamChatLog.run(e.root_teamfile,e.sender_teamfile,e.sender_alias,e.receiver_teamfile,e.receiver_alias,e.message,e.response,e.origin,e.status,e.error_detail,e.truncated,e.created_at),r=Number(n.lastInsertRowid);return fc(this.db,r,e),Gi(this.db,r,e),r})()}beginTeamChatLog(e){return this.db.transaction(()=>{let n=this.stmts.insertTeamChatLog.run(e.root_teamfile,e.sender_teamfile,e.sender_alias,e.receiver_teamfile,e.receiver_alias,e.message,e.response,e.origin,e.status,e.error_detail,e.truncated,e.created_at),r=Number(n.lastInsertRowid);return fc(this.db,r,e),r})()}finishTeamChatLog(e,n){this.db.transaction(()=>{if(this.stmts.updateTeamChatLogResponse.run(n.response,n.status,n.error_detail,n.truncated,e).changes!==1)throw new Error(`team_chat_log row disappeared during finish: ${e}`);Gi(this.db,e,n)})()}setCurrentlyHandlingMessage(e,n,r){this.db.transaction(()=>{Ts(this.db,e,n,r)})()}clearCurrentlyHandlingMessage(e,n,r){return this.db.transaction(()=>uc(this.db,e,n,r))()}listTeamChatLog(e){return this.stmts.listTeamChatLog.all(e)}listTeamChatLogSinceId(e,n=500){return this.stmts.listTeamChatLogSinceId.all(e,Math.max(1,Math.trunc(n)))}getMaxTeamChatLogId(){return this.stmts.getMaxTeamChatLogId.get()?.max_id??0}loadTeamChatLogCursor(e){return this.stmts.loadTeamChatLogCursor.get(e)??null}saveTeamChatLogCursor(e){this.stmts.saveTeamChatLogCursor.run(e.cursor_key,e.last_pushed_id,e.updated_at)}startTrackedInvocation(e){return this.db.transaction(()=>this.startTrackedInvocationInner(e))()}startTrackedInvocationInner(e){let n=e.started_at??j(),r=e.holder_host??hc(),s=e.last_heartbeat_at??n,i=this.stmts.insertTrackedInvocation.run(e.kind,e.origin,e.scope_teamfile??null,e.from_identity,e.target_teamfile??null,e.target_alias??null,e.root_teamfile??null,e.cwd??null,Dt(e.command),n,e.holder_pid??null,r,s,Dt(e.meta),e.launch_source??e.kind,e.request_payload??null),o=this.getTrackedInvocation(Number(i.lastInsertRowid));return $_(this.db,o),o}getTrackedInvocation(e){return this.stmts.getTrackedInvocation.get(e)??null}listTrackedInvocationsForTarget(e,n,r={}){let s=["target_teamfile = ?","target_alias = ?"],i=[e,n];r.sinceMs!==void 0&&(s.push("started_at >= ?"),i.push(new Date(r.sinceMs).toISOString())),r.untilMs!==void 0&&(s.push("started_at <= ?"),i.push(new Date(r.untilMs).toISOString()));let o=Math.max(1,Math.trunc(r.limit??200));return this.db.prepare(`SELECT * FROM tracked_invocation WHERE ${s.join(" AND ")} ORDER BY started_at DESC LIMIT ?`).all(...i,o)}listAllRunningTrackedInvocations(){return this.stmts.listAllRunningTrackedInvocations.all()}listRecentlyFinishedTrackedInvocations(e){return this.stmts.listRecentlyFinishedTrackedInvocations.all(e)}finishTrackedInvocation(e,n){return this.db.transaction(()=>{let r=n.ended_at??j();if(this.stmts.finishTrackedInvocation.run(n.status,r,n.exit_code??null,n.signal??null,Dt(n.result_summary),Dt(n.error),n.team_chat_log_id??null,Dt(n.meta),r,e).changes!==1)return null;let i=this.getTrackedInvocation(e);return Ki(this.db,i),i})()}reclaimTrackedInvocationIfUnchanged(e,n,r){return this.db.transaction(()=>{let s=r.ended_at??j();if(this.stmts.reclaimTrackedInvocationIfUnchanged.run(r.status,s,r.exit_code??null,r.signal??null,Dt(r.result_summary),Dt(r.error),r.team_chat_log_id??null,Dt(r.meta),s,e,n.holder_pid,n.holder_host,n.started_at,n.last_heartbeat_at).changes!==1)return null;let o=this.getTrackedInvocation(e);return Ki(this.db,o),o})()}heartbeatTrackedInvocation(e,n=j()){return this.db.transaction(()=>{if(this.stmts.heartbeatTrackedInvocation.run(n,e).changes!==1)return null;let s=this.getTrackedInvocation(e);return D_(this.db,s,n),s})()}updateTrackedInvocationRequestPayload(e,n){return this.db.transaction(()=>this.stmts.updateTrackedInvocationRequestPayload.run(n,e).changes!==1?null:(j_(this.db,e,n),this.getTrackedInvocation(e)))()}linkTrackedInvocationMessage(e,n){return this.db.transaction(()=>this.stmts.linkTrackedInvocationChatLog.run(n,e).changes!==1?null:(P_(this.db,e,en(n)),this.getTrackedInvocation(e)))()}abortTrackedInvocationAndTerminalizeMessage(e,n,r){return this.db.transaction(()=>{let s=j();if(this.stmts.abortTrackedInvocationIfUnchanged.run(s,Dt(r),e,n.holder_pid,n.holder_host,n.started_at,n.last_heartbeat_at).changes!==1)return null;let o=this.getTrackedInvocation(e);return Ki(this.db,o),o.team_chat_log_id!==null&&this.terminalizeLinkedChatMessage(o.team_chat_log_id,r),o})()}terminalizeLinkedChatMessage(e,n){let r=this.stmts.getTeamChatLogById.get(e);r===void 0||r.status!=="running"||this.stmts.terminalizeTeamChatLogIfRunning.run("error",n,e).changes!==1||Gi(this.db,e,{root_teamfile:r.root_teamfile,sender_teamfile:r.sender_teamfile,sender_alias:r.sender_alias,receiver_teamfile:r.receiver_teamfile,receiver_alias:r.receiver_alias,message:r.message,response:null,origin:r.origin,status:"error",error_detail:n,truncated:r.truncated,created_at:j()})}listClaimableTerminalTrackedInvocations(e){let n=["status IN ('done', 'error', 'busy', 'cancelled')","ended_at IS NOT NULL","notified_by IS NULL"],r=[];e.from!==void 0&&(n.push("from_identity = ?"),r.push(e.from)),e.scope_teamfile!==void 0&&(n.push("scope_teamfile = ?"),r.push(e.scope_teamfile));let s=Math.max(1,Math.min(1e3,Math.trunc(e.limit??100)));return r.push(s),this.db.prepare(`SELECT * FROM tracked_invocation WHERE ${n.join(" AND ")} ORDER BY ended_at ASC, id ASC LIMIT ?`).all(...r)}claimTrackedInvocationNotification(e,n,r=j()){return this.db.transaction(()=>{if(this.stmts.claimTrackedInvocationNotification.run(n,r,e).changes!==1)return null;let i=this.getTrackedInvocation(e);return M_(this.db,i,n,r),i})()}listTrackedInvocations(e={}){let n=[],r=[];e.from!==void 0&&(n.push("from_identity = ?"),r.push(e.from)),e.scope_teamfile!==void 0&&(n.push("scope_teamfile = ?"),r.push(e.scope_teamfile)),e.status!==void 0&&(n.push("status = ?"),r.push(e.status)),e.kind!==void 0&&(n.push("kind = ?"),r.push(e.kind)),e.origin!==void 0&&(n.push("origin = ?"),r.push(e.origin));let s=Math.max(1,Math.min(1e3,Math.trunc(e.limit??100)));r.push(s);let i=n.length===0?"":` WHERE ${n.join(" AND ")}`;return this.db.prepare(`SELECT * FROM tracked_invocation${i} ORDER BY started_at DESC, id DESC LIMIT ?`).all(...r)}maxTrackedInvocationId(e={}){let n=[],r=[];e.from!==void 0&&(n.push("from_identity = ?"),r.push(e.from)),e.scope_teamfile!==void 0&&(n.push("scope_teamfile = ?"),r.push(e.scope_teamfile));let s=n.length===0?"":` WHERE ${n.join(" AND ")}`,i=this.db.prepare(`SELECT COALESCE(MAX(id), 0) AS max_id FROM tracked_invocation${s}`).get(...r);return Number(i?.max_id??0)}listRunningTrackedInvocations(e={}){return this.listTrackedInvocations({...e,status:"running"})}updateTeamChatLogResponse(e,n){this.stmts.updateTeamChatLogResponse.run(n.response,n.status,n.error_detail,n.truncated,e)}getAgentInflight(e,n){return this.stmts.getAgentInflight.get(e,n)??null}listAgentInflight(){return this.stmts.listAgentInflight.all()}tryAcquireAgentInflight(e,n){return this.tryAcquireAgentInflightTxn(e,n)}heartbeatAgentInflight(e,n,r=j()){return this.db.transaction(()=>{let s=this.getAgentInflight(e.receiver_teamfile,e.receiver_alias);return s===null||s.sender_teamfile!==e.sender_teamfile||s.sender_alias!==e.sender_alias||s.started_at!==e.started_at?!1:I_(this.db,s,n,r)})()}clearAgentInflight(e,n){this.db.transaction(()=>{let s=this.getAgentInflight(e,n);if(s===null)return;this.stmts.clearAgentInflight.run(e,n).changes===1&&Ss(this.db,s,"INFLIGHT_RECLAIM","stale")})()}clearObservedTerminalAgentInflight(e,n,r){return this.db.transaction(()=>{let i=this.getAgentInflight(e,n),o=this.stmts.clearObservedTerminalAgentInflight.run({receiver_teamfile:e,receiver_alias:n,observed_sender_teamfile:r.sender_teamfile,observed_sender_alias:r.sender_alias,observed_started_at:r.started_at,observed_holder_pid:r.holder_pid});return o.changes===1&&i!==null&&Ss(this.db,i,"INFLIGHT_RELEASE"),o.changes===1})()}releaseAgentInflight(e,n){this.db.exec("BEGIN IMMEDIATE");try{let r=this.getAgentInflight(e.receiver_teamfile,e.receiver_alias);if(r===null||r.sender_teamfile!==e.sender_teamfile||r.sender_alias!==e.sender_alias)return this.db.exec("COMMIT"),!1;if(n!==void 0&&this.db.prepare(`SELECT lease_id FROM agent_state
1499
1499
  WHERE receiver_teamfile = ? AND receiver_alias = ?`).get(e.receiver_teamfile,e.receiver_alias)?.lease_id!==n)return this.db.exec("COMMIT"),!1;if(r.active_count<=1){let i=this.stmts.clearAgentInflightIfSender.run(e.receiver_teamfile,e.receiver_alias,e.sender_teamfile,e.sender_alias);return i.changes===1&&Ss(this.db,r,"INFLIGHT_RELEASE"),this.db.exec("COMMIT"),i.changes===1}let s=this.stmts.decrementAgentInflight.run(e.receiver_teamfile,e.receiver_alias,e.sender_teamfile,e.sender_alias);return this.db.exec("COMMIT"),s.changes===1}catch(r){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),r}}clearAgentInflightOlderThan(e){return this.db.transaction(()=>{let r=this.listAgentInflight().filter(i=>i.started_at<e),s=0;for(let i of r)this.stmts.clearAgentInflight.run(i.receiver_teamfile,i.receiver_alias).changes===1&&(Ss(this.db,i,"INFLIGHT_RECLAIM","stale"),s+=1);return s})()}getTerminalLock(e,n){let r=this.stmts.getRuntimeState.get(ys,Es(e,n),ws);return r===void 0?null:h_(r.data)}setTerminalLock(e){this.db.transaction(()=>{let r=this.getTerminalLock(e.teamfile,e.alias);r!==null&&r.lock_id!==e.lock_id&&mc(this.db,r,!0),this.stmts.upsertRuntimeState.run(ys,Es(e.teamfile,e.alias),ws,JSON.stringify(e),e.last_heartbeat),r?.lock_id!==e.lock_id&&N_(this.db,e)})()}heartbeatTerminalLock(e,n,r,s){this.db.exec("BEGIN IMMEDIATE");try{let i=this.getTerminalLock(e,n);if(i===null||i.lock_id!==r)return this.db.exec("COMMIT"),!1;let o={...i,last_heartbeat:s};return this.stmts.upsertRuntimeState.run(ys,Es(e,n),ws,JSON.stringify(o),s),this.db.exec("COMMIT"),!0}catch(i){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),i}}clearTerminalLock(e,n,r){this.db.exec("BEGIN IMMEDIATE");try{let s=this.getTerminalLock(e,n);if(s===null||s.lock_id!==r)return this.db.exec("COMMIT"),!1;let i=this.stmts.deleteRuntimeState.run(ys,Es(e,n),ws);return i.changes===1&&mc(this.db,s),this.db.exec("COMMIT"),i.changes===1}catch(s){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),s}}getRuntimeProcessLock(e,n,r){let s=this.stmts.getRuntimeState.get(e,n,r);return s===void 0?null:iR(s.data)}tryAcquireRuntimeProcessLock(e,n,r,s,i=j()){this.db.exec("BEGIN IMMEDIATE");try{let o=this.getRuntimeProcessLock(e,n,r);if(o!==null&&!oR(o,s))return this.db.exec("COMMIT"),{acquired:!1,current:o};let a={lock_id:B_(),holder_pid:process.pid,holder_host:hc(),started_at:i,last_heartbeat:i};return this.stmts.upsertRuntimeState.run(e,n,r,JSON.stringify(a),i),this.db.exec("COMMIT"),{acquired:!0,lock:a,previous:o}}catch(o){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),o}}clearRuntimeProcessLock(e,n,r,s){this.db.exec("BEGIN IMMEDIATE");try{let i=this.getRuntimeProcessLock(e,n,r);if(i===null||i.lock_id!==s)return this.db.exec("COMMIT"),!1;let o=this.stmts.deleteRuntimeState.run(e,n,r);return this.db.exec("COMMIT"),o.changes===1}catch(i){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),i}}getRun(e){return this.stmts.getRun.get(e)??null}setRunCurrentState(e,n){return this.stmts.setRunCurrentState.run(n,e),this.stmts.getRun.get(e)??null}setRunPausedState(e,n,r){return this.stmts.setRunPausedState.run(n,r,e),this.stmts.getRun.get(e)??null}setRunPendingEscalationDecision(e,n){return this.stmts.setRunPendingEscalationDecision.run(n,e),this.stmts.getRun.get(e)??null}setRunTerminalState(e,n){return this.stmts.setRunTerminalState.run(n,j(),e),this.stmts.getRun.get(e)??null}pauseJob(e){return this.stmts.pauseJob.run(e),this.getJob(e)}resumeRun(e,n){return this.resumeRunTxn(e,n,j())}insertStep(e){let n=this.stmts.insertStep.run(e.run_id,e.parent_step_id??null,e.state_name,e.outcome??null,e.status_detail??null,j());return this.stmts.getStep.get(n.lastInsertRowid)}finishStep(e,n,r){return this.stmts.finishStep.run(n??null,r??null,j(),e),this.stmts.getStep.get(e)??null}listStepsForRun(e){return this.stmts.listStepsForRun.all(e)}listLatestStepOutcomesByState(e){let n=this.stmts.listLatestStepOutcomesByState.all(e),r={};for(let s of n)r[s.state_name]=s.outcome;return r}insertSubmittedPr(e){let n=this.stmts.insertSubmittedPr.run(e.repo,e.pr_url,e.issue_url??null,e.local_path??null,e.branch??null,e.head_sha??null,e.status??"watching",e.submitted_at??j(),e.last_known_state??null,e.created_by_run_id??null);return this.stmts.getSubmittedPr.get(n.lastInsertRowid)}listSubmittedPrs(e){return e?.status!==void 0?this.stmts.listSubmittedPrsByStatus.all(e.status):this.stmts.listSubmittedPrs.all()}getSubmittedPr(e){return this.stmts.getSubmittedPr.get(e)??null}findSubmittedPrByUrl(e){return this.stmts.findSubmittedPrByUrl.get(e)??null}insertStepArtifact(e){let n=this.stmts.insertStepArtifact.run(e.step_id,e.kind,e.path??null,e.content??null,e.sha??null,e.provider_call_mode??null,j());return this.stmts.getStepArtifact.get(n.lastInsertRowid)}insertExternalObject(e){let r=this.stmts.insertExternalObject.run(e.type,e.provider,e.project_id,e.run_id??null,e.external_id,e.url??null,e.status??null,e.metadata??null,e.last_seen_at??null,j()).changes===1;return{row:this.stmts.findExternalObjectByUnique.get(e.provider,e.type,e.external_id),inserted:r}}insertExternalSignal(e){let n=this.stmts.insertExternalSignal.run(e.object_id,e.kind,e.source??null,e.occurred_at??null,e.payload??null,e.signal_hash??null,null,j()),r=n.changes===1;return{row:e.signal_hash===void 0||e.signal_hash===null?this.stmts.getExternalSignal.get(n.lastInsertRowid):this.stmts.findExternalSignalByUnique.get(e.object_id,e.kind,e.signal_hash),inserted:r}}raiseAttention(e){let n=this.stmts.insertAttention.run(e.kind,e.severity??"warn",e.project_id??null,e.run_id??null,e.external_object_id??null,e.requires_user===!0?1:0,e.payload??null,j());return this.stmts.getAttention.get(n.lastInsertRowid)}acknowledgeAttention(e){return this.stmts.ackAttention.run(j(),e),this.stmts.getAttention.get(e)??null}upsertDurableMemory(e){let n=j();return this.stmts.upsertDurableMemory.run(e.project_id,e.type,e.name,e.description??null,e.body,n,n),this.stmts.getDurableMemoryByName.get(e.project_id,e.name)}getDurableMemoryByName(e,n){return this.stmts.getDurableMemoryByName.get(e,n)??null}deleteDurableMemory(e,n){return this.stmts.deleteDurableMemory.run(e,n).changes>0}listDurableMemory(e,n){return n!==void 0?this.stmts.listDurableMemoryByType.all(e,n):this.stmts.listDurableMemory.all(e)}indexDurableMemory(e,n){return n!==void 0&&n.length>0?this.stmts.listDurableMemory.all(e).filter(s=>n.includes(s.type)).map(({name:s,description:i,type:o,updated_at:a})=>({name:s,description:i,type:o,updated_at:a})):this.stmts.listDurableMemory.all(e).map(({name:r,description:s,type:i,updated_at:o})=>({name:r,description:s,type:i,updated_at:o}))}recordSessionSize(e){let n=this.stmts.insertSessionSize.run(e.team_name,e.alias,e.sessionid,e.input_tokens??null,e.cache_tokens??null,e.output_tokens??null,e.total_tokens??null,e.observed_at??j());return this.stmts.getSessionSize.get(n.lastInsertRowid)}latestSessionSizes(){return this.stmts.latestSessionSizes.all()}sessionSizeHistory(e,n,r=20){return this.stmts.sessionSizeHistory.all(e,n,r)}insertSessionEvent(e){let n=this.stmts.insertSessionEvent.run(e.run_id,e.step_id??null,e.kind,e.timestamp_ms,e.payload,e.payload_truncated??0,e.overflow_artifact_id??null);return this.stmts.getSessionEvent.get(n.lastInsertRowid)}listSessionEvents(e,n){return n!==void 0?this.stmts.listSessionEventsSince.all(e,n):this.stmts.listSessionEvents.all(e)}listSessionEventsSince(e,n=1e3){return this.stmts.listAllEventsSince.all(e,n)}latestAgentCall(e){let n=this.db.prepare("SELECT payload FROM session_event WHERE run_id = ? AND kind = 'agent_call' ORDER BY id DESC LIMIT 1").get(e);if(n===void 0)return null;try{let r=JSON.parse(n.payload);return typeof r.alias!="string"||typeof r.provider!="string"?null:{alias:r.alias,provider:r.provider,...typeof r.model=="string"?{model:r.model}:{}}}catch{return null}}agentCallTokenTotals(e){let n=this.db.prepare("SELECT payload FROM session_event WHERE run_id = ? AND kind = 'agent_call'").all(e),r=0,s=0,i=0;for(let o of n)try{let a=JSON.parse(o.payload);typeof a.tokens_in=="number"&&(r+=a.tokens_in),typeof a.tokens_out=="number"&&(s+=a.tokens_out),i+=1}catch{}return{totalInputTokens:r,totalOutputTokens:s,agentCallCount:i}}addRollupValue(e){this.stmts.upsertRollupStat.run(e.run_id,e.step_id??null,e.metric_kind,e.value,e.bucket_start_ms,e.bucket_end_ms,e.updated_at)}listRollupStats(e){return this.stmts.listRollupStats.all(e)}getRollupCursor(){return this.stmts.getRollupCursor.get("last_event_id")?.value??0}setRollupCursor(e){this.stmts.setRollupCursor.run("last_event_id",e)}insertDriftSignal(e){let n=this.stmts.insertDriftSignal.run(e.team_member_id,e.project_id??null,e.signal_kind,e.severity,e.description,e.detected_at,e.expires_at??null,e.payload??null);return this.stmts.getDriftSignal.get(n.lastInsertRowid)}listDriftSignals(e={}){return e.team_member_id!==void 0&&e.unacked?this.stmts.listUnackedDriftByMember.all(e.team_member_id):e.team_member_id!==void 0?this.stmts.listDriftByMember.all(e.team_member_id):e.project_id!==void 0?this.stmts.listDriftByProject.all(e.project_id):this.stmts.listAllDrift.all()}hasUnackedDriftSignal(e,n,r){return this.stmts.findUnackedDrift.get(e,n??null,r)!==void 0}acknowledgeDriftSignal(e){return this.stmts.ackDriftSignal.run(Date.now(),e),this.stmts.getDriftSignal.get(e)??null}insertInteractiveSession(e){let n=Date.now();return this.stmts.insertInteractiveSession.run(e.run_id,e.step_id,e.state_name,e.status,n,n),this.stmts.getInteractiveSessionByStepId.get(e.step_id)}getInteractiveSessionByStepId(e){return this.stmts.getInteractiveSessionByStepId.get(e)??null}getInteractiveSessionByRunAndState(e,n){return this.stmts.getInteractiveSessionByRunAndState.get(e,n)??null}setInteractiveAgentOutput(e,n,r){this.stmts.setInteractiveAgentOutput.run(n,r,Date.now(),e)}resumeInteractive(e,n,r){return this.resumeInteractiveTxn(e,n,r,j())}resumeEscalation(e,n){return this.resumeEscalationTxn(e,n,j())}}});import{realpathSync as cR}from"node:fs";import{resolve as dR}from"node:path";function yc(t){let e=dR(t);try{return cR(e)}catch{return e}}var J_=E(()=>{"use strict"});import{platform as G_}from"node:os";function Ft(t){let e=new Is;for(let n of t)e.registerAdapter(n);return e}var Is,wc=E(()=>{"use strict";J_();Is=class{providers=[];adapters=new Map;register(e){this.providers.push(e)}async listAll(e){let n=[],r=e?.provider?this.providers.filter(o=>o.name===e.provider):this.providers,s=await Promise.all(r.map(o=>o.discoverSessions()));for(let o of s)n.push(...o);let i=n;if(e?.workspace){let o=yc(e.workspace);i=i.filter(a=>yc(a.cwd)===o)}if(e?.from){let o=e.from.getTime();i=i.filter(a=>a.modifiedAt.getTime()>=o)}if(e?.to){let o=e.to.getTime();i=i.filter(a=>a.modifiedAt.getTime()<=o)}return i.sort((o,a)=>a.modifiedAt.getTime()-o.modifiedAt.getTime()),e?.limit&&(i=i.slice(0,e.limit)),i}async getSession(e,n){let r=n?this.providers.filter(s=>s.name===n):this.providers;for(let s of r){let i=await s.loadSession(e);if(i)return i}return null}async resolveSession(e,n){let r=await this.resolveSessions(e,n);return r.length===1?r[0]:null}async resolveSessions(e,n){let r=n?this.providers.filter(i=>i.name===n):this.providers,s=[];for(let i of r){let o=await i.resolveSessionPath(e);o&&s.push({provider:i,filePath:o})}return s}getWatchTargets(){let e=G_()==="darwin"||G_()==="win32",n=[];for(let r of this.providers)if(typeof r.getWatchPaths=="function")for(let s of r.getWatchPaths())n.push({provider:r.name,directory:s.directory,recursive:e,filePattern:s.filePattern});return n}async deleteSession(e,n){let r=await this.resolveSession(e,n);return r?r.provider.deleteSession(e):!1}registerAdapter(e){this.adapters.set(e.name,e),this.providers.push({name:e.name,discoverSessions:()=>e.discover(),loadSession:n=>e.load(n),resolveSessionPath:n=>e.resolvePath(n),deleteSession:n=>e.delete(n),getWatchPaths:()=>e.getWatchPaths?.()??[]})}getAdapter(e){return this.adapters.get(e)}getAllAdapters(){return[...this.adapters.values()]}}});import{createReadStream as K_}from"node:fs";import{createInterface as V_}from"node:readline";import{stat as uR}from"node:fs/promises";import{homedir as fR}from"node:os";function Y_(t){try{let e=JSON.parse(t);return e===null||typeof e!="object"||Array.isArray(e)?void 0:e}catch{return}}async function*Be(t){let e=K_(t,{encoding:"utf-8"}),n=V_({input:e,crlfDelay:1/0});try{for await(let r of n){let s=r.trim();if(!s)continue;let i=Y_(s);i!==void 0&&(yield i)}}finally{e.destroy()}}async function Ke(t,e){let n=[],r=K_(t,{encoding:"utf-8"}),s=V_({input:r,crlfDelay:1/0});try{for await(let i of s){let o=i.trim();if(!o)continue;let a=Y_(o);if(a!==void 0&&n.push(a),n.length>=e)break}}finally{s.close(),r.destroy()}return n}async function Le(t){let e=await uR(t);return{createdAt:e.birthtime,modifiedAt:e.mtime}}function pe(t){return t.replace(/\\n/g,`
1500
- `).replace(/\\t/g," ").replace(/\\r/g,"\r")}function J(t,e){return t.length<=e?t:t.slice(0,e-3)+"..."}function Ut(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)?t:void 0}var we,Wt=E(()=>{"use strict";we=fR()});import{readdir as Zi,stat as z_,unlink as mR}from"node:fs/promises";import{join as kr,basename as Z_}from"node:path";function pR(t){return t==="file-history-snapshot"||t==="progress"||t==="system"||t==="queue-operation"}function _R(t){if(t.type==="system"){let e=t.message?.content;if(typeof e=="string"&&e.trim())return pe(e.trim());if(e!==void 0)return JSON.stringify(e,null,2)}return t.type==="progress"&&t.data!==void 0?JSON.stringify(t.data,null,2):JSON.stringify(t,null,2)}async function Q_(t){let e=0,n=0,r=0,s=0,i=0,o=0,a;for await(let l of Be(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;n+=d+f+m,r+=m,s+=f,i+=p;let _=d+f+m;_&&(o=_),a={inputTokens:d,cacheWriteInputTokens:f,cachedInputTokens:m,outputTokens:p}}}}return{messageCount:e,totalInputTokens:n,totalCacheReadInputTokens:r,totalCacheWriteInputTokens:s,totalOutputTokens:i,lastInputTokens:o,lastTokenUsage:a}}function hR(t){let e=gR(t),n=new Set;for(let r of t){if(r.role!=="tool_use"||r.toolName!=="Bash"||r.toolInputData?.run_in_background!==!0||r.toolCallId===void 0)continue;let s=e.get(r.toolCallId);if(s===void 0)continue;let i=s.content.match(/Command running in background with ID:\s*([A-Za-z0-9_-]+)/)?.[1];i!==void 0&&(n.add(i),r.backgroundTaskId=i,s.backgroundTaskId=i)}for(let r of t){if(r.role!=="tool_use"||r.toolName!=="TaskOutput"&&r.toolName!=="TaskStop"||r.toolCallId===void 0)continue;let s=r.toolInputData?.task_id;if(typeof s!="string"||!n.has(s))continue;r.backgroundTaskId=s;let i=e.get(r.toolCallId);i!==void 0&&(i.backgroundTaskId=s)}}function gR(t){let e=new Map;for(let n of t)n.role==="tool_result"&&n.toolCallId!==void 0&&e.set(n.toolCallId,n);return e}var Qi,eh=E(()=>{"use strict";Wt();Qi=class{name="claude";claudeDir;projectsDir;constructor(e={}){this.claudeDir=e.claudeDir||kr(we,".claude"),this.projectsDir=kr(this.claudeDir,"projects")}getWatchPaths(){return[{directory:this.projectsDir,filePattern:/\.jsonl$/}]}async discoverSessions(){let e=[],n;try{n=await Zi(this.projectsDir)}catch{return e}for(let r of n){let s=kr(this.projectsDir,r);if(!(await z_(s).catch(()=>null))?.isDirectory())continue;let o;try{o=await Zi(s)}catch{continue}for(let a of o){if(!a.endsWith(".jsonl"))continue;let l=Z_(a,".jsonl");if(!/^[0-9a-f]{8}-/.test(l))continue;let c=kr(s,a);try{let u=await this.extractSummary(c,l);u&&e.push(u)}catch{}}}return e}async extractSummary(e,n){let r=await Ke(e,50),s=await Le(e),i="",o,a,l,c,u,d;for(let m of r)if(!pR(m.type)&&(!i&&m.cwd&&(i=m.cwd),!o&&m.slug&&(o=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=J(p.trim(),80)),u=J(p.trim(),80)}}if(!i)return null;let f=await Q_(e);return{provider:"claude",sessionId:n,slug:o,cwd:i,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 n=await this.resolveSessionFile(e);if(!n)return null;let r=await Le(n),s=[],i="",o,a,l,c,u,d,f,m=e,p;for await(let h of Be(n))if(h.type!=="file-history-snapshot"&&!h.isSidechain){if(!i&&h.cwd&&(i=h.cwd),!o&&h.slug&&(o=h.slug),!a&&h.version&&(a=h.version),!c&&h.gitBranch&&(c=h.gitBranch),!f&&h.timestamp&&(f=new Date(h.timestamp)),h.sessionId&&(m=h.sessionId),h.type==="system"||h.type==="progress"||h.type==="queue-operation"){s.push({role:"system",timestamp:new Date(h.timestamp||0),content:_R(h)});continue}if(h.type==="user"&&h.message){if(h.isMeta)continue;let g=new Date(h.timestamp||0),w=h.message.content;if(typeof w=="string"){if(w.includes("<command-name>")||w.includes("<local-command-"))continue;u||(u=J(w.trim(),80)),d=J(w.trim(),80),p=void 0,s.push({role:"user",timestamp:g,content:pe(w.trim())})}else if(Array.isArray(w)){for(let y of w)if(y.type==="tool_result"){let S=typeof y.content=="string"?pe(y.content):JSON.stringify(y.content);s.push({role:"tool_result",timestamp:g,content:S,toolCallId:y.tool_use_id})}}}if(h.type==="assistant"&&h.message){h.message.stop_reason===null||h.message.stop_reason==="tool_use"?p="in_progress":typeof h.message.stop_reason=="string"&&(p="complete"),h.message.model&&(l=h.message.model);let g=new Date(h.timestamp||0),w=h.message.content;if(Array.isArray(w))for(let y of w)y.type==="text"&&y.text?s.push({role:"assistant",timestamp:g,content:pe(y.text),model:h.message.model,...typeof h.message.stop_reason=="string"?{stopReason:h.message.stop_reason}:{}}):y.type==="tool_use"?s.push({role:"tool_use",timestamp:g,content:y.name||"unknown tool",toolName:y.name,toolInput:JSON.stringify(y.input,null,2),toolInputData:y.input,toolCallId:y.id,model:h.message.model,...typeof h.message.stop_reason=="string"?{stopReason:h.message.stop_reason}:{}}):y.type==="thinking"&&y.thinking&&s.push({role:"thinking",timestamp:g,content:y.thinking})}}if(!i)return null;hR(s);let _=await Q_(n);return{provider:"claude",sessionId:m,slug:o,cwd:i,createdAt:f||r.createdAt,modifiedAt:r.modifiedAt,model:l,cliVersion:a,startCommand:"claude",gitBranch:c,turnStatus:p,firstUserMessage:u,lastUserMessage:d,messageCount:_.messageCount,filePath:n,totalInputTokens:_.totalInputTokens||void 0,totalCachedInputTokens:_.totalCacheReadInputTokens||void 0,totalCacheWriteInputTokens:_.totalCacheWriteInputTokens||void 0,totalOutputTokens:_.totalOutputTokens||void 0,lastInputTokens:_.lastInputTokens||void 0,lastTokenUsage:_.lastTokenUsage,messages:s}}async resolveSessionPath(e){return this.resolveSessionFile(e)}async deleteSession(e){let n=await this.resolveSessionFile(e);return n?(await mR(n),!0):!1}async resolveSessionFile(e){let n;try{n=await Zi(this.projectsDir)}catch{return null}let r=[];for(let o of n){let a=kr(this.projectsDir,o);if(!(await z_(a).catch(()=>null))?.isDirectory())continue;let c;try{c=await Zi(a)}catch{continue}for(let u of c){if(!u.endsWith(".jsonl"))continue;let d=Z_(u,".jsonl");/^[0-9a-f]{8}-/.test(d)&&r.push({filePath:kr(a,u),fileSessionId:d})}}let s=r.find(o=>o.fileSessionId===e);if(s)return s.filePath;let i=r.filter(o=>o.fileSessionId.startsWith(e));if(i.length===1)return i[0].filePath;for(let o of r){let a=await Ke(o.filePath,20);for(let l of a)if(l.slug&&l.slug===e)return o.filePath}return null}}});import{readFileSync as yR,writeFileSync as a8,mkdirSync as l8}from"node:fs";import{join as wR,dirname as d8}from"node:path";import{homedir as ER}from"node:os";function SR(t){return t.startsWith('"')&&t.endsWith('"')||t.startsWith("'")&&t.endsWith("'")?t.slice(1,-1):t}function vR(t){let e=t.indexOf("=");if(e===-1)return null;let n=t.slice(0,e).trim(),r=SR(t.slice(e+1).trim());return n?{key:n,value:r}:null}function bR(t){let e=t.trim();return e.startsWith("[")&&e.endsWith("]")?e.slice(1,-1).trim():null}function eo(t){return"'"+t.replace(/'/g,"'\\''")+"'"}function kR(){return wR(ER(),".lmctl","config.toml")}function nh(t){let e=t??kR(),n;try{n=yR(e,"utf-8")}catch{return{tools:{}}}return IR(n)}function th(t){if(typeof t=="number")return Number.isFinite(t)?t:null;let e=String(t).trim();if(!e)return null;let n=e.match(/^(\d+(?:\.\d+)?)\s*([KkMm]?)$/);if(!n)return null;let r=parseFloat(n[1]);if(!Number.isFinite(r))return null;switch(n[2]){case"K":case"k":return Math.round(r*1e3);case"M":case"m":return Math.round(r*1e6);default:return Math.round(r)}}function IR(t){let e={},n={},r=t.split(`
1500
+ `).replace(/\\t/g," ").replace(/\\r/g,"\r")}function J(t,e){return t.length<=e?t:t.slice(0,e-3)+"..."}function Ut(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)?t:void 0}var we,Wt=E(()=>{"use strict";we=fR()});import{readdir as Zi,stat as z_,unlink as mR}from"node:fs/promises";import{join as kr,basename as Z_}from"node:path";function pR(t){return t==="file-history-snapshot"||t==="progress"||t==="system"||t==="queue-operation"}function _R(t){if(t.type==="system"){let e=t.message?.content;if(typeof e=="string"&&e.trim())return pe(e.trim());if(e!==void 0)return JSON.stringify(e,null,2)}return t.type==="progress"&&t.data!==void 0?JSON.stringify(t.data,null,2):JSON.stringify(t,null,2)}async function Q_(t){let e=0,n=0,r=0,s=0,i=0,o=0,a;for await(let l of Be(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;n+=d+f+m,r+=m,s+=f,i+=p;let _=d+f+m;_&&(o=_),a={inputTokens:d,cacheWriteInputTokens:f,cachedInputTokens:m,outputTokens:p}}}}return{messageCount:e,totalInputTokens:n,totalCacheReadInputTokens:r,totalCacheWriteInputTokens:s,totalOutputTokens:i,lastInputTokens:o,lastTokenUsage:a}}function hR(t){let e=gR(t),n=new Set;for(let r of t){if(r.role!=="tool_use"||r.toolName!=="Bash"||r.toolInputData?.run_in_background!==!0||r.toolCallId===void 0)continue;let s=e.get(r.toolCallId);if(s===void 0)continue;let i=s.content.match(/Command running in background with ID:\s*([A-Za-z0-9_-]+)/)?.[1];i!==void 0&&(n.add(i),r.backgroundTaskId=i,s.backgroundTaskId=i)}for(let r of t){if(r.role!=="tool_use"||r.toolName!=="TaskOutput"&&r.toolName!=="TaskStop"||r.toolCallId===void 0)continue;let s=r.toolInputData?.task_id;if(typeof s!="string"||!n.has(s))continue;r.backgroundTaskId=s;let i=e.get(r.toolCallId);i!==void 0&&(i.backgroundTaskId=s)}}function gR(t){let e=new Map;for(let n of t)n.role==="tool_result"&&n.toolCallId!==void 0&&e.set(n.toolCallId,n);return e}var Qi,eh=E(()=>{"use strict";Wt();Qi=class{name="claude";claudeDir;projectsDir;constructor(e={}){this.claudeDir=e.claudeDir||kr(we,".claude"),this.projectsDir=kr(this.claudeDir,"projects")}getWatchPaths(){return[{directory:this.projectsDir,filePattern:/\.jsonl$/}]}async discoverSessions(){let e=[],n;try{n=await Zi(this.projectsDir)}catch{return e}for(let r of n){let s=kr(this.projectsDir,r);if(!(await z_(s).catch(()=>null))?.isDirectory())continue;let o;try{o=await Zi(s)}catch{continue}for(let a of o){if(!a.endsWith(".jsonl"))continue;let l=Z_(a,".jsonl");if(!/^[0-9a-f]{8}-/.test(l))continue;let c=kr(s,a);try{let u=await this.extractSummary(c,l);u&&e.push(u)}catch{}}}return e}async extractSummary(e,n){let r=await Ke(e,50),s=await Le(e),i="",o,a,l,c,u,d;for(let m of r)if(!pR(m.type)&&(!i&&m.cwd&&(i=m.cwd),!o&&m.slug&&(o=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=J(p.trim(),80)),u=J(p.trim(),80)}}if(!i)return null;let f=await Q_(e);return{provider:"claude",sessionId:n,slug:o,cwd:i,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 n=await this.resolveSessionFile(e);if(!n)return null;let r=await Le(n),s=[],i="",o,a,l,c,u,d,f,m=e,p;for await(let h of Be(n))if(h.type!=="file-history-snapshot"&&!h.isSidechain){if(!i&&h.cwd&&(i=h.cwd),!o&&h.slug&&(o=h.slug),!a&&h.version&&(a=h.version),!c&&h.gitBranch&&(c=h.gitBranch),!f&&h.timestamp&&(f=new Date(h.timestamp)),h.sessionId&&(m=h.sessionId),h.type==="system"||h.type==="progress"||h.type==="queue-operation"){s.push({role:"system",timestamp:new Date(h.timestamp||0),content:_R(h)});continue}if(h.type==="user"&&h.message){if(h.isMeta)continue;let g=new Date(h.timestamp||0),y=h.message.content;if(typeof y=="string"){if(y.includes("<command-name>")||y.includes("<local-command-"))continue;u||(u=J(y.trim(),80)),d=J(y.trim(),80),p=void 0,s.push({role:"user",timestamp:g,content:pe(y.trim())})}else if(Array.isArray(y)){for(let w of y)if(w.type==="tool_result"){let S=typeof w.content=="string"?pe(w.content):JSON.stringify(w.content);s.push({role:"tool_result",timestamp:g,content:S,toolCallId:w.tool_use_id})}}}if(h.type==="assistant"&&h.message){h.message.stop_reason===null||h.message.stop_reason==="tool_use"?p="in_progress":typeof h.message.stop_reason=="string"&&(p="complete"),h.message.model&&(l=h.message.model);let g=new Date(h.timestamp||0),y=h.message.content;if(Array.isArray(y))for(let w of y)w.type==="text"&&w.text?s.push({role:"assistant",timestamp:g,content:pe(w.text),model:h.message.model,...typeof h.message.stop_reason=="string"?{stopReason:h.message.stop_reason}:{}}):w.type==="tool_use"?s.push({role:"tool_use",timestamp:g,content:w.name||"unknown tool",toolName:w.name,toolInput:JSON.stringify(w.input,null,2),toolInputData:w.input,toolCallId:w.id,model:h.message.model,...typeof h.message.stop_reason=="string"?{stopReason:h.message.stop_reason}:{}}):w.type==="thinking"&&w.thinking&&s.push({role:"thinking",timestamp:g,content:w.thinking})}}if(!i)return null;hR(s);let _=await Q_(n);return{provider:"claude",sessionId:m,slug:o,cwd:i,createdAt:f||r.createdAt,modifiedAt:r.modifiedAt,model:l,cliVersion:a,startCommand:"claude",gitBranch:c,turnStatus:p,firstUserMessage:u,lastUserMessage:d,messageCount:_.messageCount,filePath:n,totalInputTokens:_.totalInputTokens||void 0,totalCachedInputTokens:_.totalCacheReadInputTokens||void 0,totalCacheWriteInputTokens:_.totalCacheWriteInputTokens||void 0,totalOutputTokens:_.totalOutputTokens||void 0,lastInputTokens:_.lastInputTokens||void 0,lastTokenUsage:_.lastTokenUsage,messages:s}}async resolveSessionPath(e){return this.resolveSessionFile(e)}async deleteSession(e){let n=await this.resolveSessionFile(e);return n?(await mR(n),!0):!1}async resolveSessionFile(e){let n;try{n=await Zi(this.projectsDir)}catch{return null}let r=[];for(let o of n){let a=kr(this.projectsDir,o);if(!(await z_(a).catch(()=>null))?.isDirectory())continue;let c;try{c=await Zi(a)}catch{continue}for(let u of c){if(!u.endsWith(".jsonl"))continue;let d=Z_(u,".jsonl");/^[0-9a-f]{8}-/.test(d)&&r.push({filePath:kr(a,u),fileSessionId:d})}}let s=r.find(o=>o.fileSessionId===e);if(s)return s.filePath;let i=r.filter(o=>o.fileSessionId.startsWith(e));if(i.length===1)return i[0].filePath;for(let o of r){let a=await Ke(o.filePath,20);for(let l of a)if(l.slug&&l.slug===e)return o.filePath}return null}}});import{readFileSync as yR,writeFileSync as a8,mkdirSync as l8}from"node:fs";import{join as wR,dirname as d8}from"node:path";import{homedir as ER}from"node:os";function SR(t){return t.startsWith('"')&&t.endsWith('"')||t.startsWith("'")&&t.endsWith("'")?t.slice(1,-1):t}function vR(t){let e=t.indexOf("=");if(e===-1)return null;let n=t.slice(0,e).trim(),r=SR(t.slice(e+1).trim());return n?{key:n,value:r}:null}function bR(t){let e=t.trim();return e.startsWith("[")&&e.endsWith("]")?e.slice(1,-1).trim():null}function eo(t){return"'"+t.replace(/'/g,"'\\''")+"'"}function kR(){return wR(ER(),".lmctl","config.toml")}function nh(t){let e=t??kR(),n;try{n=yR(e,"utf-8")}catch{return{tools:{}}}return IR(n)}function th(t){if(typeof t=="number")return Number.isFinite(t)?t:null;let e=String(t).trim();if(!e)return null;let n=e.match(/^(\d+(?:\.\d+)?)\s*([KkMm]?)$/);if(!n)return null;let r=parseFloat(n[1]);if(!Number.isFinite(r))return null;switch(n[2]){case"K":case"k":return Math.round(r*1e3);case"M":case"m":return Math.round(r*1e6);default:return Math.round(r)}}function IR(t){let e={},n={},r=t.split(`
1501
1501
  `),s={kind:"none"},i={},o=!1,a={};function l(){if(s.kind==="tool"){let d=e[s.tool]??{};if(s.profile){let f=d.profiles?.[s.profile]??{};i.description&&(f.description=i.description),i.flags!==void 0&&(f.flags=i.flags),d.profiles||(d.profiles={}),d.profiles[s.profile]=f}else i.start&&(d.start=i.start),i.resume&&(d.resume=i.resume),i.agent&&(d.agent=i.agent),i.profile_flag!==void 0&&(d.profile_flag=i.profile_flag);e[s.tool]=d}else if(s.kind==="compact"){let d=s.provider?n.providers?.[s.provider]??{}:n.global??{};if(i.min!==void 0){let f=th(i.min);f!==null&&(d.min=f)}if(i.max!==void 0){let f=th(i.max);f!==null&&(d.max=f)}s.provider?(n.providers||(n.providers={}),n.providers[s.provider]=d):n.global=d}i={}}for(let d of r){let f=d.trim();if(!f||f.startsWith("#"))continue;let m=bR(f);if(m!==null){if(o=!0,l(),m.startsWith("tool.")){let _=".profile.",h=m.indexOf(_);h!==-1?s={kind:"tool",tool:m.slice(5,h),profile:m.slice(h+_.length)}:s={kind:"tool",tool:m.slice(5),profile:null}}else m==="compact"?s={kind:"compact",provider:null}:m.startsWith("compact.")?s={kind:"compact",provider:m.slice(8)}:s={kind:"none"};continue}let p=vR(f);p&&s.kind!=="none"?i[p.key]=p.value:p&&!o&&(a[p.key]=p.value)}l();let c={tools:e};(n.global||n.providers)&&(c.compact=n);let u=a.site_name;return u!==void 0&&u.length>0&&(c.site_name=u),c}function rh(t){return t.site_name??null}function NR(t,e,n){if(!n)return"";let r=t.tools[e]??Ec[e],s=r?.profiles?.[n]?.flags??Ec[e]?.profiles?.[n]?.flags;if(s!==void 0)return s.trim();if(r?.profile_flag)return r.profile_flag.replace(/\{\{profile\}\}/g,n).trim();throw new Error(`Profile "${n}" is not configured for tool "${e}"`)}function sh(t,e){return!!t.tools[e]}function ih(t,e,n,r,s){let i=t.tools[e]??Ec[e],o;if(i?.agent){let l=eo(r);o=i.agent.replace(/\{\{session_id\}\}/g,n).replace(/\{\{prompt\}\}/g,l)}else{let l=TR[e];if(!l)throw new Error(`No agent command configured for tool "${e}"`);let c=l.argv.map(u=>u.replace(/\{\{session_id\}\}/g,n).replace(/\{\{prompt\}\}/g,r));if(l.mode==="stdin"){let u=c.map(eo).join(" ");o=`printf '%s\\n' ${eo(r)} | ${u}`}else o=c.map(eo).join(" ")}let a=NR(t,e,s);return a&&(o+=" "+a),o}var Ec,TR,Tc=E(()=>{"use strict";Ec={claude:{start:"claude",resume:"claude --resume {{session_id}} --dangerously-skip-permissions",profiles:{default:{description:"Default profile",flags:""}}},codex:{start:"codex",resume:"codex resume {{session_id}} --dangerously-bypass-approvals-and-sandbox",profiles:{default:{description:"Default profile",flags:""}}},opencode:{start:"opencode",resume:"opencode --session {{session_id}}",profiles:{default:{description:"Default profile",flags:""}}},gemini:{start:"gemini",resume:"gemini --resume {{session_id}} -y",profiles:{default:{description:"Default profile",flags:""}}},copilot:{start:"copilot",resume:"copilot --resume={{session_id}} --yolo",profiles:{default:{description:"Default profile",flags:""}}},qwen:{start:"qwen",resume:"qwen --resume {{session_id}} --approval-mode yolo",profiles:{default:{description:"Default profile",flags:""}}},agy:{start:"agy",resume:"agy --conversation {{session_id}} --dangerously-skip-permissions",profiles:{default:{description:"Default profile",flags:""}}},kimi:{start:"kimi --auto",resume:"kimi --session {{session_id}} --auto",profiles:{default:{description:"Default profile",flags:""}}}},TR={claude:{mode:"argv",argv:["claude","-p","{{prompt}}","--resume","{{session_id}}"]},codex:{mode:"argv",argv:["codex","exec","--dangerously-bypass-approvals-and-sandbox","--skip-git-repo-check","resume","{{session_id}}","{{prompt}}"]},opencode:{mode:"argv",argv:["opencode","run","--session","{{session_id}}","{{prompt}}"]},gemini:{mode:"argv",argv:["gemini","-p","{{prompt}}","--resume","{{session_id}}"]},copilot:{mode:"argv",argv:["gh","copilot","--","--resume={{session_id}}","-p","{{prompt}}","-s","--allow-all-tools"]},qwen:{mode:"argv",argv:["qwen","-p","{{prompt}}","--resume","{{session_id}}","--approval-mode","yolo"]},agy:{mode:"argv",argv:["agy","--conversation","{{session_id}}","-p","{{prompt}}","--dangerously-skip-permissions","--print-timeout","8h"]},kimi:{mode:"argv",argv:["kimi","-p","{{prompt}}","--session","{{session_id}}","--output-format","stream-json"]}}});function oh(t=process.env){let e=t.LMCTL_ONE_SHOT_TIMEOUT_MS;if(!e)return 6e5;let n=Number(e);return!Number.isFinite(n)||n<=0?6e5:n}var ah=E(()=>{"use strict"});var AR,_e,to,ut=E(()=>{"use strict";AR="ACK: waiting for explicit lmctl task.",_e=`lmctl seed initial connection only. Create or pin this provider session, then stop. Do not inspect files, run commands, infer a task, delegate, edit, or begin work. Reply exactly: ${AR}`,to=`send this exact lmctl seed instruction: "${_e}"`});import{existsSync as xR}from"node:fs";function lh(t){let e=t.CLAUDE_CODE_EXECPATH;if(e===void 0||e.length===0)return t;let n=process.platform!=="win32"&&e.toLowerCase().endsWith(".exe"),r=!n&&!xR(e);if(!n&&!r)return t;D({event:"claude_execpath_sanitized",reason:n?"wrong_platform_exe":"missing_file",value:e,platform:process.platform});let s={...t};return delete s.CLAUDE_CODE_EXECPATH,s}function wn(t,e){let n={...t??process.env,PWD:e};return delete n.OLDPWD,n}function LR(t,e){return e===void 0||e.length===0?t:{...t??process.env,[Ns]:e}}function Ve(t,e,n,r="chat"){return{...LR(wn(t,e),n),[RR]:r}}var Ns,RR,Et=E(()=>{"use strict";de();Ns="LMCTL_SELF_SESSIONID",RR="LMCTL_LAUNCH_SOURCE"});import{spawn as ch}from"node:child_process";import{mkdirSync as OR}from"node:fs";var Sc,ve,Tt=E(()=>{"use strict";Tc();ah();ut();Et();Sc=class t extends Error{cancelReason;constructor(e,n){super(e),this.name="TurnAbortError",this.cancelReason=n,Object.setPrototypeOf(this,t.prototype)}},ve=class t{name;capabilities;injection;provider;binary;seedArgs;seedStdin;resumeTemplate;startTemplate;transportFn;constructor(e){this.name=e.provider.name,this.provider=e.provider,this.capabilities=e.capabilities,this.injection=e.injection,this.binary=e.binary,this.seedArgs=e.seedArgs,this.seedStdin=e.seedStdin,this.resumeTemplate=e.resumeTemplate,this.startTemplate=e.startTemplate,this.transportFn=e.transport}discover(){return this.provider.discoverSessions()}load(e){return this.provider.loadSession(e)}resolvePath(e){return this.provider.resolveSessionPath(e)}delete(e){return this.provider.deleteSession(e)}getWatchPaths(){return this.provider.getWatchPaths?.()??[]}seedArgsFor(e){let n=e?.prompt;return n===void 0?this.seedArgs:this.seedArgs.map(r=>r===_e?n:r)}seed(e,n){return OR(e,{recursive:!0}),new Promise(r=>{let s;try{s=ch(this.binary,this.seedArgsFor(n),{cwd:e,env:wn(void 0,e),stdio:["pipe","pipe","pipe"],timeout:6e4})}catch(a){return r({success:!1,error:a instanceof Error?a.message:String(a)})}let i="";s.stderr?.on("data",a=>{i+=a.toString()});let o=n?.prompt!==void 0&&this.seedStdin!==void 0?`${n.prompt}
1502
1502
  `:this.seedStdin;o&&s.stdin?.write(o),s.stdin?.end(),s.on("exit",a=>{r(a===0||a===null?{success:!0}:{success:!1,error:i.trim().slice(0,200)||`exit code ${a}`})}),s.on("error",a=>{r({success:!1,error:a.message})})})}resumeCommand(e,n){return this.resumeTemplate.replace(/\{\{session_id\}\}/g,e)}startCommand(e){return this.startTemplate}manualSeedHint(e){return{launchCommand:`cd ${e} && ${this.binary}`,postLaunchNote:to,lsCommand:`lmctl ls --provider ${this.name} --sessiondir ${e}`}}static DEFAULT_IDLE_TIMEOUT_MS=8*60*60*1e3;sendTurn(e,n){if(n.userConfig&&sh(n.userConfig,this.name)){let s=n.userConfig.tools[this.name];if(s?.agent)return this.runOneShotAgent(e,n,s.agent)}let r=n.timeoutMs??t.DEFAULT_IDLE_TIMEOUT_MS;return r<=0&&!n.signal?this.transportFn(e,{...n,binary:this.binary}):this.withTimeouts(r,e,n)}withTimeouts(e,n,r){let s=new AbortController,i,o,a="",l,c=()=>{e<=0||(clearTimeout(i),i=setTimeout(()=>{r.onIdleWarning?.(e),u(),s.abort(),l&&l({text:a,sessionId:r.sessionId,durationMs:e,status:"stalled",stalledAfterMs:e})},e))},u=()=>{clearTimeout(i)};r.signal&&(r.signal.aborted?(o="external",s.abort()):r.signal.addEventListener("abort",()=>{o="external",s.abort()},{once:!0})),c();let d={...r,binary:this.binary,signal:s.signal,onDelta:p=>{a+=p,c(),r.onDelta?.(p)},onProgress:p=>{p.kind!=="api_retry"&&c(),r.onProgress?.(p)}},f=this.transportFn(n,d).then(p=>(u(),{...p,status:"ok"})).catch(p=>{throw u(),o==="external"?new Sc("Turn cancelled","external"):p}),m=new Promise(p=>{l=p});return Promise.race([f,m])}runOneShotAgent(e,n,r){let s=ih(n.userConfig,this.name,n.sessionId,e,n.profile),i=Date.now();return new Promise((o,a)=>{let l=oh(n.env),c=ch(s,{shell:!0,cwd:n.cwd,env:Ve(n.env,n.cwd,n.sessionId),stdio:["pipe","pipe","pipe"]}),u=!1,d=!1,f=setTimeout(()=>{d=!0,c.kill()},l),m="",p="";if(c.stdout?.on("data",_=>{let h=_.toString();m+=h,n.onDelta?.(h)}),c.stderr?.on("data",_=>{p+=_.toString()}),n.signal){if(n.signal.aborted)return clearTimeout(f),c.kill(),a(new Error("Aborted"));n.signal.addEventListener("abort",()=>c.kill(),{once:!0})}c.on("exit",_=>{if(u)return;u=!0,clearTimeout(f);let h=Date.now()-i;d?a(new Error(`Agent command timed out after ${l}ms`)):_===0||_===null?o({text:m.trim(),sessionId:n.sessionId,durationMs:h}):a(new Error(p.trim().slice(0,200)||`Agent command exited with code ${_}`))}),c.on("error",_=>{u||(u=!0,clearTimeout(f),a(_))})})}}});function ro(t,e){let n;if(e&&typeof e=="object"){let r=e.code;typeof r=="number"&&(n=r)}return new nn(t,n,e)}var ft,be,tn,no,nn,Ir=E(()=>{"use strict";ft=class extends Error{constructor(e,n){super(e,n),this.name=this.constructor.name}},be=class extends ft{},tn=class extends ft{exitCode;signal;stderr;constructor(e,n,r=null,s){super(e),this.exitCode=n,this.signal=r,this.stderr=s}},no=class extends ft{line;constructor(e,n,r){super(e,{cause:r}),this.line=n}},nn=class extends ft{rpcCode;rpcData;constructor(e,n,r){super(e),n!==void 0&&(this.rpcCode=n),r!==void 0&&(this.rpcData=r)}}});import*as bc from"node:child_process";function $R(t){if(typeof bc.spawnSync=="function")try{bc.spawnSync("taskkill",["/T","/F","/PID",String(t)],{windowsHide:!0})}catch{}}function dh(t){return t.exitCode!==null||t.signalCode!==null}function vc(t,e){return dh(t)?Promise.resolve(!0):new Promise(n=>{let r=!1,s=()=>{r||(r=!0,clearTimeout(i),n(!0))},i=setTimeout(()=>{r||(r=!0,t.removeListener("exit",s),n(!1))},e);t.once("exit",s)})}async function et(t,e={}){let n=Date.now(),r=e.stdinEnd!==!1,s=e.softDelayMs??5e3,i=e.killDelayMs??5e3,o=e.platform??process.platform,a=e.runTaskkill??$R;if(dh(t))return{signal:"natural",elapsedMs:Date.now()-n};if(r&&t.stdin&&!t.stdin.destroyed)try{t.stdin.end()}catch{}if(await vc(t,s))return{signal:"stdin",elapsedMs:Date.now()-n};if(o==="win32"&&typeof t.pid=="number")a(t.pid);else try{t.kill("SIGTERM")}catch{}if(await vc(t,i))return{signal:"SIGTERM",elapsedMs:Date.now()-n};if(o!=="win32")try{t.kill("SIGKILL")}catch{}return await vc(t,CR)?{signal:"SIGKILL",elapsedMs:Date.now()-n}:{signal:"abandoned",elapsedMs:Date.now()-n}}var CR,As=E(()=>{"use strict";CR=1e3});function uh(t){ce()&&Me({event:"legacy",msg:`[debug] ${t}`},{always:!0})}function En(t,e){let n=DR[t];if(n)return n[e]??n.yolo}function PR(t,e){if(e.length===0)return!0;for(let n=0;n+e.length<=t.length;n++){let r=!0;for(let s=0;s<e.length;s++)if(t[n+s]!==e[s]){r=!1;break}if(r)return!0}return!1}function tt(t,e,n="yolo"){if(jR.has(t)){uh(`YOLO ${t} [mode=${n}]: ${t==="codex"?`JSON-RPC params (approvalPolicy=never, sandbox=${n==="plan"?"read-only":"danger-full-access"})`:t==="opencode"?".opencode/opencode.json (permission=allow)":t==="kimi"?`ACP session/set_config_option (configId=mode, value=${n==="plan"?"plan":"auto"})`:t==="dsh"?"DSH_PERMISSION_MODE=danger-full-access env var on the sidecar spawn \u2014 no argv flag":"protocol/config (out-of-band)"} \u2014 no argv flag`);return}let r=n==="plan"?En(t,"plan"):MR[t];if(!r){let s=`unknown provider "${t}" \u2014 YOLO contract not configured. Add an entry to YOLO_FLAGS in src/providers/yolo-contract.ts before spawning this provider.`;throw D({event:"yolo_assert_failed",provider:t,reason:"unconfigured_provider",args:e.join(" "),message:s}),new be(s)}if(!PR(e,r)){let s=r.join(" "),i=`${t} spawn missing YOLO flag '${s}' \u2014 YOLO is mandatory for every provider; see src/providers/yolo-contract.ts. Got argv: [${e.map(o=>JSON.stringify(o)).join(", ")}]`;throw D({event:"yolo_assert_failed",provider:t,reason:"flag_missing",required_flag:s,mode:n,args:e.join(" "),message:i}),new be(i)}uh(`YOLO ${t} [mode=${n}]: argv flag '${r.join(" ")}'`)}var MR,DR,jR,Vn=E(()=>{"use strict";Ir();de();MR={claude:["--dangerously-skip-permissions"],qwen:["--approval-mode","yolo"],gemini:["-y"],copilot:["--yolo"],agy:["--dangerously-skip-permissions"],lmplayer:["--dangerously-skip-permissions"]},DR={claude:{yolo:["--dangerously-skip-permissions"],plan:["--permission-mode","plan"]},qwen:{yolo:["--approval-mode","yolo"],plan:["--approval-mode","plan"]},gemini:{yolo:["-y"],plan:["--approval-mode","plan"]},copilot:{yolo:["--yolo"],plan:["--yolo"]},agy:{yolo:["--dangerously-skip-permissions"],plan:["--dangerously-skip-permissions"]},lmplayer:{yolo:["--dangerously-skip-permissions"],plan:["--dangerously-skip-permissions"]}};jR=new Set(["codex","opencode","kimi","dsh"])});async function HR(t,e,n){if(typeof t=="boolean")return t;let r,s;try{return await Promise.race([t,new Promise(i=>{r=setTimeout(()=>i(kc),e),r.unref?.(),n!==void 0&&(s=()=>i(kc),n.addEventListener("abort",s,{once:!0}))})])}finally{r!==void 0&&clearTimeout(r),s!==void 0&&n?.removeEventListener("abort",s)}}function so(t,e){if(t===void 0){e.closeStdin();return}let n=!1,r=i=>{if(!n){n=!0;try{t.onRelease?.({elapsedMs:Date.now()-i.startedMs,held:i.held,reason:i.reason})}catch{}}e.closeStdin()},s=Date.now();XR(t,e,s,r).catch(()=>{r({startedMs:s,held:!1,reason:"check-error"})})}async function XR(t,e,n,r){let s=t.pollMs??FR,i=t.maxHoldMs??UR,o=t.settleMs??WR,a=t.backgroundGraceMs??qR,l=!1,c=null,u=d=>r({startedMs:n,held:l,reason:d});for(;;){if(e.isAborted())return u("aborted");if(e.hasChildExited())return u("child-exited");let d=i-(Date.now()-n);if(d<=0)return u("max-hold");let f;try{f=await HR(t.hasOutstandingWork(),d,e.signal)}catch{return u("check-error")}if(f===kc)return u(e.isAborted()||e.signal?.aborted===!0?"aborted":"max-hold");if(f)c=null;else{if(!l&&e.wasBackgroundJobLaunched?.()===!0&&Date.now()-n<a){let _=a-(Date.now()-n);await new Promise(h=>setTimeout(h,Math.max(0,Math.min(s,BR,_))).unref?.());continue}if(!l||o<=0)return u("cleared");c===null&&(c=Date.now(),Ge(`${e.label}: dispatched work cleared \u2014 settling ${o}ms before closing stdin`));let p=Math.max(c,e.lastEventAtMs());if(!e.isTurnInFlight()&&Date.now()-p>=o)return u("cleared")}if(l||(l=!0,t.onHold?.(),Ge(`${e.label}: deferring stdin close \u2014 outstanding dispatched work (poll ${s}ms)`)),Date.now()-n>=i)return D({event:"transport_hold_open_max_wait",provider:e.label,elapsed_ms:Date.now()-n}),u("max-hold");let m=Math.max(0,Math.min(s,i-(Date.now()-n)));await new Promise(p=>setTimeout(p,m).unref?.())}}var FR,UR,WR,qR,BR,kc,Ic=E(()=>{"use strict";de();FR=2e3,UR=8*60*60*1e3,WR=5e3,qR=1e3,BR=50,kc=Symbol("check-timed-out")});function fh(t){if(t.length===0)return"";if(t.length===1)return t[0];let e=[];for(let n=0;n<t.length;n++)n===0?e.push(t[n]):e.push(`
1503
1503
 
@@ -1507,15 +1507,15 @@ var ux=Object.defineProperty;var E=(t,e)=>()=>(t&&(e=t(t=0)),e);var ae=(t,e)=>{f
1507
1507
  One possible cause: the provider stream ended before a complete response was delivered; for Claude Code this can appear as "API Error: Stream idle timeout - partial response received".`;return e?`Original provider error:
1508
1508
  ${e}
1509
1509
 
1510
- ${n}`:n}function ph(t,e){return new Promise((n,r)=>{let s=e.tool||"claude",i=e.binaryPath||KR[s]||"claude",o=["-p","","--output-format","stream-json","--input-format","stream-json"];s==="claude"&&o.push("--verbose"),e.sessionId&&o.push("--resume",e.sessionId),e.model&&o.push("--model",e.model);let a=e.permissionMode??"yolo",l=En(s,a)??YR[s]??["--dangerously-skip-permissions"];o.push(...l);try{tt(s,o,a)}catch(b){return r(b)}if(e.cwd&&!GR(e.cwd))return D({event:"transport_error",provider:s,error_class:"TransportConnectionError",error_message:`sessiondir missing: ${e.cwd}`,elapsed_ms:0}),r(new be(`sessiondir missing: ${e.cwd}`,{cause:Object.assign(new Error("cwd missing"),{code:"ENOENT_CWD"})}));let c=Ve(e.env,e.cwd,e.sessionId),u=JR(i,o,{cwd:e.cwd,stdio:["pipe","pipe","pipe"],env:s==="claude"?lh(c):c});u.stdin?.on("error",b=>{Ge(`stream-json: stdin pipe error, ignored (exit handler reports): ${b.message}`)});let d=!1;if(e.signal){if(e.signal.aborted)return d=!0,D({event:"transport_abort",provider:s,phase:"pre_spawn"}),et(u).catch(()=>{}),r(new Error("Aborted"));e.signal.addEventListener("abort",()=>{d=!0,D({event:"transport_abort",provider:s}),et(u).catch(()=>{}),r(new Error("Aborted"))},{once:!0})}let f="",m=!1,p=!1,_=0,h=!1,g=Nc({onEvent:b=>{_=Date.now(),h=b.type!=="result",e.onEvent?.(b)},onText:e.onText});function w(){p||(p=!0,so(e.holdOpen,{isAborted:()=>d,hasChildExited:()=>m,isTurnInFlight:()=>h,lastEventAtMs:()=>_,closeStdin:()=>{u.stdin?.end()},signal:e.signal,label:e.tool||"claude"}))}function y(b){let M=g.sawResult();g.processLine(b),!M&&g.sawResult()&&w()}u.stdout?.on("data",b=>{f+=b.toString();let M=f.split(`
1511
- `);f=M.pop()||"";for(let U of M)y(U)});let S="";u.stderr?.on("data",b=>{S+=b.toString()}),u.on("error",b=>{D({event:"transport_error",provider:s,error_class:"TransportConnectionError",error_message:b.message}),r(new be(`Failed to spawn ${i}: ${b.message}`,{cause:b}))}),u.on("exit",b=>{if(m=!0,d)return;f.trim()&&y(f);let M=g.finalize();M?(Ge(`stream-json: result ${M.result.slice(0,80)}${M.result.length>80?"...":""} (${M.durationMs}ms)`),n({...M,exitCode:b})):(D({event:"transport_error",provider:s,error_class:"Error",reason:"provider_no_result",exit_code:b,stderr_tail:S.slice(0,500)}),r(new Error(VR({tool:s,exitCode:b,stderr:S}))))});let k=JSON.stringify({type:"user",message:{role:"user",content:t}});u.stdin?.write(k+`
1510
+ ${n}`:n}function ph(t,e){return new Promise((n,r)=>{let s=e.tool||"claude",i=e.binaryPath||KR[s]||"claude",o=["-p","","--output-format","stream-json","--input-format","stream-json"];s==="claude"&&o.push("--verbose"),e.sessionId&&o.push("--resume",e.sessionId),e.model&&o.push("--model",e.model);let a=e.permissionMode??"yolo",l=En(s,a)??YR[s]??["--dangerously-skip-permissions"];o.push(...l);try{tt(s,o,a)}catch(b){return r(b)}if(e.cwd&&!GR(e.cwd))return D({event:"transport_error",provider:s,error_class:"TransportConnectionError",error_message:`sessiondir missing: ${e.cwd}`,elapsed_ms:0}),r(new be(`sessiondir missing: ${e.cwd}`,{cause:Object.assign(new Error("cwd missing"),{code:"ENOENT_CWD"})}));let c=Ve(e.env,e.cwd,e.sessionId),u=JR(i,o,{cwd:e.cwd,stdio:["pipe","pipe","pipe"],env:s==="claude"?lh(c):c});u.stdin?.on("error",b=>{Ge(`stream-json: stdin pipe error, ignored (exit handler reports): ${b.message}`)});let d=!1;if(e.signal){if(e.signal.aborted)return d=!0,D({event:"transport_abort",provider:s,phase:"pre_spawn"}),et(u).catch(()=>{}),r(new Error("Aborted"));e.signal.addEventListener("abort",()=>{d=!0,D({event:"transport_abort",provider:s}),et(u).catch(()=>{}),r(new Error("Aborted"))},{once:!0})}let f="",m=!1,p=!1,_=0,h=!1,g=Nc({onEvent:b=>{_=Date.now(),h=b.type!=="result",e.onEvent?.(b)},onText:e.onText});function y(){p||(p=!0,so(e.holdOpen,{isAborted:()=>d,hasChildExited:()=>m,isTurnInFlight:()=>h,lastEventAtMs:()=>_,closeStdin:()=>{u.stdin?.end()},signal:e.signal,label:e.tool||"claude"}))}function w(b){let M=g.sawResult();g.processLine(b),!M&&g.sawResult()&&y()}u.stdout?.on("data",b=>{f+=b.toString();let M=f.split(`
1511
+ `);f=M.pop()||"";for(let U of M)w(U)});let S="";u.stderr?.on("data",b=>{S+=b.toString()}),u.on("error",b=>{D({event:"transport_error",provider:s,error_class:"TransportConnectionError",error_message:b.message}),r(new be(`Failed to spawn ${i}: ${b.message}`,{cause:b}))}),u.on("exit",b=>{if(m=!0,d)return;f.trim()&&w(f);let M=g.finalize();M?(Ge(`stream-json: result ${M.result.slice(0,80)}${M.result.length>80?"...":""} (${M.durationMs}ms)`),n({...M,exitCode:b})):(D({event:"transport_error",provider:s,error_class:"Error",reason:"provider_no_result",exit_code:b,stderr_tail:S.slice(0,500)}),r(new Error(VR({tool:s,exitCode:b,stderr:S}))))});let k=JSON.stringify({type:"user",message:{role:"user",content:t}});u.stdin?.write(k+`
1512
1512
  `),Ge(`stream-json: prompt sent (${t.length} chars)`)})}var KR,YR,_h=E(()=>{"use strict";Ir();As();Vn();de();Ic();Et();Ac();Ac();KR={claude:"claude",qwen:"qwen"};YR={claude:["--dangerously-skip-permissions"],qwen:["--approval-mode","yolo"]}});function io(t={}){return[]}var xc=E(()=>{"use strict"});function Rc(t){return t==="plan"?"read-only":"danger-full-access"}function hh(t="0.0.0"){return{clientInfo:{name:"lmctl",title:"lmctl",version:t},capabilities:{experimentalApi:!1}}}function Lc(){return{agentItems:new Map,resultText:""}}function oo(t,e,n,r){let s=t.method;if(!s)return!1;let i=t.params;if(s==="turn/started")return e.agentItems.clear(),e.resultText="",!1;if(s==="item/started"){let o=i?.item;if(o?.type==="agentMessage"&&typeof o.id=="string"){let a=typeof o.phase=="string"?o.phase:void 0,l=a==="commentary"||a==="final_answer"?a:void 0;return e.agentItems.set(o.id,{phase:l,buffer:""}),!0}return!1}if(s==="item/agentMessage/delta"){let o=i?.delta||"",a=typeof i?.itemId=="string"?i.itemId:void 0;if(!o)return!0;let l=a?e.agentItems.get(a):void 0;return l?(l.phase==="commentary"||(l.buffer+=o),n?.(o),l.phase&&i&&(i._lmctlItemPhase=l.phase)):(e.resultText+=o,n?.(o)),!0}if(s==="item/completed"){let o=i?.item;if(o?.type==="agentMessage"&&typeof o.id=="string"){let a=e.agentItems.get(o.id);if(a){if(a.phase!=="commentary"){let l=typeof o.text=="string"?o.text:a.buffer;if(r&&typeof o.text=="string"&&o.text!==a.buffer){let c=typeof i?.threadId=="string"?i.threadId:void 0,u=typeof i?.turnId=="string"?i.turnId:void 0;r({itemId:o.id,threadId:c,turnId:u,expectedFromItemText:o.text,gotFromBuffer:a.buffer})}e.resultText+=l}e.agentItems.delete(o.id)}return!0}return!1}return!1}function Oc(t){for(let[,e]of t.agentItems.entries())e.phase!=="commentary"&&e.buffer&&(t.resultText+=e.buffer);t.agentItems.clear()}function gh(t){let e=t.params,n=e?.error,r=typeof n?.message=="string"?n.message:void 0,s=r&&r.length>0?r:"(no message)";return e?.willRetry===!0?{willRetry:!0}:{willRetry:!1,turnError:new Error(`Turn errored: ${s}`)}}function Cc(){return{pendingCodexError:null}}function $c(t,e){let n=gh(t);return n.willRetry||(e.pendingCodexError=n.turnError),n}function Mc(t,e){if(e.pendingCodexError){let i=e.pendingCodexError;return e.pendingCodexError=null,{shouldReject:!0,turnError:i}}let r=t.params?.turn;if((typeof r?.status=="string"?r.status:void 0)==="failed"){let i=r?.error,o=typeof i?.message=="string"?i.message:void 0,a=o&&o.length>0?o:"(no message)";return{shouldReject:!0,turnError:new Error(`Turn errored: ${a}`)}}return{shouldReject:!1}}var Dc=E(()=>{"use strict"});import{spawn as zR}from"node:child_process";import{createInterface as ZR}from"node:readline";import{existsSync as QR,readFileSync as eL}from"node:fs";import{fileURLToPath as tL}from"node:url";function rL(){return hh(nL)}function Tn(t,e){Ge(`[codex:${t}] ${JSON.stringify(e)}`)}function sL(t){let e=t.stderr.trim().slice(0,500),n=`lmctl: codex app-server exited with code ${t.exitCode} before completing the turn.
1513
1513
  One possible cause: Codex stopped before delivering a terminal turn/completed event.`;return e?`Original provider error:
1514
1514
  ${e}
1515
1515
 
1516
- ${n}`:n}function yh(t,e){return new Promise((n,r)=>{let s=e.binaryPath||"codex",i=["app-server","--listen","stdio://"];e.model&&i.push("-c",`model=${JSON.stringify(e.model)}`);let o=e.isLead??e.alias?.toLowerCase()==="lead",a=o?io():[];i.push(...a),ce()&&$e(JSON.stringify({event:"codex_mcp_inject",alias:e.alias??null,isLead:o,injected:a.length>0}));let l=e.permissionMode??"yolo",c=Rc(l);try{tt("codex",i,l)}catch(P){return r(P)}if(e.cwd&&!QR(e.cwd))return D({event:"transport_error",provider:"codex",error_class:"TransportConnectionError",error_message:`sessiondir missing: ${e.cwd}`}),r(new be(`sessiondir missing: ${e.cwd}`,{cause:Object.assign(new Error("cwd missing"),{code:"ENOENT_CWD"})}));let u=zR(s,i,{cwd:e.cwd,stdio:["pipe","pipe","pipe"],env:Ve(e.env,e.cwd,e.threadId)}),d=!1;if(e.signal){if(e.signal.aborted)return d=!0,D({event:"transport_abort",provider:"codex",phase:"pre_spawn"}),et(u).catch(()=>{}),r(new Error("Aborted"));e.signal.addEventListener("abort",()=>{d=!0,D({event:"transport_abort",provider:"codex"}),et(u).catch(()=>{}),r(new Error("Aborted"))},{once:!0})}let f=ZR({input:u.stdout}),m=new Map,p=1,_=e.threadId||"",h="",g=!1,w=!1,y=Date.now(),S=Lc(),k=Cc();function b(P,x={}){return new Promise((R,re)=>{let X=p++;m.set(X,{resolve:R,reject:re});let N=JSON.stringify({jsonrpc:"2.0",id:X,method:P,params:x});u.stdin?.write(N+`
1516
+ ${n}`:n}function yh(t,e){return new Promise((n,r)=>{let s=e.binaryPath||"codex",i=["app-server","--listen","stdio://"];e.model&&i.push("-c",`model=${JSON.stringify(e.model)}`);let o=e.isLead??e.alias?.toLowerCase()==="lead",a=o?io():[];i.push(...a),ce()&&$e(JSON.stringify({event:"codex_mcp_inject",alias:e.alias??null,isLead:o,injected:a.length>0}));let l=e.permissionMode??"yolo",c=Rc(l);try{tt("codex",i,l)}catch(P){return r(P)}if(e.cwd&&!QR(e.cwd))return D({event:"transport_error",provider:"codex",error_class:"TransportConnectionError",error_message:`sessiondir missing: ${e.cwd}`}),r(new be(`sessiondir missing: ${e.cwd}`,{cause:Object.assign(new Error("cwd missing"),{code:"ENOENT_CWD"})}));let u=zR(s,i,{cwd:e.cwd,stdio:["pipe","pipe","pipe"],env:Ve(e.env,e.cwd,e.threadId)}),d=!1;if(e.signal){if(e.signal.aborted)return d=!0,D({event:"transport_abort",provider:"codex",phase:"pre_spawn"}),et(u).catch(()=>{}),r(new Error("Aborted"));e.signal.addEventListener("abort",()=>{d=!0,D({event:"transport_abort",provider:"codex"}),et(u).catch(()=>{}),r(new Error("Aborted"))},{once:!0})}let f=ZR({input:u.stdout}),m=new Map,p=1,_=e.threadId||"",h="",g=!1,y=!1,w=Date.now(),S=Lc(),k=Cc();function b(P,x={}){return new Promise((R,re)=>{let X=p++;m.set(X,{resolve:R,reject:re});let N=JSON.stringify({jsonrpc:"2.0",id:X,method:P,params:x});u.stdin?.write(N+`
1517
1517
  `)})}function M(P,x={}){let R=JSON.stringify({jsonrpc:"2.0",method:P,params:x});u.stdin?.write(R+`
1518
- `)}f.on("line",P=>{let x;try{x=JSON.parse(P)}catch{return}if(typeof x.id=="number"&&m.has(x.id)){let X=m.get(x.id);if(m.delete(x.id),x.error){let N=x.error,A=typeof N?.message=="string"&&N.message.length>0?N.message:JSON.stringify(x.error);X.reject(ro(`codex app-server error: ${A}`,N))}else X.resolve(x);e.onEvent?.(x);return}let R=x.method;if(!R){e.onEvent?.(x);return}if(R==="thread/started"){let N=x.params?.thread;N?.id&&(_=N.id)}let re=ce()?X=>{Tn("item.text/buffer-mismatch",{itemId:X.itemId,threadId:X.threadId??null,turnId:X.turnId??null,expectedFromItemText:X.expectedFromItemText,gotFromBuffer:X.gotFromBuffer,expectedLen:X.expectedFromItemText.length,gotLen:X.gotFromBuffer.length})}:void 0;if(R==="turn/started"){let X=x.params,N=X?.turn;N?.id&&(h=N.id),oo(x,S,e.onDelta,re),ce()&&Tn("turn/started",{params:X??null})}if(ce()&&(R==="item/started"||R==="item/completed")){let X=x.params;X?.item?.type==="agentMessage"&&Tn(R,{params:X??null})}if(R==="item/started"||R==="item/agentMessage/delta"||R==="item/completed"){if(R==="item/agentMessage/delta"){let X=x.params;ce()&&Tn("agentMessage/delta",{params:X??null})}oo(x,S,e.onDelta,re)}if(R==="turn/completed"){let X=x.params;if(ce())for(let[A,C]of S.agentItems.entries())C.buffer&&Tn("turn/completed/unflushed-item",{itemId:A,phase:C.phase,bufferLen:C.buffer.length});Oc(S),ce()&&Tn("turn/completed",{params:X??null});let N=Mc(x,k);N.shouldReject?(ce()&&Tn("turn/completed/terminal-reject",{message:N.turnError.message}),w=!0,g=!0,u.stdin?.end(),r(N.turnError)):(g=!0,u.stdin?.end())}if(R==="error"){let X=$c(x,k);if(ce()){let N=x.params,A=N?.error,C=typeof A?.message=="string"?A.message:"(no message)";Tn(X.willRetry?"error/retry":"error/terminal-deferred",{message:C,willRetry:X.willRetry,params:N??null})}}e.onEvent?.(x)});let U="";u.stderr?.on("data",P=>{U+=P.toString()}),u.on("error",P=>{D({event:"transport_error",provider:"codex",error_class:"TransportConnectionError",error_message:P.message}),r(new be(`Failed to spawn codex app-server: ${P.message}`,{cause:P}))}),u.on("exit",P=>{if(!d&&!w){if(g){n({result:S.resultText,threadId:_,turnId:h,durationMs:Date.now()-y,exitCode:P});return}if(k.pendingCodexError){r(k.pendingCodexError);return}D({event:"transport_error",provider:"codex",error_class:"Error",reason:"provider_no_result",exit_code:P,stderr_tail:U.slice(0,500)}),r(new Error(sL({exitCode:P,stderr:U})))}}),(async()=>{try{if(await b("initialize",rL()),M("initialized",{}),e.threadId)try{let P=b("thread/resume",{threadId:e.threadId,sandbox:c,approvalPolicy:"never",...e.model?{model:e.model}:{}}),x=new Promise((R,re)=>setTimeout(()=>re(new Error("resume timeout")),3e4));await Promise.race([P,x]),_=e.threadId}catch(P){process.stderr.write(`[codex] thread/resume failed, creating new thread
1518
+ `)}f.on("line",P=>{let x;try{x=JSON.parse(P)}catch{return}if(typeof x.id=="number"&&m.has(x.id)){let X=m.get(x.id);if(m.delete(x.id),x.error){let N=x.error,A=typeof N?.message=="string"&&N.message.length>0?N.message:JSON.stringify(x.error);X.reject(ro(`codex app-server error: ${A}`,N))}else X.resolve(x);e.onEvent?.(x);return}let R=x.method;if(!R){e.onEvent?.(x);return}if(R==="thread/started"){let N=x.params?.thread;N?.id&&(_=N.id)}let re=ce()?X=>{Tn("item.text/buffer-mismatch",{itemId:X.itemId,threadId:X.threadId??null,turnId:X.turnId??null,expectedFromItemText:X.expectedFromItemText,gotFromBuffer:X.gotFromBuffer,expectedLen:X.expectedFromItemText.length,gotLen:X.gotFromBuffer.length})}:void 0;if(R==="turn/started"){let X=x.params,N=X?.turn;N?.id&&(h=N.id),oo(x,S,e.onDelta,re),ce()&&Tn("turn/started",{params:X??null})}if(ce()&&(R==="item/started"||R==="item/completed")){let X=x.params;X?.item?.type==="agentMessage"&&Tn(R,{params:X??null})}if(R==="item/started"||R==="item/agentMessage/delta"||R==="item/completed"){if(R==="item/agentMessage/delta"){let X=x.params;ce()&&Tn("agentMessage/delta",{params:X??null})}oo(x,S,e.onDelta,re)}if(R==="turn/completed"){let X=x.params;if(ce())for(let[A,C]of S.agentItems.entries())C.buffer&&Tn("turn/completed/unflushed-item",{itemId:A,phase:C.phase,bufferLen:C.buffer.length});Oc(S),ce()&&Tn("turn/completed",{params:X??null});let N=Mc(x,k);N.shouldReject?(ce()&&Tn("turn/completed/terminal-reject",{message:N.turnError.message}),y=!0,g=!0,u.stdin?.end(),r(N.turnError)):(g=!0,u.stdin?.end())}if(R==="error"){let X=$c(x,k);if(ce()){let N=x.params,A=N?.error,C=typeof A?.message=="string"?A.message:"(no message)";Tn(X.willRetry?"error/retry":"error/terminal-deferred",{message:C,willRetry:X.willRetry,params:N??null})}}e.onEvent?.(x)});let U="";u.stderr?.on("data",P=>{U+=P.toString()}),u.on("error",P=>{D({event:"transport_error",provider:"codex",error_class:"TransportConnectionError",error_message:P.message}),r(new be(`Failed to spawn codex app-server: ${P.message}`,{cause:P}))}),u.on("exit",P=>{if(!d&&!y){if(g){n({result:S.resultText,threadId:_,turnId:h,durationMs:Date.now()-w,exitCode:P});return}if(k.pendingCodexError){r(k.pendingCodexError);return}D({event:"transport_error",provider:"codex",error_class:"Error",reason:"provider_no_result",exit_code:P,stderr_tail:U.slice(0,500)}),r(new Error(sL({exitCode:P,stderr:U})))}}),(async()=>{try{if(await b("initialize",rL()),M("initialized",{}),e.threadId)try{let P=b("thread/resume",{threadId:e.threadId,sandbox:c,approvalPolicy:"never",...e.model?{model:e.model}:{}}),x=new Promise((R,re)=>setTimeout(()=>re(new Error("resume timeout")),3e4));await Promise.race([P,x]),_=e.threadId}catch(P){process.stderr.write(`[codex] thread/resume failed, creating new thread
1519
1519
  `),D({event:"codex_thread_resume_fallback",provider:"codex",thread_id:e.threadId,error_message:P instanceof Error?P.message:String(P)});let R=(await b("thread/start",{cwd:e.cwd,approvalPolicy:"never",sandbox:c,...e.model?{model:e.model}:{}})).result?.thread;R?.id&&(_=R.id)}else{let x=(await b("thread/start",{cwd:e.cwd,approvalPolicy:"never",sandbox:c,...e.model?{model:e.model}:{}})).result?.thread;x?.id&&(_=x.id)}await b("turn/start",{threadId:_,input:[{type:"text",text:t}],...e.model?{model:e.model}:{}})}catch(P){et(u).catch(()=>{}),r(P instanceof Error?P:new Error(String(P)))}})()})}var nL,wh=E(()=>{"use strict";de();de();Ir();As();Vn();xc();de();Et();Dc();Dc();nL=(()=>{try{let t=new URL("../../../package.json",import.meta.url),e=JSON.parse(eL(tL(t),"utf8"));return typeof e.version=="string"?e.version:"0.0.0"}catch{return"0.0.0"}})()});import{existsSync as Sh,mkdirSync as iL,readFileSync as vh,writeFileSync as Eh}from"node:fs";import{join as xs,resolve as oL}from"node:path";function bh(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 jc(t,e,n={existsSync:Sh,readFileSync:vh}){let r=[];for(let s of t){if(s.provider.trim().toLowerCase()!=="opencode")continue;let i=oL(e,s.sessiondir??e);for(let o of aL(i)){let a=lL(o,n);a!==void 0&&Object.prototype.hasOwnProperty.call(a,"permission")&&(bh(a.permission)||r.push(`[${s.alias}] ${o} sets a non-allow \`permission\`, which opencode merges over lmctl's YOLO (.opencode/opencode.json permission:"allow") \u2014 the member may hang on permission prompts. Set \`permission: "allow"\` in that file (or remove the key).`))}}return r}function aL(t){return[xs(t,".opencode","opencode.jsonc"),xs(t,"opencode.jsonc"),xs(t,"opencode.json")]}function lL(t,e){try{if(!e.existsSync(t))return;let n=e.readFileSync(t,"utf-8"),r=JSON.parse(cL(n));return r===null||typeof r!="object"||Array.isArray(r)?void 0:r}catch{return}}function cL(t){let e="",n=!1,r="",s=!1;for(let i=0;i<t.length;i+=1){let o=t[i],a=t[i+1];if(n){e+=o,s?s=!1:o==="\\"?s=!0:o===r&&(n=!1,r="");continue}if(o==='"'||o==="'"){n=!0,r=o,e+=o;continue}if(o==="/"&&a==="/"){for(;i<t.length&&t[i]!==`
1520
1520
  `;)i+=1;i<t.length&&(e+=t[i]);continue}if(o==="/"&&a==="*"){for(i+=2;i<t.length&&!(t[i]==="*"&&t[i+1]==="/");)i+=1;i+=1;continue}e+=o}return e.replace(/,\s*([}\]])/g,"$1")}function ao(t,e={}){let n=xs(t,".opencode"),r=xs(n,"opencode.json");if(!Sh(r)){iL(n,{recursive:!0});let o=JSON.stringify({permission:"allow"},null,2);return Eh(r,o+`
1521
1521
  `,"utf-8"),!0}let s;try{s=JSON.parse(vh(r,"utf-8"))}catch{return console.log(Th.yellow(` .opencode/opencode.json at ${r} is malformed \u2014 skipping opencode config install.`)),!1}if(typeof s!="object"||s===null)return console.log(Th.yellow(` .opencode/opencode.json at ${r} is not an object \u2014 skipping opencode config install.`)),!1;let i=!1;return s.permission===void 0&&(s.permission="allow",i=!0),bh(s.permission)||D({event:"opencode_yolo_override",provider:"opencode",config_path:r,user_permission:s.permission,message:`opencode.json has a user-set 'permission' value other than 'allow' \u2014 lmctl's YOLO contract is NOT in effect; turns may hang waiting on permission prompts. Set permission: "allow" or remove the key to restore YOLO.`}),i&&Eh(r,JSON.stringify(s,null,2)+`
@@ -1530,29 +1530,29 @@ ${n}`:n}function wL(t,e){if(t!=="kimi"||!e.includes("notifications/initialized")
1530
1530
  `)};return n.on("line",o=>{let a;try{a=JSON.parse(o)}catch{return}if(Me({event:"acp_recv",direction:"RECV",provider:e.provider,id:typeof a.id=="number"?a.id:void 0,method:typeof a.method=="string"?a.method:void 0,preview:JSON.stringify(a).slice(0,300)}),e.onEvent?.(a),typeof a.id=="number"&&r.has(a.id)){let c=r.get(a.id);if(r.delete(a.id),a.error){let u=a.error,d=typeof u?.message=="string"&&u.message.length>0?u.message:JSON.stringify(a.error);c.reject(ro(`ACP RPC error: ${d}`,u))}else c.resolve(a);return}let l=a.method;if(l){if(typeof a.id=="number"){D({event:"acp_unhandled_request",provider:e.provider,method:l,id:a.id,params:a.params});let c=JSON.stringify({jsonrpc:"2.0",id:a.id,error:{code:-32601,message:`Method not found: ${l} (lmctl does not implement server-side ACP methods)`}});Me({event:"acp_send",direction:"SEND",provider:e.provider,replyTo:a.id,error:"method not found"}),t.stdin?.write(`${c}
1531
1531
  `);return}e.onNotification?.(a)}}),{sendRpc:s,sendNotification:i,close(o=new be("ACP RPC channel closed")){n.close();for(let a of r.values())a.reject(o);r.clear()}}}function Wc(t){let e;try{e=xh(t.binaryPath??Uc.opencode.binary,Uc.opencode.args,{cwd:t.cwd,stdio:["pipe","pipe","pipe"],env:Ve(t.env,t.cwd,void 0,"unknown")})}catch(s){return Promise.resolve({status:"unavailable",reason:"spawn",error:s instanceof Error?s.message:String(s)})}let n=Rh(e,{provider:"opencode"}),r=t.timeoutMs??5e3;return new Promise(s=>{let i=!1,o=(u,d=!0)=>{if(!i){if(i=!0,clearTimeout(c),e.removeListener("error",a),e.removeListener("exit",l),n.close(),!d){s(u);return}et(e,{softDelayMs:100,killDelayMs:100}).finally(()=>s(u))}},a=u=>{o({status:"unavailable",reason:"spawn",error:u.message},!1)},l=(u,d)=>{o({status:"unavailable",reason:"handshake",error:`opencode ACP exited before verification (code=${String(u)}, signal=${String(d)})`},!1)};e.once("error",a),e.once("exit",l);let c=setTimeout(()=>{o({status:"unavailable",reason:"timeout"})},r);(async()=>{try{await n.sendRpc("initialize",{protocolVersion:1,clientInfo:{name:"lmctl",version:"0.1.0"},clientCapabilities:{}}),n.sendNotification("notifications/initialized");let u=await n.sendRpc("session/new",{cwd:t.cwd,mcpServers:[]}),d=Nr(u);try{await n.sendRpc("session/set_config_option",{sessionId:d,configId:"model",value:t.model})}catch(f){o({status:"rejected",option:"model",value:t.model,error:f instanceof Error?f.message:String(f)});return}if(t.effort!==void 0)try{await n.sendRpc("session/set_config_option",{sessionId:d,configId:"effort",value:t.effort})}catch(f){o({status:"rejected",option:"effort",value:t.effort,error:f instanceof Error?f.message:String(f)});return}o({status:"verified"})}catch(u){o({status:"unavailable",reason:"handshake",error:u instanceof Error?u.message:String(u)})}})()})}function TL(t){if(t.method!=="session/update")return!1;let n=t.params?.update;if(n===void 0)return!1;let r=n.sessionUpdate;if(r!=="tool_call"&&r!=="tool_call_update")return!1;let s=n.status;return s!==void 0&&s!=="pending"&&s!=="in_progress"?!1:n.rawInput?.background===!0}function Lh(t,e){let n=Uc[e.tool];return n?new Promise((r,s)=>{let i=e.binaryPath||n.binary;if(e.tool==="opencode")try{ao(e.cwd)}catch(b){D({event:"opencode_config_install_failed",cwd:e.cwd,error_message:b instanceof Error?b.message:String(b)})}let o=e.permissionMode??"yolo",a=[...n.args];if(o==="plan")if(e.tool==="gemini"){let b=En("gemini","plan"),M=En("gemini","yolo");a=a.filter(U=>!(M??[]).includes(U)),b&&a.push(...b)}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.
1532
1532
  `),D({event:"acp_plan_mode_unsupported",provider:e.tool,requested_mode:"plan",effective_mode:"yolo"}));e.model&&e.tool==="gemini"&&a.push("--model",e.model);let l=e.tool==="copilot"?"yolo":o;try{tt(e.tool,a,l)}catch(b){return s(b)}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.
1533
- `),D({event:"acp_model_unsupported",provider:e.tool,model:e.model})),e.cwd&&!hL(e.cwd))return D({event:"transport_error",provider:e.tool,error_class:"TransportConnectionError",error_message:`sessiondir missing: ${e.cwd}`,elapsed_ms:0}),s(new be(`sessiondir missing: ${e.cwd}`,{cause:Object.assign(new Error("cwd missing"),{code:"ENOENT_CWD"})}));let c=xh(i,a,{cwd:e.cwd,stdio:["pipe","pipe","pipe"],env:Ve(e.env,e.cwd,e.sessionId)}),u=Date.now(),d=!1,f=!1,m=0,p=!1,_=!1;if(e.signal){if(e.signal.aborted)return d=!0,D({event:"transport_abort",provider:e.tool,phase:"pre_spawn"}),et(c).catch(()=>{}),s(new Error("Aborted"));e.signal.addEventListener("abort",()=>{d=!0,D({event:"transport_abort",provider:e.tool,elapsed_ms:Date.now()-u}),et(c).catch(()=>{}),s(new Error("Aborted"))},{once:!0})}let h=e.sessionId||"",g=Pc({tool:e.tool,onDelta:e.onDelta});g.setSessionId(h);let w=Rh(c,{provider:e.tool,onEvent:b=>{m=Date.now(),TL(b)&&(_=!0),e.onEvent?.(b)},onNotification:b=>{m=Date.now(),g.processMessage(b)}}),{sendRpc:y,sendNotification:S}=w,k="";c.stderr?.on("data",b=>{k+=b.toString()}),c.on("error",b=>{w.close(b),D({event:"transport_error",provider:e.tool,error_class:"TransportConnectionError",error_message:b.message,elapsed_ms:Date.now()-u}),s(new be(`Failed to spawn ${n.binary} ${n.args.join(" ")}: ${b.message}`,{cause:b}))}),c.on("exit",b=>{if(f=!0,w.close(new be(`ACP process exited with code ${String(b)}`)),d)return;let M=g.finalize();if(M!==null)r({result:M.result,sessionId:M.sessionId,durationMs:Date.now()-u,stopReason:M.stopReason,exitCode:b});else{let U=wL(e.tool,k);D({event:"transport_error",provider:e.tool,error_class:"Error",reason:"provider_no_result",exit_code:b,stderr_tail:U.slice(0,500),elapsed_ms:Date.now()-u}),s(new Error(yL({tool:e.tool,exitCode:b,stderr:U})))}}),(async()=>{try{if(await y("initialize",{protocolVersion:1,clientInfo:{name:"lmctl",version:"0.1.0"},clientCapabilities:{}}),S("notifications/initialized"),e.sessionId)try{let U=await y("session/load",{sessionId:e.sessionId,cwd:e.cwd,mcpServers:[]});h=Nr(U,e.sessionId),g.setSessionId(h)}catch(U){if(e.requireResume)throw new Error(`Cannot resume session ${e.sessionId} via ACP: ${U instanceof Error?U.message:String(U)}`);process.stderr.write(`[acp] session/load failed for ${e.sessionId}, creating new session
1534
- `),D({event:"acp_session_resume_fallback",provider:e.tool,session_id:e.sessionId,error_message:U instanceof Error?U.message:String(U)});let P=await y("session/new",{cwd:e.cwd,mcpServers:[]});h=Nr(P),g.setSessionId(h)}else{let U=await y("session/new",{cwd:e.cwd,mcpServers:[]});h=Nr(U),g.setSessionId(h)}if(e.tool==="kimi"){let U=o==="plan"?"plan":"auto";try{await y("session/set_config_option",{sessionId:h,configId:"mode",value:U}),Ge(`acp: set_config_option(mode=${U}) ok`)}catch(P){let x=P instanceof Error?P.message:String(P);throw D({event:"acp_permission_mode_failed",provider:e.tool,config_id:"mode",value:U,error_message:x}),new Error(`Cannot set Kimi ACP permission mode to ${U}: ${x}`)}}if(e.model&&(e.tool==="opencode"||e.tool==="kimi"))try{await y("session/set_config_option",{sessionId:h,configId:"model",value:e.model}),Ge(`acp: set_config_option(model=${e.model}) ok`)}catch(U){let P=U instanceof Error?U.message:String(U);process.stderr.write(`[acp] set_config_option(model=${e.model}) failed: ${P}
1535
- `),D({event:"acp_config_option_failed",provider:e.tool,config_id:"model",value:e.model,error_message:P})}if(e.effort&&e.tool==="opencode"){let U="effort";try{await y("session/set_config_option",{sessionId:h,configId:U,value:e.effort}),Ge(`acp: set_config_option(${U}=${e.effort}) ok`)}catch(P){let x=P instanceof Error?P.message:String(P);process.stderr.write(`[acp] set_config_option(effort=${e.effort}) failed: ${x}
1536
- `),D({event:"acp_config_option_failed",provider:e.tool,config_id:U,value:e.effort,error_message:x})}}g.beginTurn(),p=!0,Ge(`acp: prompt sent (${t.length} chars)`);let b=await y("session/prompt",{sessionId:h,prompt:[{type:"text",text:t}]}),M=g.completeTurn(b);p=!1,Ge(`acp: result received (${M.result.length} chars, stopReason=${M.stopReason})`),so(e.holdOpen,{isAborted:()=>d,hasChildExited:()=>f,isTurnInFlight:()=>p,lastEventAtMs:()=>m,closeStdin:()=>{c.stdin?.end()},signal:e.signal,label:e.tool,wasBackgroundJobLaunched:()=>_})}catch(b){et(c).catch(()=>{}),s(b instanceof Error?b:new Error(String(b)))}})()}):Promise.reject(new Error(`No ACP config for tool "${e.tool}"`))}var Uc,EL,qc=E(()=>{"use strict";de();Ir();As();Ic();Vn();lo();de();Et();Fc();Fc();Uc={gemini:{binary:"gemini",args:["--acp","-y","--skip-trust"]},copilot:{binary:"copilot",args:["--acp","--yolo"]},opencode:{binary:"opencode",args:["acp"]},kimi:{binary:"kimi",args:["acp"]}},EL=1});function Ee(t,e=120){let n=t.replace(/\s+/g," ").trim();return n.length>e?n.slice(0,e-1)+"\u2026":n}function Oh(t,e){return n=>{if(n.kind==="tool_use"&&typeof n.id=="string"){if(t.size>=SL){let r=t.keys().next().value;r!==void 0&&t.delete(r)}t.set(n.id,Date.now()),e(n);return}if(n.kind==="tool_result"&&typeof n.id=="string"&&n.elapsedMs===void 0){let r=t.get(n.id);if(r!==void 0){e({...n,elapsedMs:Date.now()-r}),t.delete(n.id);return}}e(n)}}function vL(){let t=new Map;return(e,n)=>{bL(e,Oh(t,n))}}function bL(t,e){let n=t.type;if(n==="system"){let r=t.subtype;if(r==="api_retry"){let s=typeof t.attempt=="number"?t.attempt:void 0,i=typeof t.max_retries=="number"?t.max_retries:void 0,o=typeof t.error_status=="number"?t.error_status:void 0,a=typeof t.error=="string"?t.error:void 0,l=typeof t.retry_delay_ms=="number"?t.retry_delay_ms:void 0,c=[];s!==void 0&&c.push(i!==void 0?`attempt ${s}/${i}`:`attempt ${s}`),o!==void 0&&c.push(`HTTP ${o}`),l!==void 0&&c.push(`retry in ${Math.round(l/1e3)}s`),a&&c.push(Ee(a,60));let u=c.length>0?c.join(", "):r;e({kind:"api_retry",summary:u});return}if(r==="api_error"){let s=typeof t.error_status=="number"?t.error_status:void 0,i=typeof t.error=="string"?t.error:void 0,o=["api_error"];s!==void 0&&o.push(`HTTP ${s}`),i&&o.push(Ee(i,80)),e({kind:"other",summary:o.join(": "),raw:t});return}e({kind:"system",summary:r||"system",raw:t});return}if(n==="assistant"||n==="user"){let s=t.message?.content;if(!Array.isArray(s))return;for(let i of s){let o=i.type;if(o==="text"){let a=i.text||"";a&&e({kind:"text",summary:Ee(a),raw:i})}else if(o==="tool_use"){let a=i.name||"tool",l=typeof i.id=="string"?i.id:void 0,c=i.input,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=Ee(JSON.stringify(c))),e({kind:"tool_use",tool:a,summary:Ee(u),id:l,raw:i})}else if(o==="thinking"){let a=i.thinking||"";e({kind:"thinking",summary:Ee(a),raw:i})}else if(o==="tool_result"){let l=i.is_error===!0?"error":"ok",c=typeof i.tool_use_id=="string"?i.tool_use_id:void 0,u,d=i.content;if(typeof d=="string")u=`${d.split(`
1533
+ `),D({event:"acp_model_unsupported",provider:e.tool,model:e.model})),e.cwd&&!hL(e.cwd))return D({event:"transport_error",provider:e.tool,error_class:"TransportConnectionError",error_message:`sessiondir missing: ${e.cwd}`,elapsed_ms:0}),s(new be(`sessiondir missing: ${e.cwd}`,{cause:Object.assign(new Error("cwd missing"),{code:"ENOENT_CWD"})}));let c=xh(i,a,{cwd:e.cwd,stdio:["pipe","pipe","pipe"],env:Ve(e.env,e.cwd,e.sessionId)}),u=Date.now(),d=!1,f=!1,m=0,p=!1,_=!1;if(e.signal){if(e.signal.aborted)return d=!0,D({event:"transport_abort",provider:e.tool,phase:"pre_spawn"}),et(c).catch(()=>{}),s(new Error("Aborted"));e.signal.addEventListener("abort",()=>{d=!0,D({event:"transport_abort",provider:e.tool,elapsed_ms:Date.now()-u}),et(c).catch(()=>{}),s(new Error("Aborted"))},{once:!0})}let h=e.sessionId||"",g=Pc({tool:e.tool,onDelta:e.onDelta});g.setSessionId(h);let y=Rh(c,{provider:e.tool,onEvent:b=>{m=Date.now(),TL(b)&&(_=!0),e.onEvent?.(b)},onNotification:b=>{m=Date.now(),g.processMessage(b)}}),{sendRpc:w,sendNotification:S}=y,k="";c.stderr?.on("data",b=>{k+=b.toString()}),c.on("error",b=>{y.close(b),D({event:"transport_error",provider:e.tool,error_class:"TransportConnectionError",error_message:b.message,elapsed_ms:Date.now()-u}),s(new be(`Failed to spawn ${n.binary} ${n.args.join(" ")}: ${b.message}`,{cause:b}))}),c.on("exit",b=>{if(f=!0,y.close(new be(`ACP process exited with code ${String(b)}`)),d)return;let M=g.finalize();if(M!==null)r({result:M.result,sessionId:M.sessionId,durationMs:Date.now()-u,stopReason:M.stopReason,exitCode:b});else{let U=wL(e.tool,k);D({event:"transport_error",provider:e.tool,error_class:"Error",reason:"provider_no_result",exit_code:b,stderr_tail:U.slice(0,500),elapsed_ms:Date.now()-u}),s(new Error(yL({tool:e.tool,exitCode:b,stderr:U})))}}),(async()=>{try{if(await w("initialize",{protocolVersion:1,clientInfo:{name:"lmctl",version:"0.1.0"},clientCapabilities:{}}),S("notifications/initialized"),e.sessionId)try{let U=await w("session/load",{sessionId:e.sessionId,cwd:e.cwd,mcpServers:[]});h=Nr(U,e.sessionId),g.setSessionId(h)}catch(U){if(e.requireResume)throw new Error(`Cannot resume session ${e.sessionId} via ACP: ${U instanceof Error?U.message:String(U)}`);process.stderr.write(`[acp] session/load failed for ${e.sessionId}, creating new session
1534
+ `),D({event:"acp_session_resume_fallback",provider:e.tool,session_id:e.sessionId,error_message:U instanceof Error?U.message:String(U)});let P=await w("session/new",{cwd:e.cwd,mcpServers:[]});h=Nr(P),g.setSessionId(h)}else{let U=await w("session/new",{cwd:e.cwd,mcpServers:[]});h=Nr(U),g.setSessionId(h)}if(e.tool==="kimi"){let U=o==="plan"?"plan":"auto";try{await w("session/set_config_option",{sessionId:h,configId:"mode",value:U}),Ge(`acp: set_config_option(mode=${U}) ok`)}catch(P){let x=P instanceof Error?P.message:String(P);throw D({event:"acp_permission_mode_failed",provider:e.tool,config_id:"mode",value:U,error_message:x}),new Error(`Cannot set Kimi ACP permission mode to ${U}: ${x}`)}}if(e.model&&(e.tool==="opencode"||e.tool==="kimi"))try{await w("session/set_config_option",{sessionId:h,configId:"model",value:e.model}),Ge(`acp: set_config_option(model=${e.model}) ok`)}catch(U){let P=U instanceof Error?U.message:String(U);process.stderr.write(`[acp] set_config_option(model=${e.model}) failed: ${P}
1535
+ `),D({event:"acp_config_option_failed",provider:e.tool,config_id:"model",value:e.model,error_message:P})}if(e.effort&&e.tool==="opencode"){let U="effort";try{await w("session/set_config_option",{sessionId:h,configId:U,value:e.effort}),Ge(`acp: set_config_option(${U}=${e.effort}) ok`)}catch(P){let x=P instanceof Error?P.message:String(P);process.stderr.write(`[acp] set_config_option(effort=${e.effort}) failed: ${x}
1536
+ `),D({event:"acp_config_option_failed",provider:e.tool,config_id:U,value:e.effort,error_message:x})}}g.beginTurn(),p=!0,Ge(`acp: prompt sent (${t.length} chars)`);let b=await w("session/prompt",{sessionId:h,prompt:[{type:"text",text:t}]}),M=g.completeTurn(b);p=!1,Ge(`acp: result received (${M.result.length} chars, stopReason=${M.stopReason})`),so(e.holdOpen,{isAborted:()=>d,hasChildExited:()=>f,isTurnInFlight:()=>p,lastEventAtMs:()=>m,closeStdin:()=>{c.stdin?.end()},signal:e.signal,label:e.tool,wasBackgroundJobLaunched:()=>_})}catch(b){et(c).catch(()=>{}),s(b instanceof Error?b:new Error(String(b)))}})()}):Promise.reject(new Error(`No ACP config for tool "${e.tool}"`))}var Uc,EL,qc=E(()=>{"use strict";de();Ir();As();Ic();Vn();lo();de();Et();Fc();Fc();Uc={gemini:{binary:"gemini",args:["--acp","-y","--skip-trust"]},copilot:{binary:"copilot",args:["--acp","--yolo"]},opencode:{binary:"opencode",args:["acp"]},kimi:{binary:"kimi",args:["acp"]}},EL=1});function Ee(t,e=120){let n=t.replace(/\s+/g," ").trim();return n.length>e?n.slice(0,e-1)+"\u2026":n}function Oh(t,e){return n=>{if(n.kind==="tool_use"&&typeof n.id=="string"){if(t.size>=SL){let r=t.keys().next().value;r!==void 0&&t.delete(r)}t.set(n.id,Date.now()),e(n);return}if(n.kind==="tool_result"&&typeof n.id=="string"&&n.elapsedMs===void 0){let r=t.get(n.id);if(r!==void 0){e({...n,elapsedMs:Date.now()-r}),t.delete(n.id);return}}e(n)}}function vL(){let t=new Map;return(e,n)=>{bL(e,Oh(t,n))}}function bL(t,e){let n=t.type;if(n==="system"){let r=t.subtype;if(r==="api_retry"){let s=typeof t.attempt=="number"?t.attempt:void 0,i=typeof t.max_retries=="number"?t.max_retries:void 0,o=typeof t.error_status=="number"?t.error_status:void 0,a=typeof t.error=="string"?t.error:void 0,l=typeof t.retry_delay_ms=="number"?t.retry_delay_ms:void 0,c=[];s!==void 0&&c.push(i!==void 0?`attempt ${s}/${i}`:`attempt ${s}`),o!==void 0&&c.push(`HTTP ${o}`),l!==void 0&&c.push(`retry in ${Math.round(l/1e3)}s`),a&&c.push(Ee(a,60));let u=c.length>0?c.join(", "):r;e({kind:"api_retry",summary:u});return}if(r==="api_error"){let s=typeof t.error_status=="number"?t.error_status:void 0,i=typeof t.error=="string"?t.error:void 0,o=["api_error"];s!==void 0&&o.push(`HTTP ${s}`),i&&o.push(Ee(i,80)),e({kind:"other",summary:o.join(": "),raw:t});return}e({kind:"system",summary:r||"system",raw:t});return}if(n==="assistant"||n==="user"){let s=t.message?.content;if(!Array.isArray(s))return;for(let i of s){let o=i.type;if(o==="text"){let a=i.text||"";a&&e({kind:"text",summary:Ee(a),raw:i})}else if(o==="tool_use"){let a=i.name||"tool",l=typeof i.id=="string"?i.id:void 0,c=i.input,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=Ee(JSON.stringify(c))),e({kind:"tool_use",tool:a,summary:Ee(u),id:l,raw:i})}else if(o==="thinking"){let a=i.thinking||"";e({kind:"thinking",summary:Ee(a),raw:i})}else if(o==="tool_result"){let l=i.is_error===!0?"error":"ok",c=typeof i.tool_use_id=="string"?i.tool_use_id:void 0,u,d=i.content;if(typeof d=="string")u=`${d.split(`
1537
1537
  `).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(`
1538
1538
  `).length} lines, ${f.length} chars`)}e({kind:"tool_result",status:l,summary:u,id:c,raw:i})}else o&&e({kind:"other",summary:o,raw:i})}return}if(n==="result"){e({kind:"system",summary:"result",raw:t});return}}async function co(t,e){let n=e.binary==="qwen"?"qwen":"claude",r=e.onProgress?vL():void 0,s=await ph(t,{sessionId:e.sessionId,cwd:e.cwd,env:e.env,tool:n,binaryPath:e.progPath,model:e.model,permissionMode:e.permissionMode,onText:e.onDelta,onEvent:r?i=>r(i,e.onProgress):void 0,signal:e.signal,holdOpen:e.holdOpen});return{text:s.result,sessionId:s.sessionId,durationMs:s.durationMs,numTurns:s.numTurns}}function kL(){let t=new Map;return(e,n)=>{IL(e,Oh(t,n))}}function IL(t,e){if(t.method!=="session/update")return;let s=t.params?.update;if(!s)return;let i=s.sessionUpdate;if(i){if(i==="agent_message_chunk"){let a=s.content?.text||"";a&&e({kind:"text",summary:Ee(a)});return}if(i==="agent_thought_chunk"){let a=s.content?.text||"";e({kind:"thinking",summary:Ee(a)});return}if(i==="tool_call"){let o=s.title||s.kind||"tool",a=typeof s.toolCallId=="string"?s.toolCallId:void 0,l="",c=s.rawInput;c&&(typeof c.command=="string"?l=c.command:typeof c.file_path=="string"?l=c.file_path:typeof c.path=="string"?l=c.path:l=Ee(JSON.stringify(c))),e({kind:"tool_use",tool:o,summary:Ee(l),id:a});return}if(i==="tool_call_update"){let o=s.status||"",a=typeof s.toolCallId=="string"?s.toolCallId:void 0;if(o==="completed"||o==="failed")e({kind:"tool_result",summary:o,status:o==="failed"?"error":"ok",id:a});else if(o==="in_progress"){let l=s.content,c=typeof l=="string"?l:typeof l?.text=="string"?l.text:"",u=c?`running\u2026 ${Ee(c,80)}`:"running\u2026";e({kind:"other",summary:u,id:a})}return}e({kind:"other",summary:i})}}async function Sn(t,e){let n=e.acpTool||e.binary;e.model&&n==="copilot"&&Me({event:"model_ignored",provider:n,model:e.model,reason:"copilot --acp does not implement per-session model selection"});let r=e.onProgress?kL():void 0,s=await Lh(t,{tool:n,sessionId:e.sessionId,cwd:e.cwd,env:e.env,binaryPath:e.progPath,model:e.model,effort:e.effort,alias:e.alias,permissionMode:e.permissionMode,onDelta:e.onDelta,onEvent:r?i=>r(i,e.onProgress):void 0,signal:e.signal,holdOpen:e.holdOpen});return{text:s.result,sessionId:s.sessionId,durationMs:s.durationMs,stopReason:s.stopReason}}function NL(t,e){let n=t.method;if(!n)return;let r=t.params;if(n==="turn/started"){e({kind:"system",summary:"turn started"});return}if(n==="turn/completed"){e({kind:"system",summary:"turn completed"});return}if(n==="error"){let s=r?.error,i=typeof s?.message=="string"?s.message:void 0,o=i&&i.length>0?i:"(no message)",a=r?.willRetry===!0;e(a?{kind:"api_retry",summary:`codex retry: ${Ee(o,120)}`}:{kind:"other",summary:`codex error: ${Ee(o,120)}`});return}if(n==="item/started"||n==="item/completed"){let s=r?.item;if(!s)return;let i=s.type,o=n==="item/started";switch(i){case"commandExecution":{let a=typeof s.id=="string"?s.id:void 0,l=s.command,c=Array.isArray(l)?l.join(" "):typeof l=="string"?l:"";if(o)e({kind:"tool_use",tool:"Bash",summary:Ee(c||"(command)"),id:a});else{let 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(o){let l=s.changes,c=Array.isArray(l)?l.map(u=>u.path||"").filter(Boolean).join(", "):"";e({kind:"tool_use",tool:"FileChange",summary:Ee(c||"(edit)"),id:a})}else{let l=s.status||"done";e({kind:"tool_result",summary:l,status:l,id:a})}return}case"mcpToolCall":{let a=typeof s.id=="string"?s.id:void 0,l=s.server||"mcp",c=s.tool||"tool";if(o)e({kind:"tool_use",tool:`${l}/${c}`,summary:"",id:a});else{let 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(o?{kind:"tool_use",tool:"WebSearch",summary:Ee(s.query||""),id:a}:{kind:"tool_result",summary:"done",status:"done",id:a});return}case"reasoning":{o&&e({kind:"thinking",summary:""});return}case"agentMessage":case"userMessage":return;default:{i&&e({kind:o?"tool_use":"tool_result",tool:i,summary:""});return}}}if(n==="item/agentMessage/delta"){let s=r?.delta||"";if(s){let i=typeof r?._lmctlItemPhase=="string"?r._lmctlItemPhase:void 0;e(i==="commentary"?{kind:"thinking",summary:Ee(s)}:{kind:"text",summary:Ee(s)})}return}if(n==="item/reasoning/summaryTextDelta"||n==="item/reasoning/textDelta"){let s=r?.delta||"";s&&e({kind:"thinking",summary:Ee(s)});return}if(n==="item/commandExecution/outputDelta"){let s=(typeof r?.delta=="string"?r.delta:"")||"";if(s){let i=s.split(`
1539
1539
  `).filter(l=>l.length>0),o=i[i.length-1]||"",a=i.length>1?`${i.length} lines: ${Ee(o,60)}`:Ee(s,80);e({kind:"other",summary:`running\u2026 ${a}`})}else e({kind:"other",summary:"running\u2026"});return}if(n==="item/commandExecution/terminalInteraction"||n==="item/commandExecution/outputChunk"||n==="item/commandExecution/output"){let s=(typeof r?.stdin=="string"?r.stdin:"")||(typeof r?.delta=="string"?r.delta:"")||(typeof r?.output=="string"?r.output:"")||(typeof r?.text=="string"?r.text:"")||(typeof r?.content=="string"?r.content:"")||(typeof r?.chunk=="string"?r.chunk:"")||"";if(s){let i=s.split(`
1540
1540
  `).filter(l=>l.length>0),o=i[i.length-1]||"",a=i.length>1?`${i.length} lines: ${Ee(o,60)}`:Ee(s,80);e({kind:"other",summary:`running\u2026 ${a}`})}else e({kind:"other",summary:"running\u2026"});return}if(n.startsWith("item/")){e({kind:"other",summary:n.slice(5)});return}}async function Ch(t,e){let n=await yh(t,{threadId:e.sessionId,cwd:e.cwd,env:e.env,binaryPath:e.progPath,model:e.model,alias:e.alias,isLead:e.isLead,permissionMode:e.permissionMode,onDelta:e.onDelta,onEvent:e.onProgress?r=>NL(r,e.onProgress):void 0,signal:e.signal});return{text:n.result,sessionId:n.threadId,durationMs:n.durationMs}}var SL,vn=E(()=>{"use strict";_h();wh();qc();de();SL=256});function Hc(t){return new Bc(t)}var Bc,Xc=E(()=>{"use strict";eh();Tt();vn();ut();Bc=class extends ve{constructor(e){super({provider:new Qi(e),capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!0,canCancel:!0},injection:{leaderMode:"prompt-append"},binary:"claude",seedArgs:["-p",_e,"--dangerously-skip-permissions"],resumeTemplate:"claude --resume {{session_id}}",startTemplate:"claude",transport:co})}seedArgsFor(e){let n=super.seedArgsFor(e);return e?.model?[...n,"--model",e.model]:n}}});import{readdir as AL,stat as $h,unlink as xL}from"node:fs/promises";import{join as Rs,basename as RL}from"node:path";function LL(t,e,n){return`${t}|${e.toISOString()}|${n}`}function Ls(t,e,n){let r=LL(n.role,n.timestamp,n.content);e.has(r)||(e.add(r),t.push(n))}function Mh(t,e){return e==="exec"||t==="codex_exec"?"codex exec":"codex"}function OL(t){if(!t)return;let e=t.cached_input_tokens??t.cache_read_input_tokens;return{inputTokens:t.input_tokens,cachedInputTokens:e,outputTokens:t.output_tokens,reasoningOutputTokens:t.reasoning_output_tokens,totalTokens:t.total_tokens}}function Ar(t){if(t==null)return"";if(typeof t=="string")return t;if(typeof t=="number"||typeof t=="boolean")return String(t);if(Array.isArray(t))return t.map(n=>{if(typeof n=="string")return n;if(n&&typeof n=="object"){let r=n;if(typeof r.text=="string")return r.text;if(typeof r.image_url=="string")return"[input_image]";if(typeof r.type=="string")return`[${r.type}]`}return Ar(n)}).filter(n=>n.length>0).join(`
1541
- `);try{return JSON.stringify(t)}catch{return String(t)}}function CL(t){let e=t;if(typeof t=="string")try{e=JSON.parse(t)}catch{return}return e!==null&&typeof e=="object"&&!Array.isArray(e)?e:void 0}function $L(t,e){if(e===void 0)return;let n={input:e};if(t!=="apply_patch"||typeof e!="string")return n;let r=[...e.matchAll(/^\*\*\* (?:(Add|Update|Delete) File|(Move) to): (.+)\r?$/gm)].map(s=>({kind:s[1]??s[2],path:s[3]?.trim()})).filter(s=>!!(s.kind&&s.path));return r.length>0&&(n.path=r[0].path,n.paths=r.map(s=>s.path),n.kinds=r.map(s=>s.kind)),n}async function Dh(t){let e=0,n=0,r=0,s=0,i=0,o,a;for await(let l of Be(t)){if(l.type==="response_item"&&l.payload){let c=l.payload;if(c.type==="message"&&c.role==="user"&&c.content)for(let u of c.content)u.type==="input_text"&&typeof u.text=="string"&&u.text&&e++;else if(c.type==="message"&&c.role==="assistant"&&c.content)for(let u of c.content)u.type==="output_text"&&typeof u.text=="string"&&u.text&&e++}if(l.payload&&typeof l.payload.model_context_window=="number"&&(a=l.payload.model_context_window),l.type==="event_msg"&&l.payload?.type==="token_count"&&l.payload.info?.total_token_usage){let c=l.payload.info.total_token_usage;n=c.input_tokens??n,r=c.cached_input_tokens??c.cache_read_input_tokens??r,s=c.output_tokens??s,i=c.reasoning_output_tokens??i;let u=OL(l.payload.info.last_token_usage);u&&(o=u),typeof l.payload.info.model_context_window=="number"&&(a=l.payload.info.model_context_window)}}return{messageCount:e,totalInputTokens:n,totalCachedInputTokens:r,totalOutputTokens:s,totalReasoningOutputTokens:i,lastTokenUsage:o,modelContextWindow:a}}var uo,jh=E(()=>{"use strict";Wt();uo=class{name="codex";codexDirs;constructor(e={}){let n=[Rs(we,".codex"),Rs(we,".code")];if(e.codexDirs&&e.codexDirs.length>0){this.codexDirs=[...new Set(e.codexDirs)];return}let r=[e.codexDir||n[0],e.codeDir||n[1]];this.codexDirs=[...new Set(r)]}getWatchPaths(){return this.codexDirs.map(e=>({directory:Rs(e,"sessions"),filePattern:/\.jsonl$/}))}async getSessionsDirs(){let e=[];for(let n of this.codexDirs){let r=Rs(n,"sessions");try{await $h(r),e.push(r)}catch{}}return e}async discoverSessions(){let e=[],n=await this.getSessionsDirs();for(let r of n){let s=await this.findSessionFiles(r);for(let i of s)try{let o=await this.extractSummary(i);o&&e.push(o)}catch{}}return e}async findSessionFiles(e){let n=[],r;try{r=await AL(e)}catch{return n}for(let s of r){let i=Rs(e,s),o=await $h(i).catch(()=>null);if(o)if(o.isDirectory()){let a=await this.findSessionFiles(i);n.push(...a)}else s.endsWith(".jsonl")&&n.push(i)}return n}extractSessionIdFromFilename(e){let n=RL(e,".jsonl"),r=n.match(/rollout-\d{4}-\d{2}-\d{2}T\d{2}-\d{2}-\d{2}-(.+)$/);return r?r[1]:n}async extractSummary(e){let n=await Ke(e,30),r=await Le(e),s=this.extractSessionIdFromFilename(e),i="",o,a,l,c,u,d,f;for(let p of n){if(p.type==="session_meta"&&p.payload&&(p.payload.id&&(s=p.payload.id),p.payload.cwd&&(i=p.payload.cwd),p.payload.cli_version&&(o=p.payload.cli_version),p.payload.timestamp&&(l=new Date(p.payload.timestamp)),p.payload.originator&&(d=p.payload.originator),p.payload.source&&(f=p.payload.source)),p.type==="turn_context"&&p.payload&&(p.payload.model&&(a=p.payload.model),!i&&p.payload.cwd&&(i=p.payload.cwd)),p.type==="event_msg"&&p.payload?.type==="user_message"){let _=p.payload.message||p.payload.text;_&&(c||(c=J(_.trim(),80)),u=J(_.trim(),80))}if(p.type==="response_item"&&p.payload?.type==="message"&&p.payload.role==="user"&&p.payload.content){let _=p.payload.content.find(h=>h.type==="input_text"&&typeof h.text=="string"&&h.text);typeof _?.text=="string"&&(c||(c=J(_.text.trim(),80)),u=J(_.text.trim(),80))}}if(!i)return null;let m=await Dh(e);return{provider:"codex",sessionId:s,cwd:i,createdAt:l||r.createdAt,modifiedAt:r.modifiedAt,model:a,cliVersion:o,startCommand:Mh(d,f),firstUserMessage:c,lastUserMessage:u,messageCount:m.messageCount,filePath:e,totalInputTokens:m.totalInputTokens||void 0,totalCachedInputTokens:m.totalCachedInputTokens||void 0,totalOutputTokens:m.totalOutputTokens||void 0,totalReasoningOutputTokens:m.totalReasoningOutputTokens||void 0,lastInputTokens:m.lastTokenUsage?.inputTokens||void 0,lastTokenUsage:m.lastTokenUsage,modelContextWindow:m.modelContextWindow}}async loadSession(e){let n=await this.resolveSessionFile(e);if(!n)return null;let r=await Le(n),s=[],i="",o,a,l,c,u,d=e,f,m,p=new Set;for await(let h of Be(n)){let g=h.timestamp?new Date(h.timestamp):new Date;if(h.type==="session_meta"&&h.payload){h.payload.id&&(d=h.payload.id),h.payload.cwd&&(i=h.payload.cwd),h.payload.cli_version&&(o=h.payload.cli_version),h.payload.timestamp&&(l=new Date(h.payload.timestamp)),f=Mh(h.payload.originator,h.payload.source);continue}if(h.type==="turn_context"&&h.payload){h.payload.model&&(a=h.payload.model),!i&&h.payload.cwd&&(i=h.payload.cwd);continue}if(h.type==="response_item"&&h.payload){let w=h.payload;if(w.type==="message"){if(w.role==="user"&&w.content){for(let y of w.content)if(y.type==="input_text"&&typeof y.text=="string"&&y.text){let S=y.text.trim();c||(c=J(S,80)),u=J(S,80),Ls(s,p,{role:"user",timestamp:g,content:pe(S)})}continue}if(w.role==="assistant"&&w.content){for(let y of w.content)y.type==="output_text"&&typeof y.text=="string"&&y.text&&Ls(s,p,{role:"assistant",timestamp:g,content:pe(y.text),model:a});continue}if(w.role!=="user"&&w.role!=="assistant"&&w.content){for(let y of w.content)(y.type==="input_text"||y.type==="output_text")&&typeof y.text=="string"&&y.text&&Ls(s,p,{role:"system",timestamp:g,content:pe(y.text.trim())});continue}}if(w.type==="function_call"){s.push({role:"tool_use",timestamp:g,content:w.name||"unknown tool",toolName:w.name,toolInput:w.arguments!==void 0?pe(Ar(w.arguments)):void 0,toolInputData:CL(w.arguments),toolCallId:w.call_id});continue}if(w.type==="function_call_output"){s.push({role:"tool_result",timestamp:g,content:pe(Ar(w.output)),toolCallId:w.call_id});continue}if(w.type==="custom_tool_call"){s.push({role:"tool_use",timestamp:g,content:w.name||"unknown tool",toolName:w.name,toolInput:w.input!==void 0?pe(Ar(w.input)):void 0,toolInputData:$L(w.name,w.input),toolCallId:w.call_id});continue}if(w.type==="custom_tool_call_output"){s.push({role:"tool_result",timestamp:g,content:pe(Ar(w.output)),toolCallId:w.call_id});continue}if(w.type==="reasoning"&&w.summary){let y=w.summary.map(S=>Ar(S.text)).join(`
1542
- `);y.trim()&&Ls(s,p,{role:"thinking",timestamp:g,content:pe(y)});continue}}if(h.type==="event_msg"&&h.payload&&(h.payload.type==="task_started"?m="in_progress":h.payload.type==="task_complete"?m="complete":h.payload.type==="turn_aborted"&&(m="aborted"),h.payload.type==="agent_reasoning")){let w=h.payload.message||h.payload.text;w&&Ls(s,p,{role:"thinking",timestamp:g,content:pe(w)})}}if(!i)return null;let _=await Dh(n);return{provider:"codex",sessionId:d,cwd:i,createdAt:l||r.createdAt,modifiedAt:r.modifiedAt,model:a,cliVersion:o,startCommand:f,turnStatus:m,firstUserMessage:c,lastUserMessage:u,messageCount:_.messageCount,filePath:n,totalInputTokens:_.totalInputTokens||void 0,totalCachedInputTokens:_.totalCachedInputTokens||void 0,totalOutputTokens:_.totalOutputTokens||void 0,totalReasoningOutputTokens:_.totalReasoningOutputTokens||void 0,lastInputTokens:_.lastTokenUsage?.inputTokens||void 0,lastTokenUsage:_.lastTokenUsage,modelContextWindow:_.modelContextWindow,messages:s}}async resolveSessionPath(e){return this.resolveSessionFile(e)}async deleteSession(e){let n=await this.resolveSessionFile(e);return n?(await xL(n),!0):!1}async resolveSessionFile(e){let n=await this.getSessionsDirs(),r=[];for(let i of n){let o=await this.findSessionFiles(i);r.push(...o)}for(let i of r)if(this.extractSessionIdFromFilename(i)===e)return i;let s=[];for(let i of r)this.extractSessionIdFromFilename(i).startsWith(e)&&s.push(i);if(s.length===1)return s[0];for(let i of r){let o=await Ke(i,1);if(o.length>0&&o[0].type==="session_meta"){let a=o[0].payload?.id;if(a===e||a&&a.startsWith(e))return i}}return null}}});function Gc(t){return new Jc(t)}var Jc,Kc=E(()=>{"use strict";jh();Tt();vn();ut();Jc=class extends ve{constructor(e){super({provider:new uo(e),capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!1,canCancel:!1},injection:{leaderMode:"prompt-append"},binary:"codex",seedArgs:["exec","--dangerously-bypass-approvals-and-sandbox","--skip-git-repo-check","-"],seedStdin:`${_e}
1541
+ `);try{return JSON.stringify(t)}catch{return String(t)}}function CL(t){let e=t;if(typeof t=="string")try{e=JSON.parse(t)}catch{return}return e!==null&&typeof e=="object"&&!Array.isArray(e)?e:void 0}function $L(t,e){if(e===void 0)return;let n={input:e};if(t!=="apply_patch"||typeof e!="string")return n;let r=[...e.matchAll(/^\*\*\* (?:(Add|Update|Delete) File|(Move) to): (.+)\r?$/gm)].map(s=>({kind:s[1]??s[2],path:s[3]?.trim()})).filter(s=>!!(s.kind&&s.path));return r.length>0&&(n.path=r[0].path,n.paths=r.map(s=>s.path),n.kinds=r.map(s=>s.kind)),n}async function Dh(t){let e=0,n=0,r=0,s=0,i=0,o,a;for await(let l of Be(t)){if(l.type==="response_item"&&l.payload){let c=l.payload;if(c.type==="message"&&c.role==="user"&&c.content)for(let u of c.content)u.type==="input_text"&&typeof u.text=="string"&&u.text&&e++;else if(c.type==="message"&&c.role==="assistant"&&c.content)for(let u of c.content)u.type==="output_text"&&typeof u.text=="string"&&u.text&&e++}if(l.payload&&typeof l.payload.model_context_window=="number"&&(a=l.payload.model_context_window),l.type==="event_msg"&&l.payload?.type==="token_count"&&l.payload.info?.total_token_usage){let c=l.payload.info.total_token_usage;n=c.input_tokens??n,r=c.cached_input_tokens??c.cache_read_input_tokens??r,s=c.output_tokens??s,i=c.reasoning_output_tokens??i;let u=OL(l.payload.info.last_token_usage);u&&(o=u),typeof l.payload.info.model_context_window=="number"&&(a=l.payload.info.model_context_window)}}return{messageCount:e,totalInputTokens:n,totalCachedInputTokens:r,totalOutputTokens:s,totalReasoningOutputTokens:i,lastTokenUsage:o,modelContextWindow:a}}var uo,jh=E(()=>{"use strict";Wt();uo=class{name="codex";codexDirs;constructor(e={}){let n=[Rs(we,".codex"),Rs(we,".code")];if(e.codexDirs&&e.codexDirs.length>0){this.codexDirs=[...new Set(e.codexDirs)];return}let r=[e.codexDir||n[0],e.codeDir||n[1]];this.codexDirs=[...new Set(r)]}getWatchPaths(){return this.codexDirs.map(e=>({directory:Rs(e,"sessions"),filePattern:/\.jsonl$/}))}async getSessionsDirs(){let e=[];for(let n of this.codexDirs){let r=Rs(n,"sessions");try{await $h(r),e.push(r)}catch{}}return e}async discoverSessions(){let e=[],n=await this.getSessionsDirs();for(let r of n){let s=await this.findSessionFiles(r);for(let i of s)try{let o=await this.extractSummary(i);o&&e.push(o)}catch{}}return e}async findSessionFiles(e){let n=[],r;try{r=await AL(e)}catch{return n}for(let s of r){let i=Rs(e,s),o=await $h(i).catch(()=>null);if(o)if(o.isDirectory()){let a=await this.findSessionFiles(i);n.push(...a)}else s.endsWith(".jsonl")&&n.push(i)}return n}extractSessionIdFromFilename(e){let n=RL(e,".jsonl"),r=n.match(/rollout-\d{4}-\d{2}-\d{2}T\d{2}-\d{2}-\d{2}-(.+)$/);return r?r[1]:n}async extractSummary(e){let n=await Ke(e,30),r=await Le(e),s=this.extractSessionIdFromFilename(e),i="",o,a,l,c,u,d,f;for(let p of n){if(p.type==="session_meta"&&p.payload&&(p.payload.id&&(s=p.payload.id),p.payload.cwd&&(i=p.payload.cwd),p.payload.cli_version&&(o=p.payload.cli_version),p.payload.timestamp&&(l=new Date(p.payload.timestamp)),p.payload.originator&&(d=p.payload.originator),p.payload.source&&(f=p.payload.source)),p.type==="turn_context"&&p.payload&&(p.payload.model&&(a=p.payload.model),!i&&p.payload.cwd&&(i=p.payload.cwd)),p.type==="event_msg"&&p.payload?.type==="user_message"){let _=p.payload.message||p.payload.text;_&&(c||(c=J(_.trim(),80)),u=J(_.trim(),80))}if(p.type==="response_item"&&p.payload?.type==="message"&&p.payload.role==="user"&&p.payload.content){let _=p.payload.content.find(h=>h.type==="input_text"&&typeof h.text=="string"&&h.text);typeof _?.text=="string"&&(c||(c=J(_.text.trim(),80)),u=J(_.text.trim(),80))}}if(!i)return null;let m=await Dh(e);return{provider:"codex",sessionId:s,cwd:i,createdAt:l||r.createdAt,modifiedAt:r.modifiedAt,model:a,cliVersion:o,startCommand:Mh(d,f),firstUserMessage:c,lastUserMessage:u,messageCount:m.messageCount,filePath:e,totalInputTokens:m.totalInputTokens||void 0,totalCachedInputTokens:m.totalCachedInputTokens||void 0,totalOutputTokens:m.totalOutputTokens||void 0,totalReasoningOutputTokens:m.totalReasoningOutputTokens||void 0,lastInputTokens:m.lastTokenUsage?.inputTokens||void 0,lastTokenUsage:m.lastTokenUsage,modelContextWindow:m.modelContextWindow}}async loadSession(e){let n=await this.resolveSessionFile(e);if(!n)return null;let r=await Le(n),s=[],i="",o,a,l,c,u,d=e,f,m,p=new Set;for await(let h of Be(n)){let g=h.timestamp?new Date(h.timestamp):new Date;if(h.type==="session_meta"&&h.payload){h.payload.id&&(d=h.payload.id),h.payload.cwd&&(i=h.payload.cwd),h.payload.cli_version&&(o=h.payload.cli_version),h.payload.timestamp&&(l=new Date(h.payload.timestamp)),f=Mh(h.payload.originator,h.payload.source);continue}if(h.type==="turn_context"&&h.payload){h.payload.model&&(a=h.payload.model),!i&&h.payload.cwd&&(i=h.payload.cwd);continue}if(h.type==="response_item"&&h.payload){let y=h.payload;if(y.type==="message"){if(y.role==="user"&&y.content){for(let w of y.content)if(w.type==="input_text"&&typeof w.text=="string"&&w.text){let S=w.text.trim();c||(c=J(S,80)),u=J(S,80),Ls(s,p,{role:"user",timestamp:g,content:pe(S)})}continue}if(y.role==="assistant"&&y.content){for(let w of y.content)w.type==="output_text"&&typeof w.text=="string"&&w.text&&Ls(s,p,{role:"assistant",timestamp:g,content:pe(w.text),model:a});continue}if(y.role!=="user"&&y.role!=="assistant"&&y.content){for(let w of y.content)(w.type==="input_text"||w.type==="output_text")&&typeof w.text=="string"&&w.text&&Ls(s,p,{role:"system",timestamp:g,content:pe(w.text.trim())});continue}}if(y.type==="function_call"){s.push({role:"tool_use",timestamp:g,content:y.name||"unknown tool",toolName:y.name,toolInput:y.arguments!==void 0?pe(Ar(y.arguments)):void 0,toolInputData:CL(y.arguments),toolCallId:y.call_id});continue}if(y.type==="function_call_output"){s.push({role:"tool_result",timestamp:g,content:pe(Ar(y.output)),toolCallId:y.call_id});continue}if(y.type==="custom_tool_call"){s.push({role:"tool_use",timestamp:g,content:y.name||"unknown tool",toolName:y.name,toolInput:y.input!==void 0?pe(Ar(y.input)):void 0,toolInputData:$L(y.name,y.input),toolCallId:y.call_id});continue}if(y.type==="custom_tool_call_output"){s.push({role:"tool_result",timestamp:g,content:pe(Ar(y.output)),toolCallId:y.call_id});continue}if(y.type==="reasoning"&&y.summary){let w=y.summary.map(S=>Ar(S.text)).join(`
1542
+ `);w.trim()&&Ls(s,p,{role:"thinking",timestamp:g,content:pe(w)});continue}}if(h.type==="event_msg"&&h.payload&&(h.payload.type==="task_started"?m="in_progress":h.payload.type==="task_complete"?m="complete":h.payload.type==="turn_aborted"&&(m="aborted"),h.payload.type==="agent_reasoning")){let y=h.payload.message||h.payload.text;y&&Ls(s,p,{role:"thinking",timestamp:g,content:pe(y)})}}if(!i)return null;let _=await Dh(n);return{provider:"codex",sessionId:d,cwd:i,createdAt:l||r.createdAt,modifiedAt:r.modifiedAt,model:a,cliVersion:o,startCommand:f,turnStatus:m,firstUserMessage:c,lastUserMessage:u,messageCount:_.messageCount,filePath:n,totalInputTokens:_.totalInputTokens||void 0,totalCachedInputTokens:_.totalCachedInputTokens||void 0,totalOutputTokens:_.totalOutputTokens||void 0,totalReasoningOutputTokens:_.totalReasoningOutputTokens||void 0,lastInputTokens:_.lastTokenUsage?.inputTokens||void 0,lastTokenUsage:_.lastTokenUsage,modelContextWindow:_.modelContextWindow,messages:s}}async resolveSessionPath(e){return this.resolveSessionFile(e)}async deleteSession(e){let n=await this.resolveSessionFile(e);return n?(await xL(n),!0):!1}async resolveSessionFile(e){let n=await this.getSessionsDirs(),r=[];for(let i of n){let o=await this.findSessionFiles(i);r.push(...o)}for(let i of r)if(this.extractSessionIdFromFilename(i)===e)return i;let s=[];for(let i of r)this.extractSessionIdFromFilename(i).startsWith(e)&&s.push(i);if(s.length===1)return s[0];for(let i of r){let o=await Ke(i,1);if(o.length>0&&o[0].type==="session_meta"){let a=o[0].payload?.id;if(a===e||a&&a.startsWith(e))return i}}return null}}});function Gc(t){return new Jc(t)}var Jc,Kc=E(()=>{"use strict";jh();Tt();vn();ut();Jc=class extends ve{constructor(e){super({provider:new uo(e),capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!1,canCancel:!1},injection:{leaderMode:"prompt-append"},binary:"codex",seedArgs:["exec","--dangerously-bypass-approvals-and-sandbox","--skip-git-repo-check","-"],seedStdin:`${_e}
1543
1543
  `,resumeTemplate:"codex resume {{session_id}}",startTemplate:"codex",transport:Ch})}seedArgsFor(e){let n=super.seedArgsFor(e);return e?.model?[...n.slice(0,-1),"--model",e.model,n[n.length-1]]:n}}});function Os(t){if(!t.trim())return"unknown";let e=t.split(/\r?\n/).filter(r=>r.trim().length>0);if(e.length>1)try{let r=JSON.parse(e[0]);if(r!==null&&typeof r=="object"&&!Array.isArray(r)&&"kind"in r)return"jsonl"}catch{}let n;try{n=JSON.parse(t)}catch{return"unknown"}if(n!==null&&typeof n=="object"&&!Array.isArray(n)){let r=n;if(Array.isArray(r.messages))return"json";if("kind"in r)return"jsonl"}return"unknown"}function fo(t){let e=Os(t);if(e==="unknown")throw new Error("gemini session content matches neither known format (old .json with messages[] or new .jsonl with kind metadata)");if(e==="json"){let a=JSON.parse(t);return{sessionId:a.sessionId,projectHash:a.projectHash,startTime:a.startTime,lastUpdated:a.lastUpdated,kind:a.kind,messages:Array.isArray(a.messages)?a.messages:[]}}let n=t.split(`
1544
1544
  `).map(a=>a).filter(a=>a.trim().length>0);if(n.length===0)throw new Error("gemini session file is empty");let r=n[0],s;try{s=JSON.parse(r)}catch(a){throw new Error(`gemini JSONL session: metadata line failed to parse: ${a instanceof Error?a.message:String(a)}`)}if(s===null||typeof s!="object")throw new Error("gemini JSONL session: metadata line is not an object");let i=[],o=new Map;for(let a=1;a<n.length;a++){let l;try{l=JSON.parse(n[a])}catch{continue}if(l===null||typeof l!="object")continue;let c=l;if("$set"in c&&c.$set&&typeof c.$set=="object"){Object.assign(s,c.$set);continue}if(typeof c.id=="string"||typeof c.type=="string"){let u=c;if(typeof u.id=="string"){let d=o.get(u.id);d?ML(d,u):(i.push(u),o.set(u.id,u))}else i.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:i}}function ML(t,e){for(let[n,r]of Object.entries(e))if(r!==void 0){if(n==="tokens"&&Ph(t.tokens)&&Ph(r)){t.tokens={...t.tokens,...r};continue}t[n]=r}}function Ph(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function Fh(t,e){if(e==="json")return JSON.stringify(t,null,2);let{messages:n,...r}=t,s=[JSON.stringify(r)];for(let i of n)s.push(JSON.stringify(i));return s.join(`
1545
1545
  `)+`
1546
- `}var Vc=E(()=>{"use strict"});import{createHash as DL}from"node:crypto";import{readdir as Cs,readFile as Uh,stat as mo,unlink as jL}from"node:fs/promises";import{join as st,basename as PL,dirname as FL}from"node:path";import{cwd as UL}from"node:process";function Wh(t){return t?typeof t=="string"?t:Array.isArray(t)?t.map(e=>e.text||"").join(""):"":""}function qh(t){return t==="user"}function Yc(t){return t==="gemini"||t==="assistant"}function Yn(t,e=new Date(0)){if(!t)return e;let n=new Date(t);return Number.isNaN(n.getTime())?e:n}function WL(t){return`${t.sessionId}\0${t.cwd}`}function qL(t,e){let n=t.filePaths??[t.filePath],r=e.filePaths??[e.filePath],s=[...new Set([...n,...r])],i=e.modifiedAt.getTime()>=t.modifiedAt.getTime()?e:t;return{...i,createdAt:t.createdAt.getTime()<=e.createdAt.getTime()?t.createdAt:e.createdAt,modifiedAt:i.modifiedAt,filePath:i.filePath,filePaths:s}}function po(t){let e=Number(t??0);return Number.isFinite(e)?Math.max(0,Math.round(e)):0}function Bh(t){let e=0,n=0,r=0,s=0,i=0,o;for(let a of t){if(!Yc(a.type)||!a.tokens)continue;let l=po(a.tokens.input),c=po(a.tokens.cached),u=Math.max(l-c,0),d=po(a.tokens.output),f=po(a.tokens.thoughts);e+=l,n+=c,r+=d,s+=f,i=l,o={inputTokens:u,cachedInputTokens:c,cacheWriteInputTokens:0,outputTokens:d,reasoningOutputTokens:f,totalTokens:l+d+f}}return{totalInputTokens:e,totalCachedInputTokens:n,totalOutputTokens:r,totalReasoningOutputTokens:s,lastInputTokens:i,lastTokenUsage:o}}function BL(t){return DL("sha256").update(t).digest("hex")}function $s(t,e){let n=e;for(;n&&!t.has(n);){t.add(n);let r=FL(n);if(r===n)break;n=r}}var _o,Hh=E(()=>{"use strict";Wt();Vc();de();_o=class{name="gemini";workspaceHashMap;geminiProjectsFile;geminiTmpDir;claudeProjectsDir;codexSessionDirs;extraWorkspacePaths;constructor(e={}){let n=e.geminiDir||st(we,".gemini");this.geminiProjectsFile=st(n,"projects.json"),this.geminiTmpDir=st(n,"tmp");let r=e.claudeDir||st(we,".claude");this.claudeProjectsDir=st(r,"projects");let s=[st(we,".codex"),st(we,".code")],i=e.codexDirs&&e.codexDirs.length>0?e.codexDirs:[e.codexDir||s[0],e.codeDir||s[1]];this.codexSessionDirs=[...new Set(i)].map(o=>st(o,"sessions")),this.extraWorkspacePaths=e.extraWorkspacePaths||[]}getWatchPaths(){return[{directory:this.geminiTmpDir,filePattern:/\.jsonl?$/}]}async discoverSessions(){let e=await this.findSessionFiles(),n=new Map;for(let r of e)try{let s=await this.extractSummary(r);if(!s)continue;let i=WL(s),o=n.get(i);n.set(i,o?qL(o,s):s)}catch{}return[...n.values()]}async loadSession(e){let n=await this.resolveSessionFile(e);if(!n)return null;let r;try{r=await this.readSessionFile(n)}catch{return null}if(!r)return null;let s=await Le(n),i=[],o=r.messages||[],a=r.sessionId||this.extractSessionIdFromFilename(n),l=r.projectHash||"",c=await this.resolveWorkspace(l),u,d,f;for(let h of o){let g=Yn(h.timestamp),w=h.type,y=pe(Wh(h.content));if(qh(w)){let k=y.trim();k&&(u||(u=J(k,80)),d=J(k,80)),i.push({role:"user",timestamp:g,content:k||y});continue}if(Yc(w)){h.model&&(f=h.model);for(let k of h.thoughts||[]){let b=[k.subject,k.description].filter(Boolean).join(`
1547
- `).trim();b&&i.push({role:"thinking",timestamp:Yn(k.timestamp,g),content:pe(b)})}i.push({role:"assistant",timestamp:g,content:y,model:h.model});continue}let S=w?`[${w}] `:"";i.push({role:"system",timestamp:g,content:`${S}${y}`.trim()})}let m=Yn(r.startTime,s.createdAt),p=Yn(r.lastUpdated,s.modifiedAt),_=Bh(o);return{provider:"gemini",sessionId:a,cwd:c,createdAt:m,modifiedAt:p,model:f,startCommand:"gemini",firstUserMessage:u,lastUserMessage:d,messageCount:i.filter(h=>h.role==="user"||h.role==="assistant").length,filePath:n,totalInputTokens:_.totalInputTokens||void 0,totalCachedInputTokens:_.totalCachedInputTokens||void 0,totalOutputTokens:_.totalOutputTokens||void 0,totalReasoningOutputTokens:_.totalReasoningOutputTokens||void 0,lastInputTokens:_.lastInputTokens||void 0,lastTokenUsage:_.lastTokenUsage,messages:i}}async extractSummary(e){let n=await this.readSessionFile(e);if(!n)return null;let r=await Le(e),s=n.messages||[],i=n.sessionId||this.extractSessionIdFromFilename(e),o=n.projectHash||"",a=await this.resolveWorkspace(o),l,c,u,d=0;for(let m of s)if(qh(m.type)){d++;let p=Wh(m.content).trim();p&&(l||(l=J(pe(p),80)),c=J(pe(p),80))}else Yc(m.type)&&(d++,m.model&&(u=m.model));let f=Bh(s);return{provider:"gemini",sessionId:i,cwd:a,createdAt:Yn(n.startTime,r.createdAt),modifiedAt:Yn(n.lastUpdated,r.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 n=await Uh(e,"utf-8");if(Os(n)==="unknown")return D({event:"gemini_session_format_unknown",provider:"gemini",file:e,preview:n.slice(0,120),message:`gemini session file at ${e} matches neither old (.json with messages[]) nor new (.jsonl with kind metadata) format. Skipping; lmctl ls / audit / stats will not see this session.`}),null;try{return fo(n)}catch{return null}}extractSessionIdFromFilename(e){let n=PL(e).replace(/\.jsonl?$/,""),r=n.match(/session-\d{4}-\d{2}-\d{2}T\d{2}-\d{2}-(.+)$/);return r?r[1]:n}async findSessionFiles(){let e=[],n;try{n=await Cs(this.geminiTmpDir)}catch{return e}for(let r of n){let s=st(this.geminiTmpDir,r,"chats");if(!(await mo(s).catch(()=>null))?.isDirectory())continue;let o;try{o=await Cs(s)}catch{continue}for(let a of o)a.startsWith("session-")&&(!a.endsWith(".json")&&!a.endsWith(".jsonl")||e.push(st(s,a)))}return e}async resolveSessionPath(e){return this.resolveSessionFile(e)}async deleteSession(e){let n=await this.resolveSessionFile(e);return n?(await jL(n),!0):!1}async resolveSessionFile(e){let n=await this.findSessionFiles(),r=[];for(let s of n){let i=await this.readSessionFile(s).catch(()=>null),o=this.extractSessionIdFromFilename(s),a=i?.sessionId||o,l=a===e||a.startsWith(e),c=o===e||o.startsWith(e)||o.length>=8&&e.startsWith(o);if(!l&&!c)continue;let u=await Le(s).catch(()=>({createdAt:new Date(0),modifiedAt:new Date(0)}));r.push({filePath:s,modifiedAt:Yn(i?.lastUpdated,u.modifiedAt)})}return r.sort((s,i)=>{let o=i.modifiedAt.getTime()-s.modifiedAt.getTime();return o!==0?o:i.filePath.localeCompare(s.filePath)}),r[0]?.filePath??null}async resolveWorkspace(e){return e?(await this.getWorkspaceHashMap()).get(e)||`[hash:${e.slice(0,16)}]`:"(unknown workspace)"}async getWorkspaceHashMap(){if(this.workspaceHashMap)return this.workspaceHashMap;let e=new Set;$s(e,UL());for(let r of this.extraWorkspacePaths)$s(e,r);for(let r of await this.collectGeminiProjectPaths())$s(e,r);for(let r of await this.collectCodexCwds())$s(e,r);for(let r of await this.collectClaudeCwds())$s(e,r);let n=new Map;for(let r of e)n.set(BL(r),r);return this.workspaceHashMap=n,n}async collectGeminiProjectPaths(){let e;try{e=await Uh(this.geminiProjectsFile,"utf-8")}catch{return[]}try{let r=JSON.parse(e).projects;return!r||typeof r!="object"||Array.isArray(r)?[]:Object.keys(r)}catch{return[]}}async collectCodexCwds(){let e=new Set;for(let n of this.codexSessionDirs){let r=await this.findJsonlFiles(n);for(let s of r){let o=(await Ke(s,1).catch(()=>[]))[0]?.payload?.cwd;o&&e.add(o)}}return[...e]}async collectClaudeCwds(){let e=new Set,n;try{n=await Cs(this.claudeProjectsDir)}catch{return[]}for(let r of n){let s=st(this.claudeProjectsDir,r);if(!(await mo(s).catch(()=>null))?.isDirectory())continue;let o;try{o=await Cs(s)}catch{continue}for(let a of o){if(!a.endsWith(".jsonl"))continue;let l=st(s,a),u=(await Ke(l,1).catch(()=>[]))[0]?.cwd;u&&e.add(u)}}return[...e]}async findJsonlFiles(e){let n=[];if(!(await mo(e).catch(()=>null))?.isDirectory())return n;let s;try{s=await Cs(e)}catch{return n}for(let i of s){let o=st(e,i),a=await mo(o).catch(()=>null);if(a)if(a.isDirectory()){let l=await this.findJsonlFiles(o);n.push(...l)}else i.endsWith(".jsonl")&&n.push(o)}return n}}});import{readFileSync as HL,writeFileSync as XL,mkdirSync as JL}from"node:fs";import{join as GL,dirname as KL}from"node:path";import{randomUUID as VL}from"node:crypto";function Zc(t){return new zc(t)}var zc,Qc=E(()=>{"use strict";Hh();Tt();vn();ut();Vc();zc=class extends ve{constructor(e){super({provider:new _o(e),capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!0,forkSupport:"automatic",canStructuredTurn:!0,canStreamDeltas:!0,canCancel:!0},injection:{leaderMode:"skill-file",leaderSetupHint:"Place skill files in the project's .gemini/ directory"},binary:"gemini",seedArgs:["-p",_e,"-y","--skip-trust"],resumeTemplate:"gemini --resume {{session_id}} --skip-trust",startTemplate:"gemini --skip-trust",transport:(n,r)=>Sn(n,{...r,acpTool:"gemini"})})}forkHint(e){return["Gemini fork: copies the session file with a new ID.","The forked session has the same conversation history","but diverges from that point forward."].join(`
1546
+ `}var Vc=E(()=>{"use strict"});import{createHash as DL}from"node:crypto";import{readdir as Cs,readFile as Uh,stat as mo,unlink as jL}from"node:fs/promises";import{join as st,basename as PL,dirname as FL}from"node:path";import{cwd as UL}from"node:process";function Wh(t){return t?typeof t=="string"?t:Array.isArray(t)?t.map(e=>e.text||"").join(""):"":""}function qh(t){return t==="user"}function Yc(t){return t==="gemini"||t==="assistant"}function Yn(t,e=new Date(0)){if(!t)return e;let n=new Date(t);return Number.isNaN(n.getTime())?e:n}function WL(t){return`${t.sessionId}\0${t.cwd}`}function qL(t,e){let n=t.filePaths??[t.filePath],r=e.filePaths??[e.filePath],s=[...new Set([...n,...r])],i=e.modifiedAt.getTime()>=t.modifiedAt.getTime()?e:t;return{...i,createdAt:t.createdAt.getTime()<=e.createdAt.getTime()?t.createdAt:e.createdAt,modifiedAt:i.modifiedAt,filePath:i.filePath,filePaths:s}}function po(t){let e=Number(t??0);return Number.isFinite(e)?Math.max(0,Math.round(e)):0}function Bh(t){let e=0,n=0,r=0,s=0,i=0,o;for(let a of t){if(!Yc(a.type)||!a.tokens)continue;let l=po(a.tokens.input),c=po(a.tokens.cached),u=Math.max(l-c,0),d=po(a.tokens.output),f=po(a.tokens.thoughts);e+=l,n+=c,r+=d,s+=f,i=l,o={inputTokens:u,cachedInputTokens:c,cacheWriteInputTokens:0,outputTokens:d,reasoningOutputTokens:f,totalTokens:l+d+f}}return{totalInputTokens:e,totalCachedInputTokens:n,totalOutputTokens:r,totalReasoningOutputTokens:s,lastInputTokens:i,lastTokenUsage:o}}function BL(t){return DL("sha256").update(t).digest("hex")}function $s(t,e){let n=e;for(;n&&!t.has(n);){t.add(n);let r=FL(n);if(r===n)break;n=r}}var _o,Hh=E(()=>{"use strict";Wt();Vc();de();_o=class{name="gemini";workspaceHashMap;geminiProjectsFile;geminiTmpDir;claudeProjectsDir;codexSessionDirs;extraWorkspacePaths;constructor(e={}){let n=e.geminiDir||st(we,".gemini");this.geminiProjectsFile=st(n,"projects.json"),this.geminiTmpDir=st(n,"tmp");let r=e.claudeDir||st(we,".claude");this.claudeProjectsDir=st(r,"projects");let s=[st(we,".codex"),st(we,".code")],i=e.codexDirs&&e.codexDirs.length>0?e.codexDirs:[e.codexDir||s[0],e.codeDir||s[1]];this.codexSessionDirs=[...new Set(i)].map(o=>st(o,"sessions")),this.extraWorkspacePaths=e.extraWorkspacePaths||[]}getWatchPaths(){return[{directory:this.geminiTmpDir,filePattern:/\.jsonl?$/}]}async discoverSessions(){let e=await this.findSessionFiles(),n=new Map;for(let r of e)try{let s=await this.extractSummary(r);if(!s)continue;let i=WL(s),o=n.get(i);n.set(i,o?qL(o,s):s)}catch{}return[...n.values()]}async loadSession(e){let n=await this.resolveSessionFile(e);if(!n)return null;let r;try{r=await this.readSessionFile(n)}catch{return null}if(!r)return null;let s=await Le(n),i=[],o=r.messages||[],a=r.sessionId||this.extractSessionIdFromFilename(n),l=r.projectHash||"",c=await this.resolveWorkspace(l),u,d,f;for(let h of o){let g=Yn(h.timestamp),y=h.type,w=pe(Wh(h.content));if(qh(y)){let k=w.trim();k&&(u||(u=J(k,80)),d=J(k,80)),i.push({role:"user",timestamp:g,content:k||w});continue}if(Yc(y)){h.model&&(f=h.model);for(let k of h.thoughts||[]){let b=[k.subject,k.description].filter(Boolean).join(`
1547
+ `).trim();b&&i.push({role:"thinking",timestamp:Yn(k.timestamp,g),content:pe(b)})}i.push({role:"assistant",timestamp:g,content:w,model:h.model});continue}let S=y?`[${y}] `:"";i.push({role:"system",timestamp:g,content:`${S}${w}`.trim()})}let m=Yn(r.startTime,s.createdAt),p=Yn(r.lastUpdated,s.modifiedAt),_=Bh(o);return{provider:"gemini",sessionId:a,cwd:c,createdAt:m,modifiedAt:p,model:f,startCommand:"gemini",firstUserMessage:u,lastUserMessage:d,messageCount:i.filter(h=>h.role==="user"||h.role==="assistant").length,filePath:n,totalInputTokens:_.totalInputTokens||void 0,totalCachedInputTokens:_.totalCachedInputTokens||void 0,totalOutputTokens:_.totalOutputTokens||void 0,totalReasoningOutputTokens:_.totalReasoningOutputTokens||void 0,lastInputTokens:_.lastInputTokens||void 0,lastTokenUsage:_.lastTokenUsage,messages:i}}async extractSummary(e){let n=await this.readSessionFile(e);if(!n)return null;let r=await Le(e),s=n.messages||[],i=n.sessionId||this.extractSessionIdFromFilename(e),o=n.projectHash||"",a=await this.resolveWorkspace(o),l,c,u,d=0;for(let m of s)if(qh(m.type)){d++;let p=Wh(m.content).trim();p&&(l||(l=J(pe(p),80)),c=J(pe(p),80))}else Yc(m.type)&&(d++,m.model&&(u=m.model));let f=Bh(s);return{provider:"gemini",sessionId:i,cwd:a,createdAt:Yn(n.startTime,r.createdAt),modifiedAt:Yn(n.lastUpdated,r.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 n=await Uh(e,"utf-8");if(Os(n)==="unknown")return D({event:"gemini_session_format_unknown",provider:"gemini",file:e,preview:n.slice(0,120),message:`gemini session file at ${e} matches neither old (.json with messages[]) nor new (.jsonl with kind metadata) format. Skipping; lmctl ls / audit / stats will not see this session.`}),null;try{return fo(n)}catch{return null}}extractSessionIdFromFilename(e){let n=PL(e).replace(/\.jsonl?$/,""),r=n.match(/session-\d{4}-\d{2}-\d{2}T\d{2}-\d{2}-(.+)$/);return r?r[1]:n}async findSessionFiles(){let e=[],n;try{n=await Cs(this.geminiTmpDir)}catch{return e}for(let r of n){let s=st(this.geminiTmpDir,r,"chats");if(!(await mo(s).catch(()=>null))?.isDirectory())continue;let o;try{o=await Cs(s)}catch{continue}for(let a of o)a.startsWith("session-")&&(!a.endsWith(".json")&&!a.endsWith(".jsonl")||e.push(st(s,a)))}return e}async resolveSessionPath(e){return this.resolveSessionFile(e)}async deleteSession(e){let n=await this.resolveSessionFile(e);return n?(await jL(n),!0):!1}async resolveSessionFile(e){let n=await this.findSessionFiles(),r=[];for(let s of n){let i=await this.readSessionFile(s).catch(()=>null),o=this.extractSessionIdFromFilename(s),a=i?.sessionId||o,l=a===e||a.startsWith(e),c=o===e||o.startsWith(e)||o.length>=8&&e.startsWith(o);if(!l&&!c)continue;let u=await Le(s).catch(()=>({createdAt:new Date(0),modifiedAt:new Date(0)}));r.push({filePath:s,modifiedAt:Yn(i?.lastUpdated,u.modifiedAt)})}return r.sort((s,i)=>{let o=i.modifiedAt.getTime()-s.modifiedAt.getTime();return o!==0?o:i.filePath.localeCompare(s.filePath)}),r[0]?.filePath??null}async resolveWorkspace(e){return e?(await this.getWorkspaceHashMap()).get(e)||`[hash:${e.slice(0,16)}]`:"(unknown workspace)"}async getWorkspaceHashMap(){if(this.workspaceHashMap)return this.workspaceHashMap;let e=new Set;$s(e,UL());for(let r of this.extraWorkspacePaths)$s(e,r);for(let r of await this.collectGeminiProjectPaths())$s(e,r);for(let r of await this.collectCodexCwds())$s(e,r);for(let r of await this.collectClaudeCwds())$s(e,r);let n=new Map;for(let r of e)n.set(BL(r),r);return this.workspaceHashMap=n,n}async collectGeminiProjectPaths(){let e;try{e=await Uh(this.geminiProjectsFile,"utf-8")}catch{return[]}try{let r=JSON.parse(e).projects;return!r||typeof r!="object"||Array.isArray(r)?[]:Object.keys(r)}catch{return[]}}async collectCodexCwds(){let e=new Set;for(let n of this.codexSessionDirs){let r=await this.findJsonlFiles(n);for(let s of r){let o=(await Ke(s,1).catch(()=>[]))[0]?.payload?.cwd;o&&e.add(o)}}return[...e]}async collectClaudeCwds(){let e=new Set,n;try{n=await Cs(this.claudeProjectsDir)}catch{return[]}for(let r of n){let s=st(this.claudeProjectsDir,r);if(!(await mo(s).catch(()=>null))?.isDirectory())continue;let o;try{o=await Cs(s)}catch{continue}for(let a of o){if(!a.endsWith(".jsonl"))continue;let l=st(s,a),u=(await Ke(l,1).catch(()=>[]))[0]?.cwd;u&&e.add(u)}}return[...e]}async findJsonlFiles(e){let n=[];if(!(await mo(e).catch(()=>null))?.isDirectory())return n;let s;try{s=await Cs(e)}catch{return n}for(let i of s){let o=st(e,i),a=await mo(o).catch(()=>null);if(a)if(a.isDirectory()){let l=await this.findJsonlFiles(o);n.push(...l)}else i.endsWith(".jsonl")&&n.push(o)}return n}}});import{readFileSync as HL,writeFileSync as XL,mkdirSync as JL}from"node:fs";import{join as GL,dirname as KL}from"node:path";import{randomUUID as VL}from"node:crypto";function Zc(t){return new zc(t)}var zc,Qc=E(()=>{"use strict";Hh();Tt();vn();ut();Vc();zc=class extends ve{constructor(e){super({provider:new _o(e),capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!0,forkSupport:"automatic",canStructuredTurn:!0,canStreamDeltas:!0,canCancel:!0},injection:{leaderMode:"skill-file",leaderSetupHint:"Place skill files in the project's .gemini/ directory"},binary:"gemini",seedArgs:["-p",_e,"-y","--skip-trust"],resumeTemplate:"gemini --resume {{session_id}} --skip-trust",startTemplate:"gemini --skip-trust",transport:(n,r)=>Sn(n,{...r,acpTool:"gemini"})})}forkHint(e){return["Gemini fork: copies the session file with a new ID.","The forked session has the same conversation history","but diverges from that point forward."].join(`
1548
1548
  `)}seedArgsFor(e){let n=super.seedArgsFor(e);return e?.model?[...n,"--model",e.model]:n}manualSeedHint(e){return{launchCommand:`cd ${e} && gemini --skip-trust`,postLaunchNote:to,lsCommand:`lmctl ls --provider gemini --sessiondir ${e}`}}async fork(e,n){let r=await this.resolvePath(e);if(!r)return{success:!1,error:`Session file not found for ${e}`};try{let s=HL(r,"utf-8"),i=Os(s),o=fo(s),a=VL();o.sessionId=a,o.kind="main";let l=KL(r),c=new Date().toISOString().replace(/[:.]/g,"-").slice(0,19),u=i==="jsonl"?".jsonl":".json",d=`session-${c}-${a.slice(0,8)}${u}`,f=GL(l,d);return JL(l,{recursive:!0}),XL(f,Fh(o,i),"utf-8"),{success:!0,sessionId:a,filePath:f}}catch(s){return{success:!1,error:s instanceof Error?s.message:String(s)}}}}});import{readdir as Xh,readFile as YL,rm as zL,stat as xr}from"node:fs/promises";import{basename as ZL,join as St}from"node:path";function QL(t){if(!t)return null;let e={inputTokens:0,outputTokens:0,cacheReadTokens:0,cacheWriteTokens:0,reasoningTokens:0},n=!1;for(let r of Object.values(t))r?.usage&&(n=!0,e.inputTokens+=r.usage.inputTokens??0,e.outputTokens+=r.usage.outputTokens??0,e.cacheReadTokens+=r.usage.cacheReadTokens??0,e.cacheWriteTokens+=r.usage.cacheWriteTokens??0,e.reasoningTokens+=r.usage.reasoningTokens??0);return n?e:null}function ed(){return{shutdownTotals:null,assistantOutputSum:0}}function Gh(t,e){if(e.type==="assistant.message"){let n=e.data?.outputTokens;typeof n=="number"&&(t.assistantOutputSum+=n,t.lastAssistantOutputTokens=n)}else if(e.type==="session.shutdown"){let n=QL(e.data?.modelMetrics);n&&(t.shutdownTotals=n)}}function Jh(t){let e=t.shutdownTotals,n=t.lastAssistantOutputTokens!==void 0?{outputTokens:t.lastAssistantOutputTokens}:void 0;return{totalInputTokens:e?.inputTokens,totalCachedInputTokens:e?.cacheReadTokens,totalCacheWriteInputTokens:e?.cacheWriteTokens,totalOutputTokens:e?.outputTokens??(t.lastAssistantOutputTokens===void 0?void 0:t.assistantOutputSum),totalReasoningOutputTokens:e?.reasoningTokens,lastTokenUsage:n}}function eO(t){let e={};for(let n of t.split(`
1549
1549
  `)){let r=n.match(/^(\w+):\s*(.*)$/);r&&(e[r[1]]=r[2].trim())}return{id:e.id,cwd:e.cwd,summary_count:e.summary_count?parseInt(e.summary_count,10):void 0,created_at:e.created_at,updated_at:e.updated_at,summary:e.summary}}function zn(t){if(!t)return;let e=new Date(t);return Number.isNaN(e.getTime())?void 0:e}async function tO(t){let e=0,n=ed();for await(let r of Be(t))(r.type==="user.message"||r.type==="assistant.message"&&(r.data?.content||"").trim())&&e++,Gh(n,r);return{messageCount:e,tokens:n}}function nO(t){let e=rO(t),n=new Map;for(let r of t){if(r.role!=="tool_use"||r.toolCallId===void 0)continue;if(r.toolName==="bash"){let l=e.get(r.toolCallId),u=[l?.content,l?.toolDetailedContent].filter(f=>typeof f=="string").join(`
1550
- `).match(/<command (?:started in (?:detached )?background with|with) shellId:\s*([^>\s]+)/i)?.[1];if(u===void 0)continue;let d=`copilot-shell:${u}:${r.toolCallId}`;n.set(u,d),r.backgroundTaskId=d,l!==void 0&&(l.backgroundTaskId=d);continue}if(!["read_bash","write_bash","stop_bash"].includes(r.toolName??""))continue;let s=r.toolInputData?.shellId;if(typeof s!="string"&&typeof s!="number")continue;let i=String(s),o=n.get(i);if(o===void 0)continue;r.backgroundTaskId=o;let a=e.get(r.toolCallId);a!==void 0&&(a.backgroundTaskId=o)}}function rO(t){let e=new Map;for(let n of t)n.role==="tool_result"&&n.toolCallId!==void 0&&e.set(n.toolCallId,n);return e}var ho,Kh=E(()=>{"use strict";Wt();ho=class{name="copilot";sessionStateDir;constructor(e={}){let n=e.copilotDir||St(we,".copilot");this.sessionStateDir=St(n,"session-state")}getWatchPaths(){return[{directory:this.sessionStateDir,filePattern:/events\.jsonl$/}]}async discoverSessions(){let e=[],n;try{n=await Xh(this.sessionStateDir)}catch{return e}for(let r of n){let s=St(this.sessionStateDir,r);if((await xr(s).catch(()=>null))?.isDirectory())try{let o=await this.extractSummary(s,r);o&&e.push(o)}catch{}}return e}async loadSession(e){let n=await this.resolveSessionDir(e);if(!n)return null;let r=await this.readWorkspaceYaml(n),s=St(n,"events.jsonl"),i=await xr(s).catch(()=>null),o=i?s:St(n,"workspace.yaml"),a=await Le(i?s:n),l=[],c=r?.cwd||"(unknown workspace)",u,d,f,m,p,_,h=r?.id||ZL(n)||e,g=ed();if(i)for await(let w of Be(s)){let y=zn(w.timestamp)||a.modifiedAt;if(Gh(g,w),w.type==="session.start"&&w.data){w.data.sessionId&&(h=w.data.sessionId),w.data.copilotVersion&&(d=w.data.copilotVersion),w.data.startTime&&(_=zn(w.data.startTime)),w.data.selectedModel&&(u=w.data.selectedModel),w.data.context&&(w.data.context.cwd&&(c=w.data.context.cwd),w.data.context.branch&&(f=w.data.context.branch));continue}if(w.type==="session.model_change"&&w.data?.newModel){u=w.data.newModel;continue}if(w.type==="user.message"&&w.data){let S=w.data.content||"",k=S.trim();k&&(m||(m=J(k,80)),p=J(k,80)),l.push({role:"user",timestamp:y,content:pe(k||S)});continue}if(w.type==="assistant.message"&&w.data){let S=(w.data.content||"").trim();if(S&&l.push({role:"assistant",timestamp:y,content:pe(S),model:u}),w.data.toolRequests)for(let k of w.data.toolRequests)l.push({role:"tool_use",timestamp:y,content:k.name||"unknown tool",toolName:k.name,toolInput:k.arguments?JSON.stringify(k.arguments,null,2):void 0,toolInputData:Ut(k.arguments),toolCallId:k.toolCallId});continue}if(w.type==="tool.execution_complete"&&w.data){let S=w.data.result?.content||"",k=w.data.result?.detailedContent||"";l.push({role:"tool_result",timestamp:y,content:pe(S),toolDetailedContent:k?pe(k):void 0,toolCallId:w.data.toolCallId});continue}if(w.type==="assistant.reasoning"&&w.data?.content){l.push({role:"thinking",timestamp:y,content:pe(w.data.content)});continue}if(w.type==="session.error"||w.type==="session.warning"||w.type==="session.info"||w.type==="system.message"){let S=w.data?.message||"";S.trim()&&l.push({role:"system",timestamp:y,content:pe(S)});continue}}if(!m){let w=(r?.summary||"").trim();w&&(m=J(w,80))}return nO(l),{provider:"copilot",sessionId:h,cwd:c,createdAt:_??zn(r?.created_at)??a.createdAt,modifiedAt:zn(r?.updated_at)??a.modifiedAt,model:u,cliVersion:d,startCommand:"copilot",gitBranch:f,firstUserMessage:m,lastUserMessage:p,messageCount:l.filter(w=>w.role==="user"||w.role==="assistant").length,filePath:o,...Jh(g),messages:l}}async extractSummary(e,n){let r=await this.readWorkspaceYaml(e),s=St(e,"events.jsonl"),i=await xr(s).catch(()=>null),o=i?s:St(e,"workspace.yaml"),a=await Le(i?s:e),l=i?await Ke(s,20):[],c=r?.id||n,u=r?.cwd||"(unknown workspace)",d,f,m,p,_;for(let g of l)if(g.type==="session.start"&&g.data&&(g.data.sessionId&&(c=g.data.sessionId),g.data.copilotVersion&&(f=g.data.copilotVersion),g.data.startTime&&(m=zn(g.data.startTime)),g.data.selectedModel&&(d=g.data.selectedModel),g.data.context?.cwd&&(u=g.data.context.cwd)),g.type==="session.model_change"&&g.data?.newModel&&(d||(d=g.data.newModel)),g.type==="user.message"&&g.data){let w=(g.data.content||"").trim();w&&(p||(p=J(w,80)),_=J(w,80))}if(!p){let g=(r?.summary||"").trim();g&&(p=J(g,80))}let h=i?await tO(s):{messageCount:0,tokens:ed()};return{provider:"copilot",sessionId:c,cwd:u,createdAt:m??zn(r?.created_at)??a.createdAt,modifiedAt:zn(r?.updated_at)??a.modifiedAt,model:d,cliVersion:f,startCommand:"copilot",firstUserMessage:p,lastUserMessage:_,messageCount:h.messageCount,filePath:o,...Jh(h.tokens)}}async readWorkspaceYaml(e){let n=St(e,"workspace.yaml");try{let r=await YL(n,"utf-8");return eO(r)}catch{return null}}async resolveSessionPath(e){return this.resolveSessionDir(e)}async deleteSession(e){let n=await this.resolveSessionDir(e);return n?(await zL(n,{recursive:!0}),!0):!1}async resolveSessionDir(e){let n;try{n=await Xh(this.sessionStateDir)}catch{return null}if(n.includes(e)){let s=St(this.sessionStateDir,e);if((await xr(s).catch(()=>null))?.isDirectory())return s}let r=[];for(let s of n)if(s.startsWith(e)){let i=St(this.sessionStateDir,s);(await xr(i).catch(()=>null))?.isDirectory()&&r.push(i)}if(r.length===1)return r[0];for(let s of n){let i=St(this.sessionStateDir,s);if(!(await xr(i).catch(()=>null))?.isDirectory())continue;let a=await this.readWorkspaceYaml(i);if(a&&(a.id===e||a.id?.startsWith(e)))return i}return null}}});function nd(t){return new td(t)}var td,rd=E(()=>{"use strict";Kh();Tt();vn();de();ut();td=class extends ve{constructor(e){super({provider:new ho(e),capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!0,canCancel:!0},injection:{leaderMode:"prompt-append"},binary:"copilot",seedArgs:["-p",_e,"--yolo"],resumeTemplate:"copilot --resume={{session_id}}",startTemplate:"copilot",transport:(n,r)=>Sn(n,{...r,acpTool:"copilot"})})}async seed(e,n){let r=await super.seed(e,n);if(n?.model===void 0||n.model.trim().length===0)return r;let s="copilot seed does not implement per-session model selection";return Me({event:"model_ignored",provider:"copilot",model:n.model,reason:s}),{...r,warnings:[...r.warnings??[],`copilot seed ignored model=${n.model}: ${s}`]}}}});import{existsSync as Vh,readdirSync as sO,statSync as Yh}from"node:fs";import{join as bn}from"node:path";import{createRequire as iO}from"node:module";function zh(){return sd===null&&(sd=iO(import.meta.url)("node:sqlite").DatabaseSync),sd}function Zh(){return{observed:!1,totalInputTokens:0,totalCachedInputTokens:0,totalCacheWriteInputTokens:0,totalOutputTokens:0,totalReasoningOutputTokens:0}}function Qh(t,e){if(!e)return;t.observed=!0;let n=e.input??0,r=e.output??0,s=e.reasoning??0,i=e.cache?.read??0,o=e.cache?.write??0;if(t.totalInputTokens+=n,t.totalCachedInputTokens+=i,t.totalCacheWriteInputTokens+=o,t.totalOutputTokens+=r,t.totalReasoningOutputTokens+=s,n+r+s+i+o>0){let a=n+i+o;t.lastInputTokens=a,t.lastTokenUsage={inputTokens:n,cachedInputTokens:i,cacheWriteInputTokens:o,outputTokens:r,reasoningOutputTokens:s,totalTokens:a+r+s}}}function eg(t){return t.observed?{totalInputTokens:t.totalInputTokens,totalCachedInputTokens:t.totalCachedInputTokens,totalCacheWriteInputTokens:t.totalCacheWriteInputTokens,totalOutputTokens:t.totalOutputTokens,totalReasoningOutputTokens:t.totalReasoningOutputTokens,lastInputTokens:t.lastInputTokens,lastTokenUsage:t.lastTokenUsage}:{}}function oO(){let t=process.env.XDG_DATA_HOME||bn(we,".local","share"),e=process.env.XDG_CONFIG_HOME||bn(we,".config");return[bn(t,"opencode","opencode.db"),bn(e,"opencode","opencode.db")]}function aO(){if(process.env.OPENCODE_DB)return[process.env.OPENCODE_DB];let t=process.env.XDG_DATA_HOME||bn(we,".local","share"),e=bn(t,"lmplayer"),n=bn(e,"opencode-local.db"),r=[n];try{let s=sO(e).filter(i=>/^opencode.*\.db$/u.test(i)).map(i=>bn(e,i)).filter(i=>i!==n).sort((i,o)=>{try{return Yh(o).mtimeMs-Yh(i).mtimeMs}catch{return 0}});r.push(...s)}catch{}return r}function lO(t){return t==="lmplayer"?aO():oO()}var sd,Rr,id=E(()=>{"use strict";Wt();de();sd=null;Rr=class{name;startCommand;dbPaths;busyTimeoutMs;constructor(e){this.name=e?.providerName??"opencode",this.startCommand=e?.startCommand??this.name,this.busyTimeoutMs=e?.busyTimeoutMs??5e3,e?.dbPath?this.dbPaths=[e.dbPath]:this.dbPaths=lO(this.name)}existingDbPaths(){return this.dbPaths.filter(e=>Vh(e))}openDb(e){if(!Vh(e))return null;let n=new(zh())(e,{open:!0,readOnly:!0});return n.exec(`PRAGMA busy_timeout = ${this.busyTimeoutMs}`),n}async discoverSessions(){let e=[];for(let n of this.existingDbPaths()){let r=this.openDb(n);if(r)try{let s=new Map,i=r.prepare("SELECT id, worktree, name FROM project").all();for(let a of i)s.set(a.id,a);let o=r.prepare(`SELECT s.id, s.project_id, s.slug, s.directory, s.title, s.version,
1550
+ `).match(/<command (?:started in (?:detached )?background with|with) shellId:\s*([^>\s]+)/i)?.[1];if(u===void 0)continue;let d=`copilot-shell:${u}:${r.toolCallId}`;n.set(u,d),r.backgroundTaskId=d,l!==void 0&&(l.backgroundTaskId=d);continue}if(!["read_bash","write_bash","stop_bash"].includes(r.toolName??""))continue;let s=r.toolInputData?.shellId;if(typeof s!="string"&&typeof s!="number")continue;let i=String(s),o=n.get(i);if(o===void 0)continue;r.backgroundTaskId=o;let a=e.get(r.toolCallId);a!==void 0&&(a.backgroundTaskId=o)}}function rO(t){let e=new Map;for(let n of t)n.role==="tool_result"&&n.toolCallId!==void 0&&e.set(n.toolCallId,n);return e}var ho,Kh=E(()=>{"use strict";Wt();ho=class{name="copilot";sessionStateDir;constructor(e={}){let n=e.copilotDir||St(we,".copilot");this.sessionStateDir=St(n,"session-state")}getWatchPaths(){return[{directory:this.sessionStateDir,filePattern:/events\.jsonl$/}]}async discoverSessions(){let e=[],n;try{n=await Xh(this.sessionStateDir)}catch{return e}for(let r of n){let s=St(this.sessionStateDir,r);if((await xr(s).catch(()=>null))?.isDirectory())try{let o=await this.extractSummary(s,r);o&&e.push(o)}catch{}}return e}async loadSession(e){let n=await this.resolveSessionDir(e);if(!n)return null;let r=await this.readWorkspaceYaml(n),s=St(n,"events.jsonl"),i=await xr(s).catch(()=>null),o=i?s:St(n,"workspace.yaml"),a=await Le(i?s:n),l=[],c=r?.cwd||"(unknown workspace)",u,d,f,m,p,_,h=r?.id||ZL(n)||e,g=ed();if(i)for await(let y of Be(s)){let w=zn(y.timestamp)||a.modifiedAt;if(Gh(g,y),y.type==="session.start"&&y.data){y.data.sessionId&&(h=y.data.sessionId),y.data.copilotVersion&&(d=y.data.copilotVersion),y.data.startTime&&(_=zn(y.data.startTime)),y.data.selectedModel&&(u=y.data.selectedModel),y.data.context&&(y.data.context.cwd&&(c=y.data.context.cwd),y.data.context.branch&&(f=y.data.context.branch));continue}if(y.type==="session.model_change"&&y.data?.newModel){u=y.data.newModel;continue}if(y.type==="user.message"&&y.data){let S=y.data.content||"",k=S.trim();k&&(m||(m=J(k,80)),p=J(k,80)),l.push({role:"user",timestamp:w,content:pe(k||S)});continue}if(y.type==="assistant.message"&&y.data){let S=(y.data.content||"").trim();if(S&&l.push({role:"assistant",timestamp:w,content:pe(S),model:u}),y.data.toolRequests)for(let k of y.data.toolRequests)l.push({role:"tool_use",timestamp:w,content:k.name||"unknown tool",toolName:k.name,toolInput:k.arguments?JSON.stringify(k.arguments,null,2):void 0,toolInputData:Ut(k.arguments),toolCallId:k.toolCallId});continue}if(y.type==="tool.execution_complete"&&y.data){let S=y.data.result?.content||"",k=y.data.result?.detailedContent||"";l.push({role:"tool_result",timestamp:w,content:pe(S),toolDetailedContent:k?pe(k):void 0,toolCallId:y.data.toolCallId});continue}if(y.type==="assistant.reasoning"&&y.data?.content){l.push({role:"thinking",timestamp:w,content:pe(y.data.content)});continue}if(y.type==="session.error"||y.type==="session.warning"||y.type==="session.info"||y.type==="system.message"){let S=y.data?.message||"";S.trim()&&l.push({role:"system",timestamp:w,content:pe(S)});continue}}if(!m){let y=(r?.summary||"").trim();y&&(m=J(y,80))}return nO(l),{provider:"copilot",sessionId:h,cwd:c,createdAt:_??zn(r?.created_at)??a.createdAt,modifiedAt:zn(r?.updated_at)??a.modifiedAt,model:u,cliVersion:d,startCommand:"copilot",gitBranch:f,firstUserMessage:m,lastUserMessage:p,messageCount:l.filter(y=>y.role==="user"||y.role==="assistant").length,filePath:o,...Jh(g),messages:l}}async extractSummary(e,n){let r=await this.readWorkspaceYaml(e),s=St(e,"events.jsonl"),i=await xr(s).catch(()=>null),o=i?s:St(e,"workspace.yaml"),a=await Le(i?s:e),l=i?await Ke(s,20):[],c=r?.id||n,u=r?.cwd||"(unknown workspace)",d,f,m,p,_;for(let g of l)if(g.type==="session.start"&&g.data&&(g.data.sessionId&&(c=g.data.sessionId),g.data.copilotVersion&&(f=g.data.copilotVersion),g.data.startTime&&(m=zn(g.data.startTime)),g.data.selectedModel&&(d=g.data.selectedModel),g.data.context?.cwd&&(u=g.data.context.cwd)),g.type==="session.model_change"&&g.data?.newModel&&(d||(d=g.data.newModel)),g.type==="user.message"&&g.data){let y=(g.data.content||"").trim();y&&(p||(p=J(y,80)),_=J(y,80))}if(!p){let g=(r?.summary||"").trim();g&&(p=J(g,80))}let h=i?await tO(s):{messageCount:0,tokens:ed()};return{provider:"copilot",sessionId:c,cwd:u,createdAt:m??zn(r?.created_at)??a.createdAt,modifiedAt:zn(r?.updated_at)??a.modifiedAt,model:d,cliVersion:f,startCommand:"copilot",firstUserMessage:p,lastUserMessage:_,messageCount:h.messageCount,filePath:o,...Jh(h.tokens)}}async readWorkspaceYaml(e){let n=St(e,"workspace.yaml");try{let r=await YL(n,"utf-8");return eO(r)}catch{return null}}async resolveSessionPath(e){return this.resolveSessionDir(e)}async deleteSession(e){let n=await this.resolveSessionDir(e);return n?(await zL(n,{recursive:!0}),!0):!1}async resolveSessionDir(e){let n;try{n=await Xh(this.sessionStateDir)}catch{return null}if(n.includes(e)){let s=St(this.sessionStateDir,e);if((await xr(s).catch(()=>null))?.isDirectory())return s}let r=[];for(let s of n)if(s.startsWith(e)){let i=St(this.sessionStateDir,s);(await xr(i).catch(()=>null))?.isDirectory()&&r.push(i)}if(r.length===1)return r[0];for(let s of n){let i=St(this.sessionStateDir,s);if(!(await xr(i).catch(()=>null))?.isDirectory())continue;let a=await this.readWorkspaceYaml(i);if(a&&(a.id===e||a.id?.startsWith(e)))return i}return null}}});function nd(t){return new td(t)}var td,rd=E(()=>{"use strict";Kh();Tt();vn();de();ut();td=class extends ve{constructor(e){super({provider:new ho(e),capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!0,canCancel:!0},injection:{leaderMode:"prompt-append"},binary:"copilot",seedArgs:["-p",_e,"--yolo"],resumeTemplate:"copilot --resume={{session_id}}",startTemplate:"copilot",transport:(n,r)=>Sn(n,{...r,acpTool:"copilot"})})}async seed(e,n){let r=await super.seed(e,n);if(n?.model===void 0||n.model.trim().length===0)return r;let s="copilot seed does not implement per-session model selection";return Me({event:"model_ignored",provider:"copilot",model:n.model,reason:s}),{...r,warnings:[...r.warnings??[],`copilot seed ignored model=${n.model}: ${s}`]}}}});import{existsSync as Vh,readdirSync as sO,statSync as Yh}from"node:fs";import{join as bn}from"node:path";import{createRequire as iO}from"node:module";function zh(){return sd===null&&(sd=iO(import.meta.url)("node:sqlite").DatabaseSync),sd}function Zh(){return{observed:!1,totalInputTokens:0,totalCachedInputTokens:0,totalCacheWriteInputTokens:0,totalOutputTokens:0,totalReasoningOutputTokens:0}}function Qh(t,e){if(!e)return;t.observed=!0;let n=e.input??0,r=e.output??0,s=e.reasoning??0,i=e.cache?.read??0,o=e.cache?.write??0;if(t.totalInputTokens+=n,t.totalCachedInputTokens+=i,t.totalCacheWriteInputTokens+=o,t.totalOutputTokens+=r,t.totalReasoningOutputTokens+=s,n+r+s+i+o>0){let a=n+i+o;t.lastInputTokens=a,t.lastTokenUsage={inputTokens:n,cachedInputTokens:i,cacheWriteInputTokens:o,outputTokens:r,reasoningOutputTokens:s,totalTokens:a+r+s}}}function eg(t){return t.observed?{totalInputTokens:t.totalInputTokens,totalCachedInputTokens:t.totalCachedInputTokens,totalCacheWriteInputTokens:t.totalCacheWriteInputTokens,totalOutputTokens:t.totalOutputTokens,totalReasoningOutputTokens:t.totalReasoningOutputTokens,lastInputTokens:t.lastInputTokens,lastTokenUsage:t.lastTokenUsage}:{}}function oO(){let t=process.env.XDG_DATA_HOME||bn(we,".local","share"),e=process.env.XDG_CONFIG_HOME||bn(we,".config");return[bn(t,"opencode","opencode.db"),bn(e,"opencode","opencode.db")]}function aO(){if(process.env.OPENCODE_DB)return[process.env.OPENCODE_DB];let t=process.env.XDG_DATA_HOME||bn(we,".local","share"),e=bn(t,"lmplayer"),n=bn(e,"opencode-local.db"),r=[n];try{let s=sO(e).filter(i=>/^opencode.*\.db$/u.test(i)).map(i=>bn(e,i)).filter(i=>i!==n).sort((i,o)=>{try{return Yh(o).mtimeMs-Yh(i).mtimeMs}catch{return 0}});r.push(...s)}catch{}return r}function lO(t){return t==="lmplayer"?aO():oO()}var sd,Rr,id=E(()=>{"use strict";Wt();de();sd=null;Rr=class{name;startCommand;dbPaths;busyTimeoutMs;constructor(e){this.name=e?.providerName??"opencode",this.startCommand=e?.startCommand??this.name,this.busyTimeoutMs=e?.busyTimeoutMs??5e3,e?.dbPath?this.dbPaths=[e.dbPath]:this.dbPaths=lO(this.name)}existingDbPaths(){return this.dbPaths.filter(e=>Vh(e))}openDb(e){if(!Vh(e))return null;let n=new(zh())(e,{open:!0,readOnly:!0});return n.exec(`PRAGMA busy_timeout = ${this.busyTimeoutMs}`),n}async discoverSessions(){let e=[];for(let n of this.existingDbPaths()){let r=this.openDb(n);if(r)try{let s=new Map,i=r.prepare("SELECT id, worktree, name FROM project").all();for(let a of i)s.set(a.id,a);let o=r.prepare(`SELECT s.id, s.project_id, s.slug, s.directory, s.title, s.version,
1551
1551
  s.time_created, s.time_updated
1552
1552
  FROM session s
1553
1553
  ORDER BY s.time_updated DESC`).all();for(let a of o){let l=s.get(a.project_id),c=a.directory||l?.worktree||"(unknown)",u=r.prepare(`SELECT m.id, m.data, m.time_created FROM message m
1554
- WHERE m.session_id = ? ORDER BY m.time_created ASC`).all(a.id),d=0,f,m,p,_=Zh(),h=[];for(let w of u){let y;try{y=JSON.parse(w.data)}catch{continue}p||(p=y.model?.modelID||y.modelID),(y.role==="user"||y.role==="assistant")&&d++,y.role==="user"&&h.push(w.id),y.role==="assistant"&&Qh(_,y.tokens)}let g=[...h.length>0?[h[0]]:[],...h.length>1?[h[h.length-1]]:[]];for(let w of g){let y=r.prepare("SELECT id, data FROM part WHERE message_id = ? ORDER BY time_created ASC").all(w),S=this.extractText(y);S&&(f||(f=J(S,80)),m=J(S,80))}e.push({provider:this.name,sessionId:a.id,slug:a.slug,cwd:c,createdAt:new Date(a.time_created),modifiedAt:new Date(a.time_updated),model:p,startCommand:this.startCommand,firstUserMessage:f,lastUserMessage:m,messageCount:d,filePath:n,...eg(_)})}}catch(s){D({event:"opencode_discover_sessions_failed",provider:this.name,db_path:n,error_message:s instanceof Error?s.message:String(s)})}finally{r.close()}}return e.sort((n,r)=>r.modifiedAt.getTime()-n.modifiedAt.getTime())}async loadSession(e){for(let n of this.existingDbPaths()){let r=this.openDb(n);if(r)try{let s=this.findSessionRow(r,e);if(!s)continue;return this.buildSessionDetail(r,s,n)}catch{}finally{r.close()}}return null}buildSessionDetail(e,n,r){let s=e.prepare("SELECT id, worktree, name FROM project WHERE id = ?").get(n.project_id),i=n.directory||s?.worktree||"(unknown)",o=e.prepare(`SELECT id, session_id, time_created, time_updated, data
1555
- FROM message WHERE session_id = ? ORDER BY time_created ASC`).all(n.id),a=[],l=0,c,u,d,f=Zh();for(let m of o){let p;try{p=JSON.parse(m.data)}catch{continue}c||(c=p.model?.modelID||p.modelID);let _=p.model?.modelID||p.modelID,h=new Date(p.time?.created||m.time_created),g=e.prepare("SELECT id, data FROM part WHERE message_id = ? ORDER BY time_created ASC").all(m.id);if(p.role==="user"){let w=this.extractText(g);w&&(u||(u=J(w,80)),d=J(w,80)),a.push({role:"user",timestamp:h,content:w||"(empty)"}),l++}else if(p.role==="assistant"){Qh(f,p.tokens);for(let w of g){let y;try{y=JSON.parse(w.data)}catch{continue}y.type==="text"&&y.text?a.push({role:"assistant",timestamp:h,content:y.text,model:_}):y.type==="reasoning"&&y.text?a.push({role:"thinking",timestamp:h,content:y.text}):y.type==="tool"&&y.tool&&(a.push({role:"tool_use",timestamp:h,content:`${y.tool}`,toolName:y.tool,toolCallId:y.callID,toolInput:y.state?.input?JSON.stringify(y.state.input):void 0,toolInputData:Ut(y.state?.input)}),y.state&&(y.state.status==="completed"||y.state.status==="error"||y.state.output!==void 0||y.state.error!==void 0)&&a.push({role:"tool_result",timestamp:h,content:y.state.error??y.state.output??"",toolCallId:y.callID}))}l++}}return{provider:this.name,sessionId:n.id,slug:n.slug,cwd:i,createdAt:new Date(n.time_created),modifiedAt:new Date(n.time_updated),model:c,startCommand:this.startCommand,firstUserMessage:u,lastUserMessage:d,messageCount:l,filePath:r,...eg(f),messages:a}}extractText(e){let n=[];for(let r of e){let s;try{s=JSON.parse(r.data)}catch{continue}s.type==="text"&&s.text&&n.push(s.text)}return n.join(`
1554
+ WHERE m.session_id = ? ORDER BY m.time_created ASC`).all(a.id),d=0,f,m,p,_=Zh(),h=[];for(let y of u){let w;try{w=JSON.parse(y.data)}catch{continue}p||(p=w.model?.modelID||w.modelID),(w.role==="user"||w.role==="assistant")&&d++,w.role==="user"&&h.push(y.id),w.role==="assistant"&&Qh(_,w.tokens)}let g=[...h.length>0?[h[0]]:[],...h.length>1?[h[h.length-1]]:[]];for(let y of g){let w=r.prepare("SELECT id, data FROM part WHERE message_id = ? ORDER BY time_created ASC").all(y),S=this.extractText(w);S&&(f||(f=J(S,80)),m=J(S,80))}e.push({provider:this.name,sessionId:a.id,slug:a.slug,cwd:c,createdAt:new Date(a.time_created),modifiedAt:new Date(a.time_updated),model:p,startCommand:this.startCommand,firstUserMessage:f,lastUserMessage:m,messageCount:d,filePath:n,...eg(_)})}}catch(s){D({event:"opencode_discover_sessions_failed",provider:this.name,db_path:n,error_message:s instanceof Error?s.message:String(s)})}finally{r.close()}}return e.sort((n,r)=>r.modifiedAt.getTime()-n.modifiedAt.getTime())}async loadSession(e){for(let n of this.existingDbPaths()){let r=this.openDb(n);if(r)try{let s=this.findSessionRow(r,e);if(!s)continue;return this.buildSessionDetail(r,s,n)}catch{}finally{r.close()}}return null}buildSessionDetail(e,n,r){let s=e.prepare("SELECT id, worktree, name FROM project WHERE id = ?").get(n.project_id),i=n.directory||s?.worktree||"(unknown)",o=e.prepare(`SELECT id, session_id, time_created, time_updated, data
1555
+ FROM message WHERE session_id = ? ORDER BY time_created ASC`).all(n.id),a=[],l=0,c,u,d,f=Zh();for(let m of o){let p;try{p=JSON.parse(m.data)}catch{continue}c||(c=p.model?.modelID||p.modelID);let _=p.model?.modelID||p.modelID,h=new Date(p.time?.created||m.time_created),g=e.prepare("SELECT id, data FROM part WHERE message_id = ? ORDER BY time_created ASC").all(m.id);if(p.role==="user"){let y=this.extractText(g);y&&(u||(u=J(y,80)),d=J(y,80)),a.push({role:"user",timestamp:h,content:y||"(empty)"}),l++}else if(p.role==="assistant"){Qh(f,p.tokens);for(let y of g){let w;try{w=JSON.parse(y.data)}catch{continue}w.type==="text"&&w.text?a.push({role:"assistant",timestamp:h,content:w.text,model:_}):w.type==="reasoning"&&w.text?a.push({role:"thinking",timestamp:h,content:w.text}):w.type==="tool"&&w.tool&&(a.push({role:"tool_use",timestamp:h,content:`${w.tool}`,toolName:w.tool,toolCallId:w.callID,toolInput:w.state?.input?JSON.stringify(w.state.input):void 0,toolInputData:Ut(w.state?.input)}),w.state&&(w.state.status==="completed"||w.state.status==="error"||w.state.output!==void 0||w.state.error!==void 0)&&a.push({role:"tool_result",timestamp:h,content:w.state.error??w.state.output??"",toolCallId:w.callID}))}l++}}return{provider:this.name,sessionId:n.id,slug:n.slug,cwd:i,createdAt:new Date(n.time_created),modifiedAt:new Date(n.time_updated),model:c,startCommand:this.startCommand,firstUserMessage:u,lastUserMessage:d,messageCount:l,filePath:r,...eg(f),messages:a}}extractText(e){let n=[];for(let r of e){let s;try{s=JSON.parse(r.data)}catch{continue}s.type==="text"&&s.text&&n.push(s.text)}return n.join(`
1556
1556
  `).trim()}async resolveSessionPath(e){for(let n of this.existingDbPaths()){let r=this.openDb(n);if(r)try{if(this.findSessionRow(r,e))return n}catch{}finally{r.close()}}return null}async deleteSession(e){for(let n of this.existingDbPaths()){let r=new(zh())(n,{open:!0});try{let s=this.findSessionRow(r,e);if(!s)continue;return r.prepare("DELETE FROM session WHERE id = ?").run(s.id).changes>0}catch{}finally{r.close()}}return!1}findSessionRow(e,n){let r=e.prepare(`SELECT s.id, s.project_id, s.slug, s.directory, s.title, s.version,
1557
1557
  s.time_created, s.time_updated
1558
1558
  FROM session s WHERE s.id = ?`).get(n);if(r)return r;let s=e.prepare(`SELECT s.id, s.project_id, s.slug, s.directory, s.title, s.version,
@@ -1562,11 +1562,11 @@ ${n}`:n}function wL(t,e){if(t!=="kimi"||!e.includes("notifications/initialized")
1562
1562
  ORDER BY s.time_updated DESC
1563
1563
  LIMIT 2`).all(`${n}%`);return s.length!==1?null:s[0]}}});function ad(){return new od}var od,ld=E(()=>{"use strict";id();Tt();vn();ut();od=class extends ve{constructor(){super({provider:new Rr,capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!0,canCancel:!0},injection:{leaderMode:"custom-tool",leaderSetupHint:"OpenCode supports custom tools via .opencode/tools/ directory"},binary:"opencode",seedArgs:["run",_e],resumeTemplate:"opencode --session {{session_id}}",startTemplate:"opencode",transport:(e,n)=>Sn(e,{...n,acpTool:"opencode"})})}seedArgsFor(e){let n=["run"];return e?.model&&n.push("--model",e.model),e?.effort&&n.push("--variant",e.effort),n.push(e?.prompt??_e),n}}});import{appendFile as cO,mkdir as dO,readFile as tg,readdir as ng,rm as uO,stat as rg}from"node:fs/promises";import{basename as fO,dirname as mO,isAbsolute as sg,join as Zn,relative as pO,resolve as cd}from"node:path";function dd(t){if(!t)return;let e=new Date(t);return Number.isNaN(e.getTime())?void 0:e}function yO(t){return typeof t=="number"?new Date(t):dd(t)??new Date(0)}function ig(t){return typeof t=="string"?t.trim():Array.isArray(t)?t.map(e=>e&&typeof e=="object"&&"text"in e&&typeof e.text=="string"?e.text:"").filter(Boolean).join(`
1564
1564
  `).trim():""}function og(t){if(t!==void 0)try{return JSON.stringify(t)}catch{return String(t)}}function wO(t){return t&&typeof t=="object"&&"output"in t&&typeof t.output=="string"?t.output:og(t)??""}function EO(t){let e=TO(t),n=new Set;for(let r of t){if(r.role!=="tool_use"||r.toolName!=="Bash"||r.toolInputData?.run_in_background!==!0||r.toolCallId===void 0)continue;let s=e.get(r.toolCallId);if(s===void 0)continue;let i=s.content.match(/(?:^|\n)task_id:\s*([^\s]+)/)?.[1];i!==void 0&&(n.add(i),r.backgroundTaskId=i,s.backgroundTaskId=i)}for(let r of t){if(r.role!=="tool_use"||r.toolName!=="TaskOutput"&&r.toolName!=="TaskStop"||r.toolCallId===void 0)continue;let s=r.toolInputData?.task_id;if(typeof s!="string"||!n.has(s))continue;r.backgroundTaskId=s;let i=e.get(r.toolCallId);i!==void 0&&(i.backgroundTaskId=s)}}function TO(t){let e=new Map;for(let n of t)n.role==="tool_result"&&n.toolCallId!==void 0&&e.set(n.toolCallId,n);return e}var _O,hO,gO,go,ag=E(()=>{"use strict";Wt();_O="1.4",hO="1.5",gO=new Set([_O,hO]),go=class{name="kimi";homeDir;sessionsDir;constructor(e){this.homeDir=cd(e?.kimiHome??process.env.KIMI_CODE_HOME??Zn(we,".kimi-code")),this.sessionsDir=Zn(this.homeDir,"sessions")}async discoverSessions(){let e=[];for(let n of await this.sessionFiles())try{let r=await this.summary(n);r&&e.push(r)}catch{}return e.sort((n,r)=>r.modifiedAt.getTime()-n.modifiedAt.getTime())}async loadSession(e){let n=await this.findSession(e);if(!n)return null;let r=await this.summary(n);if(!r)return null;let s=await this.parseWire(n.wirePath);return{...r,messages:s.messages}}async resolveSessionPath(e){return(await this.findSession(e))?.wirePath??null}async deleteSession(e){let n=await this.findSession(e);return n?(await uO(n.sessionDir,{recursive:!0,force:!0}),await dO(mO(this.indexPath()),{recursive:!0,mode:448}),await cO(this.indexPath(),`${JSON.stringify({sessionId:n.sessionId,deleted:!0})}
1565
- `,"utf-8"),!0):!1}getWatchPaths(){return[{directory:this.sessionsDir,filePattern:/wire\.jsonl$/}]}indexPath(){return Zn(this.homeDir,"session_index.jsonl")}async sessionFiles(){let e=await this.readIndex(),n=new Map;for(let s of e.values())this.validSessionDir(s.sessionDir,s.sessionId)&&n.set(s.sessionId,this.filesFor(s.sessionId,s.sessionDir,s.workDir));let r;try{r=await ng(this.sessionsDir,{withFileTypes:!0})}catch{return[...n.values()]}for(let s of r){if(!s.isDirectory())continue;let i=Zn(this.sessionsDir,s.name),o;try{o=await ng(i,{withFileTypes:!0})}catch{continue}for(let a of o){if(!a.isDirectory()||n.has(a.name))continue;let l=Zn(i,a.name);n.set(a.name,this.filesFor(a.name,l))}}return[...n.values()]}async readIndex(){let e;try{e=await tg(this.indexPath(),"utf-8")}catch{return new Map}let n=new Map;for(let r of e.split(/\r?\n/))if(r.trim())try{let s=JSON.parse(r);if(typeof s.sessionId!="string")continue;s.deleted===!0?n.delete(s.sessionId):typeof s.sessionDir=="string"&&typeof s.workDir=="string"&&n.set(s.sessionId,{sessionId:s.sessionId,sessionDir:cd(s.sessionDir),workDir:s.workDir})}catch{}return n}filesFor(e,n,r){return{sessionId:e,sessionDir:n,statePath:Zn(n,"state.json"),wirePath:Zn(n,"agents","main","wire.jsonl"),indexedWorkDir:r}}validSessionDir(e,n){if(!sg(e)||fO(e)!==n)return!1;let r=pO(this.sessionsDir,cd(e));return r!==""&&r!==".."&&!r.startsWith(`..${process.platform==="win32"?"\\":"/"}`)&&!sg(r)}async findSession(e){let n=await this.sessionFiles(),r=n.find(i=>i.sessionId===e);if(r)return r;let s=n.filter(i=>i.sessionId.startsWith(e));return s.length===1?s[0]:null}async readState(e){try{let n=JSON.parse(await tg(e,"utf-8"));return n!==null&&typeof n=="object"&&!Array.isArray(n)?n:null}catch{return null}}async summary(e){let n=await this.readState(e.statePath);if(!n)return null;let r;try{r=await rg(e.wirePath)}catch{return null}let s=await rg(e.statePath).catch(()=>r),i=await this.parseWire(e.wirePath),o=dd(n.createdAt)??s.birthtime,a=dd(n.updatedAt)??(s.mtime>r.mtime?s.mtime:r.mtime);return{provider:"kimi",sessionId:e.sessionId,slug:n.title,cwd:n.workDir??e.indexedWorkDir??"(unknown)",createdAt:o,modifiedAt:a,model:i.model,startCommand:"kimi",firstUserMessage:i.firstUserMessage,lastUserMessage:i.lastUserMessage??(n.lastPrompt?J(n.lastPrompt.trim(),80):void 0),messageCount:i.messageCount,filePath:e.wirePath,filePaths:[e.statePath,e.wirePath],totalInputTokens:i.totalInputTokens,totalCachedInputTokens:i.totalCachedInputTokens,totalCacheWriteInputTokens:i.totalCacheWriteInputTokens,totalOutputTokens:i.totalOutputTokens,lastInputTokens:i.lastInputTokens,lastTokenUsage:i.lastTokenUsage}}async parseWire(e){let n=[],r=!0,s,i,o,a=0,l=0,c=0,u=0,d=!1,f=0,m,p;for await(let _ of Be(e)){let h=yO(_.time??_.created_at);if(r&&(r=!1,_.type==="metadata"&&!gO.has(_.protocol_version))){let w=`Kimi transcript wire protocol version ${JSON.stringify(_.protocol_version)} is not supported by this lmctl version.`;return{messages:[{role:"system",timestamp:h,content:w}],messageCount:1,firstUserMessage:w,lastUserMessage:w}}if(_.type==="config.update"&&_.modelAlias&&(s=_.modelAlias),_.type==="usage.record"){_.model&&(s=_.model),d||=_.usage!==void 0;let w=_.usage?.inputOther??0,y=_.usage?.inputCacheRead??0,S=_.usage?.inputCacheCreation??0,k=_.usage?.output??0;a+=w,l+=y,c+=S,u+=k,_.usageScope==="turn"&&(m=w+y+S,p={inputTokens:w,cachedInputTokens:y,cacheWriteInputTokens:S,outputTokens:k,totalTokens:m+k});continue}if(_.type==="turn.prompt"&&_.origin?.kind==="user"){let w=ig(_.input);w&&(i??=J(w,80),o=J(w,80),n.push({role:"user",timestamp:h,content:w}),f++);continue}if(_.type==="turn.steer"){let w=ig(_.input);w&&(n.push({role:"system",timestamp:h,content:w}),f++);continue}if(_.type!=="context.append_loop_event"||!_.event)continue;let g=_.event;g.type==="content.part"&&g.part?.type==="text"&&g.part.text?(n.push({role:"assistant",timestamp:h,content:g.part.text,model:s}),f++):g.type==="content.part"&&g.part?.type==="think"&&g.part.think?n.push({role:"thinking",timestamp:h,content:g.part.think,model:s}):g.type==="tool.call"?n.push({role:"tool_use",timestamp:h,content:g.name??"tool",toolName:g.name,toolInput:og(g.args),toolInputData:Ut(g.args),toolCallId:g.toolCallId,model:s}):g.type==="tool.result"&&n.push({role:"tool_result",timestamp:h,content:wO(g.result),toolCallId:g.toolCallId,model:s})}return EO(n),{messages:n,messageCount:f,model:s,firstUserMessage:i,lastUserMessage:o,totalInputTokens:d?a:void 0,totalCachedInputTokens:d?l:void 0,totalCacheWriteInputTokens:d?c:void 0,totalOutputTokens:d?u:void 0,lastInputTokens:m,lastTokenUsage:p}}}});function fd(t){return new ud(t)}var ud,md=E(()=>{"use strict";ag();Tt();vn();ut();ud=class extends ve{constructor(e){super({provider:new go(e),capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!0,canCancel:!0},injection:{leaderMode:"prompt-append",leaderSetupHint:"Kimi supports skills through ~/.kimi-code/skills and --skills-dir."},binary:"kimi",seedArgs:["-p",_e,"--output-format","stream-json"],resumeTemplate:"kimi --session {{session_id}} --auto",startTemplate:"kimi --auto",transport:(n,r)=>Sn(n,{...r,acpTool:"kimi"})})}seedArgsFor(e){let n=[];return e?.model&&n.push("--model",e.model),n.push("-p",e?.prompt??_e,"--output-format","stream-json"),n}}});import{spawn as SO}from"node:child_process";import{mkdirSync as vO}from"node:fs";function _d(t){return new pd(t)}async function bO(t,e){let n=Date.now(),r=lg({prompt:t,sessionId:e.sessionId,model:e.model,effort:e.effort,formatJson:!0,permissionMode:e.permissionMode??"yolo"});tt("lmplayer",r,e.permissionMode??"yolo");let s=await cg(e.binary,r,{cwd:e.cwd,env:Ve(e.env,e.cwd,e.sessionId),signal:e.signal,onText:i=>{e.onProgress?.({kind:"text",summary:i.slice(0,120)}),e.onDelta?.(i)}});if(s.code!==0&&s.code!==null)throw new Error(s.stderr.trim().slice(0,200)||`lmplayer exited with code ${s.code}`);return{text:s.text.trim(),sessionId:s.sessionId??e.sessionId,durationMs:Date.now()-n}}function lg(t){let e=["run"];return t.model&&e.push("--model",t.model),t.sessionId&&e.push("--session",t.sessionId),t.formatJson&&e.push("--format","json"),t.effort&&e.push("--effort",t.effort),e.push(...En("lmplayer",t.permissionMode)??[]),e.push("--",t.prompt),e}function cg(t,e,n){return new Promise((r,s)=>{let i;try{i=SO(t,e,{cwd:n.cwd,env:n.env,stdio:["ignore","pipe","pipe"]})}catch(h){s(h);return}let o="",a="",l="",c,u,d=[],f=!1,m=n.timeoutMs===void 0?void 0:setTimeout(()=>{f||(f=!0,i.kill(),p(),s(new Error(`lmplayer seed timed out after ${n.timeoutMs}ms`)))},n.timeoutMs),p=()=>{m!==void 0&&clearTimeout(m)},_=h=>{let g=h.trim();if(!g)return;let w;try{w=JSON.parse(g)}catch{d.push(h),n.onText?.(h);return}if(!wo(w))return;let y=yo(w,!1);c===void 0&&y!==void 0&&(c=y),u=yo(w,!0)??u;let S=dg(w);S&&(d.push(S),n.onText?.(S))};i.stdout?.on("data",h=>{let g=h.toString("utf8");o+=g,l+=g;let w=l.indexOf(`
1566
- `);for(;w>=0;){let y=l.slice(0,w);l=l.slice(w+1),_(y),w=l.indexOf(`
1565
+ `,"utf-8"),!0):!1}getWatchPaths(){return[{directory:this.sessionsDir,filePattern:/wire\.jsonl$/}]}indexPath(){return Zn(this.homeDir,"session_index.jsonl")}async sessionFiles(){let e=await this.readIndex(),n=new Map;for(let s of e.values())this.validSessionDir(s.sessionDir,s.sessionId)&&n.set(s.sessionId,this.filesFor(s.sessionId,s.sessionDir,s.workDir));let r;try{r=await ng(this.sessionsDir,{withFileTypes:!0})}catch{return[...n.values()]}for(let s of r){if(!s.isDirectory())continue;let i=Zn(this.sessionsDir,s.name),o;try{o=await ng(i,{withFileTypes:!0})}catch{continue}for(let a of o){if(!a.isDirectory()||n.has(a.name))continue;let l=Zn(i,a.name);n.set(a.name,this.filesFor(a.name,l))}}return[...n.values()]}async readIndex(){let e;try{e=await tg(this.indexPath(),"utf-8")}catch{return new Map}let n=new Map;for(let r of e.split(/\r?\n/))if(r.trim())try{let s=JSON.parse(r);if(typeof s.sessionId!="string")continue;s.deleted===!0?n.delete(s.sessionId):typeof s.sessionDir=="string"&&typeof s.workDir=="string"&&n.set(s.sessionId,{sessionId:s.sessionId,sessionDir:cd(s.sessionDir),workDir:s.workDir})}catch{}return n}filesFor(e,n,r){return{sessionId:e,sessionDir:n,statePath:Zn(n,"state.json"),wirePath:Zn(n,"agents","main","wire.jsonl"),indexedWorkDir:r}}validSessionDir(e,n){if(!sg(e)||fO(e)!==n)return!1;let r=pO(this.sessionsDir,cd(e));return r!==""&&r!==".."&&!r.startsWith(`..${process.platform==="win32"?"\\":"/"}`)&&!sg(r)}async findSession(e){let n=await this.sessionFiles(),r=n.find(i=>i.sessionId===e);if(r)return r;let s=n.filter(i=>i.sessionId.startsWith(e));return s.length===1?s[0]:null}async readState(e){try{let n=JSON.parse(await tg(e,"utf-8"));return n!==null&&typeof n=="object"&&!Array.isArray(n)?n:null}catch{return null}}async summary(e){let n=await this.readState(e.statePath);if(!n)return null;let r;try{r=await rg(e.wirePath)}catch{return null}let s=await rg(e.statePath).catch(()=>r),i=await this.parseWire(e.wirePath),o=dd(n.createdAt)??s.birthtime,a=dd(n.updatedAt)??(s.mtime>r.mtime?s.mtime:r.mtime);return{provider:"kimi",sessionId:e.sessionId,slug:n.title,cwd:n.workDir??e.indexedWorkDir??"(unknown)",createdAt:o,modifiedAt:a,model:i.model,startCommand:"kimi",firstUserMessage:i.firstUserMessage,lastUserMessage:i.lastUserMessage??(n.lastPrompt?J(n.lastPrompt.trim(),80):void 0),messageCount:i.messageCount,filePath:e.wirePath,filePaths:[e.statePath,e.wirePath],totalInputTokens:i.totalInputTokens,totalCachedInputTokens:i.totalCachedInputTokens,totalCacheWriteInputTokens:i.totalCacheWriteInputTokens,totalOutputTokens:i.totalOutputTokens,lastInputTokens:i.lastInputTokens,lastTokenUsage:i.lastTokenUsage}}async parseWire(e){let n=[],r=!0,s,i,o,a=0,l=0,c=0,u=0,d=!1,f=0,m,p;for await(let _ of Be(e)){let h=yO(_.time??_.created_at);if(r&&(r=!1,_.type==="metadata"&&!gO.has(_.protocol_version))){let y=`Kimi transcript wire protocol version ${JSON.stringify(_.protocol_version)} is not supported by this lmctl version.`;return{messages:[{role:"system",timestamp:h,content:y}],messageCount:1,firstUserMessage:y,lastUserMessage:y}}if(_.type==="config.update"&&_.modelAlias&&(s=_.modelAlias),_.type==="usage.record"){_.model&&(s=_.model),d||=_.usage!==void 0;let y=_.usage?.inputOther??0,w=_.usage?.inputCacheRead??0,S=_.usage?.inputCacheCreation??0,k=_.usage?.output??0;a+=y,l+=w,c+=S,u+=k,_.usageScope==="turn"&&(m=y+w+S,p={inputTokens:y,cachedInputTokens:w,cacheWriteInputTokens:S,outputTokens:k,totalTokens:m+k});continue}if(_.type==="turn.prompt"&&_.origin?.kind==="user"){let y=ig(_.input);y&&(i??=J(y,80),o=J(y,80),n.push({role:"user",timestamp:h,content:y}),f++);continue}if(_.type==="turn.steer"){let y=ig(_.input);y&&(n.push({role:"system",timestamp:h,content:y}),f++);continue}if(_.type!=="context.append_loop_event"||!_.event)continue;let g=_.event;g.type==="content.part"&&g.part?.type==="text"&&g.part.text?(n.push({role:"assistant",timestamp:h,content:g.part.text,model:s}),f++):g.type==="content.part"&&g.part?.type==="think"&&g.part.think?n.push({role:"thinking",timestamp:h,content:g.part.think,model:s}):g.type==="tool.call"?n.push({role:"tool_use",timestamp:h,content:g.name??"tool",toolName:g.name,toolInput:og(g.args),toolInputData:Ut(g.args),toolCallId:g.toolCallId,model:s}):g.type==="tool.result"&&n.push({role:"tool_result",timestamp:h,content:wO(g.result),toolCallId:g.toolCallId,model:s})}return EO(n),{messages:n,messageCount:f,model:s,firstUserMessage:i,lastUserMessage:o,totalInputTokens:d?a:void 0,totalCachedInputTokens:d?l:void 0,totalCacheWriteInputTokens:d?c:void 0,totalOutputTokens:d?u:void 0,lastInputTokens:m,lastTokenUsage:p}}}});function fd(t){return new ud(t)}var ud,md=E(()=>{"use strict";ag();Tt();vn();ut();ud=class extends ve{constructor(e){super({provider:new go(e),capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!0,canCancel:!0},injection:{leaderMode:"prompt-append",leaderSetupHint:"Kimi supports skills through ~/.kimi-code/skills and --skills-dir."},binary:"kimi",seedArgs:["-p",_e,"--output-format","stream-json"],resumeTemplate:"kimi --session {{session_id}} --auto",startTemplate:"kimi --auto",transport:(n,r)=>Sn(n,{...r,acpTool:"kimi"})})}seedArgsFor(e){let n=[];return e?.model&&n.push("--model",e.model),n.push("-p",e?.prompt??_e,"--output-format","stream-json"),n}}});import{spawn as SO}from"node:child_process";import{mkdirSync as vO}from"node:fs";function _d(t){return new pd(t)}async function bO(t,e){let n=Date.now(),r=lg({prompt:t,sessionId:e.sessionId,model:e.model,effort:e.effort,formatJson:!0,permissionMode:e.permissionMode??"yolo"});tt("lmplayer",r,e.permissionMode??"yolo");let s=await cg(e.binary,r,{cwd:e.cwd,env:Ve(e.env,e.cwd,e.sessionId),signal:e.signal,onText:i=>{e.onProgress?.({kind:"text",summary:i.slice(0,120)}),e.onDelta?.(i)}});if(s.code!==0&&s.code!==null)throw new Error(s.stderr.trim().slice(0,200)||`lmplayer exited with code ${s.code}`);return{text:s.text.trim(),sessionId:s.sessionId??e.sessionId,durationMs:Date.now()-n}}function lg(t){let e=["run"];return t.model&&e.push("--model",t.model),t.sessionId&&e.push("--session",t.sessionId),t.formatJson&&e.push("--format","json"),t.effort&&e.push("--effort",t.effort),e.push(...En("lmplayer",t.permissionMode)??[]),e.push("--",t.prompt),e}function cg(t,e,n){return new Promise((r,s)=>{let i;try{i=SO(t,e,{cwd:n.cwd,env:n.env,stdio:["ignore","pipe","pipe"]})}catch(h){s(h);return}let o="",a="",l="",c,u,d=[],f=!1,m=n.timeoutMs===void 0?void 0:setTimeout(()=>{f||(f=!0,i.kill(),p(),s(new Error(`lmplayer seed timed out after ${n.timeoutMs}ms`)))},n.timeoutMs),p=()=>{m!==void 0&&clearTimeout(m)},_=h=>{let g=h.trim();if(!g)return;let y;try{y=JSON.parse(g)}catch{d.push(h),n.onText?.(h);return}if(!wo(y))return;let w=yo(y,!1);c===void 0&&w!==void 0&&(c=w),u=yo(y,!0)??u;let S=dg(y);S&&(d.push(S),n.onText?.(S))};i.stdout?.on("data",h=>{let g=h.toString("utf8");o+=g,l+=g;let y=l.indexOf(`
1566
+ `);for(;y>=0;){let w=l.slice(0,y);l=l.slice(y+1),_(w),y=l.indexOf(`
1567
1567
  `)}}),i.stderr?.on("data",h=>{a+=h.toString("utf8")}),n.signal&&(n.signal.aborted?i.kill():n.signal.addEventListener("abort",()=>i.kill(),{once:!0})),i.on("exit",h=>{f||(f=!0,p(),l.length>0&&_(l),r({code:h,stdout:o,stderr:a,sessionId:c??u,text:d.join("")}))}),i.on("error",h=>{f||(f=!0,p(),s(h))})})}function dg(t){for(let e of["text","content","delta","output","message"]){let n=t[e];if(typeof n=="string")return n}for(let e of["data","event","payload","part"]){let n=t[e];if(wo(n)){let r=dg(n);if(r)return r}}}function yo(t,e){for(let r of["sessionID","sessionId","session_id"]){let s=t[r];if(typeof s=="string"&&s.length>0)return s}let n=t.session;if(typeof n=="string"&&n.length>0)return n;if(wo(n)){let r=yo(n,e);if(r!==void 0)return r}if(e){let r=t.id;if(typeof r=="string"&&r.length>0)return r}for(let r of["data","event","payload","part"]){let s=t[r];if(wo(s)){let i=yo(s,e);if(i!==void 0)return i}}}function wo(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}var pd,hd=E(()=>{"use strict";id();Tt();ut();Vn();Et();pd=class extends ve{constructor(e){super({provider:new Rr({providerName:"lmplayer",startCommand:"lmplayer",dbPath:e?.lmplayerDbPath}),capabilities:{canCreate:!0,canResumeInteractive:!1,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!1,canCancel:!0},injection:{leaderMode:"none"},binary:"lmplayer",seedArgs:["run","--format","json","--dangerously-skip-permissions",_e],resumeTemplate:"lmplayer run --session {{session_id}} --dangerously-skip-permissions",startTemplate:"lmplayer run --dangerously-skip-permissions",transport:bO})}seedArgsFor(e){return lg({prompt:e?.prompt??_e,model:e?.model,effort:e?.effort,formatJson:!0,permissionMode:"yolo"})}async seed(e,n){vO(e,{recursive:!0});let r=this.seedArgsFor(n);tt("lmplayer",r);try{let s=await cg(this.binary,r,{cwd:e,env:wn(void 0,e),timeoutMs:6e4});return s.code!==0&&s.code!==null?{success:!1,error:s.stderr.trim().slice(0,200)||`exit code ${s.code}`}:s.sessionId?{success:!0,sessionId:s.sessionId}:{success:!1,error:"lmplayer seed failed; provider did not report a sessionID"}}catch(s){return{success:!1,error:s instanceof Error?s.message:String(s)}}}manualSeedHint(e){return{launchCommand:`cd ${e} && lmplayer run --format json --dangerously-skip-permissions "${_e}"`,postLaunchNote:"Copy the sessionID reported by lmplayer into this member's sessionid= field.",lsCommand:`lmctl ls --provider lmplayer --sessiondir ${e}`}}}});import{readdir as Eo,readFile as kO,rm as IO}from"node:fs/promises";import{basename as ug,join as kn}from"node:path";function NO(){return{observed:!1,totalInputTokens:0,totalCachedInputTokens:0,totalOutputTokens:0,totalReasoningOutputTokens:0}}function Ms(t){let e=Number(t??0);return Number.isFinite(e)?Math.max(0,Math.round(e)):0}function AO(t,e){if(!e)return;t.observed=!0;let n=Ms(e.promptTokenCount),r=Ms(e.cachedContentTokenCount),s=Ms(e.candidatesTokenCount),i=Ms(e.thoughtsTokenCount);t.totalInputTokens+=n,t.totalCachedInputTokens+=r,t.totalOutputTokens+=s,t.totalReasoningOutputTokens+=i,t.lastInputTokens=n,t.lastTokenUsage={inputTokens:Math.max(n-r,0),cachedInputTokens:r,outputTokens:s,reasoningOutputTokens:i,totalTokens:Ms(e.totalTokenCount)||n+s}}function xO(t){return{totalInputTokens:t.observed?t.totalInputTokens:void 0,totalCachedInputTokens:t.observed?t.totalCachedInputTokens:void 0,totalOutputTokens:t.observed?t.totalOutputTokens:void 0,totalReasoningOutputTokens:t.observed?t.totalReasoningOutputTokens:void 0,lastInputTokens:t.lastInputTokens,lastTokenUsage:t.lastTokenUsage}}function fg(t){return t.type==="user"||t.message?.role==="user"}function mg(t){return t.type==="assistant"||t.message?.role==="assistant"||t.message?.role==="model"}function pg(t){let e=t.message;return e?typeof e.content=="string"?e.content:Array.isArray(e.content)?e.content.filter(n=>n.type==="text").map(n=>n.text||"").join(`
1568
1568
  `):Array.isArray(e.parts)?e.parts.filter(n=>!n.thought&&n.type!=="thinking").map(n=>n.text||"").join(`
1569
- `):"":""}function _g(t){return t.model||t.message?.model}function RO(t){let e=t.message?.content;return typeof e=="string"?e.length>0?1:0:gg(t).filter(n=>!n.thought&&n.type!=="thinking"&&typeof n.text=="string"&&n.text.length>0).length}function Ds(t,e=!1){if(t!==void 0){if(typeof t=="string")return t;try{return JSON.stringify(t,null,e?2:void 0)}catch{return String(t)}}}function LO(t){if(t!==null&&typeof t=="object"&&!Array.isArray(t)){let e=t;return Ds(e.output??e.error??t)}return Ds(t)}function gg(t){return Array.isArray(t.message?.content)?t.message.content:t.message?.parts??[]}function hg(t,e,n){let r=t.name||"tool";return{role:"tool_use",timestamp:e,content:r,toolName:r,toolInput:Ds(t.args,!0),toolInputData:Ut(t.args),toolCallId:t.id,model:n}}var To,yg=E(()=>{"use strict";Wt();To=class{name="qwen";baseDir;constructor(e){this.baseDir=e?.qwenDir||kn(we,".qwen")}async discoverSessions(){let e=kn(this.baseDir,"projects"),n;try{n=await Eo(e)}catch{return[]}let r=[];for(let s of n){let i=kn(e,s,"chats"),o;try{o=await Eo(i)}catch{continue}for(let a of o){if(!a.endsWith(".jsonl"))continue;let l=a.replace(/\.jsonl$/,""),c=kn(i,a);try{let u=await this.extractSummary(c,l);u&&r.push(u)}catch{}}}return r}async extractSummary(e,n){let r=await Ke(e,30);if(r.length===0)return null;let s=await Le(e),i="(unknown)",o,a,l,c,u=0;for(let d of r){if(d.cwd&&(i=d.cwd,d.version&&(a=d.version)),d.type==="system"&&d.cwd&&(i=d.cwd,d.version&&(a=d.version),d.model&&(o=d.model)),fg(d)){let f=pg(d).trim();f&&(l||(l=J(f,80)),c=J(f,80),u++)}if(mg(d)){let f=_g(d);f&&(o=f),u+=RO(d)}}return{provider:"qwen",sessionId:n,cwd:i,createdAt:s.createdAt,modifiedAt:s.modifiedAt,model:o,cliVersion:a,startCommand:"qwen",firstUserMessage:l,lastUserMessage:c,messageCount:u,filePath:e}}async loadSession(e){let n=await this.resolveSessionPath(e);if(!n)return null;let r=ug(n,".jsonl");return this.loadFromFile(n,r)}async loadFromFile(e,n){let r=await Le(e),s="(unknown)",i,o,a,l,c,u,d=[],f=NO();for await(let m of Be(e)){if(AO(f,m.usageMetadata),m.cwd&&(s=m.cwd,m.version&&(o=m.version),m.gitBranch&&(a=m.gitBranch)),m.type==="system"&&m.cwd&&(s=m.cwd,m.version&&(o=m.version),m.model&&(i=m.model),m.gitBranch&&(a=m.gitBranch)),!m.message)continue;let p=m.message,_=m.timestamp?new Date(m.timestamp):r.modifiedAt;if(m.type==="tool_result"){let h=gg(m).filter(g=>g.functionResponse!==void 0);h.length===0&&m.toolCallResult?.callId&&d.push({role:"tool_result",timestamp:_,content:Ds(m.toolCallResult.resultDisplay??m.toolCallResult.error??m.toolCallResult.status)??"tool result",toolCallId:m.toolCallResult.callId});for(let g of h){let w=g.functionResponse,y=LO(w.response),S=Ds(m.toolCallResult?.resultDisplay);d.push({role:"tool_result",timestamp:_,content:S??y??m.toolCallResult?.status??"tool result",toolName:w.name,toolCallId:m.toolCallResult?.callId??w.id,...y!==void 0?{toolDetailedContent:y}:{}})}}else if(fg(m)){let h=pg(m);h.trim()&&(c||(c=J(h.trim(),80)),u=J(h.trim(),80)),d.push({role:"user",timestamp:_,content:h})}else if(mg(m)){let h=_g(m);if(h&&(i=h),Array.isArray(p.content))for(let g of p.content)g.type==="text"&&g.text?d.push({role:"assistant",timestamp:_,content:g.text,model:h}):g.type==="thinking"&&g.thinking?d.push({role:"thinking",timestamp:_,content:g.thinking}):g.functionCall&&d.push(hg(g.functionCall,_,h));else if(typeof p.content=="string")d.push({role:"assistant",timestamp:_,content:p.content,model:h});else if(Array.isArray(p.parts))for(let g of p.parts)if(g.thought||g.type==="thinking"){let w=g.thinking||g.text;w&&d.push({role:"thinking",timestamp:_,content:w})}else g.functionCall?d.push(hg(g.functionCall,_,h)):g.text&&d.push({role:"assistant",timestamp:_,content:g.text,model:h})}}return{provider:"qwen",sessionId:n,slug:l,cwd:s,createdAt:r.createdAt,modifiedAt:r.modifiedAt,model:i,cliVersion:o,gitBranch:a,startCommand:"qwen",firstUserMessage:c,lastUserMessage:u,messageCount:d.filter(m=>m.role==="user"||m.role==="assistant").length,filePath:e,...xO(f),messages:d}}async resolveSessionPath(e){let n=kn(this.baseDir,"projects");try{let r=await Eo(n),s=[];for(let i of r){let o=kn(n,i,"chats",`${e}.jsonl`);try{return await kO(o,{flag:"r"}),o}catch{continue}}for(let i of r){let o=kn(n,i,"chats"),a;try{a=await Eo(o)}catch{continue}for(let l of a){if(!l.endsWith(".jsonl"))continue;ug(l,".jsonl").startsWith(e)&&s.push(kn(o,l))}}if(s.length===1)return s[0]}catch{}return null}async deleteSession(e){let n=await this.resolveSessionPath(e);if(!n)return!1;try{return await IO(n),!0}catch{return!1}}}});function yd(){return new gd}var gd,wd=E(()=>{"use strict";yg();Tt();vn();ut();gd=class extends ve{constructor(){super({provider:new To,capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!0,canCancel:!0},injection:{leaderMode:"prompt-append"},binary:"qwen",seedArgs:["-p",_e,"--approval-mode","yolo"],resumeTemplate:"qwen --resume {{session_id}}",startTemplate:"qwen",transport:co})}seedArgsFor(e){let n=super.seedArgsFor(e);return e?.model?[...n,"--model",e.model]:n}}});import{readdir as wg,readFile as Eg,rm as Tg,stat as Sg}from"node:fs/promises";import{basename as Ed,join as qt}from"node:path";import{fileURLToPath as OO}from"node:url";async function CO(t){let e=await Promise.all(t.map(n=>Le(n)));return{createdAt:new Date(Math.min(...e.map(n=>n.createdAt.getTime()))),modifiedAt:new Date(Math.max(...e.map(n=>n.modifiedAt.getTime())))}}function $O(t,e){if(!t)return e;let n=new Date(t);return Number.isNaN(n.getTime())?e:n}function vg(t){return t.type==="USER_INPUT"}function bg(t){return t.source==="MODEL"&&t.type==="PLANNER_RESPONSE"}function MO(t){return t.source==="MODEL"&&t.type!=="PLANNER_RESPONSE"}function kg(t){if(!t)return"";let e=/<USER_REQUEST>\n?([\s\S]*?)\n?<\/USER_REQUEST>/.exec(t);return e?e[1]:t}function Ig(t){if(!t)return;let e=/Model Selection` from [^\n]+? to ([^\n]+)/.exec(t);if(e)return e[1].replace(/\. No need\b[\s\S]*$/,"").replace(/\. If reporting\b[\s\S]*$/,"").replace(/\.\s*$/,"").trim()}function DO(t){if(t===void 0)return"";try{return JSON.stringify(t)}catch{return String(t)}}async function jO(t){for await(let e of Be(t)){let n=e.tool_calls?.map(s=>s.args)??[];for(let s of n){let i=PO(s);if(i)return i}let r=FO(e.content);if(r)return r}return null}function PO(t){if(!t||typeof t!="object"||Array.isArray(t))return null;let e=t,n=e.Cwd??e.cwd??e.DirectoryPath;return typeof n!="string"?null:n.replace(/^"|"$/g,"")}function FO(t){return t?/"Cwd":"([^"]+)"/.exec(t)?.[1]??null:null}function UO(t,e){if(t.status!=="RUNNING"||!t.content)return;let n=/task id:\s*([^/\s]+)\/(task-(\d+))\b/.exec(t.content);if(!(!n||n[1]!==e)&&!(t.step_index===void 0||Number(n[3])!==t.step_index))return n[2]}function WO(t,e){let n=new Set;for(let r of e){let s=qO(t,n,r);if(!s)continue;n.add(s);let i=r.event.step_index===void 0?void 0:`agy-step-${r.event.step_index}`;s.message.toolCallId=i,s.message.backgroundTaskId=r.message.backgroundTaskId,r.message.toolName=s.name,r.message.toolCallId=i}}function qO(t,e,n){let r=n.message.backgroundTaskId===void 0?void 0:JO(n.event.content);if(r!==void 0)return Ng(t.filter(i=>!e.has(i)&&GO(i)===r),n.event.step_index);let s=XO(n.event);if(s!==void 0)return Ng(t.filter(i=>!e.has(i)&&BO(i.name,n.event.type)&&xg(HO(i))===s),n.event.step_index)}function Ng(t,e){if(t.length===0)return;if(t.length===1)return t[0];if(e===void 0)return;let n=t.map(r=>({call:r,distance:r.stepIndex===void 0?Number.POSITIVE_INFINITY:Math.abs(e-r.stepIndex)})).sort((r,s)=>r.distance-s.distance);return n[0].distance<n[1].distance?n[0].call:void 0}function BO(t,e){return e==="VIEW_FILE"?t==="view_file":e!=="CODE_ACTION"?!1:t==="write_to_file"||t==="replace_file_content"||t==="multi_replace_file_content"}function HO(t){let e=t.name==="view_file"?t.input?.AbsolutePath:t.input?.TargetFile;return typeof e=="string"?e:void 0}function XO(t){if(!t.content)return;let e;return t.type==="VIEW_FILE"?e=/File Path:\s*`?([^`\n]+)`?/.exec(t.content)?.[1]:t.type==="CODE_ACTION"&&(e=/Created file\s+(.+?)\s+with requested content/.exec(t.content)?.[1]??/changes were made by .*? tool to:\s*(.+?)\.\s*(?:If relevant|$)/s.exec(t.content)?.[1]),xg(e)}function xg(t){if(!t)return;let e=t.trim().replace(/^`|`$/g,"");if(!e.startsWith("file://"))return e;try{return OO(e)}catch{return}}function JO(t){if(t)return/Task Description:\s*([^\n]+)/.exec(t)?.[1]?.trim()}function GO(t){if(t.name==="run_command"){let e=t.input?.CommandLine;return typeof e=="string"?e:void 0}if(t.name==="schedule"){let e=t.input?.DurationSeconds,n=t.input?.Prompt;return typeof e!="string"&&typeof e!="number"||typeof n!="string"?void 0:`Timer: ${e}s, Prompt: ${n}`}}function Ag(t){if(t.endsWith(".db"))return Ed(t,".db");let e="/brain/",n=t.indexOf(e);return n===-1?null:t.slice(n+e.length).split("/")[0]||null}var So,Rg=E(()=>{"use strict";Wt();So=class{name="agy";baseDir;constructor(e={}){this.baseDir=e.agyDir||qt(we,".gemini","antigravity-cli")}getWatchPaths(){return[{directory:qt(this.baseDir,"conversations"),filePattern:/\.db$/}]}async discoverSessions(){let e=qt(this.baseDir,"conversations"),n;try{n=await wg(e)}catch{return[]}let r=[];for(let s of n){if(!s.endsWith(".db"))continue;let i=Ed(s,".db");try{let o=await this.extractSummary(i);o&&r.push(o)}catch{}}return r}conversationPath(e){return qt(this.baseDir,"conversations",`${e}.db`)}transcriptPath(e,n){return qt(this.baseDir,"brain",e,".system_generated","logs",n?"transcript_full.jsonl":"transcript.jsonl")}async existingTranscriptPath(e){for(let n of[this.transcriptPath(e,!0),this.transcriptPath(e,!1)])try{return await Sg(n),n}catch{}return null}async extractSummary(e){let n=this.conversationPath(e),r=await this.existingTranscriptPath(e),s=r??n,i=await CO([n,r].filter(Boolean)),o=await this.resolveCwd(e,r),a,l,c,u=0;if(r){let d=await Ke(r,80);for(let f of d){let m=Ig(f.content);if(m&&(a=m),vg(f)){let p=kg(f.content).trim();p&&(l||(l=J(p,80)),c=J(p,80)),u++}else bg(f)&&f.content&&u++}}return{provider:"agy",sessionId:e,cwd:o,createdAt:i.createdAt,modifiedAt:i.modifiedAt,model:a,startCommand:"agy",firstUserMessage:l,lastUserMessage:c,messageCount:u,filePath:s,filePaths:r?[n,r]:[n]}}async loadSession(e){let n=await this.resolveSessionPath(e);if(!n)return null;let r=Ag(n);if(!r)return null;let s=await this.extractSummary(r);if(!s)return null;let i=await this.existingTranscriptPath(r),o=[],a=s.model,l=s.firstUserMessage,c=s.lastUserMessage,u=[],d=[];if(i)for await(let f of Be(i)){let m=$O(f.created_at,s.modifiedAt),p=Ig(f.content);if(p&&(a=p),vg(f)){let _=kg(f.content),h=_.trim();h&&(l||(l=J(h,80)),c=J(h,80)),o.push({role:"user",timestamp:m,content:_});continue}if(Array.isArray(f.tool_calls))for(let _ of f.tool_calls){let h=_.name||"tool",g=DO(_.args),w=Ut(_.args),y={role:"tool_use",timestamp:m,content:g,toolName:h,toolInput:g,toolInputData:w};o.push(y),u.push({name:h,stepIndex:f.step_index,input:w,message:y})}if(bg(f)&&f.content)o.push({role:"assistant",timestamp:m,content:f.content,model:a});else if(MO(f)&&f.content){let _=UO(f,r),h=_===void 0?null:await this.readTaskLog(r,_),g={role:"tool_result",timestamp:h?.modifiedAt??m,content:f.content,toolName:f.type?.toLowerCase(),backgroundTaskId:_,...h===null?{}:{toolDetailedContent:h.content}};o.push(g),d.push({event:f,message:g})}f.thinking&&o.push({role:"thinking",timestamp:m,content:f.thinking})}return WO(u,d),{...s,model:a,firstUserMessage:l,lastUserMessage:c,messageCount:o.filter(f=>f.role==="user"||f.role==="assistant").length,messages:o}}async resolveSessionPath(e){let n=this.conversationPath(e);try{return await Sg(n),n}catch{}let r=qt(this.baseDir,"conversations");try{let s=[];for(let i of await wg(r)){if(!i.endsWith(".db"))continue;Ed(i,".db").startsWith(e)&&s.push(qt(r,i))}if(s.length===1)return s[0]}catch{}return null}async deleteSession(e){let n=await this.resolveSessionPath(e);if(!n)return!1;let r=Ag(n);return r?(await Tg(this.conversationPath(r),{force:!0}),await Tg(qt(this.baseDir,"brain",r),{recursive:!0,force:!0}),!0):!1}async resolveCwd(e,n){let r=await this.cwdFromLastConversationCache(e);if(r)return r;if(n){let s=await jO(n);if(s)return s}return"(unknown)"}async cwdFromLastConversationCache(e){let n=qt(this.baseDir,"cache","last_conversations.json");try{let r=JSON.parse(await Eg(n,"utf8"));for(let[s,i]of Object.entries(r))if(i===e)return s}catch{}return null}async readTaskLog(e,n){if(!/^task-\d+$/.test(n))return null;let r=qt(this.baseDir,"brain",e,".system_generated","tasks",`${n}.log`);try{let[s,i]=await Promise.all([Eg(r,"utf8"),Le(r)]);return{content:s,modifiedAt:i.modifiedAt}}catch{return null}}}});import{spawn as KO}from"node:child_process";function Sd(t){return new Td(t)}async function VO(t,e){let n=Date.now(),r=["--conversation",e.sessionId,"-p",t,"--dangerously-skip-permissions","--print-timeout",zO(e.timeoutMs)];e.model&&r.push("--model",e.model),tt("agy",r,e.permissionMode??"yolo"),e.onProgress?.({kind:"system",summary:"agy -p one-shot started (no streaming events)"});let{stdout:s}=await YO(e.binary,r,{cwd:e.cwd,env:Ve(e.env,e.cwd,e.sessionId),signal:e.signal});return e.onProgress?.({kind:"system",summary:"agy -p one-shot completed"}),{text:s.trimEnd(),sessionId:e.sessionId,durationMs:Date.now()-n}}function YO(t,e,n){return new Promise((r,s)=>{let i;try{i=KO(t,e,{cwd:n.cwd,env:n.env,stdio:["ignore","pipe","pipe"]})}catch(c){s(c);return}let o="",a="";i.stdout?.on("data",c=>{o+=c.toString()}),i.stderr?.on("data",c=>{a+=c.toString()});let l=()=>{i.kill("SIGTERM"),s(new Error("agy turn aborted"))};if(n.signal){if(n.signal.aborted){l();return}n.signal.addEventListener("abort",l,{once:!0})}i.on("error",c=>{n.signal?.removeEventListener("abort",l),s(c)}),i.on("exit",(c,u)=>{if(n.signal?.removeEventListener("abort",l),c===0){r({stdout:o,stderr:a});return}let d=u?`signal ${u}`:`exit code ${c}`,f=a.trim()||o.trim();s(new Error(`agy failed (${d})${f?`: ${f}`:""}`))})})}function zO(t){return!t||t<=0?"8h":`${Math.max(1,Math.ceil(t/1e3))}s`}var Td,vd=E(()=>{"use strict";Rg();Tt();ut();Et();Vn();Td=class extends ve{constructor(e){super({provider:new So(e),capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!1,canCancel:!1},injection:{leaderMode:"prompt-append",leaderSetupHint:"Antigravity uses one-shot print turns; no streaming events are available."},binary:"agy",seedArgs:["-p",_e,"--dangerously-skip-permissions","--print-timeout","2m"],resumeTemplate:"agy --conversation {{session_id}} --dangerously-skip-permissions",startTemplate:"agy --dangerously-skip-permissions",transport:VO})}seedArgsFor(e){let n=[...super.seedArgsFor(e)];return e?.model&&n.push("--model",e.model),n}manualSeedHint(e){return{launchCommand:`cd ${e} && agy --dangerously-skip-permissions`,postLaunchNote:"Send the lmctl seed instruction, wait for the conversation to write, then exit.",lsCommand:`lmctl ls --provider agy --sessiondir ${e}`}}}});import ZO from"node:zlib";function aC(t,e){return t[e]===eC&&t[e+1]===tC&&t[e+2]===nC&&t[e+3]===rC}function Lg(t,e){return(t[e]&240)===80&&t[e+1]===sC&&t[e+2]===iC&&t[e+3]===oC}function lC(t,e){if(Lg(t,e))return e+8>t.length?void 0:8+t.readUInt32LE(e+4);if(!aC(t,e))return;let n=e+4;if(n+1>t.length)return;let r=t[n];n+=1;let s=r>>6,i=(r&32)!==0,o=(r&4)!==0,a=r&3;i||(n+=1),n+=[0,1,2,4][a];let l=s===0?i?1:0:[2,4,8][s-1];if(n+=l,!(n>t.length)){for(;;){if(n+3>t.length)return;let c=t[n]|t[n+1]<<8|t[n+2]<<16,u=(c&1)!==0,d=c>>1&3,f=c>>3;if(n+=3,d===3||(n+=d===1?1:f,n>t.length))return;if(u)break}if(o&&(n+=4),!(n>t.length))return n-e}}function cC(t){let e=[],n=0;for(;n+4<=t.length;){let r=lC(t,n);if(r===void 0||r<=0)break;e.push(t.subarray(n,n+r)),n+=r}return e}function vo(t){let e=[];for(let n of cC(t))Lg(n,0)||e.push(QO(n).toString("utf8"));return e.join("")}var QO,eC,tC,nC,rC,sC,iC,oC,bd=E(()=>{"use strict";QO=ZO.zstdDecompressSync,eC=40,tC=181,nC=47,rC=253,sC=42,iC=77,oC=24});import{readdir as kd,rm as dC,stat as uC}from"node:fs/promises";import{join as In}from"node:path";function fC(t){return"--"+t.replace(/^\/+|\/+$/g,"").replace(/\//g,"-")+"--"}function Id(t){if(typeof t=="string")return t;if(!Array.isArray(t))return"";let e=[];for(let n of t)n&&typeof n=="object"&&n.type==="text"&&typeof n.text=="string"&&e.push(n.text);return e.join("")}function mC(t){if(!Array.isArray(t))return[];let e=[];for(let n of t)n&&typeof n=="object"&&n.type==="reasoning"&&typeof n.text=="string"&&e.push(n.text);return e}function Og(t){let e=[];for(let n of t){let r=n.data??{},s=n.time?new Date(n.time):new Date(0);if(n.type==="user/message"){let i=r;if(i.source?.kind!==void 0&&i.source.kind!=="user")continue;e.push({role:"user",timestamp:s,content:Id(i.content)})}else if(n.type==="assistant/message"){let i=r.message;for(let o of mC(i?.content))e.push({role:"thinking",timestamp:s,content:o});e.push({role:"assistant",timestamp:s,content:Id(i?.content),model:i?.source?.model})}else if(n.type==="tool/call"){let i=r,o;if(typeof i.arguments=="string")try{o=JSON.parse(i.arguments)}catch{}else i.arguments&&typeof i.arguments=="object"&&(o=i.arguments);e.push({role:"tool_use",timestamp:s,content:typeof i.arguments=="string"?i.arguments:JSON.stringify(i.arguments??{}),toolName:i.name,toolCallId:i.callId,toolInputData:o})}else if(n.type==="tool/result"){let i=r,a=(Array.isArray(i.message?.content)?i.message.content:[])[0];e.push({role:"tool_result",timestamp:s,content:Id(a?.content??i.message?.content),toolCallId:a?.toolCallId??i.message?.source?.callId})}}return e}function pC(t){for(let e=t.length-1;e>=0;e--){let n=t[e];if(n.type==="turn/end")return n.data?.reason?.kind==="completed"?"complete":"aborted";if(n.type==="turn/start")return"in_progress"}}function Cg(t,e,n){let r=t.find(m=>m.type==="session");if(!r)return null;let s=r,i=r.data,o=s.id??i?.id;if(!o)return null;let a;for(let m of t)if(m.type==="request/header"){let p=m.data?.header;p?.config?.model&&(a=p.config.model)}let l=t.map(m=>m.time).filter(m=>typeof m=="number"),c=s.createdAt??i?.createdAt,u=c?new Date(c):new Date(0),d=l.length>0?new Date(Math.max(...l)):u,f=n.filter(m=>m.role==="user");return{provider:"dsh",sessionId:o,cwd:s.cwd??i?.cwd??"",createdAt:u,modifiedAt:d,model:a,firstUserMessage:f[0]?.content,lastUserMessage:f.at(-1)?.content,messageCount:n.filter(m=>m.role==="user"||m.role==="assistant").length,filePath:e,..._C(t)}}function _C(t){let e=!1,n=0,r=0,s=0,i=0,o,a;for(let l of t){if(l.type!=="assistant/message")continue;let c=l.data?.usage;if(!c)continue;e=!0;let u=bo(c.inputTokens),d=bo(c.cacheReadTokens),f=bo(c.outputTokens),m=bo(c.reasoningTokens);n+=u,r+=d,s+=f,i+=m,o=u+d,a={inputTokens:u,cachedInputTokens:d,outputTokens:f,reasoningOutputTokens:m,totalTokens:u+d+f}}return{totalInputTokens:e?n:void 0,totalCachedInputTokens:e?r:void 0,totalOutputTokens:e?s:void 0,totalReasoningOutputTokens:e?i:void 0,lastInputTokens:o,lastTokenUsage:a}}function bo(t){let e=Number(t??0);return Number.isFinite(e)?Math.max(0,Math.round(e)):0}var ko,$g=E(()=>{"use strict";Wt();bd();ko=class{name="dsh";sessionsDir;constructor(e={}){let n=e.dshHome||In(we,".dsh");this.sessionsDir=In(n,"sessions")}async discoverSessions(){let e=[],n;try{n=await kd(this.sessionsDir)}catch{return[]}for(let r of n){let s;try{s=await kd(In(this.sessionsDir,r))}catch{continue}for(let i of s)if(i.startsWith("session-"))try{let o=await this.readSummary(r,i);o&&e.push(o)}catch{}}return e}async loadSession(e){let n=await this.findSessionDir(e);if(!n)return null;let r=await this.readRecords(n.cwdDir,n.sessionDir);if(r.length===0)return null;let s=Og(r),i=Cg(r,n.filePath,s);return i?{...i,turnStatus:pC(r),messages:s}:null}async resolveSessionPath(e){return(await this.findSessionDir(e))?.filePath??null}async deleteSession(e){let n=await this.findSessionDir(e);return n?(await dC(In(this.sessionsDir,n.cwdDir,n.sessionDir),{recursive:!0,force:!0}),!0):!1}sessionFilePath(e,n){return In(this.sessionsDir,fC(e),n,"session.jsonl.zstd")}async findSessionDir(e){let n;try{n=await kd(this.sessionsDir)}catch{return null}for(let r of n){let s=e,i=In(this.sessionsDir,r,s,"session.jsonl.zstd");try{return await uC(i),{cwdDir:r,sessionDir:s,filePath:i}}catch{}}return null}async readRecords(e,n){let{readFile:r}=await import("node:fs/promises"),s=In(this.sessionsDir,e,n,"session.jsonl.zstd"),i=await r(s),o=vo(i),a=[];for(let l of o.split(`
1569
+ `):"":""}function _g(t){return t.model||t.message?.model}function RO(t){let e=t.message?.content;return typeof e=="string"?e.length>0?1:0:gg(t).filter(n=>!n.thought&&n.type!=="thinking"&&typeof n.text=="string"&&n.text.length>0).length}function Ds(t,e=!1){if(t!==void 0){if(typeof t=="string")return t;try{return JSON.stringify(t,null,e?2:void 0)}catch{return String(t)}}}function LO(t){if(t!==null&&typeof t=="object"&&!Array.isArray(t)){let e=t;return Ds(e.output??e.error??t)}return Ds(t)}function gg(t){return Array.isArray(t.message?.content)?t.message.content:t.message?.parts??[]}function hg(t,e,n){let r=t.name||"tool";return{role:"tool_use",timestamp:e,content:r,toolName:r,toolInput:Ds(t.args,!0),toolInputData:Ut(t.args),toolCallId:t.id,model:n}}var To,yg=E(()=>{"use strict";Wt();To=class{name="qwen";baseDir;constructor(e){this.baseDir=e?.qwenDir||kn(we,".qwen")}async discoverSessions(){let e=kn(this.baseDir,"projects"),n;try{n=await Eo(e)}catch{return[]}let r=[];for(let s of n){let i=kn(e,s,"chats"),o;try{o=await Eo(i)}catch{continue}for(let a of o){if(!a.endsWith(".jsonl"))continue;let l=a.replace(/\.jsonl$/,""),c=kn(i,a);try{let u=await this.extractSummary(c,l);u&&r.push(u)}catch{}}}return r}async extractSummary(e,n){let r=await Ke(e,30);if(r.length===0)return null;let s=await Le(e),i="(unknown)",o,a,l,c,u=0;for(let d of r){if(d.cwd&&(i=d.cwd,d.version&&(a=d.version)),d.type==="system"&&d.cwd&&(i=d.cwd,d.version&&(a=d.version),d.model&&(o=d.model)),fg(d)){let f=pg(d).trim();f&&(l||(l=J(f,80)),c=J(f,80),u++)}if(mg(d)){let f=_g(d);f&&(o=f),u+=RO(d)}}return{provider:"qwen",sessionId:n,cwd:i,createdAt:s.createdAt,modifiedAt:s.modifiedAt,model:o,cliVersion:a,startCommand:"qwen",firstUserMessage:l,lastUserMessage:c,messageCount:u,filePath:e}}async loadSession(e){let n=await this.resolveSessionPath(e);if(!n)return null;let r=ug(n,".jsonl");return this.loadFromFile(n,r)}async loadFromFile(e,n){let r=await Le(e),s="(unknown)",i,o,a,l,c,u,d=[],f=NO();for await(let m of Be(e)){if(AO(f,m.usageMetadata),m.cwd&&(s=m.cwd,m.version&&(o=m.version),m.gitBranch&&(a=m.gitBranch)),m.type==="system"&&m.cwd&&(s=m.cwd,m.version&&(o=m.version),m.model&&(i=m.model),m.gitBranch&&(a=m.gitBranch)),!m.message)continue;let p=m.message,_=m.timestamp?new Date(m.timestamp):r.modifiedAt;if(m.type==="tool_result"){let h=gg(m).filter(g=>g.functionResponse!==void 0);h.length===0&&m.toolCallResult?.callId&&d.push({role:"tool_result",timestamp:_,content:Ds(m.toolCallResult.resultDisplay??m.toolCallResult.error??m.toolCallResult.status)??"tool result",toolCallId:m.toolCallResult.callId});for(let g of h){let y=g.functionResponse,w=LO(y.response),S=Ds(m.toolCallResult?.resultDisplay);d.push({role:"tool_result",timestamp:_,content:S??w??m.toolCallResult?.status??"tool result",toolName:y.name,toolCallId:m.toolCallResult?.callId??y.id,...w!==void 0?{toolDetailedContent:w}:{}})}}else if(fg(m)){let h=pg(m);h.trim()&&(c||(c=J(h.trim(),80)),u=J(h.trim(),80)),d.push({role:"user",timestamp:_,content:h})}else if(mg(m)){let h=_g(m);if(h&&(i=h),Array.isArray(p.content))for(let g of p.content)g.type==="text"&&g.text?d.push({role:"assistant",timestamp:_,content:g.text,model:h}):g.type==="thinking"&&g.thinking?d.push({role:"thinking",timestamp:_,content:g.thinking}):g.functionCall&&d.push(hg(g.functionCall,_,h));else if(typeof p.content=="string")d.push({role:"assistant",timestamp:_,content:p.content,model:h});else if(Array.isArray(p.parts))for(let g of p.parts)if(g.thought||g.type==="thinking"){let y=g.thinking||g.text;y&&d.push({role:"thinking",timestamp:_,content:y})}else g.functionCall?d.push(hg(g.functionCall,_,h)):g.text&&d.push({role:"assistant",timestamp:_,content:g.text,model:h})}}return{provider:"qwen",sessionId:n,slug:l,cwd:s,createdAt:r.createdAt,modifiedAt:r.modifiedAt,model:i,cliVersion:o,gitBranch:a,startCommand:"qwen",firstUserMessage:c,lastUserMessage:u,messageCount:d.filter(m=>m.role==="user"||m.role==="assistant").length,filePath:e,...xO(f),messages:d}}async resolveSessionPath(e){let n=kn(this.baseDir,"projects");try{let r=await Eo(n),s=[];for(let i of r){let o=kn(n,i,"chats",`${e}.jsonl`);try{return await kO(o,{flag:"r"}),o}catch{continue}}for(let i of r){let o=kn(n,i,"chats"),a;try{a=await Eo(o)}catch{continue}for(let l of a){if(!l.endsWith(".jsonl"))continue;ug(l,".jsonl").startsWith(e)&&s.push(kn(o,l))}}if(s.length===1)return s[0]}catch{}return null}async deleteSession(e){let n=await this.resolveSessionPath(e);if(!n)return!1;try{return await IO(n),!0}catch{return!1}}}});function yd(){return new gd}var gd,wd=E(()=>{"use strict";yg();Tt();vn();ut();gd=class extends ve{constructor(){super({provider:new To,capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!0,canCancel:!0},injection:{leaderMode:"prompt-append"},binary:"qwen",seedArgs:["-p",_e,"--approval-mode","yolo"],resumeTemplate:"qwen --resume {{session_id}}",startTemplate:"qwen",transport:co})}seedArgsFor(e){let n=super.seedArgsFor(e);return e?.model?[...n,"--model",e.model]:n}}});import{readdir as wg,readFile as Eg,rm as Tg,stat as Sg}from"node:fs/promises";import{basename as Ed,join as qt}from"node:path";import{fileURLToPath as OO}from"node:url";async function CO(t){let e=await Promise.all(t.map(n=>Le(n)));return{createdAt:new Date(Math.min(...e.map(n=>n.createdAt.getTime()))),modifiedAt:new Date(Math.max(...e.map(n=>n.modifiedAt.getTime())))}}function $O(t,e){if(!t)return e;let n=new Date(t);return Number.isNaN(n.getTime())?e:n}function vg(t){return t.type==="USER_INPUT"}function bg(t){return t.source==="MODEL"&&t.type==="PLANNER_RESPONSE"}function MO(t){return t.source==="MODEL"&&t.type!=="PLANNER_RESPONSE"}function kg(t){if(!t)return"";let e=/<USER_REQUEST>\n?([\s\S]*?)\n?<\/USER_REQUEST>/.exec(t);return e?e[1]:t}function Ig(t){if(!t)return;let e=/Model Selection` from [^\n]+? to ([^\n]+)/.exec(t);if(e)return e[1].replace(/\. No need\b[\s\S]*$/,"").replace(/\. If reporting\b[\s\S]*$/,"").replace(/\.\s*$/,"").trim()}function DO(t){if(t===void 0)return"";try{return JSON.stringify(t)}catch{return String(t)}}async function jO(t){for await(let e of Be(t)){let n=e.tool_calls?.map(s=>s.args)??[];for(let s of n){let i=PO(s);if(i)return i}let r=FO(e.content);if(r)return r}return null}function PO(t){if(!t||typeof t!="object"||Array.isArray(t))return null;let e=t,n=e.Cwd??e.cwd??e.DirectoryPath;return typeof n!="string"?null:n.replace(/^"|"$/g,"")}function FO(t){return t?/"Cwd":"([^"]+)"/.exec(t)?.[1]??null:null}function UO(t,e){if(t.status!=="RUNNING"||!t.content)return;let n=/task id:\s*([^/\s]+)\/(task-(\d+))\b/.exec(t.content);if(!(!n||n[1]!==e)&&!(t.step_index===void 0||Number(n[3])!==t.step_index))return n[2]}function WO(t,e){let n=new Set;for(let r of e){let s=qO(t,n,r);if(!s)continue;n.add(s);let i=r.event.step_index===void 0?void 0:`agy-step-${r.event.step_index}`;s.message.toolCallId=i,s.message.backgroundTaskId=r.message.backgroundTaskId,r.message.toolName=s.name,r.message.toolCallId=i}}function qO(t,e,n){let r=n.message.backgroundTaskId===void 0?void 0:JO(n.event.content);if(r!==void 0)return Ng(t.filter(i=>!e.has(i)&&GO(i)===r),n.event.step_index);let s=XO(n.event);if(s!==void 0)return Ng(t.filter(i=>!e.has(i)&&BO(i.name,n.event.type)&&xg(HO(i))===s),n.event.step_index)}function Ng(t,e){if(t.length===0)return;if(t.length===1)return t[0];if(e===void 0)return;let n=t.map(r=>({call:r,distance:r.stepIndex===void 0?Number.POSITIVE_INFINITY:Math.abs(e-r.stepIndex)})).sort((r,s)=>r.distance-s.distance);return n[0].distance<n[1].distance?n[0].call:void 0}function BO(t,e){return e==="VIEW_FILE"?t==="view_file":e!=="CODE_ACTION"?!1:t==="write_to_file"||t==="replace_file_content"||t==="multi_replace_file_content"}function HO(t){let e=t.name==="view_file"?t.input?.AbsolutePath:t.input?.TargetFile;return typeof e=="string"?e:void 0}function XO(t){if(!t.content)return;let e;return t.type==="VIEW_FILE"?e=/File Path:\s*`?([^`\n]+)`?/.exec(t.content)?.[1]:t.type==="CODE_ACTION"&&(e=/Created file\s+(.+?)\s+with requested content/.exec(t.content)?.[1]??/changes were made by .*? tool to:\s*(.+?)\.\s*(?:If relevant|$)/s.exec(t.content)?.[1]),xg(e)}function xg(t){if(!t)return;let e=t.trim().replace(/^`|`$/g,"");if(!e.startsWith("file://"))return e;try{return OO(e)}catch{return}}function JO(t){if(t)return/Task Description:\s*([^\n]+)/.exec(t)?.[1]?.trim()}function GO(t){if(t.name==="run_command"){let e=t.input?.CommandLine;return typeof e=="string"?e:void 0}if(t.name==="schedule"){let e=t.input?.DurationSeconds,n=t.input?.Prompt;return typeof e!="string"&&typeof e!="number"||typeof n!="string"?void 0:`Timer: ${e}s, Prompt: ${n}`}}function Ag(t){if(t.endsWith(".db"))return Ed(t,".db");let e="/brain/",n=t.indexOf(e);return n===-1?null:t.slice(n+e.length).split("/")[0]||null}var So,Rg=E(()=>{"use strict";Wt();So=class{name="agy";baseDir;constructor(e={}){this.baseDir=e.agyDir||qt(we,".gemini","antigravity-cli")}getWatchPaths(){return[{directory:qt(this.baseDir,"conversations"),filePattern:/\.db$/}]}async discoverSessions(){let e=qt(this.baseDir,"conversations"),n;try{n=await wg(e)}catch{return[]}let r=[];for(let s of n){if(!s.endsWith(".db"))continue;let i=Ed(s,".db");try{let o=await this.extractSummary(i);o&&r.push(o)}catch{}}return r}conversationPath(e){return qt(this.baseDir,"conversations",`${e}.db`)}transcriptPath(e,n){return qt(this.baseDir,"brain",e,".system_generated","logs",n?"transcript_full.jsonl":"transcript.jsonl")}async existingTranscriptPath(e){for(let n of[this.transcriptPath(e,!0),this.transcriptPath(e,!1)])try{return await Sg(n),n}catch{}return null}async extractSummary(e){let n=this.conversationPath(e),r=await this.existingTranscriptPath(e),s=r??n,i=await CO([n,r].filter(Boolean)),o=await this.resolveCwd(e,r),a,l,c,u=0;if(r){let d=await Ke(r,80);for(let f of d){let m=Ig(f.content);if(m&&(a=m),vg(f)){let p=kg(f.content).trim();p&&(l||(l=J(p,80)),c=J(p,80)),u++}else bg(f)&&f.content&&u++}}return{provider:"agy",sessionId:e,cwd:o,createdAt:i.createdAt,modifiedAt:i.modifiedAt,model:a,startCommand:"agy",firstUserMessage:l,lastUserMessage:c,messageCount:u,filePath:s,filePaths:r?[n,r]:[n]}}async loadSession(e){let n=await this.resolveSessionPath(e);if(!n)return null;let r=Ag(n);if(!r)return null;let s=await this.extractSummary(r);if(!s)return null;let i=await this.existingTranscriptPath(r),o=[],a=s.model,l=s.firstUserMessage,c=s.lastUserMessage,u=[],d=[];if(i)for await(let f of Be(i)){let m=$O(f.created_at,s.modifiedAt),p=Ig(f.content);if(p&&(a=p),vg(f)){let _=kg(f.content),h=_.trim();h&&(l||(l=J(h,80)),c=J(h,80)),o.push({role:"user",timestamp:m,content:_});continue}if(Array.isArray(f.tool_calls))for(let _ of f.tool_calls){let h=_.name||"tool",g=DO(_.args),y=Ut(_.args),w={role:"tool_use",timestamp:m,content:g,toolName:h,toolInput:g,toolInputData:y};o.push(w),u.push({name:h,stepIndex:f.step_index,input:y,message:w})}if(bg(f)&&f.content)o.push({role:"assistant",timestamp:m,content:f.content,model:a});else if(MO(f)&&f.content){let _=UO(f,r),h=_===void 0?null:await this.readTaskLog(r,_),g={role:"tool_result",timestamp:h?.modifiedAt??m,content:f.content,toolName:f.type?.toLowerCase(),backgroundTaskId:_,...h===null?{}:{toolDetailedContent:h.content}};o.push(g),d.push({event:f,message:g})}f.thinking&&o.push({role:"thinking",timestamp:m,content:f.thinking})}return WO(u,d),{...s,model:a,firstUserMessage:l,lastUserMessage:c,messageCount:o.filter(f=>f.role==="user"||f.role==="assistant").length,messages:o}}async resolveSessionPath(e){let n=this.conversationPath(e);try{return await Sg(n),n}catch{}let r=qt(this.baseDir,"conversations");try{let s=[];for(let i of await wg(r)){if(!i.endsWith(".db"))continue;Ed(i,".db").startsWith(e)&&s.push(qt(r,i))}if(s.length===1)return s[0]}catch{}return null}async deleteSession(e){let n=await this.resolveSessionPath(e);if(!n)return!1;let r=Ag(n);return r?(await Tg(this.conversationPath(r),{force:!0}),await Tg(qt(this.baseDir,"brain",r),{recursive:!0,force:!0}),!0):!1}async resolveCwd(e,n){let r=await this.cwdFromLastConversationCache(e);if(r)return r;if(n){let s=await jO(n);if(s)return s}return"(unknown)"}async cwdFromLastConversationCache(e){let n=qt(this.baseDir,"cache","last_conversations.json");try{let r=JSON.parse(await Eg(n,"utf8"));for(let[s,i]of Object.entries(r))if(i===e)return s}catch{}return null}async readTaskLog(e,n){if(!/^task-\d+$/.test(n))return null;let r=qt(this.baseDir,"brain",e,".system_generated","tasks",`${n}.log`);try{let[s,i]=await Promise.all([Eg(r,"utf8"),Le(r)]);return{content:s,modifiedAt:i.modifiedAt}}catch{return null}}}});import{spawn as KO}from"node:child_process";function Sd(t){return new Td(t)}async function VO(t,e){let n=Date.now(),r=["--conversation",e.sessionId,"-p",t,"--dangerously-skip-permissions","--print-timeout",zO(e.timeoutMs)];e.model&&r.push("--model",e.model),tt("agy",r,e.permissionMode??"yolo"),e.onProgress?.({kind:"system",summary:"agy -p one-shot started (no streaming events)"});let{stdout:s}=await YO(e.binary,r,{cwd:e.cwd,env:Ve(e.env,e.cwd,e.sessionId),signal:e.signal});return e.onProgress?.({kind:"system",summary:"agy -p one-shot completed"}),{text:s.trimEnd(),sessionId:e.sessionId,durationMs:Date.now()-n}}function YO(t,e,n){return new Promise((r,s)=>{let i;try{i=KO(t,e,{cwd:n.cwd,env:n.env,stdio:["ignore","pipe","pipe"]})}catch(c){s(c);return}let o="",a="";i.stdout?.on("data",c=>{o+=c.toString()}),i.stderr?.on("data",c=>{a+=c.toString()});let l=()=>{i.kill("SIGTERM"),s(new Error("agy turn aborted"))};if(n.signal){if(n.signal.aborted){l();return}n.signal.addEventListener("abort",l,{once:!0})}i.on("error",c=>{n.signal?.removeEventListener("abort",l),s(c)}),i.on("exit",(c,u)=>{if(n.signal?.removeEventListener("abort",l),c===0){r({stdout:o,stderr:a});return}let d=u?`signal ${u}`:`exit code ${c}`,f=a.trim()||o.trim();s(new Error(`agy failed (${d})${f?`: ${f}`:""}`))})})}function zO(t){return!t||t<=0?"8h":`${Math.max(1,Math.ceil(t/1e3))}s`}var Td,vd=E(()=>{"use strict";Rg();Tt();ut();Et();Vn();Td=class extends ve{constructor(e){super({provider:new So(e),capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!1,canCancel:!1},injection:{leaderMode:"prompt-append",leaderSetupHint:"Antigravity uses one-shot print turns; no streaming events are available."},binary:"agy",seedArgs:["-p",_e,"--dangerously-skip-permissions","--print-timeout","2m"],resumeTemplate:"agy --conversation {{session_id}} --dangerously-skip-permissions",startTemplate:"agy --dangerously-skip-permissions",transport:VO})}seedArgsFor(e){let n=[...super.seedArgsFor(e)];return e?.model&&n.push("--model",e.model),n}manualSeedHint(e){return{launchCommand:`cd ${e} && agy --dangerously-skip-permissions`,postLaunchNote:"Send the lmctl seed instruction, wait for the conversation to write, then exit.",lsCommand:`lmctl ls --provider agy --sessiondir ${e}`}}}});import ZO from"node:zlib";function aC(t,e){return t[e]===eC&&t[e+1]===tC&&t[e+2]===nC&&t[e+3]===rC}function Lg(t,e){return(t[e]&240)===80&&t[e+1]===sC&&t[e+2]===iC&&t[e+3]===oC}function lC(t,e){if(Lg(t,e))return e+8>t.length?void 0:8+t.readUInt32LE(e+4);if(!aC(t,e))return;let n=e+4;if(n+1>t.length)return;let r=t[n];n+=1;let s=r>>6,i=(r&32)!==0,o=(r&4)!==0,a=r&3;i||(n+=1),n+=[0,1,2,4][a];let l=s===0?i?1:0:[2,4,8][s-1];if(n+=l,!(n>t.length)){for(;;){if(n+3>t.length)return;let c=t[n]|t[n+1]<<8|t[n+2]<<16,u=(c&1)!==0,d=c>>1&3,f=c>>3;if(n+=3,d===3||(n+=d===1?1:f,n>t.length))return;if(u)break}if(o&&(n+=4),!(n>t.length))return n-e}}function cC(t){let e=[],n=0;for(;n+4<=t.length;){let r=lC(t,n);if(r===void 0||r<=0)break;e.push(t.subarray(n,n+r)),n+=r}return e}function vo(t){let e=[];for(let n of cC(t))Lg(n,0)||e.push(QO(n).toString("utf8"));return e.join("")}var QO,eC,tC,nC,rC,sC,iC,oC,bd=E(()=>{"use strict";QO=ZO.zstdDecompressSync,eC=40,tC=181,nC=47,rC=253,sC=42,iC=77,oC=24});import{readdir as kd,rm as dC,stat as uC}from"node:fs/promises";import{join as In}from"node:path";function fC(t){return"--"+t.replace(/^\/+|\/+$/g,"").replace(/\//g,"-")+"--"}function Id(t){if(typeof t=="string")return t;if(!Array.isArray(t))return"";let e=[];for(let n of t)n&&typeof n=="object"&&n.type==="text"&&typeof n.text=="string"&&e.push(n.text);return e.join("")}function mC(t){if(!Array.isArray(t))return[];let e=[];for(let n of t)n&&typeof n=="object"&&n.type==="reasoning"&&typeof n.text=="string"&&e.push(n.text);return e}function Og(t){let e=[];for(let n of t){let r=n.data??{},s=n.time?new Date(n.time):new Date(0);if(n.type==="user/message"){let i=r;if(i.source?.kind!==void 0&&i.source.kind!=="user")continue;e.push({role:"user",timestamp:s,content:Id(i.content)})}else if(n.type==="assistant/message"){let i=r.message;for(let o of mC(i?.content))e.push({role:"thinking",timestamp:s,content:o});e.push({role:"assistant",timestamp:s,content:Id(i?.content),model:i?.source?.model})}else if(n.type==="tool/call"){let i=r,o;if(typeof i.arguments=="string")try{o=JSON.parse(i.arguments)}catch{}else i.arguments&&typeof i.arguments=="object"&&(o=i.arguments);e.push({role:"tool_use",timestamp:s,content:typeof i.arguments=="string"?i.arguments:JSON.stringify(i.arguments??{}),toolName:i.name,toolCallId:i.callId,toolInputData:o})}else if(n.type==="tool/result"){let i=r,a=(Array.isArray(i.message?.content)?i.message.content:[])[0];e.push({role:"tool_result",timestamp:s,content:Id(a?.content??i.message?.content),toolCallId:a?.toolCallId??i.message?.source?.callId})}}return e}function pC(t){for(let e=t.length-1;e>=0;e--){let n=t[e];if(n.type==="turn/end")return n.data?.reason?.kind==="completed"?"complete":"aborted";if(n.type==="turn/start")return"in_progress"}}function Cg(t,e,n){let r=t.find(m=>m.type==="session");if(!r)return null;let s=r,i=r.data,o=s.id??i?.id;if(!o)return null;let a;for(let m of t)if(m.type==="request/header"){let p=m.data?.header;p?.config?.model&&(a=p.config.model)}let l=t.map(m=>m.time).filter(m=>typeof m=="number"),c=s.createdAt??i?.createdAt,u=c?new Date(c):new Date(0),d=l.length>0?new Date(Math.max(...l)):u,f=n.filter(m=>m.role==="user");return{provider:"dsh",sessionId:o,cwd:s.cwd??i?.cwd??"",createdAt:u,modifiedAt:d,model:a,firstUserMessage:f[0]?.content,lastUserMessage:f.at(-1)?.content,messageCount:n.filter(m=>m.role==="user"||m.role==="assistant").length,filePath:e,..._C(t)}}function _C(t){let e=!1,n=0,r=0,s=0,i=0,o,a;for(let l of t){if(l.type!=="assistant/message")continue;let c=l.data?.usage;if(!c)continue;e=!0;let u=bo(c.inputTokens),d=bo(c.cacheReadTokens),f=bo(c.outputTokens),m=bo(c.reasoningTokens);n+=u,r+=d,s+=f,i+=m,o=u+d,a={inputTokens:u,cachedInputTokens:d,outputTokens:f,reasoningOutputTokens:m,totalTokens:u+d+f}}return{totalInputTokens:e?n:void 0,totalCachedInputTokens:e?r:void 0,totalOutputTokens:e?s:void 0,totalReasoningOutputTokens:e?i:void 0,lastInputTokens:o,lastTokenUsage:a}}function bo(t){let e=Number(t??0);return Number.isFinite(e)?Math.max(0,Math.round(e)):0}var ko,$g=E(()=>{"use strict";Wt();bd();ko=class{name="dsh";sessionsDir;constructor(e={}){let n=e.dshHome||In(we,".dsh");this.sessionsDir=In(n,"sessions")}async discoverSessions(){let e=[],n;try{n=await kd(this.sessionsDir)}catch{return[]}for(let r of n){let s;try{s=await kd(In(this.sessionsDir,r))}catch{continue}for(let i of s)if(i.startsWith("session-"))try{let o=await this.readSummary(r,i);o&&e.push(o)}catch{}}return e}async loadSession(e){let n=await this.findSessionDir(e);if(!n)return null;let r=await this.readRecords(n.cwdDir,n.sessionDir);if(r.length===0)return null;let s=Og(r),i=Cg(r,n.filePath,s);return i?{...i,turnStatus:pC(r),messages:s}:null}async resolveSessionPath(e){return(await this.findSessionDir(e))?.filePath??null}async deleteSession(e){let n=await this.findSessionDir(e);return n?(await dC(In(this.sessionsDir,n.cwdDir,n.sessionDir),{recursive:!0,force:!0}),!0):!1}sessionFilePath(e,n){return In(this.sessionsDir,fC(e),n,"session.jsonl.zstd")}async findSessionDir(e){let n;try{n=await kd(this.sessionsDir)}catch{return null}for(let r of n){let s=e,i=In(this.sessionsDir,r,s,"session.jsonl.zstd");try{return await uC(i),{cwdDir:r,sessionDir:s,filePath:i}}catch{}}return null}async readRecords(e,n){let{readFile:r}=await import("node:fs/promises"),s=In(this.sessionsDir,e,n,"session.jsonl.zstd"),i=await r(s),o=vo(i),a=[];for(let l of o.split(`
1570
1570
  `))if(l.trim())try{let c=JSON.parse(l);if(c.type?.endsWith("-chunks")||c.type==="assistant/chunk")continue;a.push(c)}catch{}return a}async readSummary(e,n){let r=await this.readRecords(e,n);if(r.length===0)return null;let s=In(this.sessionsDir,e,n,"session.jsonl.zstd");return Cg(r,s,Og(r))}}});import{spawn as hC}from"node:child_process";async function Ad(t,e=n=>Nd.spawn(n)){if(Nn){let n=await Nn.catch(()=>{});if(n?.alive)return n;Nn=void 0}return Nn=e(t),Nn}async function xd(){if(!Nn)return;(await Nn.catch(()=>{}))?.shutdown(),Nn=void 0}var gC,Mg,Lr,Nd,Nn,Dg=E(()=>{"use strict";gC=/dsh web:\s*(https?:\/\/\S+)/,Mg=2e4,Lr=class t extends Error{method;detail;constructor(e,n){super(`dsh RPC ${e} failed: ${JSON.stringify(n)}`),this.name="DshRpcCallError",this.method=e,this.detail=n,Object.setPrototypeOf(this,t.prototype)}},Nd=class t{baseUrl;child;constructor(e,n){this.baseUrl=e,this.child=n}static forTesting(e){return new t(e,void 0)}async rpc(e,n){let r=`${e}-${Date.now()}-${Math.random().toString(36).slice(2,8)}`,s;try{s=await fetch(`${this.baseUrl}/api/${e}`,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({type:"client-request",rpcId:r,method:e,payload:n})})}catch(a){throw new Lr(e,`transport error: ${a instanceof Error?a.message:String(a)}`)}let i;try{i=await s.json()}catch{i=void 0}if(!s.ok)throw new Lr(e,i??s.statusText);let o=i&&typeof i=="object"?i.result:void 0;if(!o||typeof o!="object"||typeof o.ok!="boolean")throw new Lr(e,"malformed response: HTTP 200 but body is not a well-formed {result:{ok,\u2026}} envelope");if(o.ok===!1)throw new Lr(e,o.error??o);return"value"in o?o.value:void 0}get alive(){return this.child!==void 0&&this.child.exitCode===null&&this.child.signalCode===null}shutdown(){this.child!==void 0&&this.alive&&this.child.kill("SIGTERM")}static spawn(e){return new Promise((n,r)=>{let s=hC("dsh",["web","--no-open","--port","0"],{env:e,stdio:["ignore","pipe","pipe"]}),i=!1,o="",a="",l=setTimeout(()=>{i||(i=!0,s.kill("SIGTERM"),r(new Error(`dsh web sidecar did not report a boot URL within ${Mg}ms (stdout: ${o.slice(0,500)}; stderr: ${a.slice(0,500)})`)))},Mg);s.stdout?.on("data",c=>{if(o+=c.toString(),i)return;let u=gC.exec(o);u&&(i=!0,clearTimeout(l),n(new t(u[1],s)))}),s.stderr?.on("data",c=>{a+=c.toString()}),s.on("error",c=>{i||(i=!0,clearTimeout(l),r(c))}),s.on("exit",(c,u)=>{if(i)return;i=!0,clearTimeout(l);let d=u?`signal ${u}`:`exit code ${c}`;r(new Error(`dsh web exited before reporting a boot URL (${d}): ${a.slice(0,500)}`))})})}}});import{randomUUID as yC}from"node:crypto";import{readFile as wC,mkdir as EC}from"node:fs/promises";function Ld(t){return new Rd(t)}function Pg(t){return{...t,DSH_PERMISSION_MODE:t.DSH_PERMISSION_MODE??"danger-full-access"}}function Io(t){return t instanceof Error?t.message:String(t)}async function SC(t){let e=await Fg(t),n=-1;for(let r of e)r.type==="turn/end"&&typeof r.seq=="number"&&r.seq>n&&(n=r.seq);return n}async function Fg(t){let e;try{e=await wC(t)}catch{return[]}let n=vo(e),r=[];for(let s of n.split(`
1571
1571
  `))if(s.trim())try{let i=JSON.parse(s);i!==null&&typeof i=="object"&&!Array.isArray(i)&&r.push(i)}catch{}return r}function vC(t){let n=t.data?.message?.content;if(typeof n=="string")return n;if(!Array.isArray(n))return"";let r=[];for(let s of n)s&&typeof s=="object"&&s.type==="text"&&typeof s.text=="string"&&r.push(s.text);return r.join("")}var TC,jg,Rd,Od=E(()=>{"use strict";Tt();$g();bd();Dg();ut();Vn();TC=500,jg=8*60*60*1e3;Rd=class extends ve{dshProvider;constructor(e){let n=new ko(e);super({provider:n,capabilities:{canCreate:!0,canResumeInteractive:!1,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!1,canCancel:!1},injection:{leaderMode:"prompt-append",leaderSetupHint:"dsh has no in-session leader-injection mechanism; the seed prompt carries lmctl's leader instructions."},binary:"dsh",seedArgs:[],resumeTemplate:"dsh web --no-open --port 0 # continuity is via the RPC sidecar, not a resume flag",startTemplate:"dsh web --no-open --port 0",transport:(r,s)=>this.dshPromptTurn(r,s)}),this.dshProvider=n}manualSeedHint(e){return{launchCommand:`cd ${e} && dsh web`,postLaunchNote:"dsh has no interactive terminal session to seed into \u2014 continuity lives in the web profile's session store, not a TTY. Boot the sidecar with the command above, open the printed http:// URL, and start a session rooted at this directory in the web UI; lmctl's managed sidecar can then cold-resume it by id (cross-profile session sharing is verified). Send lmctl's seed instruction there, wait for the reply, then find the new session id with the ls command below and register it manually.",lsCommand:`lmctl ls --provider dsh --sessiondir ${e}`}}async seed(e,n){await EC(e,{recursive:!0});let r=`session-${yC()}`,s=Pg(process.env);tt("dsh",[],"yolo");try{let i;try{i=await Ad(s)}catch(a){return{success:!1,error:`dsh sidecar failed to start: ${Io(a)}`}}try{await i.rpc("session.create",{sessionId:r,cwd:e})}catch(a){return{success:!1,error:`session.create failed: ${Io(a)}`}}if(n?.model)try{await i.rpc("session.selectModel",{sessionId:r,provider:"deepseek-official",model:n.model})}catch(a){return{success:!1,error:`session.selectModel("${n.model}") failed: ${Io(a)}`}}let o=n?.prompt??_e;try{await this.promptAndWait(i,e,r,o,jg)}catch(a){return{success:!1,error:`seed turn failed: ${Io(a)}`}}return{success:!0,sessionId:r}}finally{await xd()}}async dshPromptTurn(e,n){let r=Date.now(),s=Pg(n.env??process.env);tt("dsh",[],n.permissionMode??"yolo");let i;try{let o=await Ad(s);n.model&&(await o.rpc("session.selectModel",{sessionId:n.sessionId,provider:"deepseek-official",model:n.model}),n.onProgress?.({kind:"system",summary:`dsh model set to ${n.model}`})),n.onProgress?.({kind:"system",summary:"dsh session.prompt sent"}),i=await this.promptAndWait(o,n.cwd,n.sessionId,e,n.timeoutMs&&n.timeoutMs>0?n.timeoutMs:jg)}finally{await xd()}return n.onProgress?.({kind:"system",summary:"dsh turn completed"}),{text:i,sessionId:n.sessionId,durationMs:Date.now()-r}}async promptAndWait(e,n,r,s,i){let o=this.dshProvider.sessionFilePath(n,r),a=await SC(o);await e.rpc("session.prompt",{sessionId:r,mode:"queue",content:[{type:"text",text:s}]});let l=Date.now()+i;for(;;){let c=await Fg(o),u=c.find(d=>d.type==="turn/end"&&(d.seq??-1)>a);if(u){let d=u.data?.reason?.kind,f=[...c].reverse().find(p=>p.type==="assistant/message"),m=f?vC(f):"";if(d!=="completed"&&!m)throw new Error(`dsh turn ended with reason=${d??"unknown"} and no assistant text`);return m}if(Date.now()>l)throw new Error(`dsh turn timed out after ${i}ms waiting for turn/end`);await new Promise(d=>setTimeout(d,TC))}}}});import{createHash as bC}from"node:crypto";import{existsSync as kC,mkdirSync as $d,readFileSync as IC,renameSync as NC,rmdirSync as Gg,statSync as AC,writeFileSync as xC}from"node:fs";import{dirname as Pd,join as Ug,resolve as Cd}from"node:path";function RC(t){return bC("sha256").update(t).digest("hex").slice(0,8)}function LC(t){let e=t.trim().toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"");return e.length>0?e:"session"}function OC(t,e){let n=e?.prompt??"",r=/\bYou are alias\s+([A-Za-z][A-Za-z0-9_-]*)\b/.exec(n);return r!==null?r[1]:t.split(/[\\/]/).filter(Boolean).pop()??"session"}function Kg(t){return t.split(/\r?\n/,1)[0]?.trim()||"(empty prompt)"}function No(t){return Math.max(1,Math.ceil(t.length/4))}function Cr(t=process.cwd()){let e=process.env.LMCTL_CLAUDE_MOCK_STORE;if(e!==void 0&&e.trim().length>0)return Cd(e);let n=process.env.LMCTL_DB;return n!==void 0&&n.trim().length>0?Ug(Pd(Cd(n)),".lmctl-claude-mock","sessions.json"):Ug(Cd(t),".lmctl-claude-mock","sessions.json")}function Wg(){return{schemaVersion:1,sessions:{}}}function js(t){if(!kC(t))return Wg();try{let e=JSON.parse(IC(t,"utf8")),n=typeof e.sessions=="object"&&e.sessions!==null?e.sessions:{},r=typeof e.script=="object"&&e.script!==null?e.script:void 0,s=typeof e.scriptContains=="object"&&e.scriptContains!==null?e.scriptContains:void 0,i=Md(e.defaultDelayMs);return{schemaVersion:1,sessions:n,...i!==void 0?{defaultDelayMs:i}:{},...r!==void 0?{script:r}:{},...s!==void 0?{scriptContains:s}:{}}}catch{return Wg()}}function Vg(t,e){$d(Pd(t),{recursive:!0});let n=`${t}.${process.pid}.${Date.now()}.tmp`;xC(n,`${JSON.stringify(e,null,2)}
1572
1572
  `,"utf8"),NC(n,t)}function MC(t){Atomics.wait(new Int32Array(new SharedArrayBuffer(4)),0,0,t)}function DC(t){let e=`${t}.lock`;$d(Pd(t),{recursive:!0});let n=Date.now()+qg;for(;;)try{return $d(e),e}catch(r){if(r.code!=="EEXIST")throw r;try{if(Date.now()-AC(e).mtimeMs>CC){try{Gg(e)}catch{}continue}}catch{continue}if(Date.now()>=n)throw new Error(`ClaudeMock store lock timeout after ${qg}ms: ${e}`);MC($C)}}function jC(t){try{Gg(t)}catch{}}function Yg(t,e){let n=DC(t);try{return e()}finally{jC(n)}}function PC(t){return{...t,timestamp:t.timestamp.toISOString()}}function FC(t){return{...t,timestamp:new Date(t.timestamp)}}function UC(t){return{...t,createdAt:t.createdAt.toISOString(),modifiedAt:t.modifiedAt.toISOString(),messages:t.messages.map(PC)}}function zg(t){return{...t,createdAt:new Date(t.createdAt),modifiedAt:new Date(t.modifiedAt),messages:t.messages.map(FC)}}function Ao(t,e=process.cwd()){let n=Or.get(t);if(n!==void 0)return n;let s=js(Cr(e)).sessions[t];if(s===void 0)return;let i=zg(s);return Or.set(i.sessionId,i),i}function Bg(t){Or.set(t.sessionId,t);let e=Cr(t.cwd);Yg(e,()=>{let n=js(e);n.sessions[t.sessionId]=UC({...t,filePath:e}),Vg(e,n)})}function WC(t,e=process.cwd()){let n=Cr(e);return Yg(n,()=>{let r=js(n),s=r.sessions[t]!==void 0;return s&&(delete r.sessions[t],Vg(n,r)),s})}function qC(){let t=js(Cr()),e=Object.values(t.sessions).map(zg);for(let n of e)Or.set(n.sessionId,n);return e}function Md(t){return typeof t=="number"&&Number.isFinite(t)&&t>=0?t:void 0}function Hg(t){if(typeof t=="string")return{kind:"success",text:t};if(t!==void 0&&typeof t.text=="string"&&typeof t.error!="string"){let e=Md(t.delayMs);return{kind:"success",text:t.text,...e!==void 0?{delayMs:e}:{}}}if(t!==void 0&&typeof t.error=="string"&&typeof t.text!="string"){let e=Md(t.delayMs);return{kind:"error",error:t.error,...e!==void 0?{delayMs:e}:{}}}}async function Xg(t){t!==void 0&&t>0&&await new Promise(e=>setTimeout(e,t))}function BC(t,e){let{script:n,scriptContains:r}=e;if(n!==void 0){let s=Hg(n[t]??n[Kg(t)]);if(s!==void 0)return s}if(r!==void 0){for(let s of Object.keys(r))if(t.includes(s)){let i=Hg(r[s]);if(i!==void 0)return i}}}function Jg(t){return{provider:"ClaudeMock",sessionId:t.sessionId,cwd:t.cwd,createdAt:t.createdAt,modifiedAt:t.modifiedAt,messageCount:t.messages.length,filePath:t.filePath,cliVersion:"ClaudeMock/0",model:"claude-mock",totalInputTokens:t.totalInputTokens,totalOutputTokens:t.totalOutputTokens,lastTokenUsage:{totalTokens:t.totalInputTokens+t.totalOutputTokens}}}function Fd(){return new jd}var Or,CC,$C,qg,Dd,jd,Ud=E(()=>{"use strict";Or=new Map;CC=5e3,$C=15,qg=1e4;Dd=class{name="ClaudeMock";async discoverSessions(){let e=new Map;for(let n of qC())e.set(n.sessionId,n);for(let n of Or.values())e.set(n.sessionId,n);return[...e.values()].map(Jg)}async loadSession(e){let n=Ao(e);return n===void 0?null:{...Jg(n),messages:n.messages.slice()}}async resolveSessionPath(e){return Ao(e)?.filePath??null}async deleteSession(e){let n=Or.delete(e),r=WC(e);return n||r}},jd=class{name="ClaudeMock";capabilities={canCreate:!0,canResumeInteractive:!1,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!1,canCancel:!1};injection={leaderMode:"none"};provider=new Dd;discover(){return this.provider.discoverSessions()}load(e){return this.provider.loadSession(e)}resolvePath(e){return this.provider.resolveSessionPath(e)}delete(e){return this.provider.deleteSession(e)}getWatchPaths(){return[]}async seed(e,n){let r=LC(OC(e,n)),s=`mock-${r}-${RC(`${e}:${r}`)}`,i=new Date,o=Cr(e),a=Ao(s,e),l=n?.prompt??"ClaudeMock seed",c=No(l),u={sessionId:s,cwd:e,filePath:o,createdAt:a?.createdAt??i,modifiedAt:i,messages:a?.messages.slice()??[],totalInputTokens:a?.totalInputTokens??0,totalOutputTokens:a?.totalOutputTokens??0};return u.messages.push({role:"user",timestamp:i,content:l}),u.messages.push({role:"assistant",timestamp:i,content:"ACK: ClaudeMock seeded"}),u.totalInputTokens+=c,u.totalOutputTokens+=No("ACK: ClaudeMock seeded"),Bg(u),{success:!0,sessionId:s}}resumeCommand(e){return`ClaudeMock --resume ${e}`}startCommand(){return"ClaudeMock"}manualSeedHint(e){return{launchCommand:`cd ${e} && ClaudeMock`,postLaunchNote:"ClaudeMock is a hermetic test provider; no manual seed is required.",lsCommand:`lmctl ls --provider ClaudeMock --sessiondir ${e}`}}forkHint(e){return"ClaudeMock does not support fork."}async fork(e,n){return{success:!1,error:"ClaudeMock does not support fork."}}async sendTurn(e,n){let r=Date.now(),s=Ao(n.sessionId,n.cwd);if(s===void 0)throw new Error(`ClaudeMock session not found: ${n.sessionId}`);let i=new Date,o=js(Cr(n.cwd)),a=BC(e,o),l=a?.delayMs??o.defaultDelayMs;if(a?.kind==="error")throw await Xg(l),new Error(a.error);let c=a?.kind==="success"?a.text:`ClaudeMock ack: ${Kg(e)}`;return s.messages.push({role:"user",timestamp:i,content:e}),s.messages.push({role:"assistant",timestamp:i,content:c,model:n.model??"claude-mock"}),s.modifiedAt=i,s.totalInputTokens+=No(e),s.totalOutputTokens+=No(c),Bg(s),n.onProgress?.({kind:"text",summary:"ClaudeMock deterministic reply"}),await Xg(l),{text:c,sessionId:n.sessionId,durationMs:Math.max(1,Date.now()-r),stopReason:"mock_stop",numTurns:1,status:"ok"}}}});function Bt(t){let e=[Hc({claudeDir:t?.claudeDir}),Gc({codexDir:t?.codexDir,codeDir:t?.codeDir}),Zc({geminiDir:t?.geminiDir,claudeDir:t?.claudeDir,codexDir:t?.codexDir,codeDir:t?.codeDir}),nd({copilotDir:t?.copilotDir}),ad(),fd({kimiHome:t?.kimiHome}),_d({lmplayerDbPath:t?.lmplayerDbPath}),yd(),Sd({agyDir:t?.agyDir}),Ld({dshHome:t?.dshHome})];return process.env.LMCTL_ENABLE_MOCK_PROVIDER==="1"&&e.push(Fd()),e}var Wd=E(()=>{"use strict";Xc();Kc();Qc();rd();ld();md();hd();wd();vd();Od();Ud();Xc();Kc();Qc();rd();ld();md();hd();wd();vd();Od();Ud()});var Hd={};ae(Hd,{ProviderRegistry:()=>Is,TransportConnectionError:()=>be,TransportError:()=>ft,TransportJsonError:()=>no,TransportProcessError:()=>tn,TransportRpcError:()=>nn,_resetDefaultRegistryForTests:()=>HC,chat:()=>rn,countTokens:()=>Bd,createAdapterRegistry:()=>Ft,createAllAdapters:()=>Bt,listSessions:()=>Qn,seed:()=>qd});function Ro(){return xo===null&&(xo=Ft(Bt())),xo}function HC(){xo=null}function Qg(t,e){let n=t.getAdapter(e);if(!n)throw new Error(`provider "${e}" is not registered in this registry`);return n}async function rn(t){let e=t.registry??Ro(),n=Qg(e,t.provider),r={sessionId:t.sessionId,cwd:t.cwd,env:t.env,onDelta:t.onDelta,onProgress:t.onProgress,signal:t.signal,timeoutMs:t.timeoutMs,model:t.model,effort:t.effort,progPath:t.progPath,alias:t.alias,isLead:t.isLead,permissionMode:t.permissionMode,holdOpen:t.holdOpen},s=await n.sendTurn(t.prompt,r);return{text:s.text,sessionId:s.sessionId,durationMs:s.durationMs,stopReason:s.stopReason,numTurns:s.numTurns,status:s.status,stalledAfterMs:s.stalledAfterMs}}async function qd(t){let e=t.registry??Ro(),n=Qg(e,t.provider),r=await Zg(e,t.provider,t.cwd),s=await n.seed(t.cwd,{model:t.model,effort:t.effort,prompt:t.prompt}),i=s.warnings!==void 0&&s.warnings.length>0?{warnings:s.warnings}:{};if(!s.success)return{success:!1,error:s.error,...i};if(s.sessionId)return{success:!0,sessionId:s.sessionId,...i};let o=await Zg(e,t.provider,t.cwd),a=XC(r,o);return a?{success:!0,sessionId:a,...i}:{success:!0,...i}}async function Zg(t,e,n){let r=await t.listAll({provider:e,workspace:n}),s=new Map;for(let i of r)s.set(i.sessionId,i.modifiedAt);return s}function XC(t,e){let n=[];for(let r of e.keys())t.has(r)||n.push(r);return n.length===1?n[0]:void 0}async function Qn(t={}){return(t.registry??Ro()).listAll({provider:t.provider,workspace:t.workspace,limit:t.limit,from:t.from,to:t.to})}async function Bd(t){let n=await(t.registry??Ro()).getSession(t.sessionId,t.provider);if(!n)throw new Error(`session "${t.sessionId}" not found`);let r=n.totalInputTokens??0,s=n.totalCachedInputTokens??0,i=n.totalCacheWriteInputTokens??0,o=n.totalOutputTokens??0,a=n.totalReasoningOutputTokens??0;return{provider:n.provider,sessionId:n.sessionId,input:r,cachedInput:s,cacheWriteInput:i,output:o,reasoningOutput:a,total:r+s+i+o+a,lastTurn:n.lastTokenUsage}}var xo,mt=E(()=>{"use strict";wc();Wd();wc();Wd();Ir();xo=null});function JC(){return Xd===null&&(Xd=Ft(Bt())),Xd}async function Lo(t){let{dal:e,team_member_id:n}=t,r=e!==void 0&&n!==void 0;r&&e.setMemberState(n,"in_chat");let s=!1,i;try{return await KC(t)}catch(o){throw s=!0,i=o,o}finally{if(r)if(!s)$r.delete(n),e.setMemberState(n,"idle");else{let o=GC(i,n);e.setMemberState(n,o!==null?"attention_needed":"idle",o)}}}function GC(t,e){if(!(t instanceof xe))return $r.delete(e),null;if(t.kind==="sessiondir_missing")return"sessiondir_missing";if(t.kind==="enoent")return"binary_missing";if(t.kind==="nonzero_exit"&&(t.exit_status===137||t.exit_status===139))return"oom_exit";if(t.kind==="timeout"){let n=($r.get(e)??0)+1;return n>=3?($r.delete(e),"consecutive_timeouts"):($r.set(e,n),null)}return $r.delete(e),null}async function KC(t){let e=t.timeoutMs,n=typeof e=="number"&&e>0,r=JC(),s;try{let u=await r.resolveSession(t.sessionid);if(!u)return Promise.reject(new xe("other",null,`library: sessionid "${t.sessionid}" matched no registered provider`,Jd(t.sessionid,t.sessiondir,"unresolved")));s=u.provider.name}catch(u){return Promise.reject(new xe("other",null,`library: session resolution failed: ${ey(u)}`,Jd(t.sessionid,t.sessiondir,"unresolved")))}let i=Jd(t.sessionid,t.sessiondir,s),o=new AbortController,a=n?setTimeout(()=>o.abort(),e):null,l=!1;o.signal.addEventListener("abort",()=>{l=!0},{once:!0});let c=Date.now();try{let u=await rn({provider:s,sessionId:t.sessionid,cwd:t.sessiondir,prompt:t.prompt,timeoutMs:0,signal:o.signal,registry:r,onProgress:t.onProgress,permissionMode:t.permissionMode});if(u.status==="stalled")throw new xe("timeout",null,`library: stalled after ${u.stalledAfterMs??0}ms`,i);return{text:u.text,ms:Date.now()-c,exit_status:0,argv:i}}catch(u){throw l?new xe("timeout",null,`library: wall-clock timeout after ${e??0}ms`,i):VC(u,i)}finally{a!==null&&clearTimeout(a)}}function Jd(t,e,n){return["<library>","chat",t,e,"--provider",n]}function ey(t){return t instanceof Error?t.message:String(t)}function VC(t,e){if(t instanceof xe)return t;if(t instanceof be){let n=t.cause;return n?.code==="ENOENT_CWD"?new xe("sessiondir_missing",null,t.message,e):n?.code==="ENOENT"?new xe("enoent",null,t.message,e):new xe("other",null,t.message,e)}return t instanceof tn?new xe("nonzero_exit",t.exitCode??null,t.stderr??t.message,e):t instanceof nn?new xe("nonzero_exit",t.rpcCode??null,t.message,e):t instanceof ft?new xe("other",null,t.message,e):new xe("other",null,ey(t),e)}var xe,Xd,$r,Oo=E(()=>{"use strict";mt();xe=class extends Error{kind;exit_status;stderr;argv;constructor(e,n,r,s){super(`lmctl chat failed: ${e}`),this.kind=e,this.exit_status=n,this.stderr=r,this.argv=s,this.name="ChatError"}},Xd=null;$r=new Map});function ty(){return Gd===null&&(Gd=Ft(Bt())),Gd}function zC(t,e){if(!YC.test(t))return t;let n=e.getConfig(`workspace.${t}`);if(n===null||n.length===0)throw new Oe("other",null,`no provider mapping for ${t} (set lmctl_config workspace.${t})`,["<library>","seed","--provider",t]);return n}async function Co(t){let e=zC(t.member.provider,t.dal),n=e===t.member.provider?t.member:{...t.member,provider:e},r=await ZC({member:n});return t.dal.setMemberProviderResolved(t.member.id,e),{sessionid:r.sessionid,provider_resolved:e}}async function ZC(t){let e=t.member.provider,n=t.member.sessiondir,r=Kd("seed",n,e);try{let s=await qd({provider:e,cwd:n,registry:ty()});if(!s.success)throw e$(s.error,r);if(!s.sessionId)throw new Oe("parse",0,"",r);return{sessionid:s.sessionId}}catch(s){throw s instanceof Oe?s:Vd(s,r)}}async function ny(t){return QC(t)}async function QC(t){let e=ty(),n=Kd("tokens",t.sessionid,"unresolved"),r;try{let i=await e.resolveSession(t.sessionid);if(!i)throw new Oe("parse",0,`library: sessionid "${t.sessionid}" matched no registered provider`,n);r=i.provider.name}catch(i){throw i instanceof Oe?i:Vd(i,n)}let s=Kd("tokens",t.sessionid,r);try{let i=await Bd({sessionId:t.sessionid,provider:r,registry:e});return{input_tokens:i.input,cache_tokens:i.cachedInput+i.cacheWriteInput,output_tokens:i.output,total_tokens:i.total}}catch(i){throw i instanceof Oe?i:Vd(i,s)}}function Kd(t,e,n){return["<library>",t,e,"--provider",n]}function e$(t,e){let n=t??"";if(/\bENOENT\b/i.test(n))return new Oe("enoent",null,n,e);if(/timed?\s*out/i.test(n))return new Oe("timeout",null,n,e);if(/\bexit code\s+(-?\d+)\b/i.test(n)){let r=/\bexit code\s+(-?\d+)\b/i.exec(n);return new Oe("nonzero_exit",Number(r[1]),n,e)}return new Oe("other",null,n,e)}function Vd(t,e){return t instanceof Oe?t:t instanceof be?t.cause?.code==="ENOENT"?new Oe("enoent",null,t.message,e):new Oe("other",null,t.message,e):t instanceof tn?new Oe("nonzero_exit",t.exitCode??null,t.stderr??t.message,e):t instanceof nn?new Oe("nonzero_exit",t.rpcCode??null,t.message,e):t instanceof ft?new Oe("other",null,t.message,e):new Oe("other",null,t instanceof Error?t.message:String(t),e)}var Oe,Gd,YC,Yd=E(()=>{"use strict";mt();Oe=class extends Error{kind;exit_status;stderr;argv;constructor(e,n,r,s){super(`lmctl seed failed: ${e}`),this.kind=e,this.exit_status=n,this.stderr=r,this.argv=s,this.name="SeedError"}},Gd=null;YC=/^provider[123]$/});function $o(t){return Buffer.from(t,"utf8").toString("base64url")}function Fs(t){return Buffer.from(t,"base64url").toString("utf8")}async function ry(t,e=n=>ny({sessionid:n})){if(process.env.LMCTL_SESSION_SIZE_DISABLED==="1")return{recorded:0,failed:0};let n=0,r=0;for(let s of t$(t)){let i=s.member.sessionid;if(i!==null)try{let o=await e(i);t.recordSessionSize({team_name:s.team_name,alias:s.member.alias,sessionid:i,...o}),n+=1}catch(o){r+=1;try{t.raiseAttention({kind:"daemon_session_size_failed",severity:"warn",payload:JSON.stringify({team_name:s.team_name,alias:s.member.alias,sessionid:i,error:o instanceof Error?o.message:String(o)})})}catch{}}}return{recorded:n,failed:r}}async function sy(t,e,n){let r=iy(t,e,n);if(r===null||r.member.sessionid===null)throw new Error("session member not found");if(r.member.state!=="idle")throw new Ps(n,r.member.state);t.setMemberState(r.member.id,"in_chat","compacting");try{return await Lo({sessionid:r.member.sessionid,sessiondir:r.member.sessiondir,prompt:"/compact"}),t.setMemberState(r.member.id,"idle",null),{ok:!0,row:oy(t,e,n)}}catch(s){throw t.setMemberState(r.member.id,"attention_needed",`compact failed: ${s instanceof Error?s.message:String(s)}`),s}}async function zd(t,e,n){let r=iy(t,e,n);if(r===null)throw new Error("session member not found");let s=await Co({member:r.member,dal:t});return t.updateTeamMemberSession(r.member.id,s.sessionid),{ok:!0,sessionid:s.sessionid,row:oy(t,e,n)}}function t$(t){return t.listTeams().flatMap(e=>t.listTeamMembers(e.id).filter(n=>n.sessionid!==null).map(n=>({team_name:e.name,member:n})))}function iy(t,e,n){let r=t.findTeamByName(e);if(r===null)return null;let s=t.findTeamMemberByAlias(r.id,n);return s===null?null:{team_name:r.name,member:s}}function oy(t,e,n){return t.sessionSizeHistory(e,n,1)[0]??null}var Ps,Mo=E(()=>{"use strict";Oo();Yd();Ps=class extends Error{constructor(e,n){super(`member ${e} is currently ${n}; cannot compact while busy`),this.name="MemberBusyError"}}});async function Zd(t){let e=t.dal,n=t.nowMs??Date.now(),r=t.thresholdMs??r$(e),s=n-r,i=e.query(`
@@ -1627,7 +1627,7 @@ ${n}`:n}function wL(t,e){if(t!=="kimi"||!e.includes("notifications/initialized")
1627
1627
  JOIN run r ON r.id = s.run_id
1628
1628
  JOIN job j ON j.id = r.job_id
1629
1629
  WHERE j.project_id = ? AND s.outcome IS NOT NULL
1630
- ${r!==null?"AND r.started_at >= ?":""}`,...s),o=new Map,a=0,l=0;for(let y of i){let S=o.get(y.state_name)??{total:0,rc:0};S.total++,y.outcome==="request_changes"&&S.rc++,o.set(y.state_name,S),a++,y.outcome==="request_changes"&&l++}let c=[...o.entries()].map(([y,S])=>({state_name:y,total:S.total,request_changes:S.rc,rate_pct:S.total>0?`${(S.rc/S.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,
1630
+ ${r!==null?"AND r.started_at >= ?":""}`,...s),o=new Map,a=0,l=0;for(let w of i){let S=o.get(w.state_name)??{total:0,rc:0};S.total++,w.outcome==="request_changes"&&S.rc++,o.set(w.state_name,S),a++,w.outcome==="request_changes"&&l++}let c=[...o.entries()].map(([w,S])=>({state_name:w,total:S.total,request_changes:S.rc,rate_pct:S.total>0?`${(S.rc/S.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,
1631
1631
  CAST((julianday(s.ended_at) - julianday(s.started_at)) * 86400000 AS INTEGER) AS duration_ms
1632
1632
  FROM step s
1633
1633
  JOIN run r ON r.id = s.run_id
@@ -1639,14 +1639,14 @@ ${n}`:n}function wL(t,e){if(t!=="kimi"||!e.includes("notifications/initialized")
1639
1639
  JOIN job j ON j.id = r.job_id
1640
1640
  WHERE j.project_id = ? AND s.ended_at IS NULL
1641
1641
  ${r!==null?"AND r.started_at >= ?":""}
1642
- GROUP BY s.state_name`,...f),p=new Map;for(let y of d){let S=p.get(y.state_name)??{lt5:0,btw5_15:0,btw15_60:0,gt60:0,noEnd:0},k=y.duration_ms;k<3e5?S.lt5++:k<9e5?S.btw5_15++:k<36e5?S.btw15_60++:S.gt60++,p.set(y.state_name,S)}for(let y of m){let S=p.get(y.state_name)??{lt5:0,btw5_15:0,btw15_60:0,gt60:0,noEnd:0};S.noEnd+=y.cnt,p.set(y.state_name,S)}let _=[...p.entries()].map(([y,S])=>({state_name:y,lt_5min:S.lt5,btw_5_15min:S.btw5_15,btw_15_60min:S.btw15_60,gt_60min:S.gt60,no_end:S.noEnd})),h=t.query(`SELECT s.state_name, s.run_id, COUNT(*) AS attempt_count
1642
+ GROUP BY s.state_name`,...f),p=new Map;for(let w of d){let S=p.get(w.state_name)??{lt5:0,btw5_15:0,btw15_60:0,gt60:0,noEnd:0},k=w.duration_ms;k<3e5?S.lt5++:k<9e5?S.btw5_15++:k<36e5?S.btw15_60++:S.gt60++,p.set(w.state_name,S)}for(let w of m){let S=p.get(w.state_name)??{lt5:0,btw5_15:0,btw15_60:0,gt60:0,noEnd:0};S.noEnd+=w.cnt,p.set(w.state_name,S)}let _=[...p.entries()].map(([w,S])=>({state_name:w,lt_5min:S.lt5,btw_5_15min:S.btw5_15,btw_15_60min:S.btw15_60,gt_60min:S.gt60,no_end:S.noEnd})),h=t.query(`SELECT s.state_name, s.run_id, COUNT(*) AS attempt_count
1643
1643
  FROM step s
1644
1644
  JOIN run r ON r.id = s.run_id
1645
1645
  JOIN job j ON j.id = r.job_id
1646
1646
  WHERE j.project_id = ?
1647
1647
  ${r!==null?"AND r.started_at >= ?":""}
1648
1648
  GROUP BY s.run_id, s.state_name
1649
- HAVING COUNT(*) > 1`,...s),g=new Map;for(let y of h){let S=g.get(y.state_name)??{runs:0,total_attempts:0};S.runs++,S.total_attempts+=y.attempt_count,g.set(y.state_name,S)}let w=[...g.entries()].map(([y,S])=>({state_name:y,retried_runs:S.runs,avg_retries:S.runs>0?Number((S.total_attempts/S.runs).toFixed(2)):0}));return{request_changes_rate:u,step_duration_histogram:_,retry_counts:w}}function iu(t,e={}){let n=e.since_days!==void 0?Date.now()-Math.trunc(e.since_days)*864e5:0,r=e.project_id!==void 0?t.query(`SELECT json_extract(se.payload, '$.tool') AS tool_name, COUNT(*) AS cnt
1649
+ HAVING COUNT(*) > 1`,...s),g=new Map;for(let w of h){let S=g.get(w.state_name)??{runs:0,total_attempts:0};S.runs++,S.total_attempts+=w.attempt_count,g.set(w.state_name,S)}let y=[...g.entries()].map(([w,S])=>({state_name:w,retried_runs:S.runs,avg_retries:S.runs>0?Number((S.total_attempts/S.runs).toFixed(2)):0}));return{request_changes_rate:u,step_duration_histogram:_,retry_counts:y}}function iu(t,e={}){let n=e.since_days!==void 0?Date.now()-Math.trunc(e.since_days)*864e5:0,r=e.project_id!==void 0?t.query(`SELECT json_extract(se.payload, '$.tool') AS tool_name, COUNT(*) AS cnt
1650
1650
  FROM session_event se
1651
1651
  JOIN run r ON r.id = se.run_id
1652
1652
  JOIN job j ON j.id = r.job_id
@@ -1689,17 +1689,17 @@ ${n}`:n}function wL(t,e){if(t!=="kimi"||!e.includes("notifications/initialized")
1689
1689
  json_extract(payload, '$.elapsedMs') ASC`,n),o=new Map;for(let l of i){let c=o.get(l.tool_name)??[];c.push(l.elapsed_ms),o.set(l.tool_name,c)}let a=new Map(s.map(l=>[l.tool_name,l.cnt]));return r.map(l=>{let c=a.get(l.tool_name)??0,u=o.get(l.tool_name)??[],d=u.length>0?u.reduce((p,_)=>p+_,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 Sy(t){try{let e=JSON.parse(t);if(e.schema_version==="lmctl/v3"&&Array.isArray(e.steps)){let n=[],r=new Map,s=new Map;for(let i of e.steps){let o=typeof i.id=="string"?i.id:null;o!==null&&(n.push(o),typeof i.type=="string"&&s.set(o,i.type),typeof i.name=="string"&&i.name.length>0&&r.set(i.name,o))}return{schema:"v3",nodes:n,nodeTypes:s,nameToId:r}}if(e.states!==null&&typeof e.states=="object"){let n=e.states,r=new Map;for(let[l,c]of Object.entries(n))if(c!==null&&typeof c=="object"){let u=c.type;typeof u=="string"&&r.set(l,u)}let s=typeof e.start_at=="string"?e.start_at:null,i=Object.keys(n),o=s!==null&&i.includes(s)?[s,...i.filter(l=>l!==s)]:i,a=e.terminals!==null&&typeof e.terminals=="object"?Object.keys(e.terminals).map(l=>`@terminal:${l}`):[];for(let l of a)r.set(l,"Terminal");return{schema:"v2",nodes:[...o,...a],nodeTypes:r,nameToId:new Map}}}catch{}return{schema:"unknown",nodes:[],nodeTypes:new Map,nameToId:new Map}}function Dr(t,e){let n=t.query("SELECT * FROM run WHERE id = ?",e)[0];if(n===void 0)return null;let r=t.query("SELECT * FROM workflow WHERE id = ?",n.workflow_id)[0]??null,s=(()=>{let h=t.query("SELECT * FROM job WHERE id = ?",n.job_id)[0];return h===void 0?null:t.query("SELECT * FROM project WHERE id = ?",h.project_id)[0]?.name??null})(),i=r!==null?Sy(r.definition):{schema:"unknown",nodes:[],nodeTypes:new Map,nameToId:new Map},o=t.query("SELECT * FROM step WHERE run_id = ? ORDER BY id ASC",e),a=h=>i.schema==="v3"&&i.nameToId.has(h)?i.nameToId.get(h):h,l=new Map;for(let h of o)l.set(a(h.state_name),h);let c=t.query(`SELECT state_name, status, last_agent_output
1690
1690
  FROM interactive_session
1691
1691
  WHERE run_id = ? AND status = 'waiting_operator'
1692
- 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 h=o.find(g=>g.ended_at===null);h!==void 0?d=a(h.state_name):o.length>0?d=a(o[o.length-1].state_name):d=n.current_state}n.terminal_state!==null&&(d=`@terminal:${n.terminal_state}`,f=null);let m=new Set,p=[...i.nodes];for(let h of o){let g=a(h.state_name);!i.nodes.includes(g)&&!p.includes(g)&&p.push(g)}d!==null&&!p.includes(d)&&p.push(d);let _=[];for(let h of p){if(m.has(h))continue;m.add(h);let g=h===d,w=l.get(h),y="pending",S=null;if(h.startsWith("@terminal:"))y=n.terminal_state===h.slice(10)?"done":"pending";else if(w!==void 0&&(w.ended_at===null?y=g&&u===h?"paused":"running":w.outcome===null?y="failed":y="done",w.ended_at!==null)){let k=Date.parse(w.started_at),b=Date.parse(w.ended_at);!Number.isNaN(k)&&!Number.isNaN(b)&&(S=b-k)}g&&u===h&&(y="paused"),_.push({id:h,status:y,is_current:g,elapsed_ms:S,prompt:g&&y==="paused"?f:null,expected:g&&y==="paused"?"free_text":null})}return{run_id:e,workflow_name:r?.name??null,workflow_version:r?.version??null,workflow_version_id:n.workflow_version_id,project:s,paused:n.paused_at!==null&&n.terminal_state===null,terminal_state:n.terminal_state,current_state:d,nodes:_}}function Ho(t){let e=[],n=t.workflow_name??"?",r=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} (${n}, ${r}) - ${s}`),t.project!==null&&e.push(`project: ${t.project}`),e.push(""),e.push("workflow tree:");for(let i of t.nodes)e.push(...u$(i));return`${e.join(`
1692
+ 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 h=o.find(g=>g.ended_at===null);h!==void 0?d=a(h.state_name):o.length>0?d=a(o[o.length-1].state_name):d=n.current_state}n.terminal_state!==null&&(d=`@terminal:${n.terminal_state}`,f=null);let m=new Set,p=[...i.nodes];for(let h of o){let g=a(h.state_name);!i.nodes.includes(g)&&!p.includes(g)&&p.push(g)}d!==null&&!p.includes(d)&&p.push(d);let _=[];for(let h of p){if(m.has(h))continue;m.add(h);let g=h===d,y=l.get(h),w="pending",S=null;if(h.startsWith("@terminal:"))w=n.terminal_state===h.slice(10)?"done":"pending";else if(y!==void 0&&(y.ended_at===null?w=g&&u===h?"paused":"running":y.outcome===null?w="failed":w="done",y.ended_at!==null)){let k=Date.parse(y.started_at),b=Date.parse(y.ended_at);!Number.isNaN(k)&&!Number.isNaN(b)&&(S=b-k)}g&&u===h&&(w="paused"),_.push({id:h,status:w,is_current:g,elapsed_ms:S,prompt:g&&w==="paused"?f:null,expected:g&&w==="paused"?"free_text":null})}return{run_id:e,workflow_name:r?.name??null,workflow_version:r?.version??null,workflow_version_id:n.workflow_version_id,project:s,paused:n.paused_at!==null&&n.terminal_state===null,terminal_state:n.terminal_state,current_state:d,nodes:_}}function Ho(t){let e=[],n=t.workflow_name??"?",r=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} (${n}, ${r}) - ${s}`),t.project!==null&&e.push(`project: ${t.project}`),e.push(""),e.push("workflow tree:");for(let i of t.nodes)e.push(...u$(i));return`${e.join(`
1693
1693
  `)}
1694
1694
  `}function u$(t){let e=[],n=f$(t.status),r=[];t.status==="done"&&t.elapsed_ms!==null?r.push(`done, ${(t.elapsed_ms/1e3).toFixed(1)}s`):t.status==="failed"?r.push("failed"):t.status==="paused"?r.push("paused, waiting for operator input"):t.status==="running"?r.push("running"):t.status==="pending"&&r.push("pending");let s=r.length>0?`(${r.join(", ")})`:"",i=t.is_current?" <- CURRENT":"",o=t.id.padEnd(28);if(e.push(` ${n} ${o} ${s}${i}`.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 f$(t){switch(t){case"done":return"[x]";case"failed":return"[!]";case"paused":return"[*]";case"running":return"[>]";case"pending":return"[ ]";default:return" "}}function Xo(t,e,n={}){let r=n.nowMs??Date.now(),s=t.query("SELECT * FROM run WHERE id = ?",e)[0];if(s===void 0)return null;let i=t.query("SELECT * FROM workflow WHERE id = ?",s.workflow_id)[0]??null,o=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=i!==null?Sy(i.definition):{schema:"unknown",nodes:[],nodeTypes:new Map,nameToId:new Map},u=k=>c.schema==="v3"&&c.nameToId.has(k)?c.nameToId.get(k):k,d=t.query("SELECT * FROM step WHERE run_id = ? ORDER BY id ASC",e),f=new Map;for(let k of d)f.set(u(k.state_name),k);let m=t.query("SELECT * FROM interactive_session WHERE run_id = ? ORDER BY id ASC",e),p=new Map;for(let k of m)p.set(u(k.state_name),k);let _=new Map,h=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 k of t.query(`SELECT step_id, MAX(timestamp_ms) AS timestamp_ms
1695
1695
  FROM session_event
1696
1696
  WHERE run_id = ? AND step_id IS NOT NULL
1697
- GROUP BY step_id`,e))k.step_id!==null&&_.set(k.step_id,k.timestamp_ms);let g=m$(c,d,u),w=p$(s.current_state),y=t.query(`SELECT kind, severity, payload
1697
+ GROUP BY step_id`,e))k.step_id!==null&&_.set(k.step_id,k.timestamp_ms);let g=m$(c,d,u),y=p$(s.current_state),w=t.query(`SELECT kind, severity, payload
1698
1698
  FROM attention
1699
1699
  WHERE run_id = ?
1700
1700
  AND kind = 'session_hung'
1701
1701
  AND acknowledged_at IS NULL
1702
- ORDER BY id ASC`,e).map(k=>({kind:k.kind,severity:k.severity,payload:T$(k.payload)})),S=g.map(k=>{let b=f.get(k),M=p.get(k),U=_$(s,k,w,b,M),P=b===void 0?null:Date.parse(b.started_at),x=b?.ended_at===null||b===void 0?null:Date.parse(b.ended_at),R=b===void 0||Number.isNaN(P??NaN)?null:x!==null&&!Number.isNaN(x)?x-P:U==="running"||U==="paused"?r-P:null,re=b===void 0?null:_.get(b.id)??null,X=S$(M?.last_activity_at??null,re,h),N=i===null||M===void 0?void 0:y$(t,s.team_id,i.definition,M.state_name,b?.state_name??k);return{step_id:b?.id??null,state_id:k,status:U,started_at:b?.started_at??null,ended_at:b?.ended_at??null,last_activity_at:X,elapsed_ms:R,...N!==void 0?{member:N}:{},...M!==void 0?{interactive_session:{id:M.id,status:M.status,turn_count:M.turn_count,state_name:M.state_name}}:{}}});return{run_id:e,workflow_name:i?.name??null,workflow_version:o?.version??i?.version??null,workflow_version_id:s.workflow_version_id,project:l?.name??null,status:g$(s,a,S),submitted_at:a?.enqueued_at??s.started_at,nodes:S,current_node_index:h$(S,s.terminal_state!==null),related_attentions:y}}function Jo(t,e={}){let n=e.nowMs??Date.now(),r=[],s=t.workflow_name??"?",i=t.workflow_version!==null?`v${t.workflow_version}`:"v?";r.push(`run ${t.run_id} - ${s}, ${i} - ${t.status}`);let o=`${t.submitted_at} (${dy(Date.parse(t.submitted_at),n)} ago)`;r.push(`project: ${t.project??"?"} | submitted: ${o}`),r.push(""),r.push("timeline:"),r.push(`${cy(t.submitted_at,t.submitted_at)} submit`);for(let a of t.nodes){let l=a.started_at===null?"[ ]":cy(t.submitted_at,a.started_at),c=a.status.padEnd(7),u=a.elapsed_ms===null?"":` elapsed ${Go(a.elapsed_ms)}`;if(r.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 ${dy(a.last_activity_at,n)} ago`,f=a.member!==void 0?`${a.member.alias} member`:"interactive member";r.push(` ${" ".repeat(24)} ${d}`),r.push(` ${" ".repeat(24)} ${f}, ${a.interactive_session.status}`)}}if(t.related_attentions.length>0){r.push(""),r.push("attentions:");for(let a of t.related_attentions)r.push(`- ${a.kind}${v$(a.payload)}`)}return`${r.join(`
1702
+ ORDER BY id ASC`,e).map(k=>({kind:k.kind,severity:k.severity,payload:T$(k.payload)})),S=g.map(k=>{let b=f.get(k),M=p.get(k),U=_$(s,k,y,b,M),P=b===void 0?null:Date.parse(b.started_at),x=b?.ended_at===null||b===void 0?null:Date.parse(b.ended_at),R=b===void 0||Number.isNaN(P??NaN)?null:x!==null&&!Number.isNaN(x)?x-P:U==="running"||U==="paused"?r-P:null,re=b===void 0?null:_.get(b.id)??null,X=S$(M?.last_activity_at??null,re,h),N=i===null||M===void 0?void 0:y$(t,s.team_id,i.definition,M.state_name,b?.state_name??k);return{step_id:b?.id??null,state_id:k,status:U,started_at:b?.started_at??null,ended_at:b?.ended_at??null,last_activity_at:X,elapsed_ms:R,...N!==void 0?{member:N}:{},...M!==void 0?{interactive_session:{id:M.id,status:M.status,turn_count:M.turn_count,state_name:M.state_name}}:{}}});return{run_id:e,workflow_name:i?.name??null,workflow_version:o?.version??i?.version??null,workflow_version_id:s.workflow_version_id,project:l?.name??null,status:g$(s,a,S),submitted_at:a?.enqueued_at??s.started_at,nodes:S,current_node_index:h$(S,s.terminal_state!==null),related_attentions:w}}function Jo(t,e={}){let n=e.nowMs??Date.now(),r=[],s=t.workflow_name??"?",i=t.workflow_version!==null?`v${t.workflow_version}`:"v?";r.push(`run ${t.run_id} - ${s}, ${i} - ${t.status}`);let o=`${t.submitted_at} (${dy(Date.parse(t.submitted_at),n)} ago)`;r.push(`project: ${t.project??"?"} | submitted: ${o}`),r.push(""),r.push("timeline:"),r.push(`${cy(t.submitted_at,t.submitted_at)} submit`);for(let a of t.nodes){let l=a.started_at===null?"[ ]":cy(t.submitted_at,a.started_at),c=a.status.padEnd(7),u=a.elapsed_ms===null?"":` elapsed ${Go(a.elapsed_ms)}`;if(r.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 ${dy(a.last_activity_at,n)} ago`,f=a.member!==void 0?`${a.member.alias} member`:"interactive member";r.push(` ${" ".repeat(24)} ${d}`),r.push(` ${" ".repeat(24)} ${f}, ${a.interactive_session.status}`)}}if(t.related_attentions.length>0){r.push(""),r.push("attentions:");for(let a of t.related_attentions)r.push(`- ${a.kind}${v$(a.payload)}`)}return`${r.join(`
1703
1703
  `)}
1704
1704
  `}function m$(t,e,n){let r=t.nodes.filter(s=>s.startsWith("@terminal:")?!1:t.nodeTypes.get(s)!=="lmctl/terminal"&&t.nodeTypes.get(s)!=="Terminal");for(let s of e){let i=n(s.state_name);r.includes(i)||r.push(i)}return r}function p$(t){return t===null?null:t.startsWith("__paused__:")?t.slice(11):t}function _$(t,e,n,r,s){return r===void 0?"pending":r.ended_at===null?s?.status==="waiting_operator"||t.paused_at!==null&&n===e?"paused":"running":r.outcome===null?"failed":"done"}function h$(t,e){if(t.length===0)return null;let n=t.findIndex(s=>s.status==="running"||s.status==="paused"||s.status==="failed");if(n>=0)return n;if(e){for(let s=t.length-1;s>=0;s-=1)if(t[s].status==="done")return s}let r=t.findIndex(s=>s.status==="pending");return r>=0?r:t.length-1}function g$(t,e,n){return t.terminal_state!==null?t.terminal_state:t.paused_at!==null?"paused":e?.status==="failed"||n.some(r=>r.status==="failed")?"failed":"running"}function y$(t,e,n,r,s){let i=w$(n,r,s);if(i===null)return;let o=t.query("SELECT * FROM team_member WHERE team_id = ? AND lower(alias) = lower(?) LIMIT 1",e,i)[0];return o===void 0?void 0:{alias:o.alias,provider:Qe(o)}}function w$(t,e,n){let r=E$(t);if(r===null)return null;if(Array.isArray(r.steps)){let s=r.steps.find(a=>An(a)?a.id===e||a.name===e||a.name===n:!1),i=An(s?.members)?s.members:null,o=i!==null&&An(i.agent)?i.agent:null;return typeof o?.alias=="string"?o.alias:null}if(An(r.states)){let s=r.states[e]??r.states[n];if(!An(s))return null;let i=An(s.agent)?s.agent:null;return typeof i?.alias=="string"?i.alias:null}return null}function E$(t){try{let e=JSON.parse(t);return An(e)?e:null}catch{return null}}function T$(t){if(t===null)return null;try{return JSON.parse(t)}catch{return t}}function An(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function S$(...t){let e=t.filter(n=>n!==null&&Number.isFinite(n));return e.length===0?null:Math.max(...e)}function cy(t,e){let n=Date.parse(t),r=Date.parse(e);return Number.isNaN(n)||Number.isNaN(r)?"[+? ]":`[+${Go(Math.max(0,r-n)).padEnd(6)}]`}function dy(t,e){return Number.isNaN(t)?"?":Go(Math.max(0,e-t))}function Go(t){let e=Math.max(0,Math.round(t/1e3));if(e<60)return`${e}s`;let n=Math.floor(e/60),r=e%60;if(n<60)return r===0?`${n}m`:`${n}m${r}s`;let s=Math.floor(n/60),i=n%60;return i===0?`${s}h`:`${s}h${i}m`}function v$(t){if(!An(t))return"";let e=typeof t.step_id=="number"?` on step ${t.step_id}`:"",n=typeof t.member_alias=="string"?t.member_alias:null,r=typeof t.provider=="string"?t.provider:null,s=typeof t.elapsed_ms=="number"?`, ${Go(t.elapsed_ms)} elapsed`:"",i=n===null?"":` (${n}${r===null?"":` ${r}`}${s})`;return`${e}${i}`}var wy,sn=E(()=>{"use strict";dt();wy=`SELECT a.id AS attention_id,
1705
1705
  a.kind AS kind,
@@ -2010,7 +2010,7 @@ and \`lmctl api escalations\` (no args) print detailed usage.
2010
2010
  and report the first step that would be started. Default output is the TTY
2011
2011
  table; --json emits the structured WorkflowVerifyReport payload.`;wM=["open","assigned","closed","reopened"]});import Fy from"jexl";function jr(t){Fy.compile(Uy(t))}async function sr(t,e){return Fy.eval(Uy(t),e)}function Uy(t){return t.replace(/([A-Za-z_$][\w$.[\]]*)\.includes\(([^()]+)\)/g,"($2 in $1)")}var qs=E(()=>{"use strict"});import{z as T}from"zod";function pu(t){let e=t.trim();return e.startsWith("={{")&&e.endsWith("}}")?e.slice(3,-2).trim():t}var CM,Wy,lu,cu,du,uu,fu,mu,qy,$M,MM,DM,Bs,jM,zo,Zo,Qo,ea,ta,By,PM,FM,UM,WM,na,Pr=E(()=>{"use strict";qs();CM=T.object({kind:T.enum(["success","neutral","failure"])}),Wy=T.enum(["string","number","boolean","object","array"]),lu=T.object({name:T.string().min(1),type:Wy,required:T.boolean().optional(),default:T.unknown().optional(),description:T.string().optional()}),cu=T.object({name:T.string().min(1),type:Wy,source_step_id:T.string().min(1),source_field:T.string().min(1),description:T.string().optional()}),du=T.object({id:T.string().min(1),type:T.string().min(1),parameters:T.record(T.string(),T.unknown()).default({})}),uu="__failure__",fu=T.object({tools:T.array(T.string().min(1)).optional(),auth:T.array(T.string().min(1)).optional()}).strict().optional(),mu=T.object({on_unhandled_failure:T.object({attention_kind:T.string().min(1).default("workflow_failed"),severity:T.enum(["warn","error","critical"]).default("warn"),capture_evidence:T.boolean().default(!0),recommend_recovery:T.string().min(1).optional()}).optional(),on_unhandled_failure_state:T.string().min(1).optional()}).optional(),qy=T.object({type:T.literal("AssertRepoClean"),fail_message:T.string().min(1).optional(),next:T.string().min(1)}),$M=T.object({name:T.string().min(1),command:T.string().min(1).optional(),args:T.array(T.string()).optional(),env:T.record(T.string(),T.string()).optional(),type:T.enum(["stdio","http","sse"]).optional(),url:T.string().min(1).optional(),headers:T.record(T.string(),T.string()).optional()}).strict(),MM=T.union([T.string().min(1),$M]),DM=T.union([T.string().min(1),T.object({name:T.string().min(1),content:T.string().min(1)}).strict()]),Bs=T.object({team:T.string().min(1),alias:T.string().min(1),prompt_template:T.string().optional(),mcp:T.array(MM).optional(),skills:T.array(DM).optional()}),jM=T.object({kind:T.literal("shell"),command:T.string().min(1),description:T.string().optional()}),zo=T.object({type:T.literal("Review"),state_name:T.string().min(1),coder:Bs,pre_checks:T.array(jM).optional(),reviewers:T.array(Bs.extend({rubric_artifact:T.string().optional()})).optional(),outcomes:T.object({approve:T.string().min(1),request_changes:T.string().optional(),fail_pre_check:T.string().optional(),max_loops_exceeded:T.string().optional()}),writes_to_project_path:T.boolean().optional(),durable_memory_tags:T.array(T.string().min(1)).optional(),write_back_durable_memory:T.union([T.boolean(),T.string().min(1)]).optional(),max_loops:T.number().int().positive().default(5),loop_feedback_artifact:T.string().optional(),outcomes_from_stance:T.record(T.string(),T.string().min(1)).optional()}).superRefine((t,e)=>{(t.reviewers??[]).length>0&&t.outcomes_from_stance!==void 0&&e.addIssue({code:"custom",path:["outcomes_from_stance"],message:"outcomes_from_stance cannot be used when reviewers is non-empty"})}),Zo=T.object({type:T.literal("Consolidate"),state_name:T.string().min(1),researchers:T.array(Bs.extend({topic:T.string().min(1)})).optional(),consolidator:Bs,outcomes:T.object({ok:T.string().min(1),error:T.string().optional()}),research_artifact_prefix:T.string().optional(),durable_memory_tags:T.array(T.string().min(1)).optional(),write_back_durable_memory:T.union([T.boolean(),T.string().min(1)]).optional()}),Qo=T.object({type:T.literal("Interactive"),state_name:T.string().min(1),agent:Bs.extend({initial_prompt_template:T.string().min(1)}),termination:T.object({operator_signal:T.boolean().default(!0),agent_signal:T.string().optional(),max_turns:T.number().int().positive().default(20),timeout_seconds:T.number().int().positive().optional()}),outcomes:T.object({done:T.string().min(1),timeout:T.string().optional()}),artifact_name:T.string().optional(),durable_memory_tags:T.array(T.string().min(1)).optional(),write_back_durable_memory:T.union([T.boolean(),T.string().min(1)]).optional()}),ea=T.object({type:T.literal("Loop"),state_name:T.string().min(1),over:T.string().min(1),item_var:T.string().min(1),body:T.string().min(1),outcomes:T.object({ok:T.string().min(1),error:T.string().optional()}),stop_on_error:T.boolean().default(!0),max_items:T.number().int().positive().default(1e3)}),ta=T.object({type:T.literal("ShellStep"),state_name:T.string().min(1),command:T.string().min(1),outcomes_from_exit:T.record(T.string(),T.string().min(1)),timeout_ms:T.number().int().nonnegative().optional(),capture_output_to:T.string().optional(),writes_to_project_path:T.boolean().optional()}),By=T.object({type:T.literal("Choice"),state_name:T.string().min(1),branches:T.array(T.object({when:T.string().min(1),next:T.string().min(1)})).default([]),default_next:T.string().min(1).optional()}).superRefine((t,e)=>{for(let[n,r]of t.branches.entries())try{jr(pu(r.when))}catch(s){let i=s instanceof Error?s.message:"invalid expression";e.addIssue({code:"custom",path:["branches",n,"when"],message:`invalid jexl expression: ${i}`})}}),PM=T.discriminatedUnion("type",[qy,zo,Zo,Qo,ea,ta,By]),FM=T.object({type:T.literal("ForEach"),state_name:T.string().min(1),items_from:T.string().min(1),mode:T.enum(["sequential","parallel"]).default("sequential"),max_concurrency:T.number().int().positive().default(1),on_item_failure:T.enum(["continue","stop"]).default("stop"),body:PM,outcomes:T.object({all_ok:T.string().min(1),any_failed:T.string().optional()})}).superRefine((t,e)=>{try{jr(pu(t.items_from))}catch(n){let r=n instanceof Error?n.message:"invalid expression";e.addIssue({code:"custom",path:["items_from"],message:`invalid jexl expression: ${r}`})}}),UM=T.object({type:T.literal("Subflow"),state_name:T.string().min(1),workflow_name:T.string().min(1),inputs:T.record(T.string(),T.string().min(1)).optional(),outcomes:T.record(T.string(),T.string().min(1))}).superRefine((t,e)=>{for(let[n,r]of Object.entries(t.inputs??{}))try{jr(pu(r))}catch(s){let i=s instanceof Error?s.message:"invalid expression";e.addIssue({code:"custom",path:["inputs",n],message:`invalid jexl expression: ${i}`})}}),WM=T.discriminatedUnion("type",[qy,zo,Zo,Qo,ea,ta,By,FM,UM]),na=T.object({name:T.string().min(1),version:T.number().int().positive(),definition_schema_version:T.union([T.literal(1),T.literal(2)]),description:T.string().optional(),estimated_duration_ms:T.number().int().nonnegative().optional(),primitive_version:T.union([T.literal(1),T.literal(2)]).default(1),start_at:T.string().min(1),states:T.record(T.string().min(1),WM),terminals:T.record(T.string().min(1),CM),errors:mu,concurrency_key:T.string().min(1).optional(),concurrent_limit:T.number().int().positive().optional(),default_task_timeout_ms:T.number().int().positive().max(216e5).optional(),inputs:T.array(lu).optional(),outputs:T.array(cu).optional(),triggers:T.array(du).optional(),read_only:T.boolean().optional(),requires:fu}).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 qM,ra,BM,HM,XM,Xt,Fr=E(()=>{"use strict";Pr();qM=/^s-[a-z0-9-]+-[a-f0-9]{4}$/,ra=Q.string().regex(qM),BM=Q.object({step_id:ra,type:Q.literal("main"),index:Q.number().int().min(0)}),HM=Q.record(ra,Q.record(Q.string().min(1),Q.array(Q.array(BM)))),XM=Q.object({id:ra,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()}),Xt=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:mu,inputs:Q.array(lu).optional(),outputs:Q.array(cu).optional(),steps:Q.array(XM).min(1),connections:HM.default({}),entry_step_id:ra,triggers:Q.array(du).optional(),read_only:Q.boolean().optional(),requires:fu}).superRefine((t,e)=>{let n=new Set;for(let[r,s]of t.steps.entries())n.has(s.id)&&e.addIssue({code:"custom",path:["steps",r,"id"],message:`duplicate step id: ${s.id}`}),n.add(s.id);n.has(t.entry_step_id)||e.addIssue({code:"custom",path:["entry_step_id"],message:`entry_step_id does not reference an existing step: ${t.entry_step_id}`});for(let[r,s]of Object.entries(t.connections)){n.has(r)||e.addIssue({code:"custom",path:["connections",r],message:`connection source does not reference an existing step: ${r}`});for(let[i,o]of Object.entries(s))for(let[a,l]of o.entries())for(let[c,u]of l.entries())n.has(u.step_id)||e.addIssue({code:"custom",path:["connections",r,i,a,c,"step_id"],message:`connection target does not reference an existing step: ${u.step_id}`})}})});function sa(t){return hu(t)}function hu(t){if(Array.isArray(t))return t.map(hu);if(t===null||typeof t!="object")return t;let e=t,n={};for(let r of Object.keys(e))n[r]=hu(e[r]);if(typeof n.type=="string"){let r=GM[n.type];r!==void 0&&(n.type=r)}return n}var _u,JM,GM,gu=E(()=>{"use strict";_u="lmctl.builtin.",JM={Review:`${_u}Review`,Research:`${_u}Research`,Consolidate:`${_u}Consolidate`},GM=Object.fromEntries(Object.entries(JM).map(([t,e])=>[e,t]))});import{readFileSync as KM}from"node:fs";function Jy(t){return VM(t)}function VM(t){let e=sa(ZM(t));if(zM(e),Gy(e)===3)return YM(e);let n=na.safeParse(e);if(!n.success)throw new on({errors:n.error.issues.map(s=>({path:s.path.length===0?"$":s.path.map(String).join("."),message:s.message}))});let r=QM(n.data);if(r.errors.length>0||r.unresolvedRefs.length>0)throw new on(r);return n.data}function YM(t){let e=Xt.safeParse(t);if(!e.success)throw new on({errors:e.error.issues.map(n=>({path:n.path.length===0?"$":n.path.map(String).join("."),message:n.message}))});return e.data}function zM(t){if(typeof t!="object"||t===null||!("definition_schema_version"in t))return;let e=Gy(t);if(!(e===null||Hy.includes(e)))throw new on({errors:[{path:"definition_schema_version",message:`unsupported definition_schema_version ${e}; supported versions: ${Hy.join(", ")}`}]})}function Gy(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 ZM(t){if(typeof t!="string")return t;let e=t.trim();return t.includes(`
2012
2012
  `)||e.startsWith("{")||e.startsWith("[")?Xy(t,"$"):e.endsWith(".json")?Xy(KM(e,"utf8"),e):t}function Xy(t,e){try{return JSON.parse(t)}catch(n){let r=n instanceof Error?n.message:"invalid JSON";throw new on({errors:[{path:e,message:`invalid JSON: ${r}`}]})}}function QM(t){let e=[],n=[],r=new Set(Object.keys(t.states));r.has(t.start_at)||n.push({state:"$",ref:t.start_at,kind:"next"}),eD(t,r,n);for(let[s,i]of Object.entries(t.states))new Set(Object.keys(t.terminals));return{errors:e,unresolvedRefs:n}}function eD(t,e,n){let r=t.errors?.on_unhandled_failure_state;r!==void 0&&(e.has(r)||n.push({state:"$",ref:r,kind:"next"}))}var Hy,on,Ky=E(()=>{"use strict";Pr();Fr();gu();Hy=[1,2,3],on=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 tD}from"node:crypto";function Vy(t,e){let n=nD(e),r=tD("sha1").update(`${t}:${e}`).digest("hex").slice(0,4);return`s-${n}-${r}`}function nD(t){let e=t.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"");return e.length>0?e:"step"}var Yy=E(()=>{"use strict";Fr()});function iD(t,e){let n=sD[t]??[],r={},s={};for(let[i,o]of Object.entries(e))n.includes(i)?s[i]=o:r[i]=o;return{params:r,members:s}}function ew(t){let e=[],n=(N,A)=>{throw new Ur([{line:N,message:A}])},r=t.split(`
2013
- `),s=[];for(let N=0;N<r.length;N+=1){let C=lD(r[N]).trim();C.length>0&&s.push({n:N+1,text:C})}s.length===0&&n(1,"empty composition: expected a `workflow <name> v<version>` header");let i=/^workflow\s+(\S+)\s+v(\d+)$/.exec(s[0].text)??n(s[0].n,`expected header \`workflow <name> v<version>\`, got: ${s[0].text}`),o=i[1],a=Number.parseInt(i[2],10),l=new Map,c=[],u=[],d=[],f,m={},p=new Map,_=new Map,h=new Map,g=(N,A,C,H,W,F)=>{l.has(N)&&n(H,`duplicate step/terminal id: ${N}`),/^[A-Za-z][\w-]*$/.test(N)||n(H,`invalid id (must start with a letter): ${N}`),l.set(N,{declId:N,type:A,params:C,line:H,isTerminal:W,...F?{members:F}:{}}),u.push(N)},w=N=>{let A=[],C=N+1;for(;C<s.length;C+=1){let H=/^([A-Za-z][\w-]*|default)\s*->\s*([A-Za-z][\w-]*)$/.exec(s[C].text);if(H===null)break;A.push({label:H[1],dst:H[2]})}return{branches:A,nextIdx:C-1}};for(let N=1;N<s.length;N+=1){let{n:A,text:C}=s[N],H=C.split(/\s+/,1)[0];if(/^meta\s*\(/.test(C)){N!==1&&n(A,"`meta(...)` must be the preamble \u2014 the FIRST line after the `workflow` header (at most one, before any construct)");let W=/^meta\s*\((.*)\)\s*$/.exec(C)??n(A,`malformed \`meta\` (expected \`meta({ "requires"?:\u2026, "default_task_timeout_ms"?:\u2026, "errors"?:\u2026, "concurrency_key"?:\u2026, "concurrent_limit"?:\u2026 })\`): ${C}`),F=Ln(W[1],A,n);for(let te of Object.keys(F))Zy.has(te)||n(A,`unknown \`meta\` key \`${te}\` \u2014 only workflow-level runtime metadata is allowed: ${[...Zy].join(", ")} (no grammar inflation; bounded)`);m=F;continue}if(H==="step"){let W=/^step\s+([A-Za-z][\w-]*)\s*=\s*([a-z][a-z0-9-]*)\s*\((.*)\)\s*$/.exec(C)??n(A,`malformed \`step\` (expected \`step <id> = <archetype>(k=v, ...)\`): ${C}`),F=W[1],te=W[2],Se=W[3],me=zy[te];me===void 0&&n(A,`unknown step type: ${te} (supported \`step\` archetypes: ${Object.keys(zy).join(", ")}; choice/terminal/loop/foreach/call/decide have their own constructs)`);let{params:Ie,members:Qt}=iD(me,Ln(Se,A,n));g(F,me,Ie,A,!1,Object.keys(Qt).length>0?Qt:void 0);continue}if(H==="trigger"){let W=/^trigger\s+([A-Za-z][\w-]*)\s*=\s*([a-z][a-z0-9-]*)\s*\((.*)\)\s*$/.exec(C)??n(A,`malformed \`trigger\` (expected \`trigger <id> = <trigger-type>({ ...json... })\`): ${C}`),F=W[1],te=W[2],Se=W[3],me=Qy[te];me===void 0&&n(A,`unknown trigger type: ${te} (registered trigger archetypes: ${Object.keys(Qy).join(", ")})`),p.has(F)&&n(A,`duplicate trigger id: ${F}`),p.set(F,{id:F,type:me,parameters:Ln(Se,A,n)});continue}if(H==="mcp"||H==="skill"){let W=new RegExp(`^${H}\\s+([A-Za-z][\\w-]*)\\s*=\\s*(.+)$`).exec(C)??n(A,`malformed \`${H}\` decl (expected \`${H} <name> = {json} | ${H} <name> = "<file|url>"\`): ${C}`),F=W[1],te=W[2].trim(),Se=H==="mcp"?_:h;Se.has(F)&&n(A,`duplicate ${H} declaration: ${F}`);let me;if(te.startsWith("{")){let Ie=Ln(te,A,n);H==="mcp"?me={...Ie,name:F}:((typeof Ie.content!="string"||Ie.content.length===0)&&n(A,`\`skill ${F}\`: inline form requires a non-empty string \`content\` (a SKILL.md body)`),me={name:F,content:Ie.content})}else{let Ie=tw(te);(typeof Ie!="string"||Ie.length===0)&&n(A,`\`${H} ${F}\`: string form must be a non-empty file path or http(s) URL`),me=Ie}Se.set(F,me);continue}if(H==="terminal"){let W=/^terminal\s+([A-Za-z][\w-]*)\s*=\s*([A-Za-z][\w-]*)(?:\s+(success|failure|neutral))?\s*$/.exec(C)??n(A,`malformed \`terminal\` (expected \`terminal <id> = <name> [success|failure|neutral]\`): ${C}`);g(W[1],"lmctl/terminal",{name:W[2],kind:W[3]??"neutral"},A,!0);continue}if(H==="seq"){let F=C.slice(3).trim().split(/\s*(->|-[a-z0-9_]+->)\s*/).map(te=>te.trim()).filter(te=>te.length>0);(F.length<3||F.length%2===0)&&n(A,`malformed \`seq\` (expected \`<id> -> <id> [ -> <id> ... ]\`, optional \`-<port>->\`): ${C}`);for(let te=0;te+2<F.length+1&&!(te+2>F.length-1);te+=2){let Se=F[te],me=F[te+1],Ie=F[te+2],Qt=me==="->"?"main":me.slice(1,-2);c.push({srcDeclId:Se,port:Qt,dstDeclId:Ie,line:A})}continue}if(H==="choice"){let F=(/^choice\s+([A-Za-z][\w-]*)\s*:$/.exec(C)??n(A,`malformed \`choice\` (expected \`choice <id>:\` then \`when <predicate> -<port>-> <id>\` lines): ${C}`))[1],te=[],Se,me=N+1;for(;me<s.length;me+=1){let Ie=s[me].text,Qt=/^when\s+(.+)\s+-([a-z0-9_]+)->\s+([A-Za-z][\w-]*)$/.exec(Ie);if(Qt!==null){Se!==void 0&&n(s[me].n,`\`choice ${F}\`: a \`when\` branch may not follow \`default\` (branches are ordered, default is the fallback)`);let fs=Qt[2];te.push({when:Qt[1].trim(),next:`@terminal:${fs}`}),c.push({srcDeclId:F,port:fs,dstDeclId:Qt[3],line:s[me].n});continue}let Bl=/^default\s+-([a-z0-9_]+)->\s+([A-Za-z][\w-]*)$/.exec(Ie);if(Bl!==null){Se!==void 0&&n(s[me].n,`\`choice ${F}\` has more than one \`default\``);let fs=Bl[1];Se=`@terminal:${fs}`,c.push({srcDeclId:F,port:fs,dstDeclId:Bl[2],line:s[me].n});continue}break}te.length===0&&n(A,`\`choice ${F}\` has no \`when\` branches (need \u22651 \`when <jexl-predicate> -<port>-> <id>\`)`),g(F,"lmctl/choice",{branches:te,...Se!==void 0?{default_next:Se}:{}},A,!1),N=me-1;continue}if(H==="loop"){let W=/^loop\s+([A-Za-z][\w-]*)\s*=\s*loop\s*\((.*)\)\s*$/.exec(C)??n(A,`malformed \`loop\` (expected \`loop <id> = loop(k=v, ...)\`): ${C}`);g(W[1],"lmctl/loop",Ln(W[2],A,n),A,!1);continue}if(H==="foreach"){let W=/^foreach\s+([A-Za-z][\w-]*)\s*=\s*foreach\s*\((.*)\)\s*$/.exec(C)??n(A,`malformed \`foreach\` (expected \`foreach <id> = foreach(items=<expr>, ...)\`): ${C}`),F=Ln(W[2],A,n);"mode"in F&&n(A,"foreach is SEQUENTIAL-ONLY: `mode` is not permitted (single-thread; durable-memory/composition-language-design.md \xA7Execution model)"),g(W[1],"lmctl/foreach",F,A,!1);continue}if(H==="call"){let W=/^call\s+([A-Za-z][\w-]*)\s*=\s*call\s*\((.*)\)\s*$/.exec(C)??n(A,`malformed \`call\` (expected \`call <id> = call(workflow=<name>, ...)\`): ${C}`),F=W[1],te=Ln(W[2],A,n),Se=te.workflow;(typeof Se!="string"||Se.length===0)&&n(A,`\`call ${F}\` requires a \`workflow=<name>\` argument`);let{workflow:me,...Ie}=te;g(F,"lmctl/subflow",{workflow_name:Se,...Ie},A,!1),d.push({declId:F,target:Se,line:A});continue}if(H==="decide"){let W=/^decide\s+([A-Za-z][\w-]*)\s+by\s+agent\s*\((.*)\)\s*:$/.exec(C)??n(A,`malformed \`decide\` (expected \`decide <id> by agent(k=v, ...):\`): ${C}`),F=W[1],te=Ln(W[2],A,n),{branches:Se,nextIdx:me}=w(N);Se.length===0&&n(A,`\`decide ${F}\` has no outcomes (need at least one \`<outcome> -> <id>\`)`),g(F,"lmctl/interactive",{termination:{operator_signal:!0}},A,!1,{agent:te});for(let Ie of Se)c.push({srcDeclId:F,port:Ie.label,dstDeclId:Ie.dst,line:A});N=me;continue}if(H==="entry"){let W=/^entry\s+([A-Za-z][\w-]*)$/.exec(C)??n(A,`malformed \`entry\` (expected \`entry <id>\`): ${C}`);f!==void 0&&n(A,`duplicate \`entry\` (already set to ${f})`),f=W[1];continue}n(A,`unknown statement \`${H}\` (grammar: workflow / meta / trigger / mcp / skill / step / terminal / seq / choice / loop / foreach / call / decide / entry)`)}u.length===0&&n(s[0].n,"composition declares no steps"),f===void 0&&(f=u[0]),l.has(f)||n(s[0].n,`entry references undeclared step: ${f}`);let y=N=>{if(Array.isArray(N)){for(let C of N)y(C);return}if(typeof N!="object"||N===null)return;let A=N;if(typeof A.alias=="string")for(let[C,H]of[["mcp",_],["skills",h]]){let W=A[C];Array.isArray(W)&&(A[C]=W.map(F=>typeof F=="string"&&H.has(F)?structuredClone(H.get(F)):F))}for(let C of Object.values(A))y(C)};for(let N of u){let A=l.get(N);A.members!==void 0&&y(A.members)}let S=N=>Vy(o,N),k=u.map(N=>{let A=l.get(N);return{id:S(N),name:N,type:A.type,typeVersion:1,parameters:A.params,...A.members?{members:A.members}:{}}}),b={};for(let N of c){l.has(N.srcDeclId)||n(N.line,`edge source references undeclared step: ${N.srcDeclId}`),l.has(N.dstDeclId)||n(N.line,`dangling edge target: ${N.dstDeclId} is not declared`),l.get(N.srcDeclId).isTerminal&&n(N.line,`terminal \`${N.srcDeclId}\` cannot have an outgoing edge`);let A=S(N.srcDeclId);b[A]??={},b[A][N.port]!==void 0&&n(N.line,`duplicate edge port \`${N.port}\` on step \`${N.srcDeclId}\``),b[A][N.port]=[[{step_id:S(N.dstDeclId),type:"main",index:0}]]}for(let N of u){let A=l.get(N);oD.has(A.type)||n(A.line,`unknown archetype \`${A.type}\` for step \`${N}\` \u2014 not a registered builtin (src/engine/archetypes/index.ts:17-32)`)}for(let N of d)N.target===o&&n(N.line,`subflow cycle: \`call ${N.declId}\` invokes this workflow (\`${o}\`) \u2014 direct recursion is not allowed (cross-workflow A\u2192B\u2192A cycle detection is deferred to the M3 compile.ts seam)`);let M=new Map;for(let N of c){let A=M.get(N.srcDeclId);A===void 0?M.set(N.srcDeclId,[N.dstDeclId]):A.push(N.dstDeclId)}for(let N of u){let A=l.get(N);if(A.type!=="lmctl/loop")continue;let C=A.params.body;if(typeof C=="string"&&l.has(C)){let H=M.get(N);H===void 0?M.set(N,[C]):H.push(C)}}let U=new Set([f]),P=[f];for(;P.length>0;){let N=P.shift();for(let A of M.get(N)??[])U.has(A)||(U.add(A),P.push(A))}for(let N of u)U.has(N)||n(l.get(N).line,`step \`${N}\` is unreachable from entry \`${f}\``);let x=new Map;for(let N of c){let A=x.get(N.srcDeclId);A===void 0&&(A=new Set,x.set(N.srcDeclId,A)),A.add(N.port)}let R=new Set(["approve","request_changes","fail_pre_check","max_loops_exceeded"]);for(let N of u){let A=l.get(N);if(A.isTerminal)continue;let C=x.get(N)??new Set;if(A.type==="lmctl/review"){let W=[...C].some(F=>!R.has(F));!C.has("approve")&&!W&&n(A.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=aD[A.type];if(H!==void 0)for(let W of H)C.has(W)||n(A.line,`uncovered outcome: required outcome \`${W}\` of step \`${N}\` (\`${A.type}\`) has no connection \u2014 route it (\`seq ${N} -${W}-> <target|terminal>\`)`);else C.size===0&&n(A.line,`uncovered outcome: non-terminal step \`${N}\` (\`${A.type}\`) has no outgoing connection \u2014 wire it with \`seq\` or route to a \`terminal\``)}for(let N of u){let A=l.get(N),C=rD[A.type];if(C===void 0)continue;let H={...A.params,...A.members??{},type:C.v2type,state_name:N,...Object.keys(C.outcomes).length>0?{outcomes:C.outcomes}:{}},W=C.schema.safeParse(H);if(!W.success){let F=W.error.issues[0],te=F.path.length===0?"$":F.path.map(String).join(".");n(A.line,`step \`${N}\` (\`${A.type}\`) has invalid params for archetype \`${C.v2type}\` at \`${te}\`: ${F.message} \u2014 this would crash the engine (it derefs this field unguarded). Provide it via the structured form: \`step ${N} = ${A.type.replace("lmctl/","")}({ ... })\``)}}let re={schema_version:"lmctl/v3",definition_schema_version:3,name:o,version:a,...m,...p.size>0?{triggers:[...p.values()]}:{},steps:k,connections:b,entry_step_id:S(f)},X=Xt.safeParse(re);if(!X.success)throw new Ur(X.error.issues.map(N=>({line:s[0].n,message:`emitted V3 invalid at ${N.path.length===0?"$":N.path.map(String).join(".")}: ${N.message}`})));return X.data}function lD(t){let e=null;for(let n=0;n<t.length;n+=1){let r=t[n];if(e!==null){if(r==="\\"){n+=1;continue}r===e&&(e=null);continue}if(r==='"'||r==="'"){e=r;continue}if(r==="#")return t.slice(0,n)}return t}function Ln(t,e,n){let r=t.trim();if(r.length===0)return{};if(r.startsWith("{")){let i;try{i=JSON.parse(r)}catch(o){n(e,`malformed structured args (expected a single-line JSON object): ${o.message}`)}return(i===null||typeof i!="object"||Array.isArray(i))&&n(e,"structured args must be a JSON object"),i}let s={};for(let i of cD(r)){let o=i.indexOf("=");o===-1&&n(e,`malformed arg (expected k=v): ${i}`);let a=i.slice(0,o).trim(),l=i.slice(o+1).trim();/^[A-Za-z_][\w-]*$/.test(a)||n(e,`invalid arg name: ${a}`),s[a]=tw(l)}return s}function cD(t){return t.split(",").map(e=>e.trim()).filter(e=>e.length>0)}function tw(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 rD,sD,zy,Ur,oD,aD,Zy,Qy,nw=E(()=>{"use strict";Fr();Yy();Pr();rD={"lmctl/review":{v2type:"Review",outcomes:{approve:"_"},schema:zo},"lmctl/consolidate":{v2type:"Consolidate",outcomes:{ok:"_"},schema:Zo},"lmctl/interactive":{v2type:"Interactive",outcomes:{done:"_"},schema:Qo},"lmctl/loop":{v2type:"Loop",outcomes:{ok:"_"},schema:ea},"lmctl/shell-step":{v2type:"ShellStep",outcomes:{},schema:ta}},sD={"lmctl/review":["coder","reviewers"],"lmctl/consolidate":["researchers","consolidator"],"lmctl/interactive":["agent"]};zy={review:"lmctl/review",consolidate:"lmctl/consolidate",interactive:"lmctl/interactive","shell-step":"lmctl/shell-step","assert-repo-clean":"lmctl/assert-repo-clean","render-docx":"lmctl/render-docx","render-xlsx":"lmctl/render-xlsx"},Ur=class extends Error{issues;constructor(e){super(`composition DSL compile failed:
2013
+ `),s=[];for(let N=0;N<r.length;N+=1){let C=lD(r[N]).trim();C.length>0&&s.push({n:N+1,text:C})}s.length===0&&n(1,"empty composition: expected a `workflow <name> v<version>` header");let i=/^workflow\s+(\S+)\s+v(\d+)$/.exec(s[0].text)??n(s[0].n,`expected header \`workflow <name> v<version>\`, got: ${s[0].text}`),o=i[1],a=Number.parseInt(i[2],10),l=new Map,c=[],u=[],d=[],f,m={},p=new Map,_=new Map,h=new Map,g=(N,A,C,H,W,F)=>{l.has(N)&&n(H,`duplicate step/terminal id: ${N}`),/^[A-Za-z][\w-]*$/.test(N)||n(H,`invalid id (must start with a letter): ${N}`),l.set(N,{declId:N,type:A,params:C,line:H,isTerminal:W,...F?{members:F}:{}}),u.push(N)},y=N=>{let A=[],C=N+1;for(;C<s.length;C+=1){let H=/^([A-Za-z][\w-]*|default)\s*->\s*([A-Za-z][\w-]*)$/.exec(s[C].text);if(H===null)break;A.push({label:H[1],dst:H[2]})}return{branches:A,nextIdx:C-1}};for(let N=1;N<s.length;N+=1){let{n:A,text:C}=s[N],H=C.split(/\s+/,1)[0];if(/^meta\s*\(/.test(C)){N!==1&&n(A,"`meta(...)` must be the preamble \u2014 the FIRST line after the `workflow` header (at most one, before any construct)");let W=/^meta\s*\((.*)\)\s*$/.exec(C)??n(A,`malformed \`meta\` (expected \`meta({ "requires"?:\u2026, "default_task_timeout_ms"?:\u2026, "errors"?:\u2026, "concurrency_key"?:\u2026, "concurrent_limit"?:\u2026 })\`): ${C}`),F=Ln(W[1],A,n);for(let te of Object.keys(F))Zy.has(te)||n(A,`unknown \`meta\` key \`${te}\` \u2014 only workflow-level runtime metadata is allowed: ${[...Zy].join(", ")} (no grammar inflation; bounded)`);m=F;continue}if(H==="step"){let W=/^step\s+([A-Za-z][\w-]*)\s*=\s*([a-z][a-z0-9-]*)\s*\((.*)\)\s*$/.exec(C)??n(A,`malformed \`step\` (expected \`step <id> = <archetype>(k=v, ...)\`): ${C}`),F=W[1],te=W[2],Se=W[3],me=zy[te];me===void 0&&n(A,`unknown step type: ${te} (supported \`step\` archetypes: ${Object.keys(zy).join(", ")}; choice/terminal/loop/foreach/call/decide have their own constructs)`);let{params:Ie,members:Qt}=iD(me,Ln(Se,A,n));g(F,me,Ie,A,!1,Object.keys(Qt).length>0?Qt:void 0);continue}if(H==="trigger"){let W=/^trigger\s+([A-Za-z][\w-]*)\s*=\s*([a-z][a-z0-9-]*)\s*\((.*)\)\s*$/.exec(C)??n(A,`malformed \`trigger\` (expected \`trigger <id> = <trigger-type>({ ...json... })\`): ${C}`),F=W[1],te=W[2],Se=W[3],me=Qy[te];me===void 0&&n(A,`unknown trigger type: ${te} (registered trigger archetypes: ${Object.keys(Qy).join(", ")})`),p.has(F)&&n(A,`duplicate trigger id: ${F}`),p.set(F,{id:F,type:me,parameters:Ln(Se,A,n)});continue}if(H==="mcp"||H==="skill"){let W=new RegExp(`^${H}\\s+([A-Za-z][\\w-]*)\\s*=\\s*(.+)$`).exec(C)??n(A,`malformed \`${H}\` decl (expected \`${H} <name> = {json} | ${H} <name> = "<file|url>"\`): ${C}`),F=W[1],te=W[2].trim(),Se=H==="mcp"?_:h;Se.has(F)&&n(A,`duplicate ${H} declaration: ${F}`);let me;if(te.startsWith("{")){let Ie=Ln(te,A,n);H==="mcp"?me={...Ie,name:F}:((typeof Ie.content!="string"||Ie.content.length===0)&&n(A,`\`skill ${F}\`: inline form requires a non-empty string \`content\` (a SKILL.md body)`),me={name:F,content:Ie.content})}else{let Ie=tw(te);(typeof Ie!="string"||Ie.length===0)&&n(A,`\`${H} ${F}\`: string form must be a non-empty file path or http(s) URL`),me=Ie}Se.set(F,me);continue}if(H==="terminal"){let W=/^terminal\s+([A-Za-z][\w-]*)\s*=\s*([A-Za-z][\w-]*)(?:\s+(success|failure|neutral))?\s*$/.exec(C)??n(A,`malformed \`terminal\` (expected \`terminal <id> = <name> [success|failure|neutral]\`): ${C}`);g(W[1],"lmctl/terminal",{name:W[2],kind:W[3]??"neutral"},A,!0);continue}if(H==="seq"){let F=C.slice(3).trim().split(/\s*(->|-[a-z0-9_]+->)\s*/).map(te=>te.trim()).filter(te=>te.length>0);(F.length<3||F.length%2===0)&&n(A,`malformed \`seq\` (expected \`<id> -> <id> [ -> <id> ... ]\`, optional \`-<port>->\`): ${C}`);for(let te=0;te+2<F.length+1&&!(te+2>F.length-1);te+=2){let Se=F[te],me=F[te+1],Ie=F[te+2],Qt=me==="->"?"main":me.slice(1,-2);c.push({srcDeclId:Se,port:Qt,dstDeclId:Ie,line:A})}continue}if(H==="choice"){let F=(/^choice\s+([A-Za-z][\w-]*)\s*:$/.exec(C)??n(A,`malformed \`choice\` (expected \`choice <id>:\` then \`when <predicate> -<port>-> <id>\` lines): ${C}`))[1],te=[],Se,me=N+1;for(;me<s.length;me+=1){let Ie=s[me].text,Qt=/^when\s+(.+)\s+-([a-z0-9_]+)->\s+([A-Za-z][\w-]*)$/.exec(Ie);if(Qt!==null){Se!==void 0&&n(s[me].n,`\`choice ${F}\`: a \`when\` branch may not follow \`default\` (branches are ordered, default is the fallback)`);let fs=Qt[2];te.push({when:Qt[1].trim(),next:`@terminal:${fs}`}),c.push({srcDeclId:F,port:fs,dstDeclId:Qt[3],line:s[me].n});continue}let Bl=/^default\s+-([a-z0-9_]+)->\s+([A-Za-z][\w-]*)$/.exec(Ie);if(Bl!==null){Se!==void 0&&n(s[me].n,`\`choice ${F}\` has more than one \`default\``);let fs=Bl[1];Se=`@terminal:${fs}`,c.push({srcDeclId:F,port:fs,dstDeclId:Bl[2],line:s[me].n});continue}break}te.length===0&&n(A,`\`choice ${F}\` has no \`when\` branches (need \u22651 \`when <jexl-predicate> -<port>-> <id>\`)`),g(F,"lmctl/choice",{branches:te,...Se!==void 0?{default_next:Se}:{}},A,!1),N=me-1;continue}if(H==="loop"){let W=/^loop\s+([A-Za-z][\w-]*)\s*=\s*loop\s*\((.*)\)\s*$/.exec(C)??n(A,`malformed \`loop\` (expected \`loop <id> = loop(k=v, ...)\`): ${C}`);g(W[1],"lmctl/loop",Ln(W[2],A,n),A,!1);continue}if(H==="foreach"){let W=/^foreach\s+([A-Za-z][\w-]*)\s*=\s*foreach\s*\((.*)\)\s*$/.exec(C)??n(A,`malformed \`foreach\` (expected \`foreach <id> = foreach(items=<expr>, ...)\`): ${C}`),F=Ln(W[2],A,n);"mode"in F&&n(A,"foreach is SEQUENTIAL-ONLY: `mode` is not permitted (single-thread; durable-memory/composition-language-design.md \xA7Execution model)"),g(W[1],"lmctl/foreach",F,A,!1);continue}if(H==="call"){let W=/^call\s+([A-Za-z][\w-]*)\s*=\s*call\s*\((.*)\)\s*$/.exec(C)??n(A,`malformed \`call\` (expected \`call <id> = call(workflow=<name>, ...)\`): ${C}`),F=W[1],te=Ln(W[2],A,n),Se=te.workflow;(typeof Se!="string"||Se.length===0)&&n(A,`\`call ${F}\` requires a \`workflow=<name>\` argument`);let{workflow:me,...Ie}=te;g(F,"lmctl/subflow",{workflow_name:Se,...Ie},A,!1),d.push({declId:F,target:Se,line:A});continue}if(H==="decide"){let W=/^decide\s+([A-Za-z][\w-]*)\s+by\s+agent\s*\((.*)\)\s*:$/.exec(C)??n(A,`malformed \`decide\` (expected \`decide <id> by agent(k=v, ...):\`): ${C}`),F=W[1],te=Ln(W[2],A,n),{branches:Se,nextIdx:me}=y(N);Se.length===0&&n(A,`\`decide ${F}\` has no outcomes (need at least one \`<outcome> -> <id>\`)`),g(F,"lmctl/interactive",{termination:{operator_signal:!0}},A,!1,{agent:te});for(let Ie of Se)c.push({srcDeclId:F,port:Ie.label,dstDeclId:Ie.dst,line:A});N=me;continue}if(H==="entry"){let W=/^entry\s+([A-Za-z][\w-]*)$/.exec(C)??n(A,`malformed \`entry\` (expected \`entry <id>\`): ${C}`);f!==void 0&&n(A,`duplicate \`entry\` (already set to ${f})`),f=W[1];continue}n(A,`unknown statement \`${H}\` (grammar: workflow / meta / trigger / mcp / skill / step / terminal / seq / choice / loop / foreach / call / decide / entry)`)}u.length===0&&n(s[0].n,"composition declares no steps"),f===void 0&&(f=u[0]),l.has(f)||n(s[0].n,`entry references undeclared step: ${f}`);let w=N=>{if(Array.isArray(N)){for(let C of N)w(C);return}if(typeof N!="object"||N===null)return;let A=N;if(typeof A.alias=="string")for(let[C,H]of[["mcp",_],["skills",h]]){let W=A[C];Array.isArray(W)&&(A[C]=W.map(F=>typeof F=="string"&&H.has(F)?structuredClone(H.get(F)):F))}for(let C of Object.values(A))w(C)};for(let N of u){let A=l.get(N);A.members!==void 0&&w(A.members)}let S=N=>Vy(o,N),k=u.map(N=>{let A=l.get(N);return{id:S(N),name:N,type:A.type,typeVersion:1,parameters:A.params,...A.members?{members:A.members}:{}}}),b={};for(let N of c){l.has(N.srcDeclId)||n(N.line,`edge source references undeclared step: ${N.srcDeclId}`),l.has(N.dstDeclId)||n(N.line,`dangling edge target: ${N.dstDeclId} is not declared`),l.get(N.srcDeclId).isTerminal&&n(N.line,`terminal \`${N.srcDeclId}\` cannot have an outgoing edge`);let A=S(N.srcDeclId);b[A]??={},b[A][N.port]!==void 0&&n(N.line,`duplicate edge port \`${N.port}\` on step \`${N.srcDeclId}\``),b[A][N.port]=[[{step_id:S(N.dstDeclId),type:"main",index:0}]]}for(let N of u){let A=l.get(N);oD.has(A.type)||n(A.line,`unknown archetype \`${A.type}\` for step \`${N}\` \u2014 not a registered builtin (src/engine/archetypes/index.ts:17-32)`)}for(let N of d)N.target===o&&n(N.line,`subflow cycle: \`call ${N.declId}\` invokes this workflow (\`${o}\`) \u2014 direct recursion is not allowed (cross-workflow A\u2192B\u2192A cycle detection is deferred to the M3 compile.ts seam)`);let M=new Map;for(let N of c){let A=M.get(N.srcDeclId);A===void 0?M.set(N.srcDeclId,[N.dstDeclId]):A.push(N.dstDeclId)}for(let N of u){let A=l.get(N);if(A.type!=="lmctl/loop")continue;let C=A.params.body;if(typeof C=="string"&&l.has(C)){let H=M.get(N);H===void 0?M.set(N,[C]):H.push(C)}}let U=new Set([f]),P=[f];for(;P.length>0;){let N=P.shift();for(let A of M.get(N)??[])U.has(A)||(U.add(A),P.push(A))}for(let N of u)U.has(N)||n(l.get(N).line,`step \`${N}\` is unreachable from entry \`${f}\``);let x=new Map;for(let N of c){let A=x.get(N.srcDeclId);A===void 0&&(A=new Set,x.set(N.srcDeclId,A)),A.add(N.port)}let R=new Set(["approve","request_changes","fail_pre_check","max_loops_exceeded"]);for(let N of u){let A=l.get(N);if(A.isTerminal)continue;let C=x.get(N)??new Set;if(A.type==="lmctl/review"){let W=[...C].some(F=>!R.has(F));!C.has("approve")&&!W&&n(A.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=aD[A.type];if(H!==void 0)for(let W of H)C.has(W)||n(A.line,`uncovered outcome: required outcome \`${W}\` of step \`${N}\` (\`${A.type}\`) has no connection \u2014 route it (\`seq ${N} -${W}-> <target|terminal>\`)`);else C.size===0&&n(A.line,`uncovered outcome: non-terminal step \`${N}\` (\`${A.type}\`) has no outgoing connection \u2014 wire it with \`seq\` or route to a \`terminal\``)}for(let N of u){let A=l.get(N),C=rD[A.type];if(C===void 0)continue;let H={...A.params,...A.members??{},type:C.v2type,state_name:N,...Object.keys(C.outcomes).length>0?{outcomes:C.outcomes}:{}},W=C.schema.safeParse(H);if(!W.success){let F=W.error.issues[0],te=F.path.length===0?"$":F.path.map(String).join(".");n(A.line,`step \`${N}\` (\`${A.type}\`) has invalid params for archetype \`${C.v2type}\` at \`${te}\`: ${F.message} \u2014 this would crash the engine (it derefs this field unguarded). Provide it via the structured form: \`step ${N} = ${A.type.replace("lmctl/","")}({ ... })\``)}}let re={schema_version:"lmctl/v3",definition_schema_version:3,name:o,version:a,...m,...p.size>0?{triggers:[...p.values()]}:{},steps:k,connections:b,entry_step_id:S(f)},X=Xt.safeParse(re);if(!X.success)throw new Ur(X.error.issues.map(N=>({line:s[0].n,message:`emitted V3 invalid at ${N.path.length===0?"$":N.path.map(String).join(".")}: ${N.message}`})));return X.data}function lD(t){let e=null;for(let n=0;n<t.length;n+=1){let r=t[n];if(e!==null){if(r==="\\"){n+=1;continue}r===e&&(e=null);continue}if(r==='"'||r==="'"){e=r;continue}if(r==="#")return t.slice(0,n)}return t}function Ln(t,e,n){let r=t.trim();if(r.length===0)return{};if(r.startsWith("{")){let i;try{i=JSON.parse(r)}catch(o){n(e,`malformed structured args (expected a single-line JSON object): ${o.message}`)}return(i===null||typeof i!="object"||Array.isArray(i))&&n(e,"structured args must be a JSON object"),i}let s={};for(let i of cD(r)){let o=i.indexOf("=");o===-1&&n(e,`malformed arg (expected k=v): ${i}`);let a=i.slice(0,o).trim(),l=i.slice(o+1).trim();/^[A-Za-z_][\w-]*$/.test(a)||n(e,`invalid arg name: ${a}`),s[a]=tw(l)}return s}function cD(t){return t.split(",").map(e=>e.trim()).filter(e=>e.length>0)}function tw(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 rD,sD,zy,Ur,oD,aD,Zy,Qy,nw=E(()=>{"use strict";Fr();Yy();Pr();rD={"lmctl/review":{v2type:"Review",outcomes:{approve:"_"},schema:zo},"lmctl/consolidate":{v2type:"Consolidate",outcomes:{ok:"_"},schema:Zo},"lmctl/interactive":{v2type:"Interactive",outcomes:{done:"_"},schema:Qo},"lmctl/loop":{v2type:"Loop",outcomes:{ok:"_"},schema:ea},"lmctl/shell-step":{v2type:"ShellStep",outcomes:{},schema:ta}},sD={"lmctl/review":["coder","reviewers"],"lmctl/consolidate":["researchers","consolidator"],"lmctl/interactive":["agent"]};zy={review:"lmctl/review",consolidate:"lmctl/consolidate",interactive:"lmctl/interactive","shell-step":"lmctl/shell-step","assert-repo-clean":"lmctl/assert-repo-clean","render-docx":"lmctl/render-docx","render-xlsx":"lmctl/render-xlsx"},Ur=class extends Error{issues;constructor(e){super(`composition DSL compile failed:
2014
2014
  ${e.map(n=>` line ${n.line}: ${n.message}`).join(`
2015
2015
  `)}`),this.issues=e,this.name="DslCompileError"}},oD=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"]),aD={"lmctl/consolidate":["ok"],"lmctl/interactive":["done"],"lmctl/loop":["ok"],"lmctl/foreach":["all_ok"]},Zy=new Set(["requires","default_task_timeout_ms","errors","concurrency_key","concurrent_limit"]),Qy={"trigger-schedule":"lmctl/trigger-schedule","trigger-gh-issue":"lmctl/trigger-gh-issue"}});import{readFileSync as dD}from"node:fs";function uD(){let t=process.env.LMCTL_DSL;return t===void 0?!0:!["0","false","off"].includes(t.trim().toLowerCase())}function fD(t){for(let e of t.split(`
2016
2016
  `)){let n=e.replace(/#.*/,"").trim();if(n.length!==0)return/^workflow\s+\S+\s+v\d+\s*$/.test(n)}return!1}function vt(t){if(typeof t=="string"&&uD()&&fD(t)){let n;try{n=ew(t)}catch(s){throw s instanceof Ur?new an(s.issues.map(i=>({path:`dsl:${i.line}`,message:i.message}))):s}let r=Xt.safeParse(n);if(!r.success)throw new an(r.error.issues.map(s=>({path:s.path.length===0?"$":s.path.map(String).join("."),message:s.message})));return r.data}let e=sa(pD(t));if(_D(e)&&e.definition_schema_version===3){let n=Xt.safeParse(e);if(!n.success)throw new an(n.error.issues.map(r=>({path:r.path.length===0?"$":r.path.map(String).join("."),message:r.message})));return n.data}return mD(e)}function mD(t){let e=na.safeParse(t);if(!e.success)throw new an(e.error.issues.map(s=>({path:s.path.length===0?"$":s.path.map(String).join("."),message:s.message})));let n=e.data,r=new Set(["Task","Pause","Parallel","LoopUntil","Pass","Fail","Succeed"]);for(let[s,i]of Object.entries(n.states))if(r.has(i.type))throw new an([{path:`states.${s}`,message:`v2 workflows (primitive_version: 2) may not use v1 primitive type: ${i.type}`}]);try{return Jy(n)}catch(s){throw s instanceof on?new yu(s):s}}function pD(t){if(typeof t!="string")return t;let e=t.trim();return t.includes(`
@@ -2023,7 +2023,7 @@ ${r}`}function JD(t,e,n,r){let s=ir(t,Lu),i=`- [${e}.md](${e}.md)${r!==null?` \u
2023
2023
  `)?`${o}
2024
2024
  ${i}
2025
2025
  `:`${o}${i}
2026
- `,Ru(s,o,"utf8")}function GD(t,e){let n=ir(t,Lu);if(!Wr(n))return;let r=ua(n,"utf8"),s=new RegExp(`^- \\[${ww(e)}\\.md\\].*$\\r?\\n?`,"m");s.test(r)&&Ru(n,r.replace(s,""),"utf8")}function ww(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function KD(t){return t==="user"||t==="feedback"||t==="project"||t==="reference"}function bt(t,e){return t.durable_memory_mode==="db"?new xu(e,t.id):new Au(t.local_path)}var HD,Lu,gw,Au,xu,Ou=E(()=>{"use strict";HD=/^[a-zA-Z0-9_-]+$/;Lu="MEMORY.md",gw="1970-01-01T00:00:00.000Z",Au=class{dir;constructor(e){this.dir=ir(e,"durable-memory")}read(e){pt(e);let n=ir(this.dir,`${e}.md`);if(!Wr(n))return null;let r=ua(n,"utf8");return yw(e,r)}write(e){pt(e.name),WD(this.dir,{recursive:!0});let n=ir(this.dir,`${e.name}.md`),r=!Wr(n),s=XD(e.name,e.type,e.description??null,e.body);return Ru(n,s,"utf8"),JD(this.dir,e.name,e.type,e.description??null),{created:r}}index(e){return this.listFiles().filter(n=>e===void 0||e.length===0||e.includes(n.type)).map(({name:n,type:r,description:s,updated_at:i})=>({name:n,type:r,description:s,updated_at:i}))}list(e){return this.listFiles().filter(n=>e===void 0||n.type===e).map(({name:n,type:r,updated_at:s})=>({name:n,type:r,updated_at:s}))}delete(e){pt(e);let n=ir(this.dir,`${e}.md`);return Wr(n)?(BD(n),GD(this.dir,e),!0):!1}listFiles(){if(!Wr(this.dir))return[];let e=qD(this.dir).filter(r=>r.endsWith(".md")&&r!==Lu),n=[];for(let r of e){let s=r.slice(0,-3),i=ua(ir(this.dir,r),"utf8"),o=yw(s,i);o!==null&&n.push(o)}return n.sort((r,s)=>r.name.localeCompare(s.name))}};xu=class{dal;projectId;constructor(e,n){this.dal=e,this.projectId=n}read(e){pt(e);let n=this.dal.getDurableMemoryByName(this.projectId,e);return n===null?null:{name:n.name,type:n.type,description:n.description,body:n.body,created_at:n.created_at,updated_at:n.updated_at}}write(e){pt(e.name);let n=this.dal.getDurableMemoryByName(this.projectId,e.name);return this.dal.upsertDurableMemory({project_id:this.projectId,type:e.type,name:e.name,description:e.description??null,body:e.body}),{created:n===null}}index(e){return this.dal.indexDurableMemory(this.projectId,e).map(r=>({name:r.name,type:r.type,description:r.description,updated_at:r.updated_at}))}list(e){return this.dal.listDurableMemory(this.projectId,e).map(r=>({name:r.name,type:r.type,updated_at:r.updated_at}))}delete(e){return pt(e),this.dal.deleteDurableMemory(this.projectId,e)}}});function Tw(t,e){let{dal:n}=e;t.get("/api/durable-memory/index/:project_id",r=>{let s=Number(r.req.param("project_id")),i=n.getProject(s);if(i===null)return r.json({error:"project not found"},404);let o=bt(i,n),a=r.req.query("types"),l=a!==void 0&&a.length>0?a.split(",").map(c=>c.trim()).filter(Boolean):void 0;return r.json(o.index(l))}),t.get("/api/durable-memory/read/:project_id/:name",r=>{let s=Number(r.req.param("project_id")),i=r.req.param("name"),o=n.getProject(s);if(o===null)return r.json({error:"project not found"},404);let a=bt(o,n),l;try{l=a.read(i)}catch(c){return r.json({error:c.message},400)}return l===null?r.json({error:`memory entry not found: ${i}`},404):r.json(l)}),t.post("/api/durable-memory/write/:project_id",async r=>{let s=Number(r.req.param("project_id")),i=n.getProject(s);if(i===null)return r.json({error:"project not found"},404);let o;try{o=await r.req.json()}catch{return r.json({error:"invalid JSON body"},400)}let a=typeof o.type=="string"?o.type:null,l=typeof o.name=="string"?o.name:null,c=typeof o.body=="string"?o.body:null,u=typeof o.description=="string"?o.description:null;if(a===null||!Ew.has(a))return r.json({error:`invalid type: must be one of ${[...Ew].join("|")}`},400);if(l===null)return r.json({error:"missing name"},400);if(c===null)return r.json({error:"missing body"},400);let d=bt(i,n),f;try{({created:f}=d.write({type:a,name:l,description:u,body:c}))}catch(m){return r.json({error:m.message},400)}return r.json({success:!0,created_or_updated:f?"created":"updated"})}),t.get("/api/durable-memory/list/:project_id",r=>{let s=Number(r.req.param("project_id")),i=n.getProject(s);if(i===null)return r.json({error:"project not found"},404);let o=bt(i,n),a=r.req.query("type");return r.json(o.list(a))})}var Ew,Sw=E(()=>{"use strict";Ou();Ew=new Set(["user","feedback","project","reference"])});function YD(t){let e=4294967295;for(let n=0;n<t.length;n+=1)e=(VD[(e^t[n])&255]^e>>>8)>>>0;return(e^4294967295)>>>0}function zD(t){let e=Math.max(1980,t.getFullYear()),n=(t.getHours()&31)<<11|(t.getMinutes()&63)<<5|Math.floor(t.getSeconds()/2)&31,r=(e-1980&127)<<9|(t.getMonth()+1&15)<<5|t.getDate()&31;return{time:n,date:r}}function vw(t,e=new Date){let{time:n,date:r}=zD(e),s=[],i=[],o=0,a=new TextEncoder;for(let _ of t){let h=a.encode(_.name),g=YD(_.data),w=_.data.length,y=new Uint8Array(30+h.length),S=new DataView(y.buffer);S.setUint32(0,67324752,!0),S.setUint16(4,20,!0),S.setUint16(6,0,!0),S.setUint16(8,0,!0),S.setUint16(10,n,!0),S.setUint16(12,r,!0),S.setUint32(14,g,!0),S.setUint32(18,w,!0),S.setUint32(22,w,!0),S.setUint16(26,h.length,!0),S.setUint16(28,0,!0),y.set(h,30),s.push(y,_.data);let k=new Uint8Array(46+h.length),b=new DataView(k.buffer);b.setUint32(0,33639248,!0),b.setUint16(4,20,!0),b.setUint16(6,20,!0),b.setUint16(8,0,!0),b.setUint16(10,0,!0),b.setUint16(12,n,!0),b.setUint16(14,r,!0),b.setUint32(16,g,!0),b.setUint32(20,w,!0),b.setUint32(24,w,!0),b.setUint16(28,h.length,!0),b.setUint16(30,0,!0),b.setUint16(32,0,!0),b.setUint16(34,0,!0),b.setUint16(36,0,!0),b.setUint32(38,0,!0),b.setUint32(42,o,!0),k.set(h,46),i.push(k),o+=y.length+_.data.length}let l=o,c=0;for(let _ of i)c+=_.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 _ of s)m.set(_,p),p+=_.length;for(let _ of i)m.set(_,p),p+=_.length;return m.set(u,p),m}var VD,bw=E(()=>{"use strict";VD=(()=>{let t=new Uint32Array(256);for(let e=0;e<256;e+=1){let n=e;for(let r=0;r<8;r+=1)n=n&1?3988292384^n>>>1:n>>>1;t[e]=n>>>0}return t})()});import{existsSync as pa,mkdirSync as ZD,readdirSync as QD,readFileSync as Nw,statSync as ej,unlinkSync as tj,writeFileSync as nj}from"node:fs";import{join as Gs}from"node:path";function Aw(t,e){let{dal:n}=e;t.post("/api/projects",async r=>{let s=await kt(r);if(typeof s=="string")return L(r,s,400);let i=he(s,"name"),o=he(s,"local_path");if(i===null||i.length===0)return L(r,"missing or empty name",400);if(o===null||o.length===0)return L(r,"missing or empty local_path",400);if(n.findProjectByName(i)!==null)return L(r,`project already exists: ${i}`,409);let a=he(s,"workflow_name")??"bugfix",l,c=he(s,"team_name");if(c!==null&&c.length>0){let d=n.findTeamByName(c);if(d===null)return L(r,`team not found: ${c}`,404);l=d.id}else{let d=n.listTeams();if(d.length===0)return L(r,"no teams exist; create a team first",400);l=d[0].id}let u=n.insertProject({name:i,local_path:o,workflow_name:a,team_id:l,default_branch:he(s,"default_branch")});return r.json(u,201)}),t.patch("/api/projects/:name",async r=>{let s=n.findProjectByName(r.req.param("name"));if(s===null)return L(r,"project not found",404);let i=await kt(r);if(typeof i=="string")return L(r,i,400);let o={};if(Object.prototype.hasOwnProperty.call(i,"local_path")){let l=i.local_path;if(typeof l!="string"||l.length===0)return L(r,"local_path must be a non-empty string",400);o.local_path=l}if(Object.prototype.hasOwnProperty.call(i,"durable_memory_mode")){let l=i.durable_memory_mode;if(l!=="folder"&&l!=="db")return L(r,'durable_memory_mode must be "folder" or "db"',400);o.durable_memory_mode=l}if(Object.prototype.hasOwnProperty.call(i,"default_branch")){let l=i.default_branch;if(l!==null&&typeof l!="string")return L(r,"default_branch must be string or null",400);o.default_branch=l}if(Object.prototype.hasOwnProperty.call(i,"intake_config")){let l=i.intake_config;if(l===null)o.intake_config=null;else if(typeof l=="string")o.intake_config=l;else if(typeof l=="object"&&!Array.isArray(l))o.intake_config=JSON.stringify(l);else return L(r,"intake_config must be a JSON object, string, or null",400)}let a=n.updateProjectSettings(s.id,o);return a===null?L(r,"project not found",404):r.json(a)}),t.post("/api/teams",async r=>{let s=await kt(r);if(typeof s=="string")return L(r,s,400);let i=he(s,"name");if(i===null||i.length===0)return L(r,"missing or empty name",400);if(n.findTeamByName(i)!==null)return L(r,`team already exists: ${i}`,409);let o=n.insertTeam({name:i});return r.json(o,201)}),t.post("/api/teams/:name/members",async r=>{let s=n.findTeamByName(r.req.param("name"));if(s===null)return L(r,"team not found",404);let i=await kt(r);if(typeof i=="string")return L(r,i,400);let o=he(i,"alias"),a=he(i,"provider");if(o===null||o.length===0)return L(r,"missing or empty alias",400);if(a===null||a.length===0)return L(r,"missing or empty provider",400);if(n.findTeamMemberByAlias(s.id,o)!==null)return L(r,`member already exists: ${o}`,409);let l=he(i,"model"),c=n.insertTeamMember({team_id:s.id,alias:o,provider:a,model:l,sessiondir:`.lmctl/sessions/${s.name}/${o}`}),u=he(i,"role_prompt");u!==null&&n.setMemberRolePrompt(c.id,u);let d=n.findTeamMemberByAlias(s.id,o);return r.json(d??c,201)}),t.put("/api/teams/:name/members/:alias",async r=>{let s=n.findTeamByName(r.req.param("name"));if(s===null)return L(r,"team not found",404);let i=n.findTeamMemberByAlias(s.id,r.req.param("alias"));if(i===null)return L(r,"member not found",404);let o=await kt(r);if(typeof o=="string")return L(r,o,400);let a={};if(Object.prototype.hasOwnProperty.call(o,"role_prompt")){let c=o.role_prompt;if(c!==null&&typeof c!="string")return L(r,"role_prompt must be string or null",400);a.role_prompt=c}if(Object.prototype.hasOwnProperty.call(o,"model")){let c=o.model;if(c!==null&&typeof c!="string")return L(r,"model must be string or null",400);a.model=c}if(Object.prototype.hasOwnProperty.call(o,"provider")){let c=o.provider;if(typeof c!="string"||c.length===0)return L(r,"provider must be a non-empty string",400);a.provider=c}if(Object.keys(a).length===0)return L(r,"no updatable fields provided",400);let l=n.updateTeamMemberMeta(i.id,a);return l===null?L(r,"member not found",404):r.json(l)}),t.get("/api/projects/:name/durable-memory",r=>{let s=n.findProjectByName(r.req.param("name"));if(s===null)return L(r,"project not found",404);let i=bt(s,n);return r.json(i.index())}),t.post("/api/projects/:name/durable-memory",async r=>{let s=n.findProjectByName(r.req.param("name"));if(s===null)return L(r,"project not found",404);let i=await kt(r);if(typeof i=="string")return L(r,i,400);let o=he(i,"name"),a=he(i,"body"),l=he(i,"type");if(o===null||o.length===0)return L(r,"missing or empty name",400);if(a===null)return L(r,"missing body",400);if(l===null||!fa.includes(l))return L(r,`invalid type: must be one of ${fa.join("|")}`,400);try{pt(o)}catch(d){return L(r,d.message,400)}let c=bt(s,n);try{if(c.read(o)!==null)return L(r,`chapter already exists: ${o}`,409)}catch(d){return L(r,d.message,400)}try{c.write({type:l,name:o,description:he(i,"description"),body:a})}catch(d){return L(r,d.message,400)}let u=c.read(o);return u===null?L(r,"chapter created but unreadable",500):r.json(u,201)}),t.get("/api/projects/:name/durable-memory/:chapter",r=>{let s=n.findProjectByName(r.req.param("name"));if(s===null)return L(r,"project not found",404);let i=bt(s,n),o;try{o=i.read(r.req.param("chapter"))}catch(a){return L(r,a.message,400)}return o===null?L(r,"chapter not found",404):r.json(o)}),t.put("/api/projects/:name/durable-memory/:chapter",async r=>{let s=n.findProjectByName(r.req.param("name"));if(s===null)return L(r,"project not found",404);let i=r.req.param("chapter"),o=await kt(r);if(typeof o=="string")return L(r,o,400);let a=bt(s,n),l;try{l=a.read(i)}catch(m){return L(r,m.message,400)}if(l===null)return L(r,"chapter not found",404);let c=he(o,"body")??l.body,u=Object.prototype.hasOwnProperty.call(o,"description")?he(o,"description"):l.description,d=he(o,"type")??l.type;if(!fa.includes(d))return L(r,`invalid type: must be one of ${fa.join("|")}`,400);try{a.write({type:d,name:i,description:u,body:c})}catch(m){return L(r,m.message,400)}let f=a.read(i);return f===null?L(r,"chapter updated but unreadable",500):r.json(f)}),t.delete("/api/projects/:name/durable-memory/:chapter",r=>{let s=n.findProjectByName(r.req.param("name"));if(s===null)return L(r,"project not found",404);let i=bt(s,n),o;try{o=i.delete(r.req.param("chapter"))}catch(a){return L(r,a.message,400)}return o?r.json({removed:!0}):L(r,"chapter not found",404)}),t.get("/api/projects/:name/ai-test",r=>{let s=n.findProjectByName(r.req.param("name"));return s===null?L(r,"project not found",404):r.json(sj(s.local_path))}),t.post("/api/projects/:name/ai-test",async r=>{let s=n.findProjectByName(r.req.param("name"));if(s===null)return L(r,"project not found",404);let i=await kt(r);if(typeof i=="string")return L(r,i,400);let o=he(i,"name"),a=he(i,"body"),l=he(i,"type");if(o===null||o.length===0)return L(r,"missing or empty name",400);if(a===null)return L(r,"missing body",400);if(l===null||!ma.has(l))return L(r,`invalid type: must be one of ${[...ma].join("|")}`,400);try{pt(o)}catch(f){return L(r,f.message,400)}let c=Xs(s.local_path),u=Gs(c,`${o}.md`);if(pa(u))return L(r,`chapter already exists: ${o}`,409);ZD(c,{recursive:!0}),Iw(u,o,l,he(i,"description"),a);let d=Js(c,o);return d===null?L(r,"chapter created but unreadable",500):r.json(d,201)}),t.get("/api/projects/:name/ai-test/:chapter",r=>{let s=n.findProjectByName(r.req.param("name"));if(s===null)return L(r,"project not found",404);try{pt(r.req.param("chapter"))}catch(o){return L(r,o.message,400)}let i=Js(Xs(s.local_path),r.req.param("chapter"));return i===null?L(r,"chapter not found",404):r.json(i)}),t.put("/api/projects/:name/ai-test/:chapter",async r=>{let s=n.findProjectByName(r.req.param("name"));if(s===null)return L(r,"project not found",404);let i=r.req.param("chapter");try{pt(i)}catch(m){return L(r,m.message,400)}let o=Xs(s.local_path),a=Js(o,i);if(a===null)return L(r,"chapter not found",404);let l=await kt(r);if(typeof l=="string")return L(r,l,400);let c=he(l,"body")??a.body,u=Object.prototype.hasOwnProperty.call(l,"description")?he(l,"description"):a.description,d=he(l,"type")??a.type;if(!ma.has(d))return L(r,`invalid type: must be one of ${[...ma].join("|")}`,400);Iw(Gs(o,`${i}.md`),i,d,u,c);let f=Js(o,i);return f===null?L(r,"chapter updated but unreadable",500):r.json(f)}),t.delete("/api/projects/:name/ai-test/:chapter",r=>{let s=n.findProjectByName(r.req.param("name"));if(s===null)return L(r,"project not found",404);let i=r.req.param("chapter");try{pt(i)}catch(a){return L(r,a.message,400)}let o=Gs(Xs(s.local_path),`${i}.md`);return pa(o)?(tj(o),r.json({removed:!0})):L(r,"chapter not found",404)}),t.get("/api/tokens",r=>r.json([])),t.post("/api/tokens",r=>L(r,"scoped-tokens table not yet migrated; see briefs/scoped-tokens-design.md",501)),t.get("/api/settings",r=>r.json({})),t.patch("/api/settings",async r=>{let s=await kt(r);return typeof s=="string"?L(r,s,400):r.json({accepted:s,note:"settings persistence not yet implemented"})}),t.get("/api/chat/sessions",r=>r.json(n.listChatbotSessions(kw))),t.post("/api/chat/sessions",async r=>{let s=await rj(r);if(typeof s=="string")return L(r,s,400);let i=s!==null?he(s,"title"):null,o=n.createChatbotSession(kw,i);return r.json(o,201)}),t.get("/api/chat/sessions/:id/messages",r=>{let s=r.req.param("id");return n.getChatbotSession(s)===null?L(r,"chat session not found",404):r.json(n.listChatbotMessages(s))}),t.post("/api/chat/sessions/:id/messages",async r=>{let s=r.req.param("id");if(n.getChatbotSession(s)===null)return L(r,"chat session not found",404);let i=await kt(r);if(typeof i=="string")return L(r,i,400);let o=he(i,"role"),a=he(i,"content");if(o===null||o!=="user"&&o!=="assistant"&&o!=="tool")return L(r,"role must be one of user|assistant|tool",400);if(a===null)return L(r,"missing content",400);let l=n.appendChatbotMessage(s,o,a);return r.json(l,201)}),t.get("/api/runs/:id/artifacts.zip",r=>{let s=Number(r.req.param("id"));if(!Number.isInteger(s))return L(r,"invalid run id",400);if(n.getRun(s)===null)return L(r,"run not found",404);let o=nr(n,s),a=[];for(let c of o){let u=oj(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=Nw(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=vw(a);return new Response(l,{status:200,headers:{"Content-Type":"application/zip","Content-Disposition":`attachment; filename="run-${s}-artifacts.zip"`,"Content-Length":String(l.byteLength)}})})}function L(t,e,n){return t.json({error:e},n)}async function kt(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 rj(t){let e=await t.req.text().catch(()=>"");if(e.trim().length===0)return null;try{let n=JSON.parse(e);return n!==null&&typeof n=="object"&&!Array.isArray(n)?n:"invalid JSON body"}catch{return"invalid JSON body"}}function he(t,e){let n=t[e];return typeof n!="string"?null:n}function Xs(t){return Gs(t,"ai-test")}function Js(t,e){let n=Gs(t,`${e}.md`);if(!pa(n))return null;let r=Nw(n,"utf8"),s=ij(r),i=ej(n).mtime.toISOString();return{name:e,type:s.type,description:s.description,body:s.body,updated_at:i}}function sj(t){let e=Xs(t);return pa(e)?QD(e).filter(n=>n.endsWith(".md")&&n!=="index.md").map(n=>n.slice(0,-3)).sort().map(n=>{let r=Js(e,n);if(r===null)return null;let{name:s,type:i,description:o,updated_at:a}=r;return{name:s,type:i,description:o,updated_at:a}}).filter(n=>n!==null):[]}function Iw(t,e,n,r,s){let i=r!==null&&r.length>0?`
2026
+ `,Ru(s,o,"utf8")}function GD(t,e){let n=ir(t,Lu);if(!Wr(n))return;let r=ua(n,"utf8"),s=new RegExp(`^- \\[${ww(e)}\\.md\\].*$\\r?\\n?`,"m");s.test(r)&&Ru(n,r.replace(s,""),"utf8")}function ww(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function KD(t){return t==="user"||t==="feedback"||t==="project"||t==="reference"}function bt(t,e){return t.durable_memory_mode==="db"?new xu(e,t.id):new Au(t.local_path)}var HD,Lu,gw,Au,xu,Ou=E(()=>{"use strict";HD=/^[a-zA-Z0-9_-]+$/;Lu="MEMORY.md",gw="1970-01-01T00:00:00.000Z",Au=class{dir;constructor(e){this.dir=ir(e,"durable-memory")}read(e){pt(e);let n=ir(this.dir,`${e}.md`);if(!Wr(n))return null;let r=ua(n,"utf8");return yw(e,r)}write(e){pt(e.name),WD(this.dir,{recursive:!0});let n=ir(this.dir,`${e.name}.md`),r=!Wr(n),s=XD(e.name,e.type,e.description??null,e.body);return Ru(n,s,"utf8"),JD(this.dir,e.name,e.type,e.description??null),{created:r}}index(e){return this.listFiles().filter(n=>e===void 0||e.length===0||e.includes(n.type)).map(({name:n,type:r,description:s,updated_at:i})=>({name:n,type:r,description:s,updated_at:i}))}list(e){return this.listFiles().filter(n=>e===void 0||n.type===e).map(({name:n,type:r,updated_at:s})=>({name:n,type:r,updated_at:s}))}delete(e){pt(e);let n=ir(this.dir,`${e}.md`);return Wr(n)?(BD(n),GD(this.dir,e),!0):!1}listFiles(){if(!Wr(this.dir))return[];let e=qD(this.dir).filter(r=>r.endsWith(".md")&&r!==Lu),n=[];for(let r of e){let s=r.slice(0,-3),i=ua(ir(this.dir,r),"utf8"),o=yw(s,i);o!==null&&n.push(o)}return n.sort((r,s)=>r.name.localeCompare(s.name))}};xu=class{dal;projectId;constructor(e,n){this.dal=e,this.projectId=n}read(e){pt(e);let n=this.dal.getDurableMemoryByName(this.projectId,e);return n===null?null:{name:n.name,type:n.type,description:n.description,body:n.body,created_at:n.created_at,updated_at:n.updated_at}}write(e){pt(e.name);let n=this.dal.getDurableMemoryByName(this.projectId,e.name);return this.dal.upsertDurableMemory({project_id:this.projectId,type:e.type,name:e.name,description:e.description??null,body:e.body}),{created:n===null}}index(e){return this.dal.indexDurableMemory(this.projectId,e).map(r=>({name:r.name,type:r.type,description:r.description,updated_at:r.updated_at}))}list(e){return this.dal.listDurableMemory(this.projectId,e).map(r=>({name:r.name,type:r.type,updated_at:r.updated_at}))}delete(e){return pt(e),this.dal.deleteDurableMemory(this.projectId,e)}}});function Tw(t,e){let{dal:n}=e;t.get("/api/durable-memory/index/:project_id",r=>{let s=Number(r.req.param("project_id")),i=n.getProject(s);if(i===null)return r.json({error:"project not found"},404);let o=bt(i,n),a=r.req.query("types"),l=a!==void 0&&a.length>0?a.split(",").map(c=>c.trim()).filter(Boolean):void 0;return r.json(o.index(l))}),t.get("/api/durable-memory/read/:project_id/:name",r=>{let s=Number(r.req.param("project_id")),i=r.req.param("name"),o=n.getProject(s);if(o===null)return r.json({error:"project not found"},404);let a=bt(o,n),l;try{l=a.read(i)}catch(c){return r.json({error:c.message},400)}return l===null?r.json({error:`memory entry not found: ${i}`},404):r.json(l)}),t.post("/api/durable-memory/write/:project_id",async r=>{let s=Number(r.req.param("project_id")),i=n.getProject(s);if(i===null)return r.json({error:"project not found"},404);let o;try{o=await r.req.json()}catch{return r.json({error:"invalid JSON body"},400)}let a=typeof o.type=="string"?o.type:null,l=typeof o.name=="string"?o.name:null,c=typeof o.body=="string"?o.body:null,u=typeof o.description=="string"?o.description:null;if(a===null||!Ew.has(a))return r.json({error:`invalid type: must be one of ${[...Ew].join("|")}`},400);if(l===null)return r.json({error:"missing name"},400);if(c===null)return r.json({error:"missing body"},400);let d=bt(i,n),f;try{({created:f}=d.write({type:a,name:l,description:u,body:c}))}catch(m){return r.json({error:m.message},400)}return r.json({success:!0,created_or_updated:f?"created":"updated"})}),t.get("/api/durable-memory/list/:project_id",r=>{let s=Number(r.req.param("project_id")),i=n.getProject(s);if(i===null)return r.json({error:"project not found"},404);let o=bt(i,n),a=r.req.query("type");return r.json(o.list(a))})}var Ew,Sw=E(()=>{"use strict";Ou();Ew=new Set(["user","feedback","project","reference"])});function YD(t){let e=4294967295;for(let n=0;n<t.length;n+=1)e=(VD[(e^t[n])&255]^e>>>8)>>>0;return(e^4294967295)>>>0}function zD(t){let e=Math.max(1980,t.getFullYear()),n=(t.getHours()&31)<<11|(t.getMinutes()&63)<<5|Math.floor(t.getSeconds()/2)&31,r=(e-1980&127)<<9|(t.getMonth()+1&15)<<5|t.getDate()&31;return{time:n,date:r}}function vw(t,e=new Date){let{time:n,date:r}=zD(e),s=[],i=[],o=0,a=new TextEncoder;for(let _ of t){let h=a.encode(_.name),g=YD(_.data),y=_.data.length,w=new Uint8Array(30+h.length),S=new DataView(w.buffer);S.setUint32(0,67324752,!0),S.setUint16(4,20,!0),S.setUint16(6,0,!0),S.setUint16(8,0,!0),S.setUint16(10,n,!0),S.setUint16(12,r,!0),S.setUint32(14,g,!0),S.setUint32(18,y,!0),S.setUint32(22,y,!0),S.setUint16(26,h.length,!0),S.setUint16(28,0,!0),w.set(h,30),s.push(w,_.data);let k=new Uint8Array(46+h.length),b=new DataView(k.buffer);b.setUint32(0,33639248,!0),b.setUint16(4,20,!0),b.setUint16(6,20,!0),b.setUint16(8,0,!0),b.setUint16(10,0,!0),b.setUint16(12,n,!0),b.setUint16(14,r,!0),b.setUint32(16,g,!0),b.setUint32(20,y,!0),b.setUint32(24,y,!0),b.setUint16(28,h.length,!0),b.setUint16(30,0,!0),b.setUint16(32,0,!0),b.setUint16(34,0,!0),b.setUint16(36,0,!0),b.setUint32(38,0,!0),b.setUint32(42,o,!0),k.set(h,46),i.push(k),o+=w.length+_.data.length}let l=o,c=0;for(let _ of i)c+=_.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 _ of s)m.set(_,p),p+=_.length;for(let _ of i)m.set(_,p),p+=_.length;return m.set(u,p),m}var VD,bw=E(()=>{"use strict";VD=(()=>{let t=new Uint32Array(256);for(let e=0;e<256;e+=1){let n=e;for(let r=0;r<8;r+=1)n=n&1?3988292384^n>>>1:n>>>1;t[e]=n>>>0}return t})()});import{existsSync as pa,mkdirSync as ZD,readdirSync as QD,readFileSync as Nw,statSync as ej,unlinkSync as tj,writeFileSync as nj}from"node:fs";import{join as Gs}from"node:path";function Aw(t,e){let{dal:n}=e;t.post("/api/projects",async r=>{let s=await kt(r);if(typeof s=="string")return L(r,s,400);let i=he(s,"name"),o=he(s,"local_path");if(i===null||i.length===0)return L(r,"missing or empty name",400);if(o===null||o.length===0)return L(r,"missing or empty local_path",400);if(n.findProjectByName(i)!==null)return L(r,`project already exists: ${i}`,409);let a=he(s,"workflow_name")??"bugfix",l,c=he(s,"team_name");if(c!==null&&c.length>0){let d=n.findTeamByName(c);if(d===null)return L(r,`team not found: ${c}`,404);l=d.id}else{let d=n.listTeams();if(d.length===0)return L(r,"no teams exist; create a team first",400);l=d[0].id}let u=n.insertProject({name:i,local_path:o,workflow_name:a,team_id:l,default_branch:he(s,"default_branch")});return r.json(u,201)}),t.patch("/api/projects/:name",async r=>{let s=n.findProjectByName(r.req.param("name"));if(s===null)return L(r,"project not found",404);let i=await kt(r);if(typeof i=="string")return L(r,i,400);let o={};if(Object.prototype.hasOwnProperty.call(i,"local_path")){let l=i.local_path;if(typeof l!="string"||l.length===0)return L(r,"local_path must be a non-empty string",400);o.local_path=l}if(Object.prototype.hasOwnProperty.call(i,"durable_memory_mode")){let l=i.durable_memory_mode;if(l!=="folder"&&l!=="db")return L(r,'durable_memory_mode must be "folder" or "db"',400);o.durable_memory_mode=l}if(Object.prototype.hasOwnProperty.call(i,"default_branch")){let l=i.default_branch;if(l!==null&&typeof l!="string")return L(r,"default_branch must be string or null",400);o.default_branch=l}if(Object.prototype.hasOwnProperty.call(i,"intake_config")){let l=i.intake_config;if(l===null)o.intake_config=null;else if(typeof l=="string")o.intake_config=l;else if(typeof l=="object"&&!Array.isArray(l))o.intake_config=JSON.stringify(l);else return L(r,"intake_config must be a JSON object, string, or null",400)}let a=n.updateProjectSettings(s.id,o);return a===null?L(r,"project not found",404):r.json(a)}),t.post("/api/teams",async r=>{let s=await kt(r);if(typeof s=="string")return L(r,s,400);let i=he(s,"name");if(i===null||i.length===0)return L(r,"missing or empty name",400);if(n.findTeamByName(i)!==null)return L(r,`team already exists: ${i}`,409);let o=n.insertTeam({name:i});return r.json(o,201)}),t.post("/api/teams/:name/members",async r=>{let s=n.findTeamByName(r.req.param("name"));if(s===null)return L(r,"team not found",404);let i=await kt(r);if(typeof i=="string")return L(r,i,400);let o=he(i,"alias"),a=he(i,"provider");if(o===null||o.length===0)return L(r,"missing or empty alias",400);if(a===null||a.length===0)return L(r,"missing or empty provider",400);if(n.findTeamMemberByAlias(s.id,o)!==null)return L(r,`member already exists: ${o}`,409);let l=he(i,"model"),c=n.insertTeamMember({team_id:s.id,alias:o,provider:a,model:l,sessiondir:`.lmctl/sessions/${s.name}/${o}`}),u=he(i,"role_prompt");u!==null&&n.setMemberRolePrompt(c.id,u);let d=n.findTeamMemberByAlias(s.id,o);return r.json(d??c,201)}),t.put("/api/teams/:name/members/:alias",async r=>{let s=n.findTeamByName(r.req.param("name"));if(s===null)return L(r,"team not found",404);let i=n.findTeamMemberByAlias(s.id,r.req.param("alias"));if(i===null)return L(r,"member not found",404);let o=await kt(r);if(typeof o=="string")return L(r,o,400);let a={};if(Object.prototype.hasOwnProperty.call(o,"role_prompt")){let c=o.role_prompt;if(c!==null&&typeof c!="string")return L(r,"role_prompt must be string or null",400);a.role_prompt=c}if(Object.prototype.hasOwnProperty.call(o,"model")){let c=o.model;if(c!==null&&typeof c!="string")return L(r,"model must be string or null",400);a.model=c}if(Object.prototype.hasOwnProperty.call(o,"provider")){let c=o.provider;if(typeof c!="string"||c.length===0)return L(r,"provider must be a non-empty string",400);a.provider=c}if(Object.keys(a).length===0)return L(r,"no updatable fields provided",400);let l=n.updateTeamMemberMeta(i.id,a);return l===null?L(r,"member not found",404):r.json(l)}),t.get("/api/projects/:name/durable-memory",r=>{let s=n.findProjectByName(r.req.param("name"));if(s===null)return L(r,"project not found",404);let i=bt(s,n);return r.json(i.index())}),t.post("/api/projects/:name/durable-memory",async r=>{let s=n.findProjectByName(r.req.param("name"));if(s===null)return L(r,"project not found",404);let i=await kt(r);if(typeof i=="string")return L(r,i,400);let o=he(i,"name"),a=he(i,"body"),l=he(i,"type");if(o===null||o.length===0)return L(r,"missing or empty name",400);if(a===null)return L(r,"missing body",400);if(l===null||!fa.includes(l))return L(r,`invalid type: must be one of ${fa.join("|")}`,400);try{pt(o)}catch(d){return L(r,d.message,400)}let c=bt(s,n);try{if(c.read(o)!==null)return L(r,`chapter already exists: ${o}`,409)}catch(d){return L(r,d.message,400)}try{c.write({type:l,name:o,description:he(i,"description"),body:a})}catch(d){return L(r,d.message,400)}let u=c.read(o);return u===null?L(r,"chapter created but unreadable",500):r.json(u,201)}),t.get("/api/projects/:name/durable-memory/:chapter",r=>{let s=n.findProjectByName(r.req.param("name"));if(s===null)return L(r,"project not found",404);let i=bt(s,n),o;try{o=i.read(r.req.param("chapter"))}catch(a){return L(r,a.message,400)}return o===null?L(r,"chapter not found",404):r.json(o)}),t.put("/api/projects/:name/durable-memory/:chapter",async r=>{let s=n.findProjectByName(r.req.param("name"));if(s===null)return L(r,"project not found",404);let i=r.req.param("chapter"),o=await kt(r);if(typeof o=="string")return L(r,o,400);let a=bt(s,n),l;try{l=a.read(i)}catch(m){return L(r,m.message,400)}if(l===null)return L(r,"chapter not found",404);let c=he(o,"body")??l.body,u=Object.prototype.hasOwnProperty.call(o,"description")?he(o,"description"):l.description,d=he(o,"type")??l.type;if(!fa.includes(d))return L(r,`invalid type: must be one of ${fa.join("|")}`,400);try{a.write({type:d,name:i,description:u,body:c})}catch(m){return L(r,m.message,400)}let f=a.read(i);return f===null?L(r,"chapter updated but unreadable",500):r.json(f)}),t.delete("/api/projects/:name/durable-memory/:chapter",r=>{let s=n.findProjectByName(r.req.param("name"));if(s===null)return L(r,"project not found",404);let i=bt(s,n),o;try{o=i.delete(r.req.param("chapter"))}catch(a){return L(r,a.message,400)}return o?r.json({removed:!0}):L(r,"chapter not found",404)}),t.get("/api/projects/:name/ai-test",r=>{let s=n.findProjectByName(r.req.param("name"));return s===null?L(r,"project not found",404):r.json(sj(s.local_path))}),t.post("/api/projects/:name/ai-test",async r=>{let s=n.findProjectByName(r.req.param("name"));if(s===null)return L(r,"project not found",404);let i=await kt(r);if(typeof i=="string")return L(r,i,400);let o=he(i,"name"),a=he(i,"body"),l=he(i,"type");if(o===null||o.length===0)return L(r,"missing or empty name",400);if(a===null)return L(r,"missing body",400);if(l===null||!ma.has(l))return L(r,`invalid type: must be one of ${[...ma].join("|")}`,400);try{pt(o)}catch(f){return L(r,f.message,400)}let c=Xs(s.local_path),u=Gs(c,`${o}.md`);if(pa(u))return L(r,`chapter already exists: ${o}`,409);ZD(c,{recursive:!0}),Iw(u,o,l,he(i,"description"),a);let d=Js(c,o);return d===null?L(r,"chapter created but unreadable",500):r.json(d,201)}),t.get("/api/projects/:name/ai-test/:chapter",r=>{let s=n.findProjectByName(r.req.param("name"));if(s===null)return L(r,"project not found",404);try{pt(r.req.param("chapter"))}catch(o){return L(r,o.message,400)}let i=Js(Xs(s.local_path),r.req.param("chapter"));return i===null?L(r,"chapter not found",404):r.json(i)}),t.put("/api/projects/:name/ai-test/:chapter",async r=>{let s=n.findProjectByName(r.req.param("name"));if(s===null)return L(r,"project not found",404);let i=r.req.param("chapter");try{pt(i)}catch(m){return L(r,m.message,400)}let o=Xs(s.local_path),a=Js(o,i);if(a===null)return L(r,"chapter not found",404);let l=await kt(r);if(typeof l=="string")return L(r,l,400);let c=he(l,"body")??a.body,u=Object.prototype.hasOwnProperty.call(l,"description")?he(l,"description"):a.description,d=he(l,"type")??a.type;if(!ma.has(d))return L(r,`invalid type: must be one of ${[...ma].join("|")}`,400);Iw(Gs(o,`${i}.md`),i,d,u,c);let f=Js(o,i);return f===null?L(r,"chapter updated but unreadable",500):r.json(f)}),t.delete("/api/projects/:name/ai-test/:chapter",r=>{let s=n.findProjectByName(r.req.param("name"));if(s===null)return L(r,"project not found",404);let i=r.req.param("chapter");try{pt(i)}catch(a){return L(r,a.message,400)}let o=Gs(Xs(s.local_path),`${i}.md`);return pa(o)?(tj(o),r.json({removed:!0})):L(r,"chapter not found",404)}),t.get("/api/tokens",r=>r.json([])),t.post("/api/tokens",r=>L(r,"scoped-tokens table not yet migrated; see briefs/scoped-tokens-design.md",501)),t.get("/api/settings",r=>r.json({})),t.patch("/api/settings",async r=>{let s=await kt(r);return typeof s=="string"?L(r,s,400):r.json({accepted:s,note:"settings persistence not yet implemented"})}),t.get("/api/chat/sessions",r=>r.json(n.listChatbotSessions(kw))),t.post("/api/chat/sessions",async r=>{let s=await rj(r);if(typeof s=="string")return L(r,s,400);let i=s!==null?he(s,"title"):null,o=n.createChatbotSession(kw,i);return r.json(o,201)}),t.get("/api/chat/sessions/:id/messages",r=>{let s=r.req.param("id");return n.getChatbotSession(s)===null?L(r,"chat session not found",404):r.json(n.listChatbotMessages(s))}),t.post("/api/chat/sessions/:id/messages",async r=>{let s=r.req.param("id");if(n.getChatbotSession(s)===null)return L(r,"chat session not found",404);let i=await kt(r);if(typeof i=="string")return L(r,i,400);let o=he(i,"role"),a=he(i,"content");if(o===null||o!=="user"&&o!=="assistant"&&o!=="tool")return L(r,"role must be one of user|assistant|tool",400);if(a===null)return L(r,"missing content",400);let l=n.appendChatbotMessage(s,o,a);return r.json(l,201)}),t.get("/api/runs/:id/artifacts.zip",r=>{let s=Number(r.req.param("id"));if(!Number.isInteger(s))return L(r,"invalid run id",400);if(n.getRun(s)===null)return L(r,"run not found",404);let o=nr(n,s),a=[];for(let c of o){let u=oj(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=Nw(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=vw(a);return new Response(l,{status:200,headers:{"Content-Type":"application/zip","Content-Disposition":`attachment; filename="run-${s}-artifacts.zip"`,"Content-Length":String(l.byteLength)}})})}function L(t,e,n){return t.json({error:e},n)}async function kt(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 rj(t){let e=await t.req.text().catch(()=>"");if(e.trim().length===0)return null;try{let n=JSON.parse(e);return n!==null&&typeof n=="object"&&!Array.isArray(n)?n:"invalid JSON body"}catch{return"invalid JSON body"}}function he(t,e){let n=t[e];return typeof n!="string"?null:n}function Xs(t){return Gs(t,"ai-test")}function Js(t,e){let n=Gs(t,`${e}.md`);if(!pa(n))return null;let r=Nw(n,"utf8"),s=ij(r),i=ej(n).mtime.toISOString();return{name:e,type:s.type,description:s.description,body:s.body,updated_at:i}}function sj(t){let e=Xs(t);return pa(e)?QD(e).filter(n=>n.endsWith(".md")&&n!=="index.md").map(n=>n.slice(0,-3)).sort().map(n=>{let r=Js(e,n);if(r===null)return null;let{name:s,type:i,description:o,updated_at:a}=r;return{name:s,type:i,description:o,updated_at:a}}).filter(n=>n!==null):[]}function Iw(t,e,n,r,s){let i=r!==null&&r.length>0?`
2027
2027
  description: ${r}`:"",o=`---
2028
2028
  name: ${e}${i}
2029
2029
  type: ${n}
@@ -2094,13 +2094,13 @@ ${s}`;nj(t,o,"utf8")}function ij(t){let e=t.match(/^---\r?\n([\s\S]*?)\r?\n---\r
2094
2094
  JOIN step s ON s.id = sa.step_id
2095
2095
  WHERE s.run_id = ? AND sa.kind = 'run_report' LIMIT 1`,t).length>0)return;let r=e.getRun(t);if(r===null)return;let s=e.query("SELECT id FROM step WHERE run_id = ? ORDER BY id DESC LIMIT 1",t);if(s.length===0)return;let i=s[0].id,o=e.query("SELECT id, state_name, outcome, started_at, ended_at FROM step WHERE run_id = ? ORDER BY id ASC",t),a=e.query(`SELECT sa.id, sa.step_id, sa.kind FROM step_artifact sa
2096
2096
  JOIN step s ON s.id = sa.step_id
2097
- WHERE s.run_id = ? ORDER BY sa.id ASC`,t),l=new Map;for(let R of a){let re=l.get(R.step_id)??[];re.push({kind:R.kind,id:R.id}),l.set(R.step_id,re)}let c=o.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 re=JSON.parse(R.payload);typeof re.elapsedMs=="number"&&re.elapsedMs>0&&(f+=re.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"),_=[...new Set(p.map(R=>R.state_name))],h=new Date(r.started_at).getTime(),g=r.ended_at!==null?new Date(r.ended_at).getTime():Date.now(),y=e.query("SELECT project_id FROM job WHERE id = ?",r.job_id)[0]?.project_id??null,S=y!==null?e.query(`SELECT id, signal_kind, severity, description, detected_at FROM drift_signal
2098
- WHERE project_id = ? AND detected_at >= ? AND detected_at <= ? ORDER BY detected_at ASC`,y,h,g):[],b=e.query(`SELECT SUM(input_tokens) AS input, SUM(output_tokens) AS output
2097
+ WHERE s.run_id = ? ORDER BY sa.id ASC`,t),l=new Map;for(let R of a){let re=l.get(R.step_id)??[];re.push({kind:R.kind,id:R.id}),l.set(R.step_id,re)}let c=o.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 re=JSON.parse(R.payload);typeof re.elapsedMs=="number"&&re.elapsedMs>0&&(f+=re.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"),_=[...new Set(p.map(R=>R.state_name))],h=new Date(r.started_at).getTime(),g=r.ended_at!==null?new Date(r.ended_at).getTime():Date.now(),w=e.query("SELECT project_id FROM job WHERE id = ?",r.job_id)[0]?.project_id??null,S=w!==null?e.query(`SELECT id, signal_kind, severity, description, detected_at FROM drift_signal
2098
+ WHERE project_id = ? AND detected_at >= ? AND detected_at <= ? ORDER BY detected_at ASC`,w,h,g):[],b=e.query(`SELECT SUM(input_tokens) AS input, SUM(output_tokens) AS output
2099
2099
  FROM session_size WHERE observed_at >= ? AND observed_at <= ?`,r.started_at,r.ended_at??new Date().toISOString())[0],M=b?.input!==null&&b?.input!==void 0?`input: ${b.input}, output: ${b.output??0}`:"n/a",U=e.getWorkflow(r.workflow_id),P=r.started_at!==null&&r.ended_at!==null?Math.max(0,new Date(r.ended_at).getTime()-new Date(r.started_at).getTime()):null,x={run_id:t,workflow_name:U?.name??null,started_at:r.started_at,ended_at:r.ended_at,terminal_state:r.terminal_state,duration_ms:P,steps:c,tool_stats:m,reviewer_interventions:{count:p.length,state_names:_},drift_signals:S,token_totals:M};e.insertStepArtifact({step_id:i,kind:"run_report",content:JSON.stringify(x)})}var Pw=E(()=>{"use strict"});import{spawnSync as Uw}from"node:child_process";function Fu(t){return vj[t]??`no install hint; ensure '${t}' is on PATH`}function bj(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 Fw(t){return Uw("which",[t],{encoding:"utf8"}).status===0}function Ww(t){if(t===void 0)return null;for(let e of t.tools??[])if(!Fw(e)){let n=Fu(e);return{kind:"missing_tool",tool:e,install_hint:n,message:`missing dependency: ${e}; ${n}`}}for(let e of t.auth??[]){if(!Fw(e)){let s=Fu(e);return{kind:"missing_tool",tool:e,install_hint:s,message:`missing dependency: ${e}; ${s}`}}let n=bj(e);if(n===null)continue;let r=Uw(e,n.args,{encoding:"utf8"});if(r.status!==0){let s=typeof r.stderr=="string"?r.stderr.trim():"";return{kind:"auth_failed",tool:e,install_hint:Fu(e),message:`${e} not authenticated; run \`${e} login\` or equivalent`,detail:s.length>0?s:void 0}}}return null}var vj,qw=E(()=>{"use strict";vj={gh:"install: https://cli.github.com/",git:"install: apt-get install git OR brew install git",node:"install: https://nodejs.org/",claude:"install: https://docs.anthropic.com/en/docs/claude-code/quickstart",codex:"install: https://github.com/openai/codex",gemini:"install: https://github.com/google-gemini/gemini-cli",opencode:"install: https://opencode.ai/",qwen:"install: https://github.com/QwenLM/qwen-code",kimi:"install: https://github.com/MoonshotAI/kimi-code"}});import{existsSync as kj,readdirSync as Ij,readFileSync as Nj}from"node:fs";import{join as Bw}from"node:path";function Aj(t){let e=t.match(/^---\n([\s\S]*?)\n---/);if(!e)return[];let n=e[1],r=n.match(/^tags:\s*\[([^\]]*)\]/m);if(r)return r[1].split(",").map(i=>i.trim()).filter(Boolean);let s=n.match(/^tags:\s*\n((?:\s*-\s+.+\n?)*)/m);return s?s[1].split(`
2100
2100
  `).map(i=>i.replace(/^\s*-\s+/,"").trim()).filter(Boolean):[]}function Hw(t,e){let n=t.match(/^---\n([\s\S]*?)\n---/);if(!n)return null;let s=n[1].match(new RegExp(`^${e}:\\s*(.+)$`,"m"));return s?s[1].trim():null}function Xw(t,e){if(e.length===0)return null;let n=Bw(t,"durable-memory");if(!kj(n))return null;let r;try{r=Ij(n).filter(i=>i.endsWith(".md")&&i!=="index.md")}catch{return null}let s=[];for(let i of r)try{let o=Nj(Bw(n,i),"utf8");if(Aj(o).some(l=>e.includes(l))){let l=Hw(o,"name")??i.replace(".md",""),c=Hw(o,"description");s.push(c?`${l} (${c})`:l)}}catch{}return s.length===0?null:`[Durable-memory entries relevant to this task: ${s.join(", ")}. Pull the full chapter as needed.]`}var Jw=E(()=>{"use strict"});function qu(t){let e=t.trim().replace(xj,"").trim();for(let n=0;n<4;n+=1){let r=Rj.exec(e);if(r===null)break;e=r[2].trim()}return e}function Gw(t){let e=t.trim(),n=Lj.exec(e);if(n!==null)return n[2];let r=Oj.exec(e);return r!==null?r[0]:null}function Ys(t,e){let n=t.split(`
2101
2101
  `),r=null,s=-1;for(let o=0;o<n.length;o+=1){let a=qu(n[o]),l=Uu.exec(a);if(l===null)continue;let c=l[1].trim();if(Wu.test(c))continue;let u=Gw(c);u!==null&&(r=u,s=o)}if(r===null)return{outcome:null,reason:"no_stance"};if(!e.includes(r))return{outcome:null,reason:"unknown_outcome",actual:r};let i={};for(let o=s-1;o>=0;o-=1){let a=qu(n[o]),l=Uu.exec(a);if(l===null)break;let c=Wu.exec(l[1].trim());if(c===null)break;i[c[1]]=c[2].trim()}return{outcome:r,evidence:i}}function Kw(t){let e=t.split(`
2102
2102
  `),n=null;for(let r=0;r<e.length;r+=1){let s=qu(e[r]),i=Uu.exec(s);if(i===null)continue;let o=i[1].trim();if(Wu.test(o))continue;let a=Gw(o);if(a===null||!br(a))continue;let c=o.slice(o.indexOf(a)+a.length).replace(/^[`*_:\s\-–—]+/,"").trim();n={token:a,reason:c}}return n}var xj,Rj,Uu,Wu,Lj,Oj,Bu=E(()=>{"use strict";ks();xj=/^#{1,6}\s+/,Rj=/^(```|\*\*|__|`|\*|_)([\s\S]+?)\1$/,Uu=/^STANCE:\s+(.+)$/,Wu=/^([A-Z][A-Z0-9_]*):\s*(.+)$/,Lj=/^(```|\*\*|__|`|\*|_)([A-Za-z0-9_-]+)\1/,Oj=/^[A-Za-z0-9_-]+/});function Vw(t,e,n){return r=>{let s=n(),i=Date.now(),o=JSON.stringify({kind:r.kind,tool:r.tool??null,summary:r.summary??null,id:r.id??null,elapsedMs:r.elapsedMs??null,status:r.status??null}),a=Buffer.byteLength(o,"utf8");if(a<=262144){t.insertSessionEvent({run_id:e,step_id:s,kind:r.kind,timestamp_ms:i,payload:o});return}let l=o.slice(0,1024),c=JSON.stringify({truncated:!0,size:a,preview:l});if(s!==null){let u=t.insertStepArtifact({step_id:s,kind:"session_event_overflow",content:o});t.insertSessionEvent({run_id:e,step_id:s,kind:r.kind,timestamp_ms:i,payload:c,payload_truncated:1,overflow_artifact_id:u.id})}else t.insertSessionEvent({run_id:e,step_id:null,kind:r.kind,timestamp_ms:i,payload:c,payload_truncated:1,overflow_artifact_id:null})}}var Yw=E(()=>{"use strict"});import{readFileSync as Cj}from"node:fs";import{dirname as $j,join as Mj}from"node:path";import{fileURLToPath as Dj}from"node:url";function Fj(t){return t.rules.map(e=>({command:e.command,subcommands:e.argv_patterns.map(n=>n.trim().split(/\s+/)),kind:e.kind}))}function Bj(t){let e=[],n=[];for(let r of t)jj.has(r)?(n.length>0&&e.push(n),n=[]):n.push(r);return n.length>0&&e.push(n),e}function Hj(t,e){if(t.length===0)return{matched:!1};let n=0;for(;n<t.length&&Pj.test(t[n]);)n+=1;if(n>=t.length)return{matched:!1};let r=t[n],s=t.slice(n+1);for(let i of e)if(r===i.command){for(let o of i.subcommands)if(o.every((l,c)=>s[c]===l))return{matched:!0,kind:i.kind}}return{matched:!1}}function Xj(t,e){if(t.length===0)return{matched:!1};let n=Bj(t);for(let r of n){let s=Hj(r,e);if(s.matched)return s}return{matched:!1}}function Hu(t){return Xj(t,qj)}function Jj(t){return t.replace(/&&/g," && ").replace(/\|\|/g," || ").replace(/;/g," ; ").replace(/\|/g," | ").replace(/(?<!\d)>{1,2}/g,e=>` ${e} `).replace(/(?<!\d)<{1,2}/g,e=>` ${e} `).replace(/\s+/g," ").trim()}function Xu(t){return Jj(t).split(" ").filter(e=>e.length>0)}var jj,Pj,Uj,Wj,qj,zw=E(()=>{"use strict";jj=new Set(["&&","||",";","|",">",">>","<","<<"]),Pj=/^[A-Za-z_][A-Za-z0-9_]*=/;Uj=$j(Dj(import.meta.url)),Wj=JSON.parse(Cj(Mj(Uj,"side_effect_classifier.json"),"utf-8")),qj=Fj(Wj)});function ya(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 Zw(t,e){try{return await sr(Ju(t)??t,ya(e))===!0}catch{return!1}}async function wa(t,e){try{return await sr(Ju(t)??t,ya(e))}catch{return}}async function Qw(t,e){if(typeof t!="string")return t;let n=Ju(t);if(n===null)return t;try{return await sr(n,ya(e))}catch{return}}async function eE(t,e){let n=Array.from(t.matchAll(/=\{\{([\s\S]*?)\}\}/g));if(n.length===0)return t;let r="",s=0;for(let i of n){let o=i.index??0;r+=t.slice(s,o);let a=i[1]?.trim()??"";try{r+=Gj(await sr(a,ya(e)))}catch{r+=""}s=o+i[0].length}return r+=t.slice(s),r}function Ju(t){let e=t.trim();return!e.startsWith("={{")||!e.endsWith("}}")?null:e.slice(3,-2).trim()}function Gj(t){return t==null?"":typeof t=="string"?t:JSON.stringify(t)}var zs=E(()=>{"use strict";qs()});import{existsSync as tE,readdirSync as nE,readFileSync as Kj,statSync as rE}from"node:fs";import{join as Ta}from"node:path";function sE(t,e,n,r){return Object.assign(t,{stateId:e,state:n,displayName:r})}function G(t,e){return t.dal.insertStep({...e,parent_step_id:t.parent_step_id})}function V(t,e){return e.startsWith("@terminal:")?{kind:"terminal",terminal:e.slice(10)}:t.states[e]===void 0?{kind:"escalate",token:e,reason:`unknown state ref '${e}'`}:{kind:"state",state:e}}function _t(t,e,n,r,s={}){let i=j(),o=G(t,{run_id:t.run_id,state_name:e.name});t.steps_executed+=1,t.dal.finishStep(o.id,null,`escalation:${r}`.slice(0,480)),t.dal.setRunPausedState(t.run_id,`${Zs}${e.id}`,i);let a=t.dal.getRun(t.run_id),l=br(n)?"generic":"unhandled";return t.dal.raiseAttention({kind:Yi,severity:"attn",project_id:t.project.id,run_id:t.run_id,requires_user:!0,payload:JSON.stringify({run_id:t.run_id,step_id:o.id,project_id:t.project.id,workflow_name:t.workflow.name,workflow_version_id:a?.workflow_version_id??null,step:{id:e.id,name:e.name,type:e.type},tier:l,token:n,reason:r,declared_outcomes:[...s.declared_outcomes??[]],agent_output:Vj(s.agent_output??r),paused_at:i,created_at:i})}),t.dal.pauseJob(t.job.id),{kind:"paused"}}function Vj(t){return t.length>8e3?`${t.slice(0,8e3)}
2103
- \u2026[truncated ${t.length-8e3} chars]`:t}function Y(t,e,n,r){t.outcomes[e]=r,n!==e&&(t.outcomes[n]=r)}function ee(t){return t.terminals.aborted?.kind==="failure"?"aborted":Object.entries(t.terminals).find(([,n])=>n.kind==="failure")?.[0]??Object.keys(t.terminals)[0]??"aborted"}function iE(t,e){let n=e.trim();if(n.startsWith("[")){try{let r=JSON.parse(n);if(Array.isArray(r)&&r.every(s=>typeof s=="string"))return r}catch{return null}return null}if(n.startsWith("job.payload.")){let r=n.slice(12);if(r.length===0)return null;let i=On(t.job.payload)?.[r];if(Array.isArray(i)&&i.every(o=>typeof o=="string"))return i}return null}async function ot(t,e,n){let r=t.replace(/(?<!=)\{\{\s*([a-zA-Z0-9_.]+)\s*\}\}/g,(s,i)=>{if(i==="run_id")return String(e.run_id);if(i==="state_id")return n;if(i==="item")return e.iteration?.item??"";if(i==="index")return e.iteration===null?"":String(e.iteration.index);if(i.startsWith("project.")){let o=i.slice(8);if(o==="id")return String(e.project.id);if(o==="name")return e.project.name;if(o==="local_path")return e.project.local_path;if(o==="default_branch")return e.project.default_branch??"";if(o==="owner"){let a=e.project.name.indexOf("/");return a>0?e.project.name.slice(0,a):""}if(o==="repo"){let a=e.project.name.indexOf("/");return a>0?e.project.name.slice(a+1):e.project.name}if(o==="test_command"){let a=e.project.test_command;return a===null||a===""?"npm test":a}return""}if(i==="job_payload"){let o=On(e.job.payload);return o===null?"":JSON.stringify(o)}if(i.startsWith("job_payload.")){let o=i.slice(12),l=On(e.job.payload)?.[o];return l==null?"":String(l)}if(i.startsWith("outcomes.")){let o=Yj(e.outcomes,i.slice(9));return o==null?"":typeof o=="string"?o:JSON.stringify(o)}return""});return eE(r,e)}function Yj(t,e){let n=t;for(let r of e.split(".")){if(n===null||typeof n!="object"||Array.isArray(n))return;n=n[r]}return n}function On(t){if(t===null)return null;try{let e=JSON.parse(t);return e!==null&&typeof e=="object"&&!Array.isArray(e)?e:null}catch{return null}}async function Qs(t){let{context:e,stateId:n,member:r,prompt:s,stepId:i,timeoutMs:o,writesToProjectPath:a}=t,l=Vw(e.dal,e.run_id,()=>i),c=Gu(e,n),u={violation:null},d=w=>{if(l(w),u.violation===null&&w.kind==="tool_use"&&w.tool==="Bash"&&w.summary){let y=Xu(w.summary),S=Hu(y);S.matched&&!c&&(u.violation={summary:w.summary,kind:S.kind})}},f=new Date(Date.now()-1),m=0,p=0,_=w=>{d(w),zj(w,(y,S)=>{m+=y,p+=S})},h=await Lo({sessionid:r.sessionid,sessiondir:r.sessiondir,prompt:s,timeoutMs:o,dal:e.dal,team_member_id:r.id,onProgress:_});e.dal.insertSessionEvent({run_id:e.run_id,step_id:i,kind:"agent_call",timestamp_ms:Date.now(),payload:JSON.stringify({alias:r.alias,provider:Qe(r),model:r.model??"unknown",tokens_in:m,tokens_out:p,wall_time_ms:h.ms})}),Zj(e.project,e.dal,f);let g=u.violation;return g!==null?{kind:"g3_violation",summary:g.summary,violationKind:g.kind}:!a&&e.project.local_path.trim().length>0&&Ku(e.project.local_path,f)?{kind:"g2_violation"}:{kind:"ok",text:h.text,ms:h.ms,argv:h.argv}}function zj(t,e){let n=t.raw;if(n==null)return;let s=n.message?.usage;if(s!==void 0){let o=Ea(s.input_tokens),a=Ea(s.output_tokens);(o>0||a>0)&&e(o,a);return}let i=n.usage;if(i!==void 0){let o=Ea(i.input_tokens),a=Ea(i.output_tokens);(o>0||a>0)&&e(o,a)}}function Ea(t){return typeof t=="number"&&Number.isFinite(t)&&t>=0?t:0}async function ln(t,e,n,r){if(n.sessionid===null)return;let s=`${e}:write_back`,i=G(t,{run_id:t.run_id,state_name:s});t.steps_executed+=1;let a=`This state completed successfully.${typeof r=="string"?` Category hint: "${r}".`:""} Did you learn anything worth preserving in durable-memory? If yes, use Write to create/update an entry under <project>/durable-memory/<descriptive-name>.md. Include YAML frontmatter (name/description/type[/tags]). Be brief \u2014 one entry per insight. If you didn't learn anything new, respond with \`STANCE: no_writeback\` and the engine moves on.`;try{let l=await Qs({context:t,stateId:s,member:n,prompt:a,stepId:i.id,timeoutMs:t.workflow.default_task_timeout_ms,writesToProjectPath:!1});if(l.kind==="ok"){t.dal.insertStepArtifact({step_id:i.id,kind:"write_back_transcript",content:l.text});let c=!l.text.includes("STANCE: no_writeback");t.dal.finishStep(i.id,c?"wrote_back":"no_writeback","write_back_turn")}else t.dal.finishStep(i.id,null,`write_back_${l.kind}`)}catch{t.dal.finishStep(i.id,null,"write_back_error")}}async function Br(t,e,n,r,s,i,o,a=!1,l){let c=t.membersByAlias.get(n.alias);if(c===void 0||c.sessionid===null)return{outcome:null,text:"",status_detail:`missing_agent:${n.alias}`};let u=G(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),i&&d.push(q_(s)),l!=null&&l.length>0&&d.push(l);let f=n.prompt_template!==void 0?await ot(n.prompt_template,t,e):"";f.length>0&&d.push(f),r!==null&&r.length>0&&d.push(r);let m=d.join(`
2103
+ \u2026[truncated ${t.length-8e3} chars]`:t}function Y(t,e,n,r){t.outcomes[e]=r,n!==e&&(t.outcomes[n]=r)}function ee(t){return t.terminals.aborted?.kind==="failure"?"aborted":Object.entries(t.terminals).find(([,n])=>n.kind==="failure")?.[0]??Object.keys(t.terminals)[0]??"aborted"}function iE(t,e){let n=e.trim();if(n.startsWith("[")){try{let r=JSON.parse(n);if(Array.isArray(r)&&r.every(s=>typeof s=="string"))return r}catch{return null}return null}if(n.startsWith("job.payload.")){let r=n.slice(12);if(r.length===0)return null;let i=On(t.job.payload)?.[r];if(Array.isArray(i)&&i.every(o=>typeof o=="string"))return i}return null}async function ot(t,e,n){let r=t.replace(/(?<!=)\{\{\s*([a-zA-Z0-9_.]+)\s*\}\}/g,(s,i)=>{if(i==="run_id")return String(e.run_id);if(i==="state_id")return n;if(i==="item")return e.iteration?.item??"";if(i==="index")return e.iteration===null?"":String(e.iteration.index);if(i.startsWith("project.")){let o=i.slice(8);if(o==="id")return String(e.project.id);if(o==="name")return e.project.name;if(o==="local_path")return e.project.local_path;if(o==="default_branch")return e.project.default_branch??"";if(o==="owner"){let a=e.project.name.indexOf("/");return a>0?e.project.name.slice(0,a):""}if(o==="repo"){let a=e.project.name.indexOf("/");return a>0?e.project.name.slice(a+1):e.project.name}if(o==="test_command"){let a=e.project.test_command;return a===null||a===""?"npm test":a}return""}if(i==="job_payload"){let o=On(e.job.payload);return o===null?"":JSON.stringify(o)}if(i.startsWith("job_payload.")){let o=i.slice(12),l=On(e.job.payload)?.[o];return l==null?"":String(l)}if(i.startsWith("outcomes.")){let o=Yj(e.outcomes,i.slice(9));return o==null?"":typeof o=="string"?o:JSON.stringify(o)}return""});return eE(r,e)}function Yj(t,e){let n=t;for(let r of e.split(".")){if(n===null||typeof n!="object"||Array.isArray(n))return;n=n[r]}return n}function On(t){if(t===null)return null;try{let e=JSON.parse(t);return e!==null&&typeof e=="object"&&!Array.isArray(e)?e:null}catch{return null}}async function Qs(t){let{context:e,stateId:n,member:r,prompt:s,stepId:i,timeoutMs:o,writesToProjectPath:a}=t,l=Vw(e.dal,e.run_id,()=>i),c=Gu(e,n),u={violation:null},d=y=>{if(l(y),u.violation===null&&y.kind==="tool_use"&&y.tool==="Bash"&&y.summary){let w=Xu(y.summary),S=Hu(w);S.matched&&!c&&(u.violation={summary:y.summary,kind:S.kind})}},f=new Date(Date.now()-1),m=0,p=0,_=y=>{d(y),zj(y,(w,S)=>{m+=w,p+=S})},h=await Lo({sessionid:r.sessionid,sessiondir:r.sessiondir,prompt:s,timeoutMs:o,dal:e.dal,team_member_id:r.id,onProgress:_});e.dal.insertSessionEvent({run_id:e.run_id,step_id:i,kind:"agent_call",timestamp_ms:Date.now(),payload:JSON.stringify({alias:r.alias,provider:Qe(r),model:r.model??"unknown",tokens_in:m,tokens_out:p,wall_time_ms:h.ms})}),Zj(e.project,e.dal,f);let g=u.violation;return g!==null?{kind:"g3_violation",summary:g.summary,violationKind:g.kind}:!a&&e.project.local_path.trim().length>0&&Ku(e.project.local_path,f)?{kind:"g2_violation"}:{kind:"ok",text:h.text,ms:h.ms,argv:h.argv}}function zj(t,e){let n=t.raw;if(n==null)return;let s=n.message?.usage;if(s!==void 0){let o=Ea(s.input_tokens),a=Ea(s.output_tokens);(o>0||a>0)&&e(o,a);return}let i=n.usage;if(i!==void 0){let o=Ea(i.input_tokens),a=Ea(i.output_tokens);(o>0||a>0)&&e(o,a)}}function Ea(t){return typeof t=="number"&&Number.isFinite(t)&&t>=0?t:0}async function ln(t,e,n,r){if(n.sessionid===null)return;let s=`${e}:write_back`,i=G(t,{run_id:t.run_id,state_name:s});t.steps_executed+=1;let a=`This state completed successfully.${typeof r=="string"?` Category hint: "${r}".`:""} Did you learn anything worth preserving in durable-memory? If yes, use Write to create/update an entry under <project>/durable-memory/<descriptive-name>.md. Include YAML frontmatter (name/description/type[/tags]). Be brief \u2014 one entry per insight. If you didn't learn anything new, respond with \`STANCE: no_writeback\` and the engine moves on.`;try{let l=await Qs({context:t,stateId:s,member:n,prompt:a,stepId:i.id,timeoutMs:t.workflow.default_task_timeout_ms,writesToProjectPath:!1});if(l.kind==="ok"){t.dal.insertStepArtifact({step_id:i.id,kind:"write_back_transcript",content:l.text});let c=!l.text.includes("STANCE: no_writeback");t.dal.finishStep(i.id,c?"wrote_back":"no_writeback","write_back_turn")}else t.dal.finishStep(i.id,null,`write_back_${l.kind}`)}catch{t.dal.finishStep(i.id,null,"write_back_error")}}async function Br(t,e,n,r,s,i,o,a=!1,l){let c=t.membersByAlias.get(n.alias);if(c===void 0||c.sessionid===null)return{outcome:null,text:"",status_detail:`missing_agent:${n.alias}`};let u=G(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),i&&d.push(q_(s)),l!=null&&l.length>0&&d.push(l);let f=n.prompt_template!==void 0?await ot(n.prompt_template,t,e):"";f.length>0&&d.push(f),r!==null&&r.length>0&&d.push(r);let m=d.join(`
2104
2104
 
2105
2105
  `);try{let p=await Qs({context:t,stateId:e,member:c,prompt:m,stepId:u.id,timeoutMs:o,writesToProjectPath:a});if(p.kind==="g3_violation"||p.kind==="g2_violation"){let h=p.kind==="g3_violation"?`policy_violation:side_effect_without_pause:${p.violationKind}`:"policy_violation:writes_to_project_path";return t.dal.insertSessionEvent({run_id:t.run_id,step_id: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,h),{outcome:null,text:"",status_detail:h}}if(t.dal.insertStepArtifact({step_id:u.id,kind:`${e}_transcript`,content:p.text}),t.transcripts[e]=p.text,!i)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 _=Ys(p.text,s);return t.dal.finishStep(u.id,_.outcome,_.outcome!==null?`chat_ms=${p.ms}`:_.reason),_.outcome!==null&&(t.outcomes[e]=_.outcome),{outcome:_.outcome,text:p.text,status_detail:_.outcome!==null?`chat_ms=${p.ms}`:_.reason}}catch(p){let _=p instanceof xe?`chat_${p.kind}`:"chat_other";return t.dal.finishStep(u.id,null,_),{outcome:null,text:"",status_detail:_}}}function Hr(t,e){return(e?.length??0)>0?Xw(t.project.local_path,e):null}function oE(t){return Hu(Xu(t))}function Gu(t,e){let n=t.dal.query(`SELECT state_name, outcome FROM step
2106
2106
  WHERE run_id = ? AND state_name != ? AND ended_at IS NOT NULL
@@ -2119,7 +2119,7 @@ ${u}`:u;try{let f=await Qs({context:t,stateId:r,member:i,prompt:d,stepId:l.id,ti
2119
2119
  ORDER BY sa.id DESC
2120
2120
  LIMIT 1`,t.run_id,`${r}:coder[%`);return i[0]?.content===void 0?null:Sa(i[0].content)}function Sa(t){return t.replace(/\n*STANCE:\s+\S+\s*$/,"").trimEnd()}async function FP(t,e){let n=kE(RP.lexer(t,{gfm:!0})),r=new SP({title:e,numbering:{config:[{reference:"ordered-list",levels:[{level:0,format:bP.DECIMAL,text:"%1."}]}]},sections:[{children:n.length===0?[new Nt("")]:n}]});return kP.toBuffer(r)}function kE(t){let e=[];for(let n of t)switch(n.type){case"space":break;case"heading":e.push(new Nt({heading:JP(n.depth),children:$n(Cn(n))}));break;case"paragraph":e.push(new Nt({children:$n(Cn(n))}));break;case"text":e.push(new Nt({children:Cn(n).length===0?[new At(n.text)]:$n(Cn(n))}));break;case"blockquote":e.push(...kE(Cn(n)).map(r=>r instanceof Nt?r:new Nt({children:[new At(n.text)]})));break;case"list":BP(n)&&e.push(...UP(n));break;case"table":HP(n)&&e.push(WP(n));break;case"code":XP(n)&&e.push(...qP(n));break;case"hr":e.push(new Nt(""));break;case"html":n.text.trim().length>0&&e.push(new Nt({children:[new At(n.text)]}));break;default:break}return e}function $n(t,e){let n=[];for(let r of t)switch(r.type){case"text":case"escape":n.push(new At({text:r.text,...Vu(e)}));break;case"strong":n.push(...$n(Cn(r),{...e,bold:!0}));break;case"em":n.push(...$n(Cn(r),{...e,italics:!0}));break;case"codespan":n.push(new At({text:r.text,...Vu({...e,code:!0})}));break;case"link":n.push(new vP({link:r.href,children:$n(Cn(r),{...e})}));break;case"br":n.push(new At({text:"",break:1}));break;case"image":n.push(new At({text:`[image: ${r.text}]`,italics:!0}));break;case"del":n.push(new At({text:r.text,strike:!0}));break;default:n.push(new At({text:r.raw,...Vu(e)}));break}return n.length===0?[new At("")]:n}function Vu(t){return{...t?.bold===!0?{bold:!0}:{},...t?.italics===!0?{italics:!0}:{},...t?.code===!0?{font:"Courier New"}:{}}}function UP(t){return t.items.map(e=>new Nt({children:$n(e.tokens.length===1&&e.tokens[0]?.type==="text"?[{...e.tokens[0],text:SE(e)+e.tokens[0].text}]:[{type:"text",raw:e.text,text:SE(e)+e.text}]),...t.ordered?{numbering:{reference:"ordered-list",level:0}}:{bullet:{level:0}}}))}function SE(t){return t.task?`[${t.checked?"x":" "}] `:""}function WP(t){let e=[t.header,...t.rows].map(n=>new AP({children:n.map(r=>new NP({children:[new Nt({children:$n(r.tokens,r.header?{bold:!0}:void 0)})]}))}));return new IP({width:{size:100,type:xP.PERCENTAGE},rows:e})}function qP(t){return t.text.split(`
2121
2121
  `).map(n=>new Nt({children:[new At({text:n.length===0?" ":n,font:"Courier New"})]}))}function Cn(t){let e=t.tokens;return Array.isArray(e)?e:[]}function BP(t){return t.type==="list"&&Array.isArray(t.items)}function HP(t){let e=t;return t.type==="table"&&Array.isArray(e.header)&&Array.isArray(e.rows)}function XP(t){return t.type==="code"&&typeof t.text=="string"}function JP(t){switch(t){case 1:return Xr.HEADING_1;case 2:return Xr.HEADING_2;case 3:return Xr.HEADING_3;case 4:return Xr.HEADING_4;case 5:return Xr.HEADING_5;default:return Xr.HEADING_6}}var bE,IE=E(()=>{"use strict";nt();bE={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=>LP(t,t.state)}});import{createHash as GP}from"node:crypto";import{existsSync as KP,mkdirSync as VP,readFileSync as NE,statSync as YP}from"node:fs";import{dirname as zP,isAbsolute as AE,normalize as ZP,resolve as ti}from"node:path";import{marked as QP}from"marked";import e1 from"write-excel-file/node";async function t1(t,e){let n=t.stateId,r=t.displayName,s=G(t,{run_id:t.run_id,state_name:r});t.steps_executed+=1;try{let i=await n1(t,e),o=r1(e.input_format),a=await s1(t,e),l=await i1(t,e.title),c=o==="markdown"?p1(i):c1(i);await _1({sheets:c.length===0?[{name:"Sheet1",headers:[],rows:[]}]:c,outputPath:a,title:l??t.workflow.name});let u=YP(a).size;if(u===0)throw new Error("rendered XLSX file was empty");let d=GP("sha256").update(NE(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,n,r,{output_path:a,path:a,bytes:u}),V(t.workflow,e.outcomes?.done??"@terminal:done")}catch(i){let o=i instanceof Error?i.message:String(i);return t.dal.finishStep(s.id,"error",o),Y(t,n,r,{error:o}),V(t.workflow,e.outcomes?.error??"@terminal:error")}}async function n1(t,e){if(typeof e.source!="string"||e.source.trim().length===0)return"";let n=(await ot(e.source,t,t.stateId)).trim(),r=a1(t.project.local_path,n);if(r!==null){if(!KP(r))throw new Error(`source file not found: ${r}`);return NE(r,"utf8")}return n}function r1(t){if(t==null||t==="")return"json";if(t==="json"||t==="markdown")return t;throw new Error(`unsupported input_format: ${String(t)}`)}async function s1(t,e){if(typeof e.output_path!="string"||e.output_path.trim().length===0)throw new Error("output_path is required");let n=(await ot(e.output_path,t,t.stateId)).trim();if(n.length===0)throw new Error("output_path resolved empty");let r=o1(t.project.local_path,n);if(!r.endsWith(".xlsx"))throw new Error(`output_path must end with .xlsx: ${r}`);return r}async function i1(t,e){if(typeof e!="string"||e.trim().length===0)return null;let n=(await ot(e,t,t.stateId)).trim();return n.length===0?null:n}function o1(t,e){let n=ti(t);return ZP(AE(e)?ti(e):ti(n,e))}function a1(t,e){return l1(e)?AE(e)?ti(e):ti(t,e):null}function l1(t){return t.endsWith(".json")||t.endsWith(".md")||t.endsWith(".markdown")||t.startsWith("./")||t.startsWith("../")||t.startsWith("/")}function c1(t){if(t.trim().length===0)return[];let e;try{e=JSON.parse(t)}catch(n){let r=n instanceof Error?n.message:String(n);throw new Error(`invalid JSON source: ${r}`)}if(!va(e)||!Array.isArray(e.sheets))throw new Error("JSON source must be an object with sheets[]");return e.sheets.map((n,r)=>d1(n,r))}function d1(t,e){if(!va(t))throw new Error(`sheets[${e}] must be an object`);let n=u1(t.headers,`sheets[${e}].headers`),r=f1(t.rows,`sheets[${e}].rows`);return{name:typeof t.name=="string"&&t.name.trim().length>0?t.name:`Sheet${e+1}`,headers:n,rows:r,headerStyle:m1(t.styles)}}function u1(t,e){if(t===void 0)return[];if(!Array.isArray(t)||!t.every(n=>typeof n=="string"))throw new Error(`${e} must be an array of strings`);return t}function f1(t,e){if(t===void 0)return[];if(!Array.isArray(t))throw new Error(`${e} must be an array`);return t.map((n,r)=>{if(!Array.isArray(n))throw new Error(`${e}[${r}] must be an array`);return n.map((s,i)=>{if(s===null||typeof s=="string"||typeof s=="number"||typeof s=="boolean")return s;throw new Error(`${e}[${r}][${i}] must be string, number, boolean, or null`)})})}function m1(t){if(!va(t)||!va(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 p1(t){let e=QP.lexer(t,{gfm:!0}),n=[],r=null;for(let s of e){if(S1(s)){r=s.text;continue}v1(s)&&(n.push({name:r??`Sheet${n.length+1}`,headers:s.header.map(i=>i.text),rows:s.rows.map(i=>i.map(o=>o.text)),headerStyle:{bold:!0}}),r=null)}return n}async function _1(t){VP(zP(t.outputPath),{recursive:!0});let e=new Set,n=t.sheets.map(r=>({sheet:w1(r.name,e),data:h1(r),columns:y1(r)}));await e1(n).toFile(t.outputPath)}function h1(t){let e=[];if(t.headers.length>0){let n=T1(t.headerStyle?.fill);e.push(t.headers.map(r=>({value:r,type:String,fontWeight:t.headerStyle?.bold===!1?void 0:"bold",backgroundColor:n??void 0})))}for(let n of t.rows)e.push(n.map(g1));return e.length===0?[[{}]]:e}function g1(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 y1(t){let e=Math.max(t.headers.length,...t.rows.map(r=>r.length),1),n=[];for(let r=1;r<=e;r+=1){let s=[t.headers[r-1],...t.rows.map(o=>o[r-1])],i=Math.min(60,Math.max(10,...s.map(o=>String(o??"").length+2)));n.push({width:i})}return n}function w1(t,e){let n=E1(t),r=n,s=2;for(;e.has(r.toLowerCase());){let i=` ${s}`;r=`${n.slice(0,31-i.length)}${i}`,s+=1}return e.add(r.toLowerCase()),r}function E1(t){let e=t.replace(/[\[\]:*?/\\]/g," ").trim();return(e.length===0?"Sheet":e).slice(0,31)}function T1(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 S1(t){return t.type==="heading"&&typeof t.text=="string"}function v1(t){let e=t;return t.type==="table"&&Array.isArray(e.header)&&Array.isArray(e.rows)}function va(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}var xE,RE=E(()=>{"use strict";nt();xE={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=>t1(t,t.state)}});import{spawnSync as b1}from"node:child_process";async function I1(t,e){let n=t.stateId,r=t.displayName,s=t.workflow.default_task_timeout_ms;for(let f of e.pre_checks??[])if(b1("sh",["-c",f.command],{cwd:t.project.local_path}).status!==0){let p=G(t,{run_id:t.run_id,state_name:r});t.steps_executed+=1,t.dal.finishStep(p.id,"fail_pre_check",`pre_check_failed:${f.description??f.command}`),Y(t,n,r,"fail_pre_check");let _=e.outcomes.fail_pre_check;return _!==void 0?V(t.workflow,_):{kind:"terminal",terminal:ee(t.workflow)}}let i=Hr(t,e.durable_memory_tags),o=e.reviewers??[],a=null,l=o.length===0&&e.outcomes_from_stance!==void 0,c=l?Object.keys(e.outcomes_from_stance):[];for(let f=0;f<e.max_loops;f+=1){let m=`${r}:coder[${f}]`,p=await Br(t,m,e.coder,a!==null?`PRIOR REVIEW FEEDBACK:
2122
- ${a}`:null,c,l,s,e.writes_to_project_path===!0,i);if(l){let h=Kw(p.text);if(h!==null){let g=G(t,{run_id:t.run_id,state_name:r});return t.steps_executed+=1,t.dal.finishStep(g.id,null,`escalation_vocab:${h.token}`),{kind:"escalate",token:h.token,reason:h.reason.length>0?`${h.token}: ${h.reason}`:h.token}}}if(p.outcome===null){let h=G(t,{run_id:t.run_id,state_name:r});return t.steps_executed+=1,t.dal.finishStep(h.id,null,p.status_detail),{kind:"escalate",token:"",reason:`coder_no_outcome:${p.status_detail}`}}if(o.length===0){if(e.outcomes_from_stance!==void 0){let w=Object.keys(e.outcomes_from_stance),y=Ys(p.text,w);if(y.outcome===null){let k=G(t,{run_id:t.run_id,state_name:r});return t.steps_executed+=1,t.dal.finishStep(k.id,null,`unhandled_stance:${y.reason}`),{kind:"escalate",token:"",reason:`no_stance:${y.reason}`}}let S=G(t,{run_id:t.run_id,state_name:r});return t.steps_executed+=1,t.dal.finishStep(S.id,y.outcome,"outcomes_from_stance"),Y(t,n,r,y.outcome),V(t.workflow,e.outcomes_from_stance[y.outcome])}let h=Ys(p.text,k1);if(h.outcome!==null){let w=G(t,{run_id:t.run_id,state_name:r});return t.steps_executed+=1,t.dal.finishStep(w.id,h.outcome,"default_failure_stance"),Y(t,n,r,h.outcome),{kind:"escalate",token:h.outcome,reason:`failure_stance:${h.outcome}`}}let g=G(t,{run_id:t.run_id,state_name:r});if(t.steps_executed+=1,t.dal.finishStep(g.id,"approve","no_reviewers"),Y(t,n,r,"approve"),e.write_back_durable_memory){let w=t.membersByAlias.get(e.coder.alias);w!==void 0&&await ln(t,r,w,e.write_back_durable_memory)}return V(t.workflow,e.outcomes.approve)}let _=await Promise.all(o.map(h=>Br(t,`${r}:reviewer_${h.alias}[${f}]`,h,`CODER OUTPUT:
2122
+ ${a}`:null,c,l,s,e.writes_to_project_path===!0,i);if(l){let h=Kw(p.text);if(h!==null){let g=G(t,{run_id:t.run_id,state_name:r});return t.steps_executed+=1,t.dal.finishStep(g.id,null,`escalation_vocab:${h.token}`),{kind:"escalate",token:h.token,reason:h.reason.length>0?`${h.token}: ${h.reason}`:h.token}}}if(p.outcome===null){let h=G(t,{run_id:t.run_id,state_name:r});return t.steps_executed+=1,t.dal.finishStep(h.id,null,p.status_detail),{kind:"escalate",token:"",reason:`coder_no_outcome:${p.status_detail}`}}if(o.length===0){if(e.outcomes_from_stance!==void 0){let y=Object.keys(e.outcomes_from_stance),w=Ys(p.text,y);if(w.outcome===null){let k=G(t,{run_id:t.run_id,state_name:r});return t.steps_executed+=1,t.dal.finishStep(k.id,null,`unhandled_stance:${w.reason}`),{kind:"escalate",token:"",reason:`no_stance:${w.reason}`}}let S=G(t,{run_id:t.run_id,state_name:r});return t.steps_executed+=1,t.dal.finishStep(S.id,w.outcome,"outcomes_from_stance"),Y(t,n,r,w.outcome),V(t.workflow,e.outcomes_from_stance[w.outcome])}let h=Ys(p.text,k1);if(h.outcome!==null){let y=G(t,{run_id:t.run_id,state_name:r});return t.steps_executed+=1,t.dal.finishStep(y.id,h.outcome,"default_failure_stance"),Y(t,n,r,h.outcome),{kind:"escalate",token:h.outcome,reason:`failure_stance:${h.outcome}`}}let g=G(t,{run_id:t.run_id,state_name:r});if(t.steps_executed+=1,t.dal.finishStep(g.id,"approve","no_reviewers"),Y(t,n,r,"approve"),e.write_back_durable_memory){let y=t.membersByAlias.get(e.coder.alias);y!==void 0&&await ln(t,r,y,e.write_back_durable_memory)}return V(t.workflow,e.outcomes.approve)}let _=await Promise.all(o.map(h=>Br(t,`${r}:reviewer_${h.alias}[${f}]`,h,`CODER OUTPUT:
2123
2123
  ${p.text}`,["approve","request_changes"],!0,s,e.writes_to_project_path===!0)));if(_.every(h=>h.outcome==="approve")){let h=G(t,{run_id:t.run_id,state_name:r});if(t.steps_executed+=1,t.dal.finishStep(h.id,"approve",`loop=${f}`),Y(t,n,r,"approve"),e.write_back_durable_memory){let g=t.membersByAlias.get(e.coder.alias);g!==void 0&&await ln(t,r,g,e.write_back_durable_memory)}return V(t.workflow,e.outcomes.approve)}if(a=_.filter(h=>h.outcome==="request_changes").map(h=>h.text).join(`
2124
2124
 
2125
2125
  `),e.loop_feedback_artifact!==void 0){let h=G(t,{run_id:t.run_id,state_name:`${r}:feedback[${f}]`});t.steps_executed+=1,t.dal.finishStep(h.id,"feedback_captured",`loop=${f}`),t.dal.insertStepArtifact({step_id:h.id,kind:e.loop_feedback_artifact,content:a})}}let u=G(t,{run_id:t.run_id,state_name:r});t.steps_executed+=1,t.dal.finishStep(u.id,"max_loops_exceeded",`loops=${e.max_loops}`),Y(t,n,r,"max_loops_exceeded");let d=e.outcomes.max_loops_exceeded;return d!==void 0?V(t.workflow,d):{kind:"terminal",terminal:ee(t.workflow)}}var k1,LE,OE=E(()=>{"use strict";Bu();nt();k1=["blocked","failed","aborted"],LE={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=>I1(t,t.state)}});import{spawnSync as N1}from"node:child_process";async function A1(t,e){let n=t.stateId,r=t.displayName,s=await ot(e.command,t,r),i=Gu(t,r),o=oE(s);if(o.matched&&!i){let _=G(t,{run_id:t.run_id,state_name:r});return t.steps_executed+=1,t.dal.insertSessionEvent({run_id:t.run_id,step_id:_.id,kind:"policy_violation",timestamp_ms:Date.now(),payload:JSON.stringify({violation:"side_effect_without_pause",state_id:r,kind:o.kind,command:s,message:`ShellStep ${r} runs a classified side-effect command (${o.kind}) without a preceding approved gate`})}),t.dal.finishStep(_.id,null,`policy_violation:side_effect_without_pause:${o.kind}`),{kind:"terminal",terminal:ee(t.workflow)}}let a=new Date(Date.now()-1),l=typeof e.timeout_ms=="number"&&e.timeout_ms>0,c=N1("sh",["-c",s],{cwd:t.project.local_path,...l?{timeout:e.timeout_ms}:{},encoding:"utf8",env:{...process.env}}),u=G(t,{run_id:t.run_id,state_name:r});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:r,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&&Ku(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:r,message:`ShellStep ${r} 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 _=c.stdout??"";t.dal.insertStepArtifact({step_id:u.id,kind:e.capture_output_to,content:_})}let m=String(c.status),p=e.outcomes_from_exit[m]??e.outcomes_from_exit.default;return p===void 0?(t.dal.insertStepArtifact({step_id: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,n,r,m),V(t.workflow,p))}var CE,$E=E(()=>{"use strict";nt();CE={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=>A1(t,t.state)}});async function x1(t,e){let n=t.stateId,r=t.displayName,s=G(t,{run_id:t.run_id,state_name:r});t.steps_executed+=1;let i=t.dal.getWorkflowByName(e.workflow_name);if(i===null)return t.dal.finishStep(s.id,null,`subflow_missing_workflow:${e.workflow_name}`),{kind:"terminal",terminal:ee(t.workflow)};let o=vt(i.definition),a=await R1(t,e),l=await t.runChildWorkflow(i,o,a);if(l.paused===!0)return t.dal.finishStep(s.id,null,`subflow_paused:${l.run_id}`),{kind:"paused"};let c=l.terminal_state;if(c===null)return t.dal.finishStep(s.id,null,`subflow_no_terminal:${l.run_id}`),{kind:"terminal",terminal:ee(t.workflow)};Y(t,n,r,L1(t,l.run_id,o.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)}:V(t.workflow,u)}async function R1(t,e){let n={};for(let[r,s]of Object.entries(e.inputs??{})){let i=await Qw(s,t);n[r]=i===s?await wa(s,t):i}return n}function L1(t,e,n){let r={};for(let s of n)r[s.name]=O1(t,e,s);return r}function O1(t,e,n){let s=t.dal.query("SELECT * FROM step WHERE run_id = ? AND state_name = ? ORDER BY id DESC LIMIT 1",e,n.source_step_id)[0];if(s===void 0)return null;let i=C1(s,n.source_field);if(i.found)return i.value;let a=t.dal.query("SELECT * FROM step_artifact WHERE step_id = ? AND kind = ? ORDER BY id DESC LIMIT 1",s.id,n.source_field)[0];return a===void 0?null:a.content??a.path??a.sha??null}function C1(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 ME,DE=E(()=>{"use strict";Hs();nt();zs();ME={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=>x1(t,t.state)}});function $1(t,e){let n=t.stateId,r=t.displayName,s=e.name??r,i=G(t,{run_id:t.run_id,state_name:r});return t.steps_executed+=1,t.dal.finishStep(i.id,s,e.kind??"neutral"),Y(t,n,r,s),{kind:"terminal",terminal:s}}var jE,PE=E(()=>{"use strict";nt();jE={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=>$1(t,t.state)}});async function M1(t){let e=typeof t.parameters.org=="string"?t.parameters.org:"",n=typeof t.parameters.repo=="string"?t.parameters.repo:"";if(e.length===0||n.length===0)return null;let r=new URL(`https://api.github.com/repos/${e}/${n}/issues`);r.searchParams.set("state","open"),typeof t.parameters.label=="string"&&t.parameters.label.length>0&&r.searchParams.set("labels",t.parameters.label),typeof t.parameters.since=="string"&&t.parameters.since.length>0&&r.searchParams.set("since",t.parameters.since);let s=await fetch(r);if(!s.ok)throw new Error(`github issue trigger failed: HTTP ${s.status}`);let i=await s.json();if(!Array.isArray(i))throw new Error("github issue trigger returned unexpected JSON");let o=D1(t.cursor),a=i.filter(j1).filter(c=>c.id>o);if(a.length===0)return null;let l=Math.max(...a.map(c=>c.id));return{main:a.map(c=>({trigger_id:t.trigger_id,issue_id:c.id,issue_number:c.number,issue_url:c.html_url,title:c.title,cursor:String(l)}))}}function D1(t){if(t===void 0)return 0;let e=Number(t);return Number.isFinite(e)?e:0}function j1(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 FE,UE=E(()=>{"use strict";FE={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=>M1(t)}});async function P1(t){let e=typeof t.parameters.cron=="string"?t.parameters.cron.trim():"";if(e.length===0)return null;let n=new Date(Date.now()).toISOString().slice(0,16);return t.cursor===n?null:{main:[{trigger_id:t.trigger_id,fired_at:new Date(Date.now()).toISOString(),cursor:n,cron:e}]}}var WE,qE=E(()=>{"use strict";WE={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=>P1(t)}});function BE(t){t.register(lE),t.register(LE),t.register(fE),t.register(yE),t.register(EE),t.register(bE),t.register(xE),t.register(CE),t.register(dE),t.register(pE),t.register(ME),t.register(jE),t.register(WE),t.register(FE)}var HE=E(()=>{"use strict";cE();uE();mE();hE();wE();TE();IE();RE();OE();$E();DE();PE();UE();qE()});function XE(){return ba===null&&(ba=new Yu,BE(ba)),ba}var F1,Yu,ba,JE=E(()=>{"use strict";HE();F1={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"},Yu=class{types=new Map;register(e){let n=`${e.description.namespace}/${e.description.name}`;if(this.types.has(n))throw new Error(`archetype already registered: ${n}`);this.types.set(n,e)}get(e){let n=e.includes("/")?e:F1[e];return n?this.types.get(n):void 0}list(){return Array.from(this.types.values())}},ba=null});async function VE(t){eT(t.workflow);let e=t.workflowRow??t.dal.getWorkflowByName(t.workflow.name,t.workflow.version);if(e===null)throw new Error(`workflow ${t.workflow.name}@${t.workflow.version} is not registered`);let n=t.dal.getProjectByJob(t.job.id);if(n===null)throw new Error(`job ${t.job.id} has no project`);let r=W1(e.definition,t.workflow),s=t.job.run_id===null?null:t.dal.getRun(t.job.run_id),i=ni(r)?r.entry_step_id:r.start_at,o=s?.terminal_state===null?s:t.dal.insertRun({job_id:t.job.id,workflow_id:e.id,team_id:t.team.id,current_state:i}),a=r.requires,l=Ww(a);if(l!==null)return t.dal.setRunTerminalState(o.id,"aborted"),t.dal.raiseAttention({kind:"missing_workflow_dependency",severity:"error",project_id:n.id,run_id:o.id,payload:JSON.stringify({run_id:o.id,workflow_name:r.name,kind:l.kind,tool:l.tool,install_hint:l.install_hint,last_error:l.message,detail:l.detail??null})}),{run_id:o.id,terminal_state:"aborted",steps_executed:0};let c=new Map(t.members.map(m=>[m.alias,m]));if(ni(r)){let m=zu({dal:t.dal,workflow:Ia(r),job:t.job,project:n,run:o,membersByAlias:c,outcomes:s!==null&&o===s?t.dal.listLatestStepOutcomesByState(o.id):{},inputs:On(t.job.payload)??{},team_id:t.team.id}),p=await zE(r,m,o.current_state??r.entry_step_id);return KE(t.dal,n.id,o.id,r.name,p),p}let u=s!==null&&o===s?t.dal.listLatestStepOutcomesByState(o.id):{},d=zu({dal:t.dal,workflow:r,job:t.job,project:n,run:o,membersByAlias:c,outcomes:u,inputs:On(t.job.payload)??{},team_id:t.team.id}),f=await YE(d,o.current_state??r.start_at);return KE(t.dal,n.id,o.id,r.name,f),f}function KE(t,e,n,r,s){if(s.paused===!0)return;let i=s.terminal_state;if(i===null)return;let o="unknown",a=!1;try{let u=t.getRun(n);if(u!==null){let d=t.getWorkflow(u.workflow_id);if(d!==null){let f=JSON.parse(d.definition),p=(f.terminals??{})[i];if(p!==void 0&&typeof p.kind=="string"&&(p.kind==="success"||p.kind==="failure"||p.kind==="neutral")&&(o=p.kind),o==="unknown"&&Array.isArray(f.steps)){for(let h of f.steps)if(h.type==="lmctl/terminal"&&h.parameters!==null&&typeof h.parameters=="object"){let g=h.parameters;if(g.name===i&&(g.kind==="success"||g.kind==="failure"||g.kind==="neutral")){o=g.kind;break}}}let _=f.errors;if(_!==null&&typeof _=="object"){let h=_;(h.on_unhandled_failure!==void 0||h.on_unhandled_failure_state!==void 0)&&(a=!0)}}}}catch{}if(o==="success"||o==="failure"&&a)return;let l=null;try{l=t.query("SELECT status_detail FROM step WHERE run_id = ? ORDER BY id DESC LIMIT 1",n)[0]?.status_detail??null}catch{l=null}let c=o==="failure"?"workflow_failed":"workflow_has_issues";t.raiseAttention({kind:c,severity:o==="failure"?"error":"warn",project_id:e,run_id:n,payload:JSON.stringify({run_id:n,workflow_name:r,terminal_state:i,terminal_kind:o,last_error:l})})}function zu(t){let e={dal:t.dal,workflow:t.workflow,job:t.job,project:t.project,run_id:t.run.id,membersByAlias:t.membersByAlias,inputs:t.inputs,outcomes:t.outcomes,transcripts:{},progress_step_id:null,steps_executed:0,last_state_id:null,errors_block_fired:!1,iteration:null,parent_step_id:null,dispatchState:async(n,r,s)=>{let i=e.parent_step_id,o=e.iteration;e.parent_step_id=s?.parent_step_id??i,e.iteration=s?.iteration??o;try{return await Zu(e,n,r,s?.display_name??n)}finally{e.parent_step_id=i,e.iteration=o}},runChildWorkflow:async(n,r,s)=>{eT(r);let i=ni(r)?r.entry_step_id:r.start_at,o=t.dal.insertRun({job_id:t.job.id,workflow_id:n.id,team_id:t.team_id,current_state:i,parent_run_id:e.run_id}),a=zu({dal:t.dal,workflow:ni(r)?Ia(r):r,job:t.job,project:t.project,run:o,membersByAlias:t.membersByAlias,outcomes:{},inputs:s,team_id:t.team_id});return ni(r)?zE(r,a,o.current_state??r.entry_step_id):YE(a,o.current_state??r.start_at)}};return e}async function YE(t,e){let n=e;if(n.startsWith(Zs))return{run_id:t.run_id,terminal_state:null,steps_executed:0,paused:!0};for(let s=0;s<1e3;s+=1){if(n.startsWith("@terminal:"))return cn(t,n.slice(10));t.dal.setRunCurrentState(t.run_id,n),t.last_state_id=n;let i=t.workflow.states[n];if(i===void 0){let l=ka(t,ee(t.workflow));if(l.kind==="paused")return Ye(t);if(l.kind==="escalate")return _t(t,{id:n,name:n,type:"unknown"},l.token,l.reason),Ye(t);if(l.kind==="terminal")return cn(t,l.terminal);n=l.state;continue}let o,a=QE(t,n);if(a!==null){let l=G(t,{run_id:t.run_id,state_name:n});if(t.steps_executed+=1,t.dal.finishStep(l.id,a,"escalation_resume"),Y(t,n,n,a),a===bs)return cn(t,_c);let c=i.outcomes?.[a];o=c!==void 0?V(t.workflow,c):_t(t,{id:n,name:n,type:i.type},a,`no declared edge for resumed outcome '${a}' from state '${n}'`)}else o=await Zu(t,n,i);if(o.kind==="paused")return Ye(t);if(o.kind==="escalate")return _t(t,{id:n,name:n,type:i.type},o.token,o.reason),Ye(t);if(o.kind==="terminal"){let l=ka(t,o.terminal);if(l.kind==="paused")return Ye(t);if(l.kind==="escalate")return _t(t,{id:n,name:n,type:i.type},l.token,l.reason),Ye(t);if(l.kind==="terminal")return cn(t,l.terminal);n=l.state;continue}n=o.state}t.dal.raiseAttention({kind:"engine_step_limit_exceeded",severity:"error",project_id:t.project.id,run_id:t.run_id,payload:JSON.stringify({run_id:t.run_id})});let r=ka(t,ee(t.workflow));return r.kind==="terminal"?cn(t,r.terminal):cn(t,ee(t.workflow))}async function zE(t,e,n){let r=new Map(t.steps.map(o=>[o.id,o])),s=new Map(t.steps.map(o=>[o.name,o])),i=n;for(let o=0;o<1e3;o+=1){e.dal.setRunCurrentState(e.run_id,i);let a=r.get(i);if(a===void 0)return _t(e,{id:i,name:i,type:"unknown"},"",`internal:unknown v3 step '${i}'`),Ye(e);let l=QE(e,a.id);if(l!==null){let m=G(e,{run_id:e.run_id,state_name:a.name});if(e.steps_executed+=1,e.dal.finishStep(m.id,l,"escalation_resume"),Y(e,a.id,a.name,l),l===bs)return cn(e,_c);let p=Object.keys(t.connections[a.id]??{}),_=t.connections[a.id]?.[l]?.[0]?.[0]?.step_id??t.connections[a.id]?.main?.[0]?.[0]?.step_id;if(_===void 0)return _t(e,{id:a.id,name:a.name,type:a.type},l,`no declared edge for resumed outcome '${l}' from step '${a.id}'`,{declared_outcomes:p}),Ye(e);i=_;continue}let c=await U1(e,t,a);if(c.kind==="paused")return Ye(e);let u=Object.keys(t.connections[a.id]??{});if(c.kind==="escalate")return _t(e,{id:a.id,name:a.name,type:a.type},c.token,c.reason,{declared_outcomes:u}),Ye(e);let d=c.kind==="terminal"?c.terminal:c.state;if(a.type==="lmctl/terminal"){let m=e.workflow;e.workflow=Ia(t,a);try{let p=ka(e,d);if(p.kind==="paused")return Ye(e);if(p.kind==="escalate")return _t(e,{id:a.id,name:a.name,type:a.type},p.token,p.reason),Ye(e);if(p.kind==="terminal")return cn(e,p.terminal);let _=s.get(p.state);if(_===void 0)return _t(e,{id:a.id,name:a.name,type:a.type},"",`internal:unknown v3 error handler step '${p.state}'`),Ye(e);i=_.id;continue}finally{e.workflow=m}}if(br(d))return _t(e,{id:a.id,name:a.name,type:a.type},d,`generic escalation '${d}' from step '${a.id}'`,{declared_outcomes:u}),Ye(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 _t(e,{id:a.id,name:a.name,type:a.type},d,`no declared edge for outcome '${d}' from step '${a.id}'`,{declared_outcomes:u}),Ye(e);i=f}return e.dal.raiseAttention({kind:"engine_step_limit_exceeded",severity:"error",project_id:e.project.id,run_id:e.run_id,payload:JSON.stringify({run_id:e.run_id})}),cn(e,"aborted")}async function U1(t,e,n){let r=ZE(e,n),s=t.workflow;t.workflow=Ia(e,n);try{return await Zu(t,n.id,r,n.name)}finally{t.workflow=s}}function ZE(t,e){let n=e.parameters,r=e.members??{},s=Object.keys(t.connections[e.id]??{}),i=Object.fromEntries(s.map(a=>[a,`@terminal:${a}`])),o={state_name:e.name};switch(e.type){case"lmctl/review":{let a=s.filter(l=>!["approve","request_changes","fail_pre_check","max_loops_exceeded"].includes(l));return{...o,type:"Review",...n,coder:r.coder,reviewers:r.reviewers,outcomes:{approve:i.approve??"@terminal:approve",...i.request_changes!==void 0?{request_changes:i.request_changes}:{},...i.fail_pre_check!==void 0?{fail_pre_check:i.fail_pre_check}:{},...i.max_loops_exceeded!==void 0?{max_loops_exceeded:i.max_loops_exceeded}:{}},...a.length>0?{outcomes_from_stance:Object.fromEntries(a.map(l=>[l,`@terminal:${l}`]))}:{}}}case"lmctl/consolidate":return{...o,type:"Consolidate",...n,researchers:r.researchers,consolidator:r.consolidator,outcomes:{ok:i.ok??"@terminal:ok",...i.error!==void 0?{error:i.error}:{}}};case"lmctl/interactive":return{...o,type:"Interactive",...n,agent:r.agent,outcomes:{done:i.done??"@terminal:done",...i.timeout!==void 0?{timeout:i.timeout}:{}}};case"lmctl/loop":return{...o,type:"Loop",...n,outcomes:{ok:i.ok??"@terminal:ok",...i.error!==void 0?{error:i.error}:{}}};case"lmctl/render-docx":return{...o,type:"lmctl/render-docx",...n,outcomes:{done:i.done??"@terminal:done",...i.error!==void 0?{error:i.error}:{}}};case"lmctl/render-xlsx":return{...o,type:"lmctl/render-xlsx",...n,outcomes:{done:i.done??"@terminal:done",...i.error!==void 0?{error:i.error}:{}}};case"lmctl/shell-step":return{...o,type:"ShellStep",...n,outcomes_from_exit:n.outcomes_from_exit??Object.fromEntries(s.map(a=>[a.slice(5),`@terminal:${a}`]))};case"lmctl/assert-repo-clean":return{...o,type:"AssertRepoClean",...n,next:i.main??"@terminal:main"};case"lmctl/choice":return{...o,type:"Choice",...n};case"lmctl/foreach":return{...o,type:"ForEach",...n,outcomes:{all_ok:i.all_ok??"@terminal:all_ok",...i.any_failed!==void 0?{any_failed:i.any_failed}:{}}};case"lmctl/subflow":return{...o,type:"Subflow",...n,outcomes:i};case"lmctl/terminal":return{...o,type:"Terminal",name:n.name,kind:n.kind};default:return{...o,type:e.type,...n}}}async function Zu(t,e,n,r){let s=XE().get(n.type);if(s===void 0)throw new Error(`unknown archetype: ${n.type}`);if(s.execute===void 0)throw new Error(`archetype ${n.type} has no execute() - is it a trigger-only archetype used as a step?`);let i=t.emit_progress,o=t.progress_step_id;t.emit_progress=s.description.emits_progress===!0?H1(t,s):void 0,t.progress_step_id=null;try{return await s.execute(sE(t,e,n,r??e))}finally{t.emit_progress=i,t.progress_step_id=o}}function W1(t,e){try{let n=JSON.parse(t);if(B1(n)&&n.definition_schema_version===3)return Xt.parse(n)}catch{return e}return e}function ni(t){return t.definition_schema_version===3}function Ia(t,e){let n=e===void 0?[]:Object.keys(t.connections[e.id]??{}),r=Object.fromEntries(n.map(i=>[i,{kind:i==="aborted"?"failure":"neutral"}])),s={};if(e?.type==="lmctl/loop"&&typeof e.parameters.body=="string"){let i=t.steps.find(o=>o.name===e.parameters.body);i!==void 0&&(s[e.parameters.body]=ZE(t,i))}return e?.type==="lmctl/terminal"&&typeof e.parameters.name=="string"&&(r[e.parameters.name]={kind:q1(e.parameters.kind)}),r.aborted??={kind:"failure"},{name:t.name,version:t.version,definition_schema_version:2,primitive_version:2,start_at:e?.name??t.entry_step_id,states:s,terminals:r,...t.default_task_timeout_ms!==void 0?{default_task_timeout_ms:t.default_task_timeout_ms}:{},...t.concurrency_key!==void 0?{concurrency_key:t.concurrency_key}:{},...t.concurrent_limit!==void 0?{concurrent_limit:t.concurrent_limit}:{},...t.errors!==void 0?{errors:t.errors}:{}}}function q1(t){return t==="success"||t==="failure"||t==="neutral"?t:"neutral"}function B1(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function H1(t,e){let n=`progress.${e.description.namespace}/${e.description.name}`;return r=>{try{if(typeof r.kind!="string"||r.kind.length===0)return;t.dal.insertSessionEvent({run_id:t.run_id,step_id:t.progress_step_id,kind:`${n}.${r.kind}`,timestamp_ms:Date.now(),payload:JSON.stringify({message:r.message,data:r.data})})}catch(s){let i=s instanceof Error?s.message:String(s);console.warn(`[progress] dropped ${n} event: ${i}`)}}}function cn(t,e){t.dal.setRunTerminalState(t.run_id,e);try{jw(t.run_id,t.dal)}catch{}return{run_id:t.run_id,terminal_state:e,steps_executed:t.steps_executed}}function Ye(t){return{run_id:t.run_id,terminal_state:null,steps_executed:t.steps_executed,paused:!0}}function QE(t,e){let r=t.dal.getRun(t.run_id)?.pending_escalation_decision??null;if(r===null)return null;let s;try{let a=JSON.parse(r);if(a===null||typeof a!="object"||Array.isArray(a))return null;s=a}catch{return null}let i=s[e];if(typeof i!="string")return null;delete s[e];let o=Object.keys(s).length>0?JSON.stringify(s):null;return t.dal.setRunPendingEscalationDecision(t.run_id,o),i}function ka(t,e){if(!X1(t.workflow,e)||t.errors_block_fired)return{kind:"terminal",terminal:e};let n=t.workflow.errors;return n===void 0?{kind:"terminal",terminal:e}:(t.errors_block_fired=!0,n.on_unhandled_failure_state!==void 0?{kind:"state",state:n.on_unhandled_failure_state}:(n.on_unhandled_failure!==void 0&&J1(t,e,n.on_unhandled_failure),{kind:"terminal",terminal:e}))}function X1(t,e){return t.definition_schema_version===2&&t.terminals[e]?.kind==="failure"}function J1(t,e,n){let r=G1(t),s=n.capture_evidence&&r!==null?K1(t,r.id):[];t.dal.raiseAttention({kind:n.attention_kind,severity:n.severity,project_id:t.project.id,run_id:t.run_id,payload:JSON.stringify({run_id:t.run_id,terminal_state:e,current_state:t.last_state_id,last_step_id:r?.id??null,last_error:r?.status_detail??null,evidence_paths:s,recommend_recovery:n.recommend_recovery??null})})}function G1(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 K1(t,e){return t.dal.query("SELECT path FROM step_artifact WHERE step_id = ? AND path IS NOT NULL ORDER BY id DESC",e).map(r=>r.path)}function eT(t){if(!GE.includes(t.definition_schema_version))throw new Error(`unsupported definition_schema_version ${t.definition_schema_version}; supported versions: ${GE.join(", ")}`)}var GE,tT=E(()=>{"use strict";Fr();Pw();qw();nt();JE();ks();GE=[1,2,3]});import{readFileSync as V1,readdirSync as Y1}from"node:fs";import{basename as z1,join as Z1,resolve as Q1}from"node:path";function sT(t={}){let e=Q1(t.workflowsDir??"workflows"),n=Y1(e).filter(r=>r.endsWith(".compound.json")).sort((r,s)=>r.localeCompare(s));return{generated_at:new Date().toISOString(),workflows_dir:e,rows:n.map(r=>eF(Z1(e,r)))}}function eF(t){let e=z1(t);try{let n=V1(t,"utf8"),r=vt(n);return aT(e,r)}catch(n){return{file:e,workflow_name:null,status:"FAIL",first_step_id:null,first_step_type:null,first_step_disposition:null,note:lT(n)}}}function iT(t,e){try{let n=vt(e);return aT(t,n)}catch(n){return{file:t,workflow_name:t,status:"FAIL",first_step_id:null,first_step_type:null,first_step_disposition:null,note:lT(n)}}}function oT(t){let e=[];e.push(`workflow verification - ${t.generated_at}`),e.push(`dir: ${t.workflows_dir}`),e.push(""),e.push(`${"status".padEnd(17)} ${"workflow".padEnd(36)} ${"first step".padEnd(52)} note`),e.push(`${"-".repeat(17)} ${"-".repeat(36)} ${"-".repeat(52)} ${"-".repeat(30)}`);for(let i of t.rows){let o=(i.workflow_name??i.file).slice(0,36).padEnd(36),a=`${i.first_step_id??"-"}${i.first_step_type===null?"":` (${i.first_step_type})`}`;e.push(`${i.status.padEnd(17)} ${o} ${a.slice(0,52).padEnd(52)} ${i.note}`)}let n=t.rows.filter(i=>i.status==="PASS").length,r=t.rows.filter(i=>i.status==="PASS_NEEDS_INPUTS").length,s=t.rows.filter(i=>i.status==="FAIL").length;return e.push(""),e.push(`summary: ${n} pass, ${r} pass_needs_inputs, ${s} fail`),`${e.join(`
@@ -2208,7 +2208,7 @@ ${p.text}`,["approve","request_changes"],!0,s,e.writes_to_project_path===!0)));i
2208
2208
  WHERE w.name = ?
2209
2209
  ORDER BY pw.id DESC`,"newspaper")}function IT(t,e){for(let n of[...e.steps].reverse()){let r=t.getInteractiveSessionByStepId(n.id);if(r!==null)return r}return null}function NT(t,e){let n=Number(at(e.project_id));return Number.isInteger(n)?t.getProject(n):null}function jF(t){let e=at(t.schedule)||"daily";return e==="weekly"?{preset:e,cron:"0 6 * * 1"}:e==="custom"?{preset:e,cron:at(t.cron).trim()||"0 6 * * *"}:{preset:"daily",cron:"0 6 * * *"}}function wT(t){let e=t.req.param("workflow");return rf.includes(e)?e:null}function Jr(t){return Oa.find(e=>e.name===t)?.title??t}function PF(t){return t.split(/[_:-]/).filter(Boolean).map(e=>`${e[0]?.toUpperCase()??""}${e.slice(1)}`).join(" ")}function of(t){return hF.parse(t,{async:!1})}function FF(t){return t==="done"||t==="pr_ready"||t==="merged"}function UF(t){return t.replace(/\n*STANCE:\s+\S+\s*$/,"").trimEnd()}function WF(t,e){return t.split(`
2210
2210
  `).slice(0,e).join(`
2211
- `)}function qF(t){return t.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"")}function at(t){return typeof t=="string"?t:""}function BF(t){if(t===null)return{};try{let e=JSON.parse(t);if(e!==null&&typeof e=="object"&&!Array.isArray(e))return e}catch{return{}}return{}}function nf(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function La(t,e){return Number(t.req.param(e))}var Oa,rf,AT=E(()=>{"use strict";Ra();sn();Cu();Oa=[{name:"info-qa",title:"Ask a Question",description:"Get a grounded answer from multiple researchers and one consolidator."},{name:"document-creation",title:"Create a Document",description:"Draft, review, and render a polished document with an interactive wizard."},{name:"newspaper",title:"Daily Newspaper",description:"Subscribe to recurring digests for topics you care about."}],rf=Oa.map(t=>t.name)});function XF(t){return t.replace(/^\/+/,"")}function xT(t){return typeof t=="string"&&t!==""&&!t.includes("/")&&!t.includes("\\")}function Gr(t){if(t.mailboxKey!==void 0&&t.mailboxKey!==null&&t.mailboxKey!==""){let e=XF(t.mailboxKey),n=e.lastIndexOf("/");return(n>=0?e.slice(n+1):e).includes(".")&&(e=n>=0?e.slice(0,n+1):""),e!==""&&!e.endsWith("/")&&(e+="/"),e}return xT(t.userId)&&xT(t.deviceId)?`${t.userId}/${t.deviceId}/`:`${HF}/${t.identityId}/`}function GF(t){return String(Math.max(0,Math.floor(t))).padStart(JF,"0")}function af(t,e,n){return`${t}${e}${GF(n)}.json`}function Ca(t,e){return`${t}${e}`}function $a(t,e,n){let r=`${e}${n}`;if(!t.startsWith(r))return;let s=t.slice(r.length).match(/^(\d+)\.json$/);if(s===null)return;let i=Number(s[1]);return Number.isSafeInteger(i)?i:void 0}var HF,JF,Ma=E(()=>{"use strict";HF="mailbox";JF=12});function dn(t,e){let n=Math.floor(t),r="",s=n;for(let u=0;u<12;u++)r=Da[s&15]+r,s=Math.floor(s/16);let i=Math.floor(e()*4096)&4095,o="",a=i;for(let u=0;u<3;u++)o=Da[a&15]+o,a=a>>4;let l=Da[8|Math.floor(e()*4)&3],c="";for(let u=0;u<15;u++)c+=Da[Math.floor(e()*16)&15];return r.slice(0,8)+"-"+r.slice(8,12)+"-7"+o+"-"+l+c.slice(0,3)+"-"+c.slice(3,15)}var Da,ja=E(()=>{"use strict";Da="0123456789abcdef"});function cf(t,e){return!Number.isFinite(t)||t<=0?e:t}function df(t){if(t===null||typeof t!="object")return!1;let e=t;return e.name==="NoSuchKey"||e.name==="NotFound"||e.Code==="NoSuchKey"||e.code==="NoSuchKey"||e.$metadata!==void 0&&e.$metadata.httpStatusCode===404}function $T(t){return t.conversation_id===CT&&YF(t.payload)}function YF(t){return typeof t=="object"&&t!==null&&t.kind==="heartbeat"}function zF(t){let e=typeof t.hb=="string"&&t.hb!==""?t.hb:$T(t)?t.timestamp:void 0;if(e===void 0)return;let n=Date.parse(e);return Number.isFinite(n)?n:void 0}var RT,LT,OT,KF,CT,VF,lf,lr,Pa=E(()=>{"use strict";Ma();ja();RT=3e3,LT=1e4,OT=12e3,KF=1e3,CT="__lmctl_heartbeat__",VF={kind:"heartbeat"},lf={setTimeout:(t,e)=>setTimeout(t,e),clearTimeout:t=>clearTimeout(t)},lr=class{opts;basePrefix;ownStream;peerStream;cursor;ownSeq;bootstrapped=!1;bootstrapInFlight=null;bootstrapPromise=null;writeChain=Promise.resolve();readIntervalMs;heartbeatIdleMs;backoffReadIntervalMs;running=!1;stopped=!1;stopRequested=!1;timerHandle=null;heartbeatTimerHandle=null;lastWriteMs;lastPeerHeartbeatMs;tickInFlight=null;constructor(e){this.opts=e,this.basePrefix=Gr({identityId:e.identityId,userId:e.userId,deviceId:e.deviceId,mailboxKey:e.mailboxKey}),this.ownStream=e.selfRole==="agent"?"local":"web",this.peerStream=e.selfRole==="agent"?"web":"local",this.cursor=e.cursor,this.readIntervalMs=cf(e.readIntervalMs??e.pollIntervalMs??RT,RT),this.heartbeatIdleMs=cf(e.heartbeatIdleMs??LT,LT),this.backoffReadIntervalMs=cf(e.backoffReadIntervalMs??e.pollIntervalMs??OT,OT)}start(){if(this.stopped)throw new Error("SequentialMailboxClient: cannot start after stop()");this.running||(this.running=!0,this.bootstrapInFlight=this.bootstrapThenRun())}async stop(){this.stopped=!0,this.stopRequested=!0;let e=this.opts.timers??lf;if(this.timerHandle!==null&&(e.clearTimeout(this.timerHandle),this.timerHandle=null),this.heartbeatTimerHandle!==null&&(e.clearTimeout(this.heartbeatTimerHandle),this.heartbeatTimerHandle=null),this.bootstrapInFlight!==null)try{await this.bootstrapInFlight}catch{}if(this.tickInFlight!==null)try{await this.tickInFlight}catch{}this.running=!1}async putMessage(e){return this.putEnvelope(e.conversation_id,e.payload)}getCursor(){return this.cursor}getMailboxBasePrefix(){return this.basePrefix}setPollIntervalMs(e){if(!Number.isFinite(e)||e<=0)throw new Error(`SequentialMailboxClient.setPollIntervalMs: invalid ms=${e}`);this.readIntervalMs=e}isPeerOn(){return this.peerIsOn((this.opts.now??Date.now)())}async bootstrapThenRun(){if(await this.ensureBootstrapped(),this.stopRequested){this.running=!1;return}this.runTick(),this.writeHeartbeat()}ensureBootstrapped(){return this.bootstrapped?Promise.resolve():(this.bootstrapPromise===null&&(this.bootstrapPromise=this.runColdStart()),this.bootstrapPromise)}async runColdStart(){try{let e=await this.maxSeq(this.ownStream);this.ownSeq=e,this.cursor===void 0&&(this.cursor=await this.maxSeq(this.peerStream)),this.bootstrapped=!0}catch(e){throw this.bootstrapPromise=null,this.emitError(e,"list"),e}}async maxSeq(e){let n=Ca(this.basePrefix,e),r=0,s;do{let i=await this.opts.s3.send(new this.opts.commands.ListObjectsV2Command({Bucket:this.opts.bucket,Prefix:n,MaxKeys:KF,...s!==void 0&&{ContinuationToken:s}}));this.opts.onS3Op?.("list");for(let o of i.Contents??[]){let a=$a(o.Key??"",this.basePrefix,e);a!==void 0&&a>r&&(r=a)}s=i.IsTruncated===!0?i.NextContinuationToken:void 0}while(s!==void 0);return r}async putEnvelope(e,n){let r=this.writeChain.then(()=>this.doPut(e,n));return this.writeChain=r.catch(()=>{}),r}async doPut(e,n){await this.ensureBootstrapped();let r=(this.opts.now??Date.now)(),s=new Date(r).toISOString(),i={message_id:dn(r,this.opts.random??Math.random),from:this.opts.selfRole,timestamp:s,hb:s,conversation_id:e,payload:n},o=(this.ownSeq??0)+1,a=af(this.basePrefix,this.ownStream,o);return await this.opts.s3.send(new this.opts.commands.PutObjectCommand({Bucket:this.opts.bucket,Key:a,Body:JSON.stringify(i),ContentType:"application/json"})),this.opts.onS3Op?.("put"),this.ownSeq=o,this.recordWrite(r),a}scheduleNextTick(e){if(this.stopRequested)return;let n=this.opts.timers??lf;this.timerHandle=n.setTimeout(()=>{this.timerHandle=null,this.runTick()},e)}runTick(){this.stopRequested||(this.tickInFlight=(async()=>{try{await this.pollOnce()}finally{this.tickInFlight=null,this.stopRequested||this.scheduleNextTick(this.nextReadDelayMs())}})())}async pollOnce(){for(;!this.stopRequested;){let e=(this.cursor??0)+1,n=af(this.basePrefix,this.peerStream,e),r;try{let i=await this.opts.s3.send(new this.opts.commands.GetObjectCommand({Bucket:this.opts.bucket,Key:n}));if(this.opts.onS3Op?.("get"),i.Body===void 0){this.emitError(new Error(`GetObject ${n}: empty body`),"get"),this.advanceCursor(e);continue}r=await i.Body.transformToString("utf-8")}catch(i){if(df(i)){this.opts.onS3Op?.("get");return}this.emitError(i,"get");return}let s;try{s=JSON.parse(r)}catch(i){this.emitError(i,"get"),this.advanceCursor(e);continue}if(this.recordPeerHeartbeat(s),$T(s)){this.advanceCursor(e);continue}try{await this.opts.onMessage(s)}catch(i){this.emitError(i,"handle");return}this.advanceCursor(e)}}advanceCursor(e){this.cursor=e,this.notifyCursorAdvance(e)}nextReadDelayMs(){return this.peerIsOn((this.opts.now??Date.now)())?this.readIntervalMs:this.backoffReadIntervalMs}peerIsOn(e){return this.lastPeerHeartbeatMs!==void 0&&e-this.lastPeerHeartbeatMs<=this.heartbeatIdleMs}recordPeerHeartbeat(e){let n=zF(e);n!==void 0&&(this.lastPeerHeartbeatMs=n)}recordWrite(e){this.lastWriteMs=e,this.scheduleHeartbeatCheck(this.heartbeatIdleMs)}scheduleHeartbeatCheck(e){if(this.stopRequested)return;let n=this.opts.timers??lf;this.heartbeatTimerHandle!==null&&n.clearTimeout(this.heartbeatTimerHandle),this.heartbeatTimerHandle=n.setTimeout(()=>{this.heartbeatTimerHandle=null,this.maybeWriteHeartbeat()},e)}async maybeWriteHeartbeat(){if(this.stopRequested)return;let e=(this.opts.now??Date.now)();if(this.lastWriteMs!==void 0){let n=e-this.lastWriteMs;if(n<this.heartbeatIdleMs){this.scheduleHeartbeatCheck(this.heartbeatIdleMs-n);return}}await this.writeHeartbeat()}async writeHeartbeat(){try{await this.putEnvelope(CT,VF)}catch(e){this.emitError(e,"put"),this.scheduleHeartbeatCheck(this.heartbeatIdleMs)}}notifyCursorAdvance(e){if(this.opts.onCursorAdvance!==void 0)try{this.opts.onCursorAdvance(e)}catch(n){this.emitError(n,"handle")}}emitError(e,n){if(this.opts.onError!==void 0)try{this.opts.onError(e,n)}catch{}else console.error(`SequentialMailboxClient[${n}]`,e)}}});import{getConnInfo as ZF}from"@hono/node-server/conninfo";function MT(t,e){let n=e.bucket??QF,r=e.remoteAddressOf??(i=>tU(i)),s=i=>{let o=r(i);return nU(o)?null:i.json({error:"forbidden",message:"local-mailbox is loopback-only"},403)};t.get("/local-mailbox/object",async i=>{let o=s(i);if(o!==null)return o;let a=uf(i.req.query("key"));if(typeof a!="string")return i.json({error:"bad_request",message:a.error},400);try{let l=await e.s3.send(new e.commands.GetObjectCommand({Bucket:n,Key:a}));if(l.Body===void 0)return i.json({error:"empty_body"},404);let c=await l.Body.transformToString("utf-8");return i.body(c,200,{"Content-Type":"application/octet-stream"})}catch(l){return df(l)?i.json({error:"not_found"},404):i.json({error:"internal",message:ff(l)},500)}}),t.put("/local-mailbox/object",async i=>{let o=s(i);if(o!==null)return o;let a=uf(i.req.query("key"));if(typeof a!="string")return i.json({error:"bad_request",message:a.error},400);let l=new Uint8Array(await i.req.arrayBuffer());try{return await e.s3.send(new e.commands.PutObjectCommand({Bucket:n,Key:a,Body:l})),i.json({ok:!0})}catch(c){return i.json({error:"internal",message:ff(c)},500)}}),t.get("/local-mailbox/list",async i=>{let o=s(i);if(o!==null)return o;let a=i.req.query("prefix")??"",l=uf(a,{allowEmpty:!0});if(typeof l!="string")return i.json({error:"bad_request",message:l.error},400);let c=eU(i.req.query("maxKeys")),u=i.req.query("token");try{let d=await e.s3.send(new e.commands.ListObjectsV2Command({Bucket:n,Prefix:l,...c!==void 0?{MaxKeys:c}:{},...u!==void 0&&u!==""?{ContinuationToken:u}:{}}));return i.json({Contents:(d.Contents??[]).map(f=>({Key:f.Key,LastModified:f.LastModified instanceof Date?f.LastModified.toISOString():f.LastModified})),IsTruncated:d.IsTruncated??!1,...d.NextContinuationToken!==void 0?{NextContinuationToken:d.NextContinuationToken}:{}})}catch(d){return i.json({error:"internal",message:ff(d)},500)}})}function uf(t,e={}){if(t===void 0||t==="")return e.allowEmpty===!0?"":{error:"key required"};let n=t.replace(/^\/+/,"");return n.split("/").includes("..")?{error:"key must not contain '..'"}:n}function eU(t){if(t===void 0||t==="")return;let e=Number(t);return Number.isInteger(e)&&e>0?e:void 0}function tU(t){try{return ZF(t).remote.address}catch{return}}function nU(t){return t===void 0||t===""?!1:!!(t==="127.0.0.1"||t==="::1"||t.startsWith("::ffff:127.")||t.startsWith("127."))}function ff(t){return t instanceof Error?t.message:String(t)}var QF,DT=E(()=>{"use strict";Pa();QF="local"});function jT(t,e){t.get("/mailbox/workspace",n=>iU(n,e)),t.get("/mailbox/projects",n=>oU(n,e)),t.get("/mailbox/projects/:id",n=>aU(n,e)),t.post("/mailbox/projects",n=>lU(n,e)),t.patch("/mailbox/projects/:id",n=>cU(n,e)),t.delete("/mailbox/projects/:id",n=>dU(n,e)),t.post("/mailbox/projects/:project_id/prompts",n=>uU(n,e)),t.get("/mailbox/prompts/:id",n=>fU(n,e))}function iU(t,e){e.dal.ensureWorkspace({id:Vr,name:mf});let n=PT(e.dal),r={id:Vr,name:mf,created_at:sU,projects:n};return t.json({workspace:r})}function oU(t,e){return t.json({projects:PT(e.dal)})}function aU(t,e){let n=t.req.param("id");if(n===void 0||n==="")return t.json({error:"bad_request",message:"project id required"},400);if(n.startsWith(Kr)){let s=pf(e.dal,n);return s===null||s.deleted_at!==null?t.json({project:null},404):t.json({project:Wa(s)})}let r=UT(e.dal,n);return r===null?t.json({project:null},404):t.json({project:FT(r)})}async function lU(t,e){let n;try{n=await t.req.json()}catch{return t.json({error:"bad_request",message:"invalid JSON body"},400)}let r=n.input;if(r===void 0||typeof r!="object")return t.json({error:"bad_request",message:"input is required"},400);if(typeof r.name!="string"||r.name==="")return t.json({error:"bad_request",message:"input.name is required"},400);if(typeof r.repo_path!="string"||r.repo_path==="")return t.json({error:"bad_request",message:"input.repo_path is required"},400);e.dal.ensureWorkspace({id:Vr,name:mf});let s=e.dal.insertWebProject({workspace_id:Vr,name:r.name,repo_path:r.repo_path,config_json:r.config_json===void 0?null:JSON.stringify(r.config_json)});return t.json({project:Wa(s)},201)}async function cU(t,e){let n=t.req.param("id");if(n===void 0||n==="")return t.json({error:"bad_request",message:"project id required"},400);let r;try{r=await t.req.json()}catch{return t.json({error:"bad_request",message:"invalid JSON body"},400)}let s=r.input??{};if(n.startsWith(Kr)){let i=pf(e.dal,n);if(i===null||i.deleted_at!==null)return t.json({error:"project_not_found",message:`project not found: ${n}`},404);let o=e.dal.updateWebProject({id:i.id,name:s.name===void 0?void 0:s.name,config_json:s.config_json===void 0?void 0:JSON.stringify(s.config_json)});return o===null?t.json({error:"project_not_found",message:`project not found: ${n}`},404):t.json({project:Wa(o)})}return t.json({error:"project_not_found",message:`project not found: ${n}`},404)}function dU(t,e){let n=t.req.param("id");if(n===void 0||n==="")return t.json({error:"bad_request",message:"project id required"},400);if(n.startsWith(Kr)){let r=pf(e.dal,n);if(r===null)return t.json({deleted:!1});let s=e.dal.softDeleteWebProject(r.id);return t.json({deleted:s})}return t.json({deleted:!1})}async function uU(t,e){let n=t.req.param("project_id");if(n===void 0||n==="")return t.json({error:"bad_request",message:"project_id required in path"},400);let r;try{r=await t.req.json()}catch{return t.json({error:"bad_request",message:"invalid JSON body"},400)}let s=r.input;if(s===void 0||typeof s!="object")return t.json({error:"bad_request",message:"input is required"},400);let i=s.project_id??n;if(typeof s.text!="string"||s.text==="")return t.json({error:"bad_request",message:"input.text is required"},400);let o=UT(e.dal,i);if(o===null)return t.json({error:"project_not_found",message:`project not found: ${i}`},404);if(e.dal.getWorkflowByName(o.workflow_name)===null)return t.json({error:"workflow_not_registered",message:`project ${o.name} has no registered workflow "${o.workflow_name}"`},400);let l=`${rU}${crypto.randomUUID()}`,c={text:s.text,context_json:s.context_json??null},u;e.enqueueProjectJob!==void 0?u=e.enqueueProjectJob({dal:e.dal,project_id:o.id,source_ref:l,payload:c}):u=await mU({dal:e.dal,project_id:o.id,source_ref:l,payload:c}),e.dal.insertPromptDispatch({prompt_id:l,project_id:o.id,job_id:u.id,text:s.text,context_json:s.context_json===void 0?null:JSON.stringify(s.context_json)});let d={id:l,project_id:`${Ua}${o.id}`,text:s.text,status:"pending",created_at:new Date().toISOString(),completed_at:null};return t.json({prompt:d},201)}function fU(t,e){let n=t.req.param("id");if(n===void 0||n==="")return t.json({error:"bad_request",message:"prompt id required"},400);let r=pU(e.dal,n);return t.json({result:r})}function PT(t){let e=t.listProjects().map(FT),n=t.listWebProjectsActive(Vr).map(Wa);return[...e,...n].sort(bU)}function FT(t){return{id:`${Ua}${t.id}`,workspace_id:Vr,name:t.name,repo_path:t.local_path,config_json:{workflow_name:t.workflow_name,team_id:t.team_id,durable_memory_mode:t.durable_memory_mode},last_active_at:null,created_at:t.created_at}}function Wa(t){let e={};if(t.config_json!==null)try{let n=JSON.parse(t.config_json);n!==null&&typeof n=="object"&&(e=n)}catch{}return t.linked_v4_project_id!==null&&(e={...e,linked_v4_project_id:t.linked_v4_project_id}),{id:`${Kr}${t.id}`,workspace_id:t.workspace_id,name:t.name,repo_path:t.repo_path,config_json:e,last_active_at:t.last_active_at,created_at:t.created_at}}function pf(t,e){if(!e.startsWith(Kr))return null;let n=e.slice(Kr.length),r=Number.parseInt(n,10);return!Number.isFinite(r)||String(r)!==n?null:t.getWebProject(r)}function UT(t,e){if(e.startsWith(Ua)){let r=e.slice(Ua.length),s=Number.parseInt(r,10);if(Number.isFinite(s)&&String(s)===r)return t.getProject(s)}let n=Number.parseInt(e,10);return Number.isFinite(n)&&String(n)===e?t.getProject(n):null}async function mU(t){let{enqueueManual:e}=await Promise.resolve().then(()=>(Tu(),sw));return{id:e(t.dal,{project_id:t.project_id,source_ref:t.source_ref,payload:t.payload}).id}}function pU(t,e){let n=t.getPromptDispatch(e);if(n===null)return{prompt_id:e,data:{status:"unknown"},errors_json:{error:"prompt_not_found"},duration_ms:null};let r=t.getJob(n.job_id);if(r===null)return{prompt_id:e,data:null,errors_json:{error:"job_missing",job_id:n.job_id},duration_ms:null};let s=r.run_id===null?null:t.getRun(r.run_id),i=t.getProject(n.project_id),o=TU(t,i?.team_id??null),a=EU(s),l=SU(r,a,o.length>0),c=vU(n.created_at,s),u=i===null?{totalEstimatedMs:void 0,perStep:new Map}:_U(t,i.workflow_name),d=u.totalEstimatedMs,f=WT(n.created_at),m=i?.workflow_name,p=u.perStep.size>0?u.perStep.size:void 0,_=s===null?[]:hU(t,s.id),h=gU(s,a,_,u.perStep,o),g=yU(_,u.perStep),w=wU(h,g,d,f,m,p);return l==="error"?{prompt_id:e,data:{status:l,job_id:r.id,project_id:n.project_id,run_id:s?.id??null,...Fa(d,f),...w},errors_json:{error:r.last_error??"job_failed",job_id:r.id,run_id:s?.id??null},duration_ms:c}:l==="done"?(n.completed_at===null&&t.setPromptDispatchCompleted(e),{prompt_id:e,data:{status:l,job_id:r.id,project_id:n.project_id,run_id:s?.id??null,terminal_state:s?.terminal_state??null,text:n.text,...Fa(d,f),...w},errors_json:null,duration_ms:c}):l==="paused"?{prompt_id:e,data:{status:l,job_id:r.id,project_id:n.project_id,run_id:s?.id??null,attempt_count:r.attempt_count,paused_step:a,attention_needed:o,...Fa(d,f),...w},errors_json:null,duration_ms:c}:{prompt_id:e,data:{status:l,job_id:r.id,project_id:n.project_id,run_id:s?.id??null,attempt_count:r.attempt_count,...Fa(d,f),...w},errors_json:null,duration_ms:c}}function _U(t,e){let n={totalEstimatedMs:void 0,perStep:new Map},r=t.getWorkflowByName(e);if(r===null)return n;let s;try{s=JSON.parse(r.definition)}catch{return n}if(s===null||typeof s!="object")return n;let i=s,o=typeof i.estimated_duration_ms=="number"&&Number.isFinite(i.estimated_duration_ms)&&i.estimated_duration_ms>=0?i.estimated_duration_ms:void 0,a=new Map;if(Array.isArray(i.steps))for(let l of i.steps){if(l===null||typeof l!="object")continue;let c=l;if(typeof c.id!="string"||c.id.length===0)continue;let u=typeof c.name=="string"&&c.name.length>0?c.name:c.id,d=typeof c.estimated_duration_ms=="number"&&Number.isFinite(c.estimated_duration_ms)&&c.estimated_duration_ms>=0?c.estimated_duration_ms:void 0;a.set(c.id,d===void 0?{name:u}:{name:u,estimated_duration_ms:d})}if(i.steps===void 0&&i.states!==null&&typeof i.states=="object")for(let[l,c]of Object.entries(i.states)){if(c===null||typeof c!="object")continue;let u=c,d=typeof u.estimated_duration_ms=="number"&&Number.isFinite(u.estimated_duration_ms)&&u.estimated_duration_ms>=0?u.estimated_duration_ms:void 0;a.set(l,d===void 0?{name:l}:{name:l,estimated_duration_ms:d})}return{totalEstimatedMs:o,perStep:a}}function hU(t,e){try{return t.listStepsForRun(e)}catch{return[]}}function gU(t,e,n,r,s){if(t===null||t.terminal_state!==null)return;let i=e!==null?e:t.current_state;if(i===null||i.length===0)return;let a=[...n].reverse().find(f=>f.state_name===i&&f.ended_at===null)?.started_at??t.paused_at??t.started_at,l=r.get(i),c=l?.name??i,u=WT(a),d={id:i,name:c,started_at:a,elapsed_ms:u};return l?.estimated_duration_ms!==void 0&&(d.estimated_duration_ms=l.estimated_duration_ms),s.length>0&&(d.attention_needed=s),d}function yU(t,e){let n=[];for(let r of t){if(r.ended_at===null)continue;let s=Date.parse(r.started_at),i=Date.parse(r.ended_at),o=Number.isFinite(s)&&Number.isFinite(i)?Math.max(0,i-s):0,a=e.get(r.state_name)?.name??r.state_name,l=r.outcome==="failed"?"failed":"done";n.push({id:r.state_name,name:a,duration_ms:o,status:l})}return n}function wU(t,e,n,r,s,i){let o={completed_steps:e,total_elapsed_ms:r};return t!==void 0&&(o.current_step=t),n!==void 0&&(o.total_estimated_ms=n),s!==void 0&&s.length>0&&(o.workflow_name=s),i!==void 0&&(o.total_steps=i),o}function WT(t){let e=Date.parse(t);return Number.isNaN(e)?0:Math.max(0,Date.now()-e)}function Fa(t,e){return t===void 0?{elapsed_ms:e}:{elapsed_ms:e,estimated_duration_ms:t}}function EU(t){if(t===null)return null;let e=t.current_state;if(e===null)return null;let n="__paused__:";return e.startsWith(n)?e.slice(n.length):null}function TU(t,e){if(e===null)return[];let n;try{n=t.listTeamMembers(e)}catch{return[]}return n.filter(r=>r.state==="attention_needed").map(r=>({alias:r.alias,reason:r.state_reason}))}function SU(t,e,n){return t.status==="queued"?"pending":t.status==="done"?"done":t.status==="failed"?"error":e!==null||n||t.status==="paused"?"paused":t.status==="running"?"running":"error"}function vU(t,e){let n=Date.parse(t);if(Number.isNaN(n))return null;let r=e?.ended_at??null,s=r===null?Date.now():Date.parse(r);return Number.isNaN(s)?null:Math.max(0,s-n)}function bU(t,e){let n=Date.parse(t.last_active_at??""),r=Date.parse(e.last_active_at??""),s=(Number.isNaN(r)?0:r)-(Number.isNaN(n)?0:n);return s===0?t.name.localeCompare(e.name):s}var Ua,Kr,rU,Vr,mf,sU,qT=E(()=>{"use strict";Ua="project:",Kr="web_project:",rU="prompt:",Vr="default",mf="Default workspace",sU=new Date(0).toISOString()});import{Buffer as BT}from"node:buffer";function HT(t,e,n){if(typeof t=="number"&&Number.isFinite(t)&&t>0)return t;if(e!==void 0&&e!==""){let r=Number(e);if(Number.isFinite(r)&&r>0)return r}return n}function XT(t){return NU[t]}function JT(t){let e=t.trim();if(e==="")return;let n=e.split(/\s+/),r=n.shift();if(!(r===void 0||r===""))return{cmd:r,args:n}}var kU,IU,qa,NU,_f=E(()=>{"use strict";kU=1e4,IU=256*1024,qa=class{opts;sessions=new Map;pushWindowMs;pushByteCap;timers;constructor(e){this.opts=e,this.pushWindowMs=HT(e.pushWindowMs,process.env.LMCTL_TERMINAL_PUSH_WINDOW_MS,kU),this.pushByteCap=HT(e.pushByteCap,process.env.LMCTL_TERMINAL_PUSH_BYTE_CAP,IU),this.timers=e.timers??{setTimeout:(n,r)=>globalThis.setTimeout(n,r),clearTimeout:n=>globalThis.clearTimeout(n)}}startSession(e){if(this.sessions.has(e.session_id))throw new Error(`terminal_session_already_exists: ${e.session_id}`);let n=this.opts.pty.spawn(e.command,e.args,{name:"xterm-256color",cols:e.cols??120,rows:e.rows??30,cwd:e.cwd??process.cwd(),env:e.env??process.env}),r={session_id:e.session_id,pty:n,pendingOutput:[],pendingBytes:0,pushTimer:void 0,closed:!1};return this.sessions.set(e.session_id,r),n.onData(s=>{this.onPtyData(r,s)}),n.onExit(s=>{this.onPtyExit(r,s)}),this.opts.log?.(`[dt-2] terminal session ${e.session_id} started pid=${n.pid} cmd=${e.command}`),{pid:n.pid}}endSession(e){let n=this.sessions.get(e);if(n!==void 0)try{n.pty.kill()}catch{}}onInbound(e){if(e.direction!=="user_to_agent")return;let n=this.sessions.get(e.session_id);if(n===void 0){this.opts.log?.(`[dt-2] inbound terminal data for unknown session ${e.session_id}; dropping`);return}if(n.closed){this.opts.log?.(`[dt-2] inbound terminal data for closed session ${e.session_id}; dropping`);return}try{n.pty.write(e.data)}catch(r){this.opts.log?.(`[dt-2] pty.write failed for session ${e.session_id}: ${r instanceof Error?r.message:String(r)}`)}}setPublish(e){this.opts={...this.opts,publish:e}}listSessions(){return Array.from(this.sessions.values()).map(e=>({session_id:e.session_id,pid:e.pty.pid}))}pendingBytesFor(e){return this.sessions.get(e)?.pendingBytes}async stop(){for(let e of Array.from(this.sessions.values()))try{e.pty.kill()}catch{}for(let e of Array.from(this.sessions.values()))e.pushTimer!==void 0&&(this.timers.clearTimeout(e.pushTimer),e.pushTimer=void 0)}onPtyData(e,n){if(!e.closed){if(e.pendingOutput.push(n),e.pendingBytes+=BT.byteLength(n,"utf8"),e.pendingBytes>=this.pushByteCap){this.flush(e,"byte_cap");return}e.pushTimer===void 0&&(e.pushTimer=this.timers.setTimeout(()=>{this.flush(e,"window_idle")},this.pushWindowMs))}}async flush(e,n){if(e.pushTimer!==void 0&&(this.timers.clearTimeout(e.pushTimer),e.pushTimer=void 0),e.pendingOutput.length===0)return;let r=e.pendingOutput.join("");e.pendingOutput=[],e.pendingBytes=0;let s={kind:"terminal",session_id:e.session_id,direction:"agent_to_user",data:r,ts:(this.opts.now??Date.now)()};try{await this.opts.publish(s),this.opts.log?.(`[dt-2] flushed session=${e.session_id} reason=${n} bytes=${BT.byteLength(r,"utf8")}`)}catch(i){this.opts.log?.(`[dt-2] publish failed session=${e.session_id} reason=${n}: ${i instanceof Error?i.message:String(i)}`)}}async onPtyExit(e,n){if(e.closed)return;await this.flush(e,"pty_exit");let r=`\r
2211
+ `)}function qF(t){return t.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"")}function at(t){return typeof t=="string"?t:""}function BF(t){if(t===null)return{};try{let e=JSON.parse(t);if(e!==null&&typeof e=="object"&&!Array.isArray(e))return e}catch{return{}}return{}}function nf(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function La(t,e){return Number(t.req.param(e))}var Oa,rf,AT=E(()=>{"use strict";Ra();sn();Cu();Oa=[{name:"info-qa",title:"Ask a Question",description:"Get a grounded answer from multiple researchers and one consolidator."},{name:"document-creation",title:"Create a Document",description:"Draft, review, and render a polished document with an interactive wizard."},{name:"newspaper",title:"Daily Newspaper",description:"Subscribe to recurring digests for topics you care about."}],rf=Oa.map(t=>t.name)});function XF(t){return t.replace(/^\/+/,"")}function xT(t){return typeof t=="string"&&t!==""&&!t.includes("/")&&!t.includes("\\")}function Gr(t){if(t.mailboxKey!==void 0&&t.mailboxKey!==null&&t.mailboxKey!==""){let e=XF(t.mailboxKey),n=e.lastIndexOf("/");return(n>=0?e.slice(n+1):e).includes(".")&&(e=n>=0?e.slice(0,n+1):""),e!==""&&!e.endsWith("/")&&(e+="/"),e}return xT(t.userId)&&xT(t.deviceId)?`${t.userId}/${t.deviceId}/`:`${HF}/${t.identityId}/`}function GF(t){return String(Math.max(0,Math.floor(t))).padStart(JF,"0")}function af(t,e,n){return`${t}${e}${GF(n)}.json`}function Ca(t,e){return`${t}${e}`}function $a(t,e,n){let r=`${e}${n}`;if(!t.startsWith(r))return;let s=t.slice(r.length).match(/^(\d+)\.json$/);if(s===null)return;let i=Number(s[1]);return Number.isSafeInteger(i)?i:void 0}var HF,JF,Ma=E(()=>{"use strict";HF="mailbox";JF=12});function dn(t,e){let n=Math.floor(t),r="",s=n;for(let u=0;u<12;u++)r=Da[s&15]+r,s=Math.floor(s/16);let i=Math.floor(e()*4096)&4095,o="",a=i;for(let u=0;u<3;u++)o=Da[a&15]+o,a=a>>4;let l=Da[8|Math.floor(e()*4)&3],c="";for(let u=0;u<15;u++)c+=Da[Math.floor(e()*16)&15];return r.slice(0,8)+"-"+r.slice(8,12)+"-7"+o+"-"+l+c.slice(0,3)+"-"+c.slice(3,15)}var Da,ja=E(()=>{"use strict";Da="0123456789abcdef"});function cf(t,e){return!Number.isFinite(t)||t<=0?e:t}function df(t){if(t===null||typeof t!="object")return!1;let e=t;return e.name==="NoSuchKey"||e.name==="NotFound"||e.Code==="NoSuchKey"||e.code==="NoSuchKey"||e.$metadata!==void 0&&e.$metadata.httpStatusCode===404}function $T(t){return t.conversation_id===CT&&YF(t.payload)}function YF(t){return typeof t=="object"&&t!==null&&t.kind==="heartbeat"}function zF(t){let e=typeof t.hb=="string"&&t.hb!==""?t.hb:$T(t)?t.timestamp:void 0;if(e===void 0)return;let n=Date.parse(e);return Number.isFinite(n)?n:void 0}var RT,LT,OT,KF,CT,VF,lf,lr,Pa=E(()=>{"use strict";Ma();ja();RT=3e3,LT=1e4,OT=12e3,KF=1e3,CT="__lmctl_heartbeat__",VF={kind:"heartbeat"},lf={setTimeout:(t,e)=>setTimeout(t,e),clearTimeout:t=>clearTimeout(t)},lr=class{opts;basePrefix;ownStream;peerStream;cursor;ownSeq;bootstrapped=!1;bootstrapInFlight=null;bootstrapPromise=null;writeChain=Promise.resolve();readIntervalMs;heartbeatIdleMs;backoffReadIntervalMs;running=!1;stopped=!1;stopRequested=!1;timerHandle=null;heartbeatTimerHandle=null;lastWriteMs;lastPeerHeartbeatMs;tickInFlight=null;constructor(e){this.opts=e,this.basePrefix=Gr({identityId:e.identityId,userId:e.userId,deviceId:e.deviceId,mailboxKey:e.mailboxKey}),this.ownStream=e.selfRole==="agent"?"local":"web",this.peerStream=e.selfRole==="agent"?"web":"local",this.cursor=e.cursor,this.readIntervalMs=cf(e.readIntervalMs??e.pollIntervalMs??RT,RT),this.heartbeatIdleMs=cf(e.heartbeatIdleMs??LT,LT),this.backoffReadIntervalMs=cf(e.backoffReadIntervalMs??e.pollIntervalMs??OT,OT)}start(){if(this.stopped)throw new Error("SequentialMailboxClient: cannot start after stop()");this.running||(this.running=!0,this.bootstrapInFlight=this.bootstrapThenRun())}async stop(){this.stopped=!0,this.stopRequested=!0;let e=this.opts.timers??lf;if(this.timerHandle!==null&&(e.clearTimeout(this.timerHandle),this.timerHandle=null),this.heartbeatTimerHandle!==null&&(e.clearTimeout(this.heartbeatTimerHandle),this.heartbeatTimerHandle=null),this.bootstrapInFlight!==null)try{await this.bootstrapInFlight}catch{}if(this.tickInFlight!==null)try{await this.tickInFlight}catch{}this.running=!1}async putMessage(e){return this.putEnvelope(e.conversation_id,e.payload)}getCursor(){return this.cursor}getMailboxBasePrefix(){return this.basePrefix}setPollIntervalMs(e){if(!Number.isFinite(e)||e<=0)throw new Error(`SequentialMailboxClient.setPollIntervalMs: invalid ms=${e}`);this.readIntervalMs=e}isPeerOn(){return this.peerIsOn((this.opts.now??Date.now)())}async bootstrapThenRun(){if(await this.ensureBootstrapped(),this.stopRequested){this.running=!1;return}this.runTick(),this.writeHeartbeat()}ensureBootstrapped(){return this.bootstrapped?Promise.resolve():(this.bootstrapPromise===null&&(this.bootstrapPromise=this.runColdStart()),this.bootstrapPromise)}async runColdStart(){try{let e=await this.maxSeq(this.ownStream);this.ownSeq=e,this.cursor===void 0&&(this.cursor=await this.maxSeq(this.peerStream)),this.bootstrapped=!0}catch(e){throw this.bootstrapPromise=null,this.emitError(e,"list"),e}}async maxSeq(e){let n=Ca(this.basePrefix,e),r=0,s;do{let i=await this.opts.s3.send(new this.opts.commands.ListObjectsV2Command({Bucket:this.opts.bucket,Prefix:n,MaxKeys:KF,...s!==void 0&&{ContinuationToken:s}}));this.opts.onS3Op?.("list");for(let o of i.Contents??[]){let a=$a(o.Key??"",this.basePrefix,e);a!==void 0&&a>r&&(r=a)}s=i.IsTruncated===!0?i.NextContinuationToken:void 0}while(s!==void 0);return r}async putEnvelope(e,n){let r=this.writeChain.then(()=>this.doPut(e,n));return this.writeChain=r.catch(()=>{}),r}async doPut(e,n){await this.ensureBootstrapped();let r=(this.opts.now??Date.now)(),s=new Date(r).toISOString(),i={message_id:dn(r,this.opts.random??Math.random),from:this.opts.selfRole,timestamp:s,hb:s,conversation_id:e,payload:n},o=(this.ownSeq??0)+1,a=af(this.basePrefix,this.ownStream,o);return await this.opts.s3.send(new this.opts.commands.PutObjectCommand({Bucket:this.opts.bucket,Key:a,Body:JSON.stringify(i),ContentType:"application/json"})),this.opts.onS3Op?.("put"),this.ownSeq=o,this.recordWrite(r),a}scheduleNextTick(e){if(this.stopRequested)return;let n=this.opts.timers??lf;this.timerHandle=n.setTimeout(()=>{this.timerHandle=null,this.runTick()},e)}runTick(){this.stopRequested||(this.tickInFlight=(async()=>{try{await this.pollOnce()}finally{this.tickInFlight=null,this.stopRequested||this.scheduleNextTick(this.nextReadDelayMs())}})())}async pollOnce(){for(;!this.stopRequested;){let e=(this.cursor??0)+1,n=af(this.basePrefix,this.peerStream,e),r;try{let i=await this.opts.s3.send(new this.opts.commands.GetObjectCommand({Bucket:this.opts.bucket,Key:n}));if(this.opts.onS3Op?.("get"),i.Body===void 0){this.emitError(new Error(`GetObject ${n}: empty body`),"get"),this.advanceCursor(e);continue}r=await i.Body.transformToString("utf-8")}catch(i){if(df(i)){this.opts.onS3Op?.("get");return}this.emitError(i,"get");return}let s;try{s=JSON.parse(r)}catch(i){this.emitError(i,"get"),this.advanceCursor(e);continue}if(this.recordPeerHeartbeat(s),$T(s)){this.advanceCursor(e);continue}try{await this.opts.onMessage(s)}catch(i){this.emitError(i,"handle");return}this.advanceCursor(e)}}advanceCursor(e){this.cursor=e,this.notifyCursorAdvance(e)}nextReadDelayMs(){return this.peerIsOn((this.opts.now??Date.now)())?this.readIntervalMs:this.backoffReadIntervalMs}peerIsOn(e){return this.lastPeerHeartbeatMs!==void 0&&e-this.lastPeerHeartbeatMs<=this.heartbeatIdleMs}recordPeerHeartbeat(e){let n=zF(e);n!==void 0&&(this.lastPeerHeartbeatMs=n)}recordWrite(e){this.lastWriteMs=e,this.scheduleHeartbeatCheck(this.heartbeatIdleMs)}scheduleHeartbeatCheck(e){if(this.stopRequested)return;let n=this.opts.timers??lf;this.heartbeatTimerHandle!==null&&n.clearTimeout(this.heartbeatTimerHandle),this.heartbeatTimerHandle=n.setTimeout(()=>{this.heartbeatTimerHandle=null,this.maybeWriteHeartbeat()},e)}async maybeWriteHeartbeat(){if(this.stopRequested)return;let e=(this.opts.now??Date.now)();if(this.lastWriteMs!==void 0){let n=e-this.lastWriteMs;if(n<this.heartbeatIdleMs){this.scheduleHeartbeatCheck(this.heartbeatIdleMs-n);return}}await this.writeHeartbeat()}async writeHeartbeat(){try{await this.putEnvelope(CT,VF)}catch(e){this.emitError(e,"put"),this.scheduleHeartbeatCheck(this.heartbeatIdleMs)}}notifyCursorAdvance(e){if(this.opts.onCursorAdvance!==void 0)try{this.opts.onCursorAdvance(e)}catch(n){this.emitError(n,"handle")}}emitError(e,n){if(this.opts.onError!==void 0)try{this.opts.onError(e,n)}catch{}else console.error(`SequentialMailboxClient[${n}]`,e)}}});import{getConnInfo as ZF}from"@hono/node-server/conninfo";function MT(t,e){let n=e.bucket??QF,r=e.remoteAddressOf??(i=>tU(i)),s=i=>{let o=r(i);return nU(o)?null:i.json({error:"forbidden",message:"local-mailbox is loopback-only"},403)};t.get("/local-mailbox/object",async i=>{let o=s(i);if(o!==null)return o;let a=uf(i.req.query("key"));if(typeof a!="string")return i.json({error:"bad_request",message:a.error},400);try{let l=await e.s3.send(new e.commands.GetObjectCommand({Bucket:n,Key:a}));if(l.Body===void 0)return i.json({error:"empty_body"},404);let c=await l.Body.transformToString("utf-8");return i.body(c,200,{"Content-Type":"application/octet-stream"})}catch(l){return df(l)?i.json({error:"not_found"},404):i.json({error:"internal",message:ff(l)},500)}}),t.put("/local-mailbox/object",async i=>{let o=s(i);if(o!==null)return o;let a=uf(i.req.query("key"));if(typeof a!="string")return i.json({error:"bad_request",message:a.error},400);let l=new Uint8Array(await i.req.arrayBuffer());try{return await e.s3.send(new e.commands.PutObjectCommand({Bucket:n,Key:a,Body:l})),i.json({ok:!0})}catch(c){return i.json({error:"internal",message:ff(c)},500)}}),t.get("/local-mailbox/list",async i=>{let o=s(i);if(o!==null)return o;let a=i.req.query("prefix")??"",l=uf(a,{allowEmpty:!0});if(typeof l!="string")return i.json({error:"bad_request",message:l.error},400);let c=eU(i.req.query("maxKeys")),u=i.req.query("token");try{let d=await e.s3.send(new e.commands.ListObjectsV2Command({Bucket:n,Prefix:l,...c!==void 0?{MaxKeys:c}:{},...u!==void 0&&u!==""?{ContinuationToken:u}:{}}));return i.json({Contents:(d.Contents??[]).map(f=>({Key:f.Key,LastModified:f.LastModified instanceof Date?f.LastModified.toISOString():f.LastModified})),IsTruncated:d.IsTruncated??!1,...d.NextContinuationToken!==void 0?{NextContinuationToken:d.NextContinuationToken}:{}})}catch(d){return i.json({error:"internal",message:ff(d)},500)}})}function uf(t,e={}){if(t===void 0||t==="")return e.allowEmpty===!0?"":{error:"key required"};let n=t.replace(/^\/+/,"");return n.split("/").includes("..")?{error:"key must not contain '..'"}:n}function eU(t){if(t===void 0||t==="")return;let e=Number(t);return Number.isInteger(e)&&e>0?e:void 0}function tU(t){try{return ZF(t).remote.address}catch{return}}function nU(t){return t===void 0||t===""?!1:!!(t==="127.0.0.1"||t==="::1"||t.startsWith("::ffff:127.")||t.startsWith("127."))}function ff(t){return t instanceof Error?t.message:String(t)}var QF,DT=E(()=>{"use strict";Pa();QF="local"});function jT(t,e){t.get("/mailbox/workspace",n=>iU(n,e)),t.get("/mailbox/projects",n=>oU(n,e)),t.get("/mailbox/projects/:id",n=>aU(n,e)),t.post("/mailbox/projects",n=>lU(n,e)),t.patch("/mailbox/projects/:id",n=>cU(n,e)),t.delete("/mailbox/projects/:id",n=>dU(n,e)),t.post("/mailbox/projects/:project_id/prompts",n=>uU(n,e)),t.get("/mailbox/prompts/:id",n=>fU(n,e))}function iU(t,e){e.dal.ensureWorkspace({id:Vr,name:mf});let n=PT(e.dal),r={id:Vr,name:mf,created_at:sU,projects:n};return t.json({workspace:r})}function oU(t,e){return t.json({projects:PT(e.dal)})}function aU(t,e){let n=t.req.param("id");if(n===void 0||n==="")return t.json({error:"bad_request",message:"project id required"},400);if(n.startsWith(Kr)){let s=pf(e.dal,n);return s===null||s.deleted_at!==null?t.json({project:null},404):t.json({project:Wa(s)})}let r=UT(e.dal,n);return r===null?t.json({project:null},404):t.json({project:FT(r)})}async function lU(t,e){let n;try{n=await t.req.json()}catch{return t.json({error:"bad_request",message:"invalid JSON body"},400)}let r=n.input;if(r===void 0||typeof r!="object")return t.json({error:"bad_request",message:"input is required"},400);if(typeof r.name!="string"||r.name==="")return t.json({error:"bad_request",message:"input.name is required"},400);if(typeof r.repo_path!="string"||r.repo_path==="")return t.json({error:"bad_request",message:"input.repo_path is required"},400);e.dal.ensureWorkspace({id:Vr,name:mf});let s=e.dal.insertWebProject({workspace_id:Vr,name:r.name,repo_path:r.repo_path,config_json:r.config_json===void 0?null:JSON.stringify(r.config_json)});return t.json({project:Wa(s)},201)}async function cU(t,e){let n=t.req.param("id");if(n===void 0||n==="")return t.json({error:"bad_request",message:"project id required"},400);let r;try{r=await t.req.json()}catch{return t.json({error:"bad_request",message:"invalid JSON body"},400)}let s=r.input??{};if(n.startsWith(Kr)){let i=pf(e.dal,n);if(i===null||i.deleted_at!==null)return t.json({error:"project_not_found",message:`project not found: ${n}`},404);let o=e.dal.updateWebProject({id:i.id,name:s.name===void 0?void 0:s.name,config_json:s.config_json===void 0?void 0:JSON.stringify(s.config_json)});return o===null?t.json({error:"project_not_found",message:`project not found: ${n}`},404):t.json({project:Wa(o)})}return t.json({error:"project_not_found",message:`project not found: ${n}`},404)}function dU(t,e){let n=t.req.param("id");if(n===void 0||n==="")return t.json({error:"bad_request",message:"project id required"},400);if(n.startsWith(Kr)){let r=pf(e.dal,n);if(r===null)return t.json({deleted:!1});let s=e.dal.softDeleteWebProject(r.id);return t.json({deleted:s})}return t.json({deleted:!1})}async function uU(t,e){let n=t.req.param("project_id");if(n===void 0||n==="")return t.json({error:"bad_request",message:"project_id required in path"},400);let r;try{r=await t.req.json()}catch{return t.json({error:"bad_request",message:"invalid JSON body"},400)}let s=r.input;if(s===void 0||typeof s!="object")return t.json({error:"bad_request",message:"input is required"},400);let i=s.project_id??n;if(typeof s.text!="string"||s.text==="")return t.json({error:"bad_request",message:"input.text is required"},400);let o=UT(e.dal,i);if(o===null)return t.json({error:"project_not_found",message:`project not found: ${i}`},404);if(e.dal.getWorkflowByName(o.workflow_name)===null)return t.json({error:"workflow_not_registered",message:`project ${o.name} has no registered workflow "${o.workflow_name}"`},400);let l=`${rU}${crypto.randomUUID()}`,c={text:s.text,context_json:s.context_json??null},u;e.enqueueProjectJob!==void 0?u=e.enqueueProjectJob({dal:e.dal,project_id:o.id,source_ref:l,payload:c}):u=await mU({dal:e.dal,project_id:o.id,source_ref:l,payload:c}),e.dal.insertPromptDispatch({prompt_id:l,project_id:o.id,job_id:u.id,text:s.text,context_json:s.context_json===void 0?null:JSON.stringify(s.context_json)});let d={id:l,project_id:`${Ua}${o.id}`,text:s.text,status:"pending",created_at:new Date().toISOString(),completed_at:null};return t.json({prompt:d},201)}function fU(t,e){let n=t.req.param("id");if(n===void 0||n==="")return t.json({error:"bad_request",message:"prompt id required"},400);let r=pU(e.dal,n);return t.json({result:r})}function PT(t){let e=t.listProjects().map(FT),n=t.listWebProjectsActive(Vr).map(Wa);return[...e,...n].sort(bU)}function FT(t){return{id:`${Ua}${t.id}`,workspace_id:Vr,name:t.name,repo_path:t.local_path,config_json:{workflow_name:t.workflow_name,team_id:t.team_id,durable_memory_mode:t.durable_memory_mode},last_active_at:null,created_at:t.created_at}}function Wa(t){let e={};if(t.config_json!==null)try{let n=JSON.parse(t.config_json);n!==null&&typeof n=="object"&&(e=n)}catch{}return t.linked_v4_project_id!==null&&(e={...e,linked_v4_project_id:t.linked_v4_project_id}),{id:`${Kr}${t.id}`,workspace_id:t.workspace_id,name:t.name,repo_path:t.repo_path,config_json:e,last_active_at:t.last_active_at,created_at:t.created_at}}function pf(t,e){if(!e.startsWith(Kr))return null;let n=e.slice(Kr.length),r=Number.parseInt(n,10);return!Number.isFinite(r)||String(r)!==n?null:t.getWebProject(r)}function UT(t,e){if(e.startsWith(Ua)){let r=e.slice(Ua.length),s=Number.parseInt(r,10);if(Number.isFinite(s)&&String(s)===r)return t.getProject(s)}let n=Number.parseInt(e,10);return Number.isFinite(n)&&String(n)===e?t.getProject(n):null}async function mU(t){let{enqueueManual:e}=await Promise.resolve().then(()=>(Tu(),sw));return{id:e(t.dal,{project_id:t.project_id,source_ref:t.source_ref,payload:t.payload}).id}}function pU(t,e){let n=t.getPromptDispatch(e);if(n===null)return{prompt_id:e,data:{status:"unknown"},errors_json:{error:"prompt_not_found"},duration_ms:null};let r=t.getJob(n.job_id);if(r===null)return{prompt_id:e,data:null,errors_json:{error:"job_missing",job_id:n.job_id},duration_ms:null};let s=r.run_id===null?null:t.getRun(r.run_id),i=t.getProject(n.project_id),o=TU(t,i?.team_id??null),a=EU(s),l=SU(r,a,o.length>0),c=vU(n.created_at,s),u=i===null?{totalEstimatedMs:void 0,perStep:new Map}:_U(t,i.workflow_name),d=u.totalEstimatedMs,f=WT(n.created_at),m=i?.workflow_name,p=u.perStep.size>0?u.perStep.size:void 0,_=s===null?[]:hU(t,s.id),h=gU(s,a,_,u.perStep,o),g=yU(_,u.perStep),y=wU(h,g,d,f,m,p);return l==="error"?{prompt_id:e,data:{status:l,job_id:r.id,project_id:n.project_id,run_id:s?.id??null,...Fa(d,f),...y},errors_json:{error:r.last_error??"job_failed",job_id:r.id,run_id:s?.id??null},duration_ms:c}:l==="done"?(n.completed_at===null&&t.setPromptDispatchCompleted(e),{prompt_id:e,data:{status:l,job_id:r.id,project_id:n.project_id,run_id:s?.id??null,terminal_state:s?.terminal_state??null,text:n.text,...Fa(d,f),...y},errors_json:null,duration_ms:c}):l==="paused"?{prompt_id:e,data:{status:l,job_id:r.id,project_id:n.project_id,run_id:s?.id??null,attempt_count:r.attempt_count,paused_step:a,attention_needed:o,...Fa(d,f),...y},errors_json:null,duration_ms:c}:{prompt_id:e,data:{status:l,job_id:r.id,project_id:n.project_id,run_id:s?.id??null,attempt_count:r.attempt_count,...Fa(d,f),...y},errors_json:null,duration_ms:c}}function _U(t,e){let n={totalEstimatedMs:void 0,perStep:new Map},r=t.getWorkflowByName(e);if(r===null)return n;let s;try{s=JSON.parse(r.definition)}catch{return n}if(s===null||typeof s!="object")return n;let i=s,o=typeof i.estimated_duration_ms=="number"&&Number.isFinite(i.estimated_duration_ms)&&i.estimated_duration_ms>=0?i.estimated_duration_ms:void 0,a=new Map;if(Array.isArray(i.steps))for(let l of i.steps){if(l===null||typeof l!="object")continue;let c=l;if(typeof c.id!="string"||c.id.length===0)continue;let u=typeof c.name=="string"&&c.name.length>0?c.name:c.id,d=typeof c.estimated_duration_ms=="number"&&Number.isFinite(c.estimated_duration_ms)&&c.estimated_duration_ms>=0?c.estimated_duration_ms:void 0;a.set(c.id,d===void 0?{name:u}:{name:u,estimated_duration_ms:d})}if(i.steps===void 0&&i.states!==null&&typeof i.states=="object")for(let[l,c]of Object.entries(i.states)){if(c===null||typeof c!="object")continue;let u=c,d=typeof u.estimated_duration_ms=="number"&&Number.isFinite(u.estimated_duration_ms)&&u.estimated_duration_ms>=0?u.estimated_duration_ms:void 0;a.set(l,d===void 0?{name:l}:{name:l,estimated_duration_ms:d})}return{totalEstimatedMs:o,perStep:a}}function hU(t,e){try{return t.listStepsForRun(e)}catch{return[]}}function gU(t,e,n,r,s){if(t===null||t.terminal_state!==null)return;let i=e!==null?e:t.current_state;if(i===null||i.length===0)return;let a=[...n].reverse().find(f=>f.state_name===i&&f.ended_at===null)?.started_at??t.paused_at??t.started_at,l=r.get(i),c=l?.name??i,u=WT(a),d={id:i,name:c,started_at:a,elapsed_ms:u};return l?.estimated_duration_ms!==void 0&&(d.estimated_duration_ms=l.estimated_duration_ms),s.length>0&&(d.attention_needed=s),d}function yU(t,e){let n=[];for(let r of t){if(r.ended_at===null)continue;let s=Date.parse(r.started_at),i=Date.parse(r.ended_at),o=Number.isFinite(s)&&Number.isFinite(i)?Math.max(0,i-s):0,a=e.get(r.state_name)?.name??r.state_name,l=r.outcome==="failed"?"failed":"done";n.push({id:r.state_name,name:a,duration_ms:o,status:l})}return n}function wU(t,e,n,r,s,i){let o={completed_steps:e,total_elapsed_ms:r};return t!==void 0&&(o.current_step=t),n!==void 0&&(o.total_estimated_ms=n),s!==void 0&&s.length>0&&(o.workflow_name=s),i!==void 0&&(o.total_steps=i),o}function WT(t){let e=Date.parse(t);return Number.isNaN(e)?0:Math.max(0,Date.now()-e)}function Fa(t,e){return t===void 0?{elapsed_ms:e}:{elapsed_ms:e,estimated_duration_ms:t}}function EU(t){if(t===null)return null;let e=t.current_state;if(e===null)return null;let n="__paused__:";return e.startsWith(n)?e.slice(n.length):null}function TU(t,e){if(e===null)return[];let n;try{n=t.listTeamMembers(e)}catch{return[]}return n.filter(r=>r.state==="attention_needed").map(r=>({alias:r.alias,reason:r.state_reason}))}function SU(t,e,n){return t.status==="queued"?"pending":t.status==="done"?"done":t.status==="failed"?"error":e!==null||n||t.status==="paused"?"paused":t.status==="running"?"running":"error"}function vU(t,e){let n=Date.parse(t);if(Number.isNaN(n))return null;let r=e?.ended_at??null,s=r===null?Date.now():Date.parse(r);return Number.isNaN(s)?null:Math.max(0,s-n)}function bU(t,e){let n=Date.parse(t.last_active_at??""),r=Date.parse(e.last_active_at??""),s=(Number.isNaN(r)?0:r)-(Number.isNaN(n)?0:n);return s===0?t.name.localeCompare(e.name):s}var Ua,Kr,rU,Vr,mf,sU,qT=E(()=>{"use strict";Ua="project:",Kr="web_project:",rU="prompt:",Vr="default",mf="Default workspace",sU=new Date(0).toISOString()});import{Buffer as BT}from"node:buffer";function HT(t,e,n){if(typeof t=="number"&&Number.isFinite(t)&&t>0)return t;if(e!==void 0&&e!==""){let r=Number(e);if(Number.isFinite(r)&&r>0)return r}return n}function XT(t){return NU[t]}function JT(t){let e=t.trim();if(e==="")return;let n=e.split(/\s+/),r=n.shift();if(!(r===void 0||r===""))return{cmd:r,args:n}}var kU,IU,qa,NU,_f=E(()=>{"use strict";kU=1e4,IU=256*1024,qa=class{opts;sessions=new Map;pushWindowMs;pushByteCap;timers;constructor(e){this.opts=e,this.pushWindowMs=HT(e.pushWindowMs,process.env.LMCTL_TERMINAL_PUSH_WINDOW_MS,kU),this.pushByteCap=HT(e.pushByteCap,process.env.LMCTL_TERMINAL_PUSH_BYTE_CAP,IU),this.timers=e.timers??{setTimeout:(n,r)=>globalThis.setTimeout(n,r),clearTimeout:n=>globalThis.clearTimeout(n)}}startSession(e){if(this.sessions.has(e.session_id))throw new Error(`terminal_session_already_exists: ${e.session_id}`);let n=this.opts.pty.spawn(e.command,e.args,{name:"xterm-256color",cols:e.cols??120,rows:e.rows??30,cwd:e.cwd??process.cwd(),env:e.env??process.env}),r={session_id:e.session_id,pty:n,pendingOutput:[],pendingBytes:0,pushTimer:void 0,closed:!1};return this.sessions.set(e.session_id,r),n.onData(s=>{this.onPtyData(r,s)}),n.onExit(s=>{this.onPtyExit(r,s)}),this.opts.log?.(`[dt-2] terminal session ${e.session_id} started pid=${n.pid} cmd=${e.command}`),{pid:n.pid}}endSession(e){let n=this.sessions.get(e);if(n!==void 0)try{n.pty.kill()}catch{}}onInbound(e){if(e.direction!=="user_to_agent")return;let n=this.sessions.get(e.session_id);if(n===void 0){this.opts.log?.(`[dt-2] inbound terminal data for unknown session ${e.session_id}; dropping`);return}if(n.closed){this.opts.log?.(`[dt-2] inbound terminal data for closed session ${e.session_id}; dropping`);return}try{n.pty.write(e.data)}catch(r){this.opts.log?.(`[dt-2] pty.write failed for session ${e.session_id}: ${r instanceof Error?r.message:String(r)}`)}}setPublish(e){this.opts={...this.opts,publish:e}}listSessions(){return Array.from(this.sessions.values()).map(e=>({session_id:e.session_id,pid:e.pty.pid}))}pendingBytesFor(e){return this.sessions.get(e)?.pendingBytes}async stop(){for(let e of Array.from(this.sessions.values()))try{e.pty.kill()}catch{}for(let e of Array.from(this.sessions.values()))e.pushTimer!==void 0&&(this.timers.clearTimeout(e.pushTimer),e.pushTimer=void 0)}onPtyData(e,n){if(!e.closed){if(e.pendingOutput.push(n),e.pendingBytes+=BT.byteLength(n,"utf8"),e.pendingBytes>=this.pushByteCap){this.flush(e,"byte_cap");return}e.pushTimer===void 0&&(e.pushTimer=this.timers.setTimeout(()=>{this.flush(e,"window_idle")},this.pushWindowMs))}}async flush(e,n){if(e.pushTimer!==void 0&&(this.timers.clearTimeout(e.pushTimer),e.pushTimer=void 0),e.pendingOutput.length===0)return;let r=e.pendingOutput.join("");e.pendingOutput=[],e.pendingBytes=0;let s={kind:"terminal",session_id:e.session_id,direction:"agent_to_user",data:r,ts:(this.opts.now??Date.now)()};try{await this.opts.publish(s),this.opts.log?.(`[dt-2] flushed session=${e.session_id} reason=${n} bytes=${BT.byteLength(r,"utf8")}`)}catch(i){this.opts.log?.(`[dt-2] publish failed session=${e.session_id} reason=${n}: ${i instanceof Error?i.message:String(i)}`)}}async onPtyExit(e,n){if(e.closed)return;await this.flush(e,"pty_exit");let r=`\r
2212
2212
  [process exited with code ${n.exitCode}${n.signal!==void 0?` signal ${n.signal}`:""}]\r
2213
2213
  `,s={kind:"terminal",session_id:e.session_id,direction:"agent_to_user",data:r,ts:(this.opts.now??Date.now)()};try{await this.opts.publish(s)}catch(i){this.opts.log?.(`[dt-2] publish (exit) failed session=${e.session_id}: ${i instanceof Error?i.message:String(i)}`)}e.closed=!0,this.sessions.delete(e.session_id)}};NU={claude:{cmd:"claude",args:["--dangerously-skip-permissions"]},codex:{cmd:"codex",args:["--yolo","--sandbox","danger-full-access"]},gemini:{cmd:"gemini",args:["-y","--skip-trust"]},copilot:{cmd:"copilot",args:["--yolo"]},qwen:{cmd:"qwen",args:["--approval-mode","yolo"]},opencode:{cmd:"opencode",args:[]},kimi:{cmd:"kimi",args:["--auto"]}}});function KT(t,e){t.post("/mailbox/terminal/launch",n=>AU(n,e)),t.post("/mailbox/terminal/end/:session_id",n=>xU(n,e)),t.get("/mailbox/terminal/sessions",n=>RU(n,e))}async function AU(t,e){let n=e.terminalSessionManager;if(n===void 0)return t.json({error:"terminal_unavailable",message:"terminal session manager not configured (mailbox runtime missing)"},503);let r;try{r=await t.req.json()}catch{return t.json({error:"bad_request",message:"invalid JSON body"},400)}let s=r.session_id;if(typeof s!="string"||!GT.test(s))return t.json({error:"bad_request",message:"session_id must be a UUIDv7 string"},400);let i=r.provider;if(typeof i!="string"||i==="")return t.json({error:"bad_request",message:"provider is required"},400);let o;if(typeof r.command_line=="string"&&r.command_line.trim()!==""){if(o=JT(r.command_line),o===void 0)return t.json({error:"bad_request",message:"command_line could not be parsed"},400)}else{let a=XT(i);if(a===void 0)return t.json({error:"no_default_for_provider",message:`no TERMINAL_LAUNCH_DEFAULTS entry for provider "${i}"`},400);o={cmd:a.cmd,args:[...a.args]}}try{let{pid:a}=n.startSession({session_id:s,command:o.cmd,args:o.args,...typeof r.cwd=="string"&&r.cwd!==""?{cwd:r.cwd}:{}});return t.json({session_id:s,pid:a,command:o.cmd,args:o.args},201)}catch(a){let l=a instanceof Error?a.message:String(a);return l.startsWith("terminal_session_already_exists")?t.json({error:"session_exists",message:l},409):t.json({error:"spawn_failed",message:l},500)}}function xU(t,e){let n=e.terminalSessionManager;if(n===void 0)return t.json({error:"terminal_unavailable",message:"terminal session manager not configured"},503);let r=t.req.param("session_id");return r===void 0||!GT.test(r)?t.json({error:"bad_request",message:"session_id must be a UUIDv7 string"},400):(n.endSession(r),t.json({session_id:r,ended:!0}))}function RU(t,e){let n=e.terminalSessionManager;return n===void 0?t.json({sessions:[],note:"terminal session manager not configured"}):t.json({sessions:n.listSessions()})}var GT,VT=E(()=>{"use strict";_f();GT=/^[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i});import{Buffer as LU}from"node:buffer";function $U(t){try{return LU.byteLength(JSON.stringify(t),"utf8")}catch{return 256}}function YT(t,e,n){if(typeof t=="number"&&Number.isFinite(t)&&t>0)return t;if(e!==void 0&&e!==""){let r=Number(e);if(Number.isFinite(r)&&r>0)return r}return n}function zT(t){return MU[t]}function ZT(t){let e=t.trim();if(e==="")return;let n=[],r=0;for(;r<e.length;){let i=e[r];if(i===" "||i===" "){r+=1;continue}if(i==='"'){let a=r+1,l="";for(;a<e.length&&e[a]!=='"';)l+=e[a],a+=1;n.push(l),r=a+1;continue}let o=r;for(;o<e.length&&e[o]!==" "&&e[o]!==" ";)o+=1;n.push(e.slice(r,o)),r=o}if(n.length===0)return;let s=n.shift();if(!(s===void 0||s===""))return{cmd:s,args:n}}var OU,CU,Ba,MU,hf=E(()=>{"use strict";OU=2e3,CU=64*1024,Ba=class{opts;sessions=new Map;pushWindowMs;pushByteCap;timers;constructor(e){this.opts=e,this.pushWindowMs=YT(e.pushWindowMs,process.env.LMCTL_PROVIDER_PUSH_WINDOW_MS,OU),this.pushByteCap=YT(e.pushByteCap,process.env.LMCTL_PROVIDER_PUSH_BYTE_CAP,CU),this.timers=e.timers??{setTimeout:(n,r)=>globalThis.setTimeout(n,r),clearTimeout:n=>globalThis.clearTimeout(n)}}async startSession(e){if(this.sessions.has(e.session_id))throw new Error(`persistent_session_already_exists: ${e.session_id}`);let n=this.opts.adapterFactory(e.provider),r={session_id:e.session_id,provider:e.provider,adapter:n,child:void 0,pendingEvents:[],pendingBytes:0,pushTimer:void 0,generation:1,turnMap:new Map,closed:!1};this.sessions.set(e.session_id,r);let s=this.makeAdapterContext(r);try{let i=await n.start(e,s);return r.child=i,this.wireChildExit(r,i),this.opts.log?.(`[dt-3] persistent session ${e.session_id} started provider=${e.provider} pid=${i.pid??"?"}`),{pid:i.pid}}catch(i){throw this.sessions.delete(e.session_id),i}}async endSession(e){let n=this.sessions.get(e);if(n!==void 0){n.generation+=1;try{await n.adapter.stop()}catch{}if(n.child!==void 0)try{n.child.kill("SIGTERM")}catch{}await this.flush(n,"session_end"),n.closed=!0,this.sessions.delete(e)}}async onInbound(e){if(e.direction!=="user_to_agent")return;let n=this.sessions.get(e.session_id);if(n===void 0){this.opts.log?.(`[dt-3] inbound provider data for unknown session ${e.session_id}; dropping`);return}if(n.closed){this.opts.log?.(`[dt-3] inbound provider data for closed session ${e.session_id}; dropping`);return}let r=e.user_input??"";if(r!=="")try{await n.adapter.sendTurn(r)}catch(s){let i=s instanceof Error?s.message:String(s);this.opts.log?.(`[dt-3] adapter.sendTurn failed session=${e.session_id}: ${i}`),this.appendEvent(n,{event_type:"error",payload:{message:`sendTurn failed: ${i}`}})}}setPublish(e){this.opts={...this.opts,publish:e}}listSessions(){return Array.from(this.sessions.values()).map(e=>({session_id:e.session_id,provider:e.provider,pid:e.child?.pid}))}pendingEventCountFor(e){return this.sessions.get(e)?.pendingEvents.length}generationFor(e){return this.sessions.get(e)?.generation}_testBumpGeneration(e){let n=this.sessions.get(e);n!==void 0&&(n.generation+=1)}async stop(){for(let e of Array.from(this.sessions.values())){e.generation+=1;try{await e.adapter.stop()}catch{}if(e.child!==void 0)try{e.child.kill("SIGTERM")}catch{}}for(let e of Array.from(this.sessions.values()))e.pushTimer!==void 0&&(this.timers.clearTimeout(e.pushTimer),e.pushTimer=void 0)}makeAdapterContext(e){let n=e.generation,r=this;return{generation:n,currentGeneration(){return e.generation},emit(s){n===e.generation&&(e.closed||r.appendEvent(e,s))},...r.opts.log!==void 0?{log:r.opts.log}:{},turnMap:e.turnMap}}appendEvent(e,n){e.pendingEvents.push(n);let r=$U(n);if(e.pendingBytes+=r,e.pendingBytes>=this.pushByteCap){this.flush(e,"byte_cap");return}e.pushTimer===void 0&&(e.pushTimer=this.timers.setTimeout(()=>{this.flush(e,"window_idle")},this.pushWindowMs))}async flush(e,n){if(e.pushTimer!==void 0&&(this.timers.clearTimeout(e.pushTimer),e.pushTimer=void 0),e.pendingEvents.length===0)return;let r=e.pendingEvents;e.pendingEvents=[],e.pendingBytes=0;let s={kind:"provider",session_id:e.session_id,direction:"agent_to_user",events:r,ts:(this.opts.now??Date.now)()};try{await this.opts.publish(s),this.opts.log?.(`[dt-3] flushed session=${e.session_id} reason=${n} events=${r.length}`)}catch(i){this.opts.log?.(`[dt-3] publish failed session=${e.session_id} reason=${n}: ${i instanceof Error?i.message:String(i)}`)}}wireChildExit(e,n){let r=e.generation;n.on("exit",(s,i)=>{r===e.generation&&(e.closed||(this.appendEvent(e,{event_type:"error",payload:{message:`provider child exited code=${s??"?"} signal=${i??""}; session ended. Click Reset to start a new chat.`}}),this.flush(e,"child_exit"),e.closed=!0))}),n.on("error",s=>{r===e.generation&&(e.closed||(this.appendEvent(e,{event_type:"error",payload:{message:`provider child error: ${s.message}`}}),this.flush(e,"child_exit")))})}};MU={codex:{cmd:"codex",args:["app-server","--listen","stdio://"]},claude:{cmd:"claude",args:["-p","","--output-format","stream-json","--input-format","stream-json","--verbose","--dangerously-skip-permissions"]},gemini:{cmd:"gemini",args:["--acp","-y","--skip-trust"]},copilot:{cmd:"copilot",args:["--acp","--yolo"]},opencode:{cmd:"opencode",args:["acp"]},kimi:{cmd:"kimi",args:["acp"]},qwen:{cmd:"qwen",args:["-p","","--output-format","stream-json","--input-format","stream-json","--approval-mode","yolo"]}}});function eS(t,e){t.post("/mailbox/chat/launch",n=>DU(n,e)),t.post("/mailbox/chat/end/:session_id",n=>jU(n,e)),t.get("/mailbox/chat/sessions",n=>PU(n,e))}async function DU(t,e){let n=e.persistentSessionManager;if(n===void 0)return t.json({error:"chat_unavailable",message:"persistent session manager not configured (mailbox runtime missing)"},503);let r;try{r=await t.req.json()}catch{return t.json({error:"bad_request",message:"invalid JSON body"},400)}let s=r.session_id;if(typeof s!="string"||!QT.test(s))return t.json({error:"bad_request",message:"session_id must be a UUIDv7 string"},400);let i=r.provider;if(typeof i!="string"||i==="")return t.json({error:"bad_request",message:"provider is required"},400);let o;if(typeof r.command_line=="string"&&r.command_line.trim()!==""){if(o=ZT(r.command_line),o===void 0)return t.json({error:"bad_request",message:"command_line could not be parsed"},400)}else{let a=zT(i);if(a===void 0)return t.json({error:"no_default_for_provider",message:`no PERSISTENT_LAUNCH_DEFAULTS entry for provider "${i}"`},400);o={cmd:a.cmd,args:[...a.args]}}try{let{pid:a}=await n.startSession({session_id:s,provider:i,command:o.cmd,args:o.args,...typeof r.cwd=="string"&&r.cwd!==""?{cwd:r.cwd}:{}});return t.json({session_id:s,provider:i,pid:a,command:o.cmd,args:o.args},201)}catch(a){let l=a instanceof Error?a.message:String(a);return l.startsWith("persistent_session_already_exists")?t.json({error:"session_exists",message:l},409):l.startsWith("no_persistent_adapter_for_provider")?t.json({error:"no_adapter",message:l},400):t.json({error:"spawn_failed",message:l},500)}}async function jU(t,e){let n=e.persistentSessionManager;if(n===void 0)return t.json({error:"chat_unavailable",message:"persistent session manager not configured"},503);let r=t.req.param("session_id");return r===void 0||!QT.test(r)?t.json({error:"bad_request",message:"session_id must be a UUIDv7 string"},400):(await n.endSession(r),t.json({session_id:r,ended:!0}))}function PU(t,e){let n=e.persistentSessionManager;return n===void 0?t.json({sessions:[],note:"persistent session manager not configured"}):t.json({sessions:n.listSessions()})}var QT,tS=E(()=>{"use strict";hf();QT=/^[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i});import{readFileSync as FU}from"node:fs";function rS(t){let e=t.artifacts.find(n=>n.kind===`${t.state_name}_transcript`);if(e?.content!==void 0&&e.content!==null)return nS(e.content);if(e?.path===void 0||e.path===null)return[];try{let n=FU(e.path,{encoding:"utf8"});return nS(n)}catch{return[]}}function nS(t){let e=t.split(/\r?\n/).filter(n=>n.trim().length>0);return e.length===0?[]:e.map(n=>{let r=/^(user|assistant|system|tool)\s*:\s*(.*)$/i.exec(n);return r===null?{role:"transcript",text:n}:{role:r[1].toLowerCase(),text:r[2]}})}var sS=E(()=>{"use strict"});function iS(t,e,n){let r=t.getRun(e);if(r===null)return{err:`run ${e}: not found`};if(n!==void 0){let l=t.findTeamMemberByAlias(r.team_id,n);return l===null?{err:`run ${e}: team has no member alias "${n}"`}:l.sessionid===null||l.sessionid.length===0?{err:`run ${e}: member "${l.alias}" has no sessionid yet (seed first)`}:{ok:{provider:l.provider,sessionid:l.sessionid,sessiondir:l.sessiondir,alias:l.alias,...l.model!==null&&l.model!==void 0?{model:l.model}:{}}}}let s=t.latestAgentCall(e);if(s!==null){let l=t.findTeamMemberByAlias(r.team_id,s.alias);return l===null?{err:`run ${e}: team has no member alias "${s.alias}" (latest agent_call references a member that has been removed)`}:l.sessionid===null||l.sessionid.length===0?{err:`run ${e}: member "${l.alias}" has no sessionid yet (seed first)`}:{ok:{provider:l.provider,sessionid:l.sessionid,sessiondir:l.sessiondir,alias:l.alias,...l.model!==null&&l.model!==void 0?{model:l.model}:{}}}}let o=t.listTeamMembers(r.team_id).filter(l=>l.state!=="retired"&&l.sessionid!==null&&l.sessionid.length>0);if(o.length===0)return{err:`run ${e}: cannot resolve an agent session (no agent_call yet, no seeded member)`};if(o.length>1){let l=o.map(c=>c.alias).join(", ");return{err:`run ${e}: cannot resolve an agent session (no agent_call yet; team has multiple members [${l}] \u2014 pass --alias)`}}let a=o[0];return{ok:{provider:a.provider,sessionid:a.sessionid,sessiondir:a.sessiondir,alias:a.alias,...a.model!==null&&a.model!==void 0?{model:a.model}:{}}}}function Ha(t,e){let n=t.query(`SELECT id, kind FROM attention
2214
2214
  WHERE run_id = ?
@@ -2277,7 +2277,7 @@ ${p.text}`,["approve","request_changes"],!0,s,e.writes_to_project_path===!0)));i
2277
2277
  `);if(e[0]!=="---")throw new Gt("frontmatter must start at line 1 with `---` on its own line");let n={},r=-1;for(let o=1;o<e.length;o++){let a=e[o];if(a==="---"){r=o;break}if(a.trim()==="")continue;let l=a.match(/^([a-zA-Z][a-zA-Z0-9_-]*)\s*:\s*(.*)$/);if(!l)throw new Gt(`malformed frontmatter line ${o+1}: ${JSON.stringify(a)} (expected "key: value" or "---")`);let c=l[1],u=l[2].trim();if(!yq.has(c))throw new Gt(`unknown frontmatter key "${c}" \u2014 allowed keys: ${rl.join(", ")}`);n[c]=u}if(r===-1)throw new Gt("frontmatter not closed (missing trailing `---` on its own line)");for(let o of rl)if(n[o]===void 0)throw new Gt(`missing required frontmatter key "${o}" \u2014 required: ${rl.join(", ")}`);let s=0;for(let o=0;o<=r;o++)s+=e[o].length+1;s>t.length&&(s=t.length);let i=n.members.split(",").map(o=>o.trim()).filter(Boolean);return{title:n.title,description:n.description,members:i,bodyOffset:s}}var rl,yq,Gt,Sv=E(()=>{"use strict";rl=["title","description","members"],yq=new Set(rl),Gt=class extends Error{constructor(e){super(e),this.name="FrontmatterError"}}});import{readFileSync as wq,writeFileSync as Ote,renameSync as Cte,existsSync as bv}from"node:fs";import{basename as Eq,resolve as Zr,dirname as Xf}from"node:path";function Sq(t){let e={},n=/(\w+)=(?:"([^"]*)"|([\S]*))/g,r;for(;(r=n.exec(t))!==null;){let s=r[1],i=r[2]!==void 0?r[2]:r[3];e[s]=i}return e}function vq(t){return/^\s*_MEMBER_\s+\S/.test(t)}function bq(t){return/^\s*_SESSION_\s+\S/.test(t)}function kq(t){return/^\s*_SKILL_(?:\s|$)/.test(t)}function Gf(t){let e=Eq(t);return e.endsWith(".lmctl")?e.slice(0,-6):e}function je(t){let e=wq(t,"utf-8"),n=Xf(Zr(t)),r=Kf(e,Gf(t),{baseDir:n,sourcePath:Zr(t)});for(let s of r.members)s.sessiondir&&!s.sessiondir.startsWith("/")&&(s.sessiondir=Zr(n,s.sessiondir));return r}function Kf(t,e,n={}){let r=[],s=[];n.sourcePath,n.baseDir;let i=t;if(i.startsWith("#teamfile:")){let l=i.indexOf(`
2278
2278
  `);i=l>=0?i.slice(l+1):""}let o=null;if(i.startsWith("---"))try{o=Tv(i)}catch(l){if(l instanceof Gt)s.push(`frontmatter: ${l.message}`);else throw l}let a=t.split(`
2279
2279
  `);for(let l=0;l<a.length;l++){let c=a[l],u=l+1;if(bq(c))throw new Error(`line ${u}: _SESSION_ is the legacy prefix. Rename to _MEMBER_. (line: ${c.trim()})`);if(kq(c)||!vq(c))continue;let d=Sq(c);for(let p of Object.keys(d))if(!vv.includes(p))throw new Error(`line ${u}: unknown key "${p}" on _MEMBER_ line: ${c.trim()}
2280
- allowed keys: ${vv.join(", ")}`);if(!d.provider&&!d.teamfile){s.push(`line ${u}: member line missing provider (or teamfile): ${c.trim()}`);continue}let m={alias:d.alias||`member${r.length+1}`,provider:d.provider||"",extra:{}};d.sessionid&&(m.session=d.sessionid),Object.prototype.hasOwnProperty.call(d,"sessiondir")&&(m.sessiondir=d.sessiondir),d.teamfile&&(m.teamfile=d.teamfile),d.model&&(m.model=d.model),d.effort&&(m.effort=d.effort),r.push(m)}return{name:e,members:r,rawText:t,parseErrors:s,frontmatter:o}}function Vf(t,e){let n=[];for(let i of t.parseErrors)n.push({field:"session",message:i});let r=t.members.filter(i=>i.alias.toLowerCase()===Jf.toLowerCase());r.length>1&&n.push({field:Jf,message:`${r.length} alias=Lead found (max 1)`});let s=new Set;for(let i of t.members){let o=i.alias.toLowerCase();if(s.has(o)&&n.push({field:i.alias,message:`Duplicate alias "${i.alias}" (case-insensitive)`}),s.add(o),i.teamfile){let a=e?Zr(e,i.teamfile):Zr(i.teamfile);if(!bv(a))n.push({field:i.alias,message:`Teamfile not found: ${a}`});else{let l=je(a),c=ht(l);c?c.session||n.push({field:i.alias,message:`Team at ${i.teamfile} lead has no session ID. Run: lmctl seed`}):n.push({field:i.alias,message:`Team at ${i.teamfile} has no lead session`})}}else Tq.has(i.provider)||n.push({field:i.alias,message:`Invalid provider "${i.provider}"`});i.sessiondir!==void 0&&i.sessiondir===""&&n.push({field:i.alias,message:"sessiondir is empty"})}return n}function ht(t){return t.members.find(e=>e.alias.toLowerCase()===Jf.toLowerCase())}function Yf(t,e,n,r={}){let s=r.requireSession??!0;if(!t.teamfile)throw new Error(`Member "${t.alias}" is not a team reference`);let i=Zr(e,t.teamfile),o=n??new Set;if(o.has(i))throw new Error(`Circular team reference: ${t.alias} \u2192 ${i} (already visited: ${[...o].join(" \u2192 ")})`);if(o.add(i),!bv(i))throw new Error(`Teamfile not found: ${i} (referenced by alias "${t.alias}")`);let a=je(i),l=ht(a);if(!l)throw new Error(`Team at ${i} has no lead session`);if(l.teamfile)return Yf(l,Xf(i),o,r);if(s&&!l.session)throw new Error(`Team at ${i} lead has no session ID. Run: lmctl seed`);return{provider:l.provider,session:l.session??"",sessiondir:l.sessiondir||Xf(i),alias:t.alias,resolvedFrom:i,model:l.model,effort:l.effort}}function kv(t,e){return t.members.find(n=>n.alias===e)??t.members.find(n=>n.alias.toLowerCase()===e.toLowerCase())}var Jf,Tq,vv,Kt=E(()=>{"use strict";Sv();Jf="Lead",Tq=new Set(["claude","codex","opencode","lmplayer","gemini","copilot","qwen","agy","kimi","dsh","ClaudeMock"]);vv=["alias","provider","sessionid","sessiondir","teamfile","model","effort"]});import{existsSync as Iq,realpathSync as Nq}from"node:fs";import{dirname as Aq}from"node:path";function zf(t){xq(t).catch(e=>{t.log?.(`[mailbox] prompt trigger failed: ${e instanceof Error?e.message:String(e)}`)})}async function xq(t){let e=t.payload.root_teamfile;try{e=Nq(t.payload.root_teamfile)}catch(i){let o=`prompt root missing/unreadable: ${t.payload.root_teamfile}: ${i instanceof Error?i.message:String(i)}`;return Qr({rootTeamfile:t.payload.root_teamfile,receiverTeamfile:t.payload.root_teamfile,receiverAlias:"Lead",message:t.payload.text,promptId:t.payload.prompt_id,detail:o,reason:"root_unavailable"}),t.log?.(`[mailbox] ${o}`),{status:"error",response:null,error_detail:o}}if(t.store.getRootTeam(e)===null){let i=`prompt root is not registered: ${e}`;return Qr({rootTeamfile:e,receiverTeamfile:e,receiverAlias:"Lead",message:t.payload.text,promptId:t.payload.prompt_id,detail:i,reason:"root_unregistered"}),t.log?.(`[mailbox] ${i}`),{status:"error",response:null,error_detail:i}}let n=Lq(e);if("error"in n)return Qr({rootTeamfile:e,receiverTeamfile:e,receiverAlias:"Lead",message:t.payload.text,promptId:t.payload.prompt_id,detail:n.error,reason:"root_invalid"}),t.log?.(`[mailbox] ${n.error}`),{status:"error",response:null,error_detail:n.error};let r=Er(t.store,{receiver_teamfile:e,receiver_alias:n.alias,sender_teamfile:`prompt:${t.payload.prompt_id}`,sender_alias:"operator",ttlMs:Mq(t.env??process.env)});if(!r.acquired){let i=$q(n.alias,r.current);return Qr({rootTeamfile:e,receiverTeamfile:e,receiverAlias:n.alias,message:t.payload.text,promptId:t.payload.prompt_id,detail:i,reason:"unavailable"}),t.log?.(`[mailbox] prompt rejected: ${i}`),{status:"error",response:null,error_detail:i}}let s=Xi(i=>t.store.heartbeatAgentInflight(r.lease,r.leaseId,i),{intervalMs:S_(t.env??process.env)});try{let o=await(t.chat??rn)({provider:n.provider,sessionId:n.sessionid,cwd:n.sessiondir,prompt:t.payload.text,env:t.env??process.env,alias:n.alias,permissionMode:"yolo",...t.timeoutMs!==void 0?{timeoutMs:t.timeoutMs}:{}}),a=o.status==="stalled",l=!a&&o.text.trim()==="",c=a?`provider stalled${o.stalledAfterMs!==void 0?` after ${o.stalledAfterMs}ms`:""}`:l?"provider returned empty response":null,u=a||l?"error":"ok";return u==="ok"?await Oq(t.store,{rootTeamfile:e,receiverTeamfile:e,receiverAlias:n.alias,message:t.payload.text,response:o.text,status:u,error_detail:null,log:t.log}):Qr({rootTeamfile:e,receiverTeamfile:e,receiverAlias:n.alias,message:t.payload.text,promptId:t.payload.prompt_id,detail:c??"provider failed",reason:a?"stalled":"empty_response"}),{status:u,response:u==="error"?null:o.text,error_detail:c}}catch(i){let o=i instanceof Error?i.message:String(i);return Qr({rootTeamfile:e,receiverTeamfile:e,receiverAlias:n.alias,message:t.payload.text,promptId:t.payload.prompt_id,detail:o,reason:"provider_error"}),t.log?.(`[mailbox] prompt provider error: ${o}`),{status:"error",response:null,error_detail:o}}finally{clearInterval(s);try{t.store.releaseAgentInflight(r.lease,r.leaseId)}catch(i){t.log?.(`[mailbox] failed to release prompt in-flight slot: ${i instanceof Error?i.message:String(i)}`)}}}function Qr(t){D({event:"prompt_trigger_error",reason:t.reason,prompt_id:t.promptId,root_teamfile:t.rootTeamfile,sender_teamfile:t.rootTeamfile,sender_alias:"operator",receiver_teamfile:t.receiverTeamfile,receiver_alias:t.receiverAlias,error_detail:t.detail,message_preview:Rq(t.message)})}function Rq(t){let e=t.replace(/\s+/gu," ").trim();return e.length<=500?e:`${e.slice(0,497)}...`}function Lq(t){if(!Iq(t))return{error:`prompt root missing/unreadable: ${t}`};let e=je(t);if(e.parseErrors.length>0)return{error:`prompt root parse error: ${e.parseErrors.join("; ")}`};let n=ht(e);return n===void 0?{error:`prompt root has no Lead: ${t}`}:n.session===void 0||n.session.trim()===""?{error:`prompt root Lead is unseeded: ${t}`}:{alias:n.alias,provider:n.provider,sessionid:n.session,sessiondir:n.sessiondir??Aq(t)}}async function Oq(t,e){let n=Av(e.message),r=e.response===null?null:Av(e.response);try{t.insertTeamChatLog({root_teamfile:e.rootTeamfile,sender_teamfile:e.rootTeamfile,sender_alias:"operator",receiver_teamfile:e.receiverTeamfile,receiver_alias:e.receiverAlias,message:n.text,response:r?.text??null,origin:"unknown",status:e.status,error_detail:e.error_detail,truncated:n.truncated||r?.truncated?1:0,created_at:new Date().toISOString()})}catch(s){e.log?.(`[mailbox] warning: failed to record prompt chat log: ${s instanceof Error?s.message:String(s)}`)}}function Av(t){return t.length<=Iv?{text:t,truncated:!1}:{text:t.slice(0,Iv),truncated:!0}}function Cq(t,e){return`${t} is servicing ${e.sender_alias} (${e.sender_teamfile}) since ${e.started_at}`}function $q(t,e){return e.sender_teamfile.startsWith("prompt:")?`${t} is busy servicing another prompt since ${e.started_at}`:Cq(t,e)}function Mq(t=process.env){let e=t.LMCTL_INFLIGHT_TTL_MS;if(e===void 0||e.trim()==="")return Nv;let n=Number(e);return!Number.isFinite(n)||n<=0?Nv:n}var Iv,Nv,xv=E(()=>{"use strict";mt();Kt();de();ct();Iv=256*1024,Nv=30*60*1e3});import{chmodSync as Mv,existsSync as Dq,mkdirSync as Dv,readFileSync as al,writeFileSync as jv}from"node:fs";import{dirname as Zf,resolve as sl,join as Pv}from"node:path";import{fileURLToPath as jq}from"node:url";import{homedir as Fv}from"node:os";import{CognitoIdentityClient as Pq,GetIdCommand as Fq}from"@aws-sdk/client-cognito-identity";import{fromCognitoIdentity as Rv}from"@aws-sdk/credential-provider-cognito-identity";import{GetObjectCommand as Uq,ListObjectsV2Command as Wq,PutObjectCommand as qq,S3Client as Lv}from"@aws-sdk/client-s3";function di(t={}){let e=t.env??process.env,n=t.tfstatePath!==void 0?[t.tfstatePath]:Gq(t.selfUrl),r={},s;for(let k of n)if(Dq(k)){r=Jq(k),s=k;break}let i=(...k)=>{for(let b of k)if(typeof b=="string"&&b!=="")return b},o=i(e.LMCTL_NEXT_IDENTITY_POOL_ID,r.LMCTL_NEXT_IDENTITY_POOL_ID)??Bq,a=i(e.LMCTL_NEXT_COGNITO_USER_POOL_ID,r.LMCTL_NEXT_COGNITO_USER_POOL_ID)??Hq,l=i(e.LMCTL_NEXT_MAILBOX_BUCKET,e.LMCTL_NEXT_POLICY_BUCKET,r.LMCTL_NEXT_MAILBOX_BUCKET,r.LMCTL_NEXT_POLICY_BUCKET)??Xq,c=i(e.AWS_REGION,e.AWS_DEFAULT_REGION)??"us-east-1",u=i(e.LMCTL_NEXT_COGNITO_CLIENT_ID,r.LMCTL_NEXT_COGNITO_CLIENT_ID)??ll,d=[];o===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:n,...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,_=ol(e.LMCTL_MAILBOX_READ_INTERVAL_SECONDS),h=ol(e.LMCTL_MAILBOX_HEARTBEAT_IDLE_SECONDS),g=ol(e.LMCTL_MAILBOX_BACKOFF_READ_INTERVAL_SECONDS),w=ol(e.LMCTL_MAILBOX_CHATLOG_POLL_SECONDS),y=i(e.LMCTL_MAILBOX_KEY),S=i(e.LMCTL_TOKEN_PATH);return f.config={identityPoolId:o,cognitoUserPoolId:a,cognitoClientId:u,region:c,mailboxBucket:l,...typeof p=="number"&&Number.isFinite(p)&&p>=100?{pollIntervalMs:p}:{},..._!==void 0?{readIntervalMs:_}:{},...h!==void 0?{heartbeatIdleMs:h}:{},...g!==void 0?{backoffReadIntervalMs:g}:{},...w!==void 0?{chatLogPollIntervalMs:w}:{},...y!==void 0?{mailboxKey:y}:{},...S!==void 0?{tokenPath:S}:{}},f}function Jq(t){try{let e=al(t,"utf8"),r=JSON.parse(e).outputs??{},s={};for(let[i,o]of Object.entries(r))o!==null&&typeof o=="object"&&typeof o.value=="string"&&(s[i]=o.value);return s}catch{return{}}}function Gq(t){let e=Zf(jq(t??import.meta.url));return[sl(e,"..","..","..","..","infra","terraform","terraform.tfstate"),sl(e,"..","..","..","..","..","infra","terraform","terraform.tfstate"),sl(e,"..","..","..","infra","terraform","terraform.tfstate"),sl(e,"..","..","infra","terraform","terraform.tfstate")]}function ol(t){if(t===void 0||t==="")return;let e=Number(t);if(!(!Number.isFinite(e)||e<=0))return e*1e3}function Kq(t){let e=Vq(t.intervalMs)??Uv,n=Math.max(1,Math.trunc(t.limit??500)),r=t.now??Date.now,s=t.cursorKey!==void 0&&t.store.loadTeamChatLogCursor!==void 0&&t.store.saveTeamChatLogCursor!==void 0?{key:t.cursorKey,load:t.store.loadTeamChatLogCursor.bind(t.store),save:t.store.saveTeamChatLogCursor.bind(t.store)}:null,i,o=!1,a=!1,l=()=>{try{if(s!==null){let d=s.load(s.key);if(d!==null)return i=d.last_pushed_id,!0}return i=t.store.getMaxTeamChatLogId(),s!==null&&s.save({cursor_key:s.key,last_pushed_id:i,updated_at:new Date(r()).toISOString()}),!0}catch(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||o)){o=!0;try{if(i===void 0&&!l())return;let d=t.store.listTeamChatLogSinceId(i,n);for(let f of d){let m={kind:"daemon_event",event:"chat_log",ts:r(),entry:{id:f.id,root_teamfile:f.root_teamfile,sender_teamfile:f.sender_teamfile,sender_alias:f.sender_alias,receiver_teamfile:f.receiver_teamfile,receiver_alias:f.receiver_alias,message:f.message,response:f.response,status:f.status,created_at:f.created_at}};await t.publishDaemonEvent(m),s!==null&&s.save({cursor_key:s.key,last_pushed_id:f.id,updated_at:new Date(r()).toISOString()}),i=Math.max(i,f.id)}}catch(d){t.log?.(`[mailbox] daemon_event chat_log tail failed: ${d instanceof Error?d.message:String(d)}`)}finally{o=!1}}},u=setInterval(()=>{c()},e);return typeof u.unref=="function"&&u.unref(),{pollNow:c,stop(){a=!0,clearInterval(u)}}}function Vq(t){return typeof t=="number"&&Number.isFinite(t)&&t>0?t:void 0}async function Wv(t){let e=t.tokenPath??Pv(Fv(),".lmctl","cli-tokens.json"),n=Cv(t.tokenPath);if(cv(n.cognito?.idToken)&&qf()!==null)try{await Ev({region:t.region,clientId:t.cognitoClientId??ll,cliTokensPath:e}),n=Cv(t.tokenPath),t.log?.("[mx-mailbox] refreshed IdToken from device-auth refresh token")}catch(R){let re=R instanceof Error?R.message:String(R);t.log?.(`[mx-mailbox] device-auth refresh failed: ${re}`)}if(n.cognito===void 0)throw new Error("agent_mailbox_not_logged_in: ~/.lmctl/cli-tokens.json has no cognito tokens; run `webcli login` or `lmctl device login` first");let r=n.cognito.idToken;if(typeof r!="string"||r==="")throw new Error("agent_mailbox_no_id_token: cli-tokens.json's cognito.idToken is empty; run `webcli login` or `lmctl device login` first");let s=`cognito-idp.${t.region}.amazonaws.com/${t.cognitoUserPoolId}`,i=n.cognito.identityId,o=!1;i===void 0||i===""?i=await $v({tokenPath:e,region:t.region,identityPoolId:t.identityPoolId,idpProvider:s,idToken:r,log:t.log}):(o=!0,t.log?.(`[mx-mailbox] using cached identityId from cli-tokens (skipping GetId) for ${i}`));let a=Rv({identityId:i,logins:{[s]:r},clientConfig:{region:t.region}}),l=new Lv({region:t.region,credentials:a}),c={ListObjectsV2Command:Wq,GetObjectCommand:Uq,PutObjectCommand:qq},u=ai(r),d=u??i,f=t.deviceId,m=Gr({identityId:i,userId:u,deviceId:f,mailboxKey:t.mailboxKey}),p=t.cursorStore,_;if(p!==void 0){let R=p.loadMailboxCursor(d,m);if(R!==null)_=R.last_processed_seq??void 0,t.log?.(`[mx-mailbox] resumed seq cursor=${_??"(sentinel)"} for user_id=${d}`);else{let re=!1,X=0;for(;!re&&X<2;){X+=1;try{let N=Ca(m,"web"),A=0,C;do{let H=await l.send(new c.ListObjectsV2Command({Bucket:t.mailboxBucket,Prefix:N,MaxKeys:1e3,...C!==void 0?{ContinuationToken:C}:{}}));for(let W of H.Contents??[]){let F=$a(W.Key??"",m,"web");F!==void 0&&F>A&&(A=F)}C=H.IsTruncated===!0?H.NextContinuationToken:void 0}while(C!==void 0);_=A,t.log?.(`[mx-mailbox] cold start: seeded seq cursor=${A} for user_id=${d}`),re=!0}catch(N){let A=N instanceof Error?N.message:String(N);if(o&&X===1&&Zq(N)){t.log?.(`[mx-mailbox] cached identityId rejected by cognito (${A}); clearing + refreshing`),zq(e),o=!1,i=await $v({tokenPath:e,region:t.region,identityPoolId:t.identityPoolId,idpProvider:s,idToken:r,log:t.log}),a=Rv({identityId:i,logins:{[s]:r},clientConfig:{region:t.region}}),l=new Lv({region:t.region,credentials:a}),m=Gr({identityId:i,userId:u,deviceId:f,mailboxKey:t.mailboxKey});continue}t.log?.(`[mx-mailbox] cold start seq probe failed: ${A}`);break}}p.saveMailboxCursor({user_id:d,mailbox_key:m,last_processed_version_id:null,last_processed_seq:_??null,last_processed_at:new Date().toISOString()})}}let h=null,g=t.terminalSessionManager,w=t.persistentSessionManager,y=t.promptTriggerStore,S=new el,k=new lr({bucket:t.mailboxBucket,identityId:i,...u!==null?{userId:u}:{},...f!==void 0?{deviceId:f}:{},...t.mailboxKey!==void 0?{mailboxKey:t.mailboxKey}:{},s3:l,commands:c,selfRole:"agent",onS3Op:R=>S.record(R),onMessage:async R=>{if(g!==void 0&&$f(R.payload)){g.onInbound(R.payload);return}if(w!==void 0&&Mf(R.payload)){await w.onInbound(R.payload);return}if(!jf(R.payload)){if(y!==void 0&&Pf(R.payload)){zf({store:y,payload:R.payload,log:t.log});return}h!==null&&await h.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()})}}:{},..._!==void 0?{cursor:_}:{},...t.pollIntervalMs!==void 0?{pollIntervalMs:t.pollIntervalMs}:{},...t.readIntervalMs!==void 0?{readIntervalMs:t.readIntervalMs}:{},...t.heartbeatIdleMs!==void 0?{heartbeatIdleMs:t.heartbeatIdleMs}:{},...t.backoffReadIntervalMs!==void 0?{backoffReadIntervalMs:t.backoffReadIntervalMs}:{}});h=new oi({client:k,...t.log!==void 0?{log:t.log}:{}}),g!==void 0&&g.setPublish(async R=>k.putMessage({conversation_id:`terminal:${R.session_id}`,payload:R})),w!==void 0&&w.setPublish(async R=>k.putMessage({conversation_id:`provider:${R.session_id}`,payload:R}));let b=R=>k.putMessage({conversation_id:Df,payload:R});k.start();let M=t.chatLogTailStore===void 0?void 0:Kq({store:t.chatLogTailStore,publishDaemonEvent:b,cursorKey:m,intervalMs:t.chatLogPollIntervalMs??t.readIntervalMs??t.pollIntervalMs??Uv,log:t.log});t.log?.(`[mx-mailbox] agent polling ${m} (bucket=${t.mailboxBucket})`);let U=t.deviceId??i,P=`${d}/usage/`,x;return x=t.usageStore===void 0?void 0:ev({meter:S,store:t.usageStore,userId:d,deviceId:U,ceilingUsd:t.usageQuotaUsd??1/0,onQuotaExceeded:({period:R,costUsd:re,ceilingUsd:X})=>{t.log?.(`[usage] month ${R} cost $${re.toFixed(4)} >= ceiling $${X} \u2014 blocking mailbox`),k.stop().catch(()=>{}),x?.stop()},publishOwnRollup:async(R,re)=>{await l.send(new c.PutObjectCommand({Bucket:t.mailboxBucket,Key:`${P}${U}-${R}.json`,Body:JSON.stringify({...re,updated_at:new Date().toISOString()}),ContentType:"application/json"}))},readUserTotal:async R=>{let re={put:0,get:0,list:0},X;do{let N=await l.send(new c.ListObjectsV2Command({Bucket:t.mailboxBucket,Prefix:P,MaxKeys:1e3,...X!==void 0?{ContinuationToken:X}:{}}));for(let A of N.Contents??[]){let C=A.Key??"";if(C.endsWith(`-${R}.json`))try{let H=await l.send(new c.GetObjectCommand({Bucket:t.mailboxBucket,Key:C}));if(H.Body===void 0)continue;let W=JSON.parse(await H.Body.transformToString("utf-8"));re.put+=W.put??0,re.get+=W.get??0,re.list+=W.list??0}catch{}}X=N.IsTruncated===!0?N.NextContinuationToken:void 0}while(X!==void 0);return re},intervalMs:t.usageFlushIntervalMs??36e5,...t.log!==void 0?{log:t.log}:{}}),{identityId:i,mailbox:k,fetchClient:h,publishDaemonEvent:b,async stop(){M?.stop(),x!==void 0&&(await x.flushNow().catch(()=>{}),x.stop()),await h.stop().catch(()=>{}),await k.stop().catch(()=>{})}}}async function qv(t){let e=t.s3!==void 0&&t.commands!==void 0?{s3:t.s3,commands:t.commands}:Qa(t.rootDir),n=Gr({identityId:ci,userId:ci,deviceId:Ov}),r=null,s=t.terminalSessionManager,i=t.persistentSessionManager,o=t.promptTriggerStore,a=new lr({bucket:"local",identityId:ci,userId:ci,deviceId:Ov,s3:e.s3,commands:e.commands,selfRole:"agent",onMessage:async c=>{if(s!==void 0&&$f(c.payload)){s.onInbound(c.payload);return}if(i!==void 0&&Mf(c.payload)){await i.onInbound(c.payload);return}if(!jf(c.payload)){if(o!==void 0&&Pf(c.payload)){zf({store:o,payload:c.payload,log:t.log});return}r!==null&&await r.handleIncoming(c.payload,c)}},pollIntervalMs:t.pollIntervalMs??il,readIntervalMs:t.readIntervalMs??il,heartbeatIdleMs:t.heartbeatIdleMs??il,backoffReadIntervalMs:t.backoffReadIntervalMs??il});r=new oi({client:a,...t.log!==void 0?{log:t.log}:{}}),s!==void 0&&s.setPublish(async c=>a.putMessage({conversation_id:`terminal:${c.session_id}`,payload:c})),i!==void 0&&i.setPublish(async c=>a.putMessage({conversation_id:`provider:${c.session_id}`,payload:c}));let l=c=>a.putMessage({conversation_id:Df,payload:c});return a.start(),t.log?.(`[local-webui] agent polling ${n} (local-fs ${t.rootDir})`),{identityId:ci,mailbox:a,fetchClient:r,publishDaemonEvent:l,async stop(){await r.stop().catch(()=>{}),await a.stop().catch(()=>{})}}}function Cv(t){let e=t??Pv(Fv(),".lmctl","cli-tokens.json");try{let n=al(e,"utf8");return JSON.parse(n)}catch{return{}}}function Yq(t,e){if(e===void 0||e==="")return;let n={};try{let s=al(t,"utf8");n=JSON.parse(s)}catch{}if(n.cognito===void 0)return;let r={...n,cognito:{...n.cognito,identityId:e}};Dv(Zf(t),{recursive:!0,mode:448}),jv(t,JSON.stringify(r,null,2));try{Mv(t,384)}catch{}}function zq(t){let e={};try{let r=al(t,"utf8");e=JSON.parse(r)}catch{return}if(e.cognito===void 0)return;let n={...e,cognito:{...e.cognito}};delete n.cognito.identityId,Dv(Zf(t),{recursive:!0,mode:448}),jv(t,JSON.stringify(n,null,2));try{Mv(t,384)}catch{}}async function $v(t){t.log?.("[mx-mailbox] cli-tokens has no identityId; calling GetId");let n=await new Pq({region:t.region}).send(new Fq({IdentityPoolId:t.identityPoolId,Logins:{[t.idpProvider]:t.idToken}}));if(n.IdentityId===void 0||n.IdentityId==="")throw new Error("cognito_getid_no_identity_id");try{Yq(t.tokenPath,n.IdentityId),t.log?.(`[mx-mailbox] persisted identityId=${n.IdentityId} to ${t.tokenPath}`)}catch(r){let s=r instanceof Error?r.message:String(r);t.log?.(`[mx-mailbox] WARNING: identityId persist failed (${s}); will redo GetId on next restart`)}return n.IdentityId}function Zq(t){if(t===null||typeof t!="object")return!1;let e=t,n=[typeof e.name=="string"?e.name:void 0,typeof e.Code=="string"?e.Code:void 0,typeof e.__type=="string"?e.__type:void 0];for(let s of n)if(s!==void 0&&(s==="NotAuthorizedException"||s==="ResourceNotFoundException"||s==="InvalidIdentityPoolConfigurationException"||s==="ExpiredTokenException"))return!0;let r=typeof e.message=="string"?e.message:"";return!!(r.includes("NotAuthorizedException")||r.includes("Invalid identity pool configuration")||r.includes("Identity")&&r.includes("not found"))}var Uv,il,ll,Bq,Hq,Xq,ci,Ov,Qf=E(()=>{"use strict";Pa();xf();Of();tv();rv();sv();iv();ov();Ff();Ma();Uf();Hf();xv();Uv=3e3,il=1e3,ll="79u5jhkk46qofog661c9i0bdcs",Bq="us-east-1:69636ff0-e008-4cbc-853d-180e5526a198",Hq="us-east-1_4iUdFggDn",Xq="lmctl-next-preview-mailbox-254332045686";ci="local",Ov="local"});import{spawn as rm}from"node:child_process";import{createInterface as Bv}from"node:readline";var em,tm,nm,Hv,Xv=E(()=>{"use strict";lo();de();As();em=class{child;ctx;rl;nextRpcId=1;pending=new Map;threadId;nextLocalTurnId=1;closed=!1;setResumeThreadId(e){this.threadId=e}async start(e,n){this.ctx=n;let r=rm(e.command,e.args,{cwd:e.cwd??process.cwd(),env:e.env??process.env,stdio:["pipe","pipe","pipe"]});if(this.child=r,this.rl=Bv({input:r.stdout}),this.rl.on("line",s=>{n.generation===n.currentGeneration()&&this.handleLine(s)}),r.stderr?.on("data",s=>{if(n.generation!==n.currentGeneration())return;let i=s instanceof Buffer?s.toString("utf8"):String(s);n.emit({event_type:"notification",payload:{source:"stderr",text:i}})}),await this.rpc("initialize",{clientInfo:{name:"lmctl-dt3",title:"lmctl DT-3",version:"0.1.0"},capabilities:{experimentalApi:!1}}),this.notify("initialized",{}),this.threadId!==void 0&&this.threadId!=="")try{await this.rpc("thread/resume",{threadId:this.threadId,approvalPolicy:"never",sandbox:"danger-full-access"}),n.emit({event_type:"thread_started",payload:{thread_id:this.threadId,resumed:!0}})}catch{let i=(await this.rpc("thread/start",{cwd:e.cwd??process.cwd(),approvalPolicy:"never",sandbox:"danger-full-access"})).result?.thread,o=typeof i?.id=="string"?i.id:void 0;this.threadId=o,n.emit({event_type:"thread_started",payload:{thread_id:o,resumed:!1}})}else{let i=(await this.rpc("thread/start",{cwd:e.cwd??process.cwd(),approvalPolicy:"never",sandbox:"danger-full-access"})).result?.thread,o=typeof i?.id=="string"?i.id:void 0;this.threadId=o,n.emit({event_type:"thread_started",payload:{thread_id:o,resumed:!1}})}return r}async sendTurn(e){if(this.closed)throw new Error("codex_session_closed");if(this.threadId===void 0||this.threadId==="")throw new Error("codex_no_thread_id");let n=`local-${this.nextLocalTurnId++}`;this.ctx?.turnMap.set(n,{startedAt:Date.now()});try{let s=(await this.rpc("turn/start",{threadId:this.threadId,input:[{type:"text",text:e}]})).result?.turn,i=typeof s?.id=="string"?s.id:void 0;if(i!==void 0){let o=this.ctx?.turnMap.get(n);this.ctx?.turnMap.delete(n),o!==void 0&&this.ctx?.turnMap.set(i,o)}}catch(r){throw this.ctx?.turnMap.delete(n),r}}async stop(){if(this.closed=!0,this.rl!==void 0&&(this.rl.close(),this.rl=void 0),this.child?.stdin!==null&&this.child?.stdin?.end!==void 0)try{this.child.stdin.end()}catch{}for(let e of this.pending.values())e.reject(new Error("codex_session_stopping"));this.pending.clear()}async rpc(e,n){if(this.child?.stdin===null||this.child===void 0)throw new Error("codex_child_unavailable");return new Promise((r,s)=>{let i=this.nextRpcId++;this.pending.set(i,{resolve:r,reject:s});let o=JSON.stringify({jsonrpc:"2.0",id:i,method:e,params:n});try{this.child.stdin.write(o+`
2280
+ allowed keys: ${vv.join(", ")}`);if(!d.provider&&!d.teamfile){s.push(`line ${u}: member line missing provider (or teamfile): ${c.trim()}`);continue}let m={alias:d.alias||`member${r.length+1}`,provider:d.provider||"",extra:{}};d.sessionid&&(m.session=d.sessionid),Object.prototype.hasOwnProperty.call(d,"sessiondir")&&(m.sessiondir=d.sessiondir),d.teamfile&&(m.teamfile=d.teamfile),d.model&&(m.model=d.model),d.effort&&(m.effort=d.effort),r.push(m)}return{name:e,members:r,rawText:t,parseErrors:s,frontmatter:o}}function Vf(t,e){let n=[];for(let i of t.parseErrors)n.push({field:"session",message:i});let r=t.members.filter(i=>i.alias.toLowerCase()===Jf.toLowerCase());r.length>1&&n.push({field:Jf,message:`${r.length} alias=Lead found (max 1)`});let s=new Set;for(let i of t.members){let o=i.alias.toLowerCase();if(s.has(o)&&n.push({field:i.alias,message:`Duplicate alias "${i.alias}" (case-insensitive)`}),s.add(o),i.teamfile){let a=e?Zr(e,i.teamfile):Zr(i.teamfile);if(!bv(a))n.push({field:i.alias,message:`Teamfile not found: ${a}`});else{let l=je(a),c=ht(l);c?c.session||n.push({field:i.alias,message:`Team at ${i.teamfile} lead has no session ID. Run: lmctl seed`}):n.push({field:i.alias,message:`Team at ${i.teamfile} has no lead session`})}}else Tq.has(i.provider)||n.push({field:i.alias,message:`Invalid provider "${i.provider}"`});i.sessiondir!==void 0&&i.sessiondir===""&&n.push({field:i.alias,message:"sessiondir is empty"})}return n}function ht(t){return t.members.find(e=>e.alias.toLowerCase()===Jf.toLowerCase())}function Yf(t,e,n,r={}){let s=r.requireSession??!0;if(!t.teamfile)throw new Error(`Member "${t.alias}" is not a team reference`);let i=Zr(e,t.teamfile),o=n??new Set;if(o.has(i))throw new Error(`Circular team reference: ${t.alias} \u2192 ${i} (already visited: ${[...o].join(" \u2192 ")})`);if(o.add(i),!bv(i))throw new Error(`Teamfile not found: ${i} (referenced by alias "${t.alias}")`);let a=je(i),l=ht(a);if(!l)throw new Error(`Team at ${i} has no lead session`);if(l.teamfile)return Yf(l,Xf(i),o,r);if(s&&!l.session)throw new Error(`Team at ${i} lead has no session ID. Run: lmctl seed`);return{provider:l.provider,session:l.session??"",sessiondir:l.sessiondir||Xf(i),alias:t.alias,resolvedFrom:i,model:l.model,effort:l.effort}}function kv(t,e){return t.members.find(n=>n.alias===e)??t.members.find(n=>n.alias.toLowerCase()===e.toLowerCase())}var Jf,Tq,vv,Kt=E(()=>{"use strict";Sv();Jf="Lead",Tq=new Set(["claude","codex","opencode","lmplayer","gemini","copilot","qwen","agy","kimi","dsh","ClaudeMock"]);vv=["alias","provider","sessionid","sessiondir","teamfile","model","effort"]});import{existsSync as Iq,realpathSync as Nq}from"node:fs";import{dirname as Aq}from"node:path";function zf(t){xq(t).catch(e=>{t.log?.(`[mailbox] prompt trigger failed: ${e instanceof Error?e.message:String(e)}`)})}async function xq(t){let e=t.payload.root_teamfile;try{e=Nq(t.payload.root_teamfile)}catch(i){let o=`prompt root missing/unreadable: ${t.payload.root_teamfile}: ${i instanceof Error?i.message:String(i)}`;return Qr({rootTeamfile:t.payload.root_teamfile,receiverTeamfile:t.payload.root_teamfile,receiverAlias:"Lead",message:t.payload.text,promptId:t.payload.prompt_id,detail:o,reason:"root_unavailable"}),t.log?.(`[mailbox] ${o}`),{status:"error",response:null,error_detail:o}}if(t.store.getRootTeam(e)===null){let i=`prompt root is not registered: ${e}`;return Qr({rootTeamfile:e,receiverTeamfile:e,receiverAlias:"Lead",message:t.payload.text,promptId:t.payload.prompt_id,detail:i,reason:"root_unregistered"}),t.log?.(`[mailbox] ${i}`),{status:"error",response:null,error_detail:i}}let n=Lq(e);if("error"in n)return Qr({rootTeamfile:e,receiverTeamfile:e,receiverAlias:"Lead",message:t.payload.text,promptId:t.payload.prompt_id,detail:n.error,reason:"root_invalid"}),t.log?.(`[mailbox] ${n.error}`),{status:"error",response:null,error_detail:n.error};let r=Er(t.store,{receiver_teamfile:e,receiver_alias:n.alias,sender_teamfile:`prompt:${t.payload.prompt_id}`,sender_alias:"operator",ttlMs:Mq(t.env??process.env)});if(!r.acquired){let i=$q(n.alias,r.current);return Qr({rootTeamfile:e,receiverTeamfile:e,receiverAlias:n.alias,message:t.payload.text,promptId:t.payload.prompt_id,detail:i,reason:"unavailable"}),t.log?.(`[mailbox] prompt rejected: ${i}`),{status:"error",response:null,error_detail:i}}let s=Xi(i=>t.store.heartbeatAgentInflight(r.lease,r.leaseId,i),{intervalMs:S_(t.env??process.env)});try{let o=await(t.chat??rn)({provider:n.provider,sessionId:n.sessionid,cwd:n.sessiondir,prompt:t.payload.text,env:t.env??process.env,alias:n.alias,permissionMode:"yolo",...t.timeoutMs!==void 0?{timeoutMs:t.timeoutMs}:{}}),a=o.status==="stalled",l=!a&&o.text.trim()==="",c=a?`provider stalled${o.stalledAfterMs!==void 0?` after ${o.stalledAfterMs}ms`:""}`:l?"provider returned empty response":null,u=a||l?"error":"ok";return u==="ok"?await Oq(t.store,{rootTeamfile:e,receiverTeamfile:e,receiverAlias:n.alias,message:t.payload.text,response:o.text,status:u,error_detail:null,log:t.log}):Qr({rootTeamfile:e,receiverTeamfile:e,receiverAlias:n.alias,message:t.payload.text,promptId:t.payload.prompt_id,detail:c??"provider failed",reason:a?"stalled":"empty_response"}),{status:u,response:u==="error"?null:o.text,error_detail:c}}catch(i){let o=i instanceof Error?i.message:String(i);return Qr({rootTeamfile:e,receiverTeamfile:e,receiverAlias:n.alias,message:t.payload.text,promptId:t.payload.prompt_id,detail:o,reason:"provider_error"}),t.log?.(`[mailbox] prompt provider error: ${o}`),{status:"error",response:null,error_detail:o}}finally{clearInterval(s);try{t.store.releaseAgentInflight(r.lease,r.leaseId)}catch(i){t.log?.(`[mailbox] failed to release prompt in-flight slot: ${i instanceof Error?i.message:String(i)}`)}}}function Qr(t){D({event:"prompt_trigger_error",reason:t.reason,prompt_id:t.promptId,root_teamfile:t.rootTeamfile,sender_teamfile:t.rootTeamfile,sender_alias:"operator",receiver_teamfile:t.receiverTeamfile,receiver_alias:t.receiverAlias,error_detail:t.detail,message_preview:Rq(t.message)})}function Rq(t){let e=t.replace(/\s+/gu," ").trim();return e.length<=500?e:`${e.slice(0,497)}...`}function Lq(t){if(!Iq(t))return{error:`prompt root missing/unreadable: ${t}`};let e=je(t);if(e.parseErrors.length>0)return{error:`prompt root parse error: ${e.parseErrors.join("; ")}`};let n=ht(e);return n===void 0?{error:`prompt root has no Lead: ${t}`}:n.session===void 0||n.session.trim()===""?{error:`prompt root Lead is unseeded: ${t}`}:{alias:n.alias,provider:n.provider,sessionid:n.session,sessiondir:n.sessiondir??Aq(t)}}async function Oq(t,e){let n=Av(e.message),r=e.response===null?null:Av(e.response);try{t.insertTeamChatLog({root_teamfile:e.rootTeamfile,sender_teamfile:e.rootTeamfile,sender_alias:"operator",receiver_teamfile:e.receiverTeamfile,receiver_alias:e.receiverAlias,message:n.text,response:r?.text??null,origin:"unknown",status:e.status,error_detail:e.error_detail,truncated:n.truncated||r?.truncated?1:0,created_at:new Date().toISOString()})}catch(s){e.log?.(`[mailbox] warning: failed to record prompt chat log: ${s instanceof Error?s.message:String(s)}`)}}function Av(t){return t.length<=Iv?{text:t,truncated:!1}:{text:t.slice(0,Iv),truncated:!0}}function Cq(t,e){return`${t} is servicing ${e.sender_alias} (${e.sender_teamfile}) since ${e.started_at}`}function $q(t,e){return e.sender_teamfile.startsWith("prompt:")?`${t} is busy servicing another prompt since ${e.started_at}`:Cq(t,e)}function Mq(t=process.env){let e=t.LMCTL_INFLIGHT_TTL_MS;if(e===void 0||e.trim()==="")return Nv;let n=Number(e);return!Number.isFinite(n)||n<=0?Nv:n}var Iv,Nv,xv=E(()=>{"use strict";mt();Kt();de();ct();Iv=256*1024,Nv=30*60*1e3});import{chmodSync as Mv,existsSync as Dq,mkdirSync as Dv,readFileSync as al,writeFileSync as jv}from"node:fs";import{dirname as Zf,resolve as sl,join as Pv}from"node:path";import{fileURLToPath as jq}from"node:url";import{homedir as Fv}from"node:os";import{CognitoIdentityClient as Pq,GetIdCommand as Fq}from"@aws-sdk/client-cognito-identity";import{fromCognitoIdentity as Rv}from"@aws-sdk/credential-provider-cognito-identity";import{GetObjectCommand as Uq,ListObjectsV2Command as Wq,PutObjectCommand as qq,S3Client as Lv}from"@aws-sdk/client-s3";function di(t={}){let e=t.env??process.env,n=t.tfstatePath!==void 0?[t.tfstatePath]:Gq(t.selfUrl),r={},s;for(let k of n)if(Dq(k)){r=Jq(k),s=k;break}let i=(...k)=>{for(let b of k)if(typeof b=="string"&&b!=="")return b},o=i(e.LMCTL_NEXT_IDENTITY_POOL_ID,r.LMCTL_NEXT_IDENTITY_POOL_ID)??Bq,a=i(e.LMCTL_NEXT_COGNITO_USER_POOL_ID,r.LMCTL_NEXT_COGNITO_USER_POOL_ID)??Hq,l=i(e.LMCTL_NEXT_MAILBOX_BUCKET,e.LMCTL_NEXT_POLICY_BUCKET,r.LMCTL_NEXT_MAILBOX_BUCKET,r.LMCTL_NEXT_POLICY_BUCKET)??Xq,c=i(e.AWS_REGION,e.AWS_DEFAULT_REGION)??"us-east-1",u=i(e.LMCTL_NEXT_COGNITO_CLIENT_ID,r.LMCTL_NEXT_COGNITO_CLIENT_ID)??ll,d=[];o===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:n,...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,_=ol(e.LMCTL_MAILBOX_READ_INTERVAL_SECONDS),h=ol(e.LMCTL_MAILBOX_HEARTBEAT_IDLE_SECONDS),g=ol(e.LMCTL_MAILBOX_BACKOFF_READ_INTERVAL_SECONDS),y=ol(e.LMCTL_MAILBOX_CHATLOG_POLL_SECONDS),w=i(e.LMCTL_MAILBOX_KEY),S=i(e.LMCTL_TOKEN_PATH);return f.config={identityPoolId:o,cognitoUserPoolId:a,cognitoClientId:u,region:c,mailboxBucket:l,...typeof p=="number"&&Number.isFinite(p)&&p>=100?{pollIntervalMs:p}:{},..._!==void 0?{readIntervalMs:_}:{},...h!==void 0?{heartbeatIdleMs:h}:{},...g!==void 0?{backoffReadIntervalMs:g}:{},...y!==void 0?{chatLogPollIntervalMs:y}:{},...w!==void 0?{mailboxKey:w}:{},...S!==void 0?{tokenPath:S}:{}},f}function Jq(t){try{let e=al(t,"utf8"),r=JSON.parse(e).outputs??{},s={};for(let[i,o]of Object.entries(r))o!==null&&typeof o=="object"&&typeof o.value=="string"&&(s[i]=o.value);return s}catch{return{}}}function Gq(t){let e=Zf(jq(t??import.meta.url));return[sl(e,"..","..","..","..","infra","terraform","terraform.tfstate"),sl(e,"..","..","..","..","..","infra","terraform","terraform.tfstate"),sl(e,"..","..","..","infra","terraform","terraform.tfstate"),sl(e,"..","..","infra","terraform","terraform.tfstate")]}function ol(t){if(t===void 0||t==="")return;let e=Number(t);if(!(!Number.isFinite(e)||e<=0))return e*1e3}function Kq(t){let e=Vq(t.intervalMs)??Uv,n=Math.max(1,Math.trunc(t.limit??500)),r=t.now??Date.now,s=t.cursorKey!==void 0&&t.store.loadTeamChatLogCursor!==void 0&&t.store.saveTeamChatLogCursor!==void 0?{key:t.cursorKey,load:t.store.loadTeamChatLogCursor.bind(t.store),save:t.store.saveTeamChatLogCursor.bind(t.store)}:null,i,o=!1,a=!1,l=()=>{try{if(s!==null){let d=s.load(s.key);if(d!==null)return i=d.last_pushed_id,!0}return i=t.store.getMaxTeamChatLogId(),s!==null&&s.save({cursor_key:s.key,last_pushed_id:i,updated_at:new Date(r()).toISOString()}),!0}catch(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||o)){o=!0;try{if(i===void 0&&!l())return;let d=t.store.listTeamChatLogSinceId(i,n);for(let f of d){let m={kind:"daemon_event",event:"chat_log",ts:r(),entry:{id:f.id,root_teamfile:f.root_teamfile,sender_teamfile:f.sender_teamfile,sender_alias:f.sender_alias,receiver_teamfile:f.receiver_teamfile,receiver_alias:f.receiver_alias,message:f.message,response:f.response,status:f.status,created_at:f.created_at}};await t.publishDaemonEvent(m),s!==null&&s.save({cursor_key:s.key,last_pushed_id:f.id,updated_at:new Date(r()).toISOString()}),i=Math.max(i,f.id)}}catch(d){t.log?.(`[mailbox] daemon_event chat_log tail failed: ${d instanceof Error?d.message:String(d)}`)}finally{o=!1}}},u=setInterval(()=>{c()},e);return typeof u.unref=="function"&&u.unref(),{pollNow:c,stop(){a=!0,clearInterval(u)}}}function Vq(t){return typeof t=="number"&&Number.isFinite(t)&&t>0?t:void 0}async function Wv(t){let e=t.tokenPath??Pv(Fv(),".lmctl","cli-tokens.json"),n=Cv(t.tokenPath);if(cv(n.cognito?.idToken)&&qf()!==null)try{await Ev({region:t.region,clientId:t.cognitoClientId??ll,cliTokensPath:e}),n=Cv(t.tokenPath),t.log?.("[mx-mailbox] refreshed IdToken from device-auth refresh token")}catch(R){let re=R instanceof Error?R.message:String(R);t.log?.(`[mx-mailbox] device-auth refresh failed: ${re}`)}if(n.cognito===void 0)throw new Error("agent_mailbox_not_logged_in: ~/.lmctl/cli-tokens.json has no cognito tokens; run `webcli login` or `lmctl device login` first");let r=n.cognito.idToken;if(typeof r!="string"||r==="")throw new Error("agent_mailbox_no_id_token: cli-tokens.json's cognito.idToken is empty; run `webcli login` or `lmctl device login` first");let s=`cognito-idp.${t.region}.amazonaws.com/${t.cognitoUserPoolId}`,i=n.cognito.identityId,o=!1;i===void 0||i===""?i=await $v({tokenPath:e,region:t.region,identityPoolId:t.identityPoolId,idpProvider:s,idToken:r,log:t.log}):(o=!0,t.log?.(`[mx-mailbox] using cached identityId from cli-tokens (skipping GetId) for ${i}`));let a=Rv({identityId:i,logins:{[s]:r},clientConfig:{region:t.region}}),l=new Lv({region:t.region,credentials:a}),c={ListObjectsV2Command:Wq,GetObjectCommand:Uq,PutObjectCommand:qq},u=ai(r),d=u??i,f=t.deviceId,m=Gr({identityId:i,userId:u,deviceId:f,mailboxKey:t.mailboxKey}),p=t.cursorStore,_;if(p!==void 0){let R=p.loadMailboxCursor(d,m);if(R!==null)_=R.last_processed_seq??void 0,t.log?.(`[mx-mailbox] resumed seq cursor=${_??"(sentinel)"} for user_id=${d}`);else{let re=!1,X=0;for(;!re&&X<2;){X+=1;try{let N=Ca(m,"web"),A=0,C;do{let H=await l.send(new c.ListObjectsV2Command({Bucket:t.mailboxBucket,Prefix:N,MaxKeys:1e3,...C!==void 0?{ContinuationToken:C}:{}}));for(let W of H.Contents??[]){let F=$a(W.Key??"",m,"web");F!==void 0&&F>A&&(A=F)}C=H.IsTruncated===!0?H.NextContinuationToken:void 0}while(C!==void 0);_=A,t.log?.(`[mx-mailbox] cold start: seeded seq cursor=${A} for user_id=${d}`),re=!0}catch(N){let A=N instanceof Error?N.message:String(N);if(o&&X===1&&Zq(N)){t.log?.(`[mx-mailbox] cached identityId rejected by cognito (${A}); clearing + refreshing`),zq(e),o=!1,i=await $v({tokenPath:e,region:t.region,identityPoolId:t.identityPoolId,idpProvider:s,idToken:r,log:t.log}),a=Rv({identityId:i,logins:{[s]:r},clientConfig:{region:t.region}}),l=new Lv({region:t.region,credentials:a}),m=Gr({identityId:i,userId:u,deviceId:f,mailboxKey:t.mailboxKey});continue}t.log?.(`[mx-mailbox] cold start seq probe failed: ${A}`);break}}p.saveMailboxCursor({user_id:d,mailbox_key:m,last_processed_version_id:null,last_processed_seq:_??null,last_processed_at:new Date().toISOString()})}}let h=null,g=t.terminalSessionManager,y=t.persistentSessionManager,w=t.promptTriggerStore,S=new el,k=new lr({bucket:t.mailboxBucket,identityId:i,...u!==null?{userId:u}:{},...f!==void 0?{deviceId:f}:{},...t.mailboxKey!==void 0?{mailboxKey:t.mailboxKey}:{},s3:l,commands:c,selfRole:"agent",onS3Op:R=>S.record(R),onMessage:async R=>{if(g!==void 0&&$f(R.payload)){g.onInbound(R.payload);return}if(y!==void 0&&Mf(R.payload)){await y.onInbound(R.payload);return}if(!jf(R.payload)){if(w!==void 0&&Pf(R.payload)){zf({store:w,payload:R.payload,log:t.log});return}h!==null&&await h.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()})}}:{},..._!==void 0?{cursor:_}:{},...t.pollIntervalMs!==void 0?{pollIntervalMs:t.pollIntervalMs}:{},...t.readIntervalMs!==void 0?{readIntervalMs:t.readIntervalMs}:{},...t.heartbeatIdleMs!==void 0?{heartbeatIdleMs:t.heartbeatIdleMs}:{},...t.backoffReadIntervalMs!==void 0?{backoffReadIntervalMs:t.backoffReadIntervalMs}:{}});h=new oi({client:k,...t.log!==void 0?{log:t.log}:{}}),g!==void 0&&g.setPublish(async R=>k.putMessage({conversation_id:`terminal:${R.session_id}`,payload:R})),y!==void 0&&y.setPublish(async R=>k.putMessage({conversation_id:`provider:${R.session_id}`,payload:R}));let b=R=>k.putMessage({conversation_id:Df,payload:R});k.start();let M=t.chatLogTailStore===void 0?void 0:Kq({store:t.chatLogTailStore,publishDaemonEvent:b,cursorKey:m,intervalMs:t.chatLogPollIntervalMs??t.readIntervalMs??t.pollIntervalMs??Uv,log:t.log});t.log?.(`[mx-mailbox] agent polling ${m} (bucket=${t.mailboxBucket})`);let U=t.deviceId??i,P=`${d}/usage/`,x;return x=t.usageStore===void 0?void 0:ev({meter:S,store:t.usageStore,userId:d,deviceId:U,ceilingUsd:t.usageQuotaUsd??1/0,onQuotaExceeded:({period:R,costUsd:re,ceilingUsd:X})=>{t.log?.(`[usage] month ${R} cost $${re.toFixed(4)} >= ceiling $${X} \u2014 blocking mailbox`),k.stop().catch(()=>{}),x?.stop()},publishOwnRollup:async(R,re)=>{await l.send(new c.PutObjectCommand({Bucket:t.mailboxBucket,Key:`${P}${U}-${R}.json`,Body:JSON.stringify({...re,updated_at:new Date().toISOString()}),ContentType:"application/json"}))},readUserTotal:async R=>{let re={put:0,get:0,list:0},X;do{let N=await l.send(new c.ListObjectsV2Command({Bucket:t.mailboxBucket,Prefix:P,MaxKeys:1e3,...X!==void 0?{ContinuationToken:X}:{}}));for(let A of N.Contents??[]){let C=A.Key??"";if(C.endsWith(`-${R}.json`))try{let H=await l.send(new c.GetObjectCommand({Bucket:t.mailboxBucket,Key:C}));if(H.Body===void 0)continue;let W=JSON.parse(await H.Body.transformToString("utf-8"));re.put+=W.put??0,re.get+=W.get??0,re.list+=W.list??0}catch{}}X=N.IsTruncated===!0?N.NextContinuationToken:void 0}while(X!==void 0);return re},intervalMs:t.usageFlushIntervalMs??36e5,...t.log!==void 0?{log:t.log}:{}}),{identityId:i,mailbox:k,fetchClient:h,publishDaemonEvent:b,async stop(){M?.stop(),x!==void 0&&(await x.flushNow().catch(()=>{}),x.stop()),await h.stop().catch(()=>{}),await k.stop().catch(()=>{})}}}async function qv(t){let e=t.s3!==void 0&&t.commands!==void 0?{s3:t.s3,commands:t.commands}:Qa(t.rootDir),n=Gr({identityId:ci,userId:ci,deviceId:Ov}),r=null,s=t.terminalSessionManager,i=t.persistentSessionManager,o=t.promptTriggerStore,a=new lr({bucket:"local",identityId:ci,userId:ci,deviceId:Ov,s3:e.s3,commands:e.commands,selfRole:"agent",onMessage:async c=>{if(s!==void 0&&$f(c.payload)){s.onInbound(c.payload);return}if(i!==void 0&&Mf(c.payload)){await i.onInbound(c.payload);return}if(!jf(c.payload)){if(o!==void 0&&Pf(c.payload)){zf({store:o,payload:c.payload,log:t.log});return}r!==null&&await r.handleIncoming(c.payload,c)}},pollIntervalMs:t.pollIntervalMs??il,readIntervalMs:t.readIntervalMs??il,heartbeatIdleMs:t.heartbeatIdleMs??il,backoffReadIntervalMs:t.backoffReadIntervalMs??il});r=new oi({client:a,...t.log!==void 0?{log:t.log}:{}}),s!==void 0&&s.setPublish(async c=>a.putMessage({conversation_id:`terminal:${c.session_id}`,payload:c})),i!==void 0&&i.setPublish(async c=>a.putMessage({conversation_id:`provider:${c.session_id}`,payload:c}));let l=c=>a.putMessage({conversation_id:Df,payload:c});return a.start(),t.log?.(`[local-webui] agent polling ${n} (local-fs ${t.rootDir})`),{identityId:ci,mailbox:a,fetchClient:r,publishDaemonEvent:l,async stop(){await r.stop().catch(()=>{}),await a.stop().catch(()=>{})}}}function Cv(t){let e=t??Pv(Fv(),".lmctl","cli-tokens.json");try{let n=al(e,"utf8");return JSON.parse(n)}catch{return{}}}function Yq(t,e){if(e===void 0||e==="")return;let n={};try{let s=al(t,"utf8");n=JSON.parse(s)}catch{}if(n.cognito===void 0)return;let r={...n,cognito:{...n.cognito,identityId:e}};Dv(Zf(t),{recursive:!0,mode:448}),jv(t,JSON.stringify(r,null,2));try{Mv(t,384)}catch{}}function zq(t){let e={};try{let r=al(t,"utf8");e=JSON.parse(r)}catch{return}if(e.cognito===void 0)return;let n={...e,cognito:{...e.cognito}};delete n.cognito.identityId,Dv(Zf(t),{recursive:!0,mode:448}),jv(t,JSON.stringify(n,null,2));try{Mv(t,384)}catch{}}async function $v(t){t.log?.("[mx-mailbox] cli-tokens has no identityId; calling GetId");let n=await new Pq({region:t.region}).send(new Fq({IdentityPoolId:t.identityPoolId,Logins:{[t.idpProvider]:t.idToken}}));if(n.IdentityId===void 0||n.IdentityId==="")throw new Error("cognito_getid_no_identity_id");try{Yq(t.tokenPath,n.IdentityId),t.log?.(`[mx-mailbox] persisted identityId=${n.IdentityId} to ${t.tokenPath}`)}catch(r){let s=r instanceof Error?r.message:String(r);t.log?.(`[mx-mailbox] WARNING: identityId persist failed (${s}); will redo GetId on next restart`)}return n.IdentityId}function Zq(t){if(t===null||typeof t!="object")return!1;let e=t,n=[typeof e.name=="string"?e.name:void 0,typeof e.Code=="string"?e.Code:void 0,typeof e.__type=="string"?e.__type:void 0];for(let s of n)if(s!==void 0&&(s==="NotAuthorizedException"||s==="ResourceNotFoundException"||s==="InvalidIdentityPoolConfigurationException"||s==="ExpiredTokenException"))return!0;let r=typeof e.message=="string"?e.message:"";return!!(r.includes("NotAuthorizedException")||r.includes("Invalid identity pool configuration")||r.includes("Identity")&&r.includes("not found"))}var Uv,il,ll,Bq,Hq,Xq,ci,Ov,Qf=E(()=>{"use strict";Pa();xf();Of();tv();rv();sv();iv();ov();Ff();Ma();Uf();Hf();xv();Uv=3e3,il=1e3,ll="79u5jhkk46qofog661c9i0bdcs",Bq="us-east-1:69636ff0-e008-4cbc-853d-180e5526a198",Hq="us-east-1_4iUdFggDn",Xq="lmctl-next-preview-mailbox-254332045686";ci="local",Ov="local"});import{spawn as rm}from"node:child_process";import{createInterface as Bv}from"node:readline";var em,tm,nm,Hv,Xv=E(()=>{"use strict";lo();de();As();em=class{child;ctx;rl;nextRpcId=1;pending=new Map;threadId;nextLocalTurnId=1;closed=!1;setResumeThreadId(e){this.threadId=e}async start(e,n){this.ctx=n;let r=rm(e.command,e.args,{cwd:e.cwd??process.cwd(),env:e.env??process.env,stdio:["pipe","pipe","pipe"]});if(this.child=r,this.rl=Bv({input:r.stdout}),this.rl.on("line",s=>{n.generation===n.currentGeneration()&&this.handleLine(s)}),r.stderr?.on("data",s=>{if(n.generation!==n.currentGeneration())return;let i=s instanceof Buffer?s.toString("utf8"):String(s);n.emit({event_type:"notification",payload:{source:"stderr",text:i}})}),await this.rpc("initialize",{clientInfo:{name:"lmctl-dt3",title:"lmctl DT-3",version:"0.1.0"},capabilities:{experimentalApi:!1}}),this.notify("initialized",{}),this.threadId!==void 0&&this.threadId!=="")try{await this.rpc("thread/resume",{threadId:this.threadId,approvalPolicy:"never",sandbox:"danger-full-access"}),n.emit({event_type:"thread_started",payload:{thread_id:this.threadId,resumed:!0}})}catch{let i=(await this.rpc("thread/start",{cwd:e.cwd??process.cwd(),approvalPolicy:"never",sandbox:"danger-full-access"})).result?.thread,o=typeof i?.id=="string"?i.id:void 0;this.threadId=o,n.emit({event_type:"thread_started",payload:{thread_id:o,resumed:!1}})}else{let i=(await this.rpc("thread/start",{cwd:e.cwd??process.cwd(),approvalPolicy:"never",sandbox:"danger-full-access"})).result?.thread,o=typeof i?.id=="string"?i.id:void 0;this.threadId=o,n.emit({event_type:"thread_started",payload:{thread_id:o,resumed:!1}})}return r}async sendTurn(e){if(this.closed)throw new Error("codex_session_closed");if(this.threadId===void 0||this.threadId==="")throw new Error("codex_no_thread_id");let n=`local-${this.nextLocalTurnId++}`;this.ctx?.turnMap.set(n,{startedAt:Date.now()});try{let s=(await this.rpc("turn/start",{threadId:this.threadId,input:[{type:"text",text:e}]})).result?.turn,i=typeof s?.id=="string"?s.id:void 0;if(i!==void 0){let o=this.ctx?.turnMap.get(n);this.ctx?.turnMap.delete(n),o!==void 0&&this.ctx?.turnMap.set(i,o)}}catch(r){throw this.ctx?.turnMap.delete(n),r}}async stop(){if(this.closed=!0,this.rl!==void 0&&(this.rl.close(),this.rl=void 0),this.child?.stdin!==null&&this.child?.stdin?.end!==void 0)try{this.child.stdin.end()}catch{}for(let e of this.pending.values())e.reject(new Error("codex_session_stopping"));this.pending.clear()}async rpc(e,n){if(this.child?.stdin===null||this.child===void 0)throw new Error("codex_child_unavailable");return new Promise((r,s)=>{let i=this.nextRpcId++;this.pending.set(i,{resolve:r,reject:s});let o=JSON.stringify({jsonrpc:"2.0",id:i,method:e,params:n});try{this.child.stdin.write(o+`
2281
2281
  `)}catch(a){this.pending.delete(i),s(a instanceof Error?a:new Error(String(a)))}})}notify(e,n){if(this.child?.stdin===null||this.child===void 0)return;let r=JSON.stringify({jsonrpc:"2.0",method:e,params:n});try{this.child.stdin.write(r+`
2282
2282
  `)}catch{}}handleLine(e){if(e.trim()==="")return;let n;try{n=JSON.parse(e)}catch{return}if(typeof n.id=="number"&&this.pending.has(n.id)){let o=this.pending.get(n.id);if(this.pending.delete(n.id),n.error!==void 0){let a=n.error,l=typeof a?.message=="string"&&a.message!==""?a.message:JSON.stringify(n.error);o.reject(new Error(`codex_rpc_error: ${l}`))}else o.resolve(n);return}let r=typeof n.method=="string"?n.method:void 0;if(r===void 0)return;let s=n.params??{},i=this.normalizeNotification(r,s);i!==void 0&&this.ctx?.emit(i)}normalizeNotification(e,n){if(e==="thread/started"){let r=n.thread;return typeof r?.id=="string"&&(this.threadId=r.id),{event_type:"thread_started",payload:{thread_id:this.threadId,raw:n}}}if(e==="turn/started")return{event_type:"turn_started",payload:{turn_id:n.turn?.id,thread_id:this.threadId}};if(e==="item/agentMessage/delta")return{event_type:"assistant_message_delta",payload:{text:typeof n.delta=="string"?n.delta:""}};if(e==="item/started"||e==="item/completed"){let r=n.item;return r?.type!==void 0&&r.type!=="agentMessage"&&r.type!=="userMessage"?{event_type:"tool_call",payload:{name:r.name??r.type,status:e==="item/started"?"started":"completed",item:r}}:{event_type:"notification",payload:{method:e,params:n}}}if(e==="turn/completed"){let r=n.turn;return typeof r?.id=="string"&&this.ctx?.turnMap.delete(r.id),{event_type:"turn_complete",payload:n}}if(e==="error"){let r=n.error;return{event_type:"error",payload:{message:typeof r?.message=="string"?r.message:JSON.stringify(n),raw:n}}}return{event_type:"notification",payload:{method:e,params:n}}}},tm=class{child;ctx;buffer="";sessionIdSeen;closed=!1;async start(e,n){this.ctx=n;let r=rm(e.command,e.args,{cwd:e.cwd??process.cwd(),env:e.env??process.env,stdio:["pipe","pipe","pipe"]});return this.child=r,r.stdout.on("data",s=>{if(n.generation!==n.currentGeneration())return;let i=s instanceof Buffer?s.toString("utf8"):String(s);this.buffer+=i;let o=this.buffer.split(`
2283
2283
  `);this.buffer=o.pop()??"";for(let a of o)this.handleLine(a)}),r.stderr?.on("data",s=>{if(n.generation!==n.currentGeneration())return;let i=s instanceof Buffer?s.toString("utf8"):String(s);n.emit({event_type:"notification",payload:{source:"stderr",text:i}})}),r}async sendTurn(e){if(this.closed)throw new Error("claude_session_closed");if(this.child===void 0||this.child.stdin===null)throw new Error("claude_child_unavailable");let n=`claude-${Date.now()}`;this.ctx?.turnMap.set(n,{startedAt:Date.now()});let r=JSON.stringify({type:"user",message:{role:"user",content:e}});try{this.child.stdin.write(r+`
@@ -2295,12 +2295,12 @@ ${Zv.replace(/^error: [^\n]*\n\n/,"")}`),2):_B(t.slice(1),e)}async function _B(t
2295
2295
  `)}let l=n.noDaemon?void 0:US({dal:r,intervalMs:ii()}),c=a!==void 0?{missing:[],tfstateCandidatesChecked:[]}:di({env:process.env});c.missing.length>0&&e.stderr.write(`[lmctl-next-agent] mailbox transport not configured: missing ${c.missing.join(", ")}; running without cloud sync`+(c.tfstatePathUsed===void 0?` (no terraform.tfstate found; checked ${c.tfstateCandidatesChecked.length} candidate path${c.tfstateCandidatesChecked.length===1?"":"s"})`:` (terraform.tfstate at ${c.tfstatePathUsed} did not supply the missing fields)`)+`
2296
2296
  `);let u=await bB({log:k=>e.stderr.write(`${k}
2297
2297
  `)}),d=new Ba({adapterFactory:Hv,publish:async()=>{throw new Error("persistent_publish_not_wired: mailbox runtime has not bound the publish hook yet")},log:k=>e.stderr.write(`${k}
2298
- `)}),f=cr()?.device_id,m=RS({dal:r,daemon:l,...c.config!==void 0?{webuiRuntimeConfig:SB(c.config,f)}:{},...u!==void 0?{terminalSessionManager:u}:{},persistentSessionManager:d,...a!==void 0?{localWebui:{webuiDir:a.webuiDir,localMailbox:{s3:a.s3,commands:a.commands}}}:{},authDisabled:n.insecureNoAuth}),p=process.env.LMCTL_USAGE_QUOTA_USD,_=p!==void 0&&p!==""?Number(p):NaN,h=Number.isFinite(_)&&_>0?_:void 0,g=await ib({dal:r,app:m,io:e,mailbox:c.config===void 0?void 0:{...c.config,cursorStore:r,chatLogTailStore:r,promptTriggerStore:r,usageStore:r,...h!==void 0?{usageQuotaUsd:h}:{},...f!==void 0?{deviceId:f}:{}},...a!==void 0?{localMailbox:{rootDir:a.rootDir,s3:a.s3,commands:a.commands,promptTriggerStore:r}}:{},...u!==void 0?{terminalSessionManager:u}:{},persistentSessionManager:d});await sb({dal:r,mailbox:g.mailbox,io:e});let{serve:w}=await import("@hono/node-server"),y=await new Promise((k,b)=>{let M,U=P=>b(P);M=w({fetch:m.fetch,port:i.port,hostname:n.bind},()=>{M.removeListener?.("error",U),k(M)}),M.once("error",U)}).catch(async k=>(l!==void 0&&await l.stop().catch(()=>{}),await g.stop().catch(()=>{}),u!==void 0&&await u.stop().catch(()=>{}),await d.stop().catch(()=>{}),r.close(),e.stderr.write(`error: could not bind ${n.bind}:${i.port}: ${k instanceof Error?k.message:String(k)}
2299
- `),null));if(y===null)return 2;e.stdout.write(`listening on ${n.bind}:${i.port}
2298
+ `)}),f=cr()?.device_id,m=RS({dal:r,daemon:l,...c.config!==void 0?{webuiRuntimeConfig:SB(c.config,f)}:{},...u!==void 0?{terminalSessionManager:u}:{},persistentSessionManager:d,...a!==void 0?{localWebui:{webuiDir:a.webuiDir,localMailbox:{s3:a.s3,commands:a.commands}}}:{},authDisabled:n.insecureNoAuth}),p=process.env.LMCTL_USAGE_QUOTA_USD,_=p!==void 0&&p!==""?Number(p):NaN,h=Number.isFinite(_)&&_>0?_:void 0,g=await ib({dal:r,app:m,io:e,mailbox:c.config===void 0?void 0:{...c.config,cursorStore:r,chatLogTailStore:r,promptTriggerStore:r,usageStore:r,...h!==void 0?{usageQuotaUsd:h}:{},...f!==void 0?{deviceId:f}:{}},...a!==void 0?{localMailbox:{rootDir:a.rootDir,s3:a.s3,commands:a.commands,promptTriggerStore:r}}:{},...u!==void 0?{terminalSessionManager:u}:{},persistentSessionManager:d});await sb({dal:r,mailbox:g.mailbox,io:e});let{serve:y}=await import("@hono/node-server"),w=await new Promise((k,b)=>{let M,U=P=>b(P);M=y({fetch:m.fetch,port:i.port,hostname:n.bind},()=>{M.removeListener?.("error",U),k(M)}),M.once("error",U)}).catch(async k=>(l!==void 0&&await l.stop().catch(()=>{}),await g.stop().catch(()=>{}),u!==void 0&&await u.stop().catch(()=>{}),await d.stop().catch(()=>{}),r.close(),e.stderr.write(`error: could not bind ${n.bind}:${i.port}: ${k instanceof Error?k.message:String(k)}
2299
+ `),null));if(w===null)return 2;e.stdout.write(`listening on ${n.bind}:${i.port}
2300
2300
  `);let S=Z();try{let k=dl(S);k.running&&k.entry!==null&&k.entry.pid!==process.pid&&e.stderr.write(`note: replacing pidfile for a still-running daemon (pid ${k.entry.pid}, port ${k.entry.port}); \`lmctl serve stop\` will now target pid ${process.pid}
2301
2301
  `);let b=Kv({pid:process.pid,startedAt:new Date().toISOString(),port:i.port,bind:n.bind,dbPath:S,startToken:Vv()},S);e.stdout.write(`pidfile ${b} (pid ${process.pid})
2302
2302
  `)}catch(k){e.stderr.write(`warning: could not write serve pidfile: ${k instanceof Error?k.message:String(k)}; \`lmctl serve status\`/\`stop\` will not find this daemon
2303
- `)}return await new Promise(k=>{let b=()=>{(async()=>{l!==void 0&&await l.stop(),y.close(),await g.stop(),u!==void 0&&await u.stop(),await d.stop(),r.close();try{let M=om(S);M!==null&&M.pid===process.pid&&es(S)}catch{}k()})()};process.once("SIGTERM",b),process.once("SIGINT",b)}),0}function tb(t){if(t.stdout!==process.stdout||lm)return;lm=!0;let e=n=>{throw n.code==="EPIPE"&&process.exit(0),process.stdout.off("error",e),n};process.stdout.on("error",e)}function hB(){lm=!1}async function nb(t,e){return tb(e),gB(t,e)}async function gB(t,e){if(t.length>0)return e.stderr.write(`error: lmctl serve status takes no arguments; got: ${t.join(" ")}
2303
+ `)}return await new Promise(k=>{let b=()=>{(async()=>{l!==void 0&&await l.stop(),w.close(),await g.stop(),u!==void 0&&await u.stop(),await d.stop(),r.close();try{let M=om(S);M!==null&&M.pid===process.pid&&es(S)}catch{}k()})()};process.once("SIGTERM",b),process.once("SIGINT",b)}),0}function tb(t){if(t.stdout!==process.stdout||lm)return;lm=!0;let e=n=>{throw n.code==="EPIPE"&&process.exit(0),process.stdout.off("error",e),n};process.stdout.on("error",e)}function hB(){lm=!1}async function nb(t,e){return tb(e),gB(t,e)}async function gB(t,e){if(t.length>0)return e.stderr.write(`error: lmctl serve status takes no arguments; got: ${t.join(" ")}
2304
2304
  `),2;let n=Z(),r=dl(n);if(r.entry===null)return e.stdout.write(`serve: not running
2305
2305
  `),e.stdout.write(r.corrupt?` unreadable pidfile at ${Vt(n)} (could not parse)
2306
2306
  run \`lmctl serve stop\` to clear it
@@ -2417,7 +2417,7 @@ Consulted ${ms(Z())}
2417
2417
  To experiment with it manually: https://lmctl.com/lmctl/docs/manual-invocation`}function zb(t){return`unknown option --from
2418
2418
  ${vm(t)}`}function Zb(t,e){let n=fr(t,e);return n.ok?{ok:!0,identity:n.identity,source:"session"}:n}function fr(t,e){let n=t[Ns];if(n===void 0||n.length===0)return{ok:!1,reason:"unset"};let r=[];for(let i of e.listRootTeams()){let o;try{o=rt(i.teamfile_path,e)}catch{continue}for(let a of o.members)a.teamfile===void 0&&a.session===n&&r.push(`${i.teamfile_path}:${a.alias}`)}let s=[...new Set(r)];if(s.length===0)return{ok:!1,reason:"not-found"};if(s.length>1)throw new Error("LMCTL_SELF_SESSIONID matches multiple team members; the team registry is ambiguous");return{ok:!0,identity:s[0]}}var mi=E(()=>{"use strict";Et();Ue();Yt()});function Xe(t){let e=dr(t);if(e===null)throw new Error(`invalid agent identity: ${t}`);return{teamfile:e.teamfile,alias:e.alias,value:t}}var wl=E(()=>{"use strict";xt()});function LH(t,e,n){let r=`${e.teamfile}:${e.alias}`,s=null,i=()=>t.dal!==void 0?t.dal:(s===null&&(s=qe({path:Z()})),s),o=()=>{if(s===null)return;let a=s;s=null;try{a.close()}catch{}};return{hasOutstandingWork:()=>i().listAgentInflight().some(a=>a.sender_teamfile===e.teamfile&&a.sender_alias===e.alias&&!(a.receiver_teamfile===e.teamfile&&a.receiver_alias===e.alias)&&a.holder_pid!==null&&Ae(a.holder_pid)),pollMs:xH,settleMs:RH,maxHoldMs:gn(n),onHold:()=>D({event:"delivery_hold_open_started",receiver:r}),onRelease:a=>{o(),!(!a.held&&a.reason==="cleared")&&D({event:"delivery_hold_open_released",receiver:r,elapsed_ms:a.elapsedMs,held:a.held,reason:a.reason})}}}async function Qb(t){let e=OH(t.newMessage,{newMessageFrom:t.newMessageFrom??CH(t.sender)});if(e.length===0)throw new Error(`no message to deliver for ${t.sender.teamfile}:${t.sender.alias} -> ${t.receiver.teamfile}:${t.receiver.alias}`);let n=!1,r=ce(),s=0,i=0,o=0,a={provider:t.receiver.provider,sessionId:t.receiver.sessionId,cwd:t.receiver.cwd,prompt:e,permissionMode:t.permissionMode,env:t.env,onDelta:c=>{n=!0,r&&(s+=1,o=Buffer.byteLength(c,"utf8"),i+=o),t.onDelta?.(c)},onProgress:c=>t.onProgress?.(c)};t.receiver.model!==void 0&&(a.model=t.receiver.model),t.receiver.effort!==void 0&&(a.effort=t.receiver.effort),a.alias=t.receiver.alias,a.isLead=t.receiver.isLead,t.idleTimeoutMs!==void 0&&(a.timeoutMs=t.idleTimeoutMs),a.holdOpen=LH(t.io,t.receiver,t.env),await t.onPromptBuilt?.(e);let l=await rn(a);return r&&$e(JSON.stringify({event:"chat_return",alias:t.receiver.alias,provider:t.receiver.provider,streamed:n,blockCount:s,streamedBytes:i,resultTextBytes:Buffer.byteLength(l.text,"utf8"),lastChunkBytes:o,tailPreview:l.text.slice(-200)})),l.status==="stalled"?{status:"stalled",receipt:l.text,prompt:e,wroteDelta:n,durationMs:l.durationMs,stalledAfterMs:l.stalledAfterMs}:{status:"ok",receipt:l.text,prompt:e,wroteDelta:n,durationMs:l.durationMs}}function OH(t,e={}){return[`--- new message (from ${e.newMessageFrom??"operator"}) ---`,t].join(`
2419
2419
  `)}function CH(t){return`${t.teamfile}:${t.alias}`}var Ure,xH,RH,ek=E(()=>{"use strict";mt();de();dt();Ue();jt();ct();Ure=60*60*1e3,xH=2e3,RH=5e3});async function ik(t){let e=t.onEvent??(()=>{}),n=$H(t.io,e),r=null,s=null,i=null,o,a,l=null,c=!1,u=null,d=t.prompt;try{let f=await O(n,x=>He(t.teamfile,t.alias,x)),m=f.teamfile,p=await O(n,x=>XH(x,t.env??process.env)),_=p.sender,h=await JH(n,{explicitRoot:t.rootFlag,sender:_,receiverTeamfile:m,operatorOrigin:p.origin==="operator"}),g=_===null?null:await GH(n,{rootTeamfile:h,sender:_,receiverTeamfile:m,receiverAlias:f.alias});g!==null&&!g.allowed&&e({kind:"warning",message:`warning: out-of-policy chat send: ${g.reason}
2420
- `}),i=await PH(n,{receiverTeamfile:m,receiverAlias:f.alias,sender:_,rootTeamfile:h,provider:f.provider,model:f.model,sessionId:f.sessionid,cwd:f.sessiondir,prompt:t.prompt,origin:p.origin}),o=qH(n,i);try{ns(n,je(m),m)}catch{}r={root_teamfile:h,sender_teamfile:_?.teamfile??null,sender_alias:_?.alias??null,receiver_teamfile:m,receiver_alias:f.alias,receiver_provider:f.provider,receiver_session_id:f.sessionid,origin:p.origin,policy:g};let w=await ok(n,m,f.alias);if(w!==null){let x=Tm(w);return is(i,r,t.prompt,x,"unavailable"),u=bm(x,null),{status:"busy",message:x,teamChatLogId:null}}let y=await MH(n,m,f.alias);if(y.busy){let x=await DH(n,m,f.alias);return x+=await jH(n,m,f.alias),is(i,r,t.prompt,x,"unavailable"),u=bm(x,null),{status:"busy",message:x,teamChatLogId:null}}if(_!==null&&_.teamfile!==m){let x=await O(n,R=>jb(R,{root:h,sender:_,receiverTeamfile:m,receiverAlias:f.alias,now:new Date}));if(x.stop){let R=Fb(x.chain);return is(i,r,t.prompt,R,"cycle"),u=El(R,null),{status:"error",errorKind:"cycle",message:R,teamChatLogId:null,messageId:null}}}let S=await YH(n,{receiver_teamfile:m,receiver_alias:f.alias,sender_teamfile:_?.teamfile??m,sender_alias:_?.alias??"operator",...y.idleReclaim?{force:!0,reclaimReason:"session-idle"}:{}});if(!S.acquired){let x=ak(m,f.alias,S.current);return x+=` ${wm(ym({holderPid:S.current.holder_pid,since:S.current.started_at}))}`,is(i,r,t.prompt,x,"unavailable"),u=bm(x,null),{status:"busy",message:x,teamChatLogId:null}}s={row:S.lease,leaseId:S.leaseId},a=Xi(x=>O(n,R=>R.heartbeatAgentInflight(s.row,s.leaseId,x)),{intervalMs:sk,onError:x=>{ce()&&$e(JSON.stringify({event:"agent_inflight_heartbeat_error",receiver:{teamfile:s.row.receiver_teamfile,alias:s.row.receiver_alias},error:x instanceof Error?x.message:String(x)}))}});let k=await Qb({sender:_??{teamfile:m,alias:"operator"},receiver:{teamfile:m,alias:f.alias,provider:f.provider,sessionId:f.sessionid,cwd:f.sessiondir,...f.model!==void 0?{model:f.model}:{},...f.effort!==void 0?{effort:f.effort}:{},...f.isLead!==void 0?{isLead:f.isLead}:{}},newMessage:t.prompt,newMessageFrom:_===null?"operator":`${_.teamfile}:${_.alias}`,io:n,permissionMode:t.permissionMode,env:t.env??process.env,...t.idleTimeoutMs!==void 0?{idleTimeoutMs:t.idleTimeoutMs}:{},onDelta:x=>e({kind:"delta",chunk:x}),onProgress:x=>e({kind:"progress",alias:f.alias,event:x}),onPromptBuilt:async x=>{d=x,l===null&&(l=await ZH(n,{...r,message:x}),l!==null&&(t.onAccepted?.(en(l)),i!==null&&await WH(n,i,l))),i!==null&&await UH(n,i,x)}});d=k.prompt;let b=k.status==="stalled",M=null,U=b?`provider stalled${k.stalledAfterMs!==void 0?` after ${k.stalledAfterMs}ms`:""}`:k.status==="error"?k.error??k.receipt:r.policy?.outOfPolicy===!0?r.policy.reason:null,P=b||k.status==="error"?"error":r.policy?.outOfPolicy===!0?"out_of_policy":"ok";if(l!==null?(await rk(n,l,{...r,message:d,response:k.receipt,status:P,error_detail:U}),c=!0,M=l):M=await e2(n,{...r,message:d,response:k.receipt,status:P,error_detail:U}),b){let x=U;is(i,r,d,x,"error"),u=El(x,M,k.receipt)}else u=BH(k.receipt,M);return{status:b?"stalled":"ok",replyText:k.receipt,wroteDelta:k.wroteDelta,teamChatLogId:M,messageId:M===null?null:en(M),durationMs:k.durationMs}}catch(f){let m=f instanceof Error?f.message:String(f);return l!==null&&!c&&r!==null&&(await rk(n,l,{...r,message:d,response:null,status:"error",error_detail:m}),c=!0),is(i,r,d,m,"error"),u=El(m,l),{status:"error",errorKind:f instanceof ke?"target":"provider",message:m,teamChatLogId:l,messageId:l===null?null:en(l)}}finally{o!==void 0&&clearInterval(o),a!==void 0&&clearInterval(a),l!==null&&await QH(n,r,en(l)),s!==null&&await zH(n,s.row,s.leaseId),i!==null&&await FH(n,i,u??El("chat turn exited without a terminal outcome",null))}}function $H(t,e){return{...t,stdout:{write:()=>{}},stderr:{write:n=>{e({kind:"warning",message:n})}}}}async function MH(t,e,n){let r=await O(t,i=>(XS(i,e,n),Tr(i,e,n)));if(!r.busy)return{busy:!1,idleReclaim:!1};let s=await O(t,i=>Hb(i,r,e,n));return{busy:!s,idleReclaim:s}}async function DH(t,e,n){let r=await ok(t,e,n);if(r!==null)return Tm(r);let s=await O(t,i=>i.getAgentInflight(e,n));return s!==null?ak(e,n,s):`${n} is busy; wait and retry`}async function jH(t,e,n){let r=await O(t,s=>s.getAgentInflight(e,n));return r===null?"":` ${wm(ym({holderPid:r.holder_pid,since:r.started_at}))}`}async function PH(t,e){try{return(await O(t,r=>r.startTrackedInvocation({kind:"chat",origin:e.origin,scope_teamfile:e.receiverTeamfile,from_identity:e.sender===null?"operator":`${e.sender.teamfile}:${e.sender.alias}`,target_teamfile:e.receiverTeamfile,target_alias:e.receiverAlias,root_teamfile:e.rootTeamfile,cwd:e.cwd??null,command:HH(e.receiverTeamfile,e.receiverAlias,e.prompt),holder_pid:process.pid,request_payload:e.prompt,meta:JSON.stringify({provider:e.provider,model:e.model??null,sessionid:e.sessionId??null})}))).id}catch(n){return ce()&&$e(JSON.stringify({event:"tracked_invocation_start_error",error:n instanceof Error?n.message:String(n)})),null}}async function FH(t,e,n){try{await O(t,r=>{r.finishTrackedInvocation(e,n)})}catch(r){ce()&&$e(JSON.stringify({event:"tracked_invocation_finish_error",id:e,error:r instanceof Error?r.message:String(r)}))}}async function UH(t,e,n){try{await O(t,r=>{r.updateTrackedInvocationRequestPayload(e,n)})}catch(r){ce()&&$e(JSON.stringify({event:"tracked_invocation_request_payload_error",id:e,error:r instanceof Error?r.message:String(r)}))}}async function WH(t,e,n){try{await O(t,r=>{r.linkTrackedInvocationMessage(e,n)})}catch(r){ce()&&$e(JSON.stringify({event:"tracked_invocation_message_link_error",id:e,team_chat_log_id:n,error:r instanceof Error?r.message:String(r)}))}}function qH(t,e){if(e===null)return;let n=setInterval(()=>{O(t,r=>r.heartbeatTrackedInvocation(e)).catch(r=>{ce()&&$e(JSON.stringify({event:"tracked_invocation_heartbeat_error",id:e,error:r instanceof Error?r.message:String(r)}))})},sk);return n.unref?.(),n}function BH(t,e){return{status:"done",result_summary:pi(t),error:null,team_chat_log_id:e}}function bm(t,e){return{status:"busy",result_summary:pi(t),error:t,team_chat_log_id:e}}function El(t,e,n){return{status:"error",result_summary:pi(n===void 0?t:n),error:t,team_chat_log_id:e}}function pi(t){let e=t.replace(/\s+/gu," ").trim();return e.length<=500?e:`${e.slice(0,497)}...`}function HH(t,e,n){return`lmctl chat ${JSON.stringify(t)} ${e} ${JSON.stringify(n)}`}function XH(t,e){let n=Zb(e,t);if(n.ok)return{sender:Xe(n.identity),origin:"agent"};if(n.reason==="unset")return{sender:null,origin:"operator"};throw new Error(un("chat"))}async function JH(t,e){if(e.explicitRoot!==void 0)return await O(t,r=>Te(e.explicitRoot,r));if(e.operatorOrigin||e.sender===null)return e.receiverTeamfile;let n=e.sender;return await O(t,r=>Pb(r,{sender:n,now:new Date})??e.receiverTeamfile)}async function GH(t,e){return await O(t,n=>Cb({rootTeamfile:e.rootTeamfile,fromTeamfile:e.sender.teamfile,fromAlias:e.sender.alias,toTeamfile:e.receiverTeamfile,toAlias:e.receiverAlias,registry:KH(n,e.sender.teamfile,e.receiverTeamfile)}))}function KH(t,e,n){return{teams:[e,n].map(s=>VH(s,t))}}function VH(t,e){let n=rt(t,e),r=ht(n);return{teamfile:t,aliases:n.members.map(s=>s.alias),leadAlias:r?.alias??null}}async function YH(t,e){return await O(t,n=>{let r=ce(),s=Er(n,{receiver_teamfile:e.receiver_teamfile,receiver_alias:e.receiver_alias,sender_teamfile:e.sender_teamfile,sender_alias:e.sender_alias,ttlMs:ss(),...e.force===!0?{force:!0}:{},...e.reclaimReason===void 0?{}:{reclaimReason:e.reclaimReason}});return s.acquired?(r&&$e(JSON.stringify({event:"inflight_acquire",receiver:{teamfile:e.receiver_teamfile,alias:e.receiver_alias},sender:{teamfile:e.sender_teamfile,alias:e.sender_alias},result:s.reclaimReason===null?"acquired":"reclaimed",...s.reclaimReason===null?{}:{reclaim_reason:s.reclaimReason,holder:nk(s.previous)}})),{acquired:!0,lease:s.lease,leaseId:s.leaseId}):(r&&$e(JSON.stringify({event:"inflight_acquire",receiver:{teamfile:e.receiver_teamfile,alias:e.receiver_alias},sender:{teamfile:e.sender_teamfile,alias:e.sender_alias},result:"rejected",holder:nk(s.current)})),{acquired:!1,current:s.current})})}async function ok(t,e,n){return await O(t,r=>{for(let i=0;i<2;i+=1){let o=r.getTerminalLock(e,n);if(o===null)return null;if(Em(o).live)return o;let l=r.getAgentInflight(e,n);if(r.clearTerminalLock(e,n,o.lock_id))return l!==null&&l.sender_teamfile===e&&l.sender_alias==="terminal"&&r.clearObservedTerminalAgentInflight(e,n,{sender_teamfile:l.sender_teamfile,sender_alias:l.sender_alias,started_at:l.started_at,holder_pid:l.holder_pid}),null}let s=r.getTerminalLock(e,n);return s===null?null:Em(s).live?s:null})}function nk(t){return t===null?null:{sender_teamfile:t.sender_teamfile,sender_alias:t.sender_alias,holder_pid:t.holder_pid,started_at:t.started_at}}async function zH(t,e,n){try{await O(t,r=>{r.releaseAgentInflight(e,n)})}catch(r){t.stderr.write(`warning: failed to release chat in-flight slot: ${r instanceof Error?r.message:String(r)}
2420
+ `}),i=await PH(n,{receiverTeamfile:m,receiverAlias:f.alias,sender:_,rootTeamfile:h,provider:f.provider,model:f.model,sessionId:f.sessionid,cwd:f.sessiondir,prompt:t.prompt,origin:p.origin}),o=qH(n,i);try{ns(n,je(m),m)}catch{}r={root_teamfile:h,sender_teamfile:_?.teamfile??null,sender_alias:_?.alias??null,receiver_teamfile:m,receiver_alias:f.alias,receiver_provider:f.provider,receiver_session_id:f.sessionid,origin:p.origin,policy:g};let y=await ok(n,m,f.alias);if(y!==null){let x=Tm(y);return is(i,r,t.prompt,x,"unavailable"),u=bm(x,null),{status:"busy",message:x,teamChatLogId:null}}let w=await MH(n,m,f.alias);if(w.busy){let x=await DH(n,m,f.alias);return x+=await jH(n,m,f.alias),is(i,r,t.prompt,x,"unavailable"),u=bm(x,null),{status:"busy",message:x,teamChatLogId:null}}if(_!==null&&_.teamfile!==m){let x=await O(n,R=>jb(R,{root:h,sender:_,receiverTeamfile:m,receiverAlias:f.alias,now:new Date}));if(x.stop){let R=Fb(x.chain);return is(i,r,t.prompt,R,"cycle"),u=El(R,null),{status:"error",errorKind:"cycle",message:R,teamChatLogId:null,messageId:null}}}let S=await YH(n,{receiver_teamfile:m,receiver_alias:f.alias,sender_teamfile:_?.teamfile??m,sender_alias:_?.alias??"operator",...w.idleReclaim?{force:!0,reclaimReason:"session-idle"}:{}});if(!S.acquired){let x=ak(m,f.alias,S.current);return x+=` ${wm(ym({holderPid:S.current.holder_pid,since:S.current.started_at}))}`,is(i,r,t.prompt,x,"unavailable"),u=bm(x,null),{status:"busy",message:x,teamChatLogId:null}}s={row:S.lease,leaseId:S.leaseId},a=Xi(x=>O(n,R=>R.heartbeatAgentInflight(s.row,s.leaseId,x)),{intervalMs:sk,onError:x=>{ce()&&$e(JSON.stringify({event:"agent_inflight_heartbeat_error",receiver:{teamfile:s.row.receiver_teamfile,alias:s.row.receiver_alias},error:x instanceof Error?x.message:String(x)}))}});let k=await Qb({sender:_??{teamfile:m,alias:"operator"},receiver:{teamfile:m,alias:f.alias,provider:f.provider,sessionId:f.sessionid,cwd:f.sessiondir,...f.model!==void 0?{model:f.model}:{},...f.effort!==void 0?{effort:f.effort}:{},...f.isLead!==void 0?{isLead:f.isLead}:{}},newMessage:t.prompt,newMessageFrom:_===null?"operator":`${_.teamfile}:${_.alias}`,io:n,permissionMode:t.permissionMode,env:t.env??process.env,...t.idleTimeoutMs!==void 0?{idleTimeoutMs:t.idleTimeoutMs}:{},onDelta:x=>e({kind:"delta",chunk:x}),onProgress:x=>e({kind:"progress",alias:f.alias,event:x}),onPromptBuilt:async x=>{d=x,l===null&&(l=await ZH(n,{...r,message:x}),l!==null&&(t.onAccepted?.(en(l)),i!==null&&await WH(n,i,l))),i!==null&&await UH(n,i,x)}});d=k.prompt;let b=k.status==="stalled",M=null,U=b?`provider stalled${k.stalledAfterMs!==void 0?` after ${k.stalledAfterMs}ms`:""}`:k.status==="error"?k.error??k.receipt:r.policy?.outOfPolicy===!0?r.policy.reason:null,P=b||k.status==="error"?"error":r.policy?.outOfPolicy===!0?"out_of_policy":"ok";if(l!==null?(await rk(n,l,{...r,message:d,response:k.receipt,status:P,error_detail:U}),c=!0,M=l):M=await e2(n,{...r,message:d,response:k.receipt,status:P,error_detail:U}),b){let x=U;is(i,r,d,x,"error"),u=El(x,M,k.receipt)}else u=BH(k.receipt,M);return{status:b?"stalled":"ok",replyText:k.receipt,wroteDelta:k.wroteDelta,teamChatLogId:M,messageId:M===null?null:en(M),durationMs:k.durationMs}}catch(f){let m=f instanceof Error?f.message:String(f);return l!==null&&!c&&r!==null&&(await rk(n,l,{...r,message:d,response:null,status:"error",error_detail:m}),c=!0),is(i,r,d,m,"error"),u=El(m,l),{status:"error",errorKind:f instanceof ke?"target":"provider",message:m,teamChatLogId:l,messageId:l===null?null:en(l)}}finally{o!==void 0&&clearInterval(o),a!==void 0&&clearInterval(a),l!==null&&await QH(n,r,en(l)),s!==null&&await zH(n,s.row,s.leaseId),i!==null&&await FH(n,i,u??El("chat turn exited without a terminal outcome",null))}}function $H(t,e){return{...t,stdout:{write:()=>{}},stderr:{write:n=>{e({kind:"warning",message:n})}}}}async function MH(t,e,n){let r=await O(t,i=>(XS(i,e,n),Tr(i,e,n)));if(!r.busy)return{busy:!1,idleReclaim:!1};let s=await O(t,i=>Hb(i,r,e,n));return{busy:!s,idleReclaim:s}}async function DH(t,e,n){let r=await ok(t,e,n);if(r!==null)return Tm(r);let s=await O(t,i=>i.getAgentInflight(e,n));return s!==null?ak(e,n,s):`${n} is busy; wait and retry`}async function jH(t,e,n){let r=await O(t,s=>s.getAgentInflight(e,n));return r===null?"":` ${wm(ym({holderPid:r.holder_pid,since:r.started_at}))}`}async function PH(t,e){try{return(await O(t,r=>r.startTrackedInvocation({kind:"chat",origin:e.origin,scope_teamfile:e.receiverTeamfile,from_identity:e.sender===null?"operator":`${e.sender.teamfile}:${e.sender.alias}`,target_teamfile:e.receiverTeamfile,target_alias:e.receiverAlias,root_teamfile:e.rootTeamfile,cwd:e.cwd??null,command:HH(e.receiverTeamfile,e.receiverAlias,e.prompt),holder_pid:process.pid,request_payload:e.prompt,meta:JSON.stringify({provider:e.provider,model:e.model??null,sessionid:e.sessionId??null})}))).id}catch(n){return ce()&&$e(JSON.stringify({event:"tracked_invocation_start_error",error:n instanceof Error?n.message:String(n)})),null}}async function FH(t,e,n){try{await O(t,r=>{r.finishTrackedInvocation(e,n)})}catch(r){ce()&&$e(JSON.stringify({event:"tracked_invocation_finish_error",id:e,error:r instanceof Error?r.message:String(r)}))}}async function UH(t,e,n){try{await O(t,r=>{r.updateTrackedInvocationRequestPayload(e,n)})}catch(r){ce()&&$e(JSON.stringify({event:"tracked_invocation_request_payload_error",id:e,error:r instanceof Error?r.message:String(r)}))}}async function WH(t,e,n){try{await O(t,r=>{r.linkTrackedInvocationMessage(e,n)})}catch(r){ce()&&$e(JSON.stringify({event:"tracked_invocation_message_link_error",id:e,team_chat_log_id:n,error:r instanceof Error?r.message:String(r)}))}}function qH(t,e){if(e===null)return;let n=setInterval(()=>{O(t,r=>r.heartbeatTrackedInvocation(e)).catch(r=>{ce()&&$e(JSON.stringify({event:"tracked_invocation_heartbeat_error",id:e,error:r instanceof Error?r.message:String(r)}))})},sk);return n.unref?.(),n}function BH(t,e){return{status:"done",result_summary:pi(t),error:null,team_chat_log_id:e}}function bm(t,e){return{status:"busy",result_summary:pi(t),error:t,team_chat_log_id:e}}function El(t,e,n){return{status:"error",result_summary:pi(n===void 0?t:n),error:t,team_chat_log_id:e}}function pi(t){let e=t.replace(/\s+/gu," ").trim();return e.length<=500?e:`${e.slice(0,497)}...`}function HH(t,e,n){return`lmctl chat ${JSON.stringify(t)} ${e} ${JSON.stringify(n)}`}function XH(t,e){let n=Zb(e,t);if(n.ok)return{sender:Xe(n.identity),origin:"agent"};if(n.reason==="unset")return{sender:null,origin:"operator"};throw new Error(un("chat"))}async function JH(t,e){if(e.explicitRoot!==void 0)return await O(t,r=>Te(e.explicitRoot,r));if(e.operatorOrigin||e.sender===null)return e.receiverTeamfile;let n=e.sender;return await O(t,r=>Pb(r,{sender:n,now:new Date})??e.receiverTeamfile)}async function GH(t,e){return await O(t,n=>Cb({rootTeamfile:e.rootTeamfile,fromTeamfile:e.sender.teamfile,fromAlias:e.sender.alias,toTeamfile:e.receiverTeamfile,toAlias:e.receiverAlias,registry:KH(n,e.sender.teamfile,e.receiverTeamfile)}))}function KH(t,e,n){return{teams:[e,n].map(s=>VH(s,t))}}function VH(t,e){let n=rt(t,e),r=ht(n);return{teamfile:t,aliases:n.members.map(s=>s.alias),leadAlias:r?.alias??null}}async function YH(t,e){return await O(t,n=>{let r=ce(),s=Er(n,{receiver_teamfile:e.receiver_teamfile,receiver_alias:e.receiver_alias,sender_teamfile:e.sender_teamfile,sender_alias:e.sender_alias,ttlMs:ss(),...e.force===!0?{force:!0}:{},...e.reclaimReason===void 0?{}:{reclaimReason:e.reclaimReason}});return s.acquired?(r&&$e(JSON.stringify({event:"inflight_acquire",receiver:{teamfile:e.receiver_teamfile,alias:e.receiver_alias},sender:{teamfile:e.sender_teamfile,alias:e.sender_alias},result:s.reclaimReason===null?"acquired":"reclaimed",...s.reclaimReason===null?{}:{reclaim_reason:s.reclaimReason,holder:nk(s.previous)}})),{acquired:!0,lease:s.lease,leaseId:s.leaseId}):(r&&$e(JSON.stringify({event:"inflight_acquire",receiver:{teamfile:e.receiver_teamfile,alias:e.receiver_alias},sender:{teamfile:e.sender_teamfile,alias:e.sender_alias},result:"rejected",holder:nk(s.current)})),{acquired:!1,current:s.current})})}async function ok(t,e,n){return await O(t,r=>{for(let i=0;i<2;i+=1){let o=r.getTerminalLock(e,n);if(o===null)return null;if(Em(o).live)return o;let l=r.getAgentInflight(e,n);if(r.clearTerminalLock(e,n,o.lock_id))return l!==null&&l.sender_teamfile===e&&l.sender_alias==="terminal"&&r.clearObservedTerminalAgentInflight(e,n,{sender_teamfile:l.sender_teamfile,sender_alias:l.sender_alias,started_at:l.started_at,holder_pid:l.holder_pid}),null}let s=r.getTerminalLock(e,n);return s===null?null:Em(s).live?s:null})}function nk(t){return t===null?null:{sender_teamfile:t.sender_teamfile,sender_alias:t.sender_alias,holder_pid:t.holder_pid,started_at:t.started_at}}async function zH(t,e,n){try{await O(t,r=>{r.releaseAgentInflight(e,n)})}catch(r){t.stderr.write(`warning: failed to release chat in-flight slot: ${r instanceof Error?r.message:String(r)}
2421
2421
  `)}}function ak(t,e,n){return`${e} is servicing ${n.sender_alias} (${n.sender_teamfile}) since ${n.started_at} \u2014 wait and retry, or inspect without waking it: lmctl tail "${t}" ${e}`}async function ZH(t,e){let n=_i(e.message);try{return await O(t,r=>r.beginTeamChatLog({root_teamfile:e.root_teamfile,sender_teamfile:e.sender_teamfile,sender_alias:e.sender_alias,receiver_teamfile:e.receiver_teamfile,receiver_alias:e.receiver_alias,receiver_provider:e.receiver_provider,receiver_session_id:e.receiver_session_id,provider_prompt:e.message,message:n.text,response:null,origin:e.origin,status:"running",error_detail:null,truncated:n.truncated?1:0,created_at:new Date().toISOString()}))}catch(r){return t.stderr.write(`warning: failed to begin chat log: ${r instanceof Error?r.message:String(r)}
2422
2422
  `),null}}async function rk(t,e,n){let r=_i(n.message),s=n.response===null?null:_i(n.response);try{await O(t,i=>i.finishTeamChatLog(e,{root_teamfile:n.root_teamfile,sender_teamfile:n.sender_teamfile,sender_alias:n.sender_alias,receiver_teamfile:n.receiver_teamfile,receiver_alias:n.receiver_alias,receiver_provider:n.receiver_provider,receiver_session_id:n.receiver_session_id,provider_prompt:n.message,message:r.text,response:s?.text??null,origin:n.origin,status:n.status,error_detail:n.error_detail,truncated:r.truncated||s?.truncated?1:0,created_at:new Date().toISOString()}))}catch(i){t.stderr.write(`warning: failed to finish chat log ${e}: ${i instanceof Error?i.message:String(i)}
2423
2423
  `)}}async function QH(t,e,n){if(e!==null)try{await O(t,r=>{r.clearCurrentlyHandlingMessage(e.receiver_teamfile,e.receiver_alias,n)})}catch(r){t.stderr.write(`warning: failed to clear chat causal pointer: ${r instanceof Error?r.message:String(r)}
@@ -2425,8 +2425,7 @@ ${vm(t)}`}function Zb(t,e){let n=fr(t,e);return n.ok?{ok:!0,identity:n.identity,
2425
2425
  `),null}}function is(t,e,n,r,s){t!==null||e===null||D({event:"chat_attempt_error",reason:s,root_teamfile:e.root_teamfile,sender_teamfile:e.sender_teamfile,sender_alias:e.sender_alias,receiver_teamfile:e.receiver_teamfile,receiver_alias:e.receiver_alias,origin:e.origin,error_detail:r,message_preview:pi(n)})}function _i(t){return t.length<=tk?{text:t,truncated:!1}:{text:t.slice(0,tk),truncated:!0}}var tk,sk,lk=E(()=>{"use strict";xt();Kt();fi();$b();Yt();pm();de();Re();ct();Za();Xb();Jb();Sm();mi();wl();ek();vs();tk=256*1024,sk=3e4});var pk={};ae(pk,{parseIdleTimeoutMs:()=>fk,resolvePromptInput:()=>uk,runChat:()=>r2});import{readFileSync as t2}from"node:fs";async function r2(t,e={stdout:process.stdout,stderr:process.stderr}){let n=e.env??process.env;if(t.length===0||t[0]==="--help"||t[0]==="-h")return e.stdout.write(`${ck}
2426
2426
  `),t.length===0?2:0;let r=s2(t);if(typeof r=="string")return e.stderr.write(`error: ${r}
2427
2427
  ${ck}
2428
- `),2;for(let d of r.warnings??[])e.stderr.write(`warning: ${d}
2429
- `);if(r.promptFile!==void 0){let d=await uk(r.promptFile,e);if(typeof d!="string")return e.stderr.write(`error: ${d.error}
2428
+ `),2;if(r.promptFile!==void 0){let d=await uk(r.promptFile,e);if(typeof d!="string")return e.stderr.write(`error: ${d.error}
2430
2429
  `),2;r.prompt=d}if(r.runFlag!==void 0){let d=Number.parseInt(r.runFlag,10);return!Number.isFinite(d)||d<=0||String(d)!==r.runFlag?(e.stderr.write(`error: invalid --run "${r.runFlag}" (expected a positive integer run id)
2431
2430
  `),2):await O(e,async f=>{let m=f.getRun(d);if(m===null)return e.stderr.write(`error: run ${d}: not found
2432
2431
  `),1;if(m.terminal_state!==null&&m.terminal_state.length>0)return I(e,`run ${d}: already terminal (${m.terminal_state}); chat --run cannot resume a terminated run`);let p=Ha(f,d);if(p===null)return e.stderr.write(`error: run ${d}: no pending operator-answerable attention (chat --run only resumes paused runs)
@@ -2458,9 +2457,9 @@ ${ck}
2458
2457
  `):e.stdout.write(`${f.text}${f.text.endsWith(`
2459
2458
  `)?"":`
2460
2459
  `}`),f.status==="stalled"?1:0}catch(d){let f=d instanceof Error?d.message:String(d);return e.stderr.write(`error: ${f}
2461
- `),1}}function dk(t){return`${t}'s turn has finished and exited; resubmit \`lmctl chat\` to continue (no persistent session is left running)`}function s2(t){let e=[],n="yolo",r,s,i,o,a,l,c=!1,u=!1,d=!1,f=[];for(let g=0;g<t.length;g+=1){let w=t[g];if(w==="--permission-mode"){let y=t[++g];if(y===void 0||y.startsWith("--"))return"missing value for --permission-mode";if(y!=="plan"&&y!=="yolo")return`--permission-mode must be one of plan|yolo (got "${y}")`;n=y;continue}if(w==="--idle-timeout"){let y=t[++g];if(y===void 0||y.startsWith("--"))return"missing value for --idle-timeout";let S=fk(y);if(typeof S=="string")return S;/^\d+$/.test(y)&&S>0&&S<1e3&&f.push(`--idle-timeout ${y} means ${y}ms, not ${y}s \u2014 probably not what you meant (no real provider call can progress that fast). Use an explicit unit, e.g. --idle-timeout ${y}s.`),r=S;continue}if(w==="--session"){let y=t[++g];if(y===void 0||y.startsWith("--"))return"missing value for --session";s=y;continue}if(w==="--provider"){let y=t[++g];if(y===void 0||y.startsWith("--"))return"missing value for --provider";i=y;continue}if(w==="--from"||w.startsWith("--from="))return zb("chat");if(w.startsWith("I_am="))return`unknown argument: ${w}`;if(w==="--root"){let y=t[++g];if(y===void 0||y.startsWith("--"))return"missing value for --root";o=y;continue}if(w==="--prompt-file"){let y=t[++g];if(y===void 0||y!=="-"&&y.startsWith("--"))return"missing value for --prompt-file";a=y;continue}if(w==="--force"||w.startsWith("--force="))return"unknown option --force (a dead holder auto-reclaims; for a live holder use lmctl chat)";if(w==="--json"){u=!0;continue}if(w==="--verbose"){d=!0;continue}if(w==="--run"){let y=t[++g];if(y===void 0||y.startsWith("--"))return"missing value for --run";l=y;continue}if(w==="--done"){c=!0;continue}if(w.startsWith("--"))return`unknown flag: ${w}`;e.push(w)}if(l!==void 0){if(s!==void 0)return"--run is mutually exclusive with --session";if(i!==void 0)return"--run is mutually exclusive with --provider";if(o!==void 0)return"--run is mutually exclusive with --root";if(a!==void 0&&e.length>0)return"--prompt-file is mutually exclusive with a positional answer; pass one or the other";if(a===void 0&&e.length===0)return"a prompt (answer) is required with --run";if(e.length>1)return`--run takes exactly one positional (the answer); got ${e.length}`;let g={prompt:a!==void 0?"":e[0],permissionMode:n,runFlag:l,done:c,json:u,verbose:d};return a!==void 0&&(g.promptFile=a),g}let m,p,_;if(a!==void 0){if(e.length===0){if(s===void 0)return"expected <teamfile>:<alias> --prompt-file <path> | <teamfile> <alias> --prompt-file <path> | --session <id> --prompt-file <path>"}else if(e.length===1)m=e[0];else if(e.length===2)m=e[0],p=e[1];else return"--prompt-file is mutually exclusive with a positional prompt; pass one or the other";_=""}else{if(e.length===0)return"a prompt is required";if(e.length===1){if(s===void 0)return'expected <teamfile>:<alias> "<prompt>" | <teamfile> <alias> "<prompt>" | <sessionid> "<prompt>" | --session <id> "<prompt>"';_=e[0]}else if(e.length===2)m=e[0],_=e[1];else if(e.length===3)m=e[0],p=e[1],_=e[2];else return`too many positionals (${e.length}); expected at most <teamfile> <alias> <prompt>`}if(c)return"--done requires --run";let h={prompt:_,permissionMode:n};return m!==void 0&&(h.target=m),p!==void 0&&(h.alias=p),r!==void 0&&(h.idleTimeoutMs=r),s!==void 0&&(h.sessionFlag=s),i!==void 0&&(h.providerFlag=i),o!==void 0&&(h.rootFlag=o),a!==void 0&&(h.promptFile=a),u&&(h.json=u),d&&(h.verbose=d),f.length>0&&(h.warnings=f),h}async function uk(t,e,n=process.stdin){let r;try{r=t==="-"?await i2(n):t2(t,"utf8")}catch(i){let o=i instanceof Error?i.message:String(i);return{error:`--prompt-file ${t}: ${o}`}}let s=r.endsWith(`\r
2460
+ `),1}}function dk(t){return`${t}'s turn has finished and exited; resubmit \`lmctl chat\` to continue (no persistent session is left running)`}function s2(t){let e=[],n="yolo",r,s,i,o,a,l,c=!1,u=!1,d=!1;for(let h=0;h<t.length;h+=1){let g=t[h];if(g==="--permission-mode"){let y=t[++h];if(y===void 0||y.startsWith("--"))return"missing value for --permission-mode";if(y!=="plan"&&y!=="yolo")return`--permission-mode must be one of plan|yolo (got "${y}")`;n=y;continue}if(g==="--idle-timeout"){let y=t[++h];if(y===void 0||y.startsWith("--"))return"missing value for --idle-timeout";let w=fk(y);if(typeof w=="string")return w;r=w;continue}if(g==="--session"){let y=t[++h];if(y===void 0||y.startsWith("--"))return"missing value for --session";s=y;continue}if(g==="--provider"){let y=t[++h];if(y===void 0||y.startsWith("--"))return"missing value for --provider";i=y;continue}if(g==="--from"||g.startsWith("--from="))return zb("chat");if(g.startsWith("I_am="))return`unknown argument: ${g}`;if(g==="--root"){let y=t[++h];if(y===void 0||y.startsWith("--"))return"missing value for --root";o=y;continue}if(g==="--prompt-file"){let y=t[++h];if(y===void 0||y!=="-"&&y.startsWith("--"))return"missing value for --prompt-file";a=y;continue}if(g==="--force"||g.startsWith("--force="))return"unknown option --force (a dead holder auto-reclaims; for a live holder use lmctl chat)";if(g==="--json"){u=!0;continue}if(g==="--verbose"){d=!0;continue}if(g==="--run"){let y=t[++h];if(y===void 0||y.startsWith("--"))return"missing value for --run";l=y;continue}if(g==="--done"){c=!0;continue}if(g.startsWith("--"))return`unknown flag: ${g}`;e.push(g)}if(l!==void 0){if(s!==void 0)return"--run is mutually exclusive with --session";if(i!==void 0)return"--run is mutually exclusive with --provider";if(o!==void 0)return"--run is mutually exclusive with --root";if(a!==void 0&&e.length>0)return"--prompt-file is mutually exclusive with a positional answer; pass one or the other";if(a===void 0&&e.length===0)return"a prompt (answer) is required with --run";if(e.length>1)return`--run takes exactly one positional (the answer); got ${e.length}`;let h={prompt:a!==void 0?"":e[0],permissionMode:n,runFlag:l,done:c,json:u,verbose:d};return a!==void 0&&(h.promptFile=a),h}let f,m,p;if(a!==void 0){if(e.length===0){if(s===void 0)return"expected <teamfile>:<alias> --prompt-file <path> | <teamfile> <alias> --prompt-file <path> | --session <id> --prompt-file <path>"}else if(e.length===1)f=e[0];else if(e.length===2)f=e[0],m=e[1];else return"--prompt-file is mutually exclusive with a positional prompt; pass one or the other";p=""}else{if(e.length===0)return"a prompt is required";if(e.length===1){if(s===void 0)return'expected <teamfile>:<alias> "<prompt>" | <teamfile> <alias> "<prompt>" | <sessionid> "<prompt>" | --session <id> "<prompt>"';p=e[0]}else if(e.length===2)f=e[0],p=e[1];else if(e.length===3)f=e[0],m=e[1],p=e[2];else return`too many positionals (${e.length}); expected at most <teamfile> <alias> <prompt>`}if(c)return"--done requires --run";let _={prompt:p,permissionMode:n};return f!==void 0&&(_.target=f),m!==void 0&&(_.alias=m),r!==void 0&&(_.idleTimeoutMs=r),s!==void 0&&(_.sessionFlag=s),i!==void 0&&(_.providerFlag=i),o!==void 0&&(_.rootFlag=o),a!==void 0&&(_.promptFile=a),u&&(_.json=u),d&&(_.verbose=d),_}async function uk(t,e,n=process.stdin){let r;try{r=t==="-"?await i2(n):t2(t,"utf8")}catch(i){let o=i instanceof Error?i.message:String(i);return{error:`--prompt-file ${t}: ${o}`}}let s=r.endsWith(`\r
2462
2461
  `)?r.slice(0,-2):r.endsWith(`
2463
- `)?r.slice(0,-1):r;return s.length===0?{error:`--prompt-file ${t}: file is empty; a prompt is required`}:s}async function i2(t){let e=[];for await(let n of t)e.push(typeof n=="string"?Buffer.from(n,"utf8"):n);return Buffer.concat(e).toString("utf8")}function fk(t){if(t==="0")return 0;if(/^\d+$/.test(t))return Number(t);let e=/^(\d+)([smhd])$/.exec(t);if(e===null)return`invalid --idle-timeout "${t}" (expected <n>(s|m|h|d), integer ms, or 0)`;let n=Number(e[1]),r=e[2];return n*(r==="s"?1e3:r==="m"?6e4:r==="h"?36e5:864e5)}function mk(t,e,n,r=!1){if(n.kind!=="tool_use"&&n.kind!=="tool_result"&&n.kind!=="api_retry")return;let s=n.kind==="tool_use"?`[${e}] tool_use ${n.tool??"tool"}${n.summary?`: ${n.summary}`:""}`:n.kind==="tool_result"?`[${e}] tool_result${n.status?` ${n.status}`:""}${n.summary?`: ${n.summary}`:""}`:`[${e}] api_retry${n.summary?`: ${n.summary}`:""}`;D({event:"chat_progress",alias:e,progress_kind:n.kind,line:s}),r&&t.stderr.write(`${s}
2462
+ `)?r.slice(0,-1):r;return s.length===0?{error:`--prompt-file ${t}: file is empty; a prompt is required`}:s}async function i2(t){let e=[];for await(let n of t)e.push(typeof n=="string"?Buffer.from(n,"utf8"):n);return Buffer.concat(e).toString("utf8")}function fk(t){if(t==="0")return 0;if(/^\d+$/.test(t)){let i=Number(t);return i>0&&i<1e3?`--idle-timeout ${t} means ${t}ms, not ${t}s \u2014 that's not enough time for any real provider call to make progress. Use an explicit unit, e.g. --idle-timeout ${t}s.`:i}let e=/^(\d+)([smhd])$/.exec(t);if(e===null)return`invalid --idle-timeout "${t}" (expected <n>(s|m|h|d), integer ms >= 1000, or 0)`;let n=Number(e[1]),r=e[2];return n*(r==="s"?1e3:r==="m"?6e4:r==="h"?36e5:864e5)}function mk(t,e,n,r=!1){if(n.kind!=="tool_use"&&n.kind!=="tool_result"&&n.kind!=="api_retry")return;let s=n.kind==="tool_use"?`[${e}] tool_use ${n.tool??"tool"}${n.summary?`: ${n.summary}`:""}`:n.kind==="tool_result"?`[${e}] tool_result${n.status?` ${n.status}`:""}${n.summary?`: ${n.summary}`:""}`:`[${e}] api_retry${n.summary?`: ${n.summary}`:""}`;D({event:"chat_progress",alias:e,progress_kind:n.kind,line:s}),r&&t.stderr.write(`${s}
2464
2463
  `)}function o2(t,e){return t.slice(-e)}function a2(t,e,n=!1){e.kind==="delta"?t.stdout.write(e.chunk):e.kind==="progress"?mk(t,e.alias,e.event,n):t.stderr.write(e.message)}var n2,ck,_k=E(()=>{"use strict";mt();Re();xt();lk();mi();de();Xa();sn();n2={name:"chat",allowsBareTeamfile:!1,supportsRaw:!0},ck=`usage: lmctl chat <teamfile>:<alias> "<prompt>"
2465
2464
  lmctl chat <teamfile> <alias> "<prompt>"
2466
2465
  lmctl chat <sessionid> "<prompt>" --provider <name>
@@ -2478,6 +2477,11 @@ Safe input (no shell involved) \u2014 use for anything non-trivial:
2478
2477
  quotes are expanded before lmctl sees them. Write the text to a file with
2479
2478
  your file-writing tool (not echo/heredoc), then pass --prompt-file.
2480
2479
  --permission-mode defaults to yolo.
2480
+ --idle-timeout takes <n>(s|m|h|d) (e.g. 15s, 30m, 2h) or 0 to disable the
2481
+ timer. ALWAYS use an explicit unit \u2014 a bare integer is milliseconds, and
2482
+ under 1000 is refused outright since no real provider call finishes that
2483
+ fast. Default is a generous 8 hours; do not lower it to "fail fast" on a
2484
+ slow member, that kills one still making real progress.
2481
2485
  Managed-team --json synchronous sends emit an early {"status":"accepted",
2482
2486
  "message_id":"msg_..."} line after durable creation, then a final result line
2483
2487
  with the same message_id. A busy outcome emits one error line.
@@ -2488,7 +2492,7 @@ Safe input (no shell involved) \u2014 use for anything non-trivial:
2488
2492
  where unconditional narration would bleed into unrelated output).
2489
2493
 
2490
2494
  Send a prompt to a team member or raw provider session, or answer a paused run.`});function hi(t,e){if(t===void 0)return{date:void 0};let n=/^(\d+)([smhd])$/.exec(t);if(n!==null){let s=Number(n[1]),i=n[2],o=i==="s"?s:i==="m"?s*60:i==="h"?s*3600:s*86400;return{date:new Date(Date.now()-o*1e3)}}let r=Date.parse(t);return Number.isFinite(r)?{date:new Date(r)}:{error:`invalid ${e} "${t}" (expected ISO8601 or duration like 24h)`}}var km=E(()=>{"use strict"});var Sk={};ae(Sk,{buildSessionInspection:()=>yi,deriveToolCalls:()=>Tl,runSession:()=>p2});async function p2(t,e,n=u2){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(`${wk}
2491
- `),0;let r=z(t,["--session","--provider","--since","--until","--limit"],[]);if(r.error!==void 0)return lt(e,r.error,!0);let s=hi($(r,"--since"),"--since");if("error"in s)return lt(e,s.error,!0);let i=hi($(r,"--until"),"--until");if("error"in i)return lt(e,i.error,!0);let o=$(r,"--limit"),a;if(o!==void 0&&(a=Number.parseInt(o,10),!Number.isFinite(a)||a<1||String(a)!==o))return lt(e,`invalid --limit "${o}" (expected a positive integer)`,!0);let l=zt(l2,{target:r.positionals[0],alias:r.positionals[1],flags:{session:$(r,"--session"),provider:$(r,"--provider")}});if(l.mode==="error")return lt(e,l.message,!0);if(l.mode==="managed")return lt(e,"session does not support managed-mode targets",!0);let c,u,d,f;try{if(l.mode==="ai-team"){f=l.teamfile;let g=l.alias??await n.resolveLeadAlias(l.teamfile,e),w=await n.resolveTeamTarget(l.teamfile,g,e);c=w.provider,u=w.sessionid,d=w.alias}else if(u=l.sessionid,l.provider!==void 0)c=l.provider;else{let g=await Pn(u);if(g.length===0)return lt(e,`session "${u}" not found in any provider store`,!0);if(g.length>1)return lt(e,`session "${u}" matches multiple providers (${g.join(", ")}); pass --provider`,!0);c=g[0]}}catch(g){return g instanceof ke?lt(e,g.message,!0):lt(e,Im(g))}let m;try{m=await n.loadSession(u,c)}catch(g){return lt(e,`failed to load session: ${Im(g)}`)}if(m===null)return lt(e,`session not found: ${u} (provider=${c})`);let p=s.date?.getTime(),_=i.date?.getTime(),h=[];if(f!==void 0&&d!==void 0)try{h=await n.listInvocations(f,d,{sinceMs:p,untilMs:_},e)}catch(g){return lt(e,`failed to load invocation history: ${Im(g)}`)}return K(e,yi(m,d,{invocations:h,sinceMs:p,untilMs:_,limit:a})),0}function yi(t,e,n={}){let r=k2(t.messages),s=I2(r,d2),i=E2(t,r!==null),o=Tl(t),a=e?.toLowerCase()==="lead",l=o.filter(p=>p.kind==="file_write").length,c=o.filter(p=>p.kind==="file_edit").length,u=gi[t.provider],d=e===void 0?u==="none"?"none":"partial":u,f=_2(t.messages,n.sinceMs,n.untilMs).filter(p=>p.role==="user"||p.role==="assistant").slice(-Math.max(1,Math.trunc(n.limit??c2))).map(p=>({role:p.role,content:p.content,model:p.model??null,timestamp:p.timestamp.toISOString()})),m=n.invocations??[];return{schema_version:yk,provider:t.provider,sessionId:t.sessionId,modifiedAt:t.modifiedAt.toISOString(),lastPrompt:s.text,lastPromptTruncated:s.truncated,handled:i.value,handledSignal:i.signal,tokens:T2(t),toolCalls:o,messages:f,invocations:m,authorship:{alias:e??null,isLeadAlias:a,selfFileWriteCount:l,selfFileEditCount:c,flag:a&&l+c>0?"lead_self_authoring":null},coverage:{toolCalls:gi[t.provider],resultPairing:Ek[t.provider],backgroundTaskCorrelation:h2(t.provider),authorship:d,tokens:f2[t.provider],handled:i.coverage}}}function _2(t,e,n){return e===void 0&&n===void 0?t:t.filter(r=>{let s=r.timestamp.getTime();return!(e!==void 0&&s<e||n!==void 0&&s>n)})}function h2(t){return t==="claude"||t==="kimi"||t==="agy"?"full":t==="copilot"?"partial":"none"}function Tl(t){if(gi[t.provider]==="none")return[];let e=m2[t.provider]??{},n=new Set,r=[];for(let s=0;s<t.messages.length;s+=1){let i=t.messages[s];if(i.role!=="tool_use"||!i.toolName)continue;let o=e[i.toolName],a=i.toolInputData??N2(i.toolInput),l=o===void 0?void 0:g2(o,a),c=w2(t.messages,s,i.toolCallId,n,t.provider==="agy"),u=c===void 0?void 0:t.messages[c];c!==void 0&&n.add(c);let d=o===void 0?[]:y2(o,a),f=d.length>0?d:[{kind:o?.kind??"other",value:l}];for(let m of f)r.push({kind:m.kind,name:i.toolName,...m.kind==="shell"?{command:m.value??null}:{},...m.kind==="file_read"||m.kind==="file_write"||m.kind==="file_edit"||m.kind==="network"?{path:m.value??null}:{},callId:i.toolCallId??null,backgroundTaskId:i.backgroundTaskId??null,startedAt:i.timestamp.toISOString(),endedAt:u?.timestamp.toISOString()??null,result:u===void 0?null:u.toolDetailedContent??u.content})}return r}function g2(t,e){if(e!==void 0)for(let n of[t.inputKey,...t.fallbackInputKeys??[]]){let r=Nm(e[n]);if(r!==void 0)return r}}function y2(t,e){if(t.multi===void 0||e===void 0)return[];let n=e[t.multi.pathsKey],r=e[t.multi.kindsKey];if(!Array.isArray(n)||!Array.isArray(r))return[];let s=[];for(let i=0;i<Math.min(n.length,r.length);i+=1){let o=Nm(n[i]),a=Nm(r[i]),l=a===void 0?void 0:t.multi.kindByValue[a];o!==void 0&&l!==void 0&&s.push({kind:l,value:o})}return s}function w2(t,e,n,r,s){if(n===void 0)return;let i=s?0:e+1;for(let o=i;o<t.length;o+=1){let a=t[o];if(!r.has(o)&&a.role==="tool_result"&&a.toolCallId===n)return o}}function E2(t,e){if(!e)return{value:null,signal:"unavailable",coverage:"unavailable"};if(t.turnStatus!==void 0){let s=t.provider==="claude"?"native_stop_reason":t.turnStatus==="complete"?"native_task_complete":t.turnStatus==="aborted"?"native_turn_aborted":"native_task_started";return{value:t.turnStatus==="complete",signal:s,coverage:"native"}}let n=Tk(t.messages,"user");return{value:n>=0&&t.messages.slice(n+1).some(s=>s.role==="assistant"),signal:"heuristic",coverage:"heuristic"}}function T2(t){let e=t.lastTokenUsage,n=v2(t),r=b2(t.provider);return{lastTurn:S2(e),aggregate:{input:n,output:t.totalOutputTokens??null,cacheRead:t.totalCachedInputTokens??null,cacheWrite:t.totalCacheWriteInputTokens??null},normalization:r}}function S2(t){return{input:t?.inputTokens??null,output:t?.outputTokens??null,cacheRead:t?.cachedInputTokens??null,cacheWrite:t?.cacheWriteInputTokens??null}}function v2(t){return t.totalInputTokens===void 0?null:t.provider==="claude"?Math.max(0,t.totalInputTokens-(t.totalCachedInputTokens??0)-(t.totalCacheWriteInputTokens??0)):t.provider==="gemini"||t.provider==="qwen"?Math.max(0,t.totalInputTokens-(t.totalCachedInputTokens??0)):t.totalInputTokens}function b2(t){switch(t){case"claude":return{id:"claude-standard",note:"input excludes cacheRead and cacheWrite; all four counters are independent"};case"gemini":return{id:"gemini-input-excludes-cache",note:"input excludes cached prompt tokens; cacheRead reports the cached subset"};case"kimi":return{id:"kimi-splits-other",note:"input is Kimi inputOther; cacheRead and cacheWrite are separate counters"};case"codex":return{id:"codex-upstream-passthrough",note:"input and cacheRead preserve Codex upstream token_count semantics"};case"opencode":case"lmplayer":return{id:"opencode-standard",note:"input excludes cacheRead and cacheWrite; all four counters are independent per-turn DB rows"};case"copilot":return{id:"copilot-shutdown-aggregate",note:"aggregate input/cache come from session.shutdown modelMetrics (absent on live sessions); lastTurn reports output only"};case"qwen":return{id:"qwen-gemini-usage-metadata",note:"input excludes cachedContentTokenCount (Gemini usageMetadata semantics: prompt includes the cached subset); output includes thoughts; no cache-write counter exists upstream"};case"dsh":return{id:"dsh-independent-counters",note:"input excludes cacheRead (verified against real sessions); reasoning is a separate counter; no cache-write counter exists upstream"};default:return{id:"unavailable",note:"this provider reader does not expose token usage in Phase 1"}}}function k2(t){let e=Tk(t,"user");return e<0?null:t[e].content}function Tk(t,e){for(let n=t.length-1;n>=0;n-=1)if(t[n].role===e)return n;return-1}function I2(t,e){if(t===null)return{text:null,truncated:!1};let n=Buffer.from(t,"utf8");if(n.length<=e)return{text:t,truncated:!1};let r=e;for(;r>0&&(n[r]&192)===128;)r-=1;return{text:n.subarray(0,r).toString("utf8"),truncated:!0}}function N2(t){if(t!==void 0)try{let e=JSON.parse(t);return A2(e)?e:void 0}catch{return}}function A2(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function Nm(t){return typeof t=="string"?t:void 0}function lt(t,e,n=!1){return K(t,{schema_version:yk,error:e,...n?{usage:wk}:{}}),1}function Im(t){return t instanceof Error?t.message:String(t)}var yk,l2,c2,d2,wk,u2,gi,Ek,hk,f2,gk,m2,Sl=E(()=>{"use strict";Rt();Re();xt();Kt();Yt();km();yk=2,l2={name:"session",allowsBareTeamfile:!0,supportsRaw:!0},c2=500,d2=32*1024,wk=["usage: lmctl session [target] [alias] [--since <duration|ISO8601>] [--until <duration|ISO8601>]"," lmctl session --session <id> --provider <name> [--since ...] [--until ...] [--limit N]","","Inspect one native provider session through a versioned JSON contract:","conversation messages, classified tool calls (shell/file/network), token","usage, and lmctl's own dispatch history (tracked_invocation) for the","same target. A bare <teamfile> with no alias inspects that team's Lead.","--since/--until bound `messages` by timestamp and `invocations` by","start time (duration like 24h, or an absolute ISO8601 timestamp).","--limit caps `messages` to the most recent N (default 500)."].join(`
2495
+ `),0;let r=z(t,["--session","--provider","--since","--until","--limit"],[]);if(r.error!==void 0)return lt(e,r.error,!0);let s=hi($(r,"--since"),"--since");if("error"in s)return lt(e,s.error,!0);let i=hi($(r,"--until"),"--until");if("error"in i)return lt(e,i.error,!0);let o=$(r,"--limit"),a;if(o!==void 0&&(a=Number.parseInt(o,10),!Number.isFinite(a)||a<1||String(a)!==o))return lt(e,`invalid --limit "${o}" (expected a positive integer)`,!0);let l=zt(l2,{target:r.positionals[0],alias:r.positionals[1],flags:{session:$(r,"--session"),provider:$(r,"--provider")}});if(l.mode==="error")return lt(e,l.message,!0);if(l.mode==="managed")return lt(e,"session does not support managed-mode targets",!0);let c,u,d,f;try{if(l.mode==="ai-team"){f=l.teamfile;let g=l.alias??await n.resolveLeadAlias(l.teamfile,e),y=await n.resolveTeamTarget(l.teamfile,g,e);c=y.provider,u=y.sessionid,d=y.alias}else if(u=l.sessionid,l.provider!==void 0)c=l.provider;else{let g=await Pn(u);if(g.length===0)return lt(e,`session "${u}" not found in any provider store`,!0);if(g.length>1)return lt(e,`session "${u}" matches multiple providers (${g.join(", ")}); pass --provider`,!0);c=g[0]}}catch(g){return g instanceof ke?lt(e,g.message,!0):lt(e,Im(g))}let m;try{m=await n.loadSession(u,c)}catch(g){return lt(e,`failed to load session: ${Im(g)}`)}if(m===null)return lt(e,`session not found: ${u} (provider=${c})`);let p=s.date?.getTime(),_=i.date?.getTime(),h=[];if(f!==void 0&&d!==void 0)try{h=await n.listInvocations(f,d,{sinceMs:p,untilMs:_},e)}catch(g){return lt(e,`failed to load invocation history: ${Im(g)}`)}return K(e,yi(m,d,{invocations:h,sinceMs:p,untilMs:_,limit:a})),0}function yi(t,e,n={}){let r=k2(t.messages),s=I2(r,d2),i=E2(t,r!==null),o=Tl(t),a=e?.toLowerCase()==="lead",l=o.filter(p=>p.kind==="file_write").length,c=o.filter(p=>p.kind==="file_edit").length,u=gi[t.provider],d=e===void 0?u==="none"?"none":"partial":u,f=_2(t.messages,n.sinceMs,n.untilMs).filter(p=>p.role==="user"||p.role==="assistant").slice(-Math.max(1,Math.trunc(n.limit??c2))).map(p=>({role:p.role,content:p.content,model:p.model??null,timestamp:p.timestamp.toISOString()})),m=n.invocations??[];return{schema_version:yk,provider:t.provider,sessionId:t.sessionId,modifiedAt:t.modifiedAt.toISOString(),lastPrompt:s.text,lastPromptTruncated:s.truncated,handled:i.value,handledSignal:i.signal,tokens:T2(t),toolCalls:o,messages:f,invocations:m,authorship:{alias:e??null,isLeadAlias:a,selfFileWriteCount:l,selfFileEditCount:c,flag:a&&l+c>0?"lead_self_authoring":null},coverage:{toolCalls:gi[t.provider],resultPairing:Ek[t.provider],backgroundTaskCorrelation:h2(t.provider),authorship:d,tokens:f2[t.provider],handled:i.coverage}}}function _2(t,e,n){return e===void 0&&n===void 0?t:t.filter(r=>{let s=r.timestamp.getTime();return!(e!==void 0&&s<e||n!==void 0&&s>n)})}function h2(t){return t==="claude"||t==="kimi"||t==="agy"?"full":t==="copilot"?"partial":"none"}function Tl(t){if(gi[t.provider]==="none")return[];let e=m2[t.provider]??{},n=new Set,r=[];for(let s=0;s<t.messages.length;s+=1){let i=t.messages[s];if(i.role!=="tool_use"||!i.toolName)continue;let o=e[i.toolName],a=i.toolInputData??N2(i.toolInput),l=o===void 0?void 0:g2(o,a),c=w2(t.messages,s,i.toolCallId,n,t.provider==="agy"),u=c===void 0?void 0:t.messages[c];c!==void 0&&n.add(c);let d=o===void 0?[]:y2(o,a),f=d.length>0?d:[{kind:o?.kind??"other",value:l}];for(let m of f)r.push({kind:m.kind,name:i.toolName,...m.kind==="shell"?{command:m.value??null}:{},...m.kind==="file_read"||m.kind==="file_write"||m.kind==="file_edit"||m.kind==="network"?{path:m.value??null}:{},callId:i.toolCallId??null,backgroundTaskId:i.backgroundTaskId??null,startedAt:i.timestamp.toISOString(),endedAt:u?.timestamp.toISOString()??null,result:u===void 0?null:u.toolDetailedContent??u.content})}return r}function g2(t,e){if(e!==void 0)for(let n of[t.inputKey,...t.fallbackInputKeys??[]]){let r=Nm(e[n]);if(r!==void 0)return r}}function y2(t,e){if(t.multi===void 0||e===void 0)return[];let n=e[t.multi.pathsKey],r=e[t.multi.kindsKey];if(!Array.isArray(n)||!Array.isArray(r))return[];let s=[];for(let i=0;i<Math.min(n.length,r.length);i+=1){let o=Nm(n[i]),a=Nm(r[i]),l=a===void 0?void 0:t.multi.kindByValue[a];o!==void 0&&l!==void 0&&s.push({kind:l,value:o})}return s}function w2(t,e,n,r,s){if(n===void 0)return;let i=s?0:e+1;for(let o=i;o<t.length;o+=1){let a=t[o];if(!r.has(o)&&a.role==="tool_result"&&a.toolCallId===n)return o}}function E2(t,e){if(!e)return{value:null,signal:"unavailable",coverage:"unavailable"};if(t.turnStatus!==void 0){let s=t.provider==="claude"?"native_stop_reason":t.turnStatus==="complete"?"native_task_complete":t.turnStatus==="aborted"?"native_turn_aborted":"native_task_started";return{value:t.turnStatus==="complete",signal:s,coverage:"native"}}let n=Tk(t.messages,"user");return{value:n>=0&&t.messages.slice(n+1).some(s=>s.role==="assistant"),signal:"heuristic",coverage:"heuristic"}}function T2(t){let e=t.lastTokenUsage,n=v2(t),r=b2(t.provider);return{lastTurn:S2(e),aggregate:{input:n,output:t.totalOutputTokens??null,cacheRead:t.totalCachedInputTokens??null,cacheWrite:t.totalCacheWriteInputTokens??null},normalization:r}}function S2(t){return{input:t?.inputTokens??null,output:t?.outputTokens??null,cacheRead:t?.cachedInputTokens??null,cacheWrite:t?.cacheWriteInputTokens??null}}function v2(t){return t.totalInputTokens===void 0?null:t.provider==="claude"?Math.max(0,t.totalInputTokens-(t.totalCachedInputTokens??0)-(t.totalCacheWriteInputTokens??0)):t.provider==="gemini"||t.provider==="qwen"?Math.max(0,t.totalInputTokens-(t.totalCachedInputTokens??0)):t.totalInputTokens}function b2(t){switch(t){case"claude":return{id:"claude-standard",note:"input excludes cacheRead and cacheWrite; all four counters are independent"};case"gemini":return{id:"gemini-input-excludes-cache",note:"input excludes cached prompt tokens; cacheRead reports the cached subset"};case"kimi":return{id:"kimi-splits-other",note:"input is Kimi inputOther; cacheRead and cacheWrite are separate counters"};case"codex":return{id:"codex-upstream-passthrough",note:"input and cacheRead preserve Codex upstream token_count semantics"};case"opencode":case"lmplayer":return{id:"opencode-standard",note:"input excludes cacheRead and cacheWrite; all four counters are independent per-turn DB rows"};case"copilot":return{id:"copilot-shutdown-aggregate",note:"aggregate input/cache come from session.shutdown modelMetrics (absent on live sessions); lastTurn reports output only"};case"qwen":return{id:"qwen-gemini-usage-metadata",note:"input excludes cachedContentTokenCount (Gemini usageMetadata semantics: prompt includes the cached subset); output includes thoughts; no cache-write counter exists upstream"};case"dsh":return{id:"dsh-independent-counters",note:"input excludes cacheRead (verified against real sessions); reasoning is a separate counter; no cache-write counter exists upstream"};default:return{id:"unavailable",note:"this provider reader does not expose token usage in Phase 1"}}}function k2(t){let e=Tk(t,"user");return e<0?null:t[e].content}function Tk(t,e){for(let n=t.length-1;n>=0;n-=1)if(t[n].role===e)return n;return-1}function I2(t,e){if(t===null)return{text:null,truncated:!1};let n=Buffer.from(t,"utf8");if(n.length<=e)return{text:t,truncated:!1};let r=e;for(;r>0&&(n[r]&192)===128;)r-=1;return{text:n.subarray(0,r).toString("utf8"),truncated:!0}}function N2(t){if(t!==void 0)try{let e=JSON.parse(t);return A2(e)?e:void 0}catch{return}}function A2(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function Nm(t){return typeof t=="string"?t:void 0}function lt(t,e,n=!1){return K(t,{schema_version:yk,error:e,...n?{usage:wk}:{}}),1}function Im(t){return t instanceof Error?t.message:String(t)}var yk,l2,c2,d2,wk,u2,gi,Ek,hk,f2,gk,m2,Sl=E(()=>{"use strict";Rt();Re();xt();Kt();Yt();km();yk=2,l2={name:"session",allowsBareTeamfile:!0,supportsRaw:!0},c2=500,d2=32*1024,wk=["usage: lmctl session [target] [alias] [--since <duration|ISO8601>] [--until <duration|ISO8601>]"," lmctl session --session <id> --provider <name> [--since ...] [--until ...] [--limit N]","","Inspect one native provider session through a versioned JSON contract:","conversation messages, classified tool calls (shell/file/network), token","usage, and lmctl's own dispatch history (tracked_invocation) for the","same target. A bare <teamfile> with no alias inspects that team's Lead.","--since/--until bound `messages` by timestamp and `invocations` by","start time (duration like 24h, or an absolute ISO8601 timestamp).","--limit caps `messages` to the most recent N (default 500)."].join(`
2492
2496
  `),u2={loadSession:Ce,resolveTeamTarget:(t,e,n)=>O(n,r=>He(t,e,r)),resolveLeadAlias:async(t,e)=>{let n=await O(e,i=>Te(t,i)),r=je(n),s=ht(r);if(s===void 0)throw new Error(`${t} has no Lead member; pass <tf>:<alias>`);return s.alias},listInvocations:(t,e,n,r)=>O(r,s=>s.listTrackedInvocationsForTarget(t,e,n).map(i=>({id:i.id,kind:i.kind,origin:i.origin,status:i.status,from_identity:i.from_identity,command:i.command,started_at:i.started_at,ended_at:i.ended_at,exit_code:i.exit_code,error:i.error})))},gi={claude:"full",codex:"partial",gemini:"none",copilot:"partial",opencode:"full",lmplayer:"full",qwen:"partial",agy:"full",kimi:"full",dsh:"full",ClaudeMock:"none"},Ek={claude:"full",codex:"partial",gemini:"none",copilot:"partial",opencode:"full",lmplayer:"full",qwen:"partial",agy:"partial",kimi:"full",dsh:"full",ClaudeMock:"none"},hk={none:0,heuristic:1,partial:2,full:3};for(let t of Object.keys(gi))if(hk[Ek[t]]>hk[gi[t]])throw new Error(`invalid session coverage for ${t}: result pairing exceeds tool-call coverage`);f2={claude:"full",codex:"partial",gemini:"partial",copilot:"partial",opencode:"full",lmplayer:"full",qwen:"partial",agy:"none",kimi:"full",dsh:"partial",ClaudeMock:"none"},gk={bash:{kind:"shell",inputKey:"command"},read:{kind:"file_read",inputKey:"filePath",fallbackInputKeys:["path","file"]},write:{kind:"file_write",inputKey:"filePath",fallbackInputKeys:["path","file"]},edit:{kind:"file_edit",inputKey:"filePath",fallbackInputKeys:["path","file"]}},m2={claude:{Bash:{kind:"shell",inputKey:"command"},Read:{kind:"file_read",inputKey:"file_path"},Write:{kind:"file_write",inputKey:"file_path"},Edit:{kind:"file_edit",inputKey:"file_path"},WebFetch:{kind:"network",inputKey:"url"},WebSearch:{kind:"network",inputKey:"query"}},codex:{exec_command:{kind:"shell",inputKey:"cmd"},apply_patch:{kind:"file_edit",inputKey:"path",multi:{pathsKey:"paths",kindsKey:"kinds",kindByValue:{Add:"file_write",Update:"file_edit",Move:"file_edit",Delete:"file_edit"}}}},copilot:{bash:{kind:"shell",inputKey:"command"}},opencode:gk,lmplayer:gk,kimi:{Bash:{kind:"shell",inputKey:"command"},Read:{kind:"file_read",inputKey:"path"},Write:{kind:"file_write",inputKey:"path"},Edit:{kind:"file_edit",inputKey:"path"}},qwen:{run_shell_command:{kind:"shell",inputKey:"command"},read_file:{kind:"file_read",inputKey:"file_path"}},dsh:{bash:{kind:"shell",inputKey:"command"},read:{kind:"file_read",inputKey:"file_path"},write:{kind:"file_write",inputKey:"file_path"}},agy:{run_command:{kind:"shell",inputKey:"CommandLine"},view_file:{kind:"file_read",inputKey:"AbsolutePath"},write_to_file:{kind:"file_write",inputKey:"TargetFile"},replace_file_content:{kind:"file_edit",inputKey:"TargetFile"},multi_replace_file_content:{kind:"file_edit",inputKey:"TargetFile"}}}});function Am(t){let e;try{e=F2(t)}catch{return[{kind:"mutate",note:"shell command could not be parsed"}]}let n=[],r="",s=!1;for(let i=0;i<e.length;i+=1){let a=e[i].command;if(a.argv.length===0&&a.redirects.length===0)continue;let l=Nk(a.argv),c=l===a.argv?a:{...a,argv:l},u=wi(c.argv[0]?.text??"");if(u==="cd"){let f=c.argv[1];f===void 0?s=!0:f.literal?r=Lk(r,f.text):s=!0;continue}if(x2.has(c.argv[0]?.text??"")){n.push({kind:"mutate",note:`compound shell construct not analyzed: ${Je(t)}`});break}let d=q2(c);if(d!==null){let f=d.literal?Am(d.text):[{kind:"mutate",note:"sh -c script involves expansion; not analyzed"}];n.push(...f.map(m=>kk(m,r,s)));continue}n.push(...M2(c,u,Rk(e,i)).map(f=>kk(f,r,s)))}return n}function M2(t,e,n){let r=[],s=t.redirects.filter(o=>o.fd===1||o.fd==="&"),i=t.redirects.filter(o=>o.fd===2);for(let o of i){let a=bk(o);a!=="ignored"&&r.push(a===null?{kind:"mutate",note:`stderr redirect target not literal: ${Je(t.raw)}`}:{kind:"mutate",path:a,note:"file receives command stderr; content not reconstructable"})}if(s.length>0){let o=Ak(t,e,n);for(let a of s){let l=bk(a);l!=="ignored"&&(l===null?r.push({kind:"mutate",note:`redirect target not literal: ${Je(t.raw)}`}):o===null||t.hasSubstitution?r.push({kind:"mutate",path:l,note:`content not reconstructable from: ${Je(t.raw)}`}):r.push({kind:a.op===">>"?"append":"write",path:l,content:o}))}return r}if(r.push(...j2(t,e,n)),r.length===0&&D2(t,e)){let o=t.argv.slice(1).map(a=>a.text).filter(a=>a.length>0);o.length>0&&r.push({kind:"opaque",tokens:o,command:Je(t.raw)})}return r}function D2(t,e){return e===""||$2.has(e)?!1:O2.has(e)?e==="find"?t.argv.some(n=>n.text==="-delete"||n.text==="-exec"||n.text==="-execdir"||n.text==="-ok"):!1:!0}function Nk(t){let e=0;for(;e<t.length&&/^[A-Za-z_][A-Za-z0-9_]*=/.test(t[e].text);)e+=1;for(;e<t.length&&L2.has(wi(t[e].text));){let n=wi(t[e].text);for(e+=1;e<t.length&&t[e].text.startsWith("-");)e+=1;if(n==="timeout"&&e<t.length&&/^\d/.test(t[e].text)&&(e+=1),n==="env")for(;e<t.length&&/^[A-Za-z_][A-Za-z0-9_]*=/.test(t[e].text);)e+=1}return e===0?t:t.slice(e)}function Ak(t,e,n){if(t.hasSubstitution)return null;let r=t.argv.slice(1);if(e==="echo"){let s=!0,i=0;for(;i<r.length&&/^-[neE]+$/.test(r[i].text);){let a=r[i].text;if(a.includes("n")&&(s=!1),a.includes("e"))return null;i+=1}let o=r.slice(i);return o.every(a=>a.literal)?o.map(a=>a.text).join(" ")+(s?`
2493
2497
  `:""):null}if(e==="printf"){if(r.length===0||!r.every(i=>i.literal))return null;let s=r[0].text;return r.length===1?/[%\\]/.test(s)?null:s:s==="%s\\n"||s===`%s
2494
2498
  `?r.slice(1).map(i=>`${i.text}
@@ -2521,12 +2525,12 @@ ${os}`);if(r.positionals.length===0)return I(e,`restore requires a <teamfile> (o
2521
2525
 
2522
2526
  ${os}`);if(r.positionals.length>2)return I(e,`unexpected argument: ${r.positionals[2]}`);let i=r.positionals[0],o=dr(i),a=o?.teamfile??i,l=r.positionals[1],c=o?.alias??l;if(o!==null&&l!==void 0)return I(e,"restore alias was provided twice; use either <teamfile>:<alias> or <teamfile> <alias>");if(c===void 0)return I(e,`restore requires an <alias>
2523
2527
 
2524
- ${os}`);let u;try{u=await n.resolveTeamTarget(a,c,e)}catch(b){if(b instanceof ke)return I(e,b.message);throw b}let d;try{d=await n.loadSession(u.sessionid,u.provider)}catch(b){return I(e,`failed to load session: ${xl(b)}`)}if(d===null)return I(e,`session not found: ${u.sessionid} (provider=${u.provider})`);let f=B(r,"--dry-run"),m=B(r,"--force"),p=B(r,"--single-session")||n.resolveTeamRoster===void 0,_=$(r,"--target"),h=_===void 0?void 0:mn(_),g=p?[u]:iX([u,...await n.resolveTeamRoster(a,e)]),w=[],y=[],S=[];for(let b of g){if(b.sessionid===u.sessionid){S.push({member:b,detail:d}),y.push(pr(b,"target",0));continue}try{let M=await n.loadSession(b.sessionid,b.provider);if(M===null){y.push(pr(b,"not_found",0)),w.push(`team member ${b.alias}: session ${b.sessionid} not found \u2014 its file history is missing from this recovery`);continue}S.push({member:b,detail:M}),y.push(pr(b,"merged",0))}catch(M){y.push(pr(b,"load_error",0)),w.push(`team member ${b.alias}: session load failed (${xl(M)}) \u2014 its file history is missing from this recovery`)}}let k={toolCalls:yi(d).coverage.toolCalls,structuredReplay:Bk[d.provider],shellScan:Om[d.provider]!==void 0?"best_effort":"none",crossSession:p?"single_session":"team_merged",...Nl[d.provider]!==void 0?{structuredNote:Nl[d.provider]}:{},shellNote:Hk};return Xk(e,{json:B(r,"--json"),dryRun:f,force:m,absTarget:h,loaded:S,members:y,loadWarnings:w,coverage:k,mode:p?"single_session":"team",headerJson:{provider:d.provider,sessionId:d.sessionId,sessionCwd:d.cwd},describe:p?" (single session)":` from ${S.length} team session(s)`})}function Fk(t){let e=mn(t),n=[];for(;;)try{return Q2(G2(e),...n.reverse())}catch{let r=Rl(e);if(r===e)return mn(t);n.push(qk(e)),e=r}}async function sX(t,e,n,r){if(r.discoverSessions===void 0)return I(n,"--dir is not available: session discovery is not wired in this harness");let s=Fk(t),i=B(e,"--recursive"),o;try{o=await r.discoverSessions()}catch(w){return I(n,`session discovery failed: ${xl(w)}`)}let a=s.endsWith("/")?s:`${s}/`,l=new Set,c=[],u=0,d=0,f=0;for(let w of o){let y=`${w.provider}:${w.sessionId}`;if(l.has(y)){f+=1;continue}if(l.add(y),typeof w.cwd!="string"||w.cwd.trim()===""){u+=1;continue}let S=Fk(w.cwd);S===s||i&&S.startsWith(a)?c.push(w):d+=1}if(c.sort((w,y)=>w.createdAt.getTime()-y.createdAt.getTime()),c.length===0)return I(n,`no provider sessions recorded working directory ${s}${i?" (or its subdirectories)":""} \u2014 checked ${o.length} session(s); ${u} had no recorded cwd`);let m=[],p=[],_=[];for(let w of c){let y={teamfile:"",alias:`${w.provider}:${w.sessionId}`,provider:w.provider,sessionid:w.sessionId,sessiondir:w.cwd,isLead:!1};try{let S=await r.loadSession(w.sessionId,w.provider);if(S===null){p.push(pr(y,"not_found",0)),m.push(`session ${y.alias}: discovered but not loadable \u2014 its file history is missing from this recovery`);continue}_.push({member:y,detail:S}),p.push(pr(y,"merged",0))}catch(S){p.push(pr(y,"load_error",0)),m.push(`session ${y.alias}: load failed (${xl(S)}) \u2014 its file history is missing from this recovery`)}}let g={crossSession:"directory_merged",providers:[...new Set(_.map(w=>w.detail.provider))].map(w=>({provider:w,structuredReplay:Bk[w],shellScan:Om[w]!==void 0?"best_effort":"none",...Nl[w]!==void 0?{structuredNote:Nl[w]}:{}})),shellNote:Hk};return Xk(n,{json:B(e,"--json"),dryRun:B(e,"--dry-run"),force:B(e,"--force"),absTarget:$(e,"--target")===void 0?void 0:mn($(e,"--target")),loaded:_,members:p,loadWarnings:m,coverage:g,mode:"directory",headerJson:{dir:s,recursive:i,discovery:{sessionsScanned:o.length,duplicates:f,matched:c.length,merged:_.length,excludedNoCwd:u,excludedOutsideDir:d}},describe:` from ${_.length} session(s) recorded in ${s}`})}async function Xk(t,e){let{dryRun:n,force:r,absTarget:s,loaded:i,members:o,loadWarnings:a}=e,l=oX(i);for(let _ of o)_.fileOps=l.filter(h=>h.alias===_.alias).length;let{files:c,warnings:u}=await dX(l,{dryRun:n,force:r,targetDir:s}),d=[...a,...u],f=i.flatMap(({member:_,detail:h})=>mX(h,l.filter(g=>g.alias===_.alias),_.alias)),m={files:c.length,written:c.filter(_=>_.action==="written").length,wouldWrite:c.filter(_=>_.action==="would_write").length,skipped:c.filter(_=>_.action==="skipped").length,unreplayable:c.filter(_=>_.action==="unreplayable").length,stitchedFiles:c.filter(_=>_.aliases.length>1).length,unreplayedCalls:f.length,warnings:d.length},p=m.unreplayable>0||m.unreplayedCalls>0||m.warnings>0;if(e.json)K(t,{schema_version:eX,...e.headerJson,target:s??null,dryRun:n,force:r,mode:e.mode,members:o,coverage:e.coverage,summary:m,files:c,unreplayedCalls:f,warnings:d});else{for(let _ of c){let h=_.aliases.length>1?` [stitched: ${_.aliases.join("+")}]`:"",g=_.detail===null?"":` \u2014 ${_.detail}`;t.stdout.write(`${_.path}: ${_.action} (${_.reason})${h}${g}
2528
+ ${os}`);let u;try{u=await n.resolveTeamTarget(a,c,e)}catch(b){if(b instanceof ke)return I(e,b.message);throw b}let d;try{d=await n.loadSession(u.sessionid,u.provider)}catch(b){return I(e,`failed to load session: ${xl(b)}`)}if(d===null)return I(e,`session not found: ${u.sessionid} (provider=${u.provider})`);let f=B(r,"--dry-run"),m=B(r,"--force"),p=B(r,"--single-session")||n.resolveTeamRoster===void 0,_=$(r,"--target"),h=_===void 0?void 0:mn(_),g=p?[u]:iX([u,...await n.resolveTeamRoster(a,e)]),y=[],w=[],S=[];for(let b of g){if(b.sessionid===u.sessionid){S.push({member:b,detail:d}),w.push(pr(b,"target",0));continue}try{let M=await n.loadSession(b.sessionid,b.provider);if(M===null){w.push(pr(b,"not_found",0)),y.push(`team member ${b.alias}: session ${b.sessionid} not found \u2014 its file history is missing from this recovery`);continue}S.push({member:b,detail:M}),w.push(pr(b,"merged",0))}catch(M){w.push(pr(b,"load_error",0)),y.push(`team member ${b.alias}: session load failed (${xl(M)}) \u2014 its file history is missing from this recovery`)}}let k={toolCalls:yi(d).coverage.toolCalls,structuredReplay:Bk[d.provider],shellScan:Om[d.provider]!==void 0?"best_effort":"none",crossSession:p?"single_session":"team_merged",...Nl[d.provider]!==void 0?{structuredNote:Nl[d.provider]}:{},shellNote:Hk};return Xk(e,{json:B(r,"--json"),dryRun:f,force:m,absTarget:h,loaded:S,members:w,loadWarnings:y,coverage:k,mode:p?"single_session":"team",headerJson:{provider:d.provider,sessionId:d.sessionId,sessionCwd:d.cwd},describe:p?" (single session)":` from ${S.length} team session(s)`})}function Fk(t){let e=mn(t),n=[];for(;;)try{return Q2(G2(e),...n.reverse())}catch{let r=Rl(e);if(r===e)return mn(t);n.push(qk(e)),e=r}}async function sX(t,e,n,r){if(r.discoverSessions===void 0)return I(n,"--dir is not available: session discovery is not wired in this harness");let s=Fk(t),i=B(e,"--recursive"),o;try{o=await r.discoverSessions()}catch(y){return I(n,`session discovery failed: ${xl(y)}`)}let a=s.endsWith("/")?s:`${s}/`,l=new Set,c=[],u=0,d=0,f=0;for(let y of o){let w=`${y.provider}:${y.sessionId}`;if(l.has(w)){f+=1;continue}if(l.add(w),typeof y.cwd!="string"||y.cwd.trim()===""){u+=1;continue}let S=Fk(y.cwd);S===s||i&&S.startsWith(a)?c.push(y):d+=1}if(c.sort((y,w)=>y.createdAt.getTime()-w.createdAt.getTime()),c.length===0)return I(n,`no provider sessions recorded working directory ${s}${i?" (or its subdirectories)":""} \u2014 checked ${o.length} session(s); ${u} had no recorded cwd`);let m=[],p=[],_=[];for(let y of c){let w={teamfile:"",alias:`${y.provider}:${y.sessionId}`,provider:y.provider,sessionid:y.sessionId,sessiondir:y.cwd,isLead:!1};try{let S=await r.loadSession(y.sessionId,y.provider);if(S===null){p.push(pr(w,"not_found",0)),m.push(`session ${w.alias}: discovered but not loadable \u2014 its file history is missing from this recovery`);continue}_.push({member:w,detail:S}),p.push(pr(w,"merged",0))}catch(S){p.push(pr(w,"load_error",0)),m.push(`session ${w.alias}: load failed (${xl(S)}) \u2014 its file history is missing from this recovery`)}}let g={crossSession:"directory_merged",providers:[...new Set(_.map(y=>y.detail.provider))].map(y=>({provider:y,structuredReplay:Bk[y],shellScan:Om[y]!==void 0?"best_effort":"none",...Nl[y]!==void 0?{structuredNote:Nl[y]}:{}})),shellNote:Hk};return Xk(n,{json:B(e,"--json"),dryRun:B(e,"--dry-run"),force:B(e,"--force"),absTarget:$(e,"--target")===void 0?void 0:mn($(e,"--target")),loaded:_,members:p,loadWarnings:m,coverage:g,mode:"directory",headerJson:{dir:s,recursive:i,discovery:{sessionsScanned:o.length,duplicates:f,matched:c.length,merged:_.length,excludedNoCwd:u,excludedOutsideDir:d}},describe:` from ${_.length} session(s) recorded in ${s}`})}async function Xk(t,e){let{dryRun:n,force:r,absTarget:s,loaded:i,members:o,loadWarnings:a}=e,l=oX(i);for(let _ of o)_.fileOps=l.filter(h=>h.alias===_.alias).length;let{files:c,warnings:u}=await dX(l,{dryRun:n,force:r,targetDir:s}),d=[...a,...u],f=i.flatMap(({member:_,detail:h})=>mX(h,l.filter(g=>g.alias===_.alias),_.alias)),m={files:c.length,written:c.filter(_=>_.action==="written").length,wouldWrite:c.filter(_=>_.action==="would_write").length,skipped:c.filter(_=>_.action==="skipped").length,unreplayable:c.filter(_=>_.action==="unreplayable").length,stitchedFiles:c.filter(_=>_.aliases.length>1).length,unreplayedCalls:f.length,warnings:d.length},p=m.unreplayable>0||m.unreplayedCalls>0||m.warnings>0;if(e.json)K(t,{schema_version:eX,...e.headerJson,target:s??null,dryRun:n,force:r,mode:e.mode,members:o,coverage:e.coverage,summary:m,files:c,unreplayedCalls:f,warnings:d});else{for(let _ of c){let h=_.aliases.length>1?` [stitched: ${_.aliases.join("+")}]`:"",g=_.detail===null?"":` \u2014 ${_.detail}`;t.stdout.write(`${_.path}: ${_.action} (${_.reason})${h}${g}
2525
2529
  `)}for(let _ of f)t.stdout.write(`unreplayed ${_.kind} call ${_.tool} [${_.alias}]${_.path===null?"":` ${_.path}`}: ${_.reason}
2526
2530
  `);for(let _ of d)t.stdout.write(`warning: ${_}
2527
2531
  `);t.stdout.write(`Restore ${n?"planned":"replayed"} ${m.files} file(s)${e.describe}: ${n?`${m.wouldWrite} would write`:`${m.written} written`}, ${m.skipped} skipped, ${m.unreplayable} unreplayable, ${m.stitchedFiles} stitched, ${m.unreplayedCalls} unreplayed call(s), ${m.warnings} warning(s).
2528
2532
  `),p&&t.stdout.write(`warning: recovery is incomplete \u2014 see per-file reasons above
2529
- `)}return p?1:0}function iX(t){let e=new Set,n=[];for(let r of t)e.has(r.sessionid)||(e.add(r.sessionid),n.push(r));return n}function pr(t,e,n){return{alias:t.alias,provider:t.provider,sessionId:t.sessionid,status:e,fileOps:n}}function oX(t){let e=[];for(let n=0;n<t.length;n+=1){let{member:r,detail:s}=t[n],i=Jk(s);for(let o=0;o<i.length;o+=1)e.push({op:{...i[o],alias:r.alias,cwd:s.cwd},rosterIndex:n,seq:o})}return e.sort((n,r)=>n.op.timestamp.getTime()-r.op.timestamp.getTime()||n.rosterIndex-r.rosterIndex||n.seq-r.seq),e.map(n=>n.op)}function Jk(t){let e=tX[t.provider]??{},n=Om[t.provider]??{},r=[];for(let s of t.messages){if(s.role!=="tool_use"||s.toolName===void 0)continue;let i=s.toolInputData??yX(s.toolInput);if(i===void 0)continue;let o={timestamp:s.timestamp,callId:s.toolCallId??null,tool:s.toolName},a=e[s.toolName];if(a!==void 0){let c=aX(a,i);c!==null&&r.push({effect:c,source:"structured",...o});continue}if(t.provider==="codex"&&s.toolName==="apply_patch"){r.push(...lX(i,o));continue}let l=n[s.toolName];if(l!==void 0){let c=cX(i[l]);if(c===null)continue;for(let u of Am(c))r.push({effect:u,source:"shell",...o})}}return r}function aX(t,e){let n=kl(e,t.pathKeys);if(n===void 0)return null;if(t.op==="write"){let o=kl(e,t.contentKeys);return o===void 0?null:{kind:"write",path:n,content:o}}let r=kl(e,t.oldKeys),s=kl(e,t.newKeys);if(r===void 0||s===void 0)return null;let i=t.replaceAllKeys.some(o=>e[o]===!0);return{kind:"edit",path:n,oldString:r,newString:s,replaceAll:i}}function lX(t,e){let n=typeof t.input=="string"?t.input:void 0;if(n===void 0)return[];let r=Mk(n);return r===null?[]:r.map(s=>({effect:s.kind==="add"?{kind:"write",path:s.path,content:s.content}:s.kind==="delete"?{kind:"delete",path:s.path,recursive:!1}:{kind:"hunks",path:s.path,hunks:s.hunks,...s.moveTo!==void 0?{moveTo:s.moveTo}:{}},source:"patch",...e}))}function cX(t){if(typeof t=="string")return t;if(!Array.isArray(t)||!t.every(r=>typeof r=="string"))return null;let e=t,n=e.findIndex(r=>/^-[a-z]*c[a-z]*$/.test(r));return n!==-1&&n+1<e.length?e[n+1]:e.some(r=>/[\s'"$`;|&<>()]/.test(r))?null:e.join(" ")}async function dX(t,e){let n=new Map,r=[],s=new Set,i=[],o=(d,f,m)=>{let p=n.get(d);return p===void 0&&(p={state:"unknown",content:null,lastOp:m.timestamp,ops:0,sessionPath:f,sources:new Set,aliases:[]},n.set(d,p)),p.lastOp=m.timestamp,p.ops+=1,p.sources.add(m.source),p.aliases.includes(m.alias)||p.aliases.push(m.alias),p},a=(d,f)=>{let m=hX(d,f.cwd,e.targetDir);if(m.abs!==void 0)return m.abs;if(!s.has(d)){s.add(d);let p=m.reason==="symlink_path";r.push({path:d,sessionPath:d,ops:1,sources:[f.source],aliases:[f.alias],action:p?"unreplayable":"skipped",reason:m.reason,detail:null,sessionMtime:f.timestamp.toISOString(),diskMtime:null})}return null},l=async(d,f)=>{if(d.state==="known")return d.content;if(d.ops>1||!xm(f))return null;try{return await V2(f,"utf8")}catch{return null}},c=(d,f,m)=>{d.state="unknown",d.content=null,d.unknownReason=f,m!==void 0&&(d.unknownDetail=m)};for(let d of t){let f=d.effect;switch(f.kind){case"write":{let m=a(f.path,d);if(m===null)break;let p=o(m,f.path,d);p.state="known",p.content=f.content,delete p.unknownReason,delete p.unknownDetail;break}case"append":{let m=a(f.path,d);if(m===null)break;let p=o(m,f.path,d);if(p.state==="unknown"&&p.ops>1)break;let _=p.state==="deleted"?"":await l(p,m)??"";p.state="known",p.content=_+f.content,delete p.unknownReason,delete p.unknownDetail;break}case"edit":{let m=a(f.path,d);if(m===null)break;let p=o(m,f.path,d);if(p.state==="unknown"&&p.ops>1)break;if(p.state==="deleted"){c(p,"edit_mismatch","edit follows in-session delete");break}let _=await l(p,m);if(_===null){c(p,"edit_base_missing");break}let h=fX(_,f.oldString,f.newString,f.replaceAll);if(h===null){c(p,"edit_mismatch");break}p.state="known",p.content=h;break}case"hunks":{let m=a(f.path,d);if(m===null)break;let p=o(m,f.path,d);if(p.state==="unknown"&&p.ops>1)break;if(p.state==="deleted"){c(p,"patch_context_mismatch","update follows in-session delete");break}let _=await l(p,m);if(_===null){c(p,"edit_base_missing");break}let h=Dk(_,f.hunks);if(h===null){c(p,"patch_context_mismatch");break}if(p.state="known",p.content=h,f.moveTo!==void 0){let g=a(f.moveTo,d);if(g!==null){let w=o(g,f.moveTo,d);w.state="known",w.content=h,p.state="deleted",p.content=null}}break}case"delete":{let m=a(f.path,d);if(m===null)break;let p=o(m,f.path,d);if(p.state="deleted",p.content=null,f.recursive){let _=m.endsWith("/")?m:`${m}/`;for(let[h,g]of n)h.startsWith(_)&&(g.state="deleted",g.content=null,g.lastOp=d.timestamp,g.ops+=1)}break}case"move":case"copy":{let m=a(f.from,d),p=a(f.to,d),_=m===null?void 0:n.get(m);if(p!==null){let h=o(p,f.to,d);_!==void 0&&_.state==="known"?(h.state="known",h.content=_.content,delete h.unknownReason,delete h.unknownDetail):c(h,"move_source_unknown",`${f.kind} source ${f.from} content not tracked in this session`)}if(f.kind==="move"&&m!==null){let h=o(m,f.from,d);h.state="deleted",h.content=null}break}case"touch":{let m=a(f.path,d);if(m===null)break;let p=n.get(m);if(p?.state==="deleted"){let _=o(m,f.path,d);_.state="known",_.content="",delete _.unknownReason,delete _.unknownDetail}else if(p!==void 0)o(m,f.path,d);else if(!xm(m)){let _=o(m,f.path,d);_.state="known",_.content=""}break}case"mutate":{if(f.path===void 0){i.push(`${d.tool} @ ${d.timestamp.toISOString()}: ${f.note}`);for(let _ of n.values())_.state!=="unknown"&&(_.lastOp=d.timestamp,_.ops+=1,_.sources.add(d.source),_.aliases.includes(d.alias)||_.aliases.push(d.alias),c(_,"not_reconstructable",f.note));break}let m=a(f.path,d);if(m===null)break;let p=o(m,f.path,d);c(p,"not_reconstructable",f.note);break}case"opaque":{let m=!1;for(let[p,_]of n)_.state!=="unknown"&&pX(f.tokens,p,_.sessionPath)&&(m=!0,_.lastOp=d.timestamp,_.ops+=1,_.sources.add(d.source),_.aliases.includes(d.alias)||_.aliases.push(d.alias),c(_,"not_reconstructable",`possibly mutated by unrecognized command: ${f.command}`));for(let p of _X(f.tokens)){let _=a(p,d);if(_===null||n.has(_))continue;m=!0;let h=o(_,p,d);c(h,"not_reconstructable",`possibly mutated by unrecognized command: ${f.command}`)}m||i.push(`${d.tool} @ ${d.timestamp.toISOString()}: unrecognized command may mutate files: ${f.command}`);break}}}let u=[...r];for(let[d,f]of n)u.push(await uX(d,f,e));return{files:u,warnings:i}}async function uX(t,e,n){if(n.targetDir!==void 0&&Al(n.targetDir,t))return mr(t,e,"unreplayable","symlink_path",null,"restore target contains a symbolic link");let r=xm(t)?await Z2(t):null,s=r?.mtime??null;if(e.state==="deleted")return mr(t,e,"skipped","deleted_in_session",s,null);if(e.state==="unknown"||e.content===null)return mr(t,e,"unreplayable",e.unknownReason??"not_reconstructable",s,e.unknownDetail??null);let i;if(r===null)i="missing_on_disk";else if(e.lastOp.getTime()>r.mtimeMs)i="session_newer";else if(n.force)i="forced";else return mr(t,e,"skipped","disk_newer_or_equal",s,null);if(n.dryRun)return mr(t,e,"would_write",i,s,null);if(n.targetDir===void 0)await Rm(Rl(t),{recursive:!0}),await Wk(t,e.content,"utf8"),await Uk(t,e.lastOp,e.lastOp);else try{await gX(n.targetDir,t,e.content,e.lastOp)}catch(o){if(o instanceof fn)return mr(t,e,"unreplayable","symlink_path",s,o.message);throw o}return mr(t,e,"written",i,s,null)}function fX(t,e,n,r){return e===""?t===""?n:null:t.includes(e)?r?t.split(e).join(n):t.replace(e,n):null}function mX(t,e,n){let r=new Set(e.map(o=>o.callId).filter(o=>o!==null)),s=yi(t),i=[];for(let o of s.toolCalls)o.kind!=="file_write"&&o.kind!=="file_edit"||o.callId!==null&&r.has(o.callId)||i.push({tool:o.name,alias:n,kind:o.kind,path:o.path??null,callId:o.callId,startedAt:o.startedAt,reason:"content extraction is not supported for this tool call"});return i}function pX(t,e,n){let r=qk(e);for(let s of t)if(s===e||s===n||s.includes(e)||n.length>=3&&s.includes(n)||r.length>=3&&(s===r||s.endsWith(`/${r}`))||r.length>=5&&s.includes(r))return!0;return!1}function _X(t){return[...new Set(t.filter(e=>e===""||e.startsWith("-")||/[$`*?{}();]/.test(e)||/\s/.test(e)?!1:Il(e)||e.includes("/")||/(?:^|\.)[A-Za-z0-9_-]+\.[A-Za-z0-9_-]{1,16}$/.test(e)))]}function hX(t,e,n){if(n===void 0)return Il(t)?{abs:t}:e===""?{reason:"unresolvable_path"}:{abs:mn(e,t)};let r=Il(t)?e===""?void 0:Lm(e,t):t;if(r===void 0)return{reason:"unresolvable_path"};let s=mn(n,r),i=Lm(n,s);return i===""||i.startsWith("..")||Il(i)?{reason:"outside_target"}:Al(n,s)?{reason:"symlink_path"}:{abs:s}}function Al(t,e){let n=e;for(;;){try{if(J2(n).isSymbolicLink())return!0}catch(s){if(s.code!=="ENOENT")throw s}if(n===t)return!1;let r=Rl(n);if(r===n)return!0;n=r}}async function gX(t,e,n,r){try{let l=await bl(t);if(l.isSymbolicLink()||!l.isDirectory())throw new fn(`unsafe restore root: ${t}`)}catch(l){if(l.code!=="ENOENT")throw l;await Rm(t,{recursive:!0});let c=await bl(t);if(c.isSymbolicLink()||!c.isDirectory())throw new fn(`unsafe restore root: ${t}`)}let s=Lm(t,Rl(e)),i=t;for(let l of s===""?[]:s.split(/[\\/]/)){i=mn(i,l);try{let c=await bl(i);if(c.isSymbolicLink()||!c.isDirectory())throw new fn(`unsafe restore parent: ${i}`)}catch(c){if(c.code!=="ENOENT")throw c;await Rm(i);let u=await bl(i);if(u.isSymbolicLink()||!u.isDirectory())throw new fn(`unsafe restore parent: ${i}`)}}if(Al(t,e))throw new fn(`restore target contains a symbolic link: ${e}`);let o=await K2(mn(i,".lmctl-restore-")),a=mn(o,"content.tmp");try{if(await Wk(a,n,{encoding:"utf8",flag:"wx"}),await Uk(a,r,r),Al(t,e))throw new fn(`restore target contains a symbolic link: ${e}`);await Y2(a,e)}finally{await z2(o,{recursive:!0,force:!0})}}function mr(t,e,n,r,s,i){return{path:t,sessionPath:e.sessionPath,ops:e.ops,sources:[...e.sources],aliases:[...e.aliases],action:n,reason:r,detail:i,sessionMtime:e.lastOp.toISOString(),diskMtime:s?.toISOString()??null}}function kl(t,e){for(let n of e){let r=t[n];if(typeof r=="string")return r}}function yX(t){if(t!==void 0)try{let e=JSON.parse(t);return e!==null&&typeof e=="object"&&!Array.isArray(e)?e:void 0}catch{return}}function xl(t){return t instanceof Error?t.message:String(t)}var eX,os,Bk,Nl,Hk,Pk,tX,Om,nX,fn,Kk=E(()=>{"use strict";Rt();mt();Sl();Ok();jk();Re();xt();Yt();eX=2,os=["usage: lmctl restore <teamfile> <alias> [--target <dir>] [--force] [--dry-run] [--single-session] [--json]"," lmctl restore <teamfile>:<alias> [--target <dir>] [--force] [--dry-run] [--single-session] [--json]"," lmctl restore --dir <path> [--recursive] [--target <dir>] [--force] [--dry-run] [--json]","","Replay the file writes/edits recorded in a member's provider session","transcript back onto disk (recover files after the working directory was","lost). Structured Write/Edit tools, shell commands that carry their file","content (heredocs, echo/printf/tee redirects), and codex apply_patch","payloads are all replayed; mutations whose content cannot be reconstructed","are reported as explicit gaps. A recovered file's mtime is set to the","session's write timestamp.","","A file missing on disk is always recovered. An existing file is only","overwritten when the session's write is newer than the disk file's mtime;","--force overwrites regardless. Files the session itself deleted are not","resurrected (and are never deleted on disk by this command).","","Replay is TEAM-AWARE by default: file operations from every seeded member","of the same teamfile are merged into one chronological stream, so a file","created by one alias and edited by another reconstructs correctly no","matter which alias you target. Files whose history needed more than one","member's session are marked as stitched.","","DIRECTORY mode (--dir) needs no teamfile at all: it discovers EVERY","provider session on this machine whose recorded working directory is","<path> (add --recursive to include subdirectories) \u2014 any provider, any","alias, current or superseded \u2014 and merges them all. Use it when a","teamfile's seeded sessions no longer cover the project's full history","(reseeded aliases, or work done before any teamfile existed).",""," --dir <path> target a directory instead of <teamfile> <alias>;"," mutually exclusive with the positional forms."," --recursive with --dir, also merge sessions recorded in"," subdirectories of <path>."," --target <dir> re-root recovered files under <dir> instead of the"," session's original working directory (session paths"," outside that directory are skipped)."," --dry-run report the per-file plan without touching disk."," --single-session replay ONLY the targeted alias's own session (audit"," what that one session alone would have produced)."].join(`
2533
+ `)}return p?1:0}function iX(t){let e=new Set,n=[];for(let r of t)e.has(r.sessionid)||(e.add(r.sessionid),n.push(r));return n}function pr(t,e,n){return{alias:t.alias,provider:t.provider,sessionId:t.sessionid,status:e,fileOps:n}}function oX(t){let e=[];for(let n=0;n<t.length;n+=1){let{member:r,detail:s}=t[n],i=Jk(s);for(let o=0;o<i.length;o+=1)e.push({op:{...i[o],alias:r.alias,cwd:s.cwd},rosterIndex:n,seq:o})}return e.sort((n,r)=>n.op.timestamp.getTime()-r.op.timestamp.getTime()||n.rosterIndex-r.rosterIndex||n.seq-r.seq),e.map(n=>n.op)}function Jk(t){let e=tX[t.provider]??{},n=Om[t.provider]??{},r=[];for(let s of t.messages){if(s.role!=="tool_use"||s.toolName===void 0)continue;let i=s.toolInputData??yX(s.toolInput);if(i===void 0)continue;let o={timestamp:s.timestamp,callId:s.toolCallId??null,tool:s.toolName},a=e[s.toolName];if(a!==void 0){let c=aX(a,i);c!==null&&r.push({effect:c,source:"structured",...o});continue}if(t.provider==="codex"&&s.toolName==="apply_patch"){r.push(...lX(i,o));continue}let l=n[s.toolName];if(l!==void 0){let c=cX(i[l]);if(c===null)continue;for(let u of Am(c))r.push({effect:u,source:"shell",...o})}}return r}function aX(t,e){let n=kl(e,t.pathKeys);if(n===void 0)return null;if(t.op==="write"){let o=kl(e,t.contentKeys);return o===void 0?null:{kind:"write",path:n,content:o}}let r=kl(e,t.oldKeys),s=kl(e,t.newKeys);if(r===void 0||s===void 0)return null;let i=t.replaceAllKeys.some(o=>e[o]===!0);return{kind:"edit",path:n,oldString:r,newString:s,replaceAll:i}}function lX(t,e){let n=typeof t.input=="string"?t.input:void 0;if(n===void 0)return[];let r=Mk(n);return r===null?[]:r.map(s=>({effect:s.kind==="add"?{kind:"write",path:s.path,content:s.content}:s.kind==="delete"?{kind:"delete",path:s.path,recursive:!1}:{kind:"hunks",path:s.path,hunks:s.hunks,...s.moveTo!==void 0?{moveTo:s.moveTo}:{}},source:"patch",...e}))}function cX(t){if(typeof t=="string")return t;if(!Array.isArray(t)||!t.every(r=>typeof r=="string"))return null;let e=t,n=e.findIndex(r=>/^-[a-z]*c[a-z]*$/.test(r));return n!==-1&&n+1<e.length?e[n+1]:e.some(r=>/[\s'"$`;|&<>()]/.test(r))?null:e.join(" ")}async function dX(t,e){let n=new Map,r=[],s=new Set,i=[],o=(d,f,m)=>{let p=n.get(d);return p===void 0&&(p={state:"unknown",content:null,lastOp:m.timestamp,ops:0,sessionPath:f,sources:new Set,aliases:[]},n.set(d,p)),p.lastOp=m.timestamp,p.ops+=1,p.sources.add(m.source),p.aliases.includes(m.alias)||p.aliases.push(m.alias),p},a=(d,f)=>{let m=hX(d,f.cwd,e.targetDir);if(m.abs!==void 0)return m.abs;if(!s.has(d)){s.add(d);let p=m.reason==="symlink_path";r.push({path:d,sessionPath:d,ops:1,sources:[f.source],aliases:[f.alias],action:p?"unreplayable":"skipped",reason:m.reason,detail:null,sessionMtime:f.timestamp.toISOString(),diskMtime:null})}return null},l=async(d,f)=>{if(d.state==="known")return d.content;if(d.ops>1||!xm(f))return null;try{return await V2(f,"utf8")}catch{return null}},c=(d,f,m)=>{d.state="unknown",d.content=null,d.unknownReason=f,m!==void 0&&(d.unknownDetail=m)};for(let d of t){let f=d.effect;switch(f.kind){case"write":{let m=a(f.path,d);if(m===null)break;let p=o(m,f.path,d);p.state="known",p.content=f.content,delete p.unknownReason,delete p.unknownDetail;break}case"append":{let m=a(f.path,d);if(m===null)break;let p=o(m,f.path,d);if(p.state==="unknown"&&p.ops>1)break;let _=p.state==="deleted"?"":await l(p,m)??"";p.state="known",p.content=_+f.content,delete p.unknownReason,delete p.unknownDetail;break}case"edit":{let m=a(f.path,d);if(m===null)break;let p=o(m,f.path,d);if(p.state==="unknown"&&p.ops>1)break;if(p.state==="deleted"){c(p,"edit_mismatch","edit follows in-session delete");break}let _=await l(p,m);if(_===null){c(p,"edit_base_missing");break}let h=fX(_,f.oldString,f.newString,f.replaceAll);if(h===null){c(p,"edit_mismatch");break}p.state="known",p.content=h;break}case"hunks":{let m=a(f.path,d);if(m===null)break;let p=o(m,f.path,d);if(p.state==="unknown"&&p.ops>1)break;if(p.state==="deleted"){c(p,"patch_context_mismatch","update follows in-session delete");break}let _=await l(p,m);if(_===null){c(p,"edit_base_missing");break}let h=Dk(_,f.hunks);if(h===null){c(p,"patch_context_mismatch");break}if(p.state="known",p.content=h,f.moveTo!==void 0){let g=a(f.moveTo,d);if(g!==null){let y=o(g,f.moveTo,d);y.state="known",y.content=h,p.state="deleted",p.content=null}}break}case"delete":{let m=a(f.path,d);if(m===null)break;let p=o(m,f.path,d);if(p.state="deleted",p.content=null,f.recursive){let _=m.endsWith("/")?m:`${m}/`;for(let[h,g]of n)h.startsWith(_)&&(g.state="deleted",g.content=null,g.lastOp=d.timestamp,g.ops+=1)}break}case"move":case"copy":{let m=a(f.from,d),p=a(f.to,d),_=m===null?void 0:n.get(m);if(p!==null){let h=o(p,f.to,d);_!==void 0&&_.state==="known"?(h.state="known",h.content=_.content,delete h.unknownReason,delete h.unknownDetail):c(h,"move_source_unknown",`${f.kind} source ${f.from} content not tracked in this session`)}if(f.kind==="move"&&m!==null){let h=o(m,f.from,d);h.state="deleted",h.content=null}break}case"touch":{let m=a(f.path,d);if(m===null)break;let p=n.get(m);if(p?.state==="deleted"){let _=o(m,f.path,d);_.state="known",_.content="",delete _.unknownReason,delete _.unknownDetail}else if(p!==void 0)o(m,f.path,d);else if(!xm(m)){let _=o(m,f.path,d);_.state="known",_.content=""}break}case"mutate":{if(f.path===void 0){i.push(`${d.tool} @ ${d.timestamp.toISOString()}: ${f.note}`);for(let _ of n.values())_.state!=="unknown"&&(_.lastOp=d.timestamp,_.ops+=1,_.sources.add(d.source),_.aliases.includes(d.alias)||_.aliases.push(d.alias),c(_,"not_reconstructable",f.note));break}let m=a(f.path,d);if(m===null)break;let p=o(m,f.path,d);c(p,"not_reconstructable",f.note);break}case"opaque":{let m=!1;for(let[p,_]of n)_.state!=="unknown"&&pX(f.tokens,p,_.sessionPath)&&(m=!0,_.lastOp=d.timestamp,_.ops+=1,_.sources.add(d.source),_.aliases.includes(d.alias)||_.aliases.push(d.alias),c(_,"not_reconstructable",`possibly mutated by unrecognized command: ${f.command}`));for(let p of _X(f.tokens)){let _=a(p,d);if(_===null||n.has(_))continue;m=!0;let h=o(_,p,d);c(h,"not_reconstructable",`possibly mutated by unrecognized command: ${f.command}`)}m||i.push(`${d.tool} @ ${d.timestamp.toISOString()}: unrecognized command may mutate files: ${f.command}`);break}}}let u=[...r];for(let[d,f]of n)u.push(await uX(d,f,e));return{files:u,warnings:i}}async function uX(t,e,n){if(n.targetDir!==void 0&&Al(n.targetDir,t))return mr(t,e,"unreplayable","symlink_path",null,"restore target contains a symbolic link");let r=xm(t)?await Z2(t):null,s=r?.mtime??null;if(e.state==="deleted")return mr(t,e,"skipped","deleted_in_session",s,null);if(e.state==="unknown"||e.content===null)return mr(t,e,"unreplayable",e.unknownReason??"not_reconstructable",s,e.unknownDetail??null);let i;if(r===null)i="missing_on_disk";else if(e.lastOp.getTime()>r.mtimeMs)i="session_newer";else if(n.force)i="forced";else return mr(t,e,"skipped","disk_newer_or_equal",s,null);if(n.dryRun)return mr(t,e,"would_write",i,s,null);if(n.targetDir===void 0)await Rm(Rl(t),{recursive:!0}),await Wk(t,e.content,"utf8"),await Uk(t,e.lastOp,e.lastOp);else try{await gX(n.targetDir,t,e.content,e.lastOp)}catch(o){if(o instanceof fn)return mr(t,e,"unreplayable","symlink_path",s,o.message);throw o}return mr(t,e,"written",i,s,null)}function fX(t,e,n,r){return e===""?t===""?n:null:t.includes(e)?r?t.split(e).join(n):t.replace(e,n):null}function mX(t,e,n){let r=new Set(e.map(o=>o.callId).filter(o=>o!==null)),s=yi(t),i=[];for(let o of s.toolCalls)o.kind!=="file_write"&&o.kind!=="file_edit"||o.callId!==null&&r.has(o.callId)||i.push({tool:o.name,alias:n,kind:o.kind,path:o.path??null,callId:o.callId,startedAt:o.startedAt,reason:"content extraction is not supported for this tool call"});return i}function pX(t,e,n){let r=qk(e);for(let s of t)if(s===e||s===n||s.includes(e)||n.length>=3&&s.includes(n)||r.length>=3&&(s===r||s.endsWith(`/${r}`))||r.length>=5&&s.includes(r))return!0;return!1}function _X(t){return[...new Set(t.filter(e=>e===""||e.startsWith("-")||/[$`*?{}();]/.test(e)||/\s/.test(e)?!1:Il(e)||e.includes("/")||/(?:^|\.)[A-Za-z0-9_-]+\.[A-Za-z0-9_-]{1,16}$/.test(e)))]}function hX(t,e,n){if(n===void 0)return Il(t)?{abs:t}:e===""?{reason:"unresolvable_path"}:{abs:mn(e,t)};let r=Il(t)?e===""?void 0:Lm(e,t):t;if(r===void 0)return{reason:"unresolvable_path"};let s=mn(n,r),i=Lm(n,s);return i===""||i.startsWith("..")||Il(i)?{reason:"outside_target"}:Al(n,s)?{reason:"symlink_path"}:{abs:s}}function Al(t,e){let n=e;for(;;){try{if(J2(n).isSymbolicLink())return!0}catch(s){if(s.code!=="ENOENT")throw s}if(n===t)return!1;let r=Rl(n);if(r===n)return!0;n=r}}async function gX(t,e,n,r){try{let l=await bl(t);if(l.isSymbolicLink()||!l.isDirectory())throw new fn(`unsafe restore root: ${t}`)}catch(l){if(l.code!=="ENOENT")throw l;await Rm(t,{recursive:!0});let c=await bl(t);if(c.isSymbolicLink()||!c.isDirectory())throw new fn(`unsafe restore root: ${t}`)}let s=Lm(t,Rl(e)),i=t;for(let l of s===""?[]:s.split(/[\\/]/)){i=mn(i,l);try{let c=await bl(i);if(c.isSymbolicLink()||!c.isDirectory())throw new fn(`unsafe restore parent: ${i}`)}catch(c){if(c.code!=="ENOENT")throw c;await Rm(i);let u=await bl(i);if(u.isSymbolicLink()||!u.isDirectory())throw new fn(`unsafe restore parent: ${i}`)}}if(Al(t,e))throw new fn(`restore target contains a symbolic link: ${e}`);let o=await K2(mn(i,".lmctl-restore-")),a=mn(o,"content.tmp");try{if(await Wk(a,n,{encoding:"utf8",flag:"wx"}),await Uk(a,r,r),Al(t,e))throw new fn(`restore target contains a symbolic link: ${e}`);await Y2(a,e)}finally{await z2(o,{recursive:!0,force:!0})}}function mr(t,e,n,r,s,i){return{path:t,sessionPath:e.sessionPath,ops:e.ops,sources:[...e.sources],aliases:[...e.aliases],action:n,reason:r,detail:i,sessionMtime:e.lastOp.toISOString(),diskMtime:s?.toISOString()??null}}function kl(t,e){for(let n of e){let r=t[n];if(typeof r=="string")return r}}function yX(t){if(t!==void 0)try{let e=JSON.parse(t);return e!==null&&typeof e=="object"&&!Array.isArray(e)?e:void 0}catch{return}}function xl(t){return t instanceof Error?t.message:String(t)}var eX,os,Bk,Nl,Hk,Pk,tX,Om,nX,fn,Kk=E(()=>{"use strict";Rt();mt();Sl();Ok();jk();Re();xt();Yt();eX=2,os=["usage: lmctl restore <teamfile> <alias> [--target <dir>] [--force] [--dry-run] [--single-session] [--json]"," lmctl restore <teamfile>:<alias> [--target <dir>] [--force] [--dry-run] [--single-session] [--json]"," lmctl restore --dir <path> [--recursive] [--target <dir>] [--force] [--dry-run] [--json]","","Replay the file writes/edits recorded in a member's provider session","transcript back onto disk (recover files after the working directory was","lost). Structured Write/Edit tools, shell commands that carry their file","content (heredocs, echo/printf/tee redirects), and codex apply_patch","payloads are all replayed; mutations whose content cannot be reconstructed","are reported as explicit gaps. A recovered file's mtime is set to the","session's write timestamp.","","A file missing on disk is always recovered. An existing file is only","overwritten when the session's write is newer than the disk file's mtime;","--force overwrites regardless. Files the session itself deleted are not","resurrected (and are never deleted on disk by this command).","","Replay is TEAM-AWARE by default: file operations from every seeded member","of the same teamfile are merged into one chronological stream, so a file","created by one alias and edited by another reconstructs correctly no","matter which alias you target. Files whose history needed more than one","member's session are marked as stitched.","","DIRECTORY mode (--dir) needs no teamfile at all: it discovers EVERY","provider session on this machine whose recorded working directory is","<path> (add --recursive to include subdirectories) \u2014 any provider, any","alias, current or superseded \u2014 and merges them all. Use it when a","teamfile's seeded sessions no longer cover the project's full history","(reseeded aliases, or work done before any teamfile existed).",""," --dir <path> target a directory instead of <teamfile> <alias>;"," mutually exclusive with the positional forms."," --recursive with --dir, also merge sessions recorded in"," subdirectories of <path>."," --target <dir> re-root recovered files under <dir> instead of the"," session's original working directory (session paths"," outside that directory are skipped)."," --dry-run report the per-file plan without touching disk."," --single-session replay ONLY the targeted alias's own session (audit"," what that one session alone would have produced)."].join(`
2530
2534
  `),Bk={claude:"full",kimi:"full",dsh:"partial",opencode:"full",lmplayer:"full",codex:"partial",agy:"partial",gemini:"none",copilot:"none",qwen:"none",ClaudeMock:"none"},Nl={codex:"apply_patch replays from the raw payload (Add/Delete/Move exact, Update context-based); calls without a preserved payload become unreplayed calls",agy:"write_to_file content replays; replace_file_content edit chunks are not replayed",dsh:"write replays exactly (file_path+content preserved in tool/call); no edit-type tool observed in real sessions",gemini:"this provider reader exposes no structured file tools",copilot:"this provider reader exposes no structured file tools",qwen:"this provider reader exposes no structured file tools",ClaudeMock:"this provider reader exposes no structured file tools"},Hk="shell reconstruction is best-effort from command text; programmatic file writes (interpreters, unknown tools) are not detectable from transcripts",Pk={write:{op:"write",pathKeys:["filePath","path","file"],contentKeys:["content"]},edit:{op:"edit",pathKeys:["filePath","path","file"],oldKeys:["oldString"],newKeys:["newString"],replaceAllKeys:["replaceAll"]}},tX={claude:{Write:{op:"write",pathKeys:["file_path"],contentKeys:["content"]},Edit:{op:"edit",pathKeys:["file_path"],oldKeys:["old_string"],newKeys:["new_string"],replaceAllKeys:["replace_all"]}},dsh:{write:{op:"write",pathKeys:["file_path"],contentKeys:["content"]}},kimi:{Write:{op:"write",pathKeys:["path"],contentKeys:["content"]},Edit:{op:"edit",pathKeys:["path"],oldKeys:["old_string"],newKeys:["new_string"],replaceAllKeys:["replace_all"]}},opencode:Pk,lmplayer:Pk,agy:{write_to_file:{op:"write",pathKeys:["TargetFile"],contentKeys:["CodeContent"]}}},Om={claude:{Bash:"command"},kimi:{Bash:"command"},dsh:{bash:"command"},opencode:{bash:"command"},lmplayer:{bash:"command"},codex:{exec_command:"cmd"},copilot:{bash:"command"},qwen:{run_shell_command:"command"},agy:{run_command:"CommandLine"}},nX={loadSession:Ce,resolveTeamTarget:(t,e,n)=>O(n,r=>He(t,e,r)),resolveTeamRoster:(t,e)=>O(e,n=>{let r=Te(t,n),s=rt(r,n);if(s.parseErrors.length>0)return[];let i=[];for(let o of s.members)try{i.push(He(t,o.alias,n))}catch{}return i}),discoverSessions:()=>Qn({})};fn=class extends Error{}});var Ei,Mse,Cm=E(()=>{"use strict";Ei=[{name:"lmctl_chat",description:"Synchronous/blocking backup: send one prompt to a member of an AI-managed .lmctl team \u2014 addressed by teamfile path (team) and alias \u2014 and return the reply. This is the only MCP tool lmctl exposes. Prefer the CLI for normal delegation. For async or long-running work, use the provider or host runtime background/task surface around the blocking command.",inputSchema:{type:"object",properties:{team:{type:"string",description:"Path to .lmctl teamfile"},alias:{type:"string",description:"Target alias; omitted means Lead"},prompt:{type:"string",description:"Prompt text to send"}},required:["team","prompt"]},local:!0}],Mse=Ei.length});import{spawn as wX}from"node:child_process";async function Yk(t,e,n){let r=TX.get(t);if(r===void 0)return{status:"error",code:404,message:`unknown tool: ${t}`};let s=e!==null&&typeof e=="object"&&!Array.isArray(e)?e:{};for(let i of r.inputSchema.required??[])if(s[i]===void 0)return{status:"error",code:400,message:`missing required parameter: ${i}`};return SX(r.name,s)}function SX(t,e){return t==="lmctl_chat"?vX(e):{status:"error",code:404,message:`unknown local tool: ${t}`}}function vX(t){let e=typeof t.prompt=="string"?t.prompt:"";if(e.length===0)return Promise.resolve({status:"error",code:400,message:"missing required parameter: prompt"});let n=typeof t.team=="string"?t.team:"";if(n.length===0)return Promise.resolve({status:"error",code:400,message:"missing required parameter: team"});let r=typeof t.alias=="string"&&t.alias.length>0?t.alias:"Lead",s=["chat",n,r,e];return ce()&&$e(JSON.stringify({event:"mcp_chat_spawn",team:n,alias:r})),bX(s,process.cwd())}function bX(t,e){return new Promise(n=>{let r=!1,s,i=u=>{r||(r=!0,s!==void 0&&clearTimeout(s),n(u))},o=wX("lmctl",t,{cwd:e,env:process.env,stdio:["ignore","pipe","pipe"]}),a=kX(process.env);s=setTimeout(()=>{try{o.kill("SIGTERM")}catch{}i({status:"error",code:124,message:`lmctl chat timed out after ${a}ms`})},a),s.unref?.();let l="",c="";o.stdout?.on("data",u=>{l+=u.toString("utf8")}),o.stderr?.on("data",u=>{c+=u.toString("utf8")}),o.on("error",u=>{i({status:"error",code:1,message:`failed to spawn lmctl chat: ${u.message}`})}),o.on("exit",u=>{if(u===0){ce()&&$e(JSON.stringify({event:"mcp_chat_payload",bytes:Buffer.byteLength(l,"utf8"),lines:l.split(`
2531
2535
  `).length})),i({status:"ok",data:{text:l.trim()||"(empty response)"}});return}i({status:"error",code:u??1,message:c.trim()||`lmctl chat exited with code ${u}`})})})}function kX(t){let e=t.LMCTL_MCP_CHAT_TIMEOUT_MS;if(e===void 0||e.trim().length===0)return Vk;let n=Number(e);return!Number.isFinite(n)||n<=0?Vk:n}function $m(t,e=process.env){let r=t.getConfig("api.url")??(e.LMCTL_API_URL!==void 0&&e.LMCTL_API_URL.length>0?e.LMCTL_API_URL:EX),s=t.getConfig("api.token"),i=e.LMCTL_API_TOKEN!==void 0&&e.LMCTL_API_TOKEN.length>0?e.LMCTL_API_TOKEN:s;return{baseUrl:r,token:i}}var EX,Vk,TX,Mm=E(()=>{"use strict";Cm();de();EX="http://127.0.0.1:8787",Vk=30*60*1e3,TX=new Map(Ei.map(t=>[t.name,t]))});async function xX(t,e){let n=t.id===void 0,r=t.id??null;if(t.method==="exit")return n||e.io.write(Dm({jsonrpc:"2.0",id:r,result:null})),{kind:"exit"};if(t.method==="initialize")return{kind:"response",message:{jsonrpc:"2.0",id:r,result:{protocolVersion:IX,capabilities:{tools:{listChanged:!1}},serverInfo:{name:NX,version:AX}}}};if(t.method==="notifications/initialized")return{kind:"notification"};if(t.method==="shutdown")return{kind:"response",message:{jsonrpc:"2.0",id:r,result:null}};if(t.method==="tools/list")return{kind:"response",message:{jsonrpc:"2.0",id:r,result:{tools:Ei.map(s=>({name:s.name,description:s.description,inputSchema:s.inputSchema}))}}};if(t.method==="tools/call"){let s=t.params!==null&&typeof t.params=="object"?t.params:{},i=typeof s.name=="string"?s.name:"",o=s.arguments,a=await Yk(i,o,e.dispatch),l=i==="lmctl_chat"&&a.status==="ok"&&a.data!==null&&typeof a.data=="object"&&typeof a.data.text=="string"?a.data.text:JSON.stringify(a);return{kind:"response",message:{jsonrpc:"2.0",id:r,result:{isError:a.status==="error",content:[{type:"text",text:l}]}}}}return n?{kind:"notification"}:{kind:"response",message:{jsonrpc:"2.0",id:r,error:{code:-32601,message:`method not found: ${t.method}`}}}}function Dm(t){return`${JSON.stringify(t)}
2532
2536
  `}async function zk(t,e){let n=!1,r="",s=!1,i=async o=>{let a=o.trim();if(a.length===0)return;let l;try{l=JSON.parse(a)}catch(u){t.io.write(Dm({jsonrpc:"2.0",id:null,error:{code:-32700,message:`parse error: ${u instanceof Error?u.message:String(u)}`}}));return}l.method==="shutdown"&&(n=!0);let c=await xX(l,t);c.kind==="response"?t.io.write(Dm(c.message)):c.kind==="exit"&&(s=!0)};return new Promise(o=>{let a=Promise.resolve(),l=!1,c=d=>{l||(l=!0,o(d))},u=()=>{let d=r.indexOf(`
@@ -2863,9 +2867,9 @@ Don't dump all of durable-memory into your context. The pattern is index-first,
2863
2867
  `)}return 0}function CG(t,e,n){let r=z(t,["--alias","--provider","--model","--role","--sessiondir"]);if(r.error!==void 0)return I(e,r.error);let[s]=r.positionals;if(s===void 0)return I(e,"usage: team add-member <team-name> --alias A --provider P [--model M] [--role R] [--sessiondir D]");let i=n.findTeamByName(s);if(i===null)return I(e,`team not found: ${s}`);let o=$(r,"--alias"),a=$(r,"--provider");if(o===void 0||a===void 0)return I(e,"team add-member requires --alias and --provider");let l=n.insertTeamMember({team_id:i.id,alias:o,provider:a,model:$(r,"--model")??null,role:$(r,"--role")??"agent",sessiondir:$(r,"--sessiondir")??IG(Ci(),"sessions",i.name,o)});return B(r,"--json")?K(e,l):e.stdout.write(`added member ${l.alias} to ${i.name}
2864
2868
  `),0}async function PI(t,e,n,r){let s=z(t,["--alias"]);if(s.error!==void 0)return I(e,s.error);let[i]=s.positionals;if(i===void 0)return I(e,r?"usage: team refresh <team-name> --alias A":"usage: team seed <team-name> [--alias A]");let o=n.findTeamByName(i);if(o===null)return I(e,`team not found: ${i}`);let a=$(s,"--alias");if(r&&a===void 0)return I(e,"team refresh requires --alias");if(r&&a!==void 0&&a.trim().toLowerCase()==="lead")return I(e,"cannot refresh Lead \u2014 refresh is only for non-Lead members");let l=$G(n.listTeamMembers(o.id),a,r);if(a!==void 0&&l.length===0)return I(e,`member not found or already seeded: ${a}`);if(r&&l.some(m=>m.alias.toLowerCase()==="lead"||m.role==="lead"))return I(e,"cannot refresh Lead \u2014 refresh is only for non-Lead members");let c=n.listProjects().filter(m=>m.team_id===o.id),u=new Set;for(let m of c){if(u.has(m.workflow_name))continue;u.add(m.workflow_name);let p=n.getWorkflowByName(m.workflow_name);if(p===null)continue;let _=iT(m.workflow_name,p.definition);if(_.status==="FAIL")return I(e,`cannot seed team \`${o.name}\`: workflow \`${m.workflow_name}\` failed verify-at-seed \u2014 ${_.note}. Fix the workflow and retry; NO members were seeded (no side-effects).`)}for(let m of c)SI(m,n);let d=[],f=!1;for(let m of l){let p=await Co({member:m,dal:n}),_=n.updateTeamMemberSession(m.id,p.sessionid);if(_!==null){let h=_.role_prompt??"",g=h.length>0?`${h}
2865
2869
 
2866
- ${Jm}`:Jm;n.setMemberPromptSnapshot(m.id,g),d.push(_);let w=yl(Qe(_),p.sessionid);w!==null&&e.stderr.write(`[seeded ${_.alias}] customize/compact in its native TUI:
2867
- ${w}
2868
- `);try{await MI({dal:n,member:_,stderr:e.stderr})}catch(y){f=!0,e.stderr.write(`error: ${y instanceof Error?y.message:String(y)}
2870
+ ${Jm}`:Jm;n.setMemberPromptSnapshot(m.id,g),d.push(_);let y=yl(Qe(_),p.sessionid);y!==null&&e.stderr.write(`[seeded ${_.alias}] customize/compact in its native TUI:
2871
+ ${y}
2872
+ `);try{await MI({dal:n,member:_,stderr:e.stderr})}catch(w){f=!0,e.stderr.write(`error: ${w instanceof Error?w.message:String(w)}
2869
2873
  `)}}}return B(s,"--json")?K(e,d):e.stdout.write(`seeded ${d.length} member(s)
2870
2874
  `),f?1:0}function $G(t,e,n){return t.filter(r=>e!==void 0&&r.alias!==e?!1:n||r.sessionid===null)}function MG(t,e,n){let r=z(t,["--interpreter","--of"]);if(r.error!==void 0)return I(e,r.error);let[s]=r.positionals;if(s===void 0)return I(e,"usage: team companion <team-name> --interpreter A --of B[,C]");let i=n.findTeamByName(s);if(i===null)return I(e,`team not found: ${s}`);let o=$(r,"--interpreter"),a=$(r,"--of")?.split(",").map(c=>c.trim()).filter(Boolean);if(o===void 0||a===void 0||a.length===0)return I(e,"team companion requires --interpreter and --of");let l=n.findTeamMemberByAlias(i.id,o);if(l===null)return I(e,`member not found: ${o}`);for(let c of a){let u=n.findTeamMemberByAlias(i.id,c);if(u===null)return I(e,`member not found: ${c}`);n.insertTeamMemberCompanion({interpreter_id:l.id,companion_id:u.id})}return e.stdout.write(`recorded ${a.length} companion link(s)
2871
2875
  `),0}var NG,UI=E(()=>{"use strict";Ue();Yd();bI();dt();Rt();DI();Na();Re();jI();NG=`usage: lmctl team create <name>
@@ -2881,8 +2885,8 @@ Manage DB-backed teams, members, and provider session lifecycle. Use seed or
2881
2885
  refresh to create/update native provider sessions for team members.
2882
2886
  team refresh rejects Lead members (alias matching is case-insensitive).
2883
2887
  `});var KI={};ae(KI,{applyMaxBytes:()=>Cl,parseTailSince:()=>JI,renderMessage:()=>XI,runTail:()=>UG});async function UG(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(`${FG}
2884
- `),0;let n=z(t,["--lines","--max-bytes","--watch-interval","--provider","--session","--run","--since"],["--watch","--help"]);if(n.error!==void 0)return I(e,n.error);let r=$(n,"--since"),s=JI(r);if("error"in s)return I(e,s.error);let i=s.date,o=$(n,"--lines"),a=$(n,"--max-bytes");if(o!==void 0&&a!==void 0)return I(e,"--lines and --max-bytes are mutually exclusive (choose one)");let l;if(o!==void 0){let h=Number.parseInt(o,10);if(!Number.isFinite(h)||h<1||String(h)!==o)return I(e,`invalid --lines "${o}" (expected a positive integer)`);l={kind:"lines",lines:h}}else{let h=a===void 0?jG:Number.parseInt(a,10);if(!Number.isFinite(h)||h<0||a!==void 0&&String(h)!==a)return I(e,`invalid --max-bytes "${a}" (expected a non-negative integer)`);l={kind:"bytes",maxBytes:h}}let c=B(n,"--watch"),u=$(n,"--watch-interval"),d=u===void 0?PG:Number.parseInt(u.replace(/s$/,""),10);if(!Number.isFinite(d)||d<1)return I(e,`invalid --watch-interval "${u}" (expected <N>s, N\u22651)`);if(n.positionals.length>2)return I(e,`too many positionals (${n.positionals.length}); expected [target] [alias]`);let f=$(n,"--run");if(f!==void 0){if(n.positionals.length>0)return I(e,"--run is mutually exclusive with positional [target] [alias]");if($(n,"--session")!==void 0)return I(e,"--run is mutually exclusive with --session");if($(n,"--provider")!==void 0)return I(e,"--run is mutually exclusive with --provider");let h=Number.parseInt(f,10);if(!Number.isFinite(h)||h<=0||String(h)!==f)return I(e,`invalid --run "${f}" (expected a positive integer run id)`);try{return await O(e,async g=>WG(e,g,h,l,c,d,i))}catch(g){return Pe(e,g)}}let m=zt(DG,{target:n.positionals[0],alias:n.positionals[1],flags:{session:$(n,"--session"),provider:$(n,"--provider")}});if(m.mode==="error")return I(e,m.message);if(m.mode==="managed")return I(e,"tail managed mode requires --run <id>");let p;if(m.mode==="ai-team")if(m.alias===void 0){let h;try{h=await O(e,y=>Te(m.teamfile,y))}catch(y){return I(e,`tail: ${y instanceof Error?y.message:String(y)}`)}let g;try{g=je(h)}catch(y){return I(e,`tail: ${y instanceof Error?y.message:String(y)}`)}let w=ht(g);if(w===void 0)return I(e,`tail: ${m.teamfile} has no Lead member; pass <tf>:<alias>`);try{let y=await O(e,S=>He(m.teamfile,w.alias,S));p={provider:y.provider,sessionId:y.sessionid,cwd:y.sessiondir}}catch(y){return y instanceof ke?I(e,y.message):Pe(e,y)}}else try{let h=await O(e,g=>He(m.teamfile,m.alias,g));p={provider:h.provider,sessionId:h.sessionid,cwd:h.sessiondir}}catch(h){return h instanceof ke?I(e,h.message):Pe(e,h)}else{let h=m.sessionid,g=m.provider;if(g===void 0){let w=await Pn(h);if(w.length===0)return I(e,`tail: session "${h}" not found in any provider store`);if(w.length>1)return I(e,`tail: session "${h}" matches multiple providers (${w.join(", ")}); pass --provider`);g=w[0]}p={provider:g,sessionId:h}}let _=await WI(e,p.provider,p.sessionId,l,-1,i);return _<0?1:c?await new Promise(h=>{let g=async()=>{try{let S=await WI(e,p.provider,p.sessionId,l,_,i);S>=0&&(_=S)}catch(S){e.stderr.write(`tail: ${S instanceof Error?S.message:String(S)}
2885
- `)}},w=setInterval(()=>{g()},d*1e3),y=()=>{clearInterval(w),h(0)};process.once("SIGINT",y),process.once("SIGTERM",y)}):0}async function WI(t,e,n,r,s,i){let o;try{o=await Ce(n,e)}catch(u){return t.stderr.write(`tail: failed to load session: ${u instanceof Error?u.message:String(u)}
2888
+ `),0;let n=z(t,["--lines","--max-bytes","--watch-interval","--provider","--session","--run","--since"],["--watch","--help"]);if(n.error!==void 0)return I(e,n.error);let r=$(n,"--since"),s=JI(r);if("error"in s)return I(e,s.error);let i=s.date,o=$(n,"--lines"),a=$(n,"--max-bytes");if(o!==void 0&&a!==void 0)return I(e,"--lines and --max-bytes are mutually exclusive (choose one)");let l;if(o!==void 0){let h=Number.parseInt(o,10);if(!Number.isFinite(h)||h<1||String(h)!==o)return I(e,`invalid --lines "${o}" (expected a positive integer)`);l={kind:"lines",lines:h}}else{let h=a===void 0?jG:Number.parseInt(a,10);if(!Number.isFinite(h)||h<0||a!==void 0&&String(h)!==a)return I(e,`invalid --max-bytes "${a}" (expected a non-negative integer)`);l={kind:"bytes",maxBytes:h}}let c=B(n,"--watch"),u=$(n,"--watch-interval"),d=u===void 0?PG:Number.parseInt(u.replace(/s$/,""),10);if(!Number.isFinite(d)||d<1)return I(e,`invalid --watch-interval "${u}" (expected <N>s, N\u22651)`);if(n.positionals.length>2)return I(e,`too many positionals (${n.positionals.length}); expected [target] [alias]`);let f=$(n,"--run");if(f!==void 0){if(n.positionals.length>0)return I(e,"--run is mutually exclusive with positional [target] [alias]");if($(n,"--session")!==void 0)return I(e,"--run is mutually exclusive with --session");if($(n,"--provider")!==void 0)return I(e,"--run is mutually exclusive with --provider");let h=Number.parseInt(f,10);if(!Number.isFinite(h)||h<=0||String(h)!==f)return I(e,`invalid --run "${f}" (expected a positive integer run id)`);try{return await O(e,async g=>WG(e,g,h,l,c,d,i))}catch(g){return Pe(e,g)}}let m=zt(DG,{target:n.positionals[0],alias:n.positionals[1],flags:{session:$(n,"--session"),provider:$(n,"--provider")}});if(m.mode==="error")return I(e,m.message);if(m.mode==="managed")return I(e,"tail managed mode requires --run <id>");let p;if(m.mode==="ai-team")if(m.alias===void 0){let h;try{h=await O(e,w=>Te(m.teamfile,w))}catch(w){return I(e,`tail: ${w instanceof Error?w.message:String(w)}`)}let g;try{g=je(h)}catch(w){return I(e,`tail: ${w instanceof Error?w.message:String(w)}`)}let y=ht(g);if(y===void 0)return I(e,`tail: ${m.teamfile} has no Lead member; pass <tf>:<alias>`);try{let w=await O(e,S=>He(m.teamfile,y.alias,S));p={provider:w.provider,sessionId:w.sessionid,cwd:w.sessiondir}}catch(w){return w instanceof ke?I(e,w.message):Pe(e,w)}}else try{let h=await O(e,g=>He(m.teamfile,m.alias,g));p={provider:h.provider,sessionId:h.sessionid,cwd:h.sessiondir}}catch(h){return h instanceof ke?I(e,h.message):Pe(e,h)}else{let h=m.sessionid,g=m.provider;if(g===void 0){let y=await Pn(h);if(y.length===0)return I(e,`tail: session "${h}" not found in any provider store`);if(y.length>1)return I(e,`tail: session "${h}" matches multiple providers (${y.join(", ")}); pass --provider`);g=y[0]}p={provider:g,sessionId:h}}let _=await WI(e,p.provider,p.sessionId,l,-1,i);return _<0?1:c?await new Promise(h=>{let g=async()=>{try{let S=await WI(e,p.provider,p.sessionId,l,_,i);S>=0&&(_=S)}catch(S){e.stderr.write(`tail: ${S instanceof Error?S.message:String(S)}
2889
+ `)}},y=setInterval(()=>{g()},d*1e3),w=()=>{clearInterval(y),h(0)};process.once("SIGINT",w),process.once("SIGTERM",w)}):0}async function WI(t,e,n,r,s,i){let o;try{o=await Ce(n,e)}catch(u){return t.stderr.write(`tail: failed to load session: ${u instanceof Error?u.message:String(u)}
2886
2890
  `),-1}if(o===null)return t.stderr.write(`tail: session not found: ${n} (provider=${e})
2887
2891
  `),-1;let a=o.messages??[],l=s<0&&r.kind==="lines"?Math.max(0,a.length-r.lines):s+1;if(s<0&&i!==void 0){let u=i.getTime(),d=a.length;for(let f=0;f<a.length;f+=1){let m=a[f].timestamp,p=m===void 0?NaN:(m instanceof Date?m:new Date(m)).getTime();if(!Number.isNaN(p)&&p>=u){d=f;break}}l=Math.max(l,d)}if(l>=a.length)return a.length-1;let c="";for(let u=l;u<a.length;u+=1)c+=`${XI(a[u])}
2888
2892
  `;return t.stdout.write(r.kind==="bytes"?Cl(c,r.maxBytes):c),a.length-1}function XI(t){let e=GI(t.timestamp),n=e?`${e} ${t.role}`:t.role,s=(t.content??"").replace(/\r\n/g,`
@@ -2891,8 +2895,8 @@ team refresh rejects Lead members (alias matching is case-insensitive).
2891
2895
  `),i=s[0]??"",o=s.slice(1);return o.length===0?`${n}: ${i}`:`${n}: ${i}
2892
2896
  ${o.map(a=>` ${a}`).join(`
2893
2897
  `)}`}async function WG(t,e,n,r,s,i,o){if(e.getRun(n)===null)return I(t,`tail: run ${n}: not found`);let l=o===void 0?e.listSessionEvents(n):e.listSessionEvents(n).filter(f=>f.timestamp_ms>=o.getTime()),u=(r.kind==="lines"?l.slice(Math.max(0,l.length-r.lines)):l).map(f=>`${HI(f)}
2894
- `).join("");t.stdout.write(r.kind==="bytes"?Cl(u,r.maxBytes):u);let d=l.length>0?l[l.length-1].id:0;return s?await new Promise(f=>{let p=setInterval(()=>{try{let h=e.listSessionEvents(n,d),g="";for(let w of h)g+=`${HI(w)}
2895
- `,d=w.id;g.length>0&&t.stdout.write(r.kind==="bytes"?Cl(g,r.maxBytes):g)}catch(h){t.stderr.write(`tail: ${h instanceof Error?h.message:String(h)}
2898
+ `).join("");t.stdout.write(r.kind==="bytes"?Cl(u,r.maxBytes):u);let d=l.length>0?l[l.length-1].id:0;return s?await new Promise(f=>{let p=setInterval(()=>{try{let h=e.listSessionEvents(n,d),g="";for(let y of h)g+=`${HI(y)}
2899
+ `,d=y.id;g.length>0&&t.stdout.write(r.kind==="bytes"?Cl(g,r.maxBytes):g)}catch(h){t.stderr.write(`tail: ${h instanceof Error?h.message:String(h)}
2896
2900
  `)}},i*1e3),_=()=>{clearInterval(p),f(0)};process.once("SIGINT",_),process.once("SIGTERM",_)}):0}function Cl(t,e){if(e===0||Buffer.byteLength(t,"utf8")<=e)return t;let r=Buffer.byteLength(qI,"utf8");if(r>=e)return BI(t,e);let s=e-r,i=BI(t,s);return`${qI}${i}`}function BI(t,e){if(e<=0)return"";let n=Buffer.from(t,"utf8"),r=Math.max(0,n.length-e);for(;r<n.length&&(n[r]&192)===128;)r+=1;return n.subarray(r).toString("utf8")}function HI(t){let e=GI(new Date(t.timestamp_ms))??"",n="";try{let i=JSON.parse(t.payload);typeof i.alias=="string"&&(n=`alias=${i.alias}`),typeof i.provider=="string"&&(n+=`${n?" ":""}provider=${i.provider}`),typeof i.tool=="string"&&(n+=`${n?" ":""}tool=${i.tool}`),typeof i.status=="string"&&(n+=`${n?" ":""}status=${i.status}`),(typeof i.tokens_in=="number"||typeof i.tokens_out=="number")&&(n+=`${n?" ":""}tokens=${i.tokens_in??0}/${i.tokens_out??0}`)}catch{}let r=n!==""?n:t.payload.slice(0,200),s=t.step_id===null?"":` step=${t.step_id}`;return`${e} ${t.kind}${s}: ${r}`}function JI(t){return hi(t,"--since")}function GI(t){if(t===void 0)return;let e=t instanceof Date?t:new Date(t);if(Number.isNaN(e.getTime()))return;let n=r=>String(r).padStart(2,"0");return`${e.getFullYear()}-${n(e.getMonth()+1)}-${n(e.getDate())} ${n(e.getHours())}:${n(e.getMinutes())}:${n(e.getSeconds())}`}var DG,jG,PG,FG,qI,VI=E(()=>{"use strict";Rt();Re();xt();Kt();Yt();km();DG={name:"tail",allowsBareTeamfile:!0,supportsRaw:!0},jG=4096,PG=2,FG=`usage: lmctl tail [target] [alias]
2897
2901
  lmctl tail --session <id> [--provider <name>]
2898
2902
  lmctl tail --run <id>
@@ -3042,23 +3046,23 @@ CREATE TABLE IF NOT EXISTS build_lock (
3042
3046
  `),t.stdout.write(` Steps: ${s.steps.length}
3043
3047
  `),t.stdout.write(` AgentCalls: ${o.agentCallCount}
3044
3048
  `),t.stdout.write(` Tokens: ${o.totalInputTokens} in / ${o.totalOutputTokens} out
3045
- `),0)}async function d4(t,e,n){let r,s;try{let y=await O(t,S=>{let k=rt(e,S);if(k.parseErrors.length>0)throw new Error(k.parseErrors.join("; "));return{teamName:k.name,targets:EN(e,S,new Set,[])}});s=y.teamName,r=y.targets}catch(y){return I(t,`health: ${y instanceof Error?y.message:String(y)}`)}let i=vN(e),o=i.kind==="repo"?i:null,a=await TN(t,r),l=[],c=0,u=o===null?void 0:0,d=o===null?void 0:0;for(let y of r){let S=null;try{S=await Ce(y.sessionid,y.provider)}catch(P){t.stderr.write(`warning: failed to load session "${y.sessionid}" for ${y.reportPath} (${y.provider}): ${P instanceof Error?P.message:String(P)}
3046
- `)}let k=S?.messageCount,b=o===null?void 0:S===null?null:bN(S,o.since),M=o===null?void 0:S===null?null:kN(S)??"n/a",U=o===null?void 0:{messageCount:b??null,tokens:null};l.push({alias:y.alias,reportPath:y.reportPath,teamfile:y.teamfile,provider:y.provider,sessionid:y.sessionid,messageCount:k??null,model:S?.model??"(unknown)",lastContext:S?.lastInputTokens,detailLoaded:S!==null,liveness:a.get(zm(y.teamfile,y.alias))??Zm(),sessionLimit:S===null?null:Km(S.messages),...o!==null?{activitySinceLastCommit:U,cumulativeTokens:M}:{}}),k===void 0?c=void 0:c!==void 0&&(c+=k),o!==null&&(b==null?u=void 0:u!==void 0&&(u+=b),M==null||M==="n/a"?d=void 0:d!==void 0&&(d+=M))}if(n)return K(t,{team:s,git:o===null?null:{teamDir:o.teamDir,commits:o.commits.map(y=>({ref:y.ref,timestamp:y.timestamp.toISOString()})),since:o.since.toISOString(),working:o.working},members:l.map(({detailLoaded:y,cumulativeTokens:S,...k})=>({...k,lastContext:k.lastContext??null,...S!==void 0?{cumulativeTokens:S==="n/a"?null:S}:{}})),total:{messageCount:c??null}}),0;let f=Math.max(7,...l.map(y=>y.sessionid.length)),m=Math.max(5,...l.map(y=>y.reportPath.length))+1,p=Math.max(8,...l.map(y=>y.provider.length))+1,_=Math.max(5,...l.map(y=>y.model.length))+1,h=Math.max(4,...l.map(y=>Ym(y.liveness).length))+1;if(t.stdout.write(`TEAM: ${s}
3049
+ `),0)}async function d4(t,e,n){let r,s;try{let w=await O(t,S=>{let k=rt(e,S);if(k.parseErrors.length>0)throw new Error(k.parseErrors.join("; "));return{teamName:k.name,targets:EN(e,S,new Set,[])}});s=w.teamName,r=w.targets}catch(w){return I(t,`health: ${w instanceof Error?w.message:String(w)}`)}let i=vN(e),o=i.kind==="repo"?i:null,a=await TN(t,r),l=[],c=0,u=o===null?void 0:0,d=o===null?void 0:0;for(let w of r){let S=null;try{S=await Ce(w.sessionid,w.provider)}catch(P){t.stderr.write(`warning: failed to load session "${w.sessionid}" for ${w.reportPath} (${w.provider}): ${P instanceof Error?P.message:String(P)}
3050
+ `)}let k=S?.messageCount,b=o===null?void 0:S===null?null:bN(S,o.since),M=o===null?void 0:S===null?null:kN(S)??"n/a",U=o===null?void 0:{messageCount:b??null,tokens:null};l.push({alias:w.alias,reportPath:w.reportPath,teamfile:w.teamfile,provider:w.provider,sessionid:w.sessionid,messageCount:k??null,model:S?.model??"(unknown)",lastContext:S?.lastInputTokens,detailLoaded:S!==null,liveness:a.get(zm(w.teamfile,w.alias))??Zm(),sessionLimit:S===null?null:Km(S.messages),...o!==null?{activitySinceLastCommit:U,cumulativeTokens:M}:{}}),k===void 0?c=void 0:c!==void 0&&(c+=k),o!==null&&(b==null?u=void 0:u!==void 0&&(u+=b),M==null||M==="n/a"?d=void 0:d!==void 0&&(d+=M))}if(n)return K(t,{team:s,git:o===null?null:{teamDir:o.teamDir,commits:o.commits.map(w=>({ref:w.ref,timestamp:w.timestamp.toISOString()})),since:o.since.toISOString(),working:o.working},members:l.map(({detailLoaded:w,cumulativeTokens:S,...k})=>({...k,lastContext:k.lastContext??null,...S!==void 0?{cumulativeTokens:S==="n/a"?null:S}:{}})),total:{messageCount:c??null}}),0;let f=Math.max(7,...l.map(w=>w.sessionid.length)),m=Math.max(5,...l.map(w=>w.reportPath.length))+1,p=Math.max(8,...l.map(w=>w.provider.length))+1,_=Math.max(5,...l.map(w=>w.model.length))+1,h=Math.max(4,...l.map(w=>Ym(w.liveness).length))+1;if(t.stdout.write(`TEAM: ${s}
3047
3051
  `),i.kind==="repo"){t.stdout.write(`Git progress:
3048
- `);for(let y of i.commits)t.stdout.write(` ${y.ref}: ${y.timestamp.toISOString()}
3052
+ `);for(let w of i.commits)t.stdout.write(` ${w.ref}: ${w.timestamp.toISOString()}
3049
3053
  `);t.stdout.write(` Uncommitted: ${Ct(i.working.uncommittedTracked)} changed (tracked), ${Ct(i.working.untracked)} untracked
3050
3054
  `)}else i.reason==="no-commits"?t.stdout.write(`Git progress: git repository in ${i.teamDir} has no commits (no commit-based progress to report)
3051
3055
  `):t.stdout.write(`Git progress: no git repository in ${i.teamDir} (no commit-based progress to report)
3052
3056
  `);t.stdout.write(` ${"SESSION".padEnd(f)} ${"ALIAS".padEnd(m)}${"PROVIDER".padEnd(p)}${"MODEL".padEnd(_)}${"LIVE".padEnd(h)}${"MSGS".padStart(6)} ${"LAST CONTEXT".padStart(12)}`+(o!==null?` ${"MSGS SINCE COMMIT".padStart(17)} ${"TOKENS SINCE COMMIT".padStart(19)} ${"TOKENS (cumulative)".padStart(19)}`:"")+`
3053
- `);let g=!1,w=l.filter(y=>y.sessionLimit!==null);for(let y of l){let S=p4(y.lastContext,y.detailLoaded,o4);(S==="n/a"||y.cumulativeTokens==="n/a")&&(g=!0),t.stdout.write(` ${y.sessionid.padEnd(f)} ${y.reportPath.padEnd(m)}${y.provider.padEnd(p)}${y.model.padEnd(_)}${Ym(y.liveness).padEnd(h)}${Ct(y.messageCount).padStart(6)} ${S.padStart(12)}`+(o!==null?` ${Ct(y.activitySinceLastCommit?.messageCount).padStart(17)} ${Ct(y.activitySinceLastCommit?.tokens).padStart(19)} ${m4(y.cumulativeTokens).padStart(19)}`:"")+`
3057
+ `);let g=!1,y=l.filter(w=>w.sessionLimit!==null);for(let w of l){let S=p4(w.lastContext,w.detailLoaded,o4);(S==="n/a"||w.cumulativeTokens==="n/a")&&(g=!0),t.stdout.write(` ${w.sessionid.padEnd(f)} ${w.reportPath.padEnd(m)}${w.provider.padEnd(p)}${w.model.padEnd(_)}${Ym(w.liveness).padEnd(h)}${Ct(w.messageCount).padStart(6)} ${S.padStart(12)}`+(o!==null?` ${Ct(w.activitySinceLastCommit?.messageCount).padStart(17)} ${Ct(w.activitySinceLastCommit?.tokens).padStart(19)} ${m4(w.cumulativeTokens).padStart(19)}`:"")+`
3054
3058
  `)}if(t.stdout.write(` ${"TOTAL".padEnd(f)} ${"".padEnd(m)}${"".padEnd(p)}${"".padEnd(_)}${"".padEnd(h)}${Ct(c).padStart(6)}`+(o!==null?` ${"".padStart(12)} ${Ct(u).padStart(17)} ${Ct(null).padStart(19)} ${Ct(d).padStart(19)}`:"")+`
3055
3059
  `),g&&t.stdout.write(`n/a = this provider does not expose a context/token total; absence is not a health signal.
3056
3060
  `),t.stdout.write(`LAST CONTEXT = prompt size of the LAST COMPLETED turn, so it LAGS BY ONE TURN.
3057
3061
  Right after a compaction the last completed turn IS the summarisation request, which carried the
3058
3062
  full pre-compaction prompt \u2014 so this reads the OLD large number while the live context is already
3059
3063
  small. Re-read after the next turn before concluding a compaction failed or gating on the value.
3060
- `),w.length>0){t.stdout.write(`Session limits:
3061
- `);for(let y of w)t.stdout.write(` ${y.reportPath}: LIMITED resets_at=${SN(y.sessionLimit)}
3064
+ `),y.length>0){t.stdout.write(`Session limits:
3065
+ `);for(let w of y)t.stdout.write(` ${w.reportPath}: LIMITED resets_at=${SN(w.sessionLimit)}
3062
3066
  `)}return 0}function EN(t,e,n,r){let s=Te(t,e);if(n.has(s))return[];n.add(s);let i=rt(s,e);if(i.parseErrors.length>0)throw new Error(`${s}: ${i.parseErrors.join("; ")}`);let o=[];for(let a of i.members){if(a.teamfile!==void 0){o.push(...EN(r4(wN(s),a.teamfile),e,n,[...r,a.alias]));continue}a.session===void 0||a.session.length===0||o.push({teamfile:s,alias:a.alias,reportPath:[...r,a.alias].join("/"),provider:a.provider,sessionid:a.session})}return o}async function u4(t,e,n){let r=await TN(t,[{teamfile:e.teamfile,alias:e.alias}]),s=vN(e.teamfile),i=s.kind==="repo"?s:null;return{teamfile:e.teamfile,reportPath:e.alias,lastContext:n.lastInputTokens??null,liveness:r.get(zm(e.teamfile,e.alias))??Zm(),...i!==null?{activitySinceLastCommit:{messageCount:bN(n,i.since),tokens:null},cumulativeTokens:kN(n)??"n/a"}:{}}}async function TN(t,e){try{let n=await O(t,r=>e.map(s=>{let i=Tr(r,s.teamfile,s.alias);return[zm(s.teamfile,s.alias),f4(i)]}));return new Map(n)}catch{return new Map}}function zm(t,e){return`${t}\0${e.toLowerCase()}`}function f4(t){return t.busy?t.reason==="terminal-held"?t.source==="terminal-invocation"?{state:"busy",reason:"terminal-held",inFlight:null,terminalLock:null,terminalInvocation:{id:t.terminalInvocation.id,startedAt:t.terminalInvocation.started_at,lastHeartbeat:t.terminalInvocation.last_heartbeat_at,holderPid:t.terminalInvocation.holder_pid,holderHost:t.terminalInvocation.holder_host},reclaimable:null}:{state:"busy",reason:"terminal-held",inFlight:null,terminalLock:{startedAt:t.terminalLock.started_at,lastHeartbeat:t.terminalLock.last_heartbeat,holderPid:t.terminalLock.holder_pid,holderHost:t.terminalLock.holder_host},terminalInvocation:null,reclaimable:null}:{state:"busy",reason:"in-flight",inFlight:{senderTeamfile:t.inFlight.sender_teamfile,senderAlias:t.inFlight.sender_alias,startedAt:t.inFlight.started_at,activeCount:t.inFlight.active_count,holderPid:t.inFlight.holder_pid},terminalLock:null,terminalInvocation:null,reclaimable:null}:Zm(t.reclaimable===void 0?null:{source:t.reclaimable.source,holderPid:t.reclaimable.holder_pid,holderHost:t.reclaimable.holder_host,reason:t.reclaimable.reason})}function Zm(t=null){return{state:"idle",reason:null,inFlight:null,terminalLock:null,terminalInvocation:null,reclaimable:t}}function Ym(t){if(t.state!=="idle")return`busy (${t.reason})`;if(t.reclaimable!==null){let{holderPid:e,holderHost:n,reason:r}=t.reclaimable;return`idle (reclaimable lock: ${e!==null?`pid ${e}${n!==null?` on ${n}`:""}`:"holder"} ${r==="dead-pid"?"appears dead":"stale"})`}return"idle"}function SN(t){return t.resets_at!==null?t.resets_at:t.timezone!==null?`${t.reset_time} (${t.timezone})`:t.reset_time}function Ct(t){return t==null?"unknown":String(t)}function m4(t){return t==="n/a"?t:Ct(t)}function p4(t,e,n=String){return t!==void 0?n(t):e?"n/a":"unknown"}function vN(t){let e=wN(t),n;try{Vm("git",["-C",e,"rev-parse","--is-inside-work-tree"],{encoding:"utf8",stdio:["ignore","pipe","ignore"]})}catch{return{kind:"unavailable",reason:"no-repo",teamDir:e}}try{n=Vm("git",["-C",e,"log","-2","--format=%ct"],{encoding:"utf8",stdio:["ignore","pipe","ignore"]})}catch{return{kind:"unavailable",reason:"no-commits",teamDir:e}}let r=n.split(/\r?\n/).map(i=>Number.parseInt(i.trim(),10)).filter(i=>Number.isFinite(i)&&i>0);if(r.length===0)return{kind:"unavailable",reason:"no-commits",teamDir:e};let s=r.slice(0,2).map((i,o)=>({ref:o===0?"HEAD":`HEAD~${o}`,timestamp:new Date(i*1e3)}));return{kind:"repo",teamDir:e,since:s[0].timestamp,commits:s,working:_4(e)}}function _4(t){let e;try{e=Vm("git",["-C",t,"status","--porcelain"],{encoding:"utf8",stdio:["ignore","pipe","ignore"]})}catch{return{uncommittedTracked:null,untracked:null}}let n=0,r=0;for(let s of e.split(/\r?\n/))s.trim().length!==0&&(s.startsWith("??")?r+=1:n+=1);return{uncommittedTracked:n,untracked:r}}function bN(t,e){let n=e.getTime();return t.messages.filter(r=>(r.role==="user"||r.role==="assistant")&&Number.isFinite(r.timestamp.getTime())&&r.timestamp.getTime()>n).length}function kN(t){if(t===null)return null;let e=[t.totalInputTokens,t.totalCachedInputTokens,t.totalCacheWriteInputTokens,t.totalOutputTokens,t.totalReasoningOutputTokens].filter(n=>typeof n=="number"&&Number.isFinite(n));return e.length===0?null:e.reduce((n,r)=>n+r,0)}var s4,i4,NN=E(()=>{"use strict";Rt();Re();xt();Yt();ct();sn();yN();s4={name:"health",allowsBareTeamfile:!0,supportsRaw:!0},i4=`usage: lmctl health [target] [alias]
3063
3067
  lmctl health <teamfile> # team rollup
3064
3068
  lmctl health <sessionid> [--provider <name>]
@@ -3088,12 +3092,12 @@ List native provider sessions in scope, or list recent managed runs with --runs.
3088
3092
  `);for(let g of jc(o.members,i))e.stderr.write(`warning: ${g}
3089
3093
  `);let f=0,m=o.members.filter(g=>g.teamfile!==void 0?!1:g.session===void 0||g.session.length<ki);for(let g of m)if(!GN(g.provider))return e.stderr.write(`error: ${g.alias}: invalid provider "${g.provider}"
3090
3094
  `),1;for(let g of o.members){if(g.teamfile!==void 0)continue;if(g.session!==void 0&&g.session.length>=ki){e.stderr.write(`warning: ${g.alias}: existing sessionid preserved; skipping
3091
- `);continue}let w=g.sessiondir??i,y=await FN({provider:g.provider,cwd:w,...g.model!==void 0?{model:g.model}:{},...g.effort!==void 0?{effort:g.effort}:{},...g.alias.toLowerCase()==="lead"?{prompt:oK(r,l.join(`
3092
- `),o.members)}:{}});for(let b of y.warnings??[])e.stderr.write(`warning: ${g.alias}: ${b}
3093
- `);if(y.error!==void 0||y.sessionId===void 0||y.sessionId.length<ki){let b=`provider did not report a sessionid; no new session was found for ${w} (possible provider workspace/cwd mismatch)`;return e.stderr.write(`error: ${g.alias}: seed failed${y.error!==void 0?`: ${y.error}`:`; ${b}`}
3095
+ `);continue}let y=g.sessiondir??i,w=await FN({provider:g.provider,cwd:y,...g.model!==void 0?{model:g.model}:{},...g.effort!==void 0?{effort:g.effort}:{},...g.alias.toLowerCase()==="lead"?{prompt:oK(r,l.join(`
3096
+ `),o.members)}:{}});for(let b of w.warnings??[])e.stderr.write(`warning: ${g.alias}: ${b}
3097
+ `);if(w.error!==void 0||w.sessionId===void 0||w.sessionId.length<ki){let b=`provider did not report a sessionid; no new session was found for ${y} (possible provider workspace/cwd mismatch)`;return e.stderr.write(`error: ${g.alias}: seed failed${w.error!==void 0?`: ${w.error}`:`; ${b}`}
3094
3098
  `),1}let S=c.get(g.alias.toLowerCase());if(S===void 0)return e.stderr.write(`error: ${g.alias}: could not find matching _MEMBER_ line to update
3095
- `),1;let k=fK(l[S],"sessionid",y.sessionId);l[S]=k,f+=1,Fl(r,l.join(`
3096
- `),"utf8"),e.stdout.write(`${g.alias}: seeded ${y.sessionId} provider=${g.provider} sessiondir=${w}
3099
+ `),1;let k=fK(l[S],"sessionid",w.sessionId);l[S]=k,f+=1,Fl(r,l.join(`
3100
+ `),"utf8"),e.stdout.write(`${g.alias}: seeded ${w.sessionId} provider=${g.provider} sessiondir=${y}
3097
3101
  `)}let p=l.join(`
3098
3102
  `),_=pK(p,lp(r));(_!==p||u)&&Fl(r,_,"utf8"),f===0&&e.stdout.write(`no members needed seeding
3099
3103
  `);let h=new Date().toISOString();try{await O(e,g=>{XN(g,{teamfilePath:s,name:o.name,rawText:_,now:h})})}catch(g){return Fe(e,g instanceof Error?g.message:String(g))}return 0}async function sK(t,e={stdout:process.stdout,stderr:process.stderr}){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(Pl),0;let n=z(t,["--provider","--sessiondir"],[]);if(n.error!==void 0)return ap(e,n.error,Pl);if(n.positionals.length!==2)return ap(e,"expected <teamfile.lmctl> and <alias>",Pl);let[r,s]=n.positionals;if(!uK(s))return Fe(e,`invalid alias "${s}"`);if(s.toLowerCase()==="lead")return Fe(e,"hire only applies to non-Lead members");let i=$(n,"--provider");if(i===void 0)return ap(e,"missing value for --provider",Pl);if(!GN(i))return Fe(e,`invalid provider "${i}"`);let o;try{o=await O(e,d=>Te(r,d))}catch(d){return Fe(e,`${r}: ${d instanceof Error?d.message:String(d)}`)}let a;try{a=Ul(o,"utf8")}catch(d){return Fe(e,`${r}: ${d instanceof Error?d.message:String(d)}`)}if(dK(a,s))return Fe(e,`${s}: alias already exists in ${o}`);let l=$(n,"--sessiondir"),c=[`_MEMBER_ alias=${dp(s)} provider=${i}`,...l===void 0?[]:[`sessiondir=${dp(l)}`]].join(" "),u=mK(a,c);return Fl(o,u,"utf8"),e.stdout.write(`Hired ${s} (${i}) -> ${o}
@@ -3338,7 +3342,7 @@ Text output shows recent activity from the last 24h by default. Use --since 7d
3338
3342
  or an ISO timestamp to widen the investigation window. --json returns complete,
3339
3343
  uncapped data.
3340
3344
  `,Wl=5,zV=24*60*60*1e3,XA=72,JA=80});var ix={};ae(ix,{runRunning:()=>S3});function Ap(t){return t.target_teamfile===null||t.target_alias===null?null:`${t.target_teamfile}:${t.target_alias}`}async function S3(t,e){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(`${T3}
3341
- `),0;let n=z(t,[],["--json"]);if(n.error!==void 0)return I(e,n.error);let r=n.flags["--json"]===!0;return O(e,s=>{let i=Date.now(),o=s.listAllRunningTrackedInvocations(),a=[],l=[];for(let _ of o){let h=Pt(_),g=i-new Date(_.started_at).getTime(),w={id:_.id,kind:_.kind,origin:_.origin,from_identity:_.from_identity,target:Ap(_),started_at:_.started_at};h==="dead"?l.push({...w,stale_for_ms:g}):a.push({...w,running_for_ms:g,holder_liveness:h??"unknown"})}let c=new Set(o.map(Ap).filter(_=>_!==null)),u=new Date(i-w3).toISOString(),d=s.listRecentlyFinishedTrackedInvocations(u),f=new Set,m=[];for(let _ of d){let h=Ap(_);h===null||c.has(h)||f.has(h)||(f.add(h),m.push({id:_.id,kind:_.kind,origin:_.origin,from_identity:_.from_identity,target:h,status:_.status,started_at:_.started_at,ended_at:_.ended_at,idle_ms:i-new Date(_.ended_at).getTime()}))}if(r)return K(e,{schema_version:E3,running:a,dead:l,idle:m}),0;let p=[];p.push(`Running (${a.length}):`),a.length===0&&p.push(" none");for(let _ of a){let h=_.target!==null?yt(_.target):_.from_identity;p.push(` ${h} ${_.kind} running ${Oi(_.started_at)} liveness=${_.holder_liveness}`)}p.push(""),p.push(`Dead (reclaimable) (${l.length}):`),l.length===0&&p.push(" none");for(let _ of l){let h=_.target!==null?yt(_.target):_.from_identity;p.push(` ${h} ${_.kind} DEAD -- stale ${Oi(_.started_at)}, holder process confirmed dead`)}p.push(""),p.push(`Idle, finished in the last 24h (${m.length}):`),m.length===0&&p.push(" none");for(let _ of m){let h=_.target!==null?yt(_.target):_.from_identity;p.push(` ${h} ${_.kind} ${_.status} idle ${Oi(_.ended_at)} (finished ${_.ended_at})`)}return e.stdout.write(`${p.join(`
3345
+ `),0;let n=z(t,[],["--json"]);if(n.error!==void 0)return I(e,n.error);let r=n.flags["--json"]===!0;return O(e,s=>{let i=Date.now(),o=s.listAllRunningTrackedInvocations(),a=[],l=[];for(let _ of o){let h=Pt(_),g=i-new Date(_.started_at).getTime(),y={id:_.id,kind:_.kind,origin:_.origin,from_identity:_.from_identity,target:Ap(_),started_at:_.started_at};h==="dead"?l.push({...y,stale_for_ms:g}):a.push({...y,running_for_ms:g,holder_liveness:h??"unknown"})}let c=new Set(o.map(Ap).filter(_=>_!==null)),u=new Date(i-w3).toISOString(),d=s.listRecentlyFinishedTrackedInvocations(u),f=new Set,m=[];for(let _ of d){let h=Ap(_);h===null||c.has(h)||f.has(h)||(f.add(h),m.push({id:_.id,kind:_.kind,origin:_.origin,from_identity:_.from_identity,target:h,status:_.status,started_at:_.started_at,ended_at:_.ended_at,idle_ms:i-new Date(_.ended_at).getTime()}))}if(r)return K(e,{schema_version:E3,running:a,dead:l,idle:m}),0;let p=[];p.push(`Running (${a.length}):`),a.length===0&&p.push(" none");for(let _ of a){let h=_.target!==null?yt(_.target):_.from_identity;p.push(` ${h} ${_.kind} running ${Oi(_.started_at)} liveness=${_.holder_liveness}`)}p.push(""),p.push(`Dead (reclaimable) (${l.length}):`),l.length===0&&p.push(" none");for(let _ of l){let h=_.target!==null?yt(_.target):_.from_identity;p.push(` ${h} ${_.kind} DEAD -- stale ${Oi(_.started_at)}, holder process confirmed dead`)}p.push(""),p.push(`Idle, finished in the last 24h (${m.length}):`),m.length===0&&p.push(" none");for(let _ of m){let h=_.target!==null?yt(_.target):_.from_identity;p.push(` ${h} ${_.kind} ${_.status} idle ${Oi(_.ended_at)} (finished ${_.ended_at})`)}return e.stdout.write(`${p.join(`
3342
3346
  `)}
3343
3347
  `),0})}var w3,E3,T3,ox=E(()=>{"use strict";ct();Re();Np();w3=24*60*60*1e3,E3=2,T3=["usage: lmctl running [--json]","","Shows tracked_invocation activity DB-wide across the whole fleet, split","into three sections:",' - Running: status="running" with a live (or unverifiable cross-host)'," holder -- genuinely in-flight work.",' - Dead (reclaimable): status="running" but the holder process is'," confirmed dead -- an orphaned record, not active work. Its elapsed",' time is reported as staleness, not as "running", so a dead worker'," is never mistaken for one that is genuinely still building."," - Idle: targets with nothing running or dead, showing their most"," recent finish from the last 24 hours and how long they've been"," idle since.","","Queries lmctl's own database only -- never touches native provider","session files."].join(`
3344
3348
  `)});Ue();hs();de();import{pathToFileURL as v3}from"node:url";import{mkdirSync as Vx,readFileSync as Yx,renameSync as zx,writeFileSync as Zx}from"node:fs";import{homedir as Qx}from"node:os";import{dirname as e0,join as t0}from"node:path";function Yp(t){try{return new URL(t).protocol==="https:"}catch{return!1}}function Gx(t){return/^[A-Za-z]:[\\/]/.test(t)?!1:/^[A-Za-z][A-Za-z0-9+.-]*:/.test(t)}function Kx(t,e){return!Gx(t)||Yp(t)?null:`${e} must use https://: ${t}`}async function zp(t,e){let n=Kx(t,e.description);if(n!==null||!Yp(t))throw new Error(n??`${e.description} must use https://: ${t}`);let r=e.timeoutMs??15e3,s=new AbortController,i=setTimeout(()=>s.abort(),r);try{let o;try{o=await fetch(t,{signal:s.signal,redirect:"manual"})}catch(a){throw Vp(t,e.description,r,a)}if(o.type==="opaqueredirect"||o.status>=300&&o.status<400)throw new Error(`refusing to follow redirect from ${e.description} ${t} (https-only: the URL must serve the content directly, not redirect)`);if(!o.ok)throw new Error(`failed to fetch ${e.description} ${t}: HTTP ${o.status}${o.statusText?` ${o.statusText}`:""}`);try{return Buffer.from(await o.arrayBuffer())}catch(a){throw Vp(t,e.description,r,a)}}finally{clearTimeout(i)}}function Vp(t,e,n,r){let i=r instanceof Error&&r.name==="AbortError"?`timed out after ${n}ms`:r instanceof Error?r.message:String(r);return new Error(`failed to fetch ${e} ${t}: ${i}`)}hs();var n0="https://registry.npmjs.org/@lmctl-ai/lmctl/latest",r0=60*60*1e3,s0=1500;function i0(){let t=process.env.HOME??Qx();return t0(t,".lmctl",".update-check.json")}function o0(t){return t.isTTY===!0}function a0(t,e){let n=i=>{let o=/^(\d+)\.(\d+)\.(\d+)(?:$|[-+])/.exec(i.trim());if(o===null)return null;let a=o.slice(1).map(l=>Number(l));return a.some(l=>!Number.isSafeInteger(l)||l<0)?null:a},r=n(t),s=n(e);if(r===null||s===null)return 0;for(let i=0;i<3;i+=1){if(r[i]>s[i])return 1;if(r[i]<s[i])return-1}return 0}function Vl(t,e){return!!(process.env.LMCTL_NO_UPDATE_NOTIFIER==="1"||!o0(e.stderr)||t.includes("--json")||t.includes("--help")||t.includes("-h")||t[0]==="help"||t[0]==="mcp")}function l0(t,e){try{let n=JSON.parse(Yx(t,"utf8"));if(typeof n.checkedAt=="number"&&Number.isFinite(n.checkedAt)&&typeof n.latest=="string"&&e-n.checkedAt<r0)return n.latest}catch{}return null}function c0(t,e){Vx(e0(t),{recursive:!0});let n=`${t}.tmp-${process.pid}-${Math.random().toString(16).slice(2)}`;Zx(n,`${JSON.stringify(e)}