@aoagents/ao-web 0.2.3 → 0.2.5

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 (265) hide show
  1. package/.next/BUILD_ID +1 -1
  2. package/.next/app-build-manifest.json +228 -221
  3. package/.next/app-path-routes-manifest.json +7 -6
  4. package/.next/build-manifest.json +14 -14
  5. package/.next/next-minimal-server.js.nft.json +1 -1
  6. package/.next/next-server.js.nft.json +1 -1
  7. package/.next/prerender-manifest.json +31 -31
  8. package/.next/react-loadable-manifest.json +14 -14
  9. package/.next/required-server-files.json +7 -4
  10. package/.next/server/app/_not-found/page.js +2 -2
  11. package/.next/server/app/_not-found/page.js.nft.json +1 -1
  12. package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  13. package/.next/server/app/_not-found.html +1 -1
  14. package/.next/server/app/_not-found.rsc +15 -15
  15. package/.next/server/app/api/backlog/route.js +1 -1
  16. package/.next/server/app/api/backlog/route.js.nft.json +1 -1
  17. package/.next/server/app/api/backlog/route_client-reference-manifest.js +1 -1
  18. package/.next/server/app/api/events/route.js +2 -2
  19. package/.next/server/app/api/events/route.js.nft.json +1 -1
  20. package/.next/server/app/api/events/route_client-reference-manifest.js +1 -1
  21. package/.next/server/app/api/issues/route.js +1 -1
  22. package/.next/server/app/api/issues/route.js.nft.json +1 -1
  23. package/.next/server/app/api/issues/route_client-reference-manifest.js +1 -1
  24. package/.next/server/app/api/observability/route.js +1 -1
  25. package/.next/server/app/api/observability/route.js.nft.json +1 -1
  26. package/.next/server/app/api/observability/route_client-reference-manifest.js +1 -1
  27. package/.next/server/app/api/orchestrators/route.js +1 -1
  28. package/.next/server/app/api/orchestrators/route.js.nft.json +1 -1
  29. package/.next/server/app/api/orchestrators/route_client-reference-manifest.js +1 -1
  30. package/.next/server/app/api/projects/route.js +1 -1
  31. package/.next/server/app/api/projects/route.js.nft.json +1 -1
  32. package/.next/server/app/api/projects/route_client-reference-manifest.js +1 -1
  33. package/.next/server/app/api/prs/[id]/merge/route.js +1 -1
  34. package/.next/server/app/api/prs/[id]/merge/route.js.nft.json +1 -1
  35. package/.next/server/app/api/prs/[id]/merge/route_client-reference-manifest.js +1 -1
  36. package/.next/server/app/api/runtime/terminal/route.js +1 -1
  37. package/.next/server/app/api/runtime/terminal/route.js.nft.json +1 -1
  38. package/.next/server/app/api/runtime/terminal/route_client-reference-manifest.js +1 -1
  39. package/.next/server/app/api/sessions/[id]/kill/route.js +1 -1
  40. package/.next/server/app/api/sessions/[id]/kill/route.js.nft.json +1 -1
  41. package/.next/server/app/api/sessions/[id]/kill/route_client-reference-manifest.js +1 -1
  42. package/.next/server/app/api/sessions/[id]/message/route.js +1 -1
  43. package/.next/server/app/api/sessions/[id]/message/route.js.nft.json +1 -1
  44. package/.next/server/app/api/sessions/[id]/message/route_client-reference-manifest.js +1 -1
  45. package/.next/server/app/api/sessions/[id]/remap/route.js +1 -1
  46. package/.next/server/app/api/sessions/[id]/remap/route.js.nft.json +1 -1
  47. package/.next/server/app/api/sessions/[id]/remap/route_client-reference-manifest.js +1 -1
  48. package/.next/server/app/api/sessions/[id]/restore/route.js +1 -1
  49. package/.next/server/app/api/sessions/[id]/restore/route.js.nft.json +1 -1
  50. package/.next/server/app/api/sessions/[id]/restore/route_client-reference-manifest.js +1 -1
  51. package/.next/server/app/api/sessions/[id]/route.js +1 -1
  52. package/.next/server/app/api/sessions/[id]/route.js.nft.json +1 -1
  53. package/.next/server/app/api/sessions/[id]/route_client-reference-manifest.js +1 -1
  54. package/.next/server/app/api/sessions/[id]/send/route.js +1 -1
  55. package/.next/server/app/api/sessions/[id]/send/route.js.nft.json +1 -1
  56. package/.next/server/app/api/sessions/[id]/send/route_client-reference-manifest.js +1 -1
  57. package/.next/server/app/api/sessions/patches/route.js +1 -0
  58. package/.next/server/app/api/sessions/patches/route.js.nft.json +1 -0
  59. package/.next/server/app/api/sessions/patches/route_client-reference-manifest.js +1 -0
  60. package/.next/server/app/api/sessions/route.js +1 -1
  61. package/.next/server/app/api/sessions/route.js.nft.json +1 -1
  62. package/.next/server/app/api/sessions/route_client-reference-manifest.js +1 -1
  63. package/.next/server/app/api/setup-labels/route.js +1 -1
  64. package/.next/server/app/api/setup-labels/route.js.nft.json +1 -1
  65. package/.next/server/app/api/setup-labels/route_client-reference-manifest.js +1 -1
  66. package/.next/server/app/api/spawn/route.js +1 -1
  67. package/.next/server/app/api/spawn/route.js.nft.json +1 -1
  68. package/.next/server/app/api/spawn/route_client-reference-manifest.js +1 -1
  69. package/.next/server/app/api/verify/route.js +1 -1
  70. package/.next/server/app/api/verify/route.js.nft.json +1 -1
  71. package/.next/server/app/api/verify/route_client-reference-manifest.js +1 -1
  72. package/.next/server/app/api/webhooks/[...slug]/route.js +1 -1
  73. package/.next/server/app/api/webhooks/[...slug]/route.js.nft.json +1 -1
  74. package/.next/server/app/api/webhooks/[...slug]/route_client-reference-manifest.js +1 -1
  75. package/.next/server/app/apple-icon/route.js +1 -1
  76. package/.next/server/app/apple-icon/route.js.nft.json +1 -1
  77. package/.next/server/app/apple-icon/route_client-reference-manifest.js +1 -1
  78. package/.next/server/app/dev/terminal-test/page.js +3 -3
  79. package/.next/server/app/dev/terminal-test/page.js.nft.json +1 -1
  80. package/.next/server/app/dev/terminal-test/page_client-reference-manifest.js +1 -1
  81. package/.next/server/app/dev/terminal-test.html +1 -1
  82. package/.next/server/app/dev/terminal-test.rsc +17 -17
  83. package/.next/server/app/icon/route.js +1 -1
  84. package/.next/server/app/icon/route.js.nft.json +1 -1
  85. package/.next/server/app/icon/route_client-reference-manifest.js +1 -1
  86. package/.next/server/app/icon-192/route.js +1 -1
  87. package/.next/server/app/icon-192/route.js.nft.json +1 -1
  88. package/.next/server/app/icon-192/route_client-reference-manifest.js +1 -1
  89. package/.next/server/app/icon-512/route.js +1 -1
  90. package/.next/server/app/icon-512/route.js.nft.json +1 -1
  91. package/.next/server/app/icon-512/route_client-reference-manifest.js +1 -1
  92. package/.next/server/app/manifest.webmanifest/route.js +2 -2
  93. package/.next/server/app/manifest.webmanifest/route.js.nft.json +1 -1
  94. package/.next/server/app/manifest.webmanifest/route_client-reference-manifest.js +1 -1
  95. package/.next/server/app/manifest.webmanifest.body +1 -1
  96. package/.next/server/app/orchestrators/page.js +2 -2
  97. package/.next/server/app/orchestrators/page.js.nft.json +1 -1
  98. package/.next/server/app/orchestrators/page_client-reference-manifest.js +1 -1
  99. package/.next/server/app/page.js +2 -2
  100. package/.next/server/app/page.js.nft.json +1 -1
  101. package/.next/server/app/page_client-reference-manifest.js +1 -1
  102. package/.next/server/app/prs/page.js +2 -2
  103. package/.next/server/app/prs/page.js.nft.json +1 -1
  104. package/.next/server/app/prs/page_client-reference-manifest.js +1 -1
  105. package/.next/server/app/sessions/[id]/page.js +5 -5
  106. package/.next/server/app/sessions/[id]/page.js.nft.json +1 -1
  107. package/.next/server/app/sessions/[id]/page_client-reference-manifest.js +1 -1
  108. package/.next/server/app/test-direct/page.js +2 -2
  109. package/.next/server/app/test-direct/page.js.nft.json +1 -1
  110. package/.next/server/app/test-direct/page_client-reference-manifest.js +1 -1
  111. package/.next/server/app/test-direct.html +1 -1
  112. package/.next/server/app/test-direct.rsc +17 -17
  113. package/.next/server/app-paths-manifest.json +7 -6
  114. package/.next/server/chunks/100.js +1 -0
  115. package/.next/server/chunks/106.js +1 -0
  116. package/.next/server/chunks/172.js +9 -0
  117. package/.next/server/chunks/180.js +25 -0
  118. package/.next/server/chunks/333.js +1 -0
  119. package/.next/server/chunks/367.js +3 -0
  120. package/.next/server/chunks/561.js +22 -0
  121. package/.next/server/chunks/627.js +380 -363
  122. package/.next/server/chunks/803.js +6 -0
  123. package/.next/server/chunks/886.js +384 -0
  124. package/.next/server/chunks/907.js +1 -0
  125. package/.next/server/middleware-build-manifest.js +1 -1
  126. package/.next/server/middleware-react-loadable-manifest.js +1 -1
  127. package/.next/server/next-font-manifest.js +1 -1
  128. package/.next/server/next-font-manifest.json +1 -1
  129. package/.next/server/pages/404.html +1 -1
  130. package/.next/server/pages/500.html +1 -1
  131. package/.next/server/pages/_app.js +1 -1
  132. package/.next/server/pages/_app.js.nft.json +1 -1
  133. package/.next/server/pages/_document.js +1 -1
  134. package/.next/server/pages/_document.js.nft.json +1 -1
  135. package/.next/server/pages/_error.js +3 -3
  136. package/.next/server/pages/_error.js.nft.json +1 -1
  137. package/.next/server/server-reference-manifest.json +1 -1
  138. package/.next/static/OyzSw2fQpoJHXyoBWoZ2X/_buildManifest.js +1 -0
  139. package/.next/static/chunks/1461-af7c54935f21d56d.js +1 -0
  140. package/.next/static/chunks/{9393.acf1934a190d793b.js → 2529.32352c1ce5253e3e.js} +1 -1
  141. package/.next/static/chunks/{7411.ecda44797fb514a0.js → 5491.fd98884d48631149.js} +1 -1
  142. package/.next/static/chunks/6923-ef8434dfec6f2a3c.js +1 -0
  143. package/.next/static/chunks/7097.fc904e5f313c4994.js +1 -0
  144. package/.next/static/chunks/7317.685aa5231218e8d3.js +1 -0
  145. package/.next/static/chunks/8713-d3d663f55dc00e48.js +1 -0
  146. package/.next/static/chunks/8785-6b4b3ff260617997.js +1 -0
  147. package/.next/static/chunks/88a6fc35-f836b4b72df5eafa.js +1 -0
  148. package/.next/static/chunks/9478.656c9c263bc55893.js +1 -0
  149. package/.next/static/chunks/app/_not-found/page-019391920005654f.js +1 -0
  150. package/.next/static/chunks/app/api/backlog/route-019391920005654f.js +1 -0
  151. package/.next/static/chunks/app/api/events/route-019391920005654f.js +1 -0
  152. package/.next/static/chunks/app/api/issues/route-019391920005654f.js +1 -0
  153. package/.next/static/chunks/app/api/observability/route-019391920005654f.js +1 -0
  154. package/.next/static/chunks/app/api/orchestrators/route-019391920005654f.js +1 -0
  155. package/.next/static/chunks/app/api/projects/route-019391920005654f.js +1 -0
  156. package/.next/static/chunks/app/api/prs/[id]/merge/route-019391920005654f.js +1 -0
  157. package/.next/static/chunks/app/api/runtime/terminal/route-019391920005654f.js +1 -0
  158. package/.next/static/chunks/app/api/sessions/[id]/kill/route-019391920005654f.js +1 -0
  159. package/.next/static/chunks/app/api/sessions/[id]/message/route-019391920005654f.js +1 -0
  160. package/.next/static/chunks/app/api/sessions/[id]/remap/route-019391920005654f.js +1 -0
  161. package/.next/static/chunks/app/api/sessions/[id]/restore/route-019391920005654f.js +1 -0
  162. package/.next/static/chunks/app/api/sessions/[id]/route-019391920005654f.js +1 -0
  163. package/.next/static/chunks/app/api/sessions/[id]/send/route-019391920005654f.js +1 -0
  164. package/.next/static/chunks/app/api/sessions/patches/route-019391920005654f.js +1 -0
  165. package/.next/static/chunks/app/api/sessions/route-019391920005654f.js +1 -0
  166. package/.next/static/chunks/app/api/setup-labels/route-019391920005654f.js +1 -0
  167. package/.next/static/chunks/app/api/spawn/route-019391920005654f.js +1 -0
  168. package/.next/static/chunks/app/api/verify/route-019391920005654f.js +1 -0
  169. package/.next/static/chunks/app/api/webhooks/[...slug]/route-019391920005654f.js +1 -0
  170. package/.next/static/chunks/app/apple-icon/route-019391920005654f.js +1 -0
  171. package/.next/static/chunks/app/dev/terminal-test/page-4912fa9e6459f124.js +1 -0
  172. package/.next/static/chunks/app/error-670f1d8bf2b6859c.js +1 -0
  173. package/.next/static/chunks/app/{global-error-7b5c8ae45329c659.js → global-error-ca06d2b1be2d4ae0.js} +1 -1
  174. package/.next/static/chunks/app/icon/route-019391920005654f.js +1 -0
  175. package/.next/static/chunks/app/icon-192/route-019391920005654f.js +1 -0
  176. package/.next/static/chunks/app/icon-512/route-019391920005654f.js +1 -0
  177. package/.next/static/chunks/app/layout-ddf79478d9a673bb.js +1 -0
  178. package/.next/static/chunks/app/loading-019391920005654f.js +1 -0
  179. package/.next/static/chunks/app/manifest.webmanifest/route-019391920005654f.js +1 -0
  180. package/.next/static/chunks/app/{not-found-3772c2e09c29d80f.js → not-found-824d5d3c6e296eeb.js} +1 -1
  181. package/.next/static/chunks/app/orchestrators/page-4da04720a09483d2.js +1 -0
  182. package/.next/static/chunks/app/page-abf3e3c98cac072f.js +1 -0
  183. package/.next/static/chunks/app/prs/page-46455c406183ffbf.js +1 -0
  184. package/.next/static/chunks/app/sessions/[id]/error-eb0973907da68a37.js +1 -0
  185. package/.next/static/chunks/app/sessions/[id]/loading-019391920005654f.js +1 -0
  186. package/.next/static/chunks/app/sessions/[id]/{not-found-3772c2e09c29d80f.js → not-found-824d5d3c6e296eeb.js} +1 -1
  187. package/.next/static/chunks/app/sessions/[id]/page-7eb67fd32f39b15f.js +1 -0
  188. package/.next/static/chunks/app/test-direct/page-1fd63edb9a9ca8be.js +1 -0
  189. package/.next/static/chunks/{df4ed4d4.6a752eba3933e9a8.js → df4ed4d4.b6997d8b8ce9d79b.js} +1 -1
  190. package/.next/static/chunks/framework-7060e2ac4971c604.js +1 -0
  191. package/.next/static/chunks/main-app-690acf9d5d2050c9.js +1 -0
  192. package/.next/static/chunks/main-ed1610689fbd6f0d.js +1 -0
  193. package/.next/static/chunks/pages/_app-f4baf4dbe88f6f54.js +1 -0
  194. package/.next/static/chunks/pages/_error-a7f6723f42093f29.js +1 -0
  195. package/.next/static/chunks/{webpack-e12ceebeb7a1cc7e.js → webpack-ab6c08c78ffc8113.js} +1 -1
  196. package/.next/static/css/a5398483e6b75ad3.css +1 -0
  197. package/LICENSE +21 -0
  198. package/dist-server/direct-terminal-ws.js +33 -236
  199. package/dist-server/mux-websocket.js +516 -0
  200. package/dist-server/start-all.js +0 -2
  201. package/next.config.js +1 -0
  202. package/package.json +27 -27
  203. package/.next/server/chunks/27.js +0 -438
  204. package/.next/server/chunks/377.js +0 -1
  205. package/.next/server/chunks/393.js +0 -1
  206. package/.next/server/chunks/639.js +0 -6
  207. package/.next/server/chunks/693.js +0 -1
  208. package/.next/server/chunks/705.js +0 -22
  209. package/.next/server/chunks/787.js +0 -29
  210. package/.next/server/chunks/796.js +0 -1
  211. package/.next/server/chunks/934.js +0 -1
  212. package/.next/server/chunks/956.js +0 -9
  213. package/.next/static/chunks/1250-e7cf6b069fbb03ed.js +0 -1
  214. package/.next/static/chunks/2205.498806f73783aa54.js +0 -1
  215. package/.next/static/chunks/3698-9c12c45b8184022c.js +0 -1
  216. package/.next/static/chunks/6381.1541d5695a727108.js +0 -1
  217. package/.next/static/chunks/7505-2d2422d31862995f.js +0 -1
  218. package/.next/static/chunks/8597-1385f90ec1cebf47.js +0 -1
  219. package/.next/static/chunks/8762.f3d526855363db16.js +0 -1
  220. package/.next/static/chunks/a51c26f2-a21e680a5df6764e.js +0 -1
  221. package/.next/static/chunks/app/_not-found/page-2224bc1d3dce1b3e.js +0 -1
  222. package/.next/static/chunks/app/api/backlog/route-2224bc1d3dce1b3e.js +0 -1
  223. package/.next/static/chunks/app/api/events/route-2224bc1d3dce1b3e.js +0 -1
  224. package/.next/static/chunks/app/api/issues/route-2224bc1d3dce1b3e.js +0 -1
  225. package/.next/static/chunks/app/api/observability/route-2224bc1d3dce1b3e.js +0 -1
  226. package/.next/static/chunks/app/api/orchestrators/route-2224bc1d3dce1b3e.js +0 -1
  227. package/.next/static/chunks/app/api/projects/route-2224bc1d3dce1b3e.js +0 -1
  228. package/.next/static/chunks/app/api/prs/[id]/merge/route-2224bc1d3dce1b3e.js +0 -1
  229. package/.next/static/chunks/app/api/runtime/terminal/route-2224bc1d3dce1b3e.js +0 -1
  230. package/.next/static/chunks/app/api/sessions/[id]/kill/route-2224bc1d3dce1b3e.js +0 -1
  231. package/.next/static/chunks/app/api/sessions/[id]/message/route-2224bc1d3dce1b3e.js +0 -1
  232. package/.next/static/chunks/app/api/sessions/[id]/remap/route-2224bc1d3dce1b3e.js +0 -1
  233. package/.next/static/chunks/app/api/sessions/[id]/restore/route-2224bc1d3dce1b3e.js +0 -1
  234. package/.next/static/chunks/app/api/sessions/[id]/route-2224bc1d3dce1b3e.js +0 -1
  235. package/.next/static/chunks/app/api/sessions/[id]/send/route-2224bc1d3dce1b3e.js +0 -1
  236. package/.next/static/chunks/app/api/sessions/route-2224bc1d3dce1b3e.js +0 -1
  237. package/.next/static/chunks/app/api/setup-labels/route-2224bc1d3dce1b3e.js +0 -1
  238. package/.next/static/chunks/app/api/spawn/route-2224bc1d3dce1b3e.js +0 -1
  239. package/.next/static/chunks/app/api/verify/route-2224bc1d3dce1b3e.js +0 -1
  240. package/.next/static/chunks/app/api/webhooks/[...slug]/route-2224bc1d3dce1b3e.js +0 -1
  241. package/.next/static/chunks/app/apple-icon/route-2224bc1d3dce1b3e.js +0 -1
  242. package/.next/static/chunks/app/dev/terminal-test/page-ac0ce5b046fcad82.js +0 -1
  243. package/.next/static/chunks/app/error-4896c9d3b7681a80.js +0 -1
  244. package/.next/static/chunks/app/icon/route-2224bc1d3dce1b3e.js +0 -1
  245. package/.next/static/chunks/app/icon-192/route-2224bc1d3dce1b3e.js +0 -1
  246. package/.next/static/chunks/app/icon-512/route-2224bc1d3dce1b3e.js +0 -1
  247. package/.next/static/chunks/app/layout-023f2083204e4f68.js +0 -1
  248. package/.next/static/chunks/app/loading-2224bc1d3dce1b3e.js +0 -1
  249. package/.next/static/chunks/app/manifest.webmanifest/route-2224bc1d3dce1b3e.js +0 -1
  250. package/.next/static/chunks/app/orchestrators/page-df85236df674fc5a.js +0 -1
  251. package/.next/static/chunks/app/page-e97da633b7ef25f2.js +0 -1
  252. package/.next/static/chunks/app/prs/page-8cc0fce584d238c5.js +0 -1
  253. package/.next/static/chunks/app/sessions/[id]/error-90bc99b777fecabf.js +0 -1
  254. package/.next/static/chunks/app/sessions/[id]/loading-2224bc1d3dce1b3e.js +0 -1
  255. package/.next/static/chunks/app/sessions/[id]/page-c9c95a8604786cff.js +0 -1
  256. package/.next/static/chunks/app/test-direct/page-16ceeb9f7664394a.js +0 -1
  257. package/.next/static/chunks/framework-f8b8ba0f71d38056.js +0 -1
  258. package/.next/static/chunks/main-2bc85c765bf1fc49.js +0 -1
  259. package/.next/static/chunks/main-app-93fb36c3bd1a6739.js +0 -1
  260. package/.next/static/chunks/pages/_app-a0b975794f15bd68.js +0 -1
  261. package/.next/static/chunks/pages/_error-5f4e3b5eea57917d.js +0 -1
  262. package/.next/static/css/908f93fdd7ffba42.css +0 -1
  263. package/.next/static/oB_TdR1wCu7ot1D0AG_cw/_buildManifest.js +0 -1
  264. package/dist-server/terminal-websocket.js +0 -375
  265. /package/.next/static/{oB_TdR1wCu7ot1D0AG_cw → OyzSw2fQpoJHXyoBWoZ2X}/_ssgManifest.js +0 -0
