@lmctl-ai/lmctl 0.1.258 → 0.1.260
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli/index.js +64 -61
- package/package.json +1 -1
package/dist/cli/index.js
CHANGED
|
@@ -1622,7 +1622,7 @@ var rA=Object.defineProperty;var w=(e,t)=>()=>(e&&(t=e(e=0)),t);var me=(e,t)=>{f
|
|
|
1622
1622
|
AND status = 'running'
|
|
1623
1623
|
`),...y_(e),...__(e)}}function HR(e,t){return t===void 0?{resumed:!1,reason:e}:{resumed:!1,reason:e,valid:t}}var Rc,dt=w(()=>{"use strict";wc();h_();E_();Yi();b_();tn();ce();Rr();G_();$s();Rc=class{db;stmts;claimTxn;claimWithConcurrencyTxn;claimByIdWithConcurrencyTxn;resumeRunTxn;resumeInteractiveTxn;resumeEscalationTxn;tryAcquireAgentInflightTxn;recvMailboxMessagesTxn;constructor(t){t.pragma("foreign_keys = ON"),this.db=t,this.stmts=BR(t),this.claimTxn=t.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=t.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=t.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,d=a.status==="running"&&a.locked_until!==null&&a.locked_until<i;if(!c&&!d)return{claimed:!1,reason:"not_claimable",job_id:n,status:a.status,locked_by:a.locked_by,locked_until:a.locked_until};let u=o(a);if(u.concurrency_key!==null&&(a.concurrency_key_resolved!==u.concurrency_key&&this.stmts.setJobConcurrencyKey.run(u.concurrency_key,a.id),(this.stmts.countRunningByConcurrencyKey.get(u.concurrency_key,i,a.id)?.count??0)>=Math.max(1,u.concurrent_limit)))return{claimed:!1,reason:"concurrency_limit",job_id: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=t.transaction((n,r,s)=>HR("state_not_found")),this.resumeInteractiveTxn=t.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=t.transaction((n,r,s)=>{let i=this.stmts.getAttention.get(n);if(i===void 0)return{resumed:!1,reason:"not_found"};if(i.kind!==io)return{resumed:!1,reason:"wrong_kind"};if(i.acknowledged_at!==null)return{resumed:!1,reason:"already_acked"};if(i.run_id===null)return{resumed:!1,reason:"run_not_found"};let o=null,a=[];if(i.payload!==null)try{let d=JSON.parse(i.payload);d.step!==void 0&&typeof d.step.id=="string"&&d.step.id.length>0&&(o=d.step.id),Array.isArray(d.declared_outcomes)&&(a=d.declared_outcomes.filter(u=>typeof u=="string"))}catch{}if(o===null)return{resumed:!1,reason:"no_step"};let l=this.getRun(i.run_id);if(l===null)return{resumed:!1,reason:"run_not_found"};if(r!==Os&&!a.includes(r))return{resumed:!1,reason:V_};let c={};if(l.pending_escalation_decision!==null)try{let d=JSON.parse(l.pending_escalation_decision);d!==null&&typeof d=="object"&&!Array.isArray(d)&&(c=d)}catch{c={}}return c[o]=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=$_(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}},this.recvMailboxMessagesTxn=t.transaction((n,r)=>{let s=this.stmts.listAllMailboxMessagesForReceiver.all(n,r),i=Qn(s.filter(a=>a.message_type==="request")),o=i===null?null:{action:"set",messageId:Pe(i.id)};for(let a of s)Rs(this.db,a,"",M(),null,a.message_type==="request"?o:null),this.stmts.deleteMailboxMessage.run(a.id);return s})}close(){this.db.close()}query(t,...n){let r=t.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(t).all(...n)}insertWorkflow(t){Z_(t.name,t.definition,o=>this.getWorkflowByName(o));let n=this.stmts.insertWorkflow.run(t.name,t.version??1,t.definition_schema_version??1,t.definition,M()),r=this.getWorkflow(Number(n.lastInsertRowid)),s=this.stmts.insertWorkflowVersion.run(r.id,r.version,t.definition,t.author??null,M());this.stmts.updateWorkflowActiveVersion.run(s.lastInsertRowid,r.id),(t.source_uri!=null||t.source_sha256!=null)&&this.stmts.setWorkflowSource.run(t.source_uri??null,t.source_sha256??null,r.id);let i=this.getWorkflow(r.id);return this.syncWorkflowTriggers(r.id,t.definition),i}upsertWorkflow(t){Z_(t.name,t.definition,o=>this.getWorkflowByName(o));let n=this.getWorkflowByName(t.name);if(n===null)return this.insertWorkflow({name:t.name,definition_schema_version:t.definition_schema_version,definition:t.definition,author:t.author,source_uri:t.source_uri,source_sha256:t.source_sha256});let s=(this.stmts.getLatestWorkflowVersion.get(n.id)?.version??n.version)+1,i=this.stmts.insertWorkflowVersion.run(n.id,s,t.definition,t.author??null,M());return this.stmts.updateWorkflowActiveVersionDefinitionAndVersion.run(Number(i.lastInsertRowid),t.definition,t.definition_schema_version??n.definition_schema_version,s,n.id),(t.source_uri!=null||t.source_sha256!=null)&&this.stmts.setWorkflowSource.run(t.source_uri??null,t.source_sha256??null,n.id),this.syncWorkflowTriggers(n.id,t.definition),this.getWorkflow(n.id)}insertCompositionUnit(t){this.stmts.insertCompositionUnit.run(t.name,t.version,t.lang,t.source,t.source_sha,t.compiled_workflow_version_id,M())}getWorkflow(t){return this.stmts.getWorkflow.get(t)??null}getWorkflowByName(t,n){return(n===void 0?this.stmts.findWorkflowLatest.get(t):this.stmts.findWorkflowVersion.get(t,n))??null}findWorkflowByName(t,n){return this.getWorkflowByName(t,n)}insertWorkflowVersion(t,n,r){let i=(this.stmts.getLatestWorkflowVersion.get(t)?.version??0)+1,o=this.stmts.insertWorkflowVersion.run(t,i,n,r??null,M());return this.stmts.getWorkflowVersion.get(o.lastInsertRowid)}activateWorkflowVersion(t,n){let r=this.getWorkflowVersionById(n);if(r===null||r.workflow_id!==t)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,t),this.syncWorkflowTriggers(t,r.definition),this.getWorkflow(t)}getWorkflowVersionById(t){return this.stmts.getWorkflowVersion.get(t)??null}listWorkflowVersions(t){return this.stmts.listWorkflowVersions.all(t)}upsertTriggerInstance(t){return this.stmts.upsertTriggerInstance.run(t.workflow_id,t.trigger_id,t.trigger_type,t.parameters,t.enabled===!1?0:1,M()),this.stmts.getTriggerInstanceByWorkflowAndId.get(t.workflow_id,t.trigger_id)}listTriggerInstancesForWorkflow(t){return this.stmts.listTriggerInstancesForWorkflow.all(t)}listEnabledTriggerInstances(){return this.stmts.listEnabledTriggerInstances.all()}setTriggerCursor(t,n){return this.stmts.setTriggerCursor.run(n,M(),t),this.stmts.getTriggerInstance.get(t)??null}setTriggerFailure(t,n){return this.stmts.setTriggerFailure.run(M(),n,t),this.stmts.getTriggerInstance.get(t)??null}syncWorkflowTriggers(t,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:t,trigger_id:o.id,trigger_type:o.type,parameters:JSON.stringify(o.parameters??{})})}}insertTeam(t){let n=this.stmts.insertTeam.run(t.name,M());return this.stmts.getTeam.get(n.lastInsertRowid)}getTeam(t){return this.stmts.getTeam.get(t)??null}findTeamByName(t){return this.stmts.findTeamByName.get(t)??null}listTeams(){return this.stmts.listTeams.all()}insertTeamMember(t){let n=this.stmts.insertTeamMember.run(t.team_id,t.alias,t.role??"agent",t.provider,t.model??null,t.sessionid??null,t.sessiondir,M());return this.stmts.getTeamMember.get(n.lastInsertRowid)}listTeamMembers(t){return this.stmts.listTeamMembers.all(t)}findTeamMemberByAlias(t,n){return this.stmts.findTeamMemberByAlias.get(t,n)??null}updateTeamMemberSession(t,n){return this.stmts.updateTeamMemberSession.run(n,t),this.stmts.getTeamMember.get(t)??null}setMemberState(t,n,r){return this.stmts.setMemberState.run(n,r??null,M(),t),this.stmts.getTeamMember.get(t)??null}listMembersInState(t){return this.stmts.listMembersInState.all(t)}setMemberPromptSnapshot(t,n){return this.stmts.setMemberPromptSnapshot.run(n,t),this.stmts.getTeamMember.get(t)??null}setMemberProviderResolved(t,n){return this.stmts.setMemberProviderResolved.run(n,t),this.stmts.getTeamMember.get(t)??null}setMemberRolePrompt(t,n){return this.stmts.setMemberRolePrompt.run(n,t),this.stmts.getTeamMember.get(t)??null}updateTeamMemberMeta(t,n){let r=this.stmts.getTeamMember.get(t);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,t),this.stmts.getTeamMember.get(t)??null}insertTeamMemberCompanion(t){let n=this.stmts.insertTeamMemberCompanion.run(t.interpreter_id,t.companion_id,M());return this.stmts.getTeamMemberCompanion.get(n.lastInsertRowid)}insertProject(t){let n=this.stmts.insertProject.run(t.name,t.description??null,t.local_path,t.workflow_name,t.team_id,t.default_branch??null,t.intake_config??null,t.test_argv??null,t.test_command??null,t.durable_memory_mode??"folder",M());return this.stmts.getProject.get(n.lastInsertRowid)}listProjects(){return this.stmts.listProjects.all()}getProject(t){return this.stmts.getProject.get(t)??null}findProjectByName(t){return this.stmts.findProjectByName.get(t)??null}setProjectIntakeConfig(t,n){return this.stmts.setProjectIntakeConfig.run(n,t),this.stmts.getProject.get(t)??null}updateProjectSettings(t,n){let r=this.stmts.getProject.get(t);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,t),this.stmts.getProject.get(t)??null}listProjectsWithIntakeEnabled(){return this.stmts.listProjectsWithIntakeConfig.all().filter(t=>{if(t.intake_config===null)return!1;try{let n=JSON.parse(t.intake_config);return typeof n=="object"&&n!==null&&!Array.isArray(n)&&n.scan_github_issues===!0}catch{return!1}})}getProjectByJob(t){return this.stmts.getProjectByJob.get(t)??null}insertProjectWorkflow(t){let n=t.condition??null,r=this.stmts.findProjectWorkflowUnique.get(t.project_id,t.workflow_id,n);if(r!==void 0)return r;let s=this.stmts.insertProjectWorkflow.run(t.project_id,t.workflow_id,n,t.parameters_override??null,t.enabled===!1?0:1,t.priority??100,M());return s.changes===1?this.stmts.getProjectWorkflow.get(s.lastInsertRowid):this.stmts.findProjectWorkflowUnique.get(t.project_id,t.workflow_id,n)}getProjectWorkflow(t){return this.stmts.getProjectWorkflow.get(t)??null}listProjectWorkflows(t,n={}){return n.enabled_only===!0?this.stmts.listEnabledProjectWorkflows.all(t):this.stmts.listProjectWorkflows.all(t)}removeProjectWorkflow(t){return this.stmts.removeProjectWorkflow.run(t).changes>0}setProjectWorkflowEnabled(t,n){return this.stmts.setProjectWorkflowEnabled.run(n?1:0,t),this.getProjectWorkflow(t)}createIssue(t){let n=M(),r=this.stmts.createIssue.run(t.project_id,t.title,t.body,t.severity??"medium",t.labels??null,t.ai_test_path??null,t.source_run_id??null,n,n);return this.stmts.getIssue.get(r.lastInsertRowid)}getIssue(t){return this.stmts.getIssue.get(t)??null}listIssues(t,n={}){return this.stmts.listIssuesForProject.all(t).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(t,n){return this.stmts.claimNextIssue.get(n,M(),t)??null}claimIssue(t,n){return this.stmts.claimIssue.get(n,M(),t)??null}closeIssue(t,n,r){let s=M(),i=this.stmts.closeIssue.get(n,r??null,s,s,t);if(i===void 0)throw new Error(`issue not found: ${t}`);return i}reopenIssue(t,n){let r=this.stmts.reopenIssue.get(n,M(),t);if(r===void 0)throw this.getIssue(t)===null?new Error(`issue not found: ${t}`):new Error(`issue ${t} is not closed`);return r}updateIssue(t,n){let r=this.getIssue(t);if(r===null)throw new Error(`issue not found: ${t}`);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,M(),t);if(o===void 0)throw new Error(`issue not found: ${t}`);return o}listWorkflows(){return this.stmts.listWorkflows.all()}getOrCreateWebuiSession(t,n){let r=this.stmts.getWebuiSession.get(t);if(r!==void 0)return r;let s=M();return this.stmts.insertWebuiSession.run(t,n,"N1",null,null,null,null,"authenticated",s,s),this.stmts.getWebuiSession.get(t)}getWebuiSession(t){return this.stmts.getWebuiSession.get(t)??null}updateWebuiSessionTransition(t,n,r,s,i){if(this.stmts.updateWebuiSessionTransition.run(n,r,s,i,M(),t).changes===0)throw new Error(`webui_session not found: ${t}`);return this.stmts.getWebuiSession.get(t)}setWebuiSessionChatbot(t,n){if(this.stmts.setWebuiSessionChatbot.run(n,M(),t).changes===0)throw new Error(`webui_session not found: ${t}`);return this.stmts.getWebuiSession.get(t)}createChatbotSession(t,n){let r=z_(),s=M();return this.stmts.insertChatbotSession.run(r,t,n??null,s,s,"active"),this.stmts.getChatbotSession.get(r)}getChatbotSession(t){return this.stmts.getChatbotSession.get(t)??null}listChatbotSessions(t){return this.stmts.listChatbotSessionsForUser.all(t)}appendChatbotMessage(t,n,r,s){let i=M(),o=this.stmts.insertChatbotMessage.run(t,n,r,s??null,i);return this.stmts.touchChatbotSession.run(i,t),this.stmts.getChatbotMessage.get(o.lastInsertRowid)}listChatbotMessages(t){return this.stmts.listChatbotMessages.all(t)}getConfig(t){return this.stmts.getConfig.get(t)?.value??null}setConfig(t,n){this.stmts.upsertConfig.run(t,n,M())}getConfigAll(){let t=this.stmts.listConfig.all(),n={};for(let r of t)n[r.key]=r.value;return n}enqueueJob(t){let n=this.stmts.insertJob.run(t.project_id,t.workflow_id_override??null,t.source,t.source_ref??null,t.payload??null,t.priority??0,t.available_at??M(),t.dedupe_key??null,t.concurrency_key??null,M());if(n.changes===1)return this.stmts.getJob.get(n.lastInsertRowid);if(t.dedupe_key===void 0||t.dedupe_key===null)throw new Error("job insert ignored without dedupe key");return this.stmts.findJobByDedupe.get(t.source,t.dedupe_key)}claimNextJob(t){let n=M(),r=new Date(Date.now()+t.lease_ms).toISOString();return this.claimTxn(t.worker_id,r,n)}claimNextJobWithConcurrency(t){let n=M(),r=new Date(Date.now()+t.lease_ms).toISOString();return this.claimWithConcurrencyTxn(t.worker_id,r,n,t.evaluator)}claimJobByIdWithConcurrency(t){let n=M(),r=new Date(Date.now()+t.lease_ms).toISOString();return this.claimByIdWithConcurrencyTxn(t.job_id,t.worker_id,r,n,t.evaluator)}releaseJob(t,n,r){let s=n==="queued"||n==="running"?null:M();return this.stmts.releaseJob.run(n,r??null,s,t),this.getJob(t)}getJob(t){return this.stmts.getJob.get(t)??null}findJobBySourceAndDedupe(t,n){return this.stmts.findJobByDedupe.get(t,n)??null}insertRun(t){let n=this.getWorkflow(t.workflow_id);if(n===null)throw new Error(`workflow not found: ${t.workflow_id}`);let r=this.stmts.insertRun.run(t.job_id,t.workflow_id,t.team_id,t.current_state??null,n.active_version_id,t.parent_run_id??null,M()),s=this.stmts.getRun.get(r.lastInsertRowid);return(t.parent_run_id===void 0||t.parent_run_id===null)&&this.stmts.setJobRun.run(s.id,t.job_id),s}setJobRun(t,n){return this.stmts.setJobRun.run(n,t),this.getJob(t)}insertPromptDispatch(t){return this.stmts.insertPromptDispatch.run(t.prompt_id,t.project_id,t.job_id,t.text,t.context_json??null,M()),this.stmts.getPromptDispatch.get(t.prompt_id)}getPromptDispatch(t){return this.stmts.getPromptDispatch.get(t)??null}setPromptDispatchCompleted(t,n){return this.stmts.setPromptDispatchCompleted.run(n??M(),t),this.getPromptDispatch(t)}getWorkspace(t){return this.stmts.getWorkspace.get(t)??null}ensureWorkspace(t={}){let n=t.id??"default";this.stmts.ensureWorkspace.run(n,t.name??"Default workspace",t.idleThresholdMs??6e5,M());let r=this.getWorkspace(n);if(r===null)throw new Error(`workspace ${n} missing after upsert`);return r}listWebProjectsActive(t){return this.stmts.listWebProjectsActive.all(t)}getWebProject(t){return this.stmts.getWebProject.get(t)??null}insertWebProject(t){let n=M(),r=this.stmts.insertWebProject.run(t.workspace_id,t.name,t.repo_path,t.config_json??null,t.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(t){let n=this.getWebProject(t.id);return n===null||n.deleted_at!==null?null:(this.stmts.updateWebProject.run(t.name??n.name,t.config_json===void 0?n.config_json:t.config_json,M(),t.id),this.getWebProject(t.id))}softDeleteWebProject(t){return this.stmts.softDeleteWebProject.run(M(),t).changes===1}loadMailboxCursor(t,n){return this.stmts.loadMailboxCursor.get(t,n)??null}saveMailboxCursor(t){this.stmts.saveMailboxCursor.run(t.user_id,t.mailbox_key,t.last_processed_version_id,t.last_processed_seq??null,t.last_processed_at)}addUsage(t){this.stmts.addUsage.run(t.user_id,t.device_id,t.period,t.put,t.get,t.list,t.updated_at)}loadUsage(t,n,r){return this.stmts.loadUsage.get(t,n,r)??null}sumUsageForPeriod(t,n){let r=this.stmts.sumUsageForPeriod.get(t,n);return{put:r?.put??0,get:r?.get??0,list:r?.list??0}}upsertRootTeam(t){this.stmts.upsertRootTeam.run(t.teamfile_path,t.name,t.raw_text,t.raw_sha256,t.registered_at,t.last_seeded_at)}getRootTeam(t){return this.stmts.getRootTeam.get(t)??null}listRootTeams(){return this.stmts.listRootTeams.all()}insertTeamChatLog(t){return this.db.transaction(()=>{let n=this.stmts.insertTeamChatLog.run(t.root_teamfile,t.sender_teamfile,t.sender_alias,t.receiver_teamfile,t.receiver_alias,t.message,t.response,t.origin,t.status,t.error_detail,t.truncated,t.created_at),r=Number(n.lastInsertRowid);return kc(this.db,r,t),no(this.db,r,t),r})()}beginTeamChatLog(t){return this.db.transaction(()=>{let n=this.stmts.insertTeamChatLog.run(t.root_teamfile,t.sender_teamfile,t.sender_alias,t.receiver_teamfile,t.receiver_alias,t.message,t.response,t.origin,t.status,t.error_detail,t.truncated,t.created_at),r=Number(n.lastInsertRowid);return kc(this.db,r,t),r})()}finishTeamChatLog(t,n){this.db.transaction(()=>{if(this.stmts.updateTeamChatLogResponse.run(n.response,n.status,n.error_detail,n.truncated,t).changes!==1)throw new Error(`team_chat_log row disappeared during finish: ${t}`);no(this.db,t,n)})()}setCurrentlyHandlingMessage(t,n,r){this.db.transaction(()=>{Ar(this.db,t,n,r)})()}clearCurrentlyHandlingMessage(t,n,r){return this.db.transaction(()=>to(this.db,t,n,r))()}listTeamChatLog(t){return this.stmts.listTeamChatLog.all(t)}listTeamChatLogSinceId(t,n=500){return this.stmts.listTeamChatLogSinceId.all(t,Math.max(1,Math.trunc(n)))}getMaxTeamChatLogId(){return this.stmts.getMaxTeamChatLogId.get()?.max_id??0}loadTeamChatLogCursor(t){return this.stmts.loadTeamChatLogCursor.get(t)??null}saveTeamChatLogCursor(t){this.stmts.saveTeamChatLogCursor.run(t.cursor_key,t.last_pushed_id,t.updated_at)}startTrackedInvocation(t){return this.db.transaction(()=>this.startTrackedInvocationInner(t))()}startTrackedInvocationInner(t){let n=t.started_at??M(),r=t.holder_host??Cs(),s=t.last_heartbeat_at??n,i=this.stmts.insertTrackedInvocation.run(t.kind,t.origin,t.scope_teamfile??null,t.from_identity,t.target_teamfile??null,t.target_alias??null,t.root_teamfile??null,t.cwd??null,Ct(t.command),n,t.holder_pid??null,r,s,Ct(t.meta),t.launch_source??t.kind,t.request_payload??null),o=this.getTrackedInvocation(Number(i.lastInsertRowid));return q_(this.db,o),o}getTrackedInvocation(t){return this.stmts.getTrackedInvocation.get(t)??null}listAllRunningTrackedInvocations(){return this.stmts.listAllRunningTrackedInvocations.all()}finishTrackedInvocation(t,n){return this.db.transaction(()=>{let r=n.ended_at??M();if(this.stmts.finishTrackedInvocation.run(n.status,r,n.exit_code??null,n.signal??null,Ct(n.result_summary),Ct(n.error),n.team_chat_log_id??null,Ct(n.meta),r,t).changes!==1)return null;let i=this.getTrackedInvocation(t);return ro(this.db,i),i})()}reclaimTrackedInvocationIfUnchanged(t,n,r){return this.db.transaction(()=>{let s=r.ended_at??M();if(this.stmts.reclaimTrackedInvocationIfUnchanged.run(r.status,s,r.exit_code??null,r.signal??null,Ct(r.result_summary),Ct(r.error),r.team_chat_log_id??null,Ct(r.meta),s,t,n.holder_pid,n.holder_host,n.started_at,n.last_heartbeat_at).changes!==1)return null;let o=this.getTrackedInvocation(t);return ro(this.db,o),o})()}heartbeatTrackedInvocation(t,n=M()){return this.db.transaction(()=>{if(this.stmts.heartbeatTrackedInvocation.run(n,t).changes!==1)return null;let s=this.getTrackedInvocation(t);return H_(this.db,s,n),s})()}updateTrackedInvocationRequestPayload(t,n){return this.db.transaction(()=>this.stmts.updateTrackedInvocationRequestPayload.run(n,t).changes!==1?null:(X_(this.db,t,n),this.getTrackedInvocation(t)))()}linkTrackedInvocationMessage(t,n){return this.db.transaction(()=>this.stmts.linkTrackedInvocationChatLog.run(n,t).changes!==1?null:(J_(this.db,t,rn(n)),this.getTrackedInvocation(t)))()}abortTrackedInvocationAndTerminalizeMessage(t,n,r){return this.db.transaction(()=>{let s=M();if(this.stmts.abortTrackedInvocationIfUnchanged.run(s,Ct(r),t,n.holder_pid,n.holder_host,n.started_at,n.last_heartbeat_at).changes!==1)return null;let o=this.getTrackedInvocation(t);return ro(this.db,o),o.team_chat_log_id!==null&&this.terminalizeLinkedChatMessage(o.team_chat_log_id,r),o})()}terminalizeLinkedChatMessage(t,n){let r=this.stmts.getTeamChatLogById.get(t);r===void 0||r.status!=="running"||this.stmts.terminalizeTeamChatLogIfRunning.run("error",n,t).changes!==1||no(this.db,t,{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:M()})}listClaimableTerminalTrackedInvocations(t){let n=["status IN ('done', 'error', 'busy', 'cancelled')","ended_at IS NOT NULL","notified_by IS NULL"],r=[];t.from!==void 0&&(n.push("from_identity = ?"),r.push(t.from)),t.scope_teamfile!==void 0&&(n.push("scope_teamfile = ?"),r.push(t.scope_teamfile));let s=Math.max(1,Math.min(1e3,Math.trunc(t.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(t,n,r=M()){return this.db.transaction(()=>{if(this.stmts.claimTrackedInvocationNotification.run(n,r,t).changes!==1)return null;let i=this.getTrackedInvocation(t);return B_(this.db,i,n,r),i})()}listTrackedInvocations(t={}){let n=[],r=[];t.from!==void 0&&(n.push("from_identity = ?"),r.push(t.from)),t.scope_teamfile!==void 0&&(n.push("scope_teamfile = ?"),r.push(t.scope_teamfile)),t.status!==void 0&&(n.push("status = ?"),r.push(t.status)),t.kind!==void 0&&(n.push("kind = ?"),r.push(t.kind)),t.origin!==void 0&&(n.push("origin = ?"),r.push(t.origin));let s=Math.max(1,Math.min(1e3,Math.trunc(t.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(t={}){let n=[],r=[];t.from!==void 0&&(n.push("from_identity = ?"),r.push(t.from)),t.scope_teamfile!==void 0&&(n.push("scope_teamfile = ?"),r.push(t.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(t={}){return this.listTrackedInvocations({...t,status:"running"})}enqueueMail(t){return this.sendMailboxMessage(t)}sendMailboxMessage(t){return this.db.transaction(()=>{let r=this.stmts.insertMailboxMessage.run(t.receiver_teamfile,t.receiver_alias,t.sender_teamfile??null,t.sender_alias??null,t.root_teamfile??null,Is(t.payload),t.created_at??M(),t.remote_transport??null,t.remote_message_id??null,t.remote_thread_id??null,t.meta??null,t.message_type??"request",t.reply_mode??"pull",t.request_mailbox_id??null),s=this.getMailboxMessage(Number(r.lastInsertRowid));return Sc(this.db,s,{provider:t.receiver_provider,sessionId:t.receiver_session_id},{provider:t.sender_provider,sessionId:t.sender_session_id}),s})()}listEnqueuedRequestMailFromSender(t,n,r,s){return this.stmts.listEnqueuedRequestMailFromSender.all(t,n,r,s)}listEnqueuedResponseMailFromSender(t,n,r,s){return this.stmts.listEnqueuedResponseMailFromSender.all(t,n,r,s)}listRelayMailboxLanes(t){return this.stmts.listRelayMailboxLanes.all(Math.max(1,Math.trunc(t)))}markMailDelivered(t,n,r){let s=[...new Set(t.map(a=>Math.trunc(a)).filter(a=>Number.isInteger(a)&&a>0))];if(s.length===0)return 0;let i=Is(n),o=[];this.db.exec("BEGIN IMMEDIATE");try{let a=0;for(let c of s){let d=this.getMailboxMessage(c),u=this.stmts.markMailboxMessageDelivered.run(r,i,c);a+=u.changes,u.changes===1&&d!==null&&o.push(d)}let l=new Map;for(let c of o){if(c.message_type!=="request")continue;let d=`${c.receiver_teamfile}\0${c.receiver_alias}`,u=l.get(d);(u===void 0||Qn([u,c])?.id===c.id)&&l.set(d,c)}for(let c of o){let d=l.get(`${c.receiver_teamfile}\0${c.receiver_alias}`)??null;Rs(this.db,c,i,r,null,c.message_type==="request"&&d!==null?{action:"clear",messageId:Pe(d.id)}:null)}this.db.exec("COMMIT");for(let c of o)xn("mailbox_delivery_delivered",c,{transition:c.delivering_at===null?"pending->delivered":"delivering->delivered",delivered_at:r});return a}catch(a){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),a}}markRelayRequestDelivered(t,n,r){let s=Is(n),i=[],o=[];this.db.exec("BEGIN IMMEDIATE");try{let a=0;for(let d of t){if(this.stmts.markMailboxMessageDeliveredIfUnchanged.run(r,s,d.id,d.delivering_at,d.delivery_holder_pid,d.delivery_holder_host).changes!==1){o.push(d);continue}a+=1,i.push(d)}let l=Qn(i),c=l===null?null:{action:"clear",messageId:Pe(l.id)};for(let d of i)Rs(this.db,d,s,r,null,c);this.db.exec("COMMIT");for(let d of i)xn("mailbox_delivery_delivered",d,{transition:"delivering->delivered",delivered_at:r,finalizer:"lease-cas"});for(let d of o)xn("mailbox_delivery_finalize_skipped",d,{delivered_at:r,finalizer:"lease-cas",reason:"observed delivery lease changed before finalization"});return a}catch(a){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),a}}markRelayRequestDeliveredAndEnqueueResponses(t,n,r){let s=Is(n),i=[],o=[];this.db.exec("BEGIN IMMEDIATE");try{let a=0,l=0;for(let p of t){if(this.stmts.markMailboxMessageDeliveredIfUnchanged.run(r,s,p.id,p.delivering_at,p.delivery_holder_pid,p.delivery_holder_host).changes!==1){o.push(p);continue}a+=1,i.push(p)}let c=[...i].sort((p,_)=>p.created_at.localeCompare(_.created_at)||p.id-_.id),d=Qn(i),u=null;if(d!==null&&d.sender_teamfile!==null&&d.sender_alias!==null){let p=this.stmts.insertMailboxResponseIfAbsent.run(d.sender_teamfile,d.sender_alias,d.receiver_teamfile,d.receiver_alias,d.root_teamfile,s,r,null,null,null,null,d.reply_mode,d.id);if(l=p.changes,p.changes===1&&(u=this.getMailboxMessage(Number(p.lastInsertRowid)),u===null))throw new Error("mailbox response disappeared during event append")}let f=u===null?null:Pe(u.id),m=d===null?null:{action:"clear",messageId:Pe(d.id)};for(let p of i)Rs(this.db,p,s,r,d!==null&&p.id!==d.id?f:null,m);u!==null&&Sc(this.db,u,{},{},c.map(p=>Pe(p.id))),this.db.exec("COMMIT");for(let p of i)xn("mailbox_delivery_delivered",p,{transition:"delivering->delivered",delivered_at:r,finalizer:"lease-cas-with-response"});for(let p of o)xn("mailbox_delivery_finalize_skipped",p,{delivered_at:r,finalizer:"lease-cas-with-response",reason:"observed delivery lease changed before finalization"});return{marked:a,responses:l}}catch(a){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),a}}claimMailForDelivery(t,n,r=process.pid,s=Cs()){let i=[...new Set(t.map(o=>Math.trunc(o)).filter(o=>Number.isInteger(o)&&o>0))];if(i.length===0)return[];this.db.exec("BEGIN IMMEDIATE");try{let o=[];for(let l of i)if(this.stmts.claimMailboxMessageDelivery.run(n,r,s,l).changes===1){let d=this.getMailboxMessage(l);d!==null&&(L_(this.db,d,n,r,s),o.push(d))}this.db.exec("COMMIT");let a=o.map(l=>l.id);for(let l of o)xn("mailbox_delivery_claimed",l,{transition:"pending->delivering",batch_ids:a,delivering_at:n,delivery_holder_pid:r,delivery_holder_host:s});return o}catch(o){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),o}}clearMailDelivery(t){let n=[...new Set(t.map(s=>Math.trunc(s)).filter(s=>Number.isInteger(s)&&s>0))];if(n.length===0)return 0;let r=[];this.db.exec("BEGIN IMMEDIATE");try{let s=0;for(let i of n){let o=this.getMailboxMessage(i),a=this.stmts.clearMailboxMessageDelivery.run(i);s+=a.changes,a.changes===1&&o!==null&&o.delivering_at!==null&&(Ic(this.db,o,"explicit-clear"),r.push(o))}this.db.exec("COMMIT");for(let i of r)xn("mailbox_delivery_cleared",i,{transition:"delivering->pending",reason:"explicit non-CAS clear"});return s}catch(s){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),s}}reclaimMailboxDeliveryIfUnchanged(t,n="delivery-failure"){return this.db.transaction(()=>{let s=this.getMailboxMessage(t.id);if(this.stmts.clearMailboxMessageDeliveryIfUnchanged.run(t.id,t.delivering_at,t.delivery_holder_pid,t.delivery_holder_host).changes!==1)return null;if(s===null)throw new Error("mailbox row disappeared during claim release");return s.delivering_at!==null&&Ic(this.db,s,n),this.getMailboxMessage(t.id)})()}reclaimStaleMailboxDeliveries(t){let n=this.stmts.listInFlightMailboxDeliveries.all(),r=[],s=[];this.db.exec("BEGIN IMMEDIATE");try{for(let i of n){let o=WR(i,t);if(!o.reclaim){s.push({row:i,decision:o,reclaimed:!1});continue}let a=this.reclaimMailboxDeliveryIfUnchanged(i,o.reason),l=a!==null;s.push({row:i,decision:o,reclaimed:l}),l&&r.push(a)}this.db.exec("COMMIT");for(let i of s)xn(i.decision.reclaim?i.reclaimed?"mailbox_delivery_reclaimed":"mailbox_delivery_reclaim_raced":"mailbox_delivery_reclaim_deferred",i.row,{transition:i.reclaimed?"delivering->pending":"delivering->delivering",stale_before:t,reclaim_reason:i.decision.reason,holder_pid_alive:i.decision.holderPidAlive});return r}catch(i){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),i}}listDeliveredReceiptsForSender(t,n){return this.stmts.listDeliveredReceiptsForSender.all(t,n)}listOutboundPendingForSender(t,n){return this.stmts.listOutboundPendingForSender.all(t,n)}getMailboxMessage(t){return this.stmts.getMailboxMessage.get(t)??null}peekMailboxMessages(t,n=1e3){return this.stmts.listMailboxMessagesForReceiver.all(t.receiver_teamfile,t.receiver_alias,Math.max(1,Math.min(1e3,Math.trunc(n))))}recvMailboxMessages(t){return this.recvMailboxMessagesTxn(t.receiver_teamfile,t.receiver_alias)}updateTeamChatLogResponse(t,n){this.stmts.updateTeamChatLogResponse.run(n.response,n.status,n.error_detail,n.truncated,t)}getAgentInflight(t,n){return this.stmts.getAgentInflight.get(t,n)??null}listAgentInflight(){return this.stmts.listAgentInflight.all()}tryAcquireAgentInflight(t,n){return this.tryAcquireAgentInflightTxn(t,n)}heartbeatAgentInflight(t,n,r=M()){return this.db.transaction(()=>{let s=this.getAgentInflight(t.receiver_teamfile,t.receiver_alias);return s===null||s.sender_teamfile!==t.sender_teamfile||s.sender_alias!==t.sender_alias||s.started_at!==t.started_at?!1:C_(this.db,s,n,r)})()}clearAgentInflight(t,n){this.db.transaction(()=>{let s=this.getAgentInflight(t,n);if(s===null)return;this.stmts.clearAgentInflight.run(t,n).changes===1&&Ls(this.db,s,"INFLIGHT_RECLAIM","stale")})()}clearObservedTerminalAgentInflight(t,n,r){return this.db.transaction(()=>{let i=this.getAgentInflight(t,n),o=this.stmts.clearObservedTerminalAgentInflight.run({receiver_teamfile:t,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&&Ls(this.db,i,"INFLIGHT_RELEASE"),o.changes===1})()}releaseAgentInflight(t,n){this.db.exec("BEGIN IMMEDIATE");try{let r=this.getAgentInflight(t.receiver_teamfile,t.receiver_alias);if(r===null||r.sender_teamfile!==t.sender_teamfile||r.sender_alias!==t.sender_alias)return this.db.exec("COMMIT"),!1;if(n!==void 0&&this.db.prepare(`SELECT lease_id FROM agent_state
|
|
1624
1624
|
WHERE receiver_teamfile = ? AND receiver_alias = ?`).get(t.receiver_teamfile,t.receiver_alias)?.lease_id!==n)return this.db.exec("COMMIT"),!1;if(r.active_count<=1){let i=this.stmts.clearAgentInflightIfSender.run(t.receiver_teamfile,t.receiver_alias,t.sender_teamfile,t.sender_alias);return i.changes===1&&Ls(this.db,r,"INFLIGHT_RELEASE"),this.db.exec("COMMIT"),i.changes===1}let s=this.stmts.decrementAgentInflight.run(t.receiver_teamfile,t.receiver_alias,t.sender_teamfile,t.sender_alias);return this.db.exec("COMMIT"),s.changes===1}catch(r){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),r}}clearAgentInflightOlderThan(t){return this.db.transaction(()=>{let r=this.listAgentInflight().filter(i=>i.started_at<t),s=0;for(let i of r)this.stmts.clearAgentInflight.run(i.receiver_teamfile,i.receiver_alias).changes===1&&(Ls(this.db,i,"INFLIGHT_RECLAIM","stale"),s+=1);return s})()}getTerminalLock(t,n){let r=this.stmts.getRuntimeState.get(Ns,As(t,n),xs);return r===void 0?null:v_(r.data)}setTerminalLock(t){this.db.transaction(()=>{let r=this.getTerminalLock(t.teamfile,t.alias);r!==null&&r.lock_id!==t.lock_id&&Nc(this.db,r,!0),this.stmts.upsertRuntimeState.run(Ns,As(t.teamfile,t.alias),xs,JSON.stringify(t),t.last_heartbeat),r?.lock_id!==t.lock_id&&M_(this.db,t)})()}heartbeatTerminalLock(t,n,r,s){this.db.exec("BEGIN IMMEDIATE");try{let i=this.getTerminalLock(t,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(Ns,As(t,n),xs,JSON.stringify(o),s),this.db.exec("COMMIT"),!0}catch(i){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),i}}clearTerminalLock(t,n,r){this.db.exec("BEGIN IMMEDIATE");try{let s=this.getTerminalLock(t,n);if(s===null||s.lock_id!==r)return this.db.exec("COMMIT"),!1;let i=this.stmts.deleteRuntimeState.run(Ns,As(t,n),xs);return i.changes===1&&Nc(this.db,s),this.db.exec("COMMIT"),i.changes===1}catch(s){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),s}}getRuntimeProcessLock(t,n,r){let s=this.stmts.getRuntimeState.get(t,n,r);return s===void 0?null:FR(s.data)}tryAcquireRuntimeProcessLock(t,n,r,s,i=M()){this.db.exec("BEGIN IMMEDIATE");try{let o=this.getRuntimeProcessLock(t,n,r);if(o!==null&&!UR(o,s))return this.db.exec("COMMIT"),{acquired:!1,current:o};let a={lock_id:z_(),holder_pid:process.pid,holder_host:Cs(),started_at:i,last_heartbeat:i};return this.stmts.upsertRuntimeState.run(t,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(t,n,r,s){this.db.exec("BEGIN IMMEDIATE");try{let i=this.getRuntimeProcessLock(t,n,r);if(i===null||i.lock_id!==s)return this.db.exec("COMMIT"),!1;let o=this.stmts.deleteRuntimeState.run(t,n,r);return this.db.exec("COMMIT"),o.changes===1}catch(i){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),i}}getRun(t){return this.stmts.getRun.get(t)??null}setRunCurrentState(t,n){return this.stmts.setRunCurrentState.run(n,t),this.stmts.getRun.get(t)??null}setRunPausedState(t,n,r){return this.stmts.setRunPausedState.run(n,r,t),this.stmts.getRun.get(t)??null}setRunPendingEscalationDecision(t,n){return this.stmts.setRunPendingEscalationDecision.run(n,t),this.stmts.getRun.get(t)??null}setRunTerminalState(t,n){return this.stmts.setRunTerminalState.run(n,M(),t),this.stmts.getRun.get(t)??null}pauseJob(t){return this.stmts.pauseJob.run(t),this.getJob(t)}resumeRun(t,n){return this.resumeRunTxn(t,n,M())}insertStep(t){let n=this.stmts.insertStep.run(t.run_id,t.parent_step_id??null,t.state_name,t.outcome??null,t.status_detail??null,M());return this.stmts.getStep.get(n.lastInsertRowid)}finishStep(t,n,r){return this.stmts.finishStep.run(n??null,r??null,M(),t),this.stmts.getStep.get(t)??null}listStepsForRun(t){return this.stmts.listStepsForRun.all(t)}listLatestStepOutcomesByState(t){let n=this.stmts.listLatestStepOutcomesByState.all(t),r={};for(let s of n)r[s.state_name]=s.outcome;return r}insertSubmittedPr(t){let n=this.stmts.insertSubmittedPr.run(t.repo,t.pr_url,t.issue_url??null,t.local_path??null,t.branch??null,t.head_sha??null,t.status??"watching",t.submitted_at??M(),t.last_known_state??null,t.created_by_run_id??null);return this.stmts.getSubmittedPr.get(n.lastInsertRowid)}listSubmittedPrs(t){return t?.status!==void 0?this.stmts.listSubmittedPrsByStatus.all(t.status):this.stmts.listSubmittedPrs.all()}getSubmittedPr(t){return this.stmts.getSubmittedPr.get(t)??null}findSubmittedPrByUrl(t){return this.stmts.findSubmittedPrByUrl.get(t)??null}insertStepArtifact(t){let n=this.stmts.insertStepArtifact.run(t.step_id,t.kind,t.path??null,t.content??null,t.sha??null,t.provider_call_mode??null,M());return this.stmts.getStepArtifact.get(n.lastInsertRowid)}insertExternalObject(t){let r=this.stmts.insertExternalObject.run(t.type,t.provider,t.project_id,t.run_id??null,t.external_id,t.url??null,t.status??null,t.metadata??null,t.last_seen_at??null,M()).changes===1;return{row:this.stmts.findExternalObjectByUnique.get(t.provider,t.type,t.external_id),inserted:r}}insertExternalSignal(t){let n=this.stmts.insertExternalSignal.run(t.object_id,t.kind,t.source??null,t.occurred_at??null,t.payload??null,t.signal_hash??null,null,M()),r=n.changes===1;return{row:t.signal_hash===void 0||t.signal_hash===null?this.stmts.getExternalSignal.get(n.lastInsertRowid):this.stmts.findExternalSignalByUnique.get(t.object_id,t.kind,t.signal_hash),inserted:r}}raiseAttention(t){let n=this.stmts.insertAttention.run(t.kind,t.severity??"warn",t.project_id??null,t.run_id??null,t.external_object_id??null,t.requires_user===!0?1:0,t.payload??null,M());return this.stmts.getAttention.get(n.lastInsertRowid)}acknowledgeAttention(t){return this.stmts.ackAttention.run(M(),t),this.stmts.getAttention.get(t)??null}upsertDurableMemory(t){let n=M();return this.stmts.upsertDurableMemory.run(t.project_id,t.type,t.name,t.description??null,t.body,n,n),this.stmts.getDurableMemoryByName.get(t.project_id,t.name)}getDurableMemoryByName(t,n){return this.stmts.getDurableMemoryByName.get(t,n)??null}deleteDurableMemory(t,n){return this.stmts.deleteDurableMemory.run(t,n).changes>0}listDurableMemory(t,n){return n!==void 0?this.stmts.listDurableMemoryByType.all(t,n):this.stmts.listDurableMemory.all(t)}indexDurableMemory(t,n){return n!==void 0&&n.length>0?this.stmts.listDurableMemory.all(t).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(t).map(({name:r,description:s,type:i,updated_at:o})=>({name:r,description:s,type:i,updated_at:o}))}recordSessionSize(t){let n=this.stmts.insertSessionSize.run(t.team_name,t.alias,t.sessionid,t.input_tokens??null,t.cache_tokens??null,t.output_tokens??null,t.total_tokens??null,t.observed_at??M());return this.stmts.getSessionSize.get(n.lastInsertRowid)}latestSessionSizes(){return this.stmts.latestSessionSizes.all()}sessionSizeHistory(t,n,r=20){return this.stmts.sessionSizeHistory.all(t,n,r)}insertSessionEvent(t){let n=this.stmts.insertSessionEvent.run(t.run_id,t.step_id??null,t.kind,t.timestamp_ms,t.payload,t.payload_truncated??0,t.overflow_artifact_id??null);return this.stmts.getSessionEvent.get(n.lastInsertRowid)}listSessionEvents(t,n){return n!==void 0?this.stmts.listSessionEventsSince.all(t,n):this.stmts.listSessionEvents.all(t)}listSessionEventsSince(t,n=1e3){return this.stmts.listAllEventsSince.all(t,n)}latestAgentCall(t){let n=this.db.prepare("SELECT payload FROM session_event WHERE run_id = ? AND kind = 'agent_call' ORDER BY id DESC LIMIT 1").get(t);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(t){let n=this.db.prepare("SELECT payload FROM session_event WHERE run_id = ? AND kind = 'agent_call'").all(t),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(t){this.stmts.upsertRollupStat.run(t.run_id,t.step_id??null,t.metric_kind,t.value,t.bucket_start_ms,t.bucket_end_ms,t.updated_at)}listRollupStats(t){return this.stmts.listRollupStats.all(t)}getRollupCursor(){return this.stmts.getRollupCursor.get("last_event_id")?.value??0}setRollupCursor(t){this.stmts.setRollupCursor.run("last_event_id",t)}insertDriftSignal(t){let n=this.stmts.insertDriftSignal.run(t.team_member_id,t.project_id??null,t.signal_kind,t.severity,t.description,t.detected_at,t.expires_at??null,t.payload??null);return this.stmts.getDriftSignal.get(n.lastInsertRowid)}listDriftSignals(t={}){return t.team_member_id!==void 0&&t.unacked?this.stmts.listUnackedDriftByMember.all(t.team_member_id):t.team_member_id!==void 0?this.stmts.listDriftByMember.all(t.team_member_id):t.project_id!==void 0?this.stmts.listDriftByProject.all(t.project_id):this.stmts.listAllDrift.all()}hasUnackedDriftSignal(t,n,r){return this.stmts.findUnackedDrift.get(t,n??null,r)!==void 0}acknowledgeDriftSignal(t){return this.stmts.ackDriftSignal.run(Date.now(),t),this.stmts.getDriftSignal.get(t)??null}insertInteractiveSession(t){let n=Date.now();return this.stmts.insertInteractiveSession.run(t.run_id,t.step_id,t.state_name,t.status,n,n),this.stmts.getInteractiveSessionByStepId.get(t.step_id)}getInteractiveSessionByStepId(t){return this.stmts.getInteractiveSessionByStepId.get(t)??null}getInteractiveSessionByRunAndState(t,n){return this.stmts.getInteractiveSessionByRunAndState.get(t,n)??null}setInteractiveAgentOutput(t,n,r){this.stmts.setInteractiveAgentOutput.run(n,r,Date.now(),t)}resumeInteractive(t,n,r){return this.resumeInteractiveTxn(t,n,r,M())}resumeEscalation(t,n){return this.resumeEscalationTxn(t,n,M())}}});import{realpathSync as XR}from"node:fs";import{resolve as JR}from"node:path";function Lc(e){let t=JR(e);try{return XR(t)}catch{return t}}var eh=w(()=>{"use strict"});import{platform as th}from"node:os";function Dt(e){let t=new Ms;for(let n of e)t.registerAdapter(n);return t}var Ms,Oc=w(()=>{"use strict";eh();Ms=class{providers=[];adapters=new Map;register(t){this.providers.push(t)}async listAll(t){let n=[],r=t?.provider?this.providers.filter(o=>o.name===t.provider):this.providers,s=await Promise.all(r.map(o=>o.discoverSessions()));for(let o of s)n.push(...o);let i=n;if(t?.workspace){let o=Lc(t.workspace);i=i.filter(a=>Lc(a.cwd)===o)}if(t?.from){let o=t.from.getTime();i=i.filter(a=>a.modifiedAt.getTime()>=o)}if(t?.to){let o=t.to.getTime();i=i.filter(a=>a.modifiedAt.getTime()<=o)}return i.sort((o,a)=>a.modifiedAt.getTime()-o.modifiedAt.getTime()),t?.limit&&(i=i.slice(0,t.limit)),i}async getSession(t,n){let r=n?this.providers.filter(s=>s.name===n):this.providers;for(let s of r){let i=await s.loadSession(t);if(i)return i}return null}async resolveSession(t,n){let r=await this.resolveSessions(t,n);return r.length===1?r[0]:null}async resolveSessions(t,n){let r=n?this.providers.filter(i=>i.name===n):this.providers,s=[];for(let i of r){let o=await i.resolveSessionPath(t);o&&s.push({provider:i,filePath:o})}return s}getWatchTargets(){let t=th()==="darwin"||th()==="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:t,filePattern:s.filePattern});return n}async deleteSession(t,n){let r=await this.resolveSession(t,n);return r?r.provider.deleteSession(t):!1}registerAdapter(t){this.adapters.set(t.name,t),this.providers.push({name:t.name,discoverSessions:()=>t.discover(),loadSession:n=>t.load(n),resolveSessionPath:n=>t.resolvePath(n),deleteSession:n=>t.delete(n),getWatchPaths:()=>t.getWatchPaths?.()??[]})}getAdapter(t){return this.adapters.get(t)}getAllAdapters(){return[...this.adapters.values()]}}});import{createReadStream as nh}from"node:fs";import{createInterface as rh}from"node:readline";import{stat as GR}from"node:fs/promises";import{homedir as KR}from"node:os";function sh(e){try{let t=JSON.parse(e);return t===null||typeof t!="object"||Array.isArray(t)?void 0:t}catch{return}}async function*Je(e){let t=nh(e,{encoding:"utf-8"}),n=rh({input:t,crlfDelay:1/0});try{for await(let r of n){let s=r.trim();if(!s)continue;let i=sh(s);i!==void 0&&(yield i)}}finally{t.destroy()}}async function Ve(e,t){let n=[],r=nh(e,{encoding:"utf-8"}),s=rh({input:r,crlfDelay:1/0});try{for await(let i of s){let o=i.trim();if(!o)continue;let a=sh(o);if(a!==void 0&&n.push(a),n.length>=t)break}}finally{s.close(),r.destroy()}return n}async function Ce(e){let t=await GR(e);return{createdAt:t.birthtime,modifiedAt:t.mtime}}function pe(e){return e.replace(/\\n/g,`
|
|
1625
|
-
`).replace(/\\t/g," ").replace(/\\r/g,"\r")}function G(e,t){return e.length<=t?e:e.slice(0,t-3)+"..."}function jt(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)?e:void 0}var ke,on=w(()=>{"use strict";ke=KR()});import{readdir as ao,stat as ih,unlink as VR}from"node:fs/promises";import{join as Or,basename as oh}from"node:path";function YR(e){return e==="file-history-snapshot"||e==="progress"||e==="system"||e==="queue-operation"}function zR(e){if(e.type==="system"){let t=e.message?.content;if(typeof t=="string"&&t.trim())return pe(t.trim());if(t!==void 0)return JSON.stringify(t,null,2)}return e.type==="progress"&&e.data!==void 0?JSON.stringify(e.data,null,2):JSON.stringify(e,null,2)}async function ah(e){let t=0,n=0,r=0,s=0,i=0,o=0,a;for await(let l of Je(e))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;t++}}else if(l.type==="assistant"&&l.message){let c=l.message.content;if(Array.isArray(c))for(let u of c)u.type==="text"&&t++;let d=l.message.usage;if(d){let u=d.input_tokens||0,f=d.cache_creation_input_tokens||0,m=d.cache_read_input_tokens||0,p=d.output_tokens||0;n+=u+f+m,r+=m,s+=f,i+=p;let _=u+f+m;_&&(o=_),a={inputTokens:u,cacheWriteInputTokens:f,cachedInputTokens:m,outputTokens:p}}}}return{messageCount:t,totalInputTokens:n,totalCacheReadInputTokens:r,totalCacheWriteInputTokens:s,totalOutputTokens:i,lastInputTokens:o,lastTokenUsage:a}}function ZR(e){let t=QR(e),n=new Set;for(let r of e){if(r.role!=="tool_use"||r.toolName!=="Bash"||r.toolInputData?.run_in_background!==!0||r.toolCallId===void 0)continue;let s=t.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 e){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=t.get(r.toolCallId);i!==void 0&&(i.backgroundTaskId=s)}}function QR(e){let t=new Map;for(let n of e)n.role==="tool_result"&&n.toolCallId!==void 0&&t.set(n.toolCallId,n);return t}var lo,lh=w(()=>{"use strict";on();lo=class{name="claude";claudeDir;projectsDir;constructor(t={}){this.claudeDir=t.claudeDir||Or(ke,".claude"),this.projectsDir=Or(this.claudeDir,"projects")}getWatchPaths(){return[{directory:this.projectsDir,filePattern:/\.jsonl$/}]}async discoverSessions(){let t=[],n;try{n=await ao(this.projectsDir)}catch{return t}for(let r of n){let s=Or(this.projectsDir,r);if(!(await ih(s).catch(()=>null))?.isDirectory())continue;let o;try{o=await ao(s)}catch{continue}for(let a of o){if(!a.endsWith(".jsonl"))continue;let l=oh(a,".jsonl");if(!/^[0-9a-f]{8}-/.test(l))continue;let c=Or(s,a);try{let d=await this.extractSummary(c,l);d&&t.push(d)}catch{}}}return t}async extractSummary(t,n){let r=await Ve(t,50),s=await Ce(t),i="",o,a,l,c,d,u;for(let m of r)if(!YR(m.type)&&(!i&&m.cwd&&(i=m.cwd),!o&&m.slug&&(o=m.slug),!a&&m.version&&(a=m.version),!u&&m.timestamp&&(u=new Date(m.timestamp)),m.type==="assistant"&&m.message?.model&&(l=m.message.model),m.type==="user"&&!m.isMeta&&m.message)){let p=m.message.content;if(typeof p=="string"){if(p.includes("<command-name>")||p.includes("<local-command-"))continue;c||(c=G(p.trim(),80)),d=G(p.trim(),80)}}if(!i)return null;let f=await ah(t);return{provider:"claude",sessionId:n,slug:o,cwd:i,createdAt:u||s.createdAt,modifiedAt:s.modifiedAt,model:l,cliVersion:a,startCommand:"claude",firstUserMessage:c,lastUserMessage:d,messageCount:f.messageCount,filePath:t,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(t){let n=await this.resolveSessionFile(t);if(!n)return null;let r=await Ce(n),s=[],i="",o,a,l,c,d,u,f,m=t,p;for await(let h of Je(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:zR(h)});continue}if(h.type==="user"&&h.message){if(h.isMeta)continue;let g=new Date(h.timestamp||0),
|
|
1625
|
+
`).replace(/\\t/g," ").replace(/\\r/g,"\r")}function G(e,t){return e.length<=t?e:e.slice(0,t-3)+"..."}function jt(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)?e:void 0}var ke,on=w(()=>{"use strict";ke=KR()});import{readdir as ao,stat as ih,unlink as VR}from"node:fs/promises";import{join as Or,basename as oh}from"node:path";function YR(e){return e==="file-history-snapshot"||e==="progress"||e==="system"||e==="queue-operation"}function zR(e){if(e.type==="system"){let t=e.message?.content;if(typeof t=="string"&&t.trim())return pe(t.trim());if(t!==void 0)return JSON.stringify(t,null,2)}return e.type==="progress"&&e.data!==void 0?JSON.stringify(e.data,null,2):JSON.stringify(e,null,2)}async function ah(e){let t=0,n=0,r=0,s=0,i=0,o=0,a;for await(let l of Je(e))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;t++}}else if(l.type==="assistant"&&l.message){let c=l.message.content;if(Array.isArray(c))for(let u of c)u.type==="text"&&t++;let d=l.message.usage;if(d){let u=d.input_tokens||0,f=d.cache_creation_input_tokens||0,m=d.cache_read_input_tokens||0,p=d.output_tokens||0;n+=u+f+m,r+=m,s+=f,i+=p;let _=u+f+m;_&&(o=_),a={inputTokens:u,cacheWriteInputTokens:f,cachedInputTokens:m,outputTokens:p}}}}return{messageCount:t,totalInputTokens:n,totalCacheReadInputTokens:r,totalCacheWriteInputTokens:s,totalOutputTokens:i,lastInputTokens:o,lastTokenUsage:a}}function ZR(e){let t=QR(e),n=new Set;for(let r of e){if(r.role!=="tool_use"||r.toolName!=="Bash"||r.toolInputData?.run_in_background!==!0||r.toolCallId===void 0)continue;let s=t.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 e){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=t.get(r.toolCallId);i!==void 0&&(i.backgroundTaskId=s)}}function QR(e){let t=new Map;for(let n of e)n.role==="tool_result"&&n.toolCallId!==void 0&&t.set(n.toolCallId,n);return t}var lo,lh=w(()=>{"use strict";on();lo=class{name="claude";claudeDir;projectsDir;constructor(t={}){this.claudeDir=t.claudeDir||Or(ke,".claude"),this.projectsDir=Or(this.claudeDir,"projects")}getWatchPaths(){return[{directory:this.projectsDir,filePattern:/\.jsonl$/}]}async discoverSessions(){let t=[],n;try{n=await ao(this.projectsDir)}catch{return t}for(let r of n){let s=Or(this.projectsDir,r);if(!(await ih(s).catch(()=>null))?.isDirectory())continue;let o;try{o=await ao(s)}catch{continue}for(let a of o){if(!a.endsWith(".jsonl"))continue;let l=oh(a,".jsonl");if(!/^[0-9a-f]{8}-/.test(l))continue;let c=Or(s,a);try{let d=await this.extractSummary(c,l);d&&t.push(d)}catch{}}}return t}async extractSummary(t,n){let r=await Ve(t,50),s=await Ce(t),i="",o,a,l,c,d,u;for(let m of r)if(!YR(m.type)&&(!i&&m.cwd&&(i=m.cwd),!o&&m.slug&&(o=m.slug),!a&&m.version&&(a=m.version),!u&&m.timestamp&&(u=new Date(m.timestamp)),m.type==="assistant"&&m.message?.model&&(l=m.message.model),m.type==="user"&&!m.isMeta&&m.message)){let p=m.message.content;if(typeof p=="string"){if(p.includes("<command-name>")||p.includes("<local-command-"))continue;c||(c=G(p.trim(),80)),d=G(p.trim(),80)}}if(!i)return null;let f=await ah(t);return{provider:"claude",sessionId:n,slug:o,cwd:i,createdAt:u||s.createdAt,modifiedAt:s.modifiedAt,model:l,cliVersion:a,startCommand:"claude",firstUserMessage:c,lastUserMessage:d,messageCount:f.messageCount,filePath:t,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(t){let n=await this.resolveSessionFile(t);if(!n)return null;let r=await Ce(n),s=[],i="",o,a,l,c,d,u,f,m=t,p;for await(let h of Je(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:zR(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;d||(d=G(y.trim(),80)),u=G(y.trim(),80),p=void 0,s.push({role:"user",timestamp:g,content:pe(y.trim())})}else if(Array.isArray(y)){for(let E of y)if(E.type==="tool_result"){let b=typeof E.content=="string"?pe(E.content):JSON.stringify(E.content);s.push({role:"tool_result",timestamp:g,content:b,toolCallId:E.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 E of y)E.type==="text"&&E.text?s.push({role:"assistant",timestamp:g,content:pe(E.text),model:h.message.model,...typeof h.message.stop_reason=="string"?{stopReason:h.message.stop_reason}:{}}):E.type==="tool_use"?s.push({role:"tool_use",timestamp:g,content:E.name||"unknown tool",toolName:E.name,toolInput:JSON.stringify(E.input,null,2),toolInputData:E.input,toolCallId:E.id,model:h.message.model,...typeof h.message.stop_reason=="string"?{stopReason:h.message.stop_reason}:{}}):E.type==="thinking"&&E.thinking&&s.push({role:"thinking",timestamp:g,content:E.thinking})}}if(!i)return null;ZR(s);let _=await ah(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:d,lastUserMessage:u,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(t){return this.resolveSessionFile(t)}async deleteSession(t){let n=await this.resolveSessionFile(t);return n?(await VR(n),!0):!1}async resolveSessionFile(t){let n;try{n=await ao(this.projectsDir)}catch{return null}let r=[];for(let o of n){let a=Or(this.projectsDir,o);if(!(await ih(a).catch(()=>null))?.isDirectory())continue;let c;try{c=await ao(a)}catch{continue}for(let d of c){if(!d.endsWith(".jsonl"))continue;let u=oh(d,".jsonl");/^[0-9a-f]{8}-/.test(u)&&r.push({filePath:Or(a,d),fileSessionId:u})}}let s=r.find(o=>o.fileSessionId===t);if(s)return s.filePath;let i=r.filter(o=>o.fileSessionId.startsWith(t));if(i.length===1)return i[0].filePath;for(let o of r){let a=await Ve(o.filePath,20);for(let l of a)if(l.slug&&l.slug===t)return o.filePath}return null}}});import{readFileSync as e0,writeFileSync as q3,mkdirSync as B3}from"node:fs";import{join as t0,dirname as X3}from"node:path";import{homedir as n0}from"node:os";function s0(e){return e.startsWith('"')&&e.endsWith('"')||e.startsWith("'")&&e.endsWith("'")?e.slice(1,-1):e}function i0(e){let t=e.indexOf("=");if(t===-1)return null;let n=e.slice(0,t).trim(),r=s0(e.slice(t+1).trim());return n?{key:n,value:r}:null}function o0(e){let t=e.trim();return t.startsWith("[")&&t.endsWith("]")?t.slice(1,-1).trim():null}function co(e){return"'"+e.replace(/'/g,"'\\''")+"'"}function a0(){return t0(n0(),".lmctl","config.toml")}function Cc(e){let t=e??a0(),n;try{n=e0(t,"utf-8")}catch{return{tools:{}}}return l0(n)}function ch(e){if(typeof e=="number")return Number.isFinite(e)?e:null;let t=String(e).trim();if(!t)return null;let n=t.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 l0(e){let t={},n={},r=e.split(`
|
|
1626
1626
|
`),s={kind:"none"},i={},o=!1,a={};function l(){if(s.kind==="tool"){let f=t[s.tool]??{};if(s.profile){let m=f.profiles?.[s.profile]??{};i.description&&(m.description=i.description),i.flags!==void 0&&(m.flags=i.flags),f.profiles||(f.profiles={}),f.profiles[s.profile]=m}else i.start&&(f.start=i.start),i.resume&&(f.resume=i.resume),i.agent&&(f.agent=i.agent),i.profile_flag!==void 0&&(f.profile_flag=i.profile_flag);t[s.tool]=f}else if(s.kind==="compact"){let f=s.provider?n.providers?.[s.provider]??{}:n.global??{};if(i.min!==void 0){let m=ch(i.min);m!==null&&(f.min=m)}if(i.max!==void 0){let m=ch(i.max);m!==null&&(f.max=m)}s.provider?(n.providers||(n.providers={}),n.providers[s.provider]=f):n.global=f}i={}}for(let f of r){let m=f.trim();if(!m||m.startsWith("#"))continue;let p=o0(m);if(p!==null){if(o=!0,l(),p.startsWith("tool.")){let h=".profile.",g=p.indexOf(h);g!==-1?s={kind:"tool",tool:p.slice(5,g),profile:p.slice(g+h.length)}:s={kind:"tool",tool:p.slice(5),profile:null}}else p==="compact"?s={kind:"compact",provider:null}:p.startsWith("compact.")?s={kind:"compact",provider:p.slice(8)}:s={kind:"none"};continue}let _=i0(m);_&&s.kind!=="none"?i[_.key]=_.value:_&&!o&&(a[_.key]=_.value)}l();let c={tools:t};(n.global||n.providers)&&(c.compact=n);let d=a.site_name;d!==void 0&&d.length>0&&(c.site_name=d);let u=a.mailbox_queue_enabled;return u!==void 0&&u.trim().length>0&&(c.mailbox_queue_enabled=u.trim().toLowerCase()!=="false"),c}function dh(e){return e.site_name??null}function uh(e=process.env){let t=e.LMCTL_MAILBOX_QUEUE_ENABLED;if(t!==void 0&&t.trim().length>0)return t.trim().toLowerCase()!=="false";try{return Cc().mailbox_queue_enabled??!1}catch{return!1}}function c0(e,t,n){if(!n)return"";let r=e.tools[t]??$c[t],s=r?.profiles?.[n]?.flags??$c[t]?.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 "${t}"`)}function fh(e,t){return!!e.tools[t]}function mh(e,t,n,r,s){let i=e.tools[t]??$c[t],o;if(i?.agent){let l=co(r);o=i.agent.replace(/\{\{session_id\}\}/g,n).replace(/\{\{prompt\}\}/g,l)}else{let l=r0[t];if(!l)throw new Error(`No agent command configured for tool "${t}"`);let c=l.argv.map(d=>d.replace(/\{\{session_id\}\}/g,n).replace(/\{\{prompt\}\}/g,r));if(l.mode==="stdin"){let d=c.map(co).join(" ");o=`printf '%s\\n' ${co(r)} | ${d}`}else o=c.map(co).join(" ")}let a=c0(e,t,s);return a&&(o+=" "+a),o}var $c,r0,uo=w(()=>{"use strict";$c={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:""}}}},r0={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 ph(e=process.env){let t=e.LMCTL_ONE_SHOT_TIMEOUT_MS;if(!t)return 6e5;let n=Number(t);return!Number.isFinite(n)||n<=0?6e5:n}var _h=w(()=>{"use strict"});var d0,ge,fo,yt=w(()=>{"use strict";d0="ACK: waiting for explicit lmctl task.",ge=`lmctl seed initial connection only. Create or pin this provider session, then stop. Do not inspect files, run commands, infer a task, delegate, edit, or begin work. Reply exactly: ${d0}`,fo=`send this exact lmctl seed instruction: "${ge}"`});function An(e,t){let n={...e??process.env,PWD:t};return delete n.OLDPWD,n}function f0(e,t){return t===void 0||t.length===0?e:{...e??process.env,[Ds]:t}}function Ye(e,t,n,r="chat"){return{...f0(An(e,t),n),[u0]:r}}var Ds,u0,Et=w(()=>{"use strict";Ds="LMCTL_SELF_SESSIONID",u0="LMCTL_LAUNCH_SOURCE"});import{spawn as hh}from"node:child_process";import{mkdirSync as m0}from"node:fs";var Mc,Ae,Pt=w(()=>{"use strict";uo();_h();yt();Et();Mc=class e extends Error{cancelReason;constructor(t,n){super(t),this.name="TurnAbortError",this.cancelReason=n,Object.setPrototypeOf(this,e.prototype)}},Ae=class e{name;capabilities;injection;provider;binary;seedArgs;seedStdin;resumeTemplate;startTemplate;transportFn;constructor(t){this.name=t.provider.name,this.provider=t.provider,this.capabilities=t.capabilities,this.injection=t.injection,this.binary=t.binary,this.seedArgs=t.seedArgs,this.seedStdin=t.seedStdin,this.resumeTemplate=t.resumeTemplate,this.startTemplate=t.startTemplate,this.transportFn=t.transport}discover(){return this.provider.discoverSessions()}load(t){return this.provider.loadSession(t)}resolvePath(t){return this.provider.resolveSessionPath(t)}delete(t){return this.provider.deleteSession(t)}getWatchPaths(){return this.provider.getWatchPaths?.()??[]}seedArgsFor(t){let n=t?.prompt;return n===void 0?this.seedArgs:this.seedArgs.map(r=>r===ge?n:r)}seed(t,n){return m0(t,{recursive:!0}),new Promise(r=>{let s;try{s=hh(this.binary,this.seedArgsFor(n),{cwd:t,env:An(void 0,t),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}
|
|
1627
1627
|
`: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(t,n){return this.resumeTemplate.replace(/\{\{session_id\}\}/g,t)}startCommand(t){return this.startTemplate}manualSeedHint(t){return{launchCommand:`cd ${t} && ${this.binary}`,postLaunchNote:fo,lsCommand:`lmctl ls --provider ${this.name} --sessiondir ${t}`}}static DEFAULT_IDLE_TIMEOUT_MS=8*60*60*1e3;sendTurn(t,n){if(n.userConfig&&fh(n.userConfig,this.name)){let s=n.userConfig.tools[this.name];if(s?.agent)return this.runOneShotAgent(t,n,s.agent)}let r=n.timeoutMs??e.DEFAULT_IDLE_TIMEOUT_MS;return r<=0&&!n.signal?this.transportFn(t,{...n,binary:this.binary}):this.withTimeouts(r,t,n)}withTimeouts(t,n,r){let s=new AbortController,i,o,a="",l,c=()=>{t<=0||(clearTimeout(i),i=setTimeout(()=>{r.onIdleWarning?.(t),d(),s.abort(),l&&l({text:a,sessionId:r.sessionId,durationMs:t,status:"stalled",stalledAfterMs:t})},t))},d=()=>{clearTimeout(i)};r.signal&&(r.signal.aborted?(o="external",s.abort()):r.signal.addEventListener("abort",()=>{o="external",s.abort()},{once:!0})),c();let u={...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,u).then(p=>(d(),{...p,status:"ok"})).catch(p=>{throw d(),o==="external"?new Mc("Turn cancelled","external"):p}),m=new Promise(p=>{l=p});return Promise.race([f,m])}runOneShotAgent(t,n,r){let s=mh(n.userConfig,this.name,n.sessionId,t,n.profile),i=Date.now();return new Promise((o,a)=>{let l=ph(n.env),c=hh(s,{shell:!0,cwd:n.cwd,env:Ye(n.env,n.cwd,n.sessionId),stdio:["pipe","pipe","pipe"]}),d=!1,u=!1,f=setTimeout(()=>{u=!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(d)return;d=!0,clearTimeout(f);let h=Date.now()-i;u?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",_=>{d||(d=!0,clearTimeout(f),a(_))})})}}});function po(e,t){let n;if(t&&typeof t=="object"){let r=t.code;typeof r=="number"&&(n=r)}return new ln(e,n,t)}var ut,Ie,an,mo,ln,$r=w(()=>{"use strict";ut=class extends Error{constructor(t,n){super(t,n),this.name=this.constructor.name}},Ie=class extends ut{},an=class extends ut{exitCode;signal;stderr;constructor(t,n,r=null,s){super(t),this.exitCode=n,this.signal=r,this.stderr=s}},mo=class extends ut{line;constructor(t,n,r){super(t,{cause:r}),this.line=n}},ln=class extends ut{rpcCode;rpcData;constructor(t,n,r){super(t),n!==void 0&&(this.rpcCode=n),r!==void 0&&(this.rpcData=r)}}});import*as jc from"node:child_process";function _0(e){if(typeof jc.spawnSync=="function")try{jc.spawnSync("taskkill",["/T","/F","/PID",String(e)],{windowsHide:!0})}catch{}}function gh(e){return e.exitCode!==null||e.signalCode!==null}function Dc(e,t){return gh(e)?Promise.resolve(!0):new Promise(n=>{let r=!1,s=()=>{r||(r=!0,clearTimeout(i),n(!0))},i=setTimeout(()=>{r||(r=!0,e.removeListener("exit",s),n(!1))},t);e.once("exit",s)})}async function tt(e,t={}){let n=Date.now(),r=t.stdinEnd!==!1,s=t.softDelayMs??5e3,i=t.killDelayMs??5e3,o=t.platform??process.platform,a=t.runTaskkill??_0;if(gh(e))return{signal:"natural",elapsedMs:Date.now()-n};if(r&&e.stdin&&!e.stdin.destroyed)try{e.stdin.end()}catch{}if(await Dc(e,s))return{signal:"stdin",elapsedMs:Date.now()-n};if(o==="win32"&&typeof e.pid=="number")a(e.pid);else try{e.kill("SIGTERM")}catch{}if(await Dc(e,i))return{signal:"SIGTERM",elapsedMs:Date.now()-n};if(o!=="win32")try{e.kill("SIGKILL")}catch{}return await Dc(e,p0)?{signal:"SIGKILL",elapsedMs:Date.now()-n}:{signal:"abandoned",elapsedMs:Date.now()-n}}var p0,js=w(()=>{"use strict";p0=1e3});function yh(e){le()&&Ue({event:"legacy",msg:`[debug] ${e}`},{always:!0})}function Rn(e,t){let n=g0[e];if(n)return n[t]??n.yolo}function E0(e,t){if(t.length===0)return!0;for(let n=0;n+t.length<=e.length;n++){let r=!0;for(let s=0;s<t.length;s++)if(e[n+s]!==t[s]){r=!1;break}if(r)return!0}return!1}function wt(e,t,n="yolo"){if(y0.has(e)){yh(`YOLO ${e} [mode=${n}]: ${e==="codex"?`JSON-RPC params (approvalPolicy=never, sandbox=${n==="plan"?"read-only":"danger-full-access"})`:e==="opencode"?".opencode/opencode.json (permission=allow)":e==="kimi"?`ACP session/set_config_option (configId=mode, value=${n==="plan"?"plan":"auto"})`:"protocol/config (out-of-band)"} \u2014 no argv flag`);return}let r=n==="plan"?Rn(e,"plan"):h0[e];if(!r){let s=`unknown provider "${e}" \u2014 YOLO contract not configured. Add an entry to YOLO_FLAGS in src/providers/yolo-contract.ts before spawning this provider.`;throw $({event:"yolo_assert_failed",provider:e,reason:"unconfigured_provider",args:t.join(" "),message:s}),new Ie(s)}if(!E0(t,r)){let s=r.join(" "),i=`${e} spawn missing YOLO flag '${s}' \u2014 YOLO is mandatory for every provider; see src/providers/yolo-contract.ts. Got argv: [${t.map(o=>JSON.stringify(o)).join(", ")}]`;throw $({event:"yolo_assert_failed",provider:e,reason:"flag_missing",required_flag:s,mode:n,args:t.join(" "),message:i}),new Ie(i)}yh(`YOLO ${e} [mode=${n}]: argv flag '${r.join(" ")}'`)}var h0,g0,y0,Cr=w(()=>{"use strict";$r();ce();h0={claude:["--dangerously-skip-permissions"],qwen:["--approval-mode","yolo"],gemini:["-y"],copilot:["--yolo"],agy:["--dangerously-skip-permissions"],lmplayer:["--dangerously-skip-permissions"]},g0={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"]}};y0=new Set(["codex","opencode","kimi"])});async function k0(e,t,n){if(typeof e=="boolean")return e;let r,s;try{return await Promise.race([e,new Promise(i=>{r=setTimeout(()=>i(Pc),t),r.unref?.(),n!==void 0&&(s=()=>i(Pc),n.addEventListener("abort",s,{once:!0}))})])}finally{r!==void 0&&clearTimeout(r),s!==void 0&&n?.removeEventListener("abort",s)}}function _o(e,t){if(e===void 0){t.closeStdin();return}let n=!1,r=i=>{if(!n){n=!0;try{e.onRelease?.({elapsedMs:Date.now()-i.startedMs,held:i.held,reason:i.reason})}catch{}}t.closeStdin()},s=Date.now();I0(e,t,s,r).catch(()=>{r({startedMs:s,held:!1,reason:"check-error"})})}async function I0(e,t,n,r){let s=e.pollMs??w0,i=e.maxHoldMs??T0,o=e.settleMs??v0,a=e.backgroundGraceMs??b0,l=!1,c=null,d=u=>r({startedMs:n,held:l,reason:u});for(;;){if(t.isAborted())return d("aborted");if(t.hasChildExited())return d("child-exited");let u=i-(Date.now()-n);if(u<=0)return d("max-hold");let f;try{f=await k0(e.hasOutstandingWork(),u,t.signal)}catch{return d("check-error")}if(f===Pc)return d(t.isAborted()||t.signal?.aborted===!0?"aborted":"max-hold");if(f)c=null;else{if(!l&&t.wasBackgroundJobLaunched?.()===!0&&Date.now()-n<a){let _=a-(Date.now()-n);await new Promise(h=>setTimeout(h,Math.max(0,Math.min(s,S0,_))).unref?.());continue}if(!l||o<=0)return d("cleared");c===null&&(c=Date.now(),Ke(`${t.label}: dispatched work cleared \u2014 settling ${o}ms before closing stdin`));let p=Math.max(c,t.lastEventAtMs());if(!t.isTurnInFlight()&&Date.now()-p>=o)return d("cleared")}if(l||(l=!0,e.onHold?.(),Ke(`${t.label}: deferring stdin close \u2014 outstanding dispatched work (poll ${s}ms)`)),Date.now()-n>=i)return $({event:"transport_hold_open_max_wait",provider:t.label,elapsed_ms:Date.now()-n}),d("max-hold");let m=Math.max(0,Math.min(s,i-(Date.now()-n)));await new Promise(p=>setTimeout(p,m).unref?.())}}var w0,T0,v0,b0,S0,Pc,Fc=w(()=>{"use strict";ce();w0=2e3,T0=8*60*60*1e3,v0=5e3,b0=1e3,S0=50,Pc=Symbol("check-timed-out")});function Eh(e){if(e.length===0)return"";if(e.length===1)return e[0];let t=[];for(let n=0;n<e.length;n++)n===0?t.push(e[n]):t.push(`
|
|
1628
1628
|
|
|
@@ -1632,15 +1632,15 @@ var rA=Object.defineProperty;var w=(e,t)=>()=>(e&&(t=e(e=0)),t);var me=(e,t)=>{f
|
|
|
1632
1632
|
One possible cause: the provider stream ended before a complete response was delivered; for Claude Code this can appear as "API Error: Stream idle timeout - partial response received".`;return t?`Original provider error:
|
|
1633
1633
|
${t}
|
|
1634
1634
|
|
|
1635
|
-
${n}`:n}function Th(e,t){return new Promise((n,r)=>{let s=t.tool||"claude",i=t.binaryPath||A0[s]||"claude",o=["-p","","--output-format","stream-json","--input-format","stream-json"];s==="claude"&&o.push("--verbose"),t.sessionId&&o.push("--resume",t.sessionId),t.model&&o.push("--model",t.model);let a=t.permissionMode??"yolo",l=Rn(s,a)??L0[s]??["--dangerously-skip-permissions"];o.push(...l);try{wt(s,o,a)}catch(S){return r(S)}if(t.cwd&&!x0(t.cwd))return $({event:"transport_error",provider:s,error_class:"TransportConnectionError",error_message:`sessiondir missing: ${t.cwd}`,elapsed_ms:0}),r(new Ie(`sessiondir missing: ${t.cwd}`,{cause:Object.assign(new Error("cwd missing"),{code:"ENOENT_CWD"})}));let c=N0(i,o,{cwd:t.cwd,stdio:["pipe","pipe","pipe"],env:Ye(t.env,t.cwd,t.sessionId)});c.stdin?.on("error",S=>{Ke(`stream-json: stdin pipe error, ignored (exit handler reports): ${S.message}`)});let d=!1;if(t.signal){if(t.signal.aborted)return d=!0,$({event:"transport_abort",provider:s,phase:"pre_spawn"}),tt(c).catch(()=>{}),r(new Error("Aborted"));t.signal.addEventListener("abort",()=>{d=!0,$({event:"transport_abort",provider:s}),tt(c).catch(()=>{}),r(new Error("Aborted"))},{once:!0})}let u="",f=!1,m=!1,p=0,_=!1,h=Uc({onEvent:S=>{p=Date.now(),_=S.type!=="result",t.onEvent?.(S)},onText:t.onText});function g(){m||(m=!0,_o(t.holdOpen,{isAborted:()=>d,hasChildExited:()=>f,isTurnInFlight:()=>_,lastEventAtMs:()=>p,closeStdin:()=>{c.stdin?.end()},signal:t.signal,label:t.tool||"claude"}))}function
|
|
1636
|
-
`);u=k.pop()||"";for(let F of k)
|
|
1635
|
+
${n}`:n}function Th(e,t){return new Promise((n,r)=>{let s=t.tool||"claude",i=t.binaryPath||A0[s]||"claude",o=["-p","","--output-format","stream-json","--input-format","stream-json"];s==="claude"&&o.push("--verbose"),t.sessionId&&o.push("--resume",t.sessionId),t.model&&o.push("--model",t.model);let a=t.permissionMode??"yolo",l=Rn(s,a)??L0[s]??["--dangerously-skip-permissions"];o.push(...l);try{wt(s,o,a)}catch(S){return r(S)}if(t.cwd&&!x0(t.cwd))return $({event:"transport_error",provider:s,error_class:"TransportConnectionError",error_message:`sessiondir missing: ${t.cwd}`,elapsed_ms:0}),r(new Ie(`sessiondir missing: ${t.cwd}`,{cause:Object.assign(new Error("cwd missing"),{code:"ENOENT_CWD"})}));let c=N0(i,o,{cwd:t.cwd,stdio:["pipe","pipe","pipe"],env:Ye(t.env,t.cwd,t.sessionId)});c.stdin?.on("error",S=>{Ke(`stream-json: stdin pipe error, ignored (exit handler reports): ${S.message}`)});let d=!1;if(t.signal){if(t.signal.aborted)return d=!0,$({event:"transport_abort",provider:s,phase:"pre_spawn"}),tt(c).catch(()=>{}),r(new Error("Aborted"));t.signal.addEventListener("abort",()=>{d=!0,$({event:"transport_abort",provider:s}),tt(c).catch(()=>{}),r(new Error("Aborted"))},{once:!0})}let u="",f=!1,m=!1,p=0,_=!1,h=Uc({onEvent:S=>{p=Date.now(),_=S.type!=="result",t.onEvent?.(S)},onText:t.onText});function g(){m||(m=!0,_o(t.holdOpen,{isAborted:()=>d,hasChildExited:()=>f,isTurnInFlight:()=>_,lastEventAtMs:()=>p,closeStdin:()=>{c.stdin?.end()},signal:t.signal,label:t.tool||"claude"}))}function y(S){let k=h.sawResult();h.processLine(S),!k&&h.sawResult()&&g()}c.stdout?.on("data",S=>{u+=S.toString();let k=u.split(`
|
|
1636
|
+
`);u=k.pop()||"";for(let F of k)y(F)});let E="";c.stderr?.on("data",S=>{E+=S.toString()}),c.on("error",S=>{$({event:"transport_error",provider:s,error_class:"TransportConnectionError",error_message:S.message}),r(new Ie(`Failed to spawn ${i}: ${S.message}`,{cause:S}))}),c.on("exit",S=>{if(f=!0,d)return;u.trim()&&y(u);let k=h.finalize();k?(Ke(`stream-json: result ${k.result.slice(0,80)}${k.result.length>80?"...":""} (${k.durationMs}ms)`),n({...k,exitCode:S})):($({event:"transport_error",provider:s,error_class:"Error",reason:"provider_no_result",exit_code:S,stderr_tail:E.slice(0,500)}),r(new Error(R0({tool:s,exitCode:S,stderr:E}))))});let b=JSON.stringify({type:"user",message:{role:"user",content:e}});c.stdin?.write(b+`
|
|
1637
1637
|
`),Ke(`stream-json: prompt sent (${e.length} chars)`)})}var A0,L0,vh=w(()=>{"use strict";$r();js();Cr();ce();Fc();Et();Wc();Wc();A0={claude:"claude",qwen:"qwen"};L0={claude:["--dangerously-skip-permissions"],qwen:["--approval-mode","yolo"]}});function ho(e={}){return[]}var qc=w(()=>{"use strict"});function Bc(e){return e==="plan"?"read-only":"danger-full-access"}function bh(e="0.0.0"){return{clientInfo:{name:"lmctl",title:"lmctl",version:e},capabilities:{experimentalApi:!1}}}function Hc(){return{agentItems:new Map,resultText:""}}function go(e,t,n,r){let s=e.method;if(!s)return!1;let i=e.params;if(s==="turn/started")return t.agentItems.clear(),t.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 t.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?t.agentItems.get(a):void 0;return l?(l.phase==="commentary"||(l.buffer+=o),n?.(o),l.phase&&i&&(i._lmctlItemPhase=l.phase)):(t.resultText+=o,n?.(o)),!0}if(s==="item/completed"){let o=i?.item;if(o?.type==="agentMessage"&&typeof o.id=="string"){let a=t.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,d=typeof i?.turnId=="string"?i.turnId:void 0;r({itemId:o.id,threadId:c,turnId:d,expectedFromItemText:o.text,gotFromBuffer:a.buffer})}t.resultText+=l}t.agentItems.delete(o.id)}return!0}return!1}return!1}function Xc(e){for(let[,t]of e.agentItems.entries())t.phase!=="commentary"&&t.buffer&&(e.resultText+=t.buffer);e.agentItems.clear()}function Sh(e){let t=e.params,n=t?.error,r=typeof n?.message=="string"?n.message:void 0,s=r&&r.length>0?r:"(no message)";return t?.willRetry===!0?{willRetry:!0}:{willRetry:!1,turnError:new Error(`Turn errored: ${s}`)}}function Jc(){return{pendingCodexError:null}}function Gc(e,t){let n=Sh(e);return n.willRetry||(t.pendingCodexError=n.turnError),n}function Kc(e,t){if(t.pendingCodexError){let i=t.pendingCodexError;return t.pendingCodexError=null,{shouldReject:!0,turnError:i}}let r=e.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 Vc=w(()=>{"use strict"});import{spawn as O0}from"node:child_process";import{createInterface as $0}from"node:readline";import{existsSync as C0,readFileSync as M0}from"node:fs";import{fileURLToPath as D0}from"node:url";function P0(){return bh(j0)}function Ln(e,t){Ke(`[codex:${e}] ${JSON.stringify(t)}`)}function F0(e){let t=e.stderr.trim().slice(0,500),n=`lmctl: codex app-server exited with code ${e.exitCode} before completing the turn.
|
|
1638
1638
|
One possible cause: Codex stopped before delivering a terminal turn/completed event.`;return t?`Original provider error:
|
|
1639
1639
|
${t}
|
|
1640
1640
|
|
|
1641
|
-
${n}`:n}function kh(e,t){return new Promise((n,r)=>{let s=t.binaryPath||"codex",i=["app-server","--listen","stdio://"];t.model&&i.push("-c",`model=${JSON.stringify(t.model)}`);let o=t.isLead??t.alias?.toLowerCase()==="lead",a=o?ho():[];i.push(...a),le()&&je(JSON.stringify({event:"codex_mcp_inject",alias:t.alias??null,isLead:o,injected:a.length>0}));let l=t.permissionMode??"yolo",c=Bc(l);try{wt("codex",i,l)}catch(D){return r(D)}if(t.cwd&&!C0(t.cwd))return $({event:"transport_error",provider:"codex",error_class:"TransportConnectionError",error_message:`sessiondir missing: ${t.cwd}`}),r(new Ie(`sessiondir missing: ${t.cwd}`,{cause:Object.assign(new Error("cwd missing"),{code:"ENOENT_CWD"})}));let d=O0(s,i,{cwd:t.cwd,stdio:["pipe","pipe","pipe"],env:Ye(t.env,t.cwd,t.threadId)}),u=!1;if(t.signal){if(t.signal.aborted)return u=!0,$({event:"transport_abort",provider:"codex",phase:"pre_spawn"}),tt(d).catch(()=>{}),r(new Error("Aborted"));t.signal.addEventListener("abort",()=>{u=!0,$({event:"transport_abort",provider:"codex"}),tt(d).catch(()=>{}),r(new Error("Aborted"))},{once:!0})}let f=$0({input:d.stdout}),m=new Map,p=1,_=t.threadId||"",h="",g=!1,
|
|
1641
|
+
${n}`:n}function kh(e,t){return new Promise((n,r)=>{let s=t.binaryPath||"codex",i=["app-server","--listen","stdio://"];t.model&&i.push("-c",`model=${JSON.stringify(t.model)}`);let o=t.isLead??t.alias?.toLowerCase()==="lead",a=o?ho():[];i.push(...a),le()&&je(JSON.stringify({event:"codex_mcp_inject",alias:t.alias??null,isLead:o,injected:a.length>0}));let l=t.permissionMode??"yolo",c=Bc(l);try{wt("codex",i,l)}catch(D){return r(D)}if(t.cwd&&!C0(t.cwd))return $({event:"transport_error",provider:"codex",error_class:"TransportConnectionError",error_message:`sessiondir missing: ${t.cwd}`}),r(new Ie(`sessiondir missing: ${t.cwd}`,{cause:Object.assign(new Error("cwd missing"),{code:"ENOENT_CWD"})}));let d=O0(s,i,{cwd:t.cwd,stdio:["pipe","pipe","pipe"],env:Ye(t.env,t.cwd,t.threadId)}),u=!1;if(t.signal){if(t.signal.aborted)return u=!0,$({event:"transport_abort",provider:"codex",phase:"pre_spawn"}),tt(d).catch(()=>{}),r(new Error("Aborted"));t.signal.addEventListener("abort",()=>{u=!0,$({event:"transport_abort",provider:"codex"}),tt(d).catch(()=>{}),r(new Error("Aborted"))},{once:!0})}let f=$0({input:d.stdout}),m=new Map,p=1,_=t.threadId||"",h="",g=!1,y=!1,E=Date.now(),b=Hc(),S=Jc();function k(D,U={}){return new Promise((x,H)=>{let J=p++;m.set(J,{resolve:x,reject:H});let N=JSON.stringify({jsonrpc:"2.0",id:J,method:D,params:U});d.stdin?.write(N+`
|
|
1642
1642
|
`)})}function F(D,U={}){let x=JSON.stringify({jsonrpc:"2.0",method:D,params:U});d.stdin?.write(x+`
|
|
1643
|
-
`)}f.on("line",D=>{let U;try{U=JSON.parse(D)}catch{return}if(typeof U.id=="number"&&m.has(U.id)){let J=m.get(U.id);if(m.delete(U.id),U.error){let N=U.error,A=typeof N?.message=="string"&&N.message.length>0?N.message:JSON.stringify(U.error);J.reject(po(`codex app-server error: ${A}`,N))}else J.resolve(U);t.onEvent?.(U);return}let x=U.method;if(!x){t.onEvent?.(U);return}if(x==="thread/started"){let N=U.params?.thread;N?.id&&(_=N.id)}let H=le()?J=>{Ln("item.text/buffer-mismatch",{itemId:J.itemId,threadId:J.threadId??null,turnId:J.turnId??null,expectedFromItemText:J.expectedFromItemText,gotFromBuffer:J.gotFromBuffer,expectedLen:J.expectedFromItemText.length,gotLen:J.gotFromBuffer.length})}:void 0;if(x==="turn/started"){let J=U.params,N=J?.turn;N?.id&&(h=N.id),go(U,b,t.onDelta,H),le()&&Ln("turn/started",{params:J??null})}if(le()&&(x==="item/started"||x==="item/completed")){let J=U.params;J?.item?.type==="agentMessage"&&Ln(x,{params:J??null})}if(x==="item/started"||x==="item/agentMessage/delta"||x==="item/completed"){if(x==="item/agentMessage/delta"){let J=U.params;le()&&Ln("agentMessage/delta",{params:J??null})}go(U,b,t.onDelta,H)}if(x==="turn/completed"){let J=U.params;if(le())for(let[A,O]of b.agentItems.entries())O.buffer&&Ln("turn/completed/unflushed-item",{itemId:A,phase:O.phase,bufferLen:O.buffer.length});Xc(b),le()&&Ln("turn/completed",{params:J??null});let N=Kc(U,S);N.shouldReject?(le()&&Ln("turn/completed/terminal-reject",{message:N.turnError.message}),
|
|
1643
|
+
`)}f.on("line",D=>{let U;try{U=JSON.parse(D)}catch{return}if(typeof U.id=="number"&&m.has(U.id)){let J=m.get(U.id);if(m.delete(U.id),U.error){let N=U.error,A=typeof N?.message=="string"&&N.message.length>0?N.message:JSON.stringify(U.error);J.reject(po(`codex app-server error: ${A}`,N))}else J.resolve(U);t.onEvent?.(U);return}let x=U.method;if(!x){t.onEvent?.(U);return}if(x==="thread/started"){let N=U.params?.thread;N?.id&&(_=N.id)}let H=le()?J=>{Ln("item.text/buffer-mismatch",{itemId:J.itemId,threadId:J.threadId??null,turnId:J.turnId??null,expectedFromItemText:J.expectedFromItemText,gotFromBuffer:J.gotFromBuffer,expectedLen:J.expectedFromItemText.length,gotLen:J.gotFromBuffer.length})}:void 0;if(x==="turn/started"){let J=U.params,N=J?.turn;N?.id&&(h=N.id),go(U,b,t.onDelta,H),le()&&Ln("turn/started",{params:J??null})}if(le()&&(x==="item/started"||x==="item/completed")){let J=U.params;J?.item?.type==="agentMessage"&&Ln(x,{params:J??null})}if(x==="item/started"||x==="item/agentMessage/delta"||x==="item/completed"){if(x==="item/agentMessage/delta"){let J=U.params;le()&&Ln("agentMessage/delta",{params:J??null})}go(U,b,t.onDelta,H)}if(x==="turn/completed"){let J=U.params;if(le())for(let[A,O]of b.agentItems.entries())O.buffer&&Ln("turn/completed/unflushed-item",{itemId:A,phase:O.phase,bufferLen:O.buffer.length});Xc(b),le()&&Ln("turn/completed",{params:J??null});let N=Kc(U,S);N.shouldReject?(le()&&Ln("turn/completed/terminal-reject",{message:N.turnError.message}),y=!0,g=!0,d.stdin?.end(),r(N.turnError)):(g=!0,d.stdin?.end())}if(x==="error"){let J=Gc(U,S);if(le()){let N=U.params,A=N?.error,O=typeof A?.message=="string"?A.message:"(no message)";Ln(J.willRetry?"error/retry":"error/terminal-deferred",{message:O,willRetry:J.willRetry,params:N??null})}}t.onEvent?.(U)});let P="";d.stderr?.on("data",D=>{P+=D.toString()}),d.on("error",D=>{$({event:"transport_error",provider:"codex",error_class:"TransportConnectionError",error_message:D.message}),r(new Ie(`Failed to spawn codex app-server: ${D.message}`,{cause:D}))}),d.on("exit",D=>{if(!u&&!y){if(g){n({result:b.resultText,threadId:_,turnId:h,durationMs:Date.now()-E,exitCode:D});return}if(S.pendingCodexError){r(S.pendingCodexError);return}$({event:"transport_error",provider:"codex",error_class:"Error",reason:"provider_no_result",exit_code:D,stderr_tail:P.slice(0,500)}),r(new Error(F0({exitCode:D,stderr:P})))}}),(async()=>{try{if(await k("initialize",P0()),F("initialized",{}),t.threadId)try{let D=k("thread/resume",{threadId:t.threadId,sandbox:c,approvalPolicy:"never",...t.model?{model:t.model}:{}}),U=new Promise((x,H)=>setTimeout(()=>H(new Error("resume timeout")),5e3));await Promise.race([D,U]),_=t.threadId}catch(D){process.stderr.write(`[codex] thread/resume failed, creating new thread
|
|
1644
1644
|
`),$({event:"codex_thread_resume_fallback",provider:"codex",thread_id:t.threadId,error_message:D instanceof Error?D.message:String(D)});let x=(await k("thread/start",{cwd:t.cwd,approvalPolicy:"never",sandbox:c,...t.model?{model:t.model}:{}})).result?.thread;x?.id&&(_=x.id)}else{let U=(await k("thread/start",{cwd:t.cwd,approvalPolicy:"never",sandbox:c,...t.model?{model:t.model}:{}})).result?.thread;U?.id&&(_=U.id)}await k("turn/start",{threadId:_,input:[{type:"text",text:e}],...t.model?{model:t.model}:{}})}catch(D){tt(d).catch(()=>{}),r(D instanceof Error?D:new Error(String(D)))}})()})}var j0,Ih=w(()=>{"use strict";ce();ce();$r();js();Cr();qc();ce();Et();Vc();Vc();j0=(()=>{try{let e=new URL("../../../package.json",import.meta.url),t=JSON.parse(M0(D0(e),"utf8"));return typeof t.version=="string"?t.version:"0.0.0"}catch{return"0.0.0"}})()});import{existsSync as Ah,mkdirSync as U0,readFileSync as Rh,writeFileSync as Nh}from"node:fs";import{join as Ps,resolve as W0}from"node:path";function Lh(e){if(e==="allow")return!0;if(e&&typeof e=="object"&&!Array.isArray(e)){let t=Object.entries(e);if(t.length===1&&t[0][0]==="*"&&t[0][1]==="allow")return!0}return!1}function Yc(e,t,n={existsSync:Ah,readFileSync:Rh}){let r=[];for(let s of e){if(s.provider.trim().toLowerCase()!=="opencode")continue;let i=W0(t,s.sessiondir??t);for(let o of q0(i)){let a=B0(o,n);a!==void 0&&Object.prototype.hasOwnProperty.call(a,"permission")&&(Lh(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 q0(e){return[Ps(e,".opencode","opencode.jsonc"),Ps(e,"opencode.jsonc"),Ps(e,"opencode.json")]}function B0(e,t){try{if(!t.existsSync(e))return;let n=t.readFileSync(e,"utf-8"),r=JSON.parse(H0(n));return r===null||typeof r!="object"||Array.isArray(r)?void 0:r}catch{return}}function H0(e){let t="",n=!1,r="",s=!1;for(let i=0;i<e.length;i+=1){let o=e[i],a=e[i+1];if(n){t+=o,s?s=!1:o==="\\"?s=!0:o===r&&(n=!1,r="");continue}if(o==='"'||o==="'"){n=!0,r=o,t+=o;continue}if(o==="/"&&a==="/"){for(;i<e.length&&e[i]!==`
|
|
1645
1645
|
`;)i+=1;i<e.length&&(t+=e[i]);continue}if(o==="/"&&a==="*"){for(i+=2;i<e.length&&!(e[i]==="*"&&e[i+1]==="/");)i+=1;i+=1;continue}t+=o}return t.replace(/,\s*([}\]])/g,"$1")}function yo(e,t={}){let n=Ps(e,".opencode"),r=Ps(n,"opencode.json");if(!Ah(r)){U0(n,{recursive:!0});let o=JSON.stringify({permission:"allow"},null,2);return Nh(r,o+`
|
|
1646
1646
|
`,"utf-8"),!0}let s;try{s=JSON.parse(Rh(r,"utf-8"))}catch{return console.log(xh.yellow(` .opencode/opencode.json at ${r} is malformed \u2014 skipping opencode config install.`)),!1}if(typeof s!="object"||s===null)return console.log(xh.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),Lh(s.permission)||$({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&&Nh(r,JSON.stringify(s,null,2)+`
|
|
@@ -1655,29 +1655,29 @@ ${n}`:n}function eL(e,t){if(e!=="kimi"||!t.includes("notifications/initialized")
|
|
|
1655
1655
|
`)};return n.on("line",o=>{let a;try{a=JSON.parse(o)}catch{return}if(Ue({event:"acp_recv",direction:"RECV",provider:t.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)}),t.onEvent?.(a),typeof a.id=="number"&&r.has(a.id)){let c=r.get(a.id);if(r.delete(a.id),a.error){let d=a.error,u=typeof d?.message=="string"&&d.message.length>0?d.message:JSON.stringify(a.error);c.reject(po(`ACP RPC error: ${u}`,d))}else c.resolve(a);return}let l=a.method;if(l){if(typeof a.id=="number"){$({event:"acp_unhandled_request",provider:t.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)`}});Ue({event:"acp_send",direction:"SEND",provider:t.provider,replyTo:a.id,error:"method not found"}),e.stdin?.write(`${c}
|
|
1656
1656
|
`);return}t.onNotification?.(a)}}),{sendRpc:s,sendNotification:i,close(o=new Ie("ACP RPC channel closed")){n.close();for(let a of r.values())a.reject(o);r.clear()}}}function ed(e){let t;try{t=Dh(e.binaryPath??Qc.opencode.binary,Qc.opencode.args,{cwd:e.cwd,stdio:["pipe","pipe","pipe"],env:Ye(e.env,e.cwd,void 0,"unknown")})}catch(s){return Promise.resolve({status:"unavailable",reason:"spawn",error:s instanceof Error?s.message:String(s)})}let n=jh(t,{provider:"opencode"}),r=e.timeoutMs??5e3;return new Promise(s=>{let i=!1,o=(d,u=!0)=>{if(!i){if(i=!0,clearTimeout(c),t.removeListener("error",a),t.removeListener("exit",l),n.close(),!u){s(d);return}tt(t,{softDelayMs:100,killDelayMs:100}).finally(()=>s(d))}},a=d=>{o({status:"unavailable",reason:"spawn",error:d.message},!1)},l=(d,u)=>{o({status:"unavailable",reason:"handshake",error:`opencode ACP exited before verification (code=${String(d)}, signal=${String(u)})`},!1)};t.once("error",a),t.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 d=await n.sendRpc("session/new",{cwd:e.cwd,mcpServers:[]}),u=Mr(d);try{await n.sendRpc("session/set_config_option",{sessionId:u,configId:"model",value:e.model})}catch(f){o({status:"rejected",option:"model",value:e.model,error:f instanceof Error?f.message:String(f)});return}if(e.effort!==void 0)try{await n.sendRpc("session/set_config_option",{sessionId:u,configId:"effort",value:e.effort})}catch(f){o({status:"rejected",option:"effort",value:e.effort,error:f instanceof Error?f.message:String(f)});return}o({status:"verified"})}catch(d){o({status:"unavailable",reason:"handshake",error:d instanceof Error?d.message:String(d)})}})()})}function nL(e){if(e.method!=="session/update")return!1;let n=e.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 Ph(e,t){let n=Qc[t.tool];return n?new Promise((r,s)=>{let i=t.binaryPath||n.binary;if(t.tool==="opencode")try{yo(t.cwd)}catch(k){$({event:"opencode_config_install_failed",cwd:t.cwd,error_message:k instanceof Error?k.message:String(k)})}let o=t.permissionMode??"yolo",a=[...n.args];if(o==="plan")if(t.tool==="gemini"){let k=Rn("gemini","plan"),F=Rn("gemini","yolo");a=a.filter(P=>!(F??[]).includes(P)),k&&a.push(...k)}else t.tool==="copilot"&&(process.stderr.write(`[acp] copilot has no plan-mode flag in --acp mode; --permission-mode plan is not honored (running yolo). See src/providers/yolo-contract.ts.
|
|
1657
1657
|
`),$({event:"acp_plan_mode_unsupported",provider:t.tool,requested_mode:"plan",effective_mode:"yolo"}));t.model&&t.tool==="gemini"&&a.push("--model",t.model);let l=t.tool==="copilot"?"yolo":o;try{wt(t.tool,a,l)}catch(k){return s(k)}if(t.model&&t.tool==="copilot"&&(process.stderr.write(`[acp] copilot does not support per-session model selection in --acp mode (model="${t.model}" ignored). Set the default via copilot's /model slash command in an interactive \`lmctl terminal\` session.
|
|
1658
|
-
`),$({event:"acp_model_unsupported",provider:t.tool,model:t.model})),t.cwd&&!z0(t.cwd))return $({event:"transport_error",provider:t.tool,error_class:"TransportConnectionError",error_message:`sessiondir missing: ${t.cwd}`,elapsed_ms:0}),s(new Ie(`sessiondir missing: ${t.cwd}`,{cause:Object.assign(new Error("cwd missing"),{code:"ENOENT_CWD"})}));let c=Dh(i,a,{cwd:t.cwd,stdio:["pipe","pipe","pipe"],env:Ye(t.env,t.cwd,t.sessionId)}),d=Date.now(),u=!1,f=!1,m=0,p=!1,_=!1;if(t.signal){if(t.signal.aborted)return u=!0,$({event:"transport_abort",provider:t.tool,phase:"pre_spawn"}),tt(c).catch(()=>{}),s(new Error("Aborted"));t.signal.addEventListener("abort",()=>{u=!0,$({event:"transport_abort",provider:t.tool,elapsed_ms:Date.now()-d}),tt(c).catch(()=>{}),s(new Error("Aborted"))},{once:!0})}let h=t.sessionId||"",g=zc({tool:t.tool,onDelta:t.onDelta});g.setSessionId(h);let
|
|
1659
|
-
`),$({event:"acp_session_resume_fallback",provider:t.tool,session_id:t.sessionId,error_message:P instanceof Error?P.message:String(P)});let D=await
|
|
1660
|
-
`),$({event:"acp_config_option_failed",provider:t.tool,config_id:"model",value:t.model,error_message:D})}if(t.effort&&t.tool==="opencode"){let P="effort";try{await
|
|
1661
|
-
`),$({event:"acp_config_option_failed",provider:t.tool,config_id:P,value:t.effort,error_message:U})}}g.beginTurn(),p=!0,Ke(`acp: prompt sent (${e.length} chars)`);let k=await
|
|
1658
|
+
`),$({event:"acp_model_unsupported",provider:t.tool,model:t.model})),t.cwd&&!z0(t.cwd))return $({event:"transport_error",provider:t.tool,error_class:"TransportConnectionError",error_message:`sessiondir missing: ${t.cwd}`,elapsed_ms:0}),s(new Ie(`sessiondir missing: ${t.cwd}`,{cause:Object.assign(new Error("cwd missing"),{code:"ENOENT_CWD"})}));let c=Dh(i,a,{cwd:t.cwd,stdio:["pipe","pipe","pipe"],env:Ye(t.env,t.cwd,t.sessionId)}),d=Date.now(),u=!1,f=!1,m=0,p=!1,_=!1;if(t.signal){if(t.signal.aborted)return u=!0,$({event:"transport_abort",provider:t.tool,phase:"pre_spawn"}),tt(c).catch(()=>{}),s(new Error("Aborted"));t.signal.addEventListener("abort",()=>{u=!0,$({event:"transport_abort",provider:t.tool,elapsed_ms:Date.now()-d}),tt(c).catch(()=>{}),s(new Error("Aborted"))},{once:!0})}let h=t.sessionId||"",g=zc({tool:t.tool,onDelta:t.onDelta});g.setSessionId(h);let y=jh(c,{provider:t.tool,onEvent:k=>{m=Date.now(),nL(k)&&(_=!0),t.onEvent?.(k)},onNotification:k=>{m=Date.now(),g.processMessage(k)}}),{sendRpc:E,sendNotification:b}=y,S="";c.stderr?.on("data",k=>{S+=k.toString()}),c.on("error",k=>{y.close(k),$({event:"transport_error",provider:t.tool,error_class:"TransportConnectionError",error_message:k.message,elapsed_ms:Date.now()-d}),s(new Ie(`Failed to spawn ${n.binary} ${n.args.join(" ")}: ${k.message}`,{cause:k}))}),c.on("exit",k=>{if(f=!0,y.close(new Ie(`ACP process exited with code ${String(k)}`)),u)return;let F=g.finalize();if(F!==null)r({result:F.result,sessionId:F.sessionId,durationMs:Date.now()-d,stopReason:F.stopReason,exitCode:k});else{let P=eL(t.tool,S);$({event:"transport_error",provider:t.tool,error_class:"Error",reason:"provider_no_result",exit_code:k,stderr_tail:P.slice(0,500),elapsed_ms:Date.now()-d}),s(new Error(Q0({tool:t.tool,exitCode:k,stderr:P})))}}),(async()=>{try{if(await E("initialize",{protocolVersion:1,clientInfo:{name:"lmctl",version:"0.1.0"},clientCapabilities:{}}),b("notifications/initialized"),t.sessionId)try{let P=await E("session/load",{sessionId:t.sessionId,cwd:t.cwd,mcpServers:[]});h=Mr(P,t.sessionId),g.setSessionId(h)}catch(P){if(t.requireResume)throw new Error(`Cannot resume session ${t.sessionId} via ACP: ${P instanceof Error?P.message:String(P)}`);process.stderr.write(`[acp] session/load failed for ${t.sessionId}, creating new session
|
|
1659
|
+
`),$({event:"acp_session_resume_fallback",provider:t.tool,session_id:t.sessionId,error_message:P instanceof Error?P.message:String(P)});let D=await E("session/new",{cwd:t.cwd,mcpServers:[]});h=Mr(D),g.setSessionId(h)}else{let P=await E("session/new",{cwd:t.cwd,mcpServers:[]});h=Mr(P),g.setSessionId(h)}if(t.tool==="kimi"){let P=o==="plan"?"plan":"auto";try{await E("session/set_config_option",{sessionId:h,configId:"mode",value:P}),Ke(`acp: set_config_option(mode=${P}) ok`)}catch(D){let U=D instanceof Error?D.message:String(D);throw $({event:"acp_permission_mode_failed",provider:t.tool,config_id:"mode",value:P,error_message:U}),new Error(`Cannot set Kimi ACP permission mode to ${P}: ${U}`)}}if(t.model&&(t.tool==="opencode"||t.tool==="kimi"))try{await E("session/set_config_option",{sessionId:h,configId:"model",value:t.model}),Ke(`acp: set_config_option(model=${t.model}) ok`)}catch(P){let D=P instanceof Error?P.message:String(P);process.stderr.write(`[acp] set_config_option(model=${t.model}) failed: ${D}
|
|
1660
|
+
`),$({event:"acp_config_option_failed",provider:t.tool,config_id:"model",value:t.model,error_message:D})}if(t.effort&&t.tool==="opencode"){let P="effort";try{await E("session/set_config_option",{sessionId:h,configId:P,value:t.effort}),Ke(`acp: set_config_option(${P}=${t.effort}) ok`)}catch(D){let U=D instanceof Error?D.message:String(D);process.stderr.write(`[acp] set_config_option(effort=${t.effort}) failed: ${U}
|
|
1661
|
+
`),$({event:"acp_config_option_failed",provider:t.tool,config_id:P,value:t.effort,error_message:U})}}g.beginTurn(),p=!0,Ke(`acp: prompt sent (${e.length} chars)`);let k=await E("session/prompt",{sessionId:h,prompt:[{type:"text",text:e}]}),F=g.completeTurn(k);p=!1,Ke(`acp: result received (${F.result.length} chars, stopReason=${F.stopReason})`),_o(t.holdOpen,{isAborted:()=>u,hasChildExited:()=>f,isTurnInFlight:()=>p,lastEventAtMs:()=>m,closeStdin:()=>{c.stdin?.end()},signal:t.signal,label:t.tool,wasBackgroundJobLaunched:()=>_})}catch(k){tt(c).catch(()=>{}),s(k instanceof Error?k:new Error(String(k)))}})()}):Promise.reject(new Error(`No ACP config for tool "${t.tool}"`))}var Qc,tL,td=w(()=>{"use strict";ce();$r();js();Fc();Cr();Eo();ce();Et();Zc();Zc();Qc={gemini:{binary:"gemini",args:["--acp","-y","--skip-trust"]},copilot:{binary:"copilot",args:["--acp","--yolo"]},opencode:{binary:"opencode",args:["acp"]},kimi:{binary:"kimi",args:["acp"]}},tL=1});function be(e,t=120){let n=e.replace(/\s+/g," ").trim();return n.length>t?n.slice(0,t-1)+"\u2026":n}function Fh(e,t){return n=>{if(n.kind==="tool_use"&&typeof n.id=="string"){if(e.size>=rL){let r=e.keys().next().value;r!==void 0&&e.delete(r)}e.set(n.id,Date.now()),t(n);return}if(n.kind==="tool_result"&&typeof n.id=="string"&&n.elapsedMs===void 0){let r=e.get(n.id);if(r!==void 0){t({...n,elapsedMs:Date.now()-r}),e.delete(n.id);return}}t(n)}}function sL(){let e=new Map;return(t,n)=>{iL(t,Fh(e,n))}}function iL(e,t){let n=e.type;if(n==="system"){let r=e.subtype;if(r==="api_retry"){let s=typeof e.attempt=="number"?e.attempt:void 0,i=typeof e.max_retries=="number"?e.max_retries:void 0,o=typeof e.error_status=="number"?e.error_status:void 0,a=typeof e.error=="string"?e.error:void 0,l=typeof e.retry_delay_ms=="number"?e.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(be(a,60));let d=c.length>0?c.join(", "):r;t({kind:"api_retry",summary:d});return}if(r==="api_error"){let s=typeof e.error_status=="number"?e.error_status:void 0,i=typeof e.error=="string"?e.error:void 0,o=["api_error"];s!==void 0&&o.push(`HTTP ${s}`),i&&o.push(be(i,80)),t({kind:"other",summary:o.join(": "),raw:e});return}t({kind:"system",summary:r||"system",raw:e});return}if(n==="assistant"||n==="user"){let s=e.message?.content;if(!Array.isArray(s))return;for(let i of s){let o=i.type;if(o==="text"){let a=i.text||"";a&&t({kind:"text",summary:be(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,d="";c&&(typeof c.command=="string"?d=c.command:typeof c.file_path=="string"?d=c.file_path:typeof c.path=="string"?d=c.path:typeof c.pattern=="string"?d=c.pattern:typeof c.url=="string"?d=c.url:d=be(JSON.stringify(c))),t({kind:"tool_use",tool:a,summary:be(d),id:l,raw:i})}else if(o==="thinking"){let a=i.thinking||"";t({kind:"thinking",summary:be(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,d,u=i.content;if(typeof u=="string")d=`${u.split(`
|
|
1662
1662
|
`).length} lines, ${u.length} chars`;else if(Array.isArray(u)){let f=u.map(m=>typeof m=="object"&&m&&"text"in m?m.text:"").filter(Boolean).join("");f&&(d=`${f.split(`
|
|
1663
1663
|
`).length} lines, ${f.length} chars`)}t({kind:"tool_result",status:l,summary:d,id:c,raw:i})}else o&&t({kind:"other",summary:o,raw:i})}return}if(n==="result"){t({kind:"system",summary:"result",raw:e});return}}async function wo(e,t){let n=t.binary==="qwen"?"qwen":"claude",r=t.onProgress?sL():void 0,s=await Th(e,{sessionId:t.sessionId,cwd:t.cwd,env:t.env,tool:n,binaryPath:t.progPath,model:t.model,permissionMode:t.permissionMode,onText:t.onDelta,onEvent:r?i=>r(i,t.onProgress):void 0,signal:t.signal,holdOpen:t.holdOpen});return{text:s.result,sessionId:s.sessionId,durationMs:s.durationMs,numTurns:s.numTurns}}function oL(){let e=new Map;return(t,n)=>{aL(t,Fh(e,n))}}function aL(e,t){if(e.method!=="session/update")return;let s=e.params?.update;if(!s)return;let i=s.sessionUpdate;if(i){if(i==="agent_message_chunk"){let a=s.content?.text||"";a&&t({kind:"text",summary:be(a)});return}if(i==="agent_thought_chunk"){let a=s.content?.text||"";t({kind:"thinking",summary:be(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=be(JSON.stringify(c))),t({kind:"tool_use",tool:o,summary:be(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")t({kind:"tool_result",summary:o,status:o==="failed"?"error":"ok",id:a});else if(o==="in_progress"){let l=s.content,c=typeof l=="string"?l:typeof l?.text=="string"?l.text:"",d=c?`running\u2026 ${be(c,80)}`:"running\u2026";t({kind:"other",summary:d,id:a})}return}t({kind:"other",summary:i})}}async function On(e,t){let n=t.acpTool||t.binary;t.model&&n==="copilot"&&Ue({event:"model_ignored",provider:n,model:t.model,reason:"copilot --acp does not implement per-session model selection"});let r=t.onProgress?oL():void 0,s=await Ph(e,{tool:n,sessionId:t.sessionId,cwd:t.cwd,env:t.env,binaryPath:t.progPath,model:t.model,effort:t.effort,alias:t.alias,permissionMode:t.permissionMode,onDelta:t.onDelta,onEvent:r?i=>r(i,t.onProgress):void 0,signal:t.signal,holdOpen:t.holdOpen});return{text:s.result,sessionId:s.sessionId,durationMs:s.durationMs,stopReason:s.stopReason}}function lL(e,t){let n=e.method;if(!n)return;let r=e.params;if(n==="turn/started"){t({kind:"system",summary:"turn started"});return}if(n==="turn/completed"){t({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;t(a?{kind:"api_retry",summary:`codex retry: ${be(o,120)}`}:{kind:"other",summary:`codex error: ${be(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)t({kind:"tool_use",tool:"Bash",summary:be(c||"(command)"),id:a});else{let d=s.exitCode,u=s.status||"",f=typeof s.durationMs=="number"?s.durationMs:void 0,m=typeof d=="number"?`exit ${d}`:u||"done",p=[];typeof d=="number"?p.push(`exit ${d}`):u&&p.push(u),typeof f=="number"&&p.push(`${Math.round(f/1e3)}s`),t({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(d=>d.path||"").filter(Boolean).join(", "):"";t({kind:"tool_use",tool:"FileChange",summary:be(c||"(edit)"),id:a})}else{let l=s.status||"done";t({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)t({kind:"tool_use",tool:`${l}/${c}`,summary:"",id:a});else{let d=s.status||"done";t({kind:"tool_result",summary:d,status:d,id:a})}return}case"webSearch":{let a=typeof s.id=="string"?s.id:void 0;t(o?{kind:"tool_use",tool:"WebSearch",summary:be(s.query||""),id:a}:{kind:"tool_result",summary:"done",status:"done",id:a});return}case"reasoning":{o&&t({kind:"thinking",summary:""});return}case"agentMessage":case"userMessage":return;default:{i&&t({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;t(i==="commentary"?{kind:"thinking",summary:be(s)}:{kind:"text",summary:be(s)})}return}if(n==="item/reasoning/summaryTextDelta"||n==="item/reasoning/textDelta"){let s=r?.delta||"";s&&t({kind:"thinking",summary:be(s)});return}if(n==="item/commandExecution/outputDelta"){let s=(typeof r?.delta=="string"?r.delta:"")||"";if(s){let i=s.split(`
|
|
1664
1664
|
`).filter(l=>l.length>0),o=i[i.length-1]||"",a=i.length>1?`${i.length} lines: ${be(o,60)}`:be(s,80);t({kind:"other",summary:`running\u2026 ${a}`})}else t({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(`
|
|
1665
1665
|
`).filter(l=>l.length>0),o=i[i.length-1]||"",a=i.length>1?`${i.length} lines: ${be(o,60)}`:be(s,80);t({kind:"other",summary:`running\u2026 ${a}`})}else t({kind:"other",summary:"running\u2026"});return}if(n.startsWith("item/")){t({kind:"other",summary:n.slice(5)});return}}async function Uh(e,t){let n=await kh(e,{threadId:t.sessionId,cwd:t.cwd,env:t.env,binaryPath:t.progPath,model:t.model,alias:t.alias,isLead:t.isLead,permissionMode:t.permissionMode,onDelta:t.onDelta,onEvent:t.onProgress?r=>lL(r,t.onProgress):void 0,signal:t.signal});return{text:n.result,sessionId:n.threadId,durationMs:n.durationMs}}var rL,$n=w(()=>{"use strict";vh();Ih();td();ce();rL=256});function rd(e){return new nd(e)}var nd,sd=w(()=>{"use strict";lh();Pt();$n();yt();nd=class extends Ae{constructor(t){super({provider:new lo(t),capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!0,canCancel:!0},injection:{leaderMode:"prompt-append"},binary:"claude",seedArgs:["-p",ge,"--dangerously-skip-permissions"],resumeTemplate:"claude --resume {{session_id}}",startTemplate:"claude",transport:wo})}seedArgsFor(t){let n=super.seedArgsFor(t);return t?.model?[...n,"--model",t.model]:n}}});import{readdir as cL,stat as Wh,unlink as dL}from"node:fs/promises";import{join as Fs,basename as uL}from"node:path";function fL(e,t,n){return`${e}|${t.toISOString()}|${n}`}function Us(e,t,n){let r=fL(n.role,n.timestamp,n.content);t.has(r)||(t.add(r),e.push(n))}function qh(e,t){return t==="exec"||e==="codex_exec"?"codex exec":"codex"}function mL(e){if(!e)return;let t=e.cached_input_tokens??e.cache_read_input_tokens;return{inputTokens:e.input_tokens,cachedInputTokens:t,outputTokens:e.output_tokens,reasoningOutputTokens:e.reasoning_output_tokens,totalTokens:e.total_tokens}}function Dr(e){if(e==null)return"";if(typeof e=="string")return e;if(typeof e=="number"||typeof e=="boolean")return String(e);if(Array.isArray(e))return e.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 Dr(n)}).filter(n=>n.length>0).join(`
|
|
1666
|
-
`);try{return JSON.stringify(e)}catch{return String(e)}}function pL(e){let t=e;if(typeof e=="string")try{t=JSON.parse(e)}catch{return}return t!==null&&typeof t=="object"&&!Array.isArray(t)?t:void 0}function _L(e,t){if(t===void 0)return;let n={input:t};if(e!=="apply_patch"||typeof t!="string")return n;let r=[...t.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 Bh(e){let t=0,n=0,r=0,s=0,i=0,o,a;for await(let l of Je(e)){if(l.type==="response_item"&&l.payload){let c=l.payload;if(c.type==="message"&&c.role==="user"&&c.content)for(let d of c.content)d.type==="input_text"&&typeof d.text=="string"&&d.text&&t++;else if(c.type==="message"&&c.role==="assistant"&&c.content)for(let d of c.content)d.type==="output_text"&&typeof d.text=="string"&&d.text&&t++}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 d=mL(l.payload.info.last_token_usage);d&&(o=d),typeof l.payload.info.model_context_window=="number"&&(a=l.payload.info.model_context_window)}}return{messageCount:t,totalInputTokens:n,totalCachedInputTokens:r,totalOutputTokens:s,totalReasoningOutputTokens:i,lastTokenUsage:o,modelContextWindow:a}}var To,Hh=w(()=>{"use strict";on();To=class{name="codex";codexDirs;constructor(t={}){let n=[Fs(ke,".codex"),Fs(ke,".code")];if(t.codexDirs&&t.codexDirs.length>0){this.codexDirs=[...new Set(t.codexDirs)];return}let r=[t.codexDir||n[0],t.codeDir||n[1]];this.codexDirs=[...new Set(r)]}getWatchPaths(){return this.codexDirs.map(t=>({directory:Fs(t,"sessions"),filePattern:/\.jsonl$/}))}async getSessionsDirs(){let t=[];for(let n of this.codexDirs){let r=Fs(n,"sessions");try{await Wh(r),t.push(r)}catch{}}return t}async discoverSessions(){let t=[],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&&t.push(o)}catch{}}return t}async findSessionFiles(t){let n=[],r;try{r=await cL(t)}catch{return n}for(let s of r){let i=Fs(t,s),o=await Wh(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(t){let n=uL(t,".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(t){let n=await Ve(t,30),r=await Ce(t),s=this.extractSessionIdFromFilename(t),i="",o,a,l,c,d,u,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&&(u=p.payload.originator),p.payload.source&&(f=p.payload.source)),p.type==="turn_context"&&p.payload&&(p.payload.model&&(a=p.payload.model),!i&&p.payload.cwd&&(i=p.payload.cwd)),p.type==="event_msg"&&p.payload?.type==="user_message"){let _=p.payload.message||p.payload.text;_&&(c||(c=G(_.trim(),80)),d=G(_.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=G(_.text.trim(),80)),d=G(_.text.trim(),80))}}if(!i)return null;let m=await Bh(t);return{provider:"codex",sessionId:s,cwd:i,createdAt:l||r.createdAt,modifiedAt:r.modifiedAt,model:a,cliVersion:o,startCommand:qh(u,f),firstUserMessage:c,lastUserMessage:d,messageCount:m.messageCount,filePath:t,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(t){let n=await this.resolveSessionFile(t);if(!n)return null;let r=await Ce(n),s=[],i="",o,a,l,c,d,u=t,f,m,p=new Set;for await(let h of Je(n)){let g=h.timestamp?new Date(h.timestamp):new Date;if(h.type==="session_meta"&&h.payload){h.payload.id&&(u=h.payload.id),h.payload.cwd&&(i=h.payload.cwd),h.payload.cli_version&&(o=h.payload.cli_version),h.payload.timestamp&&(l=new Date(h.payload.timestamp)),f=qh(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
|
|
1667
|
-
`);
|
|
1666
|
+
`);try{return JSON.stringify(e)}catch{return String(e)}}function pL(e){let t=e;if(typeof e=="string")try{t=JSON.parse(e)}catch{return}return t!==null&&typeof t=="object"&&!Array.isArray(t)?t:void 0}function _L(e,t){if(t===void 0)return;let n={input:t};if(e!=="apply_patch"||typeof t!="string")return n;let r=[...t.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 Bh(e){let t=0,n=0,r=0,s=0,i=0,o,a;for await(let l of Je(e)){if(l.type==="response_item"&&l.payload){let c=l.payload;if(c.type==="message"&&c.role==="user"&&c.content)for(let d of c.content)d.type==="input_text"&&typeof d.text=="string"&&d.text&&t++;else if(c.type==="message"&&c.role==="assistant"&&c.content)for(let d of c.content)d.type==="output_text"&&typeof d.text=="string"&&d.text&&t++}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 d=mL(l.payload.info.last_token_usage);d&&(o=d),typeof l.payload.info.model_context_window=="number"&&(a=l.payload.info.model_context_window)}}return{messageCount:t,totalInputTokens:n,totalCachedInputTokens:r,totalOutputTokens:s,totalReasoningOutputTokens:i,lastTokenUsage:o,modelContextWindow:a}}var To,Hh=w(()=>{"use strict";on();To=class{name="codex";codexDirs;constructor(t={}){let n=[Fs(ke,".codex"),Fs(ke,".code")];if(t.codexDirs&&t.codexDirs.length>0){this.codexDirs=[...new Set(t.codexDirs)];return}let r=[t.codexDir||n[0],t.codeDir||n[1]];this.codexDirs=[...new Set(r)]}getWatchPaths(){return this.codexDirs.map(t=>({directory:Fs(t,"sessions"),filePattern:/\.jsonl$/}))}async getSessionsDirs(){let t=[];for(let n of this.codexDirs){let r=Fs(n,"sessions");try{await Wh(r),t.push(r)}catch{}}return t}async discoverSessions(){let t=[],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&&t.push(o)}catch{}}return t}async findSessionFiles(t){let n=[],r;try{r=await cL(t)}catch{return n}for(let s of r){let i=Fs(t,s),o=await Wh(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(t){let n=uL(t,".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(t){let n=await Ve(t,30),r=await Ce(t),s=this.extractSessionIdFromFilename(t),i="",o,a,l,c,d,u,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&&(u=p.payload.originator),p.payload.source&&(f=p.payload.source)),p.type==="turn_context"&&p.payload&&(p.payload.model&&(a=p.payload.model),!i&&p.payload.cwd&&(i=p.payload.cwd)),p.type==="event_msg"&&p.payload?.type==="user_message"){let _=p.payload.message||p.payload.text;_&&(c||(c=G(_.trim(),80)),d=G(_.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=G(_.text.trim(),80)),d=G(_.text.trim(),80))}}if(!i)return null;let m=await Bh(t);return{provider:"codex",sessionId:s,cwd:i,createdAt:l||r.createdAt,modifiedAt:r.modifiedAt,model:a,cliVersion:o,startCommand:qh(u,f),firstUserMessage:c,lastUserMessage:d,messageCount:m.messageCount,filePath:t,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(t){let n=await this.resolveSessionFile(t);if(!n)return null;let r=await Ce(n),s=[],i="",o,a,l,c,d,u=t,f,m,p=new Set;for await(let h of Je(n)){let g=h.timestamp?new Date(h.timestamp):new Date;if(h.type==="session_meta"&&h.payload){h.payload.id&&(u=h.payload.id),h.payload.cwd&&(i=h.payload.cwd),h.payload.cli_version&&(o=h.payload.cli_version),h.payload.timestamp&&(l=new Date(h.payload.timestamp)),f=qh(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 E of y.content)if(E.type==="input_text"&&typeof E.text=="string"&&E.text){let b=E.text.trim();c||(c=G(b,80)),d=G(b,80),Us(s,p,{role:"user",timestamp:g,content:pe(b)})}continue}if(y.role==="assistant"&&y.content){for(let E of y.content)E.type==="output_text"&&typeof E.text=="string"&&E.text&&Us(s,p,{role:"assistant",timestamp:g,content:pe(E.text),model:a});continue}if(y.role!=="user"&&y.role!=="assistant"&&y.content){for(let E of y.content)(E.type==="input_text"||E.type==="output_text")&&typeof E.text=="string"&&E.text&&Us(s,p,{role:"system",timestamp:g,content:pe(E.text.trim())});continue}}if(y.type==="function_call"){s.push({role:"tool_use",timestamp:g,content:y.name||"unknown tool",toolName:y.name,toolInput:y.arguments!==void 0?pe(Dr(y.arguments)):void 0,toolInputData:pL(y.arguments),toolCallId:y.call_id});continue}if(y.type==="function_call_output"){s.push({role:"tool_result",timestamp:g,content:pe(Dr(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(Dr(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(Dr(y.output)),toolCallId:y.call_id});continue}if(y.type==="reasoning"&&y.summary){let E=y.summary.map(b=>Dr(b.text)).join(`
|
|
1667
|
+
`);E.trim()&&Us(s,p,{role:"thinking",timestamp:g,content:pe(E)});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&&Us(s,p,{role:"thinking",timestamp:g,content:pe(y)})}}if(!i)return null;let _=await Bh(n);return{provider:"codex",sessionId:u,cwd:i,createdAt:l||r.createdAt,modifiedAt:r.modifiedAt,model:a,cliVersion:o,startCommand:f,turnStatus:m,firstUserMessage:c,lastUserMessage:d,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(t){return this.resolveSessionFile(t)}async deleteSession(t){let n=await this.resolveSessionFile(t);return n?(await dL(n),!0):!1}async resolveSessionFile(t){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)===t)return i;let s=[];for(let i of r)this.extractSessionIdFromFilename(i).startsWith(t)&&s.push(i);if(s.length===1)return s[0];for(let i of r){let o=await Ve(i,1);if(o.length>0&&o[0].type==="session_meta"){let a=o[0].payload?.id;if(a===t||a&&a.startsWith(t))return i}}return null}}});function od(e){return new id(e)}var id,ad=w(()=>{"use strict";Hh();Pt();$n();yt();id=class extends Ae{constructor(t){super({provider:new To(t),capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!1,canCancel:!1},injection:{leaderMode:"prompt-append"},binary:"codex",seedArgs:["exec","--dangerously-bypass-approvals-and-sandbox","--skip-git-repo-check","-"],seedStdin:`${ge}
|
|
1668
1668
|
`,resumeTemplate:"codex resume {{session_id}}",startTemplate:"codex",transport:Uh})}seedArgsFor(t){let n=super.seedArgsFor(t);return t?.model?[...n.slice(0,-1),"--model",t.model,n[n.length-1]]:n}}});function Ws(e){if(!e.trim())return"unknown";let t=e.split(/\r?\n/).filter(r=>r.trim().length>0);if(t.length>1)try{let r=JSON.parse(t[0]);if(r!==null&&typeof r=="object"&&!Array.isArray(r)&&"kind"in r)return"jsonl"}catch{}let n;try{n=JSON.parse(e)}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 vo(e){let t=Ws(e);if(t==="unknown")throw new Error("gemini session content matches neither known format (old .json with messages[] or new .jsonl with kind metadata)");if(t==="json"){let a=JSON.parse(e);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=e.split(`
|
|
1669
1669
|
`).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 d=c;if(typeof d.id=="string"){let u=o.get(d.id);u?hL(u,d):(i.push(d),o.set(d.id,d))}else i.push(d)}}return{sessionId:typeof s.sessionId=="string"?s.sessionId:void 0,projectHash:typeof s.projectHash=="string"?s.projectHash:void 0,startTime:typeof s.startTime=="string"?s.startTime:void 0,lastUpdated:typeof s.lastUpdated=="string"?s.lastUpdated:void 0,kind:typeof s.kind=="string"?s.kind:void 0,messages:i}}function hL(e,t){for(let[n,r]of Object.entries(t))if(r!==void 0){if(n==="tokens"&&Xh(e.tokens)&&Xh(r)){e.tokens={...e.tokens,...r};continue}e[n]=r}}function Xh(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}function Jh(e,t){if(t==="json")return JSON.stringify(e,null,2);let{messages:n,...r}=e,s=[JSON.stringify(r)];for(let i of n)s.push(JSON.stringify(i));return s.join(`
|
|
1670
1670
|
`)+`
|
|
1671
|
-
`}var ld=w(()=>{"use strict"});import{createHash as gL}from"node:crypto";import{readdir as qs,readFile as Gh,stat as bo,unlink as yL}from"node:fs/promises";import{join as st,basename as EL,dirname as wL}from"node:path";import{cwd as TL}from"node:process";function Kh(e){return e?typeof e=="string"?e:Array.isArray(e)?e.map(t=>t.text||"").join(""):"":""}function Vh(e){return e==="user"}function cd(e){return e==="gemini"||e==="assistant"}function tr(e,t=new Date(0)){if(!e)return t;let n=new Date(e);return Number.isNaN(n.getTime())?t:n}function vL(e){return`${e.sessionId}\0${e.cwd}`}function bL(e,t){let n=e.filePaths??[e.filePath],r=t.filePaths??[t.filePath],s=[...new Set([...n,...r])],i=t.modifiedAt.getTime()>=e.modifiedAt.getTime()?t:e;return{...i,createdAt:e.createdAt.getTime()<=t.createdAt.getTime()?e.createdAt:t.createdAt,modifiedAt:i.modifiedAt,filePath:i.filePath,filePaths:s}}function So(e){let t=Number(e??0);return Number.isFinite(t)?Math.max(0,Math.round(t)):0}function Yh(e){let t=0,n=0,r=0,s=0,i=0,o;for(let a of e){if(!cd(a.type)||!a.tokens)continue;let l=So(a.tokens.input),c=So(a.tokens.cached),d=Math.max(l-c,0),u=So(a.tokens.output),f=So(a.tokens.thoughts);t+=l,n+=c,r+=u,s+=f,i=l,o={inputTokens:d,cachedInputTokens:c,cacheWriteInputTokens:0,outputTokens:u,reasoningOutputTokens:f,totalTokens:l+u+f}}return{totalInputTokens:t,totalCachedInputTokens:n,totalOutputTokens:r,totalReasoningOutputTokens:s,lastInputTokens:i,lastTokenUsage:o}}function SL(e){return gL("sha256").update(e).digest("hex")}function Bs(e,t){let n=t;for(;n&&!e.has(n);){e.add(n);let r=wL(n);if(r===n)break;n=r}}var ko,zh=w(()=>{"use strict";on();ld();ce();ko=class{name="gemini";workspaceHashMap;geminiProjectsFile;geminiTmpDir;claudeProjectsDir;codexSessionDirs;extraWorkspacePaths;constructor(t={}){let n=t.geminiDir||st(ke,".gemini");this.geminiProjectsFile=st(n,"projects.json"),this.geminiTmpDir=st(n,"tmp");let r=t.claudeDir||st(ke,".claude");this.claudeProjectsDir=st(r,"projects");let s=[st(ke,".codex"),st(ke,".code")],i=t.codexDirs&&t.codexDirs.length>0?t.codexDirs:[t.codexDir||s[0],t.codeDir||s[1]];this.codexSessionDirs=[...new Set(i)].map(o=>st(o,"sessions")),this.extraWorkspacePaths=t.extraWorkspacePaths||[]}getWatchPaths(){return[{directory:this.geminiTmpDir,filePattern:/\.jsonl?$/}]}async discoverSessions(){let t=await this.findSessionFiles(),n=new Map;for(let r of t)try{let s=await this.extractSummary(r);if(!s)continue;let i=vL(s),o=n.get(i);n.set(i,o?bL(o,s):s)}catch{}return[...n.values()]}async loadSession(t){let n=await this.resolveSessionFile(t);if(!n)return null;let r;try{r=await this.readSessionFile(n)}catch{return null}if(!r)return null;let s=await Ce(n),i=[],o=r.messages||[],a=r.sessionId||this.extractSessionIdFromFilename(n),l=r.projectHash||"",c=await this.resolveWorkspace(l),d,u,f;for(let h of o){let g=tr(h.timestamp),
|
|
1672
|
-
`).trim();k&&i.push({role:"thinking",timestamp:tr(S.timestamp,g),content:pe(k)})}i.push({role:"assistant",timestamp:g,content:
|
|
1671
|
+
`}var ld=w(()=>{"use strict"});import{createHash as gL}from"node:crypto";import{readdir as qs,readFile as Gh,stat as bo,unlink as yL}from"node:fs/promises";import{join as st,basename as EL,dirname as wL}from"node:path";import{cwd as TL}from"node:process";function Kh(e){return e?typeof e=="string"?e:Array.isArray(e)?e.map(t=>t.text||"").join(""):"":""}function Vh(e){return e==="user"}function cd(e){return e==="gemini"||e==="assistant"}function tr(e,t=new Date(0)){if(!e)return t;let n=new Date(e);return Number.isNaN(n.getTime())?t:n}function vL(e){return`${e.sessionId}\0${e.cwd}`}function bL(e,t){let n=e.filePaths??[e.filePath],r=t.filePaths??[t.filePath],s=[...new Set([...n,...r])],i=t.modifiedAt.getTime()>=e.modifiedAt.getTime()?t:e;return{...i,createdAt:e.createdAt.getTime()<=t.createdAt.getTime()?e.createdAt:t.createdAt,modifiedAt:i.modifiedAt,filePath:i.filePath,filePaths:s}}function So(e){let t=Number(e??0);return Number.isFinite(t)?Math.max(0,Math.round(t)):0}function Yh(e){let t=0,n=0,r=0,s=0,i=0,o;for(let a of e){if(!cd(a.type)||!a.tokens)continue;let l=So(a.tokens.input),c=So(a.tokens.cached),d=Math.max(l-c,0),u=So(a.tokens.output),f=So(a.tokens.thoughts);t+=l,n+=c,r+=u,s+=f,i=l,o={inputTokens:d,cachedInputTokens:c,cacheWriteInputTokens:0,outputTokens:u,reasoningOutputTokens:f,totalTokens:l+u+f}}return{totalInputTokens:t,totalCachedInputTokens:n,totalOutputTokens:r,totalReasoningOutputTokens:s,lastInputTokens:i,lastTokenUsage:o}}function SL(e){return gL("sha256").update(e).digest("hex")}function Bs(e,t){let n=t;for(;n&&!e.has(n);){e.add(n);let r=wL(n);if(r===n)break;n=r}}var ko,zh=w(()=>{"use strict";on();ld();ce();ko=class{name="gemini";workspaceHashMap;geminiProjectsFile;geminiTmpDir;claudeProjectsDir;codexSessionDirs;extraWorkspacePaths;constructor(t={}){let n=t.geminiDir||st(ke,".gemini");this.geminiProjectsFile=st(n,"projects.json"),this.geminiTmpDir=st(n,"tmp");let r=t.claudeDir||st(ke,".claude");this.claudeProjectsDir=st(r,"projects");let s=[st(ke,".codex"),st(ke,".code")],i=t.codexDirs&&t.codexDirs.length>0?t.codexDirs:[t.codexDir||s[0],t.codeDir||s[1]];this.codexSessionDirs=[...new Set(i)].map(o=>st(o,"sessions")),this.extraWorkspacePaths=t.extraWorkspacePaths||[]}getWatchPaths(){return[{directory:this.geminiTmpDir,filePattern:/\.jsonl?$/}]}async discoverSessions(){let t=await this.findSessionFiles(),n=new Map;for(let r of t)try{let s=await this.extractSummary(r);if(!s)continue;let i=vL(s),o=n.get(i);n.set(i,o?bL(o,s):s)}catch{}return[...n.values()]}async loadSession(t){let n=await this.resolveSessionFile(t);if(!n)return null;let r;try{r=await this.readSessionFile(n)}catch{return null}if(!r)return null;let s=await Ce(n),i=[],o=r.messages||[],a=r.sessionId||this.extractSessionIdFromFilename(n),l=r.projectHash||"",c=await this.resolveWorkspace(l),d,u,f;for(let h of o){let g=tr(h.timestamp),y=h.type,E=pe(Kh(h.content));if(Vh(y)){let S=E.trim();S&&(d||(d=G(S,80)),u=G(S,80)),i.push({role:"user",timestamp:g,content:S||E});continue}if(cd(y)){h.model&&(f=h.model);for(let S of h.thoughts||[]){let k=[S.subject,S.description].filter(Boolean).join(`
|
|
1672
|
+
`).trim();k&&i.push({role:"thinking",timestamp:tr(S.timestamp,g),content:pe(k)})}i.push({role:"assistant",timestamp:g,content:E,model:h.model});continue}let b=y?`[${y}] `:"";i.push({role:"system",timestamp:g,content:`${b}${E}`.trim()})}let m=tr(r.startTime,s.createdAt),p=tr(r.lastUpdated,s.modifiedAt),_=Yh(o);return{provider:"gemini",sessionId:a,cwd:c,createdAt:m,modifiedAt:p,model:f,startCommand:"gemini",firstUserMessage:d,lastUserMessage:u,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(t){let n=await this.readSessionFile(t);if(!n)return null;let r=await Ce(t),s=n.messages||[],i=n.sessionId||this.extractSessionIdFromFilename(t),o=n.projectHash||"",a=await this.resolveWorkspace(o),l,c,d,u=0;for(let m of s)if(Vh(m.type)){u++;let p=Kh(m.content).trim();p&&(l||(l=G(pe(p),80)),c=G(pe(p),80))}else cd(m.type)&&(u++,m.model&&(d=m.model));let f=Yh(s);return{provider:"gemini",sessionId:i,cwd:a,createdAt:tr(n.startTime,r.createdAt),modifiedAt:tr(n.lastUpdated,r.modifiedAt),model:d,startCommand:"gemini",firstUserMessage:l,lastUserMessage:c,messageCount:u,filePath:t,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(t){let n=await Gh(t,"utf-8");if(Ws(n)==="unknown")return $({event:"gemini_session_format_unknown",provider:"gemini",file:t,preview:n.slice(0,120),message:`gemini session file at ${t} 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 vo(n)}catch{return null}}extractSessionIdFromFilename(t){let n=EL(t).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 t=[],n;try{n=await qs(this.geminiTmpDir)}catch{return t}for(let r of n){let s=st(this.geminiTmpDir,r,"chats");if(!(await bo(s).catch(()=>null))?.isDirectory())continue;let o;try{o=await qs(s)}catch{continue}for(let a of o)a.startsWith("session-")&&(!a.endsWith(".json")&&!a.endsWith(".jsonl")||t.push(st(s,a)))}return t}async resolveSessionPath(t){return this.resolveSessionFile(t)}async deleteSession(t){let n=await this.resolveSessionFile(t);return n?(await yL(n),!0):!1}async resolveSessionFile(t){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===t||a.startsWith(t),c=o===t||o.startsWith(t)||o.length>=8&&t.startsWith(o);if(!l&&!c)continue;let d=await Ce(s).catch(()=>({createdAt:new Date(0),modifiedAt:new Date(0)}));r.push({filePath:s,modifiedAt:tr(i?.lastUpdated,d.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(t){return t?(await this.getWorkspaceHashMap()).get(t)||`[hash:${t.slice(0,16)}]`:"(unknown workspace)"}async getWorkspaceHashMap(){if(this.workspaceHashMap)return this.workspaceHashMap;let t=new Set;Bs(t,TL());for(let r of this.extraWorkspacePaths)Bs(t,r);for(let r of await this.collectGeminiProjectPaths())Bs(t,r);for(let r of await this.collectCodexCwds())Bs(t,r);for(let r of await this.collectClaudeCwds())Bs(t,r);let n=new Map;for(let r of t)n.set(SL(r),r);return this.workspaceHashMap=n,n}async collectGeminiProjectPaths(){let t;try{t=await Gh(this.geminiProjectsFile,"utf-8")}catch{return[]}try{let r=JSON.parse(t).projects;return!r||typeof r!="object"||Array.isArray(r)?[]:Object.keys(r)}catch{return[]}}async collectCodexCwds(){let t=new Set;for(let n of this.codexSessionDirs){let r=await this.findJsonlFiles(n);for(let s of r){let o=(await Ve(s,1).catch(()=>[]))[0]?.payload?.cwd;o&&t.add(o)}}return[...t]}async collectClaudeCwds(){let t=new Set,n;try{n=await qs(this.claudeProjectsDir)}catch{return[]}for(let r of n){let s=st(this.claudeProjectsDir,r);if(!(await bo(s).catch(()=>null))?.isDirectory())continue;let o;try{o=await qs(s)}catch{continue}for(let a of o){if(!a.endsWith(".jsonl"))continue;let l=st(s,a),d=(await Ve(l,1).catch(()=>[]))[0]?.cwd;d&&t.add(d)}}return[...t]}async findJsonlFiles(t){let n=[];if(!(await bo(t).catch(()=>null))?.isDirectory())return n;let s;try{s=await qs(t)}catch{return n}for(let i of s){let o=st(t,i),a=await bo(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 kL,writeFileSync as IL,mkdirSync as NL}from"node:fs";import{join as xL,dirname as AL}from"node:path";import{randomUUID as RL}from"node:crypto";function ud(e){return new dd(e)}var dd,fd=w(()=>{"use strict";zh();Pt();$n();yt();ld();dd=class extends Ae{constructor(t){super({provider:new ko(t),capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!0,forkSupport:"automatic",canStructuredTurn:!0,canStreamDeltas:!0,canCancel:!0},injection:{leaderMode:"skill-file",leaderSetupHint:"Place skill files in the project's .gemini/ directory"},binary:"gemini",seedArgs:["-p",ge,"-y","--skip-trust"],resumeTemplate:"gemini --resume {{session_id}} --skip-trust",startTemplate:"gemini --skip-trust",transport:(n,r)=>On(n,{...r,acpTool:"gemini"})})}forkHint(t){return["Gemini fork: copies the session file with a new ID.","The forked session has the same conversation history","but diverges from that point forward."].join(`
|
|
1673
1673
|
`)}seedArgsFor(t){let n=super.seedArgsFor(t);return t?.model?[...n,"--model",t.model]:n}manualSeedHint(t){return{launchCommand:`cd ${t} && gemini --skip-trust`,postLaunchNote:fo,lsCommand:`lmctl ls --provider gemini --sessiondir ${t}`}}async fork(t,n){let r=await this.resolvePath(t);if(!r)return{success:!1,error:`Session file not found for ${t}`};try{let s=kL(r,"utf-8"),i=Ws(s),o=vo(s),a=RL();o.sessionId=a,o.kind="main";let l=AL(r),c=new Date().toISOString().replace(/[:.]/g,"-").slice(0,19),d=i==="jsonl"?".jsonl":".json",u=`session-${c}-${a.slice(0,8)}${d}`,f=xL(l,u);return NL(l,{recursive:!0}),IL(f,Jh(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 Zh,readFile as LL,rm as OL,stat as jr}from"node:fs/promises";import{basename as $L,join as Tt}from"node:path";function CL(e){if(!e)return null;let t={inputTokens:0,outputTokens:0,cacheReadTokens:0,cacheWriteTokens:0,reasoningTokens:0},n=!1;for(let r of Object.values(e))r?.usage&&(n=!0,t.inputTokens+=r.usage.inputTokens??0,t.outputTokens+=r.usage.outputTokens??0,t.cacheReadTokens+=r.usage.cacheReadTokens??0,t.cacheWriteTokens+=r.usage.cacheWriteTokens??0,t.reasoningTokens+=r.usage.reasoningTokens??0);return n?t:null}function md(){return{shutdownTotals:null,assistantOutputSum:0}}function eg(e,t){if(t.type==="assistant.message"){let n=t.data?.outputTokens;typeof n=="number"&&(e.assistantOutputSum+=n,e.lastAssistantOutputTokens=n)}else if(t.type==="session.shutdown"){let n=CL(t.data?.modelMetrics);n&&(e.shutdownTotals=n)}}function Qh(e){let t=e.shutdownTotals,n=e.lastAssistantOutputTokens!==void 0?{outputTokens:e.lastAssistantOutputTokens}:void 0;return{totalInputTokens:t?.inputTokens,totalCachedInputTokens:t?.cacheReadTokens,totalCacheWriteInputTokens:t?.cacheWriteTokens,totalOutputTokens:t?.outputTokens??(e.lastAssistantOutputTokens===void 0?void 0:e.assistantOutputSum),totalReasoningOutputTokens:t?.reasoningTokens,lastTokenUsage:n}}function ML(e){let t={};for(let n of e.split(`
|
|
1674
1674
|
`)){let r=n.match(/^(\w+):\s*(.*)$/);r&&(t[r[1]]=r[2].trim())}return{id:t.id,cwd:t.cwd,summary_count:t.summary_count?parseInt(t.summary_count,10):void 0,created_at:t.created_at,updated_at:t.updated_at,summary:t.summary}}function nr(e){if(!e)return;let t=new Date(e);return Number.isNaN(t.getTime())?void 0:t}async function DL(e){let t=0,n=md();for await(let r of Je(e))(r.type==="user.message"||r.type==="assistant.message"&&(r.data?.content||"").trim())&&t++,eg(n,r);return{messageCount:t,tokens:n}}function jL(e){let t=PL(e),n=new Map;for(let r of e){if(r.role!=="tool_use"||r.toolCallId===void 0)continue;if(r.toolName==="bash"){let l=t.get(r.toolCallId),d=[l?.content,l?.toolDetailedContent].filter(f=>typeof f=="string").join(`
|
|
1675
|
-
`).match(/<command (?:started in (?:detached )?background with|with) shellId:\s*([^>\s]+)/i)?.[1];if(d===void 0)continue;let u=`copilot-shell:${d}:${r.toolCallId}`;n.set(d,u),r.backgroundTaskId=u,l!==void 0&&(l.backgroundTaskId=u);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=t.get(r.toolCallId);a!==void 0&&(a.backgroundTaskId=o)}}function PL(e){let t=new Map;for(let n of e)n.role==="tool_result"&&n.toolCallId!==void 0&&t.set(n.toolCallId,n);return t}var Io,tg=w(()=>{"use strict";on();Io=class{name="copilot";sessionStateDir;constructor(t={}){let n=t.copilotDir||Tt(ke,".copilot");this.sessionStateDir=Tt(n,"session-state")}getWatchPaths(){return[{directory:this.sessionStateDir,filePattern:/events\.jsonl$/}]}async discoverSessions(){let t=[],n;try{n=await Zh(this.sessionStateDir)}catch{return t}for(let r of n){let s=Tt(this.sessionStateDir,r);if((await jr(s).catch(()=>null))?.isDirectory())try{let o=await this.extractSummary(s,r);o&&t.push(o)}catch{}}return t}async loadSession(t){let n=await this.resolveSessionDir(t);if(!n)return null;let r=await this.readWorkspaceYaml(n),s=Tt(n,"events.jsonl"),i=await jr(s).catch(()=>null),o=i?s:Tt(n,"workspace.yaml"),a=await Ce(i?s:n),l=[],c=r?.cwd||"(unknown workspace)",d,u,f,m,p,_,h=r?.id||$L(n)||t,g=md();if(i)for await(let
|
|
1675
|
+
`).match(/<command (?:started in (?:detached )?background with|with) shellId:\s*([^>\s]+)/i)?.[1];if(d===void 0)continue;let u=`copilot-shell:${d}:${r.toolCallId}`;n.set(d,u),r.backgroundTaskId=u,l!==void 0&&(l.backgroundTaskId=u);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=t.get(r.toolCallId);a!==void 0&&(a.backgroundTaskId=o)}}function PL(e){let t=new Map;for(let n of e)n.role==="tool_result"&&n.toolCallId!==void 0&&t.set(n.toolCallId,n);return t}var Io,tg=w(()=>{"use strict";on();Io=class{name="copilot";sessionStateDir;constructor(t={}){let n=t.copilotDir||Tt(ke,".copilot");this.sessionStateDir=Tt(n,"session-state")}getWatchPaths(){return[{directory:this.sessionStateDir,filePattern:/events\.jsonl$/}]}async discoverSessions(){let t=[],n;try{n=await Zh(this.sessionStateDir)}catch{return t}for(let r of n){let s=Tt(this.sessionStateDir,r);if((await jr(s).catch(()=>null))?.isDirectory())try{let o=await this.extractSummary(s,r);o&&t.push(o)}catch{}}return t}async loadSession(t){let n=await this.resolveSessionDir(t);if(!n)return null;let r=await this.readWorkspaceYaml(n),s=Tt(n,"events.jsonl"),i=await jr(s).catch(()=>null),o=i?s:Tt(n,"workspace.yaml"),a=await Ce(i?s:n),l=[],c=r?.cwd||"(unknown workspace)",d,u,f,m,p,_,h=r?.id||$L(n)||t,g=md();if(i)for await(let y of Je(s)){let E=nr(y.timestamp)||a.modifiedAt;if(eg(g,y),y.type==="session.start"&&y.data){y.data.sessionId&&(h=y.data.sessionId),y.data.copilotVersion&&(u=y.data.copilotVersion),y.data.startTime&&(_=nr(y.data.startTime)),y.data.selectedModel&&(d=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){d=y.data.newModel;continue}if(y.type==="user.message"&&y.data){let b=y.data.content||"",S=b.trim();S&&(m||(m=G(S,80)),p=G(S,80)),l.push({role:"user",timestamp:E,content:pe(S||b)});continue}if(y.type==="assistant.message"&&y.data){let b=(y.data.content||"").trim();if(b&&l.push({role:"assistant",timestamp:E,content:pe(b),model:d}),y.data.toolRequests)for(let S of y.data.toolRequests)l.push({role:"tool_use",timestamp:E,content:S.name||"unknown tool",toolName:S.name,toolInput:S.arguments?JSON.stringify(S.arguments,null,2):void 0,toolInputData:jt(S.arguments),toolCallId:S.toolCallId});continue}if(y.type==="tool.execution_complete"&&y.data){let b=y.data.result?.content||"",S=y.data.result?.detailedContent||"";l.push({role:"tool_result",timestamp:E,content:pe(b),toolDetailedContent:S?pe(S):void 0,toolCallId:y.data.toolCallId});continue}if(y.type==="assistant.reasoning"&&y.data?.content){l.push({role:"thinking",timestamp:E,content:pe(y.data.content)});continue}if(y.type==="session.error"||y.type==="session.warning"||y.type==="session.info"||y.type==="system.message"){let b=y.data?.message||"";b.trim()&&l.push({role:"system",timestamp:E,content:pe(b)});continue}}if(!m){let y=(r?.summary||"").trim();y&&(m=G(y,80))}return jL(l),{provider:"copilot",sessionId:h,cwd:c,createdAt:_??nr(r?.created_at)??a.createdAt,modifiedAt:nr(r?.updated_at)??a.modifiedAt,model:d,cliVersion:u,startCommand:"copilot",gitBranch:f,firstUserMessage:m,lastUserMessage:p,messageCount:l.filter(y=>y.role==="user"||y.role==="assistant").length,filePath:o,...Qh(g),messages:l}}async extractSummary(t,n){let r=await this.readWorkspaceYaml(t),s=Tt(t,"events.jsonl"),i=await jr(s).catch(()=>null),o=i?s:Tt(t,"workspace.yaml"),a=await Ce(i?s:t),l=i?await Ve(s,20):[],c=r?.id||n,d=r?.cwd||"(unknown workspace)",u,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=nr(g.data.startTime)),g.data.selectedModel&&(u=g.data.selectedModel),g.data.context?.cwd&&(d=g.data.context.cwd)),g.type==="session.model_change"&&g.data?.newModel&&(u||(u=g.data.newModel)),g.type==="user.message"&&g.data){let y=(g.data.content||"").trim();y&&(p||(p=G(y,80)),_=G(y,80))}if(!p){let g=(r?.summary||"").trim();g&&(p=G(g,80))}let h=i?await DL(s):{messageCount:0,tokens:md()};return{provider:"copilot",sessionId:c,cwd:d,createdAt:m??nr(r?.created_at)??a.createdAt,modifiedAt:nr(r?.updated_at)??a.modifiedAt,model:u,cliVersion:f,startCommand:"copilot",firstUserMessage:p,lastUserMessage:_,messageCount:h.messageCount,filePath:o,...Qh(h.tokens)}}async readWorkspaceYaml(t){let n=Tt(t,"workspace.yaml");try{let r=await LL(n,"utf-8");return ML(r)}catch{return null}}async resolveSessionPath(t){return this.resolveSessionDir(t)}async deleteSession(t){let n=await this.resolveSessionDir(t);return n?(await OL(n,{recursive:!0}),!0):!1}async resolveSessionDir(t){let n;try{n=await Zh(this.sessionStateDir)}catch{return null}if(n.includes(t)){let s=Tt(this.sessionStateDir,t);if((await jr(s).catch(()=>null))?.isDirectory())return s}let r=[];for(let s of n)if(s.startsWith(t)){let i=Tt(this.sessionStateDir,s);(await jr(i).catch(()=>null))?.isDirectory()&&r.push(i)}if(r.length===1)return r[0];for(let s of n){let i=Tt(this.sessionStateDir,s);if(!(await jr(i).catch(()=>null))?.isDirectory())continue;let a=await this.readWorkspaceYaml(i);if(a&&(a.id===t||a.id?.startsWith(t)))return i}return null}}});function _d(e){return new pd(e)}var pd,hd=w(()=>{"use strict";tg();Pt();$n();ce();yt();pd=class extends Ae{constructor(t){super({provider:new Io(t),capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!0,canCancel:!0},injection:{leaderMode:"prompt-append"},binary:"copilot",seedArgs:["-p",ge,"--yolo"],resumeTemplate:"copilot --resume={{session_id}}",startTemplate:"copilot",transport:(n,r)=>On(n,{...r,acpTool:"copilot"})})}async seed(t,n){let r=await super.seed(t,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 Ue({event:"model_ignored",provider:"copilot",model:n.model,reason:s}),{...r,warnings:[...r.warnings??[],`copilot seed ignored model=${n.model}: ${s}`]}}}});import{existsSync as ng,readdirSync as FL,statSync as rg}from"node:fs";import{join as Cn}from"node:path";import{createRequire as UL}from"node:module";function sg(){return gd===null&&(gd=UL(import.meta.url)("node:sqlite").DatabaseSync),gd}function ig(){return{observed:!1,totalInputTokens:0,totalCachedInputTokens:0,totalCacheWriteInputTokens:0,totalOutputTokens:0,totalReasoningOutputTokens:0}}function og(e,t){if(!t)return;e.observed=!0;let n=t.input??0,r=t.output??0,s=t.reasoning??0,i=t.cache?.read??0,o=t.cache?.write??0;if(e.totalInputTokens+=n,e.totalCachedInputTokens+=i,e.totalCacheWriteInputTokens+=o,e.totalOutputTokens+=r,e.totalReasoningOutputTokens+=s,n+r+s+i+o>0){let a=n+i+o;e.lastInputTokens=a,e.lastTokenUsage={inputTokens:n,cachedInputTokens:i,cacheWriteInputTokens:o,outputTokens:r,reasoningOutputTokens:s,totalTokens:a+r+s}}}function ag(e){return e.observed?{totalInputTokens:e.totalInputTokens,totalCachedInputTokens:e.totalCachedInputTokens,totalCacheWriteInputTokens:e.totalCacheWriteInputTokens,totalOutputTokens:e.totalOutputTokens,totalReasoningOutputTokens:e.totalReasoningOutputTokens,lastInputTokens:e.lastInputTokens,lastTokenUsage:e.lastTokenUsage}:{}}function WL(){let e=process.env.XDG_DATA_HOME||Cn(ke,".local","share"),t=process.env.XDG_CONFIG_HOME||Cn(ke,".config");return[Cn(e,"opencode","opencode.db"),Cn(t,"opencode","opencode.db")]}function qL(){if(process.env.OPENCODE_DB)return[process.env.OPENCODE_DB];let e=process.env.XDG_DATA_HOME||Cn(ke,".local","share"),t=Cn(e,"lmplayer"),n=Cn(t,"opencode-local.db"),r=[n];try{let s=FL(t).filter(i=>/^opencode.*\.db$/u.test(i)).map(i=>Cn(t,i)).filter(i=>i!==n).sort((i,o)=>{try{return rg(o).mtimeMs-rg(i).mtimeMs}catch{return 0}});r.push(...s)}catch{}return r}function BL(e){return e==="lmplayer"?qL():WL()}var gd,Pr,yd=w(()=>{"use strict";on();ce();gd=null;Pr=class{name;startCommand;dbPaths;busyTimeoutMs;constructor(t){this.name=t?.providerName??"opencode",this.startCommand=t?.startCommand??this.name,this.busyTimeoutMs=t?.busyTimeoutMs??5e3,t?.dbPath?this.dbPaths=[t.dbPath]:this.dbPaths=BL(this.name)}existingDbPaths(){return this.dbPaths.filter(t=>ng(t))}openDb(t){if(!ng(t))return null;let n=new(sg())(t,{open:!0,readOnly:!0});return n.exec(`PRAGMA busy_timeout = ${this.busyTimeoutMs}`),n}async discoverSessions(){let t=[];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,
|
|
1676
1676
|
s.time_created, s.time_updated
|
|
1677
1677
|
FROM session s
|
|
1678
1678
|
ORDER BY s.time_updated DESC`).all();for(let a of o){let l=s.get(a.project_id),c=a.directory||l?.worktree||"(unknown)",d=r.prepare(`SELECT m.id, m.data, m.time_created FROM message m
|
|
1679
|
-
WHERE m.session_id = ? ORDER BY m.time_created ASC`).all(a.id),u=0,f,m,p,_=ig(),h=[];for(let
|
|
1680
|
-
FROM message WHERE session_id = ? ORDER BY time_created ASC`).all(n.id),a=[],l=0,c,d,u,f=ig();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=t.prepare("SELECT id, data FROM part WHERE message_id = ? ORDER BY time_created ASC").all(m.id);if(p.role==="user"){let
|
|
1679
|
+
WHERE m.session_id = ? ORDER BY m.time_created ASC`).all(a.id),u=0,f,m,p,_=ig(),h=[];for(let y of d){let E;try{E=JSON.parse(y.data)}catch{continue}p||(p=E.model?.modelID||E.modelID),(E.role==="user"||E.role==="assistant")&&u++,E.role==="user"&&h.push(y.id),E.role==="assistant"&&og(_,E.tokens)}let g=[...h.length>0?[h[0]]:[],...h.length>1?[h[h.length-1]]:[]];for(let y of g){let E=r.prepare("SELECT id, data FROM part WHERE message_id = ? ORDER BY time_created ASC").all(y),b=this.extractText(E);b&&(f||(f=G(b,80)),m=G(b,80))}t.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:u,filePath:n,...ag(_)})}}catch(s){$({event:"opencode_discover_sessions_failed",provider:this.name,db_path:n,error_message:s instanceof Error?s.message:String(s)})}finally{r.close()}}return t.sort((n,r)=>r.modifiedAt.getTime()-n.modifiedAt.getTime())}async loadSession(t){for(let n of this.existingDbPaths()){let r=this.openDb(n);if(r)try{let s=this.findSessionRow(r,t);if(!s)continue;return this.buildSessionDetail(r,s,n)}catch{}finally{r.close()}}return null}buildSessionDetail(t,n,r){let s=t.prepare("SELECT id, worktree, name FROM project WHERE id = ?").get(n.project_id),i=n.directory||s?.worktree||"(unknown)",o=t.prepare(`SELECT id, session_id, time_created, time_updated, data
|
|
1680
|
+
FROM message WHERE session_id = ? ORDER BY time_created ASC`).all(n.id),a=[],l=0,c,d,u,f=ig();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=t.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&&(d||(d=G(y,80)),u=G(y,80)),a.push({role:"user",timestamp:h,content:y||"(empty)"}),l++}else if(p.role==="assistant"){og(f,p.tokens);for(let y of g){let E;try{E=JSON.parse(y.data)}catch{continue}E.type==="text"&&E.text?a.push({role:"assistant",timestamp:h,content:E.text,model:_}):E.type==="reasoning"&&E.text?a.push({role:"thinking",timestamp:h,content:E.text}):E.type==="tool"&&E.tool&&(a.push({role:"tool_use",timestamp:h,content:`${E.tool}`,toolName:E.tool,toolCallId:E.callID,toolInput:E.state?.input?JSON.stringify(E.state.input):void 0,toolInputData:jt(E.state?.input)}),E.state&&(E.state.status==="completed"||E.state.status==="error"||E.state.output!==void 0||E.state.error!==void 0)&&a.push({role:"tool_result",timestamp:h,content:E.state.error??E.state.output??"",toolCallId:E.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:d,lastUserMessage:u,messageCount:l,filePath:r,...ag(f),messages:a}}extractText(t){let n=[];for(let r of t){let s;try{s=JSON.parse(r.data)}catch{continue}s.type==="text"&&s.text&&n.push(s.text)}return n.join(`
|
|
1681
1681
|
`).trim()}async resolveSessionPath(t){for(let n of this.existingDbPaths()){let r=this.openDb(n);if(r)try{if(this.findSessionRow(r,t))return n}catch{}finally{r.close()}}return null}async deleteSession(t){for(let n of this.existingDbPaths()){let r=new(sg())(n,{open:!0});try{let s=this.findSessionRow(r,t);if(!s)continue;return r.prepare("DELETE FROM session WHERE id = ?").run(s.id).changes>0}catch{}finally{r.close()}}return!1}findSessionRow(t,n){let r=t.prepare(`SELECT s.id, s.project_id, s.slug, s.directory, s.title, s.version,
|
|
1682
1682
|
s.time_created, s.time_updated
|
|
1683
1683
|
FROM session s WHERE s.id = ?`).get(n);if(r)return r;let s=t.prepare(`SELECT s.id, s.project_id, s.slug, s.directory, s.title, s.version,
|
|
@@ -1687,11 +1687,11 @@ ${n}`:n}function eL(e,t){if(e!=="kimi"||!t.includes("notifications/initialized")
|
|
|
1687
1687
|
ORDER BY s.time_updated DESC
|
|
1688
1688
|
LIMIT 2`).all(`${n}%`);return s.length!==1?null:s[0]}}});function wd(){return new Ed}var Ed,Td=w(()=>{"use strict";yd();Pt();$n();yt();Ed=class extends Ae{constructor(){super({provider:new Pr,capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!0,canCancel:!0},injection:{leaderMode:"custom-tool",leaderSetupHint:"OpenCode supports custom tools via .opencode/tools/ directory"},binary:"opencode",seedArgs:["run",ge],resumeTemplate:"opencode --session {{session_id}}",startTemplate:"opencode",transport:(t,n)=>On(t,{...n,acpTool:"opencode"})})}seedArgsFor(t){let n=["run"];return t?.model&&n.push("--model",t.model),t?.effort&&n.push("--variant",t.effort),n.push(t?.prompt??ge),n}}});import{appendFile as HL,mkdir as XL,readFile as lg,readdir as cg,rm as JL,stat as dg}from"node:fs/promises";import{basename as GL,dirname as KL,isAbsolute as ug,join as rr,relative as VL,resolve as vd}from"node:path";function bd(e){if(!e)return;let t=new Date(e);return Number.isNaN(t.getTime())?void 0:t}function ZL(e){return typeof e=="number"?new Date(e):bd(e)??new Date(0)}function QL(e){return typeof e=="string"?e.trim():Array.isArray(e)?e.map(t=>t&&typeof t=="object"&&"text"in t&&typeof t.text=="string"?t.text:"").filter(Boolean).join(`
|
|
1689
1689
|
`).trim():""}function fg(e){if(e!==void 0)try{return JSON.stringify(e)}catch{return String(e)}}function eO(e){return e&&typeof e=="object"&&"output"in e&&typeof e.output=="string"?e.output:fg(e)??""}function tO(e){let t=nO(e),n=new Set;for(let r of e){if(r.role!=="tool_use"||r.toolName!=="Bash"||r.toolInputData?.run_in_background!==!0||r.toolCallId===void 0)continue;let s=t.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 e){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=t.get(r.toolCallId);i!==void 0&&(i.backgroundTaskId=s)}}function nO(e){let t=new Map;for(let n of e)n.role==="tool_result"&&n.toolCallId!==void 0&&t.set(n.toolCallId,n);return t}var YL,zL,No,mg=w(()=>{"use strict";on();YL="1.4",zL="1.5",No=class{name="kimi";homeDir;sessionsDir;constructor(t){this.homeDir=vd(t?.kimiHome??process.env.KIMI_CODE_HOME??rr(ke,".kimi-code")),this.sessionsDir=rr(this.homeDir,"sessions")}async discoverSessions(){let t=[];for(let n of await this.sessionFiles())try{let r=await this.summary(n);r&&t.push(r)}catch{}return t.sort((n,r)=>r.modifiedAt.getTime()-n.modifiedAt.getTime())}async loadSession(t){let n=await this.findSession(t);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(t){return(await this.findSession(t))?.wirePath??null}async deleteSession(t){let n=await this.findSession(t);return n?(await JL(n.sessionDir,{recursive:!0,force:!0}),await XL(KL(this.indexPath()),{recursive:!0,mode:448}),await HL(this.indexPath(),`${JSON.stringify({sessionId:n.sessionId,deleted:!0})}
|
|
1690
|
-
`,"utf-8"),!0):!1}getWatchPaths(){return[{directory:this.sessionsDir,filePattern:/wire\.jsonl$/}]}indexPath(){return rr(this.homeDir,"session_index.jsonl")}async sessionFiles(){let t=await this.readIndex(),n=new Map;for(let s of t.values())this.validSessionDir(s.sessionDir,s.sessionId)&&n.set(s.sessionId,this.filesFor(s.sessionId,s.sessionDir,s.workDir));let r;try{r=await cg(this.sessionsDir,{withFileTypes:!0})}catch{return[...n.values()]}for(let s of r){if(!s.isDirectory())continue;let i=rr(this.sessionsDir,s.name),o;try{o=await cg(i,{withFileTypes:!0})}catch{continue}for(let a of o){if(!a.isDirectory()||n.has(a.name))continue;let l=rr(i,a.name);n.set(a.name,this.filesFor(a.name,l))}}return[...n.values()]}async readIndex(){let t;try{t=await lg(this.indexPath(),"utf-8")}catch{return new Map}let n=new Map;for(let r of t.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:vd(s.sessionDir),workDir:s.workDir})}catch{}return n}filesFor(t,n,r){return{sessionId:t,sessionDir:n,statePath:rr(n,"state.json"),wirePath:rr(n,"agents","main","wire.jsonl"),indexedWorkDir:r}}validSessionDir(t,n){if(!ug(t)||GL(t)!==n)return!1;let r=VL(this.sessionsDir,vd(t));return r!==""&&r!==".."&&!r.startsWith(`..${process.platform==="win32"?"\\":"/"}`)&&!ug(r)}async findSession(t){let n=await this.sessionFiles(),r=n.find(i=>i.sessionId===t);if(r)return r;let s=n.filter(i=>i.sessionId.startsWith(t));return s.length===1?s[0]:null}async readState(t){try{let n=JSON.parse(await lg(t,"utf-8"));return n!==null&&typeof n=="object"&&!Array.isArray(n)?n:null}catch{return null}}async summary(t){let n=await this.readState(t.statePath);if(!n)return null;let r;try{r=await dg(t.wirePath)}catch{return null}let s=await dg(t.statePath).catch(()=>r),i=await this.parseWire(t.wirePath),o=bd(n.createdAt)??s.birthtime,a=bd(n.updatedAt)??(s.mtime>r.mtime?s.mtime:r.mtime);return{provider:"kimi",sessionId:t.sessionId,slug:n.title,cwd:n.workDir??t.indexedWorkDir??"(unknown)",createdAt:o,modifiedAt:a,model:i.model,startCommand:"kimi",firstUserMessage:i.firstUserMessage,lastUserMessage:i.lastUserMessage??(n.lastPrompt?G(n.lastPrompt.trim(),80):void 0),messageCount:i.messageCount,filePath:t.wirePath,filePaths:[t.statePath,t.wirePath],totalInputTokens:i.totalInputTokens,totalCachedInputTokens:i.totalCachedInputTokens,totalCacheWriteInputTokens:i.totalCacheWriteInputTokens,totalOutputTokens:i.totalOutputTokens,lastInputTokens:i.lastInputTokens,lastTokenUsage:i.lastTokenUsage}}async parseWire(t){let n=[],r=!0,s,i,o,a=0,l=0,c=0,d=0,u=!1,f=0,m,p;for await(let _ of Je(t)){let h=ZL(_.time??_.created_at);if(r&&(r=!1,_.type==="metadata"&&_.protocol_version!==YL)){let
|
|
1691
|
-
`);for(;
|
|
1690
|
+
`,"utf-8"),!0):!1}getWatchPaths(){return[{directory:this.sessionsDir,filePattern:/wire\.jsonl$/}]}indexPath(){return rr(this.homeDir,"session_index.jsonl")}async sessionFiles(){let t=await this.readIndex(),n=new Map;for(let s of t.values())this.validSessionDir(s.sessionDir,s.sessionId)&&n.set(s.sessionId,this.filesFor(s.sessionId,s.sessionDir,s.workDir));let r;try{r=await cg(this.sessionsDir,{withFileTypes:!0})}catch{return[...n.values()]}for(let s of r){if(!s.isDirectory())continue;let i=rr(this.sessionsDir,s.name),o;try{o=await cg(i,{withFileTypes:!0})}catch{continue}for(let a of o){if(!a.isDirectory()||n.has(a.name))continue;let l=rr(i,a.name);n.set(a.name,this.filesFor(a.name,l))}}return[...n.values()]}async readIndex(){let t;try{t=await lg(this.indexPath(),"utf-8")}catch{return new Map}let n=new Map;for(let r of t.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:vd(s.sessionDir),workDir:s.workDir})}catch{}return n}filesFor(t,n,r){return{sessionId:t,sessionDir:n,statePath:rr(n,"state.json"),wirePath:rr(n,"agents","main","wire.jsonl"),indexedWorkDir:r}}validSessionDir(t,n){if(!ug(t)||GL(t)!==n)return!1;let r=VL(this.sessionsDir,vd(t));return r!==""&&r!==".."&&!r.startsWith(`..${process.platform==="win32"?"\\":"/"}`)&&!ug(r)}async findSession(t){let n=await this.sessionFiles(),r=n.find(i=>i.sessionId===t);if(r)return r;let s=n.filter(i=>i.sessionId.startsWith(t));return s.length===1?s[0]:null}async readState(t){try{let n=JSON.parse(await lg(t,"utf-8"));return n!==null&&typeof n=="object"&&!Array.isArray(n)?n:null}catch{return null}}async summary(t){let n=await this.readState(t.statePath);if(!n)return null;let r;try{r=await dg(t.wirePath)}catch{return null}let s=await dg(t.statePath).catch(()=>r),i=await this.parseWire(t.wirePath),o=bd(n.createdAt)??s.birthtime,a=bd(n.updatedAt)??(s.mtime>r.mtime?s.mtime:r.mtime);return{provider:"kimi",sessionId:t.sessionId,slug:n.title,cwd:n.workDir??t.indexedWorkDir??"(unknown)",createdAt:o,modifiedAt:a,model:i.model,startCommand:"kimi",firstUserMessage:i.firstUserMessage,lastUserMessage:i.lastUserMessage??(n.lastPrompt?G(n.lastPrompt.trim(),80):void 0),messageCount:i.messageCount,filePath:t.wirePath,filePaths:[t.statePath,t.wirePath],totalInputTokens:i.totalInputTokens,totalCachedInputTokens:i.totalCachedInputTokens,totalCacheWriteInputTokens:i.totalCacheWriteInputTokens,totalOutputTokens:i.totalOutputTokens,lastInputTokens:i.lastInputTokens,lastTokenUsage:i.lastTokenUsage}}async parseWire(t){let n=[],r=!0,s,i,o,a=0,l=0,c=0,d=0,u=!1,f=0,m,p;for await(let _ of Je(t)){let h=ZL(_.time??_.created_at);if(r&&(r=!1,_.type==="metadata"&&_.protocol_version!==YL)){let y=_.protocol_version===zL?"Kimi experimental v2 transcript format not supported by this lmctl version.":`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),u||=_.usage!==void 0;let y=_.usage?.inputOther??0,E=_.usage?.inputCacheRead??0,b=_.usage?.inputCacheCreation??0,S=_.usage?.output??0;a+=y,l+=E,c+=b,d+=S,_.usageScope==="turn"&&(m=y+E+b,p={inputTokens:y,cachedInputTokens:E,cacheWriteInputTokens:b,outputTokens:S,totalTokens:m+S});continue}if(_.type==="turn.prompt"&&_.origin?.kind==="user"){let y=QL(_.input);y&&(i??=G(y,80),o=G(y,80),n.push({role:"user",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:fg(g.args),toolInputData:jt(g.args),toolCallId:g.toolCallId,model:s}):g.type==="tool.result"&&n.push({role:"tool_result",timestamp:h,content:eO(g.result),toolCallId:g.toolCallId,model:s})}return tO(n),{messages:n,messageCount:f,model:s,firstUserMessage:i,lastUserMessage:o,totalInputTokens:u?a:void 0,totalCachedInputTokens:u?l:void 0,totalCacheWriteInputTokens:u?c:void 0,totalOutputTokens:u?d:void 0,lastInputTokens:m,lastTokenUsage:p}}}});function kd(e){return new Sd(e)}var Sd,Id=w(()=>{"use strict";mg();Pt();$n();yt();Sd=class extends Ae{constructor(t){super({provider:new No(t),capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!0,canCancel:!0},injection:{leaderMode:"prompt-append",leaderSetupHint:"Kimi supports skills through ~/.kimi-code/skills and --skills-dir."},binary:"kimi",seedArgs:["-p",ge,"--output-format","stream-json"],resumeTemplate:"kimi --session {{session_id}} --auto",startTemplate:"kimi --auto",transport:(n,r)=>On(n,{...r,acpTool:"kimi"})})}seedArgsFor(t){let n=[];return t?.model&&n.push("--model",t.model),n.push("-p",t?.prompt??ge,"--output-format","stream-json"),n}}});import{spawn as rO}from"node:child_process";import{mkdirSync as sO}from"node:fs";function xd(e){return new Nd(e)}async function iO(e,t){let n=Date.now(),r=pg({prompt:e,sessionId:t.sessionId,model:t.model,effort:t.effort,formatJson:!0,permissionMode:t.permissionMode??"yolo"});wt("lmplayer",r,t.permissionMode??"yolo");let s=await _g(t.binary,r,{cwd:t.cwd,env:Ye(t.env,t.cwd,t.sessionId),signal:t.signal,onText:i=>{t.onProgress?.({kind:"text",summary:i.slice(0,120)}),t.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??t.sessionId,durationMs:Date.now()-n}}function pg(e){let t=["run"];return e.model&&t.push("--model",e.model),e.sessionId&&t.push("--session",e.sessionId),e.formatJson&&t.push("--format","json"),e.effort&&t.push("--effort",e.effort),t.push(...Rn("lmplayer",e.permissionMode)??[]),t.push("--",e.prompt),t}function _g(e,t,n){return new Promise((r,s)=>{let i;try{i=rO(e,t,{cwd:n.cwd,env:n.env,stdio:["ignore","pipe","pipe"]})}catch(h){s(h);return}let o="",a="",l="",c,d,u=[],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{u.push(h),n.onText?.(h);return}if(!Ao(y))return;let E=xo(y,!1);c===void 0&&E!==void 0&&(c=E),d=xo(y,!0)??d;let b=hg(y);b&&(u.push(b),n.onText?.(b))};i.stdout?.on("data",h=>{let g=h.toString("utf8");o+=g,l+=g;let y=l.indexOf(`
|
|
1691
|
+
`);for(;y>=0;){let E=l.slice(0,y);l=l.slice(y+1),_(E),y=l.indexOf(`
|
|
1692
1692
|
`)}}),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??d,text:u.join("")}))}),i.on("error",h=>{f||(f=!0,p(),s(h))})})}function hg(e){for(let t of["text","content","delta","output","message"]){let n=e[t];if(typeof n=="string")return n}for(let t of["data","event","payload","part"]){let n=e[t];if(Ao(n)){let r=hg(n);if(r)return r}}}function xo(e,t){for(let r of["sessionID","sessionId","session_id"]){let s=e[r];if(typeof s=="string"&&s.length>0)return s}let n=e.session;if(typeof n=="string"&&n.length>0)return n;if(Ao(n)){let r=xo(n,t);if(r!==void 0)return r}if(t){let r=e.id;if(typeof r=="string"&&r.length>0)return r}for(let r of["data","event","payload","part"]){let s=e[r];if(Ao(s)){let i=xo(s,t);if(i!==void 0)return i}}}function Ao(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}var Nd,Ad=w(()=>{"use strict";yd();Pt();yt();Cr();Et();Nd=class extends Ae{constructor(t){super({provider:new Pr({providerName:"lmplayer",startCommand:"lmplayer",dbPath:t?.lmplayerDbPath}),capabilities:{canCreate:!0,canResumeInteractive:!1,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!1,canCancel:!0},injection:{leaderMode:"none"},binary:"lmplayer",seedArgs:["run","--format","json","--dangerously-skip-permissions",ge],resumeTemplate:"lmplayer run --session {{session_id}} --dangerously-skip-permissions",startTemplate:"lmplayer run --dangerously-skip-permissions",transport:iO})}seedArgsFor(t){return pg({prompt:t?.prompt??ge,model:t?.model,effort:t?.effort,formatJson:!0,permissionMode:"yolo"})}async seed(t,n){sO(t,{recursive:!0});let r=this.seedArgsFor(n);wt("lmplayer",r);try{let s=await _g(this.binary,r,{cwd:t,env:An(void 0,t),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(t){return{launchCommand:`cd ${t} && lmplayer run --format json --dangerously-skip-permissions "${ge}"`,postLaunchNote:"Copy the sessionID reported by lmplayer into this member's sessionid= field.",lsCommand:`lmctl ls --provider lmplayer --sessiondir ${t}`}}}});import{readdir as Ro,readFile as oO,rm as aO}from"node:fs/promises";import{basename as gg,join as Mn}from"node:path";function lO(){return{observed:!1,totalInputTokens:0,totalCachedInputTokens:0,totalOutputTokens:0,totalReasoningOutputTokens:0}}function Hs(e){let t=Number(e??0);return Number.isFinite(t)?Math.max(0,Math.round(t)):0}function cO(e,t){if(!t)return;e.observed=!0;let n=Hs(t.promptTokenCount),r=Hs(t.cachedContentTokenCount),s=Hs(t.candidatesTokenCount),i=Hs(t.thoughtsTokenCount);e.totalInputTokens+=n,e.totalCachedInputTokens+=r,e.totalOutputTokens+=s,e.totalReasoningOutputTokens+=i,e.lastInputTokens=n,e.lastTokenUsage={inputTokens:Math.max(n-r,0),cachedInputTokens:r,outputTokens:s,reasoningOutputTokens:i,totalTokens:Hs(t.totalTokenCount)||n+s}}function dO(e){return{totalInputTokens:e.observed?e.totalInputTokens:void 0,totalCachedInputTokens:e.observed?e.totalCachedInputTokens:void 0,totalOutputTokens:e.observed?e.totalOutputTokens:void 0,totalReasoningOutputTokens:e.observed?e.totalReasoningOutputTokens:void 0,lastInputTokens:e.lastInputTokens,lastTokenUsage:e.lastTokenUsage}}function yg(e){return e.type==="user"||e.message?.role==="user"}function Eg(e){return e.type==="assistant"||e.message?.role==="assistant"||e.message?.role==="model"}function wg(e){let t=e.message;return t?typeof t.content=="string"?t.content:Array.isArray(t.content)?t.content.filter(n=>n.type==="text").map(n=>n.text||"").join(`
|
|
1693
1693
|
`):Array.isArray(t.parts)?t.parts.filter(n=>!n.thought&&n.type!=="thinking").map(n=>n.text||"").join(`
|
|
1694
|
-
`):"":""}function Tg(e){return e.model||e.message?.model}function uO(e){let t=e.message?.content;return typeof t=="string"?t.length>0?1:0:bg(e).filter(n=>!n.thought&&n.type!=="thinking"&&typeof n.text=="string"&&n.text.length>0).length}function Xs(e,t=!1){if(e!==void 0){if(typeof e=="string")return e;try{return JSON.stringify(e,null,t?2:void 0)}catch{return String(e)}}}function fO(e){if(e!==null&&typeof e=="object"&&!Array.isArray(e)){let t=e;return Xs(t.output??t.error??e)}return Xs(e)}function bg(e){return Array.isArray(e.message?.content)?e.message.content:e.message?.parts??[]}function vg(e,t,n){let r=e.name||"tool";return{role:"tool_use",timestamp:t,content:r,toolName:r,toolInput:Xs(e.args,!0),toolInputData:jt(e.args),toolCallId:e.id,model:n}}var Lo,Sg=w(()=>{"use strict";on();Lo=class{name="qwen";baseDir;constructor(t){this.baseDir=t?.qwenDir||Mn(ke,".qwen")}async discoverSessions(){let t=Mn(this.baseDir,"projects"),n;try{n=await Ro(t)}catch{return[]}let r=[];for(let s of n){let i=Mn(t,s,"chats"),o;try{o=await Ro(i)}catch{continue}for(let a of o){if(!a.endsWith(".jsonl"))continue;let l=a.replace(/\.jsonl$/,""),c=Mn(i,a);try{let d=await this.extractSummary(c,l);d&&r.push(d)}catch{}}}return r}async extractSummary(t,n){let r=await Ve(t,30);if(r.length===0)return null;let s=await Ce(t),i="(unknown)",o,a,l,c,d=0;for(let u of r){if(u.cwd&&(i=u.cwd,u.version&&(a=u.version)),u.type==="system"&&u.cwd&&(i=u.cwd,u.version&&(a=u.version),u.model&&(o=u.model)),yg(u)){let f=wg(u).trim();f&&(l||(l=G(f,80)),c=G(f,80),d++)}if(Eg(u)){let f=Tg(u);f&&(o=f),d+=uO(u)}}return{provider:"qwen",sessionId:n,cwd:i,createdAt:s.createdAt,modifiedAt:s.modifiedAt,model:o,cliVersion:a,startCommand:"qwen",firstUserMessage:l,lastUserMessage:c,messageCount:d,filePath:t}}async loadSession(t){let n=await this.resolveSessionPath(t);if(!n)return null;let r=gg(n,".jsonl");return this.loadFromFile(n,r)}async loadFromFile(t,n){let r=await Ce(t),s="(unknown)",i,o,a,l,c,d,u=[],f=lO();for await(let m of Je(t)){if(cO(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=bg(m).filter(g=>g.functionResponse!==void 0);h.length===0&&m.toolCallResult?.callId&&u.push({role:"tool_result",timestamp:_,content:Xs(m.toolCallResult.resultDisplay??m.toolCallResult.error??m.toolCallResult.status)??"tool result",toolCallId:m.toolCallResult.callId});for(let g of h){let E=g.functionResponse,y=fO(E.response),b=Xs(m.toolCallResult?.resultDisplay);u.push({role:"tool_result",timestamp:_,content:b??y??m.toolCallResult?.status??"tool result",toolName:E.name,toolCallId:m.toolCallResult?.callId??E.id,...y!==void 0?{toolDetailedContent:y}:{}})}}else if(yg(m)){let h=wg(m);h.trim()&&(c||(c=G(h.trim(),80)),d=G(h.trim(),80)),u.push({role:"user",timestamp:_,content:h})}else if(Eg(m)){let h=Tg(m);if(h&&(i=h),Array.isArray(p.content))for(let g of p.content)g.type==="text"&&g.text?u.push({role:"assistant",timestamp:_,content:g.text,model:h}):g.type==="thinking"&&g.thinking?u.push({role:"thinking",timestamp:_,content:g.thinking}):g.functionCall&&u.push(vg(g.functionCall,_,h));else if(typeof p.content=="string")u.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 E=g.thinking||g.text;E&&u.push({role:"thinking",timestamp:_,content:E})}else g.functionCall?u.push(vg(g.functionCall,_,h)):g.text&&u.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:d,messageCount:u.filter(m=>m.role==="user"||m.role==="assistant").length,filePath:t,...dO(f),messages:u}}async resolveSessionPath(t){let n=Mn(this.baseDir,"projects");try{let r=await Ro(n),s=[];for(let i of r){let o=Mn(n,i,"chats",`${t}.jsonl`);try{return await oO(o,{flag:"r"}),o}catch{continue}}for(let i of r){let o=Mn(n,i,"chats"),a;try{a=await Ro(o)}catch{continue}for(let l of a){if(!l.endsWith(".jsonl"))continue;gg(l,".jsonl").startsWith(t)&&s.push(Mn(o,l))}}if(s.length===1)return s[0]}catch{}return null}async deleteSession(t){let n=await this.resolveSessionPath(t);if(!n)return!1;try{return await aO(n),!0}catch{return!1}}}});function Ld(){return new Rd}var Rd,Od=w(()=>{"use strict";Sg();Pt();$n();yt();Rd=class extends Ae{constructor(){super({provider:new Lo,capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!0,canCancel:!0},injection:{leaderMode:"prompt-append"},binary:"qwen",seedArgs:["-p",ge,"--approval-mode","yolo"],resumeTemplate:"qwen --resume {{session_id}}",startTemplate:"qwen",transport:wo})}seedArgsFor(t){let n=super.seedArgsFor(t);return t?.model?[...n,"--model",t.model]:n}}});import{readdir as kg,readFile as Ig,rm as Ng,stat as xg}from"node:fs/promises";import{basename as $d,join as Ft}from"node:path";import{fileURLToPath as mO}from"node:url";async function pO(e){let t=await Promise.all(e.map(n=>Ce(n)));return{createdAt:new Date(Math.min(...t.map(n=>n.createdAt.getTime()))),modifiedAt:new Date(Math.max(...t.map(n=>n.modifiedAt.getTime())))}}function _O(e,t){if(!e)return t;let n=new Date(e);return Number.isNaN(n.getTime())?t:n}function Ag(e){return e.type==="USER_INPUT"}function Rg(e){return e.source==="MODEL"&&e.type==="PLANNER_RESPONSE"}function hO(e){return e.source==="MODEL"&&e.type!=="PLANNER_RESPONSE"}function Lg(e){if(!e)return"";let t=/<USER_REQUEST>\n?([\s\S]*?)\n?<\/USER_REQUEST>/.exec(e);return t?t[1]:e}function Og(e){if(!e)return;let t=/Model Selection` from [^\n]+? to ([^\n]+)/.exec(e);if(t)return t[1].replace(/\. No need\b[\s\S]*$/,"").replace(/\. If reporting\b[\s\S]*$/,"").replace(/\.\s*$/,"").trim()}function gO(e){if(e===void 0)return"";try{return JSON.stringify(e)}catch{return String(e)}}async function yO(e){for await(let t of Je(e)){let n=t.tool_calls?.map(s=>s.args)??[];for(let s of n){let i=EO(s);if(i)return i}let r=wO(t.content);if(r)return r}return null}function EO(e){if(!e||typeof e!="object"||Array.isArray(e))return null;let t=e,n=t.Cwd??t.cwd??t.DirectoryPath;return typeof n!="string"?null:n.replace(/^"|"$/g,"")}function wO(e){return e?/"Cwd":"([^"]+)"/.exec(e)?.[1]??null:null}function TO(e,t){if(e.status!=="RUNNING"||!e.content)return;let n=/task id:\s*([^/\s]+)\/(task-(\d+))\b/.exec(e.content);if(!(!n||n[1]!==t)&&!(e.step_index===void 0||Number(n[3])!==e.step_index))return n[2]}function vO(e,t){let n=new Set;for(let r of t){let s=bO(e,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 bO(e,t,n){let r=n.message.backgroundTaskId===void 0?void 0:NO(n.event.content);if(r!==void 0)return $g(e.filter(i=>!t.has(i)&&xO(i)===r),n.event.step_index);let s=IO(n.event);if(s!==void 0)return $g(e.filter(i=>!t.has(i)&&SO(i.name,n.event.type)&&Mg(kO(i))===s),n.event.step_index)}function $g(e,t){if(e.length===0)return;if(e.length===1)return e[0];if(t===void 0)return;let n=e.map(r=>({call:r,distance:r.stepIndex===void 0?Number.POSITIVE_INFINITY:Math.abs(t-r.stepIndex)})).sort((r,s)=>r.distance-s.distance);return n[0].distance<n[1].distance?n[0].call:void 0}function SO(e,t){return t==="VIEW_FILE"?e==="view_file":t!=="CODE_ACTION"?!1:e==="write_to_file"||e==="replace_file_content"||e==="multi_replace_file_content"}function kO(e){let t=e.name==="view_file"?e.input?.AbsolutePath:e.input?.TargetFile;return typeof t=="string"?t:void 0}function IO(e){if(!e.content)return;let t;return e.type==="VIEW_FILE"?t=/File Path:\s*`?([^`\n]+)`?/.exec(e.content)?.[1]:e.type==="CODE_ACTION"&&(t=/Created file\s+(.+?)\s+with requested content/.exec(e.content)?.[1]??/changes were made by .*? tool to:\s*(.+?)\.\s*(?:If relevant|$)/s.exec(e.content)?.[1]),Mg(t)}function Mg(e){if(!e)return;let t=e.trim().replace(/^`|`$/g,"");if(!t.startsWith("file://"))return t;try{return mO(t)}catch{return}}function NO(e){if(e)return/Task Description:\s*([^\n]+)/.exec(e)?.[1]?.trim()}function xO(e){if(e.name==="run_command"){let t=e.input?.CommandLine;return typeof t=="string"?t:void 0}if(e.name==="schedule"){let t=e.input?.DurationSeconds,n=e.input?.Prompt;return typeof t!="string"&&typeof t!="number"||typeof n!="string"?void 0:`Timer: ${t}s, Prompt: ${n}`}}function Cg(e){if(e.endsWith(".db"))return $d(e,".db");let t="/brain/",n=e.indexOf(t);return n===-1?null:e.slice(n+t.length).split("/")[0]||null}var Oo,Dg=w(()=>{"use strict";on();Oo=class{name="agy";baseDir;constructor(t={}){this.baseDir=t.agyDir||Ft(ke,".gemini","antigravity-cli")}getWatchPaths(){return[{directory:Ft(this.baseDir,"conversations"),filePattern:/\.db$/}]}async discoverSessions(){let t=Ft(this.baseDir,"conversations"),n;try{n=await kg(t)}catch{return[]}let r=[];for(let s of n){if(!s.endsWith(".db"))continue;let i=$d(s,".db");try{let o=await this.extractSummary(i);o&&r.push(o)}catch{}}return r}conversationPath(t){return Ft(this.baseDir,"conversations",`${t}.db`)}transcriptPath(t,n){return Ft(this.baseDir,"brain",t,".system_generated","logs",n?"transcript_full.jsonl":"transcript.jsonl")}async existingTranscriptPath(t){for(let n of[this.transcriptPath(t,!0),this.transcriptPath(t,!1)])try{return await xg(n),n}catch{}return null}async extractSummary(t){let n=this.conversationPath(t),r=await this.existingTranscriptPath(t),s=r??n,i=await pO([n,r].filter(Boolean)),o=await this.resolveCwd(t,r),a,l,c,d=0;if(r){let u=await Ve(r,80);for(let f of u){let m=Og(f.content);if(m&&(a=m),Ag(f)){let p=Lg(f.content).trim();p&&(l||(l=G(p,80)),c=G(p,80)),d++}else Rg(f)&&f.content&&d++}}return{provider:"agy",sessionId:t,cwd:o,createdAt:i.createdAt,modifiedAt:i.modifiedAt,model:a,startCommand:"agy",firstUserMessage:l,lastUserMessage:c,messageCount:d,filePath:s,filePaths:r?[n,r]:[n]}}async loadSession(t){let n=await this.resolveSessionPath(t);if(!n)return null;let r=Cg(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,d=[],u=[];if(i)for await(let f of Je(i)){let m=_O(f.created_at,s.modifiedAt),p=Og(f.content);if(p&&(a=p),Ag(f)){let _=Lg(f.content),h=_.trim();h&&(l||(l=G(h,80)),c=G(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=gO(_.args),E=jt(_.args),y={role:"tool_use",timestamp:m,content:g,toolName:h,toolInput:g,toolInputData:E};o.push(y),d.push({name:h,stepIndex:f.step_index,input:E,message:y})}if(Rg(f)&&f.content)o.push({role:"assistant",timestamp:m,content:f.content,model:a});else if(hO(f)&&f.content){let _=TO(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),u.push({event:f,message:g})}f.thinking&&o.push({role:"thinking",timestamp:m,content:f.thinking})}return vO(d,u),{...s,model:a,firstUserMessage:l,lastUserMessage:c,messageCount:o.filter(f=>f.role==="user"||f.role==="assistant").length,messages:o}}async resolveSessionPath(t){let n=this.conversationPath(t);try{return await xg(n),n}catch{}let r=Ft(this.baseDir,"conversations");try{let s=[];for(let i of await kg(r)){if(!i.endsWith(".db"))continue;$d(i,".db").startsWith(t)&&s.push(Ft(r,i))}if(s.length===1)return s[0]}catch{}return null}async deleteSession(t){let n=await this.resolveSessionPath(t);if(!n)return!1;let r=Cg(n);return r?(await Ng(this.conversationPath(r),{force:!0}),await Ng(Ft(this.baseDir,"brain",r),{recursive:!0,force:!0}),!0):!1}async resolveCwd(t,n){let r=await this.cwdFromLastConversationCache(t);if(r)return r;if(n){let s=await yO(n);if(s)return s}return"(unknown)"}async cwdFromLastConversationCache(t){let n=Ft(this.baseDir,"cache","last_conversations.json");try{let r=JSON.parse(await Ig(n,"utf8"));for(let[s,i]of Object.entries(r))if(i===t)return s}catch{}return null}async readTaskLog(t,n){if(!/^task-\d+$/.test(n))return null;let r=Ft(this.baseDir,"brain",t,".system_generated","tasks",`${n}.log`);try{let[s,i]=await Promise.all([Ig(r,"utf8"),Ce(r)]);return{content:s,modifiedAt:i.modifiedAt}}catch{return null}}}});import{spawn as AO}from"node:child_process";function Md(e){return new Cd(e)}async function RO(e,t){let n=Date.now(),r=["--conversation",t.sessionId,"-p",e,"--dangerously-skip-permissions","--print-timeout",OO(t.timeoutMs)];t.model&&r.push("--model",t.model),wt("agy",r,t.permissionMode??"yolo"),t.onProgress?.({kind:"system",summary:"agy -p one-shot started (no streaming events)"});let{stdout:s}=await LO(t.binary,r,{cwd:t.cwd,env:Ye(t.env,t.cwd,t.sessionId),signal:t.signal});return t.onProgress?.({kind:"system",summary:"agy -p one-shot completed"}),{text:s.trimEnd(),sessionId:t.sessionId,durationMs:Date.now()-n}}function LO(e,t,n){return new Promise((r,s)=>{let i;try{i=AO(e,t,{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,d)=>{if(n.signal?.removeEventListener("abort",l),c===0){r({stdout:o,stderr:a});return}let u=d?`signal ${d}`:`exit code ${c}`,f=a.trim()||o.trim();s(new Error(`agy failed (${u})${f?`: ${f}`:""}`))})})}function OO(e){return!e||e<=0?"8h":`${Math.max(1,Math.ceil(e/1e3))}s`}var Cd,Dd=w(()=>{"use strict";Dg();Pt();yt();Et();Cr();Cd=class extends Ae{constructor(t){super({provider:new Oo(t),capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!1,canCancel:!1},injection:{leaderMode:"prompt-append",leaderSetupHint:"Antigravity uses one-shot print turns; no streaming events are available."},binary:"agy",seedArgs:["-p",ge,"--dangerously-skip-permissions","--print-timeout","2m"],resumeTemplate:"agy --conversation {{session_id}} --dangerously-skip-permissions",startTemplate:"agy --dangerously-skip-permissions",transport:RO})}seedArgsFor(t){let n=[...super.seedArgsFor(t)];return t?.model&&n.push("--model",t.model),n}manualSeedHint(t){return{launchCommand:`cd ${t} && agy --dangerously-skip-permissions`,postLaunchNote:"Send the lmctl seed instruction, wait for the conversation to write, then exit.",lsCommand:`lmctl ls --provider agy --sessiondir ${t}`}}}});import{createHash as $O}from"node:crypto";import{existsSync as CO,mkdirSync as Pd,readFileSync as MO,renameSync as DO,rmdirSync as Hg,statSync as jO,writeFileSync as PO}from"node:fs";import{dirname as qd,join as jg,resolve as jd}from"node:path";function FO(e){return $O("sha256").update(e).digest("hex").slice(0,8)}function UO(e){let t=e.trim().toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"");return t.length>0?t:"session"}function WO(e,t){let n=t?.prompt??"",r=/\bYou are alias\s+([A-Za-z][A-Za-z0-9_-]*)\b/.exec(n);return r!==null?r[1]:e.split(/[\\/]/).filter(Boolean).pop()??"session"}function Xg(e){return e.split(/\r?\n/,1)[0]?.trim()||"(empty prompt)"}function $o(e){return Math.max(1,Math.ceil(e.length/4))}function Ur(e=process.cwd()){let t=process.env.LMCTL_CLAUDE_MOCK_STORE;if(t!==void 0&&t.trim().length>0)return jd(t);let n=process.env.LMCTL_DB;return n!==void 0&&n.trim().length>0?jg(qd(jd(n)),".lmctl-claude-mock","sessions.json"):jg(jd(e),".lmctl-claude-mock","sessions.json")}function Pg(){return{schemaVersion:1,sessions:{}}}function Js(e){if(!CO(e))return Pg();try{let t=JSON.parse(MO(e,"utf8")),n=typeof t.sessions=="object"&&t.sessions!==null?t.sessions:{},r=typeof t.script=="object"&&t.script!==null?t.script:void 0,s=typeof t.scriptContains=="object"&&t.scriptContains!==null?t.scriptContains:void 0,i=Fd(t.defaultDelayMs);return{schemaVersion:1,sessions:n,...i!==void 0?{defaultDelayMs:i}:{},...r!==void 0?{script:r}:{},...s!==void 0?{scriptContains:s}:{}}}catch{return Pg()}}function Jg(e,t){Pd(qd(e),{recursive:!0});let n=`${e}.${process.pid}.${Date.now()}.tmp`;PO(n,`${JSON.stringify(t,null,2)}
|
|
1694
|
+
`):"":""}function Tg(e){return e.model||e.message?.model}function uO(e){let t=e.message?.content;return typeof t=="string"?t.length>0?1:0:bg(e).filter(n=>!n.thought&&n.type!=="thinking"&&typeof n.text=="string"&&n.text.length>0).length}function Xs(e,t=!1){if(e!==void 0){if(typeof e=="string")return e;try{return JSON.stringify(e,null,t?2:void 0)}catch{return String(e)}}}function fO(e){if(e!==null&&typeof e=="object"&&!Array.isArray(e)){let t=e;return Xs(t.output??t.error??e)}return Xs(e)}function bg(e){return Array.isArray(e.message?.content)?e.message.content:e.message?.parts??[]}function vg(e,t,n){let r=e.name||"tool";return{role:"tool_use",timestamp:t,content:r,toolName:r,toolInput:Xs(e.args,!0),toolInputData:jt(e.args),toolCallId:e.id,model:n}}var Lo,Sg=w(()=>{"use strict";on();Lo=class{name="qwen";baseDir;constructor(t){this.baseDir=t?.qwenDir||Mn(ke,".qwen")}async discoverSessions(){let t=Mn(this.baseDir,"projects"),n;try{n=await Ro(t)}catch{return[]}let r=[];for(let s of n){let i=Mn(t,s,"chats"),o;try{o=await Ro(i)}catch{continue}for(let a of o){if(!a.endsWith(".jsonl"))continue;let l=a.replace(/\.jsonl$/,""),c=Mn(i,a);try{let d=await this.extractSummary(c,l);d&&r.push(d)}catch{}}}return r}async extractSummary(t,n){let r=await Ve(t,30);if(r.length===0)return null;let s=await Ce(t),i="(unknown)",o,a,l,c,d=0;for(let u of r){if(u.cwd&&(i=u.cwd,u.version&&(a=u.version)),u.type==="system"&&u.cwd&&(i=u.cwd,u.version&&(a=u.version),u.model&&(o=u.model)),yg(u)){let f=wg(u).trim();f&&(l||(l=G(f,80)),c=G(f,80),d++)}if(Eg(u)){let f=Tg(u);f&&(o=f),d+=uO(u)}}return{provider:"qwen",sessionId:n,cwd:i,createdAt:s.createdAt,modifiedAt:s.modifiedAt,model:o,cliVersion:a,startCommand:"qwen",firstUserMessage:l,lastUserMessage:c,messageCount:d,filePath:t}}async loadSession(t){let n=await this.resolveSessionPath(t);if(!n)return null;let r=gg(n,".jsonl");return this.loadFromFile(n,r)}async loadFromFile(t,n){let r=await Ce(t),s="(unknown)",i,o,a,l,c,d,u=[],f=lO();for await(let m of Je(t)){if(cO(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=bg(m).filter(g=>g.functionResponse!==void 0);h.length===0&&m.toolCallResult?.callId&&u.push({role:"tool_result",timestamp:_,content:Xs(m.toolCallResult.resultDisplay??m.toolCallResult.error??m.toolCallResult.status)??"tool result",toolCallId:m.toolCallResult.callId});for(let g of h){let y=g.functionResponse,E=fO(y.response),b=Xs(m.toolCallResult?.resultDisplay);u.push({role:"tool_result",timestamp:_,content:b??E??m.toolCallResult?.status??"tool result",toolName:y.name,toolCallId:m.toolCallResult?.callId??y.id,...E!==void 0?{toolDetailedContent:E}:{}})}}else if(yg(m)){let h=wg(m);h.trim()&&(c||(c=G(h.trim(),80)),d=G(h.trim(),80)),u.push({role:"user",timestamp:_,content:h})}else if(Eg(m)){let h=Tg(m);if(h&&(i=h),Array.isArray(p.content))for(let g of p.content)g.type==="text"&&g.text?u.push({role:"assistant",timestamp:_,content:g.text,model:h}):g.type==="thinking"&&g.thinking?u.push({role:"thinking",timestamp:_,content:g.thinking}):g.functionCall&&u.push(vg(g.functionCall,_,h));else if(typeof p.content=="string")u.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&&u.push({role:"thinking",timestamp:_,content:y})}else g.functionCall?u.push(vg(g.functionCall,_,h)):g.text&&u.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:d,messageCount:u.filter(m=>m.role==="user"||m.role==="assistant").length,filePath:t,...dO(f),messages:u}}async resolveSessionPath(t){let n=Mn(this.baseDir,"projects");try{let r=await Ro(n),s=[];for(let i of r){let o=Mn(n,i,"chats",`${t}.jsonl`);try{return await oO(o,{flag:"r"}),o}catch{continue}}for(let i of r){let o=Mn(n,i,"chats"),a;try{a=await Ro(o)}catch{continue}for(let l of a){if(!l.endsWith(".jsonl"))continue;gg(l,".jsonl").startsWith(t)&&s.push(Mn(o,l))}}if(s.length===1)return s[0]}catch{}return null}async deleteSession(t){let n=await this.resolveSessionPath(t);if(!n)return!1;try{return await aO(n),!0}catch{return!1}}}});function Ld(){return new Rd}var Rd,Od=w(()=>{"use strict";Sg();Pt();$n();yt();Rd=class extends Ae{constructor(){super({provider:new Lo,capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!0,canCancel:!0},injection:{leaderMode:"prompt-append"},binary:"qwen",seedArgs:["-p",ge,"--approval-mode","yolo"],resumeTemplate:"qwen --resume {{session_id}}",startTemplate:"qwen",transport:wo})}seedArgsFor(t){let n=super.seedArgsFor(t);return t?.model?[...n,"--model",t.model]:n}}});import{readdir as kg,readFile as Ig,rm as Ng,stat as xg}from"node:fs/promises";import{basename as $d,join as Ft}from"node:path";import{fileURLToPath as mO}from"node:url";async function pO(e){let t=await Promise.all(e.map(n=>Ce(n)));return{createdAt:new Date(Math.min(...t.map(n=>n.createdAt.getTime()))),modifiedAt:new Date(Math.max(...t.map(n=>n.modifiedAt.getTime())))}}function _O(e,t){if(!e)return t;let n=new Date(e);return Number.isNaN(n.getTime())?t:n}function Ag(e){return e.type==="USER_INPUT"}function Rg(e){return e.source==="MODEL"&&e.type==="PLANNER_RESPONSE"}function hO(e){return e.source==="MODEL"&&e.type!=="PLANNER_RESPONSE"}function Lg(e){if(!e)return"";let t=/<USER_REQUEST>\n?([\s\S]*?)\n?<\/USER_REQUEST>/.exec(e);return t?t[1]:e}function Og(e){if(!e)return;let t=/Model Selection` from [^\n]+? to ([^\n]+)/.exec(e);if(t)return t[1].replace(/\. No need\b[\s\S]*$/,"").replace(/\. If reporting\b[\s\S]*$/,"").replace(/\.\s*$/,"").trim()}function gO(e){if(e===void 0)return"";try{return JSON.stringify(e)}catch{return String(e)}}async function yO(e){for await(let t of Je(e)){let n=t.tool_calls?.map(s=>s.args)??[];for(let s of n){let i=EO(s);if(i)return i}let r=wO(t.content);if(r)return r}return null}function EO(e){if(!e||typeof e!="object"||Array.isArray(e))return null;let t=e,n=t.Cwd??t.cwd??t.DirectoryPath;return typeof n!="string"?null:n.replace(/^"|"$/g,"")}function wO(e){return e?/"Cwd":"([^"]+)"/.exec(e)?.[1]??null:null}function TO(e,t){if(e.status!=="RUNNING"||!e.content)return;let n=/task id:\s*([^/\s]+)\/(task-(\d+))\b/.exec(e.content);if(!(!n||n[1]!==t)&&!(e.step_index===void 0||Number(n[3])!==e.step_index))return n[2]}function vO(e,t){let n=new Set;for(let r of t){let s=bO(e,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 bO(e,t,n){let r=n.message.backgroundTaskId===void 0?void 0:NO(n.event.content);if(r!==void 0)return $g(e.filter(i=>!t.has(i)&&xO(i)===r),n.event.step_index);let s=IO(n.event);if(s!==void 0)return $g(e.filter(i=>!t.has(i)&&SO(i.name,n.event.type)&&Mg(kO(i))===s),n.event.step_index)}function $g(e,t){if(e.length===0)return;if(e.length===1)return e[0];if(t===void 0)return;let n=e.map(r=>({call:r,distance:r.stepIndex===void 0?Number.POSITIVE_INFINITY:Math.abs(t-r.stepIndex)})).sort((r,s)=>r.distance-s.distance);return n[0].distance<n[1].distance?n[0].call:void 0}function SO(e,t){return t==="VIEW_FILE"?e==="view_file":t!=="CODE_ACTION"?!1:e==="write_to_file"||e==="replace_file_content"||e==="multi_replace_file_content"}function kO(e){let t=e.name==="view_file"?e.input?.AbsolutePath:e.input?.TargetFile;return typeof t=="string"?t:void 0}function IO(e){if(!e.content)return;let t;return e.type==="VIEW_FILE"?t=/File Path:\s*`?([^`\n]+)`?/.exec(e.content)?.[1]:e.type==="CODE_ACTION"&&(t=/Created file\s+(.+?)\s+with requested content/.exec(e.content)?.[1]??/changes were made by .*? tool to:\s*(.+?)\.\s*(?:If relevant|$)/s.exec(e.content)?.[1]),Mg(t)}function Mg(e){if(!e)return;let t=e.trim().replace(/^`|`$/g,"");if(!t.startsWith("file://"))return t;try{return mO(t)}catch{return}}function NO(e){if(e)return/Task Description:\s*([^\n]+)/.exec(e)?.[1]?.trim()}function xO(e){if(e.name==="run_command"){let t=e.input?.CommandLine;return typeof t=="string"?t:void 0}if(e.name==="schedule"){let t=e.input?.DurationSeconds,n=e.input?.Prompt;return typeof t!="string"&&typeof t!="number"||typeof n!="string"?void 0:`Timer: ${t}s, Prompt: ${n}`}}function Cg(e){if(e.endsWith(".db"))return $d(e,".db");let t="/brain/",n=e.indexOf(t);return n===-1?null:e.slice(n+t.length).split("/")[0]||null}var Oo,Dg=w(()=>{"use strict";on();Oo=class{name="agy";baseDir;constructor(t={}){this.baseDir=t.agyDir||Ft(ke,".gemini","antigravity-cli")}getWatchPaths(){return[{directory:Ft(this.baseDir,"conversations"),filePattern:/\.db$/}]}async discoverSessions(){let t=Ft(this.baseDir,"conversations"),n;try{n=await kg(t)}catch{return[]}let r=[];for(let s of n){if(!s.endsWith(".db"))continue;let i=$d(s,".db");try{let o=await this.extractSummary(i);o&&r.push(o)}catch{}}return r}conversationPath(t){return Ft(this.baseDir,"conversations",`${t}.db`)}transcriptPath(t,n){return Ft(this.baseDir,"brain",t,".system_generated","logs",n?"transcript_full.jsonl":"transcript.jsonl")}async existingTranscriptPath(t){for(let n of[this.transcriptPath(t,!0),this.transcriptPath(t,!1)])try{return await xg(n),n}catch{}return null}async extractSummary(t){let n=this.conversationPath(t),r=await this.existingTranscriptPath(t),s=r??n,i=await pO([n,r].filter(Boolean)),o=await this.resolveCwd(t,r),a,l,c,d=0;if(r){let u=await Ve(r,80);for(let f of u){let m=Og(f.content);if(m&&(a=m),Ag(f)){let p=Lg(f.content).trim();p&&(l||(l=G(p,80)),c=G(p,80)),d++}else Rg(f)&&f.content&&d++}}return{provider:"agy",sessionId:t,cwd:o,createdAt:i.createdAt,modifiedAt:i.modifiedAt,model:a,startCommand:"agy",firstUserMessage:l,lastUserMessage:c,messageCount:d,filePath:s,filePaths:r?[n,r]:[n]}}async loadSession(t){let n=await this.resolveSessionPath(t);if(!n)return null;let r=Cg(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,d=[],u=[];if(i)for await(let f of Je(i)){let m=_O(f.created_at,s.modifiedAt),p=Og(f.content);if(p&&(a=p),Ag(f)){let _=Lg(f.content),h=_.trim();h&&(l||(l=G(h,80)),c=G(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=gO(_.args),y=jt(_.args),E={role:"tool_use",timestamp:m,content:g,toolName:h,toolInput:g,toolInputData:y};o.push(E),d.push({name:h,stepIndex:f.step_index,input:y,message:E})}if(Rg(f)&&f.content)o.push({role:"assistant",timestamp:m,content:f.content,model:a});else if(hO(f)&&f.content){let _=TO(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),u.push({event:f,message:g})}f.thinking&&o.push({role:"thinking",timestamp:m,content:f.thinking})}return vO(d,u),{...s,model:a,firstUserMessage:l,lastUserMessage:c,messageCount:o.filter(f=>f.role==="user"||f.role==="assistant").length,messages:o}}async resolveSessionPath(t){let n=this.conversationPath(t);try{return await xg(n),n}catch{}let r=Ft(this.baseDir,"conversations");try{let s=[];for(let i of await kg(r)){if(!i.endsWith(".db"))continue;$d(i,".db").startsWith(t)&&s.push(Ft(r,i))}if(s.length===1)return s[0]}catch{}return null}async deleteSession(t){let n=await this.resolveSessionPath(t);if(!n)return!1;let r=Cg(n);return r?(await Ng(this.conversationPath(r),{force:!0}),await Ng(Ft(this.baseDir,"brain",r),{recursive:!0,force:!0}),!0):!1}async resolveCwd(t,n){let r=await this.cwdFromLastConversationCache(t);if(r)return r;if(n){let s=await yO(n);if(s)return s}return"(unknown)"}async cwdFromLastConversationCache(t){let n=Ft(this.baseDir,"cache","last_conversations.json");try{let r=JSON.parse(await Ig(n,"utf8"));for(let[s,i]of Object.entries(r))if(i===t)return s}catch{}return null}async readTaskLog(t,n){if(!/^task-\d+$/.test(n))return null;let r=Ft(this.baseDir,"brain",t,".system_generated","tasks",`${n}.log`);try{let[s,i]=await Promise.all([Ig(r,"utf8"),Ce(r)]);return{content:s,modifiedAt:i.modifiedAt}}catch{return null}}}});import{spawn as AO}from"node:child_process";function Md(e){return new Cd(e)}async function RO(e,t){let n=Date.now(),r=["--conversation",t.sessionId,"-p",e,"--dangerously-skip-permissions","--print-timeout",OO(t.timeoutMs)];t.model&&r.push("--model",t.model),wt("agy",r,t.permissionMode??"yolo"),t.onProgress?.({kind:"system",summary:"agy -p one-shot started (no streaming events)"});let{stdout:s}=await LO(t.binary,r,{cwd:t.cwd,env:Ye(t.env,t.cwd,t.sessionId),signal:t.signal});return t.onProgress?.({kind:"system",summary:"agy -p one-shot completed"}),{text:s.trimEnd(),sessionId:t.sessionId,durationMs:Date.now()-n}}function LO(e,t,n){return new Promise((r,s)=>{let i;try{i=AO(e,t,{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,d)=>{if(n.signal?.removeEventListener("abort",l),c===0){r({stdout:o,stderr:a});return}let u=d?`signal ${d}`:`exit code ${c}`,f=a.trim()||o.trim();s(new Error(`agy failed (${u})${f?`: ${f}`:""}`))})})}function OO(e){return!e||e<=0?"8h":`${Math.max(1,Math.ceil(e/1e3))}s`}var Cd,Dd=w(()=>{"use strict";Dg();Pt();yt();Et();Cr();Cd=class extends Ae{constructor(t){super({provider:new Oo(t),capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!1,canCancel:!1},injection:{leaderMode:"prompt-append",leaderSetupHint:"Antigravity uses one-shot print turns; no streaming events are available."},binary:"agy",seedArgs:["-p",ge,"--dangerously-skip-permissions","--print-timeout","2m"],resumeTemplate:"agy --conversation {{session_id}} --dangerously-skip-permissions",startTemplate:"agy --dangerously-skip-permissions",transport:RO})}seedArgsFor(t){let n=[...super.seedArgsFor(t)];return t?.model&&n.push("--model",t.model),n}manualSeedHint(t){return{launchCommand:`cd ${t} && agy --dangerously-skip-permissions`,postLaunchNote:"Send the lmctl seed instruction, wait for the conversation to write, then exit.",lsCommand:`lmctl ls --provider agy --sessiondir ${t}`}}}});import{createHash as $O}from"node:crypto";import{existsSync as CO,mkdirSync as Pd,readFileSync as MO,renameSync as DO,rmdirSync as Hg,statSync as jO,writeFileSync as PO}from"node:fs";import{dirname as qd,join as jg,resolve as jd}from"node:path";function FO(e){return $O("sha256").update(e).digest("hex").slice(0,8)}function UO(e){let t=e.trim().toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"");return t.length>0?t:"session"}function WO(e,t){let n=t?.prompt??"",r=/\bYou are alias\s+([A-Za-z][A-Za-z0-9_-]*)\b/.exec(n);return r!==null?r[1]:e.split(/[\\/]/).filter(Boolean).pop()??"session"}function Xg(e){return e.split(/\r?\n/,1)[0]?.trim()||"(empty prompt)"}function $o(e){return Math.max(1,Math.ceil(e.length/4))}function Ur(e=process.cwd()){let t=process.env.LMCTL_CLAUDE_MOCK_STORE;if(t!==void 0&&t.trim().length>0)return jd(t);let n=process.env.LMCTL_DB;return n!==void 0&&n.trim().length>0?jg(qd(jd(n)),".lmctl-claude-mock","sessions.json"):jg(jd(e),".lmctl-claude-mock","sessions.json")}function Pg(){return{schemaVersion:1,sessions:{}}}function Js(e){if(!CO(e))return Pg();try{let t=JSON.parse(MO(e,"utf8")),n=typeof t.sessions=="object"&&t.sessions!==null?t.sessions:{},r=typeof t.script=="object"&&t.script!==null?t.script:void 0,s=typeof t.scriptContains=="object"&&t.scriptContains!==null?t.scriptContains:void 0,i=Fd(t.defaultDelayMs);return{schemaVersion:1,sessions:n,...i!==void 0?{defaultDelayMs:i}:{},...r!==void 0?{script:r}:{},...s!==void 0?{scriptContains:s}:{}}}catch{return Pg()}}function Jg(e,t){Pd(qd(e),{recursive:!0});let n=`${e}.${process.pid}.${Date.now()}.tmp`;PO(n,`${JSON.stringify(t,null,2)}
|
|
1695
1695
|
`,"utf8"),DO(n,e)}function HO(e){Atomics.wait(new Int32Array(new SharedArrayBuffer(4)),0,0,e)}function XO(e){let t=`${e}.lock`;Pd(qd(e),{recursive:!0});let n=Date.now()+Fg;for(;;)try{return Pd(t),t}catch(r){if(r.code!=="EEXIST")throw r;try{if(Date.now()-jO(t).mtimeMs>qO){try{Hg(t)}catch{}continue}}catch{continue}if(Date.now()>=n)throw new Error(`ClaudeMock store lock timeout after ${Fg}ms: ${t}`);HO(BO)}}function JO(e){try{Hg(e)}catch{}}function Gg(e,t){let n=XO(e);try{return t()}finally{JO(n)}}function GO(e){return{...e,timestamp:e.timestamp.toISOString()}}function KO(e){return{...e,timestamp:new Date(e.timestamp)}}function VO(e){return{...e,createdAt:e.createdAt.toISOString(),modifiedAt:e.modifiedAt.toISOString(),messages:e.messages.map(GO)}}function Kg(e){return{...e,createdAt:new Date(e.createdAt),modifiedAt:new Date(e.modifiedAt),messages:e.messages.map(KO)}}function Co(e,t=process.cwd()){let n=Fr.get(e);if(n!==void 0)return n;let s=Js(Ur(t)).sessions[e];if(s===void 0)return;let i=Kg(s);return Fr.set(i.sessionId,i),i}function Ug(e){Fr.set(e.sessionId,e);let t=Ur(e.cwd);Gg(t,()=>{let n=Js(t);n.sessions[e.sessionId]=VO({...e,filePath:t}),Jg(t,n)})}function YO(e,t=process.cwd()){let n=Ur(t);return Gg(n,()=>{let r=Js(n),s=r.sessions[e]!==void 0;return s&&(delete r.sessions[e],Jg(n,r)),s})}function zO(){let e=Js(Ur()),t=Object.values(e.sessions).map(Kg);for(let n of t)Fr.set(n.sessionId,n);return t}function Fd(e){return typeof e=="number"&&Number.isFinite(e)&&e>=0?e:void 0}function Wg(e){if(typeof e=="string")return{kind:"success",text:e};if(e!==void 0&&typeof e.text=="string"&&typeof e.error!="string"){let t=Fd(e.delayMs);return{kind:"success",text:e.text,...t!==void 0?{delayMs:t}:{}}}if(e!==void 0&&typeof e.error=="string"&&typeof e.text!="string"){let t=Fd(e.delayMs);return{kind:"error",error:e.error,...t!==void 0?{delayMs:t}:{}}}}async function qg(e){e!==void 0&&e>0&&await new Promise(t=>setTimeout(t,e))}function ZO(e,t){let{script:n,scriptContains:r}=t;if(n!==void 0){let s=Wg(n[e]??n[Xg(e)]);if(s!==void 0)return s}if(r!==void 0){for(let s of Object.keys(r))if(e.includes(s)){let i=Wg(r[s]);if(i!==void 0)return i}}}function Bg(e){return{provider:"ClaudeMock",sessionId:e.sessionId,cwd:e.cwd,createdAt:e.createdAt,modifiedAt:e.modifiedAt,messageCount:e.messages.length,filePath:e.filePath,cliVersion:"ClaudeMock/0",model:"claude-mock",totalInputTokens:e.totalInputTokens,totalOutputTokens:e.totalOutputTokens,lastTokenUsage:{totalTokens:e.totalInputTokens+e.totalOutputTokens}}}function Bd(){return new Wd}var Fr,qO,BO,Fg,Ud,Wd,Hd=w(()=>{"use strict";Fr=new Map;qO=5e3,BO=15,Fg=1e4;Ud=class{name="ClaudeMock";async discoverSessions(){let t=new Map;for(let n of zO())t.set(n.sessionId,n);for(let n of Fr.values())t.set(n.sessionId,n);return[...t.values()].map(Bg)}async loadSession(t){let n=Co(t);return n===void 0?null:{...Bg(n),messages:n.messages.slice()}}async resolveSessionPath(t){return Co(t)?.filePath??null}async deleteSession(t){let n=Fr.delete(t),r=YO(t);return n||r}},Wd=class{name="ClaudeMock";capabilities={canCreate:!0,canResumeInteractive:!1,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!1,canCancel:!1};injection={leaderMode:"none"};provider=new Ud;discover(){return this.provider.discoverSessions()}load(t){return this.provider.loadSession(t)}resolvePath(t){return this.provider.resolveSessionPath(t)}delete(t){return this.provider.deleteSession(t)}getWatchPaths(){return[]}async seed(t,n){let r=UO(WO(t,n)),s=`mock-${r}-${FO(`${t}:${r}`)}`,i=new Date,o=Ur(t),a=Co(s,t),l=n?.prompt??"ClaudeMock seed",c=$o(l),d={sessionId:s,cwd:t,filePath:o,createdAt:a?.createdAt??i,modifiedAt:i,messages:a?.messages.slice()??[],totalInputTokens:a?.totalInputTokens??0,totalOutputTokens:a?.totalOutputTokens??0};return d.messages.push({role:"user",timestamp:i,content:l}),d.messages.push({role:"assistant",timestamp:i,content:"ACK: ClaudeMock seeded"}),d.totalInputTokens+=c,d.totalOutputTokens+=$o("ACK: ClaudeMock seeded"),Ug(d),{success:!0,sessionId:s}}resumeCommand(t){return`ClaudeMock --resume ${t}`}startCommand(){return"ClaudeMock"}manualSeedHint(t){return{launchCommand:`cd ${t} && ClaudeMock`,postLaunchNote:"ClaudeMock is a hermetic test provider; no manual seed is required.",lsCommand:`lmctl ls --provider ClaudeMock --sessiondir ${t}`}}forkHint(t){return"ClaudeMock does not support fork."}async fork(t,n){return{success:!1,error:"ClaudeMock does not support fork."}}async sendTurn(t,n){let r=Date.now(),s=Co(n.sessionId,n.cwd);if(s===void 0)throw new Error(`ClaudeMock session not found: ${n.sessionId}`);let i=new Date,o=Js(Ur(n.cwd)),a=ZO(t,o),l=a?.delayMs??o.defaultDelayMs;if(a?.kind==="error")throw await qg(l),new Error(a.error);let c=a?.kind==="success"?a.text:`ClaudeMock ack: ${Xg(t)}`;return s.messages.push({role:"user",timestamp:i,content:t}),s.messages.push({role:"assistant",timestamp:i,content:c,model:n.model??"claude-mock"}),s.modifiedAt=i,s.totalInputTokens+=$o(t),s.totalOutputTokens+=$o(c),Ug(s),n.onProgress?.({kind:"text",summary:"ClaudeMock deterministic reply"}),await qg(l),{text:c,sessionId:n.sessionId,durationMs:Math.max(1,Date.now()-r),stopReason:"mock_stop",numTurns:1,status:"ok"}}}});function Ut(e){let t=[rd({claudeDir:e?.claudeDir}),od({codexDir:e?.codexDir,codeDir:e?.codeDir}),ud({geminiDir:e?.geminiDir,claudeDir:e?.claudeDir,codexDir:e?.codexDir,codeDir:e?.codeDir}),_d({copilotDir:e?.copilotDir}),wd(),kd({kimiHome:e?.kimiHome}),xd({lmplayerDbPath:e?.lmplayerDbPath}),Ld(),Md({agyDir:e?.agyDir})];return process.env.LMCTL_ENABLE_MOCK_PROVIDER==="1"&&t.push(Bd()),t}var Xd=w(()=>{"use strict";sd();ad();fd();hd();Td();Id();Ad();Od();Dd();Hd();sd();ad();fd();hd();Td();Id();Ad();Od();Dd();Hd()});var Kd={};me(Kd,{ProviderRegistry:()=>Ms,TransportConnectionError:()=>Ie,TransportError:()=>ut,TransportJsonError:()=>mo,TransportProcessError:()=>an,TransportRpcError:()=>ln,_resetDefaultRegistryForTests:()=>QO,chat:()=>Wt,countTokens:()=>Gd,createAdapterRegistry:()=>Dt,createAllAdapters:()=>Ut,listSessions:()=>Gs,seed:()=>Jd});function Do(){return Mo===null&&(Mo=Dt(Ut())),Mo}function QO(){Mo=null}function Yg(e,t){let n=e.getAdapter(t);if(!n)throw new Error(`provider "${t}" is not registered in this registry`);return n}async function Wt(e){let t=e.registry??Do(),n=Yg(t,e.provider),r={sessionId:e.sessionId,cwd:e.cwd,env:e.env,onDelta:e.onDelta,onProgress:e.onProgress,signal:e.signal,timeoutMs:e.timeoutMs,model:e.model,effort:e.effort,progPath:e.progPath,alias:e.alias,isLead:e.isLead,permissionMode:e.permissionMode,holdOpen:e.holdOpen},s=await n.sendTurn(e.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 Jd(e){let t=e.registry??Do(),n=Yg(t,e.provider),r=await Vg(t,e.provider,e.cwd),s=await n.seed(e.cwd,{model:e.model,effort:e.effort,prompt:e.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 Vg(t,e.provider,e.cwd),a=e$(r,o);return a?{success:!0,sessionId:a,...i}:{success:!0,...i}}async function Vg(e,t,n){let r=await e.listAll({provider:t,workspace:n}),s=new Map;for(let i of r)s.set(i.sessionId,i.modifiedAt);return s}function e$(e,t){let n=[];for(let r of t.keys())e.has(r)||n.push(r);return n.length===1?n[0]:void 0}async function Gs(e={}){return(e.registry??Do()).listAll({provider:e.provider,workspace:e.workspace,limit:e.limit,from:e.from,to:e.to})}async function Gd(e){let n=await(e.registry??Do()).getSession(e.sessionId,e.provider);if(!n)throw new Error(`session "${e.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 Mo,vt=w(()=>{"use strict";Oc();Xd();Oc();Xd();$r();Mo=null});function t$(){return Vd===null&&(Vd=Dt(Ut())),Vd}async function jo(e){let{dal:t,team_member_id:n}=e,r=t!==void 0&&n!==void 0;r&&t.setMemberState(n,"in_chat");let s=!1,i;try{return await r$(e)}catch(o){throw s=!0,i=o,o}finally{if(r)if(!s)Wr.delete(n),t.setMemberState(n,"idle");else{let o=n$(i,n);t.setMemberState(n,o!==null?"attention_needed":"idle",o)}}}function n$(e,t){if(!(e instanceof Re))return Wr.delete(t),null;if(e.kind==="sessiondir_missing")return"sessiondir_missing";if(e.kind==="enoent")return"binary_missing";if(e.kind==="nonzero_exit"&&(e.exit_status===137||e.exit_status===139))return"oom_exit";if(e.kind==="timeout"){let n=(Wr.get(t)??0)+1;return n>=3?(Wr.delete(t),"consecutive_timeouts"):(Wr.set(t,n),null)}return Wr.delete(t),null}async function r$(e){let t=e.timeoutMs,n=typeof t=="number"&&t>0,r=t$(),s;try{let d=await r.resolveSession(e.sessionid);if(!d)return Promise.reject(new Re("other",null,`library: sessionid "${e.sessionid}" matched no registered provider`,Yd(e.sessionid,e.sessiondir,"unresolved")));s=d.provider.name}catch(d){return Promise.reject(new Re("other",null,`library: session resolution failed: ${zg(d)}`,Yd(e.sessionid,e.sessiondir,"unresolved")))}let i=Yd(e.sessionid,e.sessiondir,s),o=new AbortController,a=n?setTimeout(()=>o.abort(),t):null,l=!1;o.signal.addEventListener("abort",()=>{l=!0},{once:!0});let c=Date.now();try{let d=await Wt({provider:s,sessionId:e.sessionid,cwd:e.sessiondir,prompt:e.prompt,timeoutMs:0,signal:o.signal,registry:r,onProgress:e.onProgress,permissionMode:e.permissionMode});if(d.status==="stalled")throw new Re("timeout",null,`library: stalled after ${d.stalledAfterMs??0}ms`,i);return{text:d.text,ms:Date.now()-c,exit_status:0,argv:i}}catch(d){throw l?new Re("timeout",null,`library: wall-clock timeout after ${t??0}ms`,i):s$(d,i)}finally{a!==null&&clearTimeout(a)}}function Yd(e,t,n){return["<library>","chat",e,t,"--provider",n]}function zg(e){return e instanceof Error?e.message:String(e)}function s$(e,t){if(e instanceof Re)return e;if(e instanceof Ie){let n=e.cause;return n?.code==="ENOENT_CWD"?new Re("sessiondir_missing",null,e.message,t):n?.code==="ENOENT"?new Re("enoent",null,e.message,t):new Re("other",null,e.message,t)}return e instanceof an?new Re("nonzero_exit",e.exitCode??null,e.stderr??e.message,t):e instanceof ln?new Re("nonzero_exit",e.rpcCode??null,e.message,t):e instanceof ut?new Re("other",null,e.message,t):new Re("other",null,zg(e),t)}var Re,Vd,Wr,Po=w(()=>{"use strict";vt();Re=class extends Error{kind;exit_status;stderr;argv;constructor(t,n,r,s){super(`lmctl chat failed: ${t}`),this.kind=t,this.exit_status=n,this.stderr=r,this.argv=s,this.name="ChatError"}},Vd=null;Wr=new Map});function Zg(){return zd===null&&(zd=Dt(Ut())),zd}function o$(e,t){if(!i$.test(e))return e;let n=t.getConfig(`workspace.${e}`);if(n===null||n.length===0)throw new Me("other",null,`no provider mapping for ${e} (set lmctl_config workspace.${e})`,["<library>","seed","--provider",e]);return n}async function Fo(e){let t=o$(e.member.provider,e.dal),n=t===e.member.provider?e.member:{...e.member,provider:t},r=await a$({member:n});return e.dal.setMemberProviderResolved(e.member.id,t),{sessionid:r.sessionid,provider_resolved:t}}async function a$(e){let t=e.member.provider,n=e.member.sessiondir,r=Zd("seed",n,t);try{let s=await Jd({provider:t,cwd:n,registry:Zg()});if(!s.success)throw c$(s.error,r);if(!s.sessionId)throw new Me("parse",0,"",r);return{sessionid:s.sessionId}}catch(s){throw s instanceof Me?s:Qd(s,r)}}async function Qg(e){return l$(e)}async function l$(e){let t=Zg(),n=Zd("tokens",e.sessionid,"unresolved"),r;try{let i=await t.resolveSession(e.sessionid);if(!i)throw new Me("parse",0,`library: sessionid "${e.sessionid}" matched no registered provider`,n);r=i.provider.name}catch(i){throw i instanceof Me?i:Qd(i,n)}let s=Zd("tokens",e.sessionid,r);try{let i=await Gd({sessionId:e.sessionid,provider:r,registry:t});return{input_tokens:i.input,cache_tokens:i.cachedInput+i.cacheWriteInput,output_tokens:i.output,total_tokens:i.total}}catch(i){throw i instanceof Me?i:Qd(i,s)}}function Zd(e,t,n){return["<library>",e,t,"--provider",n]}function c$(e,t){let n=e??"";if(/\bENOENT\b/i.test(n))return new Me("enoent",null,n,t);if(/timed?\s*out/i.test(n))return new Me("timeout",null,n,t);if(/\bexit code\s+(-?\d+)\b/i.test(n)){let r=/\bexit code\s+(-?\d+)\b/i.exec(n);return new Me("nonzero_exit",Number(r[1]),n,t)}return new Me("other",null,n,t)}function Qd(e,t){return e instanceof Me?e:e instanceof Ie?e.cause?.code==="ENOENT"?new Me("enoent",null,e.message,t):new Me("other",null,e.message,t):e instanceof an?new Me("nonzero_exit",e.exitCode??null,e.stderr??e.message,t):e instanceof ln?new Me("nonzero_exit",e.rpcCode??null,e.message,t):e instanceof ut?new Me("other",null,e.message,t):new Me("other",null,e instanceof Error?e.message:String(e),t)}var Me,zd,i$,eu=w(()=>{"use strict";vt();Me=class extends Error{kind;exit_status;stderr;argv;constructor(t,n,r,s){super(`lmctl seed failed: ${t}`),this.kind=t,this.exit_status=n,this.stderr=r,this.argv=s,this.name="SeedError"}},zd=null;i$=/^provider[123]$/});function Uo(e){return Buffer.from(e,"utf8").toString("base64url")}function Vs(e){return Buffer.from(e,"base64url").toString("utf8")}async function ey(e,t=n=>Qg({sessionid:n})){if(process.env.LMCTL_SESSION_SIZE_DISABLED==="1")return{recorded:0,failed:0};let n=0,r=0;for(let s of d$(e)){let i=s.member.sessionid;if(i!==null)try{let o=await t(i);e.recordSessionSize({team_name:s.team_name,alias:s.member.alias,sessionid:i,...o}),n+=1}catch(o){r+=1;try{e.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 ty(e,t,n){let r=ny(e,t,n);if(r===null||r.member.sessionid===null)throw new Error("session member not found");if(r.member.state!=="idle")throw new Ks(n,r.member.state);e.setMemberState(r.member.id,"in_chat","compacting");try{return await jo({sessionid:r.member.sessionid,sessiondir:r.member.sessiondir,prompt:"/compact"}),e.setMemberState(r.member.id,"idle",null),{ok:!0,row:ry(e,t,n)}}catch(s){throw e.setMemberState(r.member.id,"attention_needed",`compact failed: ${s instanceof Error?s.message:String(s)}`),s}}async function tu(e,t,n){let r=ny(e,t,n);if(r===null)throw new Error("session member not found");let s=await Fo({member:r.member,dal:e});return e.updateTeamMemberSession(r.member.id,s.sessionid),{ok:!0,sessionid:s.sessionid,row:ry(e,t,n)}}function d$(e){return e.listTeams().flatMap(t=>e.listTeamMembers(t.id).filter(n=>n.sessionid!==null).map(n=>({team_name:t.name,member:n})))}function ny(e,t,n){let r=e.findTeamByName(t);if(r===null)return null;let s=e.findTeamMemberByAlias(r.id,n);return s===null?null:{team_name:r.name,member:s}}function ry(e,t,n){return e.sessionSizeHistory(t,n,1)[0]??null}var Ks,Wo=w(()=>{"use strict";Po();eu();Ks=class extends Error{constructor(t,n){super(`member ${t} is currently ${n}; cannot compact while busy`),this.name="MemberBusyError"}}});async function nu(e){let t=e.dal,n=e.nowMs??Date.now(),r=e.thresholdMs??f$(t),s=n-r,i=t.query(`
|
|
1696
1696
|
SELECT
|
|
1697
1697
|
isess.id AS interactive_session_id,
|
|
@@ -1750,7 +1750,7 @@ ${n}`:n}function eL(e,t){if(e!=="kimi"||!t.includes("notifications/initialized")
|
|
|
1750
1750
|
JOIN run r ON r.id = s.run_id
|
|
1751
1751
|
JOIN job j ON j.id = r.job_id
|
|
1752
1752
|
WHERE j.project_id = ? AND s.outcome IS NOT NULL
|
|
1753
|
-
${r!==null?"AND r.started_at >= ?":""}`,...s),o=new Map,a=0,l=0;for(let
|
|
1753
|
+
${r!==null?"AND r.started_at >= ?":""}`,...s),o=new Map,a=0,l=0;for(let E of i){let b=o.get(E.state_name)??{total:0,rc:0};b.total++,E.outcome==="request_changes"&&b.rc++,o.set(E.state_name,b),a++,E.outcome==="request_changes"&&l++}let c=[...o.entries()].map(([E,b])=>({state_name:E,total:b.total,request_changes:b.rc,rate_pct:b.total>0?`${(b.rc/b.total*100).toFixed(1)}%`:"0.0%"})),d={total:a,request_changes:l,rate_pct:a>0?`${(l/a*100).toFixed(1)}%`:"0.0%",by_state:c},u=e.query(`SELECT s.state_name,
|
|
1754
1754
|
CAST((julianday(s.ended_at) - julianday(s.started_at)) * 86400000 AS INTEGER) AS duration_ms
|
|
1755
1755
|
FROM step s
|
|
1756
1756
|
JOIN run r ON r.id = s.run_id
|
|
@@ -1762,14 +1762,14 @@ ${n}`:n}function eL(e,t){if(e!=="kimi"||!t.includes("notifications/initialized")
|
|
|
1762
1762
|
JOIN job j ON j.id = r.job_id
|
|
1763
1763
|
WHERE j.project_id = ? AND s.ended_at IS NULL
|
|
1764
1764
|
${r!==null?"AND r.started_at >= ?":""}
|
|
1765
|
-
GROUP BY s.state_name`,...f),p=new Map;for(let
|
|
1765
|
+
GROUP BY s.state_name`,...f),p=new Map;for(let E of u){let b=p.get(E.state_name)??{lt5:0,btw5_15:0,btw15_60:0,gt60:0,noEnd:0},S=E.duration_ms;S<3e5?b.lt5++:S<9e5?b.btw5_15++:S<36e5?b.btw15_60++:b.gt60++,p.set(E.state_name,b)}for(let E of m){let b=p.get(E.state_name)??{lt5:0,btw5_15:0,btw15_60:0,gt60:0,noEnd:0};b.noEnd+=E.cnt,p.set(E.state_name,b)}let _=[...p.entries()].map(([E,b])=>({state_name:E,lt_5min:b.lt5,btw_5_15min:b.btw5_15,btw_15_60min:b.btw15_60,gt_60min:b.gt60,no_end:b.noEnd})),h=e.query(`SELECT s.state_name, s.run_id, COUNT(*) AS attempt_count
|
|
1766
1766
|
FROM step s
|
|
1767
1767
|
JOIN run r ON r.id = s.run_id
|
|
1768
1768
|
JOIN job j ON j.id = r.job_id
|
|
1769
1769
|
WHERE j.project_id = ?
|
|
1770
1770
|
${r!==null?"AND r.started_at >= ?":""}
|
|
1771
1771
|
GROUP BY s.run_id, s.state_name
|
|
1772
|
-
HAVING COUNT(*) > 1`,...s),g=new Map;for(let
|
|
1772
|
+
HAVING COUNT(*) > 1`,...s),g=new Map;for(let E of h){let b=g.get(E.state_name)??{runs:0,total_attempts:0};b.runs++,b.total_attempts+=E.attempt_count,g.set(E.state_name,b)}let y=[...g.entries()].map(([E,b])=>({state_name:E,retried_runs:b.runs,avg_retries:b.runs>0?Number((b.total_attempts/b.runs).toFixed(2)):0}));return{request_changes_rate:d,step_duration_histogram:_,retry_counts:y}}function cu(e,t={}){let n=t.since_days!==void 0?Date.now()-Math.trunc(t.since_days)*864e5:0,r=t.project_id!==void 0?e.query(`SELECT json_extract(se.payload, '$.tool') AS tool_name, COUNT(*) AS cnt
|
|
1773
1773
|
FROM session_event se
|
|
1774
1774
|
JOIN run r ON r.id = se.run_id
|
|
1775
1775
|
JOIN job j ON j.id = r.job_id
|
|
@@ -1812,17 +1812,17 @@ ${n}`:n}function eL(e,t){if(e!=="kimi"||!t.includes("notifications/initialized")
|
|
|
1812
1812
|
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,d=o.get(l.tool_name)??[],u=d.length>0?d.reduce((p,_)=>p+_,0)/d.length:null,f=d.length>0?d[Math.floor(d.length*.5)]??null:null,m=d.length>0?d[Math.floor(d.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:u!==null?Math.round(u):null,p50_latency_ms:f,p95_latency_ms:m}})}function Ey(e){try{let t=JSON.parse(e);if(t.schema_version==="lmctl/v3"&&Array.isArray(t.steps)){let n=[],r=new Map,s=new Map;for(let i of t.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(t.states!==null&&typeof t.states=="object"){let n=t.states,r=new Map;for(let[l,c]of Object.entries(n))if(c!==null&&typeof c=="object"){let d=c.type;typeof d=="string"&&r.set(l,d)}let s=typeof t.start_at=="string"?t.start_at:null,i=Object.keys(n),o=s!==null&&i.includes(s)?[s,...i.filter(l=>l!==s)]:i,a=t.terminals!==null&&typeof t.terminals=="object"?Object.keys(t.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 Br(e,t){let n=e.query("SELECT * FROM run WHERE id = ?",t)[0];if(n===void 0)return null;let r=e.query("SELECT * FROM workflow WHERE id = ?",n.workflow_id)[0]??null,s=(()=>{let h=e.query("SELECT * FROM job WHERE id = ?",n.job_id)[0];return h===void 0?null:e.query("SELECT * FROM project WHERE id = ?",h.project_id)[0]?.name??null})(),i=r!==null?Ey(r.definition):{schema:"unknown",nodes:[],nodeTypes:new Map,nameToId:new Map},o=e.query("SELECT * FROM step WHERE run_id = ? ORDER BY id ASC",t),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=e.query(`SELECT state_name, status, last_agent_output
|
|
1813
1813
|
FROM interactive_session
|
|
1814
1814
|
WHERE run_id = ? AND status = 'waiting_operator'
|
|
1815
|
-
ORDER BY id DESC LIMIT 1`,t)[0],d=c!==void 0?a(c.state_name):null,u=d,f=c?.last_agent_output??null;if(u===null){let h=o.find(g=>g.ended_at===null);h!==void 0?u=a(h.state_name):o.length>0?u=a(o[o.length-1].state_name):u=n.current_state}n.terminal_state!==null&&(u=`@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)}u!==null&&!p.includes(u)&&p.push(u);let _=[];for(let h of p){if(m.has(h))continue;m.add(h);let g=h===u,
|
|
1815
|
+
ORDER BY id DESC LIMIT 1`,t)[0],d=c!==void 0?a(c.state_name):null,u=d,f=c?.last_agent_output??null;if(u===null){let h=o.find(g=>g.ended_at===null);h!==void 0?u=a(h.state_name):o.length>0?u=a(o[o.length-1].state_name):u=n.current_state}n.terminal_state!==null&&(u=`@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)}u!==null&&!p.includes(u)&&p.push(u);let _=[];for(let h of p){if(m.has(h))continue;m.add(h);let g=h===u,y=l.get(h),E="pending",b=null;if(h.startsWith("@terminal:"))E=n.terminal_state===h.slice(10)?"done":"pending";else if(y!==void 0&&(y.ended_at===null?E=g&&d===h?"paused":"running":y.outcome===null?E="failed":E="done",y.ended_at!==null)){let S=Date.parse(y.started_at),k=Date.parse(y.ended_at);!Number.isNaN(S)&&!Number.isNaN(k)&&(b=k-S)}g&&d===h&&(E="paused"),_.push({id:h,status:E,is_current:g,elapsed_ms:b,prompt:g&&E==="paused"?f:null,expected:g&&E==="paused"?"free_text":null})}return{run_id:t,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:u,nodes:_}}function Yo(e){let t=[],n=e.workflow_name??"?",r=e.workflow_version!==null?`v${e.workflow_version}`:"v?",s=e.terminal_state!==null?`terminal:${e.terminal_state}`:e.paused?"paused":"running";t.push(`run: ${e.run_id} (${n}, ${r}) - ${s}`),e.project!==null&&t.push(`project: ${e.project}`),t.push(""),t.push("workflow tree:");for(let i of e.nodes)t.push(...w$(i));return`${t.join(`
|
|
1816
1816
|
`)}
|
|
1817
1817
|
`}function w$(e){let t=[],n=T$(e.status),r=[];e.status==="done"&&e.elapsed_ms!==null?r.push(`done, ${(e.elapsed_ms/1e3).toFixed(1)}s`):e.status==="failed"?r.push("failed"):e.status==="paused"?r.push("paused, waiting for operator input"):e.status==="running"?r.push("running"):e.status==="pending"&&r.push("pending");let s=r.length>0?`(${r.join(", ")})`:"",i=e.is_current?" <- CURRENT":"",o=e.id.padEnd(28);if(t.push(` ${n} ${o} ${s}${i}`.trimEnd()),e.is_current&&e.status==="paused"&&e.prompt!==null){let a=e.prompt.split(/\r?\n/)[0]??"",l=a.length>80?`${a.slice(0,80)}...`:a;t.push(` \u2514 prompt: "${l}"`),e.expected!==null&&t.push(` \u2514 expected: ${e.expected}`)}return t}function T$(e){switch(e){case"done":return"[x]";case"failed":return"[!]";case"paused":return"[*]";case"running":return"[>]";case"pending":return"[ ]";default:return" "}}function zo(e,t,n={}){let r=n.nowMs??Date.now(),s=e.query("SELECT * FROM run WHERE id = ?",t)[0];if(s===void 0)return null;let i=e.query("SELECT * FROM workflow WHERE id = ?",s.workflow_id)[0]??null,o=s.workflow_version_id===null?null:e.query("SELECT version FROM workflow_version WHERE id = ?",s.workflow_version_id)[0]??null,a=e.query("SELECT * FROM job WHERE id = ?",s.job_id)[0]??null,l=a===null?null:e.query("SELECT * FROM project WHERE id = ?",a.project_id)[0]??null,c=i!==null?Ey(i.definition):{schema:"unknown",nodes:[],nodeTypes:new Map,nameToId:new Map},d=S=>c.schema==="v3"&&c.nameToId.has(S)?c.nameToId.get(S):S,u=e.query("SELECT * FROM step WHERE run_id = ? ORDER BY id ASC",t),f=new Map;for(let S of u)f.set(d(S.state_name),S);let m=e.query("SELECT * FROM interactive_session WHERE run_id = ? ORDER BY id ASC",t),p=new Map;for(let S of m)p.set(d(S.state_name),S);let _=new Map,h=e.query("SELECT MAX(timestamp_ms) AS timestamp_ms FROM session_event WHERE run_id = ? AND step_id IS NULL",t)[0]?.timestamp_ms??null;for(let S of e.query(`SELECT step_id, MAX(timestamp_ms) AS timestamp_ms
|
|
1818
1818
|
FROM session_event
|
|
1819
1819
|
WHERE run_id = ? AND step_id IS NOT NULL
|
|
1820
|
-
GROUP BY step_id`,t))S.step_id!==null&&_.set(S.step_id,S.timestamp_ms);let g=v$(c,u,d),
|
|
1820
|
+
GROUP BY step_id`,t))S.step_id!==null&&_.set(S.step_id,S.timestamp_ms);let g=v$(c,u,d),y=b$(s.current_state),E=e.query(`SELECT kind, severity, payload
|
|
1821
1821
|
FROM attention
|
|
1822
1822
|
WHERE run_id = ?
|
|
1823
1823
|
AND kind = 'session_hung'
|
|
1824
1824
|
AND acknowledged_at IS NULL
|
|
1825
|
-
ORDER BY id ASC`,t).map(S=>({kind:S.kind,severity:S.severity,payload:R$(S.payload)})),b=g.map(S=>{let k=f.get(S),F=p.get(S),P=S$(s,S,
|
|
1825
|
+
ORDER BY id ASC`,t).map(S=>({kind:S.kind,severity:S.severity,payload:R$(S.payload)})),b=g.map(S=>{let k=f.get(S),F=p.get(S),P=S$(s,S,y,k,F),D=k===void 0?null:Date.parse(k.started_at),U=k?.ended_at===null||k===void 0?null:Date.parse(k.ended_at),x=k===void 0||Number.isNaN(D??NaN)?null:U!==null&&!Number.isNaN(U)?U-D:P==="running"||P==="paused"?r-D:null,H=k===void 0?null:_.get(k.id)??null,J=L$(F?.last_activity_at??null,H,h),N=i===null||F===void 0?void 0:N$(e,s.team_id,i.definition,F.state_name,k?.state_name??S);return{step_id:k?.id??null,state_id:S,status:P,started_at:k?.started_at??null,ended_at:k?.ended_at??null,last_activity_at:J,elapsed_ms:x,...N!==void 0?{member:N}:{},...F!==void 0?{interactive_session:{id:F.id,status:F.status,turn_count:F.turn_count,state_name:F.state_name}}:{}}});return{run_id:t,workflow_name:i?.name??null,workflow_version:o?.version??i?.version??null,workflow_version_id:s.workflow_version_id,project:l?.name??null,status:I$(s,a,b),submitted_at:a?.enqueued_at??s.started_at,nodes:b,current_node_index:k$(b,s.terminal_state!==null),related_attentions:E}}function Zo(e,t={}){let n=t.nowMs??Date.now(),r=[],s=e.workflow_name??"?",i=e.workflow_version!==null?`v${e.workflow_version}`:"v?";r.push(`run ${e.run_id} - ${s}, ${i} - ${e.status}`);let o=`${e.submitted_at} (${ay(Date.parse(e.submitted_at),n)} ago)`;r.push(`project: ${e.project??"?"} | submitted: ${o}`),r.push(""),r.push("timeline:"),r.push(`${oy(e.submitted_at,e.submitted_at)} submit`);for(let a of e.nodes){let l=a.started_at===null?"[ ]":oy(e.submitted_at,a.started_at),c=a.status.padEnd(7),d=a.elapsed_ms===null?"":` elapsed ${Qo(a.elapsed_ms)}`;if(r.push(`${l} ${a.state_id.padEnd(24)} ${c}${d}`.trimEnd()),a.interactive_session!==void 0){let u=a.last_activity_at===null?"last activity unknown":`last activity ${ay(a.last_activity_at,n)} ago`,f=a.member!==void 0?`${a.member.alias} member`:"interactive member";r.push(` ${" ".repeat(24)} ${u}`),r.push(` ${" ".repeat(24)} ${f}, ${a.interactive_session.status}`)}}if(e.related_attentions.length>0){r.push(""),r.push("attentions:");for(let a of e.related_attentions)r.push(`- ${a.kind}${O$(a.payload)}`)}return`${r.join(`
|
|
1826
1826
|
`)}
|
|
1827
1827
|
`}function v$(e,t,n){let r=e.nodes.filter(s=>s.startsWith("@terminal:")?!1:e.nodeTypes.get(s)!=="lmctl/terminal"&&e.nodeTypes.get(s)!=="Terminal");for(let s of t){let i=n(s.state_name);r.includes(i)||r.push(i)}return r}function b$(e){return e===null?null:e.startsWith("__paused__:")?e.slice(11):e}function S$(e,t,n,r,s){return r===void 0?"pending":r.ended_at===null?s?.status==="waiting_operator"||e.paused_at!==null&&n===t?"paused":"running":r.outcome===null?"failed":"done"}function k$(e,t){if(e.length===0)return null;let n=e.findIndex(s=>s.status==="running"||s.status==="paused"||s.status==="failed");if(n>=0)return n;if(t){for(let s=e.length-1;s>=0;s-=1)if(e[s].status==="done")return s}let r=e.findIndex(s=>s.status==="pending");return r>=0?r:e.length-1}function I$(e,t,n){return e.terminal_state!==null?e.terminal_state:e.paused_at!==null?"paused":t?.status==="failed"||n.some(r=>r.status==="failed")?"failed":"running"}function N$(e,t,n,r,s){let i=x$(n,r,s);if(i===null)return;let o=e.query("SELECT * FROM team_member WHERE team_id = ? AND lower(alias) = lower(?) LIMIT 1",t,i)[0];return o===void 0?void 0:{alias:o.alias,provider:et(o)}}function x$(e,t,n){let r=A$(e);if(r===null)return null;if(Array.isArray(r.steps)){let s=r.steps.find(a=>Dn(a)?a.id===t||a.name===t||a.name===n:!1),i=Dn(s?.members)?s.members:null,o=i!==null&&Dn(i.agent)?i.agent:null;return typeof o?.alias=="string"?o.alias:null}if(Dn(r.states)){let s=r.states[t]??r.states[n];if(!Dn(s))return null;let i=Dn(s.agent)?s.agent:null;return typeof i?.alias=="string"?i.alias:null}return null}function A$(e){try{let t=JSON.parse(e);return Dn(t)?t:null}catch{return null}}function R$(e){if(e===null)return null;try{return JSON.parse(e)}catch{return e}}function Dn(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}function L$(...e){let t=e.filter(n=>n!==null&&Number.isFinite(n));return t.length===0?null:Math.max(...t)}function oy(e,t){let n=Date.parse(e),r=Date.parse(t);return Number.isNaN(n)||Number.isNaN(r)?"[+? ]":`[+${Qo(Math.max(0,r-n)).padEnd(6)}]`}function ay(e,t){return Number.isNaN(e)?"?":Qo(Math.max(0,t-e))}function Qo(e){let t=Math.max(0,Math.round(e/1e3));if(t<60)return`${t}s`;let n=Math.floor(t/60),r=t%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 O$(e){if(!Dn(e))return"";let t=typeof e.step_id=="number"?` on step ${e.step_id}`:"",n=typeof e.member_alias=="string"?e.member_alias:null,r=typeof e.provider=="string"?e.provider:null,s=typeof e.elapsed_ms=="number"?`, ${Qo(e.elapsed_ms)} elapsed`:"",i=n===null?"":` (${n}${r===null?"":` ${r}`}${s})`;return`${t}${i}`}var hy,cn=w(()=>{"use strict";dt();hy=`SELECT a.id AS attention_id,
|
|
1828
1828
|
a.kind AS kind,
|
|
@@ -2133,7 +2133,7 @@ and \`lmctl api escalations\` (no args) print detailed usage.
|
|
|
2133
2133
|
and report the first step that would be started. Default output is the TTY
|
|
2134
2134
|
table; --json emits the structured WorkflowVerifyReport payload.`;xC=["open","assigned","closed","reopened"]});import Dy from"jexl";function Hr(e){Dy.compile(jy(e))}async function lr(e,t){return Dy.eval(jy(e),t)}function jy(e){return e.replace(/([A-Za-z_$][\w$.[\]]*)\.includes\(([^()]+)\)/g,"($2 in $1)")}var Zs=w(()=>{"use strict"});import{z as T}from"zod";function yu(e){let t=e.trim();return t.startsWith("={{")&&t.endsWith("}}")?t.slice(3,-2).trim():e}var qC,Py,fu,mu,pu,_u,hu,gu,Fy,BC,HC,XC,Qs,JC,ra,sa,ia,oa,aa,Uy,GC,KC,VC,YC,la,Xr=w(()=>{"use strict";Zs();qC=T.object({kind:T.enum(["success","neutral","failure"])}),Py=T.enum(["string","number","boolean","object","array"]),fu=T.object({name:T.string().min(1),type:Py,required:T.boolean().optional(),default:T.unknown().optional(),description:T.string().optional()}),mu=T.object({name:T.string().min(1),type:Py,source_step_id:T.string().min(1),source_field:T.string().min(1),description:T.string().optional()}),pu=T.object({id:T.string().min(1),type:T.string().min(1),parameters:T.record(T.string(),T.unknown()).default({})}),_u="__failure__",hu=T.object({tools:T.array(T.string().min(1)).optional(),auth:T.array(T.string().min(1)).optional()}).strict().optional(),gu=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(),Fy=T.object({type:T.literal("AssertRepoClean"),fail_message:T.string().min(1).optional(),next:T.string().min(1)}),BC=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(),HC=T.union([T.string().min(1),BC]),XC=T.union([T.string().min(1),T.object({name:T.string().min(1),content:T.string().min(1)}).strict()]),Qs=T.object({team:T.string().min(1),alias:T.string().min(1),prompt_template:T.string().optional(),mcp:T.array(HC).optional(),skills:T.array(XC).optional()}),JC=T.object({kind:T.literal("shell"),command:T.string().min(1),description:T.string().optional()}),ra=T.object({type:T.literal("Review"),state_name:T.string().min(1),coder:Qs,pre_checks:T.array(JC).optional(),reviewers:T.array(Qs.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((e,t)=>{(e.reviewers??[]).length>0&&e.outcomes_from_stance!==void 0&&t.addIssue({code:"custom",path:["outcomes_from_stance"],message:"outcomes_from_stance cannot be used when reviewers is non-empty"})}),sa=T.object({type:T.literal("Consolidate"),state_name:T.string().min(1),researchers:T.array(Qs.extend({topic:T.string().min(1)})).optional(),consolidator:Qs,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()}),ia=T.object({type:T.literal("Interactive"),state_name:T.string().min(1),agent:Qs.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()}),oa=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)}),aa=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()}),Uy=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((e,t)=>{for(let[n,r]of e.branches.entries())try{Hr(yu(r.when))}catch(s){let i=s instanceof Error?s.message:"invalid expression";t.addIssue({code:"custom",path:["branches",n,"when"],message:`invalid jexl expression: ${i}`})}}),GC=T.discriminatedUnion("type",[Fy,ra,sa,ia,oa,aa,Uy]),KC=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:GC,outcomes:T.object({all_ok:T.string().min(1),any_failed:T.string().optional()})}).superRefine((e,t)=>{try{Hr(yu(e.items_from))}catch(n){let r=n instanceof Error?n.message:"invalid expression";t.addIssue({code:"custom",path:["items_from"],message:`invalid jexl expression: ${r}`})}}),VC=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((e,t)=>{for(let[n,r]of Object.entries(e.inputs??{}))try{Hr(yu(r))}catch(s){let i=s instanceof Error?s.message:"invalid expression";t.addIssue({code:"custom",path:["inputs",n],message:`invalid jexl expression: ${i}`})}}),YC=T.discriminatedUnion("type",[Fy,ra,sa,ia,oa,aa,Uy,KC,VC]),la=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),YC),terminals:T.record(T.string().min(1),qC),errors:gu,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(fu).optional(),outputs:T.array(mu).optional(),triggers:T.array(pu).optional(),read_only:T.boolean().optional(),requires:hu}).superRefine((e,t)=>{e.definition_schema_version===1&&e.errors!==void 0&&t.addIssue({code:"custom",path:["errors"],message:"errors block requires definition_schema_version: 2"}),e.definition_schema_version===1&&e.concurrency_key!==void 0&&t.addIssue({code:"custom",path:["concurrency_key"],message:"concurrency_key requires definition_schema_version: 2"}),e.definition_schema_version===1&&e.default_task_timeout_ms!==void 0&&t.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 zC,ca,ZC,QC,eM,Bt,Jr=w(()=>{"use strict";Xr();zC=/^s-[a-z0-9-]+-[a-f0-9]{4}$/,ca=Q.string().regex(zC),ZC=Q.object({step_id:ca,type:Q.literal("main"),index:Q.number().int().min(0)}),QC=Q.record(ca,Q.record(Q.string().min(1),Q.array(Q.array(ZC)))),eM=Q.object({id:ca,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()}),Bt=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:gu,inputs:Q.array(fu).optional(),outputs:Q.array(mu).optional(),steps:Q.array(eM).min(1),connections:QC.default({}),entry_step_id:ca,triggers:Q.array(pu).optional(),read_only:Q.boolean().optional(),requires:hu}).superRefine((e,t)=>{let n=new Set;for(let[r,s]of e.steps.entries())n.has(s.id)&&t.addIssue({code:"custom",path:["steps",r,"id"],message:`duplicate step id: ${s.id}`}),n.add(s.id);n.has(e.entry_step_id)||t.addIssue({code:"custom",path:["entry_step_id"],message:`entry_step_id does not reference an existing step: ${e.entry_step_id}`});for(let[r,s]of Object.entries(e.connections)){n.has(r)||t.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,d]of l.entries())n.has(d.step_id)||t.addIssue({code:"custom",path:["connections",r,i,a,c,"step_id"],message:`connection target does not reference an existing step: ${d.step_id}`})}})});function da(e){return wu(e)}function wu(e){if(Array.isArray(e))return e.map(wu);if(e===null||typeof e!="object")return e;let t=e,n={};for(let r of Object.keys(t))n[r]=wu(t[r]);if(typeof n.type=="string"){let r=nM[n.type];r!==void 0&&(n.type=r)}return n}var Eu,tM,nM,Tu=w(()=>{"use strict";Eu="lmctl.builtin.",tM={Review:`${Eu}Review`,Research:`${Eu}Research`,Consolidate:`${Eu}Consolidate`},nM=Object.fromEntries(Object.entries(tM).map(([e,t])=>[t,e]))});import{readFileSync as rM}from"node:fs";function By(e){return sM(e)}function sM(e){let t=da(aM(e));if(oM(t),Hy(t)===3)return iM(t);let n=la.safeParse(t);if(!n.success)throw new dn({errors:n.error.issues.map(s=>({path:s.path.length===0?"$":s.path.map(String).join("."),message:s.message}))});let r=lM(n.data);if(r.errors.length>0||r.unresolvedRefs.length>0)throw new dn(r);return n.data}function iM(e){let t=Bt.safeParse(e);if(!t.success)throw new dn({errors:t.error.issues.map(n=>({path:n.path.length===0?"$":n.path.map(String).join("."),message:n.message}))});return t.data}function oM(e){if(typeof e!="object"||e===null||!("definition_schema_version"in e))return;let t=Hy(e);if(!(t===null||Wy.includes(t)))throw new dn({errors:[{path:"definition_schema_version",message:`unsupported definition_schema_version ${t}; supported versions: ${Wy.join(", ")}`}]})}function Hy(e){if(typeof e!="object"||e===null||!("definition_schema_version"in e))return null;let t=e.definition_schema_version;return typeof t=="number"?t:null}function aM(e){if(typeof e!="string")return e;let t=e.trim();return e.includes(`
|
|
2135
2135
|
`)||t.startsWith("{")||t.startsWith("[")?qy(e,"$"):t.endsWith(".json")?qy(rM(t,"utf8"),t):e}function qy(e,t){try{return JSON.parse(e)}catch(n){let r=n instanceof Error?n.message:"invalid JSON";throw new dn({errors:[{path:t,message:`invalid JSON: ${r}`}]})}}function lM(e){let t=[],n=[],r=new Set(Object.keys(e.states));r.has(e.start_at)||n.push({state:"$",ref:e.start_at,kind:"next"}),cM(e,r,n);for(let[s,i]of Object.entries(e.states))new Set(Object.keys(e.terminals));return{errors:t,unresolvedRefs:n}}function cM(e,t,n){let r=e.errors?.on_unhandled_failure_state;r!==void 0&&(t.has(r)||n.push({state:"$",ref:r,kind:"next"}))}var Wy,dn,Xy=w(()=>{"use strict";Xr();Jr();Tu();Wy=[1,2,3],dn=class extends Error{errors;unresolvedRefs;constructor(t){super(t.message??"workflow validation failed"),this.name="WorkflowValidationError",this.errors=t.errors??[],this.unresolvedRefs=t.unresolvedRefs??[]}}});import{createHash as dM}from"node:crypto";function Jy(e,t){let n=uM(t),r=dM("sha1").update(`${e}:${t}`).digest("hex").slice(0,4);return`s-${n}-${r}`}function uM(e){let t=e.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"");return t.length>0?t:"step"}var Gy=w(()=>{"use strict";Jr()});function pM(e,t){let n=mM[e]??[],r={},s={};for(let[i,o]of Object.entries(t))n.includes(i)?s[i]=o:r[i]=o;return{params:r,members:s}}function zy(e){let t=[],n=(N,A)=>{throw new Gr([{line:N,message:A}])},r=e.split(`
|
|
2136
|
-
`),s=[];for(let N=0;N<r.length;N+=1){let O=gM(r[N]).trim();O.length>0&&s.push({n:N+1,text:O})}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=[],d=[],u=[],f,m={},p=new Map,_=new Map,h=new Map,g=(N,A,O,X,q,j)=>{l.has(N)&&n(X,`duplicate step/terminal id: ${N}`),/^[A-Za-z][\w-]*$/.test(N)||n(X,`invalid id (must start with a letter): ${N}`),l.set(N,{declId:N,type:A,params:O,line:X,isTerminal:q,...j?{members:j}:{}}),d.push(N)},E=N=>{let A=[],O=N+1;for(;O<s.length;O+=1){let X=/^([A-Za-z][\w-]*|default)\s*->\s*([A-Za-z][\w-]*)$/.exec(s[O].text);if(X===null)break;A.push({label:X[1],dst:X[2]})}return{branches:A,nextIdx:O-1}};for(let N=1;N<s.length;N+=1){let{n:A,text:O}=s[N],X=O.split(/\s+/,1)[0];if(/^meta\s*\(/.test(O)){N!==1&&n(A,"`meta(...)` must be the preamble \u2014 the FIRST line after the `workflow` header (at most one, before any construct)");let q=/^meta\s*\((.*)\)\s*$/.exec(O)??n(A,`malformed \`meta\` (expected \`meta({ "requires"?:\u2026, "default_task_timeout_ms"?:\u2026, "errors"?:\u2026, "concurrency_key"?:\u2026, "concurrent_limit"?:\u2026 })\`): ${O}`),j=Fn(q[1],A,n);for(let ne of Object.keys(j))Vy.has(ne)||n(A,`unknown \`meta\` key \`${ne}\` \u2014 only workflow-level runtime metadata is allowed: ${[...Vy].join(", ")} (no grammar inflation; bounded)`);m=j;continue}if(X==="step"){let q=/^step\s+([A-Za-z][\w-]*)\s*=\s*([a-z][a-z0-9-]*)\s*\((.*)\)\s*$/.exec(O)??n(A,`malformed \`step\` (expected \`step <id> = <archetype>(k=v, ...)\`): ${O}`),j=q[1],ne=q[2],Se=q[3],fe=Ky[ne];fe===void 0&&n(A,`unknown step type: ${ne} (supported \`step\` archetypes: ${Object.keys(Ky).join(", ")}; choice/terminal/loop/foreach/call/decide have their own constructs)`);let{params:xe,members:Qt}=pM(fe,Fn(Se,A,n));g(j,fe,xe,A,!1,Object.keys(Qt).length>0?Qt:void 0);continue}if(X==="trigger"){let q=/^trigger\s+([A-Za-z][\w-]*)\s*=\s*([a-z][a-z0-9-]*)\s*\((.*)\)\s*$/.exec(O)??n(A,`malformed \`trigger\` (expected \`trigger <id> = <trigger-type>({ ...json... })\`): ${O}`),j=q[1],ne=q[2],Se=q[3],fe=Yy[ne];fe===void 0&&n(A,`unknown trigger type: ${ne} (registered trigger archetypes: ${Object.keys(Yy).join(", ")})`),p.has(j)&&n(A,`duplicate trigger id: ${j}`),p.set(j,{id:j,type:fe,parameters:Fn(Se,A,n)});continue}if(X==="mcp"||X==="skill"){let q=new RegExp(`^${X}\\s+([A-Za-z][\\w-]*)\\s*=\\s*(.+)$`).exec(O)??n(A,`malformed \`${X}\` decl (expected \`${X} <name> = {json} | ${X} <name> = "<file|url>"\`): ${O}`),j=q[1],ne=q[2].trim(),Se=X==="mcp"?_:h;Se.has(j)&&n(A,`duplicate ${X} declaration: ${j}`);let fe;if(ne.startsWith("{")){let xe=Fn(ne,A,n);X==="mcp"?fe={...xe,name:j}:((typeof xe.content!="string"||xe.content.length===0)&&n(A,`\`skill ${j}\`: inline form requires a non-empty string \`content\` (a SKILL.md body)`),fe={name:j,content:xe.content})}else{let xe=Zy(ne);(typeof xe!="string"||xe.length===0)&&n(A,`\`${X} ${j}\`: string form must be a non-empty file path or http(s) URL`),fe=xe}Se.set(j,fe);continue}if(X==="terminal"){let q=/^terminal\s+([A-Za-z][\w-]*)\s*=\s*([A-Za-z][\w-]*)(?:\s+(success|failure|neutral))?\s*$/.exec(O)??n(A,`malformed \`terminal\` (expected \`terminal <id> = <name> [success|failure|neutral]\`): ${O}`);g(q[1],"lmctl/terminal",{name:q[2],kind:q[3]??"neutral"},A,!0);continue}if(X==="seq"){let j=O.slice(3).trim().split(/\s*(->|-[a-z0-9_]+->)\s*/).map(ne=>ne.trim()).filter(ne=>ne.length>0);(j.length<3||j.length%2===0)&&n(A,`malformed \`seq\` (expected \`<id> -> <id> [ -> <id> ... ]\`, optional \`-<port>->\`): ${O}`);for(let ne=0;ne+2<j.length+1&&!(ne+2>j.length-1);ne+=2){let Se=j[ne],fe=j[ne+1],xe=j[ne+2],Qt=fe==="->"?"main":fe.slice(1,-2);c.push({srcDeclId:Se,port:Qt,dstDeclId:xe,line:A})}continue}if(X==="choice"){let j=(/^choice\s+([A-Za-z][\w-]*)\s*:$/.exec(O)??n(A,`malformed \`choice\` (expected \`choice <id>:\` then \`when <predicate> -<port>-> <id>\` lines): ${O}`))[1],ne=[],Se,fe=N+1;for(;fe<s.length;fe+=1){let xe=s[fe].text,Qt=/^when\s+(.+)\s+-([a-z0-9_]+)->\s+([A-Za-z][\w-]*)$/.exec(xe);if(Qt!==null){Se!==void 0&&n(s[fe].n,`\`choice ${j}\`: a \`when\` branch may not follow \`default\` (branches are ordered, default is the fallback)`);let Ts=Qt[2];ne.push({when:Qt[1].trim(),next:`@terminal:${Ts}`}),c.push({srcDeclId:j,port:Ts,dstDeclId:Qt[3],line:s[fe].n});continue}let lc=/^default\s+-([a-z0-9_]+)->\s+([A-Za-z][\w-]*)$/.exec(xe);if(lc!==null){Se!==void 0&&n(s[fe].n,`\`choice ${j}\` has more than one \`default\``);let Ts=lc[1];Se=`@terminal:${Ts}`,c.push({srcDeclId:j,port:Ts,dstDeclId:lc[2],line:s[fe].n});continue}break}ne.length===0&&n(A,`\`choice ${j}\` has no \`when\` branches (need \u22651 \`when <jexl-predicate> -<port>-> <id>\`)`),g(j,"lmctl/choice",{branches:ne,...Se!==void 0?{default_next:Se}:{}},A,!1),N=fe-1;continue}if(X==="loop"){let q=/^loop\s+([A-Za-z][\w-]*)\s*=\s*loop\s*\((.*)\)\s*$/.exec(O)??n(A,`malformed \`loop\` (expected \`loop <id> = loop(k=v, ...)\`): ${O}`);g(q[1],"lmctl/loop",Fn(q[2],A,n),A,!1);continue}if(X==="foreach"){let q=/^foreach\s+([A-Za-z][\w-]*)\s*=\s*foreach\s*\((.*)\)\s*$/.exec(O)??n(A,`malformed \`foreach\` (expected \`foreach <id> = foreach(items=<expr>, ...)\`): ${O}`),j=Fn(q[2],A,n);"mode"in j&&n(A,"foreach is SEQUENTIAL-ONLY: `mode` is not permitted (single-thread; durable-memory/composition-language-design.md \xA7Execution model)"),g(q[1],"lmctl/foreach",j,A,!1);continue}if(X==="call"){let q=/^call\s+([A-Za-z][\w-]*)\s*=\s*call\s*\((.*)\)\s*$/.exec(O)??n(A,`malformed \`call\` (expected \`call <id> = call(workflow=<name>, ...)\`): ${O}`),j=q[1],ne=Fn(q[2],A,n),Se=ne.workflow;(typeof Se!="string"||Se.length===0)&&n(A,`\`call ${j}\` requires a \`workflow=<name>\` argument`);let{workflow:fe,...xe}=ne;g(j,"lmctl/subflow",{workflow_name:Se,...xe},A,!1),u.push({declId:j,target:Se,line:A});continue}if(X==="decide"){let q=/^decide\s+([A-Za-z][\w-]*)\s+by\s+agent\s*\((.*)\)\s*:$/.exec(O)??n(A,`malformed \`decide\` (expected \`decide <id> by agent(k=v, ...):\`): ${O}`),j=q[1],ne=Fn(q[2],A,n),{branches:Se,nextIdx:fe}=E(N);Se.length===0&&n(A,`\`decide ${j}\` has no outcomes (need at least one \`<outcome> -> <id>\`)`),g(j,"lmctl/interactive",{termination:{operator_signal:!0}},A,!1,{agent:ne});for(let xe of Se)c.push({srcDeclId:j,port:xe.label,dstDeclId:xe.dst,line:A});N=fe;continue}if(X==="entry"){let q=/^entry\s+([A-Za-z][\w-]*)$/.exec(O)??n(A,`malformed \`entry\` (expected \`entry <id>\`): ${O}`);f!==void 0&&n(A,`duplicate \`entry\` (already set to ${f})`),f=q[1];continue}n(A,`unknown statement \`${X}\` (grammar: workflow / meta / trigger / mcp / skill / step / terminal / seq / choice / loop / foreach / call / decide / entry)`)}d.length===0&&n(s[0].n,"composition declares no steps"),f===void 0&&(f=d[0]),l.has(f)||n(s[0].n,`entry references undeclared step: ${f}`);let y=N=>{if(Array.isArray(N)){for(let O of N)y(O);return}if(typeof N!="object"||N===null)return;let A=N;if(typeof A.alias=="string")for(let[O,X]of[["mcp",_],["skills",h]]){let q=A[O];Array.isArray(q)&&(A[O]=q.map(j=>typeof j=="string"&&X.has(j)?structuredClone(X.get(j)):j))}for(let O of Object.values(A))y(O)};for(let N of d){let A=l.get(N);A.members!==void 0&&y(A.members)}let b=N=>Jy(o,N),S=d.map(N=>{let A=l.get(N);return{id:b(N),name:N,type:A.type,typeVersion:1,parameters:A.params,...A.members?{members:A.members}:{}}}),k={};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=b(N.srcDeclId);k[A]??={},k[A][N.port]!==void 0&&n(N.line,`duplicate edge port \`${N.port}\` on step \`${N.srcDeclId}\``),k[A][N.port]=[[{step_id:b(N.dstDeclId),type:"main",index:0}]]}for(let N of d){let A=l.get(N);_M.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 u)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 F=new Map;for(let N of c){let A=F.get(N.srcDeclId);A===void 0?F.set(N.srcDeclId,[N.dstDeclId]):A.push(N.dstDeclId)}for(let N of d){let A=l.get(N);if(A.type!=="lmctl/loop")continue;let O=A.params.body;if(typeof O=="string"&&l.has(O)){let X=F.get(N);X===void 0?F.set(N,[O]):X.push(O)}}let P=new Set([f]),D=[f];for(;D.length>0;){let N=D.shift();for(let A of F.get(N)??[])P.has(A)||(P.add(A),D.push(A))}for(let N of d)P.has(N)||n(l.get(N).line,`step \`${N}\` is unreachable from entry \`${f}\``);let U=new Map;for(let N of c){let A=U.get(N.srcDeclId);A===void 0&&(A=new Set,U.set(N.srcDeclId,A)),A.add(N.port)}let x=new Set(["approve","request_changes","fail_pre_check","max_loops_exceeded"]);for(let N of d){let A=l.get(N);if(A.isTerminal)continue;let O=U.get(N)??new Set;if(A.type==="lmctl/review"){let q=[...O].some(j=>!x.has(j));!O.has("approve")&&!q&&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 X=hM[A.type];if(X!==void 0)for(let q of X)O.has(q)||n(A.line,`uncovered outcome: required outcome \`${q}\` of step \`${N}\` (\`${A.type}\`) has no connection \u2014 route it (\`seq ${N} -${q}-> <target|terminal>\`)`);else O.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 d){let A=l.get(N),O=fM[A.type];if(O===void 0)continue;let X={...A.params,...A.members??{},type:O.v2type,state_name:N,...Object.keys(O.outcomes).length>0?{outcomes:O.outcomes}:{}},q=O.schema.safeParse(X);if(!q.success){let j=q.error.issues[0],ne=j.path.length===0?"$":j.path.map(String).join(".");n(A.line,`step \`${N}\` (\`${A.type}\`) has invalid params for archetype \`${O.v2type}\` at \`${ne}\`: ${j.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 H={schema_version:"lmctl/v3",definition_schema_version:3,name:o,version:a,...m,...p.size>0?{triggers:[...p.values()]}:{},steps:S,connections:k,entry_step_id:b(f)},J=Bt.safeParse(H);if(!J.success)throw new Gr(J.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 J.data}function gM(e){let t=null;for(let n=0;n<e.length;n+=1){let r=e[n];if(t!==null){if(r==="\\"){n+=1;continue}r===t&&(t=null);continue}if(r==='"'||r==="'"){t=r;continue}if(r==="#")return e.slice(0,n)}return e}function Fn(e,t,n){let r=e.trim();if(r.length===0)return{};if(r.startsWith("{")){let i;try{i=JSON.parse(r)}catch(o){n(t,`malformed structured args (expected a single-line JSON object): ${o.message}`)}return(i===null||typeof i!="object"||Array.isArray(i))&&n(t,"structured args must be a JSON object"),i}let s={};for(let i of yM(r)){let o=i.indexOf("=");o===-1&&n(t,`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(t,`invalid arg name: ${a}`),s[a]=Zy(l)}return s}function yM(e){return e.split(",").map(t=>t.trim()).filter(t=>t.length>0)}function Zy(e){return e.startsWith('"')&&e.endsWith('"')||e.startsWith("'")&&e.endsWith("'")?e.slice(1,-1):e==="true"?!0:e==="false"?!1:/^-?\d+$/.test(e)?Number.parseInt(e,10):/^-?\d*\.\d+$/.test(e)?Number.parseFloat(e):e}var fM,mM,Ky,Gr,_M,hM,Vy,Yy,Qy=w(()=>{"use strict";Jr();Gy();Xr();fM={"lmctl/review":{v2type:"Review",outcomes:{approve:"_"},schema:ra},"lmctl/consolidate":{v2type:"Consolidate",outcomes:{ok:"_"},schema:sa},"lmctl/interactive":{v2type:"Interactive",outcomes:{done:"_"},schema:ia},"lmctl/loop":{v2type:"Loop",outcomes:{ok:"_"},schema:oa},"lmctl/shell-step":{v2type:"ShellStep",outcomes:{},schema:aa}},mM={"lmctl/review":["coder","reviewers"],"lmctl/consolidate":["researchers","consolidator"],"lmctl/interactive":["agent"]};Ky={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"},Gr=class extends Error{issues;constructor(t){super(`composition DSL compile failed:
|
|
2136
|
+
`),s=[];for(let N=0;N<r.length;N+=1){let O=gM(r[N]).trim();O.length>0&&s.push({n:N+1,text:O})}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=[],d=[],u=[],f,m={},p=new Map,_=new Map,h=new Map,g=(N,A,O,X,q,j)=>{l.has(N)&&n(X,`duplicate step/terminal id: ${N}`),/^[A-Za-z][\w-]*$/.test(N)||n(X,`invalid id (must start with a letter): ${N}`),l.set(N,{declId:N,type:A,params:O,line:X,isTerminal:q,...j?{members:j}:{}}),d.push(N)},y=N=>{let A=[],O=N+1;for(;O<s.length;O+=1){let X=/^([A-Za-z][\w-]*|default)\s*->\s*([A-Za-z][\w-]*)$/.exec(s[O].text);if(X===null)break;A.push({label:X[1],dst:X[2]})}return{branches:A,nextIdx:O-1}};for(let N=1;N<s.length;N+=1){let{n:A,text:O}=s[N],X=O.split(/\s+/,1)[0];if(/^meta\s*\(/.test(O)){N!==1&&n(A,"`meta(...)` must be the preamble \u2014 the FIRST line after the `workflow` header (at most one, before any construct)");let q=/^meta\s*\((.*)\)\s*$/.exec(O)??n(A,`malformed \`meta\` (expected \`meta({ "requires"?:\u2026, "default_task_timeout_ms"?:\u2026, "errors"?:\u2026, "concurrency_key"?:\u2026, "concurrent_limit"?:\u2026 })\`): ${O}`),j=Fn(q[1],A,n);for(let ne of Object.keys(j))Vy.has(ne)||n(A,`unknown \`meta\` key \`${ne}\` \u2014 only workflow-level runtime metadata is allowed: ${[...Vy].join(", ")} (no grammar inflation; bounded)`);m=j;continue}if(X==="step"){let q=/^step\s+([A-Za-z][\w-]*)\s*=\s*([a-z][a-z0-9-]*)\s*\((.*)\)\s*$/.exec(O)??n(A,`malformed \`step\` (expected \`step <id> = <archetype>(k=v, ...)\`): ${O}`),j=q[1],ne=q[2],Se=q[3],fe=Ky[ne];fe===void 0&&n(A,`unknown step type: ${ne} (supported \`step\` archetypes: ${Object.keys(Ky).join(", ")}; choice/terminal/loop/foreach/call/decide have their own constructs)`);let{params:xe,members:Qt}=pM(fe,Fn(Se,A,n));g(j,fe,xe,A,!1,Object.keys(Qt).length>0?Qt:void 0);continue}if(X==="trigger"){let q=/^trigger\s+([A-Za-z][\w-]*)\s*=\s*([a-z][a-z0-9-]*)\s*\((.*)\)\s*$/.exec(O)??n(A,`malformed \`trigger\` (expected \`trigger <id> = <trigger-type>({ ...json... })\`): ${O}`),j=q[1],ne=q[2],Se=q[3],fe=Yy[ne];fe===void 0&&n(A,`unknown trigger type: ${ne} (registered trigger archetypes: ${Object.keys(Yy).join(", ")})`),p.has(j)&&n(A,`duplicate trigger id: ${j}`),p.set(j,{id:j,type:fe,parameters:Fn(Se,A,n)});continue}if(X==="mcp"||X==="skill"){let q=new RegExp(`^${X}\\s+([A-Za-z][\\w-]*)\\s*=\\s*(.+)$`).exec(O)??n(A,`malformed \`${X}\` decl (expected \`${X} <name> = {json} | ${X} <name> = "<file|url>"\`): ${O}`),j=q[1],ne=q[2].trim(),Se=X==="mcp"?_:h;Se.has(j)&&n(A,`duplicate ${X} declaration: ${j}`);let fe;if(ne.startsWith("{")){let xe=Fn(ne,A,n);X==="mcp"?fe={...xe,name:j}:((typeof xe.content!="string"||xe.content.length===0)&&n(A,`\`skill ${j}\`: inline form requires a non-empty string \`content\` (a SKILL.md body)`),fe={name:j,content:xe.content})}else{let xe=Zy(ne);(typeof xe!="string"||xe.length===0)&&n(A,`\`${X} ${j}\`: string form must be a non-empty file path or http(s) URL`),fe=xe}Se.set(j,fe);continue}if(X==="terminal"){let q=/^terminal\s+([A-Za-z][\w-]*)\s*=\s*([A-Za-z][\w-]*)(?:\s+(success|failure|neutral))?\s*$/.exec(O)??n(A,`malformed \`terminal\` (expected \`terminal <id> = <name> [success|failure|neutral]\`): ${O}`);g(q[1],"lmctl/terminal",{name:q[2],kind:q[3]??"neutral"},A,!0);continue}if(X==="seq"){let j=O.slice(3).trim().split(/\s*(->|-[a-z0-9_]+->)\s*/).map(ne=>ne.trim()).filter(ne=>ne.length>0);(j.length<3||j.length%2===0)&&n(A,`malformed \`seq\` (expected \`<id> -> <id> [ -> <id> ... ]\`, optional \`-<port>->\`): ${O}`);for(let ne=0;ne+2<j.length+1&&!(ne+2>j.length-1);ne+=2){let Se=j[ne],fe=j[ne+1],xe=j[ne+2],Qt=fe==="->"?"main":fe.slice(1,-2);c.push({srcDeclId:Se,port:Qt,dstDeclId:xe,line:A})}continue}if(X==="choice"){let j=(/^choice\s+([A-Za-z][\w-]*)\s*:$/.exec(O)??n(A,`malformed \`choice\` (expected \`choice <id>:\` then \`when <predicate> -<port>-> <id>\` lines): ${O}`))[1],ne=[],Se,fe=N+1;for(;fe<s.length;fe+=1){let xe=s[fe].text,Qt=/^when\s+(.+)\s+-([a-z0-9_]+)->\s+([A-Za-z][\w-]*)$/.exec(xe);if(Qt!==null){Se!==void 0&&n(s[fe].n,`\`choice ${j}\`: a \`when\` branch may not follow \`default\` (branches are ordered, default is the fallback)`);let Ts=Qt[2];ne.push({when:Qt[1].trim(),next:`@terminal:${Ts}`}),c.push({srcDeclId:j,port:Ts,dstDeclId:Qt[3],line:s[fe].n});continue}let lc=/^default\s+-([a-z0-9_]+)->\s+([A-Za-z][\w-]*)$/.exec(xe);if(lc!==null){Se!==void 0&&n(s[fe].n,`\`choice ${j}\` has more than one \`default\``);let Ts=lc[1];Se=`@terminal:${Ts}`,c.push({srcDeclId:j,port:Ts,dstDeclId:lc[2],line:s[fe].n});continue}break}ne.length===0&&n(A,`\`choice ${j}\` has no \`when\` branches (need \u22651 \`when <jexl-predicate> -<port>-> <id>\`)`),g(j,"lmctl/choice",{branches:ne,...Se!==void 0?{default_next:Se}:{}},A,!1),N=fe-1;continue}if(X==="loop"){let q=/^loop\s+([A-Za-z][\w-]*)\s*=\s*loop\s*\((.*)\)\s*$/.exec(O)??n(A,`malformed \`loop\` (expected \`loop <id> = loop(k=v, ...)\`): ${O}`);g(q[1],"lmctl/loop",Fn(q[2],A,n),A,!1);continue}if(X==="foreach"){let q=/^foreach\s+([A-Za-z][\w-]*)\s*=\s*foreach\s*\((.*)\)\s*$/.exec(O)??n(A,`malformed \`foreach\` (expected \`foreach <id> = foreach(items=<expr>, ...)\`): ${O}`),j=Fn(q[2],A,n);"mode"in j&&n(A,"foreach is SEQUENTIAL-ONLY: `mode` is not permitted (single-thread; durable-memory/composition-language-design.md \xA7Execution model)"),g(q[1],"lmctl/foreach",j,A,!1);continue}if(X==="call"){let q=/^call\s+([A-Za-z][\w-]*)\s*=\s*call\s*\((.*)\)\s*$/.exec(O)??n(A,`malformed \`call\` (expected \`call <id> = call(workflow=<name>, ...)\`): ${O}`),j=q[1],ne=Fn(q[2],A,n),Se=ne.workflow;(typeof Se!="string"||Se.length===0)&&n(A,`\`call ${j}\` requires a \`workflow=<name>\` argument`);let{workflow:fe,...xe}=ne;g(j,"lmctl/subflow",{workflow_name:Se,...xe},A,!1),u.push({declId:j,target:Se,line:A});continue}if(X==="decide"){let q=/^decide\s+([A-Za-z][\w-]*)\s+by\s+agent\s*\((.*)\)\s*:$/.exec(O)??n(A,`malformed \`decide\` (expected \`decide <id> by agent(k=v, ...):\`): ${O}`),j=q[1],ne=Fn(q[2],A,n),{branches:Se,nextIdx:fe}=y(N);Se.length===0&&n(A,`\`decide ${j}\` has no outcomes (need at least one \`<outcome> -> <id>\`)`),g(j,"lmctl/interactive",{termination:{operator_signal:!0}},A,!1,{agent:ne});for(let xe of Se)c.push({srcDeclId:j,port:xe.label,dstDeclId:xe.dst,line:A});N=fe;continue}if(X==="entry"){let q=/^entry\s+([A-Za-z][\w-]*)$/.exec(O)??n(A,`malformed \`entry\` (expected \`entry <id>\`): ${O}`);f!==void 0&&n(A,`duplicate \`entry\` (already set to ${f})`),f=q[1];continue}n(A,`unknown statement \`${X}\` (grammar: workflow / meta / trigger / mcp / skill / step / terminal / seq / choice / loop / foreach / call / decide / entry)`)}d.length===0&&n(s[0].n,"composition declares no steps"),f===void 0&&(f=d[0]),l.has(f)||n(s[0].n,`entry references undeclared step: ${f}`);let E=N=>{if(Array.isArray(N)){for(let O of N)E(O);return}if(typeof N!="object"||N===null)return;let A=N;if(typeof A.alias=="string")for(let[O,X]of[["mcp",_],["skills",h]]){let q=A[O];Array.isArray(q)&&(A[O]=q.map(j=>typeof j=="string"&&X.has(j)?structuredClone(X.get(j)):j))}for(let O of Object.values(A))E(O)};for(let N of d){let A=l.get(N);A.members!==void 0&&E(A.members)}let b=N=>Jy(o,N),S=d.map(N=>{let A=l.get(N);return{id:b(N),name:N,type:A.type,typeVersion:1,parameters:A.params,...A.members?{members:A.members}:{}}}),k={};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=b(N.srcDeclId);k[A]??={},k[A][N.port]!==void 0&&n(N.line,`duplicate edge port \`${N.port}\` on step \`${N.srcDeclId}\``),k[A][N.port]=[[{step_id:b(N.dstDeclId),type:"main",index:0}]]}for(let N of d){let A=l.get(N);_M.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 u)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 F=new Map;for(let N of c){let A=F.get(N.srcDeclId);A===void 0?F.set(N.srcDeclId,[N.dstDeclId]):A.push(N.dstDeclId)}for(let N of d){let A=l.get(N);if(A.type!=="lmctl/loop")continue;let O=A.params.body;if(typeof O=="string"&&l.has(O)){let X=F.get(N);X===void 0?F.set(N,[O]):X.push(O)}}let P=new Set([f]),D=[f];for(;D.length>0;){let N=D.shift();for(let A of F.get(N)??[])P.has(A)||(P.add(A),D.push(A))}for(let N of d)P.has(N)||n(l.get(N).line,`step \`${N}\` is unreachable from entry \`${f}\``);let U=new Map;for(let N of c){let A=U.get(N.srcDeclId);A===void 0&&(A=new Set,U.set(N.srcDeclId,A)),A.add(N.port)}let x=new Set(["approve","request_changes","fail_pre_check","max_loops_exceeded"]);for(let N of d){let A=l.get(N);if(A.isTerminal)continue;let O=U.get(N)??new Set;if(A.type==="lmctl/review"){let q=[...O].some(j=>!x.has(j));!O.has("approve")&&!q&&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 X=hM[A.type];if(X!==void 0)for(let q of X)O.has(q)||n(A.line,`uncovered outcome: required outcome \`${q}\` of step \`${N}\` (\`${A.type}\`) has no connection \u2014 route it (\`seq ${N} -${q}-> <target|terminal>\`)`);else O.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 d){let A=l.get(N),O=fM[A.type];if(O===void 0)continue;let X={...A.params,...A.members??{},type:O.v2type,state_name:N,...Object.keys(O.outcomes).length>0?{outcomes:O.outcomes}:{}},q=O.schema.safeParse(X);if(!q.success){let j=q.error.issues[0],ne=j.path.length===0?"$":j.path.map(String).join(".");n(A.line,`step \`${N}\` (\`${A.type}\`) has invalid params for archetype \`${O.v2type}\` at \`${ne}\`: ${j.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 H={schema_version:"lmctl/v3",definition_schema_version:3,name:o,version:a,...m,...p.size>0?{triggers:[...p.values()]}:{},steps:S,connections:k,entry_step_id:b(f)},J=Bt.safeParse(H);if(!J.success)throw new Gr(J.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 J.data}function gM(e){let t=null;for(let n=0;n<e.length;n+=1){let r=e[n];if(t!==null){if(r==="\\"){n+=1;continue}r===t&&(t=null);continue}if(r==='"'||r==="'"){t=r;continue}if(r==="#")return e.slice(0,n)}return e}function Fn(e,t,n){let r=e.trim();if(r.length===0)return{};if(r.startsWith("{")){let i;try{i=JSON.parse(r)}catch(o){n(t,`malformed structured args (expected a single-line JSON object): ${o.message}`)}return(i===null||typeof i!="object"||Array.isArray(i))&&n(t,"structured args must be a JSON object"),i}let s={};for(let i of yM(r)){let o=i.indexOf("=");o===-1&&n(t,`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(t,`invalid arg name: ${a}`),s[a]=Zy(l)}return s}function yM(e){return e.split(",").map(t=>t.trim()).filter(t=>t.length>0)}function Zy(e){return e.startsWith('"')&&e.endsWith('"')||e.startsWith("'")&&e.endsWith("'")?e.slice(1,-1):e==="true"?!0:e==="false"?!1:/^-?\d+$/.test(e)?Number.parseInt(e,10):/^-?\d*\.\d+$/.test(e)?Number.parseFloat(e):e}var fM,mM,Ky,Gr,_M,hM,Vy,Yy,Qy=w(()=>{"use strict";Jr();Gy();Xr();fM={"lmctl/review":{v2type:"Review",outcomes:{approve:"_"},schema:ra},"lmctl/consolidate":{v2type:"Consolidate",outcomes:{ok:"_"},schema:sa},"lmctl/interactive":{v2type:"Interactive",outcomes:{done:"_"},schema:ia},"lmctl/loop":{v2type:"Loop",outcomes:{ok:"_"},schema:oa},"lmctl/shell-step":{v2type:"ShellStep",outcomes:{},schema:aa}},mM={"lmctl/review":["coder","reviewers"],"lmctl/consolidate":["researchers","consolidator"],"lmctl/interactive":["agent"]};Ky={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"},Gr=class extends Error{issues;constructor(t){super(`composition DSL compile failed:
|
|
2137
2137
|
${t.map(n=>` line ${n.line}: ${n.message}`).join(`
|
|
2138
2138
|
`)}`),this.issues=t,this.name="DslCompileError"}},_M=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"]),hM={"lmctl/consolidate":["ok"],"lmctl/interactive":["done"],"lmctl/loop":["ok"],"lmctl/foreach":["all_ok"]},Vy=new Set(["requires","default_task_timeout_ms","errors","concurrency_key","concurrent_limit"]),Yy={"trigger-schedule":"lmctl/trigger-schedule","trigger-gh-issue":"lmctl/trigger-gh-issue"}});import{readFileSync as EM}from"node:fs";function wM(){let e=process.env.LMCTL_DSL;return e===void 0?!0:!["0","false","off"].includes(e.trim().toLowerCase())}function TM(e){for(let t of e.split(`
|
|
2139
2139
|
`)){let n=t.replace(/#.*/,"").trim();if(n.length!==0)return/^workflow\s+\S+\s+v\d+\s*$/.test(n)}return!1}function bt(e){if(typeof e=="string"&&wM()&&TM(e)){let n;try{n=zy(e)}catch(s){throw s instanceof Gr?new un(s.issues.map(i=>({path:`dsl:${i.line}`,message:i.message}))):s}let r=Bt.safeParse(n);if(!r.success)throw new un(r.error.issues.map(s=>({path:s.path.length===0?"$":s.path.map(String).join("."),message:s.message})));return r.data}let t=da(bM(e));if(SM(t)&&t.definition_schema_version===3){let n=Bt.safeParse(t);if(!n.success)throw new un(n.error.issues.map(r=>({path:r.path.length===0?"$":r.path.map(String).join("."),message:r.message})));return n.data}return vM(t)}function vM(e){let t=la.safeParse(e);if(!t.success)throw new un(t.error.issues.map(s=>({path:s.path.length===0?"$":s.path.map(String).join("."),message:s.message})));let n=t.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 un([{path:`states.${s}`,message:`v2 workflows (primitive_version: 2) may not use v1 primitive type: ${i.type}`}]);try{return By(n)}catch(s){throw s instanceof dn?new vu(s):s}}function bM(e){if(typeof e!="string")return e;let t=e.trim();return e.includes(`
|
|
@@ -2146,7 +2146,7 @@ ${r}`}function tD(e,t,n,r){let s=cr(e,Mu),i=`- [${t}.md](${t}.md)${r!==null?` \u
|
|
|
2146
2146
|
`)?`${o}
|
|
2147
2147
|
${i}
|
|
2148
2148
|
`:`${o}${i}
|
|
2149
|
-
`,Cu(s,o,"utf8")}function nD(e,t){let n=cr(e,Mu);if(!Kr(n))return;let r=ga(n,"utf8"),s=new RegExp(`^- \\[${hE(t)}\\.md\\].*$\\r?\\n?`,"m");s.test(r)&&Cu(n,r.replace(s,""),"utf8")}function hE(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function rD(e){return e==="user"||e==="feedback"||e==="project"||e==="reference"}function St(e,t){return e.durable_memory_mode==="db"?new $u(t,e.id):new Ou(e.local_path)}var QM,Mu,pE,Ou,$u,Du=w(()=>{"use strict";QM=/^[a-zA-Z0-9_-]+$/;Mu="MEMORY.md",pE="1970-01-01T00:00:00.000Z",Ou=class{dir;constructor(t){this.dir=cr(t,"durable-memory")}read(t){ft(t);let n=cr(this.dir,`${t}.md`);if(!Kr(n))return null;let r=ga(n,"utf8");return _E(t,r)}write(t){ft(t.name),YM(this.dir,{recursive:!0});let n=cr(this.dir,`${t.name}.md`),r=!Kr(n),s=eD(t.name,t.type,t.description??null,t.body);return Cu(n,s,"utf8"),tD(this.dir,t.name,t.type,t.description??null),{created:r}}index(t){return this.listFiles().filter(n=>t===void 0||t.length===0||t.includes(n.type)).map(({name:n,type:r,description:s,updated_at:i})=>({name:n,type:r,description:s,updated_at:i}))}list(t){return this.listFiles().filter(n=>t===void 0||n.type===t).map(({name:n,type:r,updated_at:s})=>({name:n,type:r,updated_at:s}))}delete(t){ft(t);let n=cr(this.dir,`${t}.md`);return Kr(n)?(ZM(n),nD(this.dir,t),!0):!1}listFiles(){if(!Kr(this.dir))return[];let t=zM(this.dir).filter(r=>r.endsWith(".md")&&r!==Mu),n=[];for(let r of t){let s=r.slice(0,-3),i=ga(cr(this.dir,r),"utf8"),o=_E(s,i);o!==null&&n.push(o)}return n.sort((r,s)=>r.name.localeCompare(s.name))}};$u=class{dal;projectId;constructor(t,n){this.dal=t,this.projectId=n}read(t){ft(t);let n=this.dal.getDurableMemoryByName(this.projectId,t);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(t){ft(t.name);let n=this.dal.getDurableMemoryByName(this.projectId,t.name);return this.dal.upsertDurableMemory({project_id:this.projectId,type:t.type,name:t.name,description:t.description??null,body:t.body}),{created:n===null}}index(t){return this.dal.indexDurableMemory(this.projectId,t).map(r=>({name:r.name,type:r.type,description:r.description,updated_at:r.updated_at}))}list(t){return this.dal.listDurableMemory(this.projectId,t).map(r=>({name:r.name,type:r.type,updated_at:r.updated_at}))}delete(t){return ft(t),this.dal.deleteDurableMemory(this.projectId,t)}}});function yE(e,t){let{dal:n}=t;e.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=St(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))}),e.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=St(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)}),e.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,d=typeof o.description=="string"?o.description:null;if(a===null||!gE.has(a))return r.json({error:`invalid type: must be one of ${[...gE].join("|")}`},400);if(l===null)return r.json({error:"missing name"},400);if(c===null)return r.json({error:"missing body"},400);let u=St(i,n),f;try{({created:f}=u.write({type:a,name:l,description:d,body:c}))}catch(m){return r.json({error:m.message},400)}return r.json({success:!0,created_or_updated:f?"created":"updated"})}),e.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=St(i,n),a=r.req.query("type");return r.json(o.list(a))})}var gE,EE=w(()=>{"use strict";Du();gE=new Set(["user","feedback","project","reference"])});function iD(e){let t=4294967295;for(let n=0;n<e.length;n+=1)t=(sD[(t^e[n])&255]^t>>>8)>>>0;return(t^4294967295)>>>0}function oD(e){let t=Math.max(1980,e.getFullYear()),n=(e.getHours()&31)<<11|(e.getMinutes()&63)<<5|Math.floor(e.getSeconds()/2)&31,r=(t-1980&127)<<9|(e.getMonth()+1&15)<<5|e.getDate()&31;return{time:n,date:r}}function wE(e,t=new Date){let{time:n,date:r}=oD(t),s=[],i=[],o=0,a=new TextEncoder;for(let _ of e){let h=a.encode(_.name),g=iD(_.data),E=_.data.length,y=new Uint8Array(30+h.length),b=new DataView(y.buffer);b.setUint32(0,67324752,!0),b.setUint16(4,20,!0),b.setUint16(6,0,!0),b.setUint16(8,0,!0),b.setUint16(10,n,!0),b.setUint16(12,r,!0),b.setUint32(14,g,!0),b.setUint32(18,E,!0),b.setUint32(22,E,!0),b.setUint16(26,h.length,!0),b.setUint16(28,0,!0),y.set(h,30),s.push(y,_.data);let S=new Uint8Array(46+h.length),k=new DataView(S.buffer);k.setUint32(0,33639248,!0),k.setUint16(4,20,!0),k.setUint16(6,20,!0),k.setUint16(8,0,!0),k.setUint16(10,0,!0),k.setUint16(12,n,!0),k.setUint16(14,r,!0),k.setUint32(16,g,!0),k.setUint32(20,E,!0),k.setUint32(24,E,!0),k.setUint16(28,h.length,!0),k.setUint16(30,0,!0),k.setUint16(32,0,!0),k.setUint16(34,0,!0),k.setUint16(36,0,!0),k.setUint32(38,0,!0),k.setUint32(42,o,!0),S.set(h,46),i.push(S),o+=y.length+_.data.length}let l=o,c=0;for(let _ of i)c+=_.length;let d=new Uint8Array(22),u=new DataView(d.buffer);u.setUint32(0,101010256,!0),u.setUint16(4,0,!0),u.setUint16(6,0,!0),u.setUint16(8,e.length,!0),u.setUint16(10,e.length,!0),u.setUint32(12,c,!0),u.setUint32(16,l,!0),u.setUint16(20,0,!0);let f=l+c+d.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(d,p),m}var sD,TE=w(()=>{"use strict";sD=(()=>{let e=new Uint32Array(256);for(let t=0;t<256;t+=1){let n=t;for(let r=0;r<8;r+=1)n=n&1?3988292384^n>>>1:n>>>1;e[t]=n>>>0}return e})()});import{existsSync as wa,mkdirSync as aD,readdirSync as lD,readFileSync as SE,statSync as cD,unlinkSync as dD,writeFileSync as uD}from"node:fs";import{join as ri}from"node:path";function kE(e,t){let{dal:n}=t;e.post("/api/projects",async r=>{let s=await kt(r);if(typeof s=="string")return L(r,s,400);let i=_e(s,"name"),o=_e(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=_e(s,"workflow_name")??"bugfix",l,c=_e(s,"team_name");if(c!==null&&c.length>0){let u=n.findTeamByName(c);if(u===null)return L(r,`team not found: ${c}`,404);l=u.id}else{let u=n.listTeams();if(u.length===0)return L(r,"no teams exist; create a team first",400);l=u[0].id}let d=n.insertProject({name:i,local_path:o,workflow_name:a,team_id:l,default_branch:_e(s,"default_branch")});return r.json(d,201)}),e.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)}),e.post("/api/teams",async r=>{let s=await kt(r);if(typeof s=="string")return L(r,s,400);let i=_e(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)}),e.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=_e(i,"alias"),a=_e(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=_e(i,"model"),c=n.insertTeamMember({team_id:s.id,alias:o,provider:a,model:l,sessiondir:`.lmctl/sessions/${s.name}/${o}`}),d=_e(i,"role_prompt");d!==null&&n.setMemberRolePrompt(c.id,d);let u=n.findTeamMemberByAlias(s.id,o);return r.json(u??c,201)}),e.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)}),e.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=St(s,n);return r.json(i.index())}),e.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=_e(i,"name"),a=_e(i,"body"),l=_e(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||!ya.includes(l))return L(r,`invalid type: must be one of ${ya.join("|")}`,400);try{ft(o)}catch(u){return L(r,u.message,400)}let c=St(s,n);try{if(c.read(o)!==null)return L(r,`chapter already exists: ${o}`,409)}catch(u){return L(r,u.message,400)}try{c.write({type:l,name:o,description:_e(i,"description"),body:a})}catch(u){return L(r,u.message,400)}let d=c.read(o);return d===null?L(r,"chapter created but unreadable",500):r.json(d,201)}),e.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=St(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)}),e.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=St(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=_e(o,"body")??l.body,d=Object.prototype.hasOwnProperty.call(o,"description")?_e(o,"description"):l.description,u=_e(o,"type")??l.type;if(!ya.includes(u))return L(r,`invalid type: must be one of ${ya.join("|")}`,400);try{a.write({type:u,name:i,description:d,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)}),e.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=St(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)}),e.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(mD(s.local_path))}),e.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=_e(i,"name"),a=_e(i,"body"),l=_e(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||!Ea.has(l))return L(r,`invalid type: must be one of ${[...Ea].join("|")}`,400);try{ft(o)}catch(f){return L(r,f.message,400)}let c=ti(s.local_path),d=ri(c,`${o}.md`);if(wa(d))return L(r,`chapter already exists: ${o}`,409);aD(c,{recursive:!0}),bE(d,o,l,_e(i,"description"),a);let u=ni(c,o);return u===null?L(r,"chapter created but unreadable",500):r.json(u,201)}),e.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{ft(r.req.param("chapter"))}catch(o){return L(r,o.message,400)}let i=ni(ti(s.local_path),r.req.param("chapter"));return i===null?L(r,"chapter not found",404):r.json(i)}),e.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{ft(i)}catch(m){return L(r,m.message,400)}let o=ti(s.local_path),a=ni(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=_e(l,"body")??a.body,d=Object.prototype.hasOwnProperty.call(l,"description")?_e(l,"description"):a.description,u=_e(l,"type")??a.type;if(!Ea.has(u))return L(r,`invalid type: must be one of ${[...Ea].join("|")}`,400);bE(ri(o,`${i}.md`),i,u,d,c);let f=ni(o,i);return f===null?L(r,"chapter updated but unreadable",500):r.json(f)}),e.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{ft(i)}catch(a){return L(r,a.message,400)}let o=ri(ti(s.local_path),`${i}.md`);return wa(o)?(dD(o),r.json({removed:!0})):L(r,"chapter not found",404)}),e.get("/api/tokens",r=>r.json([])),e.post("/api/tokens",r=>L(r,"scoped-tokens table not yet migrated; see briefs/scoped-tokens-design.md",501)),e.get("/api/settings",r=>r.json({})),e.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"})}),e.get("/api/chat/sessions",r=>r.json(n.listChatbotSessions(vE))),e.post("/api/chat/sessions",async r=>{let s=await fD(r);if(typeof s=="string")return L(r,s,400);let i=s!==null?_e(s,"title"):null,o=n.createChatbotSession(vE,i);return r.json(o,201)}),e.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))}),e.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=_e(i,"role"),a=_e(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)}),e.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=or(n,s),a=[];for(let c of o){let d=_D(c),u=null;if(c.content!==null&&c.content!==void 0)u=new TextEncoder().encode(c.content);else if(c.path!==null&&c.path!==void 0)try{let f=SE(c.path),m=f.buffer.slice(f.byteOffset,f.byteOffset+f.byteLength);u=new Uint8Array(m)}catch{u=new Uint8Array(0)}u!==null&&a.push({name:d,data:u})}let l=wE(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(e,t,n){return e.json({error:t},n)}async function kt(e){try{let t=await e.req.json();return t!==null&&typeof t=="object"&&!Array.isArray(t)?t:"invalid JSON body"}catch{return"invalid JSON body"}}async function fD(e){let t=await e.req.text().catch(()=>"");if(t.trim().length===0)return null;try{let n=JSON.parse(t);return n!==null&&typeof n=="object"&&!Array.isArray(n)?n:"invalid JSON body"}catch{return"invalid JSON body"}}function _e(e,t){let n=e[t];return typeof n!="string"?null:n}function ti(e){return ri(e,"ai-test")}function ni(e,t){let n=ri(e,`${t}.md`);if(!wa(n))return null;let r=SE(n,"utf8"),s=pD(r),i=cD(n).mtime.toISOString();return{name:t,type:s.type,description:s.description,body:s.body,updated_at:i}}function mD(e){let t=ti(e);return wa(t)?lD(t).filter(n=>n.endsWith(".md")&&n!=="index.md").map(n=>n.slice(0,-3)).sort().map(n=>{let r=ni(t,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 bE(e,t,n,r,s){let i=r!==null&&r.length>0?`
|
|
2149
|
+
`,Cu(s,o,"utf8")}function nD(e,t){let n=cr(e,Mu);if(!Kr(n))return;let r=ga(n,"utf8"),s=new RegExp(`^- \\[${hE(t)}\\.md\\].*$\\r?\\n?`,"m");s.test(r)&&Cu(n,r.replace(s,""),"utf8")}function hE(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function rD(e){return e==="user"||e==="feedback"||e==="project"||e==="reference"}function St(e,t){return e.durable_memory_mode==="db"?new $u(t,e.id):new Ou(e.local_path)}var QM,Mu,pE,Ou,$u,Du=w(()=>{"use strict";QM=/^[a-zA-Z0-9_-]+$/;Mu="MEMORY.md",pE="1970-01-01T00:00:00.000Z",Ou=class{dir;constructor(t){this.dir=cr(t,"durable-memory")}read(t){ft(t);let n=cr(this.dir,`${t}.md`);if(!Kr(n))return null;let r=ga(n,"utf8");return _E(t,r)}write(t){ft(t.name),YM(this.dir,{recursive:!0});let n=cr(this.dir,`${t.name}.md`),r=!Kr(n),s=eD(t.name,t.type,t.description??null,t.body);return Cu(n,s,"utf8"),tD(this.dir,t.name,t.type,t.description??null),{created:r}}index(t){return this.listFiles().filter(n=>t===void 0||t.length===0||t.includes(n.type)).map(({name:n,type:r,description:s,updated_at:i})=>({name:n,type:r,description:s,updated_at:i}))}list(t){return this.listFiles().filter(n=>t===void 0||n.type===t).map(({name:n,type:r,updated_at:s})=>({name:n,type:r,updated_at:s}))}delete(t){ft(t);let n=cr(this.dir,`${t}.md`);return Kr(n)?(ZM(n),nD(this.dir,t),!0):!1}listFiles(){if(!Kr(this.dir))return[];let t=zM(this.dir).filter(r=>r.endsWith(".md")&&r!==Mu),n=[];for(let r of t){let s=r.slice(0,-3),i=ga(cr(this.dir,r),"utf8"),o=_E(s,i);o!==null&&n.push(o)}return n.sort((r,s)=>r.name.localeCompare(s.name))}};$u=class{dal;projectId;constructor(t,n){this.dal=t,this.projectId=n}read(t){ft(t);let n=this.dal.getDurableMemoryByName(this.projectId,t);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(t){ft(t.name);let n=this.dal.getDurableMemoryByName(this.projectId,t.name);return this.dal.upsertDurableMemory({project_id:this.projectId,type:t.type,name:t.name,description:t.description??null,body:t.body}),{created:n===null}}index(t){return this.dal.indexDurableMemory(this.projectId,t).map(r=>({name:r.name,type:r.type,description:r.description,updated_at:r.updated_at}))}list(t){return this.dal.listDurableMemory(this.projectId,t).map(r=>({name:r.name,type:r.type,updated_at:r.updated_at}))}delete(t){return ft(t),this.dal.deleteDurableMemory(this.projectId,t)}}});function yE(e,t){let{dal:n}=t;e.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=St(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))}),e.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=St(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)}),e.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,d=typeof o.description=="string"?o.description:null;if(a===null||!gE.has(a))return r.json({error:`invalid type: must be one of ${[...gE].join("|")}`},400);if(l===null)return r.json({error:"missing name"},400);if(c===null)return r.json({error:"missing body"},400);let u=St(i,n),f;try{({created:f}=u.write({type:a,name:l,description:d,body:c}))}catch(m){return r.json({error:m.message},400)}return r.json({success:!0,created_or_updated:f?"created":"updated"})}),e.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=St(i,n),a=r.req.query("type");return r.json(o.list(a))})}var gE,EE=w(()=>{"use strict";Du();gE=new Set(["user","feedback","project","reference"])});function iD(e){let t=4294967295;for(let n=0;n<e.length;n+=1)t=(sD[(t^e[n])&255]^t>>>8)>>>0;return(t^4294967295)>>>0}function oD(e){let t=Math.max(1980,e.getFullYear()),n=(e.getHours()&31)<<11|(e.getMinutes()&63)<<5|Math.floor(e.getSeconds()/2)&31,r=(t-1980&127)<<9|(e.getMonth()+1&15)<<5|e.getDate()&31;return{time:n,date:r}}function wE(e,t=new Date){let{time:n,date:r}=oD(t),s=[],i=[],o=0,a=new TextEncoder;for(let _ of e){let h=a.encode(_.name),g=iD(_.data),y=_.data.length,E=new Uint8Array(30+h.length),b=new DataView(E.buffer);b.setUint32(0,67324752,!0),b.setUint16(4,20,!0),b.setUint16(6,0,!0),b.setUint16(8,0,!0),b.setUint16(10,n,!0),b.setUint16(12,r,!0),b.setUint32(14,g,!0),b.setUint32(18,y,!0),b.setUint32(22,y,!0),b.setUint16(26,h.length,!0),b.setUint16(28,0,!0),E.set(h,30),s.push(E,_.data);let S=new Uint8Array(46+h.length),k=new DataView(S.buffer);k.setUint32(0,33639248,!0),k.setUint16(4,20,!0),k.setUint16(6,20,!0),k.setUint16(8,0,!0),k.setUint16(10,0,!0),k.setUint16(12,n,!0),k.setUint16(14,r,!0),k.setUint32(16,g,!0),k.setUint32(20,y,!0),k.setUint32(24,y,!0),k.setUint16(28,h.length,!0),k.setUint16(30,0,!0),k.setUint16(32,0,!0),k.setUint16(34,0,!0),k.setUint16(36,0,!0),k.setUint32(38,0,!0),k.setUint32(42,o,!0),S.set(h,46),i.push(S),o+=E.length+_.data.length}let l=o,c=0;for(let _ of i)c+=_.length;let d=new Uint8Array(22),u=new DataView(d.buffer);u.setUint32(0,101010256,!0),u.setUint16(4,0,!0),u.setUint16(6,0,!0),u.setUint16(8,e.length,!0),u.setUint16(10,e.length,!0),u.setUint32(12,c,!0),u.setUint32(16,l,!0),u.setUint16(20,0,!0);let f=l+c+d.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(d,p),m}var sD,TE=w(()=>{"use strict";sD=(()=>{let e=new Uint32Array(256);for(let t=0;t<256;t+=1){let n=t;for(let r=0;r<8;r+=1)n=n&1?3988292384^n>>>1:n>>>1;e[t]=n>>>0}return e})()});import{existsSync as wa,mkdirSync as aD,readdirSync as lD,readFileSync as SE,statSync as cD,unlinkSync as dD,writeFileSync as uD}from"node:fs";import{join as ri}from"node:path";function kE(e,t){let{dal:n}=t;e.post("/api/projects",async r=>{let s=await kt(r);if(typeof s=="string")return L(r,s,400);let i=_e(s,"name"),o=_e(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=_e(s,"workflow_name")??"bugfix",l,c=_e(s,"team_name");if(c!==null&&c.length>0){let u=n.findTeamByName(c);if(u===null)return L(r,`team not found: ${c}`,404);l=u.id}else{let u=n.listTeams();if(u.length===0)return L(r,"no teams exist; create a team first",400);l=u[0].id}let d=n.insertProject({name:i,local_path:o,workflow_name:a,team_id:l,default_branch:_e(s,"default_branch")});return r.json(d,201)}),e.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)}),e.post("/api/teams",async r=>{let s=await kt(r);if(typeof s=="string")return L(r,s,400);let i=_e(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)}),e.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=_e(i,"alias"),a=_e(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=_e(i,"model"),c=n.insertTeamMember({team_id:s.id,alias:o,provider:a,model:l,sessiondir:`.lmctl/sessions/${s.name}/${o}`}),d=_e(i,"role_prompt");d!==null&&n.setMemberRolePrompt(c.id,d);let u=n.findTeamMemberByAlias(s.id,o);return r.json(u??c,201)}),e.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)}),e.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=St(s,n);return r.json(i.index())}),e.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=_e(i,"name"),a=_e(i,"body"),l=_e(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||!ya.includes(l))return L(r,`invalid type: must be one of ${ya.join("|")}`,400);try{ft(o)}catch(u){return L(r,u.message,400)}let c=St(s,n);try{if(c.read(o)!==null)return L(r,`chapter already exists: ${o}`,409)}catch(u){return L(r,u.message,400)}try{c.write({type:l,name:o,description:_e(i,"description"),body:a})}catch(u){return L(r,u.message,400)}let d=c.read(o);return d===null?L(r,"chapter created but unreadable",500):r.json(d,201)}),e.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=St(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)}),e.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=St(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=_e(o,"body")??l.body,d=Object.prototype.hasOwnProperty.call(o,"description")?_e(o,"description"):l.description,u=_e(o,"type")??l.type;if(!ya.includes(u))return L(r,`invalid type: must be one of ${ya.join("|")}`,400);try{a.write({type:u,name:i,description:d,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)}),e.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=St(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)}),e.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(mD(s.local_path))}),e.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=_e(i,"name"),a=_e(i,"body"),l=_e(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||!Ea.has(l))return L(r,`invalid type: must be one of ${[...Ea].join("|")}`,400);try{ft(o)}catch(f){return L(r,f.message,400)}let c=ti(s.local_path),d=ri(c,`${o}.md`);if(wa(d))return L(r,`chapter already exists: ${o}`,409);aD(c,{recursive:!0}),bE(d,o,l,_e(i,"description"),a);let u=ni(c,o);return u===null?L(r,"chapter created but unreadable",500):r.json(u,201)}),e.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{ft(r.req.param("chapter"))}catch(o){return L(r,o.message,400)}let i=ni(ti(s.local_path),r.req.param("chapter"));return i===null?L(r,"chapter not found",404):r.json(i)}),e.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{ft(i)}catch(m){return L(r,m.message,400)}let o=ti(s.local_path),a=ni(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=_e(l,"body")??a.body,d=Object.prototype.hasOwnProperty.call(l,"description")?_e(l,"description"):a.description,u=_e(l,"type")??a.type;if(!Ea.has(u))return L(r,`invalid type: must be one of ${[...Ea].join("|")}`,400);bE(ri(o,`${i}.md`),i,u,d,c);let f=ni(o,i);return f===null?L(r,"chapter updated but unreadable",500):r.json(f)}),e.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{ft(i)}catch(a){return L(r,a.message,400)}let o=ri(ti(s.local_path),`${i}.md`);return wa(o)?(dD(o),r.json({removed:!0})):L(r,"chapter not found",404)}),e.get("/api/tokens",r=>r.json([])),e.post("/api/tokens",r=>L(r,"scoped-tokens table not yet migrated; see briefs/scoped-tokens-design.md",501)),e.get("/api/settings",r=>r.json({})),e.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"})}),e.get("/api/chat/sessions",r=>r.json(n.listChatbotSessions(vE))),e.post("/api/chat/sessions",async r=>{let s=await fD(r);if(typeof s=="string")return L(r,s,400);let i=s!==null?_e(s,"title"):null,o=n.createChatbotSession(vE,i);return r.json(o,201)}),e.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))}),e.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=_e(i,"role"),a=_e(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)}),e.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=or(n,s),a=[];for(let c of o){let d=_D(c),u=null;if(c.content!==null&&c.content!==void 0)u=new TextEncoder().encode(c.content);else if(c.path!==null&&c.path!==void 0)try{let f=SE(c.path),m=f.buffer.slice(f.byteOffset,f.byteOffset+f.byteLength);u=new Uint8Array(m)}catch{u=new Uint8Array(0)}u!==null&&a.push({name:d,data:u})}let l=wE(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(e,t,n){return e.json({error:t},n)}async function kt(e){try{let t=await e.req.json();return t!==null&&typeof t=="object"&&!Array.isArray(t)?t:"invalid JSON body"}catch{return"invalid JSON body"}}async function fD(e){let t=await e.req.text().catch(()=>"");if(t.trim().length===0)return null;try{let n=JSON.parse(t);return n!==null&&typeof n=="object"&&!Array.isArray(n)?n:"invalid JSON body"}catch{return"invalid JSON body"}}function _e(e,t){let n=e[t];return typeof n!="string"?null:n}function ti(e){return ri(e,"ai-test")}function ni(e,t){let n=ri(e,`${t}.md`);if(!wa(n))return null;let r=SE(n,"utf8"),s=pD(r),i=cD(n).mtime.toISOString();return{name:t,type:s.type,description:s.description,body:s.body,updated_at:i}}function mD(e){let t=ti(e);return wa(t)?lD(t).filter(n=>n.endsWith(".md")&&n!=="index.md").map(n=>n.slice(0,-3)).sort().map(n=>{let r=ni(t,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 bE(e,t,n,r,s){let i=r!==null&&r.length>0?`
|
|
2150
2150
|
description: ${r}`:"",o=`---
|
|
2151
2151
|
name: ${t}${i}
|
|
2152
2152
|
type: ${n}
|
|
@@ -2217,13 +2217,13 @@ ${s}`;uD(e,o,"utf8")}function pD(e){let t=e.match(/^---\r?\n([\s\S]*?)\r?\n---\r
|
|
|
2217
2217
|
JOIN step s ON s.id = sa.step_id
|
|
2218
2218
|
WHERE s.run_id = ? AND sa.kind = 'run_report' LIMIT 1`,e).length>0)return;let r=t.getRun(e);if(r===null)return;let s=t.query("SELECT id FROM step WHERE run_id = ? ORDER BY id DESC LIMIT 1",e);if(s.length===0)return;let i=s[0].id,o=t.query("SELECT id, state_name, outcome, started_at, ended_at FROM step WHERE run_id = ? ORDER BY id ASC",e),a=t.query(`SELECT sa.id, sa.step_id, sa.kind FROM step_artifact sa
|
|
2219
2219
|
JOIN step s ON s.id = sa.step_id
|
|
2220
|
-
WHERE s.run_id = ? ORDER BY sa.id ASC`,e),l=new Map;for(let x of a){let H=l.get(x.step_id)??[];H.push({kind:x.kind,id:x.id}),l.set(x.step_id,H)}let c=o.map(x=>({id:x.id,state_name:x.state_name,outcome:x.outcome,duration_ms:x.started_at!==null&&x.ended_at!==null?Math.max(0,new Date(x.ended_at).getTime()-new Date(x.started_at).getTime()):null,artifacts:l.get(x.id)??[]})),d=t.query("SELECT kind, COUNT(*) AS count FROM session_event WHERE run_id = ? GROUP BY kind",e),u=t.query("SELECT payload FROM session_event WHERE run_id = ? AND kind = 'tool_result' AND payload_truncated = 0",e),f=0;for(let x of u)try{let H=JSON.parse(x.payload);typeof H.elapsedMs=="number"&&H.elapsedMs>0&&(f+=H.elapsedMs)}catch{}let m=d.map(x=>({kind:x.kind,count:x.count,total_elapsed_ms:x.kind==="tool_result"?f:0})),p=c.filter(x=>x.outcome==="request_changes"),_=[...new Set(p.map(x=>x.state_name))],h=new Date(r.started_at).getTime(),g=r.ended_at!==null?new Date(r.ended_at).getTime():Date.now(),
|
|
2221
|
-
WHERE project_id = ? AND detected_at >= ? AND detected_at <= ? ORDER BY detected_at ASC`,
|
|
2220
|
+
WHERE s.run_id = ? ORDER BY sa.id ASC`,e),l=new Map;for(let x of a){let H=l.get(x.step_id)??[];H.push({kind:x.kind,id:x.id}),l.set(x.step_id,H)}let c=o.map(x=>({id:x.id,state_name:x.state_name,outcome:x.outcome,duration_ms:x.started_at!==null&&x.ended_at!==null?Math.max(0,new Date(x.ended_at).getTime()-new Date(x.started_at).getTime()):null,artifacts:l.get(x.id)??[]})),d=t.query("SELECT kind, COUNT(*) AS count FROM session_event WHERE run_id = ? GROUP BY kind",e),u=t.query("SELECT payload FROM session_event WHERE run_id = ? AND kind = 'tool_result' AND payload_truncated = 0",e),f=0;for(let x of u)try{let H=JSON.parse(x.payload);typeof H.elapsedMs=="number"&&H.elapsedMs>0&&(f+=H.elapsedMs)}catch{}let m=d.map(x=>({kind:x.kind,count:x.count,total_elapsed_ms:x.kind==="tool_result"?f:0})),p=c.filter(x=>x.outcome==="request_changes"),_=[...new Set(p.map(x=>x.state_name))],h=new Date(r.started_at).getTime(),g=r.ended_at!==null?new Date(r.ended_at).getTime():Date.now(),E=t.query("SELECT project_id FROM job WHERE id = ?",r.job_id)[0]?.project_id??null,b=E!==null?t.query(`SELECT id, signal_kind, severity, description, detected_at FROM drift_signal
|
|
2221
|
+
WHERE project_id = ? AND detected_at >= ? AND detected_at <= ? ORDER BY detected_at ASC`,E,h,g):[],k=t.query(`SELECT SUM(input_tokens) AS input, SUM(output_tokens) AS output
|
|
2222
2222
|
FROM session_size WHERE observed_at >= ? AND observed_at <= ?`,r.started_at,r.ended_at??new Date().toISOString())[0],F=k?.input!==null&&k?.input!==void 0?`input: ${k.input}, output: ${k.output??0}`:"n/a",P=t.getWorkflow(r.workflow_id),D=r.started_at!==null&&r.ended_at!==null?Math.max(0,new Date(r.ended_at).getTime()-new Date(r.started_at).getTime()):null,U={run_id:e,workflow_name:P?.name??null,started_at:r.started_at,ended_at:r.ended_at,terminal_state:r.terminal_state,duration_ms:D,steps:c,tool_stats:m,reviewer_interventions:{count:p.length,state_names:_},drift_signals:b,token_totals:F};t.insertStepArtifact({step_id:i,kind:"run_report",content:JSON.stringify(U)})}var ME=w(()=>{"use strict"});import{spawnSync as jE}from"node:child_process";function Bu(e){return OD[e]??`no install hint; ensure '${e}' is on PATH`}function $D(e){switch(e){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 DE(e){return jE("which",[e],{encoding:"utf8"}).status===0}function PE(e){if(e===void 0)return null;for(let t of e.tools??[])if(!DE(t)){let n=Bu(t);return{kind:"missing_tool",tool:t,install_hint:n,message:`missing dependency: ${t}; ${n}`}}for(let t of e.auth??[]){if(!DE(t)){let s=Bu(t);return{kind:"missing_tool",tool:t,install_hint:s,message:`missing dependency: ${t}; ${s}`}}let n=$D(t);if(n===null)continue;let r=jE(t,n.args,{encoding:"utf8"});if(r.status!==0){let s=typeof r.stderr=="string"?r.stderr.trim():"";return{kind:"auth_failed",tool:t,install_hint:Bu(t),message:`${t} not authenticated; run \`${t} login\` or equivalent`,detail:s.length>0?s:void 0}}}return null}var OD,FE=w(()=>{"use strict";OD={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 CD,readdirSync as MD,readFileSync as DD}from"node:fs";import{join as UE}from"node:path";function jD(e){let t=e.match(/^---\n([\s\S]*?)\n---/);if(!t)return[];let n=t[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(`
|
|
2223
2223
|
`).map(i=>i.replace(/^\s*-\s+/,"").trim()).filter(Boolean):[]}function WE(e,t){let n=e.match(/^---\n([\s\S]*?)\n---/);if(!n)return null;let s=n[1].match(new RegExp(`^${t}:\\s*(.+)$`,"m"));return s?s[1].trim():null}function qE(e,t){if(t.length===0)return null;let n=UE(e,"durable-memory");if(!CD(n))return null;let r;try{r=MD(n).filter(i=>i.endsWith(".md")&&i!=="index.md")}catch{return null}let s=[];for(let i of r)try{let o=DD(UE(n,i),"utf8");if(jD(o).some(l=>t.includes(l))){let l=WE(o,"name")??i.replace(".md",""),c=WE(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 BE=w(()=>{"use strict"});function Ju(e){let t=e.trim().replace(PD,"").trim();for(let n=0;n<4;n+=1){let r=FD.exec(t);if(r===null)break;t=r[2].trim()}return t}function HE(e){let t=e.trim(),n=UD.exec(t);if(n!==null)return n[2];let r=WD.exec(t);return r!==null?r[0]:null}function oi(e,t){let n=e.split(`
|
|
2224
2224
|
`),r=null,s=-1;for(let o=0;o<n.length;o+=1){let a=Ju(n[o]),l=Hu.exec(a);if(l===null)continue;let c=l[1].trim();if(Xu.test(c))continue;let d=HE(c);d!==null&&(r=d,s=o)}if(r===null)return{outcome:null,reason:"no_stance"};if(!t.includes(r))return{outcome:null,reason:"unknown_outcome",actual:r};let i={};for(let o=s-1;o>=0;o-=1){let a=Ju(n[o]),l=Hu.exec(a);if(l===null)break;let c=Xu.exec(l[1].trim());if(c===null)break;i[c[1]]=c[2].trim()}return{outcome:r,evidence:i}}function XE(e){let t=e.split(`
|
|
2225
2225
|
`),n=null;for(let r=0;r<t.length;r+=1){let s=Ju(t[r]),i=Hu.exec(s);if(i===null)continue;let o=i[1].trim();if(Xu.test(o))continue;let a=HE(o);if(a===null||!Lr(a))continue;let c=o.slice(o.indexOf(a)+a.length).replace(/^[`*_:\s\-–—]+/,"").trim();n={token:a,reason:c}}return n}var PD,FD,Hu,Xu,UD,WD,Gu=w(()=>{"use strict";$s();PD=/^#{1,6}\s+/,FD=/^(```|\*\*|__|`|\*|_)([\s\S]+?)\1$/,Hu=/^STANCE:\s+(.+)$/,Xu=/^([A-Z][A-Z0-9_]*):\s*(.+)$/,UD=/^(```|\*\*|__|`|\*|_)([A-Za-z0-9_-]+)\1/,WD=/^[A-Za-z0-9_-]+/});function JE(e,t,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){e.insertSessionEvent({run_id:t,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 d=e.insertStepArtifact({step_id:s,kind:"session_event_overflow",content:o});e.insertSessionEvent({run_id:t,step_id:s,kind:r.kind,timestamp_ms:i,payload:c,payload_truncated:1,overflow_artifact_id:d.id})}else e.insertSessionEvent({run_id:t,step_id:null,kind:r.kind,timestamp_ms:i,payload:c,payload_truncated:1,overflow_artifact_id:null})}}var GE=w(()=>{"use strict"});import{readFileSync as qD}from"node:fs";import{dirname as BD,join as HD}from"node:path";import{fileURLToPath as XD}from"node:url";function KD(e){return e.rules.map(t=>({command:t.command,subcommands:t.argv_patterns.map(n=>n.trim().split(/\s+/)),kind:t.kind}))}function ZD(e){let t=[],n=[];for(let r of e)JD.has(r)?(n.length>0&&t.push(n),n=[]):n.push(r);return n.length>0&&t.push(n),t}function QD(e,t){if(e.length===0)return{matched:!1};let n=0;for(;n<e.length&&GD.test(e[n]);)n+=1;if(n>=e.length)return{matched:!1};let r=e[n],s=e.slice(n+1);for(let i of t)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 ej(e,t){if(e.length===0)return{matched:!1};let n=ZD(e);for(let r of n){let s=QD(r,t);if(s.matched)return s}return{matched:!1}}function Ku(e){return ej(e,zD)}function tj(e){return e.replace(/&&/g," && ").replace(/\|\|/g," || ").replace(/;/g," ; ").replace(/\|/g," | ").replace(/(?<!\d)>{1,2}/g,t=>` ${t} `).replace(/(?<!\d)<{1,2}/g,t=>` ${t} `).replace(/\s+/g," ").trim()}function Vu(e){return tj(e).split(" ").filter(t=>t.length>0)}var JD,GD,VD,YD,zD,KE=w(()=>{"use strict";JD=new Set(["&&","||",";","|",">",">>","<","<<"]),GD=/^[A-Za-z_][A-Za-z0-9_]*=/;VD=BD(XD(import.meta.url)),YD=JSON.parse(qD(HD(VD,"side_effect_classifier.json"),"utf-8")),zD=KD(YD)});function Sa(e){return{context:{outcomes:e.outcomes,inputs:e.inputs,item:e.iteration?.item,index:e.iteration?.index},outcomes:e.outcomes,inputs:e.inputs,item:e.iteration?.item,index:e.iteration?.index}}async function VE(e,t){try{return await lr(Yu(e)??e,Sa(t))===!0}catch{return!1}}async function ka(e,t){try{return await lr(Yu(e)??e,Sa(t))}catch{return}}async function YE(e,t){if(typeof e!="string")return e;let n=Yu(e);if(n===null)return e;try{return await lr(n,Sa(t))}catch{return}}async function zE(e,t){let n=Array.from(e.matchAll(/=\{\{([\s\S]*?)\}\}/g));if(n.length===0)return e;let r="",s=0;for(let i of n){let o=i.index??0;r+=e.slice(s,o);let a=i[1]?.trim()??"";try{r+=nj(await lr(a,Sa(t)))}catch{r+=""}s=o+i[0].length}return r+=e.slice(s),r}function Yu(e){let t=e.trim();return!t.startsWith("={{")||!t.endsWith("}}")?null:t.slice(3,-2).trim()}function nj(e){return e==null?"":typeof e=="string"?e:JSON.stringify(e)}var ai=w(()=>{"use strict";Zs()});import{existsSync as ZE,readdirSync as QE,readFileSync as rj,statSync as ew}from"node:fs";import{join as Na}from"node:path";function tw(e,t,n,r){return Object.assign(e,{stateId:t,state:n,displayName:r})}function K(e,t){return e.dal.insertStep({...t,parent_step_id:e.parent_step_id})}function V(e,t){return t.startsWith("@terminal:")?{kind:"terminal",terminal:t.slice(10)}:e.states[t]===void 0?{kind:"escalate",token:t,reason:`unknown state ref '${t}'`}:{kind:"state",state:t}}function mt(e,t,n,r,s={}){let i=M(),o=K(e,{run_id:e.run_id,state_name:t.name});e.steps_executed+=1,e.dal.finishStep(o.id,null,`escalation:${r}`.slice(0,480)),e.dal.setRunPausedState(e.run_id,`${li}${t.id}`,i);let a=e.dal.getRun(e.run_id),l=Lr(n)?"generic":"unhandled";return e.dal.raiseAttention({kind:io,severity:"attn",project_id:e.project.id,run_id:e.run_id,requires_user:!0,payload:JSON.stringify({run_id:e.run_id,step_id:o.id,project_id:e.project.id,workflow_name:e.workflow.name,workflow_version_id:a?.workflow_version_id??null,step:{id:t.id,name:t.name,type:t.type},tier:l,token:n,reason:r,declared_outcomes:[...s.declared_outcomes??[]],agent_output:sj(s.agent_output??r),paused_at:i,created_at:i})}),e.dal.pauseJob(e.job.id),{kind:"paused"}}function sj(e){return e.length>8e3?`${e.slice(0,8e3)}
|
|
2226
|
-
\u2026[truncated ${e.length-8e3} chars]`:e}function Z(e,t,n,r){e.outcomes[t]=r,n!==t&&(e.outcomes[n]=r)}function ee(e){return e.terminals.aborted?.kind==="failure"?"aborted":Object.entries(e.terminals).find(([,n])=>n.kind==="failure")?.[0]??Object.keys(e.terminals)[0]??"aborted"}function nw(e,t){let n=t.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=Un(e.job.payload)?.[r];if(Array.isArray(i)&&i.every(o=>typeof o=="string"))return i}return null}async function ot(e,t,n){let r=e.replace(/(?<!=)\{\{\s*([a-zA-Z0-9_.]+)\s*\}\}/g,(s,i)=>{if(i==="run_id")return String(t.run_id);if(i==="state_id")return n;if(i==="item")return t.iteration?.item??"";if(i==="index")return t.iteration===null?"":String(t.iteration.index);if(i.startsWith("project.")){let o=i.slice(8);if(o==="id")return String(t.project.id);if(o==="name")return t.project.name;if(o==="local_path")return t.project.local_path;if(o==="default_branch")return t.project.default_branch??"";if(o==="owner"){let a=t.project.name.indexOf("/");return a>0?t.project.name.slice(0,a):""}if(o==="repo"){let a=t.project.name.indexOf("/");return a>0?t.project.name.slice(a+1):t.project.name}if(o==="test_command"){let a=t.project.test_command;return a===null||a===""?"npm test":a}return""}if(i==="job_payload"){let o=Un(t.job.payload);return o===null?"":JSON.stringify(o)}if(i.startsWith("job_payload.")){let o=i.slice(12),l=Un(t.job.payload)?.[o];return l==null?"":String(l)}if(i.startsWith("outcomes.")){let o=ij(t.outcomes,i.slice(9));return o==null?"":typeof o=="string"?o:JSON.stringify(o)}return""});return zE(r,t)}function ij(e,t){let n=e;for(let r of t.split(".")){if(n===null||typeof n!="object"||Array.isArray(n))return;n=n[r]}return n}function Un(e){if(e===null)return null;try{let t=JSON.parse(e);return t!==null&&typeof t=="object"&&!Array.isArray(t)?t:null}catch{return null}}async function ci(e){let{context:t,stateId:n,member:r,prompt:s,stepId:i,timeoutMs:o,writesToProjectPath:a}=e,l=JE(t.dal,t.run_id,()=>i),c=zu(t,n),d={violation:null},u=
|
|
2226
|
+
\u2026[truncated ${e.length-8e3} chars]`:e}function Z(e,t,n,r){e.outcomes[t]=r,n!==t&&(e.outcomes[n]=r)}function ee(e){return e.terminals.aborted?.kind==="failure"?"aborted":Object.entries(e.terminals).find(([,n])=>n.kind==="failure")?.[0]??Object.keys(e.terminals)[0]??"aborted"}function nw(e,t){let n=t.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=Un(e.job.payload)?.[r];if(Array.isArray(i)&&i.every(o=>typeof o=="string"))return i}return null}async function ot(e,t,n){let r=e.replace(/(?<!=)\{\{\s*([a-zA-Z0-9_.]+)\s*\}\}/g,(s,i)=>{if(i==="run_id")return String(t.run_id);if(i==="state_id")return n;if(i==="item")return t.iteration?.item??"";if(i==="index")return t.iteration===null?"":String(t.iteration.index);if(i.startsWith("project.")){let o=i.slice(8);if(o==="id")return String(t.project.id);if(o==="name")return t.project.name;if(o==="local_path")return t.project.local_path;if(o==="default_branch")return t.project.default_branch??"";if(o==="owner"){let a=t.project.name.indexOf("/");return a>0?t.project.name.slice(0,a):""}if(o==="repo"){let a=t.project.name.indexOf("/");return a>0?t.project.name.slice(a+1):t.project.name}if(o==="test_command"){let a=t.project.test_command;return a===null||a===""?"npm test":a}return""}if(i==="job_payload"){let o=Un(t.job.payload);return o===null?"":JSON.stringify(o)}if(i.startsWith("job_payload.")){let o=i.slice(12),l=Un(t.job.payload)?.[o];return l==null?"":String(l)}if(i.startsWith("outcomes.")){let o=ij(t.outcomes,i.slice(9));return o==null?"":typeof o=="string"?o:JSON.stringify(o)}return""});return zE(r,t)}function ij(e,t){let n=e;for(let r of t.split(".")){if(n===null||typeof n!="object"||Array.isArray(n))return;n=n[r]}return n}function Un(e){if(e===null)return null;try{let t=JSON.parse(e);return t!==null&&typeof t=="object"&&!Array.isArray(t)?t:null}catch{return null}}async function ci(e){let{context:t,stateId:n,member:r,prompt:s,stepId:i,timeoutMs:o,writesToProjectPath:a}=e,l=JE(t.dal,t.run_id,()=>i),c=zu(t,n),d={violation:null},u=y=>{if(l(y),d.violation===null&&y.kind==="tool_use"&&y.tool==="Bash"&&y.summary){let E=Vu(y.summary),b=Ku(E);b.matched&&!c&&(d.violation={summary:y.summary,kind:b.kind})}},f=new Date(Date.now()-1),m=0,p=0,_=y=>{u(y),oj(y,(E,b)=>{m+=E,p+=b})},h=await jo({sessionid:r.sessionid,sessiondir:r.sessiondir,prompt:s,timeoutMs:o,dal:t.dal,team_member_id:r.id,onProgress:_});t.dal.insertSessionEvent({run_id:t.run_id,step_id:i,kind:"agent_call",timestamp_ms:Date.now(),payload:JSON.stringify({alias:r.alias,provider:et(r),model:r.model??"unknown",tokens_in:m,tokens_out:p,wall_time_ms:h.ms})}),aj(t.project,t.dal,f);let g=d.violation;return g!==null?{kind:"g3_violation",summary:g.summary,violationKind:g.kind}:!a&&t.project.local_path.trim().length>0&&Zu(t.project.local_path,f)?{kind:"g2_violation"}:{kind:"ok",text:h.text,ms:h.ms,argv:h.argv}}function oj(e,t){let n=e.raw;if(n==null)return;let s=n.message?.usage;if(s!==void 0){let o=Ia(s.input_tokens),a=Ia(s.output_tokens);(o>0||a>0)&&t(o,a);return}let i=n.usage;if(i!==void 0){let o=Ia(i.input_tokens),a=Ia(i.output_tokens);(o>0||a>0)&&t(o,a)}}function Ia(e){return typeof e=="number"&&Number.isFinite(e)&&e>=0?e:0}async function fn(e,t,n,r){if(n.sessionid===null)return;let s=`${t}:write_back`,i=K(e,{run_id:e.run_id,state_name:s});e.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 ci({context:e,stateId:s,member:n,prompt:a,stepId:i.id,timeoutMs:e.workflow.default_task_timeout_ms,writesToProjectPath:!1});if(l.kind==="ok"){e.dal.insertStepArtifact({step_id:i.id,kind:"write_back_transcript",content:l.text});let c=!l.text.includes("STANCE: no_writeback");e.dal.finishStep(i.id,c?"wrote_back":"no_writeback","write_back_turn")}else e.dal.finishStep(i.id,null,`write_back_${l.kind}`)}catch{e.dal.finishStep(i.id,null,"write_back_error")}}async function Yr(e,t,n,r,s,i,o,a=!1,l){let c=e.membersByAlias.get(n.alias);if(c===void 0||c.sessionid===null)return{outcome:null,text:"",status_detail:`missing_agent:${n.alias}`};let d=K(e,{run_id:e.run_id,state_name:t});e.steps_executed+=1;let u=[];c.prompt_snapshot!==null&&c.prompt_snapshot.length>0&&u.push(c.prompt_snapshot),i&&u.push(Y_(s)),l!=null&&l.length>0&&u.push(l);let f=n.prompt_template!==void 0?await ot(n.prompt_template,e,t):"";f.length>0&&u.push(f),r!==null&&r.length>0&&u.push(r);let m=u.join(`
|
|
2227
2227
|
|
|
2228
2228
|
`);try{let p=await ci({context:e,stateId:t,member:c,prompt:m,stepId:d.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 e.dal.insertSessionEvent({run_id:e.run_id,step_id:d.id,kind:"policy_violation",timestamp_ms:Date.now(),payload:JSON.stringify(p.kind==="g3_violation"?{violation:"side_effect_without_pause",state_id:t,kind:p.violationKind,command_summary:p.summary,message:`State ${t} ran a classified side-effect command (${p.violationKind}) without a preceding approved Pause`}:{violation:"writes_to_project_path",state_id:t,message:`State ${t} wrote to project.local_path without writes_to_project_path: true`})}),e.dal.finishStep(d.id,null,h),{outcome:null,text:"",status_detail:h}}if(e.dal.insertStepArtifact({step_id:d.id,kind:`${t}_transcript`,content:p.text}),e.transcripts[t]=p.text,!i)return e.dal.finishStep(d.id,"done",`chat_ms=${p.ms}`),e.outcomes[t]="done",{outcome:"done",text:p.text,status_detail:`chat_ms=${p.ms}`};let _=oi(p.text,s);return e.dal.finishStep(d.id,_.outcome,_.outcome!==null?`chat_ms=${p.ms}`:_.reason),_.outcome!==null&&(e.outcomes[t]=_.outcome),{outcome:_.outcome,text:p.text,status_detail:_.outcome!==null?`chat_ms=${p.ms}`:_.reason}}catch(p){let _=p instanceof Re?`chat_${p.kind}`:"chat_other";return e.dal.finishStep(d.id,null,_),{outcome:null,text:"",status_detail:_}}}function zr(e,t){return(t?.length??0)>0?qE(e.project.local_path,t):null}function rw(e){return Ku(Vu(e))}function zu(e,t){let n=e.dal.query(`SELECT state_name, outcome FROM step
|
|
2229
2229
|
WHERE run_id = ? AND state_name != ? AND ended_at IS NOT NULL
|
|
@@ -2242,7 +2242,7 @@ ${d}`:d;try{let f=await ci({context:e,stateId:r,member:i,prompt:u,stepId:l.id,ti
|
|
|
2242
2242
|
ORDER BY sa.id DESC
|
|
2243
2243
|
LIMIT 1`,e.run_id,`${r}:coder[%`);return i[0]?.content===void 0?null:xa(i[0].content)}function xa(e){return e.replace(/\n*STANCE:\s+\S+\s*$/,"").trimEnd()}async function Kj(e,t){let n=vw(Fj.lexer(e,{gfm:!0})),r=new Lj({title:t,numbering:{config:[{reference:"ordered-list",levels:[{level:0,format:$j.DECIMAL,text:"%1."}]}]},sections:[{children:n.length===0?[new Nt("")]:n}]});return Cj.toBuffer(r)}function vw(e){let t=[];for(let n of e)switch(n.type){case"space":break;case"heading":t.push(new Nt({heading:tP(n.depth),children:qn(Wn(n))}));break;case"paragraph":t.push(new Nt({children:qn(Wn(n))}));break;case"text":t.push(new Nt({children:Wn(n).length===0?[new xt(n.text)]:qn(Wn(n))}));break;case"blockquote":t.push(...vw(Wn(n)).map(r=>r instanceof Nt?r:new Nt({children:[new xt(n.text)]})));break;case"list":Zj(n)&&t.push(...Vj(n));break;case"table":Qj(n)&&t.push(Yj(n));break;case"code":eP(n)&&t.push(...zj(n));break;case"hr":t.push(new Nt(""));break;case"html":n.text.trim().length>0&&t.push(new Nt({children:[new xt(n.text)]}));break;default:break}return t}function qn(e,t){let n=[];for(let r of e)switch(r.type){case"text":case"escape":n.push(new xt({text:r.text,...Qu(t)}));break;case"strong":n.push(...qn(Wn(r),{...t,bold:!0}));break;case"em":n.push(...qn(Wn(r),{...t,italics:!0}));break;case"codespan":n.push(new xt({text:r.text,...Qu({...t,code:!0})}));break;case"link":n.push(new Oj({link:r.href,children:qn(Wn(r),{...t})}));break;case"br":n.push(new xt({text:"",break:1}));break;case"image":n.push(new xt({text:`[image: ${r.text}]`,italics:!0}));break;case"del":n.push(new xt({text:r.text,strike:!0}));break;default:n.push(new xt({text:r.raw,...Qu(t)}));break}return n.length===0?[new xt("")]:n}function Qu(e){return{...e?.bold===!0?{bold:!0}:{},...e?.italics===!0?{italics:!0}:{},...e?.code===!0?{font:"Courier New"}:{}}}function Vj(e){return e.items.map(t=>new Nt({children:qn(t.tokens.length===1&&t.tokens[0]?.type==="text"?[{...t.tokens[0],text:Ew(t)+t.tokens[0].text}]:[{type:"text",raw:t.text,text:Ew(t)+t.text}]),...e.ordered?{numbering:{reference:"ordered-list",level:0}}:{bullet:{level:0}}}))}function Ew(e){return e.task?`[${e.checked?"x":" "}] `:""}function Yj(e){let t=[e.header,...e.rows].map(n=>new jj({children:n.map(r=>new Dj({children:[new Nt({children:qn(r.tokens,r.header?{bold:!0}:void 0)})]}))}));return new Mj({width:{size:100,type:Pj.PERCENTAGE},rows:t})}function zj(e){return e.text.split(`
|
|
2244
2244
|
`).map(n=>new Nt({children:[new xt({text:n.length===0?" ":n,font:"Courier New"})]}))}function Wn(e){let t=e.tokens;return Array.isArray(t)?t:[]}function Zj(e){return e.type==="list"&&Array.isArray(e.items)}function Qj(e){let t=e;return e.type==="table"&&Array.isArray(t.header)&&Array.isArray(t.rows)}function eP(e){return e.type==="code"&&typeof e.text=="string"}function tP(e){switch(e){case 1:return Zr.HEADING_1;case 2:return Zr.HEADING_2;case 3:return Zr.HEADING_3;case 4:return Zr.HEADING_4;case 5:return Zr.HEADING_5;default:return Zr.HEADING_6}}var Tw,bw=w(()=>{"use strict";nt();Tw={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 e=>Uj(e,e.state)}});import{createHash as nP}from"node:crypto";import{existsSync as rP,mkdirSync as sP,readFileSync as Sw,statSync as iP}from"node:fs";import{dirname as oP,isAbsolute as kw,normalize as aP,resolve as ui}from"node:path";import{marked as lP}from"marked";import cP from"write-excel-file/node";async function dP(e,t){let n=e.stateId,r=e.displayName,s=K(e,{run_id:e.run_id,state_name:r});e.steps_executed+=1;try{let i=await uP(e,t),o=fP(t.input_format),a=await mP(e,t),l=await pP(e,t.title),c=o==="markdown"?bP(i):yP(i);await SP({sheets:c.length===0?[{name:"Sheet1",headers:[],rows:[]}]:c,outputPath:a,title:l??e.workflow.name});let d=iP(a).size;if(d===0)throw new Error("rendered XLSX file was empty");let u=nP("sha256").update(Sw(a)).digest("hex");return e.dal.insertStepArtifact({step_id:s.id,kind:"render_xlsx",path:a,sha:u,provider_call_mode:"library"}),e.dal.finishStep(s.id,"done",`wrote:${a}`),Z(e,n,r,{output_path:a,path:a,bytes:d}),V(e.workflow,t.outcomes?.done??"@terminal:done")}catch(i){let o=i instanceof Error?i.message:String(i);return e.dal.finishStep(s.id,"error",o),Z(e,n,r,{error:o}),V(e.workflow,t.outcomes?.error??"@terminal:error")}}async function uP(e,t){if(typeof t.source!="string"||t.source.trim().length===0)return"";let n=(await ot(t.source,e,e.stateId)).trim(),r=hP(e.project.local_path,n);if(r!==null){if(!rP(r))throw new Error(`source file not found: ${r}`);return Sw(r,"utf8")}return n}function fP(e){if(e==null||e==="")return"json";if(e==="json"||e==="markdown")return e;throw new Error(`unsupported input_format: ${String(e)}`)}async function mP(e,t){if(typeof t.output_path!="string"||t.output_path.trim().length===0)throw new Error("output_path is required");let n=(await ot(t.output_path,e,e.stateId)).trim();if(n.length===0)throw new Error("output_path resolved empty");let r=_P(e.project.local_path,n);if(!r.endsWith(".xlsx"))throw new Error(`output_path must end with .xlsx: ${r}`);return r}async function pP(e,t){if(typeof t!="string"||t.trim().length===0)return null;let n=(await ot(t,e,e.stateId)).trim();return n.length===0?null:n}function _P(e,t){let n=ui(e);return aP(kw(t)?ui(t):ui(n,t))}function hP(e,t){return gP(t)?kw(t)?ui(t):ui(e,t):null}function gP(e){return e.endsWith(".json")||e.endsWith(".md")||e.endsWith(".markdown")||e.startsWith("./")||e.startsWith("../")||e.startsWith("/")}function yP(e){if(e.trim().length===0)return[];let t;try{t=JSON.parse(e)}catch(n){let r=n instanceof Error?n.message:String(n);throw new Error(`invalid JSON source: ${r}`)}if(!Aa(t)||!Array.isArray(t.sheets))throw new Error("JSON source must be an object with sheets[]");return t.sheets.map((n,r)=>EP(n,r))}function EP(e,t){if(!Aa(e))throw new Error(`sheets[${t}] must be an object`);let n=wP(e.headers,`sheets[${t}].headers`),r=TP(e.rows,`sheets[${t}].rows`);return{name:typeof e.name=="string"&&e.name.trim().length>0?e.name:`Sheet${t+1}`,headers:n,rows:r,headerStyle:vP(e.styles)}}function wP(e,t){if(e===void 0)return[];if(!Array.isArray(e)||!e.every(n=>typeof n=="string"))throw new Error(`${t} must be an array of strings`);return e}function TP(e,t){if(e===void 0)return[];if(!Array.isArray(e))throw new Error(`${t} must be an array`);return e.map((n,r)=>{if(!Array.isArray(n))throw new Error(`${t}[${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(`${t}[${r}][${i}] must be string, number, boolean, or null`)})})}function vP(e){if(!Aa(e)||!Aa(e.headers))return;let t={};return e.headers.bold===!0&&(t.bold=!0),typeof e.headers.fill=="string"&&(t.fill=e.headers.fill),Object.keys(t).length===0?void 0:t}function bP(e){let t=lP.lexer(e,{gfm:!0}),n=[],r=null;for(let s of t){if(LP(s)){r=s.text;continue}OP(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 SP(e){sP(oP(e.outputPath),{recursive:!0});let t=new Set,n=e.sheets.map(r=>({sheet:xP(r.name,t),data:kP(r),columns:NP(r)}));await cP(n).toFile(e.outputPath)}function kP(e){let t=[];if(e.headers.length>0){let n=RP(e.headerStyle?.fill);t.push(e.headers.map(r=>({value:r,type:String,fontWeight:e.headerStyle?.bold===!1?void 0:"bold",backgroundColor:n??void 0})))}for(let n of e.rows)t.push(n.map(IP));return t.length===0?[[{}]]:t}function IP(e){return e===null?{}:typeof e=="string"?{value:e,type:String}:typeof e=="number"?{value:e,type:Number}:typeof e=="boolean"?{value:e,type:Boolean}:{}}function NP(e){let t=Math.max(e.headers.length,...e.rows.map(r=>r.length),1),n=[];for(let r=1;r<=t;r+=1){let s=[e.headers[r-1],...e.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 xP(e,t){let n=AP(e),r=n,s=2;for(;t.has(r.toLowerCase());){let i=` ${s}`;r=`${n.slice(0,31-i.length)}${i}`,s+=1}return t.add(r.toLowerCase()),r}function AP(e){let t=e.replace(/[\[\]:*?/\\]/g," ").trim();return(t.length===0?"Sheet":t).slice(0,31)}function RP(e){if(e===void 0)return null;let t=e.startsWith("#")?e.slice(1):e;return/^[0-9a-fA-F]{6}$/.test(t)?`#${t.toUpperCase()}`:null}function LP(e){return e.type==="heading"&&typeof e.text=="string"}function OP(e){let t=e;return e.type==="table"&&Array.isArray(t.header)&&Array.isArray(t.rows)}function Aa(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}var Iw,Nw=w(()=>{"use strict";nt();Iw={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 e=>dP(e,e.state)}});import{spawnSync as $P}from"node:child_process";async function MP(e,t){let n=e.stateId,r=e.displayName,s=e.workflow.default_task_timeout_ms;for(let f of t.pre_checks??[])if($P("sh",["-c",f.command],{cwd:e.project.local_path}).status!==0){let p=K(e,{run_id:e.run_id,state_name:r});e.steps_executed+=1,e.dal.finishStep(p.id,"fail_pre_check",`pre_check_failed:${f.description??f.command}`),Z(e,n,r,"fail_pre_check");let _=t.outcomes.fail_pre_check;return _!==void 0?V(e.workflow,_):{kind:"terminal",terminal:ee(e.workflow)}}let i=zr(e,t.durable_memory_tags),o=t.reviewers??[],a=null,l=o.length===0&&t.outcomes_from_stance!==void 0,c=l?Object.keys(t.outcomes_from_stance):[];for(let f=0;f<t.max_loops;f+=1){let m=`${r}:coder[${f}]`,p=await Yr(e,m,t.coder,a!==null?`PRIOR REVIEW FEEDBACK:
|
|
2245
|
-
${a}`:null,c,l,s,t.writes_to_project_path===!0,i);if(l){let h=XE(p.text);if(h!==null){let g=K(e,{run_id:e.run_id,state_name:r});return e.steps_executed+=1,e.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=K(e,{run_id:e.run_id,state_name:r});return e.steps_executed+=1,e.dal.finishStep(h.id,null,p.status_detail),{kind:"escalate",token:"",reason:`coder_no_outcome:${p.status_detail}`}}if(o.length===0){if(t.outcomes_from_stance!==void 0){let
|
|
2245
|
+
${a}`:null,c,l,s,t.writes_to_project_path===!0,i);if(l){let h=XE(p.text);if(h!==null){let g=K(e,{run_id:e.run_id,state_name:r});return e.steps_executed+=1,e.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=K(e,{run_id:e.run_id,state_name:r});return e.steps_executed+=1,e.dal.finishStep(h.id,null,p.status_detail),{kind:"escalate",token:"",reason:`coder_no_outcome:${p.status_detail}`}}if(o.length===0){if(t.outcomes_from_stance!==void 0){let y=Object.keys(t.outcomes_from_stance),E=oi(p.text,y);if(E.outcome===null){let S=K(e,{run_id:e.run_id,state_name:r});return e.steps_executed+=1,e.dal.finishStep(S.id,null,`unhandled_stance:${E.reason}`),{kind:"escalate",token:"",reason:`no_stance:${E.reason}`}}let b=K(e,{run_id:e.run_id,state_name:r});return e.steps_executed+=1,e.dal.finishStep(b.id,E.outcome,"outcomes_from_stance"),Z(e,n,r,E.outcome),V(e.workflow,t.outcomes_from_stance[E.outcome])}let h=oi(p.text,CP);if(h.outcome!==null){let y=K(e,{run_id:e.run_id,state_name:r});return e.steps_executed+=1,e.dal.finishStep(y.id,h.outcome,"default_failure_stance"),Z(e,n,r,h.outcome),{kind:"escalate",token:h.outcome,reason:`failure_stance:${h.outcome}`}}let g=K(e,{run_id:e.run_id,state_name:r});if(e.steps_executed+=1,e.dal.finishStep(g.id,"approve","no_reviewers"),Z(e,n,r,"approve"),t.write_back_durable_memory){let y=e.membersByAlias.get(t.coder.alias);y!==void 0&&await fn(e,r,y,t.write_back_durable_memory)}return V(e.workflow,t.outcomes.approve)}let _=await Promise.all(o.map(h=>Yr(e,`${r}:reviewer_${h.alias}[${f}]`,h,`CODER OUTPUT:
|
|
2246
2246
|
${p.text}`,["approve","request_changes"],!0,s,t.writes_to_project_path===!0)));if(_.every(h=>h.outcome==="approve")){let h=K(e,{run_id:e.run_id,state_name:r});if(e.steps_executed+=1,e.dal.finishStep(h.id,"approve",`loop=${f}`),Z(e,n,r,"approve"),t.write_back_durable_memory){let g=e.membersByAlias.get(t.coder.alias);g!==void 0&&await fn(e,r,g,t.write_back_durable_memory)}return V(e.workflow,t.outcomes.approve)}if(a=_.filter(h=>h.outcome==="request_changes").map(h=>h.text).join(`
|
|
2247
2247
|
|
|
2248
2248
|
`),t.loop_feedback_artifact!==void 0){let h=K(e,{run_id:e.run_id,state_name:`${r}:feedback[${f}]`});e.steps_executed+=1,e.dal.finishStep(h.id,"feedback_captured",`loop=${f}`),e.dal.insertStepArtifact({step_id:h.id,kind:t.loop_feedback_artifact,content:a})}}let d=K(e,{run_id:e.run_id,state_name:r});e.steps_executed+=1,e.dal.finishStep(d.id,"max_loops_exceeded",`loops=${t.max_loops}`),Z(e,n,r,"max_loops_exceeded");let u=t.outcomes.max_loops_exceeded;return u!==void 0?V(e.workflow,u):{kind:"terminal",terminal:ee(e.workflow)}}var CP,xw,Aw=w(()=>{"use strict";Gu();nt();CP=["blocked","failed","aborted"],xw={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 e=>MP(e,e.state)}});import{spawnSync as DP}from"node:child_process";async function jP(e,t){let n=e.stateId,r=e.displayName,s=await ot(t.command,e,r),i=zu(e,r),o=rw(s);if(o.matched&&!i){let _=K(e,{run_id:e.run_id,state_name:r});return e.steps_executed+=1,e.dal.insertSessionEvent({run_id:e.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`})}),e.dal.finishStep(_.id,null,`policy_violation:side_effect_without_pause:${o.kind}`),{kind:"terminal",terminal:ee(e.workflow)}}let a=new Date(Date.now()-1),l=typeof t.timeout_ms=="number"&&t.timeout_ms>0,c=DP("sh",["-c",s],{cwd:e.project.local_path,...l?{timeout:t.timeout_ms}:{},encoding:"utf8",env:{...process.env}}),d=K(e,{run_id:e.run_id,state_name:r});e.steps_executed+=1;let u=typeof c.stderr=="string"?c.stderr:"",f=c.error;if((u.length>0||f!==void 0)&&e.dal.insertSessionEvent({run_id:e.run_id,step_id:d.id,kind:"shellstep_stderr",timestamp_ms:Date.now(),payload:JSON.stringify({state_id:r,exit_status:c.status,stderr:u,spawn_error:f===void 0?null:f instanceof Error?f.message:String(f),command:s})}),c.status===null)return l?(e.dal.finishStep(d.id,null,`timeout:${t.timeout_ms}ms`),{kind:"terminal",terminal:"shell_step_timeout"}):(e.dal.finishStep(d.id,null,"shell_step_signal_terminated"),{kind:"terminal",terminal:ee(e.workflow)});if(t.writes_to_project_path!==!0&&e.project.local_path.trim().length>0&&Zu(e.project.local_path,a))return e.dal.insertSessionEvent({run_id:e.run_id,step_id:d.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`})}),e.dal.finishStep(d.id,null,"policy_violation:writes_to_project_path"),{kind:"terminal",terminal:ee(e.workflow)};if(t.capture_output_to!==void 0){let _=c.stdout??"";e.dal.insertStepArtifact({step_id:d.id,kind:t.capture_output_to,content:_})}let m=String(c.status),p=t.outcomes_from_exit[m]??t.outcomes_from_exit.default;return p===void 0?(e.dal.insertStepArtifact({step_id:d.id,kind:"unhandled_exit",content:m}),e.dal.finishStep(d.id,null,`shell_step_unhandled_exit:${m}`),{kind:"terminal",terminal:"shell_step_unhandled_exit"}):(e.dal.finishStep(d.id,m,`exit=${c.status}`),Z(e,n,r,m),V(e.workflow,p))}var Rw,Lw=w(()=>{"use strict";nt();Rw={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 e=>jP(e,e.state)}});async function PP(e,t){let n=e.stateId,r=e.displayName,s=K(e,{run_id:e.run_id,state_name:r});e.steps_executed+=1;let i=e.dal.getWorkflowByName(t.workflow_name);if(i===null)return e.dal.finishStep(s.id,null,`subflow_missing_workflow:${t.workflow_name}`),{kind:"terminal",terminal:ee(e.workflow)};let o=bt(i.definition),a=await FP(e,t),l=await e.runChildWorkflow(i,o,a);if(l.paused===!0)return e.dal.finishStep(s.id,null,`subflow_paused:${l.run_id}`),{kind:"paused"};let c=l.terminal_state;if(c===null)return e.dal.finishStep(s.id,null,`subflow_no_terminal:${l.run_id}`),{kind:"terminal",terminal:ee(e.workflow)};Z(e,n,r,UP(e,l.run_id,o.outputs??[])),e.dal.finishStep(s.id,c,`child_run=${l.run_id}`);let d=t.outcomes[c]??t.outcomes.default;return d===void 0?{kind:"terminal",terminal:ee(e.workflow)}:V(e.workflow,d)}async function FP(e,t){let n={};for(let[r,s]of Object.entries(t.inputs??{})){let i=await YE(s,e);n[r]=i===s?await ka(s,e):i}return n}function UP(e,t,n){let r={};for(let s of n)r[s.name]=WP(e,t,s);return r}function WP(e,t,n){let s=e.dal.query("SELECT * FROM step WHERE run_id = ? AND state_name = ? ORDER BY id DESC LIMIT 1",t,n.source_step_id)[0];if(s===void 0)return null;let i=qP(s,n.source_field);if(i.found)return i.value;let a=e.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 qP(e,t){switch(t){case"id":return{found:!0,value:e.id};case"run_id":return{found:!0,value:e.run_id};case"parent_step_id":return{found:!0,value:e.parent_step_id};case"state_name":return{found:!0,value:e.state_name};case"outcome":return{found:!0,value:e.outcome};case"status_detail":return{found:!0,value:e.status_detail};case"started_at":return{found:!0,value:e.started_at};case"ended_at":return{found:!0,value:e.ended_at};default:return{found:!1}}}var Ow,$w=w(()=>{"use strict";ei();nt();ai();Ow={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 e=>PP(e,e.state)}});function BP(e,t){let n=e.stateId,r=e.displayName,s=t.name??r,i=K(e,{run_id:e.run_id,state_name:r});return e.steps_executed+=1,e.dal.finishStep(i.id,s,t.kind??"neutral"),Z(e,n,r,s),{kind:"terminal",terminal:s}}var Cw,Mw=w(()=>{"use strict";nt();Cw={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:e=>BP(e,e.state)}});async function HP(e){let t=typeof e.parameters.org=="string"?e.parameters.org:"",n=typeof e.parameters.repo=="string"?e.parameters.repo:"";if(t.length===0||n.length===0)return null;let r=new URL(`https://api.github.com/repos/${t}/${n}/issues`);r.searchParams.set("state","open"),typeof e.parameters.label=="string"&&e.parameters.label.length>0&&r.searchParams.set("labels",e.parameters.label),typeof e.parameters.since=="string"&&e.parameters.since.length>0&&r.searchParams.set("since",e.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=XP(e.cursor),a=i.filter(JP).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:e.trigger_id,issue_id:c.id,issue_number:c.number,issue_url:c.html_url,title:c.title,cursor:String(l)}))}}function XP(e){if(e===void 0)return 0;let t=Number(e);return Number.isFinite(t)?t:0}function JP(e){if(e===null||typeof e!="object"||Array.isArray(e))return!1;let t=e;return typeof t.id=="number"&&typeof t.number=="number"&&typeof t.html_url=="string"&&typeof t.title=="string"}var Dw,jw=w(()=>{"use strict";Dw={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 e=>HP(e)}});async function GP(e){let t=typeof e.parameters.cron=="string"?e.parameters.cron.trim():"";if(t.length===0)return null;let n=new Date(Date.now()).toISOString().slice(0,16);return e.cursor===n?null:{main:[{trigger_id:e.trigger_id,fired_at:new Date(Date.now()).toISOString(),cursor:n,cron:t}]}}var Pw,Fw=w(()=>{"use strict";Pw={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 e=>GP(e)}});function Uw(e){e.register(iw),e.register(xw),e.register(cw),e.register(_w),e.register(gw),e.register(Tw),e.register(Iw),e.register(Rw),e.register(aw),e.register(uw),e.register(Ow),e.register(Cw),e.register(Pw),e.register(Dw)}var Ww=w(()=>{"use strict";ow();lw();dw();mw();hw();yw();bw();Nw();Aw();Lw();$w();Mw();jw();Fw()});function qw(){return Ra===null&&(Ra=new ef,Uw(Ra)),Ra}var KP,ef,Ra,Bw=w(()=>{"use strict";Ww();KP={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"},ef=class{types=new Map;register(t){let n=`${t.description.namespace}/${t.description.name}`;if(this.types.has(n))throw new Error(`archetype already registered: ${n}`);this.types.set(n,t)}get(t){let n=t.includes("/")?t:KP[t];return n?this.types.get(n):void 0}list(){return Array.from(this.types.values())}},Ra=null});async function Jw(e){zw(e.workflow);let t=e.workflowRow??e.dal.getWorkflowByName(e.workflow.name,e.workflow.version);if(t===null)throw new Error(`workflow ${e.workflow.name}@${e.workflow.version} is not registered`);let n=e.dal.getProjectByJob(e.job.id);if(n===null)throw new Error(`job ${e.job.id} has no project`);let r=YP(t.definition,e.workflow),s=e.job.run_id===null?null:e.dal.getRun(e.job.run_id),i=fi(r)?r.entry_step_id:r.start_at,o=s?.terminal_state===null?s:e.dal.insertRun({job_id:e.job.id,workflow_id:t.id,team_id:e.team.id,current_state:i}),a=r.requires,l=PE(a);if(l!==null)return e.dal.setRunTerminalState(o.id,"aborted"),e.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(e.members.map(m=>[m.alias,m]));if(fi(r)){let m=tf({dal:e.dal,workflow:Oa(r),job:e.job,project:n,run:o,membersByAlias:c,outcomes:s!==null&&o===s?e.dal.listLatestStepOutcomesByState(o.id):{},inputs:Un(e.job.payload)??{},team_id:e.team.id}),p=await Kw(r,m,o.current_state??r.entry_step_id);return Xw(e.dal,n.id,o.id,r.name,p),p}let d=s!==null&&o===s?e.dal.listLatestStepOutcomesByState(o.id):{},u=tf({dal:e.dal,workflow:r,job:e.job,project:n,run:o,membersByAlias:c,outcomes:d,inputs:Un(e.job.payload)??{},team_id:e.team.id}),f=await Gw(u,o.current_state??r.start_at);return Xw(e.dal,n.id,o.id,r.name,f),f}function Xw(e,t,n,r,s){if(s.paused===!0)return;let i=s.terminal_state;if(i===null)return;let o="unknown",a=!1;try{let d=e.getRun(n);if(d!==null){let u=e.getWorkflow(d.workflow_id);if(u!==null){let f=JSON.parse(u.definition),p=(f.terminals??{})[i];if(p!==void 0&&typeof p.kind=="string"&&(p.kind==="success"||p.kind==="failure"||p.kind==="neutral")&&(o=p.kind),o==="unknown"&&Array.isArray(f.steps)){for(let 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=e.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";e.raiseAttention({kind:c,severity:o==="failure"?"error":"warn",project_id:t,run_id:n,payload:JSON.stringify({run_id:n,workflow_name:r,terminal_state:i,terminal_kind:o,last_error:l})})}function tf(e){let t={dal:e.dal,workflow:e.workflow,job:e.job,project:e.project,run_id:e.run.id,membersByAlias:e.membersByAlias,inputs:e.inputs,outcomes:e.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=t.parent_step_id,o=t.iteration;t.parent_step_id=s?.parent_step_id??i,t.iteration=s?.iteration??o;try{return await nf(t,n,r,s?.display_name??n)}finally{t.parent_step_id=i,t.iteration=o}},runChildWorkflow:async(n,r,s)=>{zw(r);let i=fi(r)?r.entry_step_id:r.start_at,o=e.dal.insertRun({job_id:e.job.id,workflow_id:n.id,team_id:e.team_id,current_state:i,parent_run_id:t.run_id}),a=tf({dal:e.dal,workflow:fi(r)?Oa(r):r,job:e.job,project:e.project,run:o,membersByAlias:e.membersByAlias,outcomes:{},inputs:s,team_id:e.team_id});return fi(r)?Kw(r,a,o.current_state??r.entry_step_id):Gw(a,o.current_state??r.start_at)}};return t}async function Gw(e,t){let n=t;if(n.startsWith(li))return{run_id:e.run_id,terminal_state:null,steps_executed:0,paused:!0};for(let s=0;s<1e3;s+=1){if(n.startsWith("@terminal:"))return mn(e,n.slice(10));e.dal.setRunCurrentState(e.run_id,n),e.last_state_id=n;let i=e.workflow.states[n];if(i===void 0){let l=La(e,ee(e.workflow));if(l.kind==="paused")return ze(e);if(l.kind==="escalate")return mt(e,{id:n,name:n,type:"unknown"},l.token,l.reason),ze(e);if(l.kind==="terminal")return mn(e,l.terminal);n=l.state;continue}let o,a=Yw(e,n);if(a!==null){let l=K(e,{run_id:e.run_id,state_name:n});if(e.steps_executed+=1,e.dal.finishStep(l.id,a,"escalation_resume"),Z(e,n,n,a),a===Os)return mn(e,Ac);let c=i.outcomes?.[a];o=c!==void 0?V(e.workflow,c):mt(e,{id:n,name:n,type:i.type},a,`no declared edge for resumed outcome '${a}' from state '${n}'`)}else o=await nf(e,n,i);if(o.kind==="paused")return ze(e);if(o.kind==="escalate")return mt(e,{id:n,name:n,type:i.type},o.token,o.reason),ze(e);if(o.kind==="terminal"){let l=La(e,o.terminal);if(l.kind==="paused")return ze(e);if(l.kind==="escalate")return mt(e,{id:n,name:n,type:i.type},l.token,l.reason),ze(e);if(l.kind==="terminal")return mn(e,l.terminal);n=l.state;continue}n=o.state}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})});let r=La(e,ee(e.workflow));return r.kind==="terminal"?mn(e,r.terminal):mn(e,ee(e.workflow))}async function Kw(e,t,n){let r=new Map(e.steps.map(o=>[o.id,o])),s=new Map(e.steps.map(o=>[o.name,o])),i=n;for(let o=0;o<1e3;o+=1){t.dal.setRunCurrentState(t.run_id,i);let a=r.get(i);if(a===void 0)return mt(t,{id:i,name:i,type:"unknown"},"",`internal:unknown v3 step '${i}'`),ze(t);let l=Yw(t,a.id);if(l!==null){let m=K(t,{run_id:t.run_id,state_name:a.name});if(t.steps_executed+=1,t.dal.finishStep(m.id,l,"escalation_resume"),Z(t,a.id,a.name,l),l===Os)return mn(t,Ac);let p=Object.keys(e.connections[a.id]??{}),_=e.connections[a.id]?.[l]?.[0]?.[0]?.step_id??e.connections[a.id]?.main?.[0]?.[0]?.step_id;if(_===void 0)return mt(t,{id:a.id,name:a.name,type:a.type},l,`no declared edge for resumed outcome '${l}' from step '${a.id}'`,{declared_outcomes:p}),ze(t);i=_;continue}let c=await VP(t,e,a);if(c.kind==="paused")return ze(t);let d=Object.keys(e.connections[a.id]??{});if(c.kind==="escalate")return mt(t,{id:a.id,name:a.name,type:a.type},c.token,c.reason,{declared_outcomes:d}),ze(t);let u=c.kind==="terminal"?c.terminal:c.state;if(a.type==="lmctl/terminal"){let m=t.workflow;t.workflow=Oa(e,a);try{let p=La(t,u);if(p.kind==="paused")return ze(t);if(p.kind==="escalate")return mt(t,{id:a.id,name:a.name,type:a.type},p.token,p.reason),ze(t);if(p.kind==="terminal")return mn(t,p.terminal);let _=s.get(p.state);if(_===void 0)return mt(t,{id:a.id,name:a.name,type:a.type},"",`internal:unknown v3 error handler step '${p.state}'`),ze(t);i=_.id;continue}finally{t.workflow=m}}if(Lr(u))return mt(t,{id:a.id,name:a.name,type:a.type},u,`generic escalation '${u}' from step '${a.id}'`,{declared_outcomes:d}),ze(t);let f=e.connections[a.id]?.[u]?.[0]?.[0]?.step_id??e.connections[a.id]?.main?.[0]?.[0]?.step_id;if(f===void 0)return mt(t,{id:a.id,name:a.name,type:a.type},u,`no declared edge for outcome '${u}' from step '${a.id}'`,{declared_outcomes:d}),ze(t);i=f}return 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})}),mn(t,"aborted")}async function VP(e,t,n){let r=Vw(t,n),s=e.workflow;e.workflow=Oa(t,n);try{return await nf(e,n.id,r,n.name)}finally{e.workflow=s}}function Vw(e,t){let n=t.parameters,r=t.members??{},s=Object.keys(e.connections[t.id]??{}),i=Object.fromEntries(s.map(a=>[a,`@terminal:${a}`])),o={state_name:t.name};switch(t.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:t.type,...n}}}async function nf(e,t,n,r){let s=qw().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=e.emit_progress,o=e.progress_step_id;e.emit_progress=s.description.emits_progress===!0?QP(e,s):void 0,e.progress_step_id=null;try{return await s.execute(tw(e,t,n,r??t))}finally{e.emit_progress=i,e.progress_step_id=o}}function YP(e,t){try{let n=JSON.parse(e);if(ZP(n)&&n.definition_schema_version===3)return Bt.parse(n)}catch{return t}return t}function fi(e){return e.definition_schema_version===3}function Oa(e,t){let n=t===void 0?[]:Object.keys(e.connections[t.id]??{}),r=Object.fromEntries(n.map(i=>[i,{kind:i==="aborted"?"failure":"neutral"}])),s={};if(t?.type==="lmctl/loop"&&typeof t.parameters.body=="string"){let i=e.steps.find(o=>o.name===t.parameters.body);i!==void 0&&(s[t.parameters.body]=Vw(e,i))}return t?.type==="lmctl/terminal"&&typeof t.parameters.name=="string"&&(r[t.parameters.name]={kind:zP(t.parameters.kind)}),r.aborted??={kind:"failure"},{name:e.name,version:e.version,definition_schema_version:2,primitive_version:2,start_at:t?.name??e.entry_step_id,states:s,terminals:r,...e.default_task_timeout_ms!==void 0?{default_task_timeout_ms:e.default_task_timeout_ms}:{},...e.concurrency_key!==void 0?{concurrency_key:e.concurrency_key}:{},...e.concurrent_limit!==void 0?{concurrent_limit:e.concurrent_limit}:{},...e.errors!==void 0?{errors:e.errors}:{}}}function zP(e){return e==="success"||e==="failure"||e==="neutral"?e:"neutral"}function ZP(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}function QP(e,t){let n=`progress.${t.description.namespace}/${t.description.name}`;return r=>{try{if(typeof r.kind!="string"||r.kind.length===0)return;e.dal.insertSessionEvent({run_id:e.run_id,step_id:e.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 mn(e,t){e.dal.setRunTerminalState(e.run_id,t);try{CE(e.run_id,e.dal)}catch{}return{run_id:e.run_id,terminal_state:t,steps_executed:e.steps_executed}}function ze(e){return{run_id:e.run_id,terminal_state:null,steps_executed:e.steps_executed,paused:!0}}function Yw(e,t){let r=e.dal.getRun(e.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[t];if(typeof i!="string")return null;delete s[t];let o=Object.keys(s).length>0?JSON.stringify(s):null;return e.dal.setRunPendingEscalationDecision(e.run_id,o),i}function La(e,t){if(!e1(e.workflow,t)||e.errors_block_fired)return{kind:"terminal",terminal:t};let n=e.workflow.errors;return n===void 0?{kind:"terminal",terminal:t}:(e.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&&t1(e,t,n.on_unhandled_failure),{kind:"terminal",terminal:t}))}function e1(e,t){return e.definition_schema_version===2&&e.terminals[t]?.kind==="failure"}function t1(e,t,n){let r=n1(e),s=n.capture_evidence&&r!==null?r1(e,r.id):[];e.dal.raiseAttention({kind:n.attention_kind,severity:n.severity,project_id:e.project.id,run_id:e.run_id,payload:JSON.stringify({run_id:e.run_id,terminal_state:t,current_state:e.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 n1(e){return e.dal.query("SELECT id, state_name, outcome, status_detail FROM step WHERE run_id = ? ORDER BY id DESC LIMIT 1",e.run_id)[0]??null}function r1(e,t){return e.dal.query("SELECT path FROM step_artifact WHERE step_id = ? AND path IS NOT NULL ORDER BY id DESC",t).map(r=>r.path)}function zw(e){if(!Hw.includes(e.definition_schema_version))throw new Error(`unsupported definition_schema_version ${e.definition_schema_version}; supported versions: ${Hw.join(", ")}`)}var Hw,Zw=w(()=>{"use strict";Jr();ME();FE();nt();Bw();$s();Hw=[1,2,3]});import{readFileSync as s1,readdirSync as i1}from"node:fs";import{basename as o1,join as a1,resolve as l1}from"node:path";function tT(e={}){let t=l1(e.workflowsDir??"workflows"),n=i1(t).filter(r=>r.endsWith(".compound.json")).sort((r,s)=>r.localeCompare(s));return{generated_at:new Date().toISOString(),workflows_dir:t,rows:n.map(r=>c1(a1(t,r)))}}function c1(e){let t=o1(e);try{let n=s1(e,"utf8"),r=bt(n);return sT(t,r)}catch(n){return{file:t,workflow_name:null,status:"FAIL",first_step_id:null,first_step_type:null,first_step_disposition:null,note:iT(n)}}}function nT(e,t){try{let n=bt(t);return sT(e,n)}catch(n){return{file:e,workflow_name:e,status:"FAIL",first_step_id:null,first_step_type:null,first_step_disposition:null,note:iT(n)}}}function rT(e){let t=[];t.push(`workflow verification - ${e.generated_at}`),t.push(`dir: ${e.workflows_dir}`),t.push(""),t.push(`${"status".padEnd(17)} ${"workflow".padEnd(36)} ${"first step".padEnd(52)} note`),t.push(`${"-".repeat(17)} ${"-".repeat(36)} ${"-".repeat(52)} ${"-".repeat(30)}`);for(let i of e.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})`}`;t.push(`${i.status.padEnd(17)} ${o} ${a.slice(0,52).padEnd(52)} ${i.note}`)}let n=e.rows.filter(i=>i.status==="PASS").length,r=e.rows.filter(i=>i.status==="PASS_NEEDS_INPUTS").length,s=e.rows.filter(i=>i.status==="FAIL").length;return t.push(""),t.push(`summary: ${n} pass, ${r} pass_needs_inputs, ${s} fail`),`${t.join(`
|
|
@@ -2331,7 +2331,7 @@ ${p.text}`,["approve","request_changes"],!0,s,t.writes_to_project_path===!0)));i
|
|
|
2331
2331
|
WHERE w.name = ?
|
|
2332
2332
|
ORDER BY pw.id DESC`,"newspaper")}function bT(e,t){for(let n of[...t.steps].reverse()){let r=e.getInteractiveSessionByStepId(n.id);if(r!==null)return r}return null}function ST(e,t){let n=Number(at(t.project_id));return Number.isInteger(n)?e.getProject(n):null}function J1(e){let t=at(e.schedule)||"daily";return t==="weekly"?{preset:t,cron:"0 6 * * 1"}:t==="custom"?{preset:t,cron:at(e.cron).trim()||"0 6 * * *"}:{preset:"daily",cron:"0 6 * * *"}}function hT(e){let t=e.req.param("workflow");return lf.includes(t)?t:null}function Qr(e){return Pa.find(t=>t.name===e)?.title??e}function G1(e){return e.split(/[_:-]/).filter(Boolean).map(t=>`${t[0]?.toUpperCase()??""}${t.slice(1)}`).join(" ")}function df(e){return k1.parse(e,{async:!1})}function K1(e){return e==="done"||e==="pr_ready"||e==="merged"}function V1(e){return e.replace(/\n*STANCE:\s+\S+\s*$/,"").trimEnd()}function Y1(e,t){return e.split(`
|
|
2333
2333
|
`).slice(0,t).join(`
|
|
2334
|
-
`)}function z1(e){return e.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"")}function at(e){return typeof e=="string"?e:""}function Z1(e){if(e===null)return{};try{let t=JSON.parse(e);if(t!==null&&typeof t=="object"&&!Array.isArray(t))return t}catch{return{}}return{}}function af(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}function ja(e,t){return Number(e.req.param(t))}var Pa,lf,kT=w(()=>{"use strict";Da();cn();ju();Pa=[{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."}],lf=Pa.map(e=>e.name)});function eF(e){return e.replace(/^\/+/,"")}function IT(e){return typeof e=="string"&&e!==""&&!e.includes("/")&&!e.includes("\\")}function es(e){if(e.mailboxKey!==void 0&&e.mailboxKey!==null&&e.mailboxKey!==""){let t=eF(e.mailboxKey),n=t.lastIndexOf("/");return(n>=0?t.slice(n+1):t).includes(".")&&(t=n>=0?t.slice(0,n+1):""),t!==""&&!t.endsWith("/")&&(t+="/"),t}return IT(e.userId)&&IT(e.deviceId)?`${e.userId}/${e.deviceId}/`:`${Q1}/${e.identityId}/`}function nF(e){return String(Math.max(0,Math.floor(e))).padStart(tF,"0")}function uf(e,t,n){return`${e}${t}${nF(n)}.json`}function Fa(e,t){return`${e}${t}`}function Ua(e,t,n){let r=`${t}${n}`;if(!e.startsWith(r))return;let s=e.slice(r.length).match(/^(\d+)\.json$/);if(s===null)return;let i=Number(s[1]);return Number.isSafeInteger(i)?i:void 0}var Q1,tF,Wa=w(()=>{"use strict";Q1="mailbox";tF=12});function pn(e,t){let n=Math.floor(e),r="",s=n;for(let d=0;d<12;d++)r=qa[s&15]+r,s=Math.floor(s/16);let i=Math.floor(t()*4096)&4095,o="",a=i;for(let d=0;d<3;d++)o=qa[a&15]+o,a=a>>4;let l=qa[8|Math.floor(t()*4)&3],c="";for(let d=0;d<15;d++)c+=qa[Math.floor(t()*16)&15];return r.slice(0,8)+"-"+r.slice(8,12)+"-7"+o+"-"+l+c.slice(0,3)+"-"+c.slice(3,15)}var qa,Ba=w(()=>{"use strict";qa="0123456789abcdef"});function mf(e,t){return!Number.isFinite(e)||e<=0?t:e}function pf(e){if(e===null||typeof e!="object")return!1;let t=e;return t.name==="NoSuchKey"||t.name==="NotFound"||t.Code==="NoSuchKey"||t.code==="NoSuchKey"||t.$metadata!==void 0&&t.$metadata.httpStatusCode===404}function LT(e){return e.conversation_id===RT&&iF(e.payload)}function iF(e){return typeof e=="object"&&e!==null&&e.kind==="heartbeat"}function oF(e){let t=typeof e.hb=="string"&&e.hb!==""?e.hb:LT(e)?e.timestamp:void 0;if(t===void 0)return;let n=Date.parse(t);return Number.isFinite(n)?n:void 0}var NT,xT,AT,rF,RT,sF,ff,fr,Ha=w(()=>{"use strict";Wa();Ba();NT=3e3,xT=1e4,AT=12e3,rF=1e3,RT="__lmctl_heartbeat__",sF={kind:"heartbeat"},ff={setTimeout:(e,t)=>setTimeout(e,t),clearTimeout:e=>clearTimeout(e)},fr=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(t){this.opts=t,this.basePrefix=es({identityId:t.identityId,userId:t.userId,deviceId:t.deviceId,mailboxKey:t.mailboxKey}),this.ownStream=t.selfRole==="agent"?"local":"web",this.peerStream=t.selfRole==="agent"?"web":"local",this.cursor=t.cursor,this.readIntervalMs=mf(t.readIntervalMs??t.pollIntervalMs??NT,NT),this.heartbeatIdleMs=mf(t.heartbeatIdleMs??xT,xT),this.backoffReadIntervalMs=mf(t.backoffReadIntervalMs??t.pollIntervalMs??AT,AT)}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 t=this.opts.timers??ff;if(this.timerHandle!==null&&(t.clearTimeout(this.timerHandle),this.timerHandle=null),this.heartbeatTimerHandle!==null&&(t.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(t){return this.putEnvelope(t.conversation_id,t.payload)}getCursor(){return this.cursor}getMailboxBasePrefix(){return this.basePrefix}setPollIntervalMs(t){if(!Number.isFinite(t)||t<=0)throw new Error(`SequentialMailboxClient.setPollIntervalMs: invalid ms=${t}`);this.readIntervalMs=t}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 t=await this.maxSeq(this.ownStream);this.ownSeq=t,this.cursor===void 0&&(this.cursor=await this.maxSeq(this.peerStream)),this.bootstrapped=!0}catch(t){throw this.bootstrapPromise=null,this.emitError(t,"list"),t}}async maxSeq(t){let n=Fa(this.basePrefix,t),r=0,s;do{let i=await this.opts.s3.send(new this.opts.commands.ListObjectsV2Command({Bucket:this.opts.bucket,Prefix:n,MaxKeys:rF,...s!==void 0&&{ContinuationToken:s}}));this.opts.onS3Op?.("list");for(let o of i.Contents??[]){let a=Ua(o.Key??"",this.basePrefix,t);a!==void 0&&a>r&&(r=a)}s=i.IsTruncated===!0?i.NextContinuationToken:void 0}while(s!==void 0);return r}async putEnvelope(t,n){let r=this.writeChain.then(()=>this.doPut(t,n));return this.writeChain=r.catch(()=>{}),r}async doPut(t,n){await this.ensureBootstrapped();let r=(this.opts.now??Date.now)(),s=new Date(r).toISOString(),i={message_id:pn(r,this.opts.random??Math.random),from:this.opts.selfRole,timestamp:s,hb:s,conversation_id:t,payload:n},o=(this.ownSeq??0)+1,a=uf(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(t){if(this.stopRequested)return;let n=this.opts.timers??ff;this.timerHandle=n.setTimeout(()=>{this.timerHandle=null,this.runTick()},t)}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 t=(this.cursor??0)+1,n=uf(this.basePrefix,this.peerStream,t),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(t);continue}r=await i.Body.transformToString("utf-8")}catch(i){if(pf(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(t);continue}if(this.recordPeerHeartbeat(s),LT(s)){this.advanceCursor(t);continue}try{await this.opts.onMessage(s)}catch(i){this.emitError(i,"handle");return}this.advanceCursor(t)}}advanceCursor(t){this.cursor=t,this.notifyCursorAdvance(t)}nextReadDelayMs(){return this.peerIsOn((this.opts.now??Date.now)())?this.readIntervalMs:this.backoffReadIntervalMs}peerIsOn(t){return this.lastPeerHeartbeatMs!==void 0&&t-this.lastPeerHeartbeatMs<=this.heartbeatIdleMs}recordPeerHeartbeat(t){let n=oF(t);n!==void 0&&(this.lastPeerHeartbeatMs=n)}recordWrite(t){this.lastWriteMs=t,this.scheduleHeartbeatCheck(this.heartbeatIdleMs)}scheduleHeartbeatCheck(t){if(this.stopRequested)return;let n=this.opts.timers??ff;this.heartbeatTimerHandle!==null&&n.clearTimeout(this.heartbeatTimerHandle),this.heartbeatTimerHandle=n.setTimeout(()=>{this.heartbeatTimerHandle=null,this.maybeWriteHeartbeat()},t)}async maybeWriteHeartbeat(){if(this.stopRequested)return;let t=(this.opts.now??Date.now)();if(this.lastWriteMs!==void 0){let n=t-this.lastWriteMs;if(n<this.heartbeatIdleMs){this.scheduleHeartbeatCheck(this.heartbeatIdleMs-n);return}}await this.writeHeartbeat()}async writeHeartbeat(){try{await this.putEnvelope(RT,sF)}catch(t){this.emitError(t,"put"),this.scheduleHeartbeatCheck(this.heartbeatIdleMs)}}notifyCursorAdvance(t){if(this.opts.onCursorAdvance!==void 0)try{this.opts.onCursorAdvance(t)}catch(n){this.emitError(n,"handle")}}emitError(t,n){if(this.opts.onError!==void 0)try{this.opts.onError(t,n)}catch{}else console.error(`SequentialMailboxClient[${n}]`,t)}}});import{getConnInfo as aF}from"@hono/node-server/conninfo";function OT(e,t){let n=t.bucket??lF,r=t.remoteAddressOf??(i=>dF(i)),s=i=>{let o=r(i);return uF(o)?null:i.json({error:"forbidden",message:"local-mailbox is loopback-only"},403)};e.get("/local-mailbox/object",async i=>{let o=s(i);if(o!==null)return o;let a=_f(i.req.query("key"));if(typeof a!="string")return i.json({error:"bad_request",message:a.error},400);try{let l=await t.s3.send(new t.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 pf(l)?i.json({error:"not_found"},404):i.json({error:"internal",message:hf(l)},500)}}),e.put("/local-mailbox/object",async i=>{let o=s(i);if(o!==null)return o;let a=_f(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 t.s3.send(new t.commands.PutObjectCommand({Bucket:n,Key:a,Body:l})),i.json({ok:!0})}catch(c){return i.json({error:"internal",message:hf(c)},500)}}),e.get("/local-mailbox/list",async i=>{let o=s(i);if(o!==null)return o;let a=i.req.query("prefix")??"",l=_f(a,{allowEmpty:!0});if(typeof l!="string")return i.json({error:"bad_request",message:l.error},400);let c=cF(i.req.query("maxKeys")),d=i.req.query("token");try{let u=await t.s3.send(new t.commands.ListObjectsV2Command({Bucket:n,Prefix:l,...c!==void 0?{MaxKeys:c}:{},...d!==void 0&&d!==""?{ContinuationToken:d}:{}}));return i.json({Contents:(u.Contents??[]).map(f=>({Key:f.Key,LastModified:f.LastModified instanceof Date?f.LastModified.toISOString():f.LastModified})),IsTruncated:u.IsTruncated??!1,...u.NextContinuationToken!==void 0?{NextContinuationToken:u.NextContinuationToken}:{}})}catch(u){return i.json({error:"internal",message:hf(u)},500)}})}function _f(e,t={}){if(e===void 0||e==="")return t.allowEmpty===!0?"":{error:"key required"};let n=e.replace(/^\/+/,"");return n.split("/").includes("..")?{error:"key must not contain '..'"}:n}function cF(e){if(e===void 0||e==="")return;let t=Number(e);return Number.isInteger(t)&&t>0?t:void 0}function dF(e){try{return aF(e).remote.address}catch{return}}function uF(e){return e===void 0||e===""?!1:!!(e==="127.0.0.1"||e==="::1"||e.startsWith("::ffff:127.")||e.startsWith("127."))}function hf(e){return e instanceof Error?e.message:String(e)}var lF,$T=w(()=>{"use strict";Ha();lF="local"});function CT(e,t){e.get("/mailbox/workspace",n=>pF(n,t)),e.get("/mailbox/projects",n=>_F(n,t)),e.get("/mailbox/projects/:id",n=>hF(n,t)),e.post("/mailbox/projects",n=>gF(n,t)),e.patch("/mailbox/projects/:id",n=>yF(n,t)),e.delete("/mailbox/projects/:id",n=>EF(n,t)),e.post("/mailbox/projects/:project_id/prompts",n=>wF(n,t)),e.get("/mailbox/prompts/:id",n=>TF(n,t))}function pF(e,t){t.dal.ensureWorkspace({id:ns,name:gf});let n=MT(t.dal),r={id:ns,name:gf,created_at:mF,projects:n};return e.json({workspace:r})}function _F(e,t){return e.json({projects:MT(t.dal)})}function hF(e,t){let n=e.req.param("id");if(n===void 0||n==="")return e.json({error:"bad_request",message:"project id required"},400);if(n.startsWith(ts)){let s=yf(t.dal,n);return s===null||s.deleted_at!==null?e.json({project:null},404):e.json({project:Ga(s)})}let r=jT(t.dal,n);return r===null?e.json({project:null},404):e.json({project:DT(r)})}async function gF(e,t){let n;try{n=await e.req.json()}catch{return e.json({error:"bad_request",message:"invalid JSON body"},400)}let r=n.input;if(r===void 0||typeof r!="object")return e.json({error:"bad_request",message:"input is required"},400);if(typeof r.name!="string"||r.name==="")return e.json({error:"bad_request",message:"input.name is required"},400);if(typeof r.repo_path!="string"||r.repo_path==="")return e.json({error:"bad_request",message:"input.repo_path is required"},400);t.dal.ensureWorkspace({id:ns,name:gf});let s=t.dal.insertWebProject({workspace_id:ns,name:r.name,repo_path:r.repo_path,config_json:r.config_json===void 0?null:JSON.stringify(r.config_json)});return e.json({project:Ga(s)},201)}async function yF(e,t){let n=e.req.param("id");if(n===void 0||n==="")return e.json({error:"bad_request",message:"project id required"},400);let r;try{r=await e.req.json()}catch{return e.json({error:"bad_request",message:"invalid JSON body"},400)}let s=r.input??{};if(n.startsWith(ts)){let i=yf(t.dal,n);if(i===null||i.deleted_at!==null)return e.json({error:"project_not_found",message:`project not found: ${n}`},404);let o=t.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?e.json({error:"project_not_found",message:`project not found: ${n}`},404):e.json({project:Ga(o)})}return e.json({error:"project_not_found",message:`project not found: ${n}`},404)}function EF(e,t){let n=e.req.param("id");if(n===void 0||n==="")return e.json({error:"bad_request",message:"project id required"},400);if(n.startsWith(ts)){let r=yf(t.dal,n);if(r===null)return e.json({deleted:!1});let s=t.dal.softDeleteWebProject(r.id);return e.json({deleted:s})}return e.json({deleted:!1})}async function wF(e,t){let n=e.req.param("project_id");if(n===void 0||n==="")return e.json({error:"bad_request",message:"project_id required in path"},400);let r;try{r=await e.req.json()}catch{return e.json({error:"bad_request",message:"invalid JSON body"},400)}let s=r.input;if(s===void 0||typeof s!="object")return e.json({error:"bad_request",message:"input is required"},400);let i=s.project_id??n;if(typeof s.text!="string"||s.text==="")return e.json({error:"bad_request",message:"input.text is required"},400);let o=jT(t.dal,i);if(o===null)return e.json({error:"project_not_found",message:`project not found: ${i}`},404);if(t.dal.getWorkflowByName(o.workflow_name)===null)return e.json({error:"workflow_not_registered",message:`project ${o.name} has no registered workflow "${o.workflow_name}"`},400);let l=`${fF}${crypto.randomUUID()}`,c={text:s.text,context_json:s.context_json??null},d;t.enqueueProjectJob!==void 0?d=t.enqueueProjectJob({dal:t.dal,project_id:o.id,source_ref:l,payload:c}):d=await vF({dal:t.dal,project_id:o.id,source_ref:l,payload:c}),t.dal.insertPromptDispatch({prompt_id:l,project_id:o.id,job_id:d.id,text:s.text,context_json:s.context_json===void 0?null:JSON.stringify(s.context_json)});let u={id:l,project_id:`${Ja}${o.id}`,text:s.text,status:"pending",created_at:new Date().toISOString(),completed_at:null};return e.json({prompt:u},201)}function TF(e,t){let n=e.req.param("id");if(n===void 0||n==="")return e.json({error:"bad_request",message:"prompt id required"},400);let r=bF(t.dal,n);return e.json({result:r})}function MT(e){let t=e.listProjects().map(DT),n=e.listWebProjectsActive(ns).map(Ga);return[...t,...n].sort($F)}function DT(e){return{id:`${Ja}${e.id}`,workspace_id:ns,name:e.name,repo_path:e.local_path,config_json:{workflow_name:e.workflow_name,team_id:e.team_id,durable_memory_mode:e.durable_memory_mode},last_active_at:null,created_at:e.created_at}}function Ga(e){let t={};if(e.config_json!==null)try{let n=JSON.parse(e.config_json);n!==null&&typeof n=="object"&&(t=n)}catch{}return e.linked_v4_project_id!==null&&(t={...t,linked_v4_project_id:e.linked_v4_project_id}),{id:`${ts}${e.id}`,workspace_id:e.workspace_id,name:e.name,repo_path:e.repo_path,config_json:t,last_active_at:e.last_active_at,created_at:e.created_at}}function yf(e,t){if(!t.startsWith(ts))return null;let n=t.slice(ts.length),r=Number.parseInt(n,10);return!Number.isFinite(r)||String(r)!==n?null:e.getWebProject(r)}function jT(e,t){if(t.startsWith(Ja)){let r=t.slice(Ja.length),s=Number.parseInt(r,10);if(Number.isFinite(s)&&String(s)===r)return e.getProject(s)}let n=Number.parseInt(t,10);return Number.isFinite(n)&&String(n)===t?e.getProject(n):null}async function vF(e){let{enqueueManual:t}=await Promise.resolve().then(()=>(ku(),tE));return{id:t(e.dal,{project_id:e.project_id,source_ref:e.source_ref,payload:e.payload}).id}}function bF(e,t){let n=e.getPromptDispatch(t);if(n===null)return{prompt_id:t,data:{status:"unknown"},errors_json:{error:"prompt_not_found"},duration_ms:null};let r=e.getJob(n.job_id);if(r===null)return{prompt_id:t,data:null,errors_json:{error:"job_missing",job_id:n.job_id},duration_ms:null};let s=r.run_id===null?null:e.getRun(r.run_id),i=e.getProject(n.project_id),o=RF(e,i?.team_id??null),a=AF(s),l=LF(r,a,o.length>0),c=OF(n.created_at,s),d=i===null?{totalEstimatedMs:void 0,perStep:new Map}:SF(e,i.workflow_name),u=d.totalEstimatedMs,f=PT(n.created_at),m=i?.workflow_name,p=d.perStep.size>0?d.perStep.size:void 0,_=s===null?[]:kF(e,s.id),h=IF(s,a,_,d.perStep,o),g=NF(_,d.perStep),E=xF(h,g,u,f,m,p);return l==="error"?{prompt_id:t,data:{status:l,job_id:r.id,project_id:n.project_id,run_id:s?.id??null,...Xa(u,f),...E},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&&e.setPromptDispatchCompleted(t),{prompt_id:t,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,...Xa(u,f),...E},errors_json:null,duration_ms:c}):l==="paused"?{prompt_id:t,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,...Xa(u,f),...E},errors_json:null,duration_ms:c}:{prompt_id:t,data:{status:l,job_id:r.id,project_id:n.project_id,run_id:s?.id??null,attempt_count:r.attempt_count,...Xa(u,f),...E},errors_json:null,duration_ms:c}}function SF(e,t){let n={totalEstimatedMs:void 0,perStep:new Map},r=e.getWorkflowByName(t);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 d=typeof c.name=="string"&&c.name.length>0?c.name:c.id,u=typeof c.estimated_duration_ms=="number"&&Number.isFinite(c.estimated_duration_ms)&&c.estimated_duration_ms>=0?c.estimated_duration_ms:void 0;a.set(c.id,u===void 0?{name:d}:{name:d,estimated_duration_ms:u})}if(i.steps===void 0&&i.states!==null&&typeof i.states=="object")for(let[l,c]of Object.entries(i.states)){if(c===null||typeof c!="object")continue;let d=c,u=typeof d.estimated_duration_ms=="number"&&Number.isFinite(d.estimated_duration_ms)&&d.estimated_duration_ms>=0?d.estimated_duration_ms:void 0;a.set(l,u===void 0?{name:l}:{name:l,estimated_duration_ms:u})}return{totalEstimatedMs:o,perStep:a}}function kF(e,t){try{return e.listStepsForRun(t)}catch{return[]}}function IF(e,t,n,r,s){if(e===null||e.terminal_state!==null)return;let i=t!==null?t:e.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??e.paused_at??e.started_at,l=r.get(i),c=l?.name??i,d=PT(a),u={id:i,name:c,started_at:a,elapsed_ms:d};return l?.estimated_duration_ms!==void 0&&(u.estimated_duration_ms=l.estimated_duration_ms),s.length>0&&(u.attention_needed=s),u}function NF(e,t){let n=[];for(let r of e){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=t.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 xF(e,t,n,r,s,i){let o={completed_steps:t,total_elapsed_ms:r};return e!==void 0&&(o.current_step=e),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 PT(e){let t=Date.parse(e);return Number.isNaN(t)?0:Math.max(0,Date.now()-t)}function Xa(e,t){return e===void 0?{elapsed_ms:t}:{elapsed_ms:t,estimated_duration_ms:e}}function AF(e){if(e===null)return null;let t=e.current_state;if(t===null)return null;let n="__paused__:";return t.startsWith(n)?t.slice(n.length):null}function RF(e,t){if(t===null)return[];let n;try{n=e.listTeamMembers(t)}catch{return[]}return n.filter(r=>r.state==="attention_needed").map(r=>({alias:r.alias,reason:r.state_reason}))}function LF(e,t,n){return e.status==="queued"?"pending":e.status==="done"?"done":e.status==="failed"?"error":t!==null||n||e.status==="paused"?"paused":e.status==="running"?"running":"error"}function OF(e,t){let n=Date.parse(e);if(Number.isNaN(n))return null;let r=t?.ended_at??null,s=r===null?Date.now():Date.parse(r);return Number.isNaN(s)?null:Math.max(0,s-n)}function $F(e,t){let n=Date.parse(e.last_active_at??""),r=Date.parse(t.last_active_at??""),s=(Number.isNaN(r)?0:r)-(Number.isNaN(n)?0:n);return s===0?e.name.localeCompare(t.name):s}var Ja,ts,fF,ns,gf,mF,FT=w(()=>{"use strict";Ja="project:",ts="web_project:",fF="prompt:",ns="default",gf="Default workspace",mF=new Date(0).toISOString()});import{Buffer as UT}from"node:buffer";function WT(e,t,n){if(typeof e=="number"&&Number.isFinite(e)&&e>0)return e;if(t!==void 0&&t!==""){let r=Number(t);if(Number.isFinite(r)&&r>0)return r}return n}function qT(e){return DF[e]}function BT(e){let t=e.trim();if(t==="")return;let n=t.split(/\s+/),r=n.shift();if(!(r===void 0||r===""))return{cmd:r,args:n}}var CF,MF,Ka,DF,Ef=w(()=>{"use strict";CF=1e4,MF=256*1024,Ka=class{opts;sessions=new Map;pushWindowMs;pushByteCap;timers;constructor(t){this.opts=t,this.pushWindowMs=WT(t.pushWindowMs,process.env.LMCTL_TERMINAL_PUSH_WINDOW_MS,CF),this.pushByteCap=WT(t.pushByteCap,process.env.LMCTL_TERMINAL_PUSH_BYTE_CAP,MF),this.timers=t.timers??{setTimeout:(n,r)=>globalThis.setTimeout(n,r),clearTimeout:n=>globalThis.clearTimeout(n)}}startSession(t){if(this.sessions.has(t.session_id))throw new Error(`terminal_session_already_exists: ${t.session_id}`);let n=this.opts.pty.spawn(t.command,t.args,{name:"xterm-256color",cols:t.cols??120,rows:t.rows??30,cwd:t.cwd??process.cwd(),env:t.env??process.env}),r={session_id:t.session_id,pty:n,pendingOutput:[],pendingBytes:0,pushTimer:void 0,closed:!1};return this.sessions.set(t.session_id,r),n.onData(s=>{this.onPtyData(r,s)}),n.onExit(s=>{this.onPtyExit(r,s)}),this.opts.log?.(`[dt-2] terminal session ${t.session_id} started pid=${n.pid} cmd=${t.command}`),{pid:n.pid}}endSession(t){let n=this.sessions.get(t);if(n!==void 0)try{n.pty.kill()}catch{}}onInbound(t){if(t.direction!=="user_to_agent")return;let n=this.sessions.get(t.session_id);if(n===void 0){this.opts.log?.(`[dt-2] inbound terminal data for unknown session ${t.session_id}; dropping`);return}if(n.closed){this.opts.log?.(`[dt-2] inbound terminal data for closed session ${t.session_id}; dropping`);return}try{n.pty.write(t.data)}catch(r){this.opts.log?.(`[dt-2] pty.write failed for session ${t.session_id}: ${r instanceof Error?r.message:String(r)}`)}}setPublish(t){this.opts={...this.opts,publish:t}}listSessions(){return Array.from(this.sessions.values()).map(t=>({session_id:t.session_id,pid:t.pty.pid}))}pendingBytesFor(t){return this.sessions.get(t)?.pendingBytes}async stop(){for(let t of Array.from(this.sessions.values()))try{t.pty.kill()}catch{}for(let t of Array.from(this.sessions.values()))t.pushTimer!==void 0&&(this.timers.clearTimeout(t.pushTimer),t.pushTimer=void 0)}onPtyData(t,n){if(!t.closed){if(t.pendingOutput.push(n),t.pendingBytes+=UT.byteLength(n,"utf8"),t.pendingBytes>=this.pushByteCap){this.flush(t,"byte_cap");return}t.pushTimer===void 0&&(t.pushTimer=this.timers.setTimeout(()=>{this.flush(t,"window_idle")},this.pushWindowMs))}}async flush(t,n){if(t.pushTimer!==void 0&&(this.timers.clearTimeout(t.pushTimer),t.pushTimer=void 0),t.pendingOutput.length===0)return;let r=t.pendingOutput.join("");t.pendingOutput=[],t.pendingBytes=0;let s={kind:"terminal",session_id:t.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=${t.session_id} reason=${n} bytes=${UT.byteLength(r,"utf8")}`)}catch(i){this.opts.log?.(`[dt-2] publish failed session=${t.session_id} reason=${n}: ${i instanceof Error?i.message:String(i)}`)}}async onPtyExit(t,n){if(t.closed)return;await this.flush(t,"pty_exit");let r=`\r
|
|
2334
|
+
`)}function z1(e){return e.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"")}function at(e){return typeof e=="string"?e:""}function Z1(e){if(e===null)return{};try{let t=JSON.parse(e);if(t!==null&&typeof t=="object"&&!Array.isArray(t))return t}catch{return{}}return{}}function af(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}function ja(e,t){return Number(e.req.param(t))}var Pa,lf,kT=w(()=>{"use strict";Da();cn();ju();Pa=[{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."}],lf=Pa.map(e=>e.name)});function eF(e){return e.replace(/^\/+/,"")}function IT(e){return typeof e=="string"&&e!==""&&!e.includes("/")&&!e.includes("\\")}function es(e){if(e.mailboxKey!==void 0&&e.mailboxKey!==null&&e.mailboxKey!==""){let t=eF(e.mailboxKey),n=t.lastIndexOf("/");return(n>=0?t.slice(n+1):t).includes(".")&&(t=n>=0?t.slice(0,n+1):""),t!==""&&!t.endsWith("/")&&(t+="/"),t}return IT(e.userId)&&IT(e.deviceId)?`${e.userId}/${e.deviceId}/`:`${Q1}/${e.identityId}/`}function nF(e){return String(Math.max(0,Math.floor(e))).padStart(tF,"0")}function uf(e,t,n){return`${e}${t}${nF(n)}.json`}function Fa(e,t){return`${e}${t}`}function Ua(e,t,n){let r=`${t}${n}`;if(!e.startsWith(r))return;let s=e.slice(r.length).match(/^(\d+)\.json$/);if(s===null)return;let i=Number(s[1]);return Number.isSafeInteger(i)?i:void 0}var Q1,tF,Wa=w(()=>{"use strict";Q1="mailbox";tF=12});function pn(e,t){let n=Math.floor(e),r="",s=n;for(let d=0;d<12;d++)r=qa[s&15]+r,s=Math.floor(s/16);let i=Math.floor(t()*4096)&4095,o="",a=i;for(let d=0;d<3;d++)o=qa[a&15]+o,a=a>>4;let l=qa[8|Math.floor(t()*4)&3],c="";for(let d=0;d<15;d++)c+=qa[Math.floor(t()*16)&15];return r.slice(0,8)+"-"+r.slice(8,12)+"-7"+o+"-"+l+c.slice(0,3)+"-"+c.slice(3,15)}var qa,Ba=w(()=>{"use strict";qa="0123456789abcdef"});function mf(e,t){return!Number.isFinite(e)||e<=0?t:e}function pf(e){if(e===null||typeof e!="object")return!1;let t=e;return t.name==="NoSuchKey"||t.name==="NotFound"||t.Code==="NoSuchKey"||t.code==="NoSuchKey"||t.$metadata!==void 0&&t.$metadata.httpStatusCode===404}function LT(e){return e.conversation_id===RT&&iF(e.payload)}function iF(e){return typeof e=="object"&&e!==null&&e.kind==="heartbeat"}function oF(e){let t=typeof e.hb=="string"&&e.hb!==""?e.hb:LT(e)?e.timestamp:void 0;if(t===void 0)return;let n=Date.parse(t);return Number.isFinite(n)?n:void 0}var NT,xT,AT,rF,RT,sF,ff,fr,Ha=w(()=>{"use strict";Wa();Ba();NT=3e3,xT=1e4,AT=12e3,rF=1e3,RT="__lmctl_heartbeat__",sF={kind:"heartbeat"},ff={setTimeout:(e,t)=>setTimeout(e,t),clearTimeout:e=>clearTimeout(e)},fr=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(t){this.opts=t,this.basePrefix=es({identityId:t.identityId,userId:t.userId,deviceId:t.deviceId,mailboxKey:t.mailboxKey}),this.ownStream=t.selfRole==="agent"?"local":"web",this.peerStream=t.selfRole==="agent"?"web":"local",this.cursor=t.cursor,this.readIntervalMs=mf(t.readIntervalMs??t.pollIntervalMs??NT,NT),this.heartbeatIdleMs=mf(t.heartbeatIdleMs??xT,xT),this.backoffReadIntervalMs=mf(t.backoffReadIntervalMs??t.pollIntervalMs??AT,AT)}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 t=this.opts.timers??ff;if(this.timerHandle!==null&&(t.clearTimeout(this.timerHandle),this.timerHandle=null),this.heartbeatTimerHandle!==null&&(t.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(t){return this.putEnvelope(t.conversation_id,t.payload)}getCursor(){return this.cursor}getMailboxBasePrefix(){return this.basePrefix}setPollIntervalMs(t){if(!Number.isFinite(t)||t<=0)throw new Error(`SequentialMailboxClient.setPollIntervalMs: invalid ms=${t}`);this.readIntervalMs=t}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 t=await this.maxSeq(this.ownStream);this.ownSeq=t,this.cursor===void 0&&(this.cursor=await this.maxSeq(this.peerStream)),this.bootstrapped=!0}catch(t){throw this.bootstrapPromise=null,this.emitError(t,"list"),t}}async maxSeq(t){let n=Fa(this.basePrefix,t),r=0,s;do{let i=await this.opts.s3.send(new this.opts.commands.ListObjectsV2Command({Bucket:this.opts.bucket,Prefix:n,MaxKeys:rF,...s!==void 0&&{ContinuationToken:s}}));this.opts.onS3Op?.("list");for(let o of i.Contents??[]){let a=Ua(o.Key??"",this.basePrefix,t);a!==void 0&&a>r&&(r=a)}s=i.IsTruncated===!0?i.NextContinuationToken:void 0}while(s!==void 0);return r}async putEnvelope(t,n){let r=this.writeChain.then(()=>this.doPut(t,n));return this.writeChain=r.catch(()=>{}),r}async doPut(t,n){await this.ensureBootstrapped();let r=(this.opts.now??Date.now)(),s=new Date(r).toISOString(),i={message_id:pn(r,this.opts.random??Math.random),from:this.opts.selfRole,timestamp:s,hb:s,conversation_id:t,payload:n},o=(this.ownSeq??0)+1,a=uf(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(t){if(this.stopRequested)return;let n=this.opts.timers??ff;this.timerHandle=n.setTimeout(()=>{this.timerHandle=null,this.runTick()},t)}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 t=(this.cursor??0)+1,n=uf(this.basePrefix,this.peerStream,t),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(t);continue}r=await i.Body.transformToString("utf-8")}catch(i){if(pf(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(t);continue}if(this.recordPeerHeartbeat(s),LT(s)){this.advanceCursor(t);continue}try{await this.opts.onMessage(s)}catch(i){this.emitError(i,"handle");return}this.advanceCursor(t)}}advanceCursor(t){this.cursor=t,this.notifyCursorAdvance(t)}nextReadDelayMs(){return this.peerIsOn((this.opts.now??Date.now)())?this.readIntervalMs:this.backoffReadIntervalMs}peerIsOn(t){return this.lastPeerHeartbeatMs!==void 0&&t-this.lastPeerHeartbeatMs<=this.heartbeatIdleMs}recordPeerHeartbeat(t){let n=oF(t);n!==void 0&&(this.lastPeerHeartbeatMs=n)}recordWrite(t){this.lastWriteMs=t,this.scheduleHeartbeatCheck(this.heartbeatIdleMs)}scheduleHeartbeatCheck(t){if(this.stopRequested)return;let n=this.opts.timers??ff;this.heartbeatTimerHandle!==null&&n.clearTimeout(this.heartbeatTimerHandle),this.heartbeatTimerHandle=n.setTimeout(()=>{this.heartbeatTimerHandle=null,this.maybeWriteHeartbeat()},t)}async maybeWriteHeartbeat(){if(this.stopRequested)return;let t=(this.opts.now??Date.now)();if(this.lastWriteMs!==void 0){let n=t-this.lastWriteMs;if(n<this.heartbeatIdleMs){this.scheduleHeartbeatCheck(this.heartbeatIdleMs-n);return}}await this.writeHeartbeat()}async writeHeartbeat(){try{await this.putEnvelope(RT,sF)}catch(t){this.emitError(t,"put"),this.scheduleHeartbeatCheck(this.heartbeatIdleMs)}}notifyCursorAdvance(t){if(this.opts.onCursorAdvance!==void 0)try{this.opts.onCursorAdvance(t)}catch(n){this.emitError(n,"handle")}}emitError(t,n){if(this.opts.onError!==void 0)try{this.opts.onError(t,n)}catch{}else console.error(`SequentialMailboxClient[${n}]`,t)}}});import{getConnInfo as aF}from"@hono/node-server/conninfo";function OT(e,t){let n=t.bucket??lF,r=t.remoteAddressOf??(i=>dF(i)),s=i=>{let o=r(i);return uF(o)?null:i.json({error:"forbidden",message:"local-mailbox is loopback-only"},403)};e.get("/local-mailbox/object",async i=>{let o=s(i);if(o!==null)return o;let a=_f(i.req.query("key"));if(typeof a!="string")return i.json({error:"bad_request",message:a.error},400);try{let l=await t.s3.send(new t.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 pf(l)?i.json({error:"not_found"},404):i.json({error:"internal",message:hf(l)},500)}}),e.put("/local-mailbox/object",async i=>{let o=s(i);if(o!==null)return o;let a=_f(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 t.s3.send(new t.commands.PutObjectCommand({Bucket:n,Key:a,Body:l})),i.json({ok:!0})}catch(c){return i.json({error:"internal",message:hf(c)},500)}}),e.get("/local-mailbox/list",async i=>{let o=s(i);if(o!==null)return o;let a=i.req.query("prefix")??"",l=_f(a,{allowEmpty:!0});if(typeof l!="string")return i.json({error:"bad_request",message:l.error},400);let c=cF(i.req.query("maxKeys")),d=i.req.query("token");try{let u=await t.s3.send(new t.commands.ListObjectsV2Command({Bucket:n,Prefix:l,...c!==void 0?{MaxKeys:c}:{},...d!==void 0&&d!==""?{ContinuationToken:d}:{}}));return i.json({Contents:(u.Contents??[]).map(f=>({Key:f.Key,LastModified:f.LastModified instanceof Date?f.LastModified.toISOString():f.LastModified})),IsTruncated:u.IsTruncated??!1,...u.NextContinuationToken!==void 0?{NextContinuationToken:u.NextContinuationToken}:{}})}catch(u){return i.json({error:"internal",message:hf(u)},500)}})}function _f(e,t={}){if(e===void 0||e==="")return t.allowEmpty===!0?"":{error:"key required"};let n=e.replace(/^\/+/,"");return n.split("/").includes("..")?{error:"key must not contain '..'"}:n}function cF(e){if(e===void 0||e==="")return;let t=Number(e);return Number.isInteger(t)&&t>0?t:void 0}function dF(e){try{return aF(e).remote.address}catch{return}}function uF(e){return e===void 0||e===""?!1:!!(e==="127.0.0.1"||e==="::1"||e.startsWith("::ffff:127.")||e.startsWith("127."))}function hf(e){return e instanceof Error?e.message:String(e)}var lF,$T=w(()=>{"use strict";Ha();lF="local"});function CT(e,t){e.get("/mailbox/workspace",n=>pF(n,t)),e.get("/mailbox/projects",n=>_F(n,t)),e.get("/mailbox/projects/:id",n=>hF(n,t)),e.post("/mailbox/projects",n=>gF(n,t)),e.patch("/mailbox/projects/:id",n=>yF(n,t)),e.delete("/mailbox/projects/:id",n=>EF(n,t)),e.post("/mailbox/projects/:project_id/prompts",n=>wF(n,t)),e.get("/mailbox/prompts/:id",n=>TF(n,t))}function pF(e,t){t.dal.ensureWorkspace({id:ns,name:gf});let n=MT(t.dal),r={id:ns,name:gf,created_at:mF,projects:n};return e.json({workspace:r})}function _F(e,t){return e.json({projects:MT(t.dal)})}function hF(e,t){let n=e.req.param("id");if(n===void 0||n==="")return e.json({error:"bad_request",message:"project id required"},400);if(n.startsWith(ts)){let s=yf(t.dal,n);return s===null||s.deleted_at!==null?e.json({project:null},404):e.json({project:Ga(s)})}let r=jT(t.dal,n);return r===null?e.json({project:null},404):e.json({project:DT(r)})}async function gF(e,t){let n;try{n=await e.req.json()}catch{return e.json({error:"bad_request",message:"invalid JSON body"},400)}let r=n.input;if(r===void 0||typeof r!="object")return e.json({error:"bad_request",message:"input is required"},400);if(typeof r.name!="string"||r.name==="")return e.json({error:"bad_request",message:"input.name is required"},400);if(typeof r.repo_path!="string"||r.repo_path==="")return e.json({error:"bad_request",message:"input.repo_path is required"},400);t.dal.ensureWorkspace({id:ns,name:gf});let s=t.dal.insertWebProject({workspace_id:ns,name:r.name,repo_path:r.repo_path,config_json:r.config_json===void 0?null:JSON.stringify(r.config_json)});return e.json({project:Ga(s)},201)}async function yF(e,t){let n=e.req.param("id");if(n===void 0||n==="")return e.json({error:"bad_request",message:"project id required"},400);let r;try{r=await e.req.json()}catch{return e.json({error:"bad_request",message:"invalid JSON body"},400)}let s=r.input??{};if(n.startsWith(ts)){let i=yf(t.dal,n);if(i===null||i.deleted_at!==null)return e.json({error:"project_not_found",message:`project not found: ${n}`},404);let o=t.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?e.json({error:"project_not_found",message:`project not found: ${n}`},404):e.json({project:Ga(o)})}return e.json({error:"project_not_found",message:`project not found: ${n}`},404)}function EF(e,t){let n=e.req.param("id");if(n===void 0||n==="")return e.json({error:"bad_request",message:"project id required"},400);if(n.startsWith(ts)){let r=yf(t.dal,n);if(r===null)return e.json({deleted:!1});let s=t.dal.softDeleteWebProject(r.id);return e.json({deleted:s})}return e.json({deleted:!1})}async function wF(e,t){let n=e.req.param("project_id");if(n===void 0||n==="")return e.json({error:"bad_request",message:"project_id required in path"},400);let r;try{r=await e.req.json()}catch{return e.json({error:"bad_request",message:"invalid JSON body"},400)}let s=r.input;if(s===void 0||typeof s!="object")return e.json({error:"bad_request",message:"input is required"},400);let i=s.project_id??n;if(typeof s.text!="string"||s.text==="")return e.json({error:"bad_request",message:"input.text is required"},400);let o=jT(t.dal,i);if(o===null)return e.json({error:"project_not_found",message:`project not found: ${i}`},404);if(t.dal.getWorkflowByName(o.workflow_name)===null)return e.json({error:"workflow_not_registered",message:`project ${o.name} has no registered workflow "${o.workflow_name}"`},400);let l=`${fF}${crypto.randomUUID()}`,c={text:s.text,context_json:s.context_json??null},d;t.enqueueProjectJob!==void 0?d=t.enqueueProjectJob({dal:t.dal,project_id:o.id,source_ref:l,payload:c}):d=await vF({dal:t.dal,project_id:o.id,source_ref:l,payload:c}),t.dal.insertPromptDispatch({prompt_id:l,project_id:o.id,job_id:d.id,text:s.text,context_json:s.context_json===void 0?null:JSON.stringify(s.context_json)});let u={id:l,project_id:`${Ja}${o.id}`,text:s.text,status:"pending",created_at:new Date().toISOString(),completed_at:null};return e.json({prompt:u},201)}function TF(e,t){let n=e.req.param("id");if(n===void 0||n==="")return e.json({error:"bad_request",message:"prompt id required"},400);let r=bF(t.dal,n);return e.json({result:r})}function MT(e){let t=e.listProjects().map(DT),n=e.listWebProjectsActive(ns).map(Ga);return[...t,...n].sort($F)}function DT(e){return{id:`${Ja}${e.id}`,workspace_id:ns,name:e.name,repo_path:e.local_path,config_json:{workflow_name:e.workflow_name,team_id:e.team_id,durable_memory_mode:e.durable_memory_mode},last_active_at:null,created_at:e.created_at}}function Ga(e){let t={};if(e.config_json!==null)try{let n=JSON.parse(e.config_json);n!==null&&typeof n=="object"&&(t=n)}catch{}return e.linked_v4_project_id!==null&&(t={...t,linked_v4_project_id:e.linked_v4_project_id}),{id:`${ts}${e.id}`,workspace_id:e.workspace_id,name:e.name,repo_path:e.repo_path,config_json:t,last_active_at:e.last_active_at,created_at:e.created_at}}function yf(e,t){if(!t.startsWith(ts))return null;let n=t.slice(ts.length),r=Number.parseInt(n,10);return!Number.isFinite(r)||String(r)!==n?null:e.getWebProject(r)}function jT(e,t){if(t.startsWith(Ja)){let r=t.slice(Ja.length),s=Number.parseInt(r,10);if(Number.isFinite(s)&&String(s)===r)return e.getProject(s)}let n=Number.parseInt(t,10);return Number.isFinite(n)&&String(n)===t?e.getProject(n):null}async function vF(e){let{enqueueManual:t}=await Promise.resolve().then(()=>(ku(),tE));return{id:t(e.dal,{project_id:e.project_id,source_ref:e.source_ref,payload:e.payload}).id}}function bF(e,t){let n=e.getPromptDispatch(t);if(n===null)return{prompt_id:t,data:{status:"unknown"},errors_json:{error:"prompt_not_found"},duration_ms:null};let r=e.getJob(n.job_id);if(r===null)return{prompt_id:t,data:null,errors_json:{error:"job_missing",job_id:n.job_id},duration_ms:null};let s=r.run_id===null?null:e.getRun(r.run_id),i=e.getProject(n.project_id),o=RF(e,i?.team_id??null),a=AF(s),l=LF(r,a,o.length>0),c=OF(n.created_at,s),d=i===null?{totalEstimatedMs:void 0,perStep:new Map}:SF(e,i.workflow_name),u=d.totalEstimatedMs,f=PT(n.created_at),m=i?.workflow_name,p=d.perStep.size>0?d.perStep.size:void 0,_=s===null?[]:kF(e,s.id),h=IF(s,a,_,d.perStep,o),g=NF(_,d.perStep),y=xF(h,g,u,f,m,p);return l==="error"?{prompt_id:t,data:{status:l,job_id:r.id,project_id:n.project_id,run_id:s?.id??null,...Xa(u,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&&e.setPromptDispatchCompleted(t),{prompt_id:t,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,...Xa(u,f),...y},errors_json:null,duration_ms:c}):l==="paused"?{prompt_id:t,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,...Xa(u,f),...y},errors_json:null,duration_ms:c}:{prompt_id:t,data:{status:l,job_id:r.id,project_id:n.project_id,run_id:s?.id??null,attempt_count:r.attempt_count,...Xa(u,f),...y},errors_json:null,duration_ms:c}}function SF(e,t){let n={totalEstimatedMs:void 0,perStep:new Map},r=e.getWorkflowByName(t);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 d=typeof c.name=="string"&&c.name.length>0?c.name:c.id,u=typeof c.estimated_duration_ms=="number"&&Number.isFinite(c.estimated_duration_ms)&&c.estimated_duration_ms>=0?c.estimated_duration_ms:void 0;a.set(c.id,u===void 0?{name:d}:{name:d,estimated_duration_ms:u})}if(i.steps===void 0&&i.states!==null&&typeof i.states=="object")for(let[l,c]of Object.entries(i.states)){if(c===null||typeof c!="object")continue;let d=c,u=typeof d.estimated_duration_ms=="number"&&Number.isFinite(d.estimated_duration_ms)&&d.estimated_duration_ms>=0?d.estimated_duration_ms:void 0;a.set(l,u===void 0?{name:l}:{name:l,estimated_duration_ms:u})}return{totalEstimatedMs:o,perStep:a}}function kF(e,t){try{return e.listStepsForRun(t)}catch{return[]}}function IF(e,t,n,r,s){if(e===null||e.terminal_state!==null)return;let i=t!==null?t:e.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??e.paused_at??e.started_at,l=r.get(i),c=l?.name??i,d=PT(a),u={id:i,name:c,started_at:a,elapsed_ms:d};return l?.estimated_duration_ms!==void 0&&(u.estimated_duration_ms=l.estimated_duration_ms),s.length>0&&(u.attention_needed=s),u}function NF(e,t){let n=[];for(let r of e){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=t.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 xF(e,t,n,r,s,i){let o={completed_steps:t,total_elapsed_ms:r};return e!==void 0&&(o.current_step=e),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 PT(e){let t=Date.parse(e);return Number.isNaN(t)?0:Math.max(0,Date.now()-t)}function Xa(e,t){return e===void 0?{elapsed_ms:t}:{elapsed_ms:t,estimated_duration_ms:e}}function AF(e){if(e===null)return null;let t=e.current_state;if(t===null)return null;let n="__paused__:";return t.startsWith(n)?t.slice(n.length):null}function RF(e,t){if(t===null)return[];let n;try{n=e.listTeamMembers(t)}catch{return[]}return n.filter(r=>r.state==="attention_needed").map(r=>({alias:r.alias,reason:r.state_reason}))}function LF(e,t,n){return e.status==="queued"?"pending":e.status==="done"?"done":e.status==="failed"?"error":t!==null||n||e.status==="paused"?"paused":e.status==="running"?"running":"error"}function OF(e,t){let n=Date.parse(e);if(Number.isNaN(n))return null;let r=t?.ended_at??null,s=r===null?Date.now():Date.parse(r);return Number.isNaN(s)?null:Math.max(0,s-n)}function $F(e,t){let n=Date.parse(e.last_active_at??""),r=Date.parse(t.last_active_at??""),s=(Number.isNaN(r)?0:r)-(Number.isNaN(n)?0:n);return s===0?e.name.localeCompare(t.name):s}var Ja,ts,fF,ns,gf,mF,FT=w(()=>{"use strict";Ja="project:",ts="web_project:",fF="prompt:",ns="default",gf="Default workspace",mF=new Date(0).toISOString()});import{Buffer as UT}from"node:buffer";function WT(e,t,n){if(typeof e=="number"&&Number.isFinite(e)&&e>0)return e;if(t!==void 0&&t!==""){let r=Number(t);if(Number.isFinite(r)&&r>0)return r}return n}function qT(e){return DF[e]}function BT(e){let t=e.trim();if(t==="")return;let n=t.split(/\s+/),r=n.shift();if(!(r===void 0||r===""))return{cmd:r,args:n}}var CF,MF,Ka,DF,Ef=w(()=>{"use strict";CF=1e4,MF=256*1024,Ka=class{opts;sessions=new Map;pushWindowMs;pushByteCap;timers;constructor(t){this.opts=t,this.pushWindowMs=WT(t.pushWindowMs,process.env.LMCTL_TERMINAL_PUSH_WINDOW_MS,CF),this.pushByteCap=WT(t.pushByteCap,process.env.LMCTL_TERMINAL_PUSH_BYTE_CAP,MF),this.timers=t.timers??{setTimeout:(n,r)=>globalThis.setTimeout(n,r),clearTimeout:n=>globalThis.clearTimeout(n)}}startSession(t){if(this.sessions.has(t.session_id))throw new Error(`terminal_session_already_exists: ${t.session_id}`);let n=this.opts.pty.spawn(t.command,t.args,{name:"xterm-256color",cols:t.cols??120,rows:t.rows??30,cwd:t.cwd??process.cwd(),env:t.env??process.env}),r={session_id:t.session_id,pty:n,pendingOutput:[],pendingBytes:0,pushTimer:void 0,closed:!1};return this.sessions.set(t.session_id,r),n.onData(s=>{this.onPtyData(r,s)}),n.onExit(s=>{this.onPtyExit(r,s)}),this.opts.log?.(`[dt-2] terminal session ${t.session_id} started pid=${n.pid} cmd=${t.command}`),{pid:n.pid}}endSession(t){let n=this.sessions.get(t);if(n!==void 0)try{n.pty.kill()}catch{}}onInbound(t){if(t.direction!=="user_to_agent")return;let n=this.sessions.get(t.session_id);if(n===void 0){this.opts.log?.(`[dt-2] inbound terminal data for unknown session ${t.session_id}; dropping`);return}if(n.closed){this.opts.log?.(`[dt-2] inbound terminal data for closed session ${t.session_id}; dropping`);return}try{n.pty.write(t.data)}catch(r){this.opts.log?.(`[dt-2] pty.write failed for session ${t.session_id}: ${r instanceof Error?r.message:String(r)}`)}}setPublish(t){this.opts={...this.opts,publish:t}}listSessions(){return Array.from(this.sessions.values()).map(t=>({session_id:t.session_id,pid:t.pty.pid}))}pendingBytesFor(t){return this.sessions.get(t)?.pendingBytes}async stop(){for(let t of Array.from(this.sessions.values()))try{t.pty.kill()}catch{}for(let t of Array.from(this.sessions.values()))t.pushTimer!==void 0&&(this.timers.clearTimeout(t.pushTimer),t.pushTimer=void 0)}onPtyData(t,n){if(!t.closed){if(t.pendingOutput.push(n),t.pendingBytes+=UT.byteLength(n,"utf8"),t.pendingBytes>=this.pushByteCap){this.flush(t,"byte_cap");return}t.pushTimer===void 0&&(t.pushTimer=this.timers.setTimeout(()=>{this.flush(t,"window_idle")},this.pushWindowMs))}}async flush(t,n){if(t.pushTimer!==void 0&&(this.timers.clearTimeout(t.pushTimer),t.pushTimer=void 0),t.pendingOutput.length===0)return;let r=t.pendingOutput.join("");t.pendingOutput=[],t.pendingBytes=0;let s={kind:"terminal",session_id:t.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=${t.session_id} reason=${n} bytes=${UT.byteLength(r,"utf8")}`)}catch(i){this.opts.log?.(`[dt-2] publish failed session=${t.session_id} reason=${n}: ${i instanceof Error?i.message:String(i)}`)}}async onPtyExit(t,n){if(t.closed)return;await this.flush(t,"pty_exit");let r=`\r
|
|
2335
2335
|
[process exited with code ${n.exitCode}${n.signal!==void 0?` signal ${n.signal}`:""}]\r
|
|
2336
2336
|
`,s={kind:"terminal",session_id:t.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=${t.session_id}: ${i instanceof Error?i.message:String(i)}`)}t.closed=!0,this.sessions.delete(t.session_id)}};DF={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 XT(e,t){e.post("/mailbox/terminal/launch",n=>jF(n,t)),e.post("/mailbox/terminal/end/:session_id",n=>PF(n,t)),e.get("/mailbox/terminal/sessions",n=>FF(n,t))}async function jF(e,t){let n=t.terminalSessionManager;if(n===void 0)return e.json({error:"terminal_unavailable",message:"terminal session manager not configured (mailbox runtime missing)"},503);let r;try{r=await e.req.json()}catch{return e.json({error:"bad_request",message:"invalid JSON body"},400)}let s=r.session_id;if(typeof s!="string"||!HT.test(s))return e.json({error:"bad_request",message:"session_id must be a UUIDv7 string"},400);let i=r.provider;if(typeof i!="string"||i==="")return e.json({error:"bad_request",message:"provider is required"},400);let o;if(typeof r.command_line=="string"&&r.command_line.trim()!==""){if(o=BT(r.command_line),o===void 0)return e.json({error:"bad_request",message:"command_line could not be parsed"},400)}else{let a=qT(i);if(a===void 0)return e.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 e.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")?e.json({error:"session_exists",message:l},409):e.json({error:"spawn_failed",message:l},500)}}function PF(e,t){let n=t.terminalSessionManager;if(n===void 0)return e.json({error:"terminal_unavailable",message:"terminal session manager not configured"},503);let r=e.req.param("session_id");return r===void 0||!HT.test(r)?e.json({error:"bad_request",message:"session_id must be a UUIDv7 string"},400):(n.endSession(r),e.json({session_id:r,ended:!0}))}function FF(e,t){let n=t.terminalSessionManager;return n===void 0?e.json({sessions:[],note:"terminal session manager not configured"}):e.json({sessions:n.listSessions()})}var HT,JT=w(()=>{"use strict";Ef();HT=/^[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 UF}from"node:buffer";function BF(e){try{return UF.byteLength(JSON.stringify(e),"utf8")}catch{return 256}}function GT(e,t,n){if(typeof e=="number"&&Number.isFinite(e)&&e>0)return e;if(t!==void 0&&t!==""){let r=Number(t);if(Number.isFinite(r)&&r>0)return r}return n}function KT(e){return HF[e]}function VT(e){let t=e.trim();if(t==="")return;let n=[],r=0;for(;r<t.length;){let i=t[r];if(i===" "||i===" "){r+=1;continue}if(i==='"'){let a=r+1,l="";for(;a<t.length&&t[a]!=='"';)l+=t[a],a+=1;n.push(l),r=a+1;continue}let o=r;for(;o<t.length&&t[o]!==" "&&t[o]!==" ";)o+=1;n.push(t.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 WF,qF,Va,HF,wf=w(()=>{"use strict";WF=2e3,qF=64*1024,Va=class{opts;sessions=new Map;pushWindowMs;pushByteCap;timers;constructor(t){this.opts=t,this.pushWindowMs=GT(t.pushWindowMs,process.env.LMCTL_PROVIDER_PUSH_WINDOW_MS,WF),this.pushByteCap=GT(t.pushByteCap,process.env.LMCTL_PROVIDER_PUSH_BYTE_CAP,qF),this.timers=t.timers??{setTimeout:(n,r)=>globalThis.setTimeout(n,r),clearTimeout:n=>globalThis.clearTimeout(n)}}async startSession(t){if(this.sessions.has(t.session_id))throw new Error(`persistent_session_already_exists: ${t.session_id}`);let n=this.opts.adapterFactory(t.provider),r={session_id:t.session_id,provider:t.provider,adapter:n,child:void 0,pendingEvents:[],pendingBytes:0,pushTimer:void 0,generation:1,turnMap:new Map,closed:!1};this.sessions.set(t.session_id,r);let s=this.makeAdapterContext(r);try{let i=await n.start(t,s);return r.child=i,this.wireChildExit(r,i),this.opts.log?.(`[dt-3] persistent session ${t.session_id} started provider=${t.provider} pid=${i.pid??"?"}`),{pid:i.pid}}catch(i){throw this.sessions.delete(t.session_id),i}}async endSession(t){let n=this.sessions.get(t);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(t)}}async onInbound(t){if(t.direction!=="user_to_agent")return;let n=this.sessions.get(t.session_id);if(n===void 0){this.opts.log?.(`[dt-3] inbound provider data for unknown session ${t.session_id}; dropping`);return}if(n.closed){this.opts.log?.(`[dt-3] inbound provider data for closed session ${t.session_id}; dropping`);return}let r=t.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=${t.session_id}: ${i}`),this.appendEvent(n,{event_type:"error",payload:{message:`sendTurn failed: ${i}`}})}}setPublish(t){this.opts={...this.opts,publish:t}}listSessions(){return Array.from(this.sessions.values()).map(t=>({session_id:t.session_id,provider:t.provider,pid:t.child?.pid}))}pendingEventCountFor(t){return this.sessions.get(t)?.pendingEvents.length}generationFor(t){return this.sessions.get(t)?.generation}_testBumpGeneration(t){let n=this.sessions.get(t);n!==void 0&&(n.generation+=1)}async stop(){for(let t of Array.from(this.sessions.values())){t.generation+=1;try{await t.adapter.stop()}catch{}if(t.child!==void 0)try{t.child.kill("SIGTERM")}catch{}}for(let t of Array.from(this.sessions.values()))t.pushTimer!==void 0&&(this.timers.clearTimeout(t.pushTimer),t.pushTimer=void 0)}makeAdapterContext(t){let n=t.generation,r=this;return{generation:n,currentGeneration(){return t.generation},emit(s){n===t.generation&&(t.closed||r.appendEvent(t,s))},...r.opts.log!==void 0?{log:r.opts.log}:{},turnMap:t.turnMap}}appendEvent(t,n){t.pendingEvents.push(n);let r=BF(n);if(t.pendingBytes+=r,t.pendingBytes>=this.pushByteCap){this.flush(t,"byte_cap");return}t.pushTimer===void 0&&(t.pushTimer=this.timers.setTimeout(()=>{this.flush(t,"window_idle")},this.pushWindowMs))}async flush(t,n){if(t.pushTimer!==void 0&&(this.timers.clearTimeout(t.pushTimer),t.pushTimer=void 0),t.pendingEvents.length===0)return;let r=t.pendingEvents;t.pendingEvents=[],t.pendingBytes=0;let s={kind:"provider",session_id:t.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=${t.session_id} reason=${n} events=${r.length}`)}catch(i){this.opts.log?.(`[dt-3] publish failed session=${t.session_id} reason=${n}: ${i instanceof Error?i.message:String(i)}`)}}wireChildExit(t,n){let r=t.generation;n.on("exit",(s,i)=>{r===t.generation&&(t.closed||(this.appendEvent(t,{event_type:"error",payload:{message:`provider child exited code=${s??"?"} signal=${i??""}; session ended. Click Reset to start a new chat.`}}),this.flush(t,"child_exit"),t.closed=!0))}),n.on("error",s=>{r===t.generation&&(t.closed||(this.appendEvent(t,{event_type:"error",payload:{message:`provider child error: ${s.message}`}}),this.flush(t,"child_exit")))})}};HF={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 zT(e,t){e.post("/mailbox/chat/launch",n=>XF(n,t)),e.post("/mailbox/chat/end/:session_id",n=>JF(n,t)),e.get("/mailbox/chat/sessions",n=>GF(n,t))}async function XF(e,t){let n=t.persistentSessionManager;if(n===void 0)return e.json({error:"chat_unavailable",message:"persistent session manager not configured (mailbox runtime missing)"},503);let r;try{r=await e.req.json()}catch{return e.json({error:"bad_request",message:"invalid JSON body"},400)}let s=r.session_id;if(typeof s!="string"||!YT.test(s))return e.json({error:"bad_request",message:"session_id must be a UUIDv7 string"},400);let i=r.provider;if(typeof i!="string"||i==="")return e.json({error:"bad_request",message:"provider is required"},400);let o;if(typeof r.command_line=="string"&&r.command_line.trim()!==""){if(o=VT(r.command_line),o===void 0)return e.json({error:"bad_request",message:"command_line could not be parsed"},400)}else{let a=KT(i);if(a===void 0)return e.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 e.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")?e.json({error:"session_exists",message:l},409):l.startsWith("no_persistent_adapter_for_provider")?e.json({error:"no_adapter",message:l},400):e.json({error:"spawn_failed",message:l},500)}}async function JF(e,t){let n=t.persistentSessionManager;if(n===void 0)return e.json({error:"chat_unavailable",message:"persistent session manager not configured"},503);let r=e.req.param("session_id");return r===void 0||!YT.test(r)?e.json({error:"bad_request",message:"session_id must be a UUIDv7 string"},400):(await n.endSession(r),e.json({session_id:r,ended:!0}))}function GF(e,t){let n=t.persistentSessionManager;return n===void 0?e.json({sessions:[],note:"persistent session manager not configured"}):e.json({sessions:n.listSessions()})}var YT,ZT=w(()=>{"use strict";wf();YT=/^[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 KF}from"node:fs";function ev(e){let t=e.artifacts.find(n=>n.kind===`${e.state_name}_transcript`);if(t?.content!==void 0&&t.content!==null)return QT(t.content);if(t?.path===void 0||t.path===null)return[];try{let n=KF(t.path,{encoding:"utf8"});return QT(n)}catch{return[]}}function QT(e){let t=e.split(/\r?\n/).filter(n=>n.trim().length>0);return t.length===0?[]:t.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 tv=w(()=>{"use strict"});function nv(e,t,n){let r=e.getRun(t);if(r===null)return{err:`run ${t}: not found`};if(n!==void 0){let l=e.findTeamMemberByAlias(r.team_id,n);return l===null?{err:`run ${t}: team has no member alias "${n}"`}:l.sessionid===null||l.sessionid.length===0?{err:`run ${t}: 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=e.latestAgentCall(t);if(s!==null){let l=e.findTeamMemberByAlias(r.team_id,s.alias);return l===null?{err:`run ${t}: 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 ${t}: 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=e.listTeamMembers(r.team_id).filter(l=>l.state!=="retired"&&l.sessionid!==null&&l.sessionid.length>0);if(o.length===0)return{err:`run ${t}: 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 ${t}: 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 Ya(e,t){let n=e.query(`SELECT id, kind FROM attention
|
|
2337
2337
|
WHERE run_id = ?
|
|
@@ -2423,7 +2423,7 @@ ${i.text}`;return _n("mailbox_delivery_attempt_stalled",n,{stalled_after_ms:i.st
|
|
|
2423
2423
|
Either drop the second arg, or pass <teamfile>.lmctl as the first arg.`}:{mode:"error",message:`lmctl ${e.name}: can't infer target type from "${n}".
|
|
2424
2424
|
Expected one of: <path>.lmctl, <path>.lmctl:<alias>, <sessionid>.`}}if(s.session!==void 0){if(!e.supportsRaw)return{mode:"error",message:`lmctl ${e.name}: --session (raw mode) is not supported by ${e.name}.`};let o={mode:"ai-team-raw",sessionid:s.session};return s.provider!==void 0&&(o.provider=s.provider),o}return{mode:"error",message:`lmctl ${e.name}: a target is required.
|
|
2425
2425
|
Use: <path>.lmctl[:<alias>] | <path>.lmctl <alias> | <sessionid> | --run <id>`}}var we,MW,DW,ml,rt=w(()=>{"use strict";hn();Kt();we=class extends Error{constructor(t){super(t),this.name="ChatTargetError"}},MW=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i,DW=/^ses_[A-Za-z0-9_-]+$/,ml=/^[A-Za-z][A-Za-z0-9_-]*$/});function pl(e){return FW.has(e)}function Uf(){return Ff===null&&(Ff=Dt(Ut())),Ff}function Wf(e,t,n={}){if(!pl(e))return null;try{let r=Uf().getAdapter?.(e);if(r===void 0)return null;let s=r.resumeCommand(t).trim();if(s.length===0)return null;let i=s.split(/\s+/),o=e==="codex"&&n.isLead===!0?ho({warn:()=>{}}):[],a=n.model!==void 0&&n.model.trim().length>0?PW[e]?.(n.model):void 0;return n.model!==void 0&&n.model.trim().length>0&&a===void 0&&n.onModelIgnored?.({provider:e,model:n.model,reason:`${e} terminal resume does not implement per-session model selection`}),[...i,...a??[],...o,...ib[e]??[]]}catch{return null}}function _l(e,t,n={}){let r=Wf(e,t,n);return r===null?null:r.join(" ")}function De(e,t){return Uf().getSession(e,t)}async function as(e){return(await Uf().resolveSessions(e)).map(n=>n.provider.name)}var ib,PW,FW,ob,Ff,At=w(()=>{"use strict";vt();qc();ib={claude:["--dangerously-skip-permissions"],codex:["--dangerously-bypass-approvals-and-sandbox"],gemini:["-y"],copilot:["--yolo"],opencode:[],qwen:["--approval-mode","yolo"],agy:[],lmplayer:[],kimi:[]},PW={claude:e=>["--model",e],codex:e=>["--model",e],gemini:e=>["--model",e],opencode:e=>["--model",e],qwen:e=>["--model",e],agy:e=>["--model",e],lmplayer:e=>["--model",e],kimi:e=>["--model",e]},FW=new Set(Object.keys(ib)),ob=/^[\w.:-]+$/;Ff=null});function UW(e=process.env){let t=e.LMCTL_SESSION_IDLE_TIMEOUT_MS;if(t===void 0||t.trim()==="")return ab;let n=Number(t);return!Number.isFinite(n)||n<=0?ab:n}async function WW(e,t,n){try{let r=Te(t,n,e),s=r.sessionid;if(typeof s!="string"||s.trim()===""||s===".")return null;let i;if(typeof r.provider=="string"&&r.provider.trim()!=="")i=r.provider;else{let c=await as(s);if(c.length!==1)return null;i=c[0]}let o=await De(s,i);if(o===null)return null;let a=o.modifiedAt;if(!(a instanceof Date))return null;let l=a.getTime();return Number.isFinite(l)?Date.now()-l:null}catch{return null}}async function ls(e,t,n,r,s){if(!t.busy||t.reason!=="in-flight")return!1;let i=s??UW(),o=await WW(e,n,r),a=o!==null&&o>=i;return a&&$({event:"session_idle_reclaim",receiver_teamfile:n,receiver_alias:r,idle_ms:o,idle_minutes:o===null?null:Math.round(o/6e4),threshold_ms:i,reason:"in-flight holder idle past session-idle threshold; lease will be force-reclaimed"}),a}var ab,hl=w(()=>{"use strict";ce();At();rt();ab=36e5});function qW(e=process.env){let t=e.LMCTL_DAEMON_MAILBOX_RELAY_MAX_BATCHES;if(t===void 0||t.trim()==="")return lb;let n=Number(t);return!Number.isFinite(n)||n<=0?lb:Math.max(1,Math.trunc(n))}async function db(e){let t=e.env??process.env,n=e.maxBatches??qW(t),r=VW(e.dal),s={scanned:0,delivered:0,skipped_busy:0,skipped_terminal:0,errors:0};KW(e.dal,t);let i=new Set;for(;s.scanned<n;){let o=e.dal.listRelayMailboxLanes(n).find(l=>!i.has(cb(l)));if(o===void 0)break;i.add(cb(o)),s.scanned+=1;let a=await BW(e.dal,r,t,o);s.delivered+=a.delivered,s.skipped_busy+=a.skipped_busy,s.skipped_terminal+=a.skipped_terminal,s.errors+=a.errors}return s}function cb(e){return JSON.stringify([e.sender_teamfile,e.sender_alias,e.receiver_teamfile,e.receiver_alias])}async function BW(e,t,n,r){let s={scanned:0,delivered:0,skipped_busy:0,skipped_terminal:0,errors:0};sl(e,r.receiver_teamfile,r.receiver_alias);let i=ht(e,r.receiver_teamfile,r.receiver_alias),o=!1;if(i.busy){if(!await ls(e,i,r.receiver_teamfile,r.receiver_alias))return i.reason==="terminal-held"?{...s,skipped_terminal:1}:{...s,skipped_busy:1};o=!0}let a=null,l=null;try{let c=Te(r.receiver_teamfile,r.receiver_alias,e),d=Mt(e,{receiver_teamfile:r.receiver_teamfile,receiver_alias:r.receiver_alias,sender_teamfile:r.sender_teamfile,sender_alias:r.sender_alias,ttlMs:Xt(),...o?{force:!0}:{}});if(!d.acquired)return{...s,skipped_busy:1};if(a={row:d.lease,leaseId:d.leaseId},l=In(f=>e.heartbeatAgentInflight(a.row,a.leaseId,f),{intervalMs:kr(n)}),r.message_type==="response"){let f=await ol({sender:{teamfile:r.sender_teamfile,alias:r.sender_alias},receiver:{teamfile:r.receiver_teamfile,alias:r.receiver_alias,provider:c.provider,sessionId:c.sessionid,cwd:c.sessiondir,...c.model!==void 0?{model:c.model}:{},...c.effort!==void 0?{effort:c.effort}:{},...c.isLead!==void 0?{isLead:c.isLead}:{}},io:t,permissionMode:"yolo",env:n});return JW(f)}let u=await is({sender:{teamfile:r.sender_teamfile,alias:r.sender_alias},receiver:{teamfile:r.receiver_teamfile,alias:r.receiver_alias,provider:c.provider,sessionId:c.sessionid,cwd:c.sessiondir,...c.model!==void 0?{model:c.model}:{},...c.effort!==void 0?{effort:c.effort}:{},...c.isLead!==void 0?{isLead:c.isLead}:{}},io:t,permissionMode:"yolo",env:n,finalize:"caller"});return XW(e,u)}catch(c){return HW(e,r,`relay delivery error: ${c instanceof Error?c.message:String(c)}`)}finally{if(l!==null&&clearInterval(l),a!==null)try{e.releaseAgentInflight(a.row,a.leaseId)}catch{}}}function HW(e,t,n){let r={scanned:0,delivered:0,skipped_busy:0,skipped_terminal:0,errors:0};try{let s=t.message_type==="response"?e.listEnqueuedResponseMailFromSender(t.sender_teamfile,t.sender_alias,t.receiver_teamfile,t.receiver_alias):e.listEnqueuedRequestMailFromSender(t.sender_teamfile,t.sender_alias,t.receiver_teamfile,t.receiver_alias),i=t.message_type==="response"?e.markMailDelivered(s.map(o=>o.id),n,new Date().toISOString()):e.markRelayRequestDeliveredAndEnqueueResponses(s,n,new Date().toISOString()).marked;return{...r,delivered:i,errors:1}}catch{return{...r,errors:1}}}function XW(e,t){let n={scanned:0,delivered:0,skipped_busy:0,skipped_terminal:0,errors:0},r=GW(t),s=new Date().toISOString(),{marked:i}=e.markRelayRequestDeliveredAndEnqueueResponses(t.queued,r,s);return{...n,delivered:i,errors:t.status==="ok"?0:1}}function JW(e){return{...{scanned:0,delivered:0,skipped_busy:0,skipped_terminal:0,errors:0},delivered:e.deliveredIds.length,errors:e.status==="ok"?0:1}}function GW(e){return e.status==="ok"?e.receipt:e.status==="stalled"?`relay delivery error: provider stalled${e.stalledAfterMs!==void 0?` after ${e.stalledAfterMs}ms`:""}
|
|
2426
|
-
${e.receipt}`:`relay delivery error: ${e.error}`}function KW(e,t){e.reclaimStaleMailboxDeliveries(new Date(Date.now()-Af(t)).toISOString())}function VW(e){return{stdout:{write:()=>{}},stderr:{write:()=>{}},dal:e}}var lb,ub=w(()=>{"use strict";gt();_i();ll();hi();rt();hl();lb=10});function gi(){let e=process.env.LMCTL_DAEMON_INTERVAL_MS;if(e===void 0||e.trim().length===0)return 5e3;let t=Number(e);return Number.isFinite(t)&&t>0?t:5e3}function zW(e=process.env){let t=e.LMCTL_DAEMON_FEATURES;if(t===void 0)return new Set(["mailbox-relay"]);if(t.trim()==="")return new Set;let n=new Set;for(let r of t.split(",")){let s=r.trim();if(s!==""){if(s==="all")return new Set(fb);YW.has(s)&&n.add(s)}}return n}function mb(e){let t=e.intervalMs??gi(),n=e.runOnceFn??ur,r=new Set(e.features??zW()),s={running:e.autoStart!==!1,in_flight:!1,interval_ms:t,enabled_features:[...r].sort(),cycles:0,jobs_processed:0,last_jobs_processed:0,last_started_at:null,last_finished_at:null,last_error:null,last_session_sizes_recorded:0,last_session_size_failures:0,last_intake_scanned:0,last_intake_new_jobs:0,last_intake_failures:0,last_session_hung_detected:0,last_session_monitor_checked_at:null,last_session_monitor_error:null,last_mailbox_relay_scanned:0,last_mailbox_relay_delivered:0,last_mailbox_relay_errors:0},i=null,o=null,a=null,l=null,c=null;r.has("rollup-updater")&&e.startRollupUpdaterFn!==!1&&(c=(e.startRollupUpdaterFn??Lv)(e.dal));let d=m=>{s.running&&(i=setTimeout(()=>{f.runCycle().finally(()=>d(t))},m))},u=m=>{s.running&&(o=setTimeout(()=>{l===null&&(l=pb(e.dal,r,e.monitorSessionActivityFn??nu,t,s).finally(()=>{l=null})),l.finally(()=>u(ru(e.dal,t)))},m))},f={state:s,runCycle:async()=>(a!==null||(a=ZW(e.dal,n,e.collectSessionSizesFn??ey,e.scanIntakeFn??pa,e.monitorSessionActivityFn??nu,e.mailboxRelayFn??db,e.worker_id??"daemon",t,r,s).finally(()=>{a=null})),a),stop:async()=>{s.running=!1,i!==null&&clearTimeout(i),o!==null&&clearTimeout(o),c?.stop(),a!==null&&await a.catch(()=>{}),l!==null&&await l.catch(()=>{})}};if(s.running){let m=e.firstDelayMs??5e3;d(m),r.has("session-monitor")&&u(m)}return f}async function ZW(e,t,n,r,s,i,o,a,l,c){c.in_flight=!0,c.last_started_at=new Date().toISOString(),c.last_error=null;let d=[],u=0,f=0,m=[],p=null,_=QW();try{if(l.has("durable-memory-policies")&&aT({dal:e}),l.has("drift-detectors")&&Cv({dal:e}),l.has("intake")&&(m=await r(e)),l.has("job-worker"))for(;;){let h=await t({dal:e,worker_id:o,lease_ms:6e5});if(h===null)break;d.push(h)}if(l.has("mailbox-relay")&&(_=await i({dal:e})),l.has("session-size")){let h=await n(e);u=h.recorded,f=h.failed}l.has("session-monitor")&&(p=await pb(e,l,s,a,c))}catch(h){c.last_error=h instanceof Error?h.message:String(h);try{e.raiseAttention({kind:"daemon_worker_failed",severity:"error",payload:JSON.stringify({error:c.last_error})})}catch{}}finally{c.in_flight=!1,c.cycles+=1,c.last_jobs_processed=d.length,c.last_session_sizes_recorded=u,c.last_session_size_failures=f,c.last_intake_scanned=m.reduce((h,g)=>h+g.scanned,0),c.last_intake_new_jobs=m.reduce((h,g)=>h+g.new_jobs,0),c.last_intake_failures=m.filter(h=>h.error!==void 0).length,c.last_session_hung_detected=p?.hung_detected??0,c.last_mailbox_relay_scanned=_.scanned,c.last_mailbox_relay_delivered=_.delivered,c.last_mailbox_relay_errors=_.errors,c.jobs_processed+=d.length,c.last_finished_at=new Date().toISOString()}return{jobs_processed:d.length,outcomes:d,session_sizes_recorded:u,session_size_failures:f,intake:m,session_monitor:p,mailbox_relay:_}}function QW(){return{scanned:0,delivered:0,skipped_busy:0,skipped_terminal:0,errors:0}}async function pb(e,t,n,r,s){if(!t.has("session-monitor"))return null;let i=ru(e,r),o=Date.now();if(s.last_session_monitor_checked_at!==null){let a=Date.parse(s.last_session_monitor_checked_at);if(Number.isFinite(a)&&o-a<i)return null}s.last_session_monitor_checked_at=new Date(o).toISOString(),s.last_session_monitor_error=null;try{return await n({dal:e,nowMs:o})}catch(a){s.last_session_monitor_error=a instanceof Error?a.message:String(a);try{e.raiseAttention({kind:"daemon_session_monitor_failed",severity:"error",payload:JSON.stringify({error:s.last_session_monitor_error})})}catch{}return null}}var fb,YW,qf=w(()=>{"use strict";Nu();Da();sf();Wo();Ov();Mv();su();ub();fb=["durable-memory-policies","drift-detectors","intake","job-worker","mailbox-relay","session-size","session-monitor","rollup-updater"],YW=new Set(fb)});function _b(e){let t=e.listMembersInState("in_chat");for(let n of t)e.setMemberState(n.id,"attention_needed","daemon_restarted_mid_chat");return t.length}var hb=w(()=>{"use strict"});import{mkdirSync as eq,readFileSync as tq,readdirSync as nq,statSync as rq,writeFileSync as sq}from"node:fs";import{dirname as iq,join as yb,sep as gb}from"node:path";function gl(e){return{s3:{async send(r){let s=r;switch(s._localfsTag){case Eb:return oq(e,s.input);case wb:return aq(e,s.input);case Tb:return lq(e,s.input);default:throw new Error("createLocalFsS3Client: unknown command")}}},commands:{ListObjectsV2Command:Xf,GetObjectCommand:Hf,PutObjectCommand:Bf}}}function oq(e,t){let n=vb(e,t.Key);return eq(iq(n),{recursive:!0}),sq(n,t.Body),{}}function aq(e,t){let n=vb(e,t.Key),r;try{r=tq(n)}catch(i){throw i.code==="ENOENT"?Object.assign(new Error("NoSuchKey"),{name:"NoSuchKey"}):i}let s=r.toString("utf-8");return{Body:{transformToString:async()=>s}}}function lq(e,t){let n=t.Prefix??"";bb(n);let s=cq(e).sort((d,u)=>d.key<u.key?-1:d.key>u.key?1:0).filter(d=>d.key.startsWith(n)),i=t.ContinuationToken;i!==void 0&&i!==""&&(s=s.filter(d=>d.key>i));let o=typeof t.MaxKeys=="number"&&Number.isFinite(t.MaxKeys)&&t.MaxKeys>0?Math.floor(t.MaxKeys):void 0,a=s,l=!1;o!==void 0&&s.length>o&&(a=s.slice(0,o),l=!0);let c={Contents:a.map(d=>({Key:d.key,LastModified:d.lastModified})),IsTruncated:l};return l&&(c.NextContinuationToken=a[a.length-1].key),c}function vb(e,t){return bb(t),yb(e,t)}function bb(e){if(e.split("/").includes(".."))throw new Error(`localfs-s3-client: refusing key/prefix with '..': ${e}`)}function cq(e){let t=[],n=(r,s)=>{let i;try{i=nq(r,{withFileTypes:!0})}catch(o){if(o.code==="ENOENT")return;throw o}for(let o of i){let a=s===""?o.name:`${s}/${o.name}`,l=yb(r,o.name);if(o.isDirectory())n(l,a);else if(o.isFile()){let c=gb==="/"?a:a.split(gb).join("/");t.push({key:c,lastModified:rq(l).mtime})}}};return n(e,""),t}var Eb,wb,Tb,Bf,Hf,Xf,Jf=w(()=>{"use strict";Eb="localfs-put",wb="localfs-get",Tb="localfs-list",Bf=class{input;_localfsTag=Eb;constructor(t){this.input=t}},Hf=class{input;_localfsTag=wb;constructor(t){this.input=t}},Xf=class{input;_localfsTag=Tb;constructor(t){this.input=t}}});function Sb(){return{put:0,get:0,list:0}}function Gf(e,t=dq){return e.put*t.putUsd+e.get*t.getUsd+e.list*t.listUsd}function Kf(e){let t=new Date(e),n=t.getUTCFullYear(),r=String(t.getUTCMonth()+1).padStart(2,"0");return`${n}-${r}`}var dq,yl,Vf=w(()=>{"use strict";dq={putUsd:5e-6,getUsd:40000000000000003e-23,listUsd:5e-6};yl=class{counts=Sb();record(t,n=1){this.counts[t]+=n}peek(){return{...this.counts}}drain(){let t={...this.counts};return this.counts=Sb(),t}estimateCostUsd(t){return Gf(this.counts,t)}}});function kb(e){let t=e.now??Date.now,n=e.timers??uq,r=null,s=null;async function i(){let l=t(),c=Kf(l),d=e.meter.drain();(d.put>0||d.get>0||d.list>0)&&e.store.addUsage({user_id:e.userId,device_id:e.deviceId,period:c,put:d.put,get:d.get,list:d.list,updated_at:new Date(l).toISOString()});let u=e.store.loadUsage(e.userId,e.deviceId,c),f=u?{put:u.put_count,get:u.get_count,list:u.list_count}:{put:0,get:0,list:0};if(e.publishOwnRollup!==void 0)try{await e.publishOwnRollup(c,f)}catch(_){e.log?.(`[usage] publish rollup failed: ${_ instanceof Error?_.message:String(_)}`)}let m=f;if(e.readUserTotal!==void 0)try{m=await e.readUserTotal(c)}catch(_){e.log?.(`[usage] read user total failed: ${_ instanceof Error?_.message:String(_)}`),m=f}let p=Gf(m);if(r!==c&&p>=e.ceilingUsd){r=c,e.log?.(`[usage] quota exceeded period=${c} cost=$${p.toFixed(4)} >= ceiling $${e.ceilingUsd}`);try{e.onQuotaExceeded({period:c,costUsd:p,ceilingUsd:e.ceilingUsd})}catch(_){e.log?.(`[usage] onQuotaExceeded threw: ${_ instanceof Error?_.message:String(_)}`)}}}function o(){return s=(s??Promise.resolve()).then(()=>i()).catch(()=>{}),s}let a=n.setInterval(()=>{o()},e.intervalMs);return{stop(){n.clearInterval(a)},flushNow(){return o()},isOverQuota(){return r!==null&&r===Kf(t())}}}var uq,Ib=w(()=>{"use strict";Vf();uq={setInterval:(e,t)=>setInterval(e,t),clearInterval:e=>clearInterval(e)}});var Yf=w(()=>{"use strict";Wa();Ba();Ba()});function fq(e){if(typeof e!="object"||e===null||Array.isArray(e))return null;let t=e;if(typeof t.message_id!="string"||t.message_id==="")return null;if(typeof t.reply_to=="string"&&t.reply_to!==""){let s=t.response;if(typeof s!="object"||s===null)return null;let i=s;return typeof i.status!="number"?null:{message_id:t.message_id,reply_to:t.reply_to,response:i}}let n=t.request;if(typeof n!="object"||n===null)return null;let r=n;return typeof r.method!="string"||r.method===""||typeof r.path!="string"||r.path===""?null:{message_id:t.message_id,request:r}}function mq(e){return e.reply_to!==void 0&&e.response!==void 0}function pq(e){if(typeof e!="object"||e===null)return;let t=e.conversation_id;return typeof t=="string"?t:void 0}function Nb(e){let t=e.reason;if(t!==void 0)return t;try{return new DOMException("Aborted","AbortError")}catch{let n=new Error("Aborted");return n.name="AbortError",n}}var El,yi,xb=w(()=>{"use strict";Yf();El=class extends Error{name="MailboxFetchStoppedError";code="mailbox_fetch_stopped";constructor(t="MailboxFetchClient stopped before a response arrived"){super(t)}},yi=class{client;log;now;random;pending=new Map;requestHandler=null;stopped=!1;constructor(t){this.client=t.client,this.log=t.log??(()=>{}),this.now=t.now??Date.now,this.random=t.random??Math.random}onRequest(t){if(this.requestHandler!==null)throw new Error("MailboxFetchClient: onRequest handler already registered");this.requestHandler=t}async fetch(t,n){if(this.stopped)throw new El("MailboxFetchClient.fetch after stop()");if(typeof t.path!="string"||t.path==="")throw new Error("MailboxFetchClient.fetch: request.path is required");let r=t.method;if(typeof r!="string"||r==="")throw new Error("MailboxFetchClient.fetch: request.method is required");let s=pn(this.now(),this.random);if(this.pending.has(s))throw new Error(`MailboxFetchClient.fetch: duplicate message_id=${s}`);let i=n?.conversationId??s,o={message_id:s,request:t};return new Promise((a,l)=>{let c=n?.abortSignal,d;if(c!==void 0){if(c.aborted){l(Nb(c));return}d=()=>{this.pending.has(s)&&(this.pending.delete(s),l(Nb(c)))},c.addEventListener("abort",d,{once:!0})}this.pending.set(s,{resolve:a,reject:l,...d!==void 0?{abortListener:d}:{},...c!==void 0?{abortSignal:c}:{}}),this.client.putMessage({conversation_id:i,payload:o}).catch(u=>{let f=this.pending.get(s);f!==void 0&&(this.pending.delete(s),f.abortListener!==void 0&&f.abortSignal!==void 0&&f.abortSignal.removeEventListener("abort",f.abortListener),f.reject(u))})})}async stop(){if(this.stopped)return;this.stopped=!0;let t=Array.from(this.pending.values());this.pending.clear();let n=new El;for(let r of t){r.abortListener!==void 0&&r.abortSignal!==void 0&&r.abortSignal.removeEventListener("abort",r.abortListener);try{r.reject(n)}catch{}}}async handleIncoming(t,n){let r=fq(t);if(r===null){this.log("MailboxFetchClient: dropping non-envelope inbound payload");return}if(mq(r)){let l=this.pending.get(r.reply_to);if(l===void 0){this.log(`MailboxFetchClient: dropping response for unknown reply_to=${r.reply_to}`);return}this.pending.delete(r.reply_to),l.abortListener!==void 0&&l.abortSignal!==void 0&&l.abortSignal.removeEventListener("abort",l.abortListener),l.resolve(r.response);return}if(this.requestHandler===null){this.log(`MailboxFetchClient: no handler registered; dropping request message_id=${r.message_id}`);return}let s=n?.conversation_id??pq(t)??r.message_id,i;try{i=await this.requestHandler(r.request)}catch(l){let c=l instanceof Error?l.message:String(l),d=typeof l.code=="string"?l.code:"INTERNAL_ERROR";i={status:500,headers:{"content-type":"application/json"},body:{error:d,message:c}}}let a={message_id:pn(this.now(),this.random),reply_to:r.message_id,response:i};try{await this.client.putMessage({conversation_id:s,payload:a})}catch(l){this.log(`MailboxFetchClient: response PUT failed for reply_to=${r.message_id}: ${l instanceof Error?l.message:String(l)}`)}}}});function zf(e){if(typeof e!="object"||e===null||Array.isArray(e))return!1;let t=e;return!(t.kind!=="terminal"||typeof t.session_id!="string"||t.session_id===""||t.direction!=="agent_to_user"&&t.direction!=="user_to_agent"||typeof t.data!="string"||typeof t.ts!="number")}var Ab=w(()=>{"use strict"});function Zf(e){if(typeof e!="object"||e===null||Array.isArray(e))return!1;let t=e;if(t.kind!=="provider"||typeof t.session_id!="string"||t.session_id===""||t.direction!=="agent_to_user"&&t.direction!=="user_to_agent"||typeof t.ts!="number")return!1;if(t.direction==="agent_to_user"){if(!Array.isArray(t.events))return!1;for(let n of t.events)if(typeof n!="object"||n===null||Array.isArray(n)||typeof n.event_type!="string")return!1}else if(typeof t.user_input!="string")return!1;return!0}var Rb=w(()=>{"use strict"});function em(e){if(typeof e!="object"||e===null||Array.isArray(e))return!1;let t=e;if(t.kind!=="daemon_event"||typeof t.event!="string"||t.event===""||typeof t.ts!="number")return!1;if(t.event==="workflows"){if(!Array.isArray(t.workflows))return!1;for(let n of t.workflows){if(typeof n!="object"||n===null||Array.isArray(n))return!1;let r=n;if(typeof r.teamfile_path!="string"||r.teamfile_path===""||r.name!==null&&typeof r.name!="string"||typeof r.registered_at!="string"||r.registered_at===""||r.last_seeded_at!==null&&typeof r.last_seeded_at!="string")return!1}}else if(t.event==="chat_log"){if(typeof t.entry!="object"||t.entry===null||Array.isArray(t.entry))return!1;let n=t.entry;if(typeof n.id!="number"||typeof n.root_teamfile!="string"||n.root_teamfile===""||n.sender_teamfile!==null&&(typeof n.sender_teamfile!="string"||n.sender_teamfile==="")||n.sender_alias!==null&&(typeof n.sender_alias!="string"||n.sender_alias==="")||typeof n.receiver_teamfile!="string"||n.receiver_teamfile===""||typeof n.receiver_alias!="string"||n.receiver_alias===""||typeof n.message!="string"||n.response!==null&&typeof n.response!="string"||typeof n.status!="string"||n.status===""||typeof n.created_at!="string"||n.created_at==="")return!1}return!0}var Qf,Lb=w(()=>{"use strict";Qf="daemon:events"});function $b(e){return{kind:"prompt",prompt_id:e.prompt_id??pn(e.now?.()??Date.now(),e.random??Math.random),root_teamfile:e.root_teamfile,text:e.text}}function tm(e){if(e===null||typeof e!="object")return!1;let t=e;return t.kind==="prompt"&&typeof t.prompt_id=="string"&&t.prompt_id.length>0&&typeof t.root_teamfile=="string"&&t.root_teamfile.length>0&&typeof t.text=="string"}var Ob,nm=w(()=>{"use strict";Yf();Ob="prompt:root"});function Ei(e){let t=e.split(".");if(t.length<2||t[1]===void 0||t[1]==="")return null;try{let n=JSON.parse(Mb(t[1]));return typeof n.sub=="string"&&n.sub!==""?n.sub:null}catch{return null}}function _q(e){let t=e.split(".");if(t.length<2||t[1]===void 0||t[1]==="")return null;try{let n=JSON.parse(Mb(t[1]));return typeof n.exp=="number"&&Number.isFinite(n.exp)?n.exp:null}catch{return null}}function Cb(e,t=60){if(typeof e!="string"||e==="")return!0;let n=_q(e);return n===null?!0:Date.now()/1e3>=n-t}function Mb(e){let t=e.replace(/-/g,"+").replace(/_/g,"/"),n=t.padEnd(Math.ceil(t.length/4)*4,"="),r=globalThis.Buffer;return r!==void 0?r.from(n,"base64").toString("utf8"):atob(n)}var rm=w(()=>{"use strict"});async function wl(e){let t=e.fetchImpl??fetch,n=`https://cognito-idp.${e.region}.amazonaws.com/`,r=await t(n,{method:"POST",headers:{"content-type":"application/x-amz-json-1.1","x-amz-target":hq},body:JSON.stringify({AuthFlow:"REFRESH_TOKEN_AUTH",ClientId:e.clientId,AuthParameters:{REFRESH_TOKEN:e.refreshToken}})}),s=await r.text();if(!r.ok){let l=s;try{let c=JSON.parse(s);l=c.message??c.__type??s}catch{}throw new Error(`cognito_refresh_failed: ${r.status} ${l}`)}let o=JSON.parse(s).AuthenticationResult,a=o?.IdToken;if(typeof a!="string"||a==="")throw new Error("cognito_refresh_no_id_token: InitiateAuth returned no IdToken");return{idToken:a,...typeof o?.AccessToken=="string"&&o.AccessToken!==""?{accessToken:o.AccessToken}:{},...typeof o?.ExpiresIn=="number"&&Number.isFinite(o.ExpiresIn)?{expiresAt:Date.now()+o.ExpiresIn*1e3}:{}}}var hq,sm=w(()=>{"use strict";hq="AWSCognitoIdentityProviderService.InitiateAuth"});import{chmodSync as Db,mkdirSync as jb,readFileSync as Pb,writeFileSync as Fb}from"node:fs";import{homedir as Ub}from"node:os";import{dirname as Wb,join as qb}from"node:path";function wi(){return process.env.LMCTL_DEVICE_AUTH_PATH??qb(Ub(),".lmctl","device-auth.json")}function Bb(){return process.env.LMCTL_TOKEN_PATH??qb(Ub(),".lmctl","cli-tokens.json")}function im(e=wi()){try{let t=JSON.parse(Pb(e,"utf8"));return typeof t.userId!="string"||t.userId===""||typeof t.refreshToken!="string"||t.refreshToken===""?null:{userId:t.userId,refreshToken:t.refreshToken}}catch{return null}}function Hb(e,t=wi()){jb(Wb(t),{recursive:!0,mode:448}),Fb(t,JSON.stringify(e,null,2));try{Db(t,384)}catch{}}function om(e,t=Bb()){let n={};try{n=JSON.parse(Pb(t,"utf8"))}catch{}let r={...n.cognito??{}};r.idToken=e.idToken,e.accessToken!==void 0&&(r.accessToken=e.accessToken),e.refreshToken!==void 0&&(r.refreshToken=e.refreshToken),e.expiresAt!==void 0&&(r.expiresAt=e.expiresAt);let s={...n,cognito:r};jb(Wb(t),{recursive:!0,mode:448}),Fb(t,JSON.stringify(s,null,2));try{Db(t,384)}catch{}}async function Xb(e){let t=e.deviceAuthPath??wi(),n=im(t);if(n===null)throw new Error("device_auth_not_found: no ~/.lmctl/device-auth.json; run `lmctl device login` first");let r=await wl({region:e.region,clientId:e.clientId,refreshToken:n.refreshToken,...e.fetchImpl!==void 0?{fetchImpl:e.fetchImpl}:{}});return om({idToken:r.idToken,...r.accessToken!==void 0?{accessToken:r.accessToken}:{},refreshToken:n.refreshToken,...r.expiresAt!==void 0?{expiresAt:r.expiresAt}:{}},e.cliTokensPath??Bb()),{idToken:r.idToken,userId:n.userId}}var am=w(()=>{"use strict";sm()});import{existsSync as gq,realpathSync as yq}from"node:fs";import{dirname as Eq}from"node:path";function lm(e){wq(e).catch(t=>{e.log?.(`[mailbox] prompt trigger failed: ${t instanceof Error?t.message:String(t)}`)})}async function wq(e){let t=e.payload.root_teamfile;try{t=yq(e.payload.root_teamfile)}catch(i){let o=`prompt root missing/unreadable: ${e.payload.root_teamfile}: ${i instanceof Error?i.message:String(i)}`;return cs({rootTeamfile:e.payload.root_teamfile,receiverTeamfile:e.payload.root_teamfile,receiverAlias:"Lead",message:e.payload.text,promptId:e.payload.prompt_id,detail:o,reason:"root_unavailable"}),e.log?.(`[mailbox] ${o}`),{status:"error",response:null,error_detail:o}}if(e.store.getRootTeam(t)===null){let i=`prompt root is not registered: ${t}`;return cs({rootTeamfile:t,receiverTeamfile:t,receiverAlias:"Lead",message:e.payload.text,promptId:e.payload.prompt_id,detail:i,reason:"root_unregistered"}),e.log?.(`[mailbox] ${i}`),{status:"error",response:null,error_detail:i}}let n=vq(t);if("error"in n)return cs({rootTeamfile:t,receiverTeamfile:t,receiverAlias:"Lead",message:e.payload.text,promptId:e.payload.prompt_id,detail:n.error,reason:"root_invalid"}),e.log?.(`[mailbox] ${n.error}`),{status:"error",response:null,error_detail:n.error};let r=Mt(e.store,{receiver_teamfile:t,receiver_alias:n.alias,sender_teamfile:`prompt:${e.payload.prompt_id}`,sender_alias:"operator",ttlMs:Iq(e.env??process.env)});if(!r.acquired){let i=kq(n.alias,r.current);return cs({rootTeamfile:t,receiverTeamfile:t,receiverAlias:n.alias,message:e.payload.text,promptId:e.payload.prompt_id,detail:i,reason:"unavailable"}),e.log?.(`[mailbox] prompt rejected: ${i}`),{status:"error",response:null,error_detail:i}}let s=In(i=>e.store.heartbeatAgentInflight(r.lease,r.leaseId,i),{intervalMs:kr(e.env??process.env)});try{let o=await(e.chat??Wt)({provider:n.provider,sessionId:n.sessionid,cwd:n.sessiondir,prompt:e.payload.text,env:e.env??process.env,alias:n.alias,permissionMode:"yolo",...e.timeoutMs!==void 0?{timeoutMs:e.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,d=a||l?"error":"ok";return d==="ok"?await bq(e.store,{rootTeamfile:t,receiverTeamfile:t,receiverAlias:n.alias,message:e.payload.text,response:o.text,status:d,error_detail:null,log:e.log}):cs({rootTeamfile:t,receiverTeamfile:t,receiverAlias:n.alias,message:e.payload.text,promptId:e.payload.prompt_id,detail:c??"provider failed",reason:a?"stalled":"empty_response"}),{status:d,response:d==="error"?null:o.text,error_detail:c}}catch(i){let o=i instanceof Error?i.message:String(i);return cs({rootTeamfile:t,receiverTeamfile:t,receiverAlias:n.alias,message:e.payload.text,promptId:e.payload.prompt_id,detail:o,reason:"provider_error"}),e.log?.(`[mailbox] prompt provider error: ${o}`),{status:"error",response:null,error_detail:o}}finally{clearInterval(s);try{e.store.releaseAgentInflight(r.lease,r.leaseId)}catch(i){e.log?.(`[mailbox] failed to release prompt in-flight slot: ${i instanceof Error?i.message:String(i)}`)}}}function cs(e){$({event:"prompt_trigger_error",reason:e.reason,prompt_id:e.promptId,root_teamfile:e.rootTeamfile,sender_teamfile:e.rootTeamfile,sender_alias:"operator",receiver_teamfile:e.receiverTeamfile,receiver_alias:e.receiverAlias,error_detail:e.detail,message_preview:Tq(e.message)})}function Tq(e){let t=e.replace(/\s+/gu," ").trim();return t.length<=500?t:`${t.slice(0,497)}...`}function vq(e){if(!gq(e))return{error:`prompt root missing/unreadable: ${e}`};let t=lt(e);if(t.parseErrors.length>0)return{error:`prompt root parse error: ${t.parseErrors.join("; ")}`};let n=Gt(t);return n===void 0?{error:`prompt root has no Lead: ${e}`}:n.session===void 0||n.session.trim()===""?{error:`prompt root Lead is unseeded: ${e}`}:{alias:n.alias,provider:n.provider,sessionid:n.session,sessiondir:n.sessiondir??Eq(e)}}async function bq(e,t){let n=Kb(t.message),r=t.response===null?null:Kb(t.response);try{e.insertTeamChatLog({root_teamfile:t.rootTeamfile,sender_teamfile:t.rootTeamfile,sender_alias:"operator",receiver_teamfile:t.receiverTeamfile,receiver_alias:t.receiverAlias,message:n.text,response:r?.text??null,origin:"unknown",status:t.status,error_detail:t.error_detail,truncated:n.truncated||r?.truncated?1:0,created_at:new Date().toISOString()})}catch(s){t.log?.(`[mailbox] warning: failed to record prompt chat log: ${s instanceof Error?s.message:String(s)}`)}}function Kb(e){return e.length<=Jb?{text:e,truncated:!1}:{text:e.slice(0,Jb),truncated:!0}}function Sq(e,t){return`${e} is servicing ${t.sender_alias} (${t.sender_teamfile}) since ${t.started_at}`}function kq(e,t){return t.sender_teamfile.startsWith("prompt:")?`${e} is busy servicing another prompt since ${t.started_at}`:Sq(e,t)}function Iq(e=process.env){let t=e.LMCTL_INFLIGHT_TTL_MS;if(t===void 0||t.trim()==="")return Gb;let n=Number(t);return!Number.isFinite(n)||n<=0?Gb:n}var Jb,Gb,Vb=w(()=>{"use strict";vt();hn();ce();gt();Jb=256*1024,Gb=30*60*1e3});import{chmodSync as tS,existsSync as Nq,mkdirSync as nS,readFileSync as Sl,writeFileSync as rS}from"node:fs";import{dirname as cm,resolve as Tl,join as sS}from"node:path";import{fileURLToPath as xq}from"node:url";import{homedir as iS}from"node:os";import{CognitoIdentityClient as Aq,GetIdCommand as Rq}from"@aws-sdk/client-cognito-identity";import{fromCognitoIdentity as Yb}from"@aws-sdk/credential-provider-cognito-identity";import{GetObjectCommand as Lq,ListObjectsV2Command as Oq,PutObjectCommand as $q,S3Client as zb}from"@aws-sdk/client-s3";function vi(e={}){let t=e.env??process.env,n=e.tfstatePath!==void 0?[e.tfstatePath]:Pq(e.selfUrl),r={},s;for(let S of n)if(Nq(S)){r=jq(S),s=S;break}let i=(...S)=>{for(let k of S)if(typeof k=="string"&&k!=="")return k},o=i(t.LMCTL_NEXT_IDENTITY_POOL_ID,r.LMCTL_NEXT_IDENTITY_POOL_ID)??Cq,a=i(t.LMCTL_NEXT_COGNITO_USER_POOL_ID,r.LMCTL_NEXT_COGNITO_USER_POOL_ID)??Mq,l=i(t.LMCTL_NEXT_MAILBOX_BUCKET,t.LMCTL_NEXT_POLICY_BUCKET,r.LMCTL_NEXT_MAILBOX_BUCKET,r.LMCTL_NEXT_POLICY_BUCKET)??Dq,c=i(t.AWS_REGION,t.AWS_DEFAULT_REGION)??"us-east-1",d=i(t.LMCTL_NEXT_COGNITO_CLIENT_ID,r.LMCTL_NEXT_COGNITO_CLIENT_ID)??kl,u=[];o===void 0&&u.push("LMCTL_NEXT_IDENTITY_POOL_ID"),a===void 0&&u.push("LMCTL_NEXT_COGNITO_USER_POOL_ID"),l===void 0&&u.push("LMCTL_NEXT_MAILBOX_BUCKET");let f={missing:u,tfstateCandidatesChecked:n,...s!==void 0?{tfstatePathUsed:s}:{}};if(u.length>0)return f;let m=t.LMCTL_MAILBOX_POLL_MS,p=m!==void 0&&m.length>0?Number(m):void 0,_=bl(t.LMCTL_MAILBOX_READ_INTERVAL_SECONDS),h=bl(t.LMCTL_MAILBOX_HEARTBEAT_IDLE_SECONDS),g=bl(t.LMCTL_MAILBOX_BACKOFF_READ_INTERVAL_SECONDS),E=bl(t.LMCTL_MAILBOX_CHATLOG_POLL_SECONDS),y=i(t.LMCTL_MAILBOX_KEY),b=i(t.LMCTL_TOKEN_PATH);return f.config={identityPoolId:o,cognitoUserPoolId:a,cognitoClientId:d,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}:{},...E!==void 0?{chatLogPollIntervalMs:E}:{},...y!==void 0?{mailboxKey:y}:{},...b!==void 0?{tokenPath:b}:{}},f}function jq(e){try{let t=Sl(e,"utf8"),r=JSON.parse(t).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 Pq(e){let t=cm(xq(e??import.meta.url));return[Tl(t,"..","..","..","..","infra","terraform","terraform.tfstate"),Tl(t,"..","..","..","..","..","infra","terraform","terraform.tfstate"),Tl(t,"..","..","..","infra","terraform","terraform.tfstate"),Tl(t,"..","..","infra","terraform","terraform.tfstate")]}function bl(e){if(e===void 0||e==="")return;let t=Number(e);if(!(!Number.isFinite(t)||t<=0))return t*1e3}function Fq(e){let t=Uq(e.intervalMs)??oS,n=Math.max(1,Math.trunc(e.limit??500)),r=e.now??Date.now,s=e.cursorKey!==void 0&&e.store.loadTeamChatLogCursor!==void 0&&e.store.saveTeamChatLogCursor!==void 0?{key:e.cursorKey,load:e.store.loadTeamChatLogCursor.bind(e.store),save:e.store.saveTeamChatLogCursor.bind(e.store)}:null,i,o=!1,a=!1,l=()=>{try{if(s!==null){let u=s.load(s.key);if(u!==null)return i=u.last_pushed_id,!0}return i=e.store.getMaxTeamChatLogId(),s!==null&&s.save({cursor_key:s.key,last_pushed_id:i,updated_at:new Date(r()).toISOString()}),!0}catch(u){return e.log?.(`[mailbox] daemon_event chat_log seed failed: ${u instanceof Error?u.message:String(u)}`),!1}};l();let c=async()=>{if(!(a||o)){o=!0;try{if(i===void 0&&!l())return;let u=e.store.listTeamChatLogSinceId(i,n);for(let f of u){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 e.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(u){e.log?.(`[mailbox] daemon_event chat_log tail failed: ${u instanceof Error?u.message:String(u)}`)}finally{o=!1}}},d=setInterval(()=>{c()},t);return typeof d.unref=="function"&&d.unref(),{pollNow:c,stop(){a=!0,clearInterval(d)}}}function Uq(e){return typeof e=="number"&&Number.isFinite(e)&&e>0?e:void 0}async function aS(e){let t=e.tokenPath??sS(iS(),".lmctl","cli-tokens.json"),n=Qb(e.tokenPath);if(Cb(n.cognito?.idToken)&&im()!==null)try{await Xb({region:e.region,clientId:e.cognitoClientId??kl,cliTokensPath:t}),n=Qb(e.tokenPath),e.log?.("[mx-mailbox] refreshed IdToken from device-auth refresh token")}catch(x){let H=x instanceof Error?x.message:String(x);e.log?.(`[mx-mailbox] device-auth refresh failed: ${H}`)}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.${e.region}.amazonaws.com/${e.cognitoUserPoolId}`,i=n.cognito.identityId,o=!1;i===void 0||i===""?i=await eS({tokenPath:t,region:e.region,identityPoolId:e.identityPoolId,idpProvider:s,idToken:r,log:e.log}):(o=!0,e.log?.(`[mx-mailbox] using cached identityId from cli-tokens (skipping GetId) for ${i}`));let a=Yb({identityId:i,logins:{[s]:r},clientConfig:{region:e.region}}),l=new zb({region:e.region,credentials:a}),c={ListObjectsV2Command:Oq,GetObjectCommand:Lq,PutObjectCommand:$q},d=Ei(r),u=d??i,f=e.deviceId,m=es({identityId:i,userId:d,deviceId:f,mailboxKey:e.mailboxKey}),p=e.cursorStore,_;if(p!==void 0){let x=p.loadMailboxCursor(u,m);if(x!==null)_=x.last_processed_seq??void 0,e.log?.(`[mx-mailbox] resumed seq cursor=${_??"(sentinel)"} for user_id=${u}`);else{let H=!1,J=0;for(;!H&&J<2;){J+=1;try{let N=Fa(m,"web"),A=0,O;do{let X=await l.send(new c.ListObjectsV2Command({Bucket:e.mailboxBucket,Prefix:N,MaxKeys:1e3,...O!==void 0?{ContinuationToken:O}:{}}));for(let q of X.Contents??[]){let j=Ua(q.Key??"",m,"web");j!==void 0&&j>A&&(A=j)}O=X.IsTruncated===!0?X.NextContinuationToken:void 0}while(O!==void 0);_=A,e.log?.(`[mx-mailbox] cold start: seeded seq cursor=${A} for user_id=${u}`),H=!0}catch(N){let A=N instanceof Error?N.message:String(N);if(o&&J===1&&Bq(N)){e.log?.(`[mx-mailbox] cached identityId rejected by cognito (${A}); clearing + refreshing`),qq(t),o=!1,i=await eS({tokenPath:t,region:e.region,identityPoolId:e.identityPoolId,idpProvider:s,idToken:r,log:e.log}),a=Yb({identityId:i,logins:{[s]:r},clientConfig:{region:e.region}}),l=new zb({region:e.region,credentials:a}),m=es({identityId:i,userId:d,deviceId:f,mailboxKey:e.mailboxKey});continue}e.log?.(`[mx-mailbox] cold start seq probe failed: ${A}`);break}}p.saveMailboxCursor({user_id:u,mailbox_key:m,last_processed_version_id:null,last_processed_seq:_??null,last_processed_at:new Date().toISOString()})}}let h=null,g=e.terminalSessionManager,E=e.persistentSessionManager,y=e.promptTriggerStore,b=new yl,S=new fr({bucket:e.mailboxBucket,identityId:i,...d!==null?{userId:d}:{},...f!==void 0?{deviceId:f}:{},...e.mailboxKey!==void 0?{mailboxKey:e.mailboxKey}:{},s3:l,commands:c,selfRole:"agent",onS3Op:x=>b.record(x),onMessage:async x=>{if(g!==void 0&&zf(x.payload)){g.onInbound(x.payload);return}if(E!==void 0&&Zf(x.payload)){await E.onInbound(x.payload);return}if(!em(x.payload)){if(y!==void 0&&tm(x.payload)){lm({store:y,payload:x.payload,log:e.log});return}h!==null&&await h.handleIncoming(x.payload,x)}},...p!==void 0?{onCursorAdvance:x=>{p.saveMailboxCursor({user_id:u,mailbox_key:m,last_processed_version_id:null,last_processed_seq:x,last_processed_at:new Date().toISOString()})}}:{},..._!==void 0?{cursor:_}:{},...e.pollIntervalMs!==void 0?{pollIntervalMs:e.pollIntervalMs}:{},...e.readIntervalMs!==void 0?{readIntervalMs:e.readIntervalMs}:{},...e.heartbeatIdleMs!==void 0?{heartbeatIdleMs:e.heartbeatIdleMs}:{},...e.backoffReadIntervalMs!==void 0?{backoffReadIntervalMs:e.backoffReadIntervalMs}:{}});h=new yi({client:S,...e.log!==void 0?{log:e.log}:{}}),g!==void 0&&g.setPublish(async x=>S.putMessage({conversation_id:`terminal:${x.session_id}`,payload:x})),E!==void 0&&E.setPublish(async x=>S.putMessage({conversation_id:`provider:${x.session_id}`,payload:x}));let k=x=>S.putMessage({conversation_id:Qf,payload:x});S.start();let F=e.chatLogTailStore===void 0?void 0:Fq({store:e.chatLogTailStore,publishDaemonEvent:k,cursorKey:m,intervalMs:e.chatLogPollIntervalMs??e.readIntervalMs??e.pollIntervalMs??oS,log:e.log});e.log?.(`[mx-mailbox] agent polling ${m} (bucket=${e.mailboxBucket})`);let P=e.deviceId??i,D=`${u}/usage/`,U;return U=e.usageStore===void 0?void 0:kb({meter:b,store:e.usageStore,userId:u,deviceId:P,ceilingUsd:e.usageQuotaUsd??1/0,onQuotaExceeded:({period:x,costUsd:H,ceilingUsd:J})=>{e.log?.(`[usage] month ${x} cost $${H.toFixed(4)} >= ceiling $${J} \u2014 blocking mailbox`),S.stop().catch(()=>{}),U?.stop()},publishOwnRollup:async(x,H)=>{await l.send(new c.PutObjectCommand({Bucket:e.mailboxBucket,Key:`${D}${P}-${x}.json`,Body:JSON.stringify({...H,updated_at:new Date().toISOString()}),ContentType:"application/json"}))},readUserTotal:async x=>{let H={put:0,get:0,list:0},J;do{let N=await l.send(new c.ListObjectsV2Command({Bucket:e.mailboxBucket,Prefix:D,MaxKeys:1e3,...J!==void 0?{ContinuationToken:J}:{}}));for(let A of N.Contents??[]){let O=A.Key??"";if(O.endsWith(`-${x}.json`))try{let X=await l.send(new c.GetObjectCommand({Bucket:e.mailboxBucket,Key:O}));if(X.Body===void 0)continue;let q=JSON.parse(await X.Body.transformToString("utf-8"));H.put+=q.put??0,H.get+=q.get??0,H.list+=q.list??0}catch{}}J=N.IsTruncated===!0?N.NextContinuationToken:void 0}while(J!==void 0);return H},intervalMs:e.usageFlushIntervalMs??36e5,...e.log!==void 0?{log:e.log}:{}}),{identityId:i,mailbox:S,fetchClient:h,publishDaemonEvent:k,async stop(){F?.stop(),U!==void 0&&(await U.flushNow().catch(()=>{}),U.stop()),await h.stop().catch(()=>{}),await S.stop().catch(()=>{})}}}async function lS(e){let t=e.s3!==void 0&&e.commands!==void 0?{s3:e.s3,commands:e.commands}:gl(e.rootDir),n=es({identityId:Ti,userId:Ti,deviceId:Zb}),r=null,s=e.terminalSessionManager,i=e.persistentSessionManager,o=e.promptTriggerStore,a=new fr({bucket:"local",identityId:Ti,userId:Ti,deviceId:Zb,s3:t.s3,commands:t.commands,selfRole:"agent",onMessage:async c=>{if(s!==void 0&&zf(c.payload)){s.onInbound(c.payload);return}if(i!==void 0&&Zf(c.payload)){await i.onInbound(c.payload);return}if(!em(c.payload)){if(o!==void 0&&tm(c.payload)){lm({store:o,payload:c.payload,log:e.log});return}r!==null&&await r.handleIncoming(c.payload,c)}},pollIntervalMs:e.pollIntervalMs??vl,readIntervalMs:e.readIntervalMs??vl,heartbeatIdleMs:e.heartbeatIdleMs??vl,backoffReadIntervalMs:e.backoffReadIntervalMs??vl});r=new yi({client:a,...e.log!==void 0?{log:e.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:Qf,payload:c});return a.start(),e.log?.(`[local-webui] agent polling ${n} (local-fs ${e.rootDir})`),{identityId:Ti,mailbox:a,fetchClient:r,publishDaemonEvent:l,async stop(){await r.stop().catch(()=>{}),await a.stop().catch(()=>{})}}}function Qb(e){let t=e??sS(iS(),".lmctl","cli-tokens.json");try{let n=Sl(t,"utf8");return JSON.parse(n)}catch{return{}}}function Wq(e,t){if(t===void 0||t==="")return;let n={};try{let s=Sl(e,"utf8");n=JSON.parse(s)}catch{}if(n.cognito===void 0)return;let r={...n,cognito:{...n.cognito,identityId:t}};nS(cm(e),{recursive:!0,mode:448}),rS(e,JSON.stringify(r,null,2));try{tS(e,384)}catch{}}function qq(e){let t={};try{let r=Sl(e,"utf8");t=JSON.parse(r)}catch{return}if(t.cognito===void 0)return;let n={...t,cognito:{...t.cognito}};delete n.cognito.identityId,nS(cm(e),{recursive:!0,mode:448}),rS(e,JSON.stringify(n,null,2));try{tS(e,384)}catch{}}async function eS(e){e.log?.("[mx-mailbox] cli-tokens has no identityId; calling GetId");let n=await new Aq({region:e.region}).send(new Rq({IdentityPoolId:e.identityPoolId,Logins:{[e.idpProvider]:e.idToken}}));if(n.IdentityId===void 0||n.IdentityId==="")throw new Error("cognito_getid_no_identity_id");try{Wq(e.tokenPath,n.IdentityId),e.log?.(`[mx-mailbox] persisted identityId=${n.IdentityId} to ${e.tokenPath}`)}catch(r){let s=r instanceof Error?r.message:String(r);e.log?.(`[mx-mailbox] WARNING: identityId persist failed (${s}); will redo GetId on next restart`)}return n.IdentityId}function Bq(e){if(e===null||typeof e!="object")return!1;let t=e,n=[typeof t.name=="string"?t.name:void 0,typeof t.Code=="string"?t.Code:void 0,typeof t.__type=="string"?t.__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 t.message=="string"?t.message:"";return!!(r.includes("NotAuthorizedException")||r.includes("Invalid identity pool configuration")||r.includes("Identity")&&r.includes("not found"))}var oS,vl,kl,Cq,Mq,Dq,Ti,Zb,dm=w(()=>{"use strict";Ha();Jf();Vf();Ib();xb();Ab();Rb();Lb();nm();Wa();rm();am();Vb();oS=3e3,vl=1e3,kl="79u5jhkk46qofog661c9i0bdcs",Cq="us-east-1:69636ff0-e008-4cbc-853d-180e5526a198",Mq="us-east-1_4iUdFggDn",Dq="lmctl-next-preview-mailbox-254332045686";Ti="local",Zb="local"});import{spawn as pm}from"node:child_process";import{createInterface as cS}from"node:readline";var um,fm,mm,dS,uS=w(()=>{"use strict";Eo();ce();js();um=class{child;ctx;rl;nextRpcId=1;pending=new Map;threadId;nextLocalTurnId=1;closed=!1;setResumeThreadId(t){this.threadId=t}async start(t,n){this.ctx=n;let r=pm(t.command,t.args,{cwd:t.cwd??process.cwd(),env:t.env??process.env,stdio:["pipe","pipe","pipe"]});if(this.child=r,this.rl=cS({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:t.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:t.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(t){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:t}]})).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 t of this.pending.values())t.reject(new Error("codex_session_stopping"));this.pending.clear()}async rpc(t,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:t,params:n});try{this.child.stdin.write(o+`
|
|
2426
|
+
${e.receipt}`:`relay delivery error: ${e.error}`}function KW(e,t){e.reclaimStaleMailboxDeliveries(new Date(Date.now()-Af(t)).toISOString())}function VW(e){return{stdout:{write:()=>{}},stderr:{write:()=>{}},dal:e}}var lb,ub=w(()=>{"use strict";gt();_i();ll();hi();rt();hl();lb=10});function gi(){let e=process.env.LMCTL_DAEMON_INTERVAL_MS;if(e===void 0||e.trim().length===0)return 5e3;let t=Number(e);return Number.isFinite(t)&&t>0?t:5e3}function zW(e=process.env){let t=e.LMCTL_DAEMON_FEATURES;if(t===void 0)return new Set(["mailbox-relay"]);if(t.trim()==="")return new Set;let n=new Set;for(let r of t.split(",")){let s=r.trim();if(s!==""){if(s==="all")return new Set(fb);YW.has(s)&&n.add(s)}}return n}function mb(e){let t=e.intervalMs??gi(),n=e.runOnceFn??ur,r=new Set(e.features??zW()),s={running:e.autoStart!==!1,in_flight:!1,interval_ms:t,enabled_features:[...r].sort(),cycles:0,jobs_processed:0,last_jobs_processed:0,last_started_at:null,last_finished_at:null,last_error:null,last_session_sizes_recorded:0,last_session_size_failures:0,last_intake_scanned:0,last_intake_new_jobs:0,last_intake_failures:0,last_session_hung_detected:0,last_session_monitor_checked_at:null,last_session_monitor_error:null,last_mailbox_relay_scanned:0,last_mailbox_relay_delivered:0,last_mailbox_relay_errors:0},i=null,o=null,a=null,l=null,c=null;r.has("rollup-updater")&&e.startRollupUpdaterFn!==!1&&(c=(e.startRollupUpdaterFn??Lv)(e.dal));let d=m=>{s.running&&(i=setTimeout(()=>{f.runCycle().finally(()=>d(t))},m))},u=m=>{s.running&&(o=setTimeout(()=>{l===null&&(l=pb(e.dal,r,e.monitorSessionActivityFn??nu,t,s).finally(()=>{l=null})),l.finally(()=>u(ru(e.dal,t)))},m))},f={state:s,runCycle:async()=>(a!==null||(a=ZW(e.dal,n,e.collectSessionSizesFn??ey,e.scanIntakeFn??pa,e.monitorSessionActivityFn??nu,e.mailboxRelayFn??db,e.worker_id??"daemon",t,r,s).finally(()=>{a=null})),a),stop:async()=>{s.running=!1,i!==null&&clearTimeout(i),o!==null&&clearTimeout(o),c?.stop(),a!==null&&await a.catch(()=>{}),l!==null&&await l.catch(()=>{})}};if(s.running){let m=e.firstDelayMs??5e3;d(m),r.has("session-monitor")&&u(m)}return f}async function ZW(e,t,n,r,s,i,o,a,l,c){c.in_flight=!0,c.last_started_at=new Date().toISOString(),c.last_error=null;let d=[],u=0,f=0,m=[],p=null,_=QW();try{if(l.has("durable-memory-policies")&&aT({dal:e}),l.has("drift-detectors")&&Cv({dal:e}),l.has("intake")&&(m=await r(e)),l.has("job-worker"))for(;;){let h=await t({dal:e,worker_id:o,lease_ms:6e5});if(h===null)break;d.push(h)}if(l.has("mailbox-relay")&&(_=await i({dal:e})),l.has("session-size")){let h=await n(e);u=h.recorded,f=h.failed}l.has("session-monitor")&&(p=await pb(e,l,s,a,c))}catch(h){c.last_error=h instanceof Error?h.message:String(h);try{e.raiseAttention({kind:"daemon_worker_failed",severity:"error",payload:JSON.stringify({error:c.last_error})})}catch{}}finally{c.in_flight=!1,c.cycles+=1,c.last_jobs_processed=d.length,c.last_session_sizes_recorded=u,c.last_session_size_failures=f,c.last_intake_scanned=m.reduce((h,g)=>h+g.scanned,0),c.last_intake_new_jobs=m.reduce((h,g)=>h+g.new_jobs,0),c.last_intake_failures=m.filter(h=>h.error!==void 0).length,c.last_session_hung_detected=p?.hung_detected??0,c.last_mailbox_relay_scanned=_.scanned,c.last_mailbox_relay_delivered=_.delivered,c.last_mailbox_relay_errors=_.errors,c.jobs_processed+=d.length,c.last_finished_at=new Date().toISOString()}return{jobs_processed:d.length,outcomes:d,session_sizes_recorded:u,session_size_failures:f,intake:m,session_monitor:p,mailbox_relay:_}}function QW(){return{scanned:0,delivered:0,skipped_busy:0,skipped_terminal:0,errors:0}}async function pb(e,t,n,r,s){if(!t.has("session-monitor"))return null;let i=ru(e,r),o=Date.now();if(s.last_session_monitor_checked_at!==null){let a=Date.parse(s.last_session_monitor_checked_at);if(Number.isFinite(a)&&o-a<i)return null}s.last_session_monitor_checked_at=new Date(o).toISOString(),s.last_session_monitor_error=null;try{return await n({dal:e,nowMs:o})}catch(a){s.last_session_monitor_error=a instanceof Error?a.message:String(a);try{e.raiseAttention({kind:"daemon_session_monitor_failed",severity:"error",payload:JSON.stringify({error:s.last_session_monitor_error})})}catch{}return null}}var fb,YW,qf=w(()=>{"use strict";Nu();Da();sf();Wo();Ov();Mv();su();ub();fb=["durable-memory-policies","drift-detectors","intake","job-worker","mailbox-relay","session-size","session-monitor","rollup-updater"],YW=new Set(fb)});function _b(e){let t=e.listMembersInState("in_chat");for(let n of t)e.setMemberState(n.id,"attention_needed","daemon_restarted_mid_chat");return t.length}var hb=w(()=>{"use strict"});import{mkdirSync as eq,readFileSync as tq,readdirSync as nq,statSync as rq,writeFileSync as sq}from"node:fs";import{dirname as iq,join as yb,sep as gb}from"node:path";function gl(e){return{s3:{async send(r){let s=r;switch(s._localfsTag){case Eb:return oq(e,s.input);case wb:return aq(e,s.input);case Tb:return lq(e,s.input);default:throw new Error("createLocalFsS3Client: unknown command")}}},commands:{ListObjectsV2Command:Xf,GetObjectCommand:Hf,PutObjectCommand:Bf}}}function oq(e,t){let n=vb(e,t.Key);return eq(iq(n),{recursive:!0}),sq(n,t.Body),{}}function aq(e,t){let n=vb(e,t.Key),r;try{r=tq(n)}catch(i){throw i.code==="ENOENT"?Object.assign(new Error("NoSuchKey"),{name:"NoSuchKey"}):i}let s=r.toString("utf-8");return{Body:{transformToString:async()=>s}}}function lq(e,t){let n=t.Prefix??"";bb(n);let s=cq(e).sort((d,u)=>d.key<u.key?-1:d.key>u.key?1:0).filter(d=>d.key.startsWith(n)),i=t.ContinuationToken;i!==void 0&&i!==""&&(s=s.filter(d=>d.key>i));let o=typeof t.MaxKeys=="number"&&Number.isFinite(t.MaxKeys)&&t.MaxKeys>0?Math.floor(t.MaxKeys):void 0,a=s,l=!1;o!==void 0&&s.length>o&&(a=s.slice(0,o),l=!0);let c={Contents:a.map(d=>({Key:d.key,LastModified:d.lastModified})),IsTruncated:l};return l&&(c.NextContinuationToken=a[a.length-1].key),c}function vb(e,t){return bb(t),yb(e,t)}function bb(e){if(e.split("/").includes(".."))throw new Error(`localfs-s3-client: refusing key/prefix with '..': ${e}`)}function cq(e){let t=[],n=(r,s)=>{let i;try{i=nq(r,{withFileTypes:!0})}catch(o){if(o.code==="ENOENT")return;throw o}for(let o of i){let a=s===""?o.name:`${s}/${o.name}`,l=yb(r,o.name);if(o.isDirectory())n(l,a);else if(o.isFile()){let c=gb==="/"?a:a.split(gb).join("/");t.push({key:c,lastModified:rq(l).mtime})}}};return n(e,""),t}var Eb,wb,Tb,Bf,Hf,Xf,Jf=w(()=>{"use strict";Eb="localfs-put",wb="localfs-get",Tb="localfs-list",Bf=class{input;_localfsTag=Eb;constructor(t){this.input=t}},Hf=class{input;_localfsTag=wb;constructor(t){this.input=t}},Xf=class{input;_localfsTag=Tb;constructor(t){this.input=t}}});function Sb(){return{put:0,get:0,list:0}}function Gf(e,t=dq){return e.put*t.putUsd+e.get*t.getUsd+e.list*t.listUsd}function Kf(e){let t=new Date(e),n=t.getUTCFullYear(),r=String(t.getUTCMonth()+1).padStart(2,"0");return`${n}-${r}`}var dq,yl,Vf=w(()=>{"use strict";dq={putUsd:5e-6,getUsd:40000000000000003e-23,listUsd:5e-6};yl=class{counts=Sb();record(t,n=1){this.counts[t]+=n}peek(){return{...this.counts}}drain(){let t={...this.counts};return this.counts=Sb(),t}estimateCostUsd(t){return Gf(this.counts,t)}}});function kb(e){let t=e.now??Date.now,n=e.timers??uq,r=null,s=null;async function i(){let l=t(),c=Kf(l),d=e.meter.drain();(d.put>0||d.get>0||d.list>0)&&e.store.addUsage({user_id:e.userId,device_id:e.deviceId,period:c,put:d.put,get:d.get,list:d.list,updated_at:new Date(l).toISOString()});let u=e.store.loadUsage(e.userId,e.deviceId,c),f=u?{put:u.put_count,get:u.get_count,list:u.list_count}:{put:0,get:0,list:0};if(e.publishOwnRollup!==void 0)try{await e.publishOwnRollup(c,f)}catch(_){e.log?.(`[usage] publish rollup failed: ${_ instanceof Error?_.message:String(_)}`)}let m=f;if(e.readUserTotal!==void 0)try{m=await e.readUserTotal(c)}catch(_){e.log?.(`[usage] read user total failed: ${_ instanceof Error?_.message:String(_)}`),m=f}let p=Gf(m);if(r!==c&&p>=e.ceilingUsd){r=c,e.log?.(`[usage] quota exceeded period=${c} cost=$${p.toFixed(4)} >= ceiling $${e.ceilingUsd}`);try{e.onQuotaExceeded({period:c,costUsd:p,ceilingUsd:e.ceilingUsd})}catch(_){e.log?.(`[usage] onQuotaExceeded threw: ${_ instanceof Error?_.message:String(_)}`)}}}function o(){return s=(s??Promise.resolve()).then(()=>i()).catch(()=>{}),s}let a=n.setInterval(()=>{o()},e.intervalMs);return{stop(){n.clearInterval(a)},flushNow(){return o()},isOverQuota(){return r!==null&&r===Kf(t())}}}var uq,Ib=w(()=>{"use strict";Vf();uq={setInterval:(e,t)=>setInterval(e,t),clearInterval:e=>clearInterval(e)}});var Yf=w(()=>{"use strict";Wa();Ba();Ba()});function fq(e){if(typeof e!="object"||e===null||Array.isArray(e))return null;let t=e;if(typeof t.message_id!="string"||t.message_id==="")return null;if(typeof t.reply_to=="string"&&t.reply_to!==""){let s=t.response;if(typeof s!="object"||s===null)return null;let i=s;return typeof i.status!="number"?null:{message_id:t.message_id,reply_to:t.reply_to,response:i}}let n=t.request;if(typeof n!="object"||n===null)return null;let r=n;return typeof r.method!="string"||r.method===""||typeof r.path!="string"||r.path===""?null:{message_id:t.message_id,request:r}}function mq(e){return e.reply_to!==void 0&&e.response!==void 0}function pq(e){if(typeof e!="object"||e===null)return;let t=e.conversation_id;return typeof t=="string"?t:void 0}function Nb(e){let t=e.reason;if(t!==void 0)return t;try{return new DOMException("Aborted","AbortError")}catch{let n=new Error("Aborted");return n.name="AbortError",n}}var El,yi,xb=w(()=>{"use strict";Yf();El=class extends Error{name="MailboxFetchStoppedError";code="mailbox_fetch_stopped";constructor(t="MailboxFetchClient stopped before a response arrived"){super(t)}},yi=class{client;log;now;random;pending=new Map;requestHandler=null;stopped=!1;constructor(t){this.client=t.client,this.log=t.log??(()=>{}),this.now=t.now??Date.now,this.random=t.random??Math.random}onRequest(t){if(this.requestHandler!==null)throw new Error("MailboxFetchClient: onRequest handler already registered");this.requestHandler=t}async fetch(t,n){if(this.stopped)throw new El("MailboxFetchClient.fetch after stop()");if(typeof t.path!="string"||t.path==="")throw new Error("MailboxFetchClient.fetch: request.path is required");let r=t.method;if(typeof r!="string"||r==="")throw new Error("MailboxFetchClient.fetch: request.method is required");let s=pn(this.now(),this.random);if(this.pending.has(s))throw new Error(`MailboxFetchClient.fetch: duplicate message_id=${s}`);let i=n?.conversationId??s,o={message_id:s,request:t};return new Promise((a,l)=>{let c=n?.abortSignal,d;if(c!==void 0){if(c.aborted){l(Nb(c));return}d=()=>{this.pending.has(s)&&(this.pending.delete(s),l(Nb(c)))},c.addEventListener("abort",d,{once:!0})}this.pending.set(s,{resolve:a,reject:l,...d!==void 0?{abortListener:d}:{},...c!==void 0?{abortSignal:c}:{}}),this.client.putMessage({conversation_id:i,payload:o}).catch(u=>{let f=this.pending.get(s);f!==void 0&&(this.pending.delete(s),f.abortListener!==void 0&&f.abortSignal!==void 0&&f.abortSignal.removeEventListener("abort",f.abortListener),f.reject(u))})})}async stop(){if(this.stopped)return;this.stopped=!0;let t=Array.from(this.pending.values());this.pending.clear();let n=new El;for(let r of t){r.abortListener!==void 0&&r.abortSignal!==void 0&&r.abortSignal.removeEventListener("abort",r.abortListener);try{r.reject(n)}catch{}}}async handleIncoming(t,n){let r=fq(t);if(r===null){this.log("MailboxFetchClient: dropping non-envelope inbound payload");return}if(mq(r)){let l=this.pending.get(r.reply_to);if(l===void 0){this.log(`MailboxFetchClient: dropping response for unknown reply_to=${r.reply_to}`);return}this.pending.delete(r.reply_to),l.abortListener!==void 0&&l.abortSignal!==void 0&&l.abortSignal.removeEventListener("abort",l.abortListener),l.resolve(r.response);return}if(this.requestHandler===null){this.log(`MailboxFetchClient: no handler registered; dropping request message_id=${r.message_id}`);return}let s=n?.conversation_id??pq(t)??r.message_id,i;try{i=await this.requestHandler(r.request)}catch(l){let c=l instanceof Error?l.message:String(l),d=typeof l.code=="string"?l.code:"INTERNAL_ERROR";i={status:500,headers:{"content-type":"application/json"},body:{error:d,message:c}}}let a={message_id:pn(this.now(),this.random),reply_to:r.message_id,response:i};try{await this.client.putMessage({conversation_id:s,payload:a})}catch(l){this.log(`MailboxFetchClient: response PUT failed for reply_to=${r.message_id}: ${l instanceof Error?l.message:String(l)}`)}}}});function zf(e){if(typeof e!="object"||e===null||Array.isArray(e))return!1;let t=e;return!(t.kind!=="terminal"||typeof t.session_id!="string"||t.session_id===""||t.direction!=="agent_to_user"&&t.direction!=="user_to_agent"||typeof t.data!="string"||typeof t.ts!="number")}var Ab=w(()=>{"use strict"});function Zf(e){if(typeof e!="object"||e===null||Array.isArray(e))return!1;let t=e;if(t.kind!=="provider"||typeof t.session_id!="string"||t.session_id===""||t.direction!=="agent_to_user"&&t.direction!=="user_to_agent"||typeof t.ts!="number")return!1;if(t.direction==="agent_to_user"){if(!Array.isArray(t.events))return!1;for(let n of t.events)if(typeof n!="object"||n===null||Array.isArray(n)||typeof n.event_type!="string")return!1}else if(typeof t.user_input!="string")return!1;return!0}var Rb=w(()=>{"use strict"});function em(e){if(typeof e!="object"||e===null||Array.isArray(e))return!1;let t=e;if(t.kind!=="daemon_event"||typeof t.event!="string"||t.event===""||typeof t.ts!="number")return!1;if(t.event==="workflows"){if(!Array.isArray(t.workflows))return!1;for(let n of t.workflows){if(typeof n!="object"||n===null||Array.isArray(n))return!1;let r=n;if(typeof r.teamfile_path!="string"||r.teamfile_path===""||r.name!==null&&typeof r.name!="string"||typeof r.registered_at!="string"||r.registered_at===""||r.last_seeded_at!==null&&typeof r.last_seeded_at!="string")return!1}}else if(t.event==="chat_log"){if(typeof t.entry!="object"||t.entry===null||Array.isArray(t.entry))return!1;let n=t.entry;if(typeof n.id!="number"||typeof n.root_teamfile!="string"||n.root_teamfile===""||n.sender_teamfile!==null&&(typeof n.sender_teamfile!="string"||n.sender_teamfile==="")||n.sender_alias!==null&&(typeof n.sender_alias!="string"||n.sender_alias==="")||typeof n.receiver_teamfile!="string"||n.receiver_teamfile===""||typeof n.receiver_alias!="string"||n.receiver_alias===""||typeof n.message!="string"||n.response!==null&&typeof n.response!="string"||typeof n.status!="string"||n.status===""||typeof n.created_at!="string"||n.created_at==="")return!1}return!0}var Qf,Lb=w(()=>{"use strict";Qf="daemon:events"});function $b(e){return{kind:"prompt",prompt_id:e.prompt_id??pn(e.now?.()??Date.now(),e.random??Math.random),root_teamfile:e.root_teamfile,text:e.text}}function tm(e){if(e===null||typeof e!="object")return!1;let t=e;return t.kind==="prompt"&&typeof t.prompt_id=="string"&&t.prompt_id.length>0&&typeof t.root_teamfile=="string"&&t.root_teamfile.length>0&&typeof t.text=="string"}var Ob,nm=w(()=>{"use strict";Yf();Ob="prompt:root"});function Ei(e){let t=e.split(".");if(t.length<2||t[1]===void 0||t[1]==="")return null;try{let n=JSON.parse(Mb(t[1]));return typeof n.sub=="string"&&n.sub!==""?n.sub:null}catch{return null}}function _q(e){let t=e.split(".");if(t.length<2||t[1]===void 0||t[1]==="")return null;try{let n=JSON.parse(Mb(t[1]));return typeof n.exp=="number"&&Number.isFinite(n.exp)?n.exp:null}catch{return null}}function Cb(e,t=60){if(typeof e!="string"||e==="")return!0;let n=_q(e);return n===null?!0:Date.now()/1e3>=n-t}function Mb(e){let t=e.replace(/-/g,"+").replace(/_/g,"/"),n=t.padEnd(Math.ceil(t.length/4)*4,"="),r=globalThis.Buffer;return r!==void 0?r.from(n,"base64").toString("utf8"):atob(n)}var rm=w(()=>{"use strict"});async function wl(e){let t=e.fetchImpl??fetch,n=`https://cognito-idp.${e.region}.amazonaws.com/`,r=await t(n,{method:"POST",headers:{"content-type":"application/x-amz-json-1.1","x-amz-target":hq},body:JSON.stringify({AuthFlow:"REFRESH_TOKEN_AUTH",ClientId:e.clientId,AuthParameters:{REFRESH_TOKEN:e.refreshToken}})}),s=await r.text();if(!r.ok){let l=s;try{let c=JSON.parse(s);l=c.message??c.__type??s}catch{}throw new Error(`cognito_refresh_failed: ${r.status} ${l}`)}let o=JSON.parse(s).AuthenticationResult,a=o?.IdToken;if(typeof a!="string"||a==="")throw new Error("cognito_refresh_no_id_token: InitiateAuth returned no IdToken");return{idToken:a,...typeof o?.AccessToken=="string"&&o.AccessToken!==""?{accessToken:o.AccessToken}:{},...typeof o?.ExpiresIn=="number"&&Number.isFinite(o.ExpiresIn)?{expiresAt:Date.now()+o.ExpiresIn*1e3}:{}}}var hq,sm=w(()=>{"use strict";hq="AWSCognitoIdentityProviderService.InitiateAuth"});import{chmodSync as Db,mkdirSync as jb,readFileSync as Pb,writeFileSync as Fb}from"node:fs";import{homedir as Ub}from"node:os";import{dirname as Wb,join as qb}from"node:path";function wi(){return process.env.LMCTL_DEVICE_AUTH_PATH??qb(Ub(),".lmctl","device-auth.json")}function Bb(){return process.env.LMCTL_TOKEN_PATH??qb(Ub(),".lmctl","cli-tokens.json")}function im(e=wi()){try{let t=JSON.parse(Pb(e,"utf8"));return typeof t.userId!="string"||t.userId===""||typeof t.refreshToken!="string"||t.refreshToken===""?null:{userId:t.userId,refreshToken:t.refreshToken}}catch{return null}}function Hb(e,t=wi()){jb(Wb(t),{recursive:!0,mode:448}),Fb(t,JSON.stringify(e,null,2));try{Db(t,384)}catch{}}function om(e,t=Bb()){let n={};try{n=JSON.parse(Pb(t,"utf8"))}catch{}let r={...n.cognito??{}};r.idToken=e.idToken,e.accessToken!==void 0&&(r.accessToken=e.accessToken),e.refreshToken!==void 0&&(r.refreshToken=e.refreshToken),e.expiresAt!==void 0&&(r.expiresAt=e.expiresAt);let s={...n,cognito:r};jb(Wb(t),{recursive:!0,mode:448}),Fb(t,JSON.stringify(s,null,2));try{Db(t,384)}catch{}}async function Xb(e){let t=e.deviceAuthPath??wi(),n=im(t);if(n===null)throw new Error("device_auth_not_found: no ~/.lmctl/device-auth.json; run `lmctl device login` first");let r=await wl({region:e.region,clientId:e.clientId,refreshToken:n.refreshToken,...e.fetchImpl!==void 0?{fetchImpl:e.fetchImpl}:{}});return om({idToken:r.idToken,...r.accessToken!==void 0?{accessToken:r.accessToken}:{},refreshToken:n.refreshToken,...r.expiresAt!==void 0?{expiresAt:r.expiresAt}:{}},e.cliTokensPath??Bb()),{idToken:r.idToken,userId:n.userId}}var am=w(()=>{"use strict";sm()});import{existsSync as gq,realpathSync as yq}from"node:fs";import{dirname as Eq}from"node:path";function lm(e){wq(e).catch(t=>{e.log?.(`[mailbox] prompt trigger failed: ${t instanceof Error?t.message:String(t)}`)})}async function wq(e){let t=e.payload.root_teamfile;try{t=yq(e.payload.root_teamfile)}catch(i){let o=`prompt root missing/unreadable: ${e.payload.root_teamfile}: ${i instanceof Error?i.message:String(i)}`;return cs({rootTeamfile:e.payload.root_teamfile,receiverTeamfile:e.payload.root_teamfile,receiverAlias:"Lead",message:e.payload.text,promptId:e.payload.prompt_id,detail:o,reason:"root_unavailable"}),e.log?.(`[mailbox] ${o}`),{status:"error",response:null,error_detail:o}}if(e.store.getRootTeam(t)===null){let i=`prompt root is not registered: ${t}`;return cs({rootTeamfile:t,receiverTeamfile:t,receiverAlias:"Lead",message:e.payload.text,promptId:e.payload.prompt_id,detail:i,reason:"root_unregistered"}),e.log?.(`[mailbox] ${i}`),{status:"error",response:null,error_detail:i}}let n=vq(t);if("error"in n)return cs({rootTeamfile:t,receiverTeamfile:t,receiverAlias:"Lead",message:e.payload.text,promptId:e.payload.prompt_id,detail:n.error,reason:"root_invalid"}),e.log?.(`[mailbox] ${n.error}`),{status:"error",response:null,error_detail:n.error};let r=Mt(e.store,{receiver_teamfile:t,receiver_alias:n.alias,sender_teamfile:`prompt:${e.payload.prompt_id}`,sender_alias:"operator",ttlMs:Iq(e.env??process.env)});if(!r.acquired){let i=kq(n.alias,r.current);return cs({rootTeamfile:t,receiverTeamfile:t,receiverAlias:n.alias,message:e.payload.text,promptId:e.payload.prompt_id,detail:i,reason:"unavailable"}),e.log?.(`[mailbox] prompt rejected: ${i}`),{status:"error",response:null,error_detail:i}}let s=In(i=>e.store.heartbeatAgentInflight(r.lease,r.leaseId,i),{intervalMs:kr(e.env??process.env)});try{let o=await(e.chat??Wt)({provider:n.provider,sessionId:n.sessionid,cwd:n.sessiondir,prompt:e.payload.text,env:e.env??process.env,alias:n.alias,permissionMode:"yolo",...e.timeoutMs!==void 0?{timeoutMs:e.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,d=a||l?"error":"ok";return d==="ok"?await bq(e.store,{rootTeamfile:t,receiverTeamfile:t,receiverAlias:n.alias,message:e.payload.text,response:o.text,status:d,error_detail:null,log:e.log}):cs({rootTeamfile:t,receiverTeamfile:t,receiverAlias:n.alias,message:e.payload.text,promptId:e.payload.prompt_id,detail:c??"provider failed",reason:a?"stalled":"empty_response"}),{status:d,response:d==="error"?null:o.text,error_detail:c}}catch(i){let o=i instanceof Error?i.message:String(i);return cs({rootTeamfile:t,receiverTeamfile:t,receiverAlias:n.alias,message:e.payload.text,promptId:e.payload.prompt_id,detail:o,reason:"provider_error"}),e.log?.(`[mailbox] prompt provider error: ${o}`),{status:"error",response:null,error_detail:o}}finally{clearInterval(s);try{e.store.releaseAgentInflight(r.lease,r.leaseId)}catch(i){e.log?.(`[mailbox] failed to release prompt in-flight slot: ${i instanceof Error?i.message:String(i)}`)}}}function cs(e){$({event:"prompt_trigger_error",reason:e.reason,prompt_id:e.promptId,root_teamfile:e.rootTeamfile,sender_teamfile:e.rootTeamfile,sender_alias:"operator",receiver_teamfile:e.receiverTeamfile,receiver_alias:e.receiverAlias,error_detail:e.detail,message_preview:Tq(e.message)})}function Tq(e){let t=e.replace(/\s+/gu," ").trim();return t.length<=500?t:`${t.slice(0,497)}...`}function vq(e){if(!gq(e))return{error:`prompt root missing/unreadable: ${e}`};let t=lt(e);if(t.parseErrors.length>0)return{error:`prompt root parse error: ${t.parseErrors.join("; ")}`};let n=Gt(t);return n===void 0?{error:`prompt root has no Lead: ${e}`}:n.session===void 0||n.session.trim()===""?{error:`prompt root Lead is unseeded: ${e}`}:{alias:n.alias,provider:n.provider,sessionid:n.session,sessiondir:n.sessiondir??Eq(e)}}async function bq(e,t){let n=Kb(t.message),r=t.response===null?null:Kb(t.response);try{e.insertTeamChatLog({root_teamfile:t.rootTeamfile,sender_teamfile:t.rootTeamfile,sender_alias:"operator",receiver_teamfile:t.receiverTeamfile,receiver_alias:t.receiverAlias,message:n.text,response:r?.text??null,origin:"unknown",status:t.status,error_detail:t.error_detail,truncated:n.truncated||r?.truncated?1:0,created_at:new Date().toISOString()})}catch(s){t.log?.(`[mailbox] warning: failed to record prompt chat log: ${s instanceof Error?s.message:String(s)}`)}}function Kb(e){return e.length<=Jb?{text:e,truncated:!1}:{text:e.slice(0,Jb),truncated:!0}}function Sq(e,t){return`${e} is servicing ${t.sender_alias} (${t.sender_teamfile}) since ${t.started_at}`}function kq(e,t){return t.sender_teamfile.startsWith("prompt:")?`${e} is busy servicing another prompt since ${t.started_at}`:Sq(e,t)}function Iq(e=process.env){let t=e.LMCTL_INFLIGHT_TTL_MS;if(t===void 0||t.trim()==="")return Gb;let n=Number(t);return!Number.isFinite(n)||n<=0?Gb:n}var Jb,Gb,Vb=w(()=>{"use strict";vt();hn();ce();gt();Jb=256*1024,Gb=30*60*1e3});import{chmodSync as tS,existsSync as Nq,mkdirSync as nS,readFileSync as Sl,writeFileSync as rS}from"node:fs";import{dirname as cm,resolve as Tl,join as sS}from"node:path";import{fileURLToPath as xq}from"node:url";import{homedir as iS}from"node:os";import{CognitoIdentityClient as Aq,GetIdCommand as Rq}from"@aws-sdk/client-cognito-identity";import{fromCognitoIdentity as Yb}from"@aws-sdk/credential-provider-cognito-identity";import{GetObjectCommand as Lq,ListObjectsV2Command as Oq,PutObjectCommand as $q,S3Client as zb}from"@aws-sdk/client-s3";function vi(e={}){let t=e.env??process.env,n=e.tfstatePath!==void 0?[e.tfstatePath]:Pq(e.selfUrl),r={},s;for(let S of n)if(Nq(S)){r=jq(S),s=S;break}let i=(...S)=>{for(let k of S)if(typeof k=="string"&&k!=="")return k},o=i(t.LMCTL_NEXT_IDENTITY_POOL_ID,r.LMCTL_NEXT_IDENTITY_POOL_ID)??Cq,a=i(t.LMCTL_NEXT_COGNITO_USER_POOL_ID,r.LMCTL_NEXT_COGNITO_USER_POOL_ID)??Mq,l=i(t.LMCTL_NEXT_MAILBOX_BUCKET,t.LMCTL_NEXT_POLICY_BUCKET,r.LMCTL_NEXT_MAILBOX_BUCKET,r.LMCTL_NEXT_POLICY_BUCKET)??Dq,c=i(t.AWS_REGION,t.AWS_DEFAULT_REGION)??"us-east-1",d=i(t.LMCTL_NEXT_COGNITO_CLIENT_ID,r.LMCTL_NEXT_COGNITO_CLIENT_ID)??kl,u=[];o===void 0&&u.push("LMCTL_NEXT_IDENTITY_POOL_ID"),a===void 0&&u.push("LMCTL_NEXT_COGNITO_USER_POOL_ID"),l===void 0&&u.push("LMCTL_NEXT_MAILBOX_BUCKET");let f={missing:u,tfstateCandidatesChecked:n,...s!==void 0?{tfstatePathUsed:s}:{}};if(u.length>0)return f;let m=t.LMCTL_MAILBOX_POLL_MS,p=m!==void 0&&m.length>0?Number(m):void 0,_=bl(t.LMCTL_MAILBOX_READ_INTERVAL_SECONDS),h=bl(t.LMCTL_MAILBOX_HEARTBEAT_IDLE_SECONDS),g=bl(t.LMCTL_MAILBOX_BACKOFF_READ_INTERVAL_SECONDS),y=bl(t.LMCTL_MAILBOX_CHATLOG_POLL_SECONDS),E=i(t.LMCTL_MAILBOX_KEY),b=i(t.LMCTL_TOKEN_PATH);return f.config={identityPoolId:o,cognitoUserPoolId:a,cognitoClientId:d,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}:{},...E!==void 0?{mailboxKey:E}:{},...b!==void 0?{tokenPath:b}:{}},f}function jq(e){try{let t=Sl(e,"utf8"),r=JSON.parse(t).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 Pq(e){let t=cm(xq(e??import.meta.url));return[Tl(t,"..","..","..","..","infra","terraform","terraform.tfstate"),Tl(t,"..","..","..","..","..","infra","terraform","terraform.tfstate"),Tl(t,"..","..","..","infra","terraform","terraform.tfstate"),Tl(t,"..","..","infra","terraform","terraform.tfstate")]}function bl(e){if(e===void 0||e==="")return;let t=Number(e);if(!(!Number.isFinite(t)||t<=0))return t*1e3}function Fq(e){let t=Uq(e.intervalMs)??oS,n=Math.max(1,Math.trunc(e.limit??500)),r=e.now??Date.now,s=e.cursorKey!==void 0&&e.store.loadTeamChatLogCursor!==void 0&&e.store.saveTeamChatLogCursor!==void 0?{key:e.cursorKey,load:e.store.loadTeamChatLogCursor.bind(e.store),save:e.store.saveTeamChatLogCursor.bind(e.store)}:null,i,o=!1,a=!1,l=()=>{try{if(s!==null){let u=s.load(s.key);if(u!==null)return i=u.last_pushed_id,!0}return i=e.store.getMaxTeamChatLogId(),s!==null&&s.save({cursor_key:s.key,last_pushed_id:i,updated_at:new Date(r()).toISOString()}),!0}catch(u){return e.log?.(`[mailbox] daemon_event chat_log seed failed: ${u instanceof Error?u.message:String(u)}`),!1}};l();let c=async()=>{if(!(a||o)){o=!0;try{if(i===void 0&&!l())return;let u=e.store.listTeamChatLogSinceId(i,n);for(let f of u){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 e.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(u){e.log?.(`[mailbox] daemon_event chat_log tail failed: ${u instanceof Error?u.message:String(u)}`)}finally{o=!1}}},d=setInterval(()=>{c()},t);return typeof d.unref=="function"&&d.unref(),{pollNow:c,stop(){a=!0,clearInterval(d)}}}function Uq(e){return typeof e=="number"&&Number.isFinite(e)&&e>0?e:void 0}async function aS(e){let t=e.tokenPath??sS(iS(),".lmctl","cli-tokens.json"),n=Qb(e.tokenPath);if(Cb(n.cognito?.idToken)&&im()!==null)try{await Xb({region:e.region,clientId:e.cognitoClientId??kl,cliTokensPath:t}),n=Qb(e.tokenPath),e.log?.("[mx-mailbox] refreshed IdToken from device-auth refresh token")}catch(x){let H=x instanceof Error?x.message:String(x);e.log?.(`[mx-mailbox] device-auth refresh failed: ${H}`)}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.${e.region}.amazonaws.com/${e.cognitoUserPoolId}`,i=n.cognito.identityId,o=!1;i===void 0||i===""?i=await eS({tokenPath:t,region:e.region,identityPoolId:e.identityPoolId,idpProvider:s,idToken:r,log:e.log}):(o=!0,e.log?.(`[mx-mailbox] using cached identityId from cli-tokens (skipping GetId) for ${i}`));let a=Yb({identityId:i,logins:{[s]:r},clientConfig:{region:e.region}}),l=new zb({region:e.region,credentials:a}),c={ListObjectsV2Command:Oq,GetObjectCommand:Lq,PutObjectCommand:$q},d=Ei(r),u=d??i,f=e.deviceId,m=es({identityId:i,userId:d,deviceId:f,mailboxKey:e.mailboxKey}),p=e.cursorStore,_;if(p!==void 0){let x=p.loadMailboxCursor(u,m);if(x!==null)_=x.last_processed_seq??void 0,e.log?.(`[mx-mailbox] resumed seq cursor=${_??"(sentinel)"} for user_id=${u}`);else{let H=!1,J=0;for(;!H&&J<2;){J+=1;try{let N=Fa(m,"web"),A=0,O;do{let X=await l.send(new c.ListObjectsV2Command({Bucket:e.mailboxBucket,Prefix:N,MaxKeys:1e3,...O!==void 0?{ContinuationToken:O}:{}}));for(let q of X.Contents??[]){let j=Ua(q.Key??"",m,"web");j!==void 0&&j>A&&(A=j)}O=X.IsTruncated===!0?X.NextContinuationToken:void 0}while(O!==void 0);_=A,e.log?.(`[mx-mailbox] cold start: seeded seq cursor=${A} for user_id=${u}`),H=!0}catch(N){let A=N instanceof Error?N.message:String(N);if(o&&J===1&&Bq(N)){e.log?.(`[mx-mailbox] cached identityId rejected by cognito (${A}); clearing + refreshing`),qq(t),o=!1,i=await eS({tokenPath:t,region:e.region,identityPoolId:e.identityPoolId,idpProvider:s,idToken:r,log:e.log}),a=Yb({identityId:i,logins:{[s]:r},clientConfig:{region:e.region}}),l=new zb({region:e.region,credentials:a}),m=es({identityId:i,userId:d,deviceId:f,mailboxKey:e.mailboxKey});continue}e.log?.(`[mx-mailbox] cold start seq probe failed: ${A}`);break}}p.saveMailboxCursor({user_id:u,mailbox_key:m,last_processed_version_id:null,last_processed_seq:_??null,last_processed_at:new Date().toISOString()})}}let h=null,g=e.terminalSessionManager,y=e.persistentSessionManager,E=e.promptTriggerStore,b=new yl,S=new fr({bucket:e.mailboxBucket,identityId:i,...d!==null?{userId:d}:{},...f!==void 0?{deviceId:f}:{},...e.mailboxKey!==void 0?{mailboxKey:e.mailboxKey}:{},s3:l,commands:c,selfRole:"agent",onS3Op:x=>b.record(x),onMessage:async x=>{if(g!==void 0&&zf(x.payload)){g.onInbound(x.payload);return}if(y!==void 0&&Zf(x.payload)){await y.onInbound(x.payload);return}if(!em(x.payload)){if(E!==void 0&&tm(x.payload)){lm({store:E,payload:x.payload,log:e.log});return}h!==null&&await h.handleIncoming(x.payload,x)}},...p!==void 0?{onCursorAdvance:x=>{p.saveMailboxCursor({user_id:u,mailbox_key:m,last_processed_version_id:null,last_processed_seq:x,last_processed_at:new Date().toISOString()})}}:{},..._!==void 0?{cursor:_}:{},...e.pollIntervalMs!==void 0?{pollIntervalMs:e.pollIntervalMs}:{},...e.readIntervalMs!==void 0?{readIntervalMs:e.readIntervalMs}:{},...e.heartbeatIdleMs!==void 0?{heartbeatIdleMs:e.heartbeatIdleMs}:{},...e.backoffReadIntervalMs!==void 0?{backoffReadIntervalMs:e.backoffReadIntervalMs}:{}});h=new yi({client:S,...e.log!==void 0?{log:e.log}:{}}),g!==void 0&&g.setPublish(async x=>S.putMessage({conversation_id:`terminal:${x.session_id}`,payload:x})),y!==void 0&&y.setPublish(async x=>S.putMessage({conversation_id:`provider:${x.session_id}`,payload:x}));let k=x=>S.putMessage({conversation_id:Qf,payload:x});S.start();let F=e.chatLogTailStore===void 0?void 0:Fq({store:e.chatLogTailStore,publishDaemonEvent:k,cursorKey:m,intervalMs:e.chatLogPollIntervalMs??e.readIntervalMs??e.pollIntervalMs??oS,log:e.log});e.log?.(`[mx-mailbox] agent polling ${m} (bucket=${e.mailboxBucket})`);let P=e.deviceId??i,D=`${u}/usage/`,U;return U=e.usageStore===void 0?void 0:kb({meter:b,store:e.usageStore,userId:u,deviceId:P,ceilingUsd:e.usageQuotaUsd??1/0,onQuotaExceeded:({period:x,costUsd:H,ceilingUsd:J})=>{e.log?.(`[usage] month ${x} cost $${H.toFixed(4)} >= ceiling $${J} \u2014 blocking mailbox`),S.stop().catch(()=>{}),U?.stop()},publishOwnRollup:async(x,H)=>{await l.send(new c.PutObjectCommand({Bucket:e.mailboxBucket,Key:`${D}${P}-${x}.json`,Body:JSON.stringify({...H,updated_at:new Date().toISOString()}),ContentType:"application/json"}))},readUserTotal:async x=>{let H={put:0,get:0,list:0},J;do{let N=await l.send(new c.ListObjectsV2Command({Bucket:e.mailboxBucket,Prefix:D,MaxKeys:1e3,...J!==void 0?{ContinuationToken:J}:{}}));for(let A of N.Contents??[]){let O=A.Key??"";if(O.endsWith(`-${x}.json`))try{let X=await l.send(new c.GetObjectCommand({Bucket:e.mailboxBucket,Key:O}));if(X.Body===void 0)continue;let q=JSON.parse(await X.Body.transformToString("utf-8"));H.put+=q.put??0,H.get+=q.get??0,H.list+=q.list??0}catch{}}J=N.IsTruncated===!0?N.NextContinuationToken:void 0}while(J!==void 0);return H},intervalMs:e.usageFlushIntervalMs??36e5,...e.log!==void 0?{log:e.log}:{}}),{identityId:i,mailbox:S,fetchClient:h,publishDaemonEvent:k,async stop(){F?.stop(),U!==void 0&&(await U.flushNow().catch(()=>{}),U.stop()),await h.stop().catch(()=>{}),await S.stop().catch(()=>{})}}}async function lS(e){let t=e.s3!==void 0&&e.commands!==void 0?{s3:e.s3,commands:e.commands}:gl(e.rootDir),n=es({identityId:Ti,userId:Ti,deviceId:Zb}),r=null,s=e.terminalSessionManager,i=e.persistentSessionManager,o=e.promptTriggerStore,a=new fr({bucket:"local",identityId:Ti,userId:Ti,deviceId:Zb,s3:t.s3,commands:t.commands,selfRole:"agent",onMessage:async c=>{if(s!==void 0&&zf(c.payload)){s.onInbound(c.payload);return}if(i!==void 0&&Zf(c.payload)){await i.onInbound(c.payload);return}if(!em(c.payload)){if(o!==void 0&&tm(c.payload)){lm({store:o,payload:c.payload,log:e.log});return}r!==null&&await r.handleIncoming(c.payload,c)}},pollIntervalMs:e.pollIntervalMs??vl,readIntervalMs:e.readIntervalMs??vl,heartbeatIdleMs:e.heartbeatIdleMs??vl,backoffReadIntervalMs:e.backoffReadIntervalMs??vl});r=new yi({client:a,...e.log!==void 0?{log:e.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:Qf,payload:c});return a.start(),e.log?.(`[local-webui] agent polling ${n} (local-fs ${e.rootDir})`),{identityId:Ti,mailbox:a,fetchClient:r,publishDaemonEvent:l,async stop(){await r.stop().catch(()=>{}),await a.stop().catch(()=>{})}}}function Qb(e){let t=e??sS(iS(),".lmctl","cli-tokens.json");try{let n=Sl(t,"utf8");return JSON.parse(n)}catch{return{}}}function Wq(e,t){if(t===void 0||t==="")return;let n={};try{let s=Sl(e,"utf8");n=JSON.parse(s)}catch{}if(n.cognito===void 0)return;let r={...n,cognito:{...n.cognito,identityId:t}};nS(cm(e),{recursive:!0,mode:448}),rS(e,JSON.stringify(r,null,2));try{tS(e,384)}catch{}}function qq(e){let t={};try{let r=Sl(e,"utf8");t=JSON.parse(r)}catch{return}if(t.cognito===void 0)return;let n={...t,cognito:{...t.cognito}};delete n.cognito.identityId,nS(cm(e),{recursive:!0,mode:448}),rS(e,JSON.stringify(n,null,2));try{tS(e,384)}catch{}}async function eS(e){e.log?.("[mx-mailbox] cli-tokens has no identityId; calling GetId");let n=await new Aq({region:e.region}).send(new Rq({IdentityPoolId:e.identityPoolId,Logins:{[e.idpProvider]:e.idToken}}));if(n.IdentityId===void 0||n.IdentityId==="")throw new Error("cognito_getid_no_identity_id");try{Wq(e.tokenPath,n.IdentityId),e.log?.(`[mx-mailbox] persisted identityId=${n.IdentityId} to ${e.tokenPath}`)}catch(r){let s=r instanceof Error?r.message:String(r);e.log?.(`[mx-mailbox] WARNING: identityId persist failed (${s}); will redo GetId on next restart`)}return n.IdentityId}function Bq(e){if(e===null||typeof e!="object")return!1;let t=e,n=[typeof t.name=="string"?t.name:void 0,typeof t.Code=="string"?t.Code:void 0,typeof t.__type=="string"?t.__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 t.message=="string"?t.message:"";return!!(r.includes("NotAuthorizedException")||r.includes("Invalid identity pool configuration")||r.includes("Identity")&&r.includes("not found"))}var oS,vl,kl,Cq,Mq,Dq,Ti,Zb,dm=w(()=>{"use strict";Ha();Jf();Vf();Ib();xb();Ab();Rb();Lb();nm();Wa();rm();am();Vb();oS=3e3,vl=1e3,kl="79u5jhkk46qofog661c9i0bdcs",Cq="us-east-1:69636ff0-e008-4cbc-853d-180e5526a198",Mq="us-east-1_4iUdFggDn",Dq="lmctl-next-preview-mailbox-254332045686";Ti="local",Zb="local"});import{spawn as pm}from"node:child_process";import{createInterface as cS}from"node:readline";var um,fm,mm,dS,uS=w(()=>{"use strict";Eo();ce();js();um=class{child;ctx;rl;nextRpcId=1;pending=new Map;threadId;nextLocalTurnId=1;closed=!1;setResumeThreadId(t){this.threadId=t}async start(t,n){this.ctx=n;let r=pm(t.command,t.args,{cwd:t.cwd??process.cwd(),env:t.env??process.env,stdio:["pipe","pipe","pipe"]});if(this.child=r,this.rl=cS({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:t.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:t.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(t){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:t}]})).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 t of this.pending.values())t.reject(new Error("codex_session_stopping"));this.pending.clear()}async rpc(t,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:t,params:n});try{this.child.stdin.write(o+`
|
|
2427
2427
|
`)}catch(a){this.pending.delete(i),s(a instanceof Error?a:new Error(String(a)))}})}notify(t,n){if(this.child?.stdin===null||this.child===void 0)return;let r=JSON.stringify({jsonrpc:"2.0",method:t,params:n});try{this.child.stdin.write(r+`
|
|
2428
2428
|
`)}catch{}}handleLine(t){if(t.trim()==="")return;let n;try{n=JSON.parse(t)}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(t,n){if(t==="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(t==="turn/started")return{event_type:"turn_started",payload:{turn_id:n.turn?.id,thread_id:this.threadId}};if(t==="item/agentMessage/delta")return{event_type:"assistant_message_delta",payload:{text:typeof n.delta=="string"?n.delta:""}};if(t==="item/started"||t==="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:t==="item/started"?"started":"completed",item:r}}:{event_type:"notification",payload:{method:t,params:n}}}if(t==="turn/completed"){let r=n.turn;return typeof r?.id=="string"&&this.ctx?.turnMap.delete(r.id),{event_type:"turn_complete",payload:n}}if(t==="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:t,params:n}}}},fm=class{child;ctx;buffer="";sessionIdSeen;closed=!1;async start(t,n){this.ctx=n;let r=pm(t.command,t.args,{cwd:t.cwd??process.cwd(),env:t.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(`
|
|
2429
2429
|
`);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(t){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:t}});try{this.child.stdin.write(r+`
|
|
@@ -2441,12 +2441,12 @@ ${yS.replace(/^error: [^\n]*\n\n/,"")}`),2):oB(e.slice(1),t)}async function oB(e
|
|
|
2441
2441
|
`)}let l=n.noDaemon?void 0:mb({dal:r,intervalMs:gi()}),c=a!==void 0?{missing:[],tfstateCandidatesChecked:[]}:vi({env:process.env});c.missing.length>0&&t.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)`)+`
|
|
2442
2442
|
`);let d=await _B({log:S=>t.stderr.write(`${S}
|
|
2443
2443
|
`)}),u=new Va({adapterFactory:dS,publish:async()=>{throw new Error("persistent_publish_not_wired: mailbox runtime has not bound the publish hook yet")},log:S=>t.stderr.write(`${S}
|
|
2444
|
-
`)}),f=pr()?.device_id,m=Nv({dal:r,daemon:l,...c.config!==void 0?{webuiRuntimeConfig:mB(c.config,f)}:{},...d!==void 0?{terminalSessionManager:d}:{},persistentSessionManager:u,...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 kS({dal:r,app:m,io:t,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}}:{},...d!==void 0?{terminalSessionManager:d}:{},persistentSessionManager:u});await SS({dal:r,mailbox:g.mailbox,io:t});let{serve:
|
|
2445
|
-
`),null));if(
|
|
2444
|
+
`)}),f=pr()?.device_id,m=Nv({dal:r,daemon:l,...c.config!==void 0?{webuiRuntimeConfig:mB(c.config,f)}:{},...d!==void 0?{terminalSessionManager:d}:{},persistentSessionManager:u,...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 kS({dal:r,app:m,io:t,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}}:{},...d!==void 0?{terminalSessionManager:d}:{},persistentSessionManager:u});await SS({dal:r,mailbox:g.mailbox,io:t});let{serve:y}=await import("@hono/node-server"),E=await new Promise((S,k)=>{let F,P=D=>k(D);F=y({fetch:m.fetch,port:i.port,hostname:n.bind},()=>{F.removeListener?.("error",P),S(F)}),F.once("error",P)}).catch(async S=>(l!==void 0&&await l.stop().catch(()=>{}),await g.stop().catch(()=>{}),d!==void 0&&await d.stop().catch(()=>{}),await u.stop().catch(()=>{}),r.close(),t.stderr.write(`error: could not bind ${n.bind}:${i.port}: ${S instanceof Error?S.message:String(S)}
|
|
2445
|
+
`),null));if(E===null)return 2;t.stdout.write(`listening on ${n.bind}:${i.port}
|
|
2446
2446
|
`);let b=re();try{let S=Nl(b);S.running&&S.entry!==null&&S.entry.pid!==process.pid&&t.stderr.write(`note: replacing pidfile for a still-running daemon (pid ${S.entry.pid}, port ${S.entry.port}); \`lmctl serve stop\` will now target pid ${process.pid}
|
|
2447
2447
|
`);let k=pS({pid:process.pid,startedAt:new Date().toISOString(),port:i.port,bind:n.bind,dbPath:b,startToken:_S()},b);t.stdout.write(`pidfile ${k} (pid ${process.pid})
|
|
2448
2448
|
`)}catch(S){t.stderr.write(`warning: could not write serve pidfile: ${S instanceof Error?S.message:String(S)}; \`lmctl serve status\`/\`stop\` will not find this daemon
|
|
2449
|
-
`)}return await new Promise(S=>{let k=()=>{(async()=>{l!==void 0&&await l.stop(),
|
|
2449
|
+
`)}return await new Promise(S=>{let k=()=>{(async()=>{l!==void 0&&await l.stop(),E.close(),await g.stop(),d!==void 0&&await d.stop(),await u.stop(),r.close();try{let F=gm(b);F!==null&&F.pid===process.pid&&ds(b)}catch{}S()})()};process.once("SIGTERM",k),process.once("SIGINT",k)}),0}function TS(e){if(e.stdout!==process.stdout||Em)return;Em=!0;let t=n=>{throw n.code==="EPIPE"&&process.exit(0),process.stdout.off("error",t),n};process.stdout.on("error",t)}function aB(){Em=!1}async function vS(e,t){return TS(t),lB(e,t)}async function lB(e,t){if(e.length>0)return t.stderr.write(`error: lmctl serve status takes no arguments; got: ${e.join(" ")}
|
|
2450
2450
|
`),2;let n=re(),r=Nl(n);if(r.entry===null)return t.stdout.write(`serve: not running
|
|
2451
2451
|
`),t.stdout.write(r.corrupt?` unreadable pidfile at ${Vt(n)} (could not parse)
|
|
2452
2452
|
run \`lmctl serve stop\` to clear it
|
|
@@ -2552,7 +2552,7 @@ The session marker may be stale or the team may not be registered in this lmctl
|
|
|
2552
2552
|
Consulted ${vs(re())}
|
|
2553
2553
|
To experiment with it manually: https://lmctl.com/lmctl/docs/manual-invocation`}function tk(e){return`unknown option --from
|
|
2554
2554
|
${Nm(e)}`}function nk(e,t){let n=_r(e,t);return n.ok?{ok:!0,identity:n.identity,source:"session"}:n}function _r(e,t){let n=e[Ds];if(n===void 0||n.length===0)return{ok:!1,reason:"unset"};let r=[];for(let i of t.listRootTeams()){let o;try{o=Be(i.teamfile_path,t)}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 ki=w(()=>{"use strict";Et();Qe();Kt()});function Fe(e){let t=gn(e);if(t===null)throw new Error(`invalid agent identity: ${e}`);return{teamfile:t.teamfile,alias:t.alias,value:e}}var Ll=w(()=>{"use strict";rt()});async function Cl(e){let t=e.onEvent??(()=>{}),n=YB(e.io,t),r=null,s=null,i=null,o,a,l=null,c=!1,d=null,u=e.prompt;try{let f=await R(n,x=>Te(e.teamfile,e.alias,x)),m=f.teamfile,p=await R(n,x=>oH(x,e.env??process.env)),_=p.sender,h=await aH(n,{explicitRoot:e.rootFlag,sender:_,receiverTeamfile:m,operatorOrigin:p.origin==="operator"}),g=_===null?null:await lH(n,{rootTeamfile:h,sender:_,receiverTeamfile:m,receiverAlias:f.alias});g!==null&&!g.allowed&&t({kind:"warning",message:`warning: out-of-policy chat send: ${g.reason}
|
|
2555
|
-
`}),i=await eH(n,{receiverTeamfile:m,receiverAlias:f.alias,sender:_,rootTeamfile:h,provider:f.provider,model:f.model,sessionId:f.sessionid,cwd:f.sessiondir,prompt:e.prompt,origin:p.origin}),o=sH(n,i);try{fs(n,lt(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 E=uh(e.env??process.env),y=await ak(n,m,f.alias);if(y!==null){let x=km(y);if(_!==null&&E){let H=await xm(n,{sender:_,receiverTeamfile:m,receiverAlias:f.alias,receiverProvider:f.provider,receiverSessionId:f.sessionid,rootTeamfile:h,payload:e.prompt});return d=Ol(`enqueued mailbox message ${H.id}`,null),Am(H.id,_,m,f.alias)}return ps(i,r,e.prompt,x,"unavailable"),d=Rm(x,null),{status:"busy",message:x,teamChatLogId:null}}let b=await zB(n,m,f.alias);if(b.busy){if(_!==null&&E){let H=await xm(n,{sender:_,receiverTeamfile:m,receiverAlias:f.alias,receiverProvider:f.provider,receiverSessionId:f.sessionid,rootTeamfile:h,payload:e.prompt});return d=Ol(`enqueued mailbox message ${H.id}`,null),Am(H.id,_,m,f.alias)}let x=await ZB(n,m,f.alias);return E||(x+=await QB(n,m,f.alias)),ps(i,r,e.prompt,x,"unavailable"),d=Rm(x,null),{status:"busy",message:x,teamChatLogId:null}}if(_!==null&&_.teamfile!==m){let x=await R(n,H=>Jv(H,{root:h,sender:_,receiverTeamfile:m,receiverAlias:f.alias,now:new Date}));if(x.stop){let H=Kv(x.chain);return ps(i,r,e.prompt,H,"cycle"),d=$l(H,null),{status:"error",errorKind:"cycle",message:H,teamChatLogId:null,messageId:null}}}let S=await uH(n,{receiver_teamfile:m,receiver_alias:f.alias,sender_teamfile:_?.teamfile??m,sender_alias:_?.alias??"operator",...b.idleReclaim?{force:!0,reclaimReason:"session-idle"}:{}});if(!S.acquired){if(_!==null&&E){let H=await xm(n,{sender:_,receiverTeamfile:m,receiverAlias:f.alias,receiverProvider:f.provider,receiverSessionId:f.sessionid,rootTeamfile:h,payload:e.prompt});return d=Ol(`enqueued mailbox message ${H.id}`,null),Am(H.id,_,m,f.alias)}let x=lk(m,f.alias,S.current);return E||(x+=` ${bm(vm({holderPid:S.current.holder_pid,since:S.current.started_at}))}`),ps(i,r,e.prompt,x,"unavailable"),d=Rm(x,null),{status:"busy",message:x,teamChatLogId:null}}s={row:S.lease,leaseId:S.leaseId},a=In(x=>R(n,H=>H.heartbeatAgentInflight(s.row,s.leaseId,x)),{intervalMs:ok,onError:x=>{le()&&je(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 is({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:e.prompt,newMessageFrom:_===null?"operator":`${_.teamfile}:${_.alias}`,io:n,permissionMode:e.permissionMode,env:e.env??process.env,...e.idleTimeoutMs!==void 0?{idleTimeoutMs:e.idleTimeoutMs}:{},onDelta:x=>t({kind:"delta",chunk:x}),onProgress:x=>t({kind:"progress",alias:f.alias,event:x}),onPromptBuilt:async x=>{u=x,l===null&&(l=await mH(n,{...r,message:x}),l!==null&&(e.onAccepted?.(rn(l)),i!==null&&await rH(n,i,l))),i!==null&&await nH(n,i,x)}});u=k.prompt;let F=k.status==="stalled",P=null,D=F?`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,U=F||k.status==="error"?"error":r.policy?.outOfPolicy===!0?"out_of_policy":"ok";if(l!==null?(await ik(n,l,{...r,message:u,response:k.receipt,status:U,error_detail:D}),c=!0,P=l):P=await _H(n,{...r,message:u,response:k.receipt,status:U,error_detail:D}),F){let x=D;ps(i,r,u,x,"error"),d=$l(x,P,k.receipt)}else d=Ol(k.receipt,P);return{status:F?"stalled":"ok",replyText:k.receipt,wroteDelta:k.wroteDelta,teamChatLogId:P,messageId:P===null?null:rn(P),durationMs:k.durationMs}}catch(f){let m=f instanceof Error?f.message:String(f);return l!==null&&!c&&r!==null&&(await ik(n,l,{...r,message:u,response:null,status:"error",error_detail:m}),c=!0),ps(i,r,u,m,"error"),d=$l(m,l),{status:"error",errorKind:f instanceof we?"target":"provider",message:m,teamChatLogId:l,messageId:l===null?null:rn(l)}}finally{o!==void 0&&clearInterval(o),a!==void 0&&clearInterval(a),l!==null&&await pH(n,r,rn(l)),s!==null&&await fH(n,s.row,s.leaseId),i!==null&&await tH(n,i,d??$l("chat turn exited without a terminal outcome",null))}}function YB(e,t){return{...e,stdout:{write:()=>{}},stderr:{write:n=>{t({kind:"warning",message:n})}}}}async function zB(e,t,n){let r=await R(e,i=>(sl(i,t,n),ht(i,t,n)));if(!r.busy)return{busy:!1,idleReclaim:!1};let s=await R(e,i=>ls(i,r,t,n));return{busy:!s,idleReclaim:s}}async function ZB(e,t,n){let r=await ak(e,t,n);if(r!==null)return km(r);let s=await R(e,i=>i.getAgentInflight(t,n));return s!==null?lk(t,n,s):`${n} is busy; wait and retry`}async function QB(e,t,n){let r=await R(e,s=>s.getAgentInflight(t,n));return r===null?"":` ${bm(vm({holderPid:r.holder_pid,since:r.started_at}))}`}async function xm(e,t){return await al(e,e.env??process.env),await R(e,n=>{let r=Te(t.sender.teamfile,t.sender.alias,n);return n.enqueueMail({sender_teamfile:t.sender.teamfile,sender_alias:t.sender.alias,sender_provider:r.provider,sender_session_id:r.sessionid,receiver_teamfile:t.receiverTeamfile,receiver_alias:t.receiverAlias,receiver_provider:t.receiverProvider,receiver_session_id:t.receiverSessionId,root_teamfile:t.rootTeamfile,payload:t.payload})})}function Am(e,t,n,r){let s=`${n}:${r}`,i=Pe(e);return{status:"enqueued",id:e,message:`mailbox message ${i} enqueued to ${s}`,teamChatLogId:null,messageId:i,sender:`${t.teamfile}:${t.alias}`,receiver:s}}async function eH(e,t){try{return(await R(e,r=>r.startTrackedInvocation({kind:"chat",origin:t.origin,scope_teamfile:t.receiverTeamfile,from_identity:t.sender===null?"operator":`${t.sender.teamfile}:${t.sender.alias}`,target_teamfile:t.receiverTeamfile,target_alias:t.receiverAlias,root_teamfile:t.rootTeamfile,cwd:t.cwd??null,command:iH(t.receiverTeamfile,t.receiverAlias,t.prompt),holder_pid:process.pid,request_payload:t.prompt,meta:JSON.stringify({provider:t.provider,model:t.model??null,sessionid:t.sessionId??null})}))).id}catch(n){return le()&&je(JSON.stringify({event:"tracked_invocation_start_error",error:n instanceof Error?n.message:String(n)})),null}}async function tH(e,t,n){try{await R(e,r=>{r.finishTrackedInvocation(t,n)})}catch(r){le()&&je(JSON.stringify({event:"tracked_invocation_finish_error",id:t,error:r instanceof Error?r.message:String(r)}))}}async function nH(e,t,n){try{await R(e,r=>{r.updateTrackedInvocationRequestPayload(t,n)})}catch(r){le()&&je(JSON.stringify({event:"tracked_invocation_request_payload_error",id:t,error:r instanceof Error?r.message:String(r)}))}}async function rH(e,t,n){try{await R(e,r=>{r.linkTrackedInvocationMessage(t,n)})}catch(r){le()&&je(JSON.stringify({event:"tracked_invocation_message_link_error",id:t,team_chat_log_id:n,error:r instanceof Error?r.message:String(r)}))}}function sH(e,t){if(t===null)return;let n=setInterval(()=>{R(e,r=>r.heartbeatTrackedInvocation(t)).catch(r=>{le()&&je(JSON.stringify({event:"tracked_invocation_heartbeat_error",id:t,error:r instanceof Error?r.message:String(r)}))})},ok);return n.unref?.(),n}function Ol(e,t){return{status:"done",result_summary:Ii(e),error:null,team_chat_log_id:t}}function Rm(e,t){return{status:"busy",result_summary:Ii(e),error:e,team_chat_log_id:t}}function $l(e,t,n){return{status:"error",result_summary:Ii(n===void 0?e:n),error:e,team_chat_log_id:t}}function Ii(e){let t=e.replace(/\s+/gu," ").trim();return t.length<=500?t:`${t.slice(0,497)}...`}function iH(e,t,n){return`lmctl chat ${JSON.stringify(e)} ${t} ${JSON.stringify(n)}`}function oH(e,t){let n=nk(t,e);if(n.ok)return{sender:Fe(n.identity),origin:"agent"};if(n.reason==="unset")return{sender:null,origin:"operator"};throw new Error(yn("chat"))}async function aH(e,t){if(t.explicitRoot!==void 0)return await R(e,r=>Ee(t.explicitRoot,r));if(t.operatorOrigin||t.sender===null)return t.receiverTeamfile;let n=t.sender;return await R(e,r=>Gv(r,{sender:n,now:new Date})??t.receiverTeamfile)}async function lH(e,t){return await R(e,n=>KS({rootTeamfile:t.rootTeamfile,fromTeamfile:t.sender.teamfile,fromAlias:t.sender.alias,toTeamfile:t.receiverTeamfile,toAlias:t.receiverAlias,registry:cH(n,t.sender.teamfile,t.receiverTeamfile)}))}function cH(e,t,n){return{teams:[t,n].map(s=>dH(s,e))}}function dH(e,t){let n=Be(e,t),r=Gt(n);return{teamfile:e,aliases:n.members.map(s=>s.alias),leadAlias:r?.alias??null}}async function uH(e,t){return await R(e,n=>{let r=le(),s=Mt(n,{receiver_teamfile:t.receiver_teamfile,receiver_alias:t.receiver_alias,sender_teamfile:t.sender_teamfile,sender_alias:t.sender_alias,ttlMs:Xt(),...t.force===!0?{force:!0}:{},...t.reclaimReason===void 0?{}:{reclaimReason:t.reclaimReason}});return s.acquired?(r&&je(JSON.stringify({event:"inflight_acquire",receiver:{teamfile:t.receiver_teamfile,alias:t.receiver_alias},sender:{teamfile:t.sender_teamfile,alias:t.sender_alias},result:s.reclaimReason===null?"acquired":"reclaimed",...s.reclaimReason===null?{}:{reclaim_reason:s.reclaimReason,holder:sk(s.previous)}})),{acquired:!0,lease:s.lease,leaseId:s.leaseId}):(r&&je(JSON.stringify({event:"inflight_acquire",receiver:{teamfile:t.receiver_teamfile,alias:t.receiver_alias},sender:{teamfile:t.sender_teamfile,alias:t.sender_alias},result:"rejected",holder:sk(s.current)})),{acquired:!1,current:s.current})})}async function ak(e,t,n){return await R(e,r=>{for(let i=0;i<2;i+=1){let o=r.getTerminalLock(t,n);if(o===null)return null;if(Sm(o).live)return o;let l=r.getAgentInflight(t,n);if(r.clearTerminalLock(t,n,o.lock_id))return l!==null&&l.sender_teamfile===t&&l.sender_alias==="terminal"&&r.clearObservedTerminalAgentInflight(t,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(t,n);return s===null?null:Sm(s).live?s:null})}function sk(e){return e===null?null:{sender_teamfile:e.sender_teamfile,sender_alias:e.sender_alias,holder_pid:e.holder_pid,started_at:e.started_at}}async function fH(e,t,n){try{await R(e,r=>{r.releaseAgentInflight(t,n)})}catch(r){e.stderr.write(`warning: failed to release chat in-flight slot: ${r instanceof Error?r.message:String(r)}
|
|
2555
|
+
`}),i=await eH(n,{receiverTeamfile:m,receiverAlias:f.alias,sender:_,rootTeamfile:h,provider:f.provider,model:f.model,sessionId:f.sessionid,cwd:f.sessiondir,prompt:e.prompt,origin:p.origin}),o=sH(n,i);try{fs(n,lt(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=uh(e.env??process.env),E=await ak(n,m,f.alias);if(E!==null){let x=km(E);if(_!==null&&y){let H=await xm(n,{sender:_,receiverTeamfile:m,receiverAlias:f.alias,receiverProvider:f.provider,receiverSessionId:f.sessionid,rootTeamfile:h,payload:e.prompt});return d=Ol(`enqueued mailbox message ${H.id}`,null),Am(H.id,_,m,f.alias)}return ps(i,r,e.prompt,x,"unavailable"),d=Rm(x,null),{status:"busy",message:x,teamChatLogId:null}}let b=await zB(n,m,f.alias);if(b.busy){if(_!==null&&y){let H=await xm(n,{sender:_,receiverTeamfile:m,receiverAlias:f.alias,receiverProvider:f.provider,receiverSessionId:f.sessionid,rootTeamfile:h,payload:e.prompt});return d=Ol(`enqueued mailbox message ${H.id}`,null),Am(H.id,_,m,f.alias)}let x=await ZB(n,m,f.alias);return y||(x+=await QB(n,m,f.alias)),ps(i,r,e.prompt,x,"unavailable"),d=Rm(x,null),{status:"busy",message:x,teamChatLogId:null}}if(_!==null&&_.teamfile!==m){let x=await R(n,H=>Jv(H,{root:h,sender:_,receiverTeamfile:m,receiverAlias:f.alias,now:new Date}));if(x.stop){let H=Kv(x.chain);return ps(i,r,e.prompt,H,"cycle"),d=$l(H,null),{status:"error",errorKind:"cycle",message:H,teamChatLogId:null,messageId:null}}}let S=await uH(n,{receiver_teamfile:m,receiver_alias:f.alias,sender_teamfile:_?.teamfile??m,sender_alias:_?.alias??"operator",...b.idleReclaim?{force:!0,reclaimReason:"session-idle"}:{}});if(!S.acquired){if(_!==null&&y){let H=await xm(n,{sender:_,receiverTeamfile:m,receiverAlias:f.alias,receiverProvider:f.provider,receiverSessionId:f.sessionid,rootTeamfile:h,payload:e.prompt});return d=Ol(`enqueued mailbox message ${H.id}`,null),Am(H.id,_,m,f.alias)}let x=lk(m,f.alias,S.current);return y||(x+=` ${bm(vm({holderPid:S.current.holder_pid,since:S.current.started_at}))}`),ps(i,r,e.prompt,x,"unavailable"),d=Rm(x,null),{status:"busy",message:x,teamChatLogId:null}}s={row:S.lease,leaseId:S.leaseId},a=In(x=>R(n,H=>H.heartbeatAgentInflight(s.row,s.leaseId,x)),{intervalMs:ok,onError:x=>{le()&&je(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 is({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:e.prompt,newMessageFrom:_===null?"operator":`${_.teamfile}:${_.alias}`,io:n,permissionMode:e.permissionMode,env:e.env??process.env,...e.idleTimeoutMs!==void 0?{idleTimeoutMs:e.idleTimeoutMs}:{},onDelta:x=>t({kind:"delta",chunk:x}),onProgress:x=>t({kind:"progress",alias:f.alias,event:x}),onPromptBuilt:async x=>{u=x,l===null&&(l=await mH(n,{...r,message:x}),l!==null&&(e.onAccepted?.(rn(l)),i!==null&&await rH(n,i,l))),i!==null&&await nH(n,i,x)}});u=k.prompt;let F=k.status==="stalled",P=null,D=F?`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,U=F||k.status==="error"?"error":r.policy?.outOfPolicy===!0?"out_of_policy":"ok";if(l!==null?(await ik(n,l,{...r,message:u,response:k.receipt,status:U,error_detail:D}),c=!0,P=l):P=await _H(n,{...r,message:u,response:k.receipt,status:U,error_detail:D}),F){let x=D;ps(i,r,u,x,"error"),d=$l(x,P,k.receipt)}else d=Ol(k.receipt,P);return{status:F?"stalled":"ok",replyText:k.receipt,wroteDelta:k.wroteDelta,teamChatLogId:P,messageId:P===null?null:rn(P),durationMs:k.durationMs}}catch(f){let m=f instanceof Error?f.message:String(f);return l!==null&&!c&&r!==null&&(await ik(n,l,{...r,message:u,response:null,status:"error",error_detail:m}),c=!0),ps(i,r,u,m,"error"),d=$l(m,l),{status:"error",errorKind:f instanceof we?"target":"provider",message:m,teamChatLogId:l,messageId:l===null?null:rn(l)}}finally{o!==void 0&&clearInterval(o),a!==void 0&&clearInterval(a),l!==null&&await pH(n,r,rn(l)),s!==null&&await fH(n,s.row,s.leaseId),i!==null&&await tH(n,i,d??$l("chat turn exited without a terminal outcome",null))}}function YB(e,t){return{...e,stdout:{write:()=>{}},stderr:{write:n=>{t({kind:"warning",message:n})}}}}async function zB(e,t,n){let r=await R(e,i=>(sl(i,t,n),ht(i,t,n)));if(!r.busy)return{busy:!1,idleReclaim:!1};let s=await R(e,i=>ls(i,r,t,n));return{busy:!s,idleReclaim:s}}async function ZB(e,t,n){let r=await ak(e,t,n);if(r!==null)return km(r);let s=await R(e,i=>i.getAgentInflight(t,n));return s!==null?lk(t,n,s):`${n} is busy; wait and retry`}async function QB(e,t,n){let r=await R(e,s=>s.getAgentInflight(t,n));return r===null?"":` ${bm(vm({holderPid:r.holder_pid,since:r.started_at}))}`}async function xm(e,t){return await al(e,e.env??process.env),await R(e,n=>{let r=Te(t.sender.teamfile,t.sender.alias,n);return n.enqueueMail({sender_teamfile:t.sender.teamfile,sender_alias:t.sender.alias,sender_provider:r.provider,sender_session_id:r.sessionid,receiver_teamfile:t.receiverTeamfile,receiver_alias:t.receiverAlias,receiver_provider:t.receiverProvider,receiver_session_id:t.receiverSessionId,root_teamfile:t.rootTeamfile,payload:t.payload})})}function Am(e,t,n,r){let s=`${n}:${r}`,i=Pe(e);return{status:"enqueued",id:e,message:`mailbox message ${i} enqueued to ${s}`,teamChatLogId:null,messageId:i,sender:`${t.teamfile}:${t.alias}`,receiver:s}}async function eH(e,t){try{return(await R(e,r=>r.startTrackedInvocation({kind:"chat",origin:t.origin,scope_teamfile:t.receiverTeamfile,from_identity:t.sender===null?"operator":`${t.sender.teamfile}:${t.sender.alias}`,target_teamfile:t.receiverTeamfile,target_alias:t.receiverAlias,root_teamfile:t.rootTeamfile,cwd:t.cwd??null,command:iH(t.receiverTeamfile,t.receiverAlias,t.prompt),holder_pid:process.pid,request_payload:t.prompt,meta:JSON.stringify({provider:t.provider,model:t.model??null,sessionid:t.sessionId??null})}))).id}catch(n){return le()&&je(JSON.stringify({event:"tracked_invocation_start_error",error:n instanceof Error?n.message:String(n)})),null}}async function tH(e,t,n){try{await R(e,r=>{r.finishTrackedInvocation(t,n)})}catch(r){le()&&je(JSON.stringify({event:"tracked_invocation_finish_error",id:t,error:r instanceof Error?r.message:String(r)}))}}async function nH(e,t,n){try{await R(e,r=>{r.updateTrackedInvocationRequestPayload(t,n)})}catch(r){le()&&je(JSON.stringify({event:"tracked_invocation_request_payload_error",id:t,error:r instanceof Error?r.message:String(r)}))}}async function rH(e,t,n){try{await R(e,r=>{r.linkTrackedInvocationMessage(t,n)})}catch(r){le()&&je(JSON.stringify({event:"tracked_invocation_message_link_error",id:t,team_chat_log_id:n,error:r instanceof Error?r.message:String(r)}))}}function sH(e,t){if(t===null)return;let n=setInterval(()=>{R(e,r=>r.heartbeatTrackedInvocation(t)).catch(r=>{le()&&je(JSON.stringify({event:"tracked_invocation_heartbeat_error",id:t,error:r instanceof Error?r.message:String(r)}))})},ok);return n.unref?.(),n}function Ol(e,t){return{status:"done",result_summary:Ii(e),error:null,team_chat_log_id:t}}function Rm(e,t){return{status:"busy",result_summary:Ii(e),error:e,team_chat_log_id:t}}function $l(e,t,n){return{status:"error",result_summary:Ii(n===void 0?e:n),error:e,team_chat_log_id:t}}function Ii(e){let t=e.replace(/\s+/gu," ").trim();return t.length<=500?t:`${t.slice(0,497)}...`}function iH(e,t,n){return`lmctl chat ${JSON.stringify(e)} ${t} ${JSON.stringify(n)}`}function oH(e,t){let n=nk(t,e);if(n.ok)return{sender:Fe(n.identity),origin:"agent"};if(n.reason==="unset")return{sender:null,origin:"operator"};throw new Error(yn("chat"))}async function aH(e,t){if(t.explicitRoot!==void 0)return await R(e,r=>Ee(t.explicitRoot,r));if(t.operatorOrigin||t.sender===null)return t.receiverTeamfile;let n=t.sender;return await R(e,r=>Gv(r,{sender:n,now:new Date})??t.receiverTeamfile)}async function lH(e,t){return await R(e,n=>KS({rootTeamfile:t.rootTeamfile,fromTeamfile:t.sender.teamfile,fromAlias:t.sender.alias,toTeamfile:t.receiverTeamfile,toAlias:t.receiverAlias,registry:cH(n,t.sender.teamfile,t.receiverTeamfile)}))}function cH(e,t,n){return{teams:[t,n].map(s=>dH(s,e))}}function dH(e,t){let n=Be(e,t),r=Gt(n);return{teamfile:e,aliases:n.members.map(s=>s.alias),leadAlias:r?.alias??null}}async function uH(e,t){return await R(e,n=>{let r=le(),s=Mt(n,{receiver_teamfile:t.receiver_teamfile,receiver_alias:t.receiver_alias,sender_teamfile:t.sender_teamfile,sender_alias:t.sender_alias,ttlMs:Xt(),...t.force===!0?{force:!0}:{},...t.reclaimReason===void 0?{}:{reclaimReason:t.reclaimReason}});return s.acquired?(r&&je(JSON.stringify({event:"inflight_acquire",receiver:{teamfile:t.receiver_teamfile,alias:t.receiver_alias},sender:{teamfile:t.sender_teamfile,alias:t.sender_alias},result:s.reclaimReason===null?"acquired":"reclaimed",...s.reclaimReason===null?{}:{reclaim_reason:s.reclaimReason,holder:sk(s.previous)}})),{acquired:!0,lease:s.lease,leaseId:s.leaseId}):(r&&je(JSON.stringify({event:"inflight_acquire",receiver:{teamfile:t.receiver_teamfile,alias:t.receiver_alias},sender:{teamfile:t.sender_teamfile,alias:t.sender_alias},result:"rejected",holder:sk(s.current)})),{acquired:!1,current:s.current})})}async function ak(e,t,n){return await R(e,r=>{for(let i=0;i<2;i+=1){let o=r.getTerminalLock(t,n);if(o===null)return null;if(Sm(o).live)return o;let l=r.getAgentInflight(t,n);if(r.clearTerminalLock(t,n,o.lock_id))return l!==null&&l.sender_teamfile===t&&l.sender_alias==="terminal"&&r.clearObservedTerminalAgentInflight(t,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(t,n);return s===null?null:Sm(s).live?s:null})}function sk(e){return e===null?null:{sender_teamfile:e.sender_teamfile,sender_alias:e.sender_alias,holder_pid:e.holder_pid,started_at:e.started_at}}async function fH(e,t,n){try{await R(e,r=>{r.releaseAgentInflight(t,n)})}catch(r){e.stderr.write(`warning: failed to release chat in-flight slot: ${r instanceof Error?r.message:String(r)}
|
|
2556
2556
|
`)}}function lk(e,t,n){return`${t} is servicing ${n.sender_alias} (${n.sender_teamfile}) since ${n.started_at} \u2014 wait and retry, or inspect without waking it: lmctl tail "${e}" ${t}`}async function mH(e,t){let n=Ni(t.message);try{return await R(e,r=>r.beginTeamChatLog({root_teamfile:t.root_teamfile,sender_teamfile:t.sender_teamfile,sender_alias:t.sender_alias,receiver_teamfile:t.receiver_teamfile,receiver_alias:t.receiver_alias,receiver_provider:t.receiver_provider,receiver_session_id:t.receiver_session_id,provider_prompt:t.message,message:n.text,response:null,origin:t.origin,status:"running",error_detail:null,truncated:n.truncated?1:0,created_at:new Date().toISOString()}))}catch(r){return e.stderr.write(`warning: failed to begin chat log: ${r instanceof Error?r.message:String(r)}
|
|
2557
2557
|
`),null}}async function ik(e,t,n){let r=Ni(n.message),s=n.response===null?null:Ni(n.response);try{await R(e,i=>i.finishTeamChatLog(t,{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){e.stderr.write(`warning: failed to finish chat log ${t}: ${i instanceof Error?i.message:String(i)}
|
|
2558
2558
|
`)}}async function pH(e,t,n){if(t!==null)try{await R(e,r=>{r.clearCurrentlyHandlingMessage(t.receiver_teamfile,t.receiver_alias,n)})}catch(r){e.stderr.write(`warning: failed to clear chat causal pointer: ${r instanceof Error?r.message:String(r)}
|
|
@@ -2574,7 +2574,7 @@ ${dk}
|
|
|
2574
2574
|
`),1})}let s=Hn(gH,{target:r.target,alias:r.alias,flags:{session:r.sessionFlag,provider:r.providerFlag}});if(s.mode==="error")return t.stderr.write(`error: ${s.message}
|
|
2575
2575
|
`),2;if(s.mode==="managed")return t.stderr.write(`error: chat managed mode requires --run <id>
|
|
2576
2576
|
`),2;let i;if(s.mode==="ai-team"){if(s.alias===void 0)return t.stderr.write(`error: chat: alias required (internal)
|
|
2577
|
-
`),2;let u=await Cl({teamfile:s.teamfile,alias:s.alias,prompt:r.prompt,permissionMode:r.permissionMode,...r.idleTimeoutMs!==void 0?{idleTimeoutMs:r.idleTimeoutMs}:{},...r.rootFlag!==void 0?{rootFlag:r.rootFlag}:{},env:n,io:t,onEvent:f=>{r.json===!0&&f.kind==="delta"||vH(t,f)},...r.json===!0?{onAccepted:f=>{t.stdout.write(`${JSON.stringify({status:"accepted",message_id:f})}
|
|
2577
|
+
`),2;let u=await Cl({teamfile:s.teamfile,alias:s.alias,prompt:r.prompt,permissionMode:r.permissionMode,...r.idleTimeoutMs!==void 0?{idleTimeoutMs:r.idleTimeoutMs}:{},...r.rootFlag!==void 0?{rootFlag:r.rootFlag}:{},env:n,io:t,onEvent:f=>{r.json===!0&&f.kind==="delta"||vH(t,f,r.verbose===!0)},...r.json===!0?{onAccepted:f=>{t.stdout.write(`${JSON.stringify({status:"accepted",message_id:f})}
|
|
2578
2578
|
`)}}:{}});return r.json===!0?u.status==="enqueued"?(t.stdout.write(`${JSON.stringify({status:"enqueued",path:"enqueued",id:u.id,message_id:u.messageId,sender:u.sender,receiver:u.receiver})}
|
|
2579
2579
|
`),0):u.status==="busy"?(t.stdout.write(`${JSON.stringify({status:"busy",message:u.message,teamChatLogId:u.teamChatLogId})}
|
|
2580
2580
|
`),1):u.status==="error"?(t.stdout.write(`${JSON.stringify({status:"error",errorKind:u.errorKind,message:u.message,teamChatLogId:u.teamChatLogId,...u.messageId===null?{}:{message_id:u.messageId}})}
|
|
@@ -2589,26 +2589,24 @@ ${dk}
|
|
|
2589
2589
|
`)?"":`
|
|
2590
2590
|
`}`),t.stderr.write(`note: ${uk(s.alias)}
|
|
2591
2591
|
`),u.status==="stalled"?1:0)}else{if(s.provider===void 0)return t.stderr.write(`error: chat raw mode (bare sessionid / --session) requires --provider <name>
|
|
2592
|
-
`),2;i={provider:s.provider,sessionId:s.sessionid,cwd:process.cwd()}}let o=!1,a=le(),l=0,c=0,d=0;try{let u={provider:i.provider,sessionId:i.sessionId,cwd:i.cwd,prompt:r.prompt,permissionMode:r.permissionMode,env:n,onDelta:p=>{o=!0,a&&(l+=1,d=Buffer.byteLength(p,"utf8"),c+=d),t.stdout.write(p)},onProgress:p=>pk(t,i.alias??"(raw)",p)};i.model!==void 0&&(u.model=i.model),i.effort!==void 0&&(u.effort=i.effort),i.alias!==void 0&&(u.alias=i.alias),i.isLead!==void 0&&(u.isLead=i.isLead),r.idleTimeoutMs!==void 0&&(u.timeoutMs=r.idleTimeoutMs);let f=await Wt(u);a&&je(JSON.stringify({event:"chat_return",alias:i.alias??"(raw)",provider:i.provider,streamed:o,blockCount:l,streamedBytes:c,resultTextBytes:Buffer.byteLength(f.text,"utf8"),lastChunkBytes:d,tailPreview:TH(f.text,200)}));let m=f.status==="stalled";return o?f.text.endsWith(`
|
|
2592
|
+
`),2;i={provider:s.provider,sessionId:s.sessionid,cwd:process.cwd()}}let o=!1,a=le(),l=0,c=0,d=0;try{let u={provider:i.provider,sessionId:i.sessionId,cwd:i.cwd,prompt:r.prompt,permissionMode:r.permissionMode,env:n,onDelta:p=>{o=!0,a&&(l+=1,d=Buffer.byteLength(p,"utf8"),c+=d),t.stdout.write(p)},onProgress:p=>pk(t,i.alias??"(raw)",p,r.verbose===!0)};i.model!==void 0&&(u.model=i.model),i.effort!==void 0&&(u.effort=i.effort),i.alias!==void 0&&(u.alias=i.alias),i.isLead!==void 0&&(u.isLead=i.isLead),r.idleTimeoutMs!==void 0&&(u.timeoutMs=r.idleTimeoutMs);let f=await Wt(u);a&&je(JSON.stringify({event:"chat_return",alias:i.alias??"(raw)",provider:i.provider,streamed:o,blockCount:l,streamedBytes:c,resultTextBytes:Buffer.byteLength(f.text,"utf8"),lastChunkBytes:d,tailPreview:TH(f.text,200)}));let m=f.status==="stalled";return o?f.text.endsWith(`
|
|
2593
2593
|
`)||t.stdout.write(`
|
|
2594
2594
|
`):t.stdout.write(`${f.text}${f.text.endsWith(`
|
|
2595
2595
|
`)?"":`
|
|
2596
2596
|
`}`),f.status==="stalled"?1:0}catch(u){let f=u instanceof Error?u.message:String(u);return t.stderr.write(`error: ${f}
|
|
2597
|
-
`),1}}function uk(e){return`${e}'s turn has finished and exited; resubmit \`lmctl chat\` to continue (no persistent session is left running)`}function EH(e){let t=[],n="yolo",r,s,i,o,a,l,c=!1,d=!1;for(let
|
|
2597
|
+
`),1}}function uk(e){return`${e}'s turn has finished and exited; resubmit \`lmctl chat\` to continue (no persistent session is left running)`}function EH(e){let t=[],n="yolo",r,s,i,o,a,l,c=!1,d=!1,u=!1;for(let h=0;h<e.length;h+=1){let g=e[h];if(g==="--permission-mode"){let y=e[++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=e[++h];if(y===void 0||y.startsWith("--"))return"missing value for --idle-timeout";let E=mk(y);if(typeof E=="string")return E;r=E;continue}if(g==="--session"){let y=e[++h];if(y===void 0||y.startsWith("--"))return"missing value for --session";s=y;continue}if(g==="--provider"){let y=e[++h];if(y===void 0||y.startsWith("--"))return"missing value for --provider";i=y;continue}if(g==="--from"||g.startsWith("--from="))return tk("chat");if(g.startsWith("I_am="))return`unknown argument: ${g}`;if(g==="--root"){let y=e[++h];if(y===void 0||y.startsWith("--"))return"missing value for --root";o=y;continue}if(g==="--prompt-file"){let y=e[++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"){d=!0;continue}if(g==="--verbose"){u=!0;continue}if(g==="--run"){let y=e[++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}`;t.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&&t.length>0)return"--prompt-file is mutually exclusive with a positional answer; pass one or the other";if(a===void 0&&t.length===0)return"a prompt (answer) is required with --run";if(t.length>1)return`--run takes exactly one positional (the answer); got ${t.length}`;let h={prompt:a!==void 0?"":t[0],permissionMode:n,runFlag:l,done:c,json:d,verbose:u};return a!==void 0&&(h.promptFile=a),h}let f,m,p;if(a!==void 0){if(t.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(t.length===1)f=t[0];else if(t.length===2)f=t[0],m=t[1];else return"--prompt-file is mutually exclusive with a positional prompt; pass one or the other";p=""}else{if(t.length===0)return"a prompt is required";if(t.length===1){if(s===void 0)return'expected <teamfile>:<alias> "<prompt>" | <teamfile> <alias> "<prompt>" | <sessionid> "<prompt>" | --session <id> "<prompt>"';p=t[0]}else if(t.length===2)f=t[0],p=t[1];else if(t.length===3)f=t[0],m=t[1],p=t[2];else return`too many positionals (${t.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),d&&(_.json=d),u&&(_.verbose=u),_}async function fk(e,t,n=process.stdin){let r;try{r=e==="-"?await wH(n):hH(e,"utf8")}catch(o){let a=o instanceof Error?o.message:String(o);return{error:`--prompt-file ${e}: ${a}`}}let s=r.endsWith(`\r
|
|
2598
2598
|
`)?r.slice(0,-2):r.endsWith(`
|
|
2599
2599
|
`)?r.slice(0,-1):r;if(s.length===0)return{error:`--prompt-file ${e}: file is empty; a prompt is required`};let i=Buffer.byteLength(s,"utf8");return i>65536&&t.stderr.write(`warning: prompt is ${i} bytes, over the ${65536}-byte mailbox payload cap.
|
|
2600
2600
|
It sends intact to an idle receiver, but if the receiver is BUSY the message is queued and
|
|
2601
2601
|
the stored copy is truncated to the cap. Split it or wait for the receiver to be idle.
|
|
2602
|
-
`),s}async function wH(e){let t=[];for await(let n of e)t.push(typeof n=="string"?Buffer.from(n,"utf8"):n);return Buffer.concat(t).toString("utf8")}function mk(e){if(e==="0")return 0;if(/^\d+$/.test(e))return Number(e);let t=/^(\d+)([smhd])$/.exec(e);if(t===null)return`invalid --idle-timeout "${e}" (expected <n>(s|m|h|d), integer ms, or 0)`;let n=Number(t[1]),r=t[2];return n*(r==="s"?1e3:r==="m"?6e4:r==="h"?36e5:864e5)}function pk(e,t,n){n.kind
|
|
2603
|
-
`)
|
|
2604
|
-
`):n.kind==="api_retry"&&e.stderr.write(`[${t}] api_retry${n.summary?`: ${n.summary}`:""}
|
|
2605
|
-
`)}function TH(e,t){return e.slice(-t)}function vH(e,t){t.kind==="delta"?e.stdout.write(t.chunk):t.kind==="progress"?pk(e,t.alias,t.event):e.stderr.write(t.message)}var gH,dk,hk=w(()=>{"use strict";vt();Yi();Le();rt();Lm();ki();ce();za();cn();gH={name:"chat",allowsBareTeamfile:!1,supportsRaw:!0},dk=`usage: lmctl chat <teamfile>:<alias> "<prompt>"
|
|
2602
|
+
`),s}async function wH(e){let t=[];for await(let n of e)t.push(typeof n=="string"?Buffer.from(n,"utf8"):n);return Buffer.concat(t).toString("utf8")}function mk(e){if(e==="0")return 0;if(/^\d+$/.test(e))return Number(e);let t=/^(\d+)([smhd])$/.exec(e);if(t===null)return`invalid --idle-timeout "${e}" (expected <n>(s|m|h|d), integer ms, or 0)`;let n=Number(t[1]),r=t[2];return n*(r==="s"?1e3:r==="m"?6e4:r==="h"?36e5:864e5)}function pk(e,t,n,r=!1){if(n.kind!=="tool_use"&&n.kind!=="tool_result"&&n.kind!=="api_retry")return;let s=n.kind==="tool_use"?`[${t}] tool_use ${n.tool??"tool"}${n.summary?`: ${n.summary}`:""}`:n.kind==="tool_result"?`[${t}] tool_result${n.status?` ${n.status}`:""}${n.summary?`: ${n.summary}`:""}`:`[${t}] api_retry${n.summary?`: ${n.summary}`:""}`;$({event:"chat_progress",alias:t,progress_kind:n.kind,line:s}),r&&e.stderr.write(`${s}
|
|
2603
|
+
`)}function TH(e,t){return e.slice(-t)}function vH(e,t,n=!1){t.kind==="delta"?e.stdout.write(t.chunk):t.kind==="progress"?pk(e,t.alias,t.event,n):e.stderr.write(t.message)}var gH,dk,hk=w(()=>{"use strict";vt();Yi();Le();rt();Lm();ki();ce();za();cn();gH={name:"chat",allowsBareTeamfile:!1,supportsRaw:!0},dk=`usage: lmctl chat <teamfile>:<alias> "<prompt>"
|
|
2606
2604
|
lmctl chat <teamfile> <alias> "<prompt>"
|
|
2607
2605
|
lmctl chat <sessionid> "<prompt>" --provider <name>
|
|
2608
2606
|
lmctl chat --provider <name> --session <id> "<prompt>"
|
|
2609
2607
|
lmctl chat --run <id> "<answer>" [--done]
|
|
2610
2608
|
[--permission-mode plan|yolo] [--idle-timeout <duration>]
|
|
2611
|
-
[--root <teamfile>] [--json]
|
|
2609
|
+
[--root <teamfile>] [--json] [--verbose]
|
|
2612
2610
|
|
|
2613
2611
|
Safe input (no shell involved) \u2014 use for anything non-trivial:
|
|
2614
2612
|
lmctl chat <teamfile>:<alias> --prompt-file <path>
|
|
@@ -2622,6 +2620,11 @@ Safe input (no shell involved) \u2014 use for anything non-trivial:
|
|
|
2622
2620
|
Managed-team --json synchronous sends emit an early {"status":"accepted",
|
|
2623
2621
|
"message_id":"msg_..."} line after durable creation, then a final result line
|
|
2624
2622
|
with the same message_id. Busy and enqueued outcomes emit one line.
|
|
2623
|
+
--verbose prints the live "[alias] tool_use/tool_result/api_retry"
|
|
2624
|
+
progress narration on stderr (always recorded to ~/.lmctl/debug-*.log either
|
|
2625
|
+
way; off by default, since this chat call may run nested inside an already-
|
|
2626
|
+
interactive session, e.g. a tool call issued from within \`lmctl terminal\`,
|
|
2627
|
+
where unconditional narration would bleed into unrelated output).
|
|
2625
2628
|
|
|
2626
2629
|
Send a prompt to a team member or raw provider session, or answer a paused run.`});function xi(e){for(let t=e.length-1;t>=0;t-=1){let n=e[t],r=bH.exec(n.content);if(r===null){if(n.role==="assistant"&&n.content.trim().length>0)return null;continue}let s=Number.parseInt(r[1],10),i=r[2]===void 0?0:Number.parseInt(r[2],10),o=r[3].toLowerCase(),a=r[4]?.trim()??null,l=`${r[1]}${r[2]!==void 0?`:${r[2]}`:""}${o}`;return{state:"LIMITED",resets_at:a===null?null:SH(n.timestamp,s,i,o,a),reset_time:l,timezone:a,detected_at:n.timestamp.toISOString()}}return null}function SH(e,t,n,r,s){if(!Number.isFinite(e.getTime())||t<1||t>12||n<0||n>59)return null;let i=kH(t,r);try{let o=IH(e,s),a=gk(o.year,o.month,o.day,i,n,s);if(a.getTime()<=e.getTime()){let l=RH(o,1);a=gk(l.year,l.month,l.day,i,n,s)}return a.toISOString()}catch{return null}}function kH(e,t){return t==="am"?e===12?0:e:e===12?12:e+12}function IH(e,t){let n=yk(t,!1).formatToParts(e);return{year:En(n,"year"),month:En(n,"month"),day:En(n,"day")}}function gk(e,t,n,r,s,i){let o=Date.UTC(e,t-1,n,r,s,0,0);for(let a=0;a<3;a+=1){let l=NH(new Date(o),i);o=Date.UTC(e,t-1,n,r,s,0,0)-l}return new Date(o)}function NH(e,t){let n=yk(t,!0).formatToParts(e);return Date.UTC(En(n,"year"),En(n,"month")-1,En(n,"day"),En(n,"hour"),En(n,"minute"),En(n,"second"),0)-e.getTime()}function yk(e,t){let n=t?AH:xH,r=n.get(e);if(r!==void 0)return r;let s=new Intl.DateTimeFormat("en-US",{timeZone:e,hourCycle:"h23",year:"numeric",month:"2-digit",day:"2-digit",...t?{hour:"2-digit",minute:"2-digit",second:"2-digit"}:{}});return n.set(e,s),s}function En(e,t){let n=e.find(r=>r.type===t)?.value;if(n===void 0)throw new Error(`missing ${t}`);return Number.parseInt(n,10)}function RH(e,t){let n=new Date(Date.UTC(e.year,e.month-1,e.day+t));return{year:n.getUTCFullYear(),month:n.getUTCMonth()+1,day:n.getUTCDate()}}var bH,xH,AH,Om=w(()=>{"use strict";bH=/you['\u2019]ve hit your session limit\s*(?:\u00b7|-|:)?\s*resets\s+([0-9]{1,2})(?::([0-9]{2}))?\s*(am|pm)\s*(?:\(([^)]+)\))?/i;xH=new Map,AH=new Map});var Tk={};me(Tk,{runRecover:()=>OH});import{dirname as Ek,resolve as wk}from"node:path";async function OH(e,t,n={}){if(e.includes("--help")||e.includes("-h"))return t.stdout.write(`${$m}
|
|
2627
2630
|
`),0;let r=Y(e.filter(p=>p!=="--"),[],["--all","--dry-run","--json"]);if(r.error!==void 0)return I(t,`${r.error}
|
|
@@ -2663,12 +2666,12 @@ ${_s}`);if(r.positionals.length===0)return I(t,`restore requires a <teamfile> (o
|
|
|
2663
2666
|
|
|
2664
2667
|
${_s}`);if(r.positionals.length>2)return I(t,`unexpected argument: ${r.positionals[2]}`);let i=r.positionals[0],o=gn(i),a=o?.teamfile??i,l=r.positionals[1],c=o?.alias??l;if(o!==null&&l!==void 0)return I(t,"restore alias was provided twice; use either <teamfile>:<alias> or <teamfile> <alias>");if(c===void 0)return I(t,`restore requires an <alias>
|
|
2665
2668
|
|
|
2666
|
-
${_s}`);let d;try{d=await n.resolveTeamTarget(a,c,t)}catch(k){if(k instanceof we)return I(t,k.message);throw k}let u;try{u=await n.loadSession(d.sessionid,d.provider)}catch(k){return I(t,`failed to load session: ${Bl(k)}`)}if(u===null)return I(t,`session not found: ${d.sessionid} (provider=${d.provider})`);let f=W(r,"--dry-run"),m=W(r,"--force"),p=W(r,"--single-session")||n.resolveTeamRoster===void 0,_=C(r,"--target"),h=_===void 0?void 0:Tn(_),g=p?[d]:$2([d,...await n.resolveTeamRoster(a,t)]),
|
|
2669
|
+
${_s}`);let d;try{d=await n.resolveTeamTarget(a,c,t)}catch(k){if(k instanceof we)return I(t,k.message);throw k}let u;try{u=await n.loadSession(d.sessionid,d.provider)}catch(k){return I(t,`failed to load session: ${Bl(k)}`)}if(u===null)return I(t,`session not found: ${d.sessionid} (provider=${d.provider})`);let f=W(r,"--dry-run"),m=W(r,"--force"),p=W(r,"--single-session")||n.resolveTeamRoster===void 0,_=C(r,"--target"),h=_===void 0?void 0:Tn(_),g=p?[d]:$2([d,...await n.resolveTeamRoster(a,t)]),y=[],E=[],b=[];for(let k of g){if(k.sessionid===d.sessionid){b.push({member:k,detail:u}),E.push(gr(k,"target",0));continue}try{let F=await n.loadSession(k.sessionid,k.provider);if(F===null){E.push(gr(k,"not_found",0)),y.push(`team member ${k.alias}: session ${k.sessionid} not found \u2014 its file history is missing from this recovery`);continue}b.push({member:k,detail:F}),E.push(gr(k,"merged",0))}catch(F){E.push(gr(k,"load_error",0)),y.push(`team member ${k.alias}: session load failed (${Bl(F)}) \u2014 its file history is missing from this recovery`)}}let S={toolCalls:Li(u).coverage.toolCalls,structuredReplay:Yk[u.provider],shellScan:Bm[u.provider]!==void 0?"best_effort":"none",crossSession:p?"single_session":"team_merged",...Wl[u.provider]!==void 0?{structuredNote:Wl[u.provider]}:{},shellNote:zk};return Zk(t,{json:W(r,"--json"),dryRun:f,force:m,absTarget:h,loaded:b,members:E,loadWarnings:y,coverage:S,mode:p?"single_session":"team",headerJson:{provider:u.provider,sessionId:u.sessionId,sessionCwd:u.cwd},describe:p?" (single session)":` from ${b.length} team session(s)`})}function Jk(e){let t=Tn(e),n=[];for(;;)try{return N2(T2(t),...n.reverse())}catch{let r=Hl(t);if(r===t)return Tn(e);n.push(Vk(t)),t=r}}async function O2(e,t,n,r){if(r.discoverSessions===void 0)return I(n,"--dir is not available: session discovery is not wired in this harness");let s=Jk(e),i=W(t,"--recursive"),o;try{o=await r.discoverSessions()}catch(y){return I(n,`session discovery failed: ${Bl(y)}`)}let a=s.endsWith("/")?s:`${s}/`,l=new Set,c=[],d=0,u=0,f=0;for(let y of o){let E=`${y.provider}:${y.sessionId}`;if(l.has(E)){f+=1;continue}if(l.add(E),typeof y.cwd!="string"||y.cwd.trim()===""){d+=1;continue}let b=Jk(y.cwd);b===s||i&&b.startsWith(a)?c.push(y):u+=1}if(c.sort((y,E)=>y.createdAt.getTime()-E.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); ${d} had no recorded cwd`);let m=[],p=[],_=[];for(let y of c){let E={teamfile:"",alias:`${y.provider}:${y.sessionId}`,provider:y.provider,sessionid:y.sessionId,sessiondir:y.cwd,isLead:!1};try{let b=await r.loadSession(y.sessionId,y.provider);if(b===null){p.push(gr(E,"not_found",0)),m.push(`session ${E.alias}: discovered but not loadable \u2014 its file history is missing from this recovery`);continue}_.push({member:E,detail:b}),p.push(gr(E,"merged",0))}catch(b){p.push(gr(E,"load_error",0)),m.push(`session ${E.alias}: load failed (${Bl(b)}) \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:Yk[y],shellScan:Bm[y]!==void 0?"best_effort":"none",...Wl[y]!==void 0?{structuredNote:Wl[y]}:{}})),shellNote:zk};return Zk(n,{json:W(t,"--json"),dryRun:W(t,"--dry-run"),force:W(t,"--force"),absTarget:C(t,"--target")===void 0?void 0:Tn(C(t,"--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:d,excludedOutsideDir:u}},describe:` from ${_.length} session(s) recorded in ${s}`})}async function Zk(e,t){let{dryRun:n,force:r,absTarget:s,loaded:i,members:o,loadWarnings:a}=t,l=C2(i);for(let _ of o)_.fileOps=l.filter(h=>h.alias===_.alias).length;let{files:c,warnings:d}=await P2(l,{dryRun:n,force:r,targetDir:s}),u=[...a,...d],f=i.flatMap(({member:_,detail:h})=>W2(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:u.length},p=m.unreplayable>0||m.unreplayedCalls>0||m.warnings>0;if(t.json)z(e,{schema_version:x2,...t.headerJson,target:s??null,dryRun:n,force:r,mode:t.mode,members:o,coverage:t.coverage,summary:m,files:c,unreplayedCalls:f,warnings:u});else{for(let _ of c){let h=_.aliases.length>1?` [stitched: ${_.aliases.join("+")}]`:"",g=_.detail===null?"":` \u2014 ${_.detail}`;e.stdout.write(`${_.path}: ${_.action} (${_.reason})${h}${g}
|
|
2667
2670
|
`)}for(let _ of f)e.stdout.write(`unreplayed ${_.kind} call ${_.tool} [${_.alias}]${_.path===null?"":` ${_.path}`}: ${_.reason}
|
|
2668
2671
|
`);for(let _ of u)e.stdout.write(`warning: ${_}
|
|
2669
2672
|
`);e.stdout.write(`Restore ${n?"planned":"replayed"} ${m.files} file(s)${t.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).
|
|
2670
2673
|
`),p&&e.stdout.write(`warning: recovery is incomplete \u2014 see per-file reasons above
|
|
2671
|
-
`)}return p?1:0}function $2(e){let t=new Set,n=[];for(let r of e)t.has(r.sessionid)||(t.add(r.sessionid),n.push(r));return n}function gr(e,t,n){return{alias:e.alias,provider:e.provider,sessionId:e.sessionid,status:t,fileOps:n}}function C2(e){let t=[];for(let n=0;n<e.length;n+=1){let{member:r,detail:s}=e[n],i=Qk(s);for(let o=0;o<i.length;o+=1)t.push({op:{...i[o],alias:r.alias,cwd:s.cwd},rosterIndex:n,seq:o})}return t.sort((n,r)=>n.op.timestamp.getTime()-r.op.timestamp.getTime()||n.rosterIndex-r.rosterIndex||n.seq-r.seq),t.map(n=>n.op)}function Qk(e){let t=A2[e.provider]??{},n=Bm[e.provider]??{},r=[];for(let s of e.messages){if(s.role!=="tool_use"||s.toolName===void 0)continue;let i=s.toolInputData??J2(s.toolInput);if(i===void 0)continue;let o={timestamp:s.timestamp,callId:s.toolCallId??null,tool:s.toolName},a=t[s.toolName];if(a!==void 0){let c=M2(a,i);c!==null&&r.push({effect:c,source:"structured",...o});continue}if(e.provider==="codex"&&s.toolName==="apply_patch"){r.push(...D2(i,o));continue}let l=n[s.toolName];if(l!==void 0){let c=j2(i[l]);if(c===null)continue;for(let d of Fm(c))r.push({effect:d,source:"shell",...o})}}return r}function M2(e,t){let n=Fl(t,e.pathKeys);if(n===void 0)return null;if(e.op==="write"){let o=Fl(t,e.contentKeys);return o===void 0?null:{kind:"write",path:n,content:o}}let r=Fl(t,e.oldKeys),s=Fl(t,e.newKeys);if(r===void 0||s===void 0)return null;let i=e.replaceAllKeys.some(o=>t[o]===!0);return{kind:"edit",path:n,oldString:r,newString:s,replaceAll:i}}function D2(e,t){let n=typeof e.input=="string"?e.input:void 0;if(n===void 0)return[];let r=qk(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",...t}))}function j2(e){if(typeof e=="string")return e;if(!Array.isArray(e)||!e.every(r=>typeof r=="string"))return null;let t=e,n=t.findIndex(r=>/^-[a-z]*c[a-z]*$/.test(r));return n!==-1&&n+1<t.length?t[n+1]:t.some(r=>/[\s'"$`;|&<>()]/.test(r))?null:t.join(" ")}async function P2(e,t){let n=new Map,r=[],s=new Set,i=[],o=(u,f,m)=>{let p=n.get(u);return p===void 0&&(p={state:"unknown",content:null,lastOp:m.timestamp,ops:0,sessionPath:f,sources:new Set,aliases:[]},n.set(u,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=(u,f)=>{let m=H2(u,f.cwd,t.targetDir);if(m.abs!==void 0)return m.abs;if(!s.has(u)){s.add(u);let p=m.reason==="symlink_path";r.push({path:u,sessionPath:u,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(u,f)=>{if(u.state==="known")return u.content;if(u.ops>1||!Um(f))return null;try{return await b2(f,"utf8")}catch{return null}},c=(u,f,m)=>{u.state="unknown",u.content=null,u.unknownReason=f,m!==void 0&&(u.unknownDetail=m)};for(let u of e){let f=u.effect;switch(f.kind){case"write":{let m=a(f.path,u);if(m===null)break;let p=o(m,f.path,u);p.state="known",p.content=f.content,delete p.unknownReason,delete p.unknownDetail;break}case"append":{let m=a(f.path,u);if(m===null)break;let p=o(m,f.path,u);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,u);if(m===null)break;let p=o(m,f.path,u);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=U2(_,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,u);if(m===null)break;let p=o(m,f.path,u);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=Bk(_,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,u);if(g!==null){let E=o(g,f.moveTo,u);E.state="known",E.content=h,p.state="deleted",p.content=null}}break}case"delete":{let m=a(f.path,u);if(m===null)break;let p=o(m,f.path,u);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=u.timestamp,g.ops+=1)}break}case"move":case"copy":{let m=a(f.from,u),p=a(f.to,u),_=m===null?void 0:n.get(m);if(p!==null){let h=o(p,f.to,u);_!==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,u);h.state="deleted",h.content=null}break}case"touch":{let m=a(f.path,u);if(m===null)break;let p=n.get(m);if(p?.state==="deleted"){let _=o(m,f.path,u);_.state="known",_.content="",delete _.unknownReason,delete _.unknownDetail}else if(p!==void 0)o(m,f.path,u);else if(!Um(m)){let _=o(m,f.path,u);_.state="known",_.content=""}break}case"mutate":{if(f.path===void 0){i.push(`${u.tool} @ ${u.timestamp.toISOString()}: ${f.note}`);for(let _ of n.values())_.state!=="unknown"&&(_.lastOp=u.timestamp,_.ops+=1,_.sources.add(u.source),_.aliases.includes(u.alias)||_.aliases.push(u.alias),c(_,"not_reconstructable",f.note));break}let m=a(f.path,u);if(m===null)break;let p=o(m,f.path,u);c(p,"not_reconstructable",f.note);break}case"opaque":{let m=!1;for(let[p,_]of n)_.state!=="unknown"&&q2(f.tokens,p,_.sessionPath)&&(m=!0,_.lastOp=u.timestamp,_.ops+=1,_.sources.add(u.source),_.aliases.includes(u.alias)||_.aliases.push(u.alias),c(_,"not_reconstructable",`possibly mutated by unrecognized command: ${f.command}`));for(let p of B2(f.tokens)){let _=a(p,u);if(_===null||n.has(_))continue;m=!0;let h=o(_,p,u);c(h,"not_reconstructable",`possibly mutated by unrecognized command: ${f.command}`)}m||i.push(`${u.tool} @ ${u.timestamp.toISOString()}: unrecognized command may mutate files: ${f.command}`);break}}}let d=[...r];for(let[u,f]of n)d.push(await F2(u,f,t));return{files:d,warnings:i}}async function F2(e,t,n){if(n.targetDir!==void 0&&ql(n.targetDir,e))return hr(e,t,"unreplayable","symlink_path",null,"restore target contains a symbolic link");let r=Um(e)?await I2(e):null,s=r?.mtime??null;if(t.state==="deleted")return hr(e,t,"skipped","deleted_in_session",s,null);if(t.state==="unknown"||t.content===null)return hr(e,t,"unreplayable",t.unknownReason??"not_reconstructable",s,t.unknownDetail??null);let i;if(r===null)i="missing_on_disk";else if(t.lastOp.getTime()>r.mtimeMs)i="session_newer";else if(n.force)i="forced";else return hr(e,t,"skipped","disk_newer_or_equal",s,null);if(n.dryRun)return hr(e,t,"would_write",i,s,null);if(n.targetDir===void 0)await Wm(Hl(e),{recursive:!0}),await Kk(e,t.content,"utf8"),await Gk(e,t.lastOp,t.lastOp);else try{await X2(n.targetDir,e,t.content,t.lastOp)}catch(o){if(o instanceof wn)return hr(e,t,"unreplayable","symlink_path",s,o.message);throw o}return hr(e,t,"written",i,s,null)}function U2(e,t,n,r){return t===""?e===""?n:null:e.includes(t)?r?e.split(t).join(n):e.replace(t,n):null}function W2(e,t,n){let r=new Set(t.map(o=>o.callId).filter(o=>o!==null)),s=Li(e),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 q2(e,t,n){let r=Vk(t);for(let s of e)if(s===t||s===n||s.includes(t)||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 B2(e){return[...new Set(e.filter(t=>t===""||t.startsWith("-")||/[$`*?{}();]/.test(t)||/\s/.test(t)?!1:Ul(t)||t.includes("/")||/(?:^|\.)[A-Za-z0-9_-]+\.[A-Za-z0-9_-]{1,16}$/.test(t)))]}function H2(e,t,n){if(n===void 0)return Ul(e)?{abs:e}:t===""?{reason:"unresolvable_path"}:{abs:Tn(t,e)};let r=Ul(e)?t===""?void 0:qm(t,e):e;if(r===void 0)return{reason:"unresolvable_path"};let s=Tn(n,r),i=qm(n,s);return i===""||i.startsWith("..")||Ul(i)?{reason:"outside_target"}:ql(n,s)?{reason:"symlink_path"}:{abs:s}}function ql(e,t){let n=t;for(;;){try{if(w2(n).isSymbolicLink())return!0}catch(s){if(s.code!=="ENOENT")throw s}if(n===e)return!1;let r=Hl(n);if(r===n)return!0;n=r}}async function X2(e,t,n,r){try{let l=await Pl(e);if(l.isSymbolicLink()||!l.isDirectory())throw new wn(`unsafe restore root: ${e}`)}catch(l){if(l.code!=="ENOENT")throw l;await Wm(e,{recursive:!0});let c=await Pl(e);if(c.isSymbolicLink()||!c.isDirectory())throw new wn(`unsafe restore root: ${e}`)}let s=qm(e,Hl(t)),i=e;for(let l of s===""?[]:s.split(/[\\/]/)){i=Tn(i,l);try{let c=await Pl(i);if(c.isSymbolicLink()||!c.isDirectory())throw new wn(`unsafe restore parent: ${i}`)}catch(c){if(c.code!=="ENOENT")throw c;await Wm(i);let d=await Pl(i);if(d.isSymbolicLink()||!d.isDirectory())throw new wn(`unsafe restore parent: ${i}`)}}if(ql(e,t))throw new wn(`restore target contains a symbolic link: ${t}`);let o=await v2(Tn(i,".lmctl-restore-")),a=Tn(o,"content.tmp");try{if(await Kk(a,n,{encoding:"utf8",flag:"wx"}),await Gk(a,r,r),ql(e,t))throw new wn(`restore target contains a symbolic link: ${t}`);await S2(a,t)}finally{await k2(o,{recursive:!0,force:!0})}}function hr(e,t,n,r,s,i){return{path:e,sessionPath:t.sessionPath,ops:t.ops,sources:[...t.sources],aliases:[...t.aliases],action:n,reason:r,detail:i,sessionMtime:t.lastOp.toISOString(),diskMtime:s?.toISOString()??null}}function Fl(e,t){for(let n of t){let r=e[n];if(typeof r=="string")return r}}function J2(e){if(e!==void 0)try{let t=JSON.parse(e);return t!==null&&typeof t=="object"&&!Array.isArray(t)?t:void 0}catch{return}}function Bl(e){return e instanceof Error?e.message:String(e)}var x2,_s,Yk,Wl,zk,Xk,A2,Bm,R2,wn,tI=w(()=>{"use strict";At();vt();Pm();Fk();Hk();Le();rt();Kt();x2=2,_s=["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(`
|
|
2674
|
+
`)}return p?1:0}function $2(e){let t=new Set,n=[];for(let r of e)t.has(r.sessionid)||(t.add(r.sessionid),n.push(r));return n}function gr(e,t,n){return{alias:e.alias,provider:e.provider,sessionId:e.sessionid,status:t,fileOps:n}}function C2(e){let t=[];for(let n=0;n<e.length;n+=1){let{member:r,detail:s}=e[n],i=Qk(s);for(let o=0;o<i.length;o+=1)t.push({op:{...i[o],alias:r.alias,cwd:s.cwd},rosterIndex:n,seq:o})}return t.sort((n,r)=>n.op.timestamp.getTime()-r.op.timestamp.getTime()||n.rosterIndex-r.rosterIndex||n.seq-r.seq),t.map(n=>n.op)}function Qk(e){let t=A2[e.provider]??{},n=Bm[e.provider]??{},r=[];for(let s of e.messages){if(s.role!=="tool_use"||s.toolName===void 0)continue;let i=s.toolInputData??J2(s.toolInput);if(i===void 0)continue;let o={timestamp:s.timestamp,callId:s.toolCallId??null,tool:s.toolName},a=t[s.toolName];if(a!==void 0){let c=M2(a,i);c!==null&&r.push({effect:c,source:"structured",...o});continue}if(e.provider==="codex"&&s.toolName==="apply_patch"){r.push(...D2(i,o));continue}let l=n[s.toolName];if(l!==void 0){let c=j2(i[l]);if(c===null)continue;for(let d of Fm(c))r.push({effect:d,source:"shell",...o})}}return r}function M2(e,t){let n=Fl(t,e.pathKeys);if(n===void 0)return null;if(e.op==="write"){let o=Fl(t,e.contentKeys);return o===void 0?null:{kind:"write",path:n,content:o}}let r=Fl(t,e.oldKeys),s=Fl(t,e.newKeys);if(r===void 0||s===void 0)return null;let i=e.replaceAllKeys.some(o=>t[o]===!0);return{kind:"edit",path:n,oldString:r,newString:s,replaceAll:i}}function D2(e,t){let n=typeof e.input=="string"?e.input:void 0;if(n===void 0)return[];let r=qk(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",...t}))}function j2(e){if(typeof e=="string")return e;if(!Array.isArray(e)||!e.every(r=>typeof r=="string"))return null;let t=e,n=t.findIndex(r=>/^-[a-z]*c[a-z]*$/.test(r));return n!==-1&&n+1<t.length?t[n+1]:t.some(r=>/[\s'"$`;|&<>()]/.test(r))?null:t.join(" ")}async function P2(e,t){let n=new Map,r=[],s=new Set,i=[],o=(u,f,m)=>{let p=n.get(u);return p===void 0&&(p={state:"unknown",content:null,lastOp:m.timestamp,ops:0,sessionPath:f,sources:new Set,aliases:[]},n.set(u,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=(u,f)=>{let m=H2(u,f.cwd,t.targetDir);if(m.abs!==void 0)return m.abs;if(!s.has(u)){s.add(u);let p=m.reason==="symlink_path";r.push({path:u,sessionPath:u,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(u,f)=>{if(u.state==="known")return u.content;if(u.ops>1||!Um(f))return null;try{return await b2(f,"utf8")}catch{return null}},c=(u,f,m)=>{u.state="unknown",u.content=null,u.unknownReason=f,m!==void 0&&(u.unknownDetail=m)};for(let u of e){let f=u.effect;switch(f.kind){case"write":{let m=a(f.path,u);if(m===null)break;let p=o(m,f.path,u);p.state="known",p.content=f.content,delete p.unknownReason,delete p.unknownDetail;break}case"append":{let m=a(f.path,u);if(m===null)break;let p=o(m,f.path,u);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,u);if(m===null)break;let p=o(m,f.path,u);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=U2(_,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,u);if(m===null)break;let p=o(m,f.path,u);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=Bk(_,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,u);if(g!==null){let y=o(g,f.moveTo,u);y.state="known",y.content=h,p.state="deleted",p.content=null}}break}case"delete":{let m=a(f.path,u);if(m===null)break;let p=o(m,f.path,u);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=u.timestamp,g.ops+=1)}break}case"move":case"copy":{let m=a(f.from,u),p=a(f.to,u),_=m===null?void 0:n.get(m);if(p!==null){let h=o(p,f.to,u);_!==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,u);h.state="deleted",h.content=null}break}case"touch":{let m=a(f.path,u);if(m===null)break;let p=n.get(m);if(p?.state==="deleted"){let _=o(m,f.path,u);_.state="known",_.content="",delete _.unknownReason,delete _.unknownDetail}else if(p!==void 0)o(m,f.path,u);else if(!Um(m)){let _=o(m,f.path,u);_.state="known",_.content=""}break}case"mutate":{if(f.path===void 0){i.push(`${u.tool} @ ${u.timestamp.toISOString()}: ${f.note}`);for(let _ of n.values())_.state!=="unknown"&&(_.lastOp=u.timestamp,_.ops+=1,_.sources.add(u.source),_.aliases.includes(u.alias)||_.aliases.push(u.alias),c(_,"not_reconstructable",f.note));break}let m=a(f.path,u);if(m===null)break;let p=o(m,f.path,u);c(p,"not_reconstructable",f.note);break}case"opaque":{let m=!1;for(let[p,_]of n)_.state!=="unknown"&&q2(f.tokens,p,_.sessionPath)&&(m=!0,_.lastOp=u.timestamp,_.ops+=1,_.sources.add(u.source),_.aliases.includes(u.alias)||_.aliases.push(u.alias),c(_,"not_reconstructable",`possibly mutated by unrecognized command: ${f.command}`));for(let p of B2(f.tokens)){let _=a(p,u);if(_===null||n.has(_))continue;m=!0;let h=o(_,p,u);c(h,"not_reconstructable",`possibly mutated by unrecognized command: ${f.command}`)}m||i.push(`${u.tool} @ ${u.timestamp.toISOString()}: unrecognized command may mutate files: ${f.command}`);break}}}let d=[...r];for(let[u,f]of n)d.push(await F2(u,f,t));return{files:d,warnings:i}}async function F2(e,t,n){if(n.targetDir!==void 0&&ql(n.targetDir,e))return hr(e,t,"unreplayable","symlink_path",null,"restore target contains a symbolic link");let r=Um(e)?await I2(e):null,s=r?.mtime??null;if(t.state==="deleted")return hr(e,t,"skipped","deleted_in_session",s,null);if(t.state==="unknown"||t.content===null)return hr(e,t,"unreplayable",t.unknownReason??"not_reconstructable",s,t.unknownDetail??null);let i;if(r===null)i="missing_on_disk";else if(t.lastOp.getTime()>r.mtimeMs)i="session_newer";else if(n.force)i="forced";else return hr(e,t,"skipped","disk_newer_or_equal",s,null);if(n.dryRun)return hr(e,t,"would_write",i,s,null);if(n.targetDir===void 0)await Wm(Hl(e),{recursive:!0}),await Kk(e,t.content,"utf8"),await Gk(e,t.lastOp,t.lastOp);else try{await X2(n.targetDir,e,t.content,t.lastOp)}catch(o){if(o instanceof wn)return hr(e,t,"unreplayable","symlink_path",s,o.message);throw o}return hr(e,t,"written",i,s,null)}function U2(e,t,n,r){return t===""?e===""?n:null:e.includes(t)?r?e.split(t).join(n):e.replace(t,n):null}function W2(e,t,n){let r=new Set(t.map(o=>o.callId).filter(o=>o!==null)),s=Li(e),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 q2(e,t,n){let r=Vk(t);for(let s of e)if(s===t||s===n||s.includes(t)||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 B2(e){return[...new Set(e.filter(t=>t===""||t.startsWith("-")||/[$`*?{}();]/.test(t)||/\s/.test(t)?!1:Ul(t)||t.includes("/")||/(?:^|\.)[A-Za-z0-9_-]+\.[A-Za-z0-9_-]{1,16}$/.test(t)))]}function H2(e,t,n){if(n===void 0)return Ul(e)?{abs:e}:t===""?{reason:"unresolvable_path"}:{abs:Tn(t,e)};let r=Ul(e)?t===""?void 0:qm(t,e):e;if(r===void 0)return{reason:"unresolvable_path"};let s=Tn(n,r),i=qm(n,s);return i===""||i.startsWith("..")||Ul(i)?{reason:"outside_target"}:ql(n,s)?{reason:"symlink_path"}:{abs:s}}function ql(e,t){let n=t;for(;;){try{if(w2(n).isSymbolicLink())return!0}catch(s){if(s.code!=="ENOENT")throw s}if(n===e)return!1;let r=Hl(n);if(r===n)return!0;n=r}}async function X2(e,t,n,r){try{let l=await Pl(e);if(l.isSymbolicLink()||!l.isDirectory())throw new wn(`unsafe restore root: ${e}`)}catch(l){if(l.code!=="ENOENT")throw l;await Wm(e,{recursive:!0});let c=await Pl(e);if(c.isSymbolicLink()||!c.isDirectory())throw new wn(`unsafe restore root: ${e}`)}let s=qm(e,Hl(t)),i=e;for(let l of s===""?[]:s.split(/[\\/]/)){i=Tn(i,l);try{let c=await Pl(i);if(c.isSymbolicLink()||!c.isDirectory())throw new wn(`unsafe restore parent: ${i}`)}catch(c){if(c.code!=="ENOENT")throw c;await Wm(i);let d=await Pl(i);if(d.isSymbolicLink()||!d.isDirectory())throw new wn(`unsafe restore parent: ${i}`)}}if(ql(e,t))throw new wn(`restore target contains a symbolic link: ${t}`);let o=await v2(Tn(i,".lmctl-restore-")),a=Tn(o,"content.tmp");try{if(await Kk(a,n,{encoding:"utf8",flag:"wx"}),await Gk(a,r,r),ql(e,t))throw new wn(`restore target contains a symbolic link: ${t}`);await S2(a,t)}finally{await k2(o,{recursive:!0,force:!0})}}function hr(e,t,n,r,s,i){return{path:e,sessionPath:t.sessionPath,ops:t.ops,sources:[...t.sources],aliases:[...t.aliases],action:n,reason:r,detail:i,sessionMtime:t.lastOp.toISOString(),diskMtime:s?.toISOString()??null}}function Fl(e,t){for(let n of t){let r=e[n];if(typeof r=="string")return r}}function J2(e){if(e!==void 0)try{let t=JSON.parse(e);return t!==null&&typeof t=="object"&&!Array.isArray(t)?t:void 0}catch{return}}function Bl(e){return e instanceof Error?e.message:String(e)}var x2,_s,Yk,Wl,zk,Xk,A2,Bm,R2,wn,tI=w(()=>{"use strict";At();vt();Pm();Fk();Hk();Le();rt();Kt();x2=2,_s=["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(`
|
|
2672
2675
|
`),Yk={claude:"full",kimi:"full",opencode:"full",lmplayer:"full",codex:"partial",agy:"partial",gemini:"none",copilot:"none",qwen:"none",ClaudeMock:"none"},Wl={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",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"},zk="shell reconstruction is best-effort from command text; programmatic file writes (interpreters, unknown tools) are not detectable from transcripts",Xk={write:{op:"write",pathKeys:["filePath","path","file"],contentKeys:["content"]},edit:{op:"edit",pathKeys:["filePath","path","file"],oldKeys:["oldString"],newKeys:["newString"],replaceAllKeys:["replaceAll"]}},A2={claude:{Write:{op:"write",pathKeys:["file_path"],contentKeys:["content"]},Edit:{op:"edit",pathKeys:["file_path"],oldKeys:["old_string"],newKeys:["new_string"],replaceAllKeys:["replace_all"]}},kimi:{Write:{op:"write",pathKeys:["path"],contentKeys:["content"]},Edit:{op:"edit",pathKeys:["path"],oldKeys:["old_string"],newKeys:["new_string"],replaceAllKeys:["replace_all"]}},opencode:Xk,lmplayer:Xk,agy:{write_to_file:{op:"write",pathKeys:["TargetFile"],contentKeys:["CodeContent"]}}},Bm={claude:{Bash:"command"},kimi:{Bash:"command"},opencode:{bash:"command"},lmplayer:{bash:"command"},codex:{exec_command:"cmd"},copilot:{bash:"command"},qwen:{run_shell_command:"command"},agy:{run_command:"CommandLine"}},R2={loadSession:De,resolveTeamTarget:(e,t,n)=>R(n,r=>Te(e,t,r)),resolveTeamRoster:(e,t)=>R(t,n=>{let r=Ee(e,n),s=Be(r,n);if(s.parseErrors.length>0)return[];let i=[];for(let o of s.members)try{i.push(Te(e,o.alias,n))}catch{}return i}),discoverSessions:()=>Gs({})};wn=class extends Error{}});var $i,_se,Hm=w(()=>{"use strict";$i=[{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}],_se=$i.length});import{spawn as G2}from"node:child_process";async function rI(e,t,n){let r=V2.get(e);if(r===void 0)return{status:"error",code:404,message:`unknown tool: ${e}`};let s=t!==null&&typeof t=="object"&&!Array.isArray(t)?t:{};for(let i of r.inputSchema.required??[])if(s[i]===void 0)return{status:"error",code:400,message:`missing required parameter: ${i}`};return Y2(r.name,s)}function Y2(e,t){return e==="lmctl_chat"?z2(t):{status:"error",code:404,message:`unknown local tool: ${e}`}}function z2(e){let t=typeof e.prompt=="string"?e.prompt:"";if(t.length===0)return Promise.resolve({status:"error",code:400,message:"missing required parameter: prompt"});let n=typeof e.team=="string"?e.team:"";if(n.length===0)return Promise.resolve({status:"error",code:400,message:"missing required parameter: team"});let r=typeof e.alias=="string"&&e.alias.length>0?e.alias:"Lead",s=["chat",n,r,t];return le()&&je(JSON.stringify({event:"mcp_chat_spawn",team:n,alias:r})),Z2(s,process.cwd())}function Z2(e,t){return new Promise(n=>{let r=!1,s,i=d=>{r||(r=!0,s!==void 0&&clearTimeout(s),n(d))},o=G2("lmctl",e,{cwd:t,env:process.env,stdio:["ignore","pipe","pipe"]}),a=Q2(process.env);s=setTimeout(()=>{try{o.kill("SIGTERM")}catch{}i({status:"error",code:124,message:`lmctl chat timed out after ${a}ms`})},a),s.unref?.();let l="",c="";o.stdout?.on("data",d=>{l+=d.toString("utf8")}),o.stderr?.on("data",d=>{c+=d.toString("utf8")}),o.on("error",d=>{i({status:"error",code:1,message:`failed to spawn lmctl chat: ${d.message}`})}),o.on("exit",d=>{if(d===0){le()&&je(JSON.stringify({event:"mcp_chat_payload",bytes:Buffer.byteLength(l,"utf8"),lines:l.split(`
|
|
2673
2676
|
`).length})),i({status:"ok",data:{text:l.trim()||"(empty response)"}});return}i({status:"error",code:d??1,message:c.trim()||`lmctl chat exited with code ${d}`})})})}function Q2(e){let t=e.LMCTL_MCP_CHAT_TIMEOUT_MS;if(t===void 0||t.trim().length===0)return nI;let n=Number(t);return!Number.isFinite(n)||n<=0?nI:n}function Xm(e,t=process.env){let r=e.getConfig("api.url")??(t.LMCTL_API_URL!==void 0&&t.LMCTL_API_URL.length>0?t.LMCTL_API_URL:K2),s=e.getConfig("api.token"),i=t.LMCTL_API_TOKEN!==void 0&&t.LMCTL_API_TOKEN.length>0?t.LMCTL_API_TOKEN:s;return{baseUrl:r,token:i}}var K2,nI,V2,Jm=w(()=>{"use strict";Hm();ce();K2="http://127.0.0.1:8787",nI=30*60*1e3,V2=new Map($i.map(e=>[e.name,e]))});async function rX(e,t){let n=e.id===void 0,r=e.id??null;if(e.method==="exit")return n||t.io.write(Gm({jsonrpc:"2.0",id:r,result:null})),{kind:"exit"};if(e.method==="initialize")return{kind:"response",message:{jsonrpc:"2.0",id:r,result:{protocolVersion:eX,capabilities:{tools:{listChanged:!1}},serverInfo:{name:tX,version:nX}}}};if(e.method==="notifications/initialized")return{kind:"notification"};if(e.method==="shutdown")return{kind:"response",message:{jsonrpc:"2.0",id:r,result:null}};if(e.method==="tools/list")return{kind:"response",message:{jsonrpc:"2.0",id:r,result:{tools:$i.map(s=>({name:s.name,description:s.description,inputSchema:s.inputSchema}))}}};if(e.method==="tools/call"){let s=e.params!==null&&typeof e.params=="object"?e.params:{},i=typeof s.name=="string"?s.name:"",o=s.arguments,a=await rI(i,o,t.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: ${e.method}`}}}}function Gm(e){return`${JSON.stringify(e)}
|
|
2674
2677
|
`}async function sI(e,t){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(d){e.io.write(Gm({jsonrpc:"2.0",id:null,error:{code:-32700,message:`parse error: ${d instanceof Error?d.message:String(d)}`}}));return}l.method==="shutdown"&&(n=!0);let c=await rX(l,e);c.kind==="response"?e.io.write(Gm(c.message)):c.kind==="exit"&&(s=!0)};return new Promise(o=>{let a=Promise.resolve(),l=!1,c=u=>{l||(l=!0,o(u))},d=()=>{let u=r.indexOf(`
|
|
@@ -3039,9 +3042,9 @@ Don't dump all of durable-memory into your context. The pattern is index-first,
|
|
|
3039
3042
|
`)}return 0}function uG(e,t,n){let r=Y(e,["--alias","--provider","--model","--role","--sessiondir"]);if(r.error!==void 0)return I(t,r.error);let[s]=r.positionals;if(s===void 0)return I(t,"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(t,`team not found: ${s}`);let o=C(r,"--alias"),a=C(r,"--provider");if(o===void 0||a===void 0)return I(t,"team add-member requires --alias and --provider");let l=n.insertTeamMember({team_id:i.id,alias:o,provider:a,model:C(r,"--model")??null,role:C(r,"--role")??"agent",sessiondir:C(r,"--sessiondir")??sG(Hi(),"sessions",i.name,o)});return W(r,"--json")?z(t,l):t.stdout.write(`added member ${l.alias} to ${i.name}
|
|
3040
3043
|
`),0}async function JI(e,t,n,r){let s=Y(e,["--alias"]);if(s.error!==void 0)return I(t,s.error);let[i]=s.positionals;if(i===void 0)return I(t,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(t,`team not found: ${i}`);let a=C(s,"--alias");if(r&&a===void 0)return I(t,"team refresh requires --alias");if(r&&a!==void 0&&a.trim().toLowerCase()==="lead")return I(t,"cannot refresh Lead \u2014 refresh is only for non-Lead members");let l=fG(n.listTeamMembers(o.id),a,r);if(a!==void 0&&l.length===0)return I(t,`member not found or already seeded: ${a}`);if(r&&l.some(m=>m.alias.toLowerCase()==="lead"||m.role==="lead"))return I(t,"cannot refresh Lead \u2014 refresh is only for non-Lead members");let c=n.listProjects().filter(m=>m.team_id===o.id),d=new Set;for(let m of c){if(d.has(m.workflow_name))continue;d.add(m.workflow_name);let p=n.getWorkflowByName(m.workflow_name);if(p===null)continue;let _=nT(m.workflow_name,p.definition);if(_.status==="FAIL")return I(t,`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)RI(m,n);let u=[],f=!1;for(let m of l){let p=await Fo({member:m,dal:n}),_=n.updateTeamMemberSession(m.id,p.sessionid);if(_!==null){let h=_.role_prompt??"",g=h.length>0?`${h}
|
|
3041
3044
|
|
|
3042
|
-
${np}`:np;n.setMemberPromptSnapshot(m.id,g),u.push(_);let
|
|
3043
|
-
${
|
|
3044
|
-
`);try{await BI({dal:n,member:_,stderr:t.stderr})}catch(
|
|
3045
|
+
${np}`:np;n.setMemberPromptSnapshot(m.id,g),u.push(_);let y=_l(et(_),p.sessionid);y!==null&&t.stderr.write(`[seeded ${_.alias}] customize/compact in its native TUI:
|
|
3046
|
+
${y}
|
|
3047
|
+
`);try{await BI({dal:n,member:_,stderr:t.stderr})}catch(E){f=!0,t.stderr.write(`error: ${E instanceof Error?E.message:String(E)}
|
|
3045
3048
|
`)}}}return W(s,"--json")?z(t,u):t.stdout.write(`seeded ${u.length} member(s)
|
|
3046
3049
|
`),f?1:0}function fG(e,t,n){return e.filter(r=>t!==void 0&&r.alias!==t?!1:n||r.sessionid===null)}function mG(e,t,n){let r=Y(e,["--interpreter","--of"]);if(r.error!==void 0)return I(t,r.error);let[s]=r.positionals;if(s===void 0)return I(t,"usage: team companion <team-name> --interpreter A --of B[,C]");let i=n.findTeamByName(s);if(i===null)return I(t,`team not found: ${s}`);let o=C(r,"--interpreter"),a=C(r,"--of")?.split(",").map(c=>c.trim()).filter(Boolean);if(o===void 0||a===void 0||a.length===0)return I(t,"team companion requires --interpreter and --of");let l=n.findTeamMemberByAlias(i.id,o);if(l===null)return I(t,`member not found: ${o}`);for(let c of a){let d=n.findTeamMemberByAlias(i.id,c);if(d===null)return I(t,`member not found: ${c}`);n.insertTeamMemberCompanion({interpreter_id:l.id,companion_id:d.id})}return t.stdout.write(`recorded ${a.length} companion link(s)
|
|
3047
3050
|
`),0}var iG,KI=w(()=>{"use strict";Qe();eu();OI();dt();At();HI();$a();Le();XI();iG=`usage: lmctl team create <name>
|
|
@@ -3102,23 +3105,23 @@ A bare <teamfile> with no alias tails that team's Lead member.
|
|
|
3102
3105
|
`),e.stdout.write(` Steps: ${s.steps.length}
|
|
3103
3106
|
`),e.stdout.write(` AgentCalls: ${o.agentCallCount}
|
|
3104
3107
|
`),e.stdout.write(` Tokens: ${o.totalInputTokens} in / ${o.totalOutputTokens} out
|
|
3105
|
-
`),0)}async function NG(e,t,n){let r,s;try{let
|
|
3106
|
-
`)}let S=b?.messageCount,k=o===null?void 0:b===null?null:lN(b,o.since),F=o===null?void 0:b===null?null:cN(b)??"n/a",P=o===null?void 0:{messageCount:k??null,tokens:null};l.push({alias:
|
|
3108
|
+
`),0)}async function NG(e,t,n){let r,s;try{let E=await R(e,b=>{let S=Be(t,b);if(S.parseErrors.length>0)throw new Error(S.parseErrors.join("; "));return{teamName:S.name,targets:sN(t,b,new Set,[])}});s=E.teamName,r=E.targets}catch(E){return I(e,`health: ${E instanceof Error?E.message:String(E)}`)}let i=aN(t),o=i.kind==="repo"?i:null,a=await iN(e,r),l=[],c=0,d=o===null?void 0:0,u=o===null?void 0:0;for(let E of r){let b=null;try{b=await De(E.sessionid,E.provider)}catch(D){e.stderr.write(`warning: failed to load session "${E.sessionid}" for ${E.reportPath} (${E.provider}): ${D instanceof Error?D.message:String(D)}
|
|
3109
|
+
`)}let S=b?.messageCount,k=o===null?void 0:b===null?null:lN(b,o.since),F=o===null?void 0:b===null?null:cN(b)??"n/a",P=o===null?void 0:{messageCount:k??null,tokens:null};l.push({alias:E.alias,reportPath:E.reportPath,teamfile:E.teamfile,provider:E.provider,sessionid:E.sessionid,messageCount:S??null,model:b?.model??"(unknown)",lastContext:b?.lastInputTokens,detailLoaded:b!==null,liveness:a.get(ip(E.teamfile,E.alias))??op(),sessionLimit:b===null?null:xi(b.messages),...o!==null?{activitySinceLastCommit:P,cumulativeTokens:F}:{}}),S===void 0?c=void 0:c!==void 0&&(c+=S),o!==null&&(k==null?d=void 0:d!==void 0&&(d+=k),F==null||F==="n/a"?u=void 0:u!==void 0&&(u+=F))}if(n)return z(e,{team:s,git:o===null?null:{teamDir:o.teamDir,commits:o.commits.map(E=>({ref:E.ref,timestamp:E.timestamp.toISOString()})),since:o.since.toISOString(),working:o.working},members:l.map(({detailLoaded:E,cumulativeTokens:b,...S})=>({...S,lastContext:S.lastContext??null,...b!==void 0?{cumulativeTokens:b==="n/a"?null:b}:{}})),total:{messageCount:c??null}}),0;let f=Math.max(7,...l.map(E=>E.sessionid.length)),m=Math.max(5,...l.map(E=>E.reportPath.length))+1,p=Math.max(8,...l.map(E=>E.provider.length))+1,_=Math.max(5,...l.map(E=>E.model.length))+1,h=Math.max(4,...l.map(E=>sp(E.liveness).length))+1;if(e.stdout.write(`TEAM: ${s}
|
|
3107
3110
|
`),i.kind==="repo"){e.stdout.write(`Git progress:
|
|
3108
|
-
`);for(let
|
|
3111
|
+
`);for(let E of i.commits)e.stdout.write(` ${E.ref}: ${E.timestamp.toISOString()}
|
|
3109
3112
|
`);e.stdout.write(` Uncommitted: ${Ot(i.working.uncommittedTracked)} changed (tracked), ${Ot(i.working.untracked)} untracked
|
|
3110
3113
|
`)}else i.reason==="no-commits"?e.stdout.write(`Git progress: git repository in ${i.teamDir} has no commits (no commit-based progress to report)
|
|
3111
3114
|
`):e.stdout.write(`Git progress: no git repository in ${i.teamDir} (no commit-based progress to report)
|
|
3112
3115
|
`);e.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)}`:"")+`
|
|
3113
|
-
`);let g=!1,
|
|
3116
|
+
`);let g=!1,y=l.filter(E=>E.sessionLimit!==null);for(let E of l){let b=LG(E.lastContext,E.detailLoaded,bG);(b==="n/a"||E.cumulativeTokens==="n/a")&&(g=!0),e.stdout.write(` ${E.sessionid.padEnd(f)} ${E.reportPath.padEnd(m)}${E.provider.padEnd(p)}${E.model.padEnd(_)}${sp(E.liveness).padEnd(h)}${Ot(E.messageCount).padStart(6)} ${b.padStart(12)}`+(o!==null?` ${Ot(E.activitySinceLastCommit?.messageCount).padStart(17)} ${Ot(E.activitySinceLastCommit?.tokens).padStart(19)} ${RG(E.cumulativeTokens).padStart(19)}`:"")+`
|
|
3114
3117
|
`)}if(e.stdout.write(` ${"TOTAL".padEnd(f)} ${"".padEnd(m)}${"".padEnd(p)}${"".padEnd(_)}${"".padEnd(h)}${Ot(c).padStart(6)}`+(o!==null?` ${"".padStart(12)} ${Ot(d).padStart(17)} ${Ot(null).padStart(19)} ${Ot(u).padStart(19)}`:"")+`
|
|
3115
3118
|
`),g&&e.stdout.write(`n/a = this provider does not expose a context/token total; absence is not a health signal.
|
|
3116
3119
|
`),e.stdout.write(`LAST CONTEXT = prompt size of the LAST COMPLETED turn, so it LAGS BY ONE TURN.
|
|
3117
3120
|
Right after a compaction the last completed turn IS the summarisation request, which carried the
|
|
3118
3121
|
full pre-compaction prompt \u2014 so this reads the OLD large number while the live context is already
|
|
3119
3122
|
small. Re-read after the next turn before concluding a compaction failed or gating on the value.
|
|
3120
|
-
`),
|
|
3121
|
-
`);for(let
|
|
3123
|
+
`),y.length>0){e.stdout.write(`Session limits:
|
|
3124
|
+
`);for(let E of y)e.stdout.write(` ${E.reportPath}: LIMITED resets_at=${oN(E.sessionLimit)}
|
|
3122
3125
|
`)}return 0}function sN(e,t,n,r){let s=Ee(e,t);if(n.has(s))return[];n.add(s);let i=Be(s,t);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(...sN(wG(rN(s),a.teamfile),t,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 xG(e,t,n){let r=await iN(e,[{teamfile:t.teamfile,alias:t.alias}]),s=aN(t.teamfile),i=s.kind==="repo"?s:null;return{teamfile:t.teamfile,reportPath:t.alias,lastContext:n.lastInputTokens??null,liveness:r.get(ip(t.teamfile,t.alias))??op(),...i!==null?{activitySinceLastCommit:{messageCount:lN(n,i.since),tokens:null},cumulativeTokens:cN(n)??"n/a"}:{}}}async function iN(e,t){try{let n=await R(e,r=>t.map(s=>{let i=ht(r,s.teamfile,s.alias);return[ip(s.teamfile,s.alias),AG(i)]}));return new Map(n)}catch{return new Map}}function ip(e,t){return`${e}\0${t.toLowerCase()}`}function AG(e){return e.busy?e.reason==="terminal-held"?e.source==="terminal-invocation"?{state:"busy",reason:"terminal-held",inFlight:null,terminalLock:null,terminalInvocation:{id:e.terminalInvocation.id,startedAt:e.terminalInvocation.started_at,lastHeartbeat:e.terminalInvocation.last_heartbeat_at,holderPid:e.terminalInvocation.holder_pid,holderHost:e.terminalInvocation.holder_host},reclaimable:null}:{state:"busy",reason:"terminal-held",inFlight:null,terminalLock:{startedAt:e.terminalLock.started_at,lastHeartbeat:e.terminalLock.last_heartbeat,holderPid:e.terminalLock.holder_pid,holderHost:e.terminalLock.holder_host},terminalInvocation:null,reclaimable:null}:{state:"busy",reason:"in-flight",inFlight:{senderTeamfile:e.inFlight.sender_teamfile,senderAlias:e.inFlight.sender_alias,startedAt:e.inFlight.started_at,activeCount:e.inFlight.active_count,holderPid:e.inFlight.holder_pid},terminalLock:null,terminalInvocation:null,reclaimable:null}:op(e.reclaimable===void 0?null:{source:e.reclaimable.source,holderPid:e.reclaimable.holder_pid,holderHost:e.reclaimable.holder_host,reason:e.reclaimable.reason})}function op(e=null){return{state:"idle",reason:null,inFlight:null,terminalLock:null,terminalInvocation:null,reclaimable:e}}function sp(e){if(e.state!=="idle")return`busy (${e.reason})`;if(e.reclaimable!==null){let{holderPid:t,holderHost:n,reason:r}=e.reclaimable;return`idle (reclaimable lock: ${t!==null?`pid ${t}${n!==null?` on ${n}`:""}`:"holder"} ${r==="dead-pid"?"appears dead":"stale"})`}return"idle"}function oN(e){return e.resets_at!==null?e.resets_at:e.timezone!==null?`${e.reset_time} (${e.timezone})`:e.reset_time}function Ot(e){return e==null?"unknown":String(e)}function RG(e){return e==="n/a"?e:Ot(e)}function LG(e,t,n=String){return e!==void 0?n(e):t?"n/a":"unknown"}function aN(e){let t=rN(e),n;try{rp("git",["-C",t,"rev-parse","--is-inside-work-tree"],{encoding:"utf8",stdio:["ignore","pipe","ignore"]})}catch{return{kind:"unavailable",reason:"no-repo",teamDir:t}}try{n=rp("git",["-C",t,"log","-2","--format=%ct"],{encoding:"utf8",stdio:["ignore","pipe","ignore"]})}catch{return{kind:"unavailable",reason:"no-commits",teamDir:t}}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:t};let s=r.slice(0,2).map((i,o)=>({ref:o===0?"HEAD":`HEAD~${o}`,timestamp:new Date(i*1e3)}));return{kind:"repo",teamDir:t,since:s[0].timestamp,commits:s,working:OG(t)}}function OG(e){let t;try{t=rp("git",["-C",e,"status","--porcelain"],{encoding:"utf8",stdio:["ignore","pipe","ignore"]})}catch{return{uncommittedTracked:null,untracked:null}}let n=0,r=0;for(let s of t.split(/\r?\n/))s.trim().length!==0&&(s.startsWith("??")?r+=1:n+=1);return{uncommittedTracked:n,untracked:r}}function lN(e,t){let n=t.getTime();return e.messages.filter(r=>(r.role==="user"||r.role==="assistant")&&Number.isFinite(r.timestamp.getTime())&&r.timestamp.getTime()>n).length}function cN(e){if(e===null)return null;let t=[e.totalInputTokens,e.totalCachedInputTokens,e.totalCacheWriteInputTokens,e.totalOutputTokens,e.totalReasoningOutputTokens].filter(n=>typeof n=="number"&&Number.isFinite(n));return t.length===0?null:t.reduce((n,r)=>n+r,0)}var TG,vG,uN=w(()=>{"use strict";At();Le();rt();Kt();gt();cn();Om();TG={name:"health",allowsBareTeamfile:!0,supportsRaw:!0},vG=`usage: lmctl health [target] [alias]
|
|
3123
3126
|
lmctl health <teamfile> # team rollup
|
|
3124
3127
|
lmctl health <sessionid> [--provider <name>]
|
|
@@ -3148,12 +3151,12 @@ List native provider sessions in scope, or list recent managed runs with --runs.
|
|
|
3148
3151
|
`);for(let g of Yc(o.members,i))t.stderr.write(`warning: ${g}
|
|
3149
3152
|
`);let f=0,m=o.members.filter(g=>g.teamfile!==void 0?!1:g.session===void 0||g.session.length<ji);for(let g of m)if(!LN(g.provider))return t.stderr.write(`error: ${g.alias}: invalid provider "${g.provider}"
|
|
3150
3153
|
`),1;for(let g of o.members){if(g.teamfile!==void 0)continue;if(g.session!==void 0&&g.session.length>=ji){t.stderr.write(`warning: ${g.alias}: existing sessionid preserved; skipping
|
|
3151
|
-
`);continue}let
|
|
3152
|
-
`),o.members)}:{}});for(let k of
|
|
3153
|
-
`);if(
|
|
3154
|
+
`);continue}let y=g.sessiondir??i,E=await bN({provider:g.provider,cwd:y,...g.model!==void 0?{model:g.model}:{},...g.effort!==void 0?{effort:g.effort}:{},...g.alias.toLowerCase()==="lead"?{prompt:b4(r,l.join(`
|
|
3155
|
+
`),o.members)}:{}});for(let k of E.warnings??[])t.stderr.write(`warning: ${g.alias}: ${k}
|
|
3156
|
+
`);if(E.error!==void 0||E.sessionId===void 0||E.sessionId.length<ji){let k=`provider did not report a sessionid; no new session was found for ${y} (possible provider workspace/cwd mismatch)`;return t.stderr.write(`error: ${g.alias}: seed failed${E.error!==void 0?`: ${E.error}`:`; ${k}`}
|
|
3154
3157
|
`),1}let b=c.get(g.alias.toLowerCase());if(b===void 0)return t.stderr.write(`error: ${g.alias}: could not find matching _MEMBER_ line to update
|
|
3155
|
-
`),1;let S=A4(l[b],"sessionid",
|
|
3156
|
-
`),"utf8"),t.stdout.write(`${g.alias}: seeded ${
|
|
3158
|
+
`),1;let S=A4(l[b],"sessionid",E.sessionId);l[b]=S,f+=1,ec(r,l.join(`
|
|
3159
|
+
`),"utf8"),t.stdout.write(`${g.alias}: seeded ${E.sessionId} provider=${g.provider} sessiondir=${y}
|
|
3157
3160
|
`)}let p=l.join(`
|
|
3158
3161
|
`),_=L4(p,_p(r));(_!==p||d)&&ec(r,_,"utf8"),f===0&&t.stdout.write(`no members needed seeding
|
|
3159
3162
|
`);let h=new Date().toISOString();try{await R(t,g=>{AN(g,{teamfilePath:s,name:o.name,rawText:_,now:h})})}catch(g){return He(t,g instanceof Error?g.message:String(g))}return 0}async function T4(e,t={stdout:process.stdout,stderr:process.stderr}){if(e[0]==="--help"||e[0]==="-h"||e[0]==="help")return t.stdout.write(Ql),0;let n=Y(e,["--provider","--sessiondir"],[]);if(n.error!==void 0)return pp(t,n.error,Ql);if(n.positionals.length!==2)return pp(t,"expected <teamfile.lmctl> and <alias>",Ql);let[r,s]=n.positionals;if(!x4(s))return He(t,`invalid alias "${s}"`);if(s.toLowerCase()==="lead")return He(t,"hire only applies to non-Lead members");let i=C(n,"--provider");if(i===void 0)return pp(t,"missing value for --provider",Ql);if(!LN(i))return He(t,`invalid provider "${i}"`);let o;try{o=await R(t,u=>Ee(r,u))}catch(u){return He(t,`${r}: ${u instanceof Error?u.message:String(u)}`)}let a;try{a=tc(o,"utf8")}catch(u){return He(t,`${r}: ${u instanceof Error?u.message:String(u)}`)}if(N4(a,s))return He(t,`${s}: alias already exists in ${o}`);let l=C(n,"--sessiondir"),c=[`_MEMBER_ alias=${gp(s)} provider=${i}`,...l===void 0?[]:[`sessiondir=${gp(l)}`]].join(" "),d=R4(a,c);return ec(o,d,"utf8"),t.stdout.write(`Hired ${s} (${i}) -> ${o}
|