@lmctl-ai/lmctl 0.1.70 → 0.1.71

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 CHANGED
@@ -1834,9 +1834,9 @@ scan writes JSON output; --project limits the scan to one project.
1834
1834
  Either drop the second arg, or pass <teamfile>.lmctl as the first arg.`}:{mode:"error",message:`lmctl ${t.name}: can't infer target type from "${r}".
1835
1835
  Expected one of: <path>.lmctl, <path>.lmctl:<alias>, <sessionid>.`}}if(s.session!==void 0){if(!t.supportsRaw)return{mode:"error",message:`lmctl ${t.name}: --session (raw mode) is not supported by ${t.name}.`};let i={mode:"ai-team-raw",sessionid:s.session};return s.provider!==void 0&&(i.provider=s.provider),i}return{mode:"error",message:`lmctl ${t.name}: a target is required.
1836
1836
  Use: <path>.lmctl[:<alias>] | <path>.lmctl <alias> | <sessionid> | --run <id>`}}var ge,y1,E1,Aa,Fr=b(()=>{"use strict";Jt();mr();ge=class extends Error{constructor(e){super(e),this.name="ChatTargetError"}},y1=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i,E1=/^ses_[A-Za-z0-9_-]+$/,Aa=/^[A-Za-z][A-Za-z0-9_-]*$/});function Sb(t){let e=bb(t.registry,t.fromTeamfile);if(e===void 0)return jn(`sender team is not registered in policy graph: ${t.fromTeamfile}`);if(!Tb(e,t.fromAlias))return jn(`sender alias "${t.fromAlias}" not found in ${t.fromTeamfile}`);let r=bb(t.registry,t.toTeamfile);return r===void 0?jn(`target team is not registered in policy graph: ${t.toTeamfile}`):Tb(r,t.toAlias)?t.toTeamfile===t.fromTeamfile?{allowed:!0,outOfPolicy:!1,reason:"same team"}:e.leadAlias===null?jn(`sender team has no Lead: ${t.fromTeamfile}`):t.fromAlias!==e.leadAlias?jn(`cross-team sends may only originate from Lead; got "${t.fromAlias}" in ${t.fromTeamfile}`):{allowed:!0,outOfPolicy:!1,reason:"cross-team send from Lead"}:jn(`target alias "${t.toAlias}" not found in ${t.toTeamfile}`)}function bb(t,e){return t.teams.find(r=>r.teamfile===e)}function Tb(t,e){return t.aliases.some(r=>r===e)}function jn(t){return{allowed:!1,outOfPolicy:!0,reason:t}}var kb=b(()=>{"use strict"});import{basename as T1}from"node:path";function Nb(t,e){let r=new Date(e.now.getTime()-Ra()).toISOString(),n=jb(t,r).filter(f=>!f.sender.teamfile.startsWith("prompt:")),s=v1(e.sender,n),o=I1(e.sender,n);o!==null&&o.teamfile===e.root&&!Ib(s[0],o)&&s.unshift({...o,at:null});let i={teamfile:e.receiverTeamfile,alias:e.receiverAlias,at:e.now.getTime()},a=[...s,i],l=s.filter(f=>Ib(f,i)),c=l.map(f=>f.at).filter(f=>f!==null).sort((f,m)=>m-f)[0]??null,u=c!==null&&e.now.getTime()-c<S1;return{stop:l.length>=1&&u,chain:N1(a)}}function $b(t,e){let r=new Date(e.now.getTime()-Ra()).toISOString(),n=jb(t,r),s=Ab(e.sender,n);if(s.length===0)return null;let o=s[0];return o.sender.teamfile.startsWith("prompt:")?o.receiver.teamfile:o.sender.teamfile}function Ra(t=process.env){let e=t.LMCTL_INFLIGHT_TTL_MS;if(e===void 0||e.trim()==="")return vb;let r=Number(e);return!Number.isFinite(r)||r<=0?vb:r}function xb(t){return`cross-team cycle detected (${t}); stopping to prevent a runaway loop.`}function k1(t){return{sender:{teamfile:t.sender_teamfile,alias:t.sender_alias},receiver:{teamfile:t.receiver_teamfile,alias:t.receiver_alias},at:Date.parse(t.started_at)}}function jb(t,e){return t.clearAgentInflightOlderThan(e),t.listAgentInflight().map(k1).filter(r=>Number.isFinite(r.at)&&new Date(r.at).toISOString()>=e).sort((r,n)=>r.at-n.at)}function v1(t,e,r={}){let n=new Map;for(let a of e)n.set(Ur(a.receiver),a);let s=[{...t,at:null}],o=t,i=new Set([Ur(t)]);for(let a=0;a<64;a+=1){let l=n.get(Ur(o));if(l===void 0)break;s[0]={...s[0],at:s[0].at??l.at};let c={...l.sender,at:l.at};if(l.sender.teamfile.startsWith("prompt:")&&r.includePromptSender!==!0)break;let u=Ur(l.sender);if(i.has(u))break;s.unshift(c),i.add(u),o=l.sender}return s}function Ab(t,e){let r=Ur(t),n=new Set([r]),s=[r],o=[];for(let i=0;s.length>0&&i<128;i+=1){let a=s.shift();for(let l of e){let c=Ur(l.sender),u=Ur(l.receiver);c!==a&&u!==a||(o.includes(l)||o.push(l),n.has(c)||(n.add(c),s.push(c)),n.has(u)||(n.add(u),s.push(u)))}}return o.sort((i,a)=>i.at-a.at)}function I1(t,e){let r=Ab(t,e);if(r.length===0)return null;let n=r[0];return n.sender.teamfile.startsWith("prompt:")?n.receiver:n.sender}function Ib(t,e){return t.teamfile===e.teamfile&&t.alias===e.alias}function Ur(t){return`${t.teamfile}\0${t.alias}`}function N1(t){return t.map(e=>`${T1(e.teamfile)}:${e.alias}`).join(" \u2192 ")}var S1,vb,Rb=b(()=>{"use strict";S1=6e4,vb=8*60*60*1e3});async function Cb(t){let e=Mb(t.io,()=>{}),r=await L(e,i=>Nt(t.teamfile,t.alias,i)),n=r.teamfile,s=t.fromFlag!==void 0?await L(e,i=>Db(t.fromFlag,n,i)):await L1(e,t.selfSessionId,n),o=await Pb(e,{explicitRoot:t.rootFlag,sender:s,receiverTeamfile:n,operatorOrigin:s.alias==="operator"});return{teamfile:n,alias:r.alias,fromIdentity:`${s.teamfile}:${s.alias}`,rootTeamfile:o}}async function Cs(t){let e=t.onEvent??(()=>{}),r=Mb(t.io,e),n=null,s=null,o=null;try{let i=await L(r,$=>Nt(t.teamfile,t.alias,$)),a=i.teamfile,l=await L(r,$=>Db(t.fromFlag,a,$)),c=await Pb(r,{explicitRoot:t.rootFlag,sender:l,receiverTeamfile:a,operatorOrigin:t.fromFlag===void 0}),u=t.fromFlag===void 0?null:await C1(r,{rootTeamfile:c,sender:l,receiverTeamfile:a,receiverAlias:i.alias});u!==null&&!u.allowed&&e({kind:"warning",message:`warning: out-of-policy chat send: ${u.reason}
