@aoagents/ao-web 0.4.0 → 0.6.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 +141 -141
- package/.next/app-path-routes-manifest.json +6 -6
- package/.next/build-manifest.json +6 -6
- package/.next/prerender-manifest.json +31 -31
- package/.next/react-loadable-manifest.json +3 -3
- 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 +7 -7
- 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 +1 -1
- 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/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/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 +4 -4
- 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 +8 -8
- 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.js.nft.json +1 -1
- 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 +8 -8
- package/.next/server/app-paths-manifest.json +6 -6
- package/.next/server/chunks/1172.js +1 -1
- package/.next/server/chunks/1271.js +1 -1
- package/.next/server/chunks/1876.js +2 -2
- package/.next/server/chunks/4520.js +1 -1
- package/.next/server/chunks/6811.js +3 -0
- package/.next/server/chunks/7167.js +1 -1
- package/.next/server/chunks/7173.js +1 -1
- package/.next/server/chunks/801.js +658 -0
- package/.next/server/chunks/9223.js +11 -11
- package/.next/server/middleware-build-manifest.js +1 -1
- package/.next/server/middleware-react-loadable-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/{1383.faf35b62c555f5a1.js → 1383.8f5f7d4606d356cc.js} +1 -1
- package/.next/static/chunks/3764.88619fb0d047cae8.js +1 -0
- package/.next/static/chunks/{3780-e20898ff49ddc867.js → 3780-52c4733ce6591b8d.js} +1 -1
- package/.next/static/chunks/{4465-0c7772f1499dffa4.js → 4465-17154f7a01abfe85.js} +1 -1
- package/.next/static/chunks/app/dev/terminal-test/page-59decd1aad4e02ad.js +1 -0
- package/.next/static/chunks/app/{error-3ebcf3275d91d60a.js → error-684a1c5596fa1e14.js} +1 -1
- package/.next/static/chunks/app/global-error-1a79bacfbd9b1ba4.js +1 -0
- package/.next/static/chunks/app/layout-0cda720d75f111b8.js +1 -0
- package/.next/static/chunks/app/not-found-315f4e5c106b425d.js +1 -0
- package/.next/static/chunks/app/orchestrators/page-e3a2c53b57dd8391.js +1 -0
- package/.next/static/chunks/app/page-e2e589ea11a0780a.js +1 -0
- package/.next/static/chunks/app/projects/[projectId]/page-19a6d4cc9951a9e4.js +1 -0
- package/.next/static/chunks/app/projects/[projectId]/sessions/[id]/page-75c536c9755754f7.js +1 -0
- package/.next/static/chunks/app/projects/[projectId]/settings/{page-ce2e904def1bef9c.js → page-f8c323b91978efff.js} +1 -1
- package/.next/static/chunks/app/prs/page-08f17d7dc341b6f1.js +1 -0
- package/.next/static/chunks/app/sessions/[id]/{error-5468aace23fd8872.js → error-62e9972b39d9cd16.js} +1 -1
- package/.next/static/chunks/app/sessions/[id]/not-found-315f4e5c106b425d.js +1 -0
- package/.next/static/chunks/app/sessions/[id]/page-d0b08722dec5a04a.js +1 -0
- package/.next/static/chunks/app/test-direct/{page-ab98dc9b04bacaa5.js → page-ee0944bcd355194e.js} +1 -1
- package/.next/static/chunks/main-app-b95f197c38e3b0a3.js +1 -0
- package/.next/static/chunks/{webpack-ab12779265bdb8f9.js → webpack-83d2d8248a30259c.js} +1 -1
- package/.next/static/css/cf9226160e230bf4.css +1 -0
- package/dist-server/mux-websocket.js +49 -7
- package/package.json +12 -12
- package/.next/server/chunks/8539.js +0 -3
- package/.next/server/chunks/9381.js +0 -658
- package/.next/static/chunks/3764.ba81c7b8d5b21136.js +0 -1
- package/.next/static/chunks/app/dev/terminal-test/page-095511c7a110fbc9.js +0 -1
- package/.next/static/chunks/app/global-error-8f082029a4cf6af1.js +0 -1
- package/.next/static/chunks/app/layout-be776dec5531d47b.js +0 -1
- package/.next/static/chunks/app/not-found-0eb78483b8277b8d.js +0 -1
- package/.next/static/chunks/app/orchestrators/page-406e530b0d4ad46f.js +0 -1
- package/.next/static/chunks/app/page-a92f3646b54545b0.js +0 -1
- package/.next/static/chunks/app/projects/[projectId]/page-d14fdcff4998d3bf.js +0 -1
- package/.next/static/chunks/app/projects/[projectId]/sessions/[id]/page-96fc04db76c65761.js +0 -1
- package/.next/static/chunks/app/prs/page-95dbbebb4d372535.js +0 -1
- package/.next/static/chunks/app/sessions/[id]/not-found-0eb78483b8277b8d.js +0 -1
- package/.next/static/chunks/app/sessions/[id]/page-8ef744531757185e.js +0 -1
- package/.next/static/chunks/main-app-4b27cdf1baf203ad.js +0 -1
- package/.next/static/css/397ea3e60645d3f3.css +0 -1
- /package/.next/static/{5nmlY5IOwz-Od3p2SB2hh → h0RXs0prE87a8wlbEXQKM}/_buildManifest.js +0 -0
- /package/.next/static/{5nmlY5IOwz-Od3p2SB2hh → h0RXs0prE87a8wlbEXQKM}/_ssgManifest.js +0 -0
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
"use strict";exports.id=9223,exports.ids=[9223],exports.modules={89223:(a,b,c)=>{c.d(b,{ix:()=>bC,wp:()=>bE,Z1:()=>bs,uj:()=>bD,g8:()=>bt,Az:()=>bx});var d=c(
|
|
2
|
-
${l}`);try{if(l.length>200){let a=function(a){let b=(0,k.join)((0,j.tmpdir)(),`ao-launch-${(0,h.randomUUID)()}.sh`),c=`#!/usr/bin/env bash
|
|
1
|
+
"use strict";exports.id=9223,exports.ids=[9223],exports.modules={89223:(a,b,c)=>{c.d(b,{ix:()=>bC,wp:()=>bE,Z1:()=>bs,uj:()=>bD,g8:()=>bt,Az:()=>bx});var d=c(35217),e=c(31421),f=c(57975),g=c(58500),h=c(77598),i=c(73024),j=c(48161),k=c(76760);let l=(0,f.promisify)(e.execFile),m=/^[a-zA-Z0-9_-]+$/;async function n(...a){let{stdout:b}=await l("tmux",a,{timeout:5e3});return b.trimEnd()}let o={manifest:{name:"tmux",slot:"runtime",description:"Runtime plugin: tmux sessions",version:"0.1.0"},create:function(){return{name:"tmux",async create(a){var b=a.sessionId;if(!m.test(b))throw Error(`Invalid session ID "${b}": must match ${m}`);let c=a.sessionId,e=[];for(let[b,c]of Object.entries(a.environment??{}))e.push("-e",`${b}=${c}`);await n("new-session","-d","-s",c,"-c",a.workspacePath,...e);let f=a.environment?.PATH,l=a.launchCommand;f&&(l=`export PATH=$(printf '%s' ${JSON.stringify(f)})
|
|
2
|
+
${l}`);try{if(await n("set-option","-t",c,"status","off"),l.length>200){let a=function(a){let b=(0,k.join)((0,j.tmpdir)(),`ao-launch-${(0,h.randomUUID)()}.sh`),c=`#!/usr/bin/env bash
|
|
3
3
|
rm -- "$0" 2>/dev/null || true
|
|
4
4
|
${a}
|
|
5
|
-
`;return(0,i.writeFileSync)(b,c,{encoding:"utf-8",mode:448}),`bash ${(0,d.kct)(b)}`}(l);await n("send-keys","-t",c,"-l",a),await (0,g.setTimeout)(300),await n("send-keys","-t",c,"Enter")}else await n("send-keys","-t",c,l,"Enter")}catch(b){try{await n("kill-session","-t",c)}catch{}let a=b instanceof Error?b.message:String(b);throw Error(`Failed to
|
|
5
|
+
`;return(0,i.writeFileSync)(b,c,{encoding:"utf-8",mode:448}),`bash ${(0,d.kct)(b)}`}(l);await n("send-keys","-t",c,"-l",a),await (0,g.setTimeout)(300),await n("send-keys","-t",c,"Enter")}else await n("send-keys","-t",c,l,"Enter")}catch(b){try{await n("kill-session","-t",c)}catch{}let a=b instanceof Error?b.message:String(b);throw Error(`Failed to configure or launch session "${c}": ${a}`,{cause:b})}return{id:c,runtimeName:"tmux",data:{createdAt:Date.now(),workspacePath:a.workspacePath}}},async destroy(a){try{await n("kill-session","-t",a.id)}catch{}},async sendMessage(a,b){if(await n("send-keys","-t",a.id,"C-u"),b.includes("\n")||b.length>200){let c=`ao-${(0,h.randomUUID)()}`,d=(0,k.join)((0,j.tmpdir)(),`ao-send-${(0,h.randomUUID)()}.txt`);(0,i.writeFileSync)(d,b,{encoding:"utf-8",mode:384});try{await n("load-buffer","-b",c,d),await n("paste-buffer","-b",c,"-t",a.id,"-d")}finally{try{(0,i.unlinkSync)(d)}catch{}try{await n("delete-buffer","-b",c)}catch{}}}else await n("send-keys","-t",a.id,"-l",b);await (0,g.setTimeout)(300),await n("send-keys","-t",a.id,"Enter")},async getOutput(a,b=50){try{return await n("capture-pane","-t",a.id,"-p","-S",`-${b}`)}catch{return""}},async isAlive(a){try{return await n("has-session","-t",a.id),!0}catch{return!1}},async getMetrics(a){let b=a.data.createdAt??Date.now();return{uptimeMs:Date.now()-b}},getAttachInfo:async a=>({type:"tmux",target:a.id,command:`tmux attach -t ${a.id}`}),async preflight(){try{await l("tmux",["-V"],{timeout:5e3})}catch{let a="darwin"===process.platform?"brew install tmux":"win32"===process.platform?"tmux is not available on Windows. Use WSL: wsl --install, then: sudo apt install tmux":"sudo apt install tmux (Debian/Ubuntu) or sudo dnf install tmux (Fedora)";throw Error(`tmux is not installed. Install it: ${a}`)}}}}};var p=c(51455);let q=(0,f.promisify)(e.execFile),r=`#!/usr/bin/env bash
|
|
6
6
|
# Metadata Updater Hook for Agent Orchestrator
|
|
7
7
|
#
|
|
8
8
|
# This PostToolUse hook automatically updates session metadata when:
|
|
@@ -180,7 +180,7 @@ fi
|
|
|
180
180
|
# No matching command, exit silently
|
|
181
181
|
echo '{}'
|
|
182
182
|
exit 0
|
|
183
|
-
`;function s(a){return a.replace(/\\/g,"/").replace(/:/g,"").replace(/[^a-zA-Z0-9-]/g,"-")}async function t(a){let b;try{b=await (0,p.readdir)(a)}catch{return null}let c=b.filter(a=>a.endsWith(".jsonl")&&!a.startsWith("agent-"));if(0===c.length)return null;let d=await Promise.all(c.map(async b=>{let c=(0,k.join)(a,b);try{let a=await (0,p.stat)(c);return{path:c,mtime:a.mtimeMs}}catch{return{path:c,mtime:0}}}));return d.sort((a,b)=>b.mtime-a.mtime),d[0]?.path??null}async function u(a,b=131072){let c,d;try{let{size:e=0}=await (0,p.stat)(a);if(d=Math.max(0,e-b),0===d)c=await (0,p.readFile)(a,"utf-8");else{let b=await (0,p.open)(a,"r");try{let a=e-d,f=Buffer.allocUnsafe(a);await b.read(f,0,a,d),c=f.toString("utf-8")}finally{await b.close()}}}catch{return[]}let e=c.indexOf("\n"),f=d>0&&e>=0?c.slice(e+1):c,g=[];for(let a of f.split("\n")){let b=a.trim();if(b)try{let a=JSON.parse(b);"object"!=typeof a||null===a||Array.isArray(a)||g.push(a)}catch{}}return g}let v=null;async function w(){let a=Date.now();if(v&&a-v.timestamp<5e3)return v.promise?v.promise:v.output;let b=q("ps",["-eo","pid,tty,args"],{timeout:5e3}).then(({stdout:a})=>(v?.promise===b&&(v={output:a,timestamp:Date.now()}),a));v={output:"",timestamp:a,promise:b};try{return await b}catch{return v?.promise===b&&(v=null),""}}async function x(a){try{if("tmux"===a.runtimeName&&a.id){let{stdout:b}=await q("tmux",["list-panes","-t",a.id,"-F","#{pane_tty}"],{timeout:5e3}),c=b.trim().split("\n").map(a=>a.trim()).filter(Boolean);if(0===c.length)return null;let d=await w();if(!d)return null;let e=new Set(c.map(a=>a.replace(/^\/dev\//,""))),f=/(?:^|\/)claude(?:\s|$)/;for(let a of d.split("\n")){let b=a.trimStart().split(/\s+/);if(b.length<3||!e.has(b[1]??""))continue;let c=b.slice(2).join(" ");if(f.test(c))return parseInt(b[0]??"0",10)}return null}let b=a.data.pid,c="number"==typeof b?b:Number(b);if(Number.isFinite(c)&&c>0)try{return process.kill(c,0),c}catch(a){if(a instanceof Error&&"code"in a&&"EPERM"===a.code)return c}return null}catch{return null}}async function y(a,b){let c=(0,k.join)(a,".claude"),d=(0,k.join)(c,"settings.json"),e=(0,k.join)(c,"metadata-updater.sh");try{await (0,p.mkdir)(c,{recursive:!0})}catch{}await (0,p.writeFile)(e,r,"utf-8"),await (0,p.chmod)(e,493);let f={};if((0,i.existsSync)(d))try{let a=await (0,p.readFile)(d,"utf-8");f=JSON.parse(a)}catch{}let g=f.hooks??{},h=g.PostToolUse??[],j=-1,l=-1;for(let a=0;a<h.length;a++){let b=h[a];if("object"!=typeof b||null===b||Array.isArray(b))continue;let c=b.hooks;if(Array.isArray(c)){for(let b=0;b<c.length;b++){let d=c[b];if(!("object"!=typeof d||null===d||Array.isArray(d))&&"string"==typeof d.command&&d.command.includes("metadata-updater.sh")){j=a,l=b;break}}if(j>=0)break}}-1===j?h.push({matcher:"Bash",hooks:[{type:"command",command:b,timeout:5e3}]}):h[j].hooks[l].command=b,g.PostToolUse=h,f.hooks=g,await (0,p.writeFile)(d,JSON.stringify(f,null,2)+"\n","utf-8")}let z={manifest:{name:"claude-code",slot:"agent",description:"Agent plugin: Claude Code CLI",version:"0.1.0",displayName:"Claude Code"},create:function(){return{name:"claude-code",processName:"claude",promptDelivery:"post-launch",getLaunchCommand(a){let b=["claude"],c=(0,d.DD3)(a.permissions);return("permissionless"===c||"auto-edit"===c)&&b.push("--dangerously-skip-permissions"),a.model&&b.push("--model",(0,d.kct)(a.model)),a.systemPromptFile?b.push("--append-system-prompt",`"$(cat ${(0,d.kct)(a.systemPromptFile)})"`):a.systemPrompt&&b.push("--append-system-prompt",(0,d.kct)(a.systemPrompt)),b.join(" ")},getEnvironment(a){let b={};return b.CLAUDECODE="",b.AO_SESSION_ID=a.sessionId,a.issueId&&(b.AO_ISSUE_ID=a.issueId),b},detectActivity:a=>(function(a){if(!a.trim())return"idle";let b=a.trim().split("\n"),c=b[b.length-1]?.trim()??"";if(/^[❯>$#]\s*$/.test(c))return"idle";let d=b.slice(-5).join("\n");return/Do you want to proceed\?/i.test(d)||/\(Y\)es.*\(N\)o/i.test(d)||/bypass.*permissions/i.test(d)?"waiting_input":"active"})(a),isProcessRunning:async a=>null!==await x(a),async getActivityState(a,b){let c=b??d.PES,e=new Date;if(!a.runtimeHandle||!await this.isProcessRunning(a.runtimeHandle))return{state:"exited",timestamp:e};if(!a.workspacePath)return null;let f=s(a.workspacePath),g=(0,k.join)((0,j.homedir)(),".claude","projects",f),h=await t(g);if(!h)return{state:"idle",timestamp:a.createdAt};let i=await (0,d.XIc)(h);if(!i)return null;let l=Date.now()-i.modifiedAt.getTime(),m=i.modifiedAt,n=Math.min(d.V1$,c);switch(i.lastType){case"user":case"tool_use":case"progress":default:if(l<=n)return{state:"active",timestamp:m};return{state:l>c?"idle":"ready",timestamp:m};case"assistant":case"system":case"summary":case"result":return{state:l>c?"idle":"ready",timestamp:m};case"permission_request":return{state:"waiting_input",timestamp:m};case"error":return{state:"blocked",timestamp:m}}},async getSessionInfo(a){if(!a.workspacePath)return null;let b=s(a.workspacePath),c=(0,k.join)((0,j.homedir)(),".claude","projects",b),d=await t(c);if(!d)return null;let e=await u(d);if(0===e.length)return null;let f=(0,k.basename)(d,".jsonl"),g=function(a){for(let b=a.length-1;b>=0;b--){let c=a[b];if(c?.type==="summary"&&c.summary)return{summary:c.summary,isFallback:!1}}for(let b of a)if(b?.type==="user"&&b.message?.content&&"string"==typeof b.message.content){let a=b.message.content.trim();if(a.length>0)return{summary:a.length>120?a.substring(0,120)+"...":a,isFallback:!0}}return null}(e);return{summary:g?.summary??null,summaryIsFallback:g?.isFallback,agentSessionId:f,metadata:{claudeSessionUuid:f},cost:function(a){let b=0,c=0,d=0,e=0,f=0;for(let g of a)"number"==typeof g.costUSD?f+=g.costUSD:"number"==typeof g.estimatedCostUsd&&(f+=g.estimatedCostUsd),g.usage?(b+=g.usage.input_tokens??0,d+=g.usage.cache_read_input_tokens??0,e+=g.usage.cache_creation_input_tokens??0,c+=g.usage.output_tokens??0):("number"==typeof g.inputTokens&&(b+=g.inputTokens),"number"==typeof g.outputTokens&&(c+=g.outputTokens));if(0!==b||0!==c||0!==f||0!==d||0!==e)return 0===f&&(f=b/1e6*3+c/1e6*15+d/1e6*.3+e/1e6*3.75),{inputTokens:b+d+e,outputTokens:c,estimatedCostUsd:f}}(e)}},async getRestoreCommand(a,b){let c=a.metadata?.claudeSessionUuid?.trim();if(!c){if(!a.workspacePath)return null;let b=s(a.workspacePath),d=(0,k.join)((0,j.homedir)(),".claude","projects",b),e=await t(d);if(!e)return null;c=(0,k.basename)(e,".jsonl")}if(!c)return null;let e=["claude","--resume",(0,d.kct)(c)],f=(0,d.DD3)(b.agentConfig?.permissions);return("permissionless"===f||"auto-edit"===f)&&e.push("--dangerously-skip-permissions"),b.agentConfig?.model&&e.push("--model",(0,d.kct)(b.agentConfig.model)),e.join(" ")},async setupWorkspaceHooks(a,b){await y(a,".claude/metadata-updater.sh")},async postLaunchSetup(a){a.workspacePath&&await y(a.workspacePath,".claude/metadata-updater.sh")}}},detect:function(){try{return(0,e.execFileSync)("claude",["--version"],{stdio:"ignore"}),!0}catch{return!1}}};var A=c(46193),B=c(80481);c(78474).EventEmitter;let C=(0,f.promisify)(e.execFile),D=(0,k.join)((0,j.homedir)(),".codex","sessions");function E(a){return a.payload??a}async function F(a,b=0){let c;if(b>4)return[];try{c=await (0,p.readdir)(a)}catch{return[]}let d=[];for(let e of c){let c=(0,k.join)(a,e);if(e.endsWith(".jsonl"))d.push(c);else try{if((await (0,p.lstat)(c)).isDirectory()){let a=await F(c,b+1);d.push(...a)}}catch{}}return d}async function G(a,b){let c=await (0,p.open)(a,"r"),d=[],e="",f=new A.StringDecoder("utf8");try{for(;d.length<b;){let a=Buffer.allocUnsafe(8192),{bytesRead:g}=await c.read(a,0,a.length,null);if(0===g){let a=(e+=f.end()).trim();a&&d.push(a);break}let h=(e+=f.write(a.subarray(0,g))).indexOf("\n");for(;-1!==h&&d.length<b;){let a=e.slice(0,h).trim();a&&d.push(a),h=(e=e.slice(h+1)).indexOf("\n")}}}finally{await c.close()}return d}async function H(a,b){try{for(let c of(await G(a,10)))try{let a=JSON.parse(c);if("object"==typeof a&&null!==a&&!Array.isArray(a)){let c=E(a);if("session_meta"===a.type&&c.cwd===b)return!0}}catch{}}catch{}return!1}async function I(a){let b=await F(D);if(0===b.length)return null;let c=null;for(let d of b)if(await H(d,a))try{let a=await (0,p.stat)(d);(!c||a.mtimeMs>c.mtime)&&(c={path:d,mtime:a.mtimeMs})}catch{}return c?.path??null}async function J(a){try{let b={model:null,threadId:null,inputTokens:0,outputTokens:0,cachedTokens:0,reasoningTokens:0};for await(let c of(0,B.createInterface)({input:(0,i.createReadStream)(a,{encoding:"utf-8"}),crlfDelay:1/0})){let a=c.trim();if(a)try{let c=JSON.parse(a);if("object"!=typeof c||null===c||Array.isArray(c))continue;let d=E(c);"session_meta"===c.type&&("string"==typeof d.id&&d.id?b.threadId=d.id:"string"==typeof d.threadId&&d.threadId&&(b.threadId=d.threadId)),!b.threadId&&("string"==typeof d.threadId&&d.threadId?b.threadId=d.threadId:"string"==typeof c.threadId&&c.threadId&&(b.threadId=c.threadId)),"turn_context"===c.type&&"string"==typeof d.model&&d.model?b.model=d.model:!b.model&&"string"==typeof d.model&&d.model&&(b.model=d.model);let e=d.info?.total_token_usage;if("number"==typeof e?.input_tokens){b.inputTokens=e.input_tokens,b.outputTokens=e.output_tokens??0;continue}let f=d.info?.last_token_usage;if("number"==typeof f?.input_tokens){b.inputTokens+=f.input_tokens,b.outputTokens+=f.output_tokens??0;continue}if("number"==typeof d.input_tokens){b.inputTokens+=d.input_tokens,b.outputTokens+=d.output_tokens??0;continue}"event_msg"===c.type&&c.msg?.type==="token_count"&&(b.inputTokens+=c.msg.input_tokens??0,b.outputTokens+=c.msg.output_tokens??0,b.cachedTokens+=c.msg.cached_tokens??0,b.reasoningTokens+=c.msg.reasoning_tokens??0)}catch{}}return b}catch{return null}}async function K(){try{let{stdout:a}=await C("which",["codex"],{timeout:1e4}),b=a.trim();if(b)return b}catch{}let a=(0,j.homedir)();for(let b of["/usr/local/bin/codex","/opt/homebrew/bin/codex",(0,k.join)(a,".cargo","bin","codex"),(0,k.join)(a,".npm","bin","codex")])try{return await (0,p.stat)(b),b}catch{}return"codex"}function L(a,b,c=!0){let e=(0,d.DD3)(b);"permissionless"===e?c?a.push("--dangerously-bypass-approvals-and-sandbox"):a.push("--ask-for-approval","never"):"auto-edit"===e?a.push("--ask-for-approval","never"):"suggest"===e&&a.push("--ask-for-approval","untrusted")}function M(a,b){b&&(a.push("--model",(0,d.kct)(b)),/^o[34]/i.test(b)&&a.push("-c","model_reasoning_effort=high"))}function N(a){a.push("-c","check_for_update_on_startup=false")}let O=new Map;async function P(a){let b=O.get(a);if(b&&Date.now()<b.expiry)return b.path;let c=await I(a);return O.set(a,{path:c,expiry:Date.now()+3e4}),c}let Q={manifest:{name:"codex",slot:"agent",description:"Agent plugin: OpenAI Codex CLI",version:"0.1.1",displayName:"OpenAI Codex"},create:function(){let a,b;return a=null,b=null,{name:"codex",processName:"codex",getLaunchCommand(b){let c=a??"codex",e=[(0,d.kct)(c)];return N(e),L(e,b.permissions),M(e,b.model),b.systemPromptFile?e.push("-c",`model_instructions_file=${(0,d.kct)(b.systemPromptFile)}`):b.systemPrompt&&e.push("-c",`developer_instructions=${(0,d.kct)(b.systemPrompt)}`),b.prompt&&e.push("--",(0,d.kct)(b.prompt)),e.join(" ")},getEnvironment(a){let b={};return b.AO_SESSION_ID=a.sessionId,a.issueId&&(b.AO_ISSUE_ID=a.issueId),b.CODEX_DISABLE_UPDATE_CHECK="1",b},detectActivity(a){if(!a.trim())return"idle";let b=a.trim().split("\n"),c=b[b.length-1]?.trim()??"";if(/^[>$#]\s*$/.test(c))return"idle";let d=b.slice(-5).join("\n");return/approval required/i.test(d)||/\(y\)es.*\(n\)o/i.test(d)?"waiting_input":"active"},async getActivityState(a,b){let c=b??d.PES,e=new Date;if(!a.runtimeHandle||!await this.isProcessRunning(a.runtimeHandle))return{state:"exited",timestamp:e};if(!a.workspacePath)return null;let f=await P(a.workspacePath);if(f){let a=await (0,d.XIc)(f);if(a){let b=Date.now()-a.modifiedAt.getTime(),e=a.modifiedAt,f=a.payloadType??a.lastType,g=Math.min(d.V1$,c);switch(f){case"approval_request":case"exec_approval_request":case"apply_patch_approval_request":return{state:"waiting_input",timestamp:e};case"error":case"stream_error":return{state:"blocked",timestamp:e};case"task_started":case"agent_reasoning":case"response_item":case"turn_context":case"user_input":case"tool_call":case"exec_command":case"exec_command_begin":case"exec_command_end":default:if(b<=g)return{state:"active",timestamp:e};return{state:b>c?"idle":"ready",timestamp:e};case"task_complete":case"turn_aborted":case"agent_message":case"assistant_message":case"session_meta":case"event_msg":case"compacted":case"token_count":return{state:b>c?"idle":"ready",timestamp:e}}}}let g=await (0,d.Ahw)(a.workspacePath),h=(0,d.Bmx)(g);if(h)return h;let i=Math.min(d.V1$,c),j=(0,d.Vo2)(g,i,c);if(j)return j;if(f)try{let a=await (0,p.stat)(f),b=Date.now()-a.mtimeMs,e=Math.min(d.V1$,c);if(b<=e)return{state:"active",timestamp:a.mtime};if(b<=c)return{state:"ready",timestamp:a.mtime};return{state:"idle",timestamp:a.mtime}}catch{}return null},async recordActivity(a,b){a.workspacePath&&await (0,d.JyZ)(a.workspacePath,b,a=>this.detectActivity(a))},async isProcessRunning(a){try{if("tmux"===a.runtimeName&&a.id){let{stdout:b}=await C("tmux",["list-panes","-t",a.id,"-F","#{pane_tty}"],{timeout:3e4}),c=b.trim().split("\n").map(a=>a.trim()).filter(Boolean);if(0===c.length)return!1;let{stdout:d}=await C("ps",["-eo","pid,tty,args"],{timeout:3e4}),e=new Set(c.map(a=>a.replace(/^\/dev\//,""))),f=/(?:^|\/)codex(?:\s|$)/;for(let a of d.split("\n")){let b=a.trimStart().split(/\s+/);if(b.length<3||!e.has(b[1]??""))continue;let c=b.slice(2).join(" ");if(f.test(c))return!0}return!1}let b=a.data.pid,c="number"==typeof b?b:Number(b);if(Number.isFinite(c)&&c>0)try{return process.kill(c,0),!0}catch(a){if(a instanceof Error&&"code"in a&&"EPERM"===a.code)return!0}return!1}catch{return!1}},async getSessionInfo(a){let b;if(!a.workspacePath)return null;let c=await P(a.workspacePath);if(!c)return null;let d=await J(c);if(!d)return null;let e=(0,k.basename)(c,".jsonl"),f=d.inputTokens+d.cachedTokens;if(f>0||d.outputTokens>0||d.reasoningTokens>0){let a=d.inputTokens/1e6*2.5+d.cachedTokens/1e6*.625+(d.outputTokens+d.reasoningTokens)/1e6*10;b={inputTokens:f,outputTokens:d.outputTokens,estimatedCostUsd:a}}return{summary:d.model?`Codex session (${d.model})`:null,summaryIsFallback:!0,agentSessionId:e,metadata:d.threadId?{codexThreadId:d.threadId,...d.model?{codexModel:d.model}:{}}:void 0,cost:b}},async getRestoreCommand(b,c){let e=b.metadata?.codexThreadId?.trim(),f=b.metadata?.codexModel?.trim()||null;if(!e){if(!b.workspacePath)return null;let a=await P(b.workspacePath);if(!a)return null;let c=await J(a);if(!c?.threadId)return null;e=c.threadId,f=c.model}let g=a??"codex",h=[(0,d.kct)(g),"resume"];return N(h),L(h,c.agentConfig?.permissions),M(h,c.agentConfig?.model??f??void 0),h.push((0,d.kct)(e)),h.join(" ")},async setupWorkspaceHooks(a,b){},async postLaunchSetup(c){if(!a){b||(b=K());try{a=await b}finally{b=null}}}}},detect:function(){try{return(0,e.execFileSync)("codex",["--version"],{stdio:"ignore"}),!0}catch{return!1}}},R=(0,f.promisify)(e.execFile);async function S(a){try{let{stdout:b}=await R("git",["log","--since=60 seconds ago","--format=%H"],{cwd:a,timeout:5e3});return b.trim().length>0}catch{return!1}}async function T(a){try{let b=(0,k.join)(a,".cursor"),c=(0,k.join)(b,"chat.md");if((await (0,p.lstat)(b)).isSymbolicLink())return null;try{if((await (0,p.lstat)(c)).isSymbolicLink())return null;return(await (0,p.stat)(c)).mtime}catch{return await (0,p.access)(b,i.constants.R_OK),(await (0,p.stat)(b)).mtime}}catch{return null}}async function U(a){try{let b=(0,k.join)(a,".cursor"),c=(0,k.join)(b,"chat.md");try{if((await (0,p.lstat)(b)).isSymbolicLink()||(await (0,p.lstat)(c)).isSymbolicLink())return null;let d=(0,k.resolve)(c),e=(0,k.resolve)(a);if(!d.startsWith(e))return null;for(let a of(await (0,p.readFile)(c,"utf-8")).split("\n")){let b=a.trim();if(b.length>0&&!b.startsWith("#"))return b.length>120?b.substring(0,120)+"...":b}}catch{}}catch{}return null}let V={manifest:{name:"cursor",slot:"agent",description:"Agent plugin: Cursor Agent CLI",version:"0.1.0",displayName:"Cursor"},create:function(){return{name:"cursor",processName:"agent",getLaunchCommand(a){let b=["agent"],c=(0,d.DD3)(a.permissions);if(("permissionless"===c||"auto-edit"===c)&&b.push("--force","--sandbox","disabled","--approve-mcps"),a.model&&b.push("--model",(0,d.kct)(a.model)),a.systemPromptFile)try{if(!(0,i.lstatSync)(a.systemPromptFile).isSymbolicLink())return a.prompt?b.push("--",`"$(cat ${(0,d.kct)(a.systemPromptFile)}; printf '\\n\\n'; printf %s ${(0,d.kct)(a.prompt)})"`):b.push("--",`"$(cat ${(0,d.kct)(a.systemPromptFile)})"`),b.join(" ")}catch{}let e="";return a.systemPrompt&&(e=a.systemPrompt.trim()),a.prompt&&(e=e?e+"\n\n"+a.prompt:a.prompt),e&&b.push("--",(0,d.kct)(e)),b.join(" ")},getEnvironment(a){let b={};return b.AO_SESSION_ID=a.sessionId,a.issueId&&(b.AO_ISSUE_ID=a.issueId),b},detectActivity(a){if(!a.trim())return"idle";let b=a.trim().split("\n"),c=b[b.length-1]?.trim()??"",d=b.slice(-5).join("\n");return/\(Y\)es.*\(N\)o/i.test(d)||/Approve.*changes\?/i.test(d)||/Continue\?/i.test(d)||/\[Yes\].*\[No\]/i.test(d)||/proceed\?/i.test(d)||/Press Enter to continue/i.test(d)?"waiting_input":/^[>$#]\s*$/.test(c)||/^agent>\s*$/.test(c)||/^\[agent\]\s*$/.test(c)?"idle":"active"},async getActivityState(a,b){let c=b??d.PES,e=new Date;if(!a.runtimeHandle||!await this.isProcessRunning(a.runtimeHandle))return{state:"exited",timestamp:e};if(!a.workspacePath)return null;let f=await (0,d.Ahw)(a.workspacePath),g=(0,d.Bmx)(f);if(g)return g;if(await S(a.workspacePath))return{state:"active"};let h=await T(a.workspacePath);if(h){let a=Date.now()-h.getTime();return a<=Math.min(d.V1$,c)?{state:"active",timestamp:h}:a<=c?{state:"ready",timestamp:h}:{state:"idle",timestamp:h}}let i=Math.min(d.V1$,c),j=(0,d.Vo2)(f,i,c);return j||null},async recordActivity(a,b){a.workspacePath&&await (0,d.JyZ)(a.workspacePath,b,a=>this.detectActivity(a))},async isProcessRunning(a){try{if("tmux"===a.runtimeName&&a.id){let{stdout:b}=await R("tmux",["list-panes","-t",a.id,"-F","#{pane_tty}"],{timeout:3e4}),c=b.trim().split("\n").map(a=>a.trim()).filter(Boolean);if(0===c.length)return!1;let{stdout:d}=await R("ps",["-eo","pid,tty,args"],{timeout:3e4}),e=new Set(c.map(a=>a.replace(/^\/dev\//,""))),f=/(?:^|\/)\.?agent\b(?:\s|$)/;for(let a of d.split("\n")){let b=a.trimStart().split(/\s+/);if(b.length<3||!e.has(b[1]??""))continue;let c=b.slice(2).join(" ");if(f.test(c))return!0}return!1}let b=a.data.pid,c="number"==typeof b?b:Number(b);if(Number.isFinite(c)&&c>0)try{return process.kill(c,0),!0}catch(a){if(a instanceof Error&&"code"in a&&"EPERM"===a.code)return!0}return!1}catch{return!1}},async getSessionInfo(a){if(!a.workspacePath)return null;let b=await U(a.workspacePath);return b?{summary:b,summaryIsFallback:!0,agentSessionId:null}:null},getRestoreCommand:async(a,b)=>null,async setupWorkspaceHooks(a,b){},async postLaunchSetup(a){}}},detect:function(){try{let a=(0,e.execFileSync)("agent",["--help"],{encoding:"utf-8"}),b=a.includes("Cursor Agent"),c=a.includes("--approve-mcps")&&a.includes("--sandbox");return b||c}catch{return!1}}};function W(){let a=process.env.KIMI_SHARE_DIR;return a&&a.trim().length>0?a:(0,k.join)((0,j.homedir)(),".kimi")}let X=".ao/kimi-baseline.json",Y=".ao/kimi-session-id.json";async function Z(){try{let a=await (0,p.readFile)((0,k.join)(W(),"kimi.json"),"utf-8"),b=JSON.parse(a);if(!b||"object"!=typeof b||Array.isArray(b))return null;return b}catch{return null}}async function $(a){let b=await Z();if(!b?.work_dirs||!Array.isArray(b.work_dirs))return null;let c=await aa(a);for(let a of b.work_dirs)if(a&&"string"==typeof a.path&&await aa(a.path)===c)return a;return null}function _(a){return(0,h.createHash)("md5").update(a).digest("hex")}async function aa(a){try{return await (0,p.realpath)(a)}catch{return a}}async function ab(a){let b,c,d=(0,k.join)(W(),"sessions");try{b=await (0,p.realpath)(d)}catch{return!1}try{c=await (0,p.realpath)(a)}catch{return!1}let e=b.endsWith("/")?b:b+"/";return c===b||c.startsWith(e)}async function ac(a){try{return(await (0,p.lstat)(a)).isFile()}catch{return!1}}async function ad(a){let b=await Promise.all(["context.jsonl","wire.jsonl"].map(async b=>{try{let c=await (0,p.lstat)((0,k.join)(a,b));return c.isFile()?c:null}catch{return null}})),c=null;for(let a of b)a&&(!c||a.mtimeMs>c.getTime())&&(c=a.mtime);return c}async function ae(a){try{let b=await (0,p.readFile)((0,k.join)(a,X),"utf-8"),c=JSON.parse(b);if(!Array.isArray(c.preExistingUuids))return null;return new Set(c.preExistingUuids)}catch{return null}}async function af(a){let b=(0,k.join)(a,X);try{await (0,p.stat)(b);return}catch{}let c=await aa(a),d=(0,k.join)(W(),"sessions",_(c)),e=[];try{e=await (0,p.readdir)(d)}catch{}let f={preExistingUuids:e,capturedAt:new Date().toISOString()};try{await (0,p.mkdir)((0,k.join)(a,".ao"),{recursive:!0}),await (0,p.writeFile)(b,JSON.stringify(f),"utf-8")}catch{}}async function ag(a){try{let b=await (0,p.readFile)((0,k.join)(a,Y),"utf-8"),c=JSON.parse(b);if("string"!=typeof c.sessionId||0===c.sessionId.length)return null;return c.sessionId}catch{return null}}async function ah(a,b){let c={sessionId:b,pinnedAt:new Date().toISOString()};try{await (0,p.mkdir)((0,k.join)(a,".ao"),{recursive:!0}),await (0,p.writeFile)((0,k.join)(a,Y),JSON.stringify(c),"utf-8")}catch{}}async function ai(a){let b;if(!a.workspacePath)return null;let c=await aa(a.workspacePath),d=(0,k.join)(W(),"sessions",_(c));if(!await ab(d))return null;try{b=await (0,p.readdir)(d)}catch{return null}let e=await ag(a.workspacePath),f=null;if(!e){let b=await $(a.workspacePath);b&&"string"==typeof b.last_session_id&&b.last_session_id.length>0&&(f=b.last_session_id)}let g=await ae(a.workspacePath),h=a.createdAt.getTime()-6e4,i=null,j=null;for(let a of b){let b=(0,k.join)(d,a);if(!await ab(b))continue;let c=await ad(b);if(!c)continue;if(e){if(a!==e)continue;return{dir:b,sessionId:a,mtime:c}}if(g?.has(a)||c.getTime()<h)continue;if(f&&a===f){j={dir:b,sessionId:a,mtime:c};continue}let l=c.getTime();(!i||l>i.mtimeMs)&&(i={dir:b,sessionId:a,mtime:c,mtimeMs:l})}return e?null:j?(await ah(a.workspacePath,j.sessionId),j):i?(await ah(a.workspacePath,i.sessionId),{dir:i.dir,sessionId:i.sessionId,mtime:i.mtime}):null}let aj=new Map;async function ak(a){let b=a.workspacePath;if(!b)return null;let c=Date.now(),d=aj.get(b);if(d&&d.expiry>c)return d.match;d&&aj.delete(b);let e=await ai(a),f=e?3e4:2e3;return aj.set(b,{match:e,expiry:c+f}),aj.size>256&&function(a){for(let[b,c]of aj)c.expiry<=a&&aj.delete(b);if(aj.size<=256)return;let b=[...aj.entries()].sort((a,b)=>a[1].expiry-b[1].expiry),c=aj.size-256;for(let a=0;a<c;a++){let c=b[a];c&&aj.delete(c[0])}}(c),e}let al=(0,f.promisify)(e.execFile);async function am(a){let b=(0,k.join)(a,"wire.jsonl");if(!await ac(b))return null;let c=null;try{let a=(0,B.createInterface)({input:(0,i.createReadStream)(b,{encoding:"utf-8"}),crlfDelay:1/0}),d=0;for await(let b of a){if((d+=b.length)>1e6)break;let a=b.trim();if(a)try{let b=JSON.parse(a);if(!b||"object"!=typeof b||Array.isArray(b))continue;let d=b.message;if(!d||"object"!=typeof d||Array.isArray(d)||"TurnBegin"!==d.type)continue;let e=d.payload;if(!e||"object"!=typeof e||Array.isArray(e))continue;let f=e.user_input;if("string"==typeof f&&f.length>0){c=f.length>120?f.slice(0,120)+"...":f;break}}catch{}}a.close()}catch{return null}return c}function an(a,b){let c=(0,d.DD3)(b);("permissionless"===c||"auto-edit"===c)&&a.push("--yolo")}let ao=/kimi[-_](?:cli|code)|moonshot/i,ap={manifest:{name:"kimicode",slot:"agent",description:"Agent plugin: Kimi Code CLI (MoonshotAI)",version:"0.1.0",displayName:"Kimi Code"},create:function(){return{name:"kimicode",processName:"kimi",getLaunchCommand(a){let b=["kimi"],c=a.workspacePath??a.projectConfig.path;return c&&b.push("--work-dir",(0,d.kct)(c)),an(b,a.permissions),a.model&&b.push("--model",(0,d.kct)(a.model)),a.subagent&&b.push("--agent",(0,d.kct)(a.subagent)),a.systemPromptFile&&b.push("--agent-file",(0,d.kct)(a.systemPromptFile)),a.prompt&&b.push("--prompt",(0,d.kct)(a.prompt)),b.join(" ")},getEnvironment(a){let b={};return b.AO_SESSION_ID=a.sessionId,a.issueId&&(b.AO_ISSUE_ID=a.issueId),b.PATH=(0,d.Te2)(process.env.PATH),b.GH_PATH=d.C3x,b},detectActivity(a){if(!a.trim())return"idle";let b=a.trim().split("\n"),c=b[b.length-1]?.trim()??"",d=b.slice(-6).join("\n");return/\(y\)es.*\(n\)o/i.test(d)||/\[y\/n\]\s*[?:]?\s*$/im.test(d)||/^\s*approve\??\s*$/im.test(d)||/\bapproval required\b/i.test(d)||/^\s*do you want to (proceed|continue)\?\s*$/im.test(d)||/^\s*allow .+\?\s*$/im.test(d)?"waiting_input":/^\s*error:/im.test(d)||/^\s*(?:error:\s*)?failed to (connect|authenticate|load)\b/im.test(d)?"blocked":/^[>$#]\s*$/.test(c)||/^kimi[>:]?\s*$/i.test(c)?"idle":"active"},async getActivityState(a,b){let c=b??d.PES,e=Math.min(d.V1$,c),f=new Date;if(!a.runtimeHandle||!await this.isProcessRunning(a.runtimeHandle))return{state:"exited",timestamp:f};if(!a.workspacePath)return null;let g=await (0,d.Ahw)(a.workspacePath),h=(0,d.Bmx)(g);if(h)return h;let i=await ak(a);if(i){let a=Math.max(0,Date.now()-i.mtime.getTime());return a<=e?{state:"active",timestamp:i.mtime}:a<=c?{state:"ready",timestamp:i.mtime}:{state:"idle",timestamp:i.mtime}}let j=(0,d.Vo2)(g,e,c);return j||null},async recordActivity(a,b){a.workspacePath&&await (0,d.JyZ)(a.workspacePath,b,a=>this.detectActivity(a))},async isProcessRunning(a){try{if("tmux"===a.runtimeName&&a.id){let{stdout:b}=await al("tmux",["list-panes","-t",a.id,"-F","#{pane_tty}"],{timeout:3e4}),c=b.trim().split("\n").map(a=>a.trim()).filter(Boolean);if(0===c.length)return!1;let{stdout:d}=await al("ps",["-eo","pid,tty,args"],{timeout:3e4}),e=new Set(c.map(a=>a.replace(/^\/dev\//,""))),f=/(?:^|\/)\.?kimi$/,g=/(?:^|\/)(?:uv|python3?|node)$/;for(let a of d.split("\n")){let b=a.trimStart().split(/\s+/);if(b.length<3||!e.has(b[1]??""))continue;let c=b.slice(2),d=c[0]??"";if(f.test(d))return!0;if(g.test(d))for(let a=1;a<c.length;a++){let b=c[a];if(!(!b||b.startsWith("-"))&&"run"!==b&&"tool"!==b&&"-m"!==b){if(f.test(b))return!0;break}}}return!1}let b=a.data.pid,c="number"==typeof b?b:Number(b);if(Number.isFinite(c)&&c>0)try{return process.kill(c,0),!0}catch(a){if(a instanceof Error&&"code"in a&&"EPERM"===a.code)return!0}return!1}catch{return!1}},async getSessionInfo(a){if(!a.workspacePath)return null;let b=await ak(a);return b?{summary:await am(b.dir),summaryIsFallback:!0,agentSessionId:b.sessionId}:null},async getRestoreCommand(a,b){if(!a.workspacePath)return null;let c=await ak(a);if(!c)return null;let e="string"==typeof b.agentConfig?.model?b.agentConfig.model:void 0,f=["kimi","--resume",(0,d.kct)(c.sessionId)];return an(f,b.agentConfig?.permissions),e&&f.push("--model",(0,d.kct)(e)),f.join(" ")},async setupWorkspaceHooks(a,b){await (0,d.J06)(a)},async preLaunchSetup(a){await af(a)},async postLaunchSetup(a){a.workspacePath&&await (0,d.J06)(a.workspacePath)}}},detect:function(){try{let a=(0,e.execFileSync)("kimi",["info"],{encoding:"utf-8",stdio:["ignore","pipe","ignore"],timeout:1e4,maxBuffer:65536});return ao.test(a)}catch{return!1}}},aq=(0,f.promisify)(e.execFile);function ar(a){if("number"==typeof a){if(!Number.isFinite(a))return null;let b=new Date(a);return Number.isNaN(b.getTime())?null:b}if("string"!=typeof a)return null;let b=a.trim();if(0===b.length)return null;if(/^\d+$/.test(b)){let a=Number(b);if(!Number.isFinite(a))return null;let c=new Date(a);return Number.isNaN(c.getTime())?null:c}let c=Date.parse(b);return Number.isFinite(c)?new Date(c):null}async function as(a){try{let b=await (0,d.mKg)();if(a.metadata?.opencodeSessionId){let c=b.find(b=>b.id===a.metadata.opencodeSessionId);if(c)return c}let c=b.filter(b=>b.title===`AO:${a.id}`);if(0===c.length)return null;if(1===c.length)return c[0];return c.reduce((a,b)=>{let c=ar(a.updated)?.getTime()??0;return(ar(b.updated)?.getTime()??0)>c?b:a})}catch{return null}}let at={manifest:{name:"opencode",slot:"agent",description:"Agent plugin: OpenCode",version:"0.1.0",displayName:"OpenCode"},create:function(){return{name:"opencode",processName:"opencode",getLaunchCommand(a){let b=[],c=[],e=a.projectConfig.agentConfig,f=(0,d.HrC)(e?.opencodeSessionId);f&&b.push("--session",(0,d.kct)(f));let g=a.subagent;g&&c.push("--agent",(0,d.kct)(g));let h=a.prompt?(0,d.kct)(a.prompt):void 0;if(a.model&&c.push("--model",(0,d.kct)(a.model)),!f){let b=["--format","json","--title",(0,d.kct)(`AO:${a.sessionId}`),...c],e=`
|
|
183
|
+
`;function s(a){return a.replace(/\\/g,"/").replace(/:/g,"").replace(/[^a-zA-Z0-9-]/g,"-")}async function t(a){let b;try{b=await (0,p.readdir)(a)}catch{return null}let c=b.filter(a=>a.endsWith(".jsonl")&&!a.startsWith("agent-"));if(0===c.length)return null;let d=await Promise.all(c.map(async b=>{let c=(0,k.join)(a,b);try{let a=await (0,p.stat)(c);return{path:c,mtime:a.mtimeMs}}catch{return{path:c,mtime:0}}}));return d.sort((a,b)=>b.mtime-a.mtime),d[0]?.path??null}async function u(a,b=131072){let c,d;try{let{size:e=0}=await (0,p.stat)(a);if(d=Math.max(0,e-b),0===d)c=await (0,p.readFile)(a,"utf-8");else{let b=await (0,p.open)(a,"r");try{let a=e-d,f=Buffer.allocUnsafe(a);await b.read(f,0,a,d),c=f.toString("utf-8")}finally{await b.close()}}}catch{return[]}let e=c.indexOf("\n"),f=d>0&&e>=0?c.slice(e+1):c,g=[];for(let a of f.split("\n")){let b=a.trim();if(b)try{let a=JSON.parse(b);"object"!=typeof a||null===a||Array.isArray(a)||g.push(a)}catch{}}return g}let v=null;async function w(){let a=Date.now();if(v&&a-v.timestamp<5e3)return v.promise?v.promise:v.output;let b=q("ps",["-eo","pid,tty,args"],{timeout:5e3}).then(({stdout:a})=>(v?.promise===b&&(v={output:a,timestamp:Date.now()}),a));v={output:"",timestamp:a,promise:b};try{return await b}catch{return v?.promise===b&&(v=null),""}}async function x(a){try{if("tmux"===a.runtimeName&&a.id){let{stdout:b}=await q("tmux",["list-panes","-t",a.id,"-F","#{pane_tty}"],{timeout:5e3}),c=b.trim().split("\n").map(a=>a.trim()).filter(Boolean);if(0===c.length)return null;let d=await w();if(!d)return null;let e=new Set(c.map(a=>a.replace(/^\/dev\//,""))),f=/(?:^|\/)claude(?:\s|$)/;for(let a of d.split("\n")){let b=a.trimStart().split(/\s+/);if(b.length<3||!e.has(b[1]??""))continue;let c=b.slice(2).join(" ");if(f.test(c))return parseInt(b[0]??"0",10)}return null}let b=a.data.pid,c="number"==typeof b?b:Number(b);if(Number.isFinite(c)&&c>0)try{return process.kill(c,0),c}catch(a){if(a instanceof Error&&"code"in a&&"EPERM"===a.code)return c}return null}catch{return null}}async function y(a,b){let c=(0,k.join)(a,".claude"),d=(0,k.join)(c,"settings.json"),e=(0,k.join)(c,"metadata-updater.sh");try{await (0,p.mkdir)(c,{recursive:!0})}catch{}await (0,p.writeFile)(e,r,"utf-8"),await (0,p.chmod)(e,493);let f={};if((0,i.existsSync)(d))try{let a=await (0,p.readFile)(d,"utf-8");f=JSON.parse(a)}catch{}let g=f.hooks??{},h=g.PostToolUse??[],j=-1,l=-1;for(let a=0;a<h.length;a++){let b=h[a];if("object"!=typeof b||null===b||Array.isArray(b))continue;let c=b.hooks;if(Array.isArray(c)){for(let b=0;b<c.length;b++){let d=c[b];if(!("object"!=typeof d||null===d||Array.isArray(d))&&"string"==typeof d.command&&d.command.includes("metadata-updater.sh")){j=a,l=b;break}}if(j>=0)break}}-1===j?h.push({matcher:"Bash",hooks:[{type:"command",command:b,timeout:5e3}]}):h[j].hooks[l].command=b,g.PostToolUse=h,f.hooks=g,await (0,p.writeFile)(d,JSON.stringify(f,null,2)+"\n","utf-8")}let z={manifest:{name:"claude-code",slot:"agent",description:"Agent plugin: Claude Code CLI",version:"0.1.0",displayName:"Claude Code"},create:function(){return{name:"claude-code",processName:"claude",promptDelivery:"post-launch",getLaunchCommand(a){let b=["claude"],c=(0,d.DD3)(a.permissions);return("permissionless"===c||"auto-edit"===c)&&b.push("--dangerously-skip-permissions"),a.model&&b.push("--model",(0,d.kct)(a.model)),a.systemPromptFile?b.push("--append-system-prompt",`"$(cat ${(0,d.kct)(a.systemPromptFile)})"`):a.systemPrompt&&b.push("--append-system-prompt",(0,d.kct)(a.systemPrompt)),b.join(" ")},getEnvironment(a){let b={};return b.CLAUDECODE="",b.AO_SESSION_ID=a.sessionId,a.issueId&&(b.AO_ISSUE_ID=a.issueId),b},detectActivity:a=>(function(a){if(!a.trim())return"idle";let b=a.trim().split("\n"),c=b[b.length-1]?.trim()??"";if(/^[❯>$#]\s*$/.test(c))return"idle";let d=b.slice(-5).join("\n");return/Do you want to proceed\?/i.test(d)||/\(Y\)es.*\(N\)o/i.test(d)||/bypass.*permissions/i.test(d)?"waiting_input":"active"})(a),isProcessRunning:async a=>null!==await x(a),async getActivityState(a,b){let c=b??d.PES,e=new Date;if(!a.runtimeHandle||!await this.isProcessRunning(a.runtimeHandle))return{state:"exited",timestamp:e};if(!a.workspacePath)return null;let f=s(a.workspacePath),g=(0,k.join)((0,j.homedir)(),".claude","projects",f),h=await t(g);if(!h)return{state:"idle",timestamp:a.createdAt};let i=await (0,d.XIc)(h);if(!i)return null;let l=Date.now()-i.modifiedAt.getTime(),m=i.modifiedAt,n=Math.min(d.V1$,c);switch(i.lastType){case"user":case"tool_use":case"progress":default:if(l<=n)return{state:"active",timestamp:m};return{state:l>c?"idle":"ready",timestamp:m};case"assistant":case"system":case"summary":case"result":return{state:l>c?"idle":"ready",timestamp:m};case"permission_request":return{state:"waiting_input",timestamp:m};case"error":return{state:"blocked",timestamp:m}}},async getSessionInfo(a){if(!a.workspacePath)return null;let b=s(a.workspacePath),c=(0,k.join)((0,j.homedir)(),".claude","projects",b),d=await t(c);if(!d)return null;let e=await u(d);if(0===e.length)return null;let f=(0,k.basename)(d,".jsonl"),g=function(a){for(let b=a.length-1;b>=0;b--){let c=a[b];if(c?.type==="summary"&&c.summary)return{summary:c.summary,isFallback:!1}}for(let b of a)if(b?.type==="user"&&b.message?.content&&"string"==typeof b.message.content){let a=b.message.content.trim();if(a.length>0)return{summary:a.length>120?a.substring(0,120)+"...":a,isFallback:!0}}return null}(e);return{summary:g?.summary??null,summaryIsFallback:g?.isFallback,agentSessionId:f,metadata:{claudeSessionUuid:f},cost:function(a){let b=0,c=0,d=0,e=0,f=0;for(let g of a)"number"==typeof g.costUSD?f+=g.costUSD:"number"==typeof g.estimatedCostUsd&&(f+=g.estimatedCostUsd),g.usage?(b+=g.usage.input_tokens??0,d+=g.usage.cache_read_input_tokens??0,e+=g.usage.cache_creation_input_tokens??0,c+=g.usage.output_tokens??0):("number"==typeof g.inputTokens&&(b+=g.inputTokens),"number"==typeof g.outputTokens&&(c+=g.outputTokens));if(0!==b||0!==c||0!==f||0!==d||0!==e)return 0===f&&(f=b/1e6*3+c/1e6*15+d/1e6*.3+e/1e6*3.75),{inputTokens:b+d+e,outputTokens:c,estimatedCostUsd:f}}(e)}},async getRestoreCommand(a,b){let c=a.metadata?.claudeSessionUuid?.trim();if(!c){if(!a.workspacePath)return null;let b=s(a.workspacePath),d=(0,k.join)((0,j.homedir)(),".claude","projects",b),e=await t(d);if(!e)return null;c=(0,k.basename)(e,".jsonl")}if(!c)return null;let e=["claude","--resume",(0,d.kct)(c)],f=(0,d.DD3)(b.agentConfig?.permissions);return("permissionless"===f||"auto-edit"===f)&&e.push("--dangerously-skip-permissions"),b.agentConfig?.model&&e.push("--model",(0,d.kct)(b.agentConfig.model)),e.join(" ")},async setupWorkspaceHooks(a,b){await y(a,".claude/metadata-updater.sh")},async postLaunchSetup(a){a.workspacePath&&await y(a.workspacePath,".claude/metadata-updater.sh")}}},detect:function(){try{return(0,e.execFileSync)("claude",["--version"],{stdio:"ignore"}),!0}catch{return!1}}};var A=c(46193),B=c(80481);c(78474).EventEmitter;let C=(0,f.promisify)(e.execFile),D=(0,k.join)((0,j.homedir)(),".codex","sessions");function E(a){return a.payload??a}async function F(a,b=0){let c;if(b>4)return[];try{c=await (0,p.readdir)(a)}catch{return[]}let d=[];for(let e of c){let c=(0,k.join)(a,e);if(e.endsWith(".jsonl"))d.push(c);else try{if((await (0,p.lstat)(c)).isDirectory()){let a=await F(c,b+1);d.push(...a)}}catch{}}return d}async function G(a,b){let c=await (0,p.open)(a,"r"),d=[],e="",f=new A.StringDecoder("utf8");try{for(;d.length<b;){let a=Buffer.allocUnsafe(8192),{bytesRead:g}=await c.read(a,0,a.length,null);if(0===g){let a=(e+=f.end()).trim();a&&d.push(a);break}let h=(e+=f.write(a.subarray(0,g))).indexOf("\n");for(;-1!==h&&d.length<b;){let a=e.slice(0,h).trim();a&&d.push(a),h=(e=e.slice(h+1)).indexOf("\n")}}}finally{await c.close()}return d}async function H(a,b){try{for(let c of(await G(a,10)))try{let a=JSON.parse(c);if("object"==typeof a&&null!==a&&!Array.isArray(a)){let c=E(a);if("session_meta"===a.type&&c.cwd===b)return!0}}catch{}}catch{}return!1}async function I(a){let b=await F(D);if(0===b.length)return null;let c=null;for(let d of b)if(await H(d,a))try{let a=await (0,p.stat)(d);(!c||a.mtimeMs>c.mtime)&&(c={path:d,mtime:a.mtimeMs})}catch{}return c?.path??null}async function J(a){try{let b={model:null,threadId:null,inputTokens:0,outputTokens:0,cachedTokens:0,reasoningTokens:0};for await(let c of(0,B.createInterface)({input:(0,i.createReadStream)(a,{encoding:"utf-8"}),crlfDelay:1/0})){let a=c.trim();if(a)try{let c=JSON.parse(a);if("object"!=typeof c||null===c||Array.isArray(c))continue;let d=E(c);"session_meta"===c.type&&("string"==typeof d.id&&d.id?b.threadId=d.id:"string"==typeof d.threadId&&d.threadId&&(b.threadId=d.threadId)),!b.threadId&&("string"==typeof d.threadId&&d.threadId?b.threadId=d.threadId:"string"==typeof c.threadId&&c.threadId&&(b.threadId=c.threadId)),"turn_context"===c.type&&"string"==typeof d.model&&d.model?b.model=d.model:!b.model&&"string"==typeof d.model&&d.model&&(b.model=d.model);let e=d.info?.total_token_usage;if("number"==typeof e?.input_tokens){b.inputTokens=e.input_tokens,b.outputTokens=e.output_tokens??0;continue}let f=d.info?.last_token_usage;if("number"==typeof f?.input_tokens){b.inputTokens+=f.input_tokens,b.outputTokens+=f.output_tokens??0;continue}if("number"==typeof d.input_tokens){b.inputTokens+=d.input_tokens,b.outputTokens+=d.output_tokens??0;continue}"event_msg"===c.type&&c.msg?.type==="token_count"&&(b.inputTokens+=c.msg.input_tokens??0,b.outputTokens+=c.msg.output_tokens??0,b.cachedTokens+=c.msg.cached_tokens??0,b.reasoningTokens+=c.msg.reasoning_tokens??0)}catch{}}return b}catch{return null}}async function K(){try{let{stdout:a}=await C("which",["codex"],{timeout:1e4}),b=a.trim();if(b)return b}catch{}let a=(0,j.homedir)();for(let b of["/usr/local/bin/codex","/opt/homebrew/bin/codex",(0,k.join)(a,".cargo","bin","codex"),(0,k.join)(a,".npm","bin","codex")])try{return await (0,p.stat)(b),b}catch{}return"codex"}function L(a,b,c=!0){let e=(0,d.DD3)(b);"permissionless"===e?c?a.push("--dangerously-bypass-approvals-and-sandbox"):a.push("--ask-for-approval","never"):"auto-edit"===e?a.push("--ask-for-approval","never"):"suggest"===e&&a.push("--ask-for-approval","untrusted")}function M(a,b){b&&(a.push("--model",(0,d.kct)(b)),/^o[34]/i.test(b)&&a.push("-c","model_reasoning_effort=high"))}function N(a){a.push("-c","check_for_update_on_startup=false")}let O=new Map;async function P(a){let b=O.get(a);if(b&&Date.now()<b.expiry)return b.path;let c=await I(a);return O.set(a,{path:c,expiry:Date.now()+3e4}),c}let Q={manifest:{name:"codex",slot:"agent",description:"Agent plugin: OpenAI Codex CLI",version:"0.1.1",displayName:"OpenAI Codex"},create:function(){let a,b;return a=null,b=null,{name:"codex",processName:"codex",getLaunchCommand(b){let c=a??"codex",e=[(0,d.kct)(c)];return N(e),L(e,b.permissions),M(e,b.model),b.systemPromptFile?e.push("-c",`model_instructions_file=${(0,d.kct)(b.systemPromptFile)}`):b.systemPrompt&&e.push("-c",`developer_instructions=${(0,d.kct)(b.systemPrompt)}`),b.prompt&&e.push("--",(0,d.kct)(b.prompt)),e.join(" ")},getEnvironment(a){let b={};return b.AO_SESSION_ID=a.sessionId,a.issueId&&(b.AO_ISSUE_ID=a.issueId),b.CODEX_DISABLE_UPDATE_CHECK="1",b},detectActivity(a){if(!a.trim())return"idle";let b=a.trim().split("\n"),c=b[b.length-1]?.trim()??"";if(/^[>$#]\s*$/.test(c))return"idle";let d=b.slice(-5).join("\n");return/approval required/i.test(d)||/\(y\)es.*\(n\)o/i.test(d)?"waiting_input":"active"},async getActivityState(a,b){let c=b??d.PES,e=new Date;if(!a.runtimeHandle||!await this.isProcessRunning(a.runtimeHandle))return{state:"exited",timestamp:e};if(!a.workspacePath)return null;let f=await P(a.workspacePath);if(f){let a=await (0,d.XIc)(f);if(a){let b=Date.now()-a.modifiedAt.getTime(),e=a.modifiedAt,f=a.payloadType??a.lastType,g=Math.min(d.V1$,c);switch(f){case"approval_request":case"exec_approval_request":case"apply_patch_approval_request":return{state:"waiting_input",timestamp:e};case"error":case"stream_error":return{state:"blocked",timestamp:e};case"task_started":case"agent_reasoning":case"response_item":case"turn_context":case"user_input":case"tool_call":case"exec_command":case"exec_command_begin":case"exec_command_end":default:if(b<=g)return{state:"active",timestamp:e};return{state:b>c?"idle":"ready",timestamp:e};case"task_complete":case"turn_aborted":case"agent_message":case"assistant_message":case"session_meta":case"event_msg":case"compacted":case"token_count":return{state:b>c?"idle":"ready",timestamp:e}}}}let g=await (0,d.Ahw)(a.workspacePath),h=(0,d.Bmx)(g);if(h)return h;let i=Math.min(d.V1$,c),j=(0,d.Vo2)(g,i,c);if(j)return j;if(f)try{let a=await (0,p.stat)(f),b=Date.now()-a.mtimeMs,e=Math.min(d.V1$,c);if(b<=e)return{state:"active",timestamp:a.mtime};if(b<=c)return{state:"ready",timestamp:a.mtime};return{state:"idle",timestamp:a.mtime}}catch{}return null},async recordActivity(a,b){a.workspacePath&&await (0,d.JyZ)(a.workspacePath,b,a=>this.detectActivity(a))},async isProcessRunning(a){try{if("tmux"===a.runtimeName&&a.id){let{stdout:b}=await C("tmux",["list-panes","-t",a.id,"-F","#{pane_tty}"],{timeout:3e4}),c=b.trim().split("\n").map(a=>a.trim()).filter(Boolean);if(0===c.length)return!1;let{stdout:d}=await C("ps",["-eo","pid,tty,args"],{timeout:3e4}),e=new Set(c.map(a=>a.replace(/^\/dev\//,""))),f=/(?:^|\/)codex(?:\s|$)/;for(let a of d.split("\n")){let b=a.trimStart().split(/\s+/);if(b.length<3||!e.has(b[1]??""))continue;let c=b.slice(2).join(" ");if(f.test(c))return!0}return!1}let b=a.data.pid,c="number"==typeof b?b:Number(b);if(Number.isFinite(c)&&c>0)try{return process.kill(c,0),!0}catch(a){if(a instanceof Error&&"code"in a&&"EPERM"===a.code)return!0}return!1}catch{return!1}},async getSessionInfo(a){let b;if(!a.workspacePath)return null;let c=await P(a.workspacePath);if(!c)return null;let d=await J(c);if(!d)return null;let e=(0,k.basename)(c,".jsonl"),f=d.inputTokens+d.cachedTokens;if(f>0||d.outputTokens>0||d.reasoningTokens>0){let a=d.inputTokens/1e6*2.5+d.cachedTokens/1e6*.625+(d.outputTokens+d.reasoningTokens)/1e6*10;b={inputTokens:f,outputTokens:d.outputTokens,estimatedCostUsd:a}}return{summary:d.model?`Codex session (${d.model})`:null,summaryIsFallback:!0,agentSessionId:e,metadata:d.threadId?{codexThreadId:d.threadId,...d.model?{codexModel:d.model}:{}}:void 0,cost:b}},async getRestoreCommand(b,c){let e=b.metadata?.codexThreadId?.trim(),f=b.metadata?.codexModel?.trim()||null;if(!e){if(!b.workspacePath)return null;let a=await P(b.workspacePath);if(!a)return null;let c=await J(a);if(!c?.threadId)return null;e=c.threadId,f=c.model}let g=a??"codex",h=[(0,d.kct)(g),"resume"];return N(h),L(h,c.agentConfig?.permissions),M(h,c.agentConfig?.model??f??void 0),h.push((0,d.kct)(e)),h.join(" ")},async setupWorkspaceHooks(a,b){},async postLaunchSetup(c){if(!a){b||(b=K());try{a=await b}finally{b=null}}}}},detect:function(){try{return(0,e.execFileSync)("codex",["--version"],{stdio:"ignore"}),!0}catch{return!1}}},R=(0,f.promisify)(e.execFile);async function S(a){try{let b=(0,k.join)(a,".cursor"),c=(0,k.join)(b,"chat.md");if((await (0,p.lstat)(b)).isSymbolicLink())return null;try{if((await (0,p.lstat)(c)).isSymbolicLink())return null;return(await (0,p.stat)(c)).mtime}catch{return await (0,p.access)(b,i.constants.R_OK),(await (0,p.stat)(b)).mtime}}catch{return null}}async function T(a){try{let b=(0,k.join)(a,".cursor"),c=(0,k.join)(b,"chat.md");try{if((await (0,p.lstat)(b)).isSymbolicLink()||(await (0,p.lstat)(c)).isSymbolicLink())return null;let d=(0,k.resolve)(c),e=(0,k.resolve)(a);if(!d.startsWith(e))return null;for(let a of(await (0,p.readFile)(c,"utf-8")).split("\n")){let b=a.trim();if(b.length>0&&!b.startsWith("#"))return b.length>120?b.substring(0,120)+"...":b}}catch{}}catch{}return null}let U={manifest:{name:"cursor",slot:"agent",description:"Agent plugin: Cursor Agent CLI",version:"0.1.0",displayName:"Cursor"},create:function(){return{name:"cursor",processName:"agent",getLaunchCommand(a){let b=["agent"],c=(0,d.DD3)(a.permissions);if(("permissionless"===c||"auto-edit"===c)&&b.push("--force","--sandbox","disabled","--approve-mcps"),a.model&&b.push("--model",(0,d.kct)(a.model)),a.systemPromptFile)try{if(!(0,i.lstatSync)(a.systemPromptFile).isSymbolicLink())return a.prompt?b.push("--",`"$(cat ${(0,d.kct)(a.systemPromptFile)}; printf '\\n\\n'; printf %s ${(0,d.kct)(a.prompt)})"`):b.push("--",`"$(cat ${(0,d.kct)(a.systemPromptFile)})"`),b.join(" ")}catch{}let e="";return a.systemPrompt&&(e=a.systemPrompt.trim()),a.prompt&&(e=e?e+"\n\n"+a.prompt:a.prompt),e&&b.push("--",(0,d.kct)(e)),b.join(" ")},getEnvironment(a){let b={};return b.AO_SESSION_ID=a.sessionId,a.issueId&&(b.AO_ISSUE_ID=a.issueId),b},detectActivity(a){if(!a.trim())return"idle";let b=a.trim().split("\n"),c=b[b.length-1]?.trim()??"",d=b.slice(-5).join("\n");return/\(Y\)es.*\(N\)o/i.test(d)||/Approve.*changes\?/i.test(d)||/Continue\?/i.test(d)||/\[Yes\].*\[No\]/i.test(d)||/proceed\?/i.test(d)||/Press Enter to continue/i.test(d)?"waiting_input":/^[>$#]\s*$/.test(c)||/^agent>\s*$/.test(c)||/^\[agent\]\s*$/.test(c)?"idle":"active"},async getActivityState(a,b){let c=b??d.PES,e=new Date;if(!a.runtimeHandle||!await this.isProcessRunning(a.runtimeHandle))return{state:"exited",timestamp:e};if(!a.workspacePath)return null;let f=await (0,d.Ahw)(a.workspacePath),g=(0,d.Bmx)(f);if(g)return g;if(await (0,d.Gfo)(a.workspacePath))return{state:"active"};let h=await S(a.workspacePath);if(h){let a=Date.now()-h.getTime();return a<=Math.min(d.V1$,c)?{state:"active",timestamp:h}:a<=c?{state:"ready",timestamp:h}:{state:"idle",timestamp:h}}let i=Math.min(d.V1$,c),j=(0,d.Vo2)(f,i,c);return j||null},async recordActivity(a,b){a.workspacePath&&await (0,d.JyZ)(a.workspacePath,b,a=>this.detectActivity(a))},async isProcessRunning(a){try{if("tmux"===a.runtimeName&&a.id){let{stdout:b}=await R("tmux",["list-panes","-t",a.id,"-F","#{pane_tty}"],{timeout:3e4}),c=b.trim().split("\n").map(a=>a.trim()).filter(Boolean);if(0===c.length)return!1;let{stdout:d}=await R("ps",["-eo","pid,tty,args"],{timeout:3e4}),e=new Set(c.map(a=>a.replace(/^\/dev\//,""))),f=/(?:^|\/)\.?agent\b(?:\s|$)/;for(let a of d.split("\n")){let b=a.trimStart().split(/\s+/);if(b.length<3||!e.has(b[1]??""))continue;let c=b.slice(2).join(" ");if(f.test(c))return!0}return!1}let b=a.data.pid,c="number"==typeof b?b:Number(b);if(Number.isFinite(c)&&c>0)try{return process.kill(c,0),!0}catch(a){if(a instanceof Error&&"code"in a&&"EPERM"===a.code)return!0}return!1}catch{return!1}},async getSessionInfo(a){if(!a.workspacePath)return null;let b=await T(a.workspacePath);return b?{summary:b,summaryIsFallback:!0,agentSessionId:null}:null},getRestoreCommand:async(a,b)=>null,async setupWorkspaceHooks(a,b){},async postLaunchSetup(a){}}},detect:function(){try{let a=(0,e.execFileSync)("agent",["--help"],{encoding:"utf-8"}),b=a.includes("Cursor Agent"),c=a.includes("--approve-mcps")&&a.includes("--sandbox");return b||c}catch{return!1}}};function V(){let a=process.env.KIMI_SHARE_DIR;return a&&a.trim().length>0?a:(0,k.join)((0,j.homedir)(),".kimi")}let W=".ao/kimi-baseline.json",X=".ao/kimi-session-id.json";async function Y(){try{let a=await (0,p.readFile)((0,k.join)(V(),"kimi.json"),"utf-8"),b=JSON.parse(a);if(!b||"object"!=typeof b||Array.isArray(b))return null;return b}catch{return null}}async function Z(a){let b=await Y();if(!b?.work_dirs||!Array.isArray(b.work_dirs))return null;let c=await _(a);for(let a of b.work_dirs)if(a&&"string"==typeof a.path&&await _(a.path)===c)return a;return null}function $(a){return(0,h.createHash)("md5").update(a).digest("hex")}async function _(a){try{return await (0,p.realpath)(a)}catch{return a}}async function aa(a){let b,c,d=(0,k.join)(V(),"sessions");try{b=await (0,p.realpath)(d)}catch{return!1}try{c=await (0,p.realpath)(a)}catch{return!1}let e=b.endsWith("/")?b:b+"/";return c===b||c.startsWith(e)}async function ab(a){try{return(await (0,p.lstat)(a)).isFile()}catch{return!1}}async function ac(a){let b=await Promise.all(["context.jsonl","wire.jsonl"].map(async b=>{try{let c=await (0,p.lstat)((0,k.join)(a,b));return c.isFile()?c:null}catch{return null}})),c=null;for(let a of b)a&&(!c||a.mtimeMs>c.getTime())&&(c=a.mtime);return c}async function ad(a){try{let b=await (0,p.readFile)((0,k.join)(a,W),"utf-8"),c=JSON.parse(b);if(!Array.isArray(c.preExistingUuids))return null;return new Set(c.preExistingUuids)}catch{return null}}async function ae(a){let b=(0,k.join)(a,W);try{await (0,p.stat)(b);return}catch{}let c=await _(a),d=(0,k.join)(V(),"sessions",$(c)),e=[];try{e=await (0,p.readdir)(d)}catch{}let f={preExistingUuids:e,capturedAt:new Date().toISOString()};try{await (0,p.mkdir)((0,k.join)(a,".ao"),{recursive:!0}),await (0,p.writeFile)(b,JSON.stringify(f),"utf-8")}catch{}}async function af(a){try{let b=await (0,p.readFile)((0,k.join)(a,X),"utf-8"),c=JSON.parse(b);if("string"!=typeof c.sessionId||0===c.sessionId.length)return null;return c.sessionId}catch{return null}}async function ag(a,b){let c={sessionId:b,pinnedAt:new Date().toISOString()};try{await (0,p.mkdir)((0,k.join)(a,".ao"),{recursive:!0}),await (0,p.writeFile)((0,k.join)(a,X),JSON.stringify(c),"utf-8")}catch{}}async function ah(a){let b;if(!a.workspacePath)return null;let c=await _(a.workspacePath),d=(0,k.join)(V(),"sessions",$(c));if(!await aa(d))return null;try{b=await (0,p.readdir)(d)}catch{return null}let e=await af(a.workspacePath),f=null;if(!e){let b=await Z(a.workspacePath);b&&"string"==typeof b.last_session_id&&b.last_session_id.length>0&&(f=b.last_session_id)}let g=await ad(a.workspacePath),h=a.createdAt.getTime()-6e4,i=null,j=null;for(let a of b){let b=(0,k.join)(d,a);if(!await aa(b))continue;let c=await ac(b);if(!c)continue;if(e){if(a!==e)continue;return{dir:b,sessionId:a,mtime:c}}if(g?.has(a)||c.getTime()<h)continue;if(f&&a===f){j={dir:b,sessionId:a,mtime:c};continue}let l=c.getTime();(!i||l>i.mtimeMs)&&(i={dir:b,sessionId:a,mtime:c,mtimeMs:l})}return e?null:j?(await ag(a.workspacePath,j.sessionId),j):i?(await ag(a.workspacePath,i.sessionId),{dir:i.dir,sessionId:i.sessionId,mtime:i.mtime}):null}let ai=new Map;async function aj(a){let b=a.workspacePath;if(!b)return null;let c=Date.now(),d=ai.get(b);if(d&&d.expiry>c)return d.match;d&&ai.delete(b);let e=await ah(a),f=e?3e4:2e3;return ai.set(b,{match:e,expiry:c+f}),ai.size>256&&function(a){for(let[b,c]of ai)c.expiry<=a&&ai.delete(b);if(ai.size<=256)return;let b=[...ai.entries()].sort((a,b)=>a[1].expiry-b[1].expiry),c=ai.size-256;for(let a=0;a<c;a++){let c=b[a];c&&ai.delete(c[0])}}(c),e}let ak=(0,f.promisify)(e.execFile);async function al(a){let b=(0,k.join)(a,"wire.jsonl");if(!await ab(b))return null;let c=null;try{let a=(0,B.createInterface)({input:(0,i.createReadStream)(b,{encoding:"utf-8"}),crlfDelay:1/0}),d=0;for await(let b of a){if((d+=b.length)>1e6)break;let a=b.trim();if(a)try{let b=JSON.parse(a);if(!b||"object"!=typeof b||Array.isArray(b))continue;let d=b.message;if(!d||"object"!=typeof d||Array.isArray(d)||"TurnBegin"!==d.type)continue;let e=d.payload;if(!e||"object"!=typeof e||Array.isArray(e))continue;let f=e.user_input;if("string"==typeof f&&f.length>0){c=f.length>120?f.slice(0,120)+"...":f;break}}catch{}}a.close()}catch{return null}return c}function am(a,b){let c=(0,d.DD3)(b);("permissionless"===c||"auto-edit"===c)&&a.push("--yolo")}let an=/kimi[-_](?:cli|code)|moonshot/i,ao={manifest:{name:"kimicode",slot:"agent",description:"Agent plugin: Kimi Code CLI (MoonshotAI)",version:"0.1.0",displayName:"Kimi Code"},create:function(){return{name:"kimicode",processName:"kimi",getLaunchCommand(a){let b=["kimi"],c=a.workspacePath??a.projectConfig.path;return c&&b.push("--work-dir",(0,d.kct)(c)),am(b,a.permissions),a.model&&b.push("--model",(0,d.kct)(a.model)),a.subagent&&b.push("--agent",(0,d.kct)(a.subagent)),a.systemPromptFile&&b.push("--agent-file",(0,d.kct)(a.systemPromptFile)),a.prompt&&b.push("--prompt",(0,d.kct)(a.prompt)),b.join(" ")},getEnvironment(a){let b={};return b.AO_SESSION_ID=a.sessionId,a.issueId&&(b.AO_ISSUE_ID=a.issueId),b.PATH=(0,d.Te2)(process.env.PATH),b.GH_PATH=d.C3x,b},detectActivity(a){if(!a.trim())return"idle";let b=a.trim().split("\n"),c=b[b.length-1]?.trim()??"",d=b.slice(-6).join("\n");return/\(y\)es.*\(n\)o/i.test(d)||/\[y\/n\]\s*[?:]?\s*$/im.test(d)||/^\s*approve\??\s*$/im.test(d)||/\bapproval required\b/i.test(d)||/^\s*do you want to (proceed|continue)\?\s*$/im.test(d)||/^\s*allow .+\?\s*$/im.test(d)?"waiting_input":/^\s*error:/im.test(d)||/^\s*(?:error:\s*)?failed to (connect|authenticate|load)\b/im.test(d)?"blocked":/^[>$#]\s*$/.test(c)||/^kimi[>:]?\s*$/i.test(c)?"idle":"active"},async getActivityState(a,b){let c=b??d.PES,e=Math.min(d.V1$,c),f=new Date;if(!a.runtimeHandle||!await this.isProcessRunning(a.runtimeHandle))return{state:"exited",timestamp:f};if(!a.workspacePath)return null;let g=await (0,d.Ahw)(a.workspacePath),h=(0,d.Bmx)(g);if(h)return h;let i=await aj(a);if(i){let a=Math.max(0,Date.now()-i.mtime.getTime());return a<=e?{state:"active",timestamp:i.mtime}:a<=c?{state:"ready",timestamp:i.mtime}:{state:"idle",timestamp:i.mtime}}let j=(0,d.Vo2)(g,e,c);return j||null},async recordActivity(a,b){a.workspacePath&&await (0,d.JyZ)(a.workspacePath,b,a=>this.detectActivity(a))},async isProcessRunning(a){try{if("tmux"===a.runtimeName&&a.id){let{stdout:b}=await ak("tmux",["list-panes","-t",a.id,"-F","#{pane_tty}"],{timeout:3e4}),c=b.trim().split("\n").map(a=>a.trim()).filter(Boolean);if(0===c.length)return!1;let{stdout:d}=await ak("ps",["-eo","pid,tty,args"],{timeout:3e4}),e=new Set(c.map(a=>a.replace(/^\/dev\//,""))),f=/(?:^|\/)\.?kimi$/,g=/(?:^|\/)(?:uv|python3?|node)$/;for(let a of d.split("\n")){let b=a.trimStart().split(/\s+/);if(b.length<3||!e.has(b[1]??""))continue;let c=b.slice(2),d=c[0]??"";if(f.test(d))return!0;if(g.test(d))for(let a=1;a<c.length;a++){let b=c[a];if(!(!b||b.startsWith("-"))&&"run"!==b&&"tool"!==b&&"-m"!==b){if(f.test(b))return!0;break}}}return!1}let b=a.data.pid,c="number"==typeof b?b:Number(b);if(Number.isFinite(c)&&c>0)try{return process.kill(c,0),!0}catch(a){if(a instanceof Error&&"code"in a&&"EPERM"===a.code)return!0}return!1}catch{return!1}},async getSessionInfo(a){if(!a.workspacePath)return null;let b=await aj(a);return b?{summary:await al(b.dir),summaryIsFallback:!0,agentSessionId:b.sessionId}:null},async getRestoreCommand(a,b){if(!a.workspacePath)return null;let c=await aj(a);if(!c)return null;let e="string"==typeof b.agentConfig?.model?b.agentConfig.model:void 0,f=["kimi","--resume",(0,d.kct)(c.sessionId)];return am(f,b.agentConfig?.permissions),e&&f.push("--model",(0,d.kct)(e)),f.join(" ")},async setupWorkspaceHooks(a,b){await (0,d.J06)(a)},async preLaunchSetup(a){await ae(a)},async postLaunchSetup(a){a.workspacePath&&await (0,d.J06)(a.workspacePath)}}},detect:function(){try{let a=(0,e.execFileSync)("kimi",["info"],{encoding:"utf-8",stdio:["ignore","pipe","ignore"],timeout:1e4,maxBuffer:65536});return an.test(a)}catch{return!1}}},ap=(0,f.promisify)(e.execFile);function aq(a){if("number"==typeof a){if(!Number.isFinite(a))return null;let b=new Date(a);return Number.isNaN(b.getTime())?null:b}if("string"!=typeof a)return null;let b=a.trim();if(0===b.length)return null;if(/^\d+$/.test(b)){let a=Number(b);if(!Number.isFinite(a))return null;let c=new Date(a);return Number.isNaN(c.getTime())?null:c}let c=Date.parse(b);return Number.isFinite(c)?new Date(c):null}async function ar(a){try{let b=await (0,d.mKg)();if(a.metadata?.opencodeSessionId){let c=b.find(b=>b.id===a.metadata.opencodeSessionId);if(c)return c}let c=b.filter(b=>b.title===`AO:${a.id}`);if(0===c.length)return null;if(1===c.length)return c[0];return c.reduce((a,b)=>{let c=aq(a.updated)?.getTime()??0;return(aq(b.updated)?.getTime()??0)>c?b:a})}catch{return null}}let as={manifest:{name:"opencode",slot:"agent",description:"Agent plugin: OpenCode",version:"0.1.0",displayName:"OpenCode"},create:function(){return{name:"opencode",processName:"opencode",getLaunchCommand(a){let b=[],c=[],e=a.projectConfig.agentConfig,f=(0,d.HrC)(e?.opencodeSessionId);f&&b.push("--session",(0,d.kct)(f));let g=a.subagent;g&&c.push("--agent",(0,d.kct)(g));let h=a.prompt?(0,d.kct)(a.prompt):void 0;if(a.model&&c.push("--model",(0,d.kct)(a.model)),!f){let b=["--format","json","--title",(0,d.kct)(`AO:${a.sessionId}`),...c],e=`
|
|
184
184
|
let buffer = '';
|
|
185
185
|
let captured = null;
|
|
186
186
|
process.stdin.on('data', chunk => {
|
|
@@ -242,7 +242,7 @@ process.stdin.on('data', c => input += c).on('end', () => {
|
|
|
242
242
|
if (matches.length === 0) process.exit(1);
|
|
243
243
|
process.stdout.write(matches[0].id);
|
|
244
244
|
});
|
|
245
|
-
`.trim().replace(/\n/g," ").replace(/\s+/g," "),g=["opencode","run",...b,"--command","true"].join(" "),i=[...h?["--prompt",h]:[],...c],j=i.length>0?` ${i.join(" ")}`:"",k=(0,d.kct)(`failed to discover OpenCode session ID for AO:${a.sessionId}`);return`SES_ID=$(${g} | node -e ${(0,d.kct)(e)}); if [ -z "$SES_ID" ]; then SES_ID=$(opencode session list --format json | node -e ${(0,d.kct)(f)} ${(0,d.kct)(`AO:${a.sessionId}`)}); fi; [ -n "$SES_ID" ] && exec opencode --session "$SES_ID"${j}; echo ${k} >&2; exit 1`}return h&&b.push("--prompt",h),b.push(...c),["opencode",...b].join(" ")},getEnvironment(a){let b={};b.AO_SESSION_ID=a.sessionId,a.issueId&&(b.AO_ISSUE_ID=a.issueId);let c=(0,d.sa4)();return b.TMPDIR=c,b.TMP=c,b.TEMP=c,b},detectActivity(a){if(!a.trim())return"idle";let b=a.trim().split("\n"),c=b[b.length-1]?.trim()??"";if(/^[>$#]\s*$/.test(c))return"idle";let d=b.slice(-5).join("\n");return/\(Y\)es.*\(N\)o/i.test(d)||/approval required/i.test(d)||/Do you want to proceed\?/i.test(d)||/Allow .+\?/i.test(d)?"waiting_input":"active"},async getActivityState(a,b){let c=b??d.PES,e=Math.min(d.V1$,c),f=new Date;if(!a.runtimeHandle||!await this.isProcessRunning(a.runtimeHandle))return{state:"exited",timestamp:f};let g=null;if(a.workspacePath){g=await (0,d.Ahw)(a.workspacePath);let b=(0,d.Bmx)(g);if(b)return b}let h=await as(a);if(h){let a=ar(h.updated);if(a){let b=Math.max(0,Date.now()-a.getTime());return b<=e?{state:"active",timestamp:a}:b<=c?{state:"ready",timestamp:a}:{state:"idle",timestamp:a}}}let i=(0,d.Vo2)(g,e,c);return i||null},async recordActivity(a,b){a.workspacePath&&await (0,d.JyZ)(a.workspacePath,b,a=>this.detectActivity(a))},async isProcessRunning(a){try{if("tmux"===a.runtimeName&&a.id){let{stdout:b}=await aq("tmux",["list-panes","-t",a.id,"-F","#{pane_tty}"],{timeout:3e4}),c=b.trim().split("\n").map(a=>a.trim()).filter(Boolean);if(0===c.length)return!1;let{stdout:d}=await aq("ps",["-eo","pid,tty,args"],{timeout:3e4}),e=new Set(c.map(a=>a.replace(/^\/dev\//,""))),f=/(?:^|\/)opencode(?:\s|$)/;for(let a of d.split("\n")){let b=a.trimStart().split(/\s+/);if(b.length<3||!e.has(b[1]??""))continue;let c=b.slice(2).join(" ");if(f.test(c))return!0}return!1}let b=a.data.pid,c="number"==typeof b?b:Number(b);if(Number.isFinite(c)&&c>0)try{return process.kill(c,0),!0}catch(a){if(a instanceof Error&&"code"in a&&"EPERM"===a.code)return!0}return!1}catch{return!1}},async getSessionInfo(a){let b=await as(a);return b?{summary:b.title??null,summaryIsFallback:!0,agentSessionId:b.id}:null},async getRestoreCommand(a,b){let c=(0,d.HrC)(a.metadata?.opencodeSessionId)??(await as(a))?.id??null;if(!c)return null;let e=["opencode","--session",(0,d.kct)(c)],f=b.agentConfig;return f?.model&&e.push("--model",(0,d.kct)(f.model)),e.join(" ")},async setupWorkspaceHooks(a,b){},async postLaunchSetup(a){}}},detect:function(){try{return(0,e.execFileSync)("opencode",["version"],{stdio:"ignore",env:(0,d.RxI)()}),!0}catch{return!1}}},au=(0,f.promisify)(e.execFile);async function av(a,...b){let{stdout:c}=await au("git",b,{cwd:a});return c.trimEnd()}async function aw(a){try{return await av(a,"remote","get-url","origin"),!0}catch{return!1}}async function ax(a,b){try{return await av(a,"rev-parse","--verify","--quiet",b),!0}catch{return!1}}async function ay(a,b,c){if(c?.hasOrigin??await aw(a)){if(c?.branch){let b=`origin/${c.branch}`;if(await ax(a,b))return b}let d=`origin/${b}`;if(await ax(a,d))return d}let d=`refs/heads/${b}`;if(await ax(a,d))return d;throw Error(`Unable to resolve base ref for default branch "${b}"`)}async function az(a,b){try{return(await av(a,"worktree","list","--porcelain")).split("\n").some(a=>a.startsWith("worktree ")&&a.slice(9)===b)}catch{return!1}}async function aA(a,b){if((0,i.existsSync)(b)){try{await av(a,"worktree","prune")}catch{}if(await az(a,b))throw Error(`Worktree path "${b}" already exists and is still registered with git`);(0,i.rmSync)(b,{recursive:!0,force:!0})}}let aB=/^[a-zA-Z0-9_-]+$/;function aC(a,b){if(!aB.test(a))throw Error(`Invalid ${b} "${a}": must match ${aB}`)}function aD(a){return a.startsWith("~/")?(0,k.join)((0,j.homedir)(),a.slice(2)):a}let aE={manifest:{name:"worktree",slot:"workspace",description:"Workspace plugin: git worktrees",version:"0.1.0"},create:function(a){let b=a?.worktreeDir?aD(a.worktreeDir):(0,k.join)((0,j.homedir)(),".worktrees");return{name:"worktree",async create(a){aC(a.projectId,"projectId"),aC(a.sessionId,"sessionId");let c=aD(a.project.path),d=a.worktreeDir??b,e=a.worktreeDir?d:(0,k.join)(d,a.projectId),f=(0,k.join)(e,a.sessionId);(0,i.mkdirSync)(e,{recursive:!0}),await aA(c,f);let g=await aw(c);if(g)try{await av(c,"fetch","origin","--quiet")}catch{}let h=await ay(c,a.project.defaultBranch,{hasOrigin:g});try{await av(c,"worktree","add","-b",a.branch,f,h)}catch(d){let b=d instanceof Error?d.message:String(d);if(!b.includes("already exists"))throw Error(`Failed to create worktree for branch "${a.branch}": ${b}`,{cause:d});await av(c,"worktree","add",f,h);try{await av(f,"checkout",a.branch)}catch(d){try{await av(c,"worktree","remove","--force",f)}catch{}let b=d instanceof Error?d.message:String(d);throw Error(`Failed to checkout branch "${a.branch}" in worktree: ${b}`,{cause:d})}}return{path:f,branch:a.branch,sessionId:a.sessionId,projectId:a.projectId}},async destroy(a){try{let b=await av(a,"rev-parse","--path-format=absolute","--git-common-dir"),c=(0,k.resolve)(b,"..");await av(c,"worktree","remove","--force",a)}catch{(0,i.existsSync)(a)&&(0,i.rmSync)(a,{recursive:!0,force:!0})}},async list(a){aC(a,"projectId");let c=(0,k.join)(b,a);if(!(0,i.existsSync)(c))return[];let d=(0,i.readdirSync)(c,{withFileTypes:!0}).filter(a=>a.isDirectory()).map(a=>(0,k.join)(c,a.name));if(0===d.length)return[];let e="";for(let a of d)try{e=await av(a,"worktree","list","--porcelain");break}catch{continue}if(!e)return[];let f=[];for(let b of e.split("\n\n")){let d=b.trim().split("\n"),e="",g="";for(let a of d)a.startsWith("worktree ")?e=a.slice(9):a.startsWith("branch ")&&(g=a.slice(7).replace("refs/heads/",""));if(e&&(e===c||e.startsWith(c+"/"))){let b=(0,k.basename)(e);f.push({path:e,branch:g||"detached",sessionId:b,projectId:a})}}return f},async exists(a){if(!(0,i.existsSync)(a))return!1;try{return await au("git",["rev-parse","--is-inside-work-tree"],{cwd:a,timeout:3e4}),!0}catch{return!1}},async restore(a,b){let c=aD(a.project.path);try{await av(c,"worktree","prune")}catch{}let d=await aw(c);if(d)try{await av(c,"fetch","origin","--quiet")}catch{}try{await av(c,"worktree","add",b,a.branch)}catch{let e=await ay(c,a.project.defaultBranch,{branch:a.branch,hasOrigin:d});if(e.startsWith("origin/"))try{await av(c,"worktree","add","-b",a.branch,b,e)}catch{await av(c,"worktree","add","-b",a.branch,b,`refs/heads/${a.project.defaultBranch}`)}else await av(c,"worktree","add","-b",a.branch,b,e)}return{path:b,branch:a.branch,sessionId:a.sessionId,projectId:a.projectId}},async postCreate(a,b){let c=aD(b.path);if(b.symlinks)for(let d of b.symlinks){if(d.startsWith("/")||d.includes(".."))throw Error(`Invalid symlink path "${d}": must be a relative path without ".." segments`);let b=(0,k.join)(c,d),e=(0,k.resolve)(a.path,d);if(!e.startsWith(a.path+"/")&&e!==a.path)throw Error(`Symlink target "${d}" resolves outside workspace: ${e}`);if((0,i.existsSync)(b)){try{let a=(0,i.lstatSync)(e);(a.isSymbolicLink()||a.isFile()||a.isDirectory())&&(0,i.rmSync)(e,{recursive:!0,force:!0})}catch{}(0,i.mkdirSync)((0,k.dirname)(e),{recursive:!0}),(0,i.symlinkSync)(b,e)}}if(b.postCreate)for(let c of b.postCreate)await au("sh",["-c",c],{cwd:a.path})}}}};class aF{constructor(a){if(this.cache=new Map,this.accessOrder=[],this.maxSize=a,a<=0)throw Error("LRUCache maxSize must be greater than 0")}get(a){if(this.cache.has(a))return this.moveToEnd(a),this.cache.get(a)}set(a,b){if(this.cache.has(a)){this.moveToEnd(a),this.cache.set(a,b);return}if(this.cache.set(a,b),this.accessOrder.push(a),this.accessOrder.length>this.maxSize){let a=this.accessOrder.shift();void 0!==a&&this.cache.delete(a)}}delete(a){this.cache.delete(a);let b=this.accessOrder.indexOf(a);-1!==b&&this.accessOrder.splice(b,1)}clear(){this.cache.clear(),this.accessOrder=[]}get size(){return this.cache.size}has(a){return this.cache.has(a)}keys(){return[...this.accessOrder]}moveToEnd(a){let b=this.accessOrder.indexOf(a);-1!==b&&(this.accessOrder.splice(b,1),this.accessOrder.push(a))}toMap(){return new Map(this.cache)}}let aG=(0,f.promisify)(e.execFile),aH=async(a,b,c)=>(0,d.vQK)(a,{component:"scm-github-batch",operation:c},b),aI={prList:new aF(100),commitStatus:new aF(500),reviewComments:new aF(500)};function aJ(a,b,c){aI.prList.set(`${a}/${b}`,c)}function aK(a,b,c,d){aI.commitStatus.set(`${a}/${b}#${c}`,d)}let aL=new aF(200),aM=new aF(200);async function aN(a,b=[],c){let d=[],e=!1,f=new Map;for(let b of a){let a=`${b.owner}/${b.repo}`;f.has(a)||f.set(a,[]);let c=f.get(a);c&&c.push(b)}for(let a of b)f.has(a)||f.set(a,[]);if(0===f.size)return{shouldRefresh:!1,details:["No repos to check"],prListUnchangedRepos:new Set};let g=!1,h=new Set;for(let[a]of f){let[b,f]=a.split("/");await aS(b,f,c)?(g=!0,e=!0,d.push(`PR list changed for ${a} (Guard 1)`)):h.add(a)}if(!g)for(let b of a){let a=`${b.owner}/${b.repo}#${b.number}`,f=aL.get(a);if(f&&null===f.headSha){e=!0,d.push(`First time seeing PR #${b.number} (Guard 2: no cached head SHA)`);continue}f&&f.headSha&&await aT(b.owner,b.repo,f.headSha,c)&&(e=!0,d.push(`CI status changed for ${b.owner}/${b.repo}#${b.number} (Guard 2)`))}return{shouldRefresh:e,details:d,prListUnchangedRepos:h}}async function aO(){try{await aG("gh",["--version"],{timeout:5e3})}catch{let a=Error("gh CLI not available or not authenticated. GraphQL batch enrichment requires gh CLI to be installed and configured.");throw a.cause="GH_CLI_UNAVAILABLE",a}}function aP(a){return/HTTP\/[\d.]+ 304/i.test(a)}function aQ(a){let b=("string"==typeof a.stdout?a.stdout:"")+("string"==typeof a.stderr?a.stderr:"");return b.length>0?b:null}function aR(a){let b=a.match(/etag:\s*(.+)/i);return b?b[1].trim():void 0}async function aS(a,b,c){let d=`${a}/${b}`,e=aI.prList.get(d),f=["api","--method","GET",`repos/${d}/pulls?state=open&sort=updated&direction=desc&per_page=1`,"-i"];e&&f.push("-H",`If-None-Match: ${e}`);try{let c=await aH(f,1e4,"gh.api.guard-pr-list");if(aP(c)){let d=aR(c);return d&&aJ(a,b,d),!1}let d=aR(c);return d&&aJ(a,b,d),!0}catch(g){let e=aQ(g);if(e&&aP(e)){let c=aR(e);return c&&aJ(a,b,c),!1}let f=g instanceof Error?g.message:String(g);if(aP(f))return!1;return c?.log("warn",`[ETag Guard 1] PR list check failed for ${d}: ${f}`),!0}}async function aT(a,b,c,d){let e=`${a}/${b}#${c}`,f=aI.commitStatus.get(e),g=["api","--method","GET",`repos/${a}/${b}/commits/${c}/check-runs?per_page=1`,"-i"];f&&g.push("-H",`If-None-Match: ${f}`);try{let d=await aH(g,1e4,"gh.api.guard-commit-status");if(aP(d)){let e=aR(d);return e&&aK(a,b,c,e),!1}let e=aR(d);return e&&aK(a,b,c,e),!0}catch(h){let f=aQ(h);if(f&&aP(f)){let d=aR(f);return d&&aK(a,b,c,d),!1}let g=h instanceof Error?h.message:String(h);if(aP(g))return!1;return d?.log("warn",`[ETag Guard 2] Commit status check failed for ${e}: ${g}`),!0}}async function aU(a,b,c,d){let e=`${a}/${b}#${c}`,f=aI.reviewComments.get(e),g=["api","--method","GET",`repos/${a}/${b}/pulls/${c}/comments`,"-i"];f&&g.push("-H",`If-None-Match: ${f}`);try{let a=await aH(g,1e4,"gh.api.guard-review-comments");if(aP(a)){let b=aR(a);return b&&aI.reviewComments.set(e,b),!1}let b=aR(a);return b&&aI.reviewComments.set(e,b),!0}catch(c){let a=aQ(c);if(a&&aP(a)){let b=aR(a);return b&&aI.reviewComments.set(e,b),!1}let b=c instanceof Error?c.message:String(c);if(aP(b))return!1;return d?.log("warn",`[ETag Guard 3] Review comments check failed for ${e}: ${b}`),!0}}let aV=`
|
|
245
|
+
`.trim().replace(/\n/g," ").replace(/\s+/g," "),g=["opencode","run",...b,"--command","true"].join(" "),i=[...h?["--prompt",h]:[],...c],j=i.length>0?` ${i.join(" ")}`:"",k=(0,d.kct)(`failed to discover OpenCode session ID for AO:${a.sessionId}`);return`SES_ID=$(${g} | node -e ${(0,d.kct)(e)}); if [ -z "$SES_ID" ]; then SES_ID=$(opencode session list --format json | node -e ${(0,d.kct)(f)} ${(0,d.kct)(`AO:${a.sessionId}`)}); fi; [ -n "$SES_ID" ] && exec opencode --session "$SES_ID"${j}; echo ${k} >&2; exit 1`}return h&&b.push("--prompt",h),b.push(...c),["opencode",...b].join(" ")},getEnvironment(a){let b={};b.AO_SESSION_ID=a.sessionId,a.issueId&&(b.AO_ISSUE_ID=a.issueId);let c=(0,d.sa4)();return b.TMPDIR=c,b.TMP=c,b.TEMP=c,b},detectActivity(a){if(!a.trim())return"idle";let b=a.trim().split("\n"),c=b[b.length-1]?.trim()??"";if(/^[>$#]\s*$/.test(c))return"idle";let d=b.slice(-5).join("\n");return/\(Y\)es.*\(N\)o/i.test(d)||/approval required/i.test(d)||/Do you want to proceed\?/i.test(d)||/Allow .+\?/i.test(d)?"waiting_input":"active"},async getActivityState(a,b){let c=b??d.PES,e=Math.min(d.V1$,c),f=new Date;if(!a.runtimeHandle||!await this.isProcessRunning(a.runtimeHandle))return{state:"exited",timestamp:f};let g=null;if(a.workspacePath){g=await (0,d.Ahw)(a.workspacePath);let b=(0,d.Bmx)(g);if(b)return b}let h=await ar(a);if(h){let a=aq(h.updated);if(a){let b=Math.max(0,Date.now()-a.getTime());return b<=e?{state:"active",timestamp:a}:b<=c?{state:"ready",timestamp:a}:{state:"idle",timestamp:a}}}let i=(0,d.Vo2)(g,e,c);return i||null},async recordActivity(a,b){a.workspacePath&&await (0,d.JyZ)(a.workspacePath,b,a=>this.detectActivity(a))},async isProcessRunning(a){try{if("tmux"===a.runtimeName&&a.id){let{stdout:b}=await ap("tmux",["list-panes","-t",a.id,"-F","#{pane_tty}"],{timeout:3e4}),c=b.trim().split("\n").map(a=>a.trim()).filter(Boolean);if(0===c.length)return!1;let{stdout:d}=await ap("ps",["-eo","pid,tty,args"],{timeout:3e4}),e=new Set(c.map(a=>a.replace(/^\/dev\//,""))),f=/(?:^|\/)opencode(?:\s|$)/;for(let a of d.split("\n")){let b=a.trimStart().split(/\s+/);if(b.length<3||!e.has(b[1]??""))continue;let c=b.slice(2).join(" ");if(f.test(c))return!0}return!1}let b=a.data.pid,c="number"==typeof b?b:Number(b);if(Number.isFinite(c)&&c>0)try{return process.kill(c,0),!0}catch(a){if(a instanceof Error&&"code"in a&&"EPERM"===a.code)return!0}return!1}catch{return!1}},async getSessionInfo(a){let b=await ar(a);return b?{summary:b.title??null,summaryIsFallback:!0,agentSessionId:b.id}:null},async getRestoreCommand(a,b){let c=(0,d.HrC)(a.metadata?.opencodeSessionId)??(await ar(a))?.id??null;if(!c)return null;let e=["opencode","--session",(0,d.kct)(c)],f=b.agentConfig;return f?.model&&e.push("--model",(0,d.kct)(f.model)),e.join(" ")},async setupWorkspaceHooks(a,b){},async postLaunchSetup(a){}}},detect:function(){try{return(0,e.execFileSync)("opencode",["version"],{stdio:"ignore",env:(0,d.RxI)()}),!0}catch{return!1}}},at=(0,f.promisify)(e.execFile);async function au(a,...b){let{stdout:c}=await at("git",b,{cwd:a,timeout:3e4});return c.trimEnd()}async function av(a){try{return await au(a,"remote","get-url","origin"),!0}catch{return!1}}async function aw(a,b){try{return await au(a,"rev-parse","--verify","--quiet",b),!0}catch{return!1}}async function ax(a,b,c){if(c?.hasOrigin??await av(a)){if(c?.branch){let b=`origin/${c.branch}`;if(await aw(a,b))return b}let d=`origin/${b}`;if(await aw(a,d))return d}let d=`refs/heads/${b}`;if(await aw(a,d))return d;throw Error(`Unable to resolve base ref for default branch "${b}"`)}async function ay(a,b){try{return(await au(a,"worktree","list","--porcelain")).split("\n").some(a=>a.startsWith("worktree ")&&a.slice(9)===b)}catch{return!1}}async function az(a,b){if((0,i.existsSync)(b)){try{await au(a,"worktree","prune")}catch{}if(await ay(a,b))throw Error(`Worktree path "${b}" already exists and is still registered with git`);(0,i.rmSync)(b,{recursive:!0,force:!0})}}let aA=/^[a-zA-Z0-9_-]+$/;function aB(a,b){if(!aA.test(a))throw Error(`Invalid ${b} "${a}": must match ${aA}`)}function aC(a){return a.startsWith("~/")?(0,k.join)((0,j.homedir)(),a.slice(2)):a}let aD={manifest:{name:"worktree",slot:"workspace",description:"Workspace plugin: git worktrees",version:"0.1.0"},create:function(a){let b=a?.worktreeDir?aC(a.worktreeDir):(0,k.join)((0,j.homedir)(),".worktrees");return{name:"worktree",async create(a){aB(a.projectId,"projectId"),aB(a.sessionId,"sessionId");let c=aC(a.project.path),d=a.worktreeDir??b,e=a.worktreeDir?d:(0,k.join)(d,a.projectId),f=(0,k.join)(e,a.sessionId);(0,i.mkdirSync)(e,{recursive:!0}),await az(c,f);let g=await av(c);if(g)try{await au(c,"fetch","origin","--quiet")}catch{}let h=await ax(c,a.project.defaultBranch,{hasOrigin:g});try{await au(c,"worktree","add","-b",a.branch,f,h)}catch(d){let b=d instanceof Error?d.message:String(d);if(!b.includes("already exists"))throw Error(`Failed to create worktree for branch "${a.branch}": ${b}`,{cause:d});await au(c,"worktree","add",f,h);try{await au(f,"checkout",a.branch)}catch(d){try{await au(c,"worktree","remove","--force",f)}catch{}let b=d instanceof Error?d.message:String(d);throw Error(`Failed to checkout branch "${a.branch}" in worktree: ${b}`,{cause:d})}}return{path:f,branch:a.branch,sessionId:a.sessionId,projectId:a.projectId}},async findManagedWorkspace(a){aB(a.projectId,"projectId"),aB(a.sessionId,"sessionId");let c=aC(a.project.path),d=a.worktreeDir??b,e=a.worktreeDir?d:(0,k.join)(d,a.projectId),f=new Set([(0,k.resolve)((0,k.join)(e,a.sessionId)),(0,k.resolve)((0,k.join)(b,a.projectId,a.sessionId))]),g=(function(a){let b=a.replace(/\r\n/g,"\n").trim();return b?b.split("\n\n").map(a=>{let b="",c=null;for(let d of a.split("\n"))d.startsWith("worktree ")?b=(0,k.resolve)(d.slice(9)):d.startsWith("branch ")&&(c=d.slice(7).replace("refs/heads/",""));return{path:b,branch:c}}).filter(a=>a.path.length>0):[]})(await au(c,"worktree","list","--porcelain")).filter(b=>b.branch===a.branch&&(0,i.existsSync)(b.path));if(0===g.length)return null;if(g.length>1)throw Error(`Found multiple worktrees for orchestrator branch "${a.branch}". Reuse one workspace or remove the extras before starting the orchestrator.`);let h=g[0];if(!f.has(h.path))throw Error(`Found existing worktree for orchestrator branch "${a.branch}" at "${h.path}", but it is outside AO-managed worktree directories. Reuse it manually or remove it and try again.`);return{path:h.path,branch:a.branch,sessionId:a.sessionId,projectId:a.projectId}},async destroy(a){try{let b=await au(a,"rev-parse","--path-format=absolute","--git-common-dir"),c=(0,k.resolve)(b,"..");await au(c,"worktree","remove","--force",a)}catch{(0,i.existsSync)(a)&&(0,i.rmSync)(a,{recursive:!0,force:!0})}},async list(a){aB(a,"projectId");let c=(0,k.join)(b,a);if(!(0,i.existsSync)(c))return[];let d=(0,i.readdirSync)(c,{withFileTypes:!0}).filter(a=>a.isDirectory()).map(a=>(0,k.join)(c,a.name));if(0===d.length)return[];let e="";for(let a of d)try{e=await au(a,"worktree","list","--porcelain");break}catch{continue}if(!e)return[];let f=[];for(let b of e.split("\n\n")){let d=b.trim().split("\n"),e="",g="";for(let a of d)a.startsWith("worktree ")?e=a.slice(9):a.startsWith("branch ")&&(g=a.slice(7).replace("refs/heads/",""));if(e&&(e===c||e.startsWith(c+"/"))){let b=(0,k.basename)(e);f.push({path:e,branch:g||"detached",sessionId:b,projectId:a})}}return f},async exists(a){if(!(0,i.existsSync)(a))return!1;try{return await at("git",["rev-parse","--is-inside-work-tree"],{cwd:a,timeout:3e4}),!0}catch{return!1}},async restore(a,b){let c=aC(a.project.path);try{await au(c,"worktree","prune")}catch{}let d=await av(c);if(d)try{await au(c,"fetch","origin","--quiet")}catch{}try{await au(c,"worktree","add",b,a.branch)}catch{let e=await ax(c,a.project.defaultBranch,{branch:a.branch,hasOrigin:d});if(e.startsWith("origin/"))try{await au(c,"worktree","add","-b",a.branch,b,e)}catch{await au(c,"worktree","add","-b",a.branch,b,`refs/heads/${a.project.defaultBranch}`)}else await au(c,"worktree","add","-b",a.branch,b,e)}return{path:b,branch:a.branch,sessionId:a.sessionId,projectId:a.projectId}},async postCreate(a,b){let c=aC(b.path);if(b.symlinks)for(let d of b.symlinks){if(d.startsWith("/")||d.includes(".."))throw Error(`Invalid symlink path "${d}": must be a relative path without ".." segments`);let b=(0,k.join)(c,d),e=(0,k.resolve)(a.path,d);if(!e.startsWith(a.path+"/")&&e!==a.path)throw Error(`Symlink target "${d}" resolves outside workspace: ${e}`);if((0,i.existsSync)(b)){try{let a=(0,i.lstatSync)(e);(a.isSymbolicLink()||a.isFile()||a.isDirectory())&&(0,i.rmSync)(e,{recursive:!0,force:!0})}catch{}(0,i.mkdirSync)((0,k.dirname)(e),{recursive:!0}),(0,i.symlinkSync)(b,e)}}if(b.postCreate)for(let c of b.postCreate)await at("sh",["-c",c],{cwd:a.path})}}}};class aE{constructor(a){if(this.cache=new Map,this.accessOrder=[],this.maxSize=a,a<=0)throw Error("LRUCache maxSize must be greater than 0")}get(a){if(this.cache.has(a))return this.moveToEnd(a),this.cache.get(a)}set(a,b){if(this.cache.has(a)){this.moveToEnd(a),this.cache.set(a,b);return}if(this.cache.set(a,b),this.accessOrder.push(a),this.accessOrder.length>this.maxSize){let a=this.accessOrder.shift();void 0!==a&&this.cache.delete(a)}}delete(a){this.cache.delete(a);let b=this.accessOrder.indexOf(a);-1!==b&&this.accessOrder.splice(b,1)}clear(){this.cache.clear(),this.accessOrder=[]}get size(){return this.cache.size}has(a){return this.cache.has(a)}keys(){return[...this.accessOrder]}moveToEnd(a){let b=this.accessOrder.indexOf(a);-1!==b&&(this.accessOrder.splice(b,1),this.accessOrder.push(a))}toMap(){return new Map(this.cache)}}let aF=(0,f.promisify)(e.execFile),aG=async(a,b,c)=>(0,d.vQK)(a,{component:"scm-github-batch",operation:c},b),aH={prList:new aE(100),commitStatus:new aE(500),reviewComments:new aE(500)};function aI(a,b,c){aH.prList.set(`${a}/${b}`,c)}function aJ(a,b,c,d){aH.commitStatus.set(`${a}/${b}#${c}`,d)}let aK=new aE(200),aL=new aE(200);async function aM(a,b=[],c){let d=[],e=!1,f=new Map;for(let b of a){let a=`${b.owner}/${b.repo}`;f.has(a)||f.set(a,[]);let c=f.get(a);c&&c.push(b)}for(let a of b)f.has(a)||f.set(a,[]);if(0===f.size)return{shouldRefresh:!1,details:["No repos to check"],prListUnchangedRepos:new Set};let g=!1,h=new Set;for(let[a]of f){let[b,f]=a.split("/");await aR(b,f,c)?(g=!0,e=!0,d.push(`PR list changed for ${a} (Guard 1)`)):h.add(a)}if(!g)for(let b of a){let a=`${b.owner}/${b.repo}#${b.number}`,f=aK.get(a);if(f&&null===f.headSha){e=!0,d.push(`First time seeing PR #${b.number} (Guard 2: no cached head SHA)`);continue}f&&f.headSha&&await aS(b.owner,b.repo,f.headSha,c)&&(e=!0,d.push(`CI status changed for ${b.owner}/${b.repo}#${b.number} (Guard 2)`))}return{shouldRefresh:e,details:d,prListUnchangedRepos:h}}async function aN(){try{await aF("gh",["--version"],{timeout:5e3})}catch{let a=Error("gh CLI not available or not authenticated. GraphQL batch enrichment requires gh CLI to be installed and configured.");throw a.cause="GH_CLI_UNAVAILABLE",a}}function aO(a){return/HTTP\/[\d.]+ 304/i.test(a)}function aP(a){let b=("string"==typeof a.stdout?a.stdout:"")+("string"==typeof a.stderr?a.stderr:"");return b.length>0?b:null}function aQ(a){let b=a.match(/etag:\s*(.+)/i);return b?b[1].trim():void 0}async function aR(a,b,c){let d=`${a}/${b}`,e=aH.prList.get(d),f=["api","--method","GET",`repos/${d}/pulls?state=open&sort=updated&direction=desc&per_page=1`,"-i"];e&&f.push("-H",`If-None-Match: ${e}`);try{let c=await aG(f,1e4,"gh.api.guard-pr-list");if(aO(c)){let d=aQ(c);return d&&aI(a,b,d),!1}let d=aQ(c);return d&&aI(a,b,d),!0}catch(g){let e=aP(g);if(e&&aO(e)){let c=aQ(e);return c&&aI(a,b,c),!1}let f=g instanceof Error?g.message:String(g);if(aO(f))return!1;return c?.log("warn",`[ETag Guard 1] PR list check failed for ${d}: ${f}`),!0}}async function aS(a,b,c,d){let e=`${a}/${b}#${c}`,f=aH.commitStatus.get(e),g=["api","--method","GET",`repos/${a}/${b}/commits/${c}/check-runs?per_page=1`,"-i"];f&&g.push("-H",`If-None-Match: ${f}`);try{let d=await aG(g,1e4,"gh.api.guard-commit-status");if(aO(d)){let e=aQ(d);return e&&aJ(a,b,c,e),!1}let e=aQ(d);return e&&aJ(a,b,c,e),!0}catch(h){let f=aP(h);if(f&&aO(f)){let d=aQ(f);return d&&aJ(a,b,c,d),!1}let g=h instanceof Error?h.message:String(h);if(aO(g))return!1;return d?.log("warn",`[ETag Guard 2] Commit status check failed for ${e}: ${g}`),!0}}async function aT(a,b,c,d){let e=`${a}/${b}#${c}`,f=aH.reviewComments.get(e),g=["api","--method","GET",`repos/${a}/${b}/pulls/${c}/comments`,"-i"];f&&g.push("-H",`If-None-Match: ${f}`);try{let a=await aG(g,1e4,"gh.api.guard-review-comments");if(aO(a)){let b=aQ(a);return b&&aH.reviewComments.set(e,b),!1}let b=aQ(a);return b&&aH.reviewComments.set(e,b),!0}catch(c){let a=aP(c);if(a&&aO(a)){let b=aQ(a);return b&&aH.reviewComments.set(e,b),!1}let b=c instanceof Error?c.message:String(c);if(aO(b))return!1;return d?.log("warn",`[ETag Guard 3] Review comments check failed for ${e}: ${b}`),!0}}let aU=`
|
|
246
246
|
title
|
|
247
247
|
state
|
|
248
248
|
additions
|
|
@@ -284,16 +284,16 @@ process.stdin.on('data', c => input += c).on('end', () => {
|
|
|
284
284
|
}
|
|
285
285
|
}
|
|
286
286
|
}
|
|
287
|
-
`;async function
|
|
287
|
+
`;async function aV(a){let{query:b,variables:c}=function(a){if(0===a.length)return{query:"",variables:{}};let b=[],c={};a.forEach((a,d)=>{let e=`pr${d}`;b.push(`
|
|
288
288
|
${e}: repository(owner: $${e}Owner, name: $${e}Name) {
|
|
289
289
|
... on Repository {
|
|
290
|
-
pullRequest(number: $${e}Number) { ${
|
|
290
|
+
pullRequest(number: $${e}Number) { ${aU} }
|
|
291
291
|
}
|
|
292
292
|
}
|
|
293
293
|
`),c[`${e}Owner`]=a.owner,c[`${e}Name`]=a.repo,c[`${e}Number`]=a.number});let d=Object.entries(c).map(([a,b])=>`$${a}: ${"number"==typeof b?"Int!":"String!"}`).join(", ");return{query:`query BatchPRs(${d}) {
|
|
294
294
|
${b.join("\n")}
|
|
295
295
|
rateLimit { cost remaining resetAt }
|
|
296
|
-
}`,variables:c}}(a);if(!b||0===a.length)return{};await aO();let d=[];for(let[a,b]of Object.entries(c))"string"==typeof b?d.push("-f",`${a}=${b}`):d.push("-F",`${a}=${b}`);let e=["api","graphql","-i",...d,"-f",`query=${b}`],f=3e4+Math.max(0,(a.length-10)*2e3),g=await aH(e,f,"gh.api.graphql-batch"),h=g.indexOf("\r\n\r\n"),i=g.indexOf("\n\n"),j=h>=0&&(i<0||h<i)?h+4:i>=0?i+2:0,k=JSON.parse((j>0?g.slice(j):g).trim());if(k.errors&&k.errors.length>0){let a=k.errors.map(a=>a.message).join("; ");throw Error(`GraphQL query errors: ${a}`)}return k.data??{}}async function aX(a,b,c=[]){let d=new Map,e=await aN(a,c,b);if(b?.reportPRListUnchangedRepos?.(e.prListUnchangedRepos),!e.shouldRefresh){let c=[];for(let b of a){let a=`${b.owner}/${b.repo}#${b.number}`,e=aM.get(a);e?d.set(a,e):c.push(b)}if(0===c.length)return b?.log("info",`[ETag Guard] Skipping GraphQL batch - all ${d.size} PRs cached. Reasons: ${e.details.join(", ")}`),{enrichment:d,prListUnchangedRepos:e.prListUnchangedRepos};b?.log("info",`[ETag Guard] Partial cache: ${d.size} cached, ${c.length} missing. Fetching missing PRs via GraphQL.`),a=c}let f=[];for(let b=0;b<a.length;b+=25)f.push(a.slice(b,b+25));for(let a=0;a<f.length;a++){let c,e=f[a],g=d.size,h=Date.now();try{let i=await aW(e);c=Date.now()-h,e.forEach((a,b)=>{let c=`pr${b}`,e=`${a.owner}/${a.repo}#${a.number}`,f=i[c];if(f?.pullRequest){let a=function(a){if(!a||"object"!=typeof a||void 0===a.state&&void 0===a.title&&void 0===a.commits)return null;let b=function(a){let b="string"==typeof a?a.toUpperCase():"";return"MERGED"===b?"merged":"CLOSED"===b?"closed":"open"}(a.state),c="string"==typeof a.title?a.title:void 0,d="number"==typeof a.additions?a.additions:0,e="number"==typeof a.deletions?a.deletions:0,f=!0===a.isDraft,g="string"==typeof a.headRefOid?a.headRefOid:"string"==typeof a.headSha?a.headSha:null,h=a.mergeable,i="string"==typeof a.mergeStateStatus?a.mergeStateStatus.toUpperCase():"",j="CONFLICTING"===h,k="BEHIND"===i,l=function(a){let b="string"==typeof a?a.toUpperCase():"";return"APPROVED"===b?"approved":"CHANGES_REQUESTED"===b?"changes_requested":"REVIEW_REQUIRED"===b?"pending":"none"}(a.reviewDecision),m=a.commits,n=m?.nodes?.[0]?.commit?.statusCheckRollup,o=n?function(a){if(!a||"object"!=typeof a)return"none";let b="string"==typeof a.state?a.state.toUpperCase():"";return"SUCCESS"===b?"passing":"FAILURE"===b||"ERROR"===b?"failing":"PENDING"===b||"EXPECTED"===b?"pending":"TIMED_OUT"===b||"CANCELLED"===b||"ACTION_REQUIRED"===b?"failing":"QUEUED"===b||"IN_PROGRESS"===b||"WAITING"===b?"pending":"none"}(n):"none",p=n?.contexts,q=p?.pageInfo,r=null!=q&&"object"==typeof q&&!0===q.hasNextPage,s=p&&!r?function(a){if(!a||"object"!=typeof a)return[];let b=a.nodes;if(!Array.isArray(b))return[];let c=[];for(let a of b)if(a&&"object"==typeof a){if("string"==typeof a.name&&"string"==typeof a.status){let b,d=a.status.toUpperCase(),e="string"==typeof a.conclusion?a.conclusion.toUpperCase():null;b="COMPLETED"===d?"SUCCESS"===e?"passed":"SKIPPED"===e||"NEUTRAL"===e||"STALE"===e||"NOT_REQUIRED"===e||"NONE"===e?"skipped":"FAILURE"===e||"TIMED_OUT"===e||"CANCELLED"===e||"ACTION_REQUIRED"===e||"ERROR"===e?"failed":"skipped":"IN_PROGRESS"===d?"running":"pending",c.push({name:a.name,status:b,conclusion:e??void 0,url:"string"==typeof a.detailsUrl?a.detailsUrl:void 0});continue}if("string"==typeof a.context&&"string"==typeof a.state){let b,d=a.state.toUpperCase();b="SUCCESS"===d?"passed":"FAILURE"===d||"ERROR"===d?"failed":"pending",c.push({name:a.context,status:b,conclusion:d,url:"string"==typeof a.targetUrl?a.targetUrl:void 0})}}return c}(p):void 0,t=[];"failing"===o&&t.push("CI is failing"),"changes_requested"===l&&t.push("Changes requested in review"),"pending"===l&&t.push("Review required"),j&&t.push("Merge conflicts"),k&&t.push("Branch is behind base branch"),f&&t.push("PR is still a draft");let u="open"===b&&("passing"===o||"none"===o)&&("approved"===l||"none"===l)&&!j&&!k&&!f;return{data:{state:b,ciStatus:o,reviewDecision:l,mergeable:u,title:c,additions:d,deletions:e,isDraft:f,hasConflicts:j,isBehind:k,blockers:t,...void 0!==s?{ciChecks:s}:{}},headSha:g}}(f.pullRequest);if(a){let{data:b,headSha:c}=a;d.set(e,b),aL.set(e,{headSha:c,ciStatus:b.ciStatus}),aM.set(e,b)}}});let j=d.size;if(j>g){let d={batchIndex:a,totalBatches:f.length,prCount:j-g,durationMs:c};b?.recordSuccess(d),b?.log("info",`[GraphQL Batch Success] Batch ${a+1}/${f.length} succeeded: added ${j-g} PRs to cache (${c}ms)`)}}catch(g){c=Date.now()-h;let d=g instanceof Error?g.message:String(g);b?.recordFailure({batchIndex:a,totalBatches:f.length,prCount:e.length,error:d,durationMs:c}),b?.log("error",`[GraphQL Batch] Batch enrichment partially failed: ${d}`)}}return{enrichment:d,prListUnchangedRepos:e.prListUnchangedRepos}}function aY(a,b){let c=b.toLowerCase();for(let[b,d]of Object.entries(a))if(b.toLowerCase()===c){if(Array.isArray(d))return d[0];return d}}function aZ(a){if("string"!=typeof a)return;let b=new Date(a);return Number.isNaN(b.getTime())?void 0:b}function a$(a){return"string"!=typeof a||0===a.length?void 0:a.startsWith("refs/heads/")?a.slice(11):a.startsWith("refs/")?void 0:a}let a_=(0,f.promisify)(e.execFile),a0=new Set(["cursor[bot]","github-actions[bot]","codecov[bot]","sonarcloud[bot]","dependabot[bot]","renovate[bot]","codeclimate[bot]","deepsource-autofix[bot]","snyk-bot","lgtm-com[bot]"]);async function a1(a,b,c){try{let{stdout:d}=await a_(a,b,{...c?{cwd:c}:{},maxBuffer:0xa00000,timeout:3e4});return d.trim()}catch(c){throw Error(`${a} ${b.slice(0,3).join(" ")} failed: ${c.message}`,{cause:c})}}async function a2(a){return(0,d.vQK)(a,{component:"scm-github"},3e4)}async function a3(a,b){return(0,d.vQK)(a,{component:"scm-github",cwd:b},3e4)}async function a4(a,b){return a1("git",a,b)}function a5(a){let b=a.split("/");if(2!==b.length||!b[0]||!b[1])throw Error(`Invalid repo format "${a}", expected "owner/repo"`);return[b[0],b[1]]}function a6(a,b){let[c,d]=a5(b);return{number:a.number,url:a.url,title:a.title,owner:c,repo:d,branch:a.headRefName,baseBranch:a.baseRefName,isDraft:a.isDraft}}function a7(a){let b=(a??"").toUpperCase();return"IN_PROGRESS"===b?"running":"PENDING"===b||"QUEUED"===b||"REQUESTED"===b||"WAITING"===b||"EXPECTED"===b?"pending":"SUCCESS"===b?"passed":"FAILURE"===b||"TIMED_OUT"===b||"CANCELLED"===b||"ACTION_REQUIRED"===b||"ERROR"===b?"failed":("SKIPPED"===b||"NEUTRAL"===b||"STALE"===b||"NOT_REQUIRED"===b,"skipped")}async function a8(a){let b=JSON.parse(await a2(["pr","view",String(a.number),"--repo",ba(a),"--json","statusCheckRollup"]));return(Array.isArray(b.statusCheckRollup)?b.statusCheckRollup:[]).map(a=>{if(!a||"object"!=typeof a)return null;let b="string"==typeof a.name&&a.name||"string"==typeof a.context&&a.context;if(!b)return null;let c="string"==typeof a.conclusion?a.conclusion:"string"==typeof a.state?a.state:"string"==typeof a.status?a.status:void 0,d="string"==typeof a.link&&a.link||"string"==typeof a.detailsUrl&&a.detailsUrl||"string"==typeof a.targetUrl&&a.targetUrl||void 0,e="string"==typeof a.startedAt?a.startedAt:"string"==typeof a.createdAt?a.createdAt:void 0,f="string"==typeof a.completedAt?a.completedAt:void 0,g={name:b,status:a7(c),conclusion:"string"==typeof c?c.toUpperCase():void 0,startedAt:e?new Date(e):void 0,completedAt:f?new Date(f):void 0};return d&&(g.url=d),g}).filter(a=>null!==a)}function a9(a){let b=a.scm?.webhook;return{enabled:b?.enabled!==!1,path:b?.path??"/api/webhooks/github",secretEnvVar:b?.secretEnvVar,signatureHeader:b?.signatureHeader??"x-hub-signature-256",eventHeader:b?.eventHeader??"x-github-event",deliveryHeader:b?.deliveryHeader??"x-github-delivery",maxBodyBytes:b?.maxBodyBytes}}function ba(a){return`${a.owner}/${a.repo}`}function bb(a){if(!a)return new Date(0);let b=new Date(a);return isNaN(b.getTime())?new Date(0):b}let bc={resolvePR:6e4,getPRState:5e3,getPRSummary:5e3,getReviews:1e4,getReviewDecision:1e4,getCIChecks:5e3,getMergeability:5e3,getPendingComments:1e4,detectPR:3e4},bd={manifest:{name:"github",slot:"scm",description:"SCM plugin: GitHub PRs, CI checks, reviews, merge readiness",version:"0.1.0"},create:function(){return function(){let a,b=new Map,c=new Map;function e(a,b,c,d){return`${a}/${b}#${c}:${d}`}function f(a){let c=b.get(a);return c?Date.now()>c.expiresAt?(b.delete(a),null):c.value:null}function g(a,c,d){if(b.size>=1e3){let a=b.keys().next().value;void 0!==a&&b.delete(a)}b.set(a,{value:c,expiresAt:Date.now()+d})}function i(a){let d=`${a.owner}/${a.repo}#${a.number}:`;for(let a of b.keys())a.startsWith(d)&&b.delete(a);b.delete(e(a.owner,a.repo,a.branch,"detectPR")),c.delete(`${a.owner}/${a.repo}#${a.number}`)}async function j(a,b,c,d,h){let i=e(a,b,c,d),j=f(i);if(null!==j)return j;let k=await h();return g(i,k,bc[d]),k}return{name:"github",async verifyWebhook(a,b){let c=a9(b);if(!c.enabled)return{ok:!1,reason:"Webhook is disabled for this project"};if("POST"!==a.method.toUpperCase())return{ok:!1,reason:"Webhook requests must use POST"};if(void 0!==c.maxBodyBytes&&Buffer.byteLength(a.body,"utf8")>c.maxBodyBytes)return{ok:!1,reason:"Webhook payload exceeds configured maxBodyBytes"};let d=aY(a.headers,c.eventHeader);if(!d)return{ok:!1,reason:`Missing ${c.eventHeader} header`};let e=aY(a.headers,c.deliveryHeader),f=c.secretEnvVar;if(!f)return{ok:!0,deliveryId:e,eventType:d};let g=process.env[f];if(!g)return{ok:!1,reason:`Webhook secret env var ${f} is not configured`};let i=aY(a.headers,c.signatureHeader);return i?!function(a,b,c){if(!c.startsWith("sha256="))return!1;let d=(0,h.createHmac)("sha256",b).update(a).digest("hex"),e=c.slice(7),f=Buffer.from(d,"hex"),g=Buffer.from(e,"hex");return f.length===g.length&&(0,h.timingSafeEqual)(f,g)}(a.rawBody??a.body,g,i)?{ok:!1,reason:"Webhook signature verification failed",deliveryId:e,eventType:d}:{ok:!0,deliveryId:e,eventType:d}:{ok:!1,reason:`Missing ${c.signatureHeader} header`}},async parseWebhook(a,b){let c=a9(b),d=function(a){let b=JSON.parse(a);if(!b||"object"!=typeof b||Array.isArray(b))throw Error("Webhook payload must be a JSON object");return b}(a.body);return function(a,b,c){let d=aY(a.headers,c.eventHeader);if(!d)return null;let e=aY(a.headers,c.deliveryHeader),f=function(a){let b=a.repository;if(!b||"object"!=typeof b)return;let c=b.owner,d=c&&"object"==typeof c?c.login:void 0,e="string"==typeof d?d:void 0,f="string"==typeof b.name?b.name:void 0;if(e&&f)return{owner:e,name:f}}(b),g="string"==typeof b.action?b.action:d;if("pull_request"===d){let a=b.pull_request;if(!a||"object"!=typeof a)return null;let c=a.head;return{provider:"github",kind:"pull_request",action:g,rawEventType:d,deliveryId:e,repository:f,prNumber:"number"==typeof b.number?b.number:"number"==typeof a.number?a.number:void 0,branch:"string"==typeof c?.ref?c.ref:void 0,sha:"string"==typeof c?.sha?c.sha:void 0,timestamp:aZ(a.updated_at),data:b}}if("pull_request_review"===d||"pull_request_review_comment"===d){let a=b.pull_request;if(!a||"object"!=typeof a)return null;let c=a.head;return{provider:"github",kind:"pull_request_review"===d?"review":"comment",action:g,rawEventType:d,deliveryId:e,repository:f,prNumber:"number"==typeof b.number?b.number:"number"==typeof a.number?a.number:void 0,branch:"string"==typeof c?.ref?c.ref:void 0,sha:"string"==typeof c?.sha?c.sha:void 0,timestamp:"pull_request_review"===d?aZ(b.review?.submitted_at):aZ(b.comment?.updated_at??b.comment?.created_at),data:b}}if("issue_comment"===d){let a=b.issue;return a&&"object"==typeof a&&"pull_request"in a?{provider:"github",kind:"comment",action:g,rawEventType:d,deliveryId:e,repository:f,prNumber:"number"==typeof a.number?a.number:void 0,timestamp:aZ(b.comment?.updated_at??b.comment?.created_at),data:b}:null}if("check_run"===d||"check_suite"===d){let a=b[d],c=(Array.isArray(a?.pull_requests)?a?.pull_requests:[])[0];return{provider:"github",kind:"ci",action:g,rawEventType:d,deliveryId:e,repository:f,prNumber:"number"==typeof c?.number?c.number:void 0,branch:"string"==typeof a?.head_branch?a.head_branch:"string"==typeof a?.check_suite?.head_branch?(a?.check_suite).head_branch:void 0,sha:"string"==typeof a?.head_sha?a.head_sha:void 0,timestamp:aZ(a?.updated_at),data:b}}if("status"===d){let a=Array.isArray(b.branches)?b.branches:[];return{provider:"github",kind:"ci",action:"string"==typeof b.state?b.state:g,rawEventType:d,deliveryId:e,repository:f,branch:a$(a[0]?.name??b.ref),sha:"string"==typeof b.sha?b.sha:void 0,timestamp:aZ(b.updated_at),data:b}}if("push"===d){let a=b.head_commit&&"object"==typeof b.head_commit?b.head_commit:void 0;return{provider:"github",kind:"push",action:g,rawEventType:d,deliveryId:e,repository:f,branch:a$(b.ref),sha:"string"==typeof b.after?b.after:void 0,timestamp:aZ(a?.timestamp??b.updated_at),data:b}}return{provider:"github",kind:"unknown",action:g,rawEventType:d,deliveryId:e,repository:f,timestamp:aZ(b.updated_at),data:b}}(a,d,c)},async detectPR(a,b){if(!a.branch||!b.repo)return null;a5(b.repo);let[c,d]=b.repo.split("/"),h=e(c??"",d??"",a.branch,"detectPR"),i=f(h);if(null!==i)return i;try{let c=await a2(["pr","list","--repo",b.repo,"--head",a.branch,"--json","number,url,title,headRefName,baseRefName,isDraft","--limit","1"]),d=JSON.parse(c);if(0===d.length)return null;let e=a6(d[0],b.repo);return g(h,e,bc.detectPR),e}catch{return null}},async resolvePR(a,b){if(!b.repo)throw Error("Cannot resolve PR: project has no repo configured");let c=b.repo,[d,e]=c.split("/");return j(d??"",e??"",`ref=${a}`,"resolvePR",async()=>a6(JSON.parse(await a2(["pr","view",a,"--repo",c,"--json","number,url,title,headRefName,baseRefName,isDraft"])),c))},async assignPRToCurrentUser(a){await a2(["pr","edit",String(a.number),"--repo",ba(a),"--add-assignee","@me"]),i(a)},async checkoutPR(a,b){if(await a4(["branch","--show-current"],b)===a.branch)return!1;if(await a4(["status","--porcelain"],b))throw Error(`Workspace has uncommitted changes; cannot switch to PR branch "${a.branch}" safely`);return await a3(["pr","checkout",String(a.number),"--repo",ba(a)],b),!0},getPRState:async a=>j(a.owner,a.repo,String(a.number),"getPRState",async()=>{let b=JSON.parse(await a2(["pr","view",String(a.number),"--repo",ba(a),"--json","state"])).state.toUpperCase();return"MERGED"===b?"merged":"CLOSED"===b?"closed":"open"}),getPRSummary:async a=>j(a.owner,a.repo,String(a.number),"getPRSummary",async()=>{let b=JSON.parse(await a2(["pr","view",String(a.number),"--repo",ba(a),"--json","state,title,additions,deletions"])),c=b.state.toUpperCase();return{state:"MERGED"===c?"merged":"CLOSED"===c?"closed":"open",title:b.title??"",additions:b.additions??0,deletions:b.deletions??0}}),async mergePR(a,b="squash"){await a2(["pr","merge",String(a.number),"--repo",ba(a),"rebase"===b?"--rebase":"merge"===b?"--merge":"--squash","--delete-branch"]),i(a)},async closePR(a){await a2(["pr","close",String(a.number),"--repo",ba(a)]),i(a)},getCIChecks:async a=>j(a.owner,a.repo,String(a.number),"getCIChecks",async()=>{try{let b=await a2(["pr","checks",String(a.number),"--repo",ba(a),"--json","name,state,link,startedAt,completedAt"]);return JSON.parse(b).map(a=>{let b=a.state?.toUpperCase();return{name:a.name,status:a7(b),url:a.link||void 0,conclusion:b||void 0,startedAt:a.startedAt?new Date(a.startedAt):void 0,completedAt:a.completedAt?new Date(a.completedAt):void 0}})}catch(b){if(b instanceof Error&&/pr checks/i.test(b.message)&&/unknown json field/i.test(b.message))return a8(a);throw Error("Failed to fetch CI checks",{cause:b})}}),async getCISummary(a){let b;try{b=await this.getCIChecks(a)}catch{try{let b=await this.getPRState(a);if("merged"===b||"closed"===b)return"none"}catch{}return"failing"}return 0===b.length?"none":b.some(a=>"failed"===a.status)?"failing":b.some(a=>"pending"===a.status||"running"===a.status)?"pending":b.some(a=>"passed"===a.status)?"passing":"none"},getReviews:async a=>j(a.owner,a.repo,String(a.number),"getReviews",async()=>JSON.parse(await a2(["pr","view",String(a.number),"--repo",ba(a),"--json","reviews"])).reviews.map(a=>{let b,c=a.state?.toUpperCase();return b="APPROVED"===c?"approved":"CHANGES_REQUESTED"===c?"changes_requested":"DISMISSED"===c?"dismissed":"PENDING"===c?"pending":"commented",{author:a.author?.login??"unknown",state:b,body:a.body||void 0,submittedAt:bb(a.submittedAt)}})),getReviewDecision:async a=>j(a.owner,a.repo,String(a.number),"getReviewDecision",async()=>{let b=(JSON.parse(await a2(["pr","view",String(a.number),"--repo",ba(a),"--json","reviewDecision"])).reviewDecision??"").toUpperCase();return"APPROVED"===b?"approved":"CHANGES_REQUESTED"===b?"changes_requested":"REVIEW_REQUIRED"===b?"pending":"none"}),getPendingComments:async a=>j(a.owner,a.repo,String(a.number),"getPendingComments",async()=>{try{let b=await a2(["api","graphql","-f",`owner=${a.owner}`,"-f",`name=${a.repo}`,"-F",`number=${a.number}`,"-f",`query=query($owner: String!, $name: String!, $number: Int!) {
|
|
296
|
+
}`,variables:c}}(a);if(!b||0===a.length)return{};await aN();let d=[];for(let[a,b]of Object.entries(c))"string"==typeof b?d.push("-f",`${a}=${b}`):d.push("-F",`${a}=${b}`);let e=["api","graphql","-i",...d,"-f",`query=${b}`],f=3e4+Math.max(0,(a.length-10)*2e3),g=await aG(e,f,"gh.api.graphql-batch"),h=g.indexOf("\r\n\r\n"),i=g.indexOf("\n\n"),j=h>=0&&(i<0||h<i)?h+4:i>=0?i+2:0,k=JSON.parse((j>0?g.slice(j):g).trim());if(k.errors&&k.errors.length>0){let a=k.errors.map(a=>a.message).join("; ");throw Error(`GraphQL query errors: ${a}`)}return k.data??{}}async function aW(a,b,c=[]){let d=new Map,e=await aM(a,c,b);if(b?.reportPRListUnchangedRepos?.(e.prListUnchangedRepos),!e.shouldRefresh){let c=[];for(let b of a){let a=`${b.owner}/${b.repo}#${b.number}`,e=aL.get(a);e?d.set(a,e):c.push(b)}if(0===c.length)return b?.log("info",`[ETag Guard] Skipping GraphQL batch - all ${d.size} PRs cached. Reasons: ${e.details.join(", ")}`),{enrichment:d,prListUnchangedRepos:e.prListUnchangedRepos};b?.log("info",`[ETag Guard] Partial cache: ${d.size} cached, ${c.length} missing. Fetching missing PRs via GraphQL.`),a=c}let f=[];for(let b=0;b<a.length;b+=25)f.push(a.slice(b,b+25));for(let a=0;a<f.length;a++){let c,e=f[a],g=d.size,h=Date.now();try{let i=await aV(e);c=Date.now()-h,e.forEach((a,b)=>{let c=`pr${b}`,e=`${a.owner}/${a.repo}#${a.number}`,f=i[c];if(f?.pullRequest){let a=function(a){if(!a||"object"!=typeof a||void 0===a.state&&void 0===a.title&&void 0===a.commits)return null;let b=function(a){let b="string"==typeof a?a.toUpperCase():"";return"MERGED"===b?"merged":"CLOSED"===b?"closed":"open"}(a.state),c="string"==typeof a.title?a.title:void 0,d="number"==typeof a.additions?a.additions:0,e="number"==typeof a.deletions?a.deletions:0,f=!0===a.isDraft,g="string"==typeof a.headRefOid?a.headRefOid:"string"==typeof a.headSha?a.headSha:null,h=a.mergeable,i="string"==typeof a.mergeStateStatus?a.mergeStateStatus.toUpperCase():"",j="CONFLICTING"===h,k="BEHIND"===i,l=function(a){let b="string"==typeof a?a.toUpperCase():"";return"APPROVED"===b?"approved":"CHANGES_REQUESTED"===b?"changes_requested":"REVIEW_REQUIRED"===b?"pending":"none"}(a.reviewDecision),m=a.commits,n=m?.nodes?.[0]?.commit?.statusCheckRollup,o=n?function(a){if(!a||"object"!=typeof a)return"none";let b="string"==typeof a.state?a.state.toUpperCase():"";return"SUCCESS"===b?"passing":"FAILURE"===b||"ERROR"===b?"failing":"PENDING"===b||"EXPECTED"===b?"pending":"TIMED_OUT"===b||"CANCELLED"===b||"ACTION_REQUIRED"===b?"failing":"QUEUED"===b||"IN_PROGRESS"===b||"WAITING"===b?"pending":"none"}(n):"none",p=n?.contexts,q=p?.pageInfo,r=null!=q&&"object"==typeof q&&!0===q.hasNextPage,s=p&&!r?function(a){if(!a||"object"!=typeof a)return[];let b=a.nodes;if(!Array.isArray(b))return[];let c=[];for(let a of b)if(a&&"object"==typeof a){if("string"==typeof a.name&&"string"==typeof a.status){let b,d=a.status.toUpperCase(),e="string"==typeof a.conclusion?a.conclusion.toUpperCase():null;b="COMPLETED"===d?"SUCCESS"===e?"passed":"SKIPPED"===e||"NEUTRAL"===e||"STALE"===e||"NOT_REQUIRED"===e||"NONE"===e?"skipped":"FAILURE"===e||"TIMED_OUT"===e||"CANCELLED"===e||"ACTION_REQUIRED"===e||"ERROR"===e?"failed":"skipped":"IN_PROGRESS"===d?"running":"pending",c.push({name:a.name,status:b,conclusion:e??void 0,url:"string"==typeof a.detailsUrl?a.detailsUrl:void 0});continue}if("string"==typeof a.context&&"string"==typeof a.state){let b,d=a.state.toUpperCase();b="SUCCESS"===d?"passed":"FAILURE"===d||"ERROR"===d?"failed":"pending",c.push({name:a.context,status:b,conclusion:d,url:"string"==typeof a.targetUrl?a.targetUrl:void 0})}}return c}(p):void 0,t=[];"failing"===o&&t.push("CI is failing"),"changes_requested"===l&&t.push("Changes requested in review"),"pending"===l&&t.push("Review required"),j&&t.push("Merge conflicts"),k&&t.push("Branch is behind base branch"),f&&t.push("PR is still a draft");let u="open"===b&&("passing"===o||"none"===o)&&("approved"===l||"none"===l)&&!j&&!k&&!f;return{data:{state:b,ciStatus:o,reviewDecision:l,mergeable:u,title:c,additions:d,deletions:e,isDraft:f,hasConflicts:j,isBehind:k,blockers:t,...void 0!==s?{ciChecks:s}:{}},headSha:g}}(f.pullRequest);if(a){let{data:b,headSha:c}=a;d.set(e,b),aK.set(e,{headSha:c,ciStatus:b.ciStatus}),aL.set(e,b)}}});let j=d.size;if(j>g){let d={batchIndex:a,totalBatches:f.length,prCount:j-g,durationMs:c};b?.recordSuccess(d),b?.log("info",`[GraphQL Batch Success] Batch ${a+1}/${f.length} succeeded: added ${j-g} PRs to cache (${c}ms)`)}}catch(g){c=Date.now()-h;let d=g instanceof Error?g.message:String(g);b?.recordFailure({batchIndex:a,totalBatches:f.length,prCount:e.length,error:d,durationMs:c}),b?.log("error",`[GraphQL Batch] Batch enrichment partially failed: ${d}`)}}return{enrichment:d,prListUnchangedRepos:e.prListUnchangedRepos}}function aX(a,b){let c=b.toLowerCase();for(let[b,d]of Object.entries(a))if(b.toLowerCase()===c){if(Array.isArray(d))return d[0];return d}}function aY(a){if("string"!=typeof a)return;let b=new Date(a);return Number.isNaN(b.getTime())?void 0:b}function aZ(a){return"string"!=typeof a||0===a.length?void 0:a.startsWith("refs/heads/")?a.slice(11):a.startsWith("refs/")?void 0:a}let a$=(0,f.promisify)(e.execFile),a_=new Set(["cursor[bot]","github-actions[bot]","codecov[bot]","sonarcloud[bot]","dependabot[bot]","renovate[bot]","codeclimate[bot]","deepsource-autofix[bot]","snyk-bot","lgtm-com[bot]"]);async function a0(a,b,c){try{let{stdout:d}=await a$(a,b,{...c?{cwd:c}:{},maxBuffer:0xa00000,timeout:3e4});return d.trim()}catch(c){throw Error(`${a} ${b.slice(0,3).join(" ")} failed: ${c.message}`,{cause:c})}}async function a1(a){return(0,d.vQK)(a,{component:"scm-github"},3e4)}async function a2(a,b){return(0,d.vQK)(a,{component:"scm-github",cwd:b},3e4)}async function a3(a,b){return a0("git",a,b)}function a4(a){let b=a.split("/");if(2!==b.length||!b[0]||!b[1])throw Error(`Invalid repo format "${a}", expected "owner/repo"`);return[b[0],b[1]]}function a5(a,b){let[c,d]=a4(b);return{number:a.number,url:a.url,title:a.title,owner:c,repo:d,branch:a.headRefName,baseBranch:a.baseRefName,isDraft:a.isDraft}}function a6(a){let b=(a??"").toUpperCase();return"IN_PROGRESS"===b?"running":"PENDING"===b||"QUEUED"===b||"REQUESTED"===b||"WAITING"===b||"EXPECTED"===b?"pending":"SUCCESS"===b?"passed":"FAILURE"===b||"TIMED_OUT"===b||"CANCELLED"===b||"ACTION_REQUIRED"===b||"ERROR"===b?"failed":("SKIPPED"===b||"NEUTRAL"===b||"STALE"===b||"NOT_REQUIRED"===b,"skipped")}async function a7(a){let b=JSON.parse(await a1(["pr","view",String(a.number),"--repo",a9(a),"--json","statusCheckRollup"]));return(Array.isArray(b.statusCheckRollup)?b.statusCheckRollup:[]).map(a=>{if(!a||"object"!=typeof a)return null;let b="string"==typeof a.name&&a.name||"string"==typeof a.context&&a.context;if(!b)return null;let c="string"==typeof a.conclusion?a.conclusion:"string"==typeof a.state?a.state:"string"==typeof a.status?a.status:void 0,d="string"==typeof a.link&&a.link||"string"==typeof a.detailsUrl&&a.detailsUrl||"string"==typeof a.targetUrl&&a.targetUrl||void 0,e="string"==typeof a.startedAt?a.startedAt:"string"==typeof a.createdAt?a.createdAt:void 0,f="string"==typeof a.completedAt?a.completedAt:void 0,g={name:b,status:a6(c),conclusion:"string"==typeof c?c.toUpperCase():void 0,startedAt:e?new Date(e):void 0,completedAt:f?new Date(f):void 0};return d&&(g.url=d),g}).filter(a=>null!==a)}function a8(a){let b=a.scm?.webhook;return{enabled:b?.enabled!==!1,path:b?.path??"/api/webhooks/github",secretEnvVar:b?.secretEnvVar,signatureHeader:b?.signatureHeader??"x-hub-signature-256",eventHeader:b?.eventHeader??"x-github-event",deliveryHeader:b?.deliveryHeader??"x-github-delivery",maxBodyBytes:b?.maxBodyBytes}}function a9(a){return`${a.owner}/${a.repo}`}function ba(a){if(!a)return new Date(0);let b=new Date(a);return isNaN(b.getTime())?new Date(0):b}let bb={resolvePR:6e4,getPRState:5e3,getPRSummary:5e3,getReviews:1e4,getReviewDecision:1e4,getCIChecks:5e3,getMergeability:5e3,getPendingComments:1e4,detectPR:3e4},bc={manifest:{name:"github",slot:"scm",description:"SCM plugin: GitHub PRs, CI checks, reviews, merge readiness",version:"0.1.0"},create:function(){return function(){let a,b=new Map,c=new Map;function e(a,b,c,d){return`${a}/${b}#${c}:${d}`}function f(a){let c=b.get(a);return c?Date.now()>c.expiresAt?(b.delete(a),null):c.value:null}function g(a,c,d){if(b.size>=1e3){let a=b.keys().next().value;void 0!==a&&b.delete(a)}b.set(a,{value:c,expiresAt:Date.now()+d})}function i(a){let d=`${a.owner}/${a.repo}#${a.number}:`;for(let a of b.keys())a.startsWith(d)&&b.delete(a);b.delete(e(a.owner,a.repo,a.branch,"detectPR")),c.delete(`${a.owner}/${a.repo}#${a.number}`)}async function j(a,b,c,d,h){let i=e(a,b,c,d),j=f(i);if(null!==j)return j;let k=await h();return g(i,k,bb[d]),k}return{name:"github",async verifyWebhook(a,b){let c=a8(b);if(!c.enabled)return{ok:!1,reason:"Webhook is disabled for this project"};if("POST"!==a.method.toUpperCase())return{ok:!1,reason:"Webhook requests must use POST"};if(void 0!==c.maxBodyBytes&&Buffer.byteLength(a.body,"utf8")>c.maxBodyBytes)return{ok:!1,reason:"Webhook payload exceeds configured maxBodyBytes"};let d=aX(a.headers,c.eventHeader);if(!d)return{ok:!1,reason:`Missing ${c.eventHeader} header`};let e=aX(a.headers,c.deliveryHeader),f=c.secretEnvVar;if(!f)return{ok:!0,deliveryId:e,eventType:d};let g=process.env[f];if(!g)return{ok:!1,reason:`Webhook secret env var ${f} is not configured`};let i=aX(a.headers,c.signatureHeader);return i?!function(a,b,c){if(!c.startsWith("sha256="))return!1;let d=(0,h.createHmac)("sha256",b).update(a).digest("hex"),e=c.slice(7),f=Buffer.from(d,"hex"),g=Buffer.from(e,"hex");return f.length===g.length&&(0,h.timingSafeEqual)(f,g)}(a.rawBody??a.body,g,i)?{ok:!1,reason:"Webhook signature verification failed",deliveryId:e,eventType:d}:{ok:!0,deliveryId:e,eventType:d}:{ok:!1,reason:`Missing ${c.signatureHeader} header`}},async parseWebhook(a,b){let c=a8(b),d=function(a){let b=JSON.parse(a);if(!b||"object"!=typeof b||Array.isArray(b))throw Error("Webhook payload must be a JSON object");return b}(a.body);return function(a,b,c){let d=aX(a.headers,c.eventHeader);if(!d)return null;let e=aX(a.headers,c.deliveryHeader),f=function(a){let b=a.repository;if(!b||"object"!=typeof b)return;let c=b.owner,d=c&&"object"==typeof c?c.login:void 0,e="string"==typeof d?d:void 0,f="string"==typeof b.name?b.name:void 0;if(e&&f)return{owner:e,name:f}}(b),g="string"==typeof b.action?b.action:d;if("pull_request"===d){let a=b.pull_request;if(!a||"object"!=typeof a)return null;let c=a.head;return{provider:"github",kind:"pull_request",action:g,rawEventType:d,deliveryId:e,repository:f,prNumber:"number"==typeof b.number?b.number:"number"==typeof a.number?a.number:void 0,branch:"string"==typeof c?.ref?c.ref:void 0,sha:"string"==typeof c?.sha?c.sha:void 0,timestamp:aY(a.updated_at),data:b}}if("pull_request_review"===d||"pull_request_review_comment"===d){let a=b.pull_request;if(!a||"object"!=typeof a)return null;let c=a.head;return{provider:"github",kind:"pull_request_review"===d?"review":"comment",action:g,rawEventType:d,deliveryId:e,repository:f,prNumber:"number"==typeof b.number?b.number:"number"==typeof a.number?a.number:void 0,branch:"string"==typeof c?.ref?c.ref:void 0,sha:"string"==typeof c?.sha?c.sha:void 0,timestamp:"pull_request_review"===d?aY(b.review?.submitted_at):aY(b.comment?.updated_at??b.comment?.created_at),data:b}}if("issue_comment"===d){let a=b.issue;return a&&"object"==typeof a&&"pull_request"in a?{provider:"github",kind:"comment",action:g,rawEventType:d,deliveryId:e,repository:f,prNumber:"number"==typeof a.number?a.number:void 0,timestamp:aY(b.comment?.updated_at??b.comment?.created_at),data:b}:null}if("check_run"===d||"check_suite"===d){let a=b[d],c=(Array.isArray(a?.pull_requests)?a?.pull_requests:[])[0];return{provider:"github",kind:"ci",action:g,rawEventType:d,deliveryId:e,repository:f,prNumber:"number"==typeof c?.number?c.number:void 0,branch:"string"==typeof a?.head_branch?a.head_branch:"string"==typeof a?.check_suite?.head_branch?(a?.check_suite).head_branch:void 0,sha:"string"==typeof a?.head_sha?a.head_sha:void 0,timestamp:aY(a?.updated_at),data:b}}if("status"===d){let a=Array.isArray(b.branches)?b.branches:[];return{provider:"github",kind:"ci",action:"string"==typeof b.state?b.state:g,rawEventType:d,deliveryId:e,repository:f,branch:aZ(a[0]?.name??b.ref),sha:"string"==typeof b.sha?b.sha:void 0,timestamp:aY(b.updated_at),data:b}}if("push"===d){let a=b.head_commit&&"object"==typeof b.head_commit?b.head_commit:void 0;return{provider:"github",kind:"push",action:g,rawEventType:d,deliveryId:e,repository:f,branch:aZ(b.ref),sha:"string"==typeof b.after?b.after:void 0,timestamp:aY(a?.timestamp??b.updated_at),data:b}}return{provider:"github",kind:"unknown",action:g,rawEventType:d,deliveryId:e,repository:f,timestamp:aY(b.updated_at),data:b}}(a,d,c)},async detectPR(a,b){if(!a.branch||!b.repo)return null;a4(b.repo);let[c,d]=b.repo.split("/"),h=e(c??"",d??"",a.branch,"detectPR"),i=f(h);if(null!==i)return i;try{let c=await a1(["pr","list","--repo",b.repo,"--head",a.branch,"--json","number,url,title,headRefName,baseRefName,isDraft","--limit","1"]),d=JSON.parse(c);if(0===d.length)return null;let e=a5(d[0],b.repo);return g(h,e,bb.detectPR),e}catch{return null}},async resolvePR(a,b){if(!b.repo)throw Error("Cannot resolve PR: project has no repo configured");let c=b.repo,[d,e]=c.split("/");return j(d??"",e??"",`ref=${a}`,"resolvePR",async()=>a5(JSON.parse(await a1(["pr","view",a,"--repo",c,"--json","number,url,title,headRefName,baseRefName,isDraft"])),c))},async assignPRToCurrentUser(a){await a1(["pr","edit",String(a.number),"--repo",a9(a),"--add-assignee","@me"]),i(a)},async checkoutPR(a,b){if(await a3(["branch","--show-current"],b)===a.branch)return!1;if(await a3(["status","--porcelain"],b))throw Error(`Workspace has uncommitted changes; cannot switch to PR branch "${a.branch}" safely`);return await a2(["pr","checkout",String(a.number),"--repo",a9(a)],b),!0},getPRState:async a=>j(a.owner,a.repo,String(a.number),"getPRState",async()=>{let b=JSON.parse(await a1(["pr","view",String(a.number),"--repo",a9(a),"--json","state"])).state.toUpperCase();return"MERGED"===b?"merged":"CLOSED"===b?"closed":"open"}),getPRSummary:async a=>j(a.owner,a.repo,String(a.number),"getPRSummary",async()=>{let b=JSON.parse(await a1(["pr","view",String(a.number),"--repo",a9(a),"--json","state,title,additions,deletions"])),c=b.state.toUpperCase();return{state:"MERGED"===c?"merged":"CLOSED"===c?"closed":"open",title:b.title??"",additions:b.additions??0,deletions:b.deletions??0}}),async mergePR(a,b="squash"){await a1(["pr","merge",String(a.number),"--repo",a9(a),"rebase"===b?"--rebase":"merge"===b?"--merge":"--squash","--delete-branch"]),i(a)},async closePR(a){await a1(["pr","close",String(a.number),"--repo",a9(a)]),i(a)},getCIChecks:async a=>j(a.owner,a.repo,String(a.number),"getCIChecks",async()=>{try{let b=await a1(["pr","checks",String(a.number),"--repo",a9(a),"--json","name,state,link,startedAt,completedAt"]);return JSON.parse(b).map(a=>{let b=a.state?.toUpperCase();return{name:a.name,status:a6(b),url:a.link||void 0,conclusion:b||void 0,startedAt:a.startedAt?new Date(a.startedAt):void 0,completedAt:a.completedAt?new Date(a.completedAt):void 0}})}catch(b){if(b instanceof Error&&/pr checks/i.test(b.message)&&/unknown json field/i.test(b.message))return a7(a);throw Error("Failed to fetch CI checks",{cause:b})}}),async getCISummary(a){let b;try{b=await this.getCIChecks(a)}catch{try{let b=await this.getPRState(a);if("merged"===b||"closed"===b)return"none"}catch{}return"failing"}return 0===b.length?"none":b.some(a=>"failed"===a.status)?"failing":b.some(a=>"pending"===a.status||"running"===a.status)?"pending":b.some(a=>"passed"===a.status)?"passing":"none"},getReviews:async a=>j(a.owner,a.repo,String(a.number),"getReviews",async()=>JSON.parse(await a1(["pr","view",String(a.number),"--repo",a9(a),"--json","reviews"])).reviews.map(a=>{let b,c=a.state?.toUpperCase();return b="APPROVED"===c?"approved":"CHANGES_REQUESTED"===c?"changes_requested":"DISMISSED"===c?"dismissed":"PENDING"===c?"pending":"commented",{author:a.author?.login??"unknown",state:b,body:a.body||void 0,submittedAt:ba(a.submittedAt)}})),getReviewDecision:async a=>j(a.owner,a.repo,String(a.number),"getReviewDecision",async()=>{let b=(JSON.parse(await a1(["pr","view",String(a.number),"--repo",a9(a),"--json","reviewDecision"])).reviewDecision??"").toUpperCase();return"APPROVED"===b?"approved":"CHANGES_REQUESTED"===b?"changes_requested":"REVIEW_REQUIRED"===b?"pending":"none"}),getPendingComments:async a=>j(a.owner,a.repo,String(a.number),"getPendingComments",async()=>{try{let b=await a1(["api","graphql","-f",`owner=${a.owner}`,"-f",`name=${a.repo}`,"-F",`number=${a.number}`,"-f",`query=query($owner: String!, $name: String!, $number: Int!) {
|
|
297
297
|
repository(owner: $owner, name: $name) {
|
|
298
298
|
pullRequest(number: $number) {
|
|
299
299
|
reviewThreads(first: 100) {
|
|
@@ -315,7 +315,7 @@ process.stdin.on('data', c => input += c).on('end', () => {
|
|
|
315
315
|
}
|
|
316
316
|
}
|
|
317
317
|
}
|
|
318
|
-
}`]);return JSON.parse(b).data.repository.pullRequest.reviewThreads.nodes.filter(a=>{if(a.isResolved)return!1;let b=a.comments.nodes[0];if(!b)return!1;let c=b.author?.login??"";return!
|
|
318
|
+
}`]);return JSON.parse(b).data.repository.pullRequest.reviewThreads.nodes.filter(a=>{if(a.isResolved)return!1;let b=a.comments.nodes[0];if(!b)return!1;let c=b.author?.login??"";return!a_.has(c)}).map(a=>{let b=a.comments.nodes[0];return{id:b.id,threadId:a.id,author:b.author?.login??"unknown",body:b.body,path:b.path||void 0,line:b.line??void 0,isResolved:a.isResolved,createdAt:ba(b.createdAt),url:b.url}})}catch(a){throw Error("Failed to fetch pending comments",{cause:a})}}),async getReviewThreads(b){let d=`${b.owner}/${b.repo}#${b.number}`;if(!await aT(b.owner,b.repo,b.number,a)){let a=c.get(d);if(a)return a}try{let a=(await a1(["api","graphql","-i","-f",`owner=${b.owner}`,"-f",`name=${b.repo}`,"-F",`number=${b.number}`,"-f",`query=query($owner: String!, $name: String!, $number: Int!) {
|
|
319
319
|
repository(owner: $owner, name: $name) {
|
|
320
320
|
pullRequest(number: $number) {
|
|
321
321
|
reviewThreads(last: 100) {
|
|
@@ -346,7 +346,7 @@ process.stdin.on('data', c => input += c).on('end', () => {
|
|
|
346
346
|
}
|
|
347
347
|
}
|
|
348
348
|
rateLimit { cost remaining resetAt }
|
|
349
|
-
}`])).replace(/^[\s\S]*?\r?\n\r?\n/,""),e=JSON.parse(a),f=e.data.repository.pullRequest.reviewThreads.nodes,g=e.data.repository.pullRequest.reviews.nodes,h=f.filter(a=>!a.isResolved&&!!a.comments.nodes[0]).map(a=>{let b=a.comments.nodes[0],c=b.author?.login??"unknown";return{id:b.id,threadId:a.id,author:c,body:b.body,path:b.path||void 0,line:b.line??void 0,isResolved:a.isResolved,createdAt:
|
|
349
|
+
}`])).replace(/^[\s\S]*?\r?\n\r?\n/,""),e=JSON.parse(a),f=e.data.repository.pullRequest.reviewThreads.nodes,g=e.data.repository.pullRequest.reviews.nodes,h=f.filter(a=>!a.isResolved&&!!a.comments.nodes[0]).map(a=>{let b=a.comments.nodes[0],c=b.author?.login??"unknown";return{id:b.id,threadId:a.id,author:c,body:b.body,path:b.path||void 0,line:b.line??void 0,isResolved:a.isResolved,createdAt:ba(b.createdAt),url:b.url,isBot:a_.has(c)}}),i=g.filter(a=>a.body&&a.body.trim().length>0).map(a=>({author:a.author?.login??"unknown",state:a.state,body:a.body,submittedAt:ba(a.submittedAt)})),j={threads:h,reviews:i};return c.set(d,j),j}catch(c){let b=c instanceof Error?c.message:String(c);throw a?.log("warn",`[getReviewThreads] Failed for ${d}: ${b}`),Error("Failed to fetch review threads",{cause:c})}},async getMergeability(a){return j(a.owner,a.repo,String(a.number),"getMergeability",async()=>{let b=[];if("merged"===await this.getPRState(a))return{mergeable:!0,ciPassing:!0,approved:!0,noConflicts:!0,blockers:[]};let c=JSON.parse(await a1(["pr","view",String(a.number),"--repo",a9(a),"--json","mergeable,reviewDecision,mergeStateStatus,isDraft"])),e=await this.getCISummary(a),f=e===d.U10.PASSING||e===d.U10.NONE;f||b.push(`CI is ${e}`);let g=(c.reviewDecision??"").toUpperCase();"CHANGES_REQUESTED"===g?b.push("Changes requested in review"):"REVIEW_REQUIRED"===g&&b.push("Review required");let h=(c.mergeable??"").toUpperCase(),i=(c.mergeStateStatus??"").toUpperCase();return"CONFLICTING"===h?b.push("Merge conflicts"):("UNKNOWN"===h||""===h)&&b.push("Merge status unknown (GitHub is computing)"),"BEHIND"===i?b.push("Branch is behind base branch"):"BLOCKED"===i?b.push("Merge is blocked by branch protection"):"UNSTABLE"===i&&b.push("Required checks are failing"),c.isDraft&&b.push("PR is still a draft"),{mergeable:0===b.length,ciPassing:f,approved:"APPROVED"===g,noConflicts:"MERGEABLE"===h,blockers:b}})},enrichSessionsPRBatch:async(b,c,d)=>(c&&(a=c),(await aW(b,c,d)).enrichment),async preflight(a){a.intent.willClaimExistingPR&&await (0,d.TF_)("gh-cli-auth",async()=>{try{await a$("gh",["--version"])}catch{throw Error("GitHub CLI (gh) is not installed. Install it: https://cli.github.com/")}try{await a$("gh",["auth","status"])}catch{throw Error("GitHub CLI is not authenticated. Run: gh auth login")}})}}}()}};async function bd(a){try{return await (0,d.vQK)(a,{component:"tracker-github"},3e4)}catch(b){throw Error(`gh ${a.slice(0,3).join(" ")} failed: ${b.message}`,{cause:b})}}async function be(){return(0,d.TF_)("gh-cli-auth",async()=>{try{await bd(["--version"])}catch{throw Error("GitHub CLI (gh) is not installed. Install it: https://cli.github.com/")}try{await bd(["auth","status"])}catch{throw Error("GitHub CLI is not authenticated. Run: gh auth login")}})}function bf(a,b){let c=function a(b){if(!(b instanceof Error))return"";let c=[b.message];return"string"==typeof b.stderr&&c.push(b.stderr),"string"==typeof b.stdout&&c.push(b.stdout),b.cause instanceof Error&&c.push(a(b.cause)),c.join("\n").toLowerCase()}(a);return!!c&&(c.includes("unknown json field")||c.includes("unknown field")||c.includes("invalid field"))&&c.includes(b.toLowerCase())}async function bg(a,b){let c=bj(b);try{return await bd(["issue","view",a,"--repo",c,"--json","number,title,body,url,state,stateReason,labels,assignees"])}catch(b){if(!bf(b,"stateReason"))throw b;return bd(["issue","view",a,"--repo",c,"--json","number,title,body,url,state,labels,assignees"])}}async function bh(a){let b=[...a,"--json","number,title,body,url,state,stateReason,labels,assignees"];try{return await bd(b)}catch(b){if(!bf(b,"stateReason"))throw b;return bd([...a,"--json","number,title,body,url,state,labels,assignees"])}}function bi(a,b){return"CLOSED"===a.toUpperCase()?b?.toUpperCase()==="NOT_PLANNED"?"cancelled":"closed":"open"}function bj(a){if(!a.repo)throw Error("GitHub tracker requires a 'repo' field in project config");return a.repo}function bk(a,b){return`${a}#${b.replace(/^#/,"")}`}let bl={manifest:{name:"github",slot:"tracker",description:"Tracker plugin: GitHub Issues",version:"0.1.0"},create:function(){let a=new Map,b=new Map,c={name:"github",async getIssue(c,d){let e=bj(d),f=function(b,c){let d=bk(b,c),e=a.get(d);return e?Date.now()>e.expiresAt?(a.delete(d),null):e.issue:null}(e,c);if(f)return f;let g=bk(e,c),h=b.get(g);if(h)return h;let i=(async()=>{let b=JSON.parse(await bg(c,d)),f={id:String(b.number),title:b.title,description:b.body??"",url:b.url,state:bi(b.state,b.stateReason),labels:b.labels.map(a=>a.name),assignee:b.assignees[0]?.login};if(a.size>=500){let b=a.keys().next().value;void 0!==b&&a.delete(b)}return a.set(bk(e,c),{issue:f,expiresAt:Date.now()+3e5}),f})();b.set(g,i);try{return await i}finally{b.delete(g)}},async isCompleted(a,b){let d=await c.getIssue(a,b);return"closed"===d.state||"cancelled"===d.state},issueUrl(a,b){let c=a.replace(/^#/,"");return`https://github.com/${bj(b)}/issues/${c}`},issueLabel(a,b){let c=a.match(/\/issues\/(\d+)/);if(c)return`#${c[1]}`;let d=a.split("/"),e=d[d.length-1];return e?`#${e}`:a},branchName(a,b){let c=a.replace(/^#/,"");return`feat/issue-${c}`},async generatePrompt(a,b){let c=await this.getIssue(a,b),d=[`You are working on GitHub issue #${c.id}: ${c.title}`,`Issue URL: ${c.url}`,""];return c.labels.length>0&&d.push(`Labels: ${c.labels.join(", ")}`),c.description&&d.push("## Description","",c.description),d.push("","The issue context above is complete and current. You should not need to call gh issue view unless you need additional context beyond what is provided here.","","Please implement the changes described in this issue. When done, commit and push your changes."),d.join("\n")},async listIssues(a,b){let c=["issue","list","--repo",bj(b),"--limit",String(a.limit??30)];return"closed"===a.state?c.push("--state","closed"):"all"===a.state?c.push("--state","all"):c.push("--state","open"),a.labels&&a.labels.length>0&&c.push("--label",a.labels.join(",")),a.assignee&&c.push("--assignee",a.assignee),JSON.parse(await bh(c)).map(a=>({id:String(a.number),title:a.title,description:a.body??"",url:a.url,state:bi(a.state,a.stateReason),labels:a.labels.map(a=>a.name),assignee:a.assignees[0]?.login}))},async updateIssue(b,c,d){let e=bj(d);a.delete(bk(e,b)),"closed"===c.state?await bd(["issue","close",b,"--repo",e]):"open"===c.state&&await bd(["issue","reopen",b,"--repo",e]),c.removeLabels&&c.removeLabels.length>0&&await bd(["issue","edit",b,"--repo",e,"--remove-label",c.removeLabels.join(",")]),c.labels&&c.labels.length>0&&await bd(["issue","edit",b,"--repo",e,"--add-label",c.labels.join(",")]),c.assignee&&await bd(["issue","edit",b,"--repo",e,"--add-assignee",c.assignee]),c.comment&&await bd(["issue","comment",b,"--repo",e,"--body",c.comment])},async createIssue(a,b){let d=["issue","create","--repo",bj(b),"--title",a.title,"--body",a.description??""];a.labels&&a.labels.length>0&&d.push("--label",a.labels.join(",")),a.assignee&&d.push("--assignee",a.assignee);let e=await bd(d),f=e.match(/\/issues\/(\d+)/);if(!f)throw Error(`Failed to parse issue URL from gh output: ${e}`);let g=f[1];return c.getIssue(g,b)},async preflight(){await be()}};return c}};var bm=c(44708);function bn(a){switch(a){case"completed":return"closed";case"canceled":return"cancelled";case"started":return"in_progress";default:return"open"}}let bo=`
|
|
350
350
|
id
|
|
351
351
|
identifier
|
|
352
352
|
title
|
|
@@ -437,4 +437,4 @@ process.stdin.on('data', c => input += c).on('end', () => {
|
|
|
437
437
|
issueUpdate(id: $id, input: { labelIds: $labelIds }) {
|
|
438
438
|
success
|
|
439
439
|
}
|
|
440
|
-
}`,{id:f.id,labelIds:i}),g.labels=h)}catch{}return g}}}let bq={manifest:{name:"linear",slot:"tracker",description:"Tracker plugin: Linear issue tracker",version:"0.1.0"},create:function(){let a=process.env.COMPOSIO_API_KEY;if(a){let b,c=process.env.COMPOSIO_ENTITY_ID??"default";return bp(async(d,e)=>{let f,g=(await (!b&&(b=(async()=>{try{let{Composio:b}=await Promise.resolve().then(function(){var a=Error("Cannot find module '@composio/core'");throw a.code="MODULE_NOT_FOUND",a});return new b({apiKey:a}).tools}catch(b){let a=b instanceof Error?b.message:String(b);if(a.includes("Cannot find module")||a.includes("Cannot find package")||a.includes("ERR_MODULE_NOT_FOUND"))throw Error("Composio SDK (@composio/core) is not installed. Install it with: pnpm add @composio/core",{cause:b});throw b}})()),b)).execute("LINEAR_RUN_QUERY_OR_MUTATION",{entityId:c,arguments:{query_or_mutation:d,variables:e?JSON.stringify(e):"{}"}}),h=new Promise((a,b)=>{f=setTimeout(()=>{b(Error("Composio Linear API request timed out after 30s"))},3e4)});g.catch(()=>{}),h.catch(()=>{});try{let a=await Promise.race([g,h]);if(!a.successful)throw Error(`Composio Linear API error: ${a.error??"unknown error"}`);if(!a.data)throw Error("Composio Linear API returned no data");return a.data}finally{clearTimeout(f)}})}return bp((a,b)=>{let c=function(){let a=process.env.LINEAR_API_KEY;if(!a)throw Error("LINEAR_API_KEY environment variable is required for the Linear tracker plugin");return a}(),d=JSON.stringify({query:a,variables:b});return new Promise((a,b)=>{let e=new URL("https://api.linear.app/graphql"),f=!1,g=a=>{f||(f=!0,a())},h=(0,bm.request)({hostname:e.hostname,path:e.pathname,method:"POST",headers:{"Content-Type":"application/json",Authorization:c,"Content-Length":Buffer.byteLength(d)}},c=>{let d=[];c.on("error",a=>g(()=>b(a))),c.on("data",a=>d.push(a)),c.on("end",()=>{g(()=>{try{let e=Buffer.concat(d).toString("utf-8"),f=c.statusCode??0;if(f<200||f>=300)return void b(Error(`Linear API returned HTTP ${f}: ${e.slice(0,200)}`));let g=JSON.parse(e);if(g.errors&&g.errors.length>0)return void b(Error(`Linear API error: ${g.errors[0].message}`));if(!g.data)return void b(Error("Linear API returned no data"));a(g.data)}catch(a){b(a)}})})});h.setTimeout(3e4,()=>{g(()=>{h.destroy(),b(Error("Linear API request timed out after 30s"))})}),h.on("error",a=>g(()=>b(a))),h.write(d),h.end()})})}},br=globalThis;function bs(){if(br._aoServices)return Promise.resolve(br._aoServices);if(!br._aoServicesInit){let a=br._aoServicesGeneration??0,b=bu().then(b=>(br._aoServicesGeneration??0)!==a?(b.lifecycleManager.stop(),bs()):(br._aoServices=b,b)).catch(a=>{throw br._aoServicesInit===b&&(br._aoServicesInit=void 0),a});br._aoServicesInit=b}return br._aoServicesInit}function bt(){br._aoServicesGeneration=(br._aoServicesGeneration??0)+1,br._aoServices&&br._aoServices.lifecycleManager.stop(),br._aoServices=void 0,br._aoServicesInit=void 0}async function bu(){let a=function(){let a=(0,d.NoB)();try{return(0,d.Z9L)(a)}catch(a){if(a instanceof Error&&"code"in a&&"ENOENT"===a.code||a instanceof d.kw3)return(0,d.Z9L)();throw a}}(),b=(0,d.RaB)();b.register(o),b.register(z),b.register(Q),b.register(
|
|
440
|
+
}`,{id:f.id,labelIds:i}),g.labels=h)}catch{}return g}}}let bq={manifest:{name:"linear",slot:"tracker",description:"Tracker plugin: Linear issue tracker",version:"0.1.0"},create:function(){let a=process.env.COMPOSIO_API_KEY;if(a){let b,c=process.env.COMPOSIO_ENTITY_ID??"default";return bp(async(d,e)=>{let f,g=(await (!b&&(b=(async()=>{try{let{Composio:b}=await Promise.resolve().then(function(){var a=Error("Cannot find module '@composio/core'");throw a.code="MODULE_NOT_FOUND",a});return new b({apiKey:a}).tools}catch(b){let a=b instanceof Error?b.message:String(b);if(a.includes("Cannot find module")||a.includes("Cannot find package")||a.includes("ERR_MODULE_NOT_FOUND"))throw Error("Composio SDK (@composio/core) is not installed. Install it with: pnpm add @composio/core",{cause:b});throw b}})()),b)).execute("LINEAR_RUN_QUERY_OR_MUTATION",{entityId:c,arguments:{query_or_mutation:d,variables:e?JSON.stringify(e):"{}"}}),h=new Promise((a,b)=>{f=setTimeout(()=>{b(Error("Composio Linear API request timed out after 30s"))},3e4)});g.catch(()=>{}),h.catch(()=>{});try{let a=await Promise.race([g,h]);if(!a.successful)throw Error(`Composio Linear API error: ${a.error??"unknown error"}`);if(!a.data)throw Error("Composio Linear API returned no data");return a.data}finally{clearTimeout(f)}})}return bp((a,b)=>{let c=function(){let a=process.env.LINEAR_API_KEY;if(!a)throw Error("LINEAR_API_KEY environment variable is required for the Linear tracker plugin");return a}(),d=JSON.stringify({query:a,variables:b});return new Promise((a,b)=>{let e=new URL("https://api.linear.app/graphql"),f=!1,g=a=>{f||(f=!0,a())},h=(0,bm.request)({hostname:e.hostname,path:e.pathname,method:"POST",headers:{"Content-Type":"application/json",Authorization:c,"Content-Length":Buffer.byteLength(d)}},c=>{let d=[];c.on("error",a=>g(()=>b(a))),c.on("data",a=>d.push(a)),c.on("end",()=>{g(()=>{try{let e=Buffer.concat(d).toString("utf-8"),f=c.statusCode??0;if(f<200||f>=300)return void b(Error(`Linear API returned HTTP ${f}: ${e.slice(0,200)}`));let g=JSON.parse(e);if(g.errors&&g.errors.length>0)return void b(Error(`Linear API error: ${g.errors[0].message}`));if(!g.data)return void b(Error("Linear API returned no data"));a(g.data)}catch(a){b(a)}})})});h.setTimeout(3e4,()=>{g(()=>{h.destroy(),b(Error("Linear API request timed out after 30s"))})}),h.on("error",a=>g(()=>b(a))),h.write(d),h.end()})})}},br=globalThis;function bs(){if(br._aoServices)return Promise.resolve(br._aoServices);if(!br._aoServicesInit){let a=br._aoServicesGeneration??0,b=bu().then(b=>(br._aoServicesGeneration??0)!==a?(b.lifecycleManager.stop(),bs()):(br._aoServices=b,b)).catch(a=>{throw br._aoServicesInit===b&&(br._aoServicesInit=void 0),a});br._aoServicesInit=b}return br._aoServicesInit}function bt(){br._aoServicesGeneration=(br._aoServicesGeneration??0)+1,br._aoServices&&br._aoServices.lifecycleManager.stop(),br._aoServices=void 0,br._aoServicesInit=void 0}async function bu(){let a=function(){let a=(0,d.NoB)();try{return(0,d.Z9L)(a)}catch(a){if(a instanceof Error&&"code"in a&&"ENOENT"===a.code||a instanceof d.kw3)return(0,d.Z9L)();throw a}}(),b=(0,d.RaB)();b.register(o),b.register(z),b.register(Q),b.register(U),b.register(ao),b.register(as),b.register(aD),b.register(bc),b.register(bl),b.register(bq);let c=(0,d.Qum)({config:a,registry:b}),e=(0,d.C1z)({config:a,registry:b,sessionManager:c});return{config:a,registry:b,sessionManager:c,lifecycleManager:e}}let bv="agent:backlog",bw=globalThis;function bx(){bw._aoBacklogStarted||(bw._aoBacklogStarted=!0,bB(),bw._aoBacklogTimer=setInterval(()=>void bB(),6e4))}let by=new Set;async function bz(a,b,c){for(let d of a.filter(a=>"merged"===a.lifecycle.pr.state&&a.issueId&&!by.has(`${a.projectId}:${a.issueId}`))){let a=`${d.projectId}:${d.issueId}`,e=b.projects[d.projectId];if(!e?.tracker?.plugin){by.add(a);continue}let f=c.get("tracker",e.tracker.plugin);if(!f?.updateIssue){by.add(a);continue}let g=d.issueId;if(!g){by.add(a);continue}try{await f.updateIssue(g,{labels:["merged-unverified"],removeLabels:["agent:backlog","agent:in-progress"],comment:"PR merged. Issue awaiting human verification on staging."},e)}catch(a){console.error(`[backlog] Failed to close issue ${d.issueId}:`,a)}by.add(a)}}async function bA(a,b){for(let[,c]of Object.entries(a.projects)){let a;if(!c.tracker?.plugin)continue;let d=b.get("tracker",c.tracker.plugin);if(d?.listIssues&&d.updateIssue){try{a=await d.listIssues({state:"open",labels:["agent:done"],limit:20},c)}catch{continue}for(let b of a)try{await d.updateIssue(b.id,{labels:[bv],removeLabels:["agent:done"],comment:"Issue reopened — returning to agent backlog."},c),console.log(`[backlog] Relabeled reopened issue ${b.id} → ${bv}`)}catch(a){console.error(`[backlog] Failed to relabel reopened issue ${b.id}:`,a)}}}}async function bB(){try{let{config:a,registry:b,sessionManager:c}=await bs(),e=await c.list();await bz(e,a,b),await bA(a,b);let f=Object.entries(a.projects).map(([a,b])=>b.sessionPrefix??a),g=e.filter(b=>!(0,d.tTz)(b,a.projects[b.projectId]?.sessionPrefix??b.projectId,f)&&!d.CMu.has(b.status)),h=new Set(g.map(a=>a.issueId?.toLowerCase()).filter(a=>!!a)),i=5-g.length;if(i<=0)return;for(let[d,e]of Object.entries(a.projects)){let a;if(i<=0)break;if(!e.tracker?.plugin)continue;let f=b.get("tracker",e.tracker.plugin);if(f?.listIssues){try{a=await f.listIssues({state:"open",labels:[bv],limit:10},e)}catch{continue}for(let b of a){if(i<=0)break;if(!h.has(b.id.toLowerCase()))try{await c.spawn({projectId:d,issueId:b.id}),i--,h.add(b.id.toLowerCase()),f.updateIssue&&await f.updateIssue(b.id,{labels:["agent:in-progress"],removeLabels:["agent:backlog"],comment:"Claimed by agent orchestrator — session spawned."},e)}catch(a){console.error(`[backlog] Failed to spawn session for issue ${b.id}:`,a)}}}}}catch(a){console.error("[backlog] Poll failed:",a)}}async function bC(){let a=[];try{let{config:b,registry:c}=await bs();for(let[d,e]of Object.entries(b.projects)){if(!e.tracker?.plugin)continue;let b=c.get("tracker",e.tracker.plugin);if(b?.listIssues)try{for(let c of(await b.listIssues({state:"open",labels:[bv],limit:20},e)))a.push({...c,projectId:d})}catch{}}}catch{}return a}async function bD(){let a=[];try{let{config:b,registry:c}=await bs();for(let[d,e]of Object.entries(b.projects)){if(!e.tracker?.plugin)continue;let b=c.get("tracker",e.tracker.plugin);if(b?.listIssues)try{for(let c of(await b.listIssues({state:"open",labels:["merged-unverified"],limit:20},e)))a.push({...c,projectId:d})}catch{}}}catch{}return a}function bE(a,b){return b?.scm?.plugin?a.get("scm",b.scm.plugin):null}}};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
globalThis.__BUILD_MANIFEST={polyfillFiles:["static/chunks/polyfills-42372ed130431b0a.js"],devFiles:[],ampDevFiles:[],lowPriorityFiles:[],rootMainFiles:["static/chunks/webpack-
|
|
1
|
+
globalThis.__BUILD_MANIFEST={polyfillFiles:["static/chunks/polyfills-42372ed130431b0a.js"],devFiles:[],ampDevFiles:[],lowPriorityFiles:[],rootMainFiles:["static/chunks/webpack-83d2d8248a30259c.js","static/chunks/88a6fc35-f836b4b72df5eafa.js","static/chunks/1461-af7c54935f21d56d.js","static/chunks/main-app-b95f197c38e3b0a3.js"],rootMainFilesTree:{},pages:{"/_app":["static/chunks/webpack-83d2d8248a30259c.js","static/chunks/framework-7060e2ac4971c604.js","static/chunks/main-ed1610689fbd6f0d.js","static/chunks/pages/_app-f4baf4dbe88f6f54.js"],"/_error":["static/chunks/webpack-83d2d8248a30259c.js","static/chunks/framework-7060e2ac4971c604.js","static/chunks/main-ed1610689fbd6f0d.js","static/chunks/pages/_error-a7f6723f42093f29.js"]},ampFirstPages:[]},globalThis.__BUILD_MANIFEST.lowPriorityFiles=["/static/"+process.env.__NEXT_BUILD_ID+"/_buildManifest.js",,"/static/"+process.env.__NEXT_BUILD_ID+"/_ssgManifest.js"];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
self.__REACT_LOADABLE_MANIFEST='{"app/dev/terminal-test/page.tsx -> @/components/DirectTerminal":{"id":3764,"files":["static/css/659eccb5db697b76.css","static/chunks/3764.
|
|
1
|
+
self.__REACT_LOADABLE_MANIFEST='{"app/dev/terminal-test/page.tsx -> @/components/DirectTerminal":{"id":3764,"files":["static/css/659eccb5db697b76.css","static/chunks/3764.88619fb0d047cae8.js"]},"app/dev/terminal-test/page.tsx -> @/components/Terminal":{"id":7317,"files":["static/chunks/7317.685aa5231218e8d3.js"]},"app/test-direct/page.tsx -> @/components/DirectTerminal":{"id":3764,"files":["static/css/659eccb5db697b76.css","static/chunks/3764.88619fb0d047cae8.js"]},"components/SessionDetail.tsx -> ./DirectTerminal":{"id":3764,"files":["static/css/659eccb5db697b76.css","static/chunks/1383.8f5f7d4606d356cc.js"]},"components/terminal/useXtermTerminal.ts -> @xterm/addon-fit":{"id":2529,"files":["static/chunks/2529.32352c1ce5253e3e.js"]},"components/terminal/useXtermTerminal.ts -> @xterm/addon-web-links":{"id":5491,"files":["static/chunks/5491.fd98884d48631149.js"]},"components/terminal/useXtermTerminal.ts -> @xterm/xterm":{"id":5627,"files":["static/chunks/1d2d5650.1ef8611b5325bd83.js"]}}';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
<!DOCTYPE html><!--5nmlY5IOwz_Od3p2SB2hh--><html lang="en" class="dark"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover"/><link rel="stylesheet" href="/_next/static/css/397ea3e60645d3f3.css" data-precedence="next"/><link rel="preload" as="script" fetchPriority="low" href="/_next/static/chunks/webpack-ab12779265bdb8f9.js"/><script src="/_next/static/chunks/88a6fc35-f836b4b72df5eafa.js" async=""></script><script src="/_next/static/chunks/1461-af7c54935f21d56d.js" async=""></script><script src="/_next/static/chunks/main-app-4b27cdf1baf203ad.js" async=""></script><script src="/_next/static/chunks/app/layout-be776dec5531d47b.js" async=""></script><script src="/_next/static/chunks/8713-d3d663f55dc00e48.js" async=""></script><script src="/_next/static/chunks/app/error-3ebcf3275d91d60a.js" async=""></script><script src="/_next/static/chunks/app/not-found-0eb78483b8277b8d.js" async=""></script><script src="/_next/static/chunks/app/global-error-8f082029a4cf6af1.js" async=""></script><meta name="robots" content="noindex"/><meta name="theme-color" media="(prefers-color-scheme: light)" content="#f5f3f0"/><meta name="theme-color" media="(prefers-color-scheme: dark)" content="#121110"/><title>ao | integrator</title><meta name="description" content="Dashboard for managing parallel AI coding agents"/><link rel="manifest" href="/manifest.webmanifest"/><meta name="mobile-web-app-capable" content="yes"/><meta name="apple-mobile-web-app-title" content="ao | integrator"/><meta name="apple-mobile-web-app-status-bar-style" content="black-translucent"/><link rel="icon" href="/icon?fde4afff4688df3a" type="image/png" sizes="32x32"/><link rel="apple-touch-icon" href="/apple-icon?95aeb60ec7acf330" type="image/png" sizes="180x180"/><script src="/_next/static/chunks/polyfills-42372ed130431b0a.js" noModule=""></script></head><body class="h-screen overflow-hidden bg-[var(--color-bg-base)] text-[var(--color-text-primary)] antialiased"><div hidden=""><!--$--><!--/$--></div><script>((a,b,c,d,e,f,g,h)=>{let i=document.documentElement,j=["light","dark"];function k(b){var c;(Array.isArray(a)?a:[a]).forEach(a=>{let c="class"===a,d=c&&f?e.map(a=>f[a]||a):e;c?(i.classList.remove(...d),i.classList.add(f&&f[b]?f[b]:b)):i.setAttribute(a,b)}),c=b,h&&j.includes(c)&&(i.style.colorScheme=c)}if(d)k(d);else try{let a=localStorage.getItem(b)||c,d=g&&"system"===a?window.matchMedia("(prefers-color-scheme: dark)").matches?"dark":"light":a;k(d)}catch(a){}})("class","theme","dark",null,["light","dark"],null,false,true)</script><!--$--><div class="flex w-full items-center justify-center px-6 py-10 min-h-screen" style="background:radial-gradient(circle at top, var(--color-body-gradient-blue), transparent 35%), var(--color-bg-base)"><div class="w-full max-w-[36rem] rounded-[28px] border p-6 sm:p-8" style="background:linear-gradient(180deg, color-mix(in srgb, var(--color-bg-elevated) 88%, transparent) 0%, var(--color-bg-surface) 100%);border-color:var(--color-border-default);box-shadow:var(--detail-card-shadow)"><div class="flex flex-col gap-6"><div class="flex flex-col gap-4 sm:flex-row sm:items-start"><div class="flex h-14 w-14 items-center justify-center rounded-2xl border" style="background:linear-gradient(180deg, color-mix(in srgb, var(--color-accent) 16%, var(--color-bg-elevated)) 0%, var(--color-bg-surface) 100%);border-color:color-mix(in srgb, var(--color-accent) 18%, var(--color-border-default));box-shadow:var(--detail-card-shadow)"><svg class="h-7 w-7" fill="none" stroke="currentColor" stroke-width="1.6" style="color:var(--color-accent)" viewBox="0 0 24 24"><rect x="2.5" y="4.5" width="19" height="15" rx="3"></rect><path d="M6.5 9.5l3.25 2.5-3.25 2.5M12.75 15h4.75"></path></svg></div><div class="min-w-0 flex-1"><div class="mb-3 inline-flex items-center rounded-full border px-2.5 py-1 font-[var(--font-mono)] text-[10px] font-medium uppercase tracking-[0.22em]" style="color:var(--color-accent);background:var(--color-tint-blue);border-color:color-mix(in srgb, var(--color-accent) 24%, transparent)">missing</div><h1 class="text-[24px] font-semibold tracking-[-0.04em] text-[var(--color-text-primary)]">Page not found</h1><p class="mt-2 max-w-[34rem] text-[14px] leading-6 text-[var(--color-text-secondary)]">This route does not exist in the dashboard. Return to the main view to pick an active project or session.</p></div></div><div class="flex flex-wrap gap-3"><a class="inline-flex items-center justify-center rounded-full border px-4 py-2 text-[12px] font-semibold transition-colors hover:no-underline" style="background:var(--color-accent);color:var(--color-text-inverse);border-color:color-mix(in srgb, var(--color-accent) 72%, transparent)" href="/">Back to dashboard</a></div></div></div></div><!--$--><!--/$--><!--/$--><script src="/_next/static/chunks/webpack-ab12779265bdb8f9.js" id="_R_" async=""></script><script>(self.__next_f=self.__next_f||[]).push([0])</script><script>self.__next_f.push([1,"1:\"$Sreact.fragment\"\n2:I[1012,[\"7177\",\"static/chunks/app/layout-be776dec5531d47b.js\"],\"Providers\"]\n3:I[1992,[],\"\"]\n4:I[3464,[\"8713\",\"static/chunks/8713-d3d663f55dc00e48.js\",\"8039\",\"static/chunks/app/error-3ebcf3275d91d60a.js\"],\"default\"]\n5:I[7678,[],\"\"]\n6:I[9789,[\"8713\",\"static/chunks/8713-d3d663f55dc00e48.js\",\"4345\",\"static/chunks/app/not-found-0eb78483b8277b8d.js\"],\"ErrorDisplay\"]\n7:I[7285,[\"7177\",\"static/chunks/app/layout-be776dec5531d47b.js\"],\"ServiceWorkerRegistrar\"]\n8:I[2901,[],\"OutletBoundary\"]\na:I[9904,[],\"AsyncMetadataOutlet\"]\nc:I[2901,[],\"ViewportBoundary\"]\ne:I[2901,[],\"MetadataBoundary\"]\nf:\"$Sreact.suspense\"\n11:I[7494,[\"8713\",\"static/chunks/8713-d3d663f55dc00e48.js\",\"4219\",\"static/chunks/app/global-error-8f082029a4cf6af1.js\"],\"default\"]\n:HL[\"/_next/static/css/397ea3e60645d3f3.css\",\"style\"]\n"])</script><script>self.__next_f.push([1,"0:{\"P\":null,\"b\":\"5nmlY5IOwz-Od3p2SB2hh\",\"p\":\"\",\"c\":[\"\",\"_not-found\"],\"i\":false,\"f\":[[[\"\",{\"children\":[\"/_not-found\",{\"children\":[\"__PAGE__\",{}]}]},\"$undefined\",\"$undefined\",true],[\"\",[\"$\",\"$1\",\"c\",{\"children\":[[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/css/397ea3e60645d3f3.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}]],[\"$\",\"html\",null,{\"lang\":\"en\",\"className\":\"dark\",\"suppressHydrationWarning\":true,\"children\":[\"$\",\"body\",null,{\"className\":\"h-screen overflow-hidden bg-[var(--color-bg-base)] text-[var(--color-text-primary)] antialiased\",\"children\":[[\"$\",\"$L2\",null,{\"children\":[\"$\",\"$L3\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$4\",\"errorStyles\":[],\"errorScripts\":[],\"template\":[\"$\",\"$L5\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":[[\"$\",\"$L6\",null,{\"title\":\"Page not found\",\"message\":\"This route does not exist in the dashboard. Return to the main view to pick an active project or session.\",\"tone\":\"not-found\",\"primaryAction\":{\"label\":\"Back to dashboard\",\"href\":\"/\"}}],[]],\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]}],[\"$\",\"$L7\",null,{}]]}]}]]}],{\"children\":[\"/_not-found\",[\"$\",\"$1\",\"c\",{\"children\":[null,[\"$\",\"$L3\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L5\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}],{\"children\":[\"__PAGE__\",[\"$\",\"$1\",\"c\",{\"children\":[[\"$\",\"$L6\",null,{\"title\":\"Page not found\",\"message\":\"This route does not exist in the dashboard. Return to the main view to pick an active project or session.\",\"tone\":\"not-found\",\"primaryAction\":{\"label\":\"Back to dashboard\",\"href\":\"/\"}}],null,[\"$\",\"$L8\",null,{\"children\":[\"$L9\",[\"$\",\"$La\",null,{\"promise\":\"$@b\"}]]}]]}],{},null,false]},null,false]},[[\"$\",\"div\",\"l\",{\"className\":\"flex min-h-screen items-center justify-center bg-[var(--color-bg-base)]\",\"children\":[\"$\",\"div\",null,{\"className\":\"flex flex-col items-center gap-3\",\"children\":[[\"$\",\"svg\",null,{\"className\":\"h-5 w-5 animate-spin text-[var(--color-text-tertiary)]\",\"fill\":\"none\",\"stroke\":\"currentColor\",\"strokeWidth\":\"2\",\"viewBox\":\"0 0 24 24\",\"children\":[\"$\",\"path\",null,{\"d\":\"M12 3a9 9 0 1 0 9 9\"}]}],[\"$\",\"p\",null,{\"className\":\"text-[13px] text-[var(--color-text-tertiary)]\",\"children\":\"Loading…\"}]]}]}],[],[]],false],[\"$\",\"$1\",\"h\",{\"children\":[[\"$\",\"meta\",null,{\"name\":\"robots\",\"content\":\"noindex\"}],[[\"$\",\"$Lc\",null,{\"children\":\"$Ld\"}],null],[\"$\",\"$Le\",null,{\"children\":[\"$\",\"div\",null,{\"hidden\":true,\"children\":[\"$\",\"$f\",null,{\"fallback\":null,\"children\":\"$L10\"}]}]}]]}],false]],\"m\":\"$undefined\",\"G\":[\"$11\",[]],\"s\":false,\"S\":true}\n"])</script><script>self.__next_f.push([1,"d:[[\"$\",\"meta\",\"0\",{\"charSet\":\"utf-8\"}],[\"$\",\"meta\",\"1\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1, viewport-fit=cover\"}],[\"$\",\"meta\",\"2\",{\"name\":\"theme-color\",\"media\":\"(prefers-color-scheme: light)\",\"content\":\"#f5f3f0\"}],[\"$\",\"meta\",\"3\",{\"name\":\"theme-color\",\"media\":\"(prefers-color-scheme: dark)\",\"content\":\"#121110\"}]]\n9:null\n"])</script><script>self.__next_f.push([1,"12:I[7184,[],\"IconMark\"]\n"])</script><script>self.__next_f.push([1,"b:{\"metadata\":[[\"$\",\"title\",\"0\",{\"children\":\"ao | integrator\"}],[\"$\",\"meta\",\"1\",{\"name\":\"description\",\"content\":\"Dashboard for managing parallel AI coding agents\"}],[\"$\",\"link\",\"2\",{\"rel\":\"manifest\",\"href\":\"/manifest.webmanifest\",\"crossOrigin\":\"$undefined\"}],[\"$\",\"meta\",\"3\",{\"name\":\"mobile-web-app-capable\",\"content\":\"yes\"}],[\"$\",\"meta\",\"4\",{\"name\":\"apple-mobile-web-app-title\",\"content\":\"ao | integrator\"}],[\"$\",\"meta\",\"5\",{\"name\":\"apple-mobile-web-app-status-bar-style\",\"content\":\"black-translucent\"}],[\"$\",\"link\",\"6\",{\"rel\":\"icon\",\"href\":\"/icon?fde4afff4688df3a\",\"alt\":\"$undefined\",\"type\":\"image/png\",\"sizes\":\"32x32\"}],[\"$\",\"link\",\"7\",{\"rel\":\"apple-touch-icon\",\"href\":\"/apple-icon?95aeb60ec7acf330\",\"alt\":\"$undefined\",\"type\":\"image/png\",\"sizes\":\"180x180\"}],[\"$\",\"$L12\",\"8\",{}]],\"error\":null,\"digest\":\"$undefined\"}\n"])</script><script>self.__next_f.push([1,"10:\"$b:metadata\"\n"])</script></body></html>
|
|
1
|
+
<!DOCTYPE html><!--h0RXs0prE87a8wlbEXQKM--><html lang="en" class="dark"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover"/><link rel="stylesheet" href="/_next/static/css/cf9226160e230bf4.css" data-precedence="next"/><link rel="preload" as="script" fetchPriority="low" href="/_next/static/chunks/webpack-83d2d8248a30259c.js"/><script src="/_next/static/chunks/88a6fc35-f836b4b72df5eafa.js" async=""></script><script src="/_next/static/chunks/1461-af7c54935f21d56d.js" async=""></script><script src="/_next/static/chunks/main-app-b95f197c38e3b0a3.js" async=""></script><script src="/_next/static/chunks/app/layout-0cda720d75f111b8.js" async=""></script><script src="/_next/static/chunks/8713-d3d663f55dc00e48.js" async=""></script><script src="/_next/static/chunks/app/error-684a1c5596fa1e14.js" async=""></script><script src="/_next/static/chunks/app/not-found-315f4e5c106b425d.js" async=""></script><script src="/_next/static/chunks/app/global-error-1a79bacfbd9b1ba4.js" async=""></script><meta name="robots" content="noindex"/><meta name="theme-color" media="(prefers-color-scheme: light)" content="#f5f3f0"/><meta name="theme-color" media="(prefers-color-scheme: dark)" content="#121110"/><title>ao | integrator</title><meta name="description" content="Dashboard for managing parallel AI coding agents"/><link rel="manifest" href="/manifest.webmanifest"/><meta name="mobile-web-app-capable" content="yes"/><meta name="apple-mobile-web-app-title" content="ao | integrator"/><meta name="apple-mobile-web-app-status-bar-style" content="black-translucent"/><link rel="icon" href="/icon?fde4afff4688df3a" type="image/png" sizes="32x32"/><link rel="apple-touch-icon" href="/apple-icon?95aeb60ec7acf330" type="image/png" sizes="180x180"/><script src="/_next/static/chunks/polyfills-42372ed130431b0a.js" noModule=""></script></head><body class="h-screen overflow-hidden bg-[var(--color-bg-base)] text-[var(--color-text-primary)] antialiased"><div hidden=""><!--$--><!--/$--></div><script>((a,b,c,d,e,f,g,h)=>{let i=document.documentElement,j=["light","dark"];function k(b){var c;(Array.isArray(a)?a:[a]).forEach(a=>{let c="class"===a,d=c&&f?e.map(a=>f[a]||a):e;c?(i.classList.remove(...d),i.classList.add(f&&f[b]?f[b]:b)):i.setAttribute(a,b)}),c=b,h&&j.includes(c)&&(i.style.colorScheme=c)}if(d)k(d);else try{let a=localStorage.getItem(b)||c,d=g&&"system"===a?window.matchMedia("(prefers-color-scheme: dark)").matches?"dark":"light":a;k(d)}catch(a){}})("class","theme","dark",null,["light","dark"],null,false,true)</script><!--$--><div class="flex w-full items-center justify-center px-6 py-10 min-h-screen" style="background:radial-gradient(circle at top, var(--color-body-gradient-blue), transparent 35%), var(--color-bg-base)"><div class="w-full max-w-[36rem] rounded-[28px] border p-6 sm:p-8" style="background:linear-gradient(180deg, color-mix(in srgb, var(--color-bg-elevated) 88%, transparent) 0%, var(--color-bg-surface) 100%);border-color:var(--color-border-default);box-shadow:var(--detail-card-shadow)"><div class="flex flex-col gap-6"><div class="flex flex-col gap-4 sm:flex-row sm:items-start"><div class="flex h-14 w-14 items-center justify-center rounded-2xl border" style="background:linear-gradient(180deg, color-mix(in srgb, var(--color-accent) 16%, var(--color-bg-elevated)) 0%, var(--color-bg-surface) 100%);border-color:color-mix(in srgb, var(--color-accent) 18%, var(--color-border-default));box-shadow:var(--detail-card-shadow)"><svg class="h-7 w-7" fill="none" stroke="currentColor" stroke-width="1.6" style="color:var(--color-accent)" viewBox="0 0 24 24"><rect x="2.5" y="4.5" width="19" height="15" rx="3"></rect><path d="M6.5 9.5l3.25 2.5-3.25 2.5M12.75 15h4.75"></path></svg></div><div class="min-w-0 flex-1"><div class="mb-3 inline-flex items-center rounded-full border px-2.5 py-1 font-[var(--font-mono)] text-[10px] font-medium uppercase tracking-[0.22em]" style="color:var(--color-accent);background:var(--color-tint-blue);border-color:color-mix(in srgb, var(--color-accent) 24%, transparent)">missing</div><h1 class="text-[24px] font-semibold tracking-[-0.04em] text-[var(--color-text-primary)]">Page not found</h1><p class="mt-2 max-w-[34rem] text-[14px] leading-6 text-[var(--color-text-secondary)]">This route does not exist in the dashboard. Return to the main view to pick an active project or session.</p></div></div><div class="flex flex-wrap gap-3"><a class="inline-flex items-center justify-center rounded-full border px-4 py-2 text-[12px] font-semibold transition-colors hover:no-underline" style="background:var(--color-accent);color:var(--color-text-inverse);border-color:color-mix(in srgb, var(--color-accent) 72%, transparent)" href="/">Back to dashboard</a></div></div></div></div><!--$--><!--/$--><!--/$--><script src="/_next/static/chunks/webpack-83d2d8248a30259c.js" id="_R_" async=""></script><script>(self.__next_f=self.__next_f||[]).push([0])</script><script>self.__next_f.push([1,"1:\"$Sreact.fragment\"\n2:I[1012,[\"7177\",\"static/chunks/app/layout-0cda720d75f111b8.js\"],\"Providers\"]\n3:I[1992,[],\"\"]\n4:I[3464,[\"8713\",\"static/chunks/8713-d3d663f55dc00e48.js\",\"8039\",\"static/chunks/app/error-684a1c5596fa1e14.js\"],\"default\"]\n5:I[7678,[],\"\"]\n6:I[9789,[\"8713\",\"static/chunks/8713-d3d663f55dc00e48.js\",\"4345\",\"static/chunks/app/not-found-315f4e5c106b425d.js\"],\"ErrorDisplay\"]\n7:I[7285,[\"7177\",\"static/chunks/app/layout-0cda720d75f111b8.js\"],\"ServiceWorkerRegistrar\"]\n8:I[2901,[],\"OutletBoundary\"]\na:I[9904,[],\"AsyncMetadataOutlet\"]\nc:I[2901,[],\"ViewportBoundary\"]\ne:I[2901,[],\"MetadataBoundary\"]\nf:\"$Sreact.suspense\"\n11:I[7494,[\"8713\",\"static/chunks/8713-d3d663f55dc00e48.js\",\"4219\",\"static/chunks/app/global-error-1a79bacfbd9b1ba4.js\"],\"default\"]\n:HL[\"/_next/static/css/cf9226160e230bf4.css\",\"style\"]\n"])</script><script>self.__next_f.push([1,"0:{\"P\":null,\"b\":\"h0RXs0prE87a8wlbEXQKM\",\"p\":\"\",\"c\":[\"\",\"_not-found\"],\"i\":false,\"f\":[[[\"\",{\"children\":[\"/_not-found\",{\"children\":[\"__PAGE__\",{}]}]},\"$undefined\",\"$undefined\",true],[\"\",[\"$\",\"$1\",\"c\",{\"children\":[[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/css/cf9226160e230bf4.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}]],[\"$\",\"html\",null,{\"lang\":\"en\",\"className\":\"dark\",\"suppressHydrationWarning\":true,\"children\":[\"$\",\"body\",null,{\"className\":\"h-screen overflow-hidden bg-[var(--color-bg-base)] text-[var(--color-text-primary)] antialiased\",\"children\":[[\"$\",\"$L2\",null,{\"children\":[\"$\",\"$L3\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$4\",\"errorStyles\":[],\"errorScripts\":[],\"template\":[\"$\",\"$L5\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":[[\"$\",\"$L6\",null,{\"title\":\"Page not found\",\"message\":\"This route does not exist in the dashboard. Return to the main view to pick an active project or session.\",\"tone\":\"not-found\",\"primaryAction\":{\"label\":\"Back to dashboard\",\"href\":\"/\"}}],[]],\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]}],[\"$\",\"$L7\",null,{}]]}]}]]}],{\"children\":[\"/_not-found\",[\"$\",\"$1\",\"c\",{\"children\":[null,[\"$\",\"$L3\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L5\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}],{\"children\":[\"__PAGE__\",[\"$\",\"$1\",\"c\",{\"children\":[[\"$\",\"$L6\",null,{\"title\":\"Page not found\",\"message\":\"This route does not exist in the dashboard. Return to the main view to pick an active project or session.\",\"tone\":\"not-found\",\"primaryAction\":{\"label\":\"Back to dashboard\",\"href\":\"/\"}}],null,[\"$\",\"$L8\",null,{\"children\":[\"$L9\",[\"$\",\"$La\",null,{\"promise\":\"$@b\"}]]}]]}],{},null,false]},null,false]},[[\"$\",\"div\",\"l\",{\"className\":\"flex min-h-screen items-center justify-center bg-[var(--color-bg-base)]\",\"children\":[\"$\",\"div\",null,{\"className\":\"flex flex-col items-center gap-3\",\"children\":[[\"$\",\"svg\",null,{\"className\":\"h-5 w-5 animate-spin text-[var(--color-text-tertiary)]\",\"fill\":\"none\",\"stroke\":\"currentColor\",\"strokeWidth\":\"2\",\"viewBox\":\"0 0 24 24\",\"children\":[\"$\",\"path\",null,{\"d\":\"M12 3a9 9 0 1 0 9 9\"}]}],[\"$\",\"p\",null,{\"className\":\"text-[13px] text-[var(--color-text-tertiary)]\",\"children\":\"Loading…\"}]]}]}],[],[]],false],[\"$\",\"$1\",\"h\",{\"children\":[[\"$\",\"meta\",null,{\"name\":\"robots\",\"content\":\"noindex\"}],[[\"$\",\"$Lc\",null,{\"children\":\"$Ld\"}],null],[\"$\",\"$Le\",null,{\"children\":[\"$\",\"div\",null,{\"hidden\":true,\"children\":[\"$\",\"$f\",null,{\"fallback\":null,\"children\":\"$L10\"}]}]}]]}],false]],\"m\":\"$undefined\",\"G\":[\"$11\",[]],\"s\":false,\"S\":true}\n"])</script><script>self.__next_f.push([1,"d:[[\"$\",\"meta\",\"0\",{\"charSet\":\"utf-8\"}],[\"$\",\"meta\",\"1\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1, viewport-fit=cover\"}],[\"$\",\"meta\",\"2\",{\"name\":\"theme-color\",\"media\":\"(prefers-color-scheme: light)\",\"content\":\"#f5f3f0\"}],[\"$\",\"meta\",\"3\",{\"name\":\"theme-color\",\"media\":\"(prefers-color-scheme: dark)\",\"content\":\"#121110\"}]]\n9:null\n"])</script><script>self.__next_f.push([1,"12:I[7184,[],\"IconMark\"]\n"])</script><script>self.__next_f.push([1,"b:{\"metadata\":[[\"$\",\"title\",\"0\",{\"children\":\"ao | integrator\"}],[\"$\",\"meta\",\"1\",{\"name\":\"description\",\"content\":\"Dashboard for managing parallel AI coding agents\"}],[\"$\",\"link\",\"2\",{\"rel\":\"manifest\",\"href\":\"/manifest.webmanifest\",\"crossOrigin\":\"$undefined\"}],[\"$\",\"meta\",\"3\",{\"name\":\"mobile-web-app-capable\",\"content\":\"yes\"}],[\"$\",\"meta\",\"4\",{\"name\":\"apple-mobile-web-app-title\",\"content\":\"ao | integrator\"}],[\"$\",\"meta\",\"5\",{\"name\":\"apple-mobile-web-app-status-bar-style\",\"content\":\"black-translucent\"}],[\"$\",\"link\",\"6\",{\"rel\":\"icon\",\"href\":\"/icon?fde4afff4688df3a\",\"alt\":\"$undefined\",\"type\":\"image/png\",\"sizes\":\"32x32\"}],[\"$\",\"link\",\"7\",{\"rel\":\"apple-touch-icon\",\"href\":\"/apple-icon?95aeb60ec7acf330\",\"alt\":\"$undefined\",\"type\":\"image/png\",\"sizes\":\"180x180\"}],[\"$\",\"$L12\",\"8\",{}]],\"error\":null,\"digest\":\"$undefined\"}\n"])</script><script>self.__next_f.push([1,"10:\"$b:metadata\"\n"])</script></body></html>
|