@@ -1,438 +0,0 @@
1
- exports.id=27,exports.ids=[27],exports.modules={8819:(a,b,c)=>{"use strict";c.d(b,{Ag:()=>t,CK:()=>s,CM:()=>h,D8:()=>r,DD:()=>p,Fx:()=>q,N_:()=>j,PE:()=>e,SB:()=>g,U1:()=>o,V1:()=>f,bz:()=>n,kw:()=>u,qX:()=>l,tT:()=>m,u3:()=>d,zi:()=>k});let d={ACTIVE:"active",READY:"ready",IDLE:"idle",WAITING_INPUT:"waiting_input",BLOCKED:"blocked",EXITED:"exited"},e=3e5,f=3e4,g={SPAWNING:"spawning",WORKING:"working",PR_OPEN:"pr_open",CI_FAILED:"ci_failed",REVIEW_PENDING:"review_pending",CHANGES_REQUESTED:"changes_requested",APPROVED:"approved",MERGEABLE:"mergeable",MERGED:"merged",CLEANUP:"cleanup",NEEDS_INPUT:"needs_input",STUCK:"stuck",ERRORED:"errored",IDLE:"idle",KILLED:"killed",DONE:"done",TERMINATED:"terminated"},h=new Set(["killed","terminated","done","cleanup","errored","merged"]),i=new Set(["exited"]),j=new Set(["merged"]);function k(a){return h.has(a.status)||null!==a.activity&&i.has(a.activity)}function l(a){return k(a)&&!j.has(a.status)}function m(a,b,c){if(a.metadata?.role==="orchestrator"||a.id.endsWith("-orchestrator"))return!0;if(!b)return!1;let d=b.replace(/[.*+?^${}()|[\]\\]/g,"\\$&");if(!RegExp(`^${d}-orchestrator-\\d+$`).test(a.id))return!1;if(c){for(let d of c)if(d!==b&&RegExp(`^${d.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}-\\d+$`).test(a.id))return!1}return!0}let n={OPEN:"open",MERGED:"merged",CLOSED:"closed"},o={PENDING:"pending",PASSING:"passing",FAILING:"failing",NONE:"none"};function p(a){if(a)return"permissionless"!==a&&"default"!==a&&"auto-edit"!==a&&"suggest"!==a?"skip"===a?"permissionless":void 0:a}function q(a){if(!a||"object"!=typeof a)return!1;let b=a.message?.toLowerCase()||"";return b.includes("issue")&&(b.includes("not found")||b.includes("does not exist"))||b.includes("no issue found")||b.includes("could not find issue")||b.includes("could not resolve to an issue")||b.includes("no issue with identifier")||b.includes("invalid issue format")}class r extends Error{constructor(a,b){super(`Session ${a} cannot be restored: ${b}`),this.sessionId=a,this.reason=b,this.name="SessionNotRestorableError"}}class s extends Error{constructor(a,b){super(`Workspace missing at ${a}${b?`: ${b}`:""}`),this.path=a,this.detail=b,this.name="WorkspaceMissingError"}}class t extends Error{constructor(a){super(`Session not found: ${a}`),this.sessionId=a,this.name="SessionNotFoundError"}}class u extends Error{constructor(a){super(a??"No agent-orchestrator.yaml found. Run `ao start` to create one."),this.name="ConfigNotFoundError"}}},18699:(a,b,c)=>{"use strict";c.d(b,{u3:()=>d.u3,U1:()=>d.U1,V1:()=>d.V1,$J:()=>aS,PE:()=>d.PE,C3:()=>be,Ag:()=>d.Ag,D8:()=>d.D8,CM:()=>d.CM,CK:()=>d.CK,Hr:()=>ah,Te:()=>bh,Bm:()=>ba,Gf:()=>aI,C1:()=>aQ,R:()=>R,Sk:()=>aJ,Qu:()=>az,o:()=>a$,Pp:()=>function a(b,c=0){let d=" ".repeat(c),e="atomic"===b.kind?"[ATOMIC]":"composite"===b.kind?"[COMPOSITE]":"",f="ready"!==b.status?` (${b.status})`:"",g=`${d}${b.id}. ${e} ${b.description}${f}`;return b.children.length>0&&(g+="\n"+b.children.map(b=>a(b,c+1)).join("\n")),g},yA:()=>a1,cc:()=>m,Vo:()=>bb,Lg:()=>a_,A7:()=>a0,tT:()=>d.tT,Z9:()=>K,DD:()=>d.DD,Ah:()=>a9,XI:()=>a5,gi:()=>aK,Jy:()=>bc,fz:()=>a6,J0:()=>bn,TQ:()=>a3});var d=c(8819),e=c(73024),f=c(76760),g=c(48161),h=c(74249),i=c(64408),j=c(15143),k=c(77598);function l(a){let b=(0,e.realpathSync)(a),c=(0,f.dirname)(b);return(0,k.createHash)("sha256").update(c).digest("hex").slice(0,12)}function m(a){if(a.length<=4)return a.toLowerCase();let b=a.match(/[A-Z]/g);if(b&&b.length>1)return b.join("").toLowerCase();if(a.includes("-")||a.includes("_")){let b=a.includes("-")?"-":"_";return a.split(b).map(a=>a[0]).join("").toLowerCase()}return a.slice(0,3).toLowerCase()}function n(a,b){let c=function(a,b){let c=l(a),d=(0,f.basename)(b);return`${c}-${d}`}(a,b);return(0,f.join)(q("~/.agent-orchestrator"),c)}function o(a,b){return(0,f.join)(n(a,b),"sessions")}function p(a,b,c){let d=l(a);return`${d}-${b}-${c}`}function q(a){return a.startsWith("~/")?(0,f.join)((0,g.homedir)(),a.slice(2)):a}function r(a,b){let c=(0,f.join)(n(a,b),".origin"),d=(0,e.realpathSync)(a);if((0,e.existsSync)(c)){let f=(0,e.readFileSync)(c,"utf-8").trim();if(f!==d)throw Error(`Hash collision detected!
2
- Directory: ${n(a,b)}
3
- Expected config: ${d}
4
- Actual config: ${f}
5
- This is a rare hash collision. Please move one of the configs to a different directory.`)}else{let f=n(a,b);(0,e.mkdirSync)(f,{recursive:!0}),(0,e.writeFileSync)(c,d,"utf-8")}}function s(a,b,c){a.plugin||a.package||a.path||b.addIssue({code:i.eq.custom,message:`${c} config requires either 'plugin' (for built-ins) or 'package'/'path' (for external plugins)`}),a.package&&a.path&&b.addIssue({code:i.eq.custom,message:`${c} config cannot have both 'package' and 'path' - use one or the other`})}let t=j.Ik({auto:j.zM().default(!0),action:j.k5(["send-to-agent","notify","auto-merge"]).default("notify"),message:j.Yj().optional(),priority:j.k5(["urgent","action","warning","info"]).optional(),retries:j.ai().optional(),escalateAfter:j.KC([j.ai(),j.Yj()]).optional(),threshold:j.Yj().optional(),includeSummary:j.zM().optional()}),u=j.Ik({plugin:j.Yj().optional(),package:j.Yj().optional(),path:j.Yj().optional()}).passthrough().superRefine((a,b)=>s(a,b,"Tracker")),v=j.Ik({plugin:j.Yj().optional(),package:j.Yj().optional(),path:j.Yj().optional(),webhook:j.Ik({enabled:j.zM().default(!0),path:j.Yj().optional(),secretEnvVar:j.Yj().optional(),signatureHeader:j.Yj().optional(),eventHeader:j.Yj().optional(),deliveryHeader:j.Yj().optional(),maxBodyBytes:j.ai().int().positive().optional()}).optional()}).passthrough().superRefine((a,b)=>s(a,b,"SCM")),w=j.Ik({plugin:j.Yj().optional(),package:j.Yj().optional(),path:j.Yj().optional()}).passthrough().superRefine((a,b)=>s(a,b,"Notifier")),x=j.k5(["permissionless","default","auto-edit","suggest","skip"]).default("permissionless").transform(a=>"skip"===a?"permissionless":a),y=j.Ik({permissions:x,model:j.Yj().optional(),orchestratorModel:j.Yj().optional(),opencodeSessionId:j.Yj().optional()}).passthrough(),z=j.Ik({permissions:j.KC([j.k5(["permissionless","default","auto-edit","suggest"]),j.eu("skip")]).optional(),model:j.Yj().optional(),orchestratorModel:j.Yj().optional(),opencodeSessionId:j.Yj().optional()}).passthrough(),A=j.Ik({agent:j.Yj().optional()}).optional(),B=j.Ik({agent:j.Yj().optional(),agentConfig:z.optional()}).optional(),C=j.Ik({enabled:j.zM().default(!1),maxDepth:j.ai().min(1).max(5).default(3),model:j.Yj().default("claude-sonnet-4-20250514"),requireApproval:j.zM().default(!0)}).default({enabled:!1,maxDepth:3,model:"claude-sonnet-4-20250514",requireApproval:!0}),D=j.Ik({name:j.Yj().optional(),repo:j.Yj(),path:j.Yj(),defaultBranch:j.Yj().default("main"),sessionPrefix:j.Yj().regex(/^[a-zA-Z0-9_-]+$/,"sessionPrefix must match [a-zA-Z0-9_-]+").optional(),runtime:j.Yj().optional(),agent:j.Yj().optional(),workspace:j.Yj().optional(),tracker:u.optional(),scm:v.optional(),symlinks:j.YO(j.Yj()).optional(),postCreate:j.YO(j.Yj()).optional(),agentConfig:y.default({}),orchestrator:B,worker:B,reactions:j.g1(t.partial()).optional(),agentRules:j.Yj().optional(),agentRulesFile:j.Yj().optional(),orchestratorRules:j.Yj().optional(),orchestratorSessionStrategy:j.k5(["reuse","delete","ignore","delete-new","ignore-new","kill-previous"]).optional(),opencodeIssueSessionStrategy:j.k5(["reuse","delete","ignore"]).optional(),decomposer:C.optional()}),E=j.Ik({runtime:j.Yj().default("tmux"),agent:j.Yj().default("claude-code"),workspace:j.Yj().default("worktree"),notifiers:j.YO(j.Yj()).default([]),orchestrator:A,worker:A}),F=j.Ik({name:j.Yj(),source:j.k5(["registry","npm","local"]),package:j.Yj().optional(),version:j.Yj().optional(),path:j.Yj().optional(),enabled:j.zM().default(!0)}).superRefine((a,b)=>{"local"!==a.source||a.path||b.addIssue({code:i.eq.custom,path:["path"],message:"Local plugins require a path"}),"registry"!==a.source&&"npm"!==a.source||a.package||b.addIssue({code:i.eq.custom,path:["package"],message:"Registry and npm plugins require a package name"})}),G=j.Ik({port:j.ai().default(3e3),terminalPort:j.ai().optional(),directTerminalPort:j.ai().optional(),readyThresholdMs:j.ai().nonnegative().default(3e5),defaults:E.default({}),plugins:j.YO(F).default([]),projects:j.g1(j.Yj().regex(/^[a-zA-Z0-9_-]+$/,"Project ID must match [a-zA-Z0-9_-]+ (no dots, slashes, or special characters)"),D),notifiers:j.g1(w).default({}),notificationRouting:j.g1(j.YO(j.Yj())).default({}),reactions:j.g1(t).default({})});function H(a){return a.startsWith("~/")?(0,f.join)((0,g.homedir)(),a.slice(2)):a}function I(a,b){if(a){let b=a.split("/"),c=b[b.length-1]??a,d=c.match(/^ao-plugin-(?:runtime|agent|workspace|tracker|scm|notifier|terminal)-(.+)$/);return d?.[1]?d[1]:c}if(b){let a=b.split("/").filter(a=>a&&"."!==a&&".."!==a);return a[a.length-1]??b}return"unknown"}function J(a,b,c,d){if(!a.package&&!a.path)return null;a.path&&(a.path=H(a.path));let e=a.plugin;return a.plugin||(a.plugin=I(a.package,a.path)),{source:b,location:c,slot:d,package:a.package,path:a.path,expectedPluginName:e}}function K(a){let b=a??function(a){if(process.env.AO_CONFIG_PATH){let a=(0,f.resolve)(process.env.AO_CONFIG_PATH);if((0,e.existsSync)(a))return a}let b=a=>{for(let b of["agent-orchestrator.yaml","agent-orchestrator.yml"]){let c=(0,f.resolve)(a,b);if((0,e.existsSync)(c))return c}let c=(0,f.resolve)(a,"..");return c===a?null:b(c)},c=b(process.cwd());if(c)return c;for(let a of[(0,f.resolve)((0,g.homedir)(),".agent-orchestrator.yaml"),(0,f.resolve)((0,g.homedir)(),".agent-orchestrator.yml"),(0,f.resolve)((0,g.homedir)(),".config","agent-orchestrator","config.yaml")])if((0,e.existsSync)(a))return a;return null}();if(!b)throw new d.kw;let c=(0,e.readFileSync)(b,"utf-8"),i=function(a){var b;let c=G.parse(a);(b=c=function(a){for(let[b,c]of Object.entries(a.projects)){if(c.name||(c.name=b),!c.sessionPrefix){let a=(0,f.basename)(c.path);c.sessionPrefix=m(a)}let a=function(a){if("gitlab"===a.scm?.plugin)return"gitlab";let b=a.scm?.host;if("string"==typeof b&&b.toLowerCase().includes("gitlab")||"gitlab"===a.tracker?.plugin)return"gitlab";let c=a.tracker?.host;return"string"==typeof c&&c.toLowerCase().includes("gitlab")?"gitlab":"github"}(c);!c.scm&&c.repo.includes("/")&&(c.scm={plugin:a}),c.tracker||(c.tracker={plugin:a})}return a}(c=function(a){for(let b of Object.values(a.projects))b.path=H(b.path);for(let b of a.plugins??[])b.path&&(b.path=H(b.path));return a}(c))).reactions={"ci-failed":{auto:!0,action:"send-to-agent",message:"CI is failing on your PR. Run `gh pr checks` to see the failures, fix them, and push.",retries:2,escalateAfter:2},"changes-requested":{auto:!0,action:"send-to-agent",message:"There are review comments on your PR. Check with `gh pr view --comments` and `gh api` for inline comments. Address each one, push fixes, and reply.",escalateAfter:"30m"},"bugbot-comments":{auto:!0,action:"send-to-agent",message:"Automated review comments found on your PR. Fix the issues flagged by the bot.",escalateAfter:"30m"},"merge-conflicts":{auto:!0,action:"send-to-agent",message:"Your branch has merge conflicts. Rebase on the default branch and resolve them.",escalateAfter:"15m"},"approved-and-green":{auto:!1,action:"notify",priority:"action",message:"PR is ready to merge"},"agent-idle":{auto:!0,action:"send-to-agent",message:"You appear to be idle. If your task is not complete, continue working — write the code, commit, push, and create a PR. If you are blocked, explain what is blocking you.",retries:2,escalateAfter:"15m"},"agent-stuck":{auto:!0,action:"notify",priority:"urgent",threshold:"10m"},"agent-needs-input":{auto:!0,action:"notify",priority:"urgent"},"agent-exited":{auto:!0,action:"notify",priority:"urgent"},"all-complete":{auto:!0,action:"notify",priority:"info",includeSummary:!0},...b.reactions};let d=function(a){let b=[];for(let[c,d]of Object.entries(a.projects)){if(d.tracker){let a=J(d.tracker,`projects.${c}.tracker`,{kind:"project",projectId:c,configType:"tracker"},"tracker");a&&b.push(a)}if(d.scm){let a=J(d.scm,`projects.${c}.scm`,{kind:"project",projectId:c,configType:"scm"},"scm");a&&b.push(a)}}for(let[c,d]of Object.entries(a.notifiers??{}))if(d){let a=J(d,`notifiers.${c}`,{kind:"notifier",notifierId:c},"notifier");a&&b.push(a)}return b}(c=b);return d.length>0&&(c.plugins=function(a,b){let c=[...a??[]],d=new Set;for(let a of c)a.package&&d.add(`package:${a.package}`),a.path&&d.add(`path:${a.path}`);for(let a of b){let b=a.package?`package:${a.package}`:`path:${a.path}`;if(d.has(b)){let b=c.find(b=>a.package&&b.package===a.package||a.path&&b.path===a.path);b&&!1===b.enabled&&(b.enabled=!0);continue}d.add(b);let e=a.expectedPluginName??I(a.package,a.path);c.push({name:e,source:a.package?"npm":"local",package:a.package,path:a.path,enabled:!0})}return c}(c.plugins,d),c._externalPluginEntries=d),!function(a){let b=new Set,c={};for(let[d,e]of Object.entries(a.projects)){let a=(0,f.basename)(e.path);if(c[a]||(c[a]=[]),c[a].push(e.path),b.has(a)){let b=c[a].join(", ");throw Error(`Duplicate project ID detected: "${a}"
6
- Multiple projects have the same directory basename:
7
- ${b}
8
-
9
- To fix this, ensure each project path has a unique directory name.
10
- Alternatively, you can use the config key as a unique identifier.`)}b.add(a)}let d=new Set,e={};for(let[b,c]of Object.entries(a.projects)){let g=(0,f.basename)(c.path),h=c.sessionPrefix||m(g);if(d.has(h)){let d=e[h],f=a.projects[d];throw Error(`Duplicate session prefix detected: "${h}"
11
- Projects "${d}" and "${b}" would generate the same prefix.
12
-
13
- To fix this, add an explicit sessionPrefix to one of these projects:
14
-
15
- projects:
16
- ${d}:
17
- path: ${f?.path}
18
- sessionPrefix: ${h}1 # Add explicit prefix
19
- ${b}:
20
- path: ${c.path}
21
- sessionPrefix: ${h}2 # Add explicit prefix
22
- `)}d.add(h),e[h]=b}}(c),c}((0,h.qg)(c));return i.configPath=b,i}var L=c(73136);let M=["dist/index.js","index.js"],N=[{slot:"runtime",name:"tmux",pkg:"@aoagents/ao-plugin-runtime-tmux"},{slot:"runtime",name:"process",pkg:"@aoagents/ao-plugin-runtime-process"},{slot:"agent",name:"claude-code",pkg:"@aoagents/ao-plugin-agent-claude-code"},{slot:"agent",name:"codex",pkg:"@aoagents/ao-plugin-agent-codex"},{slot:"agent",name:"aider",pkg:"@aoagents/ao-plugin-agent-aider"},{slot:"agent",name:"opencode",pkg:"@aoagents/ao-plugin-agent-opencode"},{slot:"workspace",name:"worktree",pkg:"@aoagents/ao-plugin-workspace-worktree"},{slot:"workspace",name:"clone",pkg:"@aoagents/ao-plugin-workspace-clone"},{slot:"tracker",name:"github",pkg:"@aoagents/ao-plugin-tracker-github"},{slot:"tracker",name:"linear",pkg:"@aoagents/ao-plugin-tracker-linear"},{slot:"tracker",name:"gitlab",pkg:"@aoagents/ao-plugin-tracker-gitlab"},{slot:"scm",name:"github",pkg:"@aoagents/ao-plugin-scm-github"},{slot:"scm",name:"gitlab",pkg:"@aoagents/ao-plugin-scm-gitlab"},{slot:"notifier",name:"composio",pkg:"@aoagents/ao-plugin-notifier-composio"},{slot:"notifier",name:"desktop",pkg:"@aoagents/ao-plugin-notifier-desktop"},{slot:"notifier",name:"discord",pkg:"@aoagents/ao-plugin-notifier-discord"},{slot:"notifier",name:"openclaw",pkg:"@aoagents/ao-plugin-notifier-openclaw"},{slot:"notifier",name:"slack",pkg:"@aoagents/ao-plugin-notifier-slack"},{slot:"notifier",name:"webhook",pkg:"@aoagents/ao-plugin-notifier-webhook"},{slot:"terminal",name:"iterm2",pkg:"@aoagents/ao-plugin-terminal-iterm2"},{slot:"terminal",name:"web",pkg:"@aoagents/ao-plugin-terminal-web"}];function O(a,b,c){if("notifier"===a)for(let[d,e]of Object.entries(c.notifiers??{})){if(!e||"object"!=typeof e)continue;let f=e.plugin;if("string"==typeof f&&f.length>0?f===b:d===b)return function(a,b,c,d,e){if("package"in d&&"path"in d)throw Error(`In ${a} "${c}": both "package" and "path" are specified. Use "package" for npm plugins or "path" for local plugins, not both.`);let f=N.some(c=>c.slot===a&&c.name===b);if((d.package||f)&&"path"in d){let e=d.package?`npm package "${d.package}"`:`built-in plugin "${b}"`;throw Error(`In ${a} "${c}": "path" field conflicts with reserved plugin loading field. You're loading via ${e}, but also have a "path" field which would be stripped. Rename your configuration field to something else (e.g., "apiPath", "webhookPath").`)}let{plugin:g,package:h,path:i,...j}=d;return e?{...j,configPath:e}:j}(a,b,d,e,c.configPath)}}function P(a){return!!a&&"object"==typeof a&&!!(a.manifest&&"function"==typeof a.create)}function Q(a){if(P(a))return a;if(a&&"object"==typeof a&&"default"in a){let b=a.default;if(P(b))return b}return null}function R(){let a=new Map;return{register(b,c){var d,e;let{manifest:f}=b,g=(d=f.slot,e=f.name,`${d}:${e}`),h=b.create(c);a.set(g,{manifest:f,instance:h})},get(b,c){let d=a.get(`${b}:${c}`);return d?d.instance:null},list(b){let c=[];for(let[d,e]of a)d.startsWith(`${b}:`)&&c.push(e.manifest);return c},async loadBuiltins(a,b){let d=b??(a=>c(24507)(a));for(let b of N){let c;try{c=Q(await d(b.pkg))}catch{continue}if(c)try{let d=a?O(b.slot,b.name,a):void 0;this.register(c,d)}catch(a){process.stderr.write(`[plugin-registry] Failed to load built-in plugin "${b.name}": ${a}
23
- `)}}},async loadFromConfig(a,b){await this.loadBuiltins(a,b);let d=b??(a=>c(24507)(a)),g=function(a){let b=new Map;if(!a)return b;for(let c of a){let a=c.package?`package:${c.package}`:`path:${c.path}`,d=b.get(a);d?d.push(c):b.set(a,[c])}return b}(a._externalPluginEntries);for(let b of a.plugins??[]){if(!1===b.enabled)continue;let c=function(a,b){switch(a.source){case"local":{if(!a.path)return null;let c=function(a){let b;if(!(0,e.existsSync)(a))return null;try{b=(0,e.statSync)(a)}catch{return null}if(b.isFile())return a;if(!b.isDirectory())return null;let c=(0,f.join)(a,"package.json");if((0,e.existsSync)(c))try{let b=(0,e.readFileSync)(c,"utf-8"),d=JSON.parse(b),g=function(a){if("string"==typeof a)return a;if(!a||"object"!=typeof a)return null;let b=a["."];if("string"==typeof b)return b;if(b&&"object"==typeof b){let a=b.import;if("string"==typeof a)return a;let c=b.default;if("string"==typeof c)return c}let c=a.import;if("string"==typeof c)return c;let d=a.default;return"string"==typeof d?d:null}(d.exports);if(g){let b=(0,f.resolve)(a,g);if((0,e.existsSync)(b))return b}if("string"==typeof d.module){let b=(0,f.resolve)(a,d.module);if((0,e.existsSync)(b))return b}if("string"==typeof d.main){let b=(0,f.resolve)(a,d.main);if((0,e.existsSync)(b))return b}}catch{}for(let b of M){let c=(0,f.join)(a,b);if((0,e.existsSync)(c))return c}return null}(function(a,b){if((0,f.isAbsolute)(a))return a;let c=b?(0,f.dirname)(b):process.cwd();return(0,f.resolve)(c,a)}(a.path,b.configPath));return c?(0,L.pathToFileURL)(c).href:null}case"registry":case"npm":var c;return a.package??(!(c=a.name)||c.startsWith(".")||c.startsWith("/")?null:c.startsWith("@")||c.includes("/")?c:null);default:return null}}(b,a);if(!c){process.stderr.write(`[plugin-registry] Could not resolve specifier for plugin "${b.name}" (source: ${b.source})
24
- `);continue}try{let e=Q(await d(c));if(!e)continue;for(let d of b.package?g.get(`package:${b.package}`)??[]:b.path?g.get(`path:${b.path}`)??[]:[])try{var h=e.manifest;if(d.expectedPluginName&&d.expectedPluginName!==h.name){let a=d.package?"package":"path";throw Error(`Plugin manifest.name mismatch at ${d.source}: expected "${d.expectedPluginName}" but ${a} "${c}" has manifest.name "${h.name}". Either update the 'plugin' field to match the actual manifest.name, or remove it to auto-infer.`)}!function(a,b,c){let{location:d,slot:e,source:f}=b;if("project"===d.kind){let{projectId:b,configType:e}=d,f=c.projects[b];f?.[e]&&(f[e].plugin=a.name)}else if("notifier"===d.kind){let{notifierId:b}=d,e=c.notifiers[b];e&&(e.plugin=a.name)}a.slot!==e&&process.stderr.write(`[plugin-registry] Plugin at ${f} has slot "${a.slot}" but was configured as "${e}". The plugin will be registered under its declared slot "${a.slot}".
25
- `)}(e.manifest,d,a)}catch(a){process.stderr.write(`[plugin-registry] Config validation failed for ${d.source}: ${a}
26
- `)}let f=O(e.manifest.slot,e.manifest.name,a);this.register(e,f)}catch(a){process.stderr.write(`[plugin-registry] Failed to load plugin "${c}": ${a}
27
- `)}}}}}function S(a,b){let c=`${a}.tmp.${process.pid}.${Date.now()}`;(0,e.writeFileSync)(c,b,"utf-8"),(0,e.renameSync)(c,a)}function T(a){let b={};for(let c of a.split("\n")){let a=c.trim();if(!a||a.startsWith("#"))continue;let d=a.indexOf("=");if(-1===d)continue;let e=a.slice(0,d).trim(),f=a.slice(d+1).trim();e&&(b[e]=f)}return b}function U(a){return Object.entries(a).filter(([,a])=>void 0!==a&&""!==a).map(([a,b])=>`${a}=${b}`).join("\n")+"\n"}let V=/^[a-zA-Z0-9_-]+$/;function W(a){if(!V.test(a))throw Error(`Invalid session ID: ${a}`)}function X(a,b){return W(b),(0,f.join)(a,b)}function Y(a,b){let c=X(a,b);return(0,e.existsSync)(c)?T((0,e.readFileSync)(c,"utf-8")):null}function Z(a,b,c){let d=X(a,b);(0,e.mkdirSync)((0,f.dirname)(d),{recursive:!0});let g={worktree:c.worktree,branch:c.branch,status:c.status};c.tmuxName&&(g.tmuxName=c.tmuxName),c.issue&&(g.issue=c.issue),c.pr&&(g.pr=c.pr),c.prAutoDetect&&(g.prAutoDetect=c.prAutoDetect),c.summary&&(g.summary=c.summary),c.project&&(g.project=c.project),c.agent&&(g.agent=c.agent),c.createdAt&&(g.createdAt=c.createdAt),c.runtimeHandle&&(g.runtimeHandle=c.runtimeHandle),c.restoredAt&&(g.restoredAt=c.restoredAt),c.role&&(g.role=c.role),void 0!==c.dashboardPort&&(g.dashboardPort=String(c.dashboardPort)),void 0!==c.terminalWsPort&&(g.terminalWsPort=String(c.terminalWsPort)),void 0!==c.directTerminalWsPort&&(g.directTerminalWsPort=String(c.directTerminalWsPort)),c.opencodeSessionId&&(g.opencodeSessionId=c.opencodeSessionId),c.pinnedSummary&&(g.pinnedSummary=c.pinnedSummary),S(d,U(g))}function $(a,b,c){let d=X(a,b),g={};for(let[a,b]of((0,e.existsSync)(d)&&(g=T((0,e.readFileSync)(d,"utf-8"))),Object.entries(c)))if(void 0!==b)if(""===b){let{[a]:b,...c}=g;g=c}else g[a]=b;(0,e.mkdirSync)((0,f.dirname)(d),{recursive:!0}),S(d,U(g))}function _(a,b,c=!0){let d=X(a,b);if((0,e.existsSync)(d)){if(c){let c=(0,f.join)(a,"archive");(0,e.mkdirSync)(c,{recursive:!0});let g=new Date().toISOString().replace(/[:.]/g,"-"),h=(0,f.join)(c,`${b}_${g}`);(0,e.writeFileSync)(h,(0,e.readFileSync)(d,"utf-8"))}(0,e.unlinkSync)(d)}}function aa(a,b){W(b);let c=(0,f.join)(a,"archive");if(!(0,e.existsSync)(c))return null;let d=`${b}_`,g=null;for(let a of(0,e.readdirSync)(c)){if(!a.startsWith(d))continue;let b=a[d.length];!b||b<"0"||b>"9"||(!g||a>g)&&(g=a)}if(!g)return null;try{return T((0,e.readFileSync)((0,f.join)(c,g),"utf-8"))}catch{return null}}function ab(a){return(0,e.existsSync)(a)?(0,e.readdirSync)(a).filter(b=>{if("archive"===b||b.startsWith(".")||!V.test(b))return!1;try{return(0,e.statSync)((0,f.join)(a,b)).isFile()}catch{return!1}}):[]}function ac(a,b){let c=X(a,b);(0,e.mkdirSync)((0,f.dirname)(c),{recursive:!0});try{let a=(0,e.openSync)(c,e.constants.O_WRONLY|e.constants.O_CREAT|e.constants.O_EXCL);return(0,e.closeSync)(a),!0}catch{return!1}}var ad=c(31421),ae=c(57975);let af=`You are an AI coding agent managed by the Agent Orchestrator (ao).
28
-
29
- ## Session Lifecycle
30
- - You are running inside a managed session. Focus on the assigned task.
31
- - When you finish your work, create a PR and push it. The orchestrator will handle CI monitoring and review routing.
32
- - If you're told to take over or continue work on an existing PR, run \`ao session claim-pr <pr-number-or-url>\` from inside this session before making changes.
33
- - If CI fails, the orchestrator will send you the failures — fix them and push again.
34
- - If reviewers request changes, the orchestrator will forward their comments — address each one, push fixes, and reply to the comments.
35
-
36
- ## Git Workflow
37
- - Always create a feature branch from the default branch (never commit directly to it).
38
- - Use conventional commit messages (feat:, fix:, chore:, etc.).
39
- - Push your branch and create a PR when the implementation is ready.
40
- - Keep PRs focused — one issue per PR.
41
-
42
- ## PR Best Practices
43
- - Write a clear PR title and description explaining what changed and why.
44
- - Link the issue in the PR description so it auto-closes when merged.
45
- - If the repo has CI checks, make sure they pass before requesting review.
46
- - Respond to every review comment, even if just to acknowledge it.`,ag=/^ses_[A-Za-z0-9_-]+$/;function ah(a){if("string"!=typeof a)return;let b=a.trim();if(0!==b.length)return ag.test(b)?b:void 0}let ai=/github\.com\/([^/]+)\/([^/]+)\/pull\/(\d+)/,aj=/\/(\d+)$/,ak=new Set(["spawning","working","pr_open","ci_failed","review_pending","changes_requested","approved","mergeable","merged","cleanup","needs_input","stuck","errored","killed","done","terminated"]);function al(a){try{return JSON.parse(a)}catch{return null}}function am(a,b,c){return(0,d.tT)({id:a,metadata:b},c)?"orchestrator":"worker"}function an(a){let{role:b,project:c,defaults:e,persistedAgent:f,spawnAgentOverride:g}=a,h="orchestrator"===b?c.orchestrator:c.worker,i="orchestrator"===b?e.orchestrator:e.worker,j=c.agentConfig??{},k=h?.agentConfig??{},l=f||("worker"===b?g??h?.agent??c.agent??i?.agent??e.agent:h?.agent??c.agent??i?.agent??e.agent),m={...j};for(let[a,b]of Object.entries(k))void 0!==b&&(m[a]=b);let n="orchestrator"===b?k.orchestratorModel??k.model??j.orchestratorModel??j.model:k.model??j.model;void 0!==n&&(m.model=n);let o=(0,d.DD)("string"==typeof m.permissions?m.permissions:void 0);void 0!==o&&(m.permissions=o);let p="string"==typeof m.subagent?m.subagent:void 0;return{role:b,agentName:l,agentConfig:m,model:n,permissions:o,subagent:p}}let ao=(0,ae.promisify)(ad.execFile);async function ap(a){let b,c=ah(a);if(c){for(let a of[0,200,600]){a>0&&await new Promise(b=>setTimeout(b,a));try{await ao("opencode",["session","delete",c],{timeout:3e4});return}catch(a){if(function(a){if(!(a instanceof Error))return!1;let b=[a.message,a.stderr,a.stdout].filter(Boolean).join("\n");return/session not found/i.test(b)}(a))return;b=a}}throw b instanceof Error?b:Error(String(b))}}async function aq(a=1e4){try{let{stdout:b}=await ao("opencode",["session","list","--format","json"],{timeout:a}),c=al(b);if(!Array.isArray(c))return[];return c.flatMap(a=>{let b;if(!a||"object"!=typeof a)return[];let c="string"==typeof a.title?a.title:"",d=ah(a.id);if(!d)return[];let e=a.updated;if("number"==typeof e&&Number.isFinite(e))b=e;else if("string"==typeof e){let a=Date.parse(e);Number.isNaN(a)||(b=a)}return[{id:d,title:c,...void 0!==b?{updatedAt:b}:{}}]})}catch{return[]}}async function ar(a,b=1e4,c){let d=await (c??aq(b)),e=`AO:${a}`;return d.filter(a=>a.title===e).sort((a,b)=>{let c=a.updatedAt??-1/0,d=b.updatedAt??-1/0;return c===d?0:d-c}).map(a=>a.id)}async function as(a,b,c){return(await ar(a,b,c))[0]}function at(a){return a.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}let au=new Set(["pr_open","ci_failed","review_pending","changes_requested","approved","mergeable"]),av=new Set([...au,"merged"]);function aw(a){return new Promise(b=>setTimeout(b,a))}async function ax(a){try{let{stdout:b}=await ao("tmux",["display-message","-p","-t",a,"#{pane_current_command}"],{timeout:5e3}),c=b.trim();return c.length>0?c:null}catch{return null}}function ay(a,b,c,d,e){return function(a,b,c={}){var d;return{id:a,projectId:b.project??c.projectId??"",status:c.status??("starting"===(d=b.status)?"working":d&&ak.has(d)?d:"spawning"),activity:c.activity??null,branch:b.branch||null,issueId:b.issue||null,pr:b.pr?(()=>{let a=function(a){let b=a.match(ai);if(b){let[,c,d,e]=b;return{owner:c,repo:d,number:parseInt(e,10),url:a}}let c=a.match(aj);return c?{owner:"",repo:"",number:parseInt(c[1],10),url:a}:null}(b.pr);return{number:a?.number??0,url:b.pr,title:"",owner:a?.owner??"",repo:a?.repo??"",branch:b.branch??"",baseBranch:"",isDraft:!1}})():null,workspacePath:b.worktree||null,runtimeHandle:void 0!==c.runtimeHandle?c.runtimeHandle:b.runtimeHandle?al(b.runtimeHandle):null,agentInfo:b.summary?{summary:b.summary,agentSessionId:null}:null,createdAt:b.createdAt?new Date(b.createdAt):c.createdAt??new Date,lastActivityAt:c.lastActivityAt??new Date,restoredAt:c.restoredAt??(b.restoredAt?new Date(b.restoredAt):void 0),metadata:b}}(a,b,{projectId:c,createdAt:d,lastActivityAt:e??new Date})}function az(a){let{config:b,registry:c}=a;function h(a){return o(b.configPath,a.path)}function i(a){return(0,f.resolve)(a).replace(/\/$/,"")}function j(a,c,d){return!!a&&i(d)!==i(a.path)&&(function(a,c){var d,e;let h=[(d=b.configPath,e=a.path,(0,f.join)(n(d,e),"worktrees"))],i=new Set;for(let b of(c&&i.add(c),i.add((0,f.basename)(a.path)),i))h.push((0,f.join)((0,g.homedir)(),".worktrees",b));return h})(a,c).some(a=>(function(a,b){let c=i(a),d=i(b);return c===d||c.startsWith(`${d}/`)})(d,a))}function k(a){let b=(0,f.join)(a,"archive");if(!(0,e.existsSync)(b))return[];let c=new Set;for(let a of(0,e.readdirSync)(b)){let b=a.match(/^([a-zA-Z0-9_-]+)_\d/);b?.[1]&&c.add(b[1])}return[...c]}function l(a,b,c){return!!b&&(!!("orchestrator"===b.role||a.endsWith("-orchestrator"))||!!c&&RegExp(`^${at(c)}-orchestrator-\\d+$`).test(a))}function m(a,b,c){return l(b,c??{},a.sessionPrefix)}function q(a,b){let c={...a};for(let[a,d]of Object.entries(b))if(void 0!==d){if(""===d){let{[a]:b,...d}=c;c=d;continue}c[a]=d}return c}function s(a,b,c,d){let g=(0,f.join)(a,b),h=d;if(!h)try{h=(0,e.statSync)(g).mtime}catch{h=void 0}if($(a,b,c),h)try{(0,e.utimesSync)(g,h,h)}catch{}}function t(a,b,c){let d={...b,raw:{...b.raw}};if(!l(d.sessionName,d.raw,c))return d;let e={};return"orchestrator"!==d.raw.role&&(e.role="orchestrator"),d.raw.pr&&(e.pr=""),"off"!==d.raw.prAutoDetect&&(e.prAutoDetect="off"),av.has(d.raw.status??"")&&(e.status="working"),Object.keys(e).length>0&&(s(a,d.sessionName,e,d.modifiedAt),d.raw=q(d.raw,e)),d}function u(a){let b=Date.parse(a.raw.restoredAt??a.raw.createdAt??"");return a.modifiedAt?a.modifiedAt.getTime():Number.isNaN(b)?0:b}function v(a){let b=h(a);if(!(0,e.existsSync)(b))return[];let c=ab(b).flatMap(a=>{let c,d=Y(b,a);if(!d)return[];try{c=(0,e.statSync)((0,f.join)(b,a)).mtime}catch{}return[{sessionName:a,raw:d,modifiedAt:c}]});return function(a,b,c){let d=b.map(a=>({...a,raw:{...a.raw}})),e=new Map;for(let b of d){if(l(b.sessionName,b.raw,c)){b.raw=t(a,b,c).raw;continue}let d=b.raw.pr;if(!d)continue;let f=e.get(d)??[];f.push(b),e.set(d,f)}for(let b of e.values()){if(b.length<2)continue;let[c,...d]=[...b].sort((a,b)=>{let c=Number(au.has(b.raw.status??""))-Number(au.has(a.raw.status??""));if(0!==c)return c;let d=u(b)-u(a);return 0!==d?d:b.sessionName.localeCompare(a.sessionName)});for(let b of d){let c={pr:"",prAutoDetect:"off",...au.has(b.raw.status??"")?{status:"working"}:{}};s(a,b.sessionName,c,b.modifiedAt),b.raw=q(b.raw,c)}}return d}(b,c,a.sessionPrefix)}function w(a,b){!function(a,b,c){let d;W(b);let g=(0,f.join)(a,"archive");if(!(0,e.existsSync)(g))return;let h=`${b}_`,i=null;for(let a of(0,e.readdirSync)(g)){if(!a.startsWith(h))continue;let b=a[h.length];!b||b<"0"||b>"9"||(!i||a>i)&&(i=a)}if(!i)return;let j=(0,f.join)(g,i);try{d=T((0,e.readFileSync)(j,"utf-8"))}catch{return!1}for(let[a,b]of Object.entries(c))if(void 0!==b)if(""===b){let{[a]:b,...c}=d;d=c}else d[a]=b;S(j,U(d))}(a,b,{opencodeSessionId:"",opencodeCleanedAt:new Date().toISOString()})}function x(a){let b=a=>{let b=a.match(/-(\d+)$/);if(!b)return;let c=Number.parseInt(b[1],10);return Number.isNaN(c)?void 0:c};return[...a].sort((a,c)=>{let d=b(a),e=b(c);return void 0!==d&&void 0!==e&&d!==e?e-d:void 0!==d&&void 0===e?-1:void 0===d&&void 0!==e?1:c.localeCompare(a)})}async function y(a){let{sessionsDir:b,criteria:c,strategy:d,includeTitleDiscoveryForSessionId:e=!1}=a;if("ignore"===d)return;let f=function(a,b){let c=[],d=(a,d)=>{if(!d||"opencode"!==d.agent||void 0!==b.issueId&&d.issue!==b.issueId||void 0!==b.sessionId&&a!==b.sessionId)return;let e=ah(d?.opencodeSessionId);e&&c.push(e)};for(let b of x(ab(a)))d(b,Y(a,b));for(let b of x(k(a)))d(b,aa(a,b));return b.sessionId&&d(b.sessionId,aa(a,b.sessionId)),[...new Set(c)]}(b,c);if("delete"===d){for(let a of(e&&c.sessionId&&(f=[...f,...await ar(c.sessionId)]),[...new Set(f)]))await ap(a);return}return 0===f.length&&c.sessionId&&(f=await ar(c.sessionId)),f[0]}async function z(a){try{let{stdout:b}=await ao("git",["ls-remote","--heads","origin",`session/${a.sessionPrefix}-*`],{cwd:a.path,timeout:5e3});return b.split("\n").flatMap(b=>{let c=b.trim();if(!c)return[];let d=(c.split(/\s+/)[1]??"").match(RegExp(`refs/heads/session/${at(a.sessionPrefix)}-(\\d+)$`));if(!d)return[];let e=Number.parseInt(d[1],10);return Number.isNaN(e)?[]:[e]}).filter((a,b,c)=>c.indexOf(a)===b)}catch{return[]}}async function A(a,c){let d=new Set;for(let b of[...ab(c),...k(c)]){let c=function(a,b){let c=a.match(RegExp(`^${at(b)}-(\\d+)$`));if(!c)return;let d=Number.parseInt(c[1],10);return Number.isNaN(d)?void 0:d}(b,a.sessionPrefix);void 0!==c&&d.add(c)}for(let b of(await z(a)))d.add(b);let e=function(a,b){let c=0,d=RegExp(`^${at(b)}-(\\d+)$`);for(let b of a){let a=b.match(d);if(a){let b=parseInt(a[1],10);b>c&&(c=b)}}return c+1}([...d].map(b=>`${a.sessionPrefix}-${b}`),a.sessionPrefix);for(let f=0;f<1e4;f++){let f=`${a.sessionPrefix}-${e}`,g=b.configPath?p(b.configPath,a.sessionPrefix,e):void 0;if(!d.has(e)&&ac(c,f))return{num:e,sessionId:f,tmuxName:g};d.add(e),e+=1}throw Error(`Failed to reserve session ID after 10000 attempts (prefix: ${a.sessionPrefix})`)}function B(a,d){let e=c.get("runtime",a.runtime??b.defaults.runtime),f=c.get("agent",d??a.agent??b.defaults.agent),g=c.get("workspace",a.workspace??b.defaults.workspace);return{runtime:e,agent:f,workspace:g,tracker:a.tracker?.plugin?c.get("tracker",a.tracker.plugin):null,scm:a.scm?.plugin?c.get("scm",a.scm.plugin):null}}function C(a,c,d){return an({role:am(c,d,a.sessionPrefix),project:a,defaults:b.defaults,persistedAgent:d.agent})}async function D(a,b,c,d,e){if("opencode"!==d||ah(a.metadata.opencodeSessionId))return;let f=await as(b,1e4,e);f&&(a.metadata.opencodeSessionId=f,$(c,b,{opencodeSessionId:f}))}function E(a){for(let[c,d]of Object.entries(b.projects)){let b,g=h(d),i=Y(g,a);if(i){try{b=(0,e.statSync)((0,f.join)(g,a)).mtime}catch{b=void 0}return{raw:t(g,{sessionName:a,raw:i,modifiedAt:b},d.sessionPrefix).raw,sessionsDir:g,project:d,projectId:c}}}return null}function F(a){let b=E(a);if(!b)throw new d.Ag(a);return b}async function G(a,c,d,e,f,g,h){await D(a,c,d,f,h);let i=a.metadata.tmuxName?.trim(),j="string"==typeof i&&i.length>0,k=null!==a.runtimeHandle||j;k?!a.runtimeHandle&&j&&(a.runtimeHandle={id:i,runtimeName:e.runtime??b.defaults.runtime,data:{}}):a.runtimeHandle={id:c,runtimeName:e.runtime??b.defaults.runtime,data:{}},await I(a,g,k)}let H=new Set(["killed","done","merged","terminated","cleanup"]);async function I(a,c,d){if(H.has(a.status)){a.activity="exited";return}if(d&&a.runtimeHandle&&c.runtime)try{if(!await c.runtime.isAlive(a.runtimeHandle)){a.status="killed",a.activity="exited";return}}catch{}if(c.agent){try{let d=await c.agent.getActivityState(a,b.readyThresholdMs);null!==d&&(a.activity=d.state,d.timestamp&&d.timestamp>a.lastActivityAt&&(a.lastActivityAt=d.timestamp))}catch{}try{let b=await c.agent.getSessionInfo(a);b&&(a.agentInfo=b)}catch{}}}async function J(a){let c,d=Object.entries(b.projects).flatMap(([b,c])=>a&&b!==a?[]:v(c).map(a=>({sessionName:a.sessionName,projectId:b,raw:a.raw}))).map(async({sessionName:a,projectId:d,raw:g})=>{let i,j,k=b.projects[d];if(!k)return null;let l=h(k);try{let b=(0,f.join)(l,a),c=(0,e.statSync)(b);i=c.birthtime,j=c.mtime}catch{}let m=ay(a,g,d,i,j),n=C(k,a,g).agentName,o=B(k,n),p="opencode"===n?c??=aq():void 0,q=null,r=new Promise(a=>{q=setTimeout(a,12e3)}),s=G(m,a,l,k,n,o,p).catch(()=>{});try{await Promise.race([s,r])}finally{q&&clearTimeout(q)}return m});return(await Promise.all(d)).filter(a=>null!==a)}async function K(a){for(let[c,d]of Object.entries(b.projects)){let b,g,i=h(d),j=Y(i,a);if(!j)continue;try{let c=(0,f.join)(i,a),d=(0,e.statSync)(c);b=d.birthtime,g=d.mtime}catch{}let k=t(i,{sessionName:a,raw:j,modifiedAt:g},d.sessionPrefix),l=ay(a,k.raw,c,b,g),m=C(d,a,k.raw).agentName,n=B(d,m);return await G(l,a,i,d,m,n),l}return null}async function L(a,d){let{raw:e,sessionsDir:f,project:g,projectId:h}=F(a),i=C(g,a,e).agentName;if(e.runtimeHandle){let a=al(e.runtimeHandle);if(a){let d=c.get("runtime",a.runtimeName??(g?g.runtime??b.defaults.runtime:b.defaults.runtime));if(d)try{await d.destroy(a)}catch{}}}let k=e.worktree;if(k&&j(g,h,k)){let a=g?B(g).workspace:c.get("workspace",b.defaults.workspace);if(a)try{await a.destroy(k)}catch{}}let l=!1;if(d?.purgeOpenCode===!0&&"opencode"===i){let b=ah(e.opencodeSessionId)??await as(a,1e4);if(b)try{await ap(b),l=!0}catch{}}_(f,a,!0),l&&w(f,a)}async function M(a,c){let e={killed:[],skipped:[],errors:[]},f=await J(a),g=new Set(f.map(a=>`${a.projectId}:${a.id}`)),i=new Set,j=new Set,l=(a,b)=>`${a}:${b}`,n=a=>{let b=a.indexOf(":");return -1===b?{projectId:"",id:a}:{projectId:a.slice(0,b),id:a.slice(b+1)}},o=(a,b)=>{let c=l(a,b);j.delete(c),i.add(c)},p=(a,b)=>{let c=l(a,b);i.has(c)||j.add(c)},q=c?.purgeOpenCode!==!1;for(let a of f)try{let e=b.projects[a.projectId];if(!e||m(e,a.id,a.metadata)){p(a.projectId,a.id);continue}let f=B(e),g=!1;if(a.pr&&f.scm)try{let b=await f.scm.getPRState(a.pr);(b===d.bz.MERGED||b===d.bz.CLOSED)&&(g=!0)}catch{}if(!g&&a.issueId&&f.tracker)try{await f.tracker.isCompleted(a.issueId,e)&&(g=!0)}catch{}if(!g&&a.runtimeHandle&&f.runtime)try{await f.runtime.isAlive(a.runtimeHandle)||(g=!0)}catch{}g?(c?.dryRun||await L(a.id,{purgeOpenCode:q}),o(a.projectId,a.id)):p(a.projectId,a.id)}catch(b){e.errors.push({sessionId:a.id,error:b instanceof Error?b.message:String(b)})}for(let[d,f]of Object.entries(b.projects)){if(a&&d!==a)continue;let b=h(f);for(let a of k(b)){if(g.has(`${d}:${a}`))continue;let h=aa(b,a);if(!h)continue;if(m(f,a,h)){p(d,a);continue}let i=C(f,a,h).agentName,j=ah(h.opencodeSessionId);if("opencode"===i&&h.opencodeCleanedAt){p(d,a);continue}if("opencode"===i&&j&&q){if(!c?.dryRun)try{await ap(j),w(b,a)}catch(b){e.errors.push({sessionId:a,error:`Failed to delete OpenCode session ${j}: ${b instanceof Error?b.message:String(b)}`});continue}o(d,a)}else p(d,a)}}let r=[...i,...j],s=new Map;for(let a of r){let{id:b}=n(a);s.set(b,(s.get(b)??0)+1)}let t=a=>{let{projectId:b,id:c}=n(a);return(s.get(c)??0)>1?`${b}:${c}`:c};return e.killed=[...i].map(t),e.skipped=[...j].map(t),e}async function N(a,e){let{raw:f,sessionsDir:g,project:h}=F(a),i=C(h,a,f).agentName;if("opencode"===i&&!ah(f.opencodeSessionId)){let b=await as(a,1e4);b&&(f.opencodeSessionId=b,$(g,a,{opencodeSessionId:b}))}let j=f.runtimeHandle?al(f.runtimeHandle):null,k=j?.runtimeName??h.runtime??b.defaults.runtime,l=c.get("runtime",k);if(!l)throw Error(`No runtime plugin for session ${a}`);let m=c.get("agent",i);if(!m)throw Error(`No agent plugin for session ${a}`);let n=async a=>{try{return await l.getOutput(a,20)??""}catch{return""}},o=a=>{if(!a)return null;try{return m.detectActivity(a)}catch{return null}},p=a=>a.includes("Press up to edit queued messages"),q=async()=>{let a=ah(f.opencodeSessionId);if("opencode"!==i||!a)return;let b=await aq(1e4);return b.find(b=>b.id===a)?.updatedAt},r=async(a,b)=>{let c=a.runtimeHandle;if(!c)return;let d=Date.now()+b,e=null,f=0;for(;;){let[a,b,g,h]=await Promise.all([l.isAlive(c).catch(()=>!0),m.isProcessRunning(c).catch(()=>!0),n(c),"tmux"===c.runtimeName?ax(c.id):Promise.resolve(m.processName)]),i=g.trim().length>0,j=null===h||h===m.processName,k=i?g.trimEnd():null,o=null!==k&&k===e;if(a&&b&&j&&(p(g)||o)){if((f+=1)>=2)return}else f=0;if(e=k,Date.now()>=d)return;await aw(500)}},s=async a=>{let b=a.runtimeHandle;if(!b)return;let c=Date.now()+5e3;for(;;){let[a,d,e,f]=await Promise.all([l.isAlive(b).catch(()=>!0),m.isProcessRunning(b).catch(()=>!0),n(b),"tmux"===b.runtimeName?ax(b.id):Promise.resolve(m.processName)]),g=null===f||f===m.processName;if(a&&g&&(d||e.trim().length>0)||Date.now()>=c)return;await aw(500)}},t=async(b,c)=>{if(d.N_.has(c.status))throw Error(`Cannot send to session ${a}: ${b}`);try{let b=await O(a);return await s(b),b}catch(d){let c=d instanceof Error?d.message:String(d);throw Error(`Cannot send to session ${a}: ${b} (${c})`,{cause:d})}},u=async(b=!1)=>{let c=await K(a);if(!c)throw new d.Ag(a);let e=c.runtimeHandle??{id:a,runtimeName:k,data:{}},f=c.runtimeHandle?c:{...c,runtimeHandle:e};if(b||(0,d.qX)(f))return t(b?"session needed to be restarted before delivery":"session is not running",f);let[g,h]=await Promise.all([l.isAlive(e).catch(()=>!0),m.isProcessRunning(e).catch(()=>!0)]);return("spawning"===f.status&&g&&(await r(f,2e4),[g,h]=await Promise.all([l.isAlive(e).catch(()=>!0),m.isProcessRunning(e).catch(()=>!0)])),g&&h)?f:t(g?"agent process is not running":"runtime is not alive",f)},v=async b=>{let c=b.runtimeHandle;if(!c)throw Error(`Session ${a} has no runtime handle`);let d=await n(c),f=o(d)??b.activity,g=await q();await l.sendMessage(c,e);for(let a=1;a<=6;a++){await aw(500);let a=await n(c),e=o(a)??b.activity,h=await q();if(void 0!==g&&void 0!==h&&h>g||p(a)||a.length>0&&a!==d||"active"!==f&&"active"===e||"waiting_input"!==f&&"waiting_input"===e)break}},w=await u();try{await v(w)}catch(a){if(!(void 0===w.restoredAt&&!d.N_.has(w.status))){if(a instanceof Error)throw a;throw Error(String(a),{cause:a})}w=await u(!0);try{await v(w)}catch(a){if(a instanceof Error)throw a;throw Error(String(a),{cause:a})}}}async function O(a){let c,f,g,i=null,j=null,k=!1,l=E(a);if(l&&(i=l.raw,j=l.sessionsDir,c=l.project,f=l.projectId),!i)for(let[d,e]of Object.entries(b.projects)){let b=h(e),g=aa(b,a);if(g){i=g,j=b,c=e,f=d,k=!0;break}}if(!i||!j||!c||!f)throw new d.Ag(a);let m=C(c,a,i);if("opencode"===m.agentName&&!ah(i.opencodeSessionId)){let b=await as(a,1e4);if(!b)throw new d.D8(a,"OpenCode session mapping is missing");i={...i,opencodeSessionId:b},k||$(j,a,{opencodeSessionId:b})}let n=ay(a,i,f),o=B(c,m.agentName);if(await I(n,o,!0),!(0,d.qX)(n)){if(d.N_.has(n.status))throw new d.D8(a,`status is "${n.status}"`);throw new d.D8(a,"session is not in a terminal state")}if(k&&Z(j,a,{worktree:i.worktree??"",branch:i.branch??"",status:i.status??"killed",role:i.role,tmuxName:i.tmuxName,issue:i.issue,pr:i.pr,prAutoDetect:"off"===i.prAutoDetect?"off":"on"===i.prAutoDetect?"on":void 0,summary:i.summary,project:i.project,agent:i.agent,createdAt:i.createdAt,runtimeHandle:i.runtimeHandle,opencodeSessionId:i.opencodeSessionId,pinnedSummary:i.pinnedSummary}),!o.runtime)throw Error(`Runtime plugin '${c.runtime??b.defaults.runtime}' not found`);if(!o.agent)throw Error(`Agent plugin '${m.agentName}' not found`);let p=i.worktree||c.path;if(!(o.workspace?.exists?await o.workspace.exists(p):(0,e.existsSync)(p))){if(!o.workspace?.restore)throw new d.CK(p,"workspace plugin does not support restore");if(!n.branch)throw new d.CK(p,"branch metadata is missing");try{let b=await o.workspace.restore({projectId:f,project:c,sessionId:a,branch:n.branch},p);o.workspace.postCreate&&await o.workspace.postCreate(b,c)}catch(a){throw new d.CK(p,`restore failed: ${a instanceof Error?a.message:String(a)}`)}}if(n.runtimeHandle)try{await o.runtime.destroy(n.runtimeHandle)}catch{}let q={sessionId:a,projectConfig:{...c,agentConfig:{...m.agentConfig,..."orchestrator"===m.role?{permissions:"permissionless"}:{},...n.metadata?.opencodeSessionId?{opencodeSessionId:n.metadata.opencodeSessionId}:{}}},issueId:n.issueId??void 0,permissions:"orchestrator"===m.role?"permissionless":m.permissions,model:m.model,subagent:m.subagent};g=o.agent.getRestoreCommand?await o.agent.getRestoreCommand(n,c)??o.agent.getLaunchCommand(q):o.agent.getLaunchCommand(q);let r=o.agent.getEnvironment(q),s=i.tmuxName,t=await o.runtime.create({sessionId:s??a,workspacePath:p,launchCommand:g,environment:{...r,AO_SESSION:a,AO_DATA_DIR:j,AO_SESSION_NAME:a,...s&&{AO_TMUX_NAME:s},AO_CALLER_TYPE:"agent",...f&&{AO_PROJECT_ID:f},AO_CONFIG_PATH:b.configPath,...void 0!==b.port&&null!==b.port&&{AO_PORT:String(b.port)}}}),u=new Date().toISOString();$(j,a,{status:"spawning",runtimeHandle:JSON.stringify(t),restoredAt:u});let v={...n,status:"spawning",activity:"active",workspacePath:p,runtimeHandle:t,restoredAt:new Date(u)};if(o.agent.postLaunchSetup)try{let b={...v.metadata??{}};await o.agent.postLaunchSetup(v);let c=v.metadata??{},d=Object.fromEntries(Object.entries(c).filter(([a,c])=>b[a]!==c));Object.keys(d).length>0&&$(j,a,d)}catch{}return v}return{spawn:async function(a){let c,g,i,k,l=b.projects[a.projectId];if(!l)throw Error(`Unknown project: ${a.projectId}`);let m=an({role:"worker",project:l,defaults:b.defaults,spawnAgentOverride:a.agent}),n=B(l,m.agentName);if(!n.runtime)throw Error(`Runtime plugin '${l.runtime??b.defaults.runtime}' not found`);if(!n.agent)throw Error(`Agent plugin '${m.agentName}' not found`);if(a.issueId&&n.tracker)try{c=await n.tracker.getIssue(a.issueId,l)}catch(b){if((0,d.Fx)(b));else throw Error(`Failed to fetch issue ${a.issueId}: ${b}`,{cause:b})}let o=h(l);b.configPath&&r(b.configPath,l.path);let{sessionId:p,tmuxName:q}=await A(l,o);if(a.branch)g=a.branch;else if(a.issueId&&n.tracker&&c)g=n.tracker.branchName(a.issueId,l);else if(a.issueId){let b=a.issueId,c=/^[A-Za-z0-9][A-Za-z0-9._-]*$/.test(b)&&!b.includes("..")?b:b.toLowerCase().replace(/[^a-z0-9]+/g,"-").slice(0,60).replace(/^-+|-+$/g,"");g=`feat/${c||p}`}else g=`session/${p}`;let s=l.path;if(n.workspace)try{let b=await n.workspace.create({projectId:a.projectId,project:l,sessionId:p,branch:g});if(s=b.path,n.workspace.postCreate)try{await n.workspace.postCreate(b,l)}catch(b){if(j(l,a.projectId,s))try{await n.workspace.destroy(s)}catch{}throw b}}catch(a){try{_(o,p,!1)}catch{}throw a}if(a.issueId&&n.tracker&&c)try{i=await n.tracker.generatePrompt(a.issueId,l)}catch{}let t=function(a){let b=function(a){let b=[];if(a.agentRules&&b.push(a.agentRules),a.agentRulesFile){let c=(0,f.resolve)(a.path,a.agentRulesFile);try{let a=(0,e.readFileSync)(c,"utf-8").trim();a&&b.push(a)}catch{}}return b.length>0?b.join("\n\n"):null}(a.project),c=[];if(c.push(af),c.push(function(a){let{project:b,projectId:c,issueId:d,issueContext:e}=a,f=[];if(f.push("## Project Context"),f.push(`- Project: ${b.name??c}`),f.push(`- Repository: ${b.repo}`),f.push(`- Default branch: ${b.defaultBranch}`),b.tracker&&f.push(`- Tracker: ${b.tracker.plugin}`),d&&(f.push(`
47
- ## Task`),f.push(`Work on issue: ${d}`),f.push(`Create a branch named so that it auto-links to the issue tracker (e.g. feat/${d}).`)),e&&(f.push(`
48
- ## Issue Details`),f.push(e)),b.reactions){let a=[];for(let[c,d]of Object.entries(b.reactions))d.auto&&"send-to-agent"===d.action&&a.push(`- ${c}: auto-handled (you'll receive instructions)`);a.length>0&&(f.push(`
49
- ## Automated Reactions`),f.push("The orchestrator will automatically handle these events:"),f.push(...a))}return f.join("\n")}(a)),b&&c.push(`## Project Rules
50
- ${b}`),a.lineage&&a.lineage.length>0){let b=a.lineage.map((a,b)=>`${" ".repeat(b)}${b}. ${a}`),d=a.issueId??"this task";b.push(`${" ".repeat(a.lineage.length)}${a.lineage.length}. ${d} <-- (this task)`),c.push(`## Task Hierarchy
51
- This task is part of a larger decomposed plan. Your place in the hierarchy:
52
-
53
- \`\`\`
54
- ${b.join("\n")}
55
- \`\`\`
56
-
57
- Stay focused on YOUR specific task. Do not implement functionality that belongs to other tasks in the hierarchy.`)}if(a.siblings&&a.siblings.length>0){let b=a.siblings.map(a=>` - ${a}`);c.push(`## Parallel Work
58
- Sibling tasks being worked on in parallel:
59
- ${b.join("\n")}
60
-
61
- Do not duplicate work that sibling tasks handle. If you need interfaces/types from siblings, define reasonable stubs.`)}return a.userPrompt&&c.push(`## Additional Instructions
62
- ${a.userPrompt}`),c.join("\n\n")}({project:l,projectId:a.projectId,issueId:a.issueId,issueContext:i,userPrompt:a.prompt,lineage:a.lineage,siblings:a.siblings}),u=l.opencodeIssueSessionStrategy??"reuse",v="opencode"===n.agent.name&&a.issueId?await y({sessionsDir:o,criteria:{issueId:a.issueId},strategy:u}):void 0,w={sessionId:p,projectConfig:{...l,agentConfig:{...m.agentConfig,...v?{opencodeSessionId:v}:{}}},issueId:a.issueId,prompt:t,permissions:m.permissions,model:m.model,subagent:a.subagent??m.subagent};try{let c=n.agent.getLaunchCommand(w),d=n.agent.getEnvironment(w);k=await n.runtime.create({sessionId:q??p,workspacePath:s,launchCommand:c,environment:{...d,AO_SESSION:p,AO_DATA_DIR:o,AO_SESSION_NAME:p,...q&&{AO_TMUX_NAME:q},AO_CALLER_TYPE:"agent",AO_PROJECT_ID:a.projectId,AO_CONFIG_PATH:b.configPath,...void 0!==b.port&&null!==b.port&&{AO_PORT:String(b.port)}}})}catch(b){if(n.workspace&&j(l,a.projectId,s))try{await n.workspace.destroy(s)}catch{}try{_(o,p,!1)}catch{}throw b}let x={id:p,projectId:a.projectId,status:"spawning",activity:"active",branch:g,issueId:a.issueId??null,pr:null,workspacePath:s,runtimeHandle:k,agentInfo:null,createdAt:new Date,lastActivityAt:new Date,metadata:{...v?{opencodeSessionId:v}:{}}};try{if(Z(o,p,{worktree:s,branch:g,status:"spawning",tmuxName:q,issue:a.issueId,project:a.projectId,agent:m.agentName,createdAt:new Date().toISOString(),runtimeHandle:JSON.stringify(k),opencodeSessionId:v}),n.agent.postLaunchSetup&&await n.agent.postLaunchSetup(x),"opencode"===n.agent.name&&"reuse"===u&&!x.metadata.opencodeSessionId){let a=await as(p,1e4);a&&(x.metadata.opencodeSessionId=a)}Object.keys(x.metadata||{}).length>0&&$(o,p,x.metadata)}catch(b){try{await n.runtime.destroy(k)}catch{}if(n.workspace&&j(l,a.projectId,s))try{await n.workspace.destroy(s)}catch{}try{_(o,p,!1)}catch{}throw b}let z=!1;if("post-launch"===n.agent.promptDelivery&&w.prompt){let a;for(let b=1;b<=3;b++)try{await new Promise(a=>setTimeout(a,3e3*b)),await n.runtime.sendMessage(k,w.prompt),z=!0;break}catch(c){a=c instanceof Error?c:Error(String(c)),console.error(`[session-manager] Prompt delivery attempt ${b}/3 failed: ${a.message}`)}z||console.error(`[session-manager] FAILED to deliver prompt to session ${p} after 3 attempts. User must send manually with 'ao send'. Last error: ${a?.message}`),x.metadata.promptDelivered=String(z)}else w.prompt&&(x.metadata.promptDelivered="true");return x.metadata.promptDelivered&&$(o,p,x.metadata),x},spawnOrchestrator:async function(a){var c;let d,g,i,j,l=b.projects[a.projectId];if(!l)throw Error(`Unknown project: ${a.projectId}`);let m=an({role:"orchestrator",project:l,defaults:b.defaults}),o=B(l,m.agentName);if(!o.runtime)throw Error(`Runtime plugin '${l.runtime??b.defaults.runtime}' not found`);if(!o.agent)throw Error(`Agent plugin '${m.agentName}' not found`);let q="kill-previous"===(c=l.orchestratorSessionStrategy)||"delete-new"===c?"delete":"ignore-new"===c?"ignore":c??"reuse",s=h(l);b.configPath&&r(b.configPath,l.path);let t=function(a,c){let d=`${a.sessionPrefix}-orchestrator`,e=new Set,f=RegExp(`^${at(d)}-(\\d+)$`);for(let a of[...ab(c),...k(c)]){let b=a.match(f);if(b){let a=Number.parseInt(b[1],10);Number.isNaN(a)||e.add(a)}}for(let[c,e]of Object.entries(b.projects)){let b=e.sessionPrefix??c;if(b!==a.sessionPrefix&&b===d)throw Error(`Cannot spawn orchestrator for project "${a.sessionPrefix}": the orchestrator ID prefix "${d}" conflicts with the session prefix of project "${c}" ("${b}"). Rename one of the project sessionPrefix values to avoid this overlap.`)}let g=1;for(let a=0;a<1e4;a++){if(!e.has(g)){let a=`${d}-${g}`,e=b.configPath?p(b.configPath,d,g):void 0;if(ac(c,a))return{num:g,sessionId:a,tmuxName:e}}g+=1}throw Error(`Failed to reserve orchestrator session ID after 10000 attempts (prefix: ${d})`)}(l,s),u=t.sessionId,v=t.tmuxName,w=`orchestrator/${u}`;if(!o.workspace){try{_(s,u,!1)}catch{}throw Error(`spawnOrchestrator requires a workspace plugin but none is configured for project '${a.projectId}'`)}try{d=(await o.workspace.create({projectId:a.projectId,project:l,sessionId:u,branch:w})).path}catch(a){try{_(s,u,!1)}catch{}throw a}let x=async a=>{try{await o.workspace.destroy(d)}catch{}try{_(s,u,!1)}catch{}if(a)try{(0,e.unlinkSync)(a)}catch{}};try{o.agent.setupWorkspaceHooks&&await o.agent.setupWorkspaceHooks(d,{dataDir:s})}catch(a){throw await x(),a}if(a.systemPrompt)try{let c=n(b.configPath,l.path);(0,e.mkdirSync)(c,{recursive:!0}),g=(0,f.join)(c,`orchestrator-prompt-${u}.md`),(0,e.writeFileSync)(g,a.systemPrompt,"utf-8")}catch(a){throw await x(g),a}try{i="opencode"===o.agent.name&&"reuse"===q?await y({sessionsDir:s,criteria:{sessionId:u},strategy:"reuse"}):void 0,"opencode"===o.agent.name&&"delete"===q&&await y({sessionsDir:s,criteria:{sessionId:u},strategy:"delete",includeTitleDiscoveryForSessionId:!0})}catch(a){throw await x(g),a}let z={sessionId:u,projectConfig:{...l,agentConfig:{...m.agentConfig,permissions:"permissionless",...i?{opencodeSessionId:i}:{}}},permissions:"permissionless",model:m.model,systemPromptFile:g,subagent:m.subagent},A=o.agent.getLaunchCommand(z),C=o.agent.getEnvironment(z);try{j=await o.runtime.create({sessionId:v??u,workspacePath:d,launchCommand:A,environment:{...C,AO_SESSION:u,AO_DATA_DIR:s,AO_SESSION_NAME:u,...v&&{AO_TMUX_NAME:v},AO_CALLER_TYPE:"orchestrator",AO_PROJECT_ID:a.projectId,AO_CONFIG_PATH:b.configPath,...void 0!==b.port&&null!==b.port&&{AO_PORT:String(b.port)}}})}catch(a){throw await x(g),a}let D={id:u,projectId:a.projectId,status:"working",activity:"active",branch:w,issueId:null,pr:null,workspacePath:d,runtimeHandle:j,agentInfo:null,createdAt:new Date,lastActivityAt:new Date,metadata:{...i?{opencodeSessionId:i}:{}}};try{if(Z(s,u,{worktree:d,branch:w,status:"working",role:"orchestrator",tmuxName:v,project:a.projectId,agent:m.agentName,createdAt:new Date().toISOString(),runtimeHandle:JSON.stringify(j),opencodeSessionId:i}),o.agent.postLaunchSetup&&await o.agent.postLaunchSetup(D),"opencode"===o.agent.name&&"reuse"===q&&!D.metadata.opencodeSessionId){let a=await as(u,1e4);a&&(D.metadata.opencodeSessionId=a)}Object.keys(D.metadata||{}).length>0&&$(s,u,D.metadata)}catch(a){try{await o.runtime.destroy(j)}catch{}throw await x(g),a}return D},restore:O,list:J,get:K,kill:L,cleanup:M,send:N,claimPR:async function(a,b,c){let e,f=b.trim();if(!f)throw Error("PR reference is required");let{raw:g,sessionsDir:h,project:i,projectId:j}=F(a);if(l(a,g,i.sessionPrefix))throw Error(`Session ${a} is an orchestrator session and cannot claim PRs`);let k=B(i,C(i,a,g).agentName).scm;if(!k?.resolvePR||!k.checkoutPR)throw Error(`SCM plugin ${i.scm?.plugin?`"${i.scm.plugin}" `:""}does not support claiming existing PRs`);let m=await k.resolvePR(f,i),n=await k.getPRState(m);if(n!==d.bz.OPEN)throw Error(`Cannot claim PR #${m.number} because it is ${n}`);let o=new Set;for(let{sessionName:b,raw:c}of v(i).filter(b=>b.sessionName!==a)){if(!c||l(b,c,i.sessionPrefix))continue;let a=c.pr===m.url,d=c.branch===m.branch&&(c.prAutoDetect??"on")!=="off";(a||d)&&o.add(b)}let p=[...o],q=g.worktree;if(!q)throw Error(`Session ${a} has no workspace to check out PR #${m.number}`);let r=await k.checkoutPR(m,q);for(let b of($(h,a,{pr:m.url,status:"pr_open",branch:m.branch,prAutoDetect:""}),p)){let a=Y(h,b);a&&$(h,b,{pr:"",prAutoDetect:"off",...au.has(a.status??"")?{status:"working"}:{}})}let s=!1;if(c?.assignOnGithub)if(k.assignPRToCurrentUser)try{await k.assignPRToCurrentUser(m),s=!0}catch(a){e=a instanceof Error?a.message:String(a)}else e=`SCM plugin "${k.name}" does not support assigning PRs`;return{sessionId:a,projectId:j,pr:m,branchChanged:r,githubAssigned:s,githubAssignmentError:e,takenOverFrom:p}},remap:async function(a,b=!1){let{raw:c,sessionsDir:d,project:e}=F(a);if("opencode"!==C(e,a,c).agentName)throw Error(`Session ${a} is not using the opencode agent`);let f=ah(c.opencodeSessionId),g=b?await as(a,1e4):f??await as(a,1e4);if(!g)throw Error(`OpenCode session mapping is missing for ${a}`);return $(d,a,{opencodeSessionId:g}),g}}}let aA={debug:10,info:20,warn:30,error:40};function aB(){return new Date().toISOString()}function aC(a){return a.replace(/[^a-zA-Z0-9_-]+/g,"-").replace(/^-+|-+$/g,"")||"component"}function aD(a,b){aA[b]>=aA[function(){let a=process.env.AO_LOG_LEVEL?.trim().toLowerCase();return"debug"===a||"info"===a||"warn"===a||"error"===a?a:"warn"}()]&&process.stderr.write(`${JSON.stringify({...a,level:b})}
63
- `)}function aE(a){let b=(0,f.join)(function(a){let b=l(a);return(0,f.join)(q("~/.agent-orchestrator"),`${b}-observability`)}(a.configPath),"processes");return(0,e.mkdirSync)(b,{recursive:!0}),b}function aF(a,b){return(0,f.join)(aE(a),`${aC(b)}-${process.pid}.json`)}function aG(a,b){return b.localeCompare(a)}function aH(a){switch(a){case"error":return 3;case"warn":return 2;default:return 1}}function aI(a="ao"){return`${a}-${(0,k.randomUUID)()}`}function aJ(a,b){let c=aC(b);function d(b,d){try{let f=aF(a,c),g=function(a,b){if(!(0,e.existsSync)(a))return{version:1,component:b,pid:process.pid,updatedAt:aB(),metrics:{},traces:[],sessions:{},health:{}};try{let c=JSON.parse((0,e.readFileSync)(a,"utf-8"));return{version:1,component:b,pid:process.pid,updatedAt:"string"==typeof c.updatedAt?c.updatedAt:aB(),metrics:c.metrics&&"object"==typeof c.metrics?c.metrics:{},traces:Array.isArray(c.traces)?c.traces:[],sessions:c.sessions&&"object"==typeof c.sessions?c.sessions:{},health:c.health&&"object"==typeof c.health?c.health:{}}}catch{return{version:1,component:b,pid:process.pid,updatedAt:aB(),metrics:{},traces:[],sessions:{},health:{}}}}(f,c);b(g);let h=aF(a,g.component);g.updatedAt=aB();let i=`${h}.tmp.${process.pid}.${Date.now()}`;(0,e.writeFileSync)(i,`${JSON.stringify(g,null,2)}
64
- `,"utf-8"),(0,e.renameSync)(i,h),d&&aD(d.payload,d.level)}catch(a){aD({source:"ao-observability",component:c,outcome:"failure",operation:"observability.write",reason:a instanceof Error?a.message:String(a)},"error")}}return{component:c,recordOperation(a){let b=aB(),e=a.operation??a.metric,f=a.level??("failure"===a.outcome?"error":"info"),g={id:(0,k.randomUUID)(),timestamp:b,component:c,operation:e,outcome:a.outcome,correlationId:a.correlationId,projectId:a.projectId,sessionId:a.sessionId,path:a.path,reason:a.reason,durationMs:a.durationMs,data:a.data};d(c=>{var d,f;let h=(d=a.metric,f=a.projectId,`${f??"unknown"}::${d}`),i=c.metrics[h]??{total:0,success:0,failure:0};if(i.total+=1,i.lastAt=b,"success"===a.outcome?(i.success+=1,i.lastSuccessAt=b):(i.failure+=1,i.lastFailureAt=b,i.lastFailureReason=a.reason),c.metrics[h]=i,c.traces=[g,...c.traces].sort((a,b)=>aG(a.timestamp,b.timestamp)).slice(0,80),a.sessionId){c.sessions[a.sessionId]={sessionId:a.sessionId,projectId:a.projectId,correlationId:a.correlationId,operation:e,outcome:a.outcome,updatedAt:b,reason:a.reason};let d=Object.entries(c.sessions).sort(([,a],[,b])=>aG(a.updatedAt,b.updatedAt));c.sessions=Object.fromEntries(d.slice(0,200))}},{level:f,payload:{source:"ao-observability",component:c,metric:a.metric,operation:e,outcome:a.outcome,correlationId:a.correlationId,projectId:a.projectId,sessionId:a.sessionId,reason:a.reason,durationMs:a.durationMs,path:a.path,data:a.data}})},setHealth(a){let b=aB();d(d=>{d.health[a.surface]={surface:a.surface,status:a.status,updatedAt:b,component:c,projectId:a.projectId,correlationId:a.correlationId,reason:a.reason,details:a.details}},{level:"error"===a.status?"error":"warn"===a.status?"warn":"info",payload:{source:"ao-observability",component:c,surface:a.surface,status:a.status,projectId:a.projectId,correlationId:a.correlationId,reason:a.reason,details:a.details}})}}}function aK(a){let b=aE(a),c={};for(let a of(0,e.readdirSync)(b)){let d;if(!a.endsWith(".json"))continue;let g=(0,f.join)(b,a);try{d=JSON.parse((0,e.readFileSync)(g,"utf-8"))}catch{continue}if(d&&"object"==typeof d){for(let[a,b]of Object.entries(d.metrics??{})){let{projectId:e,metric:f}=function(a){let b=a.indexOf("::");if(-1===b)return{metric:a};let c=a.slice(0,b);return{projectId:"unknown"===c?void 0:c,metric:a.slice(b+2)}}(a);if(!e)continue;let g=c[e]??(c[e]={projectId:e,updatedAt:d.updatedAt,metrics:{},health:{},recentTraces:[],sessions:{}});g.metrics[f]=function(a,b){let c={total:(a?.total??0)+(b.total??0),success:(a?.success??0)+(b.success??0),failure:(a?.failure??0)+(b.failure??0),lastAt:a?.lastAt,lastSuccessAt:a?.lastSuccessAt,lastFailureAt:a?.lastFailureAt,lastFailureReason:a?.lastFailureReason};return b.lastAt&&(!c.lastAt||b.lastAt>c.lastAt)&&(c.lastAt=b.lastAt),b.lastSuccessAt&&(!c.lastSuccessAt||b.lastSuccessAt>c.lastSuccessAt)&&(c.lastSuccessAt=b.lastSuccessAt),b.lastFailureAt&&(!c.lastFailureAt||b.lastFailureAt>c.lastFailureAt)&&(c.lastFailureAt=b.lastFailureAt,c.lastFailureReason=b.lastFailureReason),c}(g.metrics[f],b),d.updatedAt>g.updatedAt&&(g.updatedAt=d.updatedAt)}for(let a of d.traces??[]){if(!a.projectId)continue;let b=c[a.projectId]??(c[a.projectId]={projectId:a.projectId,updatedAt:a.timestamp,metrics:{},health:{},recentTraces:[],sessions:{}});b.recentTraces.push(a),a.timestamp>b.updatedAt&&(b.updatedAt=a.timestamp)}for(let a of Object.values(d.health??{})){let b=a.projectId;if(!b)continue;let d=c[b]??(c[b]={projectId:b,updatedAt:a.updatedAt,metrics:{},health:{},recentTraces:[],sessions:{}}),e=d.health[a.surface];(!e||a.updatedAt>=e.updatedAt)&&(d.health[a.surface]=a),a.updatedAt>d.updatedAt&&(d.updatedAt=a.updatedAt)}for(let a of Object.values(d.sessions??{})){if(!a.projectId)continue;let b=c[a.projectId]??(c[a.projectId]={projectId:a.projectId,updatedAt:a.updatedAt,metrics:{},health:{},recentTraces:[],sessions:{}}),d=b.sessions[a.sessionId];(!d||a.updatedAt>=d.updatedAt)&&(b.sessions[a.sessionId]=a),a.updatedAt>b.updatedAt&&(b.updatedAt=a.updatedAt)}}}let d="ok";for(let a of Object.values(c))for(let b of(a.recentTraces=a.recentTraces.sort((a,b)=>aG(a.timestamp,b.timestamp)).slice(0,80),Object.values(a.health)))aH(b.status)>aH(d)&&(d=b.status);return{generatedAt:aB(),overallStatus:d,projects:c}}function aL(a){let b=a.match(/^(\d+)(s|m|h)$/);if(!b)return 0;let c=parseInt(b[1],10);switch(b[2]){case"s":return 1e3*c;case"m":return 6e4*c;case"h":return 36e5*c;default:return 0}}function aM(a){return a.includes("stuck")||a.includes("needs_input")||a.includes("errored")?"urgent":a.startsWith("summary.")?"info":a.includes("approved")||a.includes("ready")||a.includes("merged")||a.includes("completed")?"action":a.includes("fail")||a.includes("changes_requested")||a.includes("conflicts")?"warning":"info"}function aN(a,b){return{id:(0,k.randomUUID)(),type:a,priority:b.priority??aM(a),sessionId:b.sessionId,projectId:b.projectId,timestamp:new Date,message:b.message,data:b.data??{}}}function aO(a,b){switch(b){case"working":return"session.working";case"pr_open":return"pr.created";case"ci_failed":return"ci.failing";case"review_pending":return"review.pending";case"changes_requested":return"review.changes_requested";case"approved":return"review.approved";case"mergeable":return"merge.ready";case"merged":return"merge.completed";case"needs_input":return"session.needs_input";case"stuck":return"session.stuck";case"errored":return"session.errored";case"killed":return"session.killed";default:return null}}function aP(a){switch(a){case"ci.failing":return"ci-failed";case"review.changes_requested":return"changes-requested";case"automated_review.found":return"bugbot-comments";case"merge.conflicts":return"merge-conflicts";case"merge.ready":return"approved-and-green";case"session.stuck":return"agent-stuck";case"session.needs_input":return"agent-needs-input";case"session.killed":return"agent-exited";case"summary.all_complete":return"all-complete";default:return null}}function aQ(a){let{config:b,registry:c,sessionManager:e,projectId:f}=a,g=aJ(b,"lifecycle-manager"),h=new Map,i=new Map,j=null,k=!1,l=!1,m=new Map,n=new Map;async function p(a){m.clear();let d=Array.from(new Map(a.map(a=>a.pr).filter(a=>null!==a).map(a=>[`${a.owner}/${a.repo}#${a.number}`,a])).values());if(0===d.length)return;let e=new Map;for(let a of d){let c=Object.values(b.projects).find(b=>{let[c,d]=b.repo.split("/");return c===a.owner&&d===a.repo});if(!c?.scm?.plugin)continue;let d=c.scm.plugin;e.has(d)||e.set(d,[]);let f=e.get(d);f&&f.push(a)}for(let[a,b]of e){let d=c.get("scm",a);if(!d?.enrichSessionsPRBatch)continue;let e=Date.now();try{for(let[c,h]of(await d.enrichSessionsPRBatch(b,{recordSuccess(c){let d=Date.now()-e;g?.recordOperation({metric:"graphql_batch",operation:"batch_enrichment",correlationId:aI("graphql-batch"),outcome:"success",projectId:f,durationMs:d,data:{plugin:a,prCount:b.length,prKeys:b.map(a=>`${a.owner}/${a.repo}#${a.number}`)},level:"info"})},recordFailure(c){let d=Date.now()-e;g?.recordOperation({metric:"graphql_batch",operation:"batch_enrichment",correlationId:aI("graphql-batch"),outcome:"failure",reason:c.error,level:"warn",data:{plugin:a,prCount:b.length,error:c.error,durationMs:d}})},log(b,c){process.stderr.write(JSON.stringify({source:"ao-graphql-batch",level:b,message:c,plugin:a,timestamp:new Date().toISOString()})+"\n")}})))m.set(c,h)}catch(e){let c=e instanceof Error?e.message:String(e),d=aI("batch-enrichment");g?.recordOperation?.({metric:"lifecycle_poll",operation:"batch_enrichment",correlationId:d,outcome:"failure",reason:c,level:"warn",data:{plugin:a,prCount:b.length}})}}}function q(a,b){let c=u(a,"agent-stuck"),d=c?.threshold;if("string"!=typeof d)return!1;let e=aL(d);return!(e<=0)&&Date.now()-b.getTime()>e}async function r(a){let e=b.projects[a.projectId];if(!e)return a.status;let f=an({role:am(a.id,a.metadata,e.sessionPrefix),project:e,defaults:b.defaults,persistedAgent:a.metadata.agent}).agentName,g=c.get("agent",f),h=e.scm?.plugin?c.get("scm",e.scm.plugin):null,i=null;if(a.runtimeHandle){let d=c.get("runtime",e.runtime??b.defaults.runtime);if(d&&!await d.isAlive(a.runtimeHandle).catch(()=>!0))return"killed"}if(g&&a.runtimeHandle)try{if(g.recordActivity&&a.workspacePath)try{let d=c.get("runtime",e.runtime??b.defaults.runtime),f=d?await d.getOutput(a.runtimeHandle,10):"";f&&await g.recordActivity(a,f)}catch{}let d=await g.getActivityState(a,b.readyThresholdMs);if(d){if("waiting_input"===d.state)return"needs_input";if("exited"===d.state)return"killed";("idle"===d.state||"blocked"===d.state)&&d.timestamp&&(i=d.timestamp)}else{let d=c.get("runtime",e.runtime??b.defaults.runtime),f=d?await d.getOutput(a.runtimeHandle,10):"";if(f){let b=g.detectActivity(f);if("waiting_input"===b)return"needs_input";if(!await g.isProcessRunning(a.runtimeHandle))return"killed"}}}catch{if(a.status===d.SB.STUCK||a.status===d.SB.NEEDS_INPUT)return a.status}if(!a.pr&&h&&a.branch&&"off"!==a.metadata.prAutoDetect&&"orchestrator"!==a.metadata.role&&!a.id.endsWith("-orchestrator"))try{let c=await h.detectPR(a,e);if(c){a.pr=c;let d=o(b.configPath,e.path);$(d,a.id,{pr:c.url})}}catch{}if(a.pr&&h)try{let b=`${a.pr.owner}/${a.pr.repo}#${a.pr.number}`,c=m.get(b);if(c){if(c.state===d.bz.MERGED)return"merged";if(c.state===d.bz.CLOSED)return"killed";if(c.ciStatus===d.U1.FAILING)return"ci_failed";if("changes_requested"===c.reviewDecision)return"changes_requested";if("approved"===c.reviewDecision||"none"===c.reviewDecision){if(c.mergeable)return"mergeable";if("approved"===c.reviewDecision)return"approved"}if("pending"===c.reviewDecision)return"review_pending";if(i&&q(a,i))return"stuck";return"pr_open"}let e=await h.getPRState(a.pr);if(e===d.bz.MERGED)return"merged";if(e===d.bz.CLOSED)return"killed";if(await h.getCISummary(a.pr)===d.U1.FAILING)return"ci_failed";let f=await h.getReviewDecision(a.pr);if("changes_requested"===f)return"changes_requested";if("approved"===f||"none"===f){if((await h.getMergeability(a.pr)).mergeable)return"mergeable";if("approved"===f)return"approved"}if("pending"===f)return"review_pending";if(i&&q(a,i))return"stuck";return"pr_open"}catch{}return i&&q(a,i)?"stuck":"spawning"===a.status||a.status===d.SB.STUCK||a.status===d.SB.NEEDS_INPUT?"working":a.status}async function s(a,b,c,d){let f=`${a}:${c}`,g=i.get(f);g||(g={attempts:0,firstTriggered:new Date},i.set(f,g)),g.attempts++;let h=d.retries??1/0,j=d.escalateAfter,k=!1;if(g.attempts>h&&(k=!0),"string"==typeof j){let a=aL(j);a>0&&Date.now()-g.firstTriggered.getTime()>a&&(k=!0)}if("number"==typeof j&&g.attempts>j&&(k=!0),k){let e=aN("reaction.escalated",{sessionId:a,projectId:b,message:`Reaction '${c}' escalated after ${g.attempts} attempts`,data:{reactionKey:c,attempts:g.attempts}});return await A(e,d.priority??"urgent"),{reactionType:c,success:!0,action:"escalated",escalated:!0}}let l=d.action??"notify";switch(l){case"send-to-agent":if(d.message)try{return await e.send(a,d.message),{reactionType:c,success:!0,action:"send-to-agent",message:d.message,escalated:!1}}catch{return{reactionType:c,success:!1,action:"send-to-agent",escalated:!1}}break;case"notify":{let e=aN("reaction.triggered",{sessionId:a,projectId:b,message:`Reaction '${c}' triggered notification`,data:{reactionKey:c}});return await A(e,d.priority??"info"),{reactionType:c,success:!0,action:"notify",escalated:!1}}case"auto-merge":{let d=aN("reaction.triggered",{sessionId:a,projectId:b,message:`Reaction '${c}' triggered auto-merge`,data:{reactionKey:c}});return await A(d,"action"),{reactionType:c,success:!0,action:"auto-merge",escalated:!1}}}return{reactionType:c,success:!1,action:l,escalated:!1}}function t(a,b){i.delete(`${a}:${b}`)}function u(a,c){let d=b.projects[a.projectId],e=b.reactions[c],f=d?.reactions?.[c];return(f?{...e,...f}:e)||null}function v(a,c){let d=b.projects[a.projectId];if(!d)return;$(o(b.configPath,d.path),a.id,c);let e=Object.fromEntries(Object.entries(a.metadata).filter(([a])=>{let b=c[a];return void 0===b||""!==b}));for(let[a,b]of Object.entries(c))void 0!==b&&""!==b&&(e[a]=b);a.metadata=e}function w(a){return[...a].sort().join(",")}async function x(a,e,f,g){let h=b.projects[a.projectId];if(!h||!a.pr)return;let i=h.scm?.plugin?c.get("scm",h.scm.plugin):null;if(!i)return;let j="changes-requested",k="bugbot-comments";if(d.CM.has(f)){t(a.id,j),t(a.id,k),n.delete(a.id),v(a,{lastPendingReviewFingerprint:"",lastPendingReviewDispatchHash:"",lastPendingReviewDispatchAt:"",lastAutomatedReviewFingerprint:"",lastAutomatedReviewDispatchHash:"",lastAutomatedReviewDispatchAt:""});return}if(g?.key!==j&&g?.key!==k){let b=n.get(a.id)??0;if(Date.now()-b<12e4)return}n.set(a.id,Date.now());let[l,m]=await Promise.allSettled([i.getPendingComments(a.pr),i.getAutomatedComments(a.pr)]),o="fulfilled"===l.status&&Array.isArray(l.value)?l.value:null,p="fulfilled"===m.status&&Array.isArray(m.value)?m.value:null;if(null!==o){let b=w(o.map(a=>a.id)),c=a.metadata.lastPendingReviewFingerprint??"",d=a.metadata.lastPendingReviewDispatchHash??"";if(b!==c&&g?.key!==j&&t(a.id,j),b!==c&&v(a,{lastPendingReviewFingerprint:b}),b){if(g?.key===j&&g.result?.success)d!==b&&v(a,{lastPendingReviewDispatchHash:b,lastPendingReviewDispatchAt:new Date().toISOString()});else if((e===f||"changes_requested"!==f)&&b!==d){let c=u(a,j);c&&c.action&&(!1!==c.auto||"notify"===c.action)&&(await s(a.id,a.projectId,j,c)).success&&v(a,{lastPendingReviewDispatchHash:b,lastPendingReviewDispatchAt:new Date().toISOString()})}}else t(a.id,j),v(a,{lastPendingReviewFingerprint:"",lastPendingReviewDispatchHash:"",lastPendingReviewDispatchAt:""})}if(null!==p){let b=w(p.map(a=>a.id)),c=a.metadata.lastAutomatedReviewFingerprint??"",d=a.metadata.lastAutomatedReviewDispatchHash??"";if(b!==c&&(t(a.id,k),v(a,{lastAutomatedReviewFingerprint:b})),b){if(b!==d){let c=u(a,k);c&&c.action&&(!1!==c.auto||"notify"===c.action)&&(await s(a.id,a.projectId,k,c)).success&&v(a,{lastAutomatedReviewDispatchHash:b,lastAutomatedReviewDispatchAt:new Date().toISOString()})}}else t(a.id,k),v(a,{lastAutomatedReviewFingerprint:"",lastAutomatedReviewDispatchHash:"",lastAutomatedReviewDispatchAt:""})}}async function y(a,d,f,g){let h,i=b.projects[a.projectId];if(!i||!a.pr)return;let j=i.scm?.plugin?c.get("scm",i.scm.plugin):null;if(!j)return;let k="ci-failed";if("merged"===f||"killed"===f){t(a.id,k),v(a,{lastCIFailureFingerprint:"",lastCIFailureDispatchHash:"",lastCIFailureDispatchAt:""});return}if("ci_failed"!==f){a.metadata.lastCIFailureFingerprint&&(t(a.id,k),v(a,{lastCIFailureFingerprint:"",lastCIFailureDispatchHash:"",lastCIFailureDispatchAt:""}));return}let l=`${a.pr.owner}/${a.pr.repo}#${a.pr.number}`,n=m.get(l);if(n?.ciChecks!==void 0)h=n.ciChecks;else try{h=await j.getCIChecks(a.pr)}catch{return}let o=h.filter(a=>"failed"===a.status||a.conclusion?.toUpperCase()==="FAILURE");if(0===o.length)return;let p=w(o.map(a=>`${a.name}:${a.status}:${a.conclusion??""}`)),q=a.metadata.lastCIFailureFingerprint??"",r=a.metadata.lastCIFailureDispatchHash??"";if(p!==q&&g?.key!==k&&t(a.id,k),p!==q&&v(a,{lastCIFailureFingerprint:p}),g?.key===k&&g.result?.success||p===r)return;let s=u(a,k);if(s&&s.action&&(!1!==s.auto||"notify"===s.action)){let b=function(a){let b=["CI checks are failing on your PR. Here are the failed checks:",""];for(let c of a){let a=c.conclusion??c.status,d=c.url?` — ${c.url}`:"";b.push(`- **${c.name}**: ${a}${d}`)}return b.push("","Investigate the failures, fix the issues, and push again."),b.join("\n")}(o);try{if("send-to-agent"===s.action)await e.send(a.id,b);else{let c=aN("ci.failing",{sessionId:a.id,projectId:a.projectId,message:b,data:{failedChecks:o.map(a=>a.name)}});await A(c,s.priority??"warning")}v(a,{lastCIFailureDispatchHash:p,lastCIFailureDispatchAt:new Date().toISOString()})}catch{}}}async function z(a,d){let f,g=b.projects[a.projectId];if(!g||!a.pr)return;let h=g.scm?.plugin?c.get("scm",g.scm.plugin):null;if(!h)return;let i="merge-conflicts";if("merged"===d||"killed"===d){t(a.id,i),v(a,{lastMergeConflictDispatched:""});return}if("pr_open"!==d&&"ci_failed"!==d&&"review_pending"!==d&&"changes_requested"!==d&&"approved"!==d&&"mergeable"!==d)return;let j=`${a.pr.owner}/${a.pr.repo}#${a.pr.number}`,k=m.get(j);if(k)f=k.hasConflicts??!1;else try{f=!(await h.getMergeability(a.pr)).noConflicts}catch{return}let l=a.metadata.lastMergeConflictDispatched??"";if(f){if("true"===l)return;let b=u(a,i);if(b&&b.action&&(!1!==b.auto||"notify"===b.action))try{if("send-to-agent"===b.action){let c=b.message??"Your branch has merge conflicts. Rebase on the default branch and resolve them.";await e.send(a.id,c)}else{let c=aN("merge.conflicts",{sessionId:a.id,projectId:a.projectId,message:`${a.id}: PR has merge conflicts`});await A(c,b.priority??"warning")}v(a,{lastMergeConflictDispatched:"true"})}catch{}}else"true"===l&&(t(a.id,i),v(a,{lastMergeConflictDispatched:""}))}async function A(a,d){let e={...a,priority:d};for(let a of b.notificationRouting[d]??b.defaults.notifiers){let b=c.get("notifier",a);if(b)try{await b.notify(e)}catch{}}}async function B(a){let b,c=h.get(a.id)??(a.metadata?.status||a.status),e=await r(a);if(e!==c){let f=aI("lifecycle-transition");h.set(a.id,e),v(a,{status:e}),g.recordOperation({metric:"lifecycle_poll",operation:"lifecycle.transition",outcome:"success",correlationId:f,projectId:a.projectId,sessionId:a.id,data:{oldStatus:c,newStatus:e},level:function(a){let b=aO(void 0,a);if(!b)return"info";let c=aM(b);return"urgent"===c?"error":"warning"===c?"warn":"info"}(e)}),d.CM.has(e)||(l=!1);let i=aO(void 0,c);if(i){let b=aP(i);b&&t(a.id,b)}let j=aO(c,e);if(j){let d=!1,f=aP(j);if(f){let c=u(a,f);if(c&&c.action&&(!1!==c.auto||"notify"===c.action)){let e=await s(a.id,a.projectId,f,c);b={key:f,result:e},d=!0}}if(!d){let b=aM(j),d=aN(j,{sessionId:a.id,projectId:a.projectId,message:`${a.id}: ${c} → ${e}`,data:{oldStatus:c,newStatus:e}});await A(d,b)}}}else h.set(a.id,e);if(a.agentInfo?.summary&&!a.agentInfo.summaryIsFallback&&!a.metadata.pinnedSummary){let b=a.agentInfo.summary.replace(/[\n\r]/g," ").trim();if(b.length>=5)try{v(a,{pinnedSummary:b})}catch{}}await Promise.allSettled([x(a,c,e,b),y(a,c,e,b),z(a,e)])}async function C(){let a=aI("lifecycle-poll"),c=Date.now();if(!k){k=!0;try{let j=await e.list(f),k=j.filter(a=>{if(!d.CM.has(a.status))return!0;let b=h.get(a.id);return void 0!==b&&b!==a.status});await p(k),await Promise.allSettled(k.map(a=>B(a)));let m=new Set(j.map(a=>a.id));for(let a of h.keys())m.has(a)||h.delete(a);for(let a of i.keys()){let b=a.split(":")[0];b&&!m.has(b)&&i.delete(a)}for(let a of n.keys())m.has(a)||n.delete(a);let o=j.filter(a=>!d.CM.has(a.status));if(j.length>0&&0===o.length&&!l){l=!0;let a=aP("summary.all_complete");if(a){let c=b.reactions[a];c&&c.action&&(!1!==c.auto||"notify"===c.action)&&await s("system","all",a,c)}}f&&(g.recordOperation({metric:"lifecycle_poll",operation:"lifecycle.poll",outcome:"success",correlationId:a,projectId:f,durationMs:Date.now()-c,data:{sessionCount:j.length,activeSessionCount:o.length},level:"info"}),g.setHealth({surface:"lifecycle.worker",status:"ok",projectId:f,correlationId:a,details:{projectId:f,sessionCount:j.length,activeSessionCount:o.length}}))}catch(d){let b=d instanceof Error?d.message:String(d);g.recordOperation({metric:"lifecycle_poll",operation:"lifecycle.poll",outcome:"failure",correlationId:a,projectId:f,durationMs:Date.now()-c,reason:b,level:"error"}),g.setHealth({surface:"lifecycle.worker",status:"error",projectId:f,correlationId:a,reason:b,details:f?{projectId:f}:{projectScope:"all"}})}finally{k=!1}}}return{start(a=3e4){j||(j=setInterval(()=>void C(),a),C())},stop(){j&&(clearInterval(j),j=null)},getStates:()=>new Map(h),async check(a){let b=await e.get(a);if(!b)throw Error(`Session ${a} not found`);await B(b)}}}var aR=c(3413);let aS={enabled:!1,maxDepth:3,model:"claude-sonnet-4-20250514",requireApproval:!0};function aT(a,b){let c=a.map((a,b)=>`${" ".repeat(b)}${b}. ${a}`);return c.push(`${" ".repeat(a.length)}${a.length}. ${b} <-- (this task)`),c.join("\n")}let aU=`You decide whether a software task is "atomic" or "composite".
65
-
66
- - "atomic" = a developer can implement this directly without needing to plan further. It may involve multiple steps, but they're all part of one coherent unit of work.
67
- - "composite" = this clearly contains 2+ independent concerns that should be worked on separately (e.g., backend + frontend, or auth + database + UI).
68
-
69
- Decision heuristics:
70
- - If the task names a single feature, endpoint, component, or module: atomic.
71
- - If the task bundles unrelated concerns (e.g., "build auth and set up CI"): composite.
72
- - If you're at depth 2 or deeper in the hierarchy, it is almost certainly atomic — only mark composite if you can name 2+ truly independent deliverables.
73
- - When in doubt, choose atomic. Over-decomposition creates more overhead than under-decomposition.
74
-
75
- Respond with ONLY the word "atomic" or "composite". Nothing else.`,aV=`You are a pragmatic task decomposition engine for software projects.
76
-
77
- Given a composite task, break it into the MINIMUM number of subtasks needed:
78
- - A simple task might only need 2 subtasks.
79
- - A complex task might need up to 7, but only if each is truly distinct.
80
- - Do NOT pad with extra subtasks. Do NOT create "test and polish" or "define requirements" subtasks.
81
- - Do NOT create subtasks that overlap or restate each other.
82
- - Each subtask should represent real, distinct work.
83
-
84
- Think about how an experienced developer would actually split this work.
85
-
86
- Respond with a JSON array of strings, each being a subtask description. Example:
87
- ["Implement Stripe webhook handler", "Build subscription management UI"]
88
-
89
- Nothing else — just the JSON array.`;async function aW(a,b,c,d){let e=aT(d,c),f=await a.messages.create({model:b,max_tokens:10,system:aU,messages:[{role:"user",content:`Task hierarchy:
90
- ${e}`}]});return"composite"===("text"===f.content[0].type?f.content[0].text.trim().toLowerCase():"")?"composite":"atomic"}async function aX(a,b,c,d){let e=aT(d,c),f=await a.messages.create({model:b,max_tokens:1024,system:aV,messages:[{role:"user",content:`Task hierarchy:
91
- ${e}`}]}),g="text"===f.content[0].type?f.content[0].text.trim():"[]",h=g.match(/\[[\s\S]*\]/);if(!h)throw Error(`Decomposition failed — no JSON array in response: ${g}`);let i=JSON.parse(h[0]);if(!Array.isArray(i)||i.length<2)throw Error(`Decomposition produced ${i.length} subtasks — need at least 2`);return i}function aY(a,b,c,d){return{id:a,depth:c,description:b,status:"pending",lineage:d,children:[]}}async function aZ(a,b,c,d){let e=c.depth>=d?"atomic":await aW(a,b,c.description,c.lineage);if(c.kind=e,"atomic"===e)return c.status="ready",c;c.status="decomposing";let f=await aX(a,b,c.description,c.lineage),g=[...c.lineage,c.description];return c.children=f.map((a,b)=>aY(`${c.id}.${b+1}`,a,c.depth+1,g)),await Promise.all(c.children.map(c=>aZ(a,b,c,d))),c.status="ready",c}async function a$(a,b=aS){let c=new aR.Ay,d=aY("1",a,0,[]);return await aZ(c,b.model,d,b.maxDepth),{id:`plan-${Date.now()}`,rootTask:a,tree:d,maxDepth:b.maxDepth,phase:b.requireApproval?"review":"approved",createdAt:new Date().toISOString()}}function a_(a){return 0===a.children.length?[a]:a.children.flatMap(a_)}function a0(a,b){let c=function a(c){for(let d of c.children){if(d.id===b)return c;let e=a(d);if(e)return e}return null}(a);return c?c.children.filter(a=>a.id!==b).map(a=>a.description):[]}function a1(a){let{config:b,projectId:c,project:d}=a,e=[];if(e.push(`# ${d.name} Orchestrator
92
-
93
- You are the **orchestrator agent** for the ${d.name} project.
94
-
95
- Your role is to coordinate and manage worker agent sessions. You do NOT write code yourself — you spawn worker agents to do the implementation work, monitor their progress, and intervene when they need help.`),e.push(`## Non-Negotiable Rules
96
-
97
- - Investigations from the orchestrator session are **read-only**. Inspect status, logs, metadata, PR state, and worker output, but do not edit repository files or implement fixes from the orchestrator session.
98
- - Any code change, test run tied to implementation, git branch work, or PR takeover must be delegated to a **worker session**.
99
- - The orchestrator session must never own a PR. Never claim a PR into the orchestrator session, and never treat the orchestrator as the worker responsible for implementation.
100
- - If an investigation discovers follow-up work, either spawn a worker session or direct an existing worker session with clear instructions.
101
- - **Always use \`ao send\` to communicate with sessions** — never use raw \`tmux send-keys\` or \`tmux capture-pane\`. Direct tmux access bypasses busy detection, retry logic, and input sanitization, and breaks multi-line input for some agents (e.g. Codex).
102
- - When a session might be busy, use \`ao send --no-wait <session> <message>\` to send without waiting for the session to become idle.`),e.push(`## Project Info
103
-
104
- - **Name**: ${d.name}
105
- - **Repository**: ${d.repo}
106
- - **Default Branch**: ${d.defaultBranch}
107
- - **Session Prefix**: ${d.sessionPrefix}
108
- - **Local Path**: ${d.path}
109
- - **Dashboard Port**: ${b.port??3e3}`),e.push(`## Quick Start
110
-
111
- \`\`\`bash
112
- # See all sessions at a glance
113
- ao status
114
-
115
- # Spawn sessions for issues (GitHub: #123, Linear: INT-1234, etc.)
116
- ao spawn INT-1234
117
- ao spawn --claim-pr 123
118
- ao batch-spawn INT-1 INT-2 INT-3
119
-
120
- # List sessions
121
- ao session ls -p ${c}
122
-
123
- # Send message to a session
124
- ao send ${d.sessionPrefix}-1 "Your message here"
125
-
126
- # Claim an existing PR for a worker session
127
- ao session claim-pr 123 ${d.sessionPrefix}-1
128
-
129
- # Kill a session
130
- ao session kill ${d.sessionPrefix}-1
131
-
132
- # Open all sessions in terminal tabs
133
- ao open ${c}
134
- \`\`\``),e.push(`## Available Commands
135
-
136
- | Command | Description |
137
- |---------|-------------|
138
- | \`ao status\` | Show all sessions with PR/CI/review status |
139
- | \`ao spawn [issue] [--claim-pr <pr>]\` | Spawn a worker session (project auto-detected), optionally attached to an existing PR |
140
- | \`ao batch-spawn <issues...>\` | Spawn multiple sessions in parallel (project auto-detected) |
141
- | \`ao session ls [-p project]\` | List all sessions (optionally filter by project) |
142
- | \`ao session claim-pr <pr> [session]\` | Attach an existing PR to a worker session |
143
- | \`ao session attach <session>\` | Attach to a session's tmux window |
144
- | \`ao session kill <session>\` | Kill a specific session |
145
- | \`ao session cleanup [-p project]\` | Kill completed/merged sessions |
146
- | \`ao send <session> <message>\` | Send a message to a running session |
147
- | \`ao send --no-wait <session> <message>\` | Send without waiting for session to become idle |
148
- | \`ao dashboard\` | Start the web dashboard (http://localhost:${b.port??3e3}) |
149
- | \`ao open <project>\` | Open all project sessions in terminal tabs |`),e.push(`## Session Management
150
-
151
- ### Spawning Sessions
152
-
153
- When you spawn a session:
154
- 1. A git worktree is created from \`${d.defaultBranch}\`
155
- 2. A feature branch is created (e.g., \`feat/INT-1234\`)
156
- 3. A tmux session is started (e.g., \`${d.sessionPrefix}-1\`)
157
- 4. The agent is launched with context about the issue
158
- 5. Metadata is written to the project-specific sessions directory
159
-
160
- ### Monitoring Progress
161
-
162
- Use \`ao status\` to see:
163
- - Current session status (working, pr_open, review_pending, etc.)
164
- - PR state (open/merged/closed)
165
- - CI status (passing/failing/pending)
166
- - Review decision (approved/changes_requested/pending)
167
- - Unresolved comments count
168
-
169
- ### Sending Messages
170
-
171
- Send instructions to a running agent:
172
- \`\`\`bash
173
- ao send ${d.sessionPrefix}-1 "Please address the review comments on your PR"
174
- \`\`\`
175
-
176
- ### PR Takeover
177
-
178
- If a worker session needs to continue work on an existing PR:
179
- \`\`\`bash
180
- ao session claim-pr 123 ${d.sessionPrefix}-1
181
- # or do it at spawn time
182
- ao spawn --claim-pr 123
183
- \`\`\`
184
-
185
- This updates AO metadata, switches the worker worktree onto the PR branch, and lets lifecycle reactions keep routing CI and review feedback to that worker session.
186
-
187
- Never claim a PR into \`${d.sessionPrefix}-orchestrator\`. If a PR needs implementation or takeover, delegate it to a worker session instead.
188
-
189
- ### Investigation Workflow
190
-
191
- When debugging or triaging from the orchestrator session:
192
- 1. Inspect with read-only commands such as \`ao status\`, \`ao session ls\`, \`ao session attach\`, and SCM/tracker lookups.
193
- 2. Decide whether a worker already owns the work or a new worker is needed.
194
- 3. Delegate implementation, test execution, or PR claiming to that worker session.
195
- 4. Return to monitoring and coordination once the worker has the task.
196
-
197
- ### Cleanup
198
-
199
- Remove completed sessions:
200
- \`\`\`bash
201
- ao session cleanup -p ${c} # Kill sessions where PR is merged or issue is closed
202
- \`\`\``),e.push(`## Dashboard
203
-
204
- The web dashboard runs at **http://localhost:${b.port??3e3}**.
205
-
206
- Features:
207
- - Live session cards with activity status
208
- - PR table with CI checks and review state
209
- - Attention zones (merge ready, needs response, working, done)
210
- - One-click actions (send message, kill, merge PR)
211
- - Real-time updates via Server-Sent Events`),d.reactions&&Object.keys(d.reactions).length>0){let a=[];for(let[b,c]of Object.entries(d.reactions))c.auto&&"send-to-agent"===c.action?a.push(`- **${b}**: Auto-sends instruction to agent (retries: ${c.retries??"none"}, escalates after: ${c.escalateAfter??"never"})`):c.auto&&"notify"===c.action&&a.push(`- **${b}**: Notifies human (priority: ${c.priority??"info"})`);a.length>0&&e.push(`## Automated Reactions
212
-
213
- The system automatically handles these events:
214
-
215
- ${a.join("\n")}`)}return e.push(`## Common Workflows
216
-
217
- ### Bulk Issue Processing
218
- 1. Get list of issues from tracker (GitHub/Linear/etc.)
219
- 2. Use \`ao batch-spawn\` to spawn sessions for each issue
220
- 3. Monitor with \`ao status\` or the dashboard
221
- 4. Agents will fetch, implement, test, PR, and respond to reviews
222
- 5. Use \`ao session cleanup\` when PRs are merged
223
-
224
- ### Handling Stuck Agents
225
- 1. Check \`ao status\` for sessions in "stuck" or "needs_input" state
226
- 2. Attach with \`ao session attach <session>\` to see what they're doing
227
- 3. Send clarification or instructions with \`ao send <session> '...'\`
228
- 4. Or kill and respawn with fresh context if needed
229
-
230
- ### PR Review Flow
231
- 1. Agent creates PR and pushes
232
- 2. CI runs automatically
233
- 3. If CI fails: reaction auto-sends fix instructions to agent
234
- 4. If reviewers request changes: reaction auto-sends comments to agent
235
- 5. When approved + green: notify human to merge (unless auto-merge enabled)
236
-
237
- ### Manual Intervention
238
- When an agent needs human judgment:
239
- 1. You'll get a notification (desktop/slack/webhook)
240
- 2. Check the dashboard or \`ao status\` for details
241
- 3. Attach to the session if needed: \`ao session attach <session>\`
242
- 4. Send instructions: \`ao send <session> '...'\`
243
- 5. Or handle the human-only action yourself (merge PR, close issue, etc.) while keeping implementation in worker sessions.`),e.push(`## Tips
244
-
245
- 1. **Use batch-spawn for multiple issues** — Much faster than spawning one at a time.
246
-
247
- 2. **Check status before spawning** — Avoid creating duplicate sessions for issues already being worked on.
248
-
249
- 3. **Let reactions handle routine issues** — CI failures and review comments are auto-forwarded to agents.
250
-
251
- 4. **Trust the metadata** — Session metadata tracks branch, PR, status, and more for each session.
252
-
253
- 5. **Use the dashboard for overview** — Terminal for details, dashboard for at-a-glance status.
254
-
255
- 6. **Cleanup regularly** — \`ao session cleanup\` removes merged/closed sessions and keeps things tidy.
256
-
257
- 7. **Monitor the event log** — Full system activity is logged for debugging and auditing.
258
-
259
- 8. **Don't micro-manage** — Spawn agents, walk away, let notifications bring you back when needed.`),d.orchestratorRules&&e.push(`## Project-Specific Rules
260
-
261
- ${d.orchestratorRules}`),e.join("\n\n")}var a2=c(51455);function a3(a){return"'"+a.replace(/'/g,"'\\''")+"'"}async function a4(a){let b=await (0,a2.open)(a,"r");try{let{size:a}=await b.stat();if(0===a)return null;let c=[],d=0,e=a;for(;e>0;){let a=Math.min(4096,e);e-=a;let f=Buffer.alloc(a);await b.read(f,0,a,e),c.unshift(f),d+=a;let g=Buffer.concat(c,d).toString("utf-8").split("\n");for(let a=g.length-1;a>=0;a--){let b=g[a].trim();if(b&&(a>0||0===e))return b}}return Buffer.concat(c,d).toString("utf-8").trim()||null}finally{await b.close()}}async function a5(a){try{let[b,c]=await Promise.all([a4(a),(0,a2.stat)(a)]);if(!b)return null;let d=JSON.parse(b);if("object"==typeof d&&null!==d&&!Array.isArray(d))return{lastType:"string"==typeof d.type?d.type:null,modifiedAt:c.mtime};return{lastType:null,modifiedAt:c.mtime}}catch{return null}}function a6(a,b){for(let[c,d]of Object.entries(a.projects)){let a=d.sessionPrefix;if(b===a||b.startsWith(`${a}-`))return c}}function a7(a){return(0,f.join)(a,".ao","activity.jsonl")}async function a8(a,b,c,d){let e=a7(a);await (0,a2.mkdir)((0,f.dirname)(e),{recursive:!0});let g={ts:new Date().toISOString(),state:b,source:c,...void 0!==d&&("waiting_input"===b||"blocked"===b)&&{trigger:d}};await (0,a2.appendFile)(e,JSON.stringify(g)+"\n","utf-8")}async function a9(a){let b=a7(a);try{let{open:a}=await Promise.resolve().then(c.t.bind(c,51455,19)),d=await a(b,"r");try{let a=await d.stat();if(0===a.size)return null;let b=Math.min(a.size,4096),c=Math.max(0,a.size-b),e=Buffer.alloc(b),{bytesRead:f}=await d.read(e,0,b,c);if(0===f)return null;let g=e.subarray(0,f).toString("utf-8").split("\n").filter(a=>a.trim());if(c>0&&g.length>1&&(g=g.slice(1)),0===g.length)return null;let h=null;for(let a=g.length-1;a>=0;a--)try{h=JSON.parse(g[a]);break}catch{continue}if(null===h||"object"!=typeof h||null===h||Array.isArray(h))return null;let i=h,j=new Set(["active","ready","idle","waiting_input","blocked","exited"]),k=new Set(["terminal","native"]);if("string"!=typeof i.ts||"string"!=typeof i.state||"string"!=typeof i.source||!j.has(i.state)||!k.has(i.source))return null;return{entry:{ts:i.ts,state:i.state,source:i.source,..."string"==typeof i.trigger&&{trigger:i.trigger}},modifiedAt:a.mtime}}finally{await d.close()}}catch{return null}}function ba(a){if(!a)return null;let{entry:b}=a;if("waiting_input"===b.state||"blocked"===b.state){let a=new Date(b.ts);if(Number.isNaN(a.getTime()))return null;if(Date.now()-a.getTime()<=3e5)return{state:b.state,timestamp:a}}return null}function bb(a,b,c){let d;if(!a)return null;let{entry:e}=a,f=new Date(e.ts);if(Number.isNaN(f.getTime()))return null;if("waiting_input"===e.state||"blocked"===e.state)return Date.now()-f.getTime()<=3e5?{state:e.state,timestamp:f}:{state:"idle",timestamp:f};let g=Math.max(0,Date.now()-f.getTime());d=g<=b?"active":g<=c?"ready":"idle";let h={active:0,ready:1,idle:2},i=h[e.state]??2;return{state:(h[d]??2)>=i?d:e.state,timestamp:f}}async function bc(a,b,c){let{state:d,trigger:e}=function(a,b){let c=b(a),d="waiting_input"===c||"blocked"===c?a.trim().split("\n").slice(-3).join("\n"):void 0;return{state:c,trigger:d}}(b,c);if("waiting_input"!==d&&"blocked"!==d){let b=await a9(a);if(b&&b.entry.state===d&&Date.now()-b.modifiedAt.getTime()<2e4)return}await a8(a,d,"terminal",e)}let bd="/usr/local/bin",be=`${bd}/gh`;function bf(){return(0,f.join)((0,g.homedir)(),".ao","bin")}let bg="0.2.0";function bh(a){let b=(a??"/usr/bin:/bin").split(":").filter(Boolean),c=[],d=new Set,e=a=>{!a||d.has(a)||(c.push(a),d.add(a))};for(let a of(e(bf()),e(bd),b))e(a);return c.join(":")}let bi=`#!/usr/bin/env bash
262
- # ao-metadata-helper — shared by gh/git wrappers
263
- # Provides: update_ao_metadata <key> <value>
264
-
265
- update_ao_metadata() {
266
- local key="$1" value="$2"
267
- local ao_dir="\${AO_DATA_DIR:-}"
268
- local ao_session="\${AO_SESSION:-}"
269
-
270
- [[ -z "$ao_dir" || -z "$ao_session" ]] && return 0
271
-
272
- # Validate: session name must not contain path separators or traversal
273
- case "$ao_session" in
274
- */* | *..*) return 0 ;;
275
- esac
276
-
277
- # Validate: ao_dir must be an absolute path under known ao directories or /tmp
278
- case "$ao_dir" in
279
- "$HOME"/.ao/* | "$HOME"/.agent-orchestrator/* | /tmp/*) ;;
280
- *) return 0 ;;
281
- esac
282
-
283
- local metadata_file="$ao_dir/$ao_session"
284
-
285
- # Resolve symlinks and verify canonicalized paths are still within trusted roots
286
- local real_dir real_ao_dir
287
- real_ao_dir="$(cd "$ao_dir" 2>/dev/null && pwd -P)" || return 0
288
- real_dir="$(cd "$(dirname "$metadata_file")" 2>/dev/null && pwd -P)" || return 0
289
-
290
- # Re-validate real_ao_dir against trusted roots after canonicalization
291
- # (prevents /tmp/../../home/user from escaping the allowlist)
292
- case "$real_ao_dir" in
293
- "$HOME"/.ao/* | "$HOME"/.ao | "$HOME"/.agent-orchestrator/* | "$HOME"/.agent-orchestrator | /tmp/*) ;;
294
- *) return 0 ;;
295
- esac
296
-
297
- [[ "$real_dir" == "$real_ao_dir"* ]] || return 0
298
-
299
- [[ -f "$metadata_file" ]] || return 0
300
-
301
- # Validate key — only allow alphanumeric, underscore, hyphen (prevents sed injection)
302
- [[ "$key" =~ ^[a-zA-Z0-9_-]+$ ]] || return 0
303
-
304
- local temp_file="\${metadata_file}.tmp.$$"
305
-
306
- # Strip newlines from value to prevent metadata line injection
307
- local clean_value="$(printf '%s' "$value" | tr -d '\\n')"
308
-
309
- # Escape sed metacharacters in value (& expands to matched text, | breaks delimiter)
310
- local escaped_value="$(printf '%s' "$clean_value" | sed 's/[&|\\\\]/\\\\&/g')"
311
-
312
- if grep -q "^\${key}=" "$metadata_file" 2>/dev/null; then
313
- sed "s|^\${key}=.*|\${key}=\${escaped_value}|" "$metadata_file" > "$temp_file"
314
- else
315
- cp "$metadata_file" "$temp_file"
316
- printf '%s=%s\\n' "$key" "$clean_value" >> "$temp_file"
317
- fi
318
-
319
- mv "$temp_file" "$metadata_file"
320
- }
321
- `,bj=`#!/usr/bin/env bash
322
- # ao gh wrapper — auto-updates session metadata on PR operations
323
-
324
- # Find real gh by removing our wrapper directory from PATH
325
- ao_bin_dir="$(cd "$(dirname "$0")" && pwd)"
326
- clean_path="$(echo "$PATH" | tr ':' '\\n' | grep -Fxv "$ao_bin_dir" | grep . | tr '\\n' ':')"
327
- clean_path="\${clean_path%:}"
328
- real_gh=""
329
-
330
- # Prefer explicit gh path when provided by AO environment.
331
- # Guard against recursive self-reference to the wrapper in ~/.ao/bin.
332
- if [[ -n "\${GH_PATH:-}" && -x "$GH_PATH" ]]; then
333
- gh_dir="$(cd "$(dirname "$GH_PATH")" 2>/dev/null && pwd)"
334
- if [[ "$gh_dir" != "$ao_bin_dir" ]]; then
335
- real_gh="$GH_PATH"
336
- fi
337
- fi
338
-
339
- if [[ -z "$real_gh" ]]; then
340
- real_gh="$(PATH="$clean_path" command -v gh 2>/dev/null)"
341
- fi
342
-
343
- if [[ -z "$real_gh" ]]; then
344
- echo "ao-wrapper: gh not found in PATH" >&2
345
- exit 127
346
- fi
347
-
348
- # Source the metadata helper
349
- source "$ao_bin_dir/ao-metadata-helper.sh" 2>/dev/null || true
350
-
351
- # Only capture output for commands we need to parse (pr/create, pr/merge).
352
- # All other commands pass through transparently without stream merging.
353
- case "$1/$2" in
354
- pr/create|pr/merge)
355
- tmpout="$(mktemp)"
356
- trap 'rm -f "$tmpout"' EXIT
357
-
358
- "$real_gh" "$@" 2>&1 | tee "$tmpout"
359
- exit_code=\${PIPESTATUS[0]}
360
-
361
- if [[ $exit_code -eq 0 ]]; then
362
- output="$(cat "$tmpout")"
363
- case "$1/$2" in
364
- pr/create)
365
- pr_url="$(echo "$output" | grep -Eo 'https://github\\.com/[^/]+/[^/]+/pull/[0-9]+' | head -1)"
366
- if [[ -n "$pr_url" ]]; then
367
- update_ao_metadata pr "$pr_url"
368
- update_ao_metadata status pr_open
369
- fi
370
- ;;
371
- pr/merge)
372
- update_ao_metadata status merged
373
- ;;
374
- esac
375
- fi
376
-
377
- exit $exit_code
378
- ;;
379
- *)
380
- exec "$real_gh" "$@"
381
- ;;
382
- esac
383
- `,bk=`#!/usr/bin/env bash
384
- # ao git wrapper — auto-updates session metadata on branch operations
385
-
386
- # Find real git by removing our wrapper directory from PATH
387
- ao_bin_dir="$(cd "$(dirname "$0")" && pwd)"
388
- clean_path="$(echo "$PATH" | tr ':' '\\n' | grep -Fxv "$ao_bin_dir" | grep . | tr '\\n' ':')"
389
- clean_path="\${clean_path%:}"
390
- real_git="$(PATH="$clean_path" command -v git 2>/dev/null)"
391
-
392
- if [[ -z "$real_git" ]]; then
393
- echo "ao-wrapper: git not found in PATH" >&2
394
- exit 127
395
- fi
396
-
397
- # Source the metadata helper
398
- source "$ao_bin_dir/ao-metadata-helper.sh" 2>/dev/null || true
399
-
400
- # Run real git
401
- "$real_git" "$@"
402
- exit_code=$?
403
-
404
- # Only update metadata on success
405
- if [[ $exit_code -eq 0 ]]; then
406
- case "$1/$2" in
407
- checkout/-b)
408
- update_ao_metadata branch "$3"
409
- ;;
410
- switch/-c)
411
- update_ao_metadata branch "$3"
412
- ;;
413
- checkout/*|switch/*)
414
- # Existing branch switch — only track feature-looking branches (contain / or -)
415
- # Skip flags (e.g. -B), HEAD, tags, commit hashes, and simple names like "main"
416
- branch="$2"
417
- # If $2 is a flag, the actual branch name is in $3
418
- if [[ "$branch" == -* ]]; then branch="$3"; fi
419
- if [[ -n "$branch" && "$branch" != "HEAD" && "$branch" != -* && "$branch" == *[/-]* ]]; then
420
- update_ao_metadata branch "$branch"
421
- fi
422
- ;;
423
- esac
424
- fi
425
-
426
- exit $exit_code
427
- `,bl=`
428
- ## Agent Orchestrator (ao) Session
429
-
430
- You are running inside an Agent Orchestrator managed workspace.
431
- Session metadata is updated automatically via shell wrappers.
432
-
433
- If automatic updates fail, you can manually update metadata:
434
- \`\`\`bash
435
- ~/.ao/bin/ao-metadata-helper.sh # sourced automatically
436
- # Then call: update_ao_metadata <key> <value>
437
- \`\`\`
438
- `;async function bm(a,b,c){let d=(0,k.randomBytes)(6).toString("hex"),e=`${a}.tmp.${d}`;await (0,a2.writeFile)(e,b,{encoding:"utf-8",mode:c}),await (0,a2.rename)(e,a)}async function bn(a){await (0,a2.mkdir)(bf(),{recursive:!0});let b=(0,f.join)(bf(),".ao-version"),c=!0;try{(await (0,a2.readFile)(b,"utf-8")).trim()===bg&&(c=!1)}catch{}c&&(await bm((0,f.join)(bf(),"ao-metadata-helper.sh"),bi,493),await bm((0,f.join)(bf(),"gh"),bj,493),await bm((0,f.join)(bf(),"git"),bk,493),await bm(b,bg,420));let d=(0,f.join)(a,".ao","AGENTS.md");await (0,a2.mkdir)((0,f.join)(a,".ao"),{recursive:!0}),await (0,a2.writeFile)(d,bl.trimStart(),"utf-8")}let bo={BUG_REPORT:"bug_report",IMPROVEMENT_SUGGESTION:"improvement_suggestion"},bp=j.Yj().transform(a=>a.trim().replace(/\s+/g," ")).pipe(j.Yj().min(1));j.Ik({title:bp,body:bp,evidence:j.YO(bp).min(1),session:bp,source:bp,confidence:j.ai().finite().min(0).max(1)}).strict(),bo.BUG_REPORT,bo.IMPROVEMENT_SUGGESTION,j.Yj().regex(/^report_[A-Za-z0-9_-]+$/),j.Yj().datetime({offset:!0}),j.Yj().regex(/^[a-f0-9]{16}$/)},24507:a=>{function b(a){return Promise.resolve().then(()=>{var b=Error("Cannot find module '"+a+"'");throw b.code="MODULE_NOT_FOUND",b})}b.keys=()=>[],b.resolve=b,b.id=24507,a.exports=b},44017:()=>{},53745:()=>{}};