@aoagents/ao-web 0.7.0 → 0.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (168) hide show
  1. package/.next/BUILD_ID +1 -1
  2. package/.next/app-build-manifest.json +138 -138
  3. package/.next/app-path-routes-manifest.json +13 -13
  4. package/.next/build-manifest.json +3 -3
  5. package/.next/prerender-manifest.json +9 -9
  6. package/.next/required-server-files.json +3 -3
  7. package/.next/server/app/_not-found/page.js +2 -2
  8. package/.next/server/app/_not-found/page.js.nft.json +1 -1
  9. package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  10. package/.next/server/app/_not-found.html +1 -1
  11. package/.next/server/app/_not-found.rsc +6 -6
  12. package/.next/server/app/api/backlog/route.js +1 -1
  13. package/.next/server/app/api/backlog/route.js.nft.json +1 -1
  14. package/.next/server/app/api/backlog/route_client-reference-manifest.js +1 -1
  15. package/.next/server/app/api/browse-directory/route.js +1 -1
  16. package/.next/server/app/api/browse-directory/route_client-reference-manifest.js +1 -1
  17. package/.next/server/app/api/filesystem/browse/route.js +1 -1
  18. package/.next/server/app/api/filesystem/browse/route_client-reference-manifest.js +1 -1
  19. package/.next/server/app/api/issues/route.js +1 -1
  20. package/.next/server/app/api/issues/route.js.nft.json +1 -1
  21. package/.next/server/app/api/issues/route_client-reference-manifest.js +1 -1
  22. package/.next/server/app/api/observability/route.js +1 -1
  23. package/.next/server/app/api/observability/route.js.nft.json +1 -1
  24. package/.next/server/app/api/observability/route_client-reference-manifest.js +1 -1
  25. package/.next/server/app/api/orchestrators/route.js +1 -1
  26. package/.next/server/app/api/orchestrators/route.js.nft.json +1 -1
  27. package/.next/server/app/api/orchestrators/route_client-reference-manifest.js +1 -1
  28. package/.next/server/app/api/projects/[id]/route.js +2 -2
  29. package/.next/server/app/api/projects/[id]/route.js.nft.json +1 -1
  30. package/.next/server/app/api/projects/[id]/route_client-reference-manifest.js +1 -1
  31. package/.next/server/app/api/projects/reload/route.js +1 -1
  32. package/.next/server/app/api/projects/reload/route.js.nft.json +1 -1
  33. package/.next/server/app/api/projects/reload/route_client-reference-manifest.js +1 -1
  34. package/.next/server/app/api/projects/route.js +1 -1
  35. package/.next/server/app/api/projects/route.js.nft.json +1 -1
  36. package/.next/server/app/api/projects/route_client-reference-manifest.js +1 -1
  37. package/.next/server/app/api/prs/[id]/merge/route.js +1 -1
  38. package/.next/server/app/api/prs/[id]/merge/route.js.nft.json +1 -1
  39. package/.next/server/app/api/prs/[id]/merge/route_client-reference-manifest.js +1 -1
  40. package/.next/server/app/api/runtime/terminal/route.js +1 -1
  41. package/.next/server/app/api/runtime/terminal/route_client-reference-manifest.js +1 -1
  42. package/.next/server/app/api/sessions/[id]/kill/route.js +1 -1
  43. package/.next/server/app/api/sessions/[id]/kill/route.js.nft.json +1 -1
  44. package/.next/server/app/api/sessions/[id]/kill/route_client-reference-manifest.js +1 -1
  45. package/.next/server/app/api/sessions/[id]/message/route.js +1 -1
  46. package/.next/server/app/api/sessions/[id]/message/route.js.nft.json +1 -1
  47. package/.next/server/app/api/sessions/[id]/message/route_client-reference-manifest.js +1 -1
  48. package/.next/server/app/api/sessions/[id]/remap/route.js +1 -1
  49. package/.next/server/app/api/sessions/[id]/remap/route.js.nft.json +1 -1
  50. package/.next/server/app/api/sessions/[id]/remap/route_client-reference-manifest.js +1 -1
  51. package/.next/server/app/api/sessions/[id]/restore/route.js +1 -1
  52. package/.next/server/app/api/sessions/[id]/restore/route.js.nft.json +1 -1
  53. package/.next/server/app/api/sessions/[id]/restore/route_client-reference-manifest.js +1 -1
  54. package/.next/server/app/api/sessions/[id]/route.js +1 -1
  55. package/.next/server/app/api/sessions/[id]/route.js.nft.json +1 -1
  56. package/.next/server/app/api/sessions/[id]/route_client-reference-manifest.js +1 -1
  57. package/.next/server/app/api/sessions/[id]/send/route.js +1 -1
  58. package/.next/server/app/api/sessions/[id]/send/route.js.nft.json +1 -1
  59. package/.next/server/app/api/sessions/[id]/send/route_client-reference-manifest.js +1 -1
  60. package/.next/server/app/api/sessions/patches/route.js +1 -1
  61. package/.next/server/app/api/sessions/patches/route.js.nft.json +1 -1
  62. package/.next/server/app/api/sessions/patches/route_client-reference-manifest.js +1 -1
  63. package/.next/server/app/api/sessions/route.js +1 -1
  64. package/.next/server/app/api/sessions/route.js.nft.json +1 -1
  65. package/.next/server/app/api/sessions/route_client-reference-manifest.js +1 -1
  66. package/.next/server/app/api/setup-labels/route.js +1 -1
  67. package/.next/server/app/api/setup-labels/route.js.nft.json +1 -1
  68. package/.next/server/app/api/setup-labels/route_client-reference-manifest.js +1 -1
  69. package/.next/server/app/api/spawn/route.js +1 -1
  70. package/.next/server/app/api/spawn/route.js.nft.json +1 -1
  71. package/.next/server/app/api/spawn/route_client-reference-manifest.js +1 -1
  72. package/.next/server/app/api/update/route.js +1 -1
  73. package/.next/server/app/api/update/route.js.nft.json +1 -1
  74. package/.next/server/app/api/update/route_client-reference-manifest.js +1 -1
  75. package/.next/server/app/api/verify/route.js +1 -1
  76. package/.next/server/app/api/verify/route.js.nft.json +1 -1
  77. package/.next/server/app/api/verify/route_client-reference-manifest.js +1 -1
  78. package/.next/server/app/api/version/route.js +1 -1
  79. package/.next/server/app/api/version/route.js.nft.json +1 -1
  80. package/.next/server/app/api/version/route_client-reference-manifest.js +1 -1
  81. package/.next/server/app/api/webhooks/[...slug]/route.js +1 -1
  82. package/.next/server/app/api/webhooks/[...slug]/route.js.nft.json +1 -1
  83. package/.next/server/app/api/webhooks/[...slug]/route_client-reference-manifest.js +1 -1
  84. package/.next/server/app/apple-icon/route.js +1 -1
  85. package/.next/server/app/apple-icon/route.js.nft.json +1 -1
  86. package/.next/server/app/apple-icon/route_client-reference-manifest.js +1 -1
  87. package/.next/server/app/dev/terminal-test/page.js +3 -3
  88. package/.next/server/app/dev/terminal-test/page.js.nft.json +1 -1
  89. package/.next/server/app/dev/terminal-test/page_client-reference-manifest.js +1 -1
  90. package/.next/server/app/dev/terminal-test.html +1 -1
  91. package/.next/server/app/dev/terminal-test.rsc +7 -7
  92. package/.next/server/app/icon/route.js +1 -1
  93. package/.next/server/app/icon/route.js.nft.json +1 -1
  94. package/.next/server/app/icon/route_client-reference-manifest.js +1 -1
  95. package/.next/server/app/icon-192/route.js +1 -1
  96. package/.next/server/app/icon-192/route.js.nft.json +1 -1
  97. package/.next/server/app/icon-192/route_client-reference-manifest.js +1 -1
  98. package/.next/server/app/icon-512/route.js +1 -1
  99. package/.next/server/app/icon-512/route.js.nft.json +1 -1
  100. package/.next/server/app/icon-512/route_client-reference-manifest.js +1 -1
  101. package/.next/server/app/manifest.webmanifest/route.js +2 -2
  102. package/.next/server/app/manifest.webmanifest/route_client-reference-manifest.js +1 -1
  103. package/.next/server/app/orchestrators/page.js +2 -2
  104. package/.next/server/app/orchestrators/page.js.nft.json +1 -1
  105. package/.next/server/app/orchestrators/page_client-reference-manifest.js +1 -1
  106. package/.next/server/app/page.js +2 -2
  107. package/.next/server/app/page.js.nft.json +1 -1
  108. package/.next/server/app/page_client-reference-manifest.js +1 -1
  109. package/.next/server/app/projects/[projectId]/page.js +2 -2
  110. package/.next/server/app/projects/[projectId]/page.js.nft.json +1 -1
  111. package/.next/server/app/projects/[projectId]/page_client-reference-manifest.js +1 -1
  112. package/.next/server/app/projects/[projectId]/sessions/[id]/page.js +2 -2
  113. package/.next/server/app/projects/[projectId]/sessions/[id]/page.js.nft.json +1 -1
  114. package/.next/server/app/projects/[projectId]/sessions/[id]/page_client-reference-manifest.js +1 -1
  115. package/.next/server/app/projects/[projectId]/settings/page.js +2 -2
  116. package/.next/server/app/projects/[projectId]/settings/page.js.nft.json +1 -1
  117. package/.next/server/app/projects/[projectId]/settings/page_client-reference-manifest.js +1 -1
  118. package/.next/server/app/prs/page.js +2 -2
  119. package/.next/server/app/prs/page.js.nft.json +1 -1
  120. package/.next/server/app/prs/page_client-reference-manifest.js +1 -1
  121. package/.next/server/app/sessions/[id]/page.js +2 -2
  122. package/.next/server/app/sessions/[id]/page.js.nft.json +1 -1
  123. package/.next/server/app/sessions/[id]/page_client-reference-manifest.js +1 -1
  124. package/.next/server/app/test-direct/page.js +2 -2
  125. package/.next/server/app/test-direct/page.js.nft.json +1 -1
  126. package/.next/server/app/test-direct/page_client-reference-manifest.js +1 -1
  127. package/.next/server/app/test-direct.html +1 -1
  128. package/.next/server/app/test-direct.rsc +7 -7
  129. package/.next/server/app-paths-manifest.json +13 -13
  130. package/.next/server/chunks/1876.js +2 -2
  131. package/.next/server/chunks/4520.js +1 -1
  132. package/.next/server/chunks/6013.js +8 -8
  133. package/.next/server/chunks/6848.js +1 -1
  134. package/.next/server/chunks/7173.js +1 -1
  135. package/.next/server/chunks/7227.js +3 -3
  136. package/.next/server/chunks/9291.js +3 -0
  137. package/.next/server/middleware-build-manifest.js +1 -1
  138. package/.next/server/pages/404.html +1 -1
  139. package/.next/server/pages/500.html +1 -1
  140. package/.next/server/server-reference-manifest.json +1 -1
  141. package/.next/static/chunks/app/dev/terminal-test/page-a6f86436c4a06eeb.js +1 -0
  142. package/.next/static/chunks/app/{error-65c526052680c0dc.js → error-d4f7c3a8dd722e8f.js} +1 -1
  143. package/.next/static/chunks/app/{global-error-63dcb797b2c3ee60.js → global-error-cb3a4148c223622a.js} +1 -1
  144. package/.next/static/chunks/app/layout-e4c02836878bea2d.js +1 -0
  145. package/.next/static/chunks/app/{not-found-a693bed1f9e1893f.js → not-found-982c28ba7f6492be.js} +1 -1
  146. package/.next/static/chunks/app/orchestrators/{page-376a92db51deb112.js → page-11a10c8b0bea320d.js} +1 -1
  147. package/.next/static/chunks/app/page-31df8f5f0d079eba.js +1 -0
  148. package/.next/static/chunks/app/projects/[projectId]/page-f076731a5810b255.js +1 -0
  149. package/.next/static/chunks/app/projects/[projectId]/sessions/[id]/page-7e46ee5c902c28aa.js +1 -0
  150. package/.next/static/chunks/app/projects/[projectId]/settings/{page-11facc471a63de50.js → page-40047db90c406c9e.js} +1 -1
  151. package/.next/static/chunks/app/prs/page-5015d39fb7984d26.js +1 -0
  152. package/.next/static/chunks/app/sessions/[id]/{error-df65e7b626bbb713.js → error-147fb962bda03d23.js} +1 -1
  153. package/.next/static/chunks/app/sessions/[id]/{not-found-a693bed1f9e1893f.js → not-found-982c28ba7f6492be.js} +1 -1
  154. package/.next/static/chunks/app/sessions/[id]/page-0a74680de719ca58.js +1 -0
  155. package/.next/static/chunks/app/test-direct/page-cbca94d9a5985aea.js +1 -0
  156. package/.next/static/chunks/{main-app-decbc53736801215.js → main-app-113c48dd1c080c52.js} +1 -1
  157. package/package.json +13 -13
  158. package/.next/server/chunks/303.js +0 -3
  159. package/.next/static/chunks/app/dev/terminal-test/page-9aa423dfd54c8325.js +0 -1
  160. package/.next/static/chunks/app/layout-36ab0168ddb22083.js +0 -1
  161. package/.next/static/chunks/app/page-587d546e62c0796f.js +0 -1
  162. package/.next/static/chunks/app/projects/[projectId]/page-bd8fc2a1decb649d.js +0 -1
  163. package/.next/static/chunks/app/projects/[projectId]/sessions/[id]/page-bd33f6ffda513080.js +0 -1
  164. package/.next/static/chunks/app/prs/page-f34f66ad51106080.js +0 -1
  165. package/.next/static/chunks/app/sessions/[id]/page-3ea4aa79275ea449.js +0 -1
  166. package/.next/static/chunks/app/test-direct/page-edfc701a9300105b.js +0 -1
  167. /package/.next/static/{9nr0fNWbZcuWTqhM2HhrH → 9ARsRA8WlFgsAl-7NPrHh}/_buildManifest.js +0 -0
  168. /package/.next/static/{9nr0fNWbZcuWTqhM2HhrH → 9ARsRA8WlFgsAl-7NPrHh}/_ssgManifest.js +0 -0
@@ -7,7 +7,7 @@ ${n(a)}
7
7
  `);let m="";function n(a){for(let b of k)b.destroyed||b.write(a)}function o(a,b){a.destroyed||a.write(b)}l.onData(a=>{let b="string"==typeof a?Buffer.from(a,"utf-8"):Buffer.from(a),c=(m+b.toString("utf-8")).split("\n");for(let a of(m=c.pop(),c))j.push(a+"\n");j.length>1e3&&j.splice(0,j.length-1e3),n(s(1,b))}),l.onExit(({exitCode:b})=>{a=b,m&&(j.push(m),m=""),n(s(7,JSON.stringify({alive:!1,pid:l.pid,exitCode:b})))});let p=r.createServer(b=>{k.add(b),j.length>0&&o(b,s(1,Buffer.from(j.join(""),"utf-8")));let c=new t((c,d)=>{!function(b,c,d){switch(c){case 2:void 0===a&&l.write(d.toString("utf-8"));break;case 3:if(void 0===a)try{let{cols:a,rows:b}=JSON.parse(d.toString("utf-8"));"number"==typeof a&&"number"==typeof b&&l.resize(a,b)}catch{}break;case 4:{let a=50;try{let b=JSON.parse(d.toString("utf-8"));"number"==typeof b.lines&&(a=b.lines)}catch{}let c=Math.max(0,j.length-a);o(b,s(5,j.slice(c).join("")));break}case 6:{let c=void 0===a,d={alive:c,pid:l.pid};c||(d.exitCode=a),o(b,s(7,JSON.stringify(d)));break}case 8:u("MSG_KILL_REQ")}}(b,c,d)});b.on("data",a=>{c.feed(a)}),b.on("close",()=>{k.delete(b)}),b.on("error",()=>{k.delete(b)})});await new Promise((a,b)=>{p.once("error",b),p.listen(d,()=>{p.removeListener("error",b),a()})});let q=!1;function u(c){if(!q){q=!0;try{if(void 0===a)try{l.kill()}catch{}}catch{}for(let a of k)try{a.destroy()}catch{}k.clear();try{p.close()}catch{}setTimeout(()=>process.exit(0),50).unref(),process.stderr.write(`pty-host [${b}] shutdown: ${c}
8
8
  `)}}process.on("SIGTERM",()=>u("SIGTERM")),process.on("SIGINT",()=>u("SIGINT")),process.on("SIGHUP",()=>u("SIGHUP")),process.on("SIGBREAK",()=>u("SIGBREAK")),process.on("beforeExit",()=>u("beforeExit")),process.on("uncaughtException",a=>{process.stderr.write(`pty-host [${b}] uncaught: ${String(a)}
9
9
  `),u("uncaughtException")}),process.on("unhandledRejection",a=>{process.stderr.write(`pty-host [${b}] unhandled rejection: ${String(a)}
