@aoagents/ao-web 0.7.0 → 0.8.0
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/.next/BUILD_ID +1 -1
- package/.next/app-build-manifest.json +138 -138
- package/.next/app-path-routes-manifest.json +13 -13
- package/.next/build-manifest.json +3 -3
- package/.next/prerender-manifest.json +9 -9
- package/.next/required-server-files.json +3 -3
- package/.next/server/app/_not-found/page.js +2 -2
- package/.next/server/app/_not-found/page.js.nft.json +1 -1
- package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/.next/server/app/_not-found.html +1 -1
- package/.next/server/app/_not-found.rsc +6 -6
- package/.next/server/app/api/backlog/route.js +1 -1
- package/.next/server/app/api/backlog/route.js.nft.json +1 -1
- package/.next/server/app/api/backlog/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/browse-directory/route.js +1 -1
- package/.next/server/app/api/browse-directory/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/filesystem/browse/route.js +1 -1
- package/.next/server/app/api/filesystem/browse/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/issues/route.js +1 -1
- package/.next/server/app/api/issues/route.js.nft.json +1 -1
- package/.next/server/app/api/issues/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/observability/route.js +1 -1
- package/.next/server/app/api/observability/route.js.nft.json +1 -1
- package/.next/server/app/api/observability/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/orchestrators/route.js +1 -1
- package/.next/server/app/api/orchestrators/route.js.nft.json +1 -1
- package/.next/server/app/api/orchestrators/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/projects/[id]/route.js +2 -2
- package/.next/server/app/api/projects/[id]/route.js.nft.json +1 -1
- package/.next/server/app/api/projects/[id]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/projects/reload/route.js +1 -1
- package/.next/server/app/api/projects/reload/route.js.nft.json +1 -1
- package/.next/server/app/api/projects/reload/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/projects/route.js +1 -1
- package/.next/server/app/api/projects/route.js.nft.json +1 -1
- package/.next/server/app/api/projects/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/prs/[id]/merge/route.js +1 -1
- package/.next/server/app/api/prs/[id]/merge/route.js.nft.json +1 -1
- package/.next/server/app/api/prs/[id]/merge/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/runtime/terminal/route.js +1 -1
- package/.next/server/app/api/runtime/terminal/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/sessions/[id]/kill/route.js +1 -1
- package/.next/server/app/api/sessions/[id]/kill/route.js.nft.json +1 -1
- package/.next/server/app/api/sessions/[id]/kill/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/sessions/[id]/message/route.js +1 -1
- package/.next/server/app/api/sessions/[id]/message/route.js.nft.json +1 -1
- package/.next/server/app/api/sessions/[id]/message/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/sessions/[id]/remap/route.js +1 -1
- package/.next/server/app/api/sessions/[id]/remap/route.js.nft.json +1 -1
- package/.next/server/app/api/sessions/[id]/remap/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/sessions/[id]/restore/route.js +1 -1
- package/.next/server/app/api/sessions/[id]/restore/route.js.nft.json +1 -1
- package/.next/server/app/api/sessions/[id]/restore/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/sessions/[id]/route.js +1 -1
- package/.next/server/app/api/sessions/[id]/route.js.nft.json +1 -1
- package/.next/server/app/api/sessions/[id]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/sessions/[id]/send/route.js +1 -1
- package/.next/server/app/api/sessions/[id]/send/route.js.nft.json +1 -1
- package/.next/server/app/api/sessions/[id]/send/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/sessions/patches/route.js +1 -1
- package/.next/server/app/api/sessions/patches/route.js.nft.json +1 -1
- package/.next/server/app/api/sessions/patches/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/sessions/route.js +1 -1
- package/.next/server/app/api/sessions/route.js.nft.json +1 -1
- package/.next/server/app/api/sessions/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/setup-labels/route.js +1 -1
- package/.next/server/app/api/setup-labels/route.js.nft.json +1 -1
- package/.next/server/app/api/setup-labels/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/spawn/route.js +1 -1
- package/.next/server/app/api/spawn/route.js.nft.json +1 -1
- package/.next/server/app/api/spawn/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/update/route.js +1 -1
- package/.next/server/app/api/update/route.js.nft.json +1 -1
- package/.next/server/app/api/update/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/verify/route.js +1 -1
- package/.next/server/app/api/verify/route.js.nft.json +1 -1
- package/.next/server/app/api/verify/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/version/route.js +1 -1
- package/.next/server/app/api/version/route.js.nft.json +1 -1
- package/.next/server/app/api/version/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/webhooks/[...slug]/route.js +1 -1
- package/.next/server/app/api/webhooks/[...slug]/route.js.nft.json +1 -1
- package/.next/server/app/api/webhooks/[...slug]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/apple-icon/route.js +1 -1
- package/.next/server/app/apple-icon/route.js.nft.json +1 -1
- package/.next/server/app/apple-icon/route_client-reference-manifest.js +1 -1
- package/.next/server/app/dev/terminal-test/page.js +3 -3
- package/.next/server/app/dev/terminal-test/page.js.nft.json +1 -1
- package/.next/server/app/dev/terminal-test/page_client-reference-manifest.js +1 -1
- package/.next/server/app/dev/terminal-test.html +1 -1
- package/.next/server/app/dev/terminal-test.rsc +7 -7
- package/.next/server/app/icon/route.js +1 -1
- package/.next/server/app/icon/route.js.nft.json +1 -1
- package/.next/server/app/icon/route_client-reference-manifest.js +1 -1
- package/.next/server/app/icon-192/route.js +1 -1
- package/.next/server/app/icon-192/route.js.nft.json +1 -1
- package/.next/server/app/icon-192/route_client-reference-manifest.js +1 -1
- package/.next/server/app/icon-512/route.js +1 -1
- package/.next/server/app/icon-512/route.js.nft.json +1 -1
- package/.next/server/app/icon-512/route_client-reference-manifest.js +1 -1
- package/.next/server/app/manifest.webmanifest/route.js +2 -2
- package/.next/server/app/manifest.webmanifest/route_client-reference-manifest.js +1 -1
- package/.next/server/app/orchestrators/page.js +2 -2
- package/.next/server/app/orchestrators/page.js.nft.json +1 -1
- package/.next/server/app/orchestrators/page_client-reference-manifest.js +1 -1
- package/.next/server/app/page.js +2 -2
- package/.next/server/app/page.js.nft.json +1 -1
- package/.next/server/app/page_client-reference-manifest.js +1 -1
- package/.next/server/app/projects/[projectId]/page.js +2 -2
- package/.next/server/app/projects/[projectId]/page.js.nft.json +1 -1
- package/.next/server/app/projects/[projectId]/page_client-reference-manifest.js +1 -1
- package/.next/server/app/projects/[projectId]/sessions/[id]/page.js +2 -2
- package/.next/server/app/projects/[projectId]/sessions/[id]/page.js.nft.json +1 -1
- package/.next/server/app/projects/[projectId]/sessions/[id]/page_client-reference-manifest.js +1 -1
- package/.next/server/app/projects/[projectId]/settings/page.js +2 -2
- package/.next/server/app/projects/[projectId]/settings/page.js.nft.json +1 -1
- package/.next/server/app/projects/[projectId]/settings/page_client-reference-manifest.js +1 -1
- package/.next/server/app/prs/page.js +2 -2
- package/.next/server/app/prs/page.js.nft.json +1 -1
- package/.next/server/app/prs/page_client-reference-manifest.js +1 -1
- package/.next/server/app/sessions/[id]/page.js +2 -2
- package/.next/server/app/sessions/[id]/page.js.nft.json +1 -1
- package/.next/server/app/sessions/[id]/page_client-reference-manifest.js +1 -1
- package/.next/server/app/test-direct/page.js +2 -2
- package/.next/server/app/test-direct/page.js.nft.json +1 -1
- package/.next/server/app/test-direct/page_client-reference-manifest.js +1 -1
- package/.next/server/app/test-direct.html +1 -1
- package/.next/server/app/test-direct.rsc +7 -7
- package/.next/server/app-paths-manifest.json +13 -13
- package/.next/server/chunks/1876.js +2 -2
- package/.next/server/chunks/4520.js +1 -1
- package/.next/server/chunks/6013.js +8 -8
- package/.next/server/chunks/6848.js +1 -1
- package/.next/server/chunks/7173.js +1 -1
- package/.next/server/chunks/7227.js +3 -3
- package/.next/server/chunks/9291.js +3 -0
- package/.next/server/middleware-build-manifest.js +1 -1
- package/.next/server/pages/404.html +1 -1
- package/.next/server/pages/500.html +1 -1
- package/.next/server/server-reference-manifest.json +1 -1
- package/.next/static/chunks/app/dev/terminal-test/page-a6f86436c4a06eeb.js +1 -0
- package/.next/static/chunks/app/{error-65c526052680c0dc.js → error-d4f7c3a8dd722e8f.js} +1 -1
- package/.next/static/chunks/app/{global-error-63dcb797b2c3ee60.js → global-error-cb3a4148c223622a.js} +1 -1
- package/.next/static/chunks/app/layout-e4c02836878bea2d.js +1 -0
- package/.next/static/chunks/app/{not-found-a693bed1f9e1893f.js → not-found-982c28ba7f6492be.js} +1 -1
- package/.next/static/chunks/app/orchestrators/{page-376a92db51deb112.js → page-11a10c8b0bea320d.js} +1 -1
- package/.next/static/chunks/app/page-31df8f5f0d079eba.js +1 -0
- package/.next/static/chunks/app/projects/[projectId]/page-f076731a5810b255.js +1 -0
- package/.next/static/chunks/app/projects/[projectId]/sessions/[id]/page-7e46ee5c902c28aa.js +1 -0
- package/.next/static/chunks/app/projects/[projectId]/settings/{page-11facc471a63de50.js → page-40047db90c406c9e.js} +1 -1
- package/.next/static/chunks/app/prs/page-5015d39fb7984d26.js +1 -0
- package/.next/static/chunks/app/sessions/[id]/{error-df65e7b626bbb713.js → error-147fb962bda03d23.js} +1 -1
- package/.next/static/chunks/app/sessions/[id]/{not-found-a693bed1f9e1893f.js → not-found-982c28ba7f6492be.js} +1 -1
- package/.next/static/chunks/app/sessions/[id]/page-0a74680de719ca58.js +1 -0
- package/.next/static/chunks/app/test-direct/page-cbca94d9a5985aea.js +1 -0
- package/.next/static/chunks/{main-app-decbc53736801215.js → main-app-113c48dd1c080c52.js} +1 -1
- package/package.json +13 -13
- package/.next/server/chunks/303.js +0 -3
- package/.next/static/chunks/app/dev/terminal-test/page-9aa423dfd54c8325.js +0 -1
- package/.next/static/chunks/app/layout-36ab0168ddb22083.js +0 -1
- package/.next/static/chunks/app/page-587d546e62c0796f.js +0 -1
- package/.next/static/chunks/app/projects/[projectId]/page-bd8fc2a1decb649d.js +0 -1
- package/.next/static/chunks/app/projects/[projectId]/sessions/[id]/page-bd33f6ffda513080.js +0 -1
- package/.next/static/chunks/app/prs/page-f34f66ad51106080.js +0 -1
- package/.next/static/chunks/app/sessions/[id]/page-3ea4aa79275ea449.js +0 -1
- package/.next/static/chunks/app/test-direct/page-edfc701a9300105b.js +0 -1
- /package/.next/static/{9nr0fNWbZcuWTqhM2HhrH → 9ARsRA8WlFgsAl-7NPrHh}/_buildManifest.js +0 -0
- /package/.next/static/{9nr0fNWbZcuWTqhM2HhrH → 9ARsRA8WlFgsAl-7NPrHh}/_ssgManifest.js +0 -0
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
exports.id=6013,exports.ids=[6013],exports.modules={15407:(a,b,c)=>{"use strict";c.d(b,{Ag:()=>u,CK:()=>t,CM:()=>h,D8:()=>s,DD:()=>p,Fx:()=>r,N_:()=>j,PE:()=>e,SB:()=>g,U1:()=>o,V1:()=>f,b8:()=>q,bz:()=>n,c5:()=>w,kw:()=>v,qX:()=>l,tT:()=>m,u3:()=>d,zi:()=>k});let d={ACTIVE:"active",READY:"ready",IDLE:"idle",WAITING_INPUT:"waiting_input",BLOCKED:"blocked",EXITED:"exited"},e=3e5,f=3e4,g={SPAWNING:"spawning",WORKING:"working",DETECTING:"detecting",PR_OPEN:"pr_open",CI_FAILED:"ci_failed",REVIEW_PENDING:"review_pending",CHANGES_REQUESTED:"changes_requested",APPROVED:"approved",MERGEABLE:"mergeable",MERGED:"merged",CLEANUP:"cleanup",NEEDS_INPUT:"needs_input",STUCK:"stuck",ERRORED:"errored",IDLE:"idle",KILLED:"killed",DONE:"done",TERMINATED:"terminated"},h=new Set(["killed","terminated","done","cleanup","errored","merged"]),i=new Set(["exited"]),j=new Set([]);function k(a){return a.lifecycle?"done"===a.lifecycle.session.state||"terminated"===a.lifecycle.session.state||"merged"===a.lifecycle.pr.state||"missing"===a.lifecycle.runtime.state||"exited"===a.lifecycle.runtime.state:h.has(a.status)||null!==a.activity&&i.has(a.activity)}function l(a){return a.lifecycle,k(a)&&!j.has(a.status)}function m(a,b,c){if(a.metadata?.role==="orchestrator")return!0;if(!b)return!1;let d=b.replace(/[.*+?^${}()|[\]\\]/g,"\\$&");if(a.id===`${b}-orchestrator`)return!0;if(!RegExp(`^${d}-orchestrator-\\d+$`).test(a.id))return!1;if(c){for(let d of c)if(d!==b&&RegExp(`^${d.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}-\\d+$`).test(a.id))return!1}return!0}let n={OPEN:"open",MERGED:"merged",CLOSED:"closed"},o={PENDING:"pending",PASSING:"passing",FAILING:"failing",NONE:"none"};function p(a){if(a)return"permissionless"!==a&&"default"!==a&&"auto-edit"!==a&&"suggest"!==a?"skip"===a?"permissionless":void 0:a}function q(a){return"function"==typeof a.remap}function r(a){if(!a||"object"!=typeof a)return!1;let b=a.message?.toLowerCase()||"";return b.includes("issue")&&(b.includes("not found")||b.includes("does not exist"))||b.includes("no issue found")||b.includes("could not find issue")||b.includes("could not resolve to an issue")||b.includes("no issue with identifier")||b.includes("invalid issue format")}class s extends Error{constructor(a,b){super(`Session ${a} cannot be restored: ${b}`),this.sessionId=a,this.reason=b,this.name="SessionNotRestorableError"}}class t extends Error{constructor(a,b){super(`Workspace missing at ${a}${b?`: ${b}`:""}`),this.path=a,this.detail=b,this.name="WorkspaceMissingError"}}class u extends Error{constructor(a){super(`Session not found: ${a}`),this.sessionId=a,this.name="SessionNotFoundError"}}class v extends Error{constructor(a){super(a??"No agent-orchestrator.yaml found. Run `ao start` to create one."),this.name="ConfigNotFoundError"}}class w extends Error{constructor(a,b){super(b),this.projectId=a,this.name="ProjectResolveError"}}},26785:()=>{},32285:(a,b,c)=>{"use strict";c.d(b,{u3Y:()=>d.u3,U10:()=>d.U1,kw3:()=>d.kw,V1$:()=>d.V1,PES:()=>d.PE,mUH:()=>S,Agm:()=>d.Ag,D83:()=>d.D8,CMu:()=>d.CM,CK3:()=>d.CK,HrC:()=>bK,Bmx:()=>c5,Gfg:()=>cK,C1z:()=>c0,RaB:()=>aJ,SkT:()=>cL,Qum:()=>ct,My0:()=>E,sa4:()=>bN,vQK:()=>dj,g9C:()=>I,yAg:()=>c1,ccZ:()=>l,Vo2:()=>c6,mKg:()=>bQ,NoB:()=>J,zFo:()=>dq,RxI:()=>bO,XqS:()=>n,IXO:()=>o,ry1:()=>z,getWindowsPtyHosts:()=>dx,Gfo:()=>c9,b8Q:()=>d.b8,tTz:()=>d.tT,zi:()=>d.zi,$oG:()=>dm,uFH:()=>v,g8K:()=>A,Z9L:()=>aB,G_c:()=>T,rSb:()=>V,TF_:()=>cv,m5Y:()=>ac,DD3:()=>d.DD,DkI:()=>bo,Ahw:()=>c4,XIc:()=>b_,giR:()=>cM,wxm:()=>dp,JyZ:()=>c7,t9S:()=>aa,YEV:()=>dv,Vtt:()=>Y,fzr:()=>b0,J06:()=>ce,kct:()=>bZ,cv0:()=>dr,unregisterWindowsPtyHost:()=>dw,D58:()=>a7,inW:()=>X});var d=c(15407),e=c(73024),f=c(77598),g=c(76760),h=c(48161),i=c(34446),j=c(20642),k=c(89981);function l(a){if(a.length<=4)return a.toLowerCase();let b=a.match(/[A-Z]/g);if(b&&b.length>1)return b.join("").toLowerCase();if(a.includes("-")||a.includes("_")){let b=a.includes("-")?"-":"_";return a.split(b).map(a=>a[0]).join("").toLowerCase()}return a.slice(0,3).toLowerCase()}let m=/^[a-zA-Z0-9][a-zA-Z0-9._-]*$/;function n(a){if(!a||"."===a||".."===a||a.length>128||!m.test(a))throw Error(`Unsafe project ID: "${a}"`);return(0,g.join)(r(),"projects",a)}function o(a){return(0,g.join)(n(a),"sessions")}function p(a){return(0,g.join)(n(a),"worktrees")}function q(a){return a.startsWith("~/")?(0,g.join)((0,h.homedir)(),a.slice(2)):a}function r(){return q("~/.agent-orchestrator")}var s=c(31421),t=c(57975);let u=(0,t.promisify)(s.execFile);function v(){return"win32"===process.platform}function w(){return v()?"process":"tmux"}let x=null;function y(a){let b=process.env.PATHEXT?.split(";").filter(Boolean)??[".COM",".EXE",".BAT",".CMD"];for(let c of(process.env.PATH??"").split(";").filter(Boolean)){let d=c.endsWith("\\")||c.endsWith("/")?c.slice(0,-1):c;for(let c of[...b,""]){let b=`${d}\\${a}${c}`;if((0,e.existsSync)(b))return b}}return null}function z(){return x||(x=v()?function(){let a=process.env.AO_SHELL;if(a)return{cmd:a,args:function(a){let b=a.replace(/\\/g,"/").split("/").pop().toLowerCase().replace(/\.exe$/,"");return"cmd"===b?a=>["/c",a]:"bash"===b||"sh"===b||"zsh"===b||"dash"===b?a=>["-c",a]:a=>["-Command",a]}(a)};let b=y("pwsh");if(b)return{cmd:b,args:a=>["-Command",a]};let c=process.env.SystemRoot||"C:\\Windows",d=`${c}\\System32\\WindowsPowerShell\\v1.0\\powershell.exe`;if((0,e.existsSync)(d))return{cmd:d,args:a=>["-Command",a]};let f=y("powershell");return f?{cmd:f,args:a=>["-Command",a]}:{cmd:process.env.ComSpec||"cmd.exe",args:a=>["/c",a]}}():{cmd:"/bin/sh",args:a=>["-c",a]})}async function A(a,b="SIGTERM"){if(!(a<=0))if(v()){let b=["/T","/F","/PID",String(a)];try{await u("taskkill",b,{windowsHide:!0})}catch{}}else try{process.kill(-a,b)}catch{try{process.kill(a,b)}catch{}}}let B=10*!!v();function C(a,b){let c=`${a}.tmp.${process.pid}.${Date.now()}`;(0,e.writeFileSync)(c,b,"utf-8");try{!function(a,b){let c;for(let d=0;d<=B;d++)try{(0,e.renameSync)(a,b);return}catch(b){c=b;let a=b?.code;if("EPERM"!==a&&"EACCES"!==a&&"EBUSY"!==a)throw b;if(d===B)break}throw c}(c,a)}catch(a){try{(0,e.unlinkSync)(c)}catch{}throw a}}function D(a){let b=a.toLowerCase();return"github.com"===b||b.endsWith(".github.com")?"github":"gitlab.com"===b||b.endsWith(".gitlab.com")?"gitlab":"bitbucket.org"===b||b.endsWith(".bitbucket.org")||b.endsWith(".bitbucket.com")?"bitbucket":"unknown"}function E(a){let b=(0,g.join)(a,".git","HEAD");if((0,e.existsSync)(b)){let c=(0,e.readFileSync)(b,"utf-8").trim().match(/^ref: refs\/heads\/(.+)$/);if(c){for(let b of["main","master","next","develop"]){let c=(0,g.join)(a,".git","refs","remotes","origin",b),d=(0,g.join)(a,".git","packed-refs");if((0,e.existsSync)(c)||(0,e.existsSync)(d)&&(0,e.readFileSync)(d,"utf-8").includes(`refs/remotes/origin/${b}`))return b}return c[1]}}return"main"}function F(a,b,c={}){let d=c.timeoutMs??1e4,f=c.staleMs??6e4;(0,e.mkdirSync)((0,g.dirname)(a),{recursive:!0});let h=Date.now()+d,i=null,j=10;for(;null===i;)try{i=(0,e.openSync)(a,"wx")}catch(b){var k;if("EEXIST"!==b.code)throw Error(`Failed to acquire file lock: ${a}`,{cause:b});try{let b=(0,e.statSync)(a);if(Date.now()-b.mtimeMs>f){(0,e.rmSync)(a,{force:!0});continue}}catch{continue}if(Date.now()>h)throw Error(`Timed out waiting for file lock: ${a}`,{cause:b});k=j,Atomics.wait(new Int32Array(new SharedArrayBuffer(4)),0,0,k),j=Math.min(2*j,250)}try{return b()}finally{try{(0,e.closeSync)(i)}catch{}try{(0,e.rmSync)(a,{force:!0})}catch{}}}function G(a){return a.replace(/\.git$/i,"")}function H(a){return"/"===a?"":a.replace(/\/+$/,"")}function I(a,b){let c=(0,g.resolve)(a),d=(0,g.basename)(c).toLowerCase().replace(/[^a-z0-9_-]/g,"-").replace(/^[^a-z0-9]/,"x").replace(/-+/g,"-").slice(0,30),e=`${c}:${b??""}`,h=(0,f.createHash)("sha256").update(e).digest("hex").slice(0,10);return`${d}_${h}`}function J(){if(process.env.AO_GLOBAL_CONFIG)return(0,g.resolve)(process.env.AO_GLOBAL_CONFIG);let a=process.env.XDG_CONFIG_HOME;return a?(0,g.join)(a,"agent-orchestrator","config.yaml"):(0,g.join)((0,h.homedir)(),".agent-orchestrator","config.yaml")}let K=k.Ik({owner:k.Yj(),name:k.Yj(),platform:k.k5(["github","gitlab","bitbucket"]),originUrl:k.Yj()}),L=new Set(["projectId","path","repo","defaultBranch","source","registeredAt","displayName","sessionPrefix","storageKey"]),M=["agent-orchestrator.yaml","agent-orchestrator.yml"],N=new Set(["repo","defaultBranch","originUrl","projectId","path","storageKey"]),O=k.Ik({projectId:k.Yj().optional(),path:k.Yj(),repo:K.optional(),defaultBranch:k.Yj().optional(),source:k.Yj().optional(),registeredAt:k.ai().optional(),displayName:k.Yj().optional(),sessionPrefix:k.Yj().optional(),storageKey:k.Yj().optional()}),P=k.k5(["stable","nightly","manual"]),Q=k.k5(["git","npm-global","pnpm-global","bun-global","homebrew","unknown"]),R=k.Ik({port:k.ai().default(3e3),terminalPort:k.ai().optional(),directTerminalPort:k.ai().optional(),readyThresholdMs:k.ai().nonnegative().default(3e5),updateChannel:P.optional().catch(void 0),installMethod:Q.optional().catch(void 0),defaults:k.Ik({runtime:k.Yj().default(()=>w()),agent:k.Yj().default("claude-code"),workspace:k.Yj().default("worktree"),notifiers:k.YO(k.Yj()).default(["composio","desktop"]),orchestrator:k.Ik({agent:k.Yj().optional()}).optional(),worker:k.Ik({agent:k.Yj().optional()}).optional()}).default({}),projects:k.g1(O).default({}),projectOrder:k.YO(k.Yj()).optional(),notifiers:k.g1(k.Ik({plugin:k.Yj()}).passthrough()).default({}),notificationRouting:k.g1(k.YO(k.Yj())).default({urgent:["desktop","composio"],action:["desktop","composio"],warning:["composio"],info:["composio"]}),reactions:k.g1(k.Ik({}).passthrough()).default({})}).passthrough(),S=k.Ik({repo:k.Yj().optional(),defaultBranch:k.Yj().optional(),runtime:k.Yj().optional(),agent:k.Yj().optional(),workspace:k.Yj().optional(),tracker:k.Ik({plugin:k.Yj()}).passthrough().optional(),scm:k.Ik({plugin:k.Yj(),webhook:k.Ik({enabled:k.zM().optional(),path:k.Yj().optional(),secretEnvVar:k.Yj().optional(),signatureHeader:k.Yj().optional(),eventHeader:k.Yj().optional(),deliveryHeader:k.Yj().optional(),maxBodyBytes:k.ai().optional()}).optional()}).passthrough().optional(),symlinks:k.YO(k.Yj()).optional(),postCreate:k.YO(k.Yj()).optional(),agentConfig:k.Ik({permissions:k.k5(["permissionless","default","auto-edit","suggest","skip"]).optional(),model:k.Yj().optional(),orchestratorModel:k.Yj().optional()}).passthrough().optional(),orchestrator:k.Ik({agent:k.Yj().optional(),agentConfig:k.Ik({}).passthrough().optional()}).optional(),worker:k.Ik({agent:k.Yj().optional(),agentConfig:k.Ik({}).passthrough().optional()}).optional(),reactions:k.g1(k.Ik({}).passthrough()).optional(),agentRules:k.Yj().optional(),agentRulesFile:k.Yj().optional(),orchestratorRules:k.Yj().optional(),orchestratorSessionStrategy:k.k5(["reuse","delete","ignore","delete-new","ignore-new","kill-previous"]).optional(),opencodeIssueSessionStrategy:k.k5(["reuse","delete","ignore"]).optional(),decomposer:k.Ik({}).passthrough().optional()}).passthrough();function T(a,b={}){let c=a??J();if(!(0,e.existsSync)(c))return null;let{parsed:f,migrationSummary:i}=function(a,b){let c=af(a);if(!c)return{parsed:null,migrationSummary:null};if(!ae(c).changed)return{parsed:c,migrationSummary:null};let d=null,e=()=>{let b=af(a);if(!b){c=null;return}let e=ae(b);c=b,e.changed&&(d=function(a){if(0===a.strippedProjects.length)return"[ao] migrated legacy project registry fields in global config";let b=a.strippedProjects.reduce((a,b)=>a+b.strippedFieldCount,0),c=a.strippedProjects.map(a=>`${a.projectId} (${a.strippedFieldCount})`).join(", ");return`[ao] stripped ${b} legacy project registry fields from ${a.strippedProjects.length} project${1===a.strippedProjects.length?"":"s"}: ${c}`}(e),U(R.parse(b),a))};if(b.alreadyLocked)e();else F(`${a}.lock`,e);return{parsed:c,migrationSummary:d}}(c,b);if(!f)return null;i&&console.info(i);let j=R.parse(f);for(let[a,b]of Object.entries(j.projects))b.path=function(a,b){if("~"===b)return(0,h.homedir)();if(b.startsWith("~/")){let c=(0,h.homedir)(),e=(0,g.resolve)(c,b.slice(2));if(!function(a,b){let c=(0,g.relative)(a,b);return""===c||!c.startsWith("..")&&!c.startsWith(`..${g.sep}`)}(c,e))throw new d.c5(a,`Project path "${b}" escapes the home directory and cannot be loaded from the global registry.`);return e}return(0,g.resolve)(b)}(a,b.path);return j}function U(a,b){let c=b??J(),d=(0,g.dirname)(c);(0,e.mkdirSync)(d,{recursive:!0}),C(c,(0,i.As)(a,{indent:2}))}function V(a){for(let b of M.map(b=>(0,g.join)(a,b))){let a;if((0,e.existsSync)(b)){try{let c=(0,e.readFileSync)(b,"utf-8");a=(0,i.qg)(c)}catch(a){return{kind:"malformed",path:b,error:`Failed to parse local config at ${b}: ${a instanceof Error?a.message:String(a)}`}}if(!a||"object"!=typeof a)return{kind:"invalid",path:b,error:`Local config at ${b} must parse to an object`};if("projects"in a)return{kind:"old-format",path:b,error:`Local config at ${b} still uses a wrapped projects: format`};try{return{kind:"loaded",path:b,config:S.parse(a)}}catch(a){return{kind:"invalid",path:b,error:`Local config at ${b} failed validation: ${a instanceof Error?a.message:String(a)}`}}}}return{kind:"missing"}}function W(a){let b={...a};for(let a of N)Reflect.deleteProperty(b,a);return b}function X(a,b,c=function(a){for(let b of M){let c=(0,g.join)(a,b);if((0,e.existsSync)(c))return c}return(0,g.join)(a,M[0])}(a)){(0,e.mkdirSync)((0,g.dirname)(c),{recursive:!0});let d=S.parse(W(b));return C(c,(0,i.As)(d,{indent:2})),c}function Y(a,b){let c=V(b);if("old-format"!==c.kind||!c.path)throw Error(`No wrapped local config found for project "${a}" at ${b}`);let d=c.path,f=(0,e.readFileSync)(d,"utf-8"),g=(0,i.qg)(f);if(!g||"object"!=typeof g||!ab(g))throw Error(`Local config at ${d} is not a wrapped old-format config.`);let h=g.projects??{},j=h[a];if(!j||"object"!=typeof j){let a=Object.values(h).filter(a=>null!=a&&"object"==typeof a);j=1===a.length?a[0]:void 0}if(!j||"object"!=typeof j)throw Error(`Wrapped local config at ${d} does not contain project "${a}".`);let{name:k,path:l,sessionPrefix:m,projectId:n,source:o,registeredAt:p,displayName:q,...r}=j;X(b,r,d)}function Z(a){if(!a)return;let b=function(a){let b,c=a.trim(),d=c.match(/^git@([^:]+):(.+)$/);if(d){let a=d[1].toLowerCase(),b=G(H(d[2]));return`https://${a}/${b}`}let e=c.replace(/^[A-Za-z][A-Za-z0-9+.-]*:\/\//,a=>a.toLowerCase());try{b=new URL(e)}catch{throw Error(`Invalid origin URL: ${a}`)}let f=b.hostname.toLowerCase(),g=G(H(b.pathname));return`https://${f}${g}`}(a);if(b.startsWith("https://"))try{let a=new URL(b),c=a.pathname.split("/").filter(Boolean);if(c.length<2)return;let d=c[c.length-1],e=c.slice(0,-1).join("/"),f=D(a.host);if("unknown"===f)return;return{owner:e,name:d,platform:f,originUrl:b}}catch{return}}function $(a){if("string"!=typeof a)return;let b=a.trim();if(!b)return;if(b.startsWith("http://")||b.startsWith("https://")||b.startsWith("git@"))return Z(b);let c=b.split("/").filter(Boolean);if(2===c.length)return Z(`https://github.com/${c[0]}/${c[1]}`);if(c.length>=3&&c[0].includes(".")){let a=c[0];if("unknown"===D(a))return;let b=c.slice(1,-1).join("/"),d=c[c.length-1];return Z(`https://${a}/${b}/${d}`)}}function _(a,b,c){for(let[d,e]of Object.entries(a.projects))if(d!==c&&(e.sessionPrefix??l((0,g.basename)(e.path??d)))===b)return d;return null}function aa(a,b,c,d,f,h){let i="string"==typeof f?f:h??J(),j=(0,g.resolve)(c),k=(0,e.realpathSync)((0,g.resolve)(c)),m=function(a){let b=function(a){let b=(0,g.join)(a,".git");if(!(0,e.existsSync)(b))return null;if((0,e.statSync)(b).isDirectory()){let a=(0,g.join)(b,"config");return(0,e.existsSync)(a)?a:null}let c=(0,e.readFileSync)(b,"utf-8").trim().match(/^gitdir:\s*(.+)$/i);if(!c)return null;let d=(0,g.resolve)(a,c[1]),f=(0,g.join)(d,"config");if((0,e.existsSync)(f))return f;let h=(0,g.join)(d,"commondir");if(!(0,e.existsSync)(h))return null;let i=(0,g.resolve)(d,(0,e.readFileSync)(h,"utf-8").trim()),j=(0,g.join)(i,"config");return(0,e.existsSync)(j)?j:null}(function(a){let b=(0,g.resolve)(a);for(;;){if((0,e.existsSync)((0,g.join)(b,".git")))return b;let c=(0,g.dirname)(b);if(c===b)return(0,g.resolve)(a);b=c}}(a));if(!b)return null;let c=(0,e.readFileSync)(b,"utf-8").split(/\r?\n/),d=!1;for(let a of c){let b=a.match(/^\s*\[(.+)\]\s*$/);if(b){d='remote "origin"'===b[1];continue}if(!d)continue;let c=a.match(/^\s*url\s*=\s*(.+)\s*$/);if(c?.[1])return c[1].trim()}return null}(k);return F(`${i}.lock`,()=>{let c=T(i,{alreadyLocked:!0})??ad(),e=a,f=c.projects[a];if(!f){let a=I(k,m),b=c.projects[a];if(b?.path&&(0,g.resolve)(b.path)===k)e=a,f=b;else if(b)throw Error(`Project ID collision: "${a}" already registered at a different path (${b.path}). This is extremely unlikely — please file a bug.`);else e=a}if(f?.path&&(0,g.resolve)(f.path)!==k)throw Error(`Project id "${e}" is already registered for "${f.path}". Choose a different configProjectKey to add "${k}" as a separate project.`);for(let[a,b]of Object.entries(c.projects))if(a!==e&&(0,g.resolve)(b.path)===k)throw Error(`Project "${a}" is already registered at "${k}". Choose a different project ID or path.`);let h=f?.repo??Z(m)??(d?.repo?$(d.repo):void 0),n=f?.defaultBranch??d?.defaultBranch??"main",o=f?.sessionPrefix??d?.sessionPrefix??l((0,g.basename)(j)),p=f?.source??(h?"ao-project-add":"local"),q=f?.registeredAt??Math.floor(Date.now()/1e3),r=!f?.sessionPrefix&&!!d?.sessionPrefix,s=_(c,o,e);if(s&&r)throw Error(`Duplicate session prefix detected: "${o}"
|
|
1
|
+
exports.id=6013,exports.ids=[6013],exports.modules={15407:(a,b,c)=>{"use strict";c.d(b,{Ag:()=>w,CK:()=>v,CM:()=>h,D8:()=>u,DD:()=>r,Fx:()=>t,Hk:()=>n,N_:()=>j,PE:()=>e,SB:()=>g,U1:()=>q,V1:()=>f,b8:()=>s,bz:()=>p,c5:()=>y,kw:()=>x,qX:()=>l,tT:()=>m,u3:()=>d,xn:()=>o,zi:()=>k});let d={ACTIVE:"active",READY:"ready",IDLE:"idle",WAITING_INPUT:"waiting_input",BLOCKED:"blocked",EXITED:"exited"},e=3e5,f=3e4,g={SPAWNING:"spawning",WORKING:"working",DETECTING:"detecting",PR_OPEN:"pr_open",CI_FAILED:"ci_failed",REVIEW_PENDING:"review_pending",CHANGES_REQUESTED:"changes_requested",APPROVED:"approved",MERGEABLE:"mergeable",MERGED:"merged",CLEANUP:"cleanup",NEEDS_INPUT:"needs_input",STUCK:"stuck",ERRORED:"errored",IDLE:"idle",KILLED:"killed",DONE:"done",TERMINATED:"terminated"},h=new Set(["killed","terminated","done","cleanup","errored","merged"]),i=new Set(["exited"]),j=new Set([]);function k(a){return a.lifecycle?"done"===a.lifecycle.session.state||"terminated"===a.lifecycle.session.state||"merged"===a.lifecycle.pr.state||"missing"===a.lifecycle.runtime.state||"exited"===a.lifecycle.runtime.state:h.has(a.status)||null!==a.activity&&i.has(a.activity)}function l(a){return a.lifecycle,k(a)&&!j.has(a.status)}function m(a,b,c){if(a.metadata?.role==="orchestrator")return!0;if(!b)return!1;let d=b.replace(/[.*+?^${}()|[\]\\]/g,"\\$&");if(a.id===`${b}-orchestrator`)return!0;if(!RegExp(`^${d}-orchestrator-\\d+$`).test(a.id))return!1;if(c){for(let d of c)if(d!==b&&RegExp(`^${d.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}-\\d+$`).test(a.id))return!1}return!0}let n="indeterminate";function o(a){return a===n}let p={OPEN:"open",MERGED:"merged",CLOSED:"closed"},q={PENDING:"pending",PASSING:"passing",FAILING:"failing",NONE:"none"};function r(a){if(a)return"permissionless"!==a&&"default"!==a&&"auto-edit"!==a&&"suggest"!==a?"skip"===a?"permissionless":void 0:a}function s(a){return"function"==typeof a.remap}function t(a){if(!a||"object"!=typeof a)return!1;let b=a.message?.toLowerCase()||"";return b.includes("issue")&&(b.includes("not found")||b.includes("does not exist"))||b.includes("no issue found")||b.includes("could not find issue")||b.includes("could not resolve to an issue")||b.includes("no issue with identifier")||b.includes("invalid issue format")}class u extends Error{constructor(a,b){super(`Session ${a} cannot be restored: ${b}`),this.sessionId=a,this.reason=b,this.name="SessionNotRestorableError"}}class v extends Error{constructor(a,b){super(`Workspace missing at ${a}${b?`: ${b}`:""}`),this.path=a,this.detail=b,this.name="WorkspaceMissingError"}}class w extends Error{constructor(a){super(`Session not found: ${a}`),this.sessionId=a,this.name="SessionNotFoundError"}}class x extends Error{constructor(a){super(a??"No agent-orchestrator.yaml found. Run `ao start` to create one."),this.name="ConfigNotFoundError"}}class y extends Error{constructor(a,b){super(b),this.projectId=a,this.name="ProjectResolveError"}}},26785:()=>{},32285:(a,b,c)=>{"use strict";c.d(b,{u3Y:()=>d.u3,U10:()=>d.U1,kw3:()=>d.kw,V1$:()=>d.V1,PES:()=>d.PE,mUH:()=>S,HkR:()=>d.Hk,Agm:()=>d.Ag,D83:()=>d.D8,CMu:()=>d.CM,CK3:()=>d.CK,HrC:()=>bK,Bmx:()=>c7,Gfg:()=>cL,C1z:()=>c2,RaB:()=>aJ,SkT:()=>cM,Qum:()=>cu,My0:()=>E,sa4:()=>bN,vQK:()=>dl,g9C:()=>I,yAg:()=>c3,ccZ:()=>l,Vo2:()=>c8,mKg:()=>bQ,NoB:()=>J,zFo:()=>ds,RxI:()=>bO,XqS:()=>n,IXO:()=>o,ry1:()=>z,getWindowsPtyHosts:()=>dz,Gfo:()=>db,b8Q:()=>d.b8,tTz:()=>d.tT,zi:()=>d.zi,$oG:()=>dp,uFH:()=>v,g8K:()=>A,Z9L:()=>aB,G_c:()=>T,rSb:()=>V,TF_:()=>cw,m5Y:()=>ac,DD3:()=>d.DD,DkI:()=>bo,Ahw:()=>c6,XIc:()=>b_,giR:()=>cN,wxm:()=>dr,JyZ:()=>c9,t9S:()=>aa,YEV:()=>dx,Vtt:()=>Y,fzr:()=>b0,J06:()=>ce,kct:()=>bZ,cv0:()=>dt,unregisterWindowsPtyHost:()=>dy,D58:()=>a7,inW:()=>X});var d=c(15407),e=c(73024),f=c(77598),g=c(76760),h=c(48161),i=c(34446),j=c(20642),k=c(89981);function l(a){if(a.length<=4)return a.toLowerCase();let b=a.match(/[A-Z]/g);if(b&&b.length>1)return b.join("").toLowerCase();if(a.includes("-")||a.includes("_")){let b=a.includes("-")?"-":"_";return a.split(b).map(a=>a[0]).join("").toLowerCase()}return a.slice(0,3).toLowerCase()}let m=/^[a-zA-Z0-9][a-zA-Z0-9._-]*$/;function n(a){if(!a||"."===a||".."===a||a.length>128||!m.test(a))throw Error(`Unsafe project ID: "${a}"`);return(0,g.join)(r(),"projects",a)}function o(a){return(0,g.join)(n(a),"sessions")}function p(a){return(0,g.join)(n(a),"worktrees")}function q(a){return a.startsWith("~/")?(0,g.join)((0,h.homedir)(),a.slice(2)):a}function r(){return q("~/.agent-orchestrator")}var s=c(31421),t=c(57975);let u=(0,t.promisify)(s.execFile);function v(){return"win32"===process.platform}function w(){return v()?"process":"tmux"}let x=null;function y(a){let b=process.env.PATHEXT?.split(";").filter(Boolean)??[".COM",".EXE",".BAT",".CMD"];for(let c of(process.env.PATH??"").split(";").filter(Boolean)){let d=c.endsWith("\\")||c.endsWith("/")?c.slice(0,-1):c;for(let c of[...b,""]){let b=`${d}\\${a}${c}`;if((0,e.existsSync)(b))return b}}return null}function z(){return x||(x=v()?function(){let a=process.env.AO_SHELL;if(a)return{cmd:a,args:function(a){let b=a.replace(/\\/g,"/").split("/").pop().toLowerCase().replace(/\.exe$/,"");return"cmd"===b?a=>["/c",a]:"bash"===b||"sh"===b||"zsh"===b||"dash"===b?a=>["-c",a]:a=>["-Command",a]}(a)};let b=y("pwsh");if(b)return{cmd:b,args:a=>["-Command",a]};let c=process.env.SystemRoot||"C:\\Windows",d=`${c}\\System32\\WindowsPowerShell\\v1.0\\powershell.exe`;if((0,e.existsSync)(d))return{cmd:d,args:a=>["-Command",a]};let f=y("powershell");return f?{cmd:f,args:a=>["-Command",a]}:{cmd:process.env.ComSpec||"cmd.exe",args:a=>["/c",a]}}():{cmd:"/bin/sh",args:a=>["-c",a]})}async function A(a,b="SIGTERM"){if(!(a<=0))if(v()){let b=["/T","/F","/PID",String(a)];try{await u("taskkill",b,{windowsHide:!0})}catch{}}else try{process.kill(-a,b)}catch{try{process.kill(a,b)}catch{}}}let B=10*!!v();function C(a,b){let c=`${a}.tmp.${process.pid}.${Date.now()}`;(0,e.writeFileSync)(c,b,"utf-8");try{!function(a,b){let c;for(let d=0;d<=B;d++)try{(0,e.renameSync)(a,b);return}catch(b){c=b;let a=b?.code;if("EPERM"!==a&&"EACCES"!==a&&"EBUSY"!==a)throw b;if(d===B)break}throw c}(c,a)}catch(a){try{(0,e.unlinkSync)(c)}catch{}throw a}}function D(a){let b=a.toLowerCase();return"github.com"===b||b.endsWith(".github.com")?"github":"gitlab.com"===b||b.endsWith(".gitlab.com")?"gitlab":"bitbucket.org"===b||b.endsWith(".bitbucket.org")||b.endsWith(".bitbucket.com")?"bitbucket":"unknown"}function E(a){let b=(0,g.join)(a,".git","HEAD");if((0,e.existsSync)(b)){let c=(0,e.readFileSync)(b,"utf-8").trim().match(/^ref: refs\/heads\/(.+)$/);if(c){for(let b of["main","master","next","develop"]){let c=(0,g.join)(a,".git","refs","remotes","origin",b),d=(0,g.join)(a,".git","packed-refs");if((0,e.existsSync)(c)||(0,e.existsSync)(d)&&(0,e.readFileSync)(d,"utf-8").includes(`refs/remotes/origin/${b}`))return b}return c[1]}}return"main"}function F(a,b,c={}){let d=c.timeoutMs??1e4,f=c.staleMs??6e4;(0,e.mkdirSync)((0,g.dirname)(a),{recursive:!0});let h=Date.now()+d,i=null,j=10;for(;null===i;)try{i=(0,e.openSync)(a,"wx")}catch(b){var k;if("EEXIST"!==b.code)throw Error(`Failed to acquire file lock: ${a}`,{cause:b});try{let b=(0,e.statSync)(a);if(Date.now()-b.mtimeMs>f){(0,e.rmSync)(a,{force:!0});continue}}catch{continue}if(Date.now()>h)throw Error(`Timed out waiting for file lock: ${a}`,{cause:b});k=j,Atomics.wait(new Int32Array(new SharedArrayBuffer(4)),0,0,k),j=Math.min(2*j,250)}try{return b()}finally{try{(0,e.closeSync)(i)}catch{}try{(0,e.rmSync)(a,{force:!0})}catch{}}}function G(a){return a.replace(/\.git$/i,"")}function H(a){return"/"===a?"":a.replace(/\/+$/,"")}function I(a,b){let c=(0,g.resolve)(a),d=(0,g.basename)(c).toLowerCase().replace(/[^a-z0-9_-]/g,"-").replace(/^[^a-z0-9]/,"x").replace(/-+/g,"-").slice(0,30),e=`${c}:${b??""}`,h=(0,f.createHash)("sha256").update(e).digest("hex").slice(0,10);return`${d}_${h}`}function J(){if(process.env.AO_GLOBAL_CONFIG)return(0,g.resolve)(process.env.AO_GLOBAL_CONFIG);let a=process.env.XDG_CONFIG_HOME;return a?(0,g.join)(a,"agent-orchestrator","config.yaml"):(0,g.join)((0,h.homedir)(),".agent-orchestrator","config.yaml")}let K=k.Ik({owner:k.Yj(),name:k.Yj(),platform:k.k5(["github","gitlab","bitbucket"]),originUrl:k.Yj()}),L=new Set(["projectId","path","repo","defaultBranch","source","registeredAt","displayName","sessionPrefix","storageKey"]),M=["agent-orchestrator.yaml","agent-orchestrator.yml"],N=new Set(["repo","defaultBranch","originUrl","projectId","path","storageKey"]),O=k.Ik({projectId:k.Yj().optional(),path:k.Yj(),repo:K.optional(),defaultBranch:k.Yj().optional(),source:k.Yj().optional(),registeredAt:k.ai().optional(),displayName:k.Yj().optional(),sessionPrefix:k.Yj().optional(),storageKey:k.Yj().optional()}),P=k.k5(["stable","nightly","manual"]),Q=k.k5(["git","npm-global","pnpm-global","bun-global","homebrew","unknown"]),R=k.Ik({port:k.ai().default(3e3),terminalPort:k.ai().optional(),directTerminalPort:k.ai().optional(),readyThresholdMs:k.ai().nonnegative().default(3e5),updateChannel:P.optional().catch(void 0),installMethod:Q.optional().catch(void 0),defaults:k.Ik({runtime:k.Yj().default(()=>w()),agent:k.Yj().default("claude-code"),workspace:k.Yj().default("worktree"),notifiers:k.YO(k.Yj()).default(["composio","desktop"]),orchestrator:k.Ik({agent:k.Yj().optional()}).optional(),worker:k.Ik({agent:k.Yj().optional()}).optional()}).default({}),projects:k.g1(O).default({}),projectOrder:k.YO(k.Yj()).optional(),notifiers:k.g1(k.Ik({plugin:k.Yj()}).passthrough()).default({}),notificationRouting:k.g1(k.YO(k.Yj())).default({urgent:["desktop","composio"],action:["desktop","composio"],warning:["composio"],info:["composio"]}),reactions:k.g1(k.Ik({}).passthrough()).default({})}).passthrough(),S=k.Ik({repo:k.Yj().optional(),defaultBranch:k.Yj().optional(),runtime:k.Yj().optional(),agent:k.Yj().optional(),workspace:k.Yj().optional(),tracker:k.Ik({plugin:k.Yj()}).passthrough().optional(),scm:k.Ik({plugin:k.Yj(),webhook:k.Ik({enabled:k.zM().optional(),path:k.Yj().optional(),secretEnvVar:k.Yj().optional(),signatureHeader:k.Yj().optional(),eventHeader:k.Yj().optional(),deliveryHeader:k.Yj().optional(),maxBodyBytes:k.ai().optional()}).optional()}).passthrough().optional(),symlinks:k.YO(k.Yj()).optional(),postCreate:k.YO(k.Yj()).optional(),agentConfig:k.Ik({permissions:k.k5(["permissionless","default","auto-edit","suggest","skip"]).optional(),model:k.Yj().optional(),orchestratorModel:k.Yj().optional()}).passthrough().optional(),orchestrator:k.Ik({agent:k.Yj().optional(),agentConfig:k.Ik({}).passthrough().optional()}).optional(),worker:k.Ik({agent:k.Yj().optional(),agentConfig:k.Ik({}).passthrough().optional()}).optional(),reactions:k.g1(k.Ik({}).passthrough()).optional(),agentRules:k.Yj().optional(),agentRulesFile:k.Yj().optional(),orchestratorRules:k.Yj().optional(),orchestratorSessionStrategy:k.k5(["reuse","delete","ignore","delete-new","ignore-new","kill-previous"]).optional(),opencodeIssueSessionStrategy:k.k5(["reuse","delete","ignore"]).optional(),decomposer:k.Ik({}).passthrough().optional()}).passthrough();function T(a,b={}){let c=a??J();if(!(0,e.existsSync)(c))return null;let{parsed:f,migrationSummary:i}=function(a,b){let c=af(a);if(!c)return{parsed:null,migrationSummary:null};if(!ae(c).changed)return{parsed:c,migrationSummary:null};let d=null,e=()=>{let b=af(a);if(!b){c=null;return}let e=ae(b);c=b,e.changed&&(d=function(a){if(0===a.strippedProjects.length)return"[ao] migrated legacy project registry fields in global config";let b=a.strippedProjects.reduce((a,b)=>a+b.strippedFieldCount,0),c=a.strippedProjects.map(a=>`${a.projectId} (${a.strippedFieldCount})`).join(", ");return`[ao] stripped ${b} legacy project registry fields from ${a.strippedProjects.length} project${1===a.strippedProjects.length?"":"s"}: ${c}`}(e),U(R.parse(b),a))};if(b.alreadyLocked)e();else F(`${a}.lock`,e);return{parsed:c,migrationSummary:d}}(c,b);if(!f)return null;i&&console.info(i);let j=R.parse(f);for(let[a,b]of Object.entries(j.projects))b.path=function(a,b){if("~"===b)return(0,h.homedir)();if(b.startsWith("~/")){let c=(0,h.homedir)(),e=(0,g.resolve)(c,b.slice(2));if(!function(a,b){let c=(0,g.relative)(a,b);return""===c||!c.startsWith("..")&&!c.startsWith(`..${g.sep}`)}(c,e))throw new d.c5(a,`Project path "${b}" escapes the home directory and cannot be loaded from the global registry.`);return e}return(0,g.resolve)(b)}(a,b.path);return j}function U(a,b){let c=b??J(),d=(0,g.dirname)(c);(0,e.mkdirSync)(d,{recursive:!0}),C(c,(0,i.As)(a,{indent:2}))}function V(a){for(let b of M.map(b=>(0,g.join)(a,b))){let a;if((0,e.existsSync)(b)){try{let c=(0,e.readFileSync)(b,"utf-8");a=(0,i.qg)(c)}catch(a){return{kind:"malformed",path:b,error:`Failed to parse local config at ${b}: ${a instanceof Error?a.message:String(a)}`}}if(!a||"object"!=typeof a)return{kind:"invalid",path:b,error:`Local config at ${b} must parse to an object`};if("projects"in a)return{kind:"old-format",path:b,error:`Local config at ${b} still uses a wrapped projects: format`};try{return{kind:"loaded",path:b,config:S.parse(a)}}catch(a){return{kind:"invalid",path:b,error:`Local config at ${b} failed validation: ${a instanceof Error?a.message:String(a)}`}}}}return{kind:"missing"}}function W(a){let b={...a};for(let a of N)Reflect.deleteProperty(b,a);return b}function X(a,b,c=function(a){for(let b of M){let c=(0,g.join)(a,b);if((0,e.existsSync)(c))return c}return(0,g.join)(a,M[0])}(a)){(0,e.mkdirSync)((0,g.dirname)(c),{recursive:!0});let d=S.parse(W(b));return C(c,(0,i.As)(d,{indent:2})),c}function Y(a,b){let c=V(b);if("old-format"!==c.kind||!c.path)throw Error(`No wrapped local config found for project "${a}" at ${b}`);let d=c.path,f=(0,e.readFileSync)(d,"utf-8"),g=(0,i.qg)(f);if(!g||"object"!=typeof g||!ab(g))throw Error(`Local config at ${d} is not a wrapped old-format config.`);let h=g.projects??{},j=h[a];if(!j||"object"!=typeof j){let a=Object.values(h).filter(a=>null!=a&&"object"==typeof a);j=1===a.length?a[0]:void 0}if(!j||"object"!=typeof j)throw Error(`Wrapped local config at ${d} does not contain project "${a}".`);let{name:k,path:l,sessionPrefix:m,projectId:n,source:o,registeredAt:p,displayName:q,...r}=j;X(b,r,d)}function Z(a){if(!a)return;let b=function(a){let b,c=a.trim(),d=c.match(/^git@([^:]+):(.+)$/);if(d){let a=d[1].toLowerCase(),b=G(H(d[2]));return`https://${a}/${b}`}let e=c.replace(/^[A-Za-z][A-Za-z0-9+.-]*:\/\//,a=>a.toLowerCase());try{b=new URL(e)}catch{throw Error(`Invalid origin URL: ${a}`)}let f=b.hostname.toLowerCase(),g=G(H(b.pathname));return`https://${f}${g}`}(a);if(b.startsWith("https://"))try{let a=new URL(b),c=a.pathname.split("/").filter(Boolean);if(c.length<2)return;let d=c[c.length-1],e=c.slice(0,-1).join("/"),f=D(a.host);if("unknown"===f)return;return{owner:e,name:d,platform:f,originUrl:b}}catch{return}}function $(a){if("string"!=typeof a)return;let b=a.trim();if(!b)return;if(b.startsWith("http://")||b.startsWith("https://")||b.startsWith("git@"))return Z(b);let c=b.split("/").filter(Boolean);if(2===c.length)return Z(`https://github.com/${c[0]}/${c[1]}`);if(c.length>=3&&c[0].includes(".")){let a=c[0];if("unknown"===D(a))return;let b=c.slice(1,-1).join("/"),d=c[c.length-1];return Z(`https://${a}/${b}/${d}`)}}function _(a,b,c){for(let[d,e]of Object.entries(a.projects))if(d!==c&&(e.sessionPrefix??l((0,g.basename)(e.path??d)))===b)return d;return null}function aa(a,b,c,d,f,h){let i="string"==typeof f?f:h??J(),j=(0,g.resolve)(c),k=(0,e.realpathSync)((0,g.resolve)(c)),m=function(a){let b=function(a){let b=(0,g.join)(a,".git");if(!(0,e.existsSync)(b))return null;if((0,e.statSync)(b).isDirectory()){let a=(0,g.join)(b,"config");return(0,e.existsSync)(a)?a:null}let c=(0,e.readFileSync)(b,"utf-8").trim().match(/^gitdir:\s*(.+)$/i);if(!c)return null;let d=(0,g.resolve)(a,c[1]),f=(0,g.join)(d,"config");if((0,e.existsSync)(f))return f;let h=(0,g.join)(d,"commondir");if(!(0,e.existsSync)(h))return null;let i=(0,g.resolve)(d,(0,e.readFileSync)(h,"utf-8").trim()),j=(0,g.join)(i,"config");return(0,e.existsSync)(j)?j:null}(function(a){let b=(0,g.resolve)(a);for(;;){if((0,e.existsSync)((0,g.join)(b,".git")))return b;let c=(0,g.dirname)(b);if(c===b)return(0,g.resolve)(a);b=c}}(a));if(!b)return null;let c=(0,e.readFileSync)(b,"utf-8").split(/\r?\n/),d=!1;for(let a of c){let b=a.match(/^\s*\[(.+)\]\s*$/);if(b){d='remote "origin"'===b[1];continue}if(!d)continue;let c=a.match(/^\s*url\s*=\s*(.+)\s*$/);if(c?.[1])return c[1].trim()}return null}(k);return F(`${i}.lock`,()=>{let c=T(i,{alreadyLocked:!0})??ad(),e=a,f=c.projects[a];if(!f){let a=I(k,m),b=c.projects[a];if(b?.path&&(0,g.resolve)(b.path)===k)e=a,f=b;else if(b)throw Error(`Project ID collision: "${a}" already registered at a different path (${b.path}). This is extremely unlikely — please file a bug.`);else e=a}if(f?.path&&(0,g.resolve)(f.path)!==k)throw Error(`Project id "${e}" is already registered for "${f.path}". Choose a different configProjectKey to add "${k}" as a separate project.`);for(let[a,b]of Object.entries(c.projects))if(a!==e&&(0,g.resolve)(b.path)===k)throw Error(`Project "${a}" is already registered at "${k}". Choose a different project ID or path.`);let h=f?.repo??Z(m)??(d?.repo?$(d.repo):void 0),n=f?.defaultBranch??d?.defaultBranch??"main",o=f?.sessionPrefix??d?.sessionPrefix??l((0,g.basename)(j)),p=f?.source??(h?"ao-project-add":"local"),q=f?.registeredAt??Math.floor(Date.now()/1e3),r=!f?.sessionPrefix&&!!d?.sessionPrefix,s=_(c,o,e);if(s&&r)throw Error(`Duplicate session prefix detected: "${o}"
|
|
2
2
|
Projects "${s}" and "${e}" would generate the same prefix.
|
|
3
3
|
|
|
4
4
|
Choose a different configProjectKey or add an explicit sessionPrefix before registering the project.`);let t=s?function(a,b,c){if(!_(b,a,c))return a;for(let d=1;d<1e4;d+=1){let e=`${a}-${d}`;if(!_(b,e,c))return e}throw Error(`Could not allocate a session prefix for "${a}" after 9999 attempts.`)}(o,c,e):o;return c.projects[e]={projectId:e,path:k,...h?{repo:h}:{},defaultBranch:n,source:p,registeredAt:q,displayName:b,sessionPrefix:t},U(c,i),e})}function ab(a){return!!a&&"object"==typeof a&&"projects"in a&&"object"==typeof a.projects&&Object.values(a.projects).some(a=>null!=a&&"object"==typeof a&&"path"in a)}function ac(a,b){let c=b??J(),d=(0,e.readFileSync)(a,"utf-8"),f=(0,i.qg)(d);if(!ab(f))throw Error(`File at ${a} is not an old-format config.`);let j=f.projects??{},k=ad();for(let[a,b]of("number"==typeof f.port&&(k.port=f.port),null!==f.terminalPort&&void 0!==f.terminalPort&&(k.terminalPort=f.terminalPort),null!==f.directTerminalPort&&void 0!==f.directTerminalPort&&(k.directTerminalPort=f.directTerminalPort),null!==f.readyThresholdMs&&void 0!==f.readyThresholdMs&&(k.readyThresholdMs=f.readyThresholdMs),null!==f.defaults&&void 0!==f.defaults&&(k.defaults=f.defaults),null!==f.notifiers&&void 0!==f.notifiers&&(k.notifiers=f.notifiers),null!==f.notificationRouting&&void 0!==f.notificationRouting&&(k.notificationRouting=f.notificationRouting),null!==f.reactions&&void 0!==f.reactions&&(k.reactions=f.reactions),Object.entries(j))){if(!b.path)continue;let c="string"==typeof b.path&&b.path.startsWith("~/")?(0,g.join)((0,h.homedir)(),b.path.slice(2)):b.path,d="string"==typeof b.originUrl?Z(b.originUrl):void 0;k.projects[a]={projectId:a,path:c,...d?{repo:d}:{},..."string"==typeof b.defaultBranch?{defaultBranch:b.defaultBranch}:{},source:"migrated",registeredAt:Math.floor(Date.now()/1e3),displayName:b.name??a,..."string"==typeof b.sessionPrefix?{sessionPrefix:b.sessionPrefix}:{}}}for(let[b,d]of(U(k,c),Object.entries(j))){if(!d.path)continue;let b="string"==typeof d.path&&d.path.startsWith("~/")?(0,g.join)((0,h.homedir)(),d.path.slice(2)):d.path,{name:c,path:e,sessionPrefix:f,...j}=d;C((0,g.join)(b,(0,g.basename)(a)),(0,i.As)(j,{indent:2}))}return c}function ad(){return{port:3e3,readyThresholdMs:3e5,defaults:{runtime:w(),agent:"claude-code",workspace:"worktree",notifiers:["composio","desktop"]},projects:{},notifiers:{},notificationRouting:{urgent:["desktop","composio"],action:["desktop","composio"],warning:["composio"],info:["composio"]},reactions:{}}}function ae(a){let b=a.projects;if(!b||"object"!=typeof b)return{changed:!1,strippedProjects:[]};let c=!1,d=[];for(let[a,e]of Object.entries(b)){if(!e||"object"!=typeof e)continue;let b=e.projectId!==a||"string"==typeof e.name&&"string"!=typeof e.displayName||"string"==typeof e.repo||"string"==typeof e.originUrl&&void 0===e.repo,f=function(a,b){let c=0;if(b.projectId=a,"string"==typeof b.name&&"string"!=typeof b.displayName&&(b.displayName=b.name),"string"==typeof b.originUrl&&void 0===b.repo){let a=Z(b.originUrl);a&&(b.repo=a)}if("string"==typeof b.repo){let a=$(b.repo);a?b.repo=a:delete b.repo}for(let a of(delete b.name,delete b.originUrl,Object.keys(b)))L.has(a)||(Reflect.deleteProperty(b,a),c+=1);return{strippedFieldCount:c}}(a,e);f.strippedFieldCount>0&&d.push({projectId:a,strippedFieldCount:f.strippedFieldCount}),(f.strippedFieldCount>0||b)&&(c=!0)}return{changed:c,strippedProjects:d}}function af(a){let b=(0,e.readFileSync)(a,"utf-8"),c=(0,i.qg)(b);return c&&"object"==typeof c?c:null}function ag(a,b,c){let e=function(a,b,c){let e=b.projects[a];if(!e||!e.path)return null;let f=e.path,h=e.displayName??a,i="string"==typeof e.sessionPrefix&&e.sessionPrefix.length>0?e.sessionPrefix:l((0,g.basename)(f)),j="string"==typeof e.defaultBranch&&e.defaultBranch.length>0?e.defaultBranch:"main",k=e.repo&&"string"==typeof e.repo.owner&&"string"==typeof e.repo.name?`${e.repo.owner}/${e.repo.name}`:void 0,m={name:h,path:f,...k?{repo:k}:{},sessionPrefix:i,defaultBranch:j},n=c=>{let e={...c},f=b.defaults??{};void 0===e.runtime&&(e.runtime=f.runtime),void 0===e.agent&&(e.agent=f.agent),void 0===e.workspace&&(e.workspace=f.workspace);let g={...f.orchestrator??{},...e.orchestrator??{}};Object.keys(g).length>0&&(e.orchestrator=g);let h={...f.worker??{},...e.worker??{}};Object.keys(h).length>0&&(e.worker=h);let i=["runtime","agent","workspace"].filter(a=>{let b=e[a];return"string"!=typeof b||0===b.length});if(i.length>0)throw new d.c5(a,`Project "${a}" is missing required behavior fields with no defaults: ${i.join(", ")}`);return e},o=V(f);if("loaded"===o.kind&&o.config)return{...n(W(o.config)),...m};let p="missing"!==o.kind?o.error??"Failed to load local config":void 0;return{...p?{}:n({}),...m,...p?{resolveError:p}:{}}}(a,b);if(!e)throw new d.c5(a,`Unknown project: ${a}`);if("string"==typeof e.resolveError&&e.resolveError.length>0)throw new d.c5(a,e.resolveError);return e}function ah(a,b,c){a.plugin||a.package||a.path||b.addIssue({code:j.eq.custom,message:`${c} config requires either 'plugin' (for built-ins) or 'package'/'path' (for external plugins)`}),a.package&&a.path&&b.addIssue({code:j.eq.custom,message:`${c} config cannot have both 'package' and 'path' - use one or the other`})}let ai=k.Ik({auto:k.zM().default(!0),action:k.k5(["send-to-agent","notify","auto-merge"]).default("notify"),message:k.Yj().optional(),priority:k.k5(["urgent","action","warning","info"]).optional(),retries:k.ai().optional(),escalateAfter:k.KC([k.ai(),k.Yj()]).optional(),threshold:k.Yj().optional(),includeSummary:k.zM().optional()}),aj=k.Ik({plugin:k.Yj().optional(),package:k.Yj().optional(),path:k.Yj().optional()}).passthrough().superRefine((a,b)=>ah(a,b,"Tracker")),ak=k.Ik({plugin:k.Yj().optional(),package:k.Yj().optional(),path:k.Yj().optional(),webhook:k.Ik({enabled:k.zM().default(!0),path:k.Yj().optional(),secretEnvVar:k.Yj().optional(),signatureHeader:k.Yj().optional(),eventHeader:k.Yj().optional(),deliveryHeader:k.Yj().optional(),maxBodyBytes:k.ai().int().positive().optional()}).optional()}).passthrough().superRefine((a,b)=>ah(a,b,"SCM")),al=k.Ik({plugin:k.Yj().optional(),package:k.Yj().optional(),path:k.Yj().optional()}).passthrough().superRefine((a,b)=>ah(a,b,"Notifier")),am=k.k5(["permissionless","default","auto-edit","suggest","skip"]).default("permissionless").transform(a=>"skip"===a?"permissionless":a),an=k.Ik({permissions:am,model:k.Yj().optional(),orchestratorModel:k.Yj().optional(),opencodeSessionId:k.Yj().optional()}).passthrough(),ao=k.Ik({permissions:k.KC([k.k5(["permissionless","default","auto-edit","suggest"]),k.eu("skip")]).optional(),model:k.Yj().optional(),orchestratorModel:k.Yj().optional(),opencodeSessionId:k.Yj().optional()}).passthrough(),ap=k.Ik({agent:k.Yj().optional()}).optional(),aq=k.Ik({agent:k.Yj().optional(),agentConfig:ao.optional()}).optional(),ar=k.Ik({name:k.Yj().optional(),repo:k.Yj().optional(),path:k.Yj(),defaultBranch:k.Yj().default("main"),sessionPrefix:k.Yj().regex(/^[a-zA-Z0-9_-]+$/,"sessionPrefix must match [a-zA-Z0-9_-]+").optional(),resolveError:k.Yj().optional(),runtime:k.Yj().optional(),agent:k.Yj().optional(),workspace:k.Yj().optional(),env:k.g1(k.Yj(),k.Yj()).optional(),tracker:aj.optional(),scm:ak.optional(),symlinks:k.YO(k.Yj()).optional(),postCreate:k.YO(k.Yj()).optional(),agentConfig:an.default({}),orchestrator:aq,worker:aq,reactions:k.g1(ai.partial()).optional(),agentRules:k.Yj().optional(),agentRulesFile:k.Yj().optional(),orchestratorRules:k.Yj().optional(),orchestratorSessionStrategy:k.k5(["reuse","delete","ignore","delete-new","ignore-new","kill-previous"]).optional(),opencodeIssueSessionStrategy:k.k5(["reuse","delete","ignore"]).optional()}),as=k.Ik({runtime:k.Yj().default(()=>w()),agent:k.Yj().default("claude-code"),workspace:k.Yj().default("worktree"),notifiers:k.YO(k.Yj()).default([]),orchestrator:ap,worker:ap}),at=k.Ik({name:k.Yj(),source:k.k5(["registry","npm","local"]),package:k.Yj().optional(),version:k.Yj().optional(),path:k.Yj().optional(),enabled:k.zM().default(!0)}).superRefine((a,b)=>{"local"!==a.source||a.path||b.addIssue({code:j.eq.custom,path:["path"],message:"Local plugins require a path"}),"registry"!==a.source&&"npm"!==a.source||a.package||b.addIssue({code:j.eq.custom,path:["package"],message:"Registry and npm plugins require a package name"})}),au=k.Ik({preventIdleSleep:k.zM().default("darwin"===process.platform)}).default({}),av=k.Ik({attentionZones:k.k5(["simple","detailed"]).default("simple")}),aw=k.Ik({autoCleanupOnMerge:k.zM().default(!0),mergeCleanupIdleGraceMs:k.ai().int().nonnegative().refine(a=>0===a||a>=1e4,{message:"mergeCleanupIdleGraceMs is in milliseconds; values between 1 and 9999 are likely a units mistake (use 0 to disable the gate, or e.g. 10000 for 10s, 300000 for 5min)"}).default(3e5)}).default({}),ax=k.Ik({$schema:k.Yj().optional(),port:k.ai().int().default(3e3),terminalPort:k.ai().int().optional(),directTerminalPort:k.ai().int().optional(),readyThresholdMs:k.ai().int().nonnegative().default(3e5),power:au,lifecycle:aw,defaults:as.default({}),plugins:k.YO(at).default([]),dashboard:av.optional(),projects:k.g1(k.Yj().regex(/^[a-zA-Z0-9_-]+$/,"Project ID must match [a-zA-Z0-9_-]+ (no dots, slashes, or special characters)"),ar),notifiers:k.g1(al).default({}),notificationRouting:k.g1(k.YO(k.Yj())).default({}),reactions:k.g1(ai).default({})});function ay(a){return a.startsWith("~/")?(0,g.join)((0,h.homedir)(),a.slice(2)):a}function az(a,b){if(a){let b=a.split("/"),c=b[b.length-1]??a,d=c.match(/^ao-plugin-(?:runtime|agent|workspace|tracker|scm|notifier|terminal)-(.+)$/);return d?.[1]?d[1]:c}if(b){let a=b.split("/").filter(a=>a&&"."!==a&&".."!==a);return a[a.length-1]??b}return"unknown"}function aA(a,b,c,d){if(!a.package&&!a.path)return null;a.path&&(a.path=ay(a.path));let e=a.plugin;return a.plugin||(a.plugin=az(a.package,a.path)),{source:b,location:c,slot:d,package:a.package,path:a.path,expectedPluginName:e}}function aB(a){let b=a??function(a){if(process.env.AO_CONFIG_PATH){let a=(0,g.resolve)(process.env.AO_CONFIG_PATH);if((0,e.existsSync)(a))return a}let b=a=>{for(let b of["agent-orchestrator.yaml","agent-orchestrator.yml"]){let c=(0,g.resolve)(a,b);if((0,e.existsSync)(c))return c}let c=(0,g.resolve)(a,"..");return c===a?null:b(c)},c=b(process.cwd());if(c)return c;let d=J();if((0,e.existsSync)(d))return d;for(let a of[(0,g.resolve)((0,h.homedir)(),".agent-orchestrator.yaml"),(0,g.resolve)((0,h.homedir)(),".agent-orchestrator.yml"),(0,g.resolve)((0,h.homedir)(),".config","agent-orchestrator","config.yaml")])if((0,e.existsSync)(a))return a;return null}();if(!b)throw new d.kw;let c=(0,e.readFileSync)(b,"utf-8"),j=(0,i.qg)(c),k=function(a){if(!(0,e.existsSync)(a))return"missing";let b=(0,e.readFileSync)(a,"utf-8"),c=(0,i.qg)(b);return c&&"object"==typeof c&&"projects"in c?"wrapped":"flat-or-nonobject"}(b),l=!!b&&(0,g.resolve)(b)===(0,g.resolve)(J()),m=l||"wrapped"!==k?j:j&&"object"==typeof j&&"projects"in j&&j.projects&&"object"==typeof j.projects?{...j,projects:Object.fromEntries(Object.entries(j.projects).map(([a,c])=>c&&"object"==typeof c?"string"==typeof c.storageKey||"string"!=typeof c.path?[a,c]:[a,{...c,storageKey:function(a,b){let c=(0,e.realpathSync)(a),d=(0,g.dirname)(c),h=(0,f.createHash)("sha256").update(d).digest("hex").slice(0,12);return`${h}-${(0,g.basename)(b)}`}(b,c.path)}]:[a,c]))}:j,n=l?function(a){let b=T(a);if(!b)return null;let c={},e={};for(let[f,g]of Object.entries(b.projects))try{c[f]=ag(f,b,a)}catch(a){if(!(a instanceof d.c5))throw a;e[f]={projectId:f,path:g.path,resolveError:a.message}}return{...aC({port:b.port,terminalPort:b.terminalPort,directTerminalPort:b.directTerminalPort,readyThresholdMs:b.readyThresholdMs,defaults:b.defaults,notifiers:b.notifiers,notificationRouting:b.notificationRouting,reactions:b.reactions,projects:c}),degradedProjects:e}}(b)??aC(m):"wrapped"===k?aC(m):function(a,b){let c=T(J());if(!c)return null;let d=(()=>{try{return(0,e.realpathSync)((0,g.resolve)((0,g.dirname)(a)))}catch{return(0,g.resolve)((0,g.dirname)(a))}})(),f=Object.entries(c.projects).find(([,a])=>{if("string"!=typeof a.path)return!1;try{return(0,e.realpathSync)((0,g.resolve)(a.path))===d}catch{return(0,g.resolve)(a.path)===d}});if(!f)return null;let[h]=f,i=ag(h,c);return{...aC({port:c.port,terminalPort:c.terminalPort,directTerminalPort:c.directTerminalPort,readyThresholdMs:c.readyThresholdMs,defaults:c.defaults,notifiers:c.notifiers,notificationRouting:c.notificationRouting,reactions:c.reactions,projects:{[h]:{...i}}}),degradedProjects:{}}}(b)??aC(m);return n.configPath=b,"degradedProjects"in n||(n.degradedProjects={}),n}function aC(a){var b;let c=ax.parse(a);(b=c=function(a){for(let[b,c]of Object.entries(a.projects)){c.name||(c.name=b),c.sessionPrefix||(c.sessionPrefix=l((0,g.basename)(c.path)));let a=function(a){if("gitlab"===a.scm?.plugin)return"gitlab";let b=a.scm?.host;if("string"==typeof b&&b.toLowerCase().includes("gitlab")||"gitlab"===a.tracker?.plugin)return"gitlab";let c=a.tracker?.host;return"string"==typeof c&&c.toLowerCase().includes("gitlab")?"gitlab":"github"}(c);!c.scm&&c.repo?.includes("/")&&(c.scm={plugin:a}),!c.tracker&&c.repo?.includes("/")&&(c.tracker={plugin:a})}return a}(c=function(a){for(let b of Object.values(a.projects))b.path=ay(b.path);for(let b of a.plugins??[])b.path&&(b.path=ay(b.path));return a}(c))).reactions={"pr-closed":{auto:!0,action:"notify",priority:"action",message:"A PR was closed without merging. Decide whether to learn from the closure, resume the work, or terminate the session."},"ci-failed":{auto:!0,action:"send-to-agent",message:"CI is failing on your PR. Investigate the failures, fix the issues, and push again.",retries:2,escalateAfter:2},"changes-requested":{auto:!0,action:"send-to-agent",message:"There are new review comments on your PR requesting changes.",escalateAfter:"30m"},"bugbot-comments":{auto:!0,action:"send-to-agent",message:"Automated review comments found on your PR. Details will follow shortly.",escalateAfter:"30m"},"merge-conflicts":{auto:!0,action:"send-to-agent",message:"Your branch has merge conflicts. Rebase on the default branch and resolve them.",escalateAfter:"15m"},"approved-and-green":{auto:!1,action:"notify",priority:"action",message:"PR is ready to merge"},"agent-idle":{auto:!0,action:"send-to-agent",message:"You appear to be idle. If your task is not complete, continue working — write the code, commit, push, and create a PR. If you are blocked, explain what is blocking you.",retries:2,escalateAfter:"15m"},"agent-stuck":{auto:!0,action:"notify",priority:"urgent",threshold:"10m"},"agent-needs-input":{auto:!0,action:"notify",priority:"urgent"},"agent-exited":{auto:!0,action:"notify",priority:"urgent"},"all-complete":{auto:!0,action:"notify",priority:"info",includeSummary:!0},...b.reactions};let d=function(a){let b=[];for(let[c,d]of Object.entries(a.projects)){if(d.tracker){let a=aA(d.tracker,`projects.${c}.tracker`,{kind:"project",projectId:c,configType:"tracker"},"tracker");a&&b.push(a)}if(d.scm){let a=aA(d.scm,`projects.${c}.scm`,{kind:"project",projectId:c,configType:"scm"},"scm");a&&b.push(a)}}for(let[c,d]of Object.entries(a.notifiers??{}))if(d){let a=aA(d,`notifiers.${c}`,{kind:"notifier",notifierId:c},"notifier");a&&b.push(a)}return b}(c=b);return d.length>0&&(c.plugins=function(a,b){let c=[...a??[]],d=new Set;for(let a of c)a.package&&d.add(`package:${a.package}`),a.path&&d.add(`path:${a.path}`);for(let a of b){let b=a.package?`package:${a.package}`:`path:${a.path}`;if(d.has(b)){let b=c.find(b=>a.package&&b.package===a.package||a.path&&b.path===a.path);b&&!1===b.enabled&&(b.enabled=!0);continue}d.add(b);let e=a.expectedPluginName??az(a.package,a.path);c.push({name:e,source:a.package?"npm":"local",package:a.package,path:a.path,enabled:!0})}return c}(c.plugins,d),c._externalPluginEntries=d),!function(a){let b=new Set;for(let[c]of Object.entries(a.projects)){if(b.has(c))throw Error(`Duplicate project ID detected: "${c}"
|
|
@@ -19,7 +19,7 @@ projects:
|
|
|
19
19
|
`);continue}try{let e=aI(await d(i));if(!e)continue;for(let c of b.package?f.get(`package:${b.package}`)??[]:b.path?f.get(`path:${b.path}`)??[]:[])try{var h=e.manifest;if(c.expectedPluginName&&c.expectedPluginName!==h.name){let a=c.package?"package":"path";throw Error(`Plugin manifest.name mismatch at ${c.source}: expected "${c.expectedPluginName}" but ${a} "${i}" has manifest.name "${h.name}". Either update the 'plugin' field to match the actual manifest.name, or remove it to auto-infer.`)}!function(a,b,c){let{location:d,slot:e,source:f}=b;if("project"===d.kind){let{projectId:b,configType:e}=d,f=c.projects[b];f?.[e]&&(f[e].plugin=a.name)}else if("notifier"===d.kind){let{notifierId:b}=d,e=c.notifiers[b];e&&(e.plugin=a.name)}a.slot!==e&&process.stderr.write(`[plugin-registry] Plugin at ${f} has slot "${a.slot}" but was configured as "${e}". The plugin will be registered under its declared slot "${a.slot}".
|
|
20
20
|
`)}(e.manifest,c,a)}catch(a){process.stderr.write(`[plugin-registry] Config validation failed for ${c.source}: ${a}
|
|
21
21
|
`)}"notifier"===e.manifest.slot?c(e,a,!0):this.register(e)}catch(a){process.stderr.write(`[plugin-registry] Failed to load plugin "${i}": ${a}
|
|
22
|
-
`)}}}}}let aK=/\/(\d+)$/;function aL(a){let b=function(a){try{return new URL(a)}catch{return null}}(a),c=b?.pathname.split("/").filter(Boolean)??[],d=c.findIndex(a=>"pull"===a);if(d>=2&&d+1<c.length){let b=c[d-2],e=c[d-1],f=c[d+1];if(b&&e&&f&&/^\d+$/.test(f))return{owner:b,repo:e,number:Number.parseInt(f,10),url:a}}let e=c.findIndex((a,b)=>"-"===a&&"merge_requests"===c[b+1]&&b>=2&&b+2<c.length);if(e>=2){let b=c[e-2],d=c[e-1],f=c[e+2];if(b&&d&&f&&/^\d+$/.test(f))return{owner:b,repo:d,number:Number.parseInt(f,10),url:a}}let f=a.match(aK);return f?{owner:"",repo:"",number:parseInt(f[1],10),url:a}:null}let aM=new Set(["spawning","working","detecting","pr_open","ci_failed","review_pending","changes_requested","approved","mergeable","merged","cleanup","needs_input","stuck","errored","killed","idle","done","terminated"]);function aN(a){try{return JSON.parse(a)}catch{return null}}function aO(a){return"starting"===a?"working":a&&aM.has(a)?a:"spawning"}let aP=k.Yj().nullable(),aQ=k.Ik({id:k.Yj(),runtimeName:k.Yj(),data:k.vk(a=>null===a||"object"!=typeof a||Array.isArray(a)?{}:a,k.g1(k.L5()))}),aR=k.Ik({version:k.eu(2),session:k.Ik({kind:k.k5(["worker","orchestrator"]),state:k.k5(["not_started","working","idle","needs_input","stuck","detecting","done","terminated"]),reason:k.k5(["spawn_requested","agent_acknowledged","task_in_progress","pr_created","pr_closed_waiting_decision","fixing_ci","resolving_review_comments","awaiting_user_input","awaiting_external_review","research_complete","merged_waiting_decision","manually_killed","runtime_lost","agent_process_exited","probe_failure","error_in_process","auto_cleanup","pr_merged"]),startedAt:aP,completedAt:aP,terminatedAt:aP,lastTransitionAt:k.Yj()}).partial().optional(),pr:k.Ik({state:k.k5(["none","open","merged","closed"]),reason:k.k5(["not_created","in_progress","ci_failing","review_pending","changes_requested","approved","merge_ready","merged","closed_unmerged","cleared_on_restore"]),number:k.ai().int().nullable(),url:k.Yj().nullable(),lastObservedAt:aP}).partial().optional(),runtime:k.Ik({state:k.k5(["unknown","alive","exited","missing","probe_failed"]),reason:k.k5(["spawn_incomplete","process_running","process_missing","tmux_missing","manual_kill_requested","probe_error","pr_merged_cleanup","auto_cleanup"]),lastObservedAt:aP,handle:aQ.nullable(),tmuxName:k.Yj().nullable()}).partial().optional()});function aS(a,b=null){if("string"!=typeof a)return b;let c=Date.parse(a);return Number.isNaN(c)?b:new Date(c).toISOString()}function aT(a,b=new Date){return{version:2,session:{kind:a,state:"not_started",reason:"spawn_requested",startedAt:null,completedAt:null,terminatedAt:null,lastTransitionAt:b.toISOString()},pr:{state:"none",reason:"not_created",number:null,url:null,lastObservedAt:null},runtime:{state:"unknown",reason:"spawn_incomplete",lastObservedAt:null,handle:null,tmuxName:null}}}function aU(a,b={}){let c=b.status??aO(a.status),d=b.sessionKind??("orchestrator"===a.role||b.sessionId?.endsWith("-orchestrator")?"orchestrator":"worker"),e=b.createdAt?.toISOString()??aS(a.createdAt,new Date().toISOString())??new Date().toISOString(),f=function(a){switch(a){case"spawning":return{state:"not_started",reason:"spawn_requested"};case"needs_input":return{state:"needs_input",reason:"awaiting_user_input"};case"stuck":return{state:"stuck",reason:"probe_failure"};case"errored":return{state:"terminated",reason:"error_in_process"};case"killed":case"terminated":case"cleanup":return{state:"terminated",reason:"manually_killed"};case"done":return{state:"done",reason:"research_complete"};case"merged":return{state:"idle",reason:"merged_waiting_decision"};case"idle":return{state:"idle",reason:"awaiting_external_review"};default:return{state:"working",reason:"task_in_progress"}}}(c),g=function(a,b){let c=a.pr??null;if(!c)return"merged"===b?{state:"merged",reason:"merged",number:null,url:null}:{state:"none",reason:"not_created",number:null,url:null};let d=aL(c);return{state:"merged"===b?"merged":"open",reason:"merged"===b?"merged":"in_progress",number:d?.number??null,url:c}}(a,c),h=function(a,b){let c=a.tmuxName?.trim()||null,d=b??(a.runtimeHandle?aN(a.runtimeHandle):null);return d||c?{state:"unknown",reason:"spawn_incomplete",handle:d??null,tmuxName:c}:{state:"unknown",reason:"spawn_incomplete",handle:null,tmuxName:null}}(a,b.runtimeHandle??null);return{version:2,session:{kind:d,state:f.state,reason:f.reason,startedAt:"spawning"===c?null:e,completedAt:"done"===c?e:null,terminatedAt:"killed"===c||"terminated"===c||"cleanup"===c?e:null,lastTransitionAt:e},pr:{state:g.state,reason:g.reason,number:g.number,url:g.url,lastObservedAt:g.url?e:null},runtime:{state:h.state,reason:h.reason,lastObservedAt:h.handle||h.tmuxName?e:null,handle:h.handle,tmuxName:h.tmuxName}}}function aV(a,b={}){let c=a.lifecycle?aN(a.lifecycle):a.statePayload&&"2"===a.stateVersion?aN(a.statePayload):null,d=aR.safeParse(c);return d.success?function(a,b,c={}){let d=aU(b,c),e=a.session,f=a.pr,g=a.runtime,h=Object.hasOwn(e??{},"kind"),i=Object.hasOwn(e??{},"state"),j=Object.hasOwn(e??{},"reason"),k=Object.hasOwn(e??{},"startedAt"),l=Object.hasOwn(e??{},"completedAt"),m=Object.hasOwn(e??{},"terminatedAt"),n=Object.hasOwn(e??{},"lastTransitionAt"),o=Object.hasOwn(f??{},"state"),p=Object.hasOwn(f??{},"reason"),q=Object.hasOwn(f??{},"number"),r=Object.hasOwn(f??{},"url"),s=Object.hasOwn(f??{},"lastObservedAt"),t=Object.hasOwn(g??{},"state"),u=Object.hasOwn(g??{},"reason"),v=Object.hasOwn(g??{},"lastObservedAt"),w=Object.hasOwn(g??{},"handle"),x=Object.hasOwn(g??{},"tmuxName");return{version:2,session:{kind:h?e?.kind==="orchestrator"?"orchestrator":"worker":d.session.kind,state:i?e?.state??d.session.state:d.session.state,reason:j?e?.reason??d.session.reason:d.session.reason,startedAt:k?aS(e?.startedAt):d.session.startedAt,completedAt:l?aS(e?.completedAt):d.session.completedAt,terminatedAt:m?aS(e?.terminatedAt):d.session.terminatedAt,lastTransitionAt:n?aS(e?.lastTransitionAt,d.session.lastTransitionAt)??d.session.lastTransitionAt:d.session.lastTransitionAt},pr:{state:o?f?.state??d.pr.state:d.pr.state,reason:p?f?.reason??d.pr.reason:d.pr.reason,number:q?"number"==typeof f?.number?f.number:null:d.pr.number,url:r?"string"==typeof f?.url?f.url:null:d.pr.url,lastObservedAt:s?aS(f?.lastObservedAt):d.pr.lastObservedAt},runtime:{state:t?g?.state??d.runtime.state:d.runtime.state,reason:u?g?.reason??d.runtime.reason:d.runtime.reason,lastObservedAt:v?aS(g?.lastObservedAt):d.runtime.lastObservedAt,handle:w?function(a){if(!a||"object"!=typeof a||"string"!=typeof a.id||"string"!=typeof a.runtimeName)return null;let b=a.data;return{id:a.id,runtimeName:a.runtimeName,data:b&&"object"==typeof b?b:{}}}(g?.handle):d.runtime.handle,tmuxName:x?"string"==typeof g?.tmuxName?g.tmuxName:null:d.runtime.tmuxName}}}(d.data,a,b):aU(a,b)}function aW(a){switch(a.session.state){case"not_started":return"spawning";case"needs_input":return"needs_input";case"stuck":return"stuck";case"done":return"done";case"terminated":switch(a.session.reason){case"manually_killed":case"runtime_lost":return"killed";case"auto_cleanup":case"pr_merged":return"cleanup";case"error_in_process":case"probe_failure":return"errored";default:return"terminated"}case"detecting":return"detecting"}return"merged"===a.pr.state?"merged":"open"===a.pr.state?"ci_failing"===a.pr.reason?"ci_failed":"changes_requested"===a.pr.reason?"changes_requested":"review_pending"===a.pr.reason?"review_pending":"approved"===a.pr.reason?"approved":"merge_ready"===a.pr.reason?"mergeable":"pr_open":"idle"===a.session.state?"idle":"working"}function aX(a){return{lifecycle:JSON.stringify(a),pr:a.pr.url??"",runtimeHandle:a.runtime.handle?JSON.stringify(a.runtime.handle):"",tmuxName:a.runtime.tmuxName??"",role:"orchestrator"===a.session.kind?"orchestrator":""}}function aY(a){return{version:2,session:{...a.session},pr:{...a.pr},runtime:{...a.runtime,handle:a.runtime.handle?{id:a.runtime.handle.id,runtimeName:a.runtime.handle.runtimeName,data:structuredClone(a.runtime.handle.data)}:null}}}let aZ=/^[a-zA-Z0-9_-]+$/;function a$(a,b="session ID"){if(!aZ.test(a))throw Error(`Invalid ${b}: ${a}`)}function a_(a){let b={};for(let[c,d]of Object.entries(a))null!=d&&("object"==typeof d?b[c]=JSON.stringify(d):b[c]=String(d));return b}let a0=".json";function a1(a){return JSON.stringify(a,null,2)+"\n"}function a2(a){try{let b=JSON.parse(a);if("object"!=typeof b||null===b||Array.isArray(b))return null;return b}catch{return null}}function a3(a,b){return a$(b),(0,g.join)(a,`${b}${a0}`)}function a4(a,b){let c,d=a3(a,b);try{c=(0,e.readFileSync)(d,"utf-8").trim()}catch{return null}if(!c)return null;let f=a2(c);if(!f)return null;if(f.lifecycle||f.statePayload&&"2"===f.stateVersion){let a=function(a){if(a.lifecycle&&"object"==typeof a.lifecycle)return a.lifecycle;if(a.statePayload&&"2"===a.stateVersion){if("object"==typeof a.statePayload)return a.statePayload;if("string"==typeof a.statePayload)try{return JSON.parse(a.statePayload)}catch{}}}(f);a&&(f.status=aW(a))}return a_(f)}let a5=new Set(["runtimeHandle","lifecycle","statePayload","dashboard","agentReport","reportWatcher"]);function a6(a,b,c){let d=a3(a,b);(0,e.mkdirSync)((0,g.dirname)(d),{recursive:!0});let f={worktree:c.worktree,branch:c.branch,...c.lifecycle?{}:{status:c.status}};c.tmuxName&&(f.tmuxName=c.tmuxName),c.issue&&(f.issue=c.issue),c.issueTitle&&(f.issueTitle=c.issueTitle),c.pr&&(f.pr=c.pr),void 0!==c.prAutoDetect&&(f.prAutoDetect=c.prAutoDetect),c.summary&&(f.summary=c.summary),c.project&&(f.project=c.project),c.agent&&(f.agent=c.agent),c.createdAt&&(f.createdAt=c.createdAt),c.runtimeHandle&&(f.runtimeHandle=c.runtimeHandle),c.lifecycle&&(f.lifecycle=c.lifecycle),c.restoredAt&&(f.restoredAt=c.restoredAt),c.role&&(f.role=c.role),c.dashboard&&(f.dashboard=c.dashboard),c.opencodeSessionId&&(f.opencodeSessionId=c.opencodeSessionId),c.pinnedSummary&&(f.pinnedSummary=c.pinnedSummary),c.userPrompt&&(f.userPrompt=c.userPrompt),c.displayName&&(f.displayName=c.displayName),void 0!==c.displayNameUserSet&&(f.displayNameUserSet=c.displayNameUserSet),C(d,a1(f))}function a7(a,b,c){a9(a,b,a=>a8(a,c),{createIfMissing:!0})}function a8(a,b){let c={...a};for(let[a,d]of Object.entries(b))if(void 0!==d)if(""===d){let{[a]:b,...d}=c;c=d}else c[a]=d;return c}function a9(a,b,c,d={}){let f=a3(a,b);return F(`${f}.lock`,()=>{let a,b={};try{a=(0,e.readFileSync)(f,"utf-8").trim()}catch{}if(void 0!==a){if(a){let c=a2(a);if(c)b=a_(c);else{let a=`${f}.corrupt-${Date.now()}`;try{(0,e.renameSync)(f,a),console.warn(`[metadata] corrupt JSON at ${f}; preserved as ${a} before rewriting`)}catch{}}}}else if(!d.createIfMissing)return null;let h=Object.fromEntries(Object.entries(c({...b})).filter(([,a])=>void 0!==a&&""!==a));return(0,e.mkdirSync)((0,g.dirname)(f),{recursive:!0}),C(f,a1(function(a){let b={},c=new Set(["dashboardPort","terminalWsPort","directTerminalWsPort"]),d=new Set(["prAutoDetect","displayNameUserSet"]);for(let[e,f]of Object.entries(a))if(void 0!==f&&""!==f)if(d.has(e))b[e]="on"===f||"true"===f||"off"!==f&&"false"!==f&&f;else if(c.has(e)){let a=Number(f);b[e]=Number.isFinite(a)?a:f}else if(a5.has(e)&&(f.startsWith("{")||f.startsWith("[")))try{b[e]=JSON.parse(f)}catch{b[e]=f}else b[e]=f;return b}(h))),h},{timeoutMs:5e3,staleMs:3e4})}function ba(a,b){let c=a3(a,b);if((0,e.existsSync)(c))try{(0,e.unlinkSync)(c)}catch{}}function bb(a){return(0,e.existsSync)(a)?(0,e.readdirSync)(a).filter(b=>{if(!b.endsWith(a0))return!1;let c=b.slice(0,-a0.length);if(!c||c.startsWith(".")||!aZ.test(c))return!1;try{return(0,e.statSync)((0,g.join)(a,b)).isFile()}catch{return!1}}).map(a=>a.slice(0,-a0.length)):[]}function bc(a,b){let c=a3(a,b);(0,e.mkdirSync)((0,g.dirname)(c),{recursive:!0});try{let a=(0,e.openSync)(c,e.constants.O_WRONLY|e.constants.O_CREAT|e.constants.O_EXCL);return(0,e.closeSync)(a),!0}catch{return!1}}let bd=new Set(["active","ready","idle","blocked"]),be=new Set(["active","ready"]),bf=new Set(["idle","blocked"]);function bg(a,b=new Date){if(!a)return"none";let c=Math.max(0,b.getTime()-a.getTime());return c<=6e4?"strong":c<=3e5?"weak":"stale"}function bh(a,b={}){return{state:a,activity:b.activity??null,timestamp:b.timestamp,source:b.source??"none",detail:b.detail}}function bi(a,b,c=new Date){return bd.has(a.state)?!a.timestamp&&bf.has(a.state)?bh("stale",{activity:a.state,source:b,detail:"missing_timestamp"}):a.timestamp?be.has(a.state)&&"stale"===bg(a.timestamp,c)?bh("stale",{activity:a.state,timestamp:a.timestamp,source:b,detail:"stale_timestamp"}):bh("valid",{activity:a.state,timestamp:a.timestamp,source:b}):bh("valid",{activity:a.state,source:b}):bh("valid",{activity:a.state,timestamp:a.timestamp,source:b})}function bj(a){return"valid"===a.state&&a.timestamp instanceof Date&&null!==a.activity&&bf.has(a.activity)}function bk(a){let b="none"===a.source?"":` via_${a.source}`,c=a.activity?` activity=${a.activity}`:"",d=a.timestamp?` at=${a.timestamp.toISOString()}`:"",e=a.detail?` detail=${a.detail}`:"";return`activity_signal=${a.state}${b}${c}${d}${e}`}var bl=c(51455);let bm=["started","working","waiting","needs_input","fixing_ci","addressing_reviews","pr_created","draft_pr_created","ready_for_review","completed"],bn={STATE:"agentReportedState",AT:"agentReportedAt",NOTE:"agentReportedNote",PR_NUMBER:"agentReportedPrNumber",PR_URL:"agentReportedPrUrl",PR_IS_DRAFT:"agentReportedPrIsDraft"};async function bo(a,b){let c=function(a,b){return a$(b),(0,g.join)((0,g.join)(a,".agent-report-audit"),`${b}.ndjson`)}(a,b);return(0,e.existsSync)(c)?(await (0,bl.readFile)(c,"utf8")).split("\n").map(a=>a.trim()).filter(a=>a.length>0).flatMap(a=>{try{let b=JSON.parse(a);if("string"!=typeof b.timestamp||"string"!=typeof b.actor||"acknowledge"!==b.source&&"report"!==b.source||!bm.includes(b.reportState)||"boolean"!=typeof b.accepted||!b.before||!b.after)return[];return[b]}catch{return[]}}).reverse():[]}function bp(a){if(!a)return null;let b=a[bn.STATE],c=a[bn.AT];if(!b||!c||!bm.includes(b))return null;let d=Date.parse(c);if(Number.isNaN(d))return null;let e=a[bn.NOTE],f=a[bn.PR_NUMBER],g=f&&/^\d+$/.test(f)?Number.parseInt(f,10):void 0,h=a[bn.PR_URL]||void 0,i=a[bn.PR_IS_DRAFT];return{state:b,timestamp:new Date(d).toISOString(),note:e&&e.length>0?e:void 0,prNumber:g,prUrl:h,prIsDraft:"true"===i||"false"!==i&&void 0}}function bq(a,b=new Date){if(!a)return!1;let c=Date.parse(a);return!Number.isNaN(c)&&b.getTime()-c>3e5}function br(a){var b;let c="now"in a&&a.now?a.now:new Date,e=c.toISOString(),g=(b=a.evidence,(0,f.createHash)("sha256").update(b.replace(/\sactivity=[^\s]+/g,"").replace(/\sat=[^\s]+/g,"").trim()).digest("hex").slice(0,12)),h="previousEvidenceHash"in a?a.previousEvidenceHash:void 0,i="detectingStartedAt"in a?a.detectingStartedAt:void 0,j=void 0!==h&&h!==g,k=j?e:i??e,l=j?1:a.currentAttempts+1,m=bq(k,c);return l>3||m?{status:d.SB.STUCK,evidence:a.evidence,detecting:{attempts:l,startedAt:k,evidenceHash:g},sessionState:"stuck",sessionReason:a.idleWasBlocked?"error_in_process":"probe_failure"}:{status:d.SB.DETECTING,evidence:a.evidence,detecting:{attempts:l,startedAt:k,evidenceHash:g},sessionState:"detecting",sessionReason:a.reason??"probe_failure"}}function bs(a){return a===d.bz.MERGED?{status:d.SB.MERGED,evidence:"pr_merged",detecting:{attempts:0},prState:"merged",prReason:"merged",sessionState:"idle",sessionReason:"merged_waiting_decision"}:a===d.bz.CLOSED?{status:d.SB.IDLE,evidence:"pr_closed",detecting:{attempts:0},prState:"closed",prReason:"closed_unmerged",sessionState:"idle",sessionReason:"pr_closed_waiting_decision"}:null}function bt(a){if(a.ciFailing)return{status:d.SB.CI_FAILED,evidence:"ci_failing",detecting:{attempts:0},prState:"open",prReason:"ci_failing",sessionState:"working",sessionReason:"fixing_ci"};if("changes_requested"===a.reviewDecision)return{status:d.SB.CHANGES_REQUESTED,evidence:"review_changes_requested",detecting:{attempts:0},prState:"open",prReason:"changes_requested",sessionState:"working",sessionReason:"resolving_review_comments"};if("approved"===a.reviewDecision||"none"===a.reviewDecision){if(a.mergeable)return{status:d.SB.MERGEABLE,evidence:"merge_ready",detecting:{attempts:0},prState:"open",prReason:"merge_ready",sessionState:"idle",sessionReason:"awaiting_external_review"};if("approved"===a.reviewDecision)return{status:d.SB.APPROVED,evidence:"review_approved",detecting:{attempts:0},prState:"open",prReason:"approved",sessionState:"idle",sessionReason:"awaiting_external_review"}}return"pending"===a.reviewDecision?{status:d.SB.REVIEW_PENDING,evidence:"review_pending",detecting:{attempts:0},prState:"open",prReason:"review_pending",sessionState:"idle",sessionReason:"awaiting_external_review"}:a.shouldEscalateIdleToStuck?{status:d.SB.STUCK,evidence:`idle_beyond_threshold ${a.activityEvidence}`,detecting:{attempts:0},prState:"open",prReason:"in_progress",sessionState:"stuck",sessionReason:a.idleWasBlocked?"error_in_process":"probe_failure"}:{status:d.SB.PR_OPEN,evidence:"pr_open",detecting:{attempts:0},prState:"open",prReason:"in_progress",sessionState:"idle",sessionReason:"pr_created"}}function bu(a){if(!a)return 0;let b=Number.parseInt(a,10);return Number.isFinite(b)&&b>0?b:0}let bv={acknowledgeTimeoutMs:6e5,staleReportTimeoutMs:18e5,checkAcknowledge:!0,checkStale:!0,checkBlocked:!0},bw=new Set(["done","terminated","killed","cleanup","merged","errored"]),bx={LAST_AUDITED_AT:"reportWatcherLastAuditedAt",ACTIVE_TRIGGER:"reportWatcherActiveTrigger",TRIGGER_ACTIVATED_AT:"reportWatcherTriggerActivatedAt",TRIGGER_COUNT:"reportWatcherTriggerCount"};var by=c(98995);let bz=(0,by.createRequire)("file:///tmp/ao-publish-stable/packages/core/dist/events-db.js"),bA=null,bB=!1,bC=0,bD=0,bE=/token|password|secret|authorization|cookie|api[-_]?key/i,bF=[[/\bBearer\s+[A-Za-z0-9._~+/=-]{12,}\b/gi,"Bearer [redacted]"],[/\bgh[pousr]_[A-Za-z0-9_]{20,}\b/g,"[redacted]"],[/\bgithub_pat_[A-Za-z0-9_]{20,}\b/g,"[redacted]"],[/\bsk-(?:ant-)?(?:proj-|svcacct-)?[A-Za-z0-9_-]{16,}\b/g,"[redacted]"],[/\bxox[baprs]-[A-Za-z0-9-]{10,}\b/g,"[redacted]"],[/\bAKIA[0-9A-Z]{16}\b/g,"[redacted]"],[/\beyJ[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]{10,}\b/g,"[redacted]"],[/\b([A-Z][A-Z0-9_]*(?:TOKEN|PASSWORD|SECRET|AUTHORIZATION|COOKIE|API_KEY|APIKEY)[A-Z0-9_]*)=([^\s"'`]{6,})/g,"$1=[redacted]"]];function bG(a){try{var b,c;let d=function(){if(bB)return null;if(bA)return bA;try{return bA=function(){let a=bz("better-sqlite3");(0,e.mkdirSync)(r(),{recursive:!0});let b=new a((0,g.join)(r(),"activity-events.db"));b.pragma("journal_mode = WAL"),b.pragma("busy_timeout = 3000"),b.pragma("synchronous = NORMAL");let c=b.pragma("user_version",{simple:!0});b.exec(`
|
|
22
|
+
`)}}}}}let aK=/\/(\d+)$/;function aL(a){let b=function(a){try{return new URL(a)}catch{return null}}(a),c=b?.pathname.split("/").filter(Boolean)??[],d=c.findIndex(a=>"pull"===a);if(d>=2&&d+1<c.length){let b=c[d-2],e=c[d-1],f=c[d+1];if(b&&e&&f&&/^\d+$/.test(f))return{owner:b,repo:e,number:Number.parseInt(f,10),url:a}}let e=c.findIndex((a,b)=>"-"===a&&"merge_requests"===c[b+1]&&b>=2&&b+2<c.length);if(e>=2){let b=c[e-2],d=c[e-1],f=c[e+2];if(b&&d&&f&&/^\d+$/.test(f))return{owner:b,repo:d,number:Number.parseInt(f,10),url:a}}let f=a.match(aK);return f?{owner:"",repo:"",number:parseInt(f[1],10),url:a}:null}let aM=new Set(["spawning","working","detecting","pr_open","ci_failed","review_pending","changes_requested","approved","mergeable","merged","cleanup","needs_input","stuck","errored","killed","idle","done","terminated"]);function aN(a){try{return JSON.parse(a)}catch{return null}}function aO(a){return"starting"===a?"working":a&&aM.has(a)?a:"spawning"}let aP=k.Yj().nullable(),aQ=k.Ik({id:k.Yj(),runtimeName:k.Yj(),data:k.vk(a=>null===a||"object"!=typeof a||Array.isArray(a)?{}:a,k.g1(k.L5()))}),aR=k.Ik({version:k.eu(2),session:k.Ik({kind:k.k5(["worker","orchestrator"]),state:k.k5(["not_started","working","idle","needs_input","stuck","detecting","done","terminated"]),reason:k.k5(["spawn_requested","agent_acknowledged","task_in_progress","pr_created","pr_closed_waiting_decision","fixing_ci","resolving_review_comments","awaiting_user_input","awaiting_external_review","research_complete","merged_waiting_decision","manually_killed","runtime_lost","agent_process_exited","probe_failure","error_in_process","auto_cleanup","pr_merged"]),startedAt:aP,completedAt:aP,terminatedAt:aP,lastTransitionAt:k.Yj()}).partial().optional(),pr:k.Ik({state:k.k5(["none","open","merged","closed"]),reason:k.k5(["not_created","in_progress","ci_failing","review_pending","changes_requested","approved","merge_ready","merged","closed_unmerged","cleared_on_restore"]),number:k.ai().int().nullable(),url:k.Yj().nullable(),lastObservedAt:aP}).partial().optional(),runtime:k.Ik({state:k.k5(["unknown","alive","exited","missing","probe_failed"]),reason:k.k5(["spawn_incomplete","process_running","process_missing","tmux_missing","manual_kill_requested","probe_error","pr_merged_cleanup","auto_cleanup"]),lastObservedAt:aP,handle:aQ.nullable(),tmuxName:k.Yj().nullable()}).partial().optional()});function aS(a,b=null){if("string"!=typeof a)return b;let c=Date.parse(a);return Number.isNaN(c)?b:new Date(c).toISOString()}function aT(a,b=new Date){return{version:2,session:{kind:a,state:"not_started",reason:"spawn_requested",startedAt:null,completedAt:null,terminatedAt:null,lastTransitionAt:b.toISOString()},pr:{state:"none",reason:"not_created",number:null,url:null,lastObservedAt:null},runtime:{state:"unknown",reason:"spawn_incomplete",lastObservedAt:null,handle:null,tmuxName:null}}}function aU(a,b={}){let c=b.status??aO(a.status),d=b.sessionKind??("orchestrator"===a.role||b.sessionId?.endsWith("-orchestrator")?"orchestrator":"worker"),e=b.createdAt?.toISOString()??aS(a.createdAt,new Date().toISOString())??new Date().toISOString(),f=function(a){switch(a){case"spawning":return{state:"not_started",reason:"spawn_requested"};case"needs_input":return{state:"needs_input",reason:"awaiting_user_input"};case"stuck":return{state:"stuck",reason:"probe_failure"};case"errored":return{state:"terminated",reason:"error_in_process"};case"killed":case"terminated":case"cleanup":return{state:"terminated",reason:"manually_killed"};case"done":return{state:"done",reason:"research_complete"};case"merged":return{state:"idle",reason:"merged_waiting_decision"};case"idle":return{state:"idle",reason:"awaiting_external_review"};default:return{state:"working",reason:"task_in_progress"}}}(c),g=function(a,b){let c=a.pr??null;if(!c)return"merged"===b?{state:"merged",reason:"merged",number:null,url:null}:{state:"none",reason:"not_created",number:null,url:null};let d=aL(c);return{state:"merged"===b?"merged":"open",reason:"merged"===b?"merged":"in_progress",number:d?.number??null,url:c}}(a,c),h=function(a,b){let c=a.tmuxName?.trim()||null,d=b??(a.runtimeHandle?aN(a.runtimeHandle):null);return d||c?{state:"unknown",reason:"spawn_incomplete",handle:d??null,tmuxName:c}:{state:"unknown",reason:"spawn_incomplete",handle:null,tmuxName:null}}(a,b.runtimeHandle??null);return{version:2,session:{kind:d,state:f.state,reason:f.reason,startedAt:"spawning"===c?null:e,completedAt:"done"===c?e:null,terminatedAt:"killed"===c||"terminated"===c||"cleanup"===c?e:null,lastTransitionAt:e},pr:{state:g.state,reason:g.reason,number:g.number,url:g.url,lastObservedAt:g.url?e:null},runtime:{state:h.state,reason:h.reason,lastObservedAt:h.handle||h.tmuxName?e:null,handle:h.handle,tmuxName:h.tmuxName}}}function aV(a,b={}){let c=a.lifecycle?aN(a.lifecycle):a.statePayload&&"2"===a.stateVersion?aN(a.statePayload):null,d=aR.safeParse(c);return d.success?function(a,b,c={}){let d=aU(b,c),e=a.session,f=a.pr,g=a.runtime,h=Object.hasOwn(e??{},"kind"),i=Object.hasOwn(e??{},"state"),j=Object.hasOwn(e??{},"reason"),k=Object.hasOwn(e??{},"startedAt"),l=Object.hasOwn(e??{},"completedAt"),m=Object.hasOwn(e??{},"terminatedAt"),n=Object.hasOwn(e??{},"lastTransitionAt"),o=Object.hasOwn(f??{},"state"),p=Object.hasOwn(f??{},"reason"),q=Object.hasOwn(f??{},"number"),r=Object.hasOwn(f??{},"url"),s=Object.hasOwn(f??{},"lastObservedAt"),t=Object.hasOwn(g??{},"state"),u=Object.hasOwn(g??{},"reason"),v=Object.hasOwn(g??{},"lastObservedAt"),w=Object.hasOwn(g??{},"handle"),x=Object.hasOwn(g??{},"tmuxName");return{version:2,session:{kind:h?e?.kind==="orchestrator"?"orchestrator":"worker":d.session.kind,state:i?e?.state??d.session.state:d.session.state,reason:j?e?.reason??d.session.reason:d.session.reason,startedAt:k?aS(e?.startedAt):d.session.startedAt,completedAt:l?aS(e?.completedAt):d.session.completedAt,terminatedAt:m?aS(e?.terminatedAt):d.session.terminatedAt,lastTransitionAt:n?aS(e?.lastTransitionAt,d.session.lastTransitionAt)??d.session.lastTransitionAt:d.session.lastTransitionAt},pr:{state:o?f?.state??d.pr.state:d.pr.state,reason:p?f?.reason??d.pr.reason:d.pr.reason,number:q?"number"==typeof f?.number?f.number:null:d.pr.number,url:r?"string"==typeof f?.url?f.url:null:d.pr.url,lastObservedAt:s?aS(f?.lastObservedAt):d.pr.lastObservedAt},runtime:{state:t?g?.state??d.runtime.state:d.runtime.state,reason:u?g?.reason??d.runtime.reason:d.runtime.reason,lastObservedAt:v?aS(g?.lastObservedAt):d.runtime.lastObservedAt,handle:w?function(a){if(!a||"object"!=typeof a||"string"!=typeof a.id||"string"!=typeof a.runtimeName)return null;let b=a.data;return{id:a.id,runtimeName:a.runtimeName,data:b&&"object"==typeof b?b:{}}}(g?.handle):d.runtime.handle,tmuxName:x?"string"==typeof g?.tmuxName?g.tmuxName:null:d.runtime.tmuxName}}}(d.data,a,b):aU(a,b)}function aW(a){switch(a.session.state){case"not_started":return"spawning";case"needs_input":return"needs_input";case"stuck":return"stuck";case"done":return"done";case"terminated":switch(a.session.reason){case"manually_killed":case"runtime_lost":return"killed";case"auto_cleanup":case"pr_merged":return"cleanup";case"error_in_process":case"probe_failure":return"errored";default:return"terminated"}case"detecting":return"detecting"}return"merged"===a.pr.state?"merged":"open"===a.pr.state?"ci_failing"===a.pr.reason?"ci_failed":"changes_requested"===a.pr.reason?"changes_requested":"review_pending"===a.pr.reason?"review_pending":"approved"===a.pr.reason?"approved":"merge_ready"===a.pr.reason?"mergeable":"pr_open":"idle"===a.session.state?"idle":"working"}function aX(a){return{lifecycle:JSON.stringify(a),pr:a.pr.url??"",runtimeHandle:a.runtime.handle?JSON.stringify(a.runtime.handle):"",tmuxName:a.runtime.tmuxName??"",role:"orchestrator"===a.session.kind?"orchestrator":""}}function aY(a){return{version:2,session:{...a.session},pr:{...a.pr},runtime:{...a.runtime,handle:a.runtime.handle?{id:a.runtime.handle.id,runtimeName:a.runtime.handle.runtimeName,data:structuredClone(a.runtime.handle.data)}:null}}}let aZ=/^[a-zA-Z0-9_-]+$/;function a$(a,b="session ID"){if(!aZ.test(a))throw Error(`Invalid ${b}: ${a}`)}function a_(a){let b={};for(let[c,d]of Object.entries(a))null!=d&&("object"==typeof d?b[c]=JSON.stringify(d):b[c]=String(d));return b}let a0=".json";function a1(a){return JSON.stringify(a,null,2)+"\n"}function a2(a){try{let b=JSON.parse(a);if("object"!=typeof b||null===b||Array.isArray(b))return null;return b}catch{return null}}function a3(a,b){return a$(b),(0,g.join)(a,`${b}${a0}`)}function a4(a,b){let c,d=a3(a,b);try{c=(0,e.readFileSync)(d,"utf-8").trim()}catch{return null}if(!c)return null;let f=a2(c);if(!f)return null;if(f.lifecycle||f.statePayload&&"2"===f.stateVersion){let a=function(a){if(a.lifecycle&&"object"==typeof a.lifecycle)return a.lifecycle;if(a.statePayload&&"2"===a.stateVersion){if("object"==typeof a.statePayload)return a.statePayload;if("string"==typeof a.statePayload)try{return JSON.parse(a.statePayload)}catch{}}}(f);a&&(f.status=aW(a))}return a_(f)}let a5=new Set(["runtimeHandle","lifecycle","statePayload","dashboard","agentReport","reportWatcher"]);function a6(a,b,c){let d=a3(a,b);(0,e.mkdirSync)((0,g.dirname)(d),{recursive:!0});let f={worktree:c.worktree,branch:c.branch,...c.lifecycle?{}:{status:c.status}};c.tmuxName&&(f.tmuxName=c.tmuxName),c.issue&&(f.issue=c.issue),c.issueTitle&&(f.issueTitle=c.issueTitle),c.pr&&(f.pr=c.pr),void 0!==c.prAutoDetect&&(f.prAutoDetect=c.prAutoDetect),c.summary&&(f.summary=c.summary),c.project&&(f.project=c.project),c.agent&&(f.agent=c.agent),c.createdAt&&(f.createdAt=c.createdAt),c.runtimeHandle&&(f.runtimeHandle=c.runtimeHandle),c.lifecycle&&(f.lifecycle=c.lifecycle),c.restoredAt&&(f.restoredAt=c.restoredAt),c.role&&(f.role=c.role),c.dashboard&&(f.dashboard=c.dashboard),c.opencodeSessionId&&(f.opencodeSessionId=c.opencodeSessionId),c.pinnedSummary&&(f.pinnedSummary=c.pinnedSummary),c.userPrompt&&(f.userPrompt=c.userPrompt),c.displayName&&(f.displayName=c.displayName),void 0!==c.displayNameUserSet&&(f.displayNameUserSet=c.displayNameUserSet),C(d,a1(f))}function a7(a,b,c){a9(a,b,a=>a8(a,c),{createIfMissing:!0})}function a8(a,b){let c={...a};for(let[a,d]of Object.entries(b))if(void 0!==d)if(""===d){let{[a]:b,...d}=c;c=d}else c[a]=d;return c}function a9(a,b,c,d={}){let f=a3(a,b);return F(`${f}.lock`,()=>{let a,b={};try{a=(0,e.readFileSync)(f,"utf-8").trim()}catch{}if(void 0!==a){if(a){let c=a2(a);if(c)b=a_(c);else{let a=`${f}.corrupt-${Date.now()}`;try{(0,e.renameSync)(f,a),console.warn(`[metadata] corrupt JSON at ${f}; preserved as ${a} before rewriting`)}catch{}}}}else if(!d.createIfMissing)return null;let h=Object.fromEntries(Object.entries(c({...b})).filter(([,a])=>void 0!==a&&""!==a));return(0,e.mkdirSync)((0,g.dirname)(f),{recursive:!0}),C(f,a1(function(a){let b={},c=new Set(["dashboardPort","terminalWsPort","directTerminalWsPort"]),d=new Set(["prAutoDetect","displayNameUserSet"]);for(let[e,f]of Object.entries(a))if(void 0!==f&&""!==f)if(d.has(e))b[e]="on"===f||"true"===f||"off"!==f&&"false"!==f&&f;else if(c.has(e)){let a=Number(f);b[e]=Number.isFinite(a)?a:f}else if(a5.has(e)&&(f.startsWith("{")||f.startsWith("[")))try{b[e]=JSON.parse(f)}catch{b[e]=f}else b[e]=f;return b}(h))),h},{timeoutMs:5e3,staleMs:3e4})}function ba(a,b){let c=a3(a,b);if((0,e.existsSync)(c))try{(0,e.unlinkSync)(c)}catch{}}function bb(a){return(0,e.existsSync)(a)?(0,e.readdirSync)(a).filter(b=>{if(!b.endsWith(a0))return!1;let c=b.slice(0,-a0.length);if(!c||c.startsWith(".")||!aZ.test(c))return!1;try{return(0,e.statSync)((0,g.join)(a,b)).isFile()}catch{return!1}}).map(a=>a.slice(0,-a0.length)):[]}function bc(a,b){let c=a3(a,b);(0,e.mkdirSync)((0,g.dirname)(c),{recursive:!0});try{let a=(0,e.openSync)(c,e.constants.O_WRONLY|e.constants.O_CREAT|e.constants.O_EXCL);return(0,e.closeSync)(a),!0}catch{return!1}}let bd=new Set(["active","ready","idle","blocked"]),be=new Set(["active","ready"]),bf=new Set(["idle","blocked"]);function bg(a,b=new Date){if(!a)return"none";let c=Math.max(0,b.getTime()-a.getTime());return c<=6e4?"strong":c<=3e5?"weak":"stale"}function bh(a,b={}){return{state:a,activity:b.activity??null,timestamp:b.timestamp,source:b.source??"none",detail:b.detail}}function bi(a,b,c=new Date){return bd.has(a.state)?!a.timestamp&&bf.has(a.state)?bh("stale",{activity:a.state,source:b,detail:"missing_timestamp"}):a.timestamp?be.has(a.state)&&"stale"===bg(a.timestamp,c)?bh("stale",{activity:a.state,timestamp:a.timestamp,source:b,detail:"stale_timestamp"}):bh("valid",{activity:a.state,timestamp:a.timestamp,source:b}):bh("valid",{activity:a.state,source:b}):bh("valid",{activity:a.state,timestamp:a.timestamp,source:b})}function bj(a){return"valid"===a.state&&a.timestamp instanceof Date&&null!==a.activity&&bf.has(a.activity)}function bk(a){let b="none"===a.source?"":` via_${a.source}`,c=a.activity?` activity=${a.activity}`:"",d=a.timestamp?` at=${a.timestamp.toISOString()}`:"",e=a.detail?` detail=${a.detail}`:"";return`activity_signal=${a.state}${b}${c}${d}${e}`}var bl=c(51455);let bm=["started","working","waiting","needs_input","fixing_ci","addressing_reviews","pr_created","draft_pr_created","ready_for_review","completed"],bn={STATE:"agentReportedState",AT:"agentReportedAt",NOTE:"agentReportedNote",PR_NUMBER:"agentReportedPrNumber",PR_URL:"agentReportedPrUrl",PR_IS_DRAFT:"agentReportedPrIsDraft"};async function bo(a,b){let c=function(a,b){return a$(b),(0,g.join)((0,g.join)(a,".agent-report-audit"),`${b}.ndjson`)}(a,b);return(0,e.existsSync)(c)?(await (0,bl.readFile)(c,"utf8")).split("\n").map(a=>a.trim()).filter(a=>a.length>0).flatMap(a=>{try{let b=JSON.parse(a);if("string"!=typeof b.timestamp||"string"!=typeof b.actor||"acknowledge"!==b.source&&"report"!==b.source||!bm.includes(b.reportState)||"boolean"!=typeof b.accepted||!b.before||!b.after)return[];return[b]}catch{return[]}}).reverse():[]}function bp(a){if(!a)return null;let b=a[bn.STATE],c=a[bn.AT];if(!b||!c||!bm.includes(b))return null;let d=Date.parse(c);if(Number.isNaN(d))return null;let e=a[bn.NOTE],f=a[bn.PR_NUMBER],g=f&&/^\d+$/.test(f)?Number.parseInt(f,10):void 0,h=a[bn.PR_URL]||void 0,i=a[bn.PR_IS_DRAFT];return{state:b,timestamp:new Date(d).toISOString(),note:e&&e.length>0?e:void 0,prNumber:g,prUrl:h,prIsDraft:"true"===i||"false"!==i&&void 0}}function bq(a,b=new Date){if(!a)return!1;let c=Date.parse(a);return!Number.isNaN(c)&&b.getTime()-c>3e5}function br(a){var b;let c="now"in a&&a.now?a.now:new Date,e=c.toISOString(),g=(b=a.evidence,(0,f.createHash)("sha256").update(b.replace(/\sactivity=[^\s]+/g,"").replace(/\sat=[^\s]+/g,"").trim()).digest("hex").slice(0,12)),h="previousEvidenceHash"in a?a.previousEvidenceHash:void 0,i="detectingStartedAt"in a?a.detectingStartedAt:void 0,j=void 0!==h&&h!==g,k=j?e:i??e,l=j?1:a.currentAttempts+1,m=bq(k,c);return l>3||m?{status:d.SB.STUCK,evidence:a.evidence,detecting:{attempts:l,startedAt:k,evidenceHash:g},sessionState:"stuck",sessionReason:a.idleWasBlocked?"error_in_process":"probe_failure"}:{status:d.SB.DETECTING,evidence:a.evidence,detecting:{attempts:l,startedAt:k,evidenceHash:g},sessionState:"detecting",sessionReason:a.reason??"probe_failure"}}function bs(a){return a===d.bz.MERGED?{status:d.SB.MERGED,evidence:"pr_merged",detecting:{attempts:0},prState:"merged",prReason:"merged",sessionState:"idle",sessionReason:"merged_waiting_decision"}:a===d.bz.CLOSED?{status:d.SB.IDLE,evidence:"pr_closed",detecting:{attempts:0},prState:"closed",prReason:"closed_unmerged",sessionState:"idle",sessionReason:"pr_closed_waiting_decision"}:null}function bt(a){if(a.ciFailing)return{status:d.SB.CI_FAILED,evidence:"ci_failing",detecting:{attempts:0},prState:"open",prReason:"ci_failing",sessionState:"working",sessionReason:"fixing_ci"};if("changes_requested"===a.reviewDecision)return{status:d.SB.CHANGES_REQUESTED,evidence:"review_changes_requested",detecting:{attempts:0},prState:"open",prReason:"changes_requested",sessionState:"working",sessionReason:"resolving_review_comments"};if("approved"===a.reviewDecision||"none"===a.reviewDecision){if(a.mergeable)return{status:d.SB.MERGEABLE,evidence:"merge_ready",detecting:{attempts:0},prState:"open",prReason:"merge_ready",sessionState:"idle",sessionReason:"awaiting_external_review"};if("approved"===a.reviewDecision)return{status:d.SB.APPROVED,evidence:"review_approved",detecting:{attempts:0},prState:"open",prReason:"approved",sessionState:"idle",sessionReason:"awaiting_external_review"}}return"pending"===a.reviewDecision?{status:d.SB.REVIEW_PENDING,evidence:"review_pending",detecting:{attempts:0},prState:"open",prReason:"review_pending",sessionState:"idle",sessionReason:"awaiting_external_review"}:a.shouldEscalateIdleToStuck?{status:d.SB.STUCK,evidence:`idle_beyond_threshold ${a.activityEvidence}`,detecting:{attempts:0},prState:"open",prReason:"in_progress",sessionState:"stuck",sessionReason:a.idleWasBlocked?"error_in_process":"probe_failure"}:{status:d.SB.PR_OPEN,evidence:"pr_open",detecting:{attempts:0},prState:"open",prReason:"in_progress",sessionState:"idle",sessionReason:"pr_created"}}function bu(a){if(!a)return 0;let b=Number.parseInt(a,10);return Number.isFinite(b)&&b>0?b:0}let bv={acknowledgeTimeoutMs:6e5,staleReportTimeoutMs:18e5,checkAcknowledge:!0,checkStale:!0,checkBlocked:!0},bw=new Set(["done","terminated","killed","cleanup","merged","errored"]),bx={LAST_AUDITED_AT:"reportWatcherLastAuditedAt",ACTIVE_TRIGGER:"reportWatcherActiveTrigger",TRIGGER_ACTIVATED_AT:"reportWatcherTriggerActivatedAt",TRIGGER_COUNT:"reportWatcherTriggerCount"};var by=c(98995);let bz=(0,by.createRequire)("file:///tmp/ao-publish-work/packages/core/dist/events-db.js"),bA=null,bB=!1,bC=0,bD=0,bE=/token|password|secret|authorization|cookie|api[-_]?key/i,bF=[[/\bBearer\s+[A-Za-z0-9._~+/=-]{12,}\b/gi,"Bearer [redacted]"],[/\bgh[pousr]_[A-Za-z0-9_]{20,}\b/g,"[redacted]"],[/\bgithub_pat_[A-Za-z0-9_]{20,}\b/g,"[redacted]"],[/\bsk-(?:ant-)?(?:proj-|svcacct-)?[A-Za-z0-9_-]{16,}\b/g,"[redacted]"],[/\bxox[baprs]-[A-Za-z0-9-]{10,}\b/g,"[redacted]"],[/\bAKIA[0-9A-Z]{16}\b/g,"[redacted]"],[/\beyJ[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]{10,}\b/g,"[redacted]"],[/\b([A-Z][A-Z0-9_]*(?:TOKEN|PASSWORD|SECRET|AUTHORIZATION|COOKIE|API_KEY|APIKEY)[A-Z0-9_]*)=([^\s"'`]{6,})/g,"$1=[redacted]"]];function bG(a){try{var b,c;let d=function(){if(bB)return null;if(bA)return bA;try{return bA=function(){let a=bz("better-sqlite3");(0,e.mkdirSync)(r(),{recursive:!0});let b=new a((0,g.join)(r(),"activity-events.db"));b.pragma("journal_mode = WAL"),b.pragma("busy_timeout = 3000"),b.pragma("synchronous = NORMAL");let c=b.pragma("user_version",{simple:!0});b.exec(`
|
|
23
23
|
CREATE TABLE IF NOT EXISTS activity_events (
|
|
24
24
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
25
25
|
ts_epoch INTEGER NOT NULL,
|
|
@@ -868,7 +868,7 @@ process.exit(exitCode);
|
|
|
868
868
|
|
|
869
869
|
You are running inside an Agent Orchestrator managed workspace.
|
|
870
870
|
Session metadata is updated automatically via shell wrappers.
|
|
871
|
-
`:cc.trimStart();await (0,bl.writeFile)(d,e,"utf-8")}let cf=(0,t.promisify)(s.execFile),cg="win32"===process.platform?{shell:!0,windowsHide:!0}:{};async function ch(a){let b,c=bK(a);if(c){for(let a of[0,200,600]){a>0&&await new Promise(b=>setTimeout(b,a));try{await cf("opencode",["session","delete",c],{timeout:3e4,...cg,env:bO()}),bR();return}catch(a){if(function(a){if(!(a instanceof Error))return!1;let b=[a.message,a.stderr,a.stdout].filter(Boolean).join("\n");return/session not found/i.test(b)}(a))return void bR();b=a}}throw b instanceof Error?b:Error(String(b))}}async function ci(a=1e4){return bQ({timeoutMs:a})}async function cj(a,b=1e4,c){let d=await (c??ci(b)),e=`AO:${a}`;return d.filter(a=>a.title===e).sort((a,b)=>{let c=a.updatedAt??-1/0,d=b.updatedAt??-1/0;return c===d?0:d-c}).map(a=>a.id)}async function ck(a,b,c){return(await cj(a,b,c))[0]}function cl(a){return a.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}let cm=new Set(["pr_open","ci_failed","review_pending","changes_requested","approved","mergeable"]),cn=new Set([...cm,"merged"]);function co(a){let b=a=>{let b=a.replace(/\s+/g," ").trim(),c=Array.from(b);return c.length<=80?b:`${c.slice(0,79).join("").trimEnd()}…`};if(a.issueTitle&&a.issueTitle.trim())return b(a.issueTitle);if(a.prompt&&a.prompt.trim()){let c=a.prompt.split(/\r?\n/).map(a=>a.trim()).find(a=>a.length>0)??"";if(c)return b(c)}}function cp(a){return new Promise(b=>setTimeout(b,a))}async function cq(a){try{let{stdout:b}=await cf("tmux",["display-message","-p","-t",a,"#{pane_current_command}"],{timeout:5e3,windowsHide:!0}),c=b.trim();return c.length>0?c:null}catch{return null}}function cr(a){let b=a.lifecycle??a.statePayload;if(b)try{return JSON.parse(b)}catch{return}}function cs(a,b,c,d,e,f){let g="orchestrator"===b.role||d&&RegExp(`^${cl(d)}-orchestrator-\\d+$`).test(a)?"orchestrator":"worker";return function(a,b,c={}){let d=void 0!==c.runtimeHandle?c.runtimeHandle:b.runtimeHandle?aN(b.runtimeHandle):null,e=aV(b,{sessionId:a,status:c.status??aO(b.status),runtimeHandle:d,createdAt:c.createdAt,sessionKind:c.sessionKind}),f=c.status??aW(e),g=e.pr.url??b.pr,h="true"===b[bn.PR_IS_DRAFT];return{id:a,projectId:b.project??c.projectId??"",status:f,activity:c.activity??null,activitySignal:c.activitySignal?c.activitySignal:void 0===c.activity||null===c.activity?bh("unavailable"):bh("valid",{activity:c.activity,timestamp:c.lastActivityAt,source:"exited"===c.activity?"runtime":"native"}),lifecycle:e,branch:b.branch||null,issueId:b.issue||null,pr:g?(()=>{let a=aL(g);return{number:e.pr.number??a?.number??0,url:g,title:"",owner:a?.owner??"",repo:a?.repo??"",branch:b.branch??"",baseBranch:"",isDraft:h}})():null,workspacePath:b.worktree||null,runtimeHandle:e.runtime.handle??d,agentInfo:b.summary?{summary:b.summary,agentSessionId:null}:null,createdAt:b.createdAt?new Date(b.createdAt):c.createdAt??new Date,lastActivityAt:c.lastActivityAt??new Date,restoredAt:c.restoredAt??(b.restoredAt?new Date(b.restoredAt):void 0),metadata:b}}(a,b,{projectId:c,sessionKind:g,createdAt:e,lastActivityAt:f??new Date})}function ct(a){let{config:b,registry:c}=a;function f(a){return(0,g.resolve)(a).replace(/[/\\]$/,"")}function i(a,b,c){return!!a&&!!b&&f(c)!==f(a.path)&&(function(a,b){let c=[p(a)],d=new Set;for(let e of(d.add(a),d.add((0,g.basename)(b)),d))c.push((0,g.join)((0,h.homedir)(),".worktrees",e));return c})(b,a.path).some(a=>(function(a,b){let c=f(a),d=f(b),e="win32"===process.platform?"\\":"/";return c===d||c.startsWith(`${d}${e}`)})(c,a))}function j(a,b,c){return!!b&&("orchestrator"===b.role||!!c&&(a===`${c}-orchestrator`||RegExp(`^${cl(c)}-orchestrator-\\d+$`).test(a)))}function k(a,b,c){return b===`${a.sessionPrefix}-orchestrator`||j(b,c??{},a.sessionPrefix)}function l(a,b){let c={...a};for(let[a,d]of Object.entries(b))if(void 0!==d){if(""===d){let{[a]:b,...d}=c;c=d;continue}c[a]=d}return c}function m(a,b,c){let d=aY(aV(b,{sessionId:a,status:aO(b.status)}));return c(d),d}function q(a,b,c,d){let f=(0,g.join)(a,`${b}.json`),h=d;if(!h)try{h=(0,e.statSync)(f).mtime}catch{h=void 0}if(a7(a,b,c),h)try{(0,e.utimesSync)(f,h,h)}catch{}}let r=null,s=new Map;function t(){r=null}function u(a,b,c){let d={...b,raw:{...b.raw}};if(!j(d.sessionName,d.raw,c))return d;let e={};if("orchestrator"!==d.raw.role&&(e.role="orchestrator"),d.raw.pr&&(e.pr=""),"off"!==d.raw.prAutoDetect&&"false"!==d.raw.prAutoDetect&&(e.prAutoDetect="false"),cn.has(d.raw.status??"")&&(e.status="working"),Object.keys(e).length>0){let b=m(d.sessionName,d.raw,a=>{a.session.kind="orchestrator",a.pr.state="none",a.pr.reason="not_created",a.pr.number=null,a.pr.url=null,a.pr.lastObservedAt=null,"working"===e.status&&(a.session.state="working",a.session.reason="task_in_progress")});q(a,d.sessionName,{...e,...(d.raw,aX(b))},d.modifiedAt),d.raw=l(d.raw,{...e,...(d.raw,aX(b))})}return d}function v(a){let b=Date.parse(a.raw.restoredAt??a.raw.createdAt??"");return a.modifiedAt?a.modifiedAt.getTime():Number.isNaN(b)?0:b}function w(a,b){let c=o(a);if(!(0,e.existsSync)(c))return[];let d=bb(c).flatMap(a=>{let b,d=a4(c,a);if(!d)return[];try{b=(0,e.statSync)((0,g.join)(c,`${a}.json`)).mtime}catch{}return[{sessionName:a,raw:d,modifiedAt:b}]});return function(a,b,c){let d=b.map(a=>({...a,raw:{...a.raw}})),e=new Map;for(let b of d){if(!b.raw.lifecycle&&(!b.raw.statePayload||"2"!==b.raw.stateVersion)){let d=aY(aV(b.raw,{sessionId:b.sessionName,status:aO(b.raw.status),createdAt:b.raw.createdAt?new Date(b.raw.createdAt):void 0,sessionKind:j(b.sessionName,b.raw,c)?"orchestrator":"worker"})),e=(b.raw,aX(d));q(a,b.sessionName,e,b.modifiedAt),b.raw=l(b.raw,e)}if(j(b.sessionName,b.raw,c)){b.raw=u(a,b,c).raw;continue}let d=b.raw.pr;if(!d)continue;let f=e.get(d)??[];f.push(b),e.set(d,f)}for(let b of e.values()){if(b.length<2)continue;let[c,...d]=[...b].sort((a,b)=>{let c=Number(cm.has(b.raw.status??""))-Number(cm.has(a.raw.status??""));if(0!==c)return c;let d=v(b)-v(a);return 0!==d?d:b.sessionName.localeCompare(a.sessionName)});for(let b of d){let c={pr:"",prAutoDetect:"false",...cm.has(b.raw.status??"")?{status:"working"}:{}},d=m(b.sessionName,b.raw,a=>{a.pr.state="none",a.pr.reason="not_created",a.pr.number=null,a.pr.url=null,a.pr.lastObservedAt=null,"working"===c.status&&(a.session.state="working",a.session.reason="task_in_progress")}),e=(b.raw,aX(d));q(a,b.sessionName,{...c,...e},b.modifiedAt),b.raw=l(b.raw,{...c,...e})}}return d}(c,d,b.sessionPrefix)}async function x(a){let{sessionsDir:b,criteria:c,strategy:d,includeTitleDiscoveryForSessionId:e=!1}=a;if("ignore"===d)return;let f=function(a,b){let c=[],d=(a,d)=>{if(!d||"opencode"!==d.agent||void 0!==b.issueId&&d.issue!==b.issueId||void 0!==b.sessionId&&a!==b.sessionId)return;let e=bK(d?.opencodeSessionId);e&&c.push(e)};for(let b of function(a){let b=a=>{let b=a.match(/-(\d+)$/);if(!b)return;let c=Number.parseInt(b[1],10);return Number.isNaN(c)?void 0:c};return[...a].sort((a,c)=>{let d=b(a),e=b(c);return void 0!==d&&void 0!==e&&d!==e?e-d:void 0!==d&&void 0===e?-1:void 0===d&&void 0!==e?1:c.localeCompare(a)})}(bb(a)))d(b,a4(a,b));return[...new Set(c)]}(b,c);if("delete"===d){for(let a of(e&&c.sessionId&&(f=[...f,...await cj(c.sessionId)]),[...new Set(f)]))await ch(a);return}return 0===f.length&&c.sessionId&&(f=await cj(c.sessionId)),f[0]}async function y(a){try{let{stdout:b}=await cf("git",["ls-remote","--heads","origin",`session/${a.sessionPrefix}-*`],{cwd:a.path,timeout:5e3,...cg});return b.split("\n").flatMap(b=>{let c=b.trim();if(!c)return[];let d=(c.split(/\s+/)[1]??"").match(RegExp(`refs/heads/session/${cl(a.sessionPrefix)}-(\\d+)$`));if(!d)return[];let e=Number.parseInt(d[1],10);return Number.isNaN(e)?[]:[e]}).filter((a,b,c)=>c.indexOf(a)===b)}catch{return[]}}async function z(a,b){let c=new Set;for(let d of bb(b)){let b=function(a,b){let c=a.match(RegExp(`^${cl(b)}-(\\d+)$`));if(!c)return;let d=Number.parseInt(c[1],10);return Number.isNaN(d)?void 0:d}(d,a.sessionPrefix);void 0!==b&&c.add(b)}for(let b of(await y(a)))c.add(b);let d=function(a,b){let c=0,d=RegExp(`^${cl(b)}-(\\d+)$`);for(let b of a){let a=b.match(d);if(a){let b=parseInt(a[1],10);b>c&&(c=b)}}return c+1}([...c].map(b=>`${a.sessionPrefix}-${b}`),a.sessionPrefix);for(let g=0;g<1e4;g++){var e,f;let g=`${a.sessionPrefix}-${d}`,h=a.path?(e=a.sessionPrefix,f=d,`${e}-${f}`):void 0;if(!c.has(d)&&bc(b,g))return{num:d,sessionId:g,tmuxName:h};c.add(d),d+=1}throw Error(`Failed to reserve session ID after 10000 attempts (prefix: ${a.sessionPrefix})`)}function A(a,d){let e=c.get("runtime",a.runtime??b.defaults.runtime),f=c.get("agent",d??a.agent??b.defaults.agent),g=c.get("workspace",a.workspace??b.defaults.workspace);return{runtime:e,agent:f,workspace:g,tracker:a.tracker?.plugin?c.get("tracker",a.tracker.plugin):null,scm:a.scm?.plugin?c.get("scm",a.scm.plugin):null}}function B(a,c,d){return b2({role:b1(c,d,a.sessionPrefix,Object.values(b.projects).map(a=>a.sessionPrefix)),project:a,defaults:b.defaults,persistedAgent:d.agent})}async function C(a,b,c,d,e){if("opencode"!==d||bK(a.metadata.opencodeSessionId))return;let f=await ck(b,1e4,e);f&&(a.metadata.opencodeSessionId=f,a7(c,b,{opencodeSessionId:f}))}function D(a){for(let[c,d]of Object.entries(b.projects)){let b,f=o(c),h=a4(f,a);if(h){try{b=(0,e.statSync)((0,g.join)(f,`${a}.json`)).mtime}catch{b=void 0}return{raw:u(f,{sessionName:a,raw:h,modifiedAt:b},d.sessionPrefix).raw,sessionsDir:f,project:d,projectId:c}}}return null}function E(a){let b=D(a);if(!b)throw new d.Ag(a);return b}async function F(a,c,d,e,f,g,h){await C(a,c,d,f,h);let i=a.metadata.tmuxName?.trim(),j="string"==typeof i&&i.length>0,k=null!==a.runtimeHandle||j;k?!a.runtimeHandle&&j&&(a.runtimeHandle={id:i,runtimeName:e.runtime??b.defaults.runtime,data:{}}):a.runtimeHandle={id:c,runtimeName:e.runtime??b.defaults.runtime,data:{}},await H(a,g,k,d)}let G=new Set(["killed","done","merged","terminated","cleanup"]);async function H(a,c,d,e){if(d&&a.runtimeHandle&&c.runtime&&"spawning"!==a.status)try{if(!await c.runtime.isAlive(a.runtimeHandle)){a.lifecycle.runtime.state="missing",a.lifecycle.runtime.reason="tmux"===a.runtimeHandle.runtimeName?"tmux_missing":"process_missing",a.lifecycle.runtime.lastObservedAt=new Date().toISOString(),"done"!==a.lifecycle.session.state&&"terminated"!==a.lifecycle.session.state&&(a.lifecycle.session.state="detecting",a.lifecycle.session.reason="runtime_lost",a.lifecycle.session.lastTransitionAt=new Date().toISOString()),G.has(a.status)||(a.status="killed"),a.activity="exited",a.activitySignal=bh("valid",{activity:"exited",source:"runtime"});return}}catch{a.lifecycle.runtime.state="probe_failed",a.lifecycle.runtime.reason="probe_error",a.lifecycle.runtime.lastObservedAt=new Date().toISOString()}if(a.activitySignal=bh("unavailable"),c.agent){let d;try{let d=await c.agent.getActivityState(a,b.readyThresholdMs);null!==d?(a.activitySignal=bi(d,"native"),a.activity=d.state,a.lifecycle.runtime.state="alive",a.lifecycle.runtime.reason="process_running",a.lifecycle.runtime.lastObservedAt=new Date().toISOString(),d.timestamp&&d.timestamp>a.lastActivityAt&&(a.lastActivityAt=d.timestamp)):a.activitySignal=bh("null",{source:"native"})}catch{a.activitySignal=bh("probe_failure",{source:"native"})}try{d=await c.agent.getSessionInfo(a)}catch{d=null}if(d){a.agentInfo=d;let b=d.metadata??{};if(Object.keys(b).length>0)try{a7(e,a.id,b),a.metadata=a8(a.metadata,b),t()}catch{}}}}async function I(a){let c,f=b.projects[a.projectId];if(!f)throw Error(`Unknown project: ${a.projectId}`);let h=b2({role:"worker",project:f,defaults:b.defaults,spawnAgentOverride:a.agent}),j=A(f,h.agentName);if(!j.runtime)throw Error(`Runtime plugin '${f.runtime??b.defaults.runtime}' not found`);if(!j.agent)throw Error(`Agent plugin '${h.agentName}' not found`);if(a.issueId&&j.tracker)try{c=await j.tracker.getIssue(a.issueId,f)}catch(b){if((0,d.Fx)(b));else throw Error(`Failed to fetch issue ${a.issueId}: ${b}`,{cause:b})}let k=o(a.projectId),l=new bW;try{let d,m,o,{sessionId:q,tmuxName:r}=await z(f,k);if(l.push(()=>ba(k,q)),a.branch)d=a.branch;else if(a.issueId&&j.tracker&&c){let b=c.branchName;d=b&&function(a){if(!a||"@"===a||a.startsWith(".")||a.endsWith(".")||a.endsWith("/")||a.endsWith(".lock")||a.includes("..")||a.includes("//")||a.includes("/.")||a.includes("@{")||a.startsWith("/"))return!1;for(let b=0;b<a.length;b++){let c=a.charCodeAt(b);if(c<=31||127===c)return!1}return!/[\s~^:?*[\\]/.test(a)}(b)?b:j.tracker.branchName(a.issueId,f)}else if(a.issueId){let b=a.issueId,c=/^[A-Za-z0-9][A-Za-z0-9._-]*$/.test(b)&&!b.includes("..")?b:b.toLowerCase().replace(/[^a-z0-9]+/g,"-").slice(0,60).replace(/^-+|-+$/g,"");d=`feat/${c||q}`}else d=`session/${q}`;let s=f.path;if(j.workspace){let b=await j.workspace.create({projectId:a.projectId,project:f,sessionId:q,branch:d,worktreeDir:p(a.projectId)});if(s=b.path,i(f,a.projectId,s)){let a=j.workspace;l.push(()=>a.destroy(s))}j.workspace.postCreate&&await j.workspace.postCreate(b,f)}if(a.issueId&&j.tracker&&c)try{m=await j.tracker.generatePrompt(a.issueId,f)}catch{}let u=`${f.sessionPrefix}-orchestrator`,v=null!==a4(k,u),{systemPrompt:w,taskPrompt:y}=function(a){let b=function(a){let b=[];if(a.agentRules&&b.push(a.agentRules),a.agentRulesFile){let c=(0,g.resolve)(a.path,a.agentRulesFile);try{let a=(0,e.readFileSync)(c,"utf-8").trim();a&&b.push(a)}catch{}}return b.length>0?b.join("\n\n"):null}(a.project),c=[];return c.push(a.project.repo?bH:bI),a.orchestratorSessionId&&c.push(`## Talking to the Orchestrator
|
|
871
|
+
`:cc.trimStart();await (0,bl.writeFile)(d,e,"utf-8")}let cf=(0,t.promisify)(s.execFile),cg="win32"===process.platform?{shell:!0,windowsHide:!0}:{};async function ch(a){let b,c=bK(a);if(c){for(let a of[0,200,600]){a>0&&await new Promise(b=>setTimeout(b,a));try{await cf("opencode",["session","delete",c],{timeout:3e4,...cg,env:bO()}),bR();return}catch(a){if(function(a){if(!(a instanceof Error))return!1;let b=[a.message,a.stderr,a.stdout].filter(Boolean).join("\n");return/session not found/i.test(b)}(a))return void bR();b=a}}throw b instanceof Error?b:Error(String(b))}}async function ci(a=1e4){return bQ({timeoutMs:a})}async function cj(a,b=1e4,c){let d=await (c??ci(b)),e=`AO:${a}`;return d.filter(a=>a.title===e).sort((a,b)=>{let c=a.updatedAt??-1/0,d=b.updatedAt??-1/0;return c===d?0:d-c}).map(a=>a.id)}async function ck(a,b,c){return(await cj(a,b,c))[0]}function cl(a){return a.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}let cm=new Set(["pr_open","ci_failed","review_pending","changes_requested","approved","mergeable"]),cn=new Set([...cm,"merged"]);function co(a){let b=a=>{let b=a.replace(/\s+/g," ").trim(),c=Array.from(b);return c.length<=80?b:`${c.slice(0,79).join("").trimEnd()}…`};if(a.issueTitle&&a.issueTitle.trim())return b(a.issueTitle);if(a.prompt&&a.prompt.trim()){let c=a.prompt.split(/\r?\n/).map(a=>a.trim()).find(a=>a.length>0)??"";if(c)return b(c)}}function cp(a){return new Promise(b=>setTimeout(b,a))}async function cq(a,b){try{return await a.isProcessRunning(b)!==!1}catch{return!0}}async function cr(a){try{let{stdout:b}=await cf("tmux",["display-message","-p","-t",a,"#{pane_current_command}"],{timeout:5e3,windowsHide:!0}),c=b.trim();return c.length>0?c:null}catch{return null}}function cs(a){let b=a.lifecycle??a.statePayload;if(b)try{return JSON.parse(b)}catch{return}}function ct(a,b,c,d,e,f){let g="orchestrator"===b.role||d&&RegExp(`^${cl(d)}-orchestrator-\\d+$`).test(a)?"orchestrator":"worker";return function(a,b,c={}){let d=void 0!==c.runtimeHandle?c.runtimeHandle:b.runtimeHandle?aN(b.runtimeHandle):null,e=aV(b,{sessionId:a,status:c.status??aO(b.status),runtimeHandle:d,createdAt:c.createdAt,sessionKind:c.sessionKind}),f=c.status??aW(e),g=e.pr.url??b.pr,h="true"===b[bn.PR_IS_DRAFT];return{id:a,projectId:b.project??c.projectId??"",status:f,activity:c.activity??null,activitySignal:c.activitySignal?c.activitySignal:void 0===c.activity||null===c.activity?bh("unavailable"):bh("valid",{activity:c.activity,timestamp:c.lastActivityAt,source:"exited"===c.activity?"runtime":"native"}),lifecycle:e,branch:b.branch||null,issueId:b.issue||null,pr:g?(()=>{let a=aL(g);return{number:e.pr.number??a?.number??0,url:g,title:"",owner:a?.owner??"",repo:a?.repo??"",branch:b.branch??"",baseBranch:"",isDraft:h}})():null,workspacePath:b.worktree||null,runtimeHandle:e.runtime.handle??d,agentInfo:b.summary?{summary:b.summary,agentSessionId:null}:null,createdAt:b.createdAt?new Date(b.createdAt):c.createdAt??new Date,lastActivityAt:c.lastActivityAt??new Date,restoredAt:c.restoredAt??(b.restoredAt?new Date(b.restoredAt):void 0),metadata:b}}(a,b,{projectId:c,sessionKind:g,createdAt:e,lastActivityAt:f??new Date})}function cu(a){let{config:b,registry:c}=a;function f(a){return(0,g.resolve)(a).replace(/[/\\]$/,"")}function i(a,b,c){return!!a&&!!b&&f(c)!==f(a.path)&&(function(a,b){let c=[p(a)],d=new Set;for(let e of(d.add(a),d.add((0,g.basename)(b)),d))c.push((0,g.join)((0,h.homedir)(),".worktrees",e));return c})(b,a.path).some(a=>(function(a,b){let c=f(a),d=f(b),e="win32"===process.platform?"\\":"/";return c===d||c.startsWith(`${d}${e}`)})(c,a))}function j(a,b,c){return!!b&&("orchestrator"===b.role||!!c&&(a===`${c}-orchestrator`||RegExp(`^${cl(c)}-orchestrator-\\d+$`).test(a)))}function k(a,b,c){return b===`${a.sessionPrefix}-orchestrator`||j(b,c??{},a.sessionPrefix)}function l(a,b){let c={...a};for(let[a,d]of Object.entries(b))if(void 0!==d){if(""===d){let{[a]:b,...d}=c;c=d;continue}c[a]=d}return c}function m(a,b,c){let d=aY(aV(b,{sessionId:a,status:aO(b.status)}));return c(d),d}function q(a,b,c,d){let f=(0,g.join)(a,`${b}.json`),h=d;if(!h)try{h=(0,e.statSync)(f).mtime}catch{h=void 0}if(a7(a,b,c),h)try{(0,e.utimesSync)(f,h,h)}catch{}}let r=null,s=new Map;function t(){r=null}function u(a,b,c){let d={...b,raw:{...b.raw}};if(!j(d.sessionName,d.raw,c))return d;let e={};if("orchestrator"!==d.raw.role&&(e.role="orchestrator"),d.raw.pr&&(e.pr=""),"off"!==d.raw.prAutoDetect&&"false"!==d.raw.prAutoDetect&&(e.prAutoDetect="false"),cn.has(d.raw.status??"")&&(e.status="working"),Object.keys(e).length>0){let b=m(d.sessionName,d.raw,a=>{a.session.kind="orchestrator",a.pr.state="none",a.pr.reason="not_created",a.pr.number=null,a.pr.url=null,a.pr.lastObservedAt=null,"working"===e.status&&(a.session.state="working",a.session.reason="task_in_progress")});q(a,d.sessionName,{...e,...(d.raw,aX(b))},d.modifiedAt),d.raw=l(d.raw,{...e,...(d.raw,aX(b))})}return d}function v(a){let b=Date.parse(a.raw.restoredAt??a.raw.createdAt??"");return a.modifiedAt?a.modifiedAt.getTime():Number.isNaN(b)?0:b}function w(a,b){let c=o(a);if(!(0,e.existsSync)(c))return[];let d=bb(c).flatMap(a=>{let b,d=a4(c,a);if(!d)return[];try{b=(0,e.statSync)((0,g.join)(c,`${a}.json`)).mtime}catch{}return[{sessionName:a,raw:d,modifiedAt:b}]});return function(a,b,c){let d=b.map(a=>({...a,raw:{...a.raw}})),e=new Map;for(let b of d){if(!b.raw.lifecycle&&(!b.raw.statePayload||"2"!==b.raw.stateVersion)){let d=aY(aV(b.raw,{sessionId:b.sessionName,status:aO(b.raw.status),createdAt:b.raw.createdAt?new Date(b.raw.createdAt):void 0,sessionKind:j(b.sessionName,b.raw,c)?"orchestrator":"worker"})),e=(b.raw,aX(d));q(a,b.sessionName,e,b.modifiedAt),b.raw=l(b.raw,e)}if(j(b.sessionName,b.raw,c)){b.raw=u(a,b,c).raw;continue}let d=b.raw.pr;if(!d)continue;let f=e.get(d)??[];f.push(b),e.set(d,f)}for(let b of e.values()){if(b.length<2)continue;let[c,...d]=[...b].sort((a,b)=>{let c=Number(cm.has(b.raw.status??""))-Number(cm.has(a.raw.status??""));if(0!==c)return c;let d=v(b)-v(a);return 0!==d?d:b.sessionName.localeCompare(a.sessionName)});for(let b of d){let c={pr:"",prAutoDetect:"false",...cm.has(b.raw.status??"")?{status:"working"}:{}},d=m(b.sessionName,b.raw,a=>{a.pr.state="none",a.pr.reason="not_created",a.pr.number=null,a.pr.url=null,a.pr.lastObservedAt=null,"working"===c.status&&(a.session.state="working",a.session.reason="task_in_progress")}),e=(b.raw,aX(d));q(a,b.sessionName,{...c,...e},b.modifiedAt),b.raw=l(b.raw,{...c,...e})}}return d}(c,d,b.sessionPrefix)}async function x(a){let{sessionsDir:b,criteria:c,strategy:d,includeTitleDiscoveryForSessionId:e=!1}=a;if("ignore"===d)return;let f=function(a,b){let c=[],d=(a,d)=>{if(!d||"opencode"!==d.agent||void 0!==b.issueId&&d.issue!==b.issueId||void 0!==b.sessionId&&a!==b.sessionId)return;let e=bK(d?.opencodeSessionId);e&&c.push(e)};for(let b of function(a){let b=a=>{let b=a.match(/-(\d+)$/);if(!b)return;let c=Number.parseInt(b[1],10);return Number.isNaN(c)?void 0:c};return[...a].sort((a,c)=>{let d=b(a),e=b(c);return void 0!==d&&void 0!==e&&d!==e?e-d:void 0!==d&&void 0===e?-1:void 0===d&&void 0!==e?1:c.localeCompare(a)})}(bb(a)))d(b,a4(a,b));return[...new Set(c)]}(b,c);if("delete"===d){for(let a of(e&&c.sessionId&&(f=[...f,...await cj(c.sessionId)]),[...new Set(f)]))await ch(a);return}return 0===f.length&&c.sessionId&&(f=await cj(c.sessionId)),f[0]}async function y(a){try{let{stdout:b}=await cf("git",["ls-remote","--heads","origin",`session/${a.sessionPrefix}-*`],{cwd:a.path,timeout:5e3,...cg});return b.split("\n").flatMap(b=>{let c=b.trim();if(!c)return[];let d=(c.split(/\s+/)[1]??"").match(RegExp(`refs/heads/session/${cl(a.sessionPrefix)}-(\\d+)$`));if(!d)return[];let e=Number.parseInt(d[1],10);return Number.isNaN(e)?[]:[e]}).filter((a,b,c)=>c.indexOf(a)===b)}catch{return[]}}async function z(a,b){let c=new Set;for(let d of bb(b)){let b=function(a,b){let c=a.match(RegExp(`^${cl(b)}-(\\d+)$`));if(!c)return;let d=Number.parseInt(c[1],10);return Number.isNaN(d)?void 0:d}(d,a.sessionPrefix);void 0!==b&&c.add(b)}for(let b of(await y(a)))c.add(b);let d=function(a,b){let c=0,d=RegExp(`^${cl(b)}-(\\d+)$`);for(let b of a){let a=b.match(d);if(a){let b=parseInt(a[1],10);b>c&&(c=b)}}return c+1}([...c].map(b=>`${a.sessionPrefix}-${b}`),a.sessionPrefix);for(let g=0;g<1e4;g++){var e,f;let g=`${a.sessionPrefix}-${d}`,h=a.path?(e=a.sessionPrefix,f=d,`${e}-${f}`):void 0;if(!c.has(d)&&bc(b,g))return{num:d,sessionId:g,tmuxName:h};c.add(d),d+=1}throw Error(`Failed to reserve session ID after 10000 attempts (prefix: ${a.sessionPrefix})`)}function A(a,d){let e=c.get("runtime",a.runtime??b.defaults.runtime),f=c.get("agent",d??a.agent??b.defaults.agent),g=c.get("workspace",a.workspace??b.defaults.workspace);return{runtime:e,agent:f,workspace:g,tracker:a.tracker?.plugin?c.get("tracker",a.tracker.plugin):null,scm:a.scm?.plugin?c.get("scm",a.scm.plugin):null}}function B(a,c,d){return b2({role:b1(c,d,a.sessionPrefix,Object.values(b.projects).map(a=>a.sessionPrefix)),project:a,defaults:b.defaults,persistedAgent:d.agent})}async function C(a,b,c,d,e){if("opencode"!==d||bK(a.metadata.opencodeSessionId))return;let f=await ck(b,1e4,e);f&&(a.metadata.opencodeSessionId=f,a7(c,b,{opencodeSessionId:f}))}function D(a){for(let[c,d]of Object.entries(b.projects)){let b,f=o(c),h=a4(f,a);if(h){try{b=(0,e.statSync)((0,g.join)(f,`${a}.json`)).mtime}catch{b=void 0}return{raw:u(f,{sessionName:a,raw:h,modifiedAt:b},d.sessionPrefix).raw,sessionsDir:f,project:d,projectId:c}}}return null}function E(a){let b=D(a);if(!b)throw new d.Ag(a);return b}async function F(a,c,d,e,f,g,h){await C(a,c,d,f,h);let i=a.metadata.tmuxName?.trim(),j="string"==typeof i&&i.length>0,k=null!==a.runtimeHandle||j;k?!a.runtimeHandle&&j&&(a.runtimeHandle={id:i,runtimeName:e.runtime??b.defaults.runtime,data:{}}):a.runtimeHandle={id:c,runtimeName:e.runtime??b.defaults.runtime,data:{}},await H(a,g,k,d)}let G=new Set(["killed","done","merged","terminated","cleanup"]);async function H(a,c,d,e){if(d&&a.runtimeHandle&&c.runtime&&"spawning"!==a.status)try{if(!await c.runtime.isAlive(a.runtimeHandle)){a.lifecycle.runtime.state="missing",a.lifecycle.runtime.reason="tmux"===a.runtimeHandle.runtimeName?"tmux_missing":"process_missing",a.lifecycle.runtime.lastObservedAt=new Date().toISOString(),"done"!==a.lifecycle.session.state&&"terminated"!==a.lifecycle.session.state&&(a.lifecycle.session.state="detecting",a.lifecycle.session.reason="runtime_lost",a.lifecycle.session.lastTransitionAt=new Date().toISOString()),G.has(a.status)||(a.status="killed"),a.activity="exited",a.activitySignal=bh("valid",{activity:"exited",source:"runtime"});return}}catch{a.lifecycle.runtime.state="probe_failed",a.lifecycle.runtime.reason="probe_error",a.lifecycle.runtime.lastObservedAt=new Date().toISOString()}if(a.activitySignal=bh("unavailable"),c.agent){let d;try{let d=await c.agent.getActivityState(a,b.readyThresholdMs);null!==d?(a.activitySignal=bi(d,"native"),a.activity=d.state,a.lifecycle.runtime.state="alive",a.lifecycle.runtime.reason="process_running",a.lifecycle.runtime.lastObservedAt=new Date().toISOString(),d.timestamp&&d.timestamp>a.lastActivityAt&&(a.lastActivityAt=d.timestamp)):a.activitySignal=bh("null",{source:"native"})}catch{a.activitySignal=bh("probe_failure",{source:"native"})}try{d=await c.agent.getSessionInfo(a)}catch{d=null}if(d){a.agentInfo=d;let b=d.metadata??{};if(Object.keys(b).length>0)try{a7(e,a.id,b),a.metadata=a8(a.metadata,b),t()}catch{}}}}async function I(a){let c,f=b.projects[a.projectId];if(!f)throw Error(`Unknown project: ${a.projectId}`);let h=b2({role:"worker",project:f,defaults:b.defaults,spawnAgentOverride:a.agent}),j=A(f,h.agentName);if(!j.runtime)throw Error(`Runtime plugin '${f.runtime??b.defaults.runtime}' not found`);if(!j.agent)throw Error(`Agent plugin '${h.agentName}' not found`);if(a.issueId&&j.tracker)try{c=await j.tracker.getIssue(a.issueId,f)}catch(b){if((0,d.Fx)(b));else throw Error(`Failed to fetch issue ${a.issueId}: ${b}`,{cause:b})}let k=o(a.projectId),l=new bW;try{let d,m,o,{sessionId:q,tmuxName:r}=await z(f,k);if(l.push(()=>ba(k,q)),a.branch)d=a.branch;else if(a.issueId&&j.tracker&&c){let b=c.branchName;d=b&&function(a){if(!a||"@"===a||a.startsWith(".")||a.endsWith(".")||a.endsWith("/")||a.endsWith(".lock")||a.includes("..")||a.includes("//")||a.includes("/.")||a.includes("@{")||a.startsWith("/"))return!1;for(let b=0;b<a.length;b++){let c=a.charCodeAt(b);if(c<=31||127===c)return!1}return!/[\s~^:?*[\\]/.test(a)}(b)?b:j.tracker.branchName(a.issueId,f)}else if(a.issueId){let b=a.issueId,c=/^[A-Za-z0-9][A-Za-z0-9._-]*$/.test(b)&&!b.includes("..")?b:b.toLowerCase().replace(/[^a-z0-9]+/g,"-").slice(0,60).replace(/^-+|-+$/g,"");d=`feat/${c||q}`}else d=`session/${q}`;let s=f.path;if(j.workspace){let b=await j.workspace.create({projectId:a.projectId,project:f,sessionId:q,branch:d,worktreeDir:p(a.projectId)});if(s=b.path,i(f,a.projectId,s)){let a=j.workspace;l.push(()=>a.destroy(s))}j.workspace.postCreate&&await j.workspace.postCreate(b,f)}if(a.issueId&&j.tracker&&c)try{m=await j.tracker.generatePrompt(a.issueId,f)}catch{}let u=`${f.sessionPrefix}-orchestrator`,v=null!==a4(k,u),{systemPrompt:w,taskPrompt:y}=function(a){let b=function(a){let b=[];if(a.agentRules&&b.push(a.agentRules),a.agentRulesFile){let c=(0,g.resolve)(a.path,a.agentRulesFile);try{let a=(0,e.readFileSync)(c,"utf-8").trim();a&&b.push(a)}catch{}}return b.length>0?b.join("\n\n"):null}(a.project),c=[];return c.push(a.project.repo?bH:bI),a.orchestratorSessionId&&c.push(`## Talking to the Orchestrator
|
|
872
872
|
You can message the orchestrator session that spawned you with:
|
|
873
873
|
|
|
874
874
|
\`ao send ${a.orchestratorSessionId} "<your message>"\`
|
|
@@ -877,8 +877,8 @@ Only do this when you genuinely cannot proceed alone — cross-session coordinat
|
|
|
877
877
|
## Task`),f.push(`Work on issue #${a}`),f.push(`Create a branch named so that it auto-links to the issue tracker (e.g. feat/${a}).`)}if(e&&(f.push(`
|
|
878
878
|
## Issue Details`),f.push(e)),b.reactions){let a=[];for(let[c,d]of Object.entries(b.reactions))d.auto&&"send-to-agent"===d.action&&a.push(`- ${c}: auto-handled (you'll receive instructions)`);a.length>0&&(f.push(`
|
|
879
879
|
## Automated Reactions`),f.push("The orchestrator will automatically handle these events:"),f.push(...a))}return f.join("\n")}(a)),b&&c.push(`## Project Rules
|
|
880
|
-
${b}`),{systemPrompt:c.join("\n\n"),taskPrompt:a.userPrompt?a.userPrompt:a.issueId?a.issueContext?`Work on issue #${a.issueId.replace(/^#/,"")}. The issue title, description, and labels are already in your system prompt — start implementing without re-fetching the issue. Fetch comments or linked issues only if you need additional context.`:`Work on issue #${a.issueId.replace(/^#/,"")}. Issue details were not pre-fetched — start by reading the issue (e.g. \`gh issue view ${a.issueId.replace(/^#/,"")}\`), then implement.`:void 0}}({project:f,projectId:a.projectId,issueId:a.issueId,issueContext:m,userPrompt:a.prompt,...v&&{orchestratorSessionId:u}}),A=n(a.projectId);(0,e.mkdirSync)(A,{recursive:!0});let B=(0,g.join)(A,`worker-prompt-${q}.md`);if((0,e.writeFileSync)(B,w,"utf-8"),l.push(()=>(0,e.unlinkSync)(B)),"opencode"===j.agent.name){let a=o=bV(A,q,[B]);l.push(()=>(0,e.unlinkSync)(a))}let C=f.opencodeIssueSessionStrategy??"reuse",D="opencode"===j.agent.name&&a.issueId?await x({sessionsDir:k,criteria:{issueId:a.issueId},strategy:C}):void 0,E={sessionId:q,projectConfig:{...f,agentConfig:{...h.agentConfig,...D?{opencodeSessionId:D}:{}}},workspacePath:s,issueId:a.issueId,prompt:y,systemPromptFile:B,permissions:h.permissions,model:h.model,subagent:a.subagent??h.subagent},F=j.agent.getLaunchCommand(E),G=j.agent.getEnvironment(E);j.agent.preLaunchSetup&&await j.agent.preLaunchSetup(s),j.agent.setupWorkspaceHooks&&await j.agent.setupWorkspaceHooks(s,{dataDir:k}),"claude-code"!==j.agent.name&&await ce(s);let H=await j.runtime.create({sessionId:r??q,workspacePath:s,launchCommand:F,environment:{...G,...o?{OPENCODE_CONFIG:o}:{},...f.env??{},PATH:b7(G.PATH??process.env.PATH),GH_PATH:b4,...process.env.AO_AGENT_GH_TRACE&&{AO_AGENT_GH_TRACE:process.env.AO_AGENT_GH_TRACE},AO_SESSION:q,AO_DATA_DIR:k,AO_SESSION_NAME:q,...r&&{AO_TMUX_NAME:r},AO_CALLER_TYPE:"agent",AO_PROJECT_ID:a.projectId,AO_CONFIG_PATH:b.configPath,...void 0!==b.port&&null!==b.port&&{AO_PORT:String(b.port)}}}),I=j.runtime;l.push(()=>I.destroy(H));let J=co({issueTitle:c?.title,prompt:a.prompt}),K=new Date,L=aT("worker",K);L.runtime.handle=H,L.runtime.tmuxName=r??null;let M={id:q,projectId:a.projectId,status:aW(L),activity:"active",activitySignal:bh("valid",{activity:"active",timestamp:K,source:"runtime"}),lifecycle:L,branch:d,issueId:a.issueId??null,pr:null,workspacePath:s,runtimeHandle:H,agentInfo:null,createdAt:K,lastActivityAt:K,metadata:{...D?{opencodeSessionId:D}:{},...a.prompt?{userPrompt:a.prompt}:{},...J?{displayName:J}:{}}};if(a6(k,q,{worktree:s,branch:d,status:aW(L),...aX(L),lifecycle:L,tmuxName:r,issue:a.issueId,issueTitle:c?.title,project:a.projectId,agent:h.agentName,createdAt:K.toISOString(),runtimeHandle:H,opencodeSessionId:D,userPrompt:a.prompt,displayName:J}),j.agent.postLaunchSetup&&await j.agent.postLaunchSetup(M),"opencode"===j.agent.name&&"reuse"===C&&!M.metadata.opencodeSessionId){let a=await ck(q,1e4);a&&(M.metadata.opencodeSessionId=a)}return Object.keys(M.metadata||{}).length>0&&a7(k,q,M.metadata),t(),l.dismiss(),bG({projectId:a.projectId,sessionId:q,source:"session-manager",kind:"session.spawned",summary:`spawned: ${q}`,data:{agent:j.agent.name,branch:M.branch??void 0}}),M}catch(a){throw await l.runAll(a=>{console.error("[session-manager] spawn rollback step failed:",a)}),a}}async function J(a){let c,d,f,h,i=b.projects[a.projectId];if(!i)throw Error(`Unknown project: ${a.projectId}`);let j=b2({role:"orchestrator",project:i,defaults:b.defaults,spawnAgentOverride:a.agent}),k=A(i,j.agentName);if(!k.runtime)throw Error(`Runtime plugin '${i.runtime??b.defaults.runtime}' not found`);if(!k.agent)throw Error(`Agent plugin '${j.agentName}' not found`);let l=o(a.projectId),m=bY(i.orchestratorSessionStrategy),q=function(a,c){let d=bX(a);if(!bc(c,d))throw Error(`Orchestrator session "${d}" already exists. Use ensureOrchestrator() to reuse or restore it.`);return{sessionId:d,tmuxName:b.configPath?d:void 0}}(i,l),r=q.sessionId,s=q.tmuxName,u=`orchestrator/${r}`;if(!k.workspace){try{ba(l,r)}catch{}throw Error(`spawnOrchestrator requires a workspace plugin but none is configured for project '${a.projectId}'`)}let v={projectId:a.projectId,project:i,sessionId:r,branch:u,worktreeDir:p(a.projectId)},w=!1;try{let a=await k.workspace.findManagedWorkspace?.(v);c=(a??await k.workspace.create(v)).path,w=null!=a}catch(a){try{ba(l,r)}catch{}throw a}let y=async a=>{if(!w)try{await k.workspace.destroy(c)}catch{}try{ba(l,r)}catch{}if(a)try{(0,e.unlinkSync)(a)}catch{}};try{k.agent.setupWorkspaceHooks&&await k.agent.setupWorkspaceHooks(c,{dataDir:l}),"claude-code"!==k.agent.name&&await ce(c)}catch(a){throw await y(),a}if(a.systemPrompt)try{let b=n(a.projectId);(0,e.mkdirSync)(b,{recursive:!0}),d=(0,g.join)(b,`orchestrator-prompt-${r}.md`),(0,e.writeFileSync)(d,a.systemPrompt,"utf-8")}catch(a){throw await y(d),a}if("opencode"===k.agent.name&&d)try{bU(c,d)}catch(a){throw await y(d),a}try{f="opencode"===k.agent.name&&"reuse"===m?await x({sessionsDir:l,criteria:{sessionId:r},strategy:"reuse"}):void 0,"opencode"===k.agent.name&&"delete"===m&&await x({sessionsDir:l,criteria:{sessionId:r},strategy:"delete",includeTitleDiscoveryForSessionId:!0})}catch(a){throw await y(d),a}let z={sessionId:r,projectConfig:{...i,agentConfig:{...j.agentConfig,permissions:"permissionless",...f?{opencodeSessionId:f}:{}}},workspacePath:c,permissions:"permissionless",model:j.model,systemPromptFile:d,subagent:j.subagent},B=k.agent.getLaunchCommand(z),C=k.agent.getEnvironment(z);k.agent.preLaunchSetup&&await k.agent.preLaunchSetup(c);try{h=await k.runtime.create({sessionId:s??r,workspacePath:c,launchCommand:B,environment:{...C,...i.env??{},PATH:b7(C.PATH??process.env.PATH),GH_PATH:b4,...process.env.AO_AGENT_GH_TRACE&&{AO_AGENT_GH_TRACE:process.env.AO_AGENT_GH_TRACE},AO_SESSION:r,AO_DATA_DIR:l,AO_SESSION_NAME:r,...s&&{AO_TMUX_NAME:s},AO_CALLER_TYPE:"orchestrator",AO_PROJECT_ID:a.projectId,AO_CONFIG_PATH:b.configPath,...void 0!==b.port&&null!==b.port&&{AO_PORT:String(b.port)}}})}catch(a){throw await y(d),a}let D=co({prompt:a.systemPrompt}),E=new Date,F=aT("orchestrator",E);F.session.state="working",F.session.reason="task_in_progress",F.session.startedAt=E.toISOString(),F.session.lastTransitionAt=E.toISOString(),F.runtime.handle=h,F.runtime.tmuxName=s??null;let G={id:r,projectId:a.projectId,status:aW(F),activity:"active",activitySignal:bh("valid",{activity:"active",timestamp:E,source:"runtime"}),lifecycle:F,branch:u,issueId:null,pr:null,workspacePath:c,runtimeHandle:h,agentInfo:null,createdAt:E,lastActivityAt:E,metadata:{...f?{opencodeSessionId:f}:{},...D?{displayName:D}:{}}};try{if(a6(l,r,{worktree:c,branch:u,status:aW(F),...aX(F),lifecycle:F,role:"orchestrator",tmuxName:s,project:a.projectId,agent:j.agentName,createdAt:E.toISOString(),runtimeHandle:h,opencodeSessionId:f,displayName:D}),k.agent.postLaunchSetup&&await k.agent.postLaunchSetup(G),"opencode"===k.agent.name&&"reuse"===m&&!G.metadata.opencodeSessionId){let a=await ck(r,1e4);a&&(G.metadata.opencodeSessionId=a)}Object.keys(G.metadata||{}).length>0&&a7(l,r,G.metadata),t()}catch(a){try{await k.runtime.destroy(h)}catch{}throw await y(d),a}return G}async function K(a){let b=Date.now()+2e4;for(;Date.now()<b;){let b=await O(a);if(b?.metadata.role==="orchestrator")return b;await cp(250)}return null}async function L(a){let c=b.projects[a.projectId];if(!c)throw Error(`Unknown project: ${a.projectId}`);let e=bX(c),f=await O(e);if(f){let b=bY(c.orchestratorSessionStrategy);if("delete"===b||"ignore"===b)return await P(e,{purgeOpenCode:"delete"===b}),ba(o(a.projectId),e),J(a);if("done"===f.lifecycle.session.state)throw new d.D8(e,`canonical orchestrator session is terminal with status "${f.status}". Remove or clean up this session before starting a new orchestrator.`);if((0,d.qX)(f))return T(e);if(!(0,d.zi)(f))return f;throw new d.D8(e,`canonical orchestrator session is terminal with status "${f.status}". Remove or clean up this session before starting a new orchestrator.`)}try{return await J(a)}catch(b){if(!(b instanceof Error&&b.message.includes(`Orchestrator session "${e}" already exists`)))throw b;let a=await K(e);if(a)return a;throw b}}async function M(a){let c,d=Object.entries(b.projects).flatMap(([b,c])=>a&&b!==a?[]:w(b,c).map(a=>({sessionName:a.sessionName,projectId:b,raw:a.raw}))).map(async({sessionName:a,projectId:d,raw:f})=>{let h,i,j=b.projects[d];if(!j)return null;let k=o(d);try{let b=(0,g.join)(k,`${a}.json`),c=(0,e.statSync)(b);h=c.birthtime,i=c.mtime}catch{}let l=cs(a,f,d,j.sessionPrefix,h,i),n=B(j,a,f).agentName,p=A(j,n),q="opencode"===n?c??=ci():void 0,r=null,s=new Promise(a=>{r=setTimeout(a,12e3)}),t=F(l,a,k,j,n,p,q).catch(()=>{});try{await Promise.race([t,s])}finally{r&&clearTimeout(r)}if(l.lifecycle&&("missing"===l.lifecycle.runtime.state||"exited"===l.lifecycle.runtime.state)&&"terminated"!==l.lifecycle.session.state&&"done"!==l.lifecycle.session.state)try{let b=m(a,f,a=>{a.session.state="terminated",a.session.reason="runtime_lost",a.session.terminatedAt=new Date().toISOString(),a.session.lastTransitionAt=a.session.terminatedAt,a.runtime.state=l.lifecycle.runtime.state,a.runtime.reason=l.lifecycle.runtime.reason,a.runtime.lastObservedAt=new Date().toISOString()});a7(k,a,aX(b)),l.lifecycle=b,l.status=aW(b)}catch{}return l});return(await Promise.all(d)).filter(a=>null!==a)}async function N(a){if(r&&Date.now()<r.expiresAt)return a?r.sessions.filter(b=>b.projectId===a):r.sessions;let b=await M();return r={sessions:b,expiresAt:Date.now()+35e3},a?b.filter(b=>b.projectId===a):b}async function O(a){for(let[c,d]of Object.entries(b.projects)){let b,f,h=o(c),i=a4(h,a);if(!i)continue;try{let c=(0,g.join)(h,`${a}.json`),d=(0,e.statSync)(c);b=d.birthtime,f=d.mtime}catch{}let j=u(h,{sessionName:a,raw:i,modifiedAt:f},d.sessionPrefix),k=cs(a,j.raw,c,d.sessionPrefix,b,f),l=B(d,a,j.raw).agentName,m=A(d,l);return await F(k,a,h,d,l,m),k}return null}async function P(a,e){let f=D(a);if(!f){for(let[c]of Object.entries(b.projects)){let b=a4(o(c),a);if(b){let a=cr(b);if(a?.session.state==="terminated")return{cleaned:!1,alreadyTerminated:!0}}}throw new d.Ag(a)}let{raw:g,sessionsDir:h,project:j,projectId:k}=f,l=aV(g);if(l?.session.state==="terminated")return{cleaned:!1,alreadyTerminated:!0};let n=e?.reason??"manually_killed",p=B(j,a,g).agentName;if(g.runtimeHandle){let a=aN(g.runtimeHandle);if(a){let d=c.get("runtime",a.runtimeName??(j?j.runtime??b.defaults.runtime:b.defaults.runtime));if(d)try{await d.destroy(a)}catch{}}}let q=g.worktree;if(q&&i(j,k,q)){let a=j?A(j).workspace:c.get("workspace",b.defaults.workspace);if(a)try{await a.destroy(q)}catch{}}let r=!1;if(e?.purgeOpenCode===!0&&"opencode"===p){let b=bK(g.opencodeSessionId)??await ck(a,1e4);if(b)try{await ch(b),r=!0}catch{}}let s="pr_merged"===n?"pr_merged_cleanup":"auto_cleanup"===n?"auto_cleanup":"manual_kill_requested",u=m(a,g,a=>{a.session.state="terminated",a.session.reason=n,a.session.terminatedAt=new Date().toISOString(),a.session.lastTransitionAt=a.session.terminatedAt,a.runtime.state=g.runtimeHandle||g.tmuxName?"missing":"exited",a.runtime.reason=s,a.runtime.lastObservedAt=new Date().toISOString()});return a7(h,a,{...aX(u),...r&&{opencodeSessionId:"",opencodeCleanedAt:new Date().toISOString()}}),t(),bG({projectId:k,sessionId:a,source:"session-manager",kind:"session.killed",summary:`killed: ${a}`,data:{reason:n}}),{cleaned:!0,alreadyTerminated:!1}}async function Q(a,c){let e={killed:[],skipped:[],errors:[]},f=await M(a),g=new Set,h=new Set,i=(a,b)=>`${a}:${b}`,j=a=>{let b=a.indexOf(":");return -1===b?{projectId:"",id:a}:{projectId:a.slice(0,b),id:a.slice(b+1)}},l=(a,b)=>{let c=i(a,b);h.delete(c),g.add(c)},m=(a,b)=>{let c=i(a,b);g.has(c)||h.add(c)},n=c?.purgeOpenCode!==!1;for(let a of f)try{let e=b.projects[a.projectId];if(!e||k(e,a.id,a.metadata)){m(a.projectId,a.id);continue}let f=A(e),g=!1;if(a.pr&&f.scm)try{await f.scm.getPRState(a.pr)===d.bz.CLOSED&&(g=!0)}catch{}if(!g&&a.issueId&&f.tracker)try{await f.tracker.isCompleted(a.issueId,e)&&(g=!0)}catch{}if(!g&&a.runtimeHandle&&f.runtime)try{await f.runtime.isAlive(a.runtimeHandle)||(g=!0)}catch{}g?(c?.dryRun||await P(a.id,{purgeOpenCode:n}),l(a.projectId,a.id)):m(a.projectId,a.id)}catch(b){e.errors.push({sessionId:a.id,error:b instanceof Error?b.message:String(b)})}for(let[d,f]of Object.entries(b.projects)){if(a&&d!==a)continue;let b=o(d);for(let a of bb(b)){let h=i(d,a);if(g.has(h))continue;let j=a4(b,a);if(!j)continue;let o=cr(j);if(o?.session.state!=="terminated")continue;if(k(f,a,j)){m(d,a);continue}let p=B(f,a,j).agentName,q=bK(j.opencodeSessionId);if("opencode"===p&&j.opencodeCleanedAt){m(d,a);continue}if("opencode"===p&&q&&n){if(!c?.dryRun)try{await ch(q),a9(b,a,a=>({...a,opencodeSessionId:"",opencodeCleanedAt:new Date().toISOString()}))}catch(b){e.errors.push({sessionId:a,error:`Failed to delete OpenCode session ${q}: ${b instanceof Error?b.message:String(b)}`});continue}l(d,a)}else m(d,a)}}let p=[...g,...h],q=new Map;for(let a of p){let{id:b}=j(a);q.set(b,(q.get(b)??0)+1)}let r=a=>{let{projectId:b,id:c}=j(a);return(q.get(c)??0)>1?`${b}:${c}`:c};return e.killed=[...g].map(r),e.skipped=[...h].map(r),e}async function R(a,e){let{raw:f,sessionsDir:g,project:h}=E(a),i=B(h,a,f).agentName;if("opencode"===i&&!bK(f.opencodeSessionId)){let b=await ck(a,1e4);b&&(f.opencodeSessionId=b,a7(g,a,{opencodeSessionId:b}),t())}let j=f.runtimeHandle?aN(f.runtimeHandle):null,k=j?.runtimeName??h.runtime??b.defaults.runtime,l=c.get("runtime",k);if(!l)throw Error(`No runtime plugin for session ${a}`);let m=c.get("agent",i);if(!m)throw Error(`No agent plugin for session ${a}`);let n=async a=>{try{return await l.getOutput(a,20)??""}catch{return""}},o=a=>{if(!a)return null;try{return m.detectActivity(a)}catch{return null}},p=a=>a.includes("Press up to edit queued messages"),q=async()=>{let a=bK(f.opencodeSessionId);if("opencode"!==i||!a)return;let b=await ci(1e4);return b.find(b=>b.id===a)?.updatedAt},r=async(a,b)=>{let c=a.runtimeHandle;if(!c)return;let d=Date.now()+b,e=null,f=0;for(;;){let[a,b,g,h]=await Promise.all([l.isAlive(c).catch(()=>!0),m.isProcessRunning(c).catch(()=>!0),n(c),"tmux"===c.runtimeName?cq(c.id):Promise.resolve(m.processName)]),i=g.trim().length>0,j=null===h||h===m.processName,k=i?g.trimEnd():null,o=null!==k&&k===e;if(a&&b&&j&&(p(g)||o)){if((f+=1)>=2)return}else f=0;if(e=k,Date.now()>=d)return;await cp(500)}},s=async a=>{let b=a.runtimeHandle;if(!b)return!1;let c=Date.now()+5e3;for(;;){let[a,d,e,f]=await Promise.all([l.isAlive(b).catch(()=>!0),m.isProcessRunning(b).catch(()=>!0),n(b),"tmux"===b.runtimeName?cq(b.id):Promise.resolve(m.processName)]),g=null===f||f===m.processName;if(a&&g&&(d||e.trim().length>0))return!0;if(Date.now()>=c)return!1;await cp(500)}},u=async(b,c)=>{if("done"===c.lifecycle.session.state)throw Error(`Cannot send to session ${a}: ${b}`);try{let b=await T(a);if(!await s(b))throw Error("restored session did not become ready for delivery");return b}catch(d){let c=d instanceof Error?d.message:String(d);throw Error(`Cannot send to session ${a}: ${b} (${c})`,{cause:d})}},v=async(b=!1)=>{let c=await O(a);if(!c)throw new d.Ag(a);let e=c.runtimeHandle??{id:a,runtimeName:k,data:{}},f=c.runtimeHandle?c:{...c,runtimeHandle:e};if(b||(0,d.qX)(f))return u(b?"session needed to be restarted before delivery":"session is not running",f);let[g,h]=await Promise.all([l.isAlive(e).catch(()=>!0),m.isProcessRunning(e).catch(()=>!0)]);return("spawning"===f.status&&g&&(await r(f,2e4),[g,h]=await Promise.all([l.isAlive(e).catch(()=>!0),m.isProcessRunning(e).catch(()=>!0)])),g&&h)?f:u(g?"agent process is not running":"runtime is not alive",f)},w=async b=>{let c=b.runtimeHandle;if(!c)throw Error(`Session ${a} has no runtime handle`);let d=await n(c),f=o(d)??b.activity,g=await q();await l.sendMessage(c,e);for(let a=1;a<=6;a++){await cp(500);let a=await n(c),e=o(a)??b.activity,h=await q();if(void 0!==g&&void 0!==h&&h>g||p(a)||a.length>0&&a!==d||"active"!==f&&"active"===e||"waiting_input"!==f&&"waiting_input"===e)break}},x=await v();try{await w(x)}catch(a){if(!(void 0===x.restoredAt&&(0,d.qX)(x))){if(a instanceof Error)throw a;throw Error(String(a),{cause:a})}x=await v(!0);try{await w(x)}catch(a){if(a instanceof Error)throw a;throw Error(String(a),{cause:a})}}}async function S(a,b,c){let e,f=b.trim();if(!f)throw Error("PR reference is required");let{raw:g,sessionsDir:h,project:i,projectId:k}=E(a);if(j(a,g,i.sessionPrefix))throw Error(`Session ${a} is an orchestrator session and cannot claim PRs`);let l=A(i,B(i,a,g).agentName).scm;if(!l?.resolvePR||!l.checkoutPR)throw Error(`SCM plugin ${i.scm?.plugin?`"${i.scm.plugin}" `:""}does not support claiming existing PRs`);let n=await l.resolvePR(f,i),o=await l.getPRState(n);if(o!==d.bz.OPEN)throw Error(`Cannot claim PR #${n.number} because it is ${o}`);let p=new Set;for(let{sessionName:b,raw:c}of w(k,i).filter(b=>b.sessionName!==a)){if(!c||j(b,c,i.sessionPrefix))continue;let a=c.pr===n.url,d=c.branch===n.branch&&(c.prAutoDetect??"on")!=="off"&&"false"!==c.prAutoDetect;(a||d)&&p.add(b)}let q=[...p],r=g.worktree;if(!r)throw Error(`Session ${a} has no workspace to check out PR #${n.number}`);let s=await l.checkoutPR(n,r),u=m(a,g,a=>{a.pr.state="open",a.pr.reason="in_progress",a.pr.number=n.number,a.pr.url=n.url,a.pr.lastObservedAt=new Date().toISOString()});for(let b of(a7(h,a,{pr:n.url,status:aW(u),branch:n.branch,prAutoDetect:"",...aX(u)}),t(),q)){let a=a4(h,b);if(!a)continue;let c=m(b,a,b=>{b.pr.state="none",b.pr.reason="not_created",b.pr.number=null,b.pr.url=null,b.pr.lastObservedAt=null,cm.has(a.status??"")&&(b.session.state="working",b.session.reason="task_in_progress")});a7(h,b,{pr:"",prAutoDetect:"false",...cm.has(a.status??"")?{status:"working"}:{},...aX(c)}),t()}let v=!1;if(c?.assignOnGithub)if(l.assignPRToCurrentUser)try{await l.assignPRToCurrentUser(n),v=!0}catch(a){e=a instanceof Error?a.message:String(a)}else e=`SCM plugin "${l.name}" does not support assigning PRs`;return{sessionId:a,projectId:k,pr:n,branchChanged:s,githubAssigned:v,githubAssignmentError:e,takenOverFrom:q}}async function T(a){let c,f,h=D(a);if(!h)throw new d.Ag(a);let i=h.raw,j=h.sessionsDir,k=h.project,l=h.projectId,m=B(k,a,i);if("opencode"===m.agentName&&!bK(i.opencodeSessionId)){let b=await ck(a,1e4);if(!b)throw new d.D8(a,"OpenCode session mapping is missing");i={...i,opencodeSessionId:b},a7(j,a,{opencodeSessionId:b})}let o=cs(a,i,l,k.sessionPrefix),q=A(k,m.agentName);if(await H(o,q,!0,j),!(0,d.qX)(o)){let b=d.N_.has(o.status)?`status "${o.status}" is not restorable`:`session is not in a terminal state (status: "${o.status}", activity: "${o.activity}")`;throw new d.D8(a,b)}if(!q.runtime)throw Error(`Runtime plugin '${k.runtime??b.defaults.runtime}' not found`);if(!q.agent)throw Error(`Agent plugin '${m.agentName}' not found`);let r=i.worktree||k.path;if(!(q.workspace?.exists?await q.workspace.exists(r):(0,e.existsSync)(r))){if(!q.workspace?.restore)throw new d.CK(r,"workspace plugin does not support restore");if(!o.branch)throw new d.CK(r,"branch metadata is missing");try{let b=await q.workspace.restore({projectId:l,project:k,sessionId:a,branch:o.branch,worktreeDir:p(l)},r);q.workspace.postCreate&&await q.workspace.postCreate(b,k)}catch(a){throw new d.CK(r,`restore failed: ${a instanceof Error?a.message:String(a)}`)}}if("opencode"===q.agent.name&&"orchestrator"===m.role){let b=n(l),c=(0,g.join)(b,`orchestrator-prompt-${a}.md`);if((0,e.existsSync)(c))try{bU(r,c)}catch(a){throw Error(`failed to restore OpenCode orchestrator AGENTS.md: ${a instanceof Error?a.message:String(a)}`,{cause:a})}}if("opencode"===q.agent.name&&"orchestrator"!==m.role){let b=n(l),d=(0,g.join)(b,`worker-prompt-${a}.md`);(0,e.existsSync)(d)&&(c=bV(b,a,[d]))}if(o.runtimeHandle)try{await q.runtime.destroy(o.runtimeHandle)}catch{}let s={...k,agentConfig:{...m.agentConfig,..."orchestrator"===m.role?{permissions:"permissionless"}:{},...o.metadata?.opencodeSessionId?{opencodeSessionId:o.metadata.opencodeSessionId}:{}}},u=(()=>{if("orchestrator"!==m.role)return;let b=n(l),c=(0,g.join)(b,`orchestrator-prompt-${a}.md`);return(0,e.existsSync)(c)?c:void 0})(),v={sessionId:a,projectConfig:s,workspacePath:r,issueId:o.issueId??void 0,permissions:"orchestrator"===m.role?"permissionless":m.permissions,model:m.model,subagent:m.subagent,...u&&{systemPromptFile:u}};if(q.agent.getRestoreCommand){let b=await q.agent.getRestoreCommand(o,s);if(b)f=b,a7(j,a,{restoreFallbackReason:""});else{var w;let b=`${q.agent.name}.getRestoreCommand returned null`;if(a7(j,a,{restoreFallbackReason:b}),"claude-code"===(w=q.agent.name)||"codex"===w||"opencode"===w)throw new d.D8(a,b);f=q.agent.getLaunchCommand(v)}}else f=q.agent.getLaunchCommand(v),a7(j,a,{restoreFallbackReason:""});let x=q.agent.getEnvironment(v);q.agent.preLaunchSetup&&await q.agent.preLaunchSetup(r);let y=i.tmuxName,z=await q.runtime.create({sessionId:y??a,workspacePath:r,launchCommand:f,environment:{...x,...c?{OPENCODE_CONFIG:c}:{},...k.env??{},PATH:b7(x.PATH??process.env.PATH),GH_PATH:b4,...process.env.AO_AGENT_GH_TRACE&&{AO_AGENT_GH_TRACE:process.env.AO_AGENT_GH_TRACE},AO_SESSION:a,AO_DATA_DIR:j,AO_SESSION_NAME:a,...y&&{AO_TMUX_NAME:y},AO_CALLER_TYPE:"agent",...l&&{AO_PROJECT_ID:l},AO_CONFIG_PATH:b.configPath,...void 0!==b.port&&null!==b.port&&{AO_PORT:String(b.port)}}}),C=new Date().toISOString(),E=aY(o.lifecycle);E.session.state="working",E.session.reason="task_in_progress",E.session.lastTransitionAt=C,E.session.terminatedAt=null,E.session.completedAt=null,E.runtime.state="alive",E.runtime.reason="process_running",E.runtime.handle=z,E.runtime.lastObservedAt=C,("merged"===E.pr.state||"closed"===E.pr.state)&&(E.pr.state="none",E.pr.reason="cleared_on_restore",E.pr.number=null,E.pr.url=null,E.pr.lastObservedAt=null),a7(j,a,{...aX(E),restoredAt:C,mergedPendingCleanupSince:""}),t();let F=aW(E),G={...o,status:F,activity:"active",workspacePath:r,runtimeHandle:z,restoredAt:new Date(C)};if(q.agent.postLaunchSetup)try{let b={...G.metadata??{}};await q.agent.postLaunchSetup(G);let c=G.metadata??{},d=Object.fromEntries(Object.entries(c).filter(([a,c])=>b[a]!==c));Object.keys(d).length>0&&(a7(j,a,d),t())}catch{}return G}return{spawn:async function(a){bG({projectId:a.projectId,source:"session-manager",kind:"session.spawn_started",summary:"spawn started",data:{agent:a.agent??void 0}});try{return await I(a)}catch(b){throw bG({projectId:a.projectId,source:"session-manager",kind:"session.spawn_failed",level:"error",summary:"spawn failed",data:{reason:b instanceof Error?b.message:String(b)}}),b}},spawnOrchestrator:J,ensureOrchestrator:async function(a){let c=b.projects[a.projectId];if(!c)throw Error(`Unknown project: ${a.projectId}`);let d=bX(c),e=s.get(d);if(e)return e;let f=L(a).finally(()=>{s.delete(d)});return s.set(d,f),f},restore:T,list:M,listCached:N,invalidateCache:t,get:O,kill:P,cleanup:Q,send:R,claimPR:S,remap:async function(a,b=!1){let{raw:c,sessionsDir:d,project:e}=E(a);if("opencode"!==B(e,a,c).agentName)throw Error(`Session ${a} is not using the opencode agent`);let f=bK(c.opencodeSessionId),g=b?await ck(a,1e4):f??await ck(a,1e4);if(!g)throw Error(`OpenCode session mapping is missing for ${a}`);return a7(d,a,{opencodeSessionId:g}),g}}}let cu=new Map;function cv(a,b){let c=cu.get(a);return c||(c=b(),cu.set(a,c)),c}let cw={debug:10,info:20,warn:30,error:40};function cx(){return new Date().toISOString()}function cy(a){return a.replace(/[^a-zA-Z0-9_-]+/g,"-").replace(/^-+|-+$/g,"")||"component"}function cz(a){return cw[a]>=cw[function(){let a=process.env.AO_LOG_LEVEL?.trim().toLowerCase();return"debug"===a||"info"===a||"warn"===a||"error"===a?a:"warn"}()]}function cA(a,b){(function(){let a=process.env.AO_OBSERVABILITY_STDERR?.trim().toLowerCase();return"1"===a||"true"===a||"yes"===a||"on"===a})()&&cz(b)&&process.stderr.write(`${JSON.stringify({...a,level:b})}
|
|
881
|
-
`)}function
|
|
882
|
-
`,"utf-8")}function
|
|
883
|
-
`,"utf-8"),(0,e.renameSync)(l,k),d&&cz(d.level)&&(f=d.payload,h=d.level,cH((0,g.join)(cB(a),`${cy(c)}-${process.pid}.ndjson`),{...f,level:h},5242880),cA(d.payload,d.level))}catch(d){let b={source:"ao-observability",timestamp:cx(),component:c,outcome:"failure",operation:"observability.write",reason:d instanceof Error?d.message:String(d)};try{let c=(0,g.join)(cB(a),"observability-errors.ndjson");cH(c,b,524288)}catch{}cA(b,"error")}}return{component:c,recordOperation(a){let b=cx(),e=a.operation??a.metric,g=a.level??("failure"===a.outcome?"error":"info"),h={id:(0,f.randomUUID)(),timestamp:b,component:c,operation:e,outcome:a.outcome,correlationId:a.correlationId,projectId:a.projectId,sessionId:a.sessionId,path:cG(a.path),reason:cF(a.reason),durationMs:a.durationMs,data:cE(a.data)};d(c=>{var d,f;let g=(d=a.metric,f=a.projectId,`${f??"unknown"}::${d}`),i=c.metrics[g]??{total:0,success:0,failure:0};if(i.total+=1,i.lastAt=b,"success"===a.outcome?(i.success+=1,i.lastSuccessAt=b):(i.failure+=1,i.lastFailureAt=b,i.lastFailureReason=cF(a.reason)),c.metrics[g]=i,c.traces=[h,...c.traces].sort((a,b)=>cI(a.timestamp,b.timestamp)).slice(0,80),a.sessionId){c.sessions[a.sessionId]={sessionId:a.sessionId,projectId:a.projectId,correlationId:a.correlationId,operation:e,outcome:a.outcome,updatedAt:b,reason:cF(a.reason)};let d=Object.entries(c.sessions).sort(([,a],[,b])=>cI(a.updatedAt,b.updatedAt));c.sessions=Object.fromEntries(d.slice(0,200))}},{level:g,payload:{source:"ao-observability",timestamp:b,component:c,metric:a.metric,operation:e,outcome:a.outcome,correlationId:a.correlationId,projectId:a.projectId,sessionId:a.sessionId,reason:cF(a.reason),durationMs:a.durationMs,path:cG(a.path),data:cE(a.data)}})},recordDiagnostic(a){let b=cx(),e=a.level??"info",g={id:(0,f.randomUUID)(),timestamp:b,component:c,operation:a.operation,outcome:"success",correlationId:a.correlationId,projectId:a.projectId,sessionId:a.sessionId,path:cG(a.path),data:{message:cD(a.message),...cE(a.data)}};d(c=>{if(c.traces=[g,...c.traces].sort((a,b)=>cI(a.timestamp,b.timestamp)).slice(0,80),a.sessionId){c.sessions[a.sessionId]={sessionId:a.sessionId,projectId:a.projectId,correlationId:a.correlationId,operation:a.operation,outcome:"success",updatedAt:b};let d=Object.entries(c.sessions).sort(([,a],[,b])=>cI(a.updatedAt,b.updatedAt));c.sessions=Object.fromEntries(d.slice(0,200))}},{level:e,payload:{source:"ao-observability",timestamp:b,component:c,operation:a.operation,correlationId:a.correlationId,projectId:a.projectId,sessionId:a.sessionId,path:cG(a.path),data:{message:cD(a.message),...cE(a.data)}}})},setHealth(a){let b=cx();d(d=>{d.health[a.surface]={surface:a.surface,status:a.status,updatedAt:b,component:c,projectId:a.projectId,correlationId:a.correlationId,reason:cF(a.reason),details:cE(a.details)}},{level:"error"===a.status?"error":"warn"===a.status?"warn":"info",payload:{source:"ao-observability",timestamp:b,component:c,surface:a.surface,status:a.status,projectId:a.projectId,correlationId:a.correlationId,reason:cF(a.reason),details:cE(a.details)}})}}}function cM(a){let b=cB(a),c={};for(let a of(0,e.readdirSync)(b)){let d;if(!a.endsWith(".json"))continue;let f=(0,g.join)(b,a);try{d=JSON.parse((0,e.readFileSync)(f,"utf-8"))}catch{continue}if(d&&"object"==typeof d){for(let[a,b]of Object.entries(d.metrics??{})){let{projectId:e,metric:f}=function(a){let b=a.indexOf("::");if(-1===b)return{metric:a};let c=a.slice(0,b);return{projectId:"unknown"===c?void 0:c,metric:a.slice(b+2)}}(a);if(!e)continue;let g=c[e]??(c[e]={projectId:e,updatedAt:d.updatedAt,metrics:{},health:{},recentTraces:[],sessions:{}});g.metrics[f]=function(a,b){let c={total:(a?.total??0)+(b.total??0),success:(a?.success??0)+(b.success??0),failure:(a?.failure??0)+(b.failure??0),lastAt:a?.lastAt,lastSuccessAt:a?.lastSuccessAt,lastFailureAt:a?.lastFailureAt,lastFailureReason:a?.lastFailureReason};return b.lastAt&&(!c.lastAt||b.lastAt>c.lastAt)&&(c.lastAt=b.lastAt),b.lastSuccessAt&&(!c.lastSuccessAt||b.lastSuccessAt>c.lastSuccessAt)&&(c.lastSuccessAt=b.lastSuccessAt),b.lastFailureAt&&(!c.lastFailureAt||b.lastFailureAt>c.lastFailureAt)&&(c.lastFailureAt=b.lastFailureAt,c.lastFailureReason=b.lastFailureReason),c}(g.metrics[f],b),d.updatedAt>g.updatedAt&&(g.updatedAt=d.updatedAt)}for(let a of d.traces??[]){if(!a.projectId)continue;let b=c[a.projectId]??(c[a.projectId]={projectId:a.projectId,updatedAt:a.timestamp,metrics:{},health:{},recentTraces:[],sessions:{}});b.recentTraces.push(a),a.timestamp>b.updatedAt&&(b.updatedAt=a.timestamp)}for(let a of Object.values(d.health??{})){let b=a.projectId;if(!b)continue;let d=c[b]??(c[b]={projectId:b,updatedAt:a.updatedAt,metrics:{},health:{},recentTraces:[],sessions:{}}),e=d.health[a.surface];(!e||a.updatedAt>=e.updatedAt)&&(d.health[a.surface]=a),a.updatedAt>d.updatedAt&&(d.updatedAt=a.updatedAt)}for(let a of Object.values(d.sessions??{})){if(!a.projectId)continue;let b=c[a.projectId]??(c[a.projectId]={projectId:a.projectId,updatedAt:a.updatedAt,metrics:{},health:{},recentTraces:[],sessions:{}}),d=b.sessions[a.sessionId];(!d||a.updatedAt>=d.updatedAt)&&(b.sessions[a.sessionId]=a),a.updatedAt>b.updatedAt&&(b.updatedAt=a.updatedAt)}}}let d="ok";for(let a of Object.values(c))for(let b of(a.recentTraces=a.recentTraces.sort((a,b)=>cI(a.timestamp,b.timestamp)).slice(0,80),Object.values(a.health)))cJ(b.status)>cJ(d)&&(d=b.status);return{generatedAt:cx(),overallStatus:d,projects:c}}function cN(a){let b=a.match(/^(\d+)(s|m|h)$/);if(!b)return 0;let c=parseInt(b[1],10);switch(b[2]){case"s":return 1e3*c;case"m":return 6e4*c;case"h":return 36e5*c;default:return 0}}let cO=new Set(["ci-failed"]),cP=["rebase-merge","rebase-apply","CHERRY_PICK_HEAD","BISECT_LOG"];async function cQ(a){try{return await (0,bl.stat)(a),!0}catch(a){if("object"==typeof a&&null!==a&&"code"in a&&"ENOENT"===a.code)return!1;throw a}}async function cR(a){return(await Promise.all(cP.map(b=>cQ((0,g.join)(a,b))))).some(Boolean)}async function cS(a){let b=(0,g.join)(a,".git");if((await (0,bl.stat)(b)).isDirectory())return b;let c=(await (0,bl.readFile)(b,"utf8")).trim().match(/^gitdir:\s*(.+)$/i);if(!c)throw Error(`Invalid .git pointer in workspace: ${a}`);return(0,g.resolve)((0,g.dirname)(b),c[1].trim())}async function cT(a){let b;try{b=await cS(a)}catch{return{kind:"unavailable"}}try{let a=(await (0,bl.readFile)((0,g.join)(b,"HEAD"),"utf8")).trim(),c="ref: refs/heads/";if(!a.startsWith(c))return await cR(b)?{kind:"unavailable"}:{kind:"detached"};let d=a.slice(c.length).trim();if(d.length>0)return{kind:"branch",branch:d};return await cR(b)?{kind:"unavailable"}:{kind:"detached"}}catch{return{kind:"unavailable"}}}function cU(a){return a.includes("stuck")||a.includes("needs_input")||a.includes("errored")?"urgent":a.startsWith("summary.")?"info":a.includes("approved")||a.includes("ready")||a.includes("merged")||a.includes("completed")?"action":a.includes("fail")||a.includes("changes_requested")||a.includes("conflicts")?"warning":"info"}function cV(a,b){return{id:(0,f.randomUUID)(),type:a,priority:b.priority??cU(a),sessionId:b.sessionId,projectId:b.projectId,timestamp:new Date,message:b.message,data:b.data??{}}}function cW(a,b){switch(b){case"working":return"session.working";case"pr_open":return"pr.created";case"ci_failed":return"ci.failing";case"review_pending":return"review.pending";case"changes_requested":return"review.changes_requested";case"approved":return"review.approved";case"mergeable":return"merge.ready";case"merged":return"merge.completed";case"needs_input":return"session.needs_input";case"stuck":return"session.stuck";case"errored":return"session.errored";case"killed":return"session.killed";default:return null}}function cX(a,b){let c=null;if(a.pr){let d=`${a.pr.owner}/${a.pr.repo}#${a.pr.number}`,e=b.get(d);c={url:a.pr.url,title:e?.title??null,number:a.pr.number,branch:a.pr.branch}}return{pr:c,issueId:a.issueId,issueTitle:a.metadata.issueTitle??null,summary:a.agentInfo?.summary??null,branch:a.branch}}function cY(a){switch(a){case"pr.closed":return"pr-closed";case"ci.failing":return"ci-failed";case"review.changes_requested":return"changes-requested";case"automated_review.found":return"bugbot-comments";case"merge.conflicts":return"merge-conflicts";case"merge.ready":return"approved-and-green";case"session.stuck":return"agent-stuck";case"session.needs_input":return"agent-needs-input";case"session.killed":return"agent-exited";case"summary.all_complete":return"all-complete";default:return null}}function cZ(a){let b=cW(void 0,a);if(!b)return"info";let c=cU(b);return"urgent"===c?"error":"warning"===c?"warn":"info"}function c$(a){return"detecting"===a.session.state?a.session.reason:"not_created"!==a.pr.reason&&"in_progress"!==a.pr.reason?a.pr.reason:"process_running"!==a.runtime.reason?a.runtime.reason:a.session.reason}function c_(a,b,c,d,e,f,g,h){return{oldStatus:c,newStatus:d,statusTransition:g,previousSessionState:a.session.state,newSessionState:b.session.state,previousSessionReason:a.session.reason,newSessionReason:b.session.reason,previousPRState:a.pr.state,newPRState:b.pr.state,previousPRReason:a.pr.reason,newPRReason:b.pr.reason,previousRuntimeState:a.runtime.state,newRuntimeState:b.runtime.state,previousRuntimeReason:a.runtime.reason,newRuntimeReason:b.runtime.reason,primaryReason:c$(b),evidence:e,signalsConsulted:e.split(/\s+/).map(a=>a.trim()).filter(a=>a.length>0),detectingAttempts:f,recoveryAction:h?.result?.action??null,reactionKey:h?.key??null,reactionSuccess:h?.result?.success??null,escalated:h?.result?.escalated??null}}function c0(a){let{config:b,registry:c,sessionManager:e,projectId:f}=a,g=cL(b,"lifecycle-manager"),h=new Map,i=new Map,j=new Map,k=null,l=!1,m=!1,n=new Map,p=new Map,q=new Set,r=new Map;async function s(a){p.clear(),q=new Set;let d=new Map,e=new Map,h=new Set;for(let c of a){let a=b.projects[c.projectId];if(!a?.scm?.plugin||!a.repo)continue;let f=a.scm.plugin;if(d.has(f)||d.set(f,[]),e.has(f)||e.set(f,new Set),e.get(f).add(a.repo),!c.pr)continue;let g=`${c.pr.owner}/${c.pr.repo}#${c.pr.number}`;if(h.has(g))continue;h.add(g);let i=d.get(f);i&&i.push(c.pr)}for(let[a,b]of d){let d=c.get("scm",a);if(!d?.enrichSessionsPRBatch)continue;let h=[...e.get(a)??[]],i=Date.now();try{for(let[c,e]of(await d.enrichSessionsPRBatch(b,{recordSuccess(c){let d=Date.now()-i;g?.recordOperation({metric:"graphql_batch",operation:"batch_enrichment",correlationId:cK("graphql-batch"),outcome:"success",projectId:f,durationMs:d,data:{plugin:a,prCount:b.length,prKeys:b.map(a=>`${a.owner}/${a.repo}#${a.number}`)},level:"info"})},recordFailure(c){let d=Date.now()-i;g?.recordOperation({metric:"graphql_batch",operation:"batch_enrichment",correlationId:cK("graphql-batch"),outcome:"failure",reason:c.error,level:"warn",data:{plugin:a,prCount:b.length,error:c.error,durationMs:d}})},log(b,c){g?.recordDiagnostic?.({operation:"batch_enrichment.log",correlationId:cK("graphql-batch"),projectId:f,message:c,level:b,data:{plugin:a,source:"ao-graphql-batch"}})},reportPRListUnchangedRepos(a){for(let b of a)q.add(b)}},h)))p.set(c,e)}catch(e){let c=e instanceof Error?e.message:String(e),d=cK("batch-enrichment");g?.recordOperation?.({metric:"lifecycle_poll",operation:"batch_enrichment",correlationId:d,outcome:"failure",reason:c,level:"warn",data:{plugin:a,prCount:b.length}}),bG({projectId:f,source:"scm",kind:"scm.batch_enrich_failed",level:"warn",summary:`batch_enrich failed for ${b.length} PR(s)`,data:{plugin:a,prCount:b.length,errorMessage:c}})}}for(let d of a){if(!d.branch||"off"===d.metadata.prAutoDetect||"false"===d.metadata.prAutoDetect||"orchestrator"===d.metadata.role||d.id.endsWith("-orchestrator")||d.pr&&("closed"!==d.lifecycle.pr.state||d.pr.branch===d.branch))continue;let a=b.projects[d.projectId];if(!a?.repo||!a.scm?.plugin||q.has(a.repo))continue;let e=c.get("scm",a.scm.plugin);if(e?.detectPR)try{let b=await e.detectPR(d,a);if(b){d.pr=b;let c=o(d.projectId);a7(c,d.id,{pr:b.url}),bG({projectId:d.projectId,sessionId:d.id,source:"scm",kind:"scm.detect_pr_succeeded",summary:`PR #${b.number} detected`,data:{plugin:a.scm.plugin,prNumber:b.number,prUrl:b.url,prOwner:b.owner,prRepo:b.repo}})}}catch(c){let b=c instanceof Error?c.message:String(c);g?.recordOperation?.({metric:"lifecycle_poll",operation:"scm.detect_pr",outcome:"failure",correlationId:cK("detect-pr"),projectId:d.projectId,sessionId:d.id,reason:b,level:"warn"}),bG({projectId:d.projectId,sessionId:d.id,source:"scm",kind:"scm.detect_pr_failed",level:"warn",summary:`detect_pr failed for ${d.id}`,data:{plugin:a.scm.plugin,errorMessage:b}})}}}function t(a,b){let c=y(a,"agent-stuck"),d=c?.threshold;if("string"!=typeof d)return!1;let e=cN(d);return!(e<=0)&&Date.now()-b.getTime()>e}async function u(a,c){var f,g;let h=b.projects[a.projectId];if(!h)return;let i=Object.values(b.projects).map(a=>a.sessionPrefix),j=b1(a.id,a.metadata,h.sessionPrefix,i),k=a.workspacePath;if(!("worker"===j&&null!==k&&(!a.pr||"closed"===a.lifecycle.pr.state)))return;let l=await cT(k);if("detached"===l.kind){null!==a.branch&&(a.branch=null,z(a,{branch:""}));return}if("branch"!==l.kind||l.branch===a.branch)return;let m=function(a,b){let c=`${a.projectId}:${b}`,d=n.get(c);return d&&d!==a.id?null:(n.set(c,a.id),c)}(a,l.branch);if(m)try{let g=c??await e.list(a.projectId);f=l.branch,g.some(c=>{if(c.id===a.id||c.projectId!==a.projectId||d.CM.has(c.status))return!1;let e=b.projects[c.projectId];return!!e&&"worker"===b1(c.id,c.metadata,e.sessionPrefix,i)&&c.branch===f})||(a.branch=l.branch,z(a,{branch:l.branch}))}finally{g=a.id,n.get(m)===g&&n.delete(m)}}async function v(a){let e=b.projects[a.projectId];if(!e)return{status:a.status,evidence:"project_missing",detectingAttempts:bu(a.metadata.detectingAttempts)};let f=aY(a.lifecycle),h=new Date().toISOString(),j=Object.values(b.projects).map(a=>a.sessionPrefix),k=b2({role:b1(a.id,a.metadata,e.sessionPrefix,j),project:e,defaults:b.defaults,persistedAgent:a.metadata.agent}).agentName,l=c.get("agent",k),m=e.scm?.plugin?c.get("scm",e.scm.plugin):null,n=null,o=!1,q=a.status!==d.SB.SPAWNING,r=bu(a.metadata.detectingAttempts),s=a.metadata.detectingStartedAt||void 0,u=a.metadata.detectingEvidenceHash||void 0,v=(b={status:aW(f),evidence:"lifecycle_commit",detecting:{attempts:r}})=>(b.prState&&(f.pr.state=b.prState,f.pr.lastObservedAt=h),b.prReason&&(f.pr.reason=b.prReason),b.sessionState&&b.sessionReason&&(f.session.state=b.sessionState,f.session.reason=b.sessionReason,f.session.lastTransitionAt=h,"working"===b.sessionState&&null===f.session.startedAt&&(f.session.startedAt=h),"done"===b.sessionState&&null===f.session.completedAt&&(f.session.completedAt=h),"terminated"===b.sessionState&&null===f.session.terminatedAt&&(f.session.terminatedAt=h)),a.lifecycle=f,a.status=b.status,a.activitySignal=x,{status:b.status,evidence:b.evidence,detectingAttempts:b.detecting.attempts,detectingStartedAt:b.detecting.startedAt,detectingEvidenceHash:b.detecting.evidenceHash}),w={state:"unknown",failed:!1};if(a.runtimeHandle&&q){let d=c.get("runtime",e.runtime??b.defaults.runtime);if(d)try{let b=await d.isAlive(a.runtimeHandle);f.runtime.lastObservedAt=h,w={state:b?"alive":"dead",failed:!1},b?(f.runtime.state="alive",f.runtime.reason="process_running"):(f.runtime.state="missing",f.runtime.reason="tmux"===a.runtimeHandle.runtimeName?"tmux_missing":"process_missing")}catch(b){f.runtime.state="probe_failed",f.runtime.reason="probe_error",f.runtime.lastObservedAt=h,w={state:"unknown",failed:!0},bG({projectId:a.projectId,sessionId:a.id,source:"runtime",kind:"runtime.probe_failed",level:"warn",summary:`runtime.isAlive probe failed for ${a.id}`,data:{runtimeName:a.runtimeHandle.runtimeName,errorMessage:b instanceof Error?b.message:String(b)}})}}let x=bh("unavailable"),y={state:"unknown",failed:!1},z=bk(x);if(l&&(a.runtimeHandle||a.workspacePath))try{if(l.recordActivity&&a.workspacePath&&a.runtimeHandle&&q)try{let d=c.get("runtime",e.runtime??b.defaults.runtime),f=d?await d.getOutput(a.runtimeHandle,10):"";f&&await l.recordActivity(a,f)}catch(b){g?.recordOperation?.({metric:"lifecycle_poll",operation:"activity.record",outcome:"failure",correlationId:cK("lifecycle-poll"),projectId:a.projectId,sessionId:a.id,reason:b instanceof Error?b.message:String(b),level:"warn"})}let j=await l.getActivityState(a,b.readyThresholdMs);if(j){x=bi(j,"native"),z=bk(x),f.runtime.lastObservedAt=h;let b=i.get(a.id);if(i.set(a.id,j.state),void 0!==b&&b!==j.state&&bG({projectId:a.projectId,sessionId:a.id,source:"lifecycle",kind:"activity.transition",summary:`${b} → ${j.state}`,data:{from:b,to:j.state}}),"missing"!==f.runtime.state&&"probe_failed"!==f.runtime.state&&(f.runtime.state="alive",f.runtime.reason="process_running"),"waiting_input"===j.state)return v({status:d.SB.NEEDS_INPUT,evidence:z,detecting:{attempts:0},sessionState:"needs_input",sessionReason:"awaiting_user_input"});"exited"===j.state&&q&&(y={state:"dead",failed:!1},f.runtime.state="exited",f.runtime.reason="process_missing"),bj(x)&&(n=x.timestamp,o="blocked"===x.activity)}else if(a.runtimeHandle&&q){x=bh("null",{source:"native"}),z=bk(x);let g=c.get("runtime",e.runtime??b.defaults.runtime),i=g?await g.getOutput(a.runtimeHandle,10):"";if(i){let b=l.detectActivity(i);if(x=bi({state:b},"terminal"),z=bk(x),"waiting_input"===b)return v({status:d.SB.NEEDS_INPUT,evidence:z,detecting:{attempts:0},sessionState:"needs_input",sessionReason:"awaiting_user_input"});try{let b=await l.isProcessRunning(a.runtimeHandle);y={state:b?"alive":"dead",failed:!1},b||(f.runtime.state="exited",f.runtime.reason="process_missing",f.runtime.lastObservedAt=h)}catch(b){y={state:"unknown",failed:!0},bG({projectId:a.projectId,sessionId:a.id,source:"agent",kind:"agent.process_probe_failed",level:"warn",summary:`agent.isProcessRunning failed for ${a.id}`,data:{agentName:k,where:"fallback",errorMessage:b instanceof Error?b.message:String(b)}})}}}else x=bh("null",{source:"native"}),z=bk(x)}catch(b){if(z=bk(x=bh("probe_failure",{source:"native"})),bG({projectId:a.projectId,sessionId:a.id,source:"agent",kind:"agent.activity_probe_failed",level:"warn",summary:`activity probing failed for ${a.id}`,data:{agentName:k,errorMessage:b instanceof Error?b.message:String(b)}}),"stuck"===f.session.state||"needs_input"===f.session.state||"detecting"===f.session.state)return v({status:a.status,evidence:z,detecting:{attempts:r}});return v(br({currentAttempts:r,idleWasBlocked:o,evidence:z,detectingStartedAt:s,previousEvidenceHash:u}))}if("unknown"===y.state&&a.runtimeHandle&&q&&l)try{let b=await l.isProcessRunning(a.runtimeHandle);y={state:b?"alive":"dead",failed:!1},b||(f.runtime.state="exited",f.runtime.reason="process_missing",f.runtime.lastObservedAt=h)}catch(b){y={state:"unknown",failed:!0},bG({projectId:a.projectId,sessionId:a.id,source:"agent",kind:"agent.process_probe_failed",level:"warn",summary:`agent.isProcessRunning failed for ${a.id}`,data:{agentName:k,where:"standalone",errorMessage:b instanceof Error?b.message:String(b)}})}let A=function(a){let b=function(a,b=new Date){return"valid"===a.state&&a.timestamp instanceof Date&&null!==a.activity&&be.has(a.activity)&&"stale"!==bg(a.timestamp,b)}(a.activitySignal);return a.runtimeProbe.failed||a.processProbe.failed?br({currentAttempts:a.currentAttempts,idleWasBlocked:a.idleWasBlocked,evidence:`probe_failed runtime=${a.runtimeProbe.state} process=${a.processProbe.state} ${a.activityEvidence}`,detectingStartedAt:a.detectingStartedAt,previousEvidenceHash:a.previousEvidenceHash}):"dead"===a.runtimeProbe.state&&"alive"===a.processProbe.state||"alive"===a.runtimeProbe.state&&"dead"===a.processProbe.state||"dead"===a.runtimeProbe.state&&b?br({currentAttempts:a.currentAttempts,idleWasBlocked:a.idleWasBlocked,evidence:`signal_disagreement runtime=${a.runtimeProbe.state} process=${a.processProbe.state} ${a.activityEvidence}`,reason:"dead"===a.runtimeProbe.state?"runtime_lost":"agent_process_exited",detectingStartedAt:a.detectingStartedAt,previousEvidenceHash:a.previousEvidenceHash}):"dead"===a.runtimeProbe.state&&"unknown"===a.processProbe.state&&a.canProbeRuntimeIdentity?br({currentAttempts:a.currentAttempts,idleWasBlocked:a.idleWasBlocked,evidence:`runtime_dead process_unknown ${a.activityEvidence}`,reason:"runtime_lost",detectingStartedAt:a.detectingStartedAt,previousEvidenceHash:a.previousEvidenceHash}):"dead"!==a.runtimeProbe.state||"dead"!==a.processProbe.state||b?null:{status:d.SB.KILLED,evidence:`runtime_dead process_dead ${a.activityEvidence}`,detecting:{attempts:0},sessionState:"terminated",sessionReason:"runtime_lost"}}({currentAttempts:r,runtimeProbe:w,processProbe:y,canProbeRuntimeIdentity:q,activitySignal:x,activityEvidence:z,idleWasBlocked:o,detectingStartedAt:s,previousEvidenceHash:u});if(A)return v(A);if(a.pr&&m)try{let b=`${a.pr.owner}/${a.pr.repo}#${a.pr.number}`,c=p.get(b);"none"===f.pr.state&&(f.pr.state="open"),"not_created"===f.pr.reason&&(f.pr.reason="in_progress"),f.pr.number=a.pr.number,f.pr.url=a.pr.url,f.pr.lastObservedAt=h;let g=!!(null!==n&&bj(x))&&t(a,n);if(c)return v(function(a,b){let c=bs(a.state);return c||bt({reviewDecision:a.reviewDecision,ciFailing:a.ciStatus===d.U1.FAILING,mergeable:a.mergeable,shouldEscalateIdleToStuck:b.shouldEscalateIdleToStuck,idleWasBlocked:b.idleWasBlocked,activityEvidence:b.activityEvidence})}(c,{shouldEscalateIdleToStuck:g,idleWasBlocked:o,activityEvidence:z}));try{let b=await m.getPRState(a.pr);if("merged"===b||"closed"===b)return v(function(a){let b=bs(a.prState);return b||bt({reviewDecision:a.reviewDecision,ciFailing:a.ciStatus===d.U1.FAILING,mergeable:a.mergeable,shouldEscalateIdleToStuck:a.shouldEscalateIdleToStuck,idleWasBlocked:a.idleWasBlocked,activityEvidence:a.activityEvidence})}({prState:b,ciStatus:"none",reviewDecision:"none",mergeable:!1,shouldEscalateIdleToStuck:g,idleWasBlocked:o,activityEvidence:z}))}catch(b){bG({projectId:a.projectId,sessionId:a.id,source:"scm",kind:"scm.poll_pr_failed",level:"warn",summary:`getPRState failed for PR #${a.pr.number}`,data:{plugin:e.scm?.plugin,prNumber:a.pr.number,prUrl:a.pr.url,errorMessage:b instanceof Error?b.message:String(b)}})}}catch(b){g?.recordOperation?.({metric:"lifecycle_poll",operation:"scm.poll_pr",outcome:"failure",correlationId:cK("lifecycle-poll"),projectId:a.projectId,sessionId:a.id,reason:b instanceof Error?b.message:String(b),level:"warn"})}let B=bp(a.metadata);if(B&&function(a,b=new Date,c=3e5,d=6e4){let e=Date.parse(a.timestamp);if(Number.isNaN(e))return!1;let f=b.getTime();return!(e>f+d)&&f-e<=c}(B)&&"orchestrator"!==f.session.kind&&"terminated"!==f.session.state&&"done"!==f.session.state){let a=function(a){switch(a){case"started":return{sessionState:"working",sessionReason:"agent_acknowledged"};case"working":case"draft_pr_created":return{sessionState:"working",sessionReason:"task_in_progress"};case"waiting":case"ready_for_review":return{sessionState:"idle",sessionReason:"awaiting_external_review"};case"needs_input":return{sessionState:"needs_input",sessionReason:"awaiting_user_input"};case"fixing_ci":return{sessionState:"working",sessionReason:"fixing_ci"};case"addressing_reviews":return{sessionState:"working",sessionReason:"resolving_review_comments"};case"pr_created":return{sessionState:"idle",sessionReason:"pr_created"};case"completed":return{sessionState:"idle",sessionReason:"research_complete"}}}(B.state);return v({status:aW({...f,session:{...f.session,state:a.sessionState,reason:a.sessionReason}}),evidence:`agent_report:${B.state}`,detecting:{attempts:0},sessionState:a.sessionState,sessionReason:a.sessionReason})}return n&&bj(x)&&t(a,n)?v({status:d.SB.STUCK,evidence:`idle_beyond_threshold ${z}`,detecting:{attempts:0},sessionState:"stuck",sessionReason:o?"error_in_process":"probe_failure"}):"valid"!==x.state&&(a.status===d.SB.DETECTING||a.status===d.SB.STUCK||a.status===d.SB.NEEDS_INPUT||"detecting"===f.session.state||"stuck"===f.session.state||"needs_input"===f.session.state)?v("unavailable"!==x.state||"stuck"!==f.session.state||"probe_failure"!==f.session.reason||"alive"!==w.state||w.failed?{status:aW(f),evidence:z,detecting:{attempts:0}}:{status:d.SB.DETECTING,evidence:z,detecting:{attempts:0},sessionState:"detecting",sessionReason:"probe_failure"}):v(a.status===d.SB.SPAWNING||a.status===d.SB.DETECTING||a.status===d.SB.STUCK||a.status===d.SB.NEEDS_INPUT?{status:d.SB.WORKING,evidence:z,detecting:{attempts:0},sessionState:"working",sessionReason:"task_in_progress"}:{status:a.status,evidence:z,detecting:{attempts:0}})}async function w(a,b,c){let{id:d,projectId:f}=a,g=`${d}:${b}`,h=j.get(g);if(h||(h={attempts:0,firstTriggered:new Date},j.set(g,h)),h.escalated)return{reactionType:b,success:!0,action:"escalated",escalated:!0};h.attempts++;let i=c.retries??1/0,k=c.escalateAfter,l=!1;if(h.attempts>i&&(l=!0),"string"==typeof k){let a=cN(k);a>0&&Date.now()-h.firstTriggered.getTime()>a&&(l=!0)}if("number"==typeof k&&h.attempts>k&&(l=!0),l){let e=h.attempts>i?"max_retries":"number"==typeof k&&h.attempts>k?"max_attempts":"max_duration";bG({projectId:f,sessionId:d,source:"reaction",kind:"reaction.escalated",level:"warn",summary:`reaction ${b} escalated after ${h.attempts} attempts`,data:{reactionKey:b,attempts:h.attempts,durationSinceFirstMs:Date.now()-h.firstTriggered.getTime(),escalationCause:e}});let g=cX(a,p),j=cV("reaction.escalated",{sessionId:d,projectId:f,message:`Reaction '${b}' escalated after ${h.attempts} attempts`,data:{reactionKey:b,attempts:h.attempts,context:g,schemaVersion:2}});return await G(j,c.priority??"urgent"),h.escalated=!0,{reactionType:b,success:!0,action:"escalated",escalated:!0}}let m=c.action??"notify";switch(m){case"send-to-agent":if(c.message)try{return await e.send(d,c.message),bG({projectId:f,sessionId:d,source:"reaction",kind:"reaction.action_succeeded",summary:`send-to-agent ${b}`,data:{reactionKey:b,action:"send-to-agent",attempts:h.attempts}}),{reactionType:b,success:!0,action:"send-to-agent",message:c.message,escalated:!1}}catch(a){return bG({projectId:f,sessionId:d,source:"reaction",kind:"reaction.send_to_agent_failed",level:"warn",summary:`send-to-agent failed for ${d}`,data:{reactionKey:b,attempts:h.attempts,errorMessage:a instanceof Error?a.message:String(a)}}),{reactionType:b,success:!1,action:"send-to-agent",escalated:!1}}break;case"notify":{let e=cV("reaction.triggered",{sessionId:d,projectId:f,message:`Reaction '${b}' triggered notification`,data:{reactionKey:b,context:cX(a,p),schemaVersion:2}});return await G(e,c.priority??"info"),bG({projectId:f,sessionId:d,source:"reaction",kind:"reaction.action_succeeded",summary:`notify ${b}`,data:{reactionKey:b,action:"notify",attempts:h.attempts}}),{reactionType:b,success:!0,action:"notify",escalated:!1}}case"auto-merge":{let c=cV("reaction.triggered",{sessionId:d,projectId:f,message:`Reaction '${b}' triggered auto-merge`,data:{reactionKey:b,context:cX(a,p),schemaVersion:2}});return await G(c,"action"),bG({projectId:f,sessionId:d,source:"reaction",kind:"reaction.action_succeeded",summary:`auto-merge ${b}`,data:{reactionKey:b,action:"auto-merge",attempts:h.attempts}}),{reactionType:b,success:!0,action:"auto-merge",escalated:!1}}}return{reactionType:b,success:!1,action:m,escalated:!1}}function x(a,b){j.delete(`${a}:${b}`)}function y(a,c){let d=b.projects[a.projectId],e=b.reactions[c],f=d?.reactions?.[c];return(f?{...e,...f}:e)||null}function z(a,c){if(!b.projects[a.projectId])return;let d=o(a.projectId),f=aX(aY(a.lifecycle)),g={...c,...f};a7(d,a.id,g),e.invalidateCache();let h=Object.fromEntries(Object.entries(a.metadata).filter(([a])=>{let b=g[a];return void 0===b||""!==b}));for(let[a,b]of Object.entries(g))void 0!==b&&""!==b&&(h[a]=b);a.metadata=h,a.status=aW(a.lifecycle)}function A(a){return[...a].sort().join(",")}async function B(a,f,g,h){let i,j=b.projects[a.projectId];if(!j||!a.pr)return;let k=j.scm?.plugin?c.get("scm",j.scm.plugin):null;if(!k)return;let l="changes-requested",m="bugbot-comments";if(d.CM.has(g)||"open"!==a.lifecycle.pr.state){x(a.id,l),x(a.id,m),r.delete(a.id),z(a,{lastPendingReviewFingerprint:"",lastPendingReviewDispatchHash:"",lastPendingReviewDispatchAt:"",lastAutomatedReviewFingerprint:"",lastAutomatedReviewDispatchHash:"",lastAutomatedReviewDispatchAt:""});return}if(h?.key!==l&&h?.key!==m){let b=r.get(a.id)??0;if(Date.now()-b<12e4)return}let n=[];try{if(k.getReviewThreads){let b=await k.getReviewThreads(a.pr);i=b.threads,n=b.reviews}else i=await k.getPendingComments(a.pr)}catch(b){bG({projectId:a.projectId,sessionId:a.id,source:"scm",kind:"scm.review_fetch_failed",level:"warn",summary:`review fetch failed for PR #${a.pr.number}`,data:{plugin:j.scm?.plugin,prNumber:a.pr.number,prUrl:a.pr.url,errorMessage:b instanceof Error?b.message:String(b)}});return}r.set(a.id,Date.now());{let b=i.filter(a=>!a.isBot),c=JSON.stringify({unresolvedThreads:b.length,unresolvedComments:b.map(a=>({url:a.url,path:a.path??"",author:a.author,body:a.body})),reviews:n.map(a=>({author:a.author,state:a.state,body:a.body})),commentsUpdatedAt:new Date().toISOString()});a.metadata.prReviewComments!==c&&z(a,{prReviewComments:c})}let o=i.filter(a=>!a.isBot),p=i.filter(a=>a.isBot);{let b=A(o.map(a=>a.id)),c=a.metadata.lastPendingReviewFingerprint??"",d=a.metadata.lastPendingReviewDispatchHash??"";if(b!==c&&h?.key!==l&&x(a.id,l),b!==c&&z(a,{lastPendingReviewFingerprint:b}),b){if(b!==d){let c=y(a,l);if(c&&c.action&&(!1!==c.auto||"notify"===c.action)){let d=C(o,"reviewer",n),f=!1;if(h?.key===l&&"send-to-agent"===c.action)try{await e.send(a.id,d),f=!0}catch{}else{let b={...c,message:d};f=(await w(a,l,b)).success}f&&z(a,{lastPendingReviewDispatchHash:b,lastPendingReviewDispatchAt:new Date().toISOString()})}}}else x(a.id,l),z(a,{lastPendingReviewFingerprint:"",lastPendingReviewDispatchHash:"",lastPendingReviewDispatchAt:""})}{let b=A(p.map(a=>a.id)),c=a.metadata.lastAutomatedReviewFingerprint??"",d=a.metadata.lastAutomatedReviewDispatchHash??"";if(b!==c&&(x(a.id,m),z(a,{lastAutomatedReviewFingerprint:b})),b){if(b!==d){let c=y(a,m);if(c&&c.action&&(!1!==c.auto||"notify"===c.action)){let d=C(p,"bot"),f=!1;if(h?.key===m&&"send-to-agent"===c.action)try{await e.send(a.id,d),f=!0}catch{}else{let b={...c,message:d};f=(await w(a,m,b)).success}f&&z(a,{lastAutomatedReviewDispatchHash:b,lastAutomatedReviewDispatchAt:new Date().toISOString()})}}}else x(a.id,m),z(a,{lastAutomatedReviewFingerprint:"",lastAutomatedReviewDispatchHash:"",lastAutomatedReviewDispatchAt:""})}}function C(a,b,c=[]){let d=[],e=c.filter(a=>a.body&&a.body.trim().length>0);if(e.length>0)for(let a of e)d.push(`Review by @${a.author} (${a.state}):`),d.push(`"${a.body.trim()}"`,"");let f="reviewer"===b?`The following ${a.length} unresolved review comment(s) are on your PR (as of just now). You should not need to re-fetch this data unless you need additional context.`:`The following ${a.length} automated review comment(s) are on your PR (as of just now). You should not need to re-fetch this data unless you need additional context.`;d.push(f,"");for(let b=0;b<a.length;b++){let c=a[b],e=c.path?`${c.path}${c.line?`:${c.line}`:""}`:"(general)";d.push(`${b+1}. ${e} (@${c.author}): "${c.body}"`),c.url&&d.push(` ${c.url}`),c.threadId&&d.push(` Thread ID: ${c.threadId}`)}return d.push("","Address each comment, push fixes. Use the thread ID to resolve each thread directly after pushing. You should not need to re-fetch review data unless you need additional context beyond what is provided here."),d.join("\n")}function D(a){let b=["CI checks are failing on your PR. Here are the failed checks:",""];for(let c of a){let a=c.conclusion??c.status,d=c.url?` — ${c.url}`:"";b.push(`- **${c.name}**: ${a}${d}`)}return b.push("","Investigate the failures, fix the issues, and push again."),b.join("\n")}async function E(a,d,f,g){let h,i=b.projects[a.projectId];if(!i||!a.pr)return;let j=i.scm?.plugin?c.get("scm",i.scm.plugin):null;if(!j)return;let k="ci-failed";if("merged"===f||"killed"===f){x(a.id,k),z(a,{lastCIFailureFingerprint:"",lastCIFailureDispatchHash:"",lastCIFailureDispatchAt:""});return}if("ci_failed"!==f){a.metadata.lastCIFailureFingerprint&&(x(a.id,k),z(a,{lastCIFailureFingerprint:"",lastCIFailureDispatchHash:"",lastCIFailureDispatchAt:""}));return}let l=`${a.pr.owner}/${a.pr.repo}#${a.pr.number}`,m=p.get(l);if(m?.ciChecks!==void 0)h=m.ciChecks;else try{h=await j.getCIChecks(a.pr)}catch{return}let n=h.filter(a=>"failed"===a.status||a.conclusion?.toUpperCase()==="FAILURE");if(0===n.length)return;let o=A(n.map(a=>`${a.name}:${a.status}:${a.conclusion??""}`)),q=a.metadata.lastCIFailureFingerprint??"",r=a.metadata.lastCIFailureDispatchHash??"";if(o!==q&&g?.key!==k&&x(a.id,k),o!==q&&z(a,{lastCIFailureFingerprint:o}),g?.key===k&&g.result?.success)return void z(a,{lastCIFailureDispatchHash:o,lastCIFailureDispatchAt:new Date().toISOString()});if(o===r)return;let s=y(a,k);if(s&&s.action&&(!1!==s.auto||"notify"===s.action)){let b=D(n);try{if("send-to-agent"===s.action)await e.send(a.id,b);else{let c=cX(a,p),d=cV("ci.failing",{sessionId:a.id,projectId:a.projectId,message:b,data:{failedChecks:n.map(a=>a.name),context:c,schemaVersion:2}});await G(d,s.priority??"warning")}z(a,{lastCIFailureDispatchHash:o,lastCIFailureDispatchAt:new Date().toISOString()})}catch{}}}async function F(a,d){let e=b.projects[a.projectId];if(!e||!a.pr||!(e.scm?.plugin?c.get("scm",e.scm.plugin):null))return;let f="merge-conflicts";if("open"!==a.lifecycle.pr.state||"killed"===d){x(a.id,f),z(a,{lastMergeConflictDispatched:""});return}if("pr_open"!==d&&"ci_failed"!==d&&"review_pending"!==d&&"changes_requested"!==d&&"approved"!==d&&"mergeable"!==d)return;let g=`${a.pr.owner}/${a.pr.repo}#${a.pr.number}`,h=p.get(g);if(!h)return;let i=h.hasConflicts??!1,j=a.metadata.lastMergeConflictDispatched??"";if(i){if("true"===j)return;let b=y(a,f);if(b&&b.action&&(!1!==b.auto||"notify"===b.action))try{let c={...b,priority:b.priority??"warning"};if("send-to-agent"===b.action&&!b.message){let b=a.pr.baseBranch??"the default branch",d=h.isBehind?` is behind ${b} and`:"";c.message=`Your PR branch${d} has merge conflicts with ${b}. Rebase your branch on ${b}, resolve the conflicts, and push. You should not need to call gh for merge status unless you need additional context — this information is current.`}let d=await w(a,f,c);d.success&&"escalated"!==d.action&&z(a,{lastMergeConflictDispatched:"true"})}catch{}}else"true"===j&&(z(a,{lastMergeConflictDispatched:""}),x(a.id,f))}async function G(a,d){let e={...a,priority:d};for(let a of b.notificationRouting[d]??b.defaults.notifiers){let d=function(a,b){let c=a.notifiers?.[b];return c?.plugin?{reference:b,pluginName:c.plugin}:{reference:b,pluginName:b}}(b,a),f=c.get("notifier",d.reference)??c.get("notifier",d.pluginName);if(f)try{await f.notify(e)}catch{}}}async function H(a){if(a.status!==d.SB.MERGED)return;let{autoCleanupOnMerge:c=!0,mergeCleanupIdleGraceMs:f=3e5}=b.lifecycle??{};if(!c)return;let i=new Date().toISOString(),j=a.metadata.mergedPendingCleanupSince||i,k=Date.parse(j),l=!!Number.isFinite(k)&&Date.now()-k>=f,m=a.activity;if((m===d.u3.ACTIVE||m===d.u3.WAITING_INPUT||m===d.u3.BLOCKED)&&!l){a.metadata.mergedPendingCleanupSince||z(a,{mergedPendingCleanupSince:i}),g.recordOperation({metric:"lifecycle_poll",operation:"lifecycle.merge_cleanup.deferred",outcome:"success",correlationId:cK("lifecycle-merge-cleanup"),projectId:a.projectId,sessionId:a.id,reason:c$(a.lifecycle),data:{activity:m,pendingSince:j,graceMs:f},level:"info"}),bG({projectId:a.projectId,sessionId:a.id,source:"lifecycle",kind:"session.auto_cleanup_deferred",summary:`auto-cleanup deferred for ${a.id}`,data:{activity:m,pendingElapsedMs:Number.isFinite(k)?Date.now()-k:null,graceMs:f}});return}let n=cK("lifecycle-merge-cleanup");try{let b=await e.kill(a.id,{purgeOpenCode:!0,reason:"pr_merged"});g.recordOperation({metric:"lifecycle_poll",operation:"lifecycle.merge_cleanup.completed",outcome:"success",correlationId:n,projectId:a.projectId,sessionId:a.id,reason:c$(a.lifecycle),data:{cleaned:b.cleaned,alreadyTerminated:b.alreadyTerminated,graceElapsed:l,activity:m},level:"info"}),bG({projectId:a.projectId,sessionId:a.id,source:"lifecycle",kind:"session.auto_cleanup_completed",summary:`auto-cleanup completed for ${a.id}`,data:{cleaned:b.cleaned,alreadyTerminated:b.alreadyTerminated,graceElapsed:l,activity:m}}),h.delete(a.id)}catch(c){a.metadata.mergedPendingCleanupSince||z(a,{mergedPendingCleanupSince:i});let b=c instanceof Error?c.message:String(c);g.recordOperation({metric:"lifecycle_poll",operation:"lifecycle.merge_cleanup.failed",outcome:"failure",correlationId:n,projectId:a.projectId,sessionId:a.id,reason:b,level:"warn"}),bG({projectId:a.projectId,sessionId:a.id,source:"lifecycle",kind:"session.auto_cleanup_failed",level:"error",summary:`auto-cleanup failed for ${a.id}`,data:{errorMessage:b}})}}async function I(a){var b;let c,e=h.get(a.id)??(a.metadata?.status||a.status),f=aY(a.lifecycle),i=a.lifecycle.pr.state,j=await v(a),k=j.status,l=a.metadata.lifecycle!==JSON.stringify(a.lifecycle),n=j.evidence,o=j.detectingAttempts>0?String(j.detectingAttempts):"",q=j.detectingStartedAt??"",r=j.detectingEvidenceHash??"",s=k===d.SB.STUCK&&(j.detectingAttempts>3||bq(q)),t=s?a.metadata.detectingEscalatedAt||new Date().toISOString():"";if(s&&!a.metadata.detectingEscalatedAt){let b=j.detectingAttempts>3?"max_attempts":"max_duration";bG({projectId:a.projectId,sessionId:a.id,source:"lifecycle",kind:"detecting.escalated",level:"warn",summary:`detecting → stuck via ${b}`,data:{attempts:j.detectingAttempts,cause:b,startedAt:q}})}let u={};if(a.metadata.lifecycleEvidence!==n&&(u.lifecycleEvidence=n),(a.metadata.detectingAttempts||"")!==o&&(u.detectingAttempts=o),(a.metadata.detectingStartedAt||"")!==q&&(u.detectingStartedAt=q),(a.metadata.detectingEvidenceHash||"")!==r&&(u.detectingEvidenceHash=r),(a.metadata.detectingEscalatedAt||"")!==t&&(u.detectingEscalatedAt=t),Object.keys(u).length>0&&z(a,u),a.pr){let b=`${a.pr.owner}/${a.pr.repo}#${a.pr.number}`,c=p.get(b);if(c)if("passing"===c.ciStatus){let b=Number(a.metadata.ciPassingStableCount??"0")+1;b>=2?(x(a.id,"ci-failed"),z(a,{ciPassingStableCount:""})):z(a,{ciPassingStableCount:String(b)})}else a.metadata.ciPassingStableCount&&z(a,{ciPassingStableCount:""})}if(k!==e){let b=cK("lifecycle-transition");h.set(a.id,k),z(a,{status:k}),bG({projectId:a.projectId,sessionId:a.id,source:"lifecycle",kind:"lifecycle.transition",level:"ci_failed"===k?"warn":"info",summary:`${e} → ${k}`,data:{from:e,to:k}}),g.recordOperation({metric:"lifecycle_poll",operation:"lifecycle.transition",outcome:"success",correlationId:b,projectId:a.projectId,sessionId:a.id,reason:c$(a.lifecycle),data:c_(f,a.lifecycle,e,k,j.evidence,j.detectingAttempts,!0),level:cZ(k)}),d.CM.has(k)||(m=!1);let i=cW(void 0,e);if(i){let b=cY(i);b&&!cO.has(b)&&x(a.id,b)}let l=cW(e,k);if(l){let d=!1,h=cY(l);if(h){let i=y(a,h);if("ci-failed"===h&&a.pr&&i){let b=`${a.pr.owner}/${a.pr.repo}#${a.pr.number}`,c=p.get(b);if(c?.ciChecks){let a=c.ciChecks.filter(a=>"failed"===a.status);a.length>0&&(i={...i,message:D(a)})}}if(i&&i.action&&(!1!==i.auto||"notify"===i.action)){let l=await w(a,h,i);c={key:h,result:l},g.recordOperation({metric:"lifecycle_poll",operation:"lifecycle.transition.reaction",outcome:l.success?"success":"failure",correlationId:b,projectId:a.projectId,sessionId:a.id,reason:c$(a.lifecycle),data:c_(f,a.lifecycle,e,k,j.evidence,j.detectingAttempts,!0,c),level:l.success?"info":"warn"}),d=!0}}if(!d){let b=cU(l),c=cX(a,p),d=cV(l,{sessionId:a.id,projectId:a.projectId,message:`${a.id}: ${e} → ${k}`,data:{oldStatus:e,newStatus:k,context:c,schemaVersion:2}});await G(d,b)}}}else h.set(a.id,k),l&&(z(a,{status:k}),g.recordOperation({metric:"lifecycle_poll",operation:"lifecycle.sync",outcome:"success",correlationId:cK("lifecycle-sync"),projectId:a.projectId,sessionId:a.id,reason:c$(a.lifecycle),data:c_(f,a.lifecycle,e,k,j.evidence,j.detectingAttempts,!1),level:cZ(k)}));let A=i===(b=a.lifecycle.pr.state)?null:"closed"===b?"pr.closed":null;if(A){let b=!1,c=cY(A);if(c){let d=y(a,c);d&&d.action&&(!1!==d.auto||"notify"===d.action)&&(await w(a,c,d),b=!0)}if(!b){let b=cX(a,p),c=cV(A,{sessionId:a.id,projectId:a.projectId,message:`${a.id}: PR ${i} → ${a.lifecycle.pr.state}`,data:{oldPRState:i,newPRState:a.lifecycle.pr.state,prNumber:a.lifecycle.pr.number,prUrl:a.lifecycle.pr.url,context:b,schemaVersion:2}});await G(c,cU(A))}}if(a.agentInfo?.summary&&!a.agentInfo.summaryIsFallback&&!a.metadata.pinnedSummary){let b=a.agentInfo.summary.replace(/[\n\r]/g," ").trim();if(b.length>=5)try{z(a,{pinnedSummary:b})}catch{}}await Promise.allSettled([B(a,e,k,c),F(a,k),E(a,e,k,c)]),await J(a),await H(a)}async function J(a){let b=function(a,b={},c=new Date){if(bw.has(a.status)||a.lifecycle?.session.kind==="orchestrator")return null;let d={...bv,...b},e=bp(a.metadata),f=function(a,b,c,d){if(!d.checkBlocked||!b)return null;if("needs_input"===b.state){let a=Date.parse(b.timestamp),d=Number.isNaN(a)?void 0:c.getTime()-a;return{trigger:"agent_needs_input",message:`Agent needs input: ${b.note??"waiting for user decision"}`,checkedAt:c.toISOString(),report:b,timeSinceReportMs:d}}return null}(0,e,c,d);if(f)return f;let g=function(a,b,c,d){if(!d.checkAcknowledge||b)return null;let e=a.createdAt??a.metadata.createdAt;if(!e)return null;let f="string"==typeof e?Date.parse(e):e.getTime();if(Number.isNaN(f))return null;let g=c.getTime()-f;return g<d.acknowledgeTimeoutMs?null:{trigger:"no_acknowledge",message:`Agent has not acknowledged task after ${Math.round(g/6e4)} minutes`,checkedAt:c.toISOString(),report:null,timeSinceSpawnMs:g}}(a,e,c,d);if(g)return g;let h=function(a,b,c,d){if(!d.checkStale||!b)return null;let e=Date.parse(b.timestamp);if(Number.isNaN(e))return null;let f=c.getTime()-e;return f<d.staleReportTimeoutMs||"waiting"===b.state||"needs_input"===b.state?null:{trigger:"stale_report",message:`Agent report is stale (${Math.round(f/6e4)} minutes since last report)`,checkedAt:c.toISOString(),report:b,timeSinceReportMs:f}}(0,e,c,d);return h||null}(a),c=new Date().toISOString();if(!b||!b.trigger){a.metadata[bx.ACTIVE_TRIGGER]&&z(a,{[bx.LAST_AUDITED_AT]:c,[bx.ACTIVE_TRIGGER]:"",[bx.TRIGGER_ACTIVATED_AT]:"",[bx.TRIGGER_COUNT]:""});return}let d=function(a){switch(a){case"no_acknowledge":return"report-no-acknowledge";case"stale_report":return"report-stale";case"agent_needs_input":return"report-needs-input"}}(b.trigger),e=y(a,d),f=parseInt(a.metadata[bx.TRIGGER_COUNT]??"0",10),h=a.metadata[bx.ACTIVE_TRIGGER]!==b.trigger;z(a,{[bx.LAST_AUDITED_AT]:c,[bx.ACTIVE_TRIGGER]:b.trigger,[bx.TRIGGER_ACTIVATED_AT]:h?c:a.metadata[bx.TRIGGER_ACTIVATED_AT]??c,[bx.TRIGGER_COUNT]:String(h?1:f+1)}),g.recordOperation({metric:"lifecycle_poll",operation:"report_watcher.audit",outcome:"success",correlationId:cK("report-watcher"),projectId:a.projectId,sessionId:a.id,reason:b.trigger,data:{trigger:b.trigger,message:b.message,timeSinceSpawnMs:b.timeSinceSpawnMs,timeSinceReportMs:b.timeSinceReportMs,reportState:b.report?.state},level:"warn"}),h&&bG({projectId:a.projectId,sessionId:a.id,source:"report-watcher",kind:"report_watcher.triggered",level:"warn",summary:`${b.trigger} triggered`,data:{trigger:b.trigger,message:b.message,timeSinceSpawnMs:b.timeSinceSpawnMs,timeSinceReportMs:b.timeSinceReportMs,reportState:b.report?.state}}),h&&e&&!1!==e.auto&&await w(a,d,e)}async function K(){let a=cK("lifecycle-poll"),c=Date.now();if(!l){l=!0;try{let k=await e.list(f),l=k.filter(a=>{if(!d.CM.has(a.status))return!0;let b=h.get(a.id);return void 0!==b&&b!==a.status});await Promise.allSettled(l.map(a=>u(a,k))),await s(l),await Promise.allSettled(l.map(a=>I(a)));for(let a of l){if(!a.pr||!b.projects[a.projectId])continue;let c=`${a.pr.owner}/${a.pr.repo}#${a.pr.number}`,d=p.get(c);if(!d)continue;let e=JSON.stringify({state:d.state,ciStatus:d.ciStatus,reviewDecision:d.reviewDecision,mergeable:d.mergeable,title:d.title,additions:d.additions,deletions:d.deletions,isDraft:d.isDraft,hasConflicts:d.hasConflicts,isBehind:d.isBehind,blockers:d.blockers,ciChecks:d.ciChecks?.map(a=>({name:a.name,status:a.status,url:a.url})),enrichedAt:new Date().toISOString()});a.metadata.prEnrichment!==e&&(a7(o(a.projectId),a.id,{prEnrichment:e}),a.metadata.prEnrichment=e)}let n=new Set(k.map(a=>a.id));for(let a of h.keys())n.has(a)||h.delete(a);for(let a of i.keys())n.has(a)||i.delete(a);for(let a of j.keys()){let b=a.split(":")[0];b&&!n.has(b)&&j.delete(a)}for(let a of r.keys())n.has(a)||r.delete(a);let q=k.filter(a=>!d.CM.has(a.status));if(k.length>0&&0===q.length&&!m){m=!0;let a=cY("summary.all_complete");if(a){let c=b.reactions[a];c&&c.action&&(!1!==c.auto||"notify"===c.action)&&await w({id:"system",projectId:"all",pr:null,issueId:null,branch:null,metadata:{},agentInfo:null},a,c)}}f&&(g.recordOperation({metric:"lifecycle_poll",operation:"lifecycle.poll",outcome:"success",correlationId:a,projectId:f,durationMs:Date.now()-c,data:{sessionCount:k.length,activeSessionCount:q.length},level:"info"}),g.setHealth({surface:"lifecycle.worker",status:"ok",projectId:f,correlationId:a,details:{projectId:f,sessionCount:k.length,activeSessionCount:q.length}}))}catch(d){let b=d instanceof Error?d.message:String(d);g.recordOperation({metric:"lifecycle_poll",operation:"lifecycle.poll",outcome:"failure",correlationId:a,projectId:f,durationMs:Date.now()-c,reason:b,level:"error"}),bG({projectId:f,source:"lifecycle",kind:"lifecycle.poll_failed",level:"error",summary:"poll cycle failed",data:{errorMessage:b,durationMs:Date.now()-c,projectScope:f??"all"}}),g.setHealth({surface:"lifecycle.worker",status:"error",projectId:f,correlationId:a,reason:b,details:f?{projectId:f}:{projectScope:"all"}})}finally{l=!1}}}return{start(a=3e4){k||(k=setInterval(()=>void K(),a),K())},stop(){k&&(clearInterval(k),k=null)},getStates:()=>new Map(h),async check(a){let b=await e.get(a);if(!b)throw Error(`Session ${a} not found`);await u(b),await s([b]),await I(b)}}}function c1(a){let b=function(a){let{config:b,projectId:c,project:d}=a,e=!!d.repo;return{projectId:c,projectName:d.name,projectRepo:d.repo??"not configured",projectDefaultBranch:d.defaultBranch,projectSessionPrefix:d.sessionPrefix,projectPath:d.path,dashboardPort:String(b.port??3e3),automatedReactionsSection:function(a){let b="*".repeat(2),c=a=>`${b}${a}${b}`,d=[];for(let[b,e]of Object.entries(a.reactions??{})){if(e.auto&&"send-to-agent"===e.action){d.push(`- ${c(b)}: Auto-sends instruction to agent (retries: ${e.retries??"none"}, escalates after: ${e.escalateAfter??"never"})`);continue}e.auto&&"notify"===e.action&&d.push(`- ${c(b)}: Notifies human (priority: ${e.priority??"info"})`)}return 0===d.length?"":d.join("\n")}(d),projectSpecificRulesSection:function(a){let b=a.orchestratorRules?.trim();return b||""}(d),repoConfiguredSection:e?"true":"",repoNotConfiguredSection:e?"":"true"}}(a);return(function(a,b){let c=a.replace(/\{\{([a-zA-Z0-9_]+)\}\}/g,"").match(/\{\{[^}]+\}\}/);if(c)throw Error(`Unresolved template placeholder: ${c[0]}`);return a.replace(/\{\{([a-zA-Z0-9_]+)\}\}/g,(a,c)=>{if(!Object.prototype.hasOwnProperty.call(b,c))throw Error(`Unresolved template placeholder: ${c}`);return b[c]})})(function(a,b){let c=[["REPO_CONFIGURED_SECTION_START","REPO_CONFIGURED_SECTION_END",b.repoConfiguredSection],["REPO_NOT_CONFIGURED_SECTION_START","REPO_NOT_CONFIGURED_SECTION_END",b.repoNotConfiguredSection],["AUTOMATED_REACTIONS_SECTION_START","AUTOMATED_REACTIONS_SECTION_END",b.automatedReactionsSection],["PROJECT_SPECIFIC_RULES_SECTION_START","PROJECT_SPECIFIC_RULES_SECTION_END",b.projectSpecificRulesSection]],d=a;for(let[a,b,e]of c){let c=`{{${a}}}`,f=`{{${b}}}`;for(;;){let a=d.indexOf(c),b=d.indexOf(f);if(-1===a&&-1===b)break;if(-1===a||-1===b||b<a)throw Error(`Malformed optional section block: expected ${c} before ${f}`);let g=b+f.length,h=d.slice(a+c.length,b);if(h.includes(c))throw Error(`Nested optional section blocks are not supported: ${c} before ${f}`);let i=e?h:"",j=d.slice(0,a),k=d.slice(g);d=i?j+i+k:function(a,b){let c=a.match(/\n*$/)?.[0]??"",d=b.match(/^\n*/)?.[0]??"",e=c.length+d.length>=2?"\n\n":c+d;return a.slice(0,a.length-c.length)+e+b.slice(d.length)}(j,k)}}return d}('# {{projectName}} Orchestrator\n\nYou are the **orchestrator agent** for the {{projectName}} project.\n\nYour role is to coordinate and manage worker agent sessions. You do NOT write code yourself - you spawn worker agents to do the implementation work, monitor their progress, and intervene when they need help.\n\n## Non-Negotiable Rules\n\n- Investigations from the orchestrator session are **read-only**. Inspect status, logs, metadata, PR state, and worker output, but do not edit repository files or implement fixes from the orchestrator session.\n- Any code change, test run tied to implementation, git branch work, or PR takeover must be delegated to a **worker session**.\n- The orchestrator session must never own a PR. Never claim a PR into the orchestrator session, and never treat the orchestrator as the worker responsible for implementation.\n- If an investigation discovers follow-up work, either spawn a worker session or direct an existing worker session with clear instructions.\n- **Always use `ao send` to communicate with sessions** - never bypass it by writing to the runtime layer directly (e.g. `tmux send-keys` / `tmux capture-pane` on Unix, or writing to the named pipe `\\\\.\\pipe\\ao-pty-<sessionId>` on Windows). Direct runtime access bypasses busy detection, retry logic, and input sanitization, and breaks multi-line input for some agents (e.g. Codex).\n- When a session might be busy, use `ao send --no-wait <session> <message>` to send without waiting for the session to become idle.\n\n## Project Info\n\n- **Name**: {{projectName}}\n- **Repository**: {{projectRepo}}\n- **Default Branch**: {{projectDefaultBranch}}\n- **Session Prefix**: {{projectSessionPrefix}}\n- **Local Path**: {{projectPath}}\n- **Dashboard Port**: {{dashboardPort}}\n\n## Quick Start\n\n```bash\n# See all sessions at a glance\nao status\n\n{{REPO_CONFIGURED_SECTION_START}}# Spawn sessions for issues (GitHub: #123, Linear: INT-1234, etc.)\nao spawn INT-1234\nao spawn --claim-pr 123\nao batch-spawn INT-1 INT-2 INT-3\n\n{{REPO_CONFIGURED_SECTION_END}}# Spawn a session without a tracker issue (prompt-driven)\nao spawn --prompt "Refactor the auth module to use JWT"\n\n# List sessions\nao session ls -p {{projectId}}\n\n# Send message to a session\nao send {{projectSessionPrefix}}-1 "Your message here"\n\n{{REPO_CONFIGURED_SECTION_START}}# Claim an existing PR for a worker session\nao session claim-pr 123 {{projectSessionPrefix}}-1\n\n{{REPO_CONFIGURED_SECTION_END}}# Kill a session\nao session kill {{projectSessionPrefix}}-1\n{{REPO_CONFIGURED_SECTION_START}}\n# Open all sessions in terminal tabs\nao open {{projectId}}{{REPO_CONFIGURED_SECTION_END}}\n```\n\n{{REPO_NOT_CONFIGURED_SECTION_START}}\n\n> **Note:** No repository remote is configured. Issue tracking, PR, and CI features are unavailable.\n> Add a `repo` field (owner/repo) to `agent-orchestrator.yaml` to enable them.\n{{REPO_NOT_CONFIGURED_SECTION_END}}\n\n## Available Commands\n\n- `ao status`: Show all sessions{{REPO_CONFIGURED_SECTION_START}} with PR/CI/review status{{REPO_CONFIGURED_SECTION_END}}\n- `ao spawn [issue] [--prompt <text>]{{REPO_CONFIGURED_SECTION_START}} [--claim-pr <pr>]{{REPO_CONFIGURED_SECTION_END}}`: Spawn a worker session{{REPO_CONFIGURED_SECTION_START}}; use issue ID or --prompt for freeform tasks{{REPO_CONFIGURED_SECTION_END}}{{REPO_NOT_CONFIGURED_SECTION_START}} with --prompt for freeform tasks{{REPO_NOT_CONFIGURED_SECTION_END}}\n {{REPO_CONFIGURED_SECTION_START}}- `ao batch-spawn <issues...>`: Spawn multiple sessions in parallel (project auto-detected)\n {{REPO_CONFIGURED_SECTION_END}}- `ao session ls [-p project]`: List all sessions (optionally filter by project)\n {{REPO_CONFIGURED_SECTION_START}}- `ao session claim-pr <pr> [session]`: Attach an existing PR to a worker session\n {{REPO_CONFIGURED_SECTION_END}}- `ao session attach <session>`: Attach to a session\'s terminal (a tmux window on Unix; a ConPTY pty-host on Windows)\n- `ao session kill <session>`: Kill a specific session\n- `ao session cleanup [-p project]`: Kill cleanup-eligible sessions (closed work or dead runtimes)\n- `ao send <session> <message>`: Send a message to a running session\n- `ao send --no-wait <session> <message>`: Send without waiting for session to become idle\n- `ao dashboard`: Start the web dashboard (http://localhost:{{dashboardPort}})\n- `ao open <project>`: Open all project sessions in terminal tabs\n\n## Session Management\n\n### Spawning Sessions\n\nWhen you spawn a session:\n\n1. A git worktree is created from `{{projectDefaultBranch}}`\n2. A feature branch is created (e.g., `feat/INT-1234` for issues, `session/<id>` for prompt-driven)\n3. A runtime session is started (e.g., `{{projectSessionPrefix}}-1`) — tmux session on Unix, ConPTY pty-host on Windows\n4. The agent is launched with context about the issue or prompt\n5. Metadata is written to the project-specific sessions directory\n\nA tracker issue is **not required**. Use `--prompt` to spawn freeform sessions:\n\n```bash\nao spawn --prompt "Add rate limiting to the /api/upload endpoint"\n```\n\n### Monitoring Progress\n\nUse `ao status` to see:\n\n- Current session status (working, pr_open, review_pending, etc.)\n {{REPO_CONFIGURED_SECTION_START}}- PR state (open/merged/closed)\n- CI status (passing/failing/pending)\n- Review decision (approved/changes_requested/pending)\n- Unresolved comments count\n {{REPO_CONFIGURED_SECTION_END}}\n\nTo inspect what each worker has self-reported, pass `--reports`:\n\n```bash\nao status --reports 5 # last 5 report entries per session\nao status --reports full # full audit trail per session\n```\n\nReach for this when an inferred status disagrees with what the worker said, when deciding whether to send a follow-up instruction vs. wait, or when triaging a session that looks stuck.\n\n### Explicit Agent Reports\n\nWorker agents self-declare their workflow phase using `ao acknowledge` and `ao report <state>` (started, working, waiting, needs-input, fixing-ci, addressing-reviews, pr-created, draft-pr-created, ready-for-review, completed). These reports are persisted alongside the canonical lifecycle and may inform lifecycle inference, but do not replace runtime/activity/SCM-derived truth.\n\n- Never run `ao acknowledge` or `ao report` from the orchestrator session - they are worker-only commands. Read the audit trail with `ao status --reports` instead.\n- Fresh reports (<5 min) are useful hints when inference is weak, but runtime death, activity-based waiting_input, and SCM truth (merged/closed PR, CI failure, review decisions) still take precedence.\n- Use `--pr-url` / `--pr-number` on PR workflow reports when the agent knows them; merged/closed remain SCM-owned.\n- If an agent reports `waiting` but a PR actually merged, trust the PR state and follow up.\n\n### Sending Messages\n\nSend instructions to a running agent:\n\n```bash\nao send {{projectSessionPrefix}}-1 "Please address the review comments on your PR"\n```\n\n{{REPO_CONFIGURED_SECTION_START}}### PR Takeover\n\nIf a worker session needs to continue work on an existing PR:\n\n```bash\nao session claim-pr 123 {{projectSessionPrefix}}-1\n# or do it at spawn time\nao spawn --claim-pr 123\n```\n\nThis updates AO metadata, switches the worker worktree onto the PR branch, and lets lifecycle reactions keep routing CI and review feedback to that worker session.\n\nNever claim a PR into `{{projectSessionPrefix}}-orchestrator`. If a PR needs implementation or takeover, delegate it to a worker session instead.\n{{REPO_CONFIGURED_SECTION_END}}\n\n### Investigation Workflow\n\nWhen debugging or triaging from the orchestrator session:\n\n1. Inspect with read-only commands such as `ao status`, `ao session ls`, `ao session attach`, and SCM/tracker lookups.\n2. Decide whether a worker already owns the work or a new worker is needed.\n3. Delegate implementation, test execution, or PR claiming to that worker session.\n4. Return to monitoring and coordination once the worker has the task.\n\n### Cleanup\n\nRemove completed sessions:\n\n```bash\nao session cleanup -p {{projectId}} # Kill sessions whose work closed or runtime has exited\n```\n\n## Dashboard\n\nThe web dashboard runs at **http://localhost:{{dashboardPort}}**.\n\nFeatures:\n\n- Live session cards with activity status\n- PR table with CI checks and review state\n- Attention zones (merge ready, needs response, working, done)\n- One-click actions (send message, kill, merge PR)\n- Real-time updates via Server-Sent Events\n\n{{AUTOMATED_REACTIONS_SECTION_START}}\n\n## Automated Reactions\n\nThe system automatically handles these events:\n\n{{automatedReactionsSection}}\n{{AUTOMATED_REACTIONS_SECTION_END}}\n\n## Common Workflows\n\n{{REPO_CONFIGURED_SECTION_START}}### Bulk Issue Processing\n\n1. Get list of issues from tracker (GitHub/Linear/etc.)\n2. Use `ao batch-spawn` to spawn sessions for each issue\n3. Monitor with `ao status` or the dashboard\n4. Agents will fetch, implement, test, PR, and respond to reviews\n5. Use `ao session cleanup` when work is truly finished or the runtime is gone\n\n{{REPO_CONFIGURED_SECTION_END}}### Handling Stuck Agents\n\n1. Check `ao status` for sessions in "stuck" or "needs_input" state\n2. Attach with `ao session attach <session>` to see what they\'re doing\n3. Send clarification or instructions with `ao send <session> \'...\'`\n4. Or kill and respawn with fresh context if needed\n\n{{REPO_CONFIGURED_SECTION_START}}### PR Review Flow\n\n1. Agent creates PR and pushes\n2. CI runs automatically\n3. If CI fails: reaction auto-sends fix instructions to agent\n4. If reviewers request changes: reaction auto-sends comments to agent\n5. When approved + green: notify human to merge (unless auto-merge enabled)\n\n{{REPO_CONFIGURED_SECTION_END}}### Manual Intervention\n\nWhen an agent needs human judgment:\n\n1. You\'ll get a notification (desktop/slack/webhook)\n2. Check the dashboard or `ao status` for details\n3. Attach to the session if needed: `ao session attach <session>`\n4. Send instructions: `ao send <session> \'...\'`\n5. Or handle the human-only action yourself{{REPO_CONFIGURED_SECTION_START}} (merge PR, close issue, etc.){{REPO_CONFIGURED_SECTION_END}} while keeping implementation in worker sessions.\n\n## Tips\n\n1. **Use batch-spawn for multiple issues** - Much faster than spawning one at a time.\n\n2. **Check status before spawning** - Avoid creating duplicate sessions for issues already being worked on.\n\n3. **Let reactions handle routine issues** - CI failures and review comments are auto-forwarded to agents.\n\n4. **Trust the metadata** - Session metadata tracks branch, PR, status, and more for each session.\n\n5. **Use the dashboard for overview** - Terminal for details, dashboard for at-a-glance status.\n\n6. **Cleanup regularly** - `ao session cleanup` removes sessions that are truly cleanup-eligible and keeps things tidy.\n\n7. **Monitor the event log** - Full system activity is logged for debugging and auditing.\n\n8. **Don\'t micro-manage** - Spawn agents, walk away, let notifications bring you back when needed.\n\n{{PROJECT_SPECIFIC_RULES_SECTION_START}}\n\n## Project-Specific Rules\n\n{{projectSpecificRulesSection}}\n{{PROJECT_SPECIFIC_RULES_SECTION_END}}\n'.trim(),b),b).trim()}function c2(a){return(0,g.join)(a,".ao","activity.jsonl")}async function c3(a,b,c,d){let e=c2(a);await (0,bl.mkdir)((0,g.dirname)(e),{recursive:!0});let f={ts:new Date().toISOString(),state:b,source:c,...void 0!==d&&("waiting_input"===b||"blocked"===b)&&{trigger:d}};await (0,bl.appendFile)(e,JSON.stringify(f)+"\n","utf-8")}async function c4(a){let b=c2(a);try{let{open:a}=await Promise.resolve().then(c.t.bind(c,51455,19)),d=await a(b,"r");try{let a=await d.stat();if(0===a.size)return null;let b=Math.min(a.size,4096),c=Math.max(0,a.size-b),e=Buffer.alloc(b),{bytesRead:f}=await d.read(e,0,b,c);if(0===f)return null;let g=e.subarray(0,f).toString("utf-8").split("\n").filter(a=>a.trim());if(c>0&&g.length>1&&(g=g.slice(1)),0===g.length)return null;let h=null;for(let a=g.length-1;a>=0;a--)try{h=JSON.parse(g[a]);break}catch{continue}if(null===h||"object"!=typeof h||null===h||Array.isArray(h))return null;let i=h,j=new Set(["active","ready","idle","waiting_input","blocked","exited"]),k=new Set(["terminal","native"]);if("string"!=typeof i.ts||"string"!=typeof i.state||"string"!=typeof i.source||!j.has(i.state)||!k.has(i.source))return null;return{entry:{ts:i.ts,state:i.state,source:i.source,..."string"==typeof i.trigger&&{trigger:i.trigger}},modifiedAt:a.mtime}}finally{await d.close()}}catch{return null}}function c5(a){if(!a)return null;let{entry:b}=a;if("waiting_input"===b.state||"blocked"===b.state){let a=new Date(b.ts);if(Number.isNaN(a.getTime()))return null;if(Date.now()-a.getTime()<=3e5)return{state:b.state,timestamp:a}}return null}function c6(a,b,c){let d;if(!a)return null;let{entry:e}=a,f=new Date(e.ts);if(Number.isNaN(f.getTime()))return null;if("waiting_input"===e.state||"blocked"===e.state)return Date.now()-f.getTime()<=3e5?{state:e.state,timestamp:f}:{state:"idle",timestamp:f};let g=Math.max(0,Date.now()-f.getTime());d=g<=b?"active":g<=c?"ready":"idle";let h={active:0,ready:1,idle:2},i=h[e.state]??2;return{state:(h[d]??2)>=i?d:e.state,timestamp:f}}async function c7(a,b,c){let{state:d,trigger:e}=function(a,b){let c=b(a),d="waiting_input"===c||"blocked"===c?a.trim().split("\n").slice(-3).join("\n"):void 0;return{state:c,trigger:d}}(b,c);if("waiting_input"!==d&&"blocked"!==d){let b=await c4(a);if(b&&b.entry.state===d&&Date.now()-b.modifiedAt.getTime()<2e4)return}await c3(a,d,"terminal",e)}let c8=(0,t.promisify)(s.execFile);async function c9(a,b=60){try{let{stdout:c}=await c8("git",["log",`--since=${b} seconds ago`,"--format=%H"],{cwd:a,timeout:5e3});return c.trim().length>0}catch{return!1}}let da=(0,t.promisify)(s.execFile),db=null;async function dc(){if(db)return db;let a=await dd();return db=a,a}async function dd(){let a=(0,g.join)((0,h.homedir)(),".ao","bin"),b=(process.env.PATH??"").split(g.delimiter).filter(b=>b&&b!==a),c="win32"===process.platform?(process.env.PATHEXT?.split(";").filter(Boolean)??[".EXE",".CMD",".BAT"]).map(a=>a.toLowerCase()):[""];for(let a of b)for(let b of c){let c=(0,g.join)(a,`gh${b}`);try{return await (0,bl.access)(c,e.constants.X_OK),c}catch{}}throw Error("gh CLI not found outside ~/.ao/bin. Install gh or set GH_PATH to the real binary.")}function de(a){if(!a)return;let b=a.trim();if(!b)return;let c=Number.parseInt(b,10);return Number.isFinite(c)?c:void 0}let df=new Set,dg=new Set;async function dh(a){let b=process.env.AO_GH_TRACE_FILE;if(!b)return;let c=(0,g.dirname)(b),d=`${JSON.stringify(a)}
|
|
884
|
-
`;try{
|
|
880
|
+
${b}`),{systemPrompt:c.join("\n\n"),taskPrompt:a.userPrompt?a.userPrompt:a.issueId?a.issueContext?`Work on issue #${a.issueId.replace(/^#/,"")}. The issue title, description, and labels are already in your system prompt — start implementing without re-fetching the issue. Fetch comments or linked issues only if you need additional context.`:`Work on issue #${a.issueId.replace(/^#/,"")}. Issue details were not pre-fetched — start by reading the issue (e.g. \`gh issue view ${a.issueId.replace(/^#/,"")}\`), then implement.`:void 0}}({project:f,projectId:a.projectId,issueId:a.issueId,issueContext:m,userPrompt:a.prompt,...v&&{orchestratorSessionId:u}}),A=n(a.projectId);(0,e.mkdirSync)(A,{recursive:!0});let B=(0,g.join)(A,`worker-prompt-${q}.md`);if((0,e.writeFileSync)(B,w,"utf-8"),l.push(()=>(0,e.unlinkSync)(B)),"opencode"===j.agent.name){let a=o=bV(A,q,[B]);l.push(()=>(0,e.unlinkSync)(a))}let C=f.opencodeIssueSessionStrategy??"reuse",D="opencode"===j.agent.name&&a.issueId?await x({sessionsDir:k,criteria:{issueId:a.issueId},strategy:C}):void 0,E={sessionId:q,projectConfig:{...f,agentConfig:{...h.agentConfig,...D?{opencodeSessionId:D}:{}}},workspacePath:s,issueId:a.issueId,prompt:y,systemPromptFile:B,permissions:h.permissions,model:h.model,subagent:a.subagent??h.subagent},F=j.agent.getLaunchCommand(E),G=j.agent.getEnvironment(E);j.agent.preLaunchSetup&&await j.agent.preLaunchSetup(s),j.agent.setupWorkspaceHooks&&await j.agent.setupWorkspaceHooks(s,{dataDir:k}),"claude-code"!==j.agent.name&&await ce(s);let H=await j.runtime.create({sessionId:r??q,workspacePath:s,launchCommand:F,environment:{...G,...o?{OPENCODE_CONFIG:o}:{},...f.env??{},PATH:b7(G.PATH??process.env.PATH),GH_PATH:b4,...process.env.AO_AGENT_GH_TRACE&&{AO_AGENT_GH_TRACE:process.env.AO_AGENT_GH_TRACE},AO_SESSION:q,AO_DATA_DIR:k,AO_SESSION_NAME:q,...r&&{AO_TMUX_NAME:r},AO_CALLER_TYPE:"agent",AO_PROJECT_ID:a.projectId,AO_CONFIG_PATH:b.configPath,...void 0!==b.port&&null!==b.port&&{AO_PORT:String(b.port)}}}),I=j.runtime;l.push(()=>I.destroy(H));let J=co({issueTitle:c?.title,prompt:a.prompt}),K=new Date,L=aT("worker",K);L.runtime.handle=H,L.runtime.tmuxName=r??null;let M={id:q,projectId:a.projectId,status:aW(L),activity:"active",activitySignal:bh("valid",{activity:"active",timestamp:K,source:"runtime"}),lifecycle:L,branch:d,issueId:a.issueId??null,pr:null,workspacePath:s,runtimeHandle:H,agentInfo:null,createdAt:K,lastActivityAt:K,metadata:{...D?{opencodeSessionId:D}:{},...a.prompt?{userPrompt:a.prompt}:{},...J?{displayName:J}:{}}};if(a6(k,q,{worktree:s,branch:d,status:aW(L),...aX(L),lifecycle:L,tmuxName:r,issue:a.issueId,issueTitle:c?.title,project:a.projectId,agent:h.agentName,createdAt:K.toISOString(),runtimeHandle:H,opencodeSessionId:D,userPrompt:a.prompt,displayName:J}),j.agent.postLaunchSetup&&await j.agent.postLaunchSetup(M),"opencode"===j.agent.name&&"reuse"===C&&!M.metadata.opencodeSessionId){let a=await ck(q,1e4);a&&(M.metadata.opencodeSessionId=a)}return Object.keys(M.metadata||{}).length>0&&a7(k,q,M.metadata),t(),l.dismiss(),bG({projectId:a.projectId,sessionId:q,source:"session-manager",kind:"session.spawned",summary:`spawned: ${q}`,data:{agent:j.agent.name,branch:M.branch??void 0}}),M}catch(a){throw await l.runAll(a=>{console.error("[session-manager] spawn rollback step failed:",a)}),a}}async function J(a){let c,d,f,h,i=b.projects[a.projectId];if(!i)throw Error(`Unknown project: ${a.projectId}`);let j=b2({role:"orchestrator",project:i,defaults:b.defaults,spawnAgentOverride:a.agent}),k=A(i,j.agentName);if(!k.runtime)throw Error(`Runtime plugin '${i.runtime??b.defaults.runtime}' not found`);if(!k.agent)throw Error(`Agent plugin '${j.agentName}' not found`);let l=o(a.projectId),m=bY(i.orchestratorSessionStrategy),q=function(a,c){let d=bX(a);if(!bc(c,d))throw Error(`Orchestrator session "${d}" already exists. Use ensureOrchestrator() to reuse or restore it.`);return{sessionId:d,tmuxName:b.configPath?d:void 0}}(i,l),r=q.sessionId,s=q.tmuxName,u=`orchestrator/${r}`;if(!k.workspace){try{ba(l,r)}catch{}throw Error(`spawnOrchestrator requires a workspace plugin but none is configured for project '${a.projectId}'`)}let v={projectId:a.projectId,project:i,sessionId:r,branch:u,worktreeDir:p(a.projectId)},w=!1;try{let a=await k.workspace.findManagedWorkspace?.(v);c=(a??await k.workspace.create(v)).path,w=null!=a}catch(a){try{ba(l,r)}catch{}throw a}let y=async a=>{if(!w)try{await k.workspace.destroy(c)}catch{}try{ba(l,r)}catch{}if(a)try{(0,e.unlinkSync)(a)}catch{}};try{k.agent.setupWorkspaceHooks&&await k.agent.setupWorkspaceHooks(c,{dataDir:l}),"claude-code"!==k.agent.name&&await ce(c)}catch(a){throw await y(),a}if(a.systemPrompt)try{let b=n(a.projectId);(0,e.mkdirSync)(b,{recursive:!0}),d=(0,g.join)(b,`orchestrator-prompt-${r}.md`),(0,e.writeFileSync)(d,a.systemPrompt,"utf-8")}catch(a){throw await y(d),a}if("opencode"===k.agent.name&&d)try{bU(c,d)}catch(a){throw await y(d),a}try{f="opencode"===k.agent.name&&"reuse"===m?await x({sessionsDir:l,criteria:{sessionId:r},strategy:"reuse"}):void 0,"opencode"===k.agent.name&&"delete"===m&&await x({sessionsDir:l,criteria:{sessionId:r},strategy:"delete",includeTitleDiscoveryForSessionId:!0})}catch(a){throw await y(d),a}let z={sessionId:r,projectConfig:{...i,agentConfig:{...j.agentConfig,permissions:"permissionless",...f?{opencodeSessionId:f}:{}}},workspacePath:c,permissions:"permissionless",model:j.model,systemPromptFile:d,subagent:j.subagent},B=k.agent.getLaunchCommand(z),C=k.agent.getEnvironment(z);k.agent.preLaunchSetup&&await k.agent.preLaunchSetup(c);try{h=await k.runtime.create({sessionId:s??r,workspacePath:c,launchCommand:B,environment:{...C,...i.env??{},PATH:b7(C.PATH??process.env.PATH),GH_PATH:b4,...process.env.AO_AGENT_GH_TRACE&&{AO_AGENT_GH_TRACE:process.env.AO_AGENT_GH_TRACE},AO_SESSION:r,AO_DATA_DIR:l,AO_SESSION_NAME:r,...s&&{AO_TMUX_NAME:s},AO_CALLER_TYPE:"orchestrator",AO_PROJECT_ID:a.projectId,AO_CONFIG_PATH:b.configPath,...void 0!==b.port&&null!==b.port&&{AO_PORT:String(b.port)}}})}catch(a){throw await y(d),a}let D=co({prompt:a.systemPrompt}),E=new Date,F=aT("orchestrator",E);F.session.state="working",F.session.reason="task_in_progress",F.session.startedAt=E.toISOString(),F.session.lastTransitionAt=E.toISOString(),F.runtime.handle=h,F.runtime.tmuxName=s??null;let G={id:r,projectId:a.projectId,status:aW(F),activity:"active",activitySignal:bh("valid",{activity:"active",timestamp:E,source:"runtime"}),lifecycle:F,branch:u,issueId:null,pr:null,workspacePath:c,runtimeHandle:h,agentInfo:null,createdAt:E,lastActivityAt:E,metadata:{...f?{opencodeSessionId:f}:{},...D?{displayName:D}:{}}};try{if(a6(l,r,{worktree:c,branch:u,status:aW(F),...aX(F),lifecycle:F,role:"orchestrator",tmuxName:s,project:a.projectId,agent:j.agentName,createdAt:E.toISOString(),runtimeHandle:h,opencodeSessionId:f,displayName:D}),k.agent.postLaunchSetup&&await k.agent.postLaunchSetup(G),"opencode"===k.agent.name&&"reuse"===m&&!G.metadata.opencodeSessionId){let a=await ck(r,1e4);a&&(G.metadata.opencodeSessionId=a)}Object.keys(G.metadata||{}).length>0&&a7(l,r,G.metadata),t()}catch(a){try{await k.runtime.destroy(h)}catch{}throw await y(d),a}return G}async function K(a){let b=Date.now()+2e4;for(;Date.now()<b;){let b=await O(a);if(b?.metadata.role==="orchestrator")return b;await cp(250)}return null}async function L(a){let c=b.projects[a.projectId];if(!c)throw Error(`Unknown project: ${a.projectId}`);let e=bX(c),f=await O(e);if(f){let b=bY(c.orchestratorSessionStrategy);if("delete"===b||"ignore"===b)return await P(e,{purgeOpenCode:"delete"===b}),ba(o(a.projectId),e),J(a);if("done"===f.lifecycle.session.state)throw new d.D8(e,`canonical orchestrator session is terminal with status "${f.status}". Remove or clean up this session before starting a new orchestrator.`);if((0,d.qX)(f))return T(e);if(!(0,d.zi)(f))return f;throw new d.D8(e,`canonical orchestrator session is terminal with status "${f.status}". Remove or clean up this session before starting a new orchestrator.`)}try{return await J(a)}catch(b){if(!(b instanceof Error&&b.message.includes(`Orchestrator session "${e}" already exists`)))throw b;let a=await K(e);if(a)return a;throw b}}async function M(a){let c,d=Object.entries(b.projects).flatMap(([b,c])=>a&&b!==a?[]:w(b,c).map(a=>({sessionName:a.sessionName,projectId:b,raw:a.raw}))).map(async({sessionName:a,projectId:d,raw:f})=>{let h,i,j=b.projects[d];if(!j)return null;let k=o(d);try{let b=(0,g.join)(k,`${a}.json`),c=(0,e.statSync)(b);h=c.birthtime,i=c.mtime}catch{}let l=ct(a,f,d,j.sessionPrefix,h,i),n=B(j,a,f).agentName,p=A(j,n),q="opencode"===n?c??=ci():void 0,r=null,s=new Promise(a=>{r=setTimeout(a,12e3)}),t=F(l,a,k,j,n,p,q).catch(()=>{});try{await Promise.race([t,s])}finally{r&&clearTimeout(r)}if(l.lifecycle&&("missing"===l.lifecycle.runtime.state||"exited"===l.lifecycle.runtime.state)&&"terminated"!==l.lifecycle.session.state&&"done"!==l.lifecycle.session.state)try{let b=m(a,f,a=>{a.session.state="terminated",a.session.reason="runtime_lost",a.session.terminatedAt=new Date().toISOString(),a.session.lastTransitionAt=a.session.terminatedAt,a.runtime.state=l.lifecycle.runtime.state,a.runtime.reason=l.lifecycle.runtime.reason,a.runtime.lastObservedAt=new Date().toISOString()});a7(k,a,aX(b)),l.lifecycle=b,l.status=aW(b)}catch{}return l});return(await Promise.all(d)).filter(a=>null!==a)}async function N(a){if(r&&Date.now()<r.expiresAt)return a?r.sessions.filter(b=>b.projectId===a):r.sessions;let b=await M();return r={sessions:b,expiresAt:Date.now()+35e3},a?b.filter(b=>b.projectId===a):b}async function O(a){for(let[c,d]of Object.entries(b.projects)){let b,f,h=o(c),i=a4(h,a);if(!i)continue;try{let c=(0,g.join)(h,`${a}.json`),d=(0,e.statSync)(c);b=d.birthtime,f=d.mtime}catch{}let j=u(h,{sessionName:a,raw:i,modifiedAt:f},d.sessionPrefix),k=ct(a,j.raw,c,d.sessionPrefix,b,f),l=B(d,a,j.raw).agentName,m=A(d,l);return await F(k,a,h,d,l,m),k}return null}async function P(a,e){let f=D(a);if(!f){for(let[c]of Object.entries(b.projects)){let b=a4(o(c),a);if(b){let a=cs(b);if(a?.session.state==="terminated")return{cleaned:!1,alreadyTerminated:!0}}}throw new d.Ag(a)}let{raw:g,sessionsDir:h,project:j,projectId:k}=f,l=aV(g);if(l?.session.state==="terminated")return{cleaned:!1,alreadyTerminated:!0};let n=e?.reason??"manually_killed",p=B(j,a,g).agentName;if(g.runtimeHandle){let a=aN(g.runtimeHandle);if(a){let d=c.get("runtime",a.runtimeName??(j?j.runtime??b.defaults.runtime:b.defaults.runtime));if(d)try{await d.destroy(a)}catch{}}}let q=g.worktree;if(q&&i(j,k,q)){let a=j?A(j).workspace:c.get("workspace",b.defaults.workspace);if(a)try{await a.destroy(q)}catch{}}let r=!1;if(e?.purgeOpenCode===!0&&"opencode"===p){let b=bK(g.opencodeSessionId)??await ck(a,1e4);if(b)try{await ch(b),r=!0}catch{}}let s="pr_merged"===n?"pr_merged_cleanup":"auto_cleanup"===n?"auto_cleanup":"manual_kill_requested",u=m(a,g,a=>{a.session.state="terminated",a.session.reason=n,a.session.terminatedAt=new Date().toISOString(),a.session.lastTransitionAt=a.session.terminatedAt,a.runtime.state=g.runtimeHandle||g.tmuxName?"missing":"exited",a.runtime.reason=s,a.runtime.lastObservedAt=new Date().toISOString()});return a7(h,a,{...aX(u),...r&&{opencodeSessionId:"",opencodeCleanedAt:new Date().toISOString()}}),t(),bG({projectId:k,sessionId:a,source:"session-manager",kind:"session.killed",summary:`killed: ${a}`,data:{reason:n}}),{cleaned:!0,alreadyTerminated:!1}}async function Q(a,c){let e={killed:[],skipped:[],errors:[]},f=await M(a),g=new Set,h=new Set,i=(a,b)=>`${a}:${b}`,j=a=>{let b=a.indexOf(":");return -1===b?{projectId:"",id:a}:{projectId:a.slice(0,b),id:a.slice(b+1)}},l=(a,b)=>{let c=i(a,b);h.delete(c),g.add(c)},m=(a,b)=>{let c=i(a,b);g.has(c)||h.add(c)},n=c?.purgeOpenCode!==!1;for(let a of f)try{let e=b.projects[a.projectId];if(!e||k(e,a.id,a.metadata)){m(a.projectId,a.id);continue}let f=A(e),g=!1;if(a.pr&&f.scm)try{await f.scm.getPRState(a.pr)===d.bz.CLOSED&&(g=!0)}catch{}if(!g&&a.issueId&&f.tracker)try{await f.tracker.isCompleted(a.issueId,e)&&(g=!0)}catch{}if(!g&&a.runtimeHandle&&f.runtime)try{await f.runtime.isAlive(a.runtimeHandle)||(g=!0)}catch{}g?(c?.dryRun||await P(a.id,{purgeOpenCode:n}),l(a.projectId,a.id)):m(a.projectId,a.id)}catch(b){e.errors.push({sessionId:a.id,error:b instanceof Error?b.message:String(b)})}for(let[d,f]of Object.entries(b.projects)){if(a&&d!==a)continue;let b=o(d);for(let a of bb(b)){let h=i(d,a);if(g.has(h))continue;let j=a4(b,a);if(!j)continue;let o=cs(j);if(o?.session.state!=="terminated")continue;if(k(f,a,j)){m(d,a);continue}let p=B(f,a,j).agentName,q=bK(j.opencodeSessionId);if("opencode"===p&&j.opencodeCleanedAt){m(d,a);continue}if("opencode"===p&&q&&n){if(!c?.dryRun)try{await ch(q),a9(b,a,a=>({...a,opencodeSessionId:"",opencodeCleanedAt:new Date().toISOString()}))}catch(b){e.errors.push({sessionId:a,error:`Failed to delete OpenCode session ${q}: ${b instanceof Error?b.message:String(b)}`});continue}l(d,a)}else m(d,a)}}let p=[...g,...h],q=new Map;for(let a of p){let{id:b}=j(a);q.set(b,(q.get(b)??0)+1)}let r=a=>{let{projectId:b,id:c}=j(a);return(q.get(c)??0)>1?`${b}:${c}`:c};return e.killed=[...g].map(r),e.skipped=[...h].map(r),e}async function R(a,e){let{raw:f,sessionsDir:g,project:h}=E(a),i=B(h,a,f).agentName;if("opencode"===i&&!bK(f.opencodeSessionId)){let b=await ck(a,1e4);b&&(f.opencodeSessionId=b,a7(g,a,{opencodeSessionId:b}),t())}let j=f.runtimeHandle?aN(f.runtimeHandle):null,k=j?.runtimeName??h.runtime??b.defaults.runtime,l=c.get("runtime",k);if(!l)throw Error(`No runtime plugin for session ${a}`);let m=c.get("agent",i);if(!m)throw Error(`No agent plugin for session ${a}`);let n=async a=>{try{return await l.getOutput(a,20)??""}catch{return""}},o=a=>{if(!a)return null;try{return m.detectActivity(a)}catch{return null}},p=a=>a.includes("Press up to edit queued messages"),q=async()=>{let a=bK(f.opencodeSessionId);if("opencode"!==i||!a)return;let b=await ci(1e4);return b.find(b=>b.id===a)?.updatedAt},r=async(a,b)=>{let c=a.runtimeHandle;if(!c)return;let d=Date.now()+b,e=null,f=0;for(;;){let[a,b,g,h]=await Promise.all([l.isAlive(c).catch(()=>!0),cq(m,c),n(c),"tmux"===c.runtimeName?cr(c.id):Promise.resolve(m.processName)]),i=g.trim().length>0,j=null===h||h===m.processName,k=i?g.trimEnd():null,o=null!==k&&k===e;if(a&&b&&j&&(p(g)||o)){if((f+=1)>=2)return}else f=0;if(e=k,Date.now()>=d)return;await cp(500)}},s=async a=>{let b=a.runtimeHandle;if(!b)return!1;let c=Date.now()+5e3;for(;;){let[a,d,e,f]=await Promise.all([l.isAlive(b).catch(()=>!0),cq(m,b),n(b),"tmux"===b.runtimeName?cr(b.id):Promise.resolve(m.processName)]),g=null===f||f===m.processName;if(a&&g&&(d||e.trim().length>0))return!0;if(Date.now()>=c)return!1;await cp(500)}},u=async(b,c)=>{if("done"===c.lifecycle.session.state)throw Error(`Cannot send to session ${a}: ${b}`);try{let b=await T(a);if(!await s(b))throw Error("restored session did not become ready for delivery");return b}catch(d){let c=d instanceof Error?d.message:String(d);throw Error(`Cannot send to session ${a}: ${b} (${c})`,{cause:d})}},v=async(b=!1)=>{let c=await O(a);if(!c)throw new d.Ag(a);let e=c.runtimeHandle??{id:a,runtimeName:k,data:{}},f=c.runtimeHandle?c:{...c,runtimeHandle:e};if(b||(0,d.qX)(f))return u(b?"session needed to be restarted before delivery":"session is not running",f);let[g,h]=await Promise.all([l.isAlive(e).catch(()=>!0),cq(m,e)]);return("spawning"===f.status&&g&&(await r(f,2e4),[g,h]=await Promise.all([l.isAlive(e).catch(()=>!0),cq(m,e)])),g&&h)?f:u(g?"agent process is not running":"runtime is not alive",f)},w=async b=>{let c=b.runtimeHandle;if(!c)throw Error(`Session ${a} has no runtime handle`);let d=await n(c),f=o(d)??b.activity,g=await q();await l.sendMessage(c,e);for(let a=1;a<=6;a++){await cp(500);let a=await n(c),e=o(a)??b.activity,h=await q();if(void 0!==g&&void 0!==h&&h>g||p(a)||a.length>0&&a!==d||"active"!==f&&"active"===e||"waiting_input"!==f&&"waiting_input"===e)break}},x=await v();try{await w(x)}catch(a){if(!(void 0===x.restoredAt&&(0,d.qX)(x))){if(a instanceof Error)throw a;throw Error(String(a),{cause:a})}x=await v(!0);try{await w(x)}catch(a){if(a instanceof Error)throw a;throw Error(String(a),{cause:a})}}}async function S(a,b,c){let e,f=b.trim();if(!f)throw Error("PR reference is required");let{raw:g,sessionsDir:h,project:i,projectId:k}=E(a);if(j(a,g,i.sessionPrefix))throw Error(`Session ${a} is an orchestrator session and cannot claim PRs`);let l=A(i,B(i,a,g).agentName).scm;if(!l?.resolvePR||!l.checkoutPR)throw Error(`SCM plugin ${i.scm?.plugin?`"${i.scm.plugin}" `:""}does not support claiming existing PRs`);let n=await l.resolvePR(f,i),o=await l.getPRState(n);if(o!==d.bz.OPEN)throw Error(`Cannot claim PR #${n.number} because it is ${o}`);let p=new Set;for(let{sessionName:b,raw:c}of w(k,i).filter(b=>b.sessionName!==a)){if(!c||j(b,c,i.sessionPrefix))continue;let a=c.pr===n.url,d=c.branch===n.branch&&(c.prAutoDetect??"on")!=="off"&&"false"!==c.prAutoDetect;(a||d)&&p.add(b)}let q=[...p],r=g.worktree;if(!r)throw Error(`Session ${a} has no workspace to check out PR #${n.number}`);let s=await l.checkoutPR(n,r),u=m(a,g,a=>{a.pr.state="open",a.pr.reason="in_progress",a.pr.number=n.number,a.pr.url=n.url,a.pr.lastObservedAt=new Date().toISOString()});for(let b of(a7(h,a,{pr:n.url,status:aW(u),branch:n.branch,prAutoDetect:"",...aX(u)}),t(),q)){let a=a4(h,b);if(!a)continue;let c=m(b,a,b=>{b.pr.state="none",b.pr.reason="not_created",b.pr.number=null,b.pr.url=null,b.pr.lastObservedAt=null,cm.has(a.status??"")&&(b.session.state="working",b.session.reason="task_in_progress")});a7(h,b,{pr:"",prAutoDetect:"false",...cm.has(a.status??"")?{status:"working"}:{},...aX(c)}),t()}let v=!1;if(c?.assignOnGithub)if(l.assignPRToCurrentUser)try{await l.assignPRToCurrentUser(n),v=!0}catch(a){e=a instanceof Error?a.message:String(a)}else e=`SCM plugin "${l.name}" does not support assigning PRs`;return{sessionId:a,projectId:k,pr:n,branchChanged:s,githubAssigned:v,githubAssignmentError:e,takenOverFrom:q}}async function T(a){let c,f,h=D(a);if(!h)throw new d.Ag(a);let i=h.raw,j=h.sessionsDir,k=h.project,l=h.projectId,m=B(k,a,i);if("opencode"===m.agentName&&!bK(i.opencodeSessionId)){let b=await ck(a,1e4);if(!b)throw new d.D8(a,"OpenCode session mapping is missing");i={...i,opencodeSessionId:b},a7(j,a,{opencodeSessionId:b})}let o=ct(a,i,l,k.sessionPrefix),q=A(k,m.agentName);if(await H(o,q,!0,j),!(0,d.qX)(o)){let b=d.N_.has(o.status)?`status "${o.status}" is not restorable`:`session is not in a terminal state (status: "${o.status}", activity: "${o.activity}")`;throw new d.D8(a,b)}if(!q.runtime)throw Error(`Runtime plugin '${k.runtime??b.defaults.runtime}' not found`);if(!q.agent)throw Error(`Agent plugin '${m.agentName}' not found`);let r=i.worktree||k.path;if(!(q.workspace?.exists?await q.workspace.exists(r):(0,e.existsSync)(r))){if(!q.workspace?.restore)throw new d.CK(r,"workspace plugin does not support restore");if(!o.branch)throw new d.CK(r,"branch metadata is missing");try{let b=await q.workspace.restore({projectId:l,project:k,sessionId:a,branch:o.branch,worktreeDir:p(l)},r);q.workspace.postCreate&&await q.workspace.postCreate(b,k)}catch(a){throw new d.CK(r,`restore failed: ${a instanceof Error?a.message:String(a)}`)}}if("opencode"===q.agent.name&&"orchestrator"===m.role){let b=n(l),c=(0,g.join)(b,`orchestrator-prompt-${a}.md`);if((0,e.existsSync)(c))try{bU(r,c)}catch(a){throw Error(`failed to restore OpenCode orchestrator AGENTS.md: ${a instanceof Error?a.message:String(a)}`,{cause:a})}}if("opencode"===q.agent.name&&"orchestrator"!==m.role){let b=n(l),d=(0,g.join)(b,`worker-prompt-${a}.md`);(0,e.existsSync)(d)&&(c=bV(b,a,[d]))}if(o.runtimeHandle)try{await q.runtime.destroy(o.runtimeHandle)}catch{}let s={...k,agentConfig:{...m.agentConfig,..."orchestrator"===m.role?{permissions:"permissionless"}:{},...o.metadata?.opencodeSessionId?{opencodeSessionId:o.metadata.opencodeSessionId}:{}}},u=(()=>{if("orchestrator"!==m.role)return;let b=n(l),c=(0,g.join)(b,`orchestrator-prompt-${a}.md`);return(0,e.existsSync)(c)?c:void 0})(),v={sessionId:a,projectConfig:s,workspacePath:r,issueId:o.issueId??void 0,permissions:"orchestrator"===m.role?"permissionless":m.permissions,model:m.model,subagent:m.subagent,...u&&{systemPromptFile:u}};if(q.agent.getRestoreCommand){let b=await q.agent.getRestoreCommand(o,s);if(b)f=b,a7(j,a,{restoreFallbackReason:""});else{var w;let b=`${q.agent.name}.getRestoreCommand returned null`;if(a7(j,a,{restoreFallbackReason:b}),"claude-code"===(w=q.agent.name)||"codex"===w||"opencode"===w)throw new d.D8(a,b);f=q.agent.getLaunchCommand(v)}}else f=q.agent.getLaunchCommand(v),a7(j,a,{restoreFallbackReason:""});let x=q.agent.getEnvironment(v);q.agent.preLaunchSetup&&await q.agent.preLaunchSetup(r);let y=i.tmuxName,z=await q.runtime.create({sessionId:y??a,workspacePath:r,launchCommand:f,environment:{...x,...c?{OPENCODE_CONFIG:c}:{},...k.env??{},PATH:b7(x.PATH??process.env.PATH),GH_PATH:b4,...process.env.AO_AGENT_GH_TRACE&&{AO_AGENT_GH_TRACE:process.env.AO_AGENT_GH_TRACE},AO_SESSION:a,AO_DATA_DIR:j,AO_SESSION_NAME:a,...y&&{AO_TMUX_NAME:y},AO_CALLER_TYPE:"agent",...l&&{AO_PROJECT_ID:l},AO_CONFIG_PATH:b.configPath,...void 0!==b.port&&null!==b.port&&{AO_PORT:String(b.port)}}}),C=new Date().toISOString(),E=aY(o.lifecycle);E.session.state="working",E.session.reason="task_in_progress",E.session.lastTransitionAt=C,E.session.terminatedAt=null,E.session.completedAt=null,E.runtime.state="alive",E.runtime.reason="process_running",E.runtime.handle=z,E.runtime.lastObservedAt=C,("merged"===E.pr.state||"closed"===E.pr.state)&&(E.pr.state="none",E.pr.reason="cleared_on_restore",E.pr.number=null,E.pr.url=null,E.pr.lastObservedAt=null),a7(j,a,{...aX(E),restoredAt:C,mergedPendingCleanupSince:""}),t();let F=aW(E),G={...o,status:F,activity:"active",workspacePath:r,runtimeHandle:z,restoredAt:new Date(C)};if(q.agent.postLaunchSetup)try{let b={...G.metadata??{}};await q.agent.postLaunchSetup(G);let c=G.metadata??{},d=Object.fromEntries(Object.entries(c).filter(([a,c])=>b[a]!==c));Object.keys(d).length>0&&(a7(j,a,d),t())}catch{}return G}return{spawn:async function(a){bG({projectId:a.projectId,source:"session-manager",kind:"session.spawn_started",summary:"spawn started",data:{agent:a.agent??void 0}});try{return await I(a)}catch(b){throw bG({projectId:a.projectId,source:"session-manager",kind:"session.spawn_failed",level:"error",summary:"spawn failed",data:{reason:b instanceof Error?b.message:String(b)}}),b}},spawnOrchestrator:J,ensureOrchestrator:async function(a){let c=b.projects[a.projectId];if(!c)throw Error(`Unknown project: ${a.projectId}`);let d=bX(c),e=s.get(d);if(e)return e;let f=L(a).finally(()=>{s.delete(d)});return s.set(d,f),f},restore:T,list:M,listCached:N,invalidateCache:t,get:O,kill:P,cleanup:Q,send:R,claimPR:S,remap:async function(a,b=!1){let{raw:c,sessionsDir:d,project:e}=E(a);if("opencode"!==B(e,a,c).agentName)throw Error(`Session ${a} is not using the opencode agent`);let f=bK(c.opencodeSessionId),g=b?await ck(a,1e4):f??await ck(a,1e4);if(!g)throw Error(`OpenCode session mapping is missing for ${a}`);return a7(d,a,{opencodeSessionId:g}),g}}}let cv=new Map;function cw(a,b){let c=cv.get(a);return c||(c=b(),cv.set(a,c)),c}let cx={debug:10,info:20,warn:30,error:40};function cy(){return new Date().toISOString()}function cz(a){return a.replace(/[^a-zA-Z0-9_-]+/g,"-").replace(/^-+|-+$/g,"")||"component"}function cA(a){return cx[a]>=cx[function(){let a=process.env.AO_LOG_LEVEL?.trim().toLowerCase();return"debug"===a||"info"===a||"warn"===a||"error"===a?a:"warn"}()]}function cB(a,b){(function(){let a=process.env.AO_OBSERVABILITY_STDERR?.trim().toLowerCase();return"1"===a||"true"===a||"yes"===a||"on"===a})()&&cA(b)&&process.stderr.write(`${JSON.stringify({...a,level:b})}
|
|
881
|
+
`)}function cC(a){let b=(0,g.join)(function(a){let b=function(a){let b;try{b=(0,e.realpathSync)(a)}catch{b=(0,g.resolve)(a)}let c=(0,g.dirname)(b);return(0,f.createHash)("sha256").update(c).digest("hex").slice(0,12)}(a);return(0,g.join)(q("~/.agent-orchestrator"),`${b}-observability`)}(a.configPath),"processes");return(0,e.mkdirSync)(b,{recursive:!0}),b}function cD(a,b){return(0,g.join)(cC(a),`${cz(b)}-${process.pid}.json`)}function cE(a){let b=a.replace(/\s+/g," ").trim();return b.length>256?`${b.slice(0,256)}…`:b}function cF(a){if(a)return function a(b,c=0){return null==b?b:"string"==typeof b?cE(b):"number"==typeof b||"boolean"==typeof b?b:c>=4?"[truncated]":Array.isArray(b)?b.slice(0,25).map(b=>a(b,c+1)):"object"==typeof b?Object.fromEntries(Object.entries(b).slice(0,25).map(([b,d])=>[b,/token|secret|password|cookie|authorization|api[-_]?key|prompt|message|note/i.test(b)?"[redacted]":a(d,c+1)])):String(b)}(a)}function cG(a){if(a)return cE(a)}function cH(a){if(a)return cE(a)}function cI(a,b,c){let d=`${a}.1`;(0,e.existsSync)(a)&&(0,e.statSync)(a).size>=c&&((0,e.existsSync)(d)&&(0,e.unlinkSync)(d),(0,e.renameSync)(a,d)),(0,e.appendFileSync)(a,`${JSON.stringify(b)}
|
|
882
|
+
`,"utf-8")}function cJ(a,b){return b.localeCompare(a)}function cK(a){switch(a){case"error":return 3;case"warn":return 2;default:return 1}}function cL(a="ao"){return`${a}-${(0,f.randomUUID)()}`}function cM(a,b){let c=cz(b);function d(b,d){try{var f,h;let i=cD(a,c),j=function(a,b){if(!(0,e.existsSync)(a))return{version:1,component:b,pid:process.pid,updatedAt:cy(),metrics:{},traces:[],sessions:{},health:{}};try{let c=JSON.parse((0,e.readFileSync)(a,"utf-8"));return{version:1,component:b,pid:process.pid,updatedAt:"string"==typeof c.updatedAt?c.updatedAt:cy(),metrics:c.metrics&&"object"==typeof c.metrics?c.metrics:{},traces:Array.isArray(c.traces)?c.traces:[],sessions:c.sessions&&"object"==typeof c.sessions?c.sessions:{},health:c.health&&"object"==typeof c.health?c.health:{}}}catch{return{version:1,component:b,pid:process.pid,updatedAt:cy(),metrics:{},traces:[],sessions:{},health:{}}}}(i,c);b(j);let k=cD(a,j.component);j.updatedAt=cy();let l=`${k}.tmp.${process.pid}.${Date.now()}`;(0,e.writeFileSync)(l,`${JSON.stringify(j,null,2)}
|
|
883
|
+
`,"utf-8"),(0,e.renameSync)(l,k),d&&cA(d.level)&&(f=d.payload,h=d.level,cI((0,g.join)(cC(a),`${cz(c)}-${process.pid}.ndjson`),{...f,level:h},5242880),cB(d.payload,d.level))}catch(d){let b={source:"ao-observability",timestamp:cy(),component:c,outcome:"failure",operation:"observability.write",reason:d instanceof Error?d.message:String(d)};try{let c=(0,g.join)(cC(a),"observability-errors.ndjson");cI(c,b,524288)}catch{}cB(b,"error")}}return{component:c,recordOperation(a){let b=cy(),e=a.operation??a.metric,g=a.level??("failure"===a.outcome?"error":"info"),h={id:(0,f.randomUUID)(),timestamp:b,component:c,operation:e,outcome:a.outcome,correlationId:a.correlationId,projectId:a.projectId,sessionId:a.sessionId,path:cH(a.path),reason:cG(a.reason),durationMs:a.durationMs,data:cF(a.data)};d(c=>{var d,f;let g=(d=a.metric,f=a.projectId,`${f??"unknown"}::${d}`),i=c.metrics[g]??{total:0,success:0,failure:0};if(i.total+=1,i.lastAt=b,"success"===a.outcome?(i.success+=1,i.lastSuccessAt=b):(i.failure+=1,i.lastFailureAt=b,i.lastFailureReason=cG(a.reason)),c.metrics[g]=i,c.traces=[h,...c.traces].sort((a,b)=>cJ(a.timestamp,b.timestamp)).slice(0,80),a.sessionId){c.sessions[a.sessionId]={sessionId:a.sessionId,projectId:a.projectId,correlationId:a.correlationId,operation:e,outcome:a.outcome,updatedAt:b,reason:cG(a.reason)};let d=Object.entries(c.sessions).sort(([,a],[,b])=>cJ(a.updatedAt,b.updatedAt));c.sessions=Object.fromEntries(d.slice(0,200))}},{level:g,payload:{source:"ao-observability",timestamp:b,component:c,metric:a.metric,operation:e,outcome:a.outcome,correlationId:a.correlationId,projectId:a.projectId,sessionId:a.sessionId,reason:cG(a.reason),durationMs:a.durationMs,path:cH(a.path),data:cF(a.data)}})},recordDiagnostic(a){let b=cy(),e=a.level??"info",g={id:(0,f.randomUUID)(),timestamp:b,component:c,operation:a.operation,outcome:"success",correlationId:a.correlationId,projectId:a.projectId,sessionId:a.sessionId,path:cH(a.path),data:{message:cE(a.message),...cF(a.data)}};d(c=>{if(c.traces=[g,...c.traces].sort((a,b)=>cJ(a.timestamp,b.timestamp)).slice(0,80),a.sessionId){c.sessions[a.sessionId]={sessionId:a.sessionId,projectId:a.projectId,correlationId:a.correlationId,operation:a.operation,outcome:"success",updatedAt:b};let d=Object.entries(c.sessions).sort(([,a],[,b])=>cJ(a.updatedAt,b.updatedAt));c.sessions=Object.fromEntries(d.slice(0,200))}},{level:e,payload:{source:"ao-observability",timestamp:b,component:c,operation:a.operation,correlationId:a.correlationId,projectId:a.projectId,sessionId:a.sessionId,path:cH(a.path),data:{message:cE(a.message),...cF(a.data)}}})},setHealth(a){let b=cy();d(d=>{d.health[a.surface]={surface:a.surface,status:a.status,updatedAt:b,component:c,projectId:a.projectId,correlationId:a.correlationId,reason:cG(a.reason),details:cF(a.details)}},{level:"error"===a.status?"error":"warn"===a.status?"warn":"info",payload:{source:"ao-observability",timestamp:b,component:c,surface:a.surface,status:a.status,projectId:a.projectId,correlationId:a.correlationId,reason:cG(a.reason),details:cF(a.details)}})}}}function cN(a){let b=cC(a),c={};for(let a of(0,e.readdirSync)(b)){let d;if(!a.endsWith(".json"))continue;let f=(0,g.join)(b,a);try{d=JSON.parse((0,e.readFileSync)(f,"utf-8"))}catch{continue}if(d&&"object"==typeof d){for(let[a,b]of Object.entries(d.metrics??{})){let{projectId:e,metric:f}=function(a){let b=a.indexOf("::");if(-1===b)return{metric:a};let c=a.slice(0,b);return{projectId:"unknown"===c?void 0:c,metric:a.slice(b+2)}}(a);if(!e)continue;let g=c[e]??(c[e]={projectId:e,updatedAt:d.updatedAt,metrics:{},health:{},recentTraces:[],sessions:{}});g.metrics[f]=function(a,b){let c={total:(a?.total??0)+(b.total??0),success:(a?.success??0)+(b.success??0),failure:(a?.failure??0)+(b.failure??0),lastAt:a?.lastAt,lastSuccessAt:a?.lastSuccessAt,lastFailureAt:a?.lastFailureAt,lastFailureReason:a?.lastFailureReason};return b.lastAt&&(!c.lastAt||b.lastAt>c.lastAt)&&(c.lastAt=b.lastAt),b.lastSuccessAt&&(!c.lastSuccessAt||b.lastSuccessAt>c.lastSuccessAt)&&(c.lastSuccessAt=b.lastSuccessAt),b.lastFailureAt&&(!c.lastFailureAt||b.lastFailureAt>c.lastFailureAt)&&(c.lastFailureAt=b.lastFailureAt,c.lastFailureReason=b.lastFailureReason),c}(g.metrics[f],b),d.updatedAt>g.updatedAt&&(g.updatedAt=d.updatedAt)}for(let a of d.traces??[]){if(!a.projectId)continue;let b=c[a.projectId]??(c[a.projectId]={projectId:a.projectId,updatedAt:a.timestamp,metrics:{},health:{},recentTraces:[],sessions:{}});b.recentTraces.push(a),a.timestamp>b.updatedAt&&(b.updatedAt=a.timestamp)}for(let a of Object.values(d.health??{})){let b=a.projectId;if(!b)continue;let d=c[b]??(c[b]={projectId:b,updatedAt:a.updatedAt,metrics:{},health:{},recentTraces:[],sessions:{}}),e=d.health[a.surface];(!e||a.updatedAt>=e.updatedAt)&&(d.health[a.surface]=a),a.updatedAt>d.updatedAt&&(d.updatedAt=a.updatedAt)}for(let a of Object.values(d.sessions??{})){if(!a.projectId)continue;let b=c[a.projectId]??(c[a.projectId]={projectId:a.projectId,updatedAt:a.updatedAt,metrics:{},health:{},recentTraces:[],sessions:{}}),d=b.sessions[a.sessionId];(!d||a.updatedAt>=d.updatedAt)&&(b.sessions[a.sessionId]=a),a.updatedAt>b.updatedAt&&(b.updatedAt=a.updatedAt)}}}let d="ok";for(let a of Object.values(c))for(let b of(a.recentTraces=a.recentTraces.sort((a,b)=>cJ(a.timestamp,b.timestamp)).slice(0,80),Object.values(a.health)))cK(b.status)>cK(d)&&(d=b.status);return{generatedAt:cy(),overallStatus:d,projects:c}}function cO(a){let b=a.match(/^(\d+)(s|m|h)$/);if(!b)return 0;let c=parseInt(b[1],10);switch(b[2]){case"s":return 1e3*c;case"m":return 6e4*c;case"h":return 36e5*c;default:return 0}}let cP=new Set(["ci-failed"]),cQ=["rebase-merge","rebase-apply","CHERRY_PICK_HEAD","BISECT_LOG"];async function cR(a){try{return await (0,bl.stat)(a),!0}catch(a){if("object"==typeof a&&null!==a&&"code"in a&&"ENOENT"===a.code)return!1;throw a}}async function cS(a){return(await Promise.all(cQ.map(b=>cR((0,g.join)(a,b))))).some(Boolean)}async function cT(a){let b=(0,g.join)(a,".git");if((await (0,bl.stat)(b)).isDirectory())return b;let c=(await (0,bl.readFile)(b,"utf8")).trim().match(/^gitdir:\s*(.+)$/i);if(!c)throw Error(`Invalid .git pointer in workspace: ${a}`);return(0,g.resolve)((0,g.dirname)(b),c[1].trim())}async function cU(a){let b;try{b=await cT(a)}catch{return{kind:"unavailable"}}try{let a=(await (0,bl.readFile)((0,g.join)(b,"HEAD"),"utf8")).trim(),c="ref: refs/heads/";if(!a.startsWith(c))return await cS(b)?{kind:"unavailable"}:{kind:"detached"};let d=a.slice(c.length).trim();if(d.length>0)return{kind:"branch",branch:d};return await cS(b)?{kind:"unavailable"}:{kind:"detached"}}catch{return{kind:"unavailable"}}}function cV(a){return a.includes("stuck")||a.includes("needs_input")||a.includes("errored")?"urgent":a.startsWith("summary.")?"info":a.includes("approved")||a.includes("ready")||a.includes("merged")||a.includes("completed")?"action":a.includes("fail")||a.includes("changes_requested")||a.includes("conflicts")?"warning":"info"}function cW(a,b){return{id:(0,f.randomUUID)(),type:a,priority:b.priority??cV(a),sessionId:b.sessionId,projectId:b.projectId,timestamp:new Date,message:b.message,data:b.data??{}}}function cX(a,b){switch(b){case"working":return"session.working";case"pr_open":return"pr.created";case"ci_failed":return"ci.failing";case"review_pending":return"review.pending";case"changes_requested":return"review.changes_requested";case"approved":return"review.approved";case"mergeable":return"merge.ready";case"merged":return"merge.completed";case"needs_input":return"session.needs_input";case"stuck":return"session.stuck";case"errored":return"session.errored";case"killed":return"session.killed";default:return null}}function cY(a,b){let c=null;if(a.pr){let d=`${a.pr.owner}/${a.pr.repo}#${a.pr.number}`,e=b.get(d);c={url:a.pr.url,title:e?.title??null,number:a.pr.number,branch:a.pr.branch}}return{pr:c,issueId:a.issueId,issueTitle:a.metadata.issueTitle??null,summary:a.agentInfo?.summary??null,branch:a.branch}}function cZ(a){switch(a){case"pr.closed":return"pr-closed";case"ci.failing":return"ci-failed";case"review.changes_requested":return"changes-requested";case"automated_review.found":return"bugbot-comments";case"merge.conflicts":return"merge-conflicts";case"merge.ready":return"approved-and-green";case"session.stuck":return"agent-stuck";case"session.needs_input":return"agent-needs-input";case"session.killed":return"agent-exited";case"summary.all_complete":return"all-complete";default:return null}}function c$(a){let b=cX(void 0,a);if(!b)return"info";let c=cV(b);return"urgent"===c?"error":"warning"===c?"warn":"info"}function c_(a){return(0,d.xn)(a)?{state:"unknown",failed:!1,indeterminate:!0}:{state:a?"alive":"dead",failed:!1}}function c0(a){return"detecting"===a.session.state?a.session.reason:"not_created"!==a.pr.reason&&"in_progress"!==a.pr.reason?a.pr.reason:"process_running"!==a.runtime.reason?a.runtime.reason:a.session.reason}function c1(a,b,c,d,e,f,g,h){return{oldStatus:c,newStatus:d,statusTransition:g,previousSessionState:a.session.state,newSessionState:b.session.state,previousSessionReason:a.session.reason,newSessionReason:b.session.reason,previousPRState:a.pr.state,newPRState:b.pr.state,previousPRReason:a.pr.reason,newPRReason:b.pr.reason,previousRuntimeState:a.runtime.state,newRuntimeState:b.runtime.state,previousRuntimeReason:a.runtime.reason,newRuntimeReason:b.runtime.reason,primaryReason:c0(b),evidence:e,signalsConsulted:e.split(/\s+/).map(a=>a.trim()).filter(a=>a.length>0),detectingAttempts:f,recoveryAction:h?.result?.action??null,reactionKey:h?.key??null,reactionSuccess:h?.result?.success??null,escalated:h?.result?.escalated??null}}function c2(a){let{config:b,registry:c,sessionManager:e,projectId:f}=a,g=cM(b,"lifecycle-manager"),h=new Map,i=new Map,j=new Map,k=null,l=!1,m=!1,n=new Map,p=new Map,q=new Set,r=new Map;async function s(a){p.clear(),q=new Set;let d=new Map,e=new Map,h=new Set;for(let c of a){let a=b.projects[c.projectId];if(!a?.scm?.plugin||!a.repo)continue;let f=a.scm.plugin;if(d.has(f)||d.set(f,[]),e.has(f)||e.set(f,new Set),e.get(f).add(a.repo),!c.pr)continue;let g=`${c.pr.owner}/${c.pr.repo}#${c.pr.number}`;if(h.has(g))continue;h.add(g);let i=d.get(f);i&&i.push(c.pr)}for(let[a,b]of d){let d=c.get("scm",a);if(!d?.enrichSessionsPRBatch)continue;let h=[...e.get(a)??[]],i=Date.now();try{for(let[c,e]of(await d.enrichSessionsPRBatch(b,{recordSuccess(c){let d=Date.now()-i;g?.recordOperation({metric:"graphql_batch",operation:"batch_enrichment",correlationId:cL("graphql-batch"),outcome:"success",projectId:f,durationMs:d,data:{plugin:a,prCount:b.length,prKeys:b.map(a=>`${a.owner}/${a.repo}#${a.number}`)},level:"info"})},recordFailure(c){let d=Date.now()-i;g?.recordOperation({metric:"graphql_batch",operation:"batch_enrichment",correlationId:cL("graphql-batch"),outcome:"failure",reason:c.error,level:"warn",data:{plugin:a,prCount:b.length,error:c.error,durationMs:d}})},log(b,c){g?.recordDiagnostic?.({operation:"batch_enrichment.log",correlationId:cL("graphql-batch"),projectId:f,message:c,level:b,data:{plugin:a,source:"ao-graphql-batch"}})},reportPRListUnchangedRepos(a){for(let b of a)q.add(b)}},h)))p.set(c,e)}catch(e){let c=e instanceof Error?e.message:String(e),d=cL("batch-enrichment");g?.recordOperation?.({metric:"lifecycle_poll",operation:"batch_enrichment",correlationId:d,outcome:"failure",reason:c,level:"warn",data:{plugin:a,prCount:b.length}}),bG({projectId:f,source:"scm",kind:"scm.batch_enrich_failed",level:"warn",summary:`batch_enrich failed for ${b.length} PR(s)`,data:{plugin:a,prCount:b.length,errorMessage:c}})}}for(let d of a){if(!d.branch||"off"===d.metadata.prAutoDetect||"false"===d.metadata.prAutoDetect||"orchestrator"===d.metadata.role||d.id.endsWith("-orchestrator")||d.pr&&("closed"!==d.lifecycle.pr.state||d.pr.branch===d.branch))continue;let a=b.projects[d.projectId];if(!a?.repo||!a.scm?.plugin||q.has(a.repo))continue;let e=c.get("scm",a.scm.plugin);if(e?.detectPR)try{let b=await e.detectPR(d,a);if(b){d.pr=b;let c=o(d.projectId);a7(c,d.id,{pr:b.url}),bG({projectId:d.projectId,sessionId:d.id,source:"scm",kind:"scm.detect_pr_succeeded",summary:`PR #${b.number} detected`,data:{plugin:a.scm.plugin,prNumber:b.number,prUrl:b.url,prOwner:b.owner,prRepo:b.repo}})}}catch(c){let b=c instanceof Error?c.message:String(c);g?.recordOperation?.({metric:"lifecycle_poll",operation:"scm.detect_pr",outcome:"failure",correlationId:cL("detect-pr"),projectId:d.projectId,sessionId:d.id,reason:b,level:"warn"}),bG({projectId:d.projectId,sessionId:d.id,source:"scm",kind:"scm.detect_pr_failed",level:"warn",summary:`detect_pr failed for ${d.id}`,data:{plugin:a.scm.plugin,errorMessage:b}})}}}function t(a,b){let c=y(a,"agent-stuck"),d=c?.threshold;if("string"!=typeof d)return!1;let e=cO(d);return!(e<=0)&&Date.now()-b.getTime()>e}async function u(a,c){var f,g;let h=b.projects[a.projectId];if(!h)return;let i=Object.values(b.projects).map(a=>a.sessionPrefix),j=b1(a.id,a.metadata,h.sessionPrefix,i),k=a.workspacePath;if(!("worker"===j&&null!==k&&(!a.pr||"closed"===a.lifecycle.pr.state)))return;let l=await cU(k);if("detached"===l.kind){null!==a.branch&&(a.branch=null,z(a,{branch:""}));return}if("branch"!==l.kind||l.branch===a.branch)return;let m=function(a,b){let c=`${a.projectId}:${b}`,d=n.get(c);return d&&d!==a.id?null:(n.set(c,a.id),c)}(a,l.branch);if(m)try{let g=c??await e.list(a.projectId);f=l.branch,g.some(c=>{if(c.id===a.id||c.projectId!==a.projectId||d.CM.has(c.status))return!1;let e=b.projects[c.projectId];return!!e&&"worker"===b1(c.id,c.metadata,e.sessionPrefix,i)&&c.branch===f})||(a.branch=l.branch,z(a,{branch:l.branch}))}finally{g=a.id,n.get(m)===g&&n.delete(m)}}async function v(a){let e=b.projects[a.projectId];if(!e)return{status:a.status,evidence:"project_missing",detectingAttempts:bu(a.metadata.detectingAttempts)};let f=aY(a.lifecycle),h=new Date().toISOString(),j=Object.values(b.projects).map(a=>a.sessionPrefix),k=b2({role:b1(a.id,a.metadata,e.sessionPrefix,j),project:e,defaults:b.defaults,persistedAgent:a.metadata.agent}).agentName,l=c.get("agent",k),m=e.scm?.plugin?c.get("scm",e.scm.plugin):null,n=null,o=!1,q=a.status!==d.SB.SPAWNING,r=bu(a.metadata.detectingAttempts),s=a.metadata.detectingStartedAt||void 0,u=a.metadata.detectingEvidenceHash||void 0,v=(b={status:aW(f),evidence:"lifecycle_commit",detecting:{attempts:r}})=>(b.prState&&(f.pr.state=b.prState,f.pr.lastObservedAt=h),b.prReason&&(f.pr.reason=b.prReason),b.sessionState&&b.sessionReason&&(f.session.state=b.sessionState,f.session.reason=b.sessionReason,f.session.lastTransitionAt=h,"working"===b.sessionState&&null===f.session.startedAt&&(f.session.startedAt=h),"done"===b.sessionState&&null===f.session.completedAt&&(f.session.completedAt=h),"terminated"===b.sessionState&&null===f.session.terminatedAt&&(f.session.terminatedAt=h)),a.lifecycle=f,a.status=b.status,a.activitySignal=x,{status:b.status,evidence:b.evidence,detectingAttempts:b.detecting.attempts,detectingStartedAt:b.detecting.startedAt,detectingEvidenceHash:b.detecting.evidenceHash}),w={state:"unknown",failed:!1};if(a.runtimeHandle&&q){let d=c.get("runtime",e.runtime??b.defaults.runtime);if(d)try{let b=await d.isAlive(a.runtimeHandle);f.runtime.lastObservedAt=h,w={state:b?"alive":"dead",failed:!1},b?(f.runtime.state="alive",f.runtime.reason="process_running"):(f.runtime.state="missing",f.runtime.reason="tmux"===a.runtimeHandle.runtimeName?"tmux_missing":"process_missing")}catch(b){f.runtime.state="probe_failed",f.runtime.reason="probe_error",f.runtime.lastObservedAt=h,w={state:"unknown",failed:!0},bG({projectId:a.projectId,sessionId:a.id,source:"runtime",kind:"runtime.probe_failed",level:"warn",summary:`runtime.isAlive probe failed for ${a.id}`,data:{runtimeName:a.runtimeHandle.runtimeName,errorMessage:b instanceof Error?b.message:String(b)}})}}let x=bh("unavailable"),y={state:"unknown",failed:!1},z=bk(x);if(l&&(a.runtimeHandle||a.workspacePath))try{if(l.recordActivity&&a.workspacePath&&a.runtimeHandle&&q)try{let d=c.get("runtime",e.runtime??b.defaults.runtime),f=d?await d.getOutput(a.runtimeHandle,10):"";f&&await l.recordActivity(a,f)}catch(b){g?.recordOperation?.({metric:"lifecycle_poll",operation:"activity.record",outcome:"failure",correlationId:cL("lifecycle-poll"),projectId:a.projectId,sessionId:a.id,reason:b instanceof Error?b.message:String(b),level:"warn"})}let j=await l.getActivityState(a,b.readyThresholdMs);if(j){x=bi(j,"native"),z=bk(x),f.runtime.lastObservedAt=h;let b=i.get(a.id);if(i.set(a.id,j.state),void 0!==b&&b!==j.state&&bG({projectId:a.projectId,sessionId:a.id,source:"lifecycle",kind:"activity.transition",summary:`${b} → ${j.state}`,data:{from:b,to:j.state}}),"missing"!==f.runtime.state&&"probe_failed"!==f.runtime.state&&(f.runtime.state="alive",f.runtime.reason="process_running"),"waiting_input"===j.state)return v({status:d.SB.NEEDS_INPUT,evidence:z,detecting:{attempts:0},sessionState:"needs_input",sessionReason:"awaiting_user_input"});"exited"===j.state&&q&&(y={state:"dead",failed:!1},f.runtime.state="exited",f.runtime.reason="process_missing"),bj(x)&&(n=x.timestamp,o="blocked"===x.activity)}else if(a.runtimeHandle&&q){x=bh("null",{source:"native"}),z=bk(x);let g=c.get("runtime",e.runtime??b.defaults.runtime),i=g?await g.getOutput(a.runtimeHandle,10):"";if(i){let b=l.detectActivity(i);if(x=bi({state:b},"terminal"),z=bk(x),"waiting_input"===b)return v({status:d.SB.NEEDS_INPUT,evidence:z,detecting:{attempts:0},sessionState:"needs_input",sessionReason:"awaiting_user_input"});try{let b=await l.isProcessRunning(a.runtimeHandle);y=c_(b),!1===b&&(f.runtime.state="exited",f.runtime.reason="process_missing",f.runtime.lastObservedAt=h)}catch(b){y={state:"unknown",failed:!0},bG({projectId:a.projectId,sessionId:a.id,source:"agent",kind:"agent.process_probe_failed",level:"warn",summary:`agent.isProcessRunning failed for ${a.id}`,data:{agentName:k,where:"fallback",errorMessage:b instanceof Error?b.message:String(b)}})}}}else x=bh("null",{source:"native"}),z=bk(x)}catch(b){if(z=bk(x=bh("probe_failure",{source:"native"})),bG({projectId:a.projectId,sessionId:a.id,source:"agent",kind:"agent.activity_probe_failed",level:"warn",summary:`activity probing failed for ${a.id}`,data:{agentName:k,errorMessage:b instanceof Error?b.message:String(b)}}),"stuck"===f.session.state||"needs_input"===f.session.state||"detecting"===f.session.state)return v({status:a.status,evidence:z,detecting:{attempts:r}});return v(br({currentAttempts:r,idleWasBlocked:o,evidence:z,detectingStartedAt:s,previousEvidenceHash:u}))}if("unknown"===y.state&&!y.indeterminate&&a.runtimeHandle&&q&&l)try{let b=await l.isProcessRunning(a.runtimeHandle);y=c_(b),!1===b&&(f.runtime.state="exited",f.runtime.reason="process_missing",f.runtime.lastObservedAt=h)}catch(b){y={state:"unknown",failed:!0},bG({projectId:a.projectId,sessionId:a.id,source:"agent",kind:"agent.process_probe_failed",level:"warn",summary:`agent.isProcessRunning failed for ${a.id}`,data:{agentName:k,where:"standalone",errorMessage:b instanceof Error?b.message:String(b)}})}if(y.indeterminate)return bG({projectId:a.projectId,sessionId:a.id,source:"agent",kind:"agent.process_probe_failed",level:"warn",summary:`agent.isProcessRunning indeterminate for ${a.id}`,data:{agentName:k,reason:"probe_indeterminate"}}),{status:a.status,evidence:a.metadata.lifecycleEvidence??"process_probe_indeterminate",detectingAttempts:r,detectingStartedAt:s,detectingEvidenceHash:u,skipMetadataWrite:!0};let A=function(a){let b=function(a,b=new Date){return"valid"===a.state&&a.timestamp instanceof Date&&null!==a.activity&&be.has(a.activity)&&"stale"!==bg(a.timestamp,b)}(a.activitySignal);return a.runtimeProbe.failed||a.processProbe.failed?br({currentAttempts:a.currentAttempts,idleWasBlocked:a.idleWasBlocked,evidence:`probe_failed runtime=${a.runtimeProbe.state} process=${a.processProbe.state} ${a.activityEvidence}`,detectingStartedAt:a.detectingStartedAt,previousEvidenceHash:a.previousEvidenceHash}):"dead"===a.runtimeProbe.state&&"alive"===a.processProbe.state||"alive"===a.runtimeProbe.state&&"dead"===a.processProbe.state||"dead"===a.runtimeProbe.state&&b?br({currentAttempts:a.currentAttempts,idleWasBlocked:a.idleWasBlocked,evidence:`signal_disagreement runtime=${a.runtimeProbe.state} process=${a.processProbe.state} ${a.activityEvidence}`,reason:"dead"===a.runtimeProbe.state?"runtime_lost":"agent_process_exited",detectingStartedAt:a.detectingStartedAt,previousEvidenceHash:a.previousEvidenceHash}):"dead"===a.runtimeProbe.state&&"unknown"===a.processProbe.state&&a.canProbeRuntimeIdentity?br({currentAttempts:a.currentAttempts,idleWasBlocked:a.idleWasBlocked,evidence:`runtime_dead process_unknown ${a.activityEvidence}`,reason:"runtime_lost",detectingStartedAt:a.detectingStartedAt,previousEvidenceHash:a.previousEvidenceHash}):"dead"!==a.runtimeProbe.state||"dead"!==a.processProbe.state||b?null:{status:d.SB.KILLED,evidence:`runtime_dead process_dead ${a.activityEvidence}`,detecting:{attempts:0},sessionState:"terminated",sessionReason:"runtime_lost"}}({currentAttempts:r,runtimeProbe:w,processProbe:y,canProbeRuntimeIdentity:q,activitySignal:x,activityEvidence:z,idleWasBlocked:o,detectingStartedAt:s,previousEvidenceHash:u});if(A)return v(A);if(a.pr&&m)try{let b=`${a.pr.owner}/${a.pr.repo}#${a.pr.number}`,c=p.get(b);"none"===f.pr.state&&(f.pr.state="open"),"not_created"===f.pr.reason&&(f.pr.reason="in_progress"),f.pr.number=a.pr.number,f.pr.url=a.pr.url,f.pr.lastObservedAt=h;let g=!!(null!==n&&bj(x))&&t(a,n);if(c)return v(function(a,b){let c=bs(a.state);return c||bt({reviewDecision:a.reviewDecision,ciFailing:a.ciStatus===d.U1.FAILING,mergeable:a.mergeable,shouldEscalateIdleToStuck:b.shouldEscalateIdleToStuck,idleWasBlocked:b.idleWasBlocked,activityEvidence:b.activityEvidence})}(c,{shouldEscalateIdleToStuck:g,idleWasBlocked:o,activityEvidence:z}));try{let b=await m.getPRState(a.pr);if("merged"===b||"closed"===b)return v(function(a){let b=bs(a.prState);return b||bt({reviewDecision:a.reviewDecision,ciFailing:a.ciStatus===d.U1.FAILING,mergeable:a.mergeable,shouldEscalateIdleToStuck:a.shouldEscalateIdleToStuck,idleWasBlocked:a.idleWasBlocked,activityEvidence:a.activityEvidence})}({prState:b,ciStatus:"none",reviewDecision:"none",mergeable:!1,shouldEscalateIdleToStuck:g,idleWasBlocked:o,activityEvidence:z}))}catch(b){bG({projectId:a.projectId,sessionId:a.id,source:"scm",kind:"scm.poll_pr_failed",level:"warn",summary:`getPRState failed for PR #${a.pr.number}`,data:{plugin:e.scm?.plugin,prNumber:a.pr.number,prUrl:a.pr.url,errorMessage:b instanceof Error?b.message:String(b)}})}}catch(b){g?.recordOperation?.({metric:"lifecycle_poll",operation:"scm.poll_pr",outcome:"failure",correlationId:cL("lifecycle-poll"),projectId:a.projectId,sessionId:a.id,reason:b instanceof Error?b.message:String(b),level:"warn"})}let B=bp(a.metadata);if(B&&function(a,b=new Date,c=3e5,d=6e4){let e=Date.parse(a.timestamp);if(Number.isNaN(e))return!1;let f=b.getTime();return!(e>f+d)&&f-e<=c}(B)&&"orchestrator"!==f.session.kind&&"terminated"!==f.session.state&&"done"!==f.session.state){let a=function(a){switch(a){case"started":return{sessionState:"working",sessionReason:"agent_acknowledged"};case"working":case"draft_pr_created":return{sessionState:"working",sessionReason:"task_in_progress"};case"waiting":case"ready_for_review":return{sessionState:"idle",sessionReason:"awaiting_external_review"};case"needs_input":return{sessionState:"needs_input",sessionReason:"awaiting_user_input"};case"fixing_ci":return{sessionState:"working",sessionReason:"fixing_ci"};case"addressing_reviews":return{sessionState:"working",sessionReason:"resolving_review_comments"};case"pr_created":return{sessionState:"idle",sessionReason:"pr_created"};case"completed":return{sessionState:"idle",sessionReason:"research_complete"}}}(B.state);return v({status:aW({...f,session:{...f.session,state:a.sessionState,reason:a.sessionReason}}),evidence:`agent_report:${B.state}`,detecting:{attempts:0},sessionState:a.sessionState,sessionReason:a.sessionReason})}return n&&bj(x)&&t(a,n)?v({status:d.SB.STUCK,evidence:`idle_beyond_threshold ${z}`,detecting:{attempts:0},sessionState:"stuck",sessionReason:o?"error_in_process":"probe_failure"}):"valid"!==x.state&&(a.status===d.SB.DETECTING||a.status===d.SB.STUCK||a.status===d.SB.NEEDS_INPUT||"detecting"===f.session.state||"stuck"===f.session.state||"needs_input"===f.session.state)?v("unavailable"!==x.state||"stuck"!==f.session.state||"probe_failure"!==f.session.reason||"alive"!==w.state||w.failed?{status:aW(f),evidence:z,detecting:{attempts:0}}:{status:d.SB.DETECTING,evidence:z,detecting:{attempts:0},sessionState:"detecting",sessionReason:"probe_failure"}):v(a.status===d.SB.SPAWNING||a.status===d.SB.DETECTING||a.status===d.SB.STUCK||a.status===d.SB.NEEDS_INPUT?{status:d.SB.WORKING,evidence:z,detecting:{attempts:0},sessionState:"working",sessionReason:"task_in_progress"}:{status:a.status,evidence:z,detecting:{attempts:0}})}async function w(a,b,c){let{id:d,projectId:f}=a,g=`${d}:${b}`,h=j.get(g);if(h||(h={attempts:0,firstTriggered:new Date},j.set(g,h)),h.escalated)return{reactionType:b,success:!0,action:"escalated",escalated:!0};h.attempts++;let i=c.retries??1/0,k=c.escalateAfter,l=!1;if(h.attempts>i&&(l=!0),"string"==typeof k){let a=cO(k);a>0&&Date.now()-h.firstTriggered.getTime()>a&&(l=!0)}if("number"==typeof k&&h.attempts>k&&(l=!0),l){let e=h.attempts>i?"max_retries":"number"==typeof k&&h.attempts>k?"max_attempts":"max_duration";bG({projectId:f,sessionId:d,source:"reaction",kind:"reaction.escalated",level:"warn",summary:`reaction ${b} escalated after ${h.attempts} attempts`,data:{reactionKey:b,attempts:h.attempts,durationSinceFirstMs:Date.now()-h.firstTriggered.getTime(),escalationCause:e}});let g=cY(a,p),j=cW("reaction.escalated",{sessionId:d,projectId:f,message:`Reaction '${b}' escalated after ${h.attempts} attempts`,data:{reactionKey:b,attempts:h.attempts,context:g,schemaVersion:2}});return await G(j,c.priority??"urgent"),h.escalated=!0,{reactionType:b,success:!0,action:"escalated",escalated:!0}}let m=c.action??"notify";switch(m){case"send-to-agent":if(c.message)try{return await e.send(d,c.message),bG({projectId:f,sessionId:d,source:"reaction",kind:"reaction.action_succeeded",summary:`send-to-agent ${b}`,data:{reactionKey:b,action:"send-to-agent",attempts:h.attempts}}),{reactionType:b,success:!0,action:"send-to-agent",message:c.message,escalated:!1}}catch(a){return bG({projectId:f,sessionId:d,source:"reaction",kind:"reaction.send_to_agent_failed",level:"warn",summary:`send-to-agent failed for ${d}`,data:{reactionKey:b,attempts:h.attempts,errorMessage:a instanceof Error?a.message:String(a)}}),{reactionType:b,success:!1,action:"send-to-agent",escalated:!1}}break;case"notify":{let e=cW("reaction.triggered",{sessionId:d,projectId:f,message:`Reaction '${b}' triggered notification`,data:{reactionKey:b,context:cY(a,p),schemaVersion:2}});return await G(e,c.priority??"info"),bG({projectId:f,sessionId:d,source:"reaction",kind:"reaction.action_succeeded",summary:`notify ${b}`,data:{reactionKey:b,action:"notify",attempts:h.attempts}}),{reactionType:b,success:!0,action:"notify",escalated:!1}}case"auto-merge":{let c=cW("reaction.triggered",{sessionId:d,projectId:f,message:`Reaction '${b}' triggered auto-merge`,data:{reactionKey:b,context:cY(a,p),schemaVersion:2}});return await G(c,"action"),bG({projectId:f,sessionId:d,source:"reaction",kind:"reaction.action_succeeded",summary:`auto-merge ${b}`,data:{reactionKey:b,action:"auto-merge",attempts:h.attempts}}),{reactionType:b,success:!0,action:"auto-merge",escalated:!1}}}return{reactionType:b,success:!1,action:m,escalated:!1}}function x(a,b){j.delete(`${a}:${b}`)}function y(a,c){let d=b.projects[a.projectId],e=b.reactions[c],f=d?.reactions?.[c];return(f?{...e,...f}:e)||null}function z(a,c){if(!b.projects[a.projectId])return;let d=o(a.projectId),f=aX(aY(a.lifecycle)),g={...c,...f};a7(d,a.id,g),e.invalidateCache();let h=Object.fromEntries(Object.entries(a.metadata).filter(([a])=>{let b=g[a];return void 0===b||""!==b}));for(let[a,b]of Object.entries(g))void 0!==b&&""!==b&&(h[a]=b);a.metadata=h,a.status=aW(a.lifecycle)}function A(a){return[...a].sort().join(",")}async function B(a,f,g,h){let i,j=b.projects[a.projectId];if(!j||!a.pr)return;let k=j.scm?.plugin?c.get("scm",j.scm.plugin):null;if(!k)return;let l="changes-requested",m="bugbot-comments";if(d.CM.has(g)||"open"!==a.lifecycle.pr.state){x(a.id,l),x(a.id,m),r.delete(a.id),z(a,{lastPendingReviewFingerprint:"",lastPendingReviewDispatchHash:"",lastPendingReviewDispatchAt:"",lastAutomatedReviewFingerprint:"",lastAutomatedReviewDispatchHash:"",lastAutomatedReviewDispatchAt:""});return}if(h?.key!==l&&h?.key!==m){let b=r.get(a.id)??0;if(Date.now()-b<12e4)return}let n=[];try{if(k.getReviewThreads){let b=await k.getReviewThreads(a.pr);i=b.threads,n=b.reviews}else i=await k.getPendingComments(a.pr)}catch(b){bG({projectId:a.projectId,sessionId:a.id,source:"scm",kind:"scm.review_fetch_failed",level:"warn",summary:`review fetch failed for PR #${a.pr.number}`,data:{plugin:j.scm?.plugin,prNumber:a.pr.number,prUrl:a.pr.url,errorMessage:b instanceof Error?b.message:String(b)}});return}r.set(a.id,Date.now());{let b=i.filter(a=>!a.isBot),c=JSON.stringify({unresolvedThreads:b.length,unresolvedComments:b.map(a=>({url:a.url,path:a.path??"",author:a.author,body:a.body})),reviews:n.map(a=>({author:a.author,state:a.state,body:a.body})),commentsUpdatedAt:new Date().toISOString()});a.metadata.prReviewComments!==c&&z(a,{prReviewComments:c})}let o=i.filter(a=>!a.isBot),p=i.filter(a=>a.isBot);{let b=A(o.map(a=>a.id)),c=a.metadata.lastPendingReviewFingerprint??"",d=a.metadata.lastPendingReviewDispatchHash??"";if(b!==c&&h?.key!==l&&x(a.id,l),b!==c&&z(a,{lastPendingReviewFingerprint:b}),b){if(b!==d){let c=y(a,l);if(c&&c.action&&(!1!==c.auto||"notify"===c.action)){let d=C(o,"reviewer",n),f=!1;if(h?.key===l&&"send-to-agent"===c.action)try{await e.send(a.id,d),f=!0}catch{}else{let b={...c,message:d};f=(await w(a,l,b)).success}f&&z(a,{lastPendingReviewDispatchHash:b,lastPendingReviewDispatchAt:new Date().toISOString()})}}}else x(a.id,l),z(a,{lastPendingReviewFingerprint:"",lastPendingReviewDispatchHash:"",lastPendingReviewDispatchAt:""})}{let b=A(p.map(a=>a.id)),c=a.metadata.lastAutomatedReviewFingerprint??"",d=a.metadata.lastAutomatedReviewDispatchHash??"";if(b!==c&&(x(a.id,m),z(a,{lastAutomatedReviewFingerprint:b})),b){if(b!==d){let c=y(a,m);if(c&&c.action&&(!1!==c.auto||"notify"===c.action)){let d=C(p,"bot"),f=!1;if(h?.key===m&&"send-to-agent"===c.action)try{await e.send(a.id,d),f=!0}catch{}else{let b={...c,message:d};f=(await w(a,m,b)).success}f&&z(a,{lastAutomatedReviewDispatchHash:b,lastAutomatedReviewDispatchAt:new Date().toISOString()})}}}else x(a.id,m),z(a,{lastAutomatedReviewFingerprint:"",lastAutomatedReviewDispatchHash:"",lastAutomatedReviewDispatchAt:""})}}function C(a,b,c=[]){let d=[],e=c.filter(a=>a.body&&a.body.trim().length>0);if(e.length>0)for(let a of e)d.push(`Review by @${a.author} (${a.state}):`),d.push(`"${a.body.trim()}"`,"");let f="reviewer"===b?`The following ${a.length} unresolved review comment(s) are on your PR (as of just now). You should not need to re-fetch this data unless you need additional context.`:`The following ${a.length} automated review comment(s) are on your PR (as of just now). You should not need to re-fetch this data unless you need additional context.`;d.push(f,"");for(let b=0;b<a.length;b++){let c=a[b],e=c.path?`${c.path}${c.line?`:${c.line}`:""}`:"(general)";d.push(`${b+1}. ${e} (@${c.author}): "${c.body}"`),c.url&&d.push(` ${c.url}`),c.threadId&&d.push(` Thread ID: ${c.threadId}`)}return d.push("","Address each comment, push fixes. Use the thread ID to resolve each thread directly after pushing. You should not need to re-fetch review data unless you need additional context beyond what is provided here."),d.join("\n")}function D(a){let b=["CI checks are failing on your PR. Here are the failed checks:",""];for(let c of a){let a=c.conclusion??c.status,d=c.url?` — ${c.url}`:"";b.push(`- **${c.name}**: ${a}${d}`)}return b.push("","Investigate the failures, fix the issues, and push again."),b.join("\n")}async function E(a,d,f,g){let h,i=b.projects[a.projectId];if(!i||!a.pr)return;let j=i.scm?.plugin?c.get("scm",i.scm.plugin):null;if(!j)return;let k="ci-failed";if("merged"===f||"killed"===f){x(a.id,k),z(a,{lastCIFailureFingerprint:"",lastCIFailureDispatchHash:"",lastCIFailureDispatchAt:""});return}if("ci_failed"!==f){a.metadata.lastCIFailureFingerprint&&(x(a.id,k),z(a,{lastCIFailureFingerprint:"",lastCIFailureDispatchHash:"",lastCIFailureDispatchAt:""}));return}let l=`${a.pr.owner}/${a.pr.repo}#${a.pr.number}`,m=p.get(l);if(m?.ciChecks!==void 0)h=m.ciChecks;else try{h=await j.getCIChecks(a.pr)}catch{return}let n=h.filter(a=>"failed"===a.status||a.conclusion?.toUpperCase()==="FAILURE");if(0===n.length)return;let o=A(n.map(a=>`${a.name}:${a.status}:${a.conclusion??""}`)),q=a.metadata.lastCIFailureFingerprint??"",r=a.metadata.lastCIFailureDispatchHash??"";if(o!==q&&g?.key!==k&&x(a.id,k),o!==q&&z(a,{lastCIFailureFingerprint:o}),g?.key===k&&g.result?.success)return void z(a,{lastCIFailureDispatchHash:o,lastCIFailureDispatchAt:new Date().toISOString()});if(o===r)return;let s=y(a,k);if(s&&s.action&&(!1!==s.auto||"notify"===s.action)){let b=D(n);try{if("send-to-agent"===s.action)await e.send(a.id,b);else{let c=cY(a,p),d=cW("ci.failing",{sessionId:a.id,projectId:a.projectId,message:b,data:{failedChecks:n.map(a=>a.name),context:c,schemaVersion:2}});await G(d,s.priority??"warning")}z(a,{lastCIFailureDispatchHash:o,lastCIFailureDispatchAt:new Date().toISOString()})}catch{}}}async function F(a,d){let e=b.projects[a.projectId];if(!e||!a.pr||!(e.scm?.plugin?c.get("scm",e.scm.plugin):null))return;let f="merge-conflicts";if("open"!==a.lifecycle.pr.state||"killed"===d){x(a.id,f),z(a,{lastMergeConflictDispatched:""});return}if("pr_open"!==d&&"ci_failed"!==d&&"review_pending"!==d&&"changes_requested"!==d&&"approved"!==d&&"mergeable"!==d)return;let g=`${a.pr.owner}/${a.pr.repo}#${a.pr.number}`,h=p.get(g);if(!h)return;let i=h.hasConflicts??!1,j=a.metadata.lastMergeConflictDispatched??"";if(i){if("true"===j)return;let b=y(a,f);if(b&&b.action&&(!1!==b.auto||"notify"===b.action))try{let c={...b,priority:b.priority??"warning"};if("send-to-agent"===b.action&&!b.message){let b=a.pr.baseBranch??"the default branch",d=h.isBehind?` is behind ${b} and`:"";c.message=`Your PR branch${d} has merge conflicts with ${b}. Rebase your branch on ${b}, resolve the conflicts, and push. You should not need to call gh for merge status unless you need additional context — this information is current.`}let d=await w(a,f,c);d.success&&"escalated"!==d.action&&z(a,{lastMergeConflictDispatched:"true"})}catch{}}else"true"===j&&(z(a,{lastMergeConflictDispatched:""}),x(a.id,f))}async function G(a,d){let e={...a,priority:d};for(let a of b.notificationRouting[d]??b.defaults.notifiers){let d=function(a,b){let c=a.notifiers?.[b];return c?.plugin?{reference:b,pluginName:c.plugin}:{reference:b,pluginName:b}}(b,a),f=c.get("notifier",d.reference)??c.get("notifier",d.pluginName);if(f)try{await f.notify(e)}catch{}}}async function H(a){if(a.status!==d.SB.MERGED)return;let{autoCleanupOnMerge:c=!0,mergeCleanupIdleGraceMs:f=3e5}=b.lifecycle??{};if(!c)return;let i=new Date().toISOString(),j=a.metadata.mergedPendingCleanupSince||i,k=Date.parse(j),l=!!Number.isFinite(k)&&Date.now()-k>=f,m=a.activity;if((m===d.u3.ACTIVE||m===d.u3.WAITING_INPUT||m===d.u3.BLOCKED)&&!l){a.metadata.mergedPendingCleanupSince||z(a,{mergedPendingCleanupSince:i}),g.recordOperation({metric:"lifecycle_poll",operation:"lifecycle.merge_cleanup.deferred",outcome:"success",correlationId:cL("lifecycle-merge-cleanup"),projectId:a.projectId,sessionId:a.id,reason:c0(a.lifecycle),data:{activity:m,pendingSince:j,graceMs:f},level:"info"}),bG({projectId:a.projectId,sessionId:a.id,source:"lifecycle",kind:"session.auto_cleanup_deferred",summary:`auto-cleanup deferred for ${a.id}`,data:{activity:m,pendingElapsedMs:Number.isFinite(k)?Date.now()-k:null,graceMs:f}});return}let n=cL("lifecycle-merge-cleanup");try{let b=await e.kill(a.id,{purgeOpenCode:!0,reason:"pr_merged"});g.recordOperation({metric:"lifecycle_poll",operation:"lifecycle.merge_cleanup.completed",outcome:"success",correlationId:n,projectId:a.projectId,sessionId:a.id,reason:c0(a.lifecycle),data:{cleaned:b.cleaned,alreadyTerminated:b.alreadyTerminated,graceElapsed:l,activity:m},level:"info"}),bG({projectId:a.projectId,sessionId:a.id,source:"lifecycle",kind:"session.auto_cleanup_completed",summary:`auto-cleanup completed for ${a.id}`,data:{cleaned:b.cleaned,alreadyTerminated:b.alreadyTerminated,graceElapsed:l,activity:m}}),h.delete(a.id)}catch(c){a.metadata.mergedPendingCleanupSince||z(a,{mergedPendingCleanupSince:i});let b=c instanceof Error?c.message:String(c);g.recordOperation({metric:"lifecycle_poll",operation:"lifecycle.merge_cleanup.failed",outcome:"failure",correlationId:n,projectId:a.projectId,sessionId:a.id,reason:b,level:"warn"}),bG({projectId:a.projectId,sessionId:a.id,source:"lifecycle",kind:"session.auto_cleanup_failed",level:"error",summary:`auto-cleanup failed for ${a.id}`,data:{errorMessage:b}})}}async function I(a){var b;let c,e=h.get(a.id)??(a.metadata?.status||a.status),f=aY(a.lifecycle),i=a.lifecycle.pr.state,j=await v(a);if(j.skipMetadataWrite)return void h.set(a.id,e);let k=j.status,l=a.metadata.lifecycle!==JSON.stringify(a.lifecycle),n=j.evidence,o=j.detectingAttempts>0?String(j.detectingAttempts):"",q=j.detectingStartedAt??"",r=j.detectingEvidenceHash??"",s=k===d.SB.STUCK&&(j.detectingAttempts>3||bq(q)),t=s?a.metadata.detectingEscalatedAt||new Date().toISOString():"";if(s&&!a.metadata.detectingEscalatedAt){let b=j.detectingAttempts>3?"max_attempts":"max_duration";bG({projectId:a.projectId,sessionId:a.id,source:"lifecycle",kind:"detecting.escalated",level:"warn",summary:`detecting → stuck via ${b}`,data:{attempts:j.detectingAttempts,cause:b,startedAt:q}})}let u={};if(a.metadata.lifecycleEvidence!==n&&(u.lifecycleEvidence=n),(a.metadata.detectingAttempts||"")!==o&&(u.detectingAttempts=o),(a.metadata.detectingStartedAt||"")!==q&&(u.detectingStartedAt=q),(a.metadata.detectingEvidenceHash||"")!==r&&(u.detectingEvidenceHash=r),(a.metadata.detectingEscalatedAt||"")!==t&&(u.detectingEscalatedAt=t),Object.keys(u).length>0&&z(a,u),a.pr){let b=`${a.pr.owner}/${a.pr.repo}#${a.pr.number}`,c=p.get(b);if(c)if("passing"===c.ciStatus){let b=Number(a.metadata.ciPassingStableCount??"0")+1;b>=2?(x(a.id,"ci-failed"),z(a,{ciPassingStableCount:""})):z(a,{ciPassingStableCount:String(b)})}else a.metadata.ciPassingStableCount&&z(a,{ciPassingStableCount:""})}if(k!==e){let b=cL("lifecycle-transition");h.set(a.id,k),z(a,{status:k}),bG({projectId:a.projectId,sessionId:a.id,source:"lifecycle",kind:"lifecycle.transition",level:"ci_failed"===k?"warn":"info",summary:`${e} → ${k}`,data:{from:e,to:k}}),g.recordOperation({metric:"lifecycle_poll",operation:"lifecycle.transition",outcome:"success",correlationId:b,projectId:a.projectId,sessionId:a.id,reason:c0(a.lifecycle),data:c1(f,a.lifecycle,e,k,j.evidence,j.detectingAttempts,!0),level:c$(k)}),d.CM.has(k)||(m=!1);let i=cX(void 0,e);if(i){let b=cZ(i);b&&!cP.has(b)&&x(a.id,b)}let l=cX(e,k);if(l){let d=!1,h=cZ(l);if(h){let i=y(a,h);if("ci-failed"===h&&a.pr&&i){let b=`${a.pr.owner}/${a.pr.repo}#${a.pr.number}`,c=p.get(b);if(c?.ciChecks){let a=c.ciChecks.filter(a=>"failed"===a.status);a.length>0&&(i={...i,message:D(a)})}}if(i&&i.action&&(!1!==i.auto||"notify"===i.action)){let l=await w(a,h,i);c={key:h,result:l},g.recordOperation({metric:"lifecycle_poll",operation:"lifecycle.transition.reaction",outcome:l.success?"success":"failure",correlationId:b,projectId:a.projectId,sessionId:a.id,reason:c0(a.lifecycle),data:c1(f,a.lifecycle,e,k,j.evidence,j.detectingAttempts,!0,c),level:l.success?"info":"warn"}),d=!0}}if(!d){let b=cV(l),c=cY(a,p),d=cW(l,{sessionId:a.id,projectId:a.projectId,message:`${a.id}: ${e} → ${k}`,data:{oldStatus:e,newStatus:k,context:c,schemaVersion:2}});await G(d,b)}}}else h.set(a.id,k),l&&(z(a,{status:k}),g.recordOperation({metric:"lifecycle_poll",operation:"lifecycle.sync",outcome:"success",correlationId:cL("lifecycle-sync"),projectId:a.projectId,sessionId:a.id,reason:c0(a.lifecycle),data:c1(f,a.lifecycle,e,k,j.evidence,j.detectingAttempts,!1),level:c$(k)}));let A=i===(b=a.lifecycle.pr.state)?null:"closed"===b?"pr.closed":null;if(A){let b=!1,c=cZ(A);if(c){let d=y(a,c);d&&d.action&&(!1!==d.auto||"notify"===d.action)&&(await w(a,c,d),b=!0)}if(!b){let b=cY(a,p),c=cW(A,{sessionId:a.id,projectId:a.projectId,message:`${a.id}: PR ${i} → ${a.lifecycle.pr.state}`,data:{oldPRState:i,newPRState:a.lifecycle.pr.state,prNumber:a.lifecycle.pr.number,prUrl:a.lifecycle.pr.url,context:b,schemaVersion:2}});await G(c,cV(A))}}if(a.agentInfo?.summary&&!a.agentInfo.summaryIsFallback&&!a.metadata.pinnedSummary){let b=a.agentInfo.summary.replace(/[\n\r]/g," ").trim();if(b.length>=5)try{z(a,{pinnedSummary:b})}catch{}}await Promise.allSettled([B(a,e,k,c),F(a,k),E(a,e,k,c)]),await J(a),await H(a)}async function J(a){let b=function(a,b={},c=new Date){if(bw.has(a.status)||a.lifecycle?.session.kind==="orchestrator")return null;let d={...bv,...b},e=bp(a.metadata),f=function(a,b,c,d){if(!d.checkBlocked||!b)return null;if("needs_input"===b.state){let a=Date.parse(b.timestamp),d=Number.isNaN(a)?void 0:c.getTime()-a;return{trigger:"agent_needs_input",message:`Agent needs input: ${b.note??"waiting for user decision"}`,checkedAt:c.toISOString(),report:b,timeSinceReportMs:d}}return null}(0,e,c,d);if(f)return f;let g=function(a,b,c,d){if(!d.checkAcknowledge||b)return null;let e=a.createdAt??a.metadata.createdAt;if(!e)return null;let f="string"==typeof e?Date.parse(e):e.getTime();if(Number.isNaN(f))return null;let g=c.getTime()-f;return g<d.acknowledgeTimeoutMs?null:{trigger:"no_acknowledge",message:`Agent has not acknowledged task after ${Math.round(g/6e4)} minutes`,checkedAt:c.toISOString(),report:null,timeSinceSpawnMs:g}}(a,e,c,d);if(g)return g;let h=function(a,b,c,d){if(!d.checkStale||!b)return null;let e=Date.parse(b.timestamp);if(Number.isNaN(e))return null;let f=c.getTime()-e;return f<d.staleReportTimeoutMs||"waiting"===b.state||"needs_input"===b.state?null:{trigger:"stale_report",message:`Agent report is stale (${Math.round(f/6e4)} minutes since last report)`,checkedAt:c.toISOString(),report:b,timeSinceReportMs:f}}(0,e,c,d);return h||null}(a),c=new Date().toISOString();if(!b||!b.trigger){a.metadata[bx.ACTIVE_TRIGGER]&&z(a,{[bx.LAST_AUDITED_AT]:c,[bx.ACTIVE_TRIGGER]:"",[bx.TRIGGER_ACTIVATED_AT]:"",[bx.TRIGGER_COUNT]:""});return}let d=function(a){switch(a){case"no_acknowledge":return"report-no-acknowledge";case"stale_report":return"report-stale";case"agent_needs_input":return"report-needs-input"}}(b.trigger),e=y(a,d),f=parseInt(a.metadata[bx.TRIGGER_COUNT]??"0",10),h=a.metadata[bx.ACTIVE_TRIGGER]!==b.trigger;z(a,{[bx.LAST_AUDITED_AT]:c,[bx.ACTIVE_TRIGGER]:b.trigger,[bx.TRIGGER_ACTIVATED_AT]:h?c:a.metadata[bx.TRIGGER_ACTIVATED_AT]??c,[bx.TRIGGER_COUNT]:String(h?1:f+1)}),g.recordOperation({metric:"lifecycle_poll",operation:"report_watcher.audit",outcome:"success",correlationId:cL("report-watcher"),projectId:a.projectId,sessionId:a.id,reason:b.trigger,data:{trigger:b.trigger,message:b.message,timeSinceSpawnMs:b.timeSinceSpawnMs,timeSinceReportMs:b.timeSinceReportMs,reportState:b.report?.state},level:"warn"}),h&&bG({projectId:a.projectId,sessionId:a.id,source:"report-watcher",kind:"report_watcher.triggered",level:"warn",summary:`${b.trigger} triggered`,data:{trigger:b.trigger,message:b.message,timeSinceSpawnMs:b.timeSinceSpawnMs,timeSinceReportMs:b.timeSinceReportMs,reportState:b.report?.state}}),h&&e&&!1!==e.auto&&await w(a,d,e)}async function K(){let a=cL("lifecycle-poll"),c=Date.now();if(!l){l=!0;try{let k=await e.list(f),l=k.filter(a=>{if(!d.CM.has(a.status))return!0;let b=h.get(a.id);return void 0!==b&&b!==a.status});await Promise.allSettled(l.map(a=>u(a,k))),await s(l),await Promise.allSettled(l.map(a=>I(a)));for(let a of l){if(!a.pr||!b.projects[a.projectId])continue;let c=`${a.pr.owner}/${a.pr.repo}#${a.pr.number}`,d=p.get(c);if(!d)continue;let e=JSON.stringify({state:d.state,ciStatus:d.ciStatus,reviewDecision:d.reviewDecision,mergeable:d.mergeable,title:d.title,additions:d.additions,deletions:d.deletions,isDraft:d.isDraft,hasConflicts:d.hasConflicts,isBehind:d.isBehind,blockers:d.blockers,ciChecks:d.ciChecks?.map(a=>({name:a.name,status:a.status,url:a.url})),enrichedAt:new Date().toISOString()});a.metadata.prEnrichment!==e&&(a7(o(a.projectId),a.id,{prEnrichment:e}),a.metadata.prEnrichment=e)}let n=new Set(k.map(a=>a.id));for(let a of h.keys())n.has(a)||h.delete(a);for(let a of i.keys())n.has(a)||i.delete(a);for(let a of j.keys()){let b=a.split(":")[0];b&&!n.has(b)&&j.delete(a)}for(let a of r.keys())n.has(a)||r.delete(a);let q=k.filter(a=>!d.CM.has(a.status));if(k.length>0&&0===q.length&&!m){m=!0;let a=cZ("summary.all_complete");if(a){let c=b.reactions[a];c&&c.action&&(!1!==c.auto||"notify"===c.action)&&await w({id:"system",projectId:"all",pr:null,issueId:null,branch:null,metadata:{},agentInfo:null},a,c)}}f&&(g.recordOperation({metric:"lifecycle_poll",operation:"lifecycle.poll",outcome:"success",correlationId:a,projectId:f,durationMs:Date.now()-c,data:{sessionCount:k.length,activeSessionCount:q.length},level:"info"}),g.setHealth({surface:"lifecycle.worker",status:"ok",projectId:f,correlationId:a,details:{projectId:f,sessionCount:k.length,activeSessionCount:q.length}}))}catch(d){let b=d instanceof Error?d.message:String(d);g.recordOperation({metric:"lifecycle_poll",operation:"lifecycle.poll",outcome:"failure",correlationId:a,projectId:f,durationMs:Date.now()-c,reason:b,level:"error"}),bG({projectId:f,source:"lifecycle",kind:"lifecycle.poll_failed",level:"error",summary:"poll cycle failed",data:{errorMessage:b,durationMs:Date.now()-c,projectScope:f??"all"}}),g.setHealth({surface:"lifecycle.worker",status:"error",projectId:f,correlationId:a,reason:b,details:f?{projectId:f}:{projectScope:"all"}})}finally{l=!1}}}return{start(a=3e4){k||(k=setInterval(()=>void K(),a),K())},stop(){k&&(clearInterval(k),k=null)},getStates:()=>new Map(h),async check(a){let b=await e.get(a);if(!b)throw Error(`Session ${a} not found`);await u(b),await s([b]),await I(b)}}}function c3(a){let b=function(a){let{config:b,projectId:c,project:d}=a,e=!!d.repo;return{projectId:c,projectName:d.name,projectRepo:d.repo??"not configured",projectDefaultBranch:d.defaultBranch,projectSessionPrefix:d.sessionPrefix,projectPath:d.path,dashboardPort:String(b.port??3e3),automatedReactionsSection:function(a){let b="*".repeat(2),c=a=>`${b}${a}${b}`,d=[];for(let[b,e]of Object.entries(a.reactions??{})){if(e.auto&&"send-to-agent"===e.action){d.push(`- ${c(b)}: Auto-sends instruction to agent (retries: ${e.retries??"none"}, escalates after: ${e.escalateAfter??"never"})`);continue}e.auto&&"notify"===e.action&&d.push(`- ${c(b)}: Notifies human (priority: ${e.priority??"info"})`)}return 0===d.length?"":d.join("\n")}(d),projectSpecificRulesSection:function(a){let b=a.orchestratorRules?.trim();return b||""}(d),repoConfiguredSection:e?"true":"",repoNotConfiguredSection:e?"":"true"}}(a);return(function(a,b){let c=a.replace(/\{\{([a-zA-Z0-9_]+)\}\}/g,"").match(/\{\{[^}]+\}\}/);if(c)throw Error(`Unresolved template placeholder: ${c[0]}`);return a.replace(/\{\{([a-zA-Z0-9_]+)\}\}/g,(a,c)=>{if(!Object.prototype.hasOwnProperty.call(b,c))throw Error(`Unresolved template placeholder: ${c}`);return b[c]})})(function(a,b){let c=[["REPO_CONFIGURED_SECTION_START","REPO_CONFIGURED_SECTION_END",b.repoConfiguredSection],["REPO_NOT_CONFIGURED_SECTION_START","REPO_NOT_CONFIGURED_SECTION_END",b.repoNotConfiguredSection],["AUTOMATED_REACTIONS_SECTION_START","AUTOMATED_REACTIONS_SECTION_END",b.automatedReactionsSection],["PROJECT_SPECIFIC_RULES_SECTION_START","PROJECT_SPECIFIC_RULES_SECTION_END",b.projectSpecificRulesSection]],d=a;for(let[a,b,e]of c){let c=`{{${a}}}`,f=`{{${b}}}`;for(;;){let a=d.indexOf(c),b=d.indexOf(f);if(-1===a&&-1===b)break;if(-1===a||-1===b||b<a)throw Error(`Malformed optional section block: expected ${c} before ${f}`);let g=b+f.length,h=d.slice(a+c.length,b);if(h.includes(c))throw Error(`Nested optional section blocks are not supported: ${c} before ${f}`);let i=e?h:"",j=d.slice(0,a),k=d.slice(g);d=i?j+i+k:function(a,b){let c=a.match(/\n*$/)?.[0]??"",d=b.match(/^\n*/)?.[0]??"",e=c.length+d.length>=2?"\n\n":c+d;return a.slice(0,a.length-c.length)+e+b.slice(d.length)}(j,k)}}return d}('# {{projectName}} Orchestrator\n\nYou are the **orchestrator agent** for the {{projectName}} project.\n\nYour role is to coordinate and manage worker agent sessions. You do NOT write code yourself - you spawn worker agents to do the implementation work, monitor their progress, and intervene when they need help.\n\n## Non-Negotiable Rules\n\n- Investigations from the orchestrator session are **read-only**. Inspect status, logs, metadata, PR state, and worker output, but do not edit repository files or implement fixes from the orchestrator session.\n- Any code change, test run tied to implementation, git branch work, or PR takeover must be delegated to a **worker session**.\n- The orchestrator session must never own a PR. Never claim a PR into the orchestrator session, and never treat the orchestrator as the worker responsible for implementation.\n- If an investigation discovers follow-up work, either spawn a worker session or direct an existing worker session with clear instructions.\n- **Always use `ao send` to communicate with sessions** - never bypass it by writing to the runtime layer directly (e.g. `tmux send-keys` / `tmux capture-pane` on Unix, or writing to the named pipe `\\\\.\\pipe\\ao-pty-<sessionId>` on Windows). Direct runtime access bypasses busy detection, retry logic, and input sanitization, and breaks multi-line input for some agents (e.g. Codex).\n- When a session might be busy, use `ao send --no-wait <session> <message>` to send without waiting for the session to become idle.\n\n## Project Info\n\n- **Name**: {{projectName}}\n- **Repository**: {{projectRepo}}\n- **Default Branch**: {{projectDefaultBranch}}\n- **Session Prefix**: {{projectSessionPrefix}}\n- **Local Path**: {{projectPath}}\n- **Dashboard Port**: {{dashboardPort}}\n\n## Quick Start\n\n```bash\n# See all sessions at a glance\nao status\n\n{{REPO_CONFIGURED_SECTION_START}}# Spawn sessions for issues (GitHub: #123, Linear: INT-1234, etc.)\nao spawn INT-1234\nao spawn --claim-pr 123\nao batch-spawn INT-1 INT-2 INT-3\n\n{{REPO_CONFIGURED_SECTION_END}}# Spawn a session without a tracker issue (prompt-driven)\nao spawn --prompt "Refactor the auth module to use JWT"\n\n# List sessions\nao session ls -p {{projectId}}\n\n# Send message to a session\nao send {{projectSessionPrefix}}-1 "Your message here"\n\n{{REPO_CONFIGURED_SECTION_START}}# Claim an existing PR for a worker session\nao session claim-pr 123 {{projectSessionPrefix}}-1\n\n{{REPO_CONFIGURED_SECTION_END}}# Kill a session\nao session kill {{projectSessionPrefix}}-1\n{{REPO_CONFIGURED_SECTION_START}}\n# Open all sessions in terminal tabs\nao open {{projectId}}{{REPO_CONFIGURED_SECTION_END}}\n```\n\n{{REPO_NOT_CONFIGURED_SECTION_START}}\n\n> **Note:** No repository remote is configured. Issue tracking, PR, and CI features are unavailable.\n> Add a `repo` field (owner/repo) to `agent-orchestrator.yaml` to enable them.\n{{REPO_NOT_CONFIGURED_SECTION_END}}\n\n## Available Commands\n\n- `ao status`: Show all sessions{{REPO_CONFIGURED_SECTION_START}} with PR/CI/review status{{REPO_CONFIGURED_SECTION_END}}\n- `ao spawn [issue] [--prompt <text>]{{REPO_CONFIGURED_SECTION_START}} [--claim-pr <pr>]{{REPO_CONFIGURED_SECTION_END}}`: Spawn a worker session{{REPO_CONFIGURED_SECTION_START}}; use issue ID or --prompt for freeform tasks{{REPO_CONFIGURED_SECTION_END}}{{REPO_NOT_CONFIGURED_SECTION_START}} with --prompt for freeform tasks{{REPO_NOT_CONFIGURED_SECTION_END}}\n {{REPO_CONFIGURED_SECTION_START}}- `ao batch-spawn <issues...>`: Spawn multiple sessions in parallel (project auto-detected)\n {{REPO_CONFIGURED_SECTION_END}}- `ao session ls [-p project]`: List all sessions (optionally filter by project)\n {{REPO_CONFIGURED_SECTION_START}}- `ao session claim-pr <pr> [session]`: Attach an existing PR to a worker session\n {{REPO_CONFIGURED_SECTION_END}}- `ao session attach <session>`: Attach to a session\'s terminal (a tmux window on Unix; a ConPTY pty-host on Windows)\n- `ao session kill <session>`: Kill a specific session\n- `ao session cleanup [-p project]`: Kill cleanup-eligible sessions (closed work or dead runtimes)\n- `ao send <session> <message>`: Send a message to a running session\n- `ao send --no-wait <session> <message>`: Send without waiting for session to become idle\n- `ao dashboard`: Start the web dashboard (http://localhost:{{dashboardPort}})\n- `ao open <project>`: Open all project sessions in terminal tabs\n\n## Session Management\n\n### Spawning Sessions\n\nWhen you spawn a session:\n\n1. A git worktree is created from `{{projectDefaultBranch}}`\n2. A feature branch is created (e.g., `feat/INT-1234` for issues, `session/<id>` for prompt-driven)\n3. A runtime session is started (e.g., `{{projectSessionPrefix}}-1`) — tmux session on Unix, ConPTY pty-host on Windows\n4. The agent is launched with context about the issue or prompt\n5. Metadata is written to the project-specific sessions directory\n\nA tracker issue is **not required**. Use `--prompt` to spawn freeform sessions:\n\n```bash\nao spawn --prompt "Add rate limiting to the /api/upload endpoint"\n```\n\n### Monitoring Progress\n\nUse `ao status` to see:\n\n- Current session status (working, pr_open, review_pending, etc.)\n {{REPO_CONFIGURED_SECTION_START}}- PR state (open/merged/closed)\n- CI status (passing/failing/pending)\n- Review decision (approved/changes_requested/pending)\n- Unresolved comments count\n {{REPO_CONFIGURED_SECTION_END}}\n\nTo inspect what each worker has self-reported, pass `--reports`:\n\n```bash\nao status --reports 5 # last 5 report entries per session\nao status --reports full # full audit trail per session\n```\n\nReach for this when an inferred status disagrees with what the worker said, when deciding whether to send a follow-up instruction vs. wait, or when triaging a session that looks stuck.\n\n### Explicit Agent Reports\n\nWorker agents self-declare their workflow phase using `ao acknowledge` and `ao report <state>` (started, working, waiting, needs-input, fixing-ci, addressing-reviews, pr-created, draft-pr-created, ready-for-review, completed). These reports are persisted alongside the canonical lifecycle and may inform lifecycle inference, but do not replace runtime/activity/SCM-derived truth.\n\n- Never run `ao acknowledge` or `ao report` from the orchestrator session - they are worker-only commands. Read the audit trail with `ao status --reports` instead.\n- Fresh reports (<5 min) are useful hints when inference is weak, but runtime death, activity-based waiting_input, and SCM truth (merged/closed PR, CI failure, review decisions) still take precedence.\n- Use `--pr-url` / `--pr-number` on PR workflow reports when the agent knows them; merged/closed remain SCM-owned.\n- If an agent reports `waiting` but a PR actually merged, trust the PR state and follow up.\n\n### Sending Messages\n\nSend instructions to a running agent:\n\n```bash\nao send {{projectSessionPrefix}}-1 "Please address the review comments on your PR"\n```\n\n{{REPO_CONFIGURED_SECTION_START}}### PR Takeover\n\nIf a worker session needs to continue work on an existing PR:\n\n```bash\nao session claim-pr 123 {{projectSessionPrefix}}-1\n# or do it at spawn time\nao spawn --claim-pr 123\n```\n\nThis updates AO metadata, switches the worker worktree onto the PR branch, and lets lifecycle reactions keep routing CI and review feedback to that worker session.\n\nNever claim a PR into `{{projectSessionPrefix}}-orchestrator`. If a PR needs implementation or takeover, delegate it to a worker session instead.\n{{REPO_CONFIGURED_SECTION_END}}\n\n### Investigation Workflow\n\nWhen debugging or triaging from the orchestrator session:\n\n1. Inspect with read-only commands such as `ao status`, `ao session ls`, `ao session attach`, and SCM/tracker lookups.\n2. Decide whether a worker already owns the work or a new worker is needed.\n3. Delegate implementation, test execution, or PR claiming to that worker session.\n4. Return to monitoring and coordination once the worker has the task.\n\n### Cleanup\n\nRemove completed sessions:\n\n```bash\nao session cleanup -p {{projectId}} # Kill sessions whose work closed or runtime has exited\n```\n\n## Dashboard\n\nThe web dashboard runs at **http://localhost:{{dashboardPort}}**.\n\nFeatures:\n\n- Live session cards with activity status\n- PR table with CI checks and review state\n- Attention zones (merge ready, needs response, working, done)\n- One-click actions (send message, kill, merge PR)\n- Real-time updates via Server-Sent Events\n\n{{AUTOMATED_REACTIONS_SECTION_START}}\n\n## Automated Reactions\n\nThe system automatically handles these events:\n\n{{automatedReactionsSection}}\n{{AUTOMATED_REACTIONS_SECTION_END}}\n\n## Common Workflows\n\n{{REPO_CONFIGURED_SECTION_START}}### Bulk Issue Processing\n\n1. Get list of issues from tracker (GitHub/Linear/etc.)\n2. Use `ao batch-spawn` to spawn sessions for each issue\n3. Monitor with `ao status` or the dashboard\n4. Agents will fetch, implement, test, PR, and respond to reviews\n5. Use `ao session cleanup` when work is truly finished or the runtime is gone\n\n{{REPO_CONFIGURED_SECTION_END}}### Handling Stuck Agents\n\n1. Check `ao status` for sessions in "stuck" or "needs_input" state\n2. Attach with `ao session attach <session>` to see what they\'re doing\n3. Send clarification or instructions with `ao send <session> \'...\'`\n4. Or kill and respawn with fresh context if needed\n\n{{REPO_CONFIGURED_SECTION_START}}### PR Review Flow\n\n1. Agent creates PR and pushes\n2. CI runs automatically\n3. If CI fails: reaction auto-sends fix instructions to agent\n4. If reviewers request changes: reaction auto-sends comments to agent\n5. When approved + green: notify human to merge (unless auto-merge enabled)\n\n{{REPO_CONFIGURED_SECTION_END}}### Manual Intervention\n\nWhen an agent needs human judgment:\n\n1. You\'ll get a notification (desktop/slack/webhook)\n2. Check the dashboard or `ao status` for details\n3. Attach to the session if needed: `ao session attach <session>`\n4. Send instructions: `ao send <session> \'...\'`\n5. Or handle the human-only action yourself{{REPO_CONFIGURED_SECTION_START}} (merge PR, close issue, etc.){{REPO_CONFIGURED_SECTION_END}} while keeping implementation in worker sessions.\n\n## Tips\n\n1. **Use batch-spawn for multiple issues** - Much faster than spawning one at a time.\n\n2. **Check status before spawning** - Avoid creating duplicate sessions for issues already being worked on.\n\n3. **Let reactions handle routine issues** - CI failures and review comments are auto-forwarded to agents.\n\n4. **Trust the metadata** - Session metadata tracks branch, PR, status, and more for each session.\n\n5. **Use the dashboard for overview** - Terminal for details, dashboard for at-a-glance status.\n\n6. **Cleanup regularly** - `ao session cleanup` removes sessions that are truly cleanup-eligible and keeps things tidy.\n\n7. **Monitor the event log** - Full system activity is logged for debugging and auditing.\n\n8. **Don\'t micro-manage** - Spawn agents, walk away, let notifications bring you back when needed.\n\n{{PROJECT_SPECIFIC_RULES_SECTION_START}}\n\n## Project-Specific Rules\n\n{{projectSpecificRulesSection}}\n{{PROJECT_SPECIFIC_RULES_SECTION_END}}\n'.trim(),b),b).trim()}function c4(a){return(0,g.join)(a,".ao","activity.jsonl")}async function c5(a,b,c,d){let e=c4(a);await (0,bl.mkdir)((0,g.dirname)(e),{recursive:!0});let f={ts:new Date().toISOString(),state:b,source:c,...void 0!==d&&("waiting_input"===b||"blocked"===b)&&{trigger:d}};await (0,bl.appendFile)(e,JSON.stringify(f)+"\n","utf-8")}async function c6(a){let b=c4(a);try{let{open:a}=await Promise.resolve().then(c.t.bind(c,51455,19)),d=await a(b,"r");try{let a=await d.stat();if(0===a.size)return null;let b=Math.min(a.size,4096),c=Math.max(0,a.size-b),e=Buffer.alloc(b),{bytesRead:f}=await d.read(e,0,b,c);if(0===f)return null;let g=e.subarray(0,f).toString("utf-8").split("\n").filter(a=>a.trim());if(c>0&&g.length>1&&(g=g.slice(1)),0===g.length)return null;let h=null;for(let a=g.length-1;a>=0;a--)try{h=JSON.parse(g[a]);break}catch{continue}if(null===h||"object"!=typeof h||null===h||Array.isArray(h))return null;let i=h,j=new Set(["active","ready","idle","waiting_input","blocked","exited"]),k=new Set(["terminal","native"]);if("string"!=typeof i.ts||"string"!=typeof i.state||"string"!=typeof i.source||!j.has(i.state)||!k.has(i.source))return null;return{entry:{ts:i.ts,state:i.state,source:i.source,..."string"==typeof i.trigger&&{trigger:i.trigger}},modifiedAt:a.mtime}}finally{await d.close()}}catch{return null}}function c7(a){if(!a)return null;let{entry:b}=a;if("waiting_input"===b.state||"blocked"===b.state){let a=new Date(b.ts);if(Number.isNaN(a.getTime()))return null;if(Date.now()-a.getTime()<=3e5)return{state:b.state,timestamp:a}}return null}function c8(a,b,c){let d;if(!a)return null;let{entry:e}=a,f=new Date(e.ts);if(Number.isNaN(f.getTime()))return null;if("waiting_input"===e.state||"blocked"===e.state)return Date.now()-f.getTime()<=3e5?{state:e.state,timestamp:f}:{state:"idle",timestamp:f};let g=Math.max(0,Date.now()-f.getTime());d=g<=b?"active":g<=c?"ready":"idle";let h={active:0,ready:1,idle:2},i=h[e.state]??2;return{state:(h[d]??2)>=i?d:e.state,timestamp:f}}async function c9(a,b,c){let{state:d,trigger:e}=function(a,b){let c=b(a),d="waiting_input"===c||"blocked"===c?a.trim().split("\n").slice(-3).join("\n"):void 0;return{state:c,trigger:d}}(b,c);if("waiting_input"!==d&&"blocked"!==d){let b=await c6(a);if(b&&b.entry.state===d&&Date.now()-b.modifiedAt.getTime()<2e4)return}await c5(a,d,"terminal",e)}let da=(0,t.promisify)(s.execFile);async function db(a,b=60){try{let{stdout:c}=await da("git",["log",`--since=${b} seconds ago`,"--format=%H"],{cwd:a,timeout:5e3});return c.trim().length>0}catch{return!1}}let dc=(0,t.promisify)(s.execFile),dd=null;async function de(){if(dd)return dd;let a=await df();return dd=a,a}async function df(){let a=(0,g.join)((0,h.homedir)(),".ao","bin"),b=(process.env.PATH??"").split(g.delimiter).filter(b=>b&&b!==a),c="win32"===process.platform?(process.env.PATHEXT?.split(";").filter(Boolean)??[".EXE",".CMD",".BAT"]).map(a=>a.toLowerCase()):[""];for(let a of b)for(let b of c){let c=(0,g.join)(a,`gh${b}`);try{return await (0,bl.access)(c,e.constants.X_OK),c}catch{}}throw Error("gh CLI not found outside ~/.ao/bin. Install gh or set GH_PATH to the real binary.")}function dg(a){if(!a)return;let b=a.trim();if(!b)return;let c=Number.parseInt(b,10);return Number.isFinite(c)?c:void 0}let dh=new Set,di=new Set;async function dj(a){let b=process.env.AO_GH_TRACE_FILE;if(!b)return;let c=(0,g.dirname)(b),d=`${JSON.stringify(a)}
|
|
884
|
+
`;try{dh.has(c)||(await (0,bl.mkdir)(c,{recursive:!0}),dh.add(c)),await (0,bl.appendFile)(b,d,"utf-8")}catch(a){if(!di.has(b)){di.add(b);let c=a instanceof Error?a.message:String(a);console.warn(`[gh-trace] Failed to write trace to ${b}: ${c}`)}}}function dk(a,b,c,d){let{statusLine:e,headers:f}=function(a){let b={},c=a.replace(/\r/g,"").split("\n"),d=-1;for(let a=c.length-1;a>=0;a--)if(c[a]?.startsWith("HTTP/")){d=a;break}if(-1===d)return{headers:b};let e=c[d];for(let a=d+1;a<c.length;a++){let d=c[a];if(!d)break;let e=d.indexOf(":");if(-1===e)continue;let f=d.slice(0,e).trim().toLowerCase(),g=d.slice(e+1).trim();b[f]=g}return{statusLine:e,headers:b}}(c.stdout??""),g=e?Number.parseInt(e.replace(/^HTTP\/[0-9.]+\s+/,"").split(" ")[0]??"",10):void 0;return{timestamp:new Date().toISOString(),component:b.component,operation:b.operation??function(a){if(0===a.length)return"gh";if(1===a.length)return`gh.${a[0]}`;for(let b=1;b<a.length;b++){let c=a[b];if(!c||c.startsWith("-")){("--method"===c||"-X"===c||"-H"===c||"--header"===c||"-f"===c||"--raw-field"===c||"-F"===c||"--field"===c||"--input"===c||"-t"===c||"--template"===c)&&b++;continue}let d=c.split("/")[0].split("?")[0];return`gh.${a[0]}.${d}`}return`gh.${a[0]}`}(a),projectId:b.projectId,sessionId:b.sessionId,cwd:b.cwd,args:function(a){let b=new Set(["-H","--header"]),c=["token=","password=","secret=","authorization="];return a.map((d,e)=>{let f=e>0?a[e-1]:void 0;if(f&&b.has(f)&&/^authorization:/i.test(d))return"Authorization: [REDACTED]";if(/^-H/i.test(d)&&/authorization:/i.test(d))return"-HAuthorization: [REDACTED]";for(let a of c)if(d.toLowerCase().startsWith(a))return`${d.slice(0,a.length)}[REDACTED]`;if(f&&("-f"===f||"--raw-field"===f||"-F"===f||"--field"===f)){for(let a of c)if(d.toLowerCase().startsWith(a))return`${d.slice(0,a.length)}[REDACTED]`}return d})}(a),endpoint:function(a){if("api"===a[0])for(let b=1;b<a.length;b++){let c=a[b];if(c){if("--method"===c||"-X"===c||"-H"===c||"--header"===c||"-f"===c||"--raw-field"===c||"-F"===c||"--field"===c||"--input"===c){b++;continue}if(!c.startsWith("-"))return c}}}(a),method:function(a){for(let b=0;b<a.length;b++)if("--method"===a[b]||"-X"===a[b])return a[b+1];return"api"===a[0]?"GET":void 0}(a),ok:c.ok,exitCode:c.exitCode,signal:c.signal,durationMs:d,stdoutBytes:Buffer.byteLength(c.stdout??"","utf-8"),stderrBytes:Buffer.byteLength(c.stderr??"","utf-8"),statusLine:e,httpStatus:Number.isFinite(g)?g:void 0,etag:f.etag,rateLimitLimit:dg(f["x-ratelimit-limit"]),rateLimitRemaining:dg(f["x-ratelimit-remaining"]),rateLimitReset:dg(f["x-ratelimit-reset"]),rateLimitResource:f["x-ratelimit-resource"],...function(a,b){if(!b.includes("graphql")||!a.includes('"rateLimit"'))return{};let c=a.match(/\r?\n\r?\n([\s\S]*)$/),d=c?c[1]:a;try{let a=JSON.parse(d.trim()),b=a?.data?.rateLimit;if(!b)return{};return{graphqlCost:"number"==typeof b.cost?b.cost:void 0,graphqlRemaining:"number"==typeof b.remaining?b.remaining:void 0,graphqlResetAt:"string"==typeof b.resetAt?b.resetAt:void 0}}catch{return{}}}(c.stdout??"",a)}}async function dl(a,b,c=3e4){let d=Date.now();try{let e=await de(),{stdout:f,stderr:g}=await dc(e,a,{...b.cwd?{cwd:b.cwd}:{},maxBuffer:0xa00000,timeout:c}),h=dk(a,b,{ok:!0,stdout:f,stderr:g},Date.now()-d);return await dj(h),f.trim()}catch(e){let c=dk(a,b,{ok:!1,stdout:"string"==typeof e.stdout?e.stdout:"",stderr:"string"==typeof e.stderr?e.stderr:"",exitCode:"number"==typeof e.exitCode?e.exitCode:"number"==typeof e.code?e.code:void 0,signal:"string"==typeof e.signal?e.signal:void 0},Date.now()-d);throw await dj(c),e}}let dm={BUG_REPORT:"bug_report",IMPROVEMENT_SUGGESTION:"improvement_suggestion"},dn=k.Yj().transform(a=>a.trim().replace(/\s+/g," ")).pipe(k.Yj().min(1));function dp(a,b){let c=dq(a),d=dq(b);for(let a=0;a<3;a++){let b=c.parts[a]??0,e=d.parts[a]??0;if(Number.isNaN(b)||Number.isNaN(e))return!1;if(b<e)return!0;if(b>e)return!1}return(!!c.prerelease||!!d.prerelease)&&(!!c.prerelease&&!d.prerelease||(!!c.prerelease||!d.prerelease)&&0>function(a,b){let c=a.split("."),d=b.split("."),e=Math.max(c.length,d.length);for(let a=0;a<e;a++){let b=c[a],e=d[a];if(void 0===b)return -1;if(void 0===e)return 1;let f=/^\d+$/.test(b),g=/^\d+$/.test(e);if(f&&g){let a=Number(b),c=Number(e);if(a!==c)return a<c?-1:1}else if(f!==g)return f?-1:1;else if(b!==e)return -1}return 0}(c.prerelease??"",d.prerelease??""))}function dq(a){let[b,...c]=a.split("-"),d=c.length>0?c.join("-"):void 0;return{parts:(b??"").split(".").map(Number),prerelease:d}}function dr(){let a=function(){let a=process.env.XDG_CACHE_HOME||(0,g.join)((0,h.homedir)(),".cache");return(0,g.join)(a,"ao","update-check.json")}();if(!(0,e.existsSync)(a))return null;try{let b=(0,e.readFileSync)(a,"utf-8");return JSON.parse(b)}catch{return null}}function ds(){let a=(0,by.createRequire)((0,aD.fileURLToPath)("file:///tmp/ao-publish-work/packages/core/dist/update-cache.js"));for(let b of["@aoagents/ao/package.json","@aoagents/ao-web/package.json"])try{let c=a(b);if("string"==typeof c.version)return c.version}catch{}return"0.0.0"}function dt(a){let b=T();if(!b?.projects[a])return;let{[a]:c,...d}=b.projects;if(b.projects=d,b.projectOrder){let c=b.projectOrder.filter(b=>b!==a);b.projectOrder=c.length>0?c:void 0}U(b)}function du(){return(0,g.join)((0,h.homedir)(),".agent-orchestrator","windows-pty-hosts.json")}function dv(){let a=du();if(!(0,e.existsSync)(a))return[];try{let b=JSON.parse((0,e.readFileSync)(a,"utf-8"));if(!Array.isArray(b))return[];return b.filter(a=>"object"==typeof a&&null!==a&&"string"==typeof a.sessionId&&"number"==typeof a.ptyHostPid&&"string"==typeof a.pipePath)}catch{return[]}}function dw(a){let b=du();if(0===a.length){try{(0,e.unlinkSync)(b)}catch{}return}C(b,JSON.stringify(a,null,2))}function dx(a){let b=dv().filter(b=>b.sessionId!==a.sessionId);b.push({...a,registeredAt:new Date().toISOString()}),dw(b)}function dy(a){let b=dv(),c=b.filter(b=>b.sessionId!==a);c.length!==b.length&&dw(c)}function dz(){let a=dv(),b=a.filter(a=>(function(a){try{return process.kill(a,0),!0}catch(a){return"EPERM"===a.code}})(a.ptyHostPid));return b.length!==a.length&&dw(b),b}k.Ik({title:dn,body:dn,evidence:k.YO(dn).min(1),session:dn,source:dn,confidence:k.ai().finite().min(0).max(1)}).strict(),dm.BUG_REPORT,dm.IMPROVEMENT_SUGGESTION,k.Yj().regex(/^report_[A-Za-z0-9_-]+$/),k.Yj().datetime({offset:!0}),k.Yj().regex(/^[a-f0-9]{16}$/)},90337:()=>{}};
|