@lmctl-ai/lmctl 0.2.435 → 0.2.437
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/build-info.json +1 -1
- package/dist/cli/index.js +1 -1
- package/dist/lmbee.js +1 -1
- package/package.json +1 -1
package/build-info.json
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"sha": "
|
|
1
|
+
{"sha": "9728bee55096d227227f707f2276250c730c56b2", "dirty": false, "builtAt": "2026-10-27T13:45:06.000Z"}
|
package/dist/cli/index.js
CHANGED
|
@@ -2367,7 +2367,7 @@ ${Tp(d.prompt_file,"utf8")}`)}catch{c=!1;break}if(!c||l.length===0)continue;C$(s
|
|
|
2367
2367
|
)
|
|
2368
2368
|
SELECT e.* FROM entities e JOIN subtree s ON e.id = s.id ORDER BY e.id`).all(e))}function kp(t,e){let n=K$(t,e),r=new Map(n.map(s=>[s.id,{...s,children:[]}]));for(let s of n)s.id!==e&&s.parent_id!==null&&r.get(s.parent_id).children.push(r.get(s.id));return r.get(e)}function W$(t){let e={total:t.length,by_status:{},by_kind:{},by_delivery:{delivered:0,undelivered:0}};for(let n of t)e.by_status[n.status]=(e.by_status[n.status]??0)+1,e.by_kind[n.kind]=(e.by_kind[n.kind]??0)+1,n.kind!=="epic"&&(n.delivered_ts!=null?e.by_delivery.delivered+=1:e.by_delivery.undelivered+=1);return e}function Y$(t,e={}){if(e.id!==void 0&&e.project!==void 0)throw new j("INVALID_ARGUMENT","summary ID and --project are exclusive");if(e.id!==void 0)return W$(K$(t,e.id));let n=Yn(()=>e.project!==void 0?t.prepare("SELECT * FROM entities WHERE project = ?").all(e.project):t.prepare("SELECT * FROM entities").all());return W$(n)}function Ip(t,e,n){let r=t.transaction(()=>{let s=Je(t,e);if(n.ifRevision!==void 0&&s.revision!==n.ifRevision)throw new j("REVISION_CONFLICT",`Expected revision ${n.ifRevision}; current is ${s.revision}`,4);let o={};n.title!==void 0&&(o.title=ve(n.title,"title")),n.status!==void 0&&(o.status=ve(n.status.trim(),"status"));for(let[a,l]of[["description",n.description],["requirements",n.requirements],["acceptance_criteria",n.acceptanceCriteria]])l!==void 0&&(o[a]=l);if(n.owner!==void 0&&n.clearOwner)throw new j("INVALID_ARGUMENT","Explicit owner and --clear-owner are exclusive");if(n.parentId!==void 0||n.clearParent){let a=n.clearParent?null:n.parentId;try{q$(t,s.kind,s.project,a)}catch(l){if(l instanceof j)throw l;Ha(l)}o.parent_id=a}n.owner!==void 0?(o.owner_team_path=pi(ve(n.owner.team,"owner team")),o.owner_alias=ve(n.owner.alias,"owner alias")):n.clearOwner&&(o.owner_team_path=null,o.owner_alias=null);let i=n.holdUntil!==void 0||n.holdReason!==void 0;if(i&&n.clearHold)throw new j("INVALID_ARGUMENT","A hold (holdUntil/holdReason) and clearHold are exclusive");if(i){if(n.holdUntil===void 0||n.holdReason===void 0)throw new j("INVALID_ARGUMENT","holdUntil and holdReason must be given together");let a=ve(n.holdUntil,"holdUntil");if(Number.isNaN(Date.parse(a)))throw new j("INVALID_ARGUMENT",`holdUntil "${a}" is not a parseable timestamp`,2);o.hold_until=a,o.hold_reason=ve(n.holdReason,"holdReason")}else n.clearHold&&(o.hold_until=null,o.hold_reason=null);if(n.blockedOn!==void 0&&n.clearBlockedOn)throw new j("INVALID_ARGUMENT","blockedOn and clearBlockedOn are exclusive");if(n.blockedOn!==void 0?o.blocked_on=ve(n.blockedOn,"blockedOn"):n.clearBlockedOn&&(o.blocked_on=null),Object.keys(o).length===0)throw new j("INVALID_ARGUMENT","Update requires at least one field");try{t.prepare(`UPDATE entities SET ${Object.keys(o).map(a=>`${a} = ?`).join(",")} WHERE id = ?`).run(...Object.values(o),e)}catch(a){Ha(a)}return o.status!==void 0&&o.status!==s.status&&t.prepare("INSERT INTO notes(entity_id, body, author_team_path, author_alias, created_at) VALUES (?,?,?,?,?)").run(e,JSON.stringify({[Wa]:!0,from:s.status,to:o.status}),null,null,fe()),bp(t,e),Je(t,e)});return Yn(r)}function cu(t,e,n){let r=t.transaction(()=>{Je(t,e);let s=n.author!==void 0?pi(ve(n.author.team,"author team")):null,o=n.author!==void 0?ve(n.author.alias,"author alias"):null,i=t.prepare("INSERT INTO notes(entity_id, body, author_team_path, author_alias, created_at) VALUES (?,?,?,?,?)").run(e,ve(n.body,"body"),s,o,fe());return bp(t,e),{note:t.prepare("SELECT * FROM notes WHERE id = ?").get(i.lastInsertRowid),revision:Je(t,e).revision}});return Yn(r)}function z$(t,e,n={}){return Je(t,e),G$(t,"SELECT * FROM notes WHERE entity_id = ? AND id > ?",[e,n.after??0],n.limit??100)}function uu(t){try{let e=JSON.parse(t);return e!==null&&typeof e=="object"&&!Array.isArray(e)?e:null}catch{return null}}function Q$(t,e){let n=t.prepare("SELECT body, created_at FROM notes WHERE entity_id = ? ORDER BY id DESC").all(e);for(let r of n){let s=uu(r.body);if(s!==null&&s[Wa]===!0)return r.created_at}return null}function Z$(t,e,n){if(Je(t,e),Je(t,n),e===n)throw new j("SELF_DEPENDENCY","An entity cannot depend on itself")}function eM(t,e,n){let r=t.transaction(()=>{Z$(t,e,n);let s;try{s=t.prepare("INSERT OR IGNORE INTO dependencies(entity_id, depends_on_id, created_at) VALUES (?,?,?)").run(e,n,fe()).changes>0}catch(o){return Ha(o)}return s&&bp(t,e),{entity_id:e,depends_on_id:n,changed:s,revision:Je(t,e).revision}});return Yn(r)}function tM(t,e,n){let r=t.transaction(()=>{Z$(t,e,n);let o=t.prepare("DELETE FROM dependencies WHERE entity_id = ? AND depends_on_id = ?").run(e,n).changes>0;return o&&bp(t,e),{entity_id:e,depends_on_id:n,changed:o,revision:Je(t,e).revision}});return Yn(r)}var Wa,yt,vn=b(()=>{"use strict";no();Wa="_lmauto_status_transition";yt=1e4});function It(t){return t.trim().toLowerCase().replace(/[\s_]+/g,"-")}function Ir(t){return JT.has(It(t))}function oM(t){return t.kind==="epic"&&!Ir(t.status)&&It(t.status)!==rM}function ro(t,e,n){let r=t.prepare("SELECT * FROM entities WHERE owner_team_path = ? AND owner_alias = ? ORDER BY id").all(pi(e),n);return r.length===0?null:{entities:r}}function iM(t,e){return(an(t,e.id,"outgoing").outgoing??[]).some(r=>It(r.status)!=="done")}function aM(t,e={}){let n=e.nowMs??Date.now(),r=e.staleInProgressThresholdMs??iee,s=e.project!==void 0?t.prepare("SELECT * FROM entities WHERE project = ? ORDER BY id LIMIT ?").all(e.project,yt):t.prepare("SELECT * FROM entities ORDER BY id LIMIT ?").all(yt),o=[];for(let i of s){if(!du.has(i.kind))continue;let a=It(i.status);if(a===sM){o.push({...i,attentionReason:"blocked"});continue}if(a==="in-progress"){n-new Date(i.updated_at).getTime()>=r&&o.push({...i,attentionReason:"stale_in_progress"});continue}a==="todo"&&(an(t,i.id,"outgoing").outgoing??[]).length>0&&!iM(t,i)&&o.push({...i,attentionReason:"dependency_ready"})}return o}function aee(t,e){return t.transaction(()=>{let r=kr(t,e);if(r===null)return null;let s=t.prepare("SELECT * FROM notes WHERE entity_id = ? ORDER BY id DESC").all(e),o=null,i=null,a=null;for(let l of s){let c=uu(l.body);if(c!==null){if(c[Wa]===!0){i=l.id,a=l.created_at;break}o===null&&(o=c)}}return{id:r.id,title:r.title,status:r.status,attrs:o,epochId:i,epochTs:a,createdAt:r.created_at,ownerTeamPath:r.owner_team_path,ownerAlias:r.owner_alias}})()}function lM(t,e,n,r=Date.now(),s){let o=s!==void 0?new Map:new Map(e.entities.map(u=>[u.id,u])),a=e.entities.filter(u=>du.has(u.kind)&&!Ba(t,u,o)).filter(u=>nM.has(It(u.status))),l=s!==void 0?pi(s.team):null,c=[];for(let u of a){let d=aee(t,u.id);if(d===null||!nM.has(It(d.status))||s!==void 0&&(d.ownerTeamPath!==l||d.ownerAlias!==s.alias))continue;let f=typeof d.attrs?.expected_reset_ts=="string"?Date.parse(d.attrs.expected_reset_ts):NaN;if(Number.isNaN(f)){let m=Date.parse(d.epochTs??d.createdAt);if(!Number.isNaN(m)&&r-m<n)continue}else if(f>r)continue;c.push({id:d.id,title:d.title,status:d.status})}return c}function Ba(t,e,n){let r=e,s=new Set;for(;r!==null&&r.parent_id!==null&&!s.has(r.id);){s.add(r.id);let o=n.get(r.parent_id)??kr(t,r.parent_id);if(o===null)return!1;if(o.kind==="epic")return Ir(o.status)||It(o.status)===rM;r=o}return!1}function KT(t,e){let n=new Map(e.entities.map(r=>[r.id,r]));return e.entities.filter(r=>du.has(r.kind)&&It(r.status)===sM&&!Ba(t,r,n))}function cM(t,e,n=YT,r=Date.now()){let s=new Map(e.entities.map(o=>[o.id,o]));return e.entities.filter(o=>du.has(o.kind)&&It(o.status)==="todo"&&o.title.startsWith(lee)&&r-Date.parse(o.updated_at)>=n&&!Ba(t,o,s)&&!iM(t,o)).map(o=>({id:o.id,title:o.title,updatedAt:o.updated_at}))}function uM(t,e,n=Date.now()){let r=new Map(e.entities.map(s=>[s.id,s]));return e.entities.filter(s=>du.has(s.kind)&&s.hold_until!==null&&Date.parse(s.hold_until)<=n&&!Ba(t,s,r)).map(s=>({id:s.id,title:s.title,holdUntil:s.hold_until,holdReason:s.hold_reason}))}var du,rM,sM,JT,nM,iee,YT,lee,qRe,hi=b(()=>{"use strict";vn();du=new Set(["task","subtask"]),rM="on-hold";sM="blocked",JT=new Set(["done","closed"]);nM=new Set(["rate-limited","error"]);iee=45*6e4;YT=24*60*6e4,lee="DESIGN-FIRST:";qRe=15*6e4});function cee(t,e){return e.running.some(n=>_p(t,n.from_identity))}function fu(t,e){return e.dead.some(n=>_p(t,n.target))&&!on(t,e)}function uee(t){if(t.isCurrentlyActive)return!1;let e=!t.hasInFlightWorker,n=t.timeSinceLastNudgeMs===null||t.timeSinceLastNudgeMs>t.config.cooldownMs;if(t.isDeadReclaimable)return e&&n;let r=!t.isCoordinator&&t.progressStatus==="UNKNOWN"&&(t.progressAgeMs===null||t.progressAgeMs>=t.config.idleThresholdMs),s=!t.heavyLockMayBeHeldByThisTeam&&t.hasStalePersistentInProgressWork;return e&&n&&(t.neverDispatched||r||s)}function dee(t,e,n,r){let s;try{s=ge(e)}catch{return!1}let o=ro(t,s,e.leadAlias);if(o===null)return!1;let i=new Map(o.entities.map(a=>[a.id,a]));return o.entities.some(a=>(a.kind==="task"||a.kind==="subtask")&&It(a.status)==="in-progress"&&!Ba(t,a,i)&&r-Date.parse(a.updated_at)>=n&&!fee(a,r))}function fee(t,e){return t.hold_until!==null&&Date.parse(t.hold_until)>e}function mee(t,e){if(qt(t,e.name)!==null||M$(t,e.name))return!1;let n;try{n=ge(e)}catch{return!0}return ro(t,n,e.leadAlias)===null}function dM(t){return`last_nudged:${t}`}function zT(t,e){return t.prepare("SELECT v FROM kv WHERE k = ?").get(dM(e))?.v??null}function QT(t,e,n){t.prepare("INSERT INTO kv(k, v) VALUES (?, ?) ON CONFLICT(k) DO UPDATE SET v = excluded.v").run(dM(e),n)}function pee(t,e,n,r,s,o,i){if(qt(t,e.name)?.status==="BLOCKED")return null;let l=mee(t,e),c=o?.progress_changed_ts==null?null:s-Date.parse(o.progress_changed_ts),u=zT(t,e.name),d=u===null?null:s-Date.parse(u);return{isCurrentlyActive:on(e,n),hasInFlightWorker:cee(e,n),neverDispatched:l,progressStatus:o?.progress_status??null,progressAgeMs:c,isDeadReclaimable:fu(e,n),hasStalePersistentInProgressWork:dee(t,e,r.idleThresholdMs,s),timeSinceLastNudgeMs:d,config:r,isCoordinator:e.coordinator===!0,heavyLockMayBeHeldByThisTeam:i.held&&(i.holder===null||i.holder.holder===e.name)}}function fM(t,e,n,r,s,o,i){let a=pee(t,e,n,s,o,i,r);return a!==null&&uee(a)}async function ZT(t,e,n,r,s=Pn,o=Date.now()){let i=await jD(t,e,e.name,o);return fM(t,e,n,r,s,o,i)}function eS(t,e,n,r,s=Pn,o=Date.now()){return fM(t,e,n,r,s,o,Pe(t,e.name))}async function mM(t,e,n,r,s=Pn,o=Date.now(),i={}){let a=[];for(let l of e){if(!l.autoNudge||Pe(t,l.name)?.confirmed_done_ts)continue;(i.readOnly?eS(t,l,n,r,s,o):await ZT(t,l,n,r,s,o))&&!Pe(t,l.name)?.confirmed_done_ts&&a.push(l.name)}return a}var Pn,fs=b(()=>{"use strict";HD();Et();br();Kn();Oe();hi();Pn={idleThresholdMs:45*6e4,cooldownMs:30*6e4}});function pM(t,e){try{let n=JSON.parse(e);return typeof n.disabledAt!="string"?null:{provider:t,disabledAt:n.disabledAt,reason:typeof n.reason=="string"?n.reason:null,expiresAt:typeof n.expiresAt=="string"?n.expiresAt:null}}catch{return null}}function Ap(t,e){let n=t.prepare("SELECT v FROM kv WHERE k = ?").get(mu+e);return n===void 0?null:pM(e,n.v)}function tS(t,e,n={}){let r={provider:e,disabledAt:n.nowIso??new Date().toISOString(),reason:n.reason??null,expiresAt:n.expiresAt??null};t.prepare("INSERT INTO kv(k, v) VALUES (?, ?) ON CONFLICT(k) DO UPDATE SET v = excluded.v").run(mu+e,JSON.stringify(r))}function hM(t,e){t.prepare("DELETE FROM kv WHERE k = ?").run(mu+e)}function pu(t){let e=t.prepare("SELECT k, v FROM kv WHERE k LIKE ?").all(`${mu}%`),n=[];for(let r of e){let s=r.k.slice(mu.length),o=pM(s,r.v);o!==null&&n.push(o)}return n}function Ar(t,e,n=Date.now()){let r;try{r=Ap(t,e)}catch{return{disabled:!0,config:null,failClosed:!0}}return r===null?{disabled:!1,config:null,failClosed:!1}:r.expiresAt!==null&&Date.parse(r.expiresAt)<=n?{disabled:!1,config:null,failClosed:!1}:{disabled:!0,config:r,failClosed:!1}}var mu,qa=b(()=>{"use strict";mu="provider_disabled:"});function _M(t,e,n=36e5,r=Date.now()){let s=t.idle.find(i=>i.target===e);if(s===void 0||s.error===null||s.error===void 0||!hee.test(s.error))return!1;let o=Date.parse(s.ended_at);return Number.isFinite(o)?r-o<n:!1}var hee,gM=b(()=>{"use strict";hee=/usage limit|rate limit|too many requests|quota exceeded|insufficient_quota/i});import{execFile as _ee}from"node:child_process";import{promisify as gee}from"node:util";function so(t,e){let n=t.prepare("SELECT v FROM kv WHERE k = ?").get(hu+e);if(n===void 0)return null;try{let r=JSON.parse(n.v);return typeof r.companionTeam!="string"||r.companionTeam.length===0?null:{companionTeam:r.companionTeam,workerAlias:typeof r.workerAlias=="string"&&r.workerAlias.length>0?r.workerAlias:"Worker",commitThreshold:typeof r.commitThreshold=="number"&&r.commitThreshold>0?r.commitThreshold:rS,hoursThresholdMs:typeof r.hoursThresholdMs=="number"&&r.hoursThresholdMs>0?r.hoursThresholdMs:sS,shiftStartedTs:typeof r.shiftStartedTs=="string"?r.shiftStartedTs:null,shiftStartedSha:typeof r.shiftStartedSha=="string"?r.shiftStartedSha:null,turnsDispatched:typeof r.turnsDispatched=="number"&&r.turnsDispatched>=0?r.turnsDispatched:0,lastReviewedTurn:typeof r.lastReviewedTurn=="number"&&r.lastReviewedTurn>=0?r.lastReviewedTurn:0}}catch{return null}}function EM(t){return t.prepare("SELECT k FROM kv WHERE k LIKE ?").all(hu+"%").map(n=>n.k.slice(hu.length))}function yM(t,e,n){t.prepare("INSERT INTO kv(k, v) VALUES (?, ?) ON CONFLICT(k) DO UPDATE SET v = excluded.v").run(hu+e,JSON.stringify(n))}function wM(t,e){t.prepare("DELETE FROM kv WHERE k = ?").run(hu+e)}var r0e,nS,hu,rS,sS,Np=b(()=>{"use strict";r0e=gee(_ee),nS=3,hu="auto_nudge_redirect:",rS=3,sS=5*60*6e4});function Ga(t){let e=t.prepare("SELECT v FROM kv WHERE k = ?").get(oS);if(e===void 0)return null;try{let n=JSON.parse(e.v);return{paused_at:typeof n.paused_at=="string"?n.paused_at:"unknown",actor:typeof n.actor=="string"?n.actor:null,note:typeof n.note=="string"?n.note:null,resume_after:typeof n.resume_after=="string"?n.resume_after:null}}catch{return{paused_at:"unknown",actor:null,note:null,resume_after:null}}}function TM(t,e=Date.now()){let n=Ga(t);if(n===null)return null;let r=Date.parse(n.paused_at);if(Number.isNaN(r))return{status:"unevaluable",state:n,reason:"corrupt-paused-at"};let s=e-r;if(n.resume_after!==null){let o=Date.parse(n.resume_after);return Number.isNaN(o)?{status:"unevaluable",state:n,reason:"corrupt-resume-after"}:e>=o?{status:"stale",state:n,ageMs:s,resumeAfterPassed:!0}:null}return s>=Eee?{status:"stale",state:n,ageMs:s,resumeAfterPassed:!1}:null}function SM(t,e){t.prepare("INSERT INTO kv(k, v) VALUES (?, ?) ON CONFLICT(k) DO UPDATE SET v = excluded.v").run(oS,JSON.stringify(e))}function vM(t){t.prepare("DELETE FROM kv WHERE k = ?").run(oS)}var oS,Eee,Rp=b(()=>{"use strict";oS="auto_scan_paused";Eee=3*24*60*6e4});function iS(t){switch(t.kind){case"provider_disabled":return`provider ${t.provider} disabled (no dispatch attempted)`;case"parked":return"parked, confirmed done (no dispatch attempted)";case"presence_gated":return"a session is currently held (actively observed right now)";case"auto_nudge_disabled":return"auto-nudge disabled for this team (on-demand)";case"fleet_scan_paused":return"fleet-wide auto-scan paused";case"provider_exhausted_backoff":return`provider ${t.provider} in quota backoff (no dispatch attempted)`;case"no_continuous_observer":return"nothing has classified this team since (no continuous observer)"}}function bM(t,e,n,r,s={}){let o=s.resolveMemberProviderImpl??Ca,i=s.checkProviderDisabledImpl??Ar,a=s.isProviderExhaustedImpl??_M,l=s.allLocalTeams??[e],c=so(t,e.name),u=c===null?e.name:c.companionTeam,d=c===null?e.leadAlias:c.workerAlias,f=c===null?e.repoPath:l.find(p=>p.name===u)?.repoPath??e.repoPath,m=o({repoPath:f,name:u},d);if(m!==null&&i(t,m,r).disabled)return{kind:"provider_disabled",provider:m};if(Pe(t,e.name)?.confirmed_done_ts)return{kind:"parked"};if(on(e,n))return{kind:"presence_gated"};if(!e.autoNudge)return{kind:"auto_nudge_disabled"};if(Ga(t)!==null)return{kind:"fleet_scan_paused"};try{let p=`${ge(e)}:${e.leadAlias}`;if(a(n,p))return{kind:"provider_exhausted_backoff",provider:o(e,e.leadAlias)??"unknown"}}catch{}return{kind:"no_continuous_observer"}}var aS=b(()=>{"use strict";qa();gM();Np();Rp();Et();br();Oe()});import{execFile as yee}from"node:child_process";import{promisify as wee}from"node:util";async function _u(t,e,n=kM){try{return await n("lmctl",["tail",t,e,"--lines","1"],{timeout:1e4}),{sessionResolves:!0,provider:null,detail:"dispatch completes, session resolves; cause unknown"}}catch(r){let s=r&&typeof r=="object"&&"stderr"in r?String(r.stderr).trim():"",o=/session not found/i.test(s),i=/provider=([\w.-]+)/.exec(s);return{sessionResolves:!o,provider:o?i?.[1]??null:null,detail:s.length>0?s:"lmctl tail failed with no output"}}}async function IM(t,e,n,r,s,o={}){let i=o.execImpl??kM,a=o.whyNotObservedImpl??bM,l=o.flappingWindowMs??See,c=o.flappingOccurrenceThreshold??vee,u=o.listRecentEventsByStatusImpl??ep,d=[],f=[];for(let m of e){let p=WO(t,m.name);if(p.kind==="never-observed")continue;let _=a(t,m,n,r,o.whyNotObservedOptions);if(_.kind==="presence_gated")continue;let{value:h,observedAt:g,changedAt:y}=p,E=r-Date.parse(g),w=new Date(r-l).toISOString(),T=[...u(t,"ENV-ERROR",w,100),...u(t,"NO-OUTPUT",w,100)].filter(N=>N.team===m.name).sort((N,L)=>Date.parse(L.ts)-Date.parse(N.ts)),v=T.length>=c,k=Tee.has(h.status)&&!Number.isNaN(E)&&E>=s;if(!k&&!v)continue;if(v&&!k){let N=T[0],L={kind:"flapping",team:m.name,mostRecentStatus:N.status,mostRecentAt:N.ts,occurrenceCount:T.length,windowMs:l};_.kind==="no_continuous_observer"?d.push(L):f.push({team:m.name,status:N.status,changedAt:N.ts,observedAt:g,ageMs:E,suspension:_});continue}let A=h.status;if(_.kind==="no_continuous_observer"){let N=null;if(A==="NO-OUTPUT")try{N=await _u(ge(m),m.leadAlias,i)}catch{N=null}d.push({kind:"continuous",team:m.name,status:A,changedAt:y,observedAt:g,ageMs:E,cause:N})}else f.push({team:m.name,status:A,changedAt:y,observedAt:g,ageMs:E,suspension:_})}return d.sort((m,p)=>m.kind==="continuous"&&p.kind==="continuous"?p.ageMs-m.ageMs:0),f.sort((m,p)=>p.ageMs-m.ageMs),{unreachable:d,notObserved:f}}var kM,Tee,See,vee,Lp=b(()=>{"use strict";Et();Oe();aS();kM=wee(yee),Tee=new Set(["ENV-ERROR","NO-OUTPUT"]),See=24*60*6e4,vee=3});import{execFile as bee}from"node:child_process";import{promisify as kee}from"node:util";async function AM(t,e=Iee){try{let{stdout:n}=await e("git",["-C",t,"status","--porcelain"],{timeout:1e4});return n.split(`
|
|
2369
2369
|
`).filter(r=>r.trim().length>0).length}catch{return null}}var Iee,NM=b(()=>{"use strict";Iee=kee(bee)});import{execFile as Aee}from"node:child_process";import{promisify as Nee}from"node:util";async function LM(t,e=Ree){try{let{stderr:n}=await e("lmctl",["lint",t],{timeout:15e3});return RM(n)}catch(n){let r=n&&typeof n=="object"&&"stderr"in n?String(n.stderr):"",s=RM(r);return s.length>0?s:null}}function RM(t){return t.split(`
|
|
2370
|
-
`).map(e=>e.trim()).filter(e=>e.startsWith("warning:")||e.startsWith("error:"))}var Ree,xM=b(()=>{"use strict";Ree=Nee(Aee)});function CM(t,e,n){if(t===null)return!1;let r=Date.parse(t);return Number.isNaN(r)?!1:n-r<=e}function OM(t,e){if(t===null)return null;let n=Date.parse(t);return Number.isNaN(n)?null:e-n}var I0e,xp=b(()=>{"use strict";I0e=15*6e4});import{execFile as xee}from"node:child_process";import{promisify as Cee}from"node:util";var M0e,P0e,DM=b(()=>{"use strict";Et();xp();Oe();M0e=Cee(xee),P0e=45*6e4});var $M,J0e,MM=b(()=>{"use strict";Et();DM();xp();Oe();$M="orphan_would_reap",J0e=45*6e4});function PM(t,e){return t.transaction(()=>{let r=kr(t,e);if(r===null)return null;let s=t.prepare("SELECT * FROM notes WHERE entity_id = ? ORDER BY id DESC").all(e),o=!1;for(let i of s){let a=uu(i.body);if(a!==null){if(a[Wa]===!0)break;typeof a[Oee]=="string"&&(o=!0)}}return{entity:r,status:r.status,alreadySurfacedThisEpisode:o}})()}var Oee,UM=b(()=>{"use strict";vn();Oee="epic_closed_surfaced_ts"});function Le(t){if(!Number.isFinite(t)||t<0)return"?";if(t<1e3)return"0s";if(t<6e4)return`${Math.floor(t/1e3)}s`;if(t<36e5)return`${Math.floor(t/6e4)}m`;if(t<864e5*2)return`${Math.floor(t/36e5)}h`;let e=Math.floor(t/864e5),n=Math.floor(t%864e5/36e5);return n===0?`${e}d`:`${e}d ${n}h`}function be(t,e=Date.now()){let n=Date.parse(t);if(Number.isNaN(n))return"?";let r=e-n;return r<6e4?"just now":`${Le(r)} ago`}var Nr=b(()=>{"use strict"});import{existsSync as lS}from"node:fs";function cS(t,e,n=new Set){if(e.owner_team_path!==null)return{ownerTeamPath:e.owner_team_path,ownerAlias:e.owner_alias,explicit:!0};if(e.parent_id===null||n.has(e.id))return null;n.add(e.id);let r=kr(t,e.parent_id);if(r===null)return null;let s=cS(t,r,n);return s===null?null:{...s,explicit:!1}}function Cp(t,e){if(e===null)return null;for(let n of t)if(oe(n))try{if(ge(n)===e)return n.name}catch{continue}return null}function FM(t){return t.prepare("SELECT * FROM entities WHERE kind = 'epic' AND owner_team_path IS NULL").all().filter(n=>!Ir(n.status))}function jM(t,e,n=lS){return Cp(t,e)!==null?"registered":n(e)?"on_demand":"dangling"}function HM(t,e,n={}){let r=n.existsSyncImpl??lS,s=t.prepare("SELECT * FROM entities WHERE kind IN ('task', 'subtask')").all(),o=[];for(let i of s){if(Ir(i.status))continue;let a=cS(t,i);if(a===null){o.push({entity:i,reason:i.parent_id===null?"no owner, and no parent epic to inherit from":"no owner, and its parent epic has none to inherit either"});continue}jM(e,a.ownerTeamPath,r)==="dangling"&&o.push({entity:i,reason:a.explicit?`owner "${a.ownerTeamPath}" does not resolve to any known team (no registered entry, no on-disk teamfile)`:`inherited owner "${a.ownerTeamPath}" (from its epic) does not resolve to any known team`})}return o}function WM(t){return t.prepare("SELECT * FROM entities WHERE status = 'blocked'").all().filter(n=>(an(t,n.id,"outgoing").outgoing??[]).length===0)}function Dee(t,e){return t.prepare("SELECT 1 FROM queue WHERE to_id = ? LIMIT 1").get(e)!==void 0}function BM(t,e,n,r=lS){let s=cS(t,n);if(s===null)return{ownerKind:"dangling",everContacted:null};let o=jM(e,s.ownerTeamPath,r);if(o==="dangling")return{ownerKind:o,everContacted:null};if(o==="on_demand")return{ownerKind:o,everContacted:!1};let i=Cp(e,s.ownerTeamPath);return{ownerKind:o,everContacted:Dee(t,i)}}var uS=b(()=>{"use strict";vn();hi();Oe()});function GM(t,e){let n=an(t,e,"outgoing").outgoing??[];return new Set(n.filter(r=>!Ir(r.status)).map(r=>r.id))}function Op(t,e,n=new Set){if(n.has(e))return[];n.add(e);let s=(an(t,e,"outgoing").outgoing??[]).filter(a=>!Ir(a.status)),o=[];for(let a of s)(an(t,a.id,"outgoing").outgoing??[]).filter(u=>!Ir(u.status)).length===0?o.push(Je(t,a.id)):o.push(...Op(t,a.id,n));let i=new Set;return o.filter(a=>i.has(a.id)?!1:(i.add(a.id),!0))}function $ee(t,e){let n=new Set([e]),r=(an(t,e,"incoming").incoming??[]).map(o=>o.id),s=[];for(;r.length>0;){let o=r.pop();if(n.has(o))continue;n.add(o);let i=Je(t,o);Ir(i.status)||(s.push(i),r.push(...(an(t,o,"incoming").incoming??[]).map(a=>a.id)))}return s}function qM(t){let e=t.trim().toLowerCase();return e==="todo"?0:e==="in_progress"||e==="in-progress"?1:2}function XM(t,e,n){let r=new Map;for(let o of e)for(let i of Op(t,o.id))r.set(i.id,i);let s=[];for(let o of r.values()){let i=$ee(t,o.id),a=new Set;for(let c of i){let u=Cp(n,c.owner_team_path);u!==null&&a.add(u)}let l=BM(t,n,o);s.push({entity:o,downstreamCount:i.length,downstreamTeams:[...a].sort(),ownerKind:l.ownerKind,everContacted:l.everContacted})}return s.sort((o,i)=>{if(o.downstreamTeams.length!==i.downstreamTeams.length)return i.downstreamTeams.length-o.downstreamTeams.length;if(o.downstreamCount!==i.downstreamCount)return i.downstreamCount-o.downstreamCount;let a=qM(o.entity.status)-qM(i.entity.status);return a!==0?a:o.entity.id-i.entity.id}),s}var VM=b(()=>{"use strict";vn();hi();uS()});import{execFile as Mee}from"node:child_process";import{promisify as Pee}from"node:util";function Fee(t){let e=JSON.parse(t),n=typeof e=="object"&&e!==null?e.sessions:void 0;if(typeof e!="object"||e===null||typeof e.generated_at!="string"||!Array.isArray(n))throw new Error("unexpected `lmctl running --json` shape: missing generated_at or sessions array");let r=[],s=[],o=[];for(let[i,a]of n.entries()){if(typeof a!="object"||a===null||Array.isArray(a))throw new Error("unexpected `lmctl running --json` shape: malformed sessions element");let l=a;if(typeof l.team_path!="string"||typeof l.member!="string"||typeof l.sender_identity!="string"||typeof l.started_at!="string"&&l.started_at!==null||typeof l.last_activity_at!="string"&&l.last_activity_at!==null||!["chat","exec"].includes(String(l.kind))||!["running","done","error"].includes(String(l.state)))throw new Error("unexpected `lmctl running --json` shape: malformed session identity or state fields");let c=`${l.team_path}:${l.member}`,u=l.completed_run&&typeof l.completed_run=="object"?l.completed_run:null,d=l.started_at??l.last_activity_at??l.generated_at??"",f=l.sender_identity;l.state==="running"&&l.liveness!=="dead"?r.push({id:i,kind:l.kind,origin:"unknown",from_identity:f,target:c,started_at:d,running_for_ms:0,holder_liveness:l.liveness==="live"?"live":"unknown"}):l.liveness==="dead"?s.push({id:i,kind:l.kind,origin:"unknown",from_identity:f,target:c,started_at:d,age_ms:0}):u&&typeof u.ended_at=="string"&&typeof u.elapsed_ms=="number"&&o.push({id:i,kind:l.kind,origin:"unknown",from_identity:f,target:c,status:l.state==="done"?"done":"error",started_at:d,ended_at:u.ended_at,idle_ms:0,ran_ms:u.elapsed_ms,error:typeof u.error=="string"?u.error:null,parent_invocation_id:null})}return{schema_version:3,running:r,dead:s,idle:o}}async function ut(t=3e4,e={}){let n=e.reconcile===!0?["running","--json","--reconcile"]:["running","--json"],{stdout:r}=await Uee("lmctl",n,{timeout:t});return Fee(r)}var Uee,Rr=b(()=>{"use strict";Nr();Uee=Pee(Mee)});import{execFileSync as jee}from"node:child_process";import{existsSync as Hee,readFileSync as JM}from"node:fs";import{homedir as KM}from"node:os";import{join as YM}from"node:path";function zM(){return process.env.LMBEE_HEAVY_STATUS??YM(KM(),".lmbee","heavy.status")}function QM(){return process.env.LMBEE_HEAVY_LOCK??YM(KM(),".lmbee","heavy.lock")}function Wee(t){if(typeof t!="object"||t===null)return!1;let e=t;return typeof e.holder=="string"&&typeof e.pid=="number"&&typeof e.command=="string"&&typeof e.startedAt=="string"}function Bee(t){let e;try{e=JM(t,"utf8")}catch{return null}try{let n=JSON.parse(e);return Wee(n)?n:null}catch{return null}}function qee(t,e){return t===null||e===null?t===e:t.holder===e.holder&&t.pid===e.pid&&t.command===e.command&&t.startedAt===e.startedAt}function Gee(t){try{let e=JM(`/proc/${t}/stat`,"utf8");return e.slice(e.lastIndexOf(")")+2).trim().split(/\s+/)[0]==="Z"}catch{return!1}}function Xee(t){try{process.kill(t,0)}catch(e){return e.code==="EPERM"}return!Gee(t)}function Vee(t,e=jee){if(!Hee(t))return!1;try{return e("flock",["-n",t,"-c","true"],{stdio:"ignore"}),!1}catch(n){if((n&&typeof n=="object"?n.status:void 0)===1)return!0;let s=n instanceof Error?n.message:String(n);throw new Dp(`heavy-lock probe failed (flock did not run or exited abnormally): ${s}`)}}function Jee(t=zM(),e=QM(),n=Bee,r=Vee,s=Xee){for(let o=0;o<3;o++){let i=n(t),a=r(e),l=n(t);if(i!==null&&qee(i,l)){if(!a)return{held:!1,holder:null};if(s(i.pid))return{held:!0,holder:i}}}return{held:r(e),holder:null}}function oo(t=zM(),e=QM(),n=Jee,r){try{return n(t,e)}catch(s){if(!(s instanceof Dp))throw s;return r?.(s),{held:!0,holder:null}}}var Dp,gu=b(()=>{"use strict";Dp=class extends Error{}});function dS(t,e){if(t.length<3)return{kind:"insufficient_data",reason:`only ${t.length} sample(s), need >= 3`};let n=[...t].sort((g,y)=>g.readAt-y.readAt),r=n[0],s=n[n.length-1],o=(s.readAt-r.readAt)*1e3;if(o<6e5)return{kind:"insufficient_data",reason:`samples span only ${Math.round(o/1e3)}s, need >= ${6e5/1e3}s`};let i=e-s.readAt*1e3;if(i>9e5)return{kind:"insufficient_data",reason:`freshest sample is ${Math.round(i/1e3)}s old, exceeds ${9e5/1e3}s staleness limit`};let a=n.length,l=n.reduce((g,y)=>g+y.readAt,0)/a,c=n.reduce((g,y)=>g+y.usedFraction,0)/a,u=0,d=0;for(let g of n){let y=g.readAt-l;u+=y*(g.usedFraction-c),d+=y*y}if(d===0)return{kind:"insufficient_data",reason:"samples have no time spread"};let f=u/d;if(f<=0)return{kind:"no_forecast"};let _=(1-(c-f*l+f*s.readAt))/f;return{kind:"forecast",forecastAtMs:s.readAt*1e3+_*1e3,burnFractionPerMin:f*60,latestReadAtMs:s.readAt*1e3}}var ZM,fS=b(()=>{"use strict";ZM={five_hour:9e5,weekly:36e5}});function Yee(t,e){return Kee.has(`${t}:${e}`)}function $p(t){let e=t.prepare("SELECT v FROM kv WHERE k = ?").get(zee);if(e===void 0)return null;try{return JSON.parse(e.v)}catch{return null}}function eP(t,e=Date.now(),n=Qee){let r=t.prepare("SELECT MAX(read_at) AS readAt FROM rate_limit_bucket_samples").get();if(r.readAt===null||e-r.readAt*1e3>n)return null;let o=$p(t);if(o===null)return{status:"never-run",reason:"rate-limit policy has never completed an evaluation while collection is active",ageMs:1/0};let i=e-o.lastRunAtMs;return i>n?{status:"stale",reason:`rate-limit policy last ran ${Math.round(i/6e4)}m ago while collection is active`,ageMs:i}:null}function tP(t,e=Zee){return t.prepare(`SELECT s.provider AS provider, s.bucket_id AS bucketId, s.window_type AS windowType, s.used_fraction AS usedFraction, s.resets_at_iso AS resetsAtIso
|
|
2370
|
+
`).map(e=>e.trim()).filter(e=>e.startsWith("warning:")||e.startsWith("error:"))}var Ree,xM=b(()=>{"use strict";Ree=Nee(Aee)});function CM(t,e,n){if(t===null)return!1;let r=Date.parse(t);return Number.isNaN(r)?!1:n-r<=e}function OM(t,e){if(t===null)return null;let n=Date.parse(t);return Number.isNaN(n)?null:e-n}var I0e,xp=b(()=>{"use strict";I0e=15*6e4});import{execFile as xee}from"node:child_process";import{promisify as Cee}from"node:util";var M0e,P0e,DM=b(()=>{"use strict";Et();xp();Oe();M0e=Cee(xee),P0e=45*6e4});var $M,J0e,MM=b(()=>{"use strict";Et();DM();xp();Oe();$M="orphan_would_reap",J0e=45*6e4});function PM(t,e){return t.transaction(()=>{let r=kr(t,e);if(r===null)return null;let s=t.prepare("SELECT * FROM notes WHERE entity_id = ? ORDER BY id DESC").all(e),o=!1;for(let i of s){let a=uu(i.body);if(a!==null){if(a[Wa]===!0)break;typeof a[Oee]=="string"&&(o=!0)}}return{entity:r,status:r.status,alreadySurfacedThisEpisode:o}})()}var Oee,UM=b(()=>{"use strict";vn();Oee="epic_closed_surfaced_ts"});function Le(t){if(!Number.isFinite(t)||t<0)return"?";if(t<1e3)return"0s";if(t<6e4)return`${Math.floor(t/1e3)}s`;if(t<36e5)return`${Math.floor(t/6e4)}m`;if(t<864e5*2)return`${Math.floor(t/36e5)}h`;let e=Math.floor(t/864e5),n=Math.floor(t%864e5/36e5);return n===0?`${e}d`:`${e}d ${n}h`}function be(t,e=Date.now()){let n=Date.parse(t);if(Number.isNaN(n))return"?";let r=e-n;return r<6e4?"just now":`${Le(r)} ago`}var Nr=b(()=>{"use strict"});import{existsSync as lS}from"node:fs";function cS(t,e,n=new Set){if(e.owner_team_path!==null)return{ownerTeamPath:e.owner_team_path,ownerAlias:e.owner_alias,explicit:!0};if(e.parent_id===null||n.has(e.id))return null;n.add(e.id);let r=kr(t,e.parent_id);if(r===null)return null;let s=cS(t,r,n);return s===null?null:{...s,explicit:!1}}function Cp(t,e){if(e===null)return null;for(let n of t)if(oe(n))try{if(ge(n)===e)return n.name}catch{continue}return null}function FM(t){return t.prepare("SELECT * FROM entities WHERE kind = 'epic' AND owner_team_path IS NULL").all().filter(n=>!Ir(n.status))}function jM(t,e,n=lS){return Cp(t,e)!==null?"registered":n(e)?"on_demand":"dangling"}function HM(t,e,n={}){let r=n.existsSyncImpl??lS,s=t.prepare("SELECT * FROM entities WHERE kind IN ('task', 'subtask')").all(),o=[];for(let i of s){if(Ir(i.status))continue;let a=cS(t,i);if(a===null){o.push({entity:i,reason:i.parent_id===null?"no owner, and no parent epic to inherit from":"no owner, and its parent epic has none to inherit either"});continue}jM(e,a.ownerTeamPath,r)==="dangling"&&o.push({entity:i,reason:a.explicit?`owner "${a.ownerTeamPath}" does not resolve to any known team (no registered entry, no on-disk teamfile)`:`inherited owner "${a.ownerTeamPath}" (from its epic) does not resolve to any known team`})}return o}function WM(t){return t.prepare("SELECT * FROM entities WHERE status = 'blocked'").all().filter(n=>(an(t,n.id,"outgoing").outgoing??[]).length===0)}function Dee(t,e){return t.prepare("SELECT 1 FROM queue WHERE to_id = ? LIMIT 1").get(e)!==void 0}function BM(t,e,n,r=lS){let s=cS(t,n);if(s===null)return{ownerKind:"dangling",everContacted:null};let o=jM(e,s.ownerTeamPath,r);if(o==="dangling")return{ownerKind:o,everContacted:null};if(o==="on_demand")return{ownerKind:o,everContacted:!1};let i=Cp(e,s.ownerTeamPath);return{ownerKind:o,everContacted:Dee(t,i)}}var uS=b(()=>{"use strict";vn();hi();Oe()});function GM(t,e){let n=an(t,e,"outgoing").outgoing??[];return new Set(n.filter(r=>!Ir(r.status)).map(r=>r.id))}function Op(t,e,n=new Set){if(n.has(e))return[];n.add(e);let s=(an(t,e,"outgoing").outgoing??[]).filter(a=>!Ir(a.status)),o=[];for(let a of s)(an(t,a.id,"outgoing").outgoing??[]).filter(u=>!Ir(u.status)).length===0?o.push(Je(t,a.id)):o.push(...Op(t,a.id,n));let i=new Set;return o.filter(a=>i.has(a.id)?!1:(i.add(a.id),!0))}function $ee(t,e){let n=new Set([e]),r=(an(t,e,"incoming").incoming??[]).map(o=>o.id),s=[];for(;r.length>0;){let o=r.pop();if(n.has(o))continue;n.add(o);let i=Je(t,o);Ir(i.status)||(s.push(i),r.push(...(an(t,o,"incoming").incoming??[]).map(a=>a.id)))}return s}function qM(t){let e=t.trim().toLowerCase();return e==="todo"?0:e==="in_progress"||e==="in-progress"?1:2}function XM(t,e,n){let r=new Map;for(let o of e)for(let i of Op(t,o.id))r.set(i.id,i);let s=[];for(let o of r.values()){let i=$ee(t,o.id),a=new Set;for(let c of i){let u=Cp(n,c.owner_team_path);u!==null&&a.add(u)}let l=BM(t,n,o);s.push({entity:o,downstreamCount:i.length,downstreamTeams:[...a].sort(),ownerKind:l.ownerKind,everContacted:l.everContacted})}return s.sort((o,i)=>{if(o.downstreamTeams.length!==i.downstreamTeams.length)return i.downstreamTeams.length-o.downstreamTeams.length;if(o.downstreamCount!==i.downstreamCount)return i.downstreamCount-o.downstreamCount;let a=qM(o.entity.status)-qM(i.entity.status);return a!==0?a:o.entity.id-i.entity.id}),s}var VM=b(()=>{"use strict";vn();hi();uS()});import{execFile as Mee}from"node:child_process";import{promisify as Pee}from"node:util";function Fee(t){let e=JSON.parse(t),n=typeof e=="object"&&e!==null?e.sessions:void 0;if(typeof e!="object"||e===null||typeof e.generated_at!="string"||!Array.isArray(n))throw new Error("unexpected `lmctl running --json` shape: missing generated_at or sessions array");let r=Date.parse(e.generated_at),s=[],o=[],i=[];for(let a of n){if(typeof a!="object"||a===null||Array.isArray(a))throw new Error("unexpected `lmctl running --json` shape: malformed sessions element");let l=a;if(typeof l.team_path!="string"||typeof l.member!="string"||typeof l.sender_identity!="string"||typeof l.started_at!="string"&&l.started_at!==null||typeof l.last_activity_at!="string"&&l.last_activity_at!==null||!["chat","exec"].includes(String(l.kind))||!["running","done","error"].includes(String(l.state)))throw new Error("unexpected `lmctl running --json` shape: malformed session identity or state fields");let c=`${l.team_path}:${l.member}`,u=l.completed_run&&typeof l.completed_run=="object"?l.completed_run:null,d=l.started_at??l.last_activity_at??e.generated_at,f=l.sender_identity;l.state==="running"&&l.liveness!=="dead"?s.push({kind:l.kind,origin:"unknown",from_identity:f,target:c,started_at:d,running_for_ms:Math.max(0,r-Date.parse(d)),holder_liveness:l.liveness==="live"?"live":"unknown"}):l.liveness==="dead"?o.push({kind:l.kind,origin:"unknown",from_identity:f,target:c,started_at:d,age_ms:Math.max(0,r-Date.parse(d))}):u&&typeof u.ended_at=="string"&&typeof u.elapsed_ms=="number"&&i.push({kind:l.kind,origin:"unknown",from_identity:f,target:c,status:l.state==="done"?"done":"error",started_at:d,ended_at:u.ended_at,idle_ms:Math.max(0,r-Date.parse(u.ended_at)),ran_ms:u.elapsed_ms,error:typeof u.error=="string"?u.error:null,parent_invocation_id:null})}return{schema_version:3,running:s,dead:o,idle:i}}async function ut(t=3e4,e={}){let n=e.reconcile===!0?["running","--json","--reconcile"]:["running","--json"],{stdout:r}=await Uee("lmctl",n,{timeout:t});return Fee(r)}var Uee,Rr=b(()=>{"use strict";Nr();Uee=Pee(Mee)});import{execFileSync as jee}from"node:child_process";import{existsSync as Hee,readFileSync as JM}from"node:fs";import{homedir as KM}from"node:os";import{join as YM}from"node:path";function zM(){return process.env.LMBEE_HEAVY_STATUS??YM(KM(),".lmbee","heavy.status")}function QM(){return process.env.LMBEE_HEAVY_LOCK??YM(KM(),".lmbee","heavy.lock")}function Wee(t){if(typeof t!="object"||t===null)return!1;let e=t;return typeof e.holder=="string"&&typeof e.pid=="number"&&typeof e.command=="string"&&typeof e.startedAt=="string"}function Bee(t){let e;try{e=JM(t,"utf8")}catch{return null}try{let n=JSON.parse(e);return Wee(n)?n:null}catch{return null}}function qee(t,e){return t===null||e===null?t===e:t.holder===e.holder&&t.pid===e.pid&&t.command===e.command&&t.startedAt===e.startedAt}function Gee(t){try{let e=JM(`/proc/${t}/stat`,"utf8");return e.slice(e.lastIndexOf(")")+2).trim().split(/\s+/)[0]==="Z"}catch{return!1}}function Xee(t){try{process.kill(t,0)}catch(e){return e.code==="EPERM"}return!Gee(t)}function Vee(t,e=jee){if(!Hee(t))return!1;try{return e("flock",["-n",t,"-c","true"],{stdio:"ignore"}),!1}catch(n){if((n&&typeof n=="object"?n.status:void 0)===1)return!0;let s=n instanceof Error?n.message:String(n);throw new Dp(`heavy-lock probe failed (flock did not run or exited abnormally): ${s}`)}}function Jee(t=zM(),e=QM(),n=Bee,r=Vee,s=Xee){for(let o=0;o<3;o++){let i=n(t),a=r(e),l=n(t);if(i!==null&&qee(i,l)){if(!a)return{held:!1,holder:null};if(s(i.pid))return{held:!0,holder:i}}}return{held:r(e),holder:null}}function oo(t=zM(),e=QM(),n=Jee,r){try{return n(t,e)}catch(s){if(!(s instanceof Dp))throw s;return r?.(s),{held:!0,holder:null}}}var Dp,gu=b(()=>{"use strict";Dp=class extends Error{}});function dS(t,e){if(t.length<3)return{kind:"insufficient_data",reason:`only ${t.length} sample(s), need >= 3`};let n=[...t].sort((g,y)=>g.readAt-y.readAt),r=n[0],s=n[n.length-1],o=(s.readAt-r.readAt)*1e3;if(o<6e5)return{kind:"insufficient_data",reason:`samples span only ${Math.round(o/1e3)}s, need >= ${6e5/1e3}s`};let i=e-s.readAt*1e3;if(i>9e5)return{kind:"insufficient_data",reason:`freshest sample is ${Math.round(i/1e3)}s old, exceeds ${9e5/1e3}s staleness limit`};let a=n.length,l=n.reduce((g,y)=>g+y.readAt,0)/a,c=n.reduce((g,y)=>g+y.usedFraction,0)/a,u=0,d=0;for(let g of n){let y=g.readAt-l;u+=y*(g.usedFraction-c),d+=y*y}if(d===0)return{kind:"insufficient_data",reason:"samples have no time spread"};let f=u/d;if(f<=0)return{kind:"no_forecast"};let _=(1-(c-f*l+f*s.readAt))/f;return{kind:"forecast",forecastAtMs:s.readAt*1e3+_*1e3,burnFractionPerMin:f*60,latestReadAtMs:s.readAt*1e3}}var ZM,fS=b(()=>{"use strict";ZM={five_hour:9e5,weekly:36e5}});function Yee(t,e){return Kee.has(`${t}:${e}`)}function $p(t){let e=t.prepare("SELECT v FROM kv WHERE k = ?").get(zee);if(e===void 0)return null;try{return JSON.parse(e.v)}catch{return null}}function eP(t,e=Date.now(),n=Qee){let r=t.prepare("SELECT MAX(read_at) AS readAt FROM rate_limit_bucket_samples").get();if(r.readAt===null||e-r.readAt*1e3>n)return null;let o=$p(t);if(o===null)return{status:"never-run",reason:"rate-limit policy has never completed an evaluation while collection is active",ageMs:1/0};let i=e-o.lastRunAtMs;return i>n?{status:"stale",reason:`rate-limit policy last ran ${Math.round(i/6e4)}m ago while collection is active`,ageMs:i}:null}function tP(t,e=Zee){return t.prepare(`SELECT s.provider AS provider, s.bucket_id AS bucketId, s.window_type AS windowType, s.used_fraction AS usedFraction, s.resets_at_iso AS resetsAtIso
|
|
2371
2371
|
FROM rate_limit_bucket_samples s
|
|
2372
2372
|
INNER JOIN (
|
|
2373
2373
|
SELECT provider, bucket_id, MAX(read_at) AS maxReadAt
|
package/dist/lmbee.js
CHANGED
|
@@ -2176,7 +2176,7 @@ ${a}
|
|
|
2176
2176
|
WHERE id = ? AND enabled = 1 AND revision = ? AND running_since_ts = ? AND running_systemd_unit = ?`).run("reconciled",s,t.id,t.revision,t.running_since_ts,t.running_systemd_unit),jw(e,t.id,"reconciled: command execution confirmed gone by systemd probe; no exit callback survived the restart");return}e.prepare("UPDATE cron_jobs SET last_fire_status = ?, updated_at = ? WHERE id = ? AND enabled = 1 AND revision = ? AND running_since_ts = ?").run("skipped_overlap",s,t.id,t.revision,t.running_since_ts);return}let p=t.last_checked_ts!==null?Date.parse(t.last_checked_ts):Date.parse(t.created_at);if(p>r){go(e,"UPDATE cron_jobs SET last_checked_ts = ?, last_fire_status = ?, last_fire_error = ?, updated_at = ?",[s,"error",`last_checked_ts (${t.last_checked_ts??t.created_at}) is after the current tick time -- checkpoint reset without firing`,s],t);return}let h=new Date(p),_=new Date(r);if(r-p>_ee){go(e,"UPDATE cron_jobs SET last_checked_ts = ?, last_fire_status = ?, updated_at = ?",[s,"skipped_stale",s],t);return}let g=t.timezone!==null?tD(h,t.timezone):h,w=t.timezone!==null?tD(_,t.timezone):_;if(!PO(m,g,w)){go(e,"UPDATE cron_jobs SET last_checked_ts = ?, updated_at = ?",[s,s],t);return}let y=ap(e,t.id);if(!(y===null||y.enabled===0||y.revision!==t.revision)){if(pee(t.action_kind)){Tee(e,t,s,l,u,d);return}if(t.action_kind==="enqueue")try{let T=JSON.parse(t.action_payload),v={from:T.from??"autopilot",dedupeKey:`cron:${t.id}:${h.toISOString()}`};e.transaction(()=>{let I=e.prepare("SELECT enabled, revision, last_checked_ts FROM cron_jobs WHERE id = ?").get(t.id);return I===void 0||I.enabled===0||I.revision!==t.revision||I.last_checked_ts!==t.last_checked_ts?!1:(o(e,n,T.to,T.prompt,v),e.prepare("UPDATE cron_jobs SET last_checked_ts = ?, last_fired_ts = ?, last_fire_status = ?, last_fire_error = NULL, updated_at = ? WHERE id = ?").run(s,s,"ok",s,t.id),!0)}).immediate()&&l.push(t.title)}catch(T){try{u?.(t.id,T)}catch{}try{go(e,"UPDATE cron_jobs SET last_fire_status = ?, last_fire_error = ?, updated_at = ?",["error",Fn(T),s],t)}catch{}}else{let T=s,v=`lmcron-job-${t.id}-${T.replace(/[:.]/g,"-")}.scope`;if(e.prepare(`UPDATE cron_jobs SET last_checked_ts = ?, last_fired_ts = ?, last_fire_status = ?, last_fire_error = NULL, running_since_ts = ?, running_systemd_unit = ?, updated_at = ?
|
|
2177
2177
|
WHERE id = ? AND enabled = 1 AND revision = ? AND (last_checked_ts IS ?) AND (running_since_ts IS ?)`).run(s,s,"ok",s,v,s,t.id,t.revision,t.last_checked_ts,t.running_since_ts).changes===0)return;let I=lD(e,t,t.action_kind,v,a),N={logDir:c,systemdUnitName:v,onExit:(x,R,k,O)=>{let D=x===0?"ok":"error",S=D==="ok"?null:R?Fn(R):`Command exited with code ${x} -- see ${c??ep()}/${t.id}/ for output`;if(R)try{u?.(t.id,R)}catch{}try{e.prepare("UPDATE cron_jobs SET running_since_ts = NULL, running_systemd_unit = NULL, last_fire_status = ?, last_fire_error = ?, updated_at = ? WHERE id = ? AND running_since_ts = ?").run(D,S,new Date().toISOString(),t.id,T)}catch{}uD(e,I,x,R,k,O,v)}};try{i({id:t.id,action_payload:t.action_payload},N),l.push(t.title)}catch(x){try{u?.(t.id,x)}catch{}try{e.prepare("UPDATE cron_jobs SET last_fire_status = ?, last_fire_error = ?, running_since_ts = NULL, running_systemd_unit = NULL, updated_at = ? WHERE id = ? AND running_since_ts = ?").run("error",Fn(x),s,t.id,T)}catch{}dD(e,I,x)}}}}async function nD(e,t){for(;!e();)await new Promise(n=>setTimeout(n,t))}async function su(e,t,n,r={}){let s=r.enqueueImpl??De,o=r.spawnCommandImpl??Xl,i=r.isUnitStillRunningImpl??aD,a=r.executeRunImpl??Fw,c=r.logDir,l=r.pollMs??250,u=it(e,t);if(Pa(e,t)&&r.onDemand===void 0)return{kind:"skipped_overlap",job:u};if(u.enabled===0)throw new G("DISABLED",`Cron job ${t} is disabled -- enable it first (\`cron enable ${t}\`), or a manual trigger would silently exercise a job the operator turned off on purpose`,4);let d=ve();if(u.action_kind==="command"){if(u.running_since_ts!==null)return u.running_systemd_unit!==null&&i(u.running_systemd_unit)==="confirmed-gone"?(e.prepare(`UPDATE cron_jobs SET running_since_ts = NULL, running_systemd_unit = NULL, last_fire_status = ?, last_fire_error = NULL, updated_at = ?
|
|
2178
2178
|
WHERE id = ? AND revision = ? AND running_since_ts = ? AND running_systemd_unit = ?`).run("reconciled",d,u.id,u.revision,u.running_since_ts,u.running_systemd_unit),jw(e,u.id,"reconciled: command execution confirmed gone by systemd probe; no exit callback survived the restart"),await su(e,t,n,r)):{kind:"skipped_overlap",job:u};let p=d,h=`lmcron-job-${u.id}-${p.replace(/[:.]/g,"-")}-manual.scope`;if(e.prepare(`UPDATE cron_jobs SET last_fired_ts = ?, last_fire_status = ?, last_fire_error = NULL, running_since_ts = ?, running_systemd_unit = ?, updated_at = ?
|
|
2179
|
-
WHERE id = ? AND enabled = 1 AND revision = ? AND running_since_ts IS ?`).run(d,"ok",p,h,d,u.id,u.revision,u.running_since_ts).changes===0)return{kind:"skipped_overlap",job:it(e,t)};let g=lD(e,u,`${u.action_kind}:manual`,h,i),w={logDir:c,systemdUnitName:h,onExit:(E,y,T,v)=>{let A=E===0?"ok":"error",I=A==="ok"?null:y?Fn(y):`Command exited with code ${E} -- see ${c??ep()}/${u.id}/ for output`;try{e.prepare("UPDATE cron_jobs SET running_since_ts = NULL, running_systemd_unit = NULL, last_fire_status = ?, last_fire_error = ?, updated_at = ? WHERE id = ? AND running_since_ts = ?").run(A,I,new Date().toISOString(),u.id,p)}catch{}uD(e,g,E,y,T,v,h)}};try{o({id:u.id,action_payload:u.action_payload},w)}catch(E){dD(e,g,E);try{e.prepare("UPDATE cron_jobs SET last_fire_status = ?, last_fire_error = ?, running_since_ts = NULL, running_systemd_unit = NULL, updated_at = ? WHERE id = ? AND running_since_ts = ?").run("error",Fn(E),d,u.id,p)}catch{}throw new G("SPAWN_FAILED",`manual trigger of job ${t} failed to spawn: ${Fn(E)}`,1)}return await nD(()=>it(e,t).running_since_ts!==p,l),{kind:"fired",job:it(e,t)}}if(u.action_kind==="enqueue"){let p=JSON.parse(u.action_payload);return s(e,n,p.to,p.prompt,{from:p.from??"autopilot"}),e.prepare("UPDATE cron_jobs SET last_fired_ts = ?, last_fire_status = ?, last_fire_error = NULL, updated_at = ? WHERE id = ?").run(d,"ok",d,u.id),{kind:"fired",job:it(e,t)}}let f=JSON.stringify({kind:u.action_kind,payload:u.action_payload,provider:u.provider,model:u.model,workingDirectory:u.working_directory,escalationOwner:u.escalation_owner}),m=e.transaction(()=>{let p=e.prepare("SELECT enabled, revision FROM cron_jobs WHERE id = ?").get(u.id);if(p===void 0||p.enabled===0||p.revision!==u.revision)return null;let h=zl(e,u.id,`${u.action_kind}:manual`,f);if(h.kind==="claimed"){r.onDemand!==void 0&&xO(e,u.id,h.run.id,r.onDemand);let _=r.disableOnClaim?"enabled = 0, ":"";e.prepare(`UPDATE cron_jobs SET ${_}last_fired_ts = ?, last_fire_status = ?, last_fire_error = NULL, updated_at = ? WHERE id = ?`).run(d,"ok",d,u.id)}return h}).immediate();if(m===null)throw new G("CONFLICT",`Cron job ${t} was modified concurrently -- re-run \`cron trigger ${t}\``,5);if(m.kind==="escalation")return{kind:"blocked_escalation",job:it(e,t)};if(m.kind==="overlap")return{kind:"skipped_overlap",job:it(e,t)};try{a({db:e,job:u,run:m.run,runToken:m.token,...r.onDemand!==void 0?{onDemand:r.onDemand}:{},...r.runSpawnPrefixes!==void 0?{spawnPrefixes:r.runSpawnPrefixes}:{},...r.sessionDir!==void 0?{sessionDir:r.sessionDir}:{},...r.runTimeoutMs!==void 0?{timeoutMs:r.runTimeoutMs}:{},...r.runSeedTimeoutMs!==void 0?{seedTimeoutMs:r.runSeedTimeoutMs}:{}})}catch(p){try{Ql(e,m.run.id,`worker dispatch threw: ${Fn(p)}`),kw(e,m.run.id,{ok:!1,summary:`worker dispatch error: ${Fn(p)}`})}catch{}throw new G("SPAWN_FAILED",`manual trigger of job ${t} failed to dispatch: ${Fn(p)}`,1)}if(r.waitForCompletion===!1){let p=u;try{p=it(e,t)}catch(h){console.warn(`[triggerCronJobNow] post-dispatch getCronJob read failed for job ${t}:`,h)}return{kind:"fired",job:p,runId:m.run.id}}return await nD(()=>{let p=xt(e,m.run.id);return p.status!=="pending"&&p.status!=="running"},l),{kind:"fired",job:it(e,t),runId:m.run.id}}function Tee(e,t,n,r,s,o){if(Pa(e,t.id))return;let i=JSON.stringify({kind:t.action_kind,payload:t.action_payload,provider:t.provider,model:t.model,workingDirectory:t.working_directory,escalationOwner:t.escalation_owner}),a=e.transaction(()=>{let c=e.prepare("SELECT enabled, revision, last_checked_ts FROM cron_jobs WHERE id = ?").get(t.id);if(c===void 0||c.enabled===0||c.revision!==t.revision||c.last_checked_ts!==t.last_checked_ts)return null;let l=zl(e,t.id,t.action_kind,i);return l.kind==="claimed"&&e.prepare("UPDATE cron_jobs SET last_checked_ts = ?, last_fired_ts = ?, last_fire_status = ?, last_fire_error = NULL, updated_at = ? WHERE id = ?").run(n,n,"ok",n,t.id),l}).immediate();if(a!==null){if(a.kind==="escalation"){go(e,"UPDATE cron_jobs SET last_fire_status = ?, updated_at = ?",["blocked_escalation",n],t);return}if(a.kind==="overlap"){go(e,"UPDATE cron_jobs SET last_fire_status = ?, updated_at = ?",["skipped_overlap",n],t);return}r.push(t.title);try{o.executeRunImpl({db:e,job:t,run:a.run,runToken:a.token,...o.runSpawnPrefixes!==void 0?{spawnPrefixes:o.runSpawnPrefixes}:{},...o.sessionDir!==void 0?{sessionDir:o.sessionDir}:{},...o.runTimeoutMs!==void 0?{timeoutMs:o.runTimeoutMs}:{},...o.runSeedTimeoutMs!==void 0?{seedTimeoutMs:o.runSeedTimeoutMs}:{}})}catch(c){try{Ql(e,a.run.id,`worker dispatch threw: ${Fn(c)}`),kw(e,a.run.id,{ok:!1,summary:`worker dispatch error: ${Fn(c)}`})}catch{}try{s?.(t.id,c)}catch{}}}}function go(e,t,n,r){e.prepare(`${t} WHERE id = ? AND enabled = 1 AND revision = ? AND (last_checked_ts IS ?)`).run(...n,r.id,r.revision,r.last_checked_ts)}function fD(e,t){let n=e.transaction(()=>{it(e,t);try{e.prepare("UPDATE cron_jobs SET running_since_ts = NULL, running_systemd_unit = NULL WHERE id = ?").run(t)}catch(r){Ha(r)}return ip(e,t),it(e,t)});return ws(n)}import{execFileSync as vee}from"node:child_process";import{existsSync as See,readFileSync as mD}from"node:fs";import{homedir as pD}from"node:os";import{join as hD}from"node:path";function Wa(){return process.env.LMBEE_HEAVY_STATUS??hD(pD(),".lmbee","heavy.status")}function Ga(){return process.env.LMBEE_HEAVY_LOCK??hD(pD(),".lmbee","heavy.lock")}var Ba=class extends Error{};function bee(e){if(typeof e!="object"||e===null)return!1;let t=e;return typeof t.holder=="string"&&typeof t.pid=="number"&&typeof t.command=="string"&&typeof t.startedAt=="string"}function Aee(e){let t;try{t=mD(e,"utf8")}catch{return null}try{let n=JSON.parse(t);return bee(n)?n:null}catch{return null}}function Iee(e,t){return e===null||t===null?e===t:e.holder===t.holder&&e.pid===t.pid&&e.command===t.command&&e.startedAt===t.startedAt}function kee(e){try{let t=mD(`/proc/${e}/stat`,"utf8");return t.slice(t.lastIndexOf(")")+2).trim().split(/\s+/)[0]==="Z"}catch{return!1}}function Ree(e){try{process.kill(e,0)}catch(t){return t.code==="EPERM"}return!kee(e)}function Nee(e,t=vee){if(!See(e))return!1;try{return t("flock",["-n",e,"-c","true"],{stdio:"ignore"}),!1}catch(n){if((n&&typeof n=="object"?n.status:void 0)===1)return!0;let s=n instanceof Error?n.message:String(n);throw new Ba(`heavy-lock probe failed (flock did not run or exited abnormally): ${s}`)}}function Hw(e=Wa(),t=Ga(),n=Aee,r=Nee,s=Ree){for(let o=0;o<3;o++){let i=n(e),a=r(t),c=n(e);if(i!==null&&Iee(i,c)){if(!a)return{held:!1,holder:null};if(s(i.pid))return{held:!0,holder:i}}}return{held:r(t),holder:null}}function vn(e=Wa(),t=Ga(),n=Hw,r){try{return n(e,t)}catch(s){if(!(s instanceof Ba))throw s;return r?.(s),{held:!0,holder:null}}}var dp={observedAt:null,report:null,lastErrorAt:null,lastError:null};function _D(e,t){dp={observedAt:t,report:e,lastErrorAt:null,lastError:null}}function gD(e,t){dp={...dp,lastErrorAt:t,lastError:e}}function ou(){return dp}import{execFile as xee}from"node:child_process";import{promisify as Lee}from"node:util";function Ae(e){if(!Number.isFinite(e)||e<0)return"?";if(e<1e3)return"0s";if(e<6e4)return`${Math.floor(e/1e3)}s`;if(e<36e5)return`${Math.floor(e/6e4)}m`;if(e<864e5*2)return`${Math.floor(e/36e5)}h`;let t=Math.floor(e/864e5),n=Math.floor(e%864e5/36e5);return n===0?`${t}d`:`${t}d ${n}h`}function Le(e,t=Date.now()){let n=Date.parse(e);if(Number.isNaN(n))return"?";let r=t-n;return r<6e4?"just now":`${Ae(r)} ago`}var Cee=Lee(xee);function Oee(e){let t=JSON.parse(e),n=typeof t=="object"&&t!==null?t.sessions:void 0;if(typeof t!="object"||t===null||typeof t.generated_at!="string"||!Array.isArray(n))throw new Error("unexpected `lmctl running --json` shape: missing generated_at or sessions array");let r=[],s=[],o=[];for(let[i,a]of n.entries()){if(typeof a!="object"||a===null||Array.isArray(a))throw new Error("unexpected `lmctl running --json` shape: malformed sessions element");let c=a;if(typeof c.team_path!="string"||typeof c.member!="string"||typeof c.sender_identity!="string"||typeof c.started_at!="string"&&c.started_at!==null||typeof c.last_activity_at!="string"&&c.last_activity_at!==null||!["chat","exec"].includes(String(c.kind))||!["running","done","error"].includes(String(c.state)))throw new Error("unexpected `lmctl running --json` shape: malformed session identity or state fields");let l=`${c.team_path}:${c.member}`,u=c.completed_run&&typeof c.completed_run=="object"?c.completed_run:null,d=c.started_at??c.last_activity_at??c.generated_at??"",f=c.sender_identity;c.state==="running"&&c.liveness!=="dead"?r.push({id:i,kind:c.kind,origin:"unknown",from_identity:f,target:l,started_at:d,running_for_ms:0,holder_liveness:c.liveness==="live"?"live":"unknown"}):c.liveness==="dead"?s.push({id:i,kind:c.kind,origin:"unknown",from_identity:f,target:l,started_at:d,age_ms:0}):u&&typeof u.ended_at=="string"&&typeof u.elapsed_ms=="number"&&o.push({id:i,kind:c.kind,origin:"unknown",from_identity:f,target:l,status:c.state==="done"?"done":"error",started_at:d,ended_at:u.ended_at,idle_ms:0,ran_ms:u.elapsed_ms,error:typeof u.error=="string"?u.error:null,parent_invocation_id:null})}return{schema_version:3,running:r,dead:s,idle:o}}async function qe(e=3e4,t={}){let n=t.reconcile===!0?["running","--json","--reconcile"]:["running","--json"],{stdout:r}=await Cee("lmctl",n,{timeout:e});return Oee(r)}function qw(e,t=Date.now()){return{schema_version:e.schema_version,running:e.running.map(n=>({...n,running_for_human:Ae(n.running_for_ms),started_human:Le(n.started_at,t)})),dead:e.dead.map(n=>({...n,age_human:Ae(n.age_ms),started_human:Le(n.started_at,t)})),idle:e.idle.map(n=>({...n,ran_human:Ae(n.ran_ms)}))}}import{readFileSync as Dee}from"node:fs";import{randomUUID as $ee}from"node:crypto";var Bw={staleThresholdMs:2*60*6e4,escalationCooldownMs:60*6e4,digestTimeoutMs:9e4,leaseTimeoutMs:10*6e4,providerQuotaBackoffMs:24*60*6e4,operatorStaleThresholdMs:6e4,operatorEscalationCooldownMs:6e4};function Mee(e){return/usage limit/i.test(e)&&/quota/i.test(e)}function Pee(e){let t=[];for(let n of e)try{t.push({row:n,content:Dee(n.prompt_file,"utf8")})}catch{continue}return t}function Uee(e){let t=e.map(({row:n,content:r})=>`--- from "${n.from_id}", queued ${n.created_ts} ---
|
|
2179
|
+
WHERE id = ? AND enabled = 1 AND revision = ? AND running_since_ts IS ?`).run(d,"ok",p,h,d,u.id,u.revision,u.running_since_ts).changes===0)return{kind:"skipped_overlap",job:it(e,t)};let g=lD(e,u,`${u.action_kind}:manual`,h,i),w={logDir:c,systemdUnitName:h,onExit:(E,y,T,v)=>{let A=E===0?"ok":"error",I=A==="ok"?null:y?Fn(y):`Command exited with code ${E} -- see ${c??ep()}/${u.id}/ for output`;try{e.prepare("UPDATE cron_jobs SET running_since_ts = NULL, running_systemd_unit = NULL, last_fire_status = ?, last_fire_error = ?, updated_at = ? WHERE id = ? AND running_since_ts = ?").run(A,I,new Date().toISOString(),u.id,p)}catch{}uD(e,g,E,y,T,v,h)}};try{o({id:u.id,action_payload:u.action_payload},w)}catch(E){dD(e,g,E);try{e.prepare("UPDATE cron_jobs SET last_fire_status = ?, last_fire_error = ?, running_since_ts = NULL, running_systemd_unit = NULL, updated_at = ? WHERE id = ? AND running_since_ts = ?").run("error",Fn(E),d,u.id,p)}catch{}throw new G("SPAWN_FAILED",`manual trigger of job ${t} failed to spawn: ${Fn(E)}`,1)}return await nD(()=>it(e,t).running_since_ts!==p,l),{kind:"fired",job:it(e,t)}}if(u.action_kind==="enqueue"){let p=JSON.parse(u.action_payload);return s(e,n,p.to,p.prompt,{from:p.from??"autopilot"}),e.prepare("UPDATE cron_jobs SET last_fired_ts = ?, last_fire_status = ?, last_fire_error = NULL, updated_at = ? WHERE id = ?").run(d,"ok",d,u.id),{kind:"fired",job:it(e,t)}}let f=JSON.stringify({kind:u.action_kind,payload:u.action_payload,provider:u.provider,model:u.model,workingDirectory:u.working_directory,escalationOwner:u.escalation_owner}),m=e.transaction(()=>{let p=e.prepare("SELECT enabled, revision FROM cron_jobs WHERE id = ?").get(u.id);if(p===void 0||p.enabled===0||p.revision!==u.revision)return null;let h=zl(e,u.id,`${u.action_kind}:manual`,f);if(h.kind==="claimed"){r.onDemand!==void 0&&xO(e,u.id,h.run.id,r.onDemand);let _=r.disableOnClaim?"enabled = 0, ":"";e.prepare(`UPDATE cron_jobs SET ${_}last_fired_ts = ?, last_fire_status = ?, last_fire_error = NULL, updated_at = ? WHERE id = ?`).run(d,"ok",d,u.id)}return h}).immediate();if(m===null)throw new G("CONFLICT",`Cron job ${t} was modified concurrently -- re-run \`cron trigger ${t}\``,5);if(m.kind==="escalation")return{kind:"blocked_escalation",job:it(e,t)};if(m.kind==="overlap")return{kind:"skipped_overlap",job:it(e,t)};try{a({db:e,job:u,run:m.run,runToken:m.token,...r.onDemand!==void 0?{onDemand:r.onDemand}:{},...r.runSpawnPrefixes!==void 0?{spawnPrefixes:r.runSpawnPrefixes}:{},...r.sessionDir!==void 0?{sessionDir:r.sessionDir}:{},...r.runTimeoutMs!==void 0?{timeoutMs:r.runTimeoutMs}:{},...r.runSeedTimeoutMs!==void 0?{seedTimeoutMs:r.runSeedTimeoutMs}:{}})}catch(p){try{Ql(e,m.run.id,`worker dispatch threw: ${Fn(p)}`),kw(e,m.run.id,{ok:!1,summary:`worker dispatch error: ${Fn(p)}`})}catch{}throw new G("SPAWN_FAILED",`manual trigger of job ${t} failed to dispatch: ${Fn(p)}`,1)}if(r.waitForCompletion===!1){let p=u;try{p=it(e,t)}catch(h){console.warn(`[triggerCronJobNow] post-dispatch getCronJob read failed for job ${t}:`,h)}return{kind:"fired",job:p,runId:m.run.id}}return await nD(()=>{let p=xt(e,m.run.id);return p.status!=="pending"&&p.status!=="running"},l),{kind:"fired",job:it(e,t),runId:m.run.id}}function Tee(e,t,n,r,s,o){if(Pa(e,t.id))return;let i=JSON.stringify({kind:t.action_kind,payload:t.action_payload,provider:t.provider,model:t.model,workingDirectory:t.working_directory,escalationOwner:t.escalation_owner}),a=e.transaction(()=>{let c=e.prepare("SELECT enabled, revision, last_checked_ts FROM cron_jobs WHERE id = ?").get(t.id);if(c===void 0||c.enabled===0||c.revision!==t.revision||c.last_checked_ts!==t.last_checked_ts)return null;let l=zl(e,t.id,t.action_kind,i);return l.kind==="claimed"&&e.prepare("UPDATE cron_jobs SET last_checked_ts = ?, last_fired_ts = ?, last_fire_status = ?, last_fire_error = NULL, updated_at = ? WHERE id = ?").run(n,n,"ok",n,t.id),l}).immediate();if(a!==null){if(a.kind==="escalation"){go(e,"UPDATE cron_jobs SET last_fire_status = ?, updated_at = ?",["blocked_escalation",n],t);return}if(a.kind==="overlap"){go(e,"UPDATE cron_jobs SET last_fire_status = ?, updated_at = ?",["skipped_overlap",n],t);return}r.push(t.title);try{o.executeRunImpl({db:e,job:t,run:a.run,runToken:a.token,...o.runSpawnPrefixes!==void 0?{spawnPrefixes:o.runSpawnPrefixes}:{},...o.sessionDir!==void 0?{sessionDir:o.sessionDir}:{},...o.runTimeoutMs!==void 0?{timeoutMs:o.runTimeoutMs}:{},...o.runSeedTimeoutMs!==void 0?{seedTimeoutMs:o.runSeedTimeoutMs}:{}})}catch(c){try{Ql(e,a.run.id,`worker dispatch threw: ${Fn(c)}`),kw(e,a.run.id,{ok:!1,summary:`worker dispatch error: ${Fn(c)}`})}catch{}try{s?.(t.id,c)}catch{}}}}function go(e,t,n,r){e.prepare(`${t} WHERE id = ? AND enabled = 1 AND revision = ? AND (last_checked_ts IS ?)`).run(...n,r.id,r.revision,r.last_checked_ts)}function fD(e,t){let n=e.transaction(()=>{it(e,t);try{e.prepare("UPDATE cron_jobs SET running_since_ts = NULL, running_systemd_unit = NULL WHERE id = ?").run(t)}catch(r){Ha(r)}return ip(e,t),it(e,t)});return ws(n)}import{execFileSync as vee}from"node:child_process";import{existsSync as See,readFileSync as mD}from"node:fs";import{homedir as pD}from"node:os";import{join as hD}from"node:path";function Wa(){return process.env.LMBEE_HEAVY_STATUS??hD(pD(),".lmbee","heavy.status")}function Ga(){return process.env.LMBEE_HEAVY_LOCK??hD(pD(),".lmbee","heavy.lock")}var Ba=class extends Error{};function bee(e){if(typeof e!="object"||e===null)return!1;let t=e;return typeof t.holder=="string"&&typeof t.pid=="number"&&typeof t.command=="string"&&typeof t.startedAt=="string"}function Aee(e){let t;try{t=mD(e,"utf8")}catch{return null}try{let n=JSON.parse(t);return bee(n)?n:null}catch{return null}}function Iee(e,t){return e===null||t===null?e===t:e.holder===t.holder&&e.pid===t.pid&&e.command===t.command&&e.startedAt===t.startedAt}function kee(e){try{let t=mD(`/proc/${e}/stat`,"utf8");return t.slice(t.lastIndexOf(")")+2).trim().split(/\s+/)[0]==="Z"}catch{return!1}}function Ree(e){try{process.kill(e,0)}catch(t){return t.code==="EPERM"}return!kee(e)}function Nee(e,t=vee){if(!See(e))return!1;try{return t("flock",["-n",e,"-c","true"],{stdio:"ignore"}),!1}catch(n){if((n&&typeof n=="object"?n.status:void 0)===1)return!0;let s=n instanceof Error?n.message:String(n);throw new Ba(`heavy-lock probe failed (flock did not run or exited abnormally): ${s}`)}}function Hw(e=Wa(),t=Ga(),n=Aee,r=Nee,s=Ree){for(let o=0;o<3;o++){let i=n(e),a=r(t),c=n(e);if(i!==null&&Iee(i,c)){if(!a)return{held:!1,holder:null};if(s(i.pid))return{held:!0,holder:i}}}return{held:r(t),holder:null}}function vn(e=Wa(),t=Ga(),n=Hw,r){try{return n(e,t)}catch(s){if(!(s instanceof Ba))throw s;return r?.(s),{held:!0,holder:null}}}var dp={observedAt:null,report:null,lastErrorAt:null,lastError:null};function _D(e,t){dp={observedAt:t,report:e,lastErrorAt:null,lastError:null}}function gD(e,t){dp={...dp,lastErrorAt:t,lastError:e}}function ou(){return dp}import{execFile as xee}from"node:child_process";import{promisify as Lee}from"node:util";function Ae(e){if(!Number.isFinite(e)||e<0)return"?";if(e<1e3)return"0s";if(e<6e4)return`${Math.floor(e/1e3)}s`;if(e<36e5)return`${Math.floor(e/6e4)}m`;if(e<864e5*2)return`${Math.floor(e/36e5)}h`;let t=Math.floor(e/864e5),n=Math.floor(e%864e5/36e5);return n===0?`${t}d`:`${t}d ${n}h`}function Le(e,t=Date.now()){let n=Date.parse(e);if(Number.isNaN(n))return"?";let r=t-n;return r<6e4?"just now":`${Ae(r)} ago`}var Cee=Lee(xee);function Oee(e){let t=JSON.parse(e),n=typeof t=="object"&&t!==null?t.sessions:void 0;if(typeof t!="object"||t===null||typeof t.generated_at!="string"||!Array.isArray(n))throw new Error("unexpected `lmctl running --json` shape: missing generated_at or sessions array");let r=Date.parse(t.generated_at),s=[],o=[],i=[];for(let a of n){if(typeof a!="object"||a===null||Array.isArray(a))throw new Error("unexpected `lmctl running --json` shape: malformed sessions element");let c=a;if(typeof c.team_path!="string"||typeof c.member!="string"||typeof c.sender_identity!="string"||typeof c.started_at!="string"&&c.started_at!==null||typeof c.last_activity_at!="string"&&c.last_activity_at!==null||!["chat","exec"].includes(String(c.kind))||!["running","done","error"].includes(String(c.state)))throw new Error("unexpected `lmctl running --json` shape: malformed session identity or state fields");let l=`${c.team_path}:${c.member}`,u=c.completed_run&&typeof c.completed_run=="object"?c.completed_run:null,d=c.started_at??c.last_activity_at??t.generated_at,f=c.sender_identity;c.state==="running"&&c.liveness!=="dead"?s.push({kind:c.kind,origin:"unknown",from_identity:f,target:l,started_at:d,running_for_ms:Math.max(0,r-Date.parse(d)),holder_liveness:c.liveness==="live"?"live":"unknown"}):c.liveness==="dead"?o.push({kind:c.kind,origin:"unknown",from_identity:f,target:l,started_at:d,age_ms:Math.max(0,r-Date.parse(d))}):u&&typeof u.ended_at=="string"&&typeof u.elapsed_ms=="number"&&i.push({kind:c.kind,origin:"unknown",from_identity:f,target:l,status:c.state==="done"?"done":"error",started_at:d,ended_at:u.ended_at,idle_ms:Math.max(0,r-Date.parse(u.ended_at)),ran_ms:u.elapsed_ms,error:typeof u.error=="string"?u.error:null,parent_invocation_id:null})}return{schema_version:3,running:s,dead:o,idle:i}}async function qe(e=3e4,t={}){let n=t.reconcile===!0?["running","--json","--reconcile"]:["running","--json"],{stdout:r}=await Cee("lmctl",n,{timeout:e});return Oee(r)}function qw(e,t=Date.now()){return{schema_version:e.schema_version,running:e.running.map(n=>({...n,running_for_human:Ae(n.running_for_ms),started_human:Le(n.started_at,t)})),dead:e.dead.map(n=>({...n,age_human:Ae(n.age_ms),started_human:Le(n.started_at,t)})),idle:e.idle.map(n=>({...n,ran_human:Ae(n.ran_ms)}))}}import{readFileSync as Dee}from"node:fs";import{randomUUID as $ee}from"node:crypto";var Bw={staleThresholdMs:2*60*6e4,escalationCooldownMs:60*6e4,digestTimeoutMs:9e4,leaseTimeoutMs:10*6e4,providerQuotaBackoffMs:24*60*6e4,operatorStaleThresholdMs:6e4,operatorEscalationCooldownMs:6e4};function Mee(e){return/usage limit/i.test(e)&&/quota/i.test(e)}function Pee(e){let t=[];for(let n of e)try{t.push({row:n,content:Dee(n.prompt_file,"utf8")})}catch{continue}return t}function Uee(e){let t=e.map(({row:n,content:r})=>`--- from "${n.from_id}", queued ${n.created_ts} ---
|
|
2180
2180
|
${r}`);return`You have ${e.length} queued message(s) that couldn't be delivered automatically (presence-gated for a while) -- bundled here as a digest:
|
|
2181
2181
|
|
|
2182
2182
|
${t.join(`
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@lmctl-ai/lmctl",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.437",
|
|
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",
|