10
- `)}),process.on("exit",()=>{try{void 0===a&&l.kill()}catch{}})}function v(a,b=3e3){return new Promise((c,d)=>{let e=!1,f=(0,r.connect)(a),g=setTimeout(()=>{e||(e=!0,f.destroy(),d(Error(`Timed out connecting to pty-host at ${a} (${b}ms)`)))},b);f.once("connect",()=>{e||(e=!0,clearTimeout(g),c(f))}),f.once("error",a=>{e||(e=!0,clearTimeout(g),d(a))})})}function w(a,b){return new Promise((c,d)=>{a.write(b,a=>{a?d(a):c()})})}function x(a){return new Promise(b=>setTimeout(b,a))}async function y(a,b){let c=await v(a);return new Promise((a,d)=>{let e=!1,f=b=>{e||(e=!0,b?(c.destroy(),d(b)):(c.end(),a()))};c.once("error",f),(async()=>{try{for(let a=0;a<b.length;a+=512){let d=b.slice(a,a+512);await w(c,s(2,d)),a+512<b.length&&await x(15)}await x(300),await w(c,s(2,"\r")),f()}catch(a){f(a)}})()})}async function z(a,b=50){let c;try{c=await v(a,3e3)}catch{return""}return new Promise(a=>{let d=!1,e=b=>{d||(d=!0,clearTimeout(f),c.destroy(),a(b))},f=setTimeout(()=>e(""),3e3),g=new t((a,b)=>{5===a&&e(b.toString("utf-8"))});c.on("data",a=>g.feed(a)),c.once("error",()=>e("")),c.once("close",()=>e(""));let h=s(4,JSON.stringify({lines:b}));c.write(h)})}async function A(a){let b;try{b=await v(a,2e3)}catch{return!1}return new Promise(a=>{let c=!1,d=d=>{c||(c=!0,clearTimeout(e),b.destroy(),a(d))},e=setTimeout(()=>d(!1),2e3),f=new t((a,b)=>{if(7===a)try{JSON.parse(b.toString("utf-8")),d(!0)}catch{d(!1)}});b.on("data",a=>f.feed(a)),b.once("error",()=>d(!1)),b.once("close",()=>d(!1)),b.write(s(6,""))})}async function B(a){let b;try{b=await v(a,2e3)}catch{return}await new Promise(a=>{b.once("error",()=>a());let c=s(8,"");b.write(c,()=>{b.end(),a()})})}(process.argv[1]?.endsWith("pty-host.js")||process.argv[1]?.endsWith("pty-host.ts"))&&u();let C=/^[a-zA-Z0-9_-]+$/,D={manifest:{name:"process",slot:"runtime",description:"Runtime plugin: child processes",version:"0.1.0"},create:function(){let a=new Map;return{name:"process",async create(b){let c;var f=b.sessionId;if(!C.test(f))throw Error(`Invalid session ID "${f}": must match ${C}`);let g=b.sessionId;if(a.has(g))throw Error(`Session "${g}" already exists — destroy it before re-creating`);let h={process:null,outputBuffer:[],createdAt:Date.now()};if(a.set(g,h),(0,d.uFH)()){let c=`\\\\.\\pipe\\ao-pty-${g}`,f=(0,d.ry1)(),i=(0,k.resolve)((0,k.dirname)((0,q.fileURLToPath)("file:///tmp/ao-publish-stable/packages/plugins/runtime-process/dist/index.js")),"pty-host.js"),j={...process.env,...b.environment};try{let a=(0,e.spawn)(process.execPath,[i,g,c,b.workspacePath,f.cmd,...f.args(b.launchCommand)],{cwd:b.workspacePath,env:j,stdio:["ignore","pipe","pipe"],detached:!0,windowsHide:!0}),k=await new Promise((b,c)=>{let d=setTimeout(()=>{a.kill(),c(Error("PTY host startup timeout (10s)"))},1e4),e="";a.stdout?.on("data",a=>{let c=(e+=a.toString()).match(/READY:(\d+)/);c&&(clearTimeout(d),b(parseInt(c[1],10)))}),a.stderr?.on("data",a=>{e+=a.toString()}),a.on("error",a=>{clearTimeout(d),c(Error(`PTY host spawn error: ${a.message}`))}),a.on("exit",a=>{clearTimeout(d),c(Error(`PTY host exited during startup with code ${a}: ${e}`))})});if(a.unref(),a.stdout?.destroy(),a.stderr?.destroy(),"number"==typeof a.pid)try{(0,d.YEV)({sessionId:g,ptyHostPid:a.pid,pipePath:c})}catch{}return{id:g,runtimeName:"process",data:{pid:k,ptyHostPid:a.pid,pipePath:c,createdAt:h.createdAt}}}catch(b){throw a.delete(g),b}}let i=(0,d.ry1)();try{c=(0,e.spawn)(i.cmd,i.args(b.launchCommand),{cwd:b.workspacePath,env:{...process.env,...b.environment},stdio:["pipe","pipe","pipe"],detached:!(0,d.uFH)()})}catch(c){a.delete(g);let b=c instanceof Error?c.message:String(c);throw Error(`Failed to spawn process for session ${g}: ${b}`,{cause:c})}function j(){let a="";return b=>{let c=(a+b.toString("utf-8")).split("\n");for(let b of(a=c.pop(),c))h.outputBuffer.push(b);h.outputBuffer.length>1e3&&h.outputBuffer.splice(0,h.outputBuffer.length-1e3)}}h.process=c,c.once("exit",()=>{h.outputBuffer.push(`[process exited with code ${c.exitCode}]`),a.delete(g)}),c.on("error",()=>{}),await new Promise((b,d)=>{let e=b=>{c.removeListener("spawn",f),a.delete(g),d(Error(`Failed to spawn process for session ${g}: ${b.message}`))},f=()=>{c.removeListener("error",e),b()};c.once("error",e),c.once("spawn",f)});let l=j(),m=j();return c.stdout?.on("data",l),c.stderr?.on("data",m),c.once("exit",()=>{l(Buffer.from("\n")),m(Buffer.from("\n"))}),{id:g,runtimeName:"process",data:{pid:c.pid,createdAt:h.createdAt}}},async destroy(b){let c=b.data?.pipePath;if(c){await B(c);let e=b.data?.ptyHostPid;if("number"==typeof e&&e>0){let c=Date.now()+500;for(;Date.now()<c;){try{process.kill(e,0)}catch(c){if("EPERM"===c.code)break;a.delete(b.id);try{(0,d.unregisterWindowsPtyHost)(b.id)}catch{}return}await new Promise(a=>setTimeout(a,25))}await (0,d.g8K)(e,"SIGKILL")}a.delete(b.id);try{(0,d.unregisterWindowsPtyHost)(b.id)}catch{}return}let e=a.get(b.id);if(!e){let a=b.data?.pid;"number"==typeof a&&a>0&&await (0,d.g8K)(a,"SIGKILL");return}let f=e.process;if(!f)return void a.delete(b.id);if(null===f.exitCode&&null===f.signalCode){let a=f.pid,b=new Promise(b=>{let c=setTimeout(()=>{Promise.resolve(null===f.exitCode&&null===f.signalCode?a?(0,d.g8K)(a,"SIGKILL"):void f.kill("SIGKILL"):void 0).catch(()=>{}).finally(b)},5e3);f.once("exit",()=>{clearTimeout(c),b()})});a?await (0,d.g8K)(a,"SIGTERM"):f.kill("SIGTERM"),await b}a.delete(b.id)},async sendMessage(b,c){let d=b.data?.pipePath;if(d)return void await y(d,c);let e=a.get(b.id);if(!e)throw Error(`No process found for session ${b.id}`);let f=e.process;if(!f)throw Error(`Process for session ${b.id} is still spawning`);let g=f.stdin;if(!g||!g.writable)throw Error(`stdin not writable for session ${b.id}`);await new Promise((a,b)=>{let d=!1,e=c=>{d||(d=!0,i(),c?b(c):a())},f=a=>e(a),h=()=>{},i=()=>{g.removeListener("error",f),g.removeListener("drain",h)};g.on("error",f),g.on("drain",h),g.write(c+"\n",a=>e(a??null))})},async getOutput(b,c=50){let d=b.data?.pipePath;if(d)return z(d,c);let e=a.get(b.id);if(!e)return"";let f=e.outputBuffer,g=Math.max(0,f.length-c);return f.slice(g).join("\n")},async isAlive(b){let c=b.data?.pipePath;if(c)return A(c);let d=a.get(b.id);if(!d||!d.process){let a=b.data?.pid;if("number"==typeof a&&a>0)try{return process.kill(a,0),!0}catch(a){if("EPERM"===a.code)return!0}return!1}return null===d.process.exitCode&&null===d.process.signalCode},async getMetrics(b){let c=a.get(b.id),d=c?.createdAt??Date.now();return{uptimeMs:Date.now()-d}},async getAttachInfo(b){let c=b.data?.pipePath;if(c)return await A(c)?{type:"process",target:String(b.data?.pid??""),command:c}:{type:"process",target:"",command:`# process for session ${b.id} is no longer running`};let d=a.get(b.id);return d&&d.process&&null===d.process.exitCode&&null===d.process.signalCode?{type:"process",target:String(d.process.pid)}:{type:"process",target:"",command:`# process for session ${b.id} is no longer running`}}}}};var E=c(51455);let F=(0,f.promisify)(e.execFile),G=`#!/usr/bin/env bash
10
+ `)}),process.on("exit",()=>{try{void 0===a&&l.kill()}catch{}})}function v(a,b=3e3){return new Promise((c,d)=>{let e=!1,f=(0,r.connect)(a),g=setTimeout(()=>{e||(e=!0,f.destroy(),d(Error(`Timed out connecting to pty-host at ${a} (${b}ms)`)))},b);f.once("connect",()=>{e||(e=!0,clearTimeout(g),c(f))}),f.once("error",a=>{e||(e=!0,clearTimeout(g),d(a))})})}function w(a,b){return new Promise((c,d)=>{a.write(b,a=>{a?d(a):c()})})}function x(a){return new Promise(b=>setTimeout(b,a))}async function y(a,b){let c=await v(a);return new Promise((a,d)=>{let e=!1,f=b=>{e||(e=!0,b?(c.destroy(),d(b)):(c.end(),a()))};c.once("error",f),(async()=>{try{for(let a=0;a<b.length;a+=512){let d=b.slice(a,a+512);await w(c,s(2,d)),a+512<b.length&&await x(15)}await x(300),await w(c,s(2,"\r")),f()}catch(a){f(a)}})()})}async function z(a,b=50){let c;try{c=await v(a,3e3)}catch{return""}return new Promise(a=>{let d=!1,e=b=>{d||(d=!0,clearTimeout(f),c.destroy(),a(b))},f=setTimeout(()=>e(""),3e3),g=new t((a,b)=>{5===a&&e(b.toString("utf-8"))});c.on("data",a=>g.feed(a)),c.once("error",()=>e("")),c.once("close",()=>e(""));let h=s(4,JSON.stringify({lines:b}));c.write(h)})}async function A(a){let b;try{b=await v(a,2e3)}catch{return!1}return new Promise(a=>{let c=!1,d=d=>{c||(c=!0,clearTimeout(e),b.destroy(),a(d))},e=setTimeout(()=>d(!1),2e3),f=new t((a,b)=>{if(7===a)try{JSON.parse(b.toString("utf-8")),d(!0)}catch{d(!1)}});b.on("data",a=>f.feed(a)),b.once("error",()=>d(!1)),b.once("close",()=>d(!1)),b.write(s(6,""))})}async function B(a){let b;try{b=await v(a,2e3)}catch{return}await new Promise(a=>{b.once("error",()=>a());let c=s(8,"");b.write(c,()=>{b.end(),a()})})}(process.argv[1]?.endsWith("pty-host.js")||process.argv[1]?.endsWith("pty-host.ts"))&&u();let C=/^[a-zA-Z0-9_-]+$/,D={manifest:{name:"process",slot:"runtime",description:"Runtime plugin: child processes",version:"0.1.0"},create:function(){let a=new Map;return{name:"process",async create(b){let c;var f=b.sessionId;if(!C.test(f))throw Error(`Invalid session ID "${f}": must match ${C}`);let g=b.sessionId;if(a.has(g))throw Error(`Session "${g}" already exists — destroy it before re-creating`);let h={process:null,outputBuffer:[],createdAt:Date.now()};if(a.set(g,h),(0,d.uFH)()){let c=`\\\\.\\pipe\\ao-pty-${g}`,f=(0,d.ry1)(),i=(0,k.resolve)((0,k.dirname)((0,q.fileURLToPath)("file:///tmp/ao-publish-work/packages/plugins/runtime-process/dist/index.js")),"pty-host.js"),j={...process.env,...b.environment};try{let a=(0,e.spawn)(process.execPath,[i,g,c,b.workspacePath,f.cmd,...f.args(b.launchCommand)],{cwd:b.workspacePath,env:j,stdio:["ignore","pipe","pipe"],detached:!0,windowsHide:!0}),k=await new Promise((b,c)=>{let d=setTimeout(()=>{a.kill(),c(Error("PTY host startup timeout (10s)"))},1e4),e="";a.stdout?.on("data",a=>{let c=(e+=a.toString()).match(/READY:(\d+)/);c&&(clearTimeout(d),b(parseInt(c[1],10)))}),a.stderr?.on("data",a=>{e+=a.toString()}),a.on("error",a=>{clearTimeout(d),c(Error(`PTY host spawn error: ${a.message}`))}),a.on("exit",a=>{clearTimeout(d),c(Error(`PTY host exited during startup with code ${a}: ${e}`))})});if(a.unref(),a.stdout?.destroy(),a.stderr?.destroy(),"number"==typeof a.pid)try{(0,d.YEV)({sessionId:g,ptyHostPid:a.pid,pipePath:c})}catch{}return{id:g,runtimeName:"process",data:{pid:k,ptyHostPid:a.pid,pipePath:c,createdAt:h.createdAt}}}catch(b){throw a.delete(g),b}}let i=(0,d.ry1)();try{c=(0,e.spawn)(i.cmd,i.args(b.launchCommand),{cwd:b.workspacePath,env:{...process.env,...b.environment},stdio:["pipe","pipe","pipe"],detached:!(0,d.uFH)()})}catch(c){a.delete(g);let b=c instanceof Error?c.message:String(c);throw Error(`Failed to spawn process for session ${g}: ${b}`,{cause:c})}function j(){let a="";return b=>{let c=(a+b.toString("utf-8")).split("\n");for(let b of(a=c.pop(),c))h.outputBuffer.push(b);h.outputBuffer.length>1e3&&h.outputBuffer.splice(0,h.outputBuffer.length-1e3)}}h.process=c,c.once("exit",()=>{h.outputBuffer.push(`[process exited with code ${c.exitCode}]`),a.delete(g)}),c.on("error",()=>{}),await new Promise((b,d)=>{let e=b=>{c.removeListener("spawn",f),a.delete(g),d(Error(`Failed to spawn process for session ${g}: ${b.message}`))},f=()=>{c.removeListener("error",e),b()};c.once("error",e),c.once("spawn",f)});let l=j(),m=j();return c.stdout?.on("data",l),c.stderr?.on("data",m),c.once("exit",()=>{l(Buffer.from("\n")),m(Buffer.from("\n"))}),{id:g,runtimeName:"process",data:{pid:c.pid,createdAt:h.createdAt}}},async destroy(b){let c=b.data?.pipePath;if(c){await B(c);let e=b.data?.ptyHostPid;if("number"==typeof e&&e>0){let c=Date.now()+500;for(;Date.now()<c;){try{process.kill(e,0)}catch(c){if("EPERM"===c.code)break;a.delete(b.id);try{(0,d.unregisterWindowsPtyHost)(b.id)}catch{}return}await new Promise(a=>setTimeout(a,25))}await (0,d.g8K)(e,"SIGKILL")}a.delete(b.id);try{(0,d.unregisterWindowsPtyHost)(b.id)}catch{}return}let e=a.get(b.id);if(!e){let a=b.data?.pid;"number"==typeof a&&a>0&&await (0,d.g8K)(a,"SIGKILL");return}let f=e.process;if(!f)return void a.delete(b.id);if(null===f.exitCode&&null===f.signalCode){let a=f.pid,b=new Promise(b=>{let c=setTimeout(()=>{Promise.resolve(null===f.exitCode&&null===f.signalCode?a?(0,d.g8K)(a,"SIGKILL"):void f.kill("SIGKILL"):void 0).catch(()=>{}).finally(b)},5e3);f.once("exit",()=>{clearTimeout(c),b()})});a?await (0,d.g8K)(a,"SIGTERM"):f.kill("SIGTERM"),await b}a.delete(b.id)},async sendMessage(b,c){let d=b.data?.pipePath;if(d)return void await y(d,c);let e=a.get(b.id);if(!e)throw Error(`No process found for session ${b.id}`);let f=e.process;if(!f)throw Error(`Process for session ${b.id} is still spawning`);let g=f.stdin;if(!g||!g.writable)throw Error(`stdin not writable for session ${b.id}`);await new Promise((a,b)=>{let d=!1,e=c=>{d||(d=!0,i(),c?b(c):a())},f=a=>e(a),h=()=>{},i=()=>{g.removeListener("error",f),g.removeListener("drain",h)};g.on("error",f),g.on("drain",h),g.write(c+"\n",a=>e(a??null))})},async getOutput(b,c=50){let d=b.data?.pipePath;if(d)return z(d,c);let e=a.get(b.id);if(!e)return"";let f=e.outputBuffer,g=Math.max(0,f.length-c);return f.slice(g).join("\n")},async isAlive(b){let c=b.data?.pipePath;if(c)return A(c);let d=a.get(b.id);if(!d||!d.process){let a=b.data?.pid;if("number"==typeof a&&a>0)try{return process.kill(a,0),!0}catch(a){if("EPERM"===a.code)return!0}return!1}return null===d.process.exitCode&&null===d.process.signalCode},async getMetrics(b){let c=a.get(b.id),d=c?.createdAt??Date.now();return{uptimeMs:Date.now()-d}},async getAttachInfo(b){let c=b.data?.pipePath;if(c)return await A(c)?{type:"process",target:String(b.data?.pid??""),command:c}:{type:"process",target:"",command:`# process for session ${b.id} is no longer running`};let d=a.get(b.id);return d&&d.process&&null===d.process.exitCode&&null===d.process.signalCode?{type:"process",target:String(d.process.pid)}:{type:"process",target:"",command:`# process for session ${b.id} is no longer running`}}}}};var E=c(51455);let F=(0,f.promisify)(e.execFile),G=`#!/usr/bin/env bash
11
11
  # Metadata Updater Hook for Agent Orchestrator
12
12
  #
13
13
  # This PostToolUse hook automatically updates session metadata when:
@@ -340,7 +340,7 @@ if (/^gh\\s+pr\\s+merge/.test(cleanCommand)) {
340
340
  // No matching command
341
341
  process.stdout.write("{}\\n");
342
342
  process.exit(0);
343
- `;function I(a){return a.replace(/\\/g,"/").replace(/[^a-zA-Z0-9-]/g,"-")}async function J(a){let b;try{b=await (0,E.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,E.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 K(a,b=131072){let c,d;try{let{size:e=0}=await (0,E.stat)(a);if(d=Math.max(0,e-b),0===d)c=await (0,E.readFile)(a,"utf-8");else{let b=await (0,E.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 L=null;async function M(){if((0,d.uFH)())return"";let a=Date.now();if(L&&a-L.timestamp<5e3)return L.promise?L.promise:L.output;let b=F("ps",["-eo","pid,tty,args"],{timeout:5e3}).then(({stdout:a})=>(L?.promise===b&&(L={output:a,timestamp:Date.now()}),a));L={output:"",timestamp:a,promise:b};try{return await b}catch{return L?.promise===b&&(L=null),""}}async function N(a){try{if("tmux"===a.runtimeName&&a.id){let{stdout:b}=await F("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 M();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 O(a){let b,c=(0,k.join)(a,".claude"),e=(0,k.join)(c,"settings.json");try{await (0,E.mkdir)(c,{recursive:!0})}catch{}if((0,d.uFH)()){let a=(0,k.join)(c,"metadata-updater.cjs");await (0,E.writeFile)(a,H,"utf-8"),b="node .claude/metadata-updater.cjs"}else{let a=(0,k.join)(c,"metadata-updater.sh");await (0,E.writeFile)(a,G,"utf-8"),await (0,E.chmod)(a,493),b=".claude/metadata-updater.sh"}let f={};if((0,i.existsSync)(e))try{let a=await (0,E.readFile)(e,"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")||d.command.includes("metadata-updater.js")||d.command.includes("metadata-updater.cjs"))){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,E.writeFile)(e,JSON.stringify(f,null,2)+"\n","utf-8")}let P={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",getLaunchCommand(a){let b=["claude"],c=(0,d.DD3)(a.permissions);if(("permissionless"===c||"auto-edit"===c)&&b.push("--dangerously-skip-permissions"),a.model&&b.push("--model",(0,d.kct)(a.model)),a.systemPromptFile)if((0,d.uFH)()){let c=(0,i.readFileSync)(a.systemPromptFile,"utf-8");b.push("--append-system-prompt",(0,d.kct)(c))}else b.push("--append-system-prompt",`"$(cat ${(0,d.kct)(a.systemPromptFile)})"`);else a.systemPrompt&&b.push("--append-system-prompt",(0,d.kct)(a.systemPrompt));return a.prompt&&b.push("--",(0,d.kct)(a.prompt)),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 N(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=I(a.workspacePath),g=(0,k.join)((0,j.homedir)(),".claude","projects",f),h=await J(g);if(!h)return{state:"idle",timestamp:a.createdAt};let i=await (0,d.XIc)(h);if(!i)return null;if(a.createdAt&&i.modifiedAt<a.createdAt)return{state:"idle",timestamp:a.createdAt};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=I(a.workspacePath),c=(0,k.join)((0,j.homedir)(),".claude","projects",b),d=await J(c);if(!d)return null;let e=await K(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=I(a.workspacePath),d=(0,k.join)((0,j.homedir)(),".claude","projects",b),e=await J(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 O(a)},async postLaunchSetup(a){}}},detect:function(){try{return(0,e.execFileSync)("claude",["--version"],{stdio:"ignore",shell:(0,d.uFH)(),windowsHide:!0}),!0}catch{return!1}}};var Q=c(46193),R=c(80481);c(78474).EventEmitter;let S=(0,f.promisify)(e.execFile),T=(0,k.join)((0,j.homedir)(),".codex","sessions");function U(a){return a.payload??a}async function V(a,b=0){let c;if(b>4)return[];try{c=await (0,E.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,E.lstat)(c)).isDirectory()){let a=await V(c,b+1);d.push(...a)}}catch{}}return d}async function W(a,b){let c=await (0,E.open)(a,"r"),d=[],e="",f=new Q.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}function X(a){return a.replace(/\\/g,"/").replace(/^([a-zA-Z]):/,(a,b)=>b.toLowerCase()+":")}async function Y(a,b){let c=X(b);try{for(let b of(await W(a,10)))try{let a=JSON.parse(b);if("object"==typeof a&&null!==a&&!Array.isArray(a)){let b=U(a);if("session_meta"===a.type&&"string"==typeof b.cwd&&X(b.cwd)===c)return!0}}catch{}}catch{}return!1}async function Z(a){let b=await V(T);if(0===b.length)return null;let c=null;for(let d of b)if(await Y(d,a))try{let a=await (0,E.stat)(d);(!c||a.mtimeMs>c.mtime)&&(c={path:d,mtime:a.mtimeMs})}catch{}return c?.path??null}async function $(a){try{let b={model:null,threadId:null,inputTokens:0,outputTokens:0,cachedTokens:0,reasoningTokens:0};for await(let c of(0,R.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=U(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 _(){if((0,d.uFH)())return aa();try{let{stdout:a}=await S("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,E.stat)(b),b}catch{}return"codex"}async function aa(){for(let a of["codex.cmd","codex.exe"])try{let{stdout:b}=await S("where.exe",[a],{timeout:1e4,windowsHide:!0}),c=b.split(/\r?\n/).find(a=>a.trim().length>0);if(c)return c.trim()}catch{}let a=process.env.APPDATA,b=(0,j.homedir)();for(let c of[a?(0,k.join)(a,"npm","codex.cmd"):null,a?(0,k.join)(a,"npm","codex.exe"):null,(0,k.join)(b,".cargo","bin","codex.exe")].filter(a=>null!==a))try{return await (0,E.stat)(c),c}catch{}return"codex"}function ab(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 ac(a,b){b&&(a.push("--model",(0,d.kct)(b)),/^o[34]/i.test(b)&&a.push("-c","model_reasoning_effort=high"))}function ad(a){a.push("-c","check_for_update_on_startup=false")}let ae=new Map;async function af(a){let b=ae.get(a);if(b&&Date.now()<b.expiry)return b.path;let c=await Z(a);return ae.set(a,{path:c,expiry:Date.now()+3e4}),c}function ag(a){let b=a.join(" ");return(0,d.uFH)()?`& ${b}`:b}let ah={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 ad(e),ab(e,b.permissions),ac(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)),ag(e)},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 af(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,E.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){if((0,d.uFH)())return!1;let{stdout:b}=await S("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:e}=await S("ps",["-eo","pid,tty,args"],{timeout:3e4}),f=new Set(c.map(a=>a.replace(/^\/dev\//,""))),g=/(?:^|\/)codex(?:\s|$)/;for(let a of e.split("\n")){let b=a.trimStart().split(/\s+/);if(b.length<3||!f.has(b[1]??""))continue;let c=b.slice(2).join(" ");if(g.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 af(a.workspacePath);if(!c)return null;let d=await $(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 af(b.workspacePath);if(!a)return null;let c=await $(a);if(!c?.threadId)return null;e=c.threadId,f=c.model}let g=a??"codex",h=[(0,d.kct)(g),"resume"];return ad(h),ab(h,c.agentConfig?.permissions),ac(h,c.agentConfig?.model??f??void 0),h.push((0,d.kct)(e)),ag(h)},async setupWorkspaceHooks(a,b){},async postLaunchSetup(c){if(!a){b||(b=_());try{a=await b}finally{b=null}}}}},detect:function(){try{return(0,e.execFileSync)("codex",["--version"],{stdio:"ignore",shell:(0,d.uFH)(),windowsHide:!0}),!0}catch{return!1}}},ai=(0,f.promisify)(e.execFile);async function aj(a){try{let b=(0,k.join)(a,".cursor"),c=(0,k.join)(b,"chat.md");if((await (0,E.lstat)(b)).isSymbolicLink())return null;try{if((await (0,E.lstat)(c)).isSymbolicLink())return null;return(await (0,E.stat)(c)).mtime}catch{return await (0,E.access)(b,i.constants.R_OK),(await (0,E.stat)(b)).mtime}}catch{return null}}async function ak(a){try{let b=(0,k.join)(a,".cursor"),c=(0,k.join)(b,"chat.md");try{if((await (0,E.lstat)(b)).isSymbolicLink()||(await (0,E.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,E.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 al={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 aj(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 ai("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 ai("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 ak(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",stdio:["ignore","pipe","ignore"],shell:(0,d.uFH)(),windowsHide:!0,timeout:5e3}),b=a.includes("Cursor Agent"),c=a.includes("--approve-mcps")&&a.includes("--sandbox");return b||c}catch{return!1}}};function am(){let a=process.env.KIMI_SHARE_DIR;return a&&a.trim().length>0?a:(0,k.join)((0,j.homedir)(),".kimi")}let an=".ao/kimi-baseline.json",ao=".ao/kimi-session-id.json";async function ap(){try{let a=await (0,E.readFile)((0,k.join)(am(),"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 aq(a){let b=await ap();if(!b?.work_dirs||!Array.isArray(b.work_dirs))return null;let c=await as(a);for(let a of b.work_dirs)if(a&&"string"==typeof a.path&&await as(a.path)===c)return a;return null}function ar(a){return(0,h.createHash)("md5").update(a).digest("hex")}async function as(a){try{return await (0,E.stat)(a),await (0,E.realpath)(a)}catch{return a}}async function at(a){let b,c,d=(0,k.join)(am(),"sessions");try{b=await (0,E.realpath)(d)}catch{return!1}try{c=await (0,E.realpath)(a)}catch{return!1}let e=b.endsWith(k.sep)?b:b+k.sep;return c===b||c.startsWith(e)}async function au(a){try{return(await (0,E.lstat)(a)).isFile()}catch{return!1}}async function av(a){let b=await Promise.all(["context.jsonl","wire.jsonl"].map(async b=>{try{let c=await (0,E.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 aw(a){try{let b=await (0,E.readFile)((0,k.join)(a,an),"utf-8"),c=JSON.parse(b);if(!Array.isArray(c.preExistingUuids))return null;return new Set(c.preExistingUuids)}catch{return null}}async function ax(a){let b=(0,k.join)(a,an);try{await (0,E.stat)(b);return}catch{}let c=await as(a),d=(0,k.join)(am(),"sessions",ar(c)),e=[];try{e=await (0,E.readdir)(d)}catch{}let f={preExistingUuids:e,capturedAt:new Date().toISOString()};try{await (0,E.mkdir)((0,k.join)(a,".ao"),{recursive:!0}),await (0,E.writeFile)(b,JSON.stringify(f),"utf-8")}catch{}}async function ay(a){try{let b=await (0,E.readFile)((0,k.join)(a,ao),"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 az(a,b){let c={sessionId:b,pinnedAt:new Date().toISOString()};try{await (0,E.mkdir)((0,k.join)(a,".ao"),{recursive:!0}),await (0,E.writeFile)((0,k.join)(a,ao),JSON.stringify(c),"utf-8")}catch{}}async function aA(a){let b;if(!a.workspacePath)return null;let c=await as(a.workspacePath),d=(0,k.join)(am(),"sessions",ar(c));if(!await at(d))return null;try{b=await (0,E.readdir)(d)}catch{return null}let e=await ay(a.workspacePath),f=null;if(!e){let b=await aq(a.workspacePath);b&&"string"==typeof b.last_session_id&&b.last_session_id.length>0&&(f=b.last_session_id)}let g=await aw(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 at(b))continue;let c=await av(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 az(a.workspacePath,j.sessionId),j):i?(await az(a.workspacePath,i.sessionId),{dir:i.dir,sessionId:i.sessionId,mtime:i.mtime}):null}let aB=new Map;async function aC(a){let b=a.workspacePath;if(!b)return null;let c=Date.now(),d=aB.get(b);if(d&&d.expiry>c)return d.match;d&&aB.delete(b);let e=await aA(a),f=e?3e4:2e3;return aB.set(b,{match:e,expiry:c+f}),aB.size>256&&function(a){for(let[b,c]of aB)c.expiry<=a&&aB.delete(b);if(aB.size<=256)return;let b=[...aB.entries()].sort((a,b)=>a[1].expiry-b[1].expiry),c=aB.size-256;for(let a=0;a<c;a++){let c=b[a];c&&aB.delete(c[0])}}(c),e}let aD=(0,f.promisify)(e.execFile);async function aE(a){let b=(0,k.join)(a,"wire.jsonl");if(!await au(b))return null;let c=null;try{let a=(0,R.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 aF(a,b){let c=(0,d.DD3)(b);("permissionless"===c||"auto-edit"===c)&&a.push("--yolo")}function aG(a){let b=a.join(" ");return(0,d.uFH)()?`& ${b}`:b}let aH=/kimi[-_](?:cli|code)|moonshot/i,aI={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;c&&b.push("--work-dir",(0,d.kct)(c)),aF(b,a.permissions),a.model&&b.push("--model",(0,d.kct)(a.model)),a.subagent&&b.push("--agent",(0,d.kct)(a.subagent));let e=a.prompt??"";if(a.systemPromptFile){let b=(0,i.readFileSync)(a.systemPromptFile,"utf-8");e=e?`${b}
343
+ `;function I(a){return a.replace(/\\/g,"/").replace(/[^a-zA-Z0-9-]/g,"-")}async function J(a){let b;try{b=await (0,E.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,E.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 K(a,b=131072){let c,d;try{let{size:e=0}=await (0,E.stat)(a);if(d=Math.max(0,e-b),0===d)c=await (0,E.readFile)(a,"utf-8");else{let b=await (0,E.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 L=null;async function M(){if((0,d.uFH)())return"";let a=Date.now();if(L&&a-L.timestamp<5e3)return L.promise?L.promise:L.output;let b=F("ps",["-eo","pid,tty,args"],{timeout:3e4}).then(({stdout:a})=>(L?.promise===b&&(L={output:a||d.HkR,timestamp:Date.now()}),a||d.HkR)).catch(()=>(L?.promise===b&&(L={output:d.HkR,timestamp:Date.now()}),d.HkR));return L={output:"",timestamp:a,promise:b},b}async function N(a){try{if("tmux"===a.runtimeName&&a.id){if((0,d.uFH)())return null;let{stdout:b}=await F("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 null;let e=await M();if(e===d.HkR)return d.HkR;let f=new Set(c.map(a=>a.replace(/^\/dev\//,""))),g=/(?:^|\/)claude(?:\s|$)/;for(let a of e.split("\n")){let b=a.trimStart().split(/\s+/);if(b.length<3||!f.has(b[1]??""))continue;let c=b.slice(2).join(" ");if(g.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 d.HkR}}async function O(a){let b,c=(0,k.join)(a,".claude"),e=(0,k.join)(c,"settings.json");try{await (0,E.mkdir)(c,{recursive:!0})}catch{}if((0,d.uFH)()){let a=(0,k.join)(c,"metadata-updater.cjs");await (0,E.writeFile)(a,H,"utf-8"),b="node .claude/metadata-updater.cjs"}else{let a=(0,k.join)(c,"metadata-updater.sh");await (0,E.writeFile)(a,G,"utf-8"),await (0,E.chmod)(a,493),b=".claude/metadata-updater.sh"}let f={};if((0,i.existsSync)(e))try{let a=await (0,E.readFile)(e,"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")||d.command.includes("metadata-updater.js")||d.command.includes("metadata-updater.cjs"))){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,E.writeFile)(e,JSON.stringify(f,null,2)+"\n","utf-8")}let P={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",getLaunchCommand(a){let b=["claude"],c=(0,d.DD3)(a.permissions);if(("permissionless"===c||"auto-edit"===c)&&b.push("--dangerously-skip-permissions"),a.model&&b.push("--model",(0,d.kct)(a.model)),a.systemPromptFile)if((0,d.uFH)()){let c=(0,i.readFileSync)(a.systemPromptFile,"utf-8");b.push("--append-system-prompt",(0,d.kct)(c))}else b.push("--append-system-prompt",`"$(cat ${(0,d.kct)(a.systemPromptFile)})"`);else a.systemPrompt&&b.push("--append-system-prompt",(0,d.kct)(a.systemPrompt));return a.prompt&&b.push("--",(0,d.kct)(a.prompt)),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),async isProcessRunning(a){let b=await N(a);return b===d.HkR?d.HkR:null!==b},async getActivityState(a,b){let c=b??d.PES,e=new Date;if(!a.runtimeHandle)return{state:"exited",timestamp:e};let f=await this.isProcessRunning(a.runtimeHandle);if(f===d.HkR)return null;if(!f)return{state:"exited",timestamp:e};if(!a.workspacePath)return null;let g=I(a.workspacePath),h=(0,k.join)((0,j.homedir)(),".claude","projects",g),i=await J(h);if(!i)return{state:"idle",timestamp:a.createdAt};let l=await (0,d.XIc)(i);if(!l)return null;if(a.createdAt&&l.modifiedAt<a.createdAt)return{state:"idle",timestamp:a.createdAt};let m=Date.now()-l.modifiedAt.getTime(),n=l.modifiedAt,o=Math.min(d.V1$,c);switch(l.lastType){case"user":case"tool_use":case"progress":default:if(m<=o)return{state:"active",timestamp:n};return{state:m>c?"idle":"ready",timestamp:n};case"assistant":case"system":case"summary":case"result":return{state:m>c?"idle":"ready",timestamp:n};case"permission_request":return{state:"waiting_input",timestamp:n};case"error":return{state:"blocked",timestamp:n}}},async getSessionInfo(a){if(!a.workspacePath)return null;let b=I(a.workspacePath),c=(0,k.join)((0,j.homedir)(),".claude","projects",b),d=await J(c);if(!d)return null;let e=await K(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=I(a.workspacePath),d=(0,k.join)((0,j.homedir)(),".claude","projects",b),e=await J(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 O(a)},async postLaunchSetup(a){}}},detect:function(){try{return(0,e.execFileSync)("claude",["--version"],{stdio:"ignore",shell:(0,d.uFH)(),windowsHide:!0}),!0}catch{return!1}}};var Q=c(46193),R=c(80481);c(78474).EventEmitter;let S=(0,f.promisify)(e.execFile),T=(0,k.join)((0,j.homedir)(),".codex","sessions");function U(a){return a.payload??a}async function V(a,b=0){let c;if(b>4)return[];try{c=await (0,E.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,E.lstat)(c)).isDirectory()){let a=await V(c,b+1);d.push(...a)}}catch{}}return d}async function W(a,b){let c=await (0,E.open)(a,"r"),d=[],e="",f=new Q.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}function X(a){return a.replace(/\\/g,"/").replace(/^([a-zA-Z]):/,(a,b)=>b.toLowerCase()+":")}async function Y(a,b){let c=X(b);try{for(let b of(await W(a,10)))try{let a=JSON.parse(b);if("object"==typeof a&&null!==a&&!Array.isArray(a)){let b=U(a);if("session_meta"===a.type&&"string"==typeof b.cwd&&X(b.cwd)===c)return!0}}catch{}}catch{}return!1}async function Z(a){let b=await V(T);if(0===b.length)return null;let c=null;for(let d of b)if(await Y(d,a))try{let a=await (0,E.stat)(d);(!c||a.mtimeMs>c.mtime)&&(c={path:d,mtime:a.mtimeMs})}catch{}return c?.path??null}async function $(a){try{let b={model:null,threadId:null,inputTokens:0,outputTokens:0,cachedTokens:0,reasoningTokens:0};for await(let c of(0,R.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=U(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 _(){if((0,d.uFH)())return aa();try{let{stdout:a}=await S("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,E.stat)(b),b}catch{}return"codex"}async function aa(){for(let a of["codex.cmd","codex.exe"])try{let{stdout:b}=await S("where.exe",[a],{timeout:1e4,windowsHide:!0}),c=b.split(/\r?\n/).find(a=>a.trim().length>0);if(c)return c.trim()}catch{}let a=process.env.APPDATA,b=(0,j.homedir)();for(let c of[a?(0,k.join)(a,"npm","codex.cmd"):null,a?(0,k.join)(a,"npm","codex.exe"):null,(0,k.join)(b,".cargo","bin","codex.exe")].filter(a=>null!==a))try{return await (0,E.stat)(c),c}catch{}return"codex"}function ab(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 ac(a,b){b&&(a.push("--model",(0,d.kct)(b)),/^o[34]/i.test(b)&&a.push("-c","model_reasoning_effort=high"))}function ad(a){a.push("-c","check_for_update_on_startup=false")}let ae=new Map;async function af(a){let b=ae.get(a);if(b&&Date.now()<b.expiry)return b.path;let c=await Z(a);return ae.set(a,{path:c,expiry:Date.now()+3e4}),c}function ag(a){let b=a.join(" ");return(0,d.uFH)()?`& ${b}`:b}let ah={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 ad(e),ab(e,b.permissions),ac(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)),ag(e)},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)return{state:"exited",timestamp:e};let f=await this.isProcessRunning(a.runtimeHandle);if(f===d.HkR)return null;if(!f)return{state:"exited",timestamp:e};if(!a.workspacePath)return null;let g=await af(a.workspacePath);if(g){let a=await (0,d.XIc)(g);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 h=await (0,d.Ahw)(a.workspacePath),i=(0,d.Bmx)(h);if(i)return i;let j=Math.min(d.V1$,c),k=(0,d.Vo2)(h,j,c);if(k)return k;if(g)try{let a=await (0,E.stat)(g),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){if((0,d.uFH)())return!1;let{stdout:b}=await S("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:e}=await S("ps",["-eo","pid,tty,args"],{timeout:3e4});if(!e)return d.HkR;let f=new Set(c.map(a=>a.replace(/^\/dev\//,""))),g=/(?:^|\/)codex(?:\s|$)/;for(let a of e.split("\n")){let b=a.trimStart().split(/\s+/);if(b.length<3||!f.has(b[1]??""))continue;let c=b.slice(2).join(" ");if(g.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 d.HkR}},async getSessionInfo(a){let b;if(!a.workspacePath)return null;let c=await af(a.workspacePath);if(!c)return null;let d=await $(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 af(b.workspacePath);if(!a)return null;let c=await $(a);if(!c?.threadId)return null;e=c.threadId,f=c.model}let g=a??"codex",h=[(0,d.kct)(g),"resume"];return ad(h),ab(h,c.agentConfig?.permissions),ac(h,c.agentConfig?.model??f??void 0),h.push((0,d.kct)(e)),ag(h)},async setupWorkspaceHooks(a,b){},async postLaunchSetup(c){if(!a){b||(b=_());try{a=await b}finally{b=null}}}}},detect:function(){try{return(0,e.execFileSync)("codex",["--version"],{stdio:"ignore",shell:(0,d.uFH)(),windowsHide:!0}),!0}catch{return!1}}},ai=(0,f.promisify)(e.execFile);async function aj(a){try{let b=(0,k.join)(a,".cursor"),c=(0,k.join)(b,"chat.md");if((await (0,E.lstat)(b)).isSymbolicLink())return null;try{if((await (0,E.lstat)(c)).isSymbolicLink())return null;return(await (0,E.stat)(c)).mtime}catch{return await (0,E.access)(b,i.constants.R_OK),(await (0,E.stat)(b)).mtime}}catch{return null}}async function ak(a){try{let b=(0,k.join)(a,".cursor"),c=(0,k.join)(b,"chat.md");try{if((await (0,E.lstat)(b)).isSymbolicLink()||(await (0,E.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,E.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 al={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 aj(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 ai("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 ai("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 ak(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",stdio:["ignore","pipe","ignore"],shell:(0,d.uFH)(),windowsHide:!0,timeout:5e3}),b=a.includes("Cursor Agent"),c=a.includes("--approve-mcps")&&a.includes("--sandbox");return b||c}catch{return!1}}};function am(){let a=process.env.KIMI_SHARE_DIR;return a&&a.trim().length>0?a:(0,k.join)((0,j.homedir)(),".kimi")}let an=".ao/kimi-baseline.json",ao=".ao/kimi-session-id.json";async function ap(){try{let a=await (0,E.readFile)((0,k.join)(am(),"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 aq(a){let b=await ap();if(!b?.work_dirs||!Array.isArray(b.work_dirs))return null;let c=await as(a);for(let a of b.work_dirs)if(a&&"string"==typeof a.path&&await as(a.path)===c)return a;return null}function ar(a){return(0,h.createHash)("md5").update(a).digest("hex")}async function as(a){try{return await (0,E.stat)(a),await (0,E.realpath)(a)}catch{return a}}async function at(a){let b,c,d=(0,k.join)(am(),"sessions");try{b=await (0,E.realpath)(d)}catch{return!1}try{c=await (0,E.realpath)(a)}catch{return!1}let e=b.endsWith(k.sep)?b:b+k.sep;return c===b||c.startsWith(e)}async function au(a){try{return(await (0,E.lstat)(a)).isFile()}catch{return!1}}async function av(a){let b=await Promise.all(["context.jsonl","wire.jsonl"].map(async b=>{try{let c=await (0,E.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 aw(a){try{let b=await (0,E.readFile)((0,k.join)(a,an),"utf-8"),c=JSON.parse(b);if(!Array.isArray(c.preExistingUuids))return null;return new Set(c.preExistingUuids)}catch{return null}}async function ax(a){let b=(0,k.join)(a,an);try{await (0,E.stat)(b);return}catch{}let c=await as(a),d=(0,k.join)(am(),"sessions",ar(c)),e=[];try{e=await (0,E.readdir)(d)}catch{}let f={preExistingUuids:e,capturedAt:new Date().toISOString()};try{await (0,E.mkdir)((0,k.join)(a,".ao"),{recursive:!0}),await (0,E.writeFile)(b,JSON.stringify(f),"utf-8")}catch{}}async function ay(a){try{let b=await (0,E.readFile)((0,k.join)(a,ao),"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 az(a,b){let c={sessionId:b,pinnedAt:new Date().toISOString()};try{await (0,E.mkdir)((0,k.join)(a,".ao"),{recursive:!0}),await (0,E.writeFile)((0,k.join)(a,ao),JSON.stringify(c),"utf-8")}catch{}}async function aA(a){let b;if(!a.workspacePath)return null;let c=await as(a.workspacePath),d=(0,k.join)(am(),"sessions",ar(c));if(!await at(d))return null;try{b=await (0,E.readdir)(d)}catch{return null}let e=await ay(a.workspacePath),f=null;if(!e){let b=await aq(a.workspacePath);b&&"string"==typeof b.last_session_id&&b.last_session_id.length>0&&(f=b.last_session_id)}let g=await aw(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 at(b))continue;let c=await av(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 az(a.workspacePath,j.sessionId),j):i?(await az(a.workspacePath,i.sessionId),{dir:i.dir,sessionId:i.sessionId,mtime:i.mtime}):null}let aB=new Map;async function aC(a){let b=a.workspacePath;if(!b)return null;let c=Date.now(),d=aB.get(b);if(d&&d.expiry>c)return d.match;d&&aB.delete(b);let e=await aA(a),f=e?3e4:2e3;return aB.set(b,{match:e,expiry:c+f}),aB.size>256&&function(a){for(let[b,c]of aB)c.expiry<=a&&aB.delete(b);if(aB.size<=256)return;let b=[...aB.entries()].sort((a,b)=>a[1].expiry-b[1].expiry),c=aB.size-256;for(let a=0;a<c;a++){let c=b[a];c&&aB.delete(c[0])}}(c),e}let aD=(0,f.promisify)(e.execFile);async function aE(a){let b=(0,k.join)(a,"wire.jsonl");if(!await au(b))return null;let c=null;try{let a=(0,R.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 aF(a,b){let c=(0,d.DD3)(b);("permissionless"===c||"auto-edit"===c)&&a.push("--yolo")}function aG(a){let b=a.join(" ");return(0,d.uFH)()?`& ${b}`:b}let aH=/kimi[-_](?:cli|code)|moonshot/i,aI={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;c&&b.push("--work-dir",(0,d.kct)(c)),aF(b,a.permissions),a.model&&b.push("--model",(0,d.kct)(a.model)),a.subagent&&b.push("--agent",(0,d.kct)(a.subagent));let e=a.prompt??"";if(a.systemPromptFile){let b=(0,i.readFileSync)(a.systemPromptFile,"utf-8");e=e?`${b}
344
344
 
345
345
  ---
346
346
 
@@ -406,7 +406,7 @@ process.stdin.on('data', c => input += c).on('end', () => {
406
406
  if (matches.length === 0) process.exit(1);
407
407
  process.stdout.write(matches[0].id);
408
408
  });
409
- `.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 aL(a);if(h){let a=aK(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){if((0,d.uFH)())return!1;let{stdout:b}=await aJ("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:e}=await aJ("ps",["-eo","pid,tty,args"],{timeout:3e4}),f=new Set(c.map(a=>a.replace(/^\/dev\//,""))),g=/(?:^|\/)opencode(?:\s|$)/;for(let a of e.split("\n")){let b=a.trimStart().split(/\s+/);if(b.length<3||!f.has(b[1]??""))continue;let c=b.slice(2).join(" ");if(g.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 aL(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 aL(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",shell:(0,d.uFH)(),windowsHide:!0,env:(0,d.RxI)()}),!0}catch{return!1}}},aN=(0,f.promisify)(e.execFile);async function aO(a,...b){let{stdout:c}=await aN("git",b,{cwd:a,windowsHide:!0,timeout:3e4});return c.trimEnd()}function aP(a){return a.replace(/\\/g,"/").replace(/^([a-zA-Z]):/,(a,b)=>b.toLowerCase()+":")}async function aQ(a){let b;if(!(0,d.uFH)())return void(0,i.rmSync)(a,{recursive:!0,force:!0});let c=[0,100,250,500,1e3,2e3];for(let d of c){d>0&&await new Promise(a=>setTimeout(a,d));try{if((0,i.rmSync)(a,{recursive:!0,force:!0}),!(0,i.existsSync)(a))return}catch(a){b=a}}if((0,i.existsSync)(a))throw Error(`Failed to remove "${a}" after ${c.length} attempts (Windows file-handle drain). Last error: ${b instanceof Error?b.message:String(b)}`)}async function aR(a){try{return await aO(a,"remote","get-url","origin"),!0}catch{return!1}}async function aS(a,b){try{return await aO(a,"rev-parse","--verify","--quiet",b),!0}catch{return!1}}async function aT(a,b,c){if(c?.hasOrigin??await aR(a)){if(c?.branch){let b=`origin/${c.branch}`;if(await aS(a,b))return b}let d=`origin/${b}`;if(await aS(a,d))return d}let d=`refs/heads/${b}`;if(await aS(a,d))return d;throw Error(`Unable to resolve base ref for default branch "${b}"`)}async function aU(a,b){try{let c=await aO(a,"worktree","list","--porcelain"),d=aP((0,k.resolve)(b));return c.split("\n").some(a=>a.startsWith("worktree ")&&aP((0,k.resolve)(a.slice(9)))===d)}catch{return!1}}async function aV(a,b){if((0,i.existsSync)(b)){try{await aO(a,"worktree","prune")}catch{}if(await aU(a,b))throw Error(`Worktree path "${b}" already exists and is still registered with git`);(0,i.rmSync)(b,{recursive:!0,force:!0})}}async function aW(a,b){try{await aO(a,"worktree","remove","--force",b)}catch{}if((0,i.existsSync)(b)){if(await aU(a,b))throw Error(`Worktree path "${b}" already exists and is still registered with git`);await aQ(b)}}async function aX(a,b,c){await aW(a,b),await aO(a,"worktree","add",b,c)}async function aY(a,b,c,d,e){await aW(a,b);let f=await aT(a,d,{branch:c,hasOrigin:e});if(!f.startsWith("origin/"))return void await aO(a,"worktree","add","-b",c,b,f);try{await aO(a,"worktree","add","-b",c,b,f)}catch{await aO(a,"worktree","add","-b",c,b,`refs/heads/${d}`)}}let aZ=/^[a-zA-Z0-9_-]+$/;function a$(a,b){if(!aZ.test(a))throw Error(`Invalid ${b} "${a}": must match ${aZ}`)}function a_(a){return a.startsWith("~/")?(0,k.join)((0,j.homedir)(),a.slice(2)):a}let a0={manifest:{name:"worktree",slot:"workspace",description:"Workspace plugin: git worktrees",version:"0.1.0"},create:function(a){let b=a?.worktreeDir?a_(a.worktreeDir):(0,k.join)((0,j.homedir)(),".worktrees");return{name:"worktree",async create(a){a$(a.projectId,"projectId"),a$(a.sessionId,"sessionId");let c=a_(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 aV(c,f);let g=await aR(c);if(g)try{await aO(c,"fetch","origin","--quiet")}catch{}let h=await aT(c,a.project.defaultBranch,{hasOrigin:g});try{await aO(c,"worktree","add","-b",a.branch,f,h)}catch(i){let b=i instanceof Error?i.message:String(i);if(!b.includes("already exists"))throw Error(`Failed to create worktree for branch "${a.branch}": ${b}`,{cause:i});let d=await aO(c,"rev-parse",h),e=`refs/heads/${a.branch}`,g=await aS(c,e)?await aO(c,"rev-parse",e):void 0;try{g===d?await aO(c,"worktree","add",f,a.branch):await aO(c,"worktree","add","-B",a.branch,f,h)}catch(d){try{await aO(c,"worktree","remove","--force",f)}catch{}let b=d instanceof Error?d.message:String(d);throw Error(`Failed to create worktree for branch "${a.branch}": ${b}`,{cause:d})}}return{path:f,branch:a.branch,sessionId:a.sessionId,projectId:a.projectId}},async findManagedWorkspace(a){a$(a.projectId,"projectId"),a$(a.sessionId,"sessionId");let c=a_(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 aO(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 aO(a,"rev-parse","--path-format=absolute","--git-common-dir"),c=(0,k.resolve)(b,"..");await aO(c,"worktree","remove","--force",a)}catch{(0,i.existsSync)(a)&&await aQ(a)}},async list(a){a$(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 aO(a,"worktree","list","--porcelain");break}catch{continue}if(!e)return[];let f=[],g=e.split("\n\n"),h=aP(c);for(let b of g){let c=b.trim().split("\n"),d="",e="";for(let a of c)a.startsWith("worktree ")?d=a.slice(9):a.startsWith("branch ")&&(e=a.slice(7).replace("refs/heads/",""));let g=d?aP(d):"";if(d&&(g===h||g.startsWith(h+"/"))){let b=(0,k.basename)(d);f.push({path:d,branch:e||"detached",sessionId:b,projectId:a})}}return f},async exists(a){if(!(0,i.existsSync)(a))return!1;try{return await aN("git",["rev-parse","--is-inside-work-tree"],{cwd:a,timeout:3e4,windowsHide:!0}),!0}catch{return!1}},async restore(a,b){let c=a_(a.project.path);try{await aO(c,"worktree","prune")}catch{}let d=await aR(c);if(d)try{await aO(c,"fetch","origin","--quiet")}catch{}try{await aO(c,"worktree","add",b,a.branch)}catch{await aS(c,`refs/heads/${a.branch}`)?await aX(c,b,a.branch):await aY(c,b,a.branch,a.project.defaultBranch,d)}return{path:b,branch:a.branch,sessionId:a.sessionId,projectId:a.projectId}},async postCreate(a,b){let c=a_(b.path);if(b.symlinks)for(let e of b.symlinks){if(e.startsWith("/")||e.includes("..")||/^[a-zA-Z]:[\\/]/.test(e)||e.startsWith("\\\\"))throw Error(`Invalid symlink path "${e}": must be a relative path without ".." segments`);let b=(0,k.join)(c,e),f=(0,k.resolve)(a.path,e),g=(0,k.resolve)(a.path);if(!f.startsWith(g+k.sep)&&f!==g)throw Error(`Symlink target "${e}" resolves outside workspace: ${f}`);if((0,i.existsSync)(b)){try{let a=(0,i.lstatSync)(f);(a.isSymbolicLink()||a.isFile()||a.isDirectory())&&(0,i.rmSync)(f,{recursive:!0,force:!0})}catch{}(0,i.mkdirSync)((0,k.dirname)(f),{recursive:!0});try{(0,i.symlinkSync)(b,f)}catch(a){if((0,d.uFH)()){let a=(()=>{try{return(0,i.statSync)(b).isDirectory()}catch{return!1}})();try{a?(0,i.symlinkSync)(b,f,"junction"):(0,i.linkSync)(b,f)}catch{i.cpSync(b,f,{recursive:!0})}}else throw a}}}if(b.postCreate){let c=(0,d.ry1)();for(let d of b.postCreate)await aN(c.cmd,c.args(d),{cwd:a.path,windowsHide:!0})}}}}};class a1{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 a2=(0,f.promisify)(e.execFile),a3=async(a,b,c)=>(0,d.vQK)(a,{component:"scm-github-batch",operation:c},b),a4={prList:new a1(100),commitStatus:new a1(500),reviewComments:new a1(500)};function a5(a,b,c){a4.prList.set(`${a}/${b}`,c)}function a6(a,b,c,d){a4.commitStatus.set(`${a}/${b}#${c}`,d)}let a7=new a1(200),a8=new a1(200);async function a9(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 be(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=a7.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 bf(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 ba(){try{await a2("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 bb(a){return/HTTP\/[\d.]+ 304/i.test(a)}function bc(a){let b=("string"==typeof a.stdout?a.stdout:"")+("string"==typeof a.stderr?a.stderr:"");return b.length>0?b:null}function bd(a){let b=a.match(/etag:\s*(.+)/i);return b?b[1].trim():void 0}async function be(a,b,c){let d=`${a}/${b}`,e=a4.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 a3(f,1e4,"gh.api.guard-pr-list");if(bb(c)){let d=bd(c);return d&&a5(a,b,d),!1}let d=bd(c);return d&&a5(a,b,d),!0}catch(g){let e=bc(g);if(e&&bb(e)){let c=bd(e);return c&&a5(a,b,c),!1}let f=g instanceof Error?g.message:String(g);if(bb(f))return!1;return c?.log("warn",`[ETag Guard 1] PR list check failed for ${d}: ${f}`),!0}}async function bf(a,b,c,d){let e=`${a}/${b}#${c}`,f=a4.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 a3(g,1e4,"gh.api.guard-commit-status");if(bb(d)){let e=bd(d);return e&&a6(a,b,c,e),!1}let e=bd(d);return e&&a6(a,b,c,e),!0}catch(h){let f=bc(h);if(f&&bb(f)){let d=bd(f);return d&&a6(a,b,c,d),!1}let g=h instanceof Error?h.message:String(h);if(bb(g))return!1;return d?.log("warn",`[ETag Guard 2] Commit status check failed for ${e}: ${g}`),!0}}async function bg(a,b,c,d){let e=`${a}/${b}#${c}`,f=a4.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 a3(g,1e4,"gh.api.guard-review-comments");if(bb(a)){let b=bd(a);return b&&a4.reviewComments.set(e,b),!1}let b=bd(a);return b&&a4.reviewComments.set(e,b),!0}catch(c){let a=bc(c);if(a&&bb(a)){let b=bd(a);return b&&a4.reviewComments.set(e,b),!1}let b=c instanceof Error?c.message:String(c);if(bb(b))return!1;return d?.log("warn",`[ETag Guard 3] Review comments check failed for ${e}: ${b}`),!0}}let bh=`
409
+ `.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)return{state:"exited",timestamp:f};let g=await this.isProcessRunning(a.runtimeHandle);if(g===d.HkR)return null;if(!g)return{state:"exited",timestamp:f};let h=null;if(a.workspacePath){h=await (0,d.Ahw)(a.workspacePath);let b=(0,d.Bmx)(h);if(b)return b}let i=await aL(a);if(i){let a=aK(i.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 j=(0,d.Vo2)(h,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){if((0,d.uFH)())return!1;let{stdout:b}=await aJ("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:e}=await aJ("ps",["-eo","pid,tty,args"],{timeout:3e4});if(!e)return d.HkR;let f=new Set(c.map(a=>a.replace(/^\/dev\//,""))),g=/(?:^|\/)opencode(?:\s|$)/;for(let a of e.split("\n")){let b=a.trimStart().split(/\s+/);if(b.length<3||!f.has(b[1]??""))continue;let c=b.slice(2).join(" ");if(g.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 d.HkR}},async getSessionInfo(a){let b=await aL(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 aL(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",shell:(0,d.uFH)(),windowsHide:!0,env:(0,d.RxI)()}),!0}catch{return!1}}},aN=(0,f.promisify)(e.execFile);async function aO(a,...b){let{stdout:c}=await aN("git",b,{cwd:a,windowsHide:!0,timeout:3e4});return c.trimEnd()}function aP(a){return a.replace(/\\/g,"/").replace(/^([a-zA-Z]):/,(a,b)=>b.toLowerCase()+":")}async function aQ(a){let b;if(!(0,d.uFH)())return void(0,i.rmSync)(a,{recursive:!0,force:!0});let c=[0,100,250,500,1e3,2e3];for(let d of c){d>0&&await new Promise(a=>setTimeout(a,d));try{if((0,i.rmSync)(a,{recursive:!0,force:!0}),!(0,i.existsSync)(a))return}catch(a){b=a}}if((0,i.existsSync)(a))throw Error(`Failed to remove "${a}" after ${c.length} attempts (Windows file-handle drain). Last error: ${b instanceof Error?b.message:String(b)}`)}async function aR(a){try{return await aO(a,"remote","get-url","origin"),!0}catch{return!1}}async function aS(a,b){try{return await aO(a,"rev-parse","--verify","--quiet",b),!0}catch{return!1}}async function aT(a,b,c){if(c?.hasOrigin??await aR(a)){if(c?.branch){let b=`origin/${c.branch}`;if(await aS(a,b))return b}let d=`origin/${b}`;if(await aS(a,d))return d}let d=`refs/heads/${b}`;if(await aS(a,d))return d;throw Error(`Unable to resolve base ref for default branch "${b}"`)}async function aU(a,b){try{let c=await aO(a,"worktree","list","--porcelain"),d=aP((0,k.resolve)(b));return c.split("\n").some(a=>a.startsWith("worktree ")&&aP((0,k.resolve)(a.slice(9)))===d)}catch{return!1}}async function aV(a,b){if((0,i.existsSync)(b)){try{await aO(a,"worktree","prune")}catch{}if(await aU(a,b))throw Error(`Worktree path "${b}" already exists and is still registered with git`);(0,i.rmSync)(b,{recursive:!0,force:!0})}}async function aW(a,b){try{await aO(a,"worktree","remove","--force",b)}catch{}if((0,i.existsSync)(b)){if(await aU(a,b))throw Error(`Worktree path "${b}" already exists and is still registered with git`);await aQ(b)}}async function aX(a,b,c){await aW(a,b),await aO(a,"worktree","add",b,c)}async function aY(a,b,c,d,e){await aW(a,b);let f=await aT(a,d,{branch:c,hasOrigin:e});if(!f.startsWith("origin/"))return void await aO(a,"worktree","add","-b",c,b,f);try{await aO(a,"worktree","add","-b",c,b,f)}catch{await aO(a,"worktree","add","-b",c,b,`refs/heads/${d}`)}}let aZ=/^[a-zA-Z0-9_-]+$/;function a$(a,b){if(!aZ.test(a))throw Error(`Invalid ${b} "${a}": must match ${aZ}`)}function a_(a){return a.startsWith("~/")?(0,k.join)((0,j.homedir)(),a.slice(2)):a}let a0={manifest:{name:"worktree",slot:"workspace",description:"Workspace plugin: git worktrees",version:"0.1.0"},create:function(a){let b=a?.worktreeDir?a_(a.worktreeDir):(0,k.join)((0,j.homedir)(),".worktrees");return{name:"worktree",async create(a){a$(a.projectId,"projectId"),a$(a.sessionId,"sessionId");let c=a_(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 aV(c,f);let g=await aR(c);if(g)try{await aO(c,"fetch","origin","--quiet")}catch{}let h=await aT(c,a.project.defaultBranch,{hasOrigin:g});try{await aO(c,"worktree","add","-b",a.branch,f,h)}catch(i){let b=i instanceof Error?i.message:String(i);if(!b.includes("already exists"))throw Error(`Failed to create worktree for branch "${a.branch}": ${b}`,{cause:i});let d=await aO(c,"rev-parse",h),e=`refs/heads/${a.branch}`,g=await aS(c,e)?await aO(c,"rev-parse",e):void 0;try{g===d?await aO(c,"worktree","add",f,a.branch):await aO(c,"worktree","add","-B",a.branch,f,h)}catch(d){try{await aO(c,"worktree","remove","--force",f)}catch{}let b=d instanceof Error?d.message:String(d);throw Error(`Failed to create worktree for branch "${a.branch}": ${b}`,{cause:d})}}return{path:f,branch:a.branch,sessionId:a.sessionId,projectId:a.projectId}},async findManagedWorkspace(a){a$(a.projectId,"projectId"),a$(a.sessionId,"sessionId");let c=a_(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 aO(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 aO(a,"rev-parse","--path-format=absolute","--git-common-dir"),c=(0,k.resolve)(b,"..");await aO(c,"worktree","remove","--force",a)}catch{(0,i.existsSync)(a)&&await aQ(a)}},async list(a){a$(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 aO(a,"worktree","list","--porcelain");break}catch{continue}if(!e)return[];let f=[],g=e.split("\n\n"),h=aP(c);for(let b of g){let c=b.trim().split("\n"),d="",e="";for(let a of c)a.startsWith("worktree ")?d=a.slice(9):a.startsWith("branch ")&&(e=a.slice(7).replace("refs/heads/",""));let g=d?aP(d):"";if(d&&(g===h||g.startsWith(h+"/"))){let b=(0,k.basename)(d);f.push({path:d,branch:e||"detached",sessionId:b,projectId:a})}}return f},async exists(a){if(!(0,i.existsSync)(a))return!1;try{return await aN("git",["rev-parse","--is-inside-work-tree"],{cwd:a,timeout:3e4,windowsHide:!0}),!0}catch{return!1}},async restore(a,b){let c=a_(a.project.path);try{await aO(c,"worktree","prune")}catch{}let d=await aR(c);if(d)try{await aO(c,"fetch","origin","--quiet")}catch{}try{await aO(c,"worktree","add",b,a.branch)}catch{await aS(c,`refs/heads/${a.branch}`)?await aX(c,b,a.branch):await aY(c,b,a.branch,a.project.defaultBranch,d)}return{path:b,branch:a.branch,sessionId:a.sessionId,projectId:a.projectId}},async postCreate(a,b){let c=a_(b.path);if(b.symlinks)for(let e of b.symlinks){if(e.startsWith("/")||e.includes("..")||/^[a-zA-Z]:[\\/]/.test(e)||e.startsWith("\\\\"))throw Error(`Invalid symlink path "${e}": must be a relative path without ".." segments`);let b=(0,k.join)(c,e),f=(0,k.resolve)(a.path,e),g=(0,k.resolve)(a.path);if(!f.startsWith(g+k.sep)&&f!==g)throw Error(`Symlink target "${e}" resolves outside workspace: ${f}`);if((0,i.existsSync)(b)){try{let a=(0,i.lstatSync)(f);(a.isSymbolicLink()||a.isFile()||a.isDirectory())&&(0,i.rmSync)(f,{recursive:!0,force:!0})}catch{}(0,i.mkdirSync)((0,k.dirname)(f),{recursive:!0});try{(0,i.symlinkSync)(b,f)}catch(a){if((0,d.uFH)()){let a=(()=>{try{return(0,i.statSync)(b).isDirectory()}catch{return!1}})();try{a?(0,i.symlinkSync)(b,f,"junction"):(0,i.linkSync)(b,f)}catch{i.cpSync(b,f,{recursive:!0})}}else throw a}}}if(b.postCreate){let c=(0,d.ry1)();for(let d of b.postCreate)await aN(c.cmd,c.args(d),{cwd:a.path,windowsHide:!0})}}}}};class a1{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 a2=(0,f.promisify)(e.execFile),a3=async(a,b,c)=>(0,d.vQK)(a,{component:"scm-github-batch",operation:c},b),a4={prList:new a1(100),commitStatus:new a1(500),reviewComments:new a1(500)};function a5(a,b,c){a4.prList.set(`${a}/${b}`,c)}function a6(a,b,c,d){a4.commitStatus.set(`${a}/${b}#${c}`,d)}let a7=new a1(200),a8=new a1(200);async function a9(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 be(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=a7.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 bf(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 ba(){try{await a2("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 bb(a){return/HTTP\/[\d.]+ 304/i.test(a)}function bc(a){let b=("string"==typeof a.stdout?a.stdout:"")+("string"==typeof a.stderr?a.stderr:"");return b.length>0?b:null}function bd(a){let b=a.match(/etag:\s*(.+)/i);return b?b[1].trim():void 0}async function be(a,b,c){let d=`${a}/${b}`,e=a4.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 a3(f,1e4,"gh.api.guard-pr-list");if(bb(c)){let d=bd(c);return d&&a5(a,b,d),!1}let d=bd(c);return d&&a5(a,b,d),!0}catch(g){let e=bc(g);if(e&&bb(e)){let c=bd(e);return c&&a5(a,b,c),!1}let f=g instanceof Error?g.message:String(g);if(bb(f))return!1;return c?.log("warn",`[ETag Guard 1] PR list check failed for ${d}: ${f}`),!0}}async function bf(a,b,c,d){let e=`${a}/${b}#${c}`,f=a4.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 a3(g,1e4,"gh.api.guard-commit-status");if(bb(d)){let e=bd(d);return e&&a6(a,b,c,e),!1}let e=bd(d);return e&&a6(a,b,c,e),!0}catch(h){let f=bc(h);if(f&&bb(f)){let d=bd(f);return d&&a6(a,b,c,d),!1}let g=h instanceof Error?h.message:String(h);if(bb(g))return!1;return d?.log("warn",`[ETag Guard 2] Commit status check failed for ${e}: ${g}`),!0}}async function bg(a,b,c,d){let e=`${a}/${b}#${c}`,f=a4.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 a3(g,1e4,"gh.api.guard-review-comments");if(bb(a)){let b=bd(a);return b&&a4.reviewComments.set(e,b),!1}let b=bd(a);return b&&a4.reviewComments.set(e,b),!0}catch(c){let a=bc(c);if(a&&bb(a)){let b=bd(a);return b&&a4.reviewComments.set(e,b),!1}let b=c instanceof Error?c.message:String(c);if(bb(b))return!1;return d?.log("warn",`[ETag Guard 3] Review comments check failed for ${e}: ${b}`),!0}}let bh=`
410
410
  title
411
411
  state
412
412
  additions
@@ -0,0 +1,3 @@
1
+ exports.id=9291,exports.ids=[9291],exports.modules={2191:(a,b,c)=>{"use strict";c.r(b),c.d(b,{default:()=>f}),c(81249),c(13081);var d=c(6181);let e={size:{width:32,height:32},contentType:"image/png"};async function f(a){let{__metadata_id__:b,...c}=await a.params,f=(0,d.fillMetadataSegment)(".",c,"icon"),{generateImageMetadata:g}=e;function h(a,b){let c={alt:a.alt,type:a.contentType||"image/png",url:f+(b?"/"+b:"")+"?fde4afff4688df3a"},{size:d}=a;return d&&(c.sizes=d.width+"x"+d.height),c}return g?(await g({params:c})).map((a,b)=>{let c=(a.id||b)+"";return h(a,c)}):[h(e,"")]}},8556:(a,b,c)=>{"use strict";c.r(b),c.d(b,{default:()=>e});var d=c(68844);function e(){return(0,d.jsx)("div",{className:"flex min-h-screen items-center justify-center bg-[var(--color-bg-base)]",children:(0,d.jsxs)("div",{className:"flex flex-col items-center gap-3",children:[(0,d.jsx)("svg",{className:"h-5 w-5 animate-spin text-[var(--color-text-tertiary)]",fill:"none",stroke:"currentColor",strokeWidth:"2",viewBox:"0 0 24 24",children:(0,d.jsx)("path",{d:"M12 3a9 9 0 1 0 9 9"})}),(0,d.jsx)("p",{className:"text-[13px] text-[var(--color-text-tertiary)]",children:"Loading…"})]})})}},13081:(a,b,c)=>{"use strict";c.d(b,{Kk:()=>f,uy:()=>e});var d=c(68844);function e(a){return a.replace(/[^\w\s-]/g,"").slice(0,50)||"AO"}function f(a,b){let c=(b.charAt(0)||"A").toUpperCase(),e=function(a){let b=0;for(let c=0;c<a.length;c++)b=a.charCodeAt(c)+((b<<5)-b);return(b%360+360)%360}(b),f=Math.round(.19*a),g=Math.round(.625*a);return(0,d.jsx)("div",{style:{width:`${a}px`,height:`${a}px`,borderRadius:`${f}px`,background:`hsl(${e}, 60%, 45%)`,display:"flex",alignItems:"center",justifyContent:"center",color:"white",fontSize:`${g}px`,fontWeight:700,fontFamily:"sans-serif"},children:c})}},16819:(a,b,c)=>{"use strict";c.d(b,{ErrorDisplay:()=>d});let d=(0,c(10864).registerClientReference)(function(){throw Error("Attempted to call ErrorDisplay() from the server but ErrorDisplay is on the client. It's not possible to invoke a client function from the server, it can only be rendered as a Component or passed to props of a Client Component.")},"/tmp/ao-publish-work/packages/web/src/components/ErrorDisplay.tsx","ErrorDisplay")},17388:(a,b,c)=>{Promise.resolve().then(c.t.bind(c,8125,23)),Promise.resolve().then(c.t.bind(c,6125,23)),Promise.resolve().then(c.t.bind(c,74148,23)),Promise.resolve().then(c.t.bind(c,10236,23)),Promise.resolve().then(c.t.bind(c,97760,23)),Promise.resolve().then(c.t.bind(c,9528,23)),Promise.resolve().then(c.t.bind(c,20225,23)),Promise.resolve().then(c.bind(c,23240))},23041:(a,b,c)=>{"use strict";c.d(b,{ErrorDisplay:()=>j});var d=c(33666),e=c(47489),f=c.n(e);let g={error:{accent:"var(--color-status-error)",bg:"var(--color-tint-red)",border:"color-mix(in srgb, var(--color-status-error) 24%, transparent)",label:"error"},warning:{accent:"var(--color-status-attention)",bg:"var(--color-tint-yellow)",border:"color-mix(in srgb, var(--color-status-attention) 24%, transparent)",label:"warning"},"not-found":{accent:"var(--color-accent)",bg:"var(--color-tint-blue)",border:"color-mix(in srgb, var(--color-accent) 24%, transparent)",label:"missing"}};function h({accent:a}){return(0,d.jsx)("div",{className:"flex h-14 w-14 items-center justify-center rounded-2xl border",style:{background:`linear-gradient(180deg, color-mix(in srgb, ${a} 16%, var(--color-bg-elevated)) 0%, var(--color-bg-surface) 100%)`,borderColor:`color-mix(in srgb, ${a} 18%, var(--color-border-default))`,boxShadow:"var(--detail-card-shadow)"},children:(0,d.jsxs)("svg",{className:"h-7 w-7",fill:"none",stroke:"currentColor",strokeWidth:"1.6",style:{color:a},viewBox:"0 0 24 24",children:[(0,d.jsx)("rect",{x:"2.5",y:"4.5",width:"19",height:"15",rx:"3"}),(0,d.jsx)("path",{d:"M6.5 9.5l3.25 2.5-3.25 2.5M12.75 15h4.75"})]})})}function i({action:a,primary:b=!1}){let c=b?"inline-flex items-center justify-center rounded-full border px-4 py-2 text-[12px] font-semibold transition-colors hover:no-underline":"inline-flex items-center justify-center rounded-full border px-4 py-2 text-[12px] font-medium transition-colors hover:no-underline",e=b?{background:"var(--color-accent)",color:"var(--color-text-inverse)",borderColor:"color-mix(in srgb, var(--color-accent) 72%, transparent)"}:{background:"var(--color-bg-surface)",color:"var(--color-text-secondary)",borderColor:"var(--color-border-default)"};return a.href?(0,d.jsx)(f(),{href:a.href,className:c,style:e,children:a.label}):(0,d.jsx)("button",{type:"button",onClick:a.onClick,className:c,style:e,children:a.label})}function j({title:a,message:b,tone:c="error",detailsTitle:e="Technical details",error:f,primaryAction:j,secondaryAction:k,compact:l=!1,chrome:m="page",children:n}){let o=g[c],p=!!(f?.digest||f?.message||f?.stack);return(0,d.jsx)("div",{className:`flex w-full items-center justify-center px-6 py-10 ${l?"min-h-[calc(100vh-4rem)]":"min-h-screen"}`,style:{background:"page"===m?"radial-gradient(circle at top, var(--color-body-gradient-blue), transparent 35%), var(--color-bg-base)":"transparent"},children:(0,d.jsx)("div",{className:"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%)",borderColor:"var(--color-border-default)",boxShadow:"var(--detail-card-shadow)"},children:(0,d.jsxs)("div",{className:"flex flex-col gap-6",children:[(0,d.jsxs)("div",{className:"flex flex-col gap-4 sm:flex-row sm:items-start",children:[(0,d.jsx)(h,{accent:o.accent}),(0,d.jsxs)("div",{className:"min-w-0 flex-1",children:[(0,d.jsx)("div",{className:"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:o.accent,background:o.bg,borderColor:o.border},children:o.label}),(0,d.jsx)("h1",{className:"text-[24px] font-semibold tracking-[-0.04em] text-[var(--color-text-primary)]",children:a}),(0,d.jsx)("p",{className:"mt-2 max-w-[34rem] text-[14px] leading-6 text-[var(--color-text-secondary)]",children:b})]})]}),(j||k)&&(0,d.jsxs)("div",{className:"flex flex-wrap gap-3",children:[j?(0,d.jsx)(i,{action:j,primary:!0}):null,k?(0,d.jsx)(i,{action:k}):null]}),n,p?(0,d.jsxs)("details",{className:"rounded-2xl border",style:{background:"color-mix(in srgb, var(--color-bg-elevated) 84%, transparent)",borderColor:"var(--color-border-subtle)"},children:[(0,d.jsx)("summary",{className:"cursor-pointer list-none px-4 py-3 text-[12px] font-medium text-[var(--color-text-secondary)]",children:e}),(0,d.jsxs)("div",{className:"border-t px-4 py-4",style:{borderColor:"var(--color-border-subtle)"},children:[f?.digest?(0,d.jsxs)("p",{className:"mb-3 font-[var(--font-mono)] text-[11px] text-[var(--color-text-tertiary)]",children:["digest: ",f.digest]}):null,f?.message?(0,d.jsx)("p",{className:"mb-3 text-[12px] leading-5 text-[var(--color-text-secondary)]",children:f.message}):null,f?.stack?(0,d.jsx)("pre",{className:"overflow-x-auto whitespace-pre-wrap font-[var(--font-mono)] text-[11px] leading-5 text-[var(--color-text-tertiary)]",children:f.stack}):null]})]}):null]})})})}},24553:()=>{},26400:(a,b,c)=>{"use strict";c.r(b),c.d(b,{default:()=>f});var d=c(33666);c(81115);var e=c(23041);function f({error:a,reset:b}){return(0,d.jsx)("html",{lang:"en",className:"dark",children:(0,d.jsx)("body",{className:"bg-[var(--color-bg-base)] text-[var(--color-text-primary)] antialiased",children:(0,d.jsx)(e.ErrorDisplay,{title:"Something broke at the app shell",message:"The dashboard could not recover from this error at the layout level. Try again first, then reload the page if it still fails.",tone:"error",primaryAction:{label:"Try again",onClick:b},secondaryAction:{label:"Reload page",onClick:()=>window.location.reload()},error:a})})})}},26409:(a,b,c)=>{Promise.resolve().then(c.bind(c,26400))},27926:(a,b,c)=>{"use strict";c.r(b),c.d(b,{default:()=>d});let d=(0,c(10864).registerClientReference)(function(){throw Error("Attempted to call the default export of \"/tmp/ao-publish-work/packages/web/src/app/global-error.tsx\" from the server, but it's on the client. It's not possible to invoke a client function from the server, it can only be rendered as a Component or passed to props of a Client Component.")},"/tmp/ao-publish-work/packages/web/src/app/global-error.tsx","default")},30540:(a,b,c)=>{Promise.resolve().then(c.t.bind(c,57035,23)),Promise.resolve().then(c.t.bind(c,57543,23)),Promise.resolve().then(c.t.bind(c,970,23)),Promise.resolve().then(c.t.bind(c,84702,23)),Promise.resolve().then(c.t.bind(c,18706,23)),Promise.resolve().then(c.t.bind(c,11194,23)),Promise.resolve().then(c.t.bind(c,33151,23)),Promise.resolve().then(c.t.bind(c,75210,23))},32949:(a,b,c)=>{Promise.resolve().then(c.bind(c,89252))},37728:(a,b,c)=>{"use strict";c.r(b),c.d(b,{default:()=>f}),c(81249),c(13081);var d=c(6181);let e={size:{width:180,height:180},contentType:"image/png"};async function f(a){let{__metadata_id__:b,...c}=await a.params,f=(0,d.fillMetadataSegment)(".",c,"apple-icon"),{generateImageMetadata:g}=e;function h(a,b){let c={alt:a.alt,type:a.contentType||"image/png",url:f+(b?"/"+b:"")+"?95aeb60ec7acf330"},{size:d}=a;return d&&(c.sizes=d.width+"x"+d.height),c}return g?(await g({params:c})).map((a,b)=>{let c=(a.id||b)+"";return h(a,c)}):[h(e,"")]}},41598:(a,b,c)=>{Promise.resolve().then(c.bind(c,88496)),Promise.resolve().then(c.bind(c,49905))},42677:(a,b,c)=>{Promise.resolve().then(c.bind(c,82834))},46326:(a,b,c)=>{Promise.resolve().then(c.bind(c,94666)),Promise.resolve().then(c.bind(c,81871))},49905:(a,b,c)=>{"use strict";function d(){return null}c.d(b,{ServiceWorkerRegistrar:()=>d}),c(81115)},58976:(a,b,c)=>{"use strict";c.d(b,{eT:()=>h,i2:()=>j});var d=c(33666),e=c(81115),f=c.n(e);let g=f().createContext(void 0);function h(){return f().useContext(g)}function i(a,b){return b?`${b}:${a}`:a}function j({children:a}){let b=(0,e.useRef)(null),c=(0,e.useRef)(new Map),f=(0,e.useRef)(new Map),[h,j]=(0,e.useState)("connecting"),[k,l]=(0,e.useState)([]),[m,n]=(0,e.useState)(null),o=(0,e.useRef)(0),p=(0,e.useRef)(null),q=(0,e.useRef)({}),r=(0,e.useRef)(!1),s=(0,e.useCallback)(()=>{if(!b.current){j("connecting");try{let a=function(a){let b=window.location,c="https:"===b.protocol?"wss:":"ws:",d=a.proxyWsPath??process.env.NEXT_PUBLIC_TERMINAL_WS_PATH;if(d){let a=d.replace(/\/ws\/?$/,"");return`${c}//${b.host}${a}/mux`}if(""===b.port||"443"===b.port||"80"===b.port)return`${c}//${b.hostname}/ao-terminal-mux`;let e=a.directTerminalPort??process.env.NEXT_PUBLIC_DIRECT_TERMINAL_PORT??"14801";return`${c}//${b.hostname}:${e}/mux`}(q.current);console.log("[MuxProvider] Connecting to",a);let d=new WebSocket(a);b.current=d,d.addEventListener("open",()=>{if(r.current)return void d.close();for(let a of(console.log("[MuxProvider] Connected"),j("connected"),o.current=0,f.current.values())){let b={ch:"terminal",id:a.id,type:"open",...a.projectId&&{projectId:a.projectId},...a.tmuxName&&{tmuxName:a.tmuxName}};d.send(JSON.stringify(b))}d.send(JSON.stringify({ch:"subscribe",topics:["sessions"]}))}),d.addEventListener("message",a=>{try{let b=JSON.parse(a.data);if("terminal"===b.ch){let a=i(b.id,"projectId"in b?b.projectId:void 0);if("data"===b.type){let d=c.current.get(a);if(d)for(let a of d)a(b.data)}else if("opened"===b.type)f.current.has(a)||f.current.set(a,{id:b.id,..."projectId"in b&&b.projectId?{projectId:b.projectId}:{}});else if("exited"===b.type){f.current.delete(a);let d=c.current.get(a);if(d){let a=`\r
2
+ \x1b[31m[Terminal exited with code ${b.code}]\x1b[0m\r
3
+ `;for(let b of d)b(a)}}else"error"===b.type&&console.error(`[MuxProvider] Terminal error for ${b.id}:`,b.message)}else"sessions"===b.ch&&("snapshot"===b.type?(l(b.sessions),n(null)):"error"===b.type&&n(b.error))}catch(a){console.error("[MuxProvider] Error processing message:",a)}}),d.addEventListener("error",a=>{console.error("[MuxProvider] WebSocket error:",a)}),d.addEventListener("close",()=>{if(console.log("[MuxProvider] Disconnected"),b.current===d&&(b.current=null),r.current)return;let a=Math.min(1e3*Math.pow(2,o.current),3e4);o.current+=1,j("reconnecting"),p.current=setTimeout(()=>{console.log(`[MuxProvider] Reconnecting (attempt ${o.current})...`),s()},a)})}catch(a){console.error("[MuxProvider] Failed to create WebSocket:",a),j("disconnected")}}},[]),t=(0,e.useCallback)((a,d,e)=>{let g=i(a,e),h=c.current.get(g);if(h||(h=new Set,c.current.set(g,h)),h.add(d),!f.current.has(g)&&b.current?.readyState===WebSocket.OPEN){let c={ch:"terminal",id:a,type:"open",...e&&{projectId:e}};b.current.send(JSON.stringify(c))}return()=>{let a=c.current.get(g);a&&(a.delete(d),0===a.size&&c.current.delete(g))}},[]),u=(0,e.useCallback)((a,c,d)=>{if(b.current?.readyState===WebSocket.OPEN){let e={ch:"terminal",id:a,type:"data",data:c,...d&&{projectId:d}};b.current.send(JSON.stringify(e))}},[]),v=(0,e.useCallback)((a,c,d)=>{if(f.current.set(i(a,c),{id:a,projectId:c,tmuxName:d}),b.current?.readyState===WebSocket.OPEN){let e={ch:"terminal",id:a,type:"open",...c&&{projectId:c},...d&&{tmuxName:d}};b.current.send(JSON.stringify(e))}},[]),w=(0,e.useCallback)((a,c)=>{if(f.current.delete(i(a,c)),b.current?.readyState===WebSocket.OPEN){let d={ch:"terminal",id:a,type:"close",...c&&{projectId:c}};b.current.send(JSON.stringify(d))}},[]),x=(0,e.useCallback)((a,c,d,e)=>{if(b.current?.readyState===WebSocket.OPEN){let f={ch:"terminal",id:a,type:"resize",cols:c,rows:d,...e&&{projectId:e}};b.current.send(JSON.stringify(f))}},[]),y=(0,e.useMemo)(()=>({subscribeTerminal:t,writeTerminal:u,openTerminal:v,closeTerminal:w,resizeTerminal:x,status:h,sessions:k,lastError:m}),[t,u,v,w,x,h,k,m]);return(0,d.jsx)(g.Provider,{value:y,children:a})}},61257:(a,b,c)=>{Promise.resolve().then(c.bind(c,27926))},61778:(a,b,c)=>{Promise.resolve().then(c.bind(c,23041))},63028:(a,b,c)=>{"use strict";c.r(b),c.d(b,{default:()=>f});var d=c(68844),e=c(16819);function f(){return(0,d.jsx)(e.ErrorDisplay,{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:"/"}})}},69648:(a,b,c)=>{"use strict";c.r(b),c.d(b,{default:()=>j,generateMetadata:()=>i,viewport:()=>h});var d=c(68844),e=c(81249),f=c(81871),g=c(94666);c(24553);let h={width:"device-width",initialScale:1,viewportFit:"cover",themeColor:[{media:"(prefers-color-scheme: light)",color:"#f5f3f0"},{media:"(prefers-color-scheme: dark)",color:"#121110"}]};async function i(){let a=(0,e.P_)();return{title:{template:`%s | ${a}`,default:`ao | ${a}`},description:"Dashboard for managing parallel AI coding agents",appleWebApp:{capable:!0,statusBarStyle:"black-translucent",title:`ao | ${a}`}}}function j({children:a}){return(0,d.jsx)("html",{lang:"en",className:"dark",suppressHydrationWarning:!0,children:(0,d.jsxs)("body",{className:"h-screen overflow-hidden bg-[var(--color-bg-base)] text-[var(--color-text-primary)] antialiased",children:[(0,d.jsx)(g.Providers,{children:a}),(0,d.jsx)(f.ServiceWorkerRegistrar,{})]})})}},81249:(a,b,c)=>{"use strict";c.d(b,{Bq:()=>m,P_:()=>l,cf:()=>n});var d=c(29685),e=c(73024),f=c(76760),g=c(32285);function h(){let a=(0,g.NoB)();try{return(0,g.Z9L)(a)}catch(a){if(a instanceof g.kw3||a instanceof Error&&"code"in a&&"ENOENT"===a.code)return(0,g.Z9L)();throw a}}function i(a){try{return(0,e.realpathSync)(a)}catch{return(0,f.resolve)(a)}}function j(a,b){let c=i(a);for(let[a,d]of Object.entries(b.projects))if("string"==typeof d.path&&i(d.path)===c)return a}function k(a=h()){try{let b=function(a){try{let b=function(a){let b=(0,f.resolve)(a);for(;;){for(let a of["agent-orchestrator.yaml","agent-orchestrator.yml"]){let c=(0,f.resolve)(b,a);if((0,e.existsSync)(c))return c}let a=(0,f.dirname)(b);if(a===b)return;b=a}}(process.cwd());if(!b)return;let c=(0,g.Z9L)(b),d=i((0,g.NoB)());if(i(c.configPath)!==d){for(let b of Object.values(c.projects)){if("string"!=typeof b.path)continue;let c=j(b.path,a);if(c)return c}return j((0,f.dirname)(c.configPath),a)}}catch{}}(a);if(b)return b;let c=i(process.cwd());return j(c,a)}catch{return}}let l=(0,d.cache)(()=>{try{let a=h(),b=k(a);if(b){let c=a.projects[b];return c?.name??b}let c=Object.keys(a.projects)[0];if(c)return(a.projects[c].name??c)||c||"ao"}catch{}return"ao"}),m=(0,d.cache)(()=>{try{let a=h(),b=k(a);if(b)return b;let c=Object.keys(a.projects)[0];if(c)return c}catch{}return"ao"}),n=(0,d.cache)(()=>{try{let a=h();return[...Object.entries(a.projects).map(([a,b])=>({id:a,name:b.name??a,sessionPrefix:b.sessionPrefix??a})),...Object.entries(a.degradedProjects).map(([a,b])=>({id:a,name:a,sessionPrefix:a,resolveError:b.resolveError}))]}catch{return[]}})},81871:(a,b,c)=>{"use strict";c.d(b,{ServiceWorkerRegistrar:()=>d});let d=(0,c(10864).registerClientReference)(function(){throw Error("Attempted to call ServiceWorkerRegistrar() from the server but ServiceWorkerRegistrar is on the client. It's not possible to invoke a client function from the server, it can only be rendered as a Component or passed to props of a Client Component.")},"/tmp/ao-publish-work/packages/web/src/components/ServiceWorkerRegistrar.tsx","ServiceWorkerRegistrar")},82834:(a,b,c)=>{"use strict";c.r(b),c.d(b,{default:()=>d});let d=(0,c(10864).registerClientReference)(function(){throw Error("Attempted to call the default export of \"/tmp/ao-publish-work/packages/web/src/app/error.tsx\" from the server, but it's on the client. It's not possible to invoke a client function from the server, it can only be rendered as a Component or passed to props of a Client Component.")},"/tmp/ao-publish-work/packages/web/src/app/error.tsx","default")},88496:(a,b,c)=>{"use strict";c.d(b,{Providers:()=>g});var d=c(33666),e=c(93463),f=c(58976);function g({children:a}){return(0,d.jsx)(e.N,{attribute:"class",defaultTheme:"dark",enableSystem:!1,children:(0,d.jsx)(f.i2,{children:a})})}},89252:(a,b,c)=>{"use strict";c.r(b),c.d(b,{default:()=>g});var d=c(33666),e=c(50436);c(81115);var f=c(23041);function g({error:a,reset:b}){let c=(0,e.useRouter)();return(0,d.jsx)(f.ErrorDisplay,{title:"Something went wrong",message:"The dashboard hit an unexpected error. Try reloading the route data or head back to the main dashboard.",tone:"warning",primaryAction:{label:"Try again",onClick:()=>{b(),c.refresh()}},secondaryAction:{label:"Back to dashboard",href:"/"},error:a,compact:!0,chrome:"card"})}},94666:(a,b,c)=>{"use strict";c.d(b,{Providers:()=>d});let d=(0,c(10864).registerClientReference)(function(){throw Error("Attempted to call Providers() from the server but Providers is on the client. It's not possible to invoke a client function from the server, it can only be rendered as a Component or passed to props of a Client Component.")},"/tmp/ao-publish-work/packages/web/src/app/providers.tsx","Providers")},98730:(a,b,c)=>{Promise.resolve().then(c.bind(c,16819))}};
@@ -1 +1 @@
1
- globalThis.__BUILD_MANIFEST={polyfillFiles:["static/chunks/polyfills-42372ed130431b0a.js"],devFiles:[],ampDevFiles:[],lowPriorityFiles:[],rootMainFiles:["static/chunks/webpack-ecf0988dbb79e19b.js","static/chunks/88a6fc35-f836b4b72df5eafa.js","static/chunks/1461-af7c54935f21d56d.js","static/chunks/main-app-decbc53736801215.js"],rootMainFilesTree:{},pages:{"/_app":["static/chunks/webpack-ecf0988dbb79e19b.js","static/chunks/framework-7060e2ac4971c604.js","static/chunks/main-ed1610689fbd6f0d.js","static/chunks/pages/_app-f4baf4dbe88f6f54.js"],"/_error":["static/chunks/webpack-ecf0988dbb79e19b.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
+ globalThis.__BUILD_MANIFEST={polyfillFiles:["static/chunks/polyfills-42372ed130431b0a.js"],devFiles:[],ampDevFiles:[],lowPriorityFiles:[],rootMainFiles:["static/chunks/webpack-ecf0988dbb79e19b.js","static/chunks/88a6fc35-f836b4b72df5eafa.js","static/chunks/1461-af7c54935f21d56d.js","static/chunks/main-app-113c48dd1c080c52.js"],rootMainFilesTree:{},pages:{"/_app":["static/chunks/webpack-ecf0988dbb79e19b.js","static/chunks/framework-7060e2ac4971c604.js","static/chunks/main-ed1610689fbd6f0d.js","static/chunks/pages/_app-f4baf4dbe88f6f54.js"],"/_error":["static/chunks/webpack-ecf0988dbb79e19b.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
- <!DOCTYPE html><!--9nr0fNWbZcuWTqhM2HhrH--><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/b93232cd4a58743d.css" data-precedence="next"/><link rel="preload" as="script" fetchPriority="low" href="/_next/static/chunks/webpack-ecf0988dbb79e19b.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-decbc53736801215.js" async=""></script><script src="/_next/static/chunks/app/layout-36ab0168ddb22083.js" async=""></script><script src="/_next/static/chunks/8713-d3d663f55dc00e48.js" async=""></script><script src="/_next/static/chunks/app/error-65c526052680c0dc.js" async=""></script><script src="/_next/static/chunks/app/not-found-a693bed1f9e1893f.js" async=""></script><script src="/_next/static/chunks/app/global-error-63dcb797b2c3ee60.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 | agent-orchestrator</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 | agent-orchestrator"/><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-ecf0988dbb79e19b.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-36ab0168ddb22083.js\"],\"Providers\"]\n3:I[1992,[],\"\"]\n4:I[3464,[\"8713\",\"static/chunks/8713-d3d663f55dc00e48.js\",\"8039\",\"static/chunks/app/error-65c526052680c0dc.js\"],\"default\"]\n5:I[7678,[],\"\"]\n6:I[9789,[\"8713\",\"static/chunks/8713-d3d663f55dc00e48.js\",\"4345\",\"static/chunks/app/not-found-a693bed1f9e1893f.js\"],\"ErrorDisplay\"]\n7:I[7285,[\"7177\",\"static/chunks/app/layout-36ab0168ddb22083.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-63dcb797b2c3ee60.js\"],\"default\"]\n:HL[\"/_next/static/css/b93232cd4a58743d.css\",\"style\"]\n"])</script><script>self.__next_f.push([1,"0:{\"P\":null,\"b\":\"9nr0fNWbZcuWTqhM2HhrH\",\"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/b93232cd4a58743d.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 | agent-orchestrator\"}],[\"$\",\"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 | agent-orchestrator\"}],[\"$\",\"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><!--9ARsRA8WlFgsAl_7NPrHh--><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/b93232cd4a58743d.css" data-precedence="next"/><link rel="preload" as="script" fetchPriority="low" href="/_next/static/chunks/webpack-ecf0988dbb79e19b.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-113c48dd1c080c52.js" async=""></script><script src="/_next/static/chunks/app/layout-e4c02836878bea2d.js" async=""></script><script src="/_next/static/chunks/8713-d3d663f55dc00e48.js" async=""></script><script src="/_next/static/chunks/app/error-d4f7c3a8dd722e8f.js" async=""></script><script src="/_next/static/chunks/app/not-found-982c28ba7f6492be.js" async=""></script><script src="/_next/static/chunks/app/global-error-cb3a4148c223622a.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 | agent-orchestrator</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 | agent-orchestrator"/><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-ecf0988dbb79e19b.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-e4c02836878bea2d.js\"],\"Providers\"]\n3:I[1992,[],\"\"]\n4:I[3464,[\"8713\",\"static/chunks/8713-d3d663f55dc00e48.js\",\"8039\",\"static/chunks/app/error-d4f7c3a8dd722e8f.js\"],\"default\"]\n5:I[7678,[],\"\"]\n6:I[9789,[\"8713\",\"static/chunks/8713-d3d663f55dc00e48.js\",\"4345\",\"static/chunks/app/not-found-982c28ba7f6492be.js\"],\"ErrorDisplay\"]\n7:I[7285,[\"7177\",\"static/chunks/app/layout-e4c02836878bea2d.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-cb3a4148c223622a.js\"],\"default\"]\n:HL[\"/_next/static/css/b93232cd4a58743d.css\",\"style\"]\n"])</script><script>self.__next_f.push([1,"0:{\"P\":null,\"b\":\"9ARsRA8WlFgsAl-7NPrHh\",\"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/b93232cd4a58743d.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 | agent-orchestrator\"}],[\"$\",\"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 | agent-orchestrator\"}],[\"$\",\"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 +1 @@
1
- <!DOCTYPE html><html><head><meta charSet="utf-8" data-next-head=""/><meta name="viewport" content="width=device-width" data-next-head=""/><title data-next-head="">500: Internal Server Error</title><noscript data-n-css=""></noscript><script defer="" noModule="" src="/_next/static/chunks/polyfills-42372ed130431b0a.js"></script><script src="/_next/static/chunks/webpack-ecf0988dbb79e19b.js" defer=""></script><script src="/_next/static/chunks/framework-7060e2ac4971c604.js" defer=""></script><script src="/_next/static/chunks/main-ed1610689fbd6f0d.js" defer=""></script><script src="/_next/static/chunks/pages/_app-f4baf4dbe88f6f54.js" defer=""></script><script src="/_next/static/chunks/pages/_error-a7f6723f42093f29.js" defer=""></script><script src="/_next/static/9nr0fNWbZcuWTqhM2HhrH/_buildManifest.js" defer=""></script><script src="/_next/static/9nr0fNWbZcuWTqhM2HhrH/_ssgManifest.js" defer=""></script></head><body><div id="__next"><div style="font-family:system-ui,&quot;Segoe UI&quot;,Roboto,Helvetica,Arial,sans-serif,&quot;Apple Color Emoji&quot;,&quot;Segoe UI Emoji&quot;;height:100vh;text-align:center;display:flex;flex-direction:column;align-items:center;justify-content:center"><div style="line-height:48px"><style>body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}</style><h1 class="next-error-h1" style="display:inline-block;margin:0 20px 0 0;padding-right:23px;font-size:24px;font-weight:500;vertical-align:top">500</h1><div style="display:inline-block"><h2 style="font-size:14px;font-weight:400;line-height:28px">Internal Server Error<!-- -->.</h2></div></div></div></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{"statusCode":500}},"page":"/_error","query":{},"buildId":"9nr0fNWbZcuWTqhM2HhrH","nextExport":true,"isFallback":false,"gip":true,"scriptLoader":[]}</script></body></html>
1
+ <!DOCTYPE html><html><head><meta charSet="utf-8" data-next-head=""/><meta name="viewport" content="width=device-width" data-next-head=""/><title data-next-head="">500: Internal Server Error</title><noscript data-n-css=""></noscript><script defer="" noModule="" src="/_next/static/chunks/polyfills-42372ed130431b0a.js"></script><script src="/_next/static/chunks/webpack-ecf0988dbb79e19b.js" defer=""></script><script src="/_next/static/chunks/framework-7060e2ac4971c604.js" defer=""></script><script src="/_next/static/chunks/main-ed1610689fbd6f0d.js" defer=""></script><script src="/_next/static/chunks/pages/_app-f4baf4dbe88f6f54.js" defer=""></script><script src="/_next/static/chunks/pages/_error-a7f6723f42093f29.js" defer=""></script><script src="/_next/static/9ARsRA8WlFgsAl-7NPrHh/_buildManifest.js" defer=""></script><script src="/_next/static/9ARsRA8WlFgsAl-7NPrHh/_ssgManifest.js" defer=""></script></head><body><div id="__next"><div style="font-family:system-ui,&quot;Segoe UI&quot;,Roboto,Helvetica,Arial,sans-serif,&quot;Apple Color Emoji&quot;,&quot;Segoe UI Emoji&quot;;height:100vh;text-align:center;display:flex;flex-direction:column;align-items:center;justify-content:center"><div style="line-height:48px"><style>body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}</style><h1 class="next-error-h1" style="display:inline-block;margin:0 20px 0 0;padding-right:23px;font-size:24px;font-weight:500;vertical-align:top">500</h1><div style="display:inline-block"><h2 style="font-size:14px;font-weight:400;line-height:28px">Internal Server Error<!-- -->.</h2></div></div></div></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{"statusCode":500}},"page":"/_error","query":{},"buildId":"9ARsRA8WlFgsAl-7NPrHh","nextExport":true,"isFallback":false,"gip":true,"scriptLoader":[]}</script></body></html>
@@ -1 +1 @@
1
- {"node":{},"edge":{},"encryptionKey":"Cih4WuG7uCiRekou1APqv/66ih3slPFRse5YuYJoOIY="}
1
+ {"node":{},"edge":{},"encryptionKey":"Z/WHNhoL9Kdzz+9eA8ZulRPC6Cqp41wn5yn6dYt8Cmw="}
@@ -0,0 +1 @@
1
+ (self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[9170],{1712:(e,r,s)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"default",{enumerable:!0,get:function(){return a}});let t=s(1903)._(s(5864));function a(e,r){var s;let a={};"function"==typeof e&&(a.loader=e);let n={...a,...r};return(0,t.default)({...n,modules:null==(s=n.loadableGenerated)?void 0:s.modules})}("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),e.exports=r.default)},4255:(e,r,s)=>{"use strict";s.r(r),s.d(r,{default:()=>x,dynamic:()=>c});var t=s(3817),a=s(9891),n=s(7594),l=s(6749);let i=(0,a.default)(()=>Promise.all([s.e(8944),s.e(3764),s.e(1654)]).then(s.bind(s,3764)).then(e=>({default:e.DirectTerminal})),{loadableGenerated:{webpack:()=>[3764]},ssr:!1}),o=(0,a.default)(()=>s.e(7317).then(s.bind(s,7317)).then(e=>({default:e.Terminal})),{loadableGenerated:{webpack:()=>[7317]},ssr:!1}),c="force-dynamic";function d(){let e=(0,n.useSearchParams)(),[r,s]=(0,l.useState)([]),[a,c]=(0,l.useState)(!0);(0,l.useEffect)(()=>{fetch("/api/sessions?active=true").then(e=>e.json()).then(e=>{e.sessions&&Array.isArray(e.sessions)&&s(e.sessions.map(e=>e.id))}).catch(e=>{console.error("Failed to fetch sessions:",e)})},[]);let d=e.get("session"),x=e.get("old_session"),m=e.get("new_session"),h=r[0]||"ao-orchestrator",p=r[1]||r[0]||"ao-orchestrator",u=x||d||h,b=m||d||p;return(0,t.jsx)("div",{className:"min-h-screen bg-[var(--color-bg-primary)] p-8",children:(0,t.jsxs)("div",{className:"mx-auto max-w-7xl",children:[(0,t.jsxs)("div",{className:"mb-8",children:[(0,t.jsx)("h1",{className:"mb-2 text-3xl font-bold text-[var(--color-text-primary)]",children:"Terminal Implementation Test & Documentation"}),(0,t.jsxs)("p",{className:"text-sm text-[var(--color-text-muted)]",children:["Comparing sessions:",(0,t.jsxs)("span",{className:"ml-2 font-mono text-[var(--color-accent-red)]",children:["OLD: ",u]}),(0,t.jsxs)("span",{className:"ml-2 font-mono text-[var(--color-accent-green)]",children:["NEW: ",b]})]})]}),(0,t.jsxs)("section",{className:"mb-8 rounded-[2px] border border-[var(--color-border-default)] bg-[var(--color-bg-secondary)] p-6",children:[(0,t.jsx)("h2",{className:"mb-4 text-xl font-bold text-[var(--color-text-primary)]",children:"\uD83D\uDC1B The Problem"}),(0,t.jsxs)("div",{className:"space-y-3 text-sm text-[var(--color-text-secondary)]",children:[(0,t.jsxs)("p",{children:[(0,t.jsx)("strong",{className:"text-[var(--color-text-primary)]",children:"Issue:"})," Browser clipboard (Cmd+C/Ctrl+C) only worked when an iTerm2 client was attached to the tmux session."]}),(0,t.jsxs)("p",{children:[(0,t.jsx)("strong",{className:"text-[var(--color-text-primary)]",children:"Impact:"})," Users had to keep iTerm2 tabs open in the background for clipboard to work in the web dashboard."]}),(0,t.jsxs)("p",{children:[(0,t.jsx)("strong",{className:"text-[var(--color-text-primary)]",children:"Investigation time:"})," 12+ hours of debugging across tmux, ttyd, xterm.js, and macOS clipboard systems."]})]})]}),(0,t.jsxs)("section",{className:"mb-8 rounded-[2px] border border-[var(--color-border-default)] bg-[var(--color-bg-secondary)] p-6",children:[(0,t.jsx)("h2",{className:"mb-4 text-xl font-bold text-[var(--color-text-primary)]",children:"\uD83D\uDD0D Root Cause Analysis"}),(0,t.jsxs)("div",{className:"space-y-4 text-sm",children:[(0,t.jsxs)("div",{children:[(0,t.jsx)("h3",{className:"mb-2 font-semibold text-[var(--color-text-primary)]",children:"1. How tmux Clipboard Works (OSC 52)"}),(0,t.jsxs)("ul",{className:"ml-6 list-disc space-y-1 text-[var(--color-text-secondary)]",children:[(0,t.jsx)("li",{children:"tmux uses OSC 52 escape sequences to synchronize clipboard with terminals"}),(0,t.jsxs)("li",{children:["Format:"," ",(0,t.jsx)("code",{className:"rounded-[2px] bg-black px-1 py-0.5",children:"\\x1b]52;c;<base64>\\x07"})]}),(0,t.jsx)("li",{children:"Terminal must support OSC 52 and have proper capabilities declared"})]})]}),(0,t.jsxs)("div",{children:[(0,t.jsx)("h3",{className:"mb-2 font-semibold text-[var(--color-text-primary)]",children:"2. tmux Capability Detection (XDA)"}),(0,t.jsxs)("ul",{className:"ml-6 list-disc space-y-1 text-[var(--color-text-secondary)]",children:[(0,t.jsx)("li",{children:"tmux queries terminal capabilities using Device Attributes (DA/XDA)"}),(0,t.jsxs)("li",{children:["XDA query: ",(0,t.jsx)("code",{className:"rounded-[2px] bg-black px-1 py-0.5",children:"CSI > q"})," ","(also called XTVERSION)"]}),(0,t.jsx)("li",{children:'Terminal responds with identification string containing terminal type (e.g., "XTerm(370)", "iTerm2 ")'}),(0,t.jsx)("li",{children:"Based on response, tmux enables features like TTYC_MS (clipboard support)"})]})]}),(0,t.jsxs)("div",{children:[(0,t.jsx)("h3",{className:"mb-2 font-semibold text-[var(--color-text-primary)]",children:"3. The Missing Piece"}),(0,t.jsxs)("div",{className:"rounded-[2px] border border-[var(--color-accent-red)] bg-[var(--color-bg-tertiary)] p-4",children:[(0,t.jsx)("p",{className:"font-semibold text-[var(--color-accent-red)]",children:"xterm.js does NOT implement XDA (Extended Device Attributes)"}),(0,t.jsxs)("ul",{className:"ml-6 mt-2 list-disc space-y-1 text-[var(--color-text-secondary)]",children:[(0,t.jsxs)("li",{children:["XDA is marked as TODO in xterm.js codebase:"," ",(0,t.jsx)("code",{className:"rounded-[2px] bg-black px-1 py-0.5",children:"test.skip('CSI > Ps q - Report xterm name and version (XTVERSION)')"})]}),(0,t.jsx)("li",{children:"Without XDA response, tmux doesn't recognize the terminal as clipboard-capable"}),(0,t.jsx)("li",{children:"tmux never emits OSC 52 sequences → clipboard doesn't work"})]})]})]}),(0,t.jsxs)("div",{children:[(0,t.jsx)("h3",{className:"mb-2 font-semibold text-[var(--color-text-primary)]",children:'4. Why iTerm2 "Fixed" It'}),(0,t.jsxs)("ul",{className:"ml-6 list-disc space-y-1 text-[var(--color-text-secondary)]",children:[(0,t.jsxs)("li",{children:["iTerm2 sends proper XDA response identifying itself as"," ",(0,t.jsx)("code",{className:"rounded-[2px] bg-black px-1 py-0.5",children:'"iTerm2 "'})]}),(0,t.jsx)("li",{children:"tmux detects this and enables clipboard for the entire session"}),(0,t.jsx)("li",{children:"OSC 52 sequences are then sent to ALL clients, including browser (ttyd/xterm.js)"}),(0,t.jsx)("li",{children:'This is why clipboard "magically worked" when iTerm2 was attached'})]})]})]})]}),(0,t.jsxs)("section",{className:"mb-8 rounded-[2px] border border-[var(--color-border-default)] bg-[var(--color-bg-secondary)] p-6",children:[(0,t.jsx)("h2",{className:"mb-4 text-xl font-bold text-[var(--color-text-primary)]",children:"✅ The Solution"}),(0,t.jsxs)("div",{className:"space-y-4 text-sm",children:[(0,t.jsxs)("div",{children:[(0,t.jsx)("h3",{className:"mb-2 font-semibold text-[var(--color-text-primary)]",children:"DirectTerminal Implementation"}),(0,t.jsx)("p",{className:"mb-2 text-[var(--color-text-secondary)]",children:"Created custom terminal component that registers an XDA handler using xterm.js parser API:"}),(0,t.jsx)("pre",{className:"overflow-x-auto rounded-[2px] bg-black p-4 text-xs",children:(0,t.jsx)("code",{className:"text-[var(--color-accent-green)]",children:'terminal.parser.registerCsiHandler(\n { prefix: ">", final: "q" }, // CSI > q is XDA query\n () => {\n // Respond with XTerm identification\n terminal.write("\\x1bP>|XTerm(370)\\x1b\\\\");\n return true;\n }\n);'})})]}),(0,t.jsxs)("div",{children:[(0,t.jsx)("h3",{className:"mb-2 font-semibold text-[var(--color-text-primary)]",children:"What This Does"}),(0,t.jsxs)("ol",{className:"ml-6 list-decimal space-y-1 text-[var(--color-text-secondary)]",children:[(0,t.jsx)("li",{children:"Intercepts XDA queries from tmux"}),(0,t.jsxs)("li",{children:["Responds with"," ",(0,t.jsx)("code",{className:"rounded-[2px] bg-black px-1 py-0.5",children:"XTerm(370)"})," ","identification"]}),(0,t.jsx)("li",{children:'tmux detects "XTerm(" in response and enables TTYC_MS capability'}),(0,t.jsx)("li",{children:"OSC 52 sequences now flow: tmux → WebSocket → xterm.js → navigator.clipboard"}),(0,t.jsx)("li",{children:(0,t.jsx)("strong",{className:"text-[var(--color-accent-green)]",children:"Clipboard works without iTerm2!"})})]})]}),(0,t.jsxs)("div",{children:[(0,t.jsx)("h3",{className:"mb-2 font-semibold text-[var(--color-text-primary)]",children:"Architecture Changes"}),(0,t.jsxs)("ul",{className:"ml-6 list-disc space-y-1 text-[var(--color-text-secondary)]",children:[(0,t.jsxs)("li",{children:[(0,t.jsx)("strong",{children:"Old:"})," Browser → ttyd (iframe) → tmux"]}),(0,t.jsxs)("li",{children:[(0,t.jsx)("strong",{children:"New:"})," Browser → Custom WebSocket (node-pty) → tmux"]}),(0,t.jsx)("li",{children:"Bypasses ttyd for direct control over terminal initialization"}),(0,t.jsx)("li",{children:"Full control over escape sequence handling and capabilities"})]})]})]})]}),(0,t.jsxs)("section",{className:"mb-8 rounded-[2px] border border-[var(--color-accent-orange)] bg-[var(--color-bg-secondary)] p-6",children:[(0,t.jsx)("h2",{className:"mb-4 text-xl font-bold text-[var(--color-text-primary)]",children:"⚠️ Node Version Requirement"}),(0,t.jsxs)("div",{className:"space-y-3 text-sm",children:[(0,t.jsx)("div",{className:"rounded-[2px] border border-[var(--color-accent-orange)] bg-[var(--color-bg-tertiary)] p-4",children:(0,t.jsx)("p",{className:"font-semibold text-[var(--color-accent-orange)]",children:"CRITICAL: This implementation requires Node 20.x (currently 20.20.0)"})}),(0,t.jsxs)("div",{children:[(0,t.jsx)("h3",{className:"mb-2 font-semibold text-[var(--color-text-primary)]",children:"Why Node 20?"}),(0,t.jsxs)("ul",{className:"ml-6 list-disc space-y-1 text-[var(--color-text-secondary)]",children:[(0,t.jsx)("li",{children:(0,t.jsx)("strong",{children:"node-pty 1.1.0 is incompatible with Node 25+"})}),(0,t.jsxs)("li",{children:["Error on Node 25.6.1:"," ",(0,t.jsx)("code",{className:"rounded-[2px] bg-black px-1 py-0.5",children:"posix_spawnp failed"})]}),(0,t.jsx)("li",{children:"Root cause: node-pty's native module (darwin-arm64 prebuild) fails to spawn processes on Node 25"}),(0,t.jsx)("li",{children:"No darwin-arm64 prebuilds available that work with Node 25"}),(0,t.jsx)("li",{children:"Building from source also fails with the same error"})]})]}),(0,t.jsxs)("div",{children:[(0,t.jsx)("h3",{className:"mb-2 font-semibold text-[var(--color-text-primary)]",children:"When Can We Upgrade?"}),(0,t.jsxs)("ul",{className:"ml-6 list-disc space-y-1 text-[var(--color-text-secondary)]",children:[(0,t.jsxs)("li",{children:[(0,t.jsx)("strong",{children:"Option 1:"})," Wait for node-pty 1.2.0 stable release with Node 25+ support"]}),(0,t.jsxs)("li",{children:[(0,t.jsx)("strong",{children:"Option 2:"})," Test node-pty beta versions (currently 1.2.0-beta.11)"]}),(0,t.jsxs)("li",{children:[(0,t.jsx)("strong",{children:"Option 3:"})," Switch to alternative PTY library (e.g., xterm-pty, node-child-pty)"]})]})]}),(0,t.jsxs)("div",{className:"rounded-[2px] bg-[var(--color-bg-tertiary)] p-4",children:[(0,t.jsx)("h3",{className:"mb-2 font-semibold text-[var(--color-text-primary)]",children:"⚡ Testing Instructions for Upgrades"}),(0,t.jsx)("p",{className:"mb-2 text-[var(--color-text-secondary)]",children:"Before upgrading Node or node-pty:"}),(0,t.jsxs)("ol",{className:"ml-6 list-decimal space-y-1 text-xs text-[var(--color-text-secondary)]",children:[(0,t.jsxs)("li",{children:["Test node-pty directly:"," ",(0,t.jsx)("code",{className:"rounded-[2px] bg-black px-1 py-0.5",children:"node -e \"const pty = require('node-pty'); pty.spawn('/bin/bash', [], {})\""})]}),(0,t.jsxs)("li",{children:["If no"," ",(0,t.jsx)("code",{className:"rounded-[2px] bg-black px-1 py-0.5",children:"posix_spawnp failed"})," ","error, proceed"]}),(0,t.jsx)("li",{children:"Start dev servers and open this page"}),(0,t.jsx)("li",{children:"Test DirectTerminal: verify connection, clipboard, resize"}),(0,t.jsx)("li",{children:"Test multiple sessions to ensure stability"}),(0,t.jsx)("li",{children:"If all tests pass, upgrade is safe"})]})]})]})]}),(0,t.jsxs)("div",{className:"mb-4",children:[(0,t.jsxs)("div",{className:"flex items-center gap-4",children:[(0,t.jsxs)("button",{onClick:()=>c(!a),className:"rounded-[2px] bg-[var(--color-accent-blue)] px-4 py-2 text-sm font-semibold text-white transition-opacity hover:opacity-80",children:[a?"Hide":"Show"," Side-by-Side Comparison"]}),(0,t.jsx)("span",{className:"text-sm text-[var(--color-text-secondary)]",children:"Compare old (ttyd iframe) vs new (DirectTerminal with XDA)"})]}),u===b&&(0,t.jsxs)("div",{className:"mt-2 rounded-[2px] border border-[var(--color-accent-orange)] bg-[var(--color-bg-tertiary)] p-2 text-xs text-[var(--color-text-secondary)]",children:["⚠️ Using same session for both terminals. To avoid port conflicts, use different sessions:",(0,t.jsx)("code",{className:"ml-1 rounded-[2px] bg-black px-1",children:"?old_session=ao-orchestrator&new_session=ao-20"})]})]}),a&&(0,t.jsxs)("section",{className:"mb-8",children:[(0,t.jsxs)("div",{className:"grid gap-6 lg:grid-cols-2",children:[(0,t.jsxs)("div",{className:"rounded-[2px] border border-[var(--color-border-default)] bg-[var(--color-bg-secondary)] p-4",children:[(0,t.jsxs)("div",{className:"mb-3 flex items-center gap-2",children:[(0,t.jsx)("span",{className:"rounded-[2px] bg-[var(--color-accent-red)] px-2 py-1 text-xs font-semibold text-white",children:"OLD"}),(0,t.jsx)("h3",{className:"text-sm font-semibold text-[var(--color-text-primary)]",children:"ttyd iframe (no XDA)"})]}),(0,t.jsxs)("div",{className:"mb-2 rounded bg-[var(--color-bg-tertiary)] p-2 text-xs text-[var(--color-text-secondary)]",children:["❌ Clipboard requires iTerm2 attached",(0,t.jsx)("br",{}),"✅ Battle-tested (ttyd)",(0,t.jsx)("br",{}),"❌ No control over capabilities"]}),(0,t.jsx)(o,{sessionId:u})]}),(0,t.jsxs)("div",{className:"rounded-[2px] border border-[var(--color-border-default)] bg-[var(--color-bg-secondary)] p-4",children:[(0,t.jsxs)("div",{className:"mb-3 flex items-center gap-2",children:[(0,t.jsx)("span",{className:"rounded-[2px] bg-[var(--color-accent-green)] px-2 py-1 text-xs font-semibold text-white",children:"NEW"}),(0,t.jsx)("h3",{className:"text-sm font-semibold text-[var(--color-text-primary)]",children:"DirectTerminal (with XDA)"})]}),(0,t.jsxs)("div",{className:"mb-2 rounded bg-[var(--color-bg-tertiary)] p-2 text-xs text-[var(--color-text-secondary)]",children:["✅ Clipboard works standalone",(0,t.jsx)("br",{}),"✅ Full control over terminal",(0,t.jsx)("br",{}),"⚠️ Requires Node 20.x (node-pty)"]}),(0,t.jsx)(i,{sessionId:b,tmuxName:b})]})]}),(0,t.jsxs)("div",{className:"mt-4 rounded-[2px] border border-[var(--color-accent-blue)] bg-[var(--color-bg-secondary)] p-4",children:[(0,t.jsx)("h3",{className:"mb-2 text-sm font-semibold text-[var(--color-text-primary)]",children:"\uD83E\uDDEA How to Test Clipboard"}),(0,t.jsxs)("ol",{className:"ml-6 list-decimal space-y-1 text-sm text-[var(--color-text-secondary)]",children:[(0,t.jsx)("li",{children:"Drag-select text in BOTH terminals above"}),(0,t.jsx)("li",{children:"Press Cmd+C (macOS) or Ctrl+Shift+C (Linux/Windows)"}),(0,t.jsx)("li",{children:"Paste in another application (Notes, VS Code, etc.)"}),(0,t.jsx)("li",{children:(0,t.jsx)("strong",{className:"text-[var(--color-text-primary)]",children:"Expected: RIGHT terminal works, LEFT may not (unless iTerm2 is attached)"})})]})]})]}),(0,t.jsxs)("section",{className:"rounded-[2px] border border-[var(--color-accent)] bg-[var(--color-bg-secondary)] p-6",children:[(0,t.jsx)("h2",{className:"mb-4 text-xl font-bold text-[var(--color-text-primary)]",children:"\uD83D\uDD2C The Debugging Journey"}),(0,t.jsxs)("div",{className:"space-y-4 text-sm text-[var(--color-text-secondary)]",children:[(0,t.jsx)("div",{className:"rounded-[2px] bg-[var(--color-bg-tertiary)] p-4",children:(0,t.jsx)("p",{className:"font-semibold text-[var(--color-accent-red)]",children:"Total Time Wasted: 12+ hours across Feb 15-16, 2026"})}),(0,t.jsxs)("div",{children:[(0,t.jsx)("h3",{className:"mb-2 font-semibold text-[var(--color-text-primary)]",children:"❌ What We Tried (That Didn't Work)"}),(0,t.jsxs)("ol",{className:"ml-6 list-decimal space-y-2",children:[(0,t.jsxs)("li",{children:[(0,t.jsx)("strong",{children:"Suspected ttyd clipboard handling"})," - Spent hours analyzing ttyd source code, checking OSC 52 passthrough. ttyd was innocent - it passes escape sequences correctly."]}),(0,t.jsxs)("li",{children:[(0,t.jsx)("strong",{children:"Blamed xterm.js configuration"})," - Tried every possible xterm.js option, clipboard addon configurations, terminal type settings. None made a difference."]}),(0,t.jsxs)("li",{children:[(0,t.jsx)("strong",{children:"Investigated macOS clipboard permissions"})," - Checked browser permissions, sandbox attributes, navigator.clipboard API. All were correct."]}),(0,t.jsxs)("li",{children:[(0,t.jsx)("strong",{children:"Suspected WebSocket encoding issues"})," - Checked binary vs text mode, UTF-8 encoding, base64 handling. All correct."]}),(0,t.jsxs)("li",{children:[(0,t.jsx)("strong",{children:"Tried force-enabling tmux clipboard"})," - Used"," ",(0,t.jsx)("code",{className:"rounded-[2px] bg-black px-1 py-0.5",children:"set-option -s set-clipboard on"})," ","in tmux.conf. Didn't help - tmux needs the terminal to declare support."]})]})]}),(0,t.jsxs)("div",{children:[(0,t.jsx)("h3",{className:"mb-2 font-semibold text-[var(--color-text-primary)]",children:"\uD83D\uDCA1 The Breakthrough"}),(0,t.jsxs)("div",{className:"space-y-2",children:[(0,t.jsxs)("p",{children:[(0,t.jsx)("strong",{children:"What finally worked:"})," Registering an XDA (Extended Device Attributes) handler in xterm.js using"," ",(0,t.jsx)("code",{className:"rounded-[2px] bg-black px-1 py-0.5",children:"terminal.parser.registerCsiHandler()"})]}),(0,t.jsx)("pre",{className:"mt-2 overflow-x-auto rounded-[2px] bg-black p-3 text-xs",children:(0,t.jsx)("code",{className:"text-[var(--color-accent-green)]",children:'terminal.parser.registerCsiHandler(\n { prefix: ">", final: "q" },\n () => {\n terminal.write("\\x1bP>|XTerm(370)\\x1b\\\\");\n return true;\n }\n);'})}),(0,t.jsx)("p",{className:"mt-2",children:"This single handler made tmux recognize our terminal as clipboard-capable. Clipboard immediately started working."})]})]}),(0,t.jsxs)("div",{children:[(0,t.jsx)("h3",{className:"mb-2 font-semibold text-[var(--color-text-primary)]",children:"\uD83C\uDFAF How We Finally Figured It Out"}),(0,t.jsxs)("ol",{className:"ml-6 list-decimal space-y-2",children:[(0,t.jsxs)("li",{children:[(0,t.jsx)("strong",{children:"Deep-dive into tmux source code"})," - Used DeepWiki.com to analyze tmux's terminal capability detection logic in"," ",(0,t.jsx)("code",{className:"rounded-[2px] bg-black px-1 py-0.5",children:"tty-keys.c"})," and"," ",(0,t.jsx)("code",{className:"rounded-[2px] bg-black px-1 py-0.5",children:"tty.c"})]}),(0,t.jsxs)("li",{children:[(0,t.jsx)("strong",{children:"Discovered XDA queries"})," - Found that tmux sends"," ",(0,t.jsx)("code",{className:"rounded-[2px] bg-black px-1 py-0.5",children:"CSI > q"})," (XTVERSION) to detect terminal type"]}),(0,t.jsxs)("li",{children:[(0,t.jsx)("strong",{children:'Traced the "iTerm2 magic"'})," - Realized why clipboard worked when iTerm2 was attached: iTerm2 responds to XDA queries, enabling clipboard for the entire tmux session"]}),(0,t.jsxs)("li",{children:[(0,t.jsx)("strong",{children:"Checked xterm.js implementation"})," - Found that XDA is marked as TODO in xterm.js tests:"," ",(0,t.jsx)("code",{className:"rounded-[2px] bg-black px-1 py-0.5",children:"test.skip('CSI > Ps q - Report xterm name and version (XTVERSION)')"})]}),(0,t.jsxs)("li",{children:[(0,t.jsx)("strong",{children:"Implemented custom handler"})," - Used xterm.js parser API to register our own XDA handler"]})]})]}),(0,t.jsxs)("div",{className:"rounded-[2px] border border-[var(--color-accent-orange)] bg-[var(--color-bg-tertiary)] p-4",children:[(0,t.jsx)("h3",{className:"mb-2 font-semibold text-[var(--color-text-primary)]",children:"⚡ How We Could Have Figured It Out Faster"}),(0,t.jsxs)("ol",{className:"ml-6 list-decimal space-y-2 text-[var(--color-text-secondary)]",children:[(0,t.jsxs)("li",{children:[(0,t.jsx)("strong",{children:"Start with tmux source code first"})," - Instead of debugging xterm.js and ttyd, we should have immediately checked how tmux detects terminal capabilities"]}),(0,t.jsxs)("li",{children:[(0,t.jsx)("strong",{children:"Monitor escape sequences"})," - Running"," ",(0,t.jsx)("code",{className:"rounded-[2px] bg-black px-1 py-0.5",children:"tmux -vvv"})," or using a terminal protocol analyzer would have revealed the XDA queries being sent"]}),(0,t.jsxs)("li",{children:[(0,t.jsx)("strong",{children:"Compare working vs broken scenarios"})," - Should have captured and diffed the escape sequences when iTerm2 was attached vs not attached earlier"]}),(0,t.jsxs)("li",{children:[(0,t.jsx)("strong",{children:"Check xterm.js issues/limitations first"}),' - A GitHub search for "xterm.js XDA" or "xterm.js device attributes" would have revealed it\'s unimplemented']}),(0,t.jsxs)("li",{children:[(0,t.jsx)("strong",{children:"Read tmux documentation on terminal types"})," - tmux man page mentions terminal capability detection, but we focused on clipboard settings instead"]})]})]}),(0,t.jsxs)("div",{children:[(0,t.jsx)("h3",{className:"mb-2 font-semibold text-[var(--color-text-primary)]",children:"\uD83D\uDCDA Key Resources"}),(0,t.jsxs)("ul",{className:"ml-6 list-disc space-y-1",children:[(0,t.jsx)("li",{children:"tmux source analysis: DeepWiki.com (Feb 15, 2026)"}),(0,t.jsx)("li",{children:"xterm.js parser API documentation"}),(0,t.jsx)("li",{children:"XTerm Control Sequences: XTVERSION / Device Attributes"}),(0,t.jsxs)("li",{children:["tmux ",(0,t.jsx)("code",{className:"rounded-[2px] bg-black px-1 py-0.5",children:"tty-keys.c"}),": Terminal type detection logic"]})]})]})]})]}),(0,t.jsxs)("section",{className:"mt-6 rounded-[2px] border border-[var(--color-border-default)] bg-[var(--color-bg-secondary)] p-6",children:[(0,t.jsx)("h2",{className:"mb-4 text-xl font-bold text-[var(--color-text-primary)]",children:"\uD83D\uDCC1 Implementation Files"}),(0,t.jsxs)("ul",{className:"ml-6 list-disc space-y-1 text-sm text-[var(--color-text-secondary)]",children:[(0,t.jsxs)("li",{children:[(0,t.jsx)("code",{className:"rounded-[2px] bg-black px-1 py-0.5",children:"packages/web/src/components/DirectTerminal.tsx"})," ","- Main component with XDA handler"]}),(0,t.jsxs)("li",{children:[(0,t.jsx)("code",{className:"rounded-[2px] bg-black px-1 py-0.5",children:"packages/web/server/direct-terminal-ws.ts"})," ","- WebSocket server using node-pty"]}),(0,t.jsxs)("li",{children:[(0,t.jsx)("code",{className:"rounded-[2px] bg-black px-1 py-0.5",children:"packages/web/src/app/dev/terminal-test/page.tsx"})," ","- This test page"]})]})]}),(0,t.jsxs)("div",{className:"mt-8 border-t border-[var(--color-border-default)] pt-4 text-center text-xs text-[var(--color-text-secondary)]",children:[(0,t.jsx)("p",{children:"Investigation: Feb 15-16, 2026 • Duration: 12+ hours • Status: ✅ Resolved"}),(0,t.jsx)("p",{className:"mt-1",children:"Node 20.20.0 • node-pty 1.1.0 • xterm.js 5.3.0"})]})]})})}function x(){return(0,t.jsx)(l.Suspense,{fallback:(0,t.jsx)("div",{className:"flex min-h-screen items-center justify-center",children:"Loading..."}),children:(0,t.jsx)(d,{})})}},5468:(e,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),!function(e,r){for(var s in r)Object.defineProperty(e,s,{enumerable:!0,get:r[s]})}(r,{bindSnapshot:function(){return l},createAsyncLocalStorage:function(){return n},createSnapshot:function(){return i}});let s=Object.defineProperty(Error("Invariant: AsyncLocalStorage accessed in runtime where it is not available"),"__NEXT_ERROR_CODE",{value:"E504",enumerable:!1,configurable:!0});class t{disable(){throw s}getStore(){}run(){throw s}exit(){throw s}enterWith(){throw s}static bind(e){return e}}let a="undefined"!=typeof globalThis&&globalThis.AsyncLocalStorage;function n(){return a?new a:new t}function l(e){return a?a.bind(e):t.bind(e)}function i(){return a?a.snapshot():function(e,...r){return e(...r)}}},5864:(e,r,s)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"default",{enumerable:!0,get:function(){return o}});let t=s(3817),a=s(6749),n=s(6943);function l(e){return{default:e&&"default"in e?e.default:e}}s(6418);let i={loader:()=>Promise.resolve(l(()=>null)),loading:null,ssr:!0},o=function(e){let r={...i,...e},s=(0,a.lazy)(()=>r.loader().then(l)),o=r.loading;function c(e){let l=o?(0,t.jsx)(o,{isLoading:!0,pastDelay:!0,error:null}):null,i=!r.ssr||!!r.loading,c=i?a.Suspense:a.Fragment,d=r.ssr?(0,t.jsxs)(t.Fragment,{children:[null,(0,t.jsx)(s,{...e})]}):(0,t.jsx)(n.BailoutToCSR,{reason:"next/dynamic",children:(0,t.jsx)(s,{...e})});return(0,t.jsx)(c,{...i?{fallback:l}:{},children:d})}return c.displayName="LoadableComponent",c}},6313:(e,r,s)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"workAsyncStorage",{enumerable:!0,get:function(){return t.workAsyncStorageInstance}});let t=s(8394)},6418:(e,r,s)=>{"use strict";function t(e){let{moduleIds:r}=e;return null}Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"PreloadChunks",{enumerable:!0,get:function(){return t}}),s(3817),s(4768),s(6313),s(5152)},6943:(e,r,s)=>{"use strict";function t(e){let{reason:r,children:s}=e;return s}Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"BailoutToCSR",{enumerable:!0,get:function(){return t}}),s(1763)},7594:(e,r,s)=>{"use strict";var t=s(9582);s.o(t,"useParams")&&s.d(r,{useParams:function(){return t.useParams}}),s.o(t,"usePathname")&&s.d(r,{usePathname:function(){return t.usePathname}}),s.o(t,"useRouter")&&s.d(r,{useRouter:function(){return t.useRouter}}),s.o(t,"useSearchParams")&&s.d(r,{useSearchParams:function(){return t.useSearchParams}})},8394:(e,r,s)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"workAsyncStorageInstance",{enumerable:!0,get:function(){return t}});let t=(0,s(5468).createAsyncLocalStorage)()},8868:(e,r,s)=>{Promise.resolve().then(s.bind(s,4255))},9891:(e,r,s)=>{"use strict";s.d(r,{default:()=>a.a});var t=s(1712),a=s.n(t)}},e=>{e.O(0,[131,1461,7358],()=>e(e.s=8868)),_N_E=e.O()}]);
@@ -1 +1 @@
1
- (self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[8039],{3464:(r,e,o)=>{"use strict";o.r(e),o.d(e,{default:()=>s});var a=o(3817),t=o(7594),l=o(6749),n=o(9789);function s(r){let{error:e,reset:o}=r,s=(0,t.useRouter)();return(0,l.useEffect)(()=>{console.error(e)},[e]),(0,a.jsx)(n.ErrorDisplay,{title:"Something went wrong",message:"The dashboard hit an unexpected error. Try reloading the route data or head back to the main dashboard.",tone:"warning",primaryAction:{label:"Try again",onClick:()=>{o(),s.refresh()}},secondaryAction:{label:"Back to dashboard",href:"/"},error:e,compact:!0,chrome:"card"})}},7557:(r,e,o)=>{Promise.resolve().then(o.bind(o,3464))},7594:(r,e,o)=>{"use strict";var a=o(9582);o.o(a,"useParams")&&o.d(e,{useParams:function(){return a.useParams}}),o.o(a,"usePathname")&&o.d(e,{usePathname:function(){return a.usePathname}}),o.o(a,"useRouter")&&o.d(e,{useRouter:function(){return a.useRouter}}),o.o(a,"useSearchParams")&&o.d(e,{useSearchParams:function(){return a.useSearchParams}})},9789:(r,e,o)=>{"use strict";o.d(e,{ErrorDisplay:()=>i});var a=o(3817),t=o(8713),l=o.n(t);let n={error:{accent:"var(--color-status-error)",bg:"var(--color-tint-red)",border:"color-mix(in srgb, var(--color-status-error) 24%, transparent)",label:"error"},warning:{accent:"var(--color-status-attention)",bg:"var(--color-tint-yellow)",border:"color-mix(in srgb, var(--color-status-attention) 24%, transparent)",label:"warning"},"not-found":{accent:"var(--color-accent)",bg:"var(--color-tint-blue)",border:"color-mix(in srgb, var(--color-accent) 24%, transparent)",label:"missing"}};function s(r){let{accent:e}=r;return(0,a.jsx)("div",{className:"flex h-14 w-14 items-center justify-center rounded-2xl border",style:{background:"linear-gradient(180deg, color-mix(in srgb, ".concat(e," 16%, var(--color-bg-elevated)) 0%, var(--color-bg-surface) 100%)"),borderColor:"color-mix(in srgb, ".concat(e," 18%, var(--color-border-default))"),boxShadow:"var(--detail-card-shadow)"},children:(0,a.jsxs)("svg",{className:"h-7 w-7",fill:"none",stroke:"currentColor",strokeWidth:"1.6",style:{color:e},viewBox:"0 0 24 24",children:[(0,a.jsx)("rect",{x:"2.5",y:"4.5",width:"19",height:"15",rx:"3"}),(0,a.jsx)("path",{d:"M6.5 9.5l3.25 2.5-3.25 2.5M12.75 15h4.75"})]})})}function c(r){let{action:e,primary:o=!1}=r,t=o?"inline-flex items-center justify-center rounded-full border px-4 py-2 text-[12px] font-semibold transition-colors hover:no-underline":"inline-flex items-center justify-center rounded-full border px-4 py-2 text-[12px] font-medium transition-colors hover:no-underline",n=o?{background:"var(--color-accent)",color:"var(--color-text-inverse)",borderColor:"color-mix(in srgb, var(--color-accent) 72%, transparent)"}:{background:"var(--color-bg-surface)",color:"var(--color-text-secondary)",borderColor:"var(--color-border-default)"};return e.href?(0,a.jsx)(l(),{href:e.href,className:t,style:n,children:e.label}):(0,a.jsx)("button",{type:"button",onClick:e.onClick,className:t,style:n,children:e.label})}function i(r){let{title:e,message:o,tone:t="error",detailsTitle:l="Technical details",error:i,primaryAction:d,secondaryAction:u,compact:x=!1,chrome:m="page",children:b}=r,v=n[t],h=!!((null==i?void 0:i.digest)||(null==i?void 0:i.message)||(null==i?void 0:i.stack));return(0,a.jsx)("div",{className:"flex w-full items-center justify-center px-6 py-10 ".concat(x?"min-h-[calc(100vh-4rem)]":"min-h-screen"),style:{background:"page"===m?"radial-gradient(circle at top, var(--color-body-gradient-blue), transparent 35%), var(--color-bg-base)":"transparent"},children:(0,a.jsx)("div",{className:"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%)",borderColor:"var(--color-border-default)",boxShadow:"var(--detail-card-shadow)"},children:(0,a.jsxs)("div",{className:"flex flex-col gap-6",children:[(0,a.jsxs)("div",{className:"flex flex-col gap-4 sm:flex-row sm:items-start",children:[(0,a.jsx)(s,{accent:v.accent}),(0,a.jsxs)("div",{className:"min-w-0 flex-1",children:[(0,a.jsx)("div",{className:"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:v.accent,background:v.bg,borderColor:v.border},children:v.label}),(0,a.jsx)("h1",{className:"text-[24px] font-semibold tracking-[-0.04em] text-[var(--color-text-primary)]",children:e}),(0,a.jsx)("p",{className:"mt-2 max-w-[34rem] text-[14px] leading-6 text-[var(--color-text-secondary)]",children:o})]})]}),(d||u)&&(0,a.jsxs)("div",{className:"flex flex-wrap gap-3",children:[d?(0,a.jsx)(c,{action:d,primary:!0}):null,u?(0,a.jsx)(c,{action:u}):null]}),b,h?(0,a.jsxs)("details",{className:"rounded-2xl border",style:{background:"color-mix(in srgb, var(--color-bg-elevated) 84%, transparent)",borderColor:"var(--color-border-subtle)"},children:[(0,a.jsx)("summary",{className:"cursor-pointer list-none px-4 py-3 text-[12px] font-medium text-[var(--color-text-secondary)]",children:l}),(0,a.jsxs)("div",{className:"border-t px-4 py-4",style:{borderColor:"var(--color-border-subtle)"},children:[(null==i?void 0:i.digest)?(0,a.jsxs)("p",{className:"mb-3 font-[var(--font-mono)] text-[11px] text-[var(--color-text-tertiary)]",children:["digest: ",i.digest]}):null,(null==i?void 0:i.message)?(0,a.jsx)("p",{className:"mb-3 text-[12px] leading-5 text-[var(--color-text-secondary)]",children:i.message}):null,(null==i?void 0:i.stack)?(0,a.jsx)("pre",{className:"overflow-x-auto whitespace-pre-wrap font-[var(--font-mono)] text-[11px] leading-5 text-[var(--color-text-tertiary)]",children:i.stack}):null]})]}):null]})})})}}},r=>{r.O(0,[8713,131,1461,7358],()=>r(r.s=7557)),_N_E=r.O()}]);
1
+ (self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[8039],{3123:(r,e,o)=>{Promise.resolve().then(o.bind(o,3464))},3464:(r,e,o)=>{"use strict";o.r(e),o.d(e,{default:()=>s});var a=o(3817),t=o(7594),l=o(6749),n=o(9789);function s(r){let{error:e,reset:o}=r,s=(0,t.useRouter)();return(0,l.useEffect)(()=>{console.error(e)},[e]),(0,a.jsx)(n.ErrorDisplay,{title:"Something went wrong",message:"The dashboard hit an unexpected error. Try reloading the route data or head back to the main dashboard.",tone:"warning",primaryAction:{label:"Try again",onClick:()=>{o(),s.refresh()}},secondaryAction:{label:"Back to dashboard",href:"/"},error:e,compact:!0,chrome:"card"})}},7594:(r,e,o)=>{"use strict";var a=o(9582);o.o(a,"useParams")&&o.d(e,{useParams:function(){return a.useParams}}),o.o(a,"usePathname")&&o.d(e,{usePathname:function(){return a.usePathname}}),o.o(a,"useRouter")&&o.d(e,{useRouter:function(){return a.useRouter}}),o.o(a,"useSearchParams")&&o.d(e,{useSearchParams:function(){return a.useSearchParams}})},9789:(r,e,o)=>{"use strict";o.d(e,{ErrorDisplay:()=>i});var a=o(3817),t=o(8713),l=o.n(t);let n={error:{accent:"var(--color-status-error)",bg:"var(--color-tint-red)",border:"color-mix(in srgb, var(--color-status-error) 24%, transparent)",label:"error"},warning:{accent:"var(--color-status-attention)",bg:"var(--color-tint-yellow)",border:"color-mix(in srgb, var(--color-status-attention) 24%, transparent)",label:"warning"},"not-found":{accent:"var(--color-accent)",bg:"var(--color-tint-blue)",border:"color-mix(in srgb, var(--color-accent) 24%, transparent)",label:"missing"}};function s(r){let{accent:e}=r;return(0,a.jsx)("div",{className:"flex h-14 w-14 items-center justify-center rounded-2xl border",style:{background:"linear-gradient(180deg, color-mix(in srgb, ".concat(e," 16%, var(--color-bg-elevated)) 0%, var(--color-bg-surface) 100%)"),borderColor:"color-mix(in srgb, ".concat(e," 18%, var(--color-border-default))"),boxShadow:"var(--detail-card-shadow)"},children:(0,a.jsxs)("svg",{className:"h-7 w-7",fill:"none",stroke:"currentColor",strokeWidth:"1.6",style:{color:e},viewBox:"0 0 24 24",children:[(0,a.jsx)("rect",{x:"2.5",y:"4.5",width:"19",height:"15",rx:"3"}),(0,a.jsx)("path",{d:"M6.5 9.5l3.25 2.5-3.25 2.5M12.75 15h4.75"})]})})}function c(r){let{action:e,primary:o=!1}=r,t=o?"inline-flex items-center justify-center rounded-full border px-4 py-2 text-[12px] font-semibold transition-colors hover:no-underline":"inline-flex items-center justify-center rounded-full border px-4 py-2 text-[12px] font-medium transition-colors hover:no-underline",n=o?{background:"var(--color-accent)",color:"var(--color-text-inverse)",borderColor:"color-mix(in srgb, var(--color-accent) 72%, transparent)"}:{background:"var(--color-bg-surface)",color:"var(--color-text-secondary)",borderColor:"var(--color-border-default)"};return e.href?(0,a.jsx)(l(),{href:e.href,className:t,style:n,children:e.label}):(0,a.jsx)("button",{type:"button",onClick:e.onClick,className:t,style:n,children:e.label})}function i(r){let{title:e,message:o,tone:t="error",detailsTitle:l="Technical details",error:i,primaryAction:d,secondaryAction:u,compact:x=!1,chrome:m="page",children:b}=r,v=n[t],h=!!((null==i?void 0:i.digest)||(null==i?void 0:i.message)||(null==i?void 0:i.stack));return(0,a.jsx)("div",{className:"flex w-full items-center justify-center px-6 py-10 ".concat(x?"min-h-[calc(100vh-4rem)]":"min-h-screen"),style:{background:"page"===m?"radial-gradient(circle at top, var(--color-body-gradient-blue), transparent 35%), var(--color-bg-base)":"transparent"},children:(0,a.jsx)("div",{className:"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%)",borderColor:"var(--color-border-default)",boxShadow:"var(--detail-card-shadow)"},children:(0,a.jsxs)("div",{className:"flex flex-col gap-6",children:[(0,a.jsxs)("div",{className:"flex flex-col gap-4 sm:flex-row sm:items-start",children:[(0,a.jsx)(s,{accent:v.accent}),(0,a.jsxs)("div",{className:"min-w-0 flex-1",children:[(0,a.jsx)("div",{className:"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:v.accent,background:v.bg,borderColor:v.border},children:v.label}),(0,a.jsx)("h1",{className:"text-[24px] font-semibold tracking-[-0.04em] text-[var(--color-text-primary)]",children:e}),(0,a.jsx)("p",{className:"mt-2 max-w-[34rem] text-[14px] leading-6 text-[var(--color-text-secondary)]",children:o})]})]}),(d||u)&&(0,a.jsxs)("div",{className:"flex flex-wrap gap-3",children:[d?(0,a.jsx)(c,{action:d,primary:!0}):null,u?(0,a.jsx)(c,{action:u}):null]}),b,h?(0,a.jsxs)("details",{className:"rounded-2xl border",style:{background:"color-mix(in srgb, var(--color-bg-elevated) 84%, transparent)",borderColor:"var(--color-border-subtle)"},children:[(0,a.jsx)("summary",{className:"cursor-pointer list-none px-4 py-3 text-[12px] font-medium text-[var(--color-text-secondary)]",children:l}),(0,a.jsxs)("div",{className:"border-t px-4 py-4",style:{borderColor:"var(--color-border-subtle)"},children:[(null==i?void 0:i.digest)?(0,a.jsxs)("p",{className:"mb-3 font-[var(--font-mono)] text-[11px] text-[var(--color-text-tertiary)]",children:["digest: ",i.digest]}):null,(null==i?void 0:i.message)?(0,a.jsx)("p",{className:"mb-3 text-[12px] leading-5 text-[var(--color-text-secondary)]",children:i.message}):null,(null==i?void 0:i.stack)?(0,a.jsx)("pre",{className:"overflow-x-auto whitespace-pre-wrap font-[var(--font-mono)] text-[11px] leading-5 text-[var(--color-text-tertiary)]",children:i.stack}):null]})]}):null]})})})}}},r=>{r.O(0,[8713,131,1461,7358],()=>r(r.s=3123)),_N_E=r.O()}]);