1837
- `}),ui(r,i.isLead,i.alias,i.provider,i.sessiondir);try{di(r,Le(a),a)}catch{}if(n={root_teamfile:c,sender_teamfile:l.teamfile,sender_alias:l.alias,receiver_teamfile:a,receiver_alias:i.alias,policy:u},t.fromFlag!==void 0&&l.teamfile!==a){let $=await L(r,v=>Nb(v,{root:c,sender:l,receiverTeamfile:a,receiverAlias:i.alias,now:new Date}));if($.stop){let v=xb($.chain),A=await La(r,{...n,message:t.prompt,response:null,status:"error",error_detail:v});return{status:"error",errorKind:"cycle",message:v,teamChatLogId:A}}}let d=await P1(r,{receiver_teamfile:a,receiver_alias:i.alias,sender_teamfile:l.teamfile,sender_alias:l.alias,force:t.force===!0});if(!d.acquired){let $=B1(i.alias,d.current),v=await La(r,{...n,message:t.prompt,response:null,status:"error",error_detail:$});return{status:"busy",message:$,teamChatLogId:v}}s=d.lease,i.isLead&&(o={teamfile:a,alias:i.alias,identity:`${a}:${i.alias}`,env:t.env});let f=!1,m=we(),p=0,h=0,g=0,_={provider:i.provider,sessionId:i.sessionid,cwd:i.sessiondir,prompt:t.prompt,permissionMode:t.permissionMode,env:t.env??process.env,onDelta:$=>{f=!0,m&&(p+=1,g=Buffer.byteLength($,"utf8"),h+=g),e({kind:"delta",chunk:$})},onProgress:$=>e({kind:"progress",alias:i.alias,event:$})};i.model!==void 0&&(_.model=i.model),i.effort!==void 0&&(_.effort=i.effort),_.alias=i.alias,_.isLead=i.isLead,t.idleTimeoutMs!==void 0&&(_.timeoutMs=t.idleTimeoutMs);let T=await Dt(_);m&&Je(JSON.stringify({event:"chat_return",alias:i.alias,provider:i.provider,streamed:f,blockCount:p,streamedBytes:h,resultTextBytes:Buffer.byteLength(T.text,"utf8"),lastChunkBytes:g,tailPreview:O1(T.text,200)}));let E=T.status==="stalled",k=await La(r,{...n,message:t.prompt,response:E?null:T.text,status:n.policy?.outOfPolicy===!0?"out_of_policy":E?"error":"ok",error_detail:n.policy?.outOfPolicy===!0?n.policy.reason:E?`provider stalled${T.stalledAfterMs!==void 0?` after ${T.stalledAfterMs}ms`:""}`:null});return{status:E?"stalled":"ok",replyText:T.text,wroteDelta:f,teamChatLogId:k,durationMs:T.durationMs}}catch(i){let a=i instanceof Error?i.message:String(i),l=n===null?null:await La(r,{...n,message:t.prompt,response:null,status:n.policy?.outOfPolicy===!0?"out_of_policy":"error",error_detail:n.policy?.outOfPolicy===!0?`${n.policy.reason}; provider error: ${a}`:a});return{status:"error",errorKind:i instanceof ge?"target":"provider",message:a,teamChatLogId:l}}finally{s!==null&&await W1(r,s),o!==null&&t.skipAutoDelivery!==!0&&await $1(r,o,t.autoDeliverySender??j1)}}async function $1(t,e,r){try{let n=await L(t,s=>s.claimDeliverableDelegationJobs(e.identity));if(n.length===0)return;for(let s of x1(n))try{await r({teamfile:e.teamfile,alias:e.alias,prompt:A1(s.jobs),fromFlag:`${s.teamfile}:${s.alias}`,io:t,env:e.env})}catch{}}catch{}}function x1(t){let e=new Map;for(let r of t){let n=`${r.teamfile}\0${r.alias}`,s=e.get(n);s===void 0&&(s={teamfile:r.teamfile,alias:r.alias,jobs:[]},e.set(n,s)),s.jobs.push(r)}return[...e.values()]}async function j1(t){let e=await Cs({teamfile:t.teamfile,alias:t.alias,prompt:t.prompt,fromFlag:t.fromFlag,permissionMode:"yolo",io:t.io,env:t.env,skipAutoDelivery:!0});if(e.status!=="ok"&&e.status!=="stalled")throw new Error(e.status==="busy"||e.status==="error"?e.message:"delivery failed")}function A1(t){return["Background delegation results:",...t.map(r=>`[background job ${r.id} to ${r.alias}: ${r.status}] ${R1(r)} (full: lmctl jobs show ${r.id})`),"","These results were marked delivered; use lmctl jobs for the full timeline."].join(`
1838
- `)}function R1(t){let r=(t.status==="done"?t.result_text??"(no result)":t.error??t.result_text??t.status).replace(/\s+/gu," ").trim();return r.length<=500?r:`${r.slice(0,497)}...`}function Mb(t,e){return{...t,stdout:{write:()=>{}},stderr:{write:r=>{e({kind:"warning",message:r})}}}}function O1(t,e){return t.slice(-e)}function Db(t,e,r){if(t===void 0)return{teamfile:e,alias:"operator"};let n=Ls(t);if(n===null)throw new ge("--from must be <teamfile.lmctl>:<alias>");let s=Ne(n.teamfile,r),o=Pr(s,r);if(o.parseErrors.length>0)throw new ge(`--from ${n.teamfile}: ${o.parseErrors.join("; ")}`);let i=Ta(o,n.alias);if(i===void 0)throw new ge(`--from alias "${n.alias}" not found in ${n.teamfile}`);return{teamfile:s,alias:i.alias}}async function L1(t,e,r){if(e===void 0||e.length===0)return{teamfile:r,alias:"operator"};let n=await L(t,o=>{let i=[];for(let a of o.listRootTeams()){let l=Pr(a.teamfile_path,o);for(let c of l.members)c.teamfile===void 0&&c.session===e&&i.push({teamfile:a.teamfile_path,alias:c.alias})}if(i.length===0){let a=Pr(r,o);for(let l of a.members)l.teamfile===void 0&&l.session===e&&i.push({teamfile:r,alias:l.alias})}return i});if(n.length===0)return{teamfile:r,alias:"operator"};let s=new Map(n.map(o=>[`${o.teamfile}:${o.alias}`,o]));if(s.size>1)throw new ge("LMCTL_SELF_SESSIONID matches multiple team members; pass --from explicitly");return[...s.values()][0]}async function Pb(t,e){return e.explicitRoot!==void 0?await L(t,r=>Ne(e.explicitRoot,r)):e.operatorOrigin?e.receiverTeamfile:await L(t,r=>$b(r,{sender:e.sender,now:new Date})??e.receiverTeamfile)}async function C1(t,e){return await L(t,r=>Sb({rootTeamfile:e.rootTeamfile,fromTeamfile:e.sender.teamfile,fromAlias:e.sender.alias,toTeamfile:e.receiverTeamfile,toAlias:e.receiverAlias,registry:M1(r,e.sender.teamfile,e.receiverTeamfile)}))}function M1(t,e,r){return{teams:[e,r].map(s=>D1(s,t))}}function D1(t,e){let r=Pr(t,e),n=It(r);return{teamfile:t,aliases:r.members.map(s=>s.alias),leadAlias:n?.alias??null}}async function P1(t,e){let r=new Date().toISOString(),n=new Date(Date.now()-Ra()).toISOString(),s={receiver_teamfile:e.receiver_teamfile,receiver_alias:e.receiver_alias,sender_teamfile:e.sender_teamfile,sender_alias:e.sender_alias,started_at:r};return await L(t,o=>{let i=we(),a=i?o.getAgentInflight(e.receiver_teamfile,e.receiver_alias):null,l=o.tryAcquireAgentInflight(s,{stale_before:n,force:e.force});if(l.acquired){if(i){let c=a===null?null:e.force?"force":a.started_at<n?"stale":null;Je(JSON.stringify({event:"inflight_acquire",receiver:{teamfile:e.receiver_teamfile,alias:e.receiver_alias},sender:{teamfile:e.sender_teamfile,alias:e.sender_alias},result:c===null?"acquired":"reclaimed",...c===null?{}:{reclaim_reason:c,holder:Oa(a)}}))}return{acquired:!0,lease:l.current??s}}if(!l.acquired&&F1(l.current,n)){let c=o.tryAcquireAgentInflight(s,{stale_before:n,reclaim_observed:{sender_teamfile:l.current.sender_teamfile,sender_alias:l.current.sender_alias,started_at:l.current.started_at,holder_pid:l.current.holder_pid}});return c.acquired?(i&&Je(JSON.stringify({event:"inflight_acquire",receiver:{teamfile:e.receiver_teamfile,alias:e.receiver_alias},sender:{teamfile:e.sender_teamfile,alias:e.sender_alias},result:"reclaimed",reclaim_reason:l.current.holder_pid===null?"null-holder":"dead-pid",holder:Oa(l.current)})),{acquired:!0,lease:c.current??s}):(i&&Je(JSON.stringify({event:"inflight_acquire",receiver:{teamfile:e.receiver_teamfile,alias:e.receiver_alias},sender:{teamfile:e.sender_teamfile,alias:e.sender_alias},result:"rejected",holder:Oa(c.current)})),{acquired:!1,current:c.current})}return i&&Je(JSON.stringify({event:"inflight_acquire",receiver:{teamfile:e.receiver_teamfile,alias:e.receiver_alias},sender:{teamfile:e.sender_teamfile,alias:e.sender_alias},result:"rejected",holder:Oa(l.current)})),{acquired:!1,current:l.current}})}function Oa(t){return t===null?null:{sender_teamfile:t.sender_teamfile,sender_alias:t.sender_alias,holder_pid:t.holder_pid,started_at:t.started_at}}function F1(t,e){return t.holder_pid===null?t.started_at<e:!U1(t.holder_pid)}function U1(t){if(!Number.isInteger(t)||t<=0)return!1;try{return process.kill(t,0),!0}catch(e){return(e!==null&&typeof e=="object"&&"code"in e?e.code:void 0)!=="ESRCH"}}async function W1(t,e){try{await L(t,r=>{r.releaseAgentInflight(e)})}catch(r){t.stderr.write(`warning: failed to release chat in-flight slot: ${r instanceof Error?r.message:String(r)}
1839
- `)}}function B1(t,e){return`${t} is servicing ${e.sender_alias} (${e.sender_teamfile}) since ${e.started_at}`}async function La(t,e){let r=Lb(e.message),n=e.response===null?null:Lb(e.response);try{return await L(t,s=>s.insertTeamChatLog({root_teamfile:e.root_teamfile,sender_teamfile:e.sender_teamfile,sender_alias:e.sender_alias,receiver_teamfile:e.receiver_teamfile,receiver_alias:e.receiver_alias,message:r.text,response:n?.text??null,status:e.status,error_detail:e.error_detail,truncated:r.truncated||n?.truncated?1:0,created_at:new Date().toISOString()}))}catch(s){return t.stderr.write(`warning: failed to record chat log: ${s instanceof Error?s.message:String(s)}
1837
+ `}),ui(r,i.isLead,i.alias,i.provider,i.sessiondir);try{di(r,Le(a),a)}catch{}if(n={root_teamfile:c,sender_teamfile:l.teamfile,sender_alias:l.alias,receiver_teamfile:a,receiver_alias:i.alias,policy:u},t.fromFlag!==void 0&&l.teamfile!==a){let $=await L(r,v=>Nb(v,{root:c,sender:l,receiverTeamfile:a,receiverAlias:i.alias,now:new Date}));if($.stop){let v=xb($.chain),A=await La(r,{...n,message:t.prompt,response:null,status:"error",error_detail:v});return{status:"error",errorKind:"cycle",message:v,teamChatLogId:A}}}let d=await P1(r,{receiver_teamfile:a,receiver_alias:i.alias,sender_teamfile:l.teamfile,sender_alias:l.alias,force:t.force===!0});if(!d.acquired){let $=B1(a,i.alias,d.current),v=await La(r,{...n,message:t.prompt,response:null,status:"error",error_detail:$});return{status:"busy",message:$,teamChatLogId:v}}s=d.lease,i.isLead&&(o={teamfile:a,alias:i.alias,identity:`${a}:${i.alias}`,env:t.env});let f=!1,m=we(),p=0,h=0,g=0,_={provider:i.provider,sessionId:i.sessionid,cwd:i.sessiondir,prompt:t.prompt,permissionMode:t.permissionMode,env:t.env??process.env,onDelta:$=>{f=!0,m&&(p+=1,g=Buffer.byteLength($,"utf8"),h+=g),e({kind:"delta",chunk:$})},onProgress:$=>e({kind:"progress",alias:i.alias,event:$})};i.model!==void 0&&(_.model=i.model),i.effort!==void 0&&(_.effort=i.effort),_.alias=i.alias,_.isLead=i.isLead,t.idleTimeoutMs!==void 0&&(_.timeoutMs=t.idleTimeoutMs);let T=await Dt(_);m&&Je(JSON.stringify({event:"chat_return",alias:i.alias,provider:i.provider,streamed:f,blockCount:p,streamedBytes:h,resultTextBytes:Buffer.byteLength(T.text,"utf8"),lastChunkBytes:g,tailPreview:O1(T.text,200)}));let E=T.status==="stalled",k=await La(r,{...n,message:t.prompt,response:E?null:T.text,status:n.policy?.outOfPolicy===!0?"out_of_policy":E?"error":"ok",error_detail:n.policy?.outOfPolicy===!0?n.policy.reason:E?`provider stalled${T.stalledAfterMs!==void 0?` after ${T.stalledAfterMs}ms`:""}`:null});return{status:E?"stalled":"ok",replyText:T.text,wroteDelta:f,teamChatLogId:k,durationMs:T.durationMs}}catch(i){let a=i instanceof Error?i.message:String(i),l=n===null?null:await La(r,{...n,message:t.prompt,response:null,status:n.policy?.outOfPolicy===!0?"out_of_policy":"error",error_detail:n.policy?.outOfPolicy===!0?`${n.policy.reason}; provider error: ${a}`:a});return{status:"error",errorKind:i instanceof ge?"target":"provider",message:a,teamChatLogId:l}}finally{s!==null&&await W1(r,s),o!==null&&t.skipAutoDelivery!==!0&&await $1(r,o,t.autoDeliverySender??j1)}}async function $1(t,e,r){try{let n=await L(t,s=>s.claimDeliverableDelegationJobs(e.identity));if(n.length===0)return;for(let s of x1(n))try{await r({teamfile:e.teamfile,alias:e.alias,prompt:A1(s.jobs),fromFlag:`${s.teamfile}:${s.alias}`,io:t,env:e.env})}catch{}}catch{}}function x1(t){let e=new Map;for(let r of t){let n=`${r.teamfile}\0${r.alias}`,s=e.get(n);s===void 0&&(s={teamfile:r.teamfile,alias:r.alias,jobs:[]},e.set(n,s)),s.jobs.push(r)}return[...e.values()]}async function j1(t){let e=await Cs({teamfile:t.teamfile,alias:t.alias,prompt:t.prompt,fromFlag:t.fromFlag,permissionMode:"yolo",io:t.io,env:t.env,skipAutoDelivery:!0});if(e.status!=="ok"&&e.status!=="stalled")throw new Error(e.status==="busy"||e.status==="error"?e.message:"delivery failed")}function A1(t){return["Background delegation results:",...t.map(r=>`[background job ${r.id} to ${r.alias}: ${r.status}] ${R1(r)} (full: lmctl jobs show ${r.id})`),"","These results were marked delivered; use lmctl jobs for the full timeline."].join(`
1838
+ `)}function R1(t){let r=(t.status==="done"?t.result_text??"(no result)":t.error??t.result_text??t.status).replace(/\s+/gu," ").trim();return r.length<=500?r:`${r.slice(0,497)}...`}function Mb(t,e){return{...t,stdout:{write:()=>{}},stderr:{write:r=>{e({kind:"warning",message:r})}}}}function O1(t,e){return t.slice(-e)}function Db(t,e,r){if(t===void 0)return{teamfile:e,alias:"operator"};let n=Ls(t);if(n===null)throw new ge(`--from must be <teamfile.lmctl>:<alias>, got '${t}'`);let s=Ne(n.teamfile,r),o=Pr(s,r);if(o.parseErrors.length>0)throw new ge(`--from ${n.teamfile}: ${o.parseErrors.join("; ")}`);let i=Ta(o,n.alias);if(i===void 0)throw new ge(`--from alias "${n.alias}" not found in ${n.teamfile}`);return{teamfile:s,alias:i.alias}}async function L1(t,e,r){if(e===void 0||e.length===0)return{teamfile:r,alias:"operator"};let n=await L(t,o=>{let i=[];for(let a of o.listRootTeams()){let l=Pr(a.teamfile_path,o);for(let c of l.members)c.teamfile===void 0&&c.session===e&&i.push({teamfile:a.teamfile_path,alias:c.alias})}if(i.length===0){let a=Pr(r,o);for(let l of a.members)l.teamfile===void 0&&l.session===e&&i.push({teamfile:r,alias:l.alias})}return i});if(n.length===0)return{teamfile:r,alias:"operator"};let s=new Map(n.map(o=>[`${o.teamfile}:${o.alias}`,o]));if(s.size>1)throw new ge("LMCTL_SELF_SESSIONID matches multiple team members; pass --from explicitly");return[...s.values()][0]}async function Pb(t,e){return e.explicitRoot!==void 0?await L(t,r=>Ne(e.explicitRoot,r)):e.operatorOrigin?e.receiverTeamfile:await L(t,r=>$b(r,{sender:e.sender,now:new Date})??e.receiverTeamfile)}async function C1(t,e){return await L(t,r=>Sb({rootTeamfile:e.rootTeamfile,fromTeamfile:e.sender.teamfile,fromAlias:e.sender.alias,toTeamfile:e.receiverTeamfile,toAlias:e.receiverAlias,registry:M1(r,e.sender.teamfile,e.receiverTeamfile)}))}function M1(t,e,r){return{teams:[e,r].map(s=>D1(s,t))}}function D1(t,e){let r=Pr(t,e),n=It(r);return{teamfile:t,aliases:r.members.map(s=>s.alias),leadAlias:n?.alias??null}}async function P1(t,e){let r=new Date().toISOString(),n=new Date(Date.now()-Ra()).toISOString(),s={receiver_teamfile:e.receiver_teamfile,receiver_alias:e.receiver_alias,sender_teamfile:e.sender_teamfile,sender_alias:e.sender_alias,started_at:r};return await L(t,o=>{let i=we(),a=i?o.getAgentInflight(e.receiver_teamfile,e.receiver_alias):null,l=o.tryAcquireAgentInflight(s,{stale_before:n,force:e.force});if(l.acquired){if(i){let c=a===null?null:e.force?"force":a.started_at<n?"stale":null;Je(JSON.stringify({event:"inflight_acquire",receiver:{teamfile:e.receiver_teamfile,alias:e.receiver_alias},sender:{teamfile:e.sender_teamfile,alias:e.sender_alias},result:c===null?"acquired":"reclaimed",...c===null?{}:{reclaim_reason:c,holder:Oa(a)}}))}return{acquired:!0,lease:l.current??s}}if(!l.acquired&&F1(l.current,n)){let c=o.tryAcquireAgentInflight(s,{stale_before:n,reclaim_observed:{sender_teamfile:l.current.sender_teamfile,sender_alias:l.current.sender_alias,started_at:l.current.started_at,holder_pid:l.current.holder_pid}});return c.acquired?(i&&Je(JSON.stringify({event:"inflight_acquire",receiver:{teamfile:e.receiver_teamfile,alias:e.receiver_alias},sender:{teamfile:e.sender_teamfile,alias:e.sender_alias},result:"reclaimed",reclaim_reason:l.current.holder_pid===null?"null-holder":"dead-pid",holder:Oa(l.current)})),{acquired:!0,lease:c.current??s}):(i&&Je(JSON.stringify({event:"inflight_acquire",receiver:{teamfile:e.receiver_teamfile,alias:e.receiver_alias},sender:{teamfile:e.sender_teamfile,alias:e.sender_alias},result:"rejected",holder:Oa(c.current)})),{acquired:!1,current:c.current})}return i&&Je(JSON.stringify({event:"inflight_acquire",receiver:{teamfile:e.receiver_teamfile,alias:e.receiver_alias},sender:{teamfile:e.sender_teamfile,alias:e.sender_alias},result:"rejected",holder:Oa(l.current)})),{acquired:!1,current:l.current}})}function Oa(t){return t===null?null:{sender_teamfile:t.sender_teamfile,sender_alias:t.sender_alias,holder_pid:t.holder_pid,started_at:t.started_at}}function F1(t,e){return t.holder_pid===null?t.started_at<e:!U1(t.holder_pid)}function U1(t){if(!Number.isInteger(t)||t<=0)return!1;try{return process.kill(t,0),!0}catch(e){return(e!==null&&typeof e=="object"&&"code"in e?e.code:void 0)!=="ESRCH"}}async function W1(t,e){try{await L(t,r=>{r.releaseAgentInflight(e)})}catch(r){t.stderr.write(`warning: failed to release chat in-flight slot: ${r instanceof Error?r.message:String(r)}
1839
+ `)}}function B1(t,e,r){return`${e} is servicing ${r.sender_alias} (${r.sender_teamfile}) since ${r.started_at} \u2014 wait and retry, or inspect without waking it: lmctl tail "${t}" ${e}`}async function La(t,e){let r=Lb(e.message),n=e.response===null?null:Lb(e.response);try{return await L(t,s=>s.insertTeamChatLog({root_teamfile:e.root_teamfile,sender_teamfile:e.sender_teamfile,sender_alias:e.sender_alias,receiver_teamfile:e.receiver_teamfile,receiver_alias:e.receiver_alias,message:r.text,response:n?.text??null,status:e.status,error_detail:e.error_detail,truncated:r.truncated||n?.truncated?1:0,created_at:new Date().toISOString()}))}catch(s){return t.stderr.write(`warning: failed to record chat log: ${s instanceof Error?s.message:String(s)}
1840
1840
  `),null}}function Lb(t){return t.length<=Ob?{text:t,truncated:!1}:{text:t.slice(0,Ob),truncated:!0}}var Ob,Hd=b(()=>{"use strict";bt();Fr();Jt();cs();kb();mr();Rb();$e();ke();Ob=256*1024});var qb={};le(qb,{parseIdleTimeoutMs:()=>Ub,runChat:()=>J1});import{spawn as q1}from"node:child_process";async function J1(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.length===0||t[0]==="--help"||t[0]==="-h")return e.stdout.write(`${Fb}
1841
1841
  `),t.length===0?2:0;let r=X1(t);if(typeof r=="string")return e.stderr.write(`error: ${r}
1842
1842
  ${Fb}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lmctl-ai/lmctl",
3
- "version": "0.1.70",
3
+ "version": "0.1.71",
4
4
  "description": "A provider-agnostic control plane for teams of AI coding agents — across providers, with independent review and durable memory.",
5
5
  "type": "module",
6
6
  "homepage": "https://lmctl.com",