@made-by-moonlight/athene-web 0.9.2 → 0.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (319) hide show
  1. package/.next/BUILD_ID +1 -1
  2. package/.next/app-build-manifest.json +241 -219
  3. package/.next/app-path-routes-manifest.json +10 -7
  4. package/.next/build-manifest.json +6 -6
  5. package/.next/prerender-manifest.json +23 -23
  6. package/.next/react-loadable-manifest.json +5 -5
  7. package/.next/required-server-files.json +4 -4
  8. package/.next/routes-manifest.json +16 -0
  9. package/.next/server/app/_not-found/page.js +2 -2
  10. package/.next/server/app/_not-found/page.js.nft.json +1 -1
  11. package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  12. package/.next/server/app/_not-found.html +1 -1
  13. package/.next/server/app/_not-found.rsc +9 -9
  14. package/.next/server/app/api/backlog/route.js +1 -1
  15. package/.next/server/app/api/backlog/route.js.nft.json +1 -1
  16. package/.next/server/app/api/backlog/route_client-reference-manifest.js +1 -1
  17. package/.next/server/app/api/browse-directory/route.js +1 -1
  18. package/.next/server/app/api/browse-directory/route_client-reference-manifest.js +1 -1
  19. package/.next/server/app/api/filesystem/browse/route.js +1 -1
  20. package/.next/server/app/api/filesystem/browse/route.js.nft.json +1 -1
  21. package/.next/server/app/api/filesystem/browse/route_client-reference-manifest.js +1 -1
  22. package/.next/server/app/api/issues/route.js +1 -1
  23. package/.next/server/app/api/issues/route.js.nft.json +1 -1
  24. package/.next/server/app/api/issues/route_client-reference-manifest.js +1 -1
  25. package/.next/server/app/api/meta/[name]/start/route.js +1 -0
  26. package/.next/server/app/api/meta/[name]/start/route.js.nft.json +1 -0
  27. package/.next/server/app/api/meta/[name]/start/route_client-reference-manifest.js +1 -0
  28. package/.next/server/app/api/meta/route.js +1 -0
  29. package/.next/server/app/api/meta/route.js.nft.json +1 -0
  30. package/.next/server/app/api/meta/route_client-reference-manifest.js +1 -0
  31. package/.next/server/app/api/observability/route.js +1 -1
  32. package/.next/server/app/api/observability/route.js.nft.json +1 -1
  33. package/.next/server/app/api/observability/route_client-reference-manifest.js +1 -1
  34. package/.next/server/app/api/orchestrators/route.js +1 -1
  35. package/.next/server/app/api/orchestrators/route.js.nft.json +1 -1
  36. package/.next/server/app/api/orchestrators/route_client-reference-manifest.js +1 -1
  37. package/.next/server/app/api/projects/[id]/route.js +2 -2
  38. package/.next/server/app/api/projects/[id]/route.js.nft.json +1 -1
  39. package/.next/server/app/api/projects/[id]/route_client-reference-manifest.js +1 -1
  40. package/.next/server/app/api/projects/reload/route.js +1 -1
  41. package/.next/server/app/api/projects/reload/route.js.nft.json +1 -1
  42. package/.next/server/app/api/projects/reload/route_client-reference-manifest.js +1 -1
  43. package/.next/server/app/api/projects/route.js +1 -1
  44. package/.next/server/app/api/projects/route.js.nft.json +1 -1
  45. package/.next/server/app/api/projects/route_client-reference-manifest.js +1 -1
  46. package/.next/server/app/api/prs/[id]/merge/route.js +1 -1
  47. package/.next/server/app/api/prs/[id]/merge/route.js.nft.json +1 -1
  48. package/.next/server/app/api/prs/[id]/merge/route_client-reference-manifest.js +1 -1
  49. package/.next/server/app/api/reviews/execute/route.js +1 -1
  50. package/.next/server/app/api/reviews/execute/route.js.nft.json +1 -1
  51. package/.next/server/app/api/reviews/execute/route_client-reference-manifest.js +1 -1
  52. package/.next/server/app/api/reviews/findings/route.js +1 -1
  53. package/.next/server/app/api/reviews/findings/route.js.nft.json +1 -1
  54. package/.next/server/app/api/reviews/findings/route_client-reference-manifest.js +1 -1
  55. package/.next/server/app/api/reviews/route.js +1 -1
  56. package/.next/server/app/api/reviews/route.js.nft.json +1 -1
  57. package/.next/server/app/api/reviews/route_client-reference-manifest.js +1 -1
  58. package/.next/server/app/api/reviews/send/route.js +1 -1
  59. package/.next/server/app/api/reviews/send/route.js.nft.json +1 -1
  60. package/.next/server/app/api/reviews/send/route_client-reference-manifest.js +1 -1
  61. package/.next/server/app/api/runtime/terminal/route.js +1 -1
  62. package/.next/server/app/api/runtime/terminal/route_client-reference-manifest.js +1 -1
  63. package/.next/server/app/api/sessions/[id]/kill/route.js +1 -1
  64. package/.next/server/app/api/sessions/[id]/kill/route.js.nft.json +1 -1
  65. package/.next/server/app/api/sessions/[id]/kill/route_client-reference-manifest.js +1 -1
  66. package/.next/server/app/api/sessions/[id]/message/route.js +1 -1
  67. package/.next/server/app/api/sessions/[id]/message/route.js.nft.json +1 -1
  68. package/.next/server/app/api/sessions/[id]/message/route_client-reference-manifest.js +1 -1
  69. package/.next/server/app/api/sessions/[id]/remap/route.js +1 -1
  70. package/.next/server/app/api/sessions/[id]/remap/route.js.nft.json +1 -1
  71. package/.next/server/app/api/sessions/[id]/remap/route_client-reference-manifest.js +1 -1
  72. package/.next/server/app/api/sessions/[id]/restore/route.js +1 -1
  73. package/.next/server/app/api/sessions/[id]/restore/route.js.nft.json +1 -1
  74. package/.next/server/app/api/sessions/[id]/restore/route_client-reference-manifest.js +1 -1
  75. package/.next/server/app/api/sessions/[id]/route.js +1 -1
  76. package/.next/server/app/api/sessions/[id]/route.js.nft.json +1 -1
  77. package/.next/server/app/api/sessions/[id]/route_client-reference-manifest.js +1 -1
  78. package/.next/server/app/api/sessions/[id]/send/route.js +1 -1
  79. package/.next/server/app/api/sessions/[id]/send/route.js.nft.json +1 -1
  80. package/.next/server/app/api/sessions/[id]/send/route_client-reference-manifest.js +1 -1
  81. package/.next/server/app/api/sessions/patches/route.js +1 -1
  82. package/.next/server/app/api/sessions/patches/route.js.nft.json +1 -1
  83. package/.next/server/app/api/sessions/patches/route_client-reference-manifest.js +1 -1
  84. package/.next/server/app/api/sessions/route.js +1 -1
  85. package/.next/server/app/api/sessions/route.js.nft.json +1 -1
  86. package/.next/server/app/api/sessions/route_client-reference-manifest.js +1 -1
  87. package/.next/server/app/api/setup-labels/route.js +1 -1
  88. package/.next/server/app/api/setup-labels/route.js.nft.json +1 -1
  89. package/.next/server/app/api/setup-labels/route_client-reference-manifest.js +1 -1
  90. package/.next/server/app/api/spawn/route.js +1 -1
  91. package/.next/server/app/api/spawn/route.js.nft.json +1 -1
  92. package/.next/server/app/api/spawn/route_client-reference-manifest.js +1 -1
  93. package/.next/server/app/api/update/route.js +1 -1
  94. package/.next/server/app/api/update/route.js.nft.json +1 -1
  95. package/.next/server/app/api/update/route_client-reference-manifest.js +1 -1
  96. package/.next/server/app/api/verify/route.js +1 -1
  97. package/.next/server/app/api/verify/route.js.nft.json +1 -1
  98. package/.next/server/app/api/verify/route_client-reference-manifest.js +1 -1
  99. package/.next/server/app/api/version/route.js +1 -1
  100. package/.next/server/app/api/version/route.js.nft.json +1 -1
  101. package/.next/server/app/api/version/route_client-reference-manifest.js +1 -1
  102. package/.next/server/app/api/webhooks/[...slug]/route.js +1 -1
  103. package/.next/server/app/api/webhooks/[...slug]/route.js.nft.json +1 -1
  104. package/.next/server/app/api/webhooks/[...slug]/route_client-reference-manifest.js +1 -1
  105. package/.next/server/app/apple-icon/route.js +1 -1
  106. package/.next/server/app/apple-icon/route.js.nft.json +1 -1
  107. package/.next/server/app/apple-icon/route_client-reference-manifest.js +1 -1
  108. package/.next/server/app/apple-icon.body +0 -0
  109. package/.next/server/app/dev/terminal-test/page.js +2 -2
  110. package/.next/server/app/dev/terminal-test/page.js.nft.json +1 -1
  111. package/.next/server/app/dev/terminal-test/page_client-reference-manifest.js +1 -1
  112. package/.next/server/app/dev/terminal-test.html +1 -1
  113. package/.next/server/app/dev/terminal-test.rsc +10 -10
  114. package/.next/server/app/icon/route.js +1 -1
  115. package/.next/server/app/icon/route.js.nft.json +1 -1
  116. package/.next/server/app/icon/route_client-reference-manifest.js +1 -1
  117. package/.next/server/app/icon-192/route.js +1 -1
  118. package/.next/server/app/icon-192/route.js.nft.json +1 -1
  119. package/.next/server/app/icon-192/route_client-reference-manifest.js +1 -1
  120. package/.next/server/app/icon-512/route.js +1 -1
  121. package/.next/server/app/icon-512/route.js.nft.json +1 -1
  122. package/.next/server/app/icon-512/route_client-reference-manifest.js +1 -1
  123. package/.next/server/app/icon.body +0 -0
  124. package/.next/server/app/manifest.webmanifest/route.js +1 -1
  125. package/.next/server/app/manifest.webmanifest/route.js.nft.json +1 -1
  126. package/.next/server/app/manifest.webmanifest/route_client-reference-manifest.js +1 -1
  127. package/.next/server/app/manifest.webmanifest.body +1 -1
  128. package/.next/server/app/meta/[name]/page.js +2 -0
  129. package/.next/server/app/meta/[name]/page.js.nft.json +1 -0
  130. package/.next/server/app/meta/[name]/page_client-reference-manifest.js +1 -0
  131. package/.next/server/app/page.js +2 -2
  132. package/.next/server/app/page.js.nft.json +1 -1
  133. package/.next/server/app/page_client-reference-manifest.js +1 -1
  134. package/.next/server/app/projects/[projectId]/page.js +2 -2
  135. package/.next/server/app/projects/[projectId]/page.js.nft.json +1 -1
  136. package/.next/server/app/projects/[projectId]/page_client-reference-manifest.js +1 -1
  137. package/.next/server/app/projects/[projectId]/sessions/[id]/page.js +2 -2
  138. package/.next/server/app/projects/[projectId]/sessions/[id]/page.js.nft.json +1 -1
  139. package/.next/server/app/projects/[projectId]/sessions/[id]/page_client-reference-manifest.js +1 -1
  140. package/.next/server/app/projects/[projectId]/settings/page.js +2 -2
  141. package/.next/server/app/projects/[projectId]/settings/page.js.nft.json +1 -1
  142. package/.next/server/app/projects/[projectId]/settings/page_client-reference-manifest.js +1 -1
  143. package/.next/server/app/prs/page.js +2 -2
  144. package/.next/server/app/prs/page.js.nft.json +1 -1
  145. package/.next/server/app/prs/page_client-reference-manifest.js +1 -1
  146. package/.next/server/app/review/page.js +2 -2
  147. package/.next/server/app/review/page.js.nft.json +1 -1
  148. package/.next/server/app/review/page_client-reference-manifest.js +1 -1
  149. package/.next/server/app/reviews/page.js +2 -2
  150. package/.next/server/app/reviews/page.js.nft.json +1 -1
  151. package/.next/server/app/reviews/page_client-reference-manifest.js +1 -1
  152. package/.next/server/app/sessions/[id]/page.js +2 -2
  153. package/.next/server/app/sessions/[id]/page.js.nft.json +1 -1
  154. package/.next/server/app/sessions/[id]/page_client-reference-manifest.js +1 -1
  155. package/.next/server/app/test-direct/page.js +2 -2
  156. package/.next/server/app/test-direct/page.js.nft.json +1 -1
  157. package/.next/server/app/test-direct/page_client-reference-manifest.js +1 -1
  158. package/.next/server/app/test-direct.html +1 -1
  159. package/.next/server/app/test-direct.rsc +10 -10
  160. package/.next/server/app-paths-manifest.json +10 -7
  161. package/.next/server/chunks/1215.js +1 -1
  162. package/.next/server/chunks/1271.js +1 -1
  163. package/.next/server/chunks/1351.js +3 -0
  164. package/.next/server/chunks/1612.js +1 -0
  165. package/.next/server/chunks/2899.js +1 -1
  166. package/.next/server/chunks/5053.js +1 -1
  167. package/.next/server/chunks/5684.js +942 -0
  168. package/.next/server/chunks/6148.js +2 -2
  169. package/.next/server/chunks/{4033.js → 6319.js} +1 -1
  170. package/.next/server/chunks/7486.js +3 -3
  171. package/.next/server/chunks/9472.js +102 -40
  172. package/.next/server/middleware-build-manifest.js +1 -1
  173. package/.next/server/middleware-react-loadable-manifest.js +1 -1
  174. package/.next/server/next-font-manifest.js +1 -1
  175. package/.next/server/next-font-manifest.json +1 -1
  176. package/.next/server/pages/404.html +1 -1
  177. package/.next/server/pages/500.html +1 -1
  178. package/.next/server/server-reference-manifest.json +1 -1
  179. package/.next/static/TSIgyOuEpSp86lKtHn-Y4/_buildManifest.js +1 -0
  180. package/.next/static/chunks/1089-89713836690dc384.js +1 -0
  181. package/.next/static/chunks/{9876-de0c5a1a319b4e8e.js → 1145-b66ea7e0df4f6842.js} +1 -1
  182. package/.next/static/chunks/1160-0ae37be89137bb48.js +1 -0
  183. package/.next/static/chunks/{2073-4192de0bb00cc993.js → 2554-dbb4cd7dd7f11245.js} +1 -1
  184. package/.next/static/chunks/3764.9c44a4ac0ede4088.js +1 -0
  185. package/.next/static/chunks/5204.0d460c9e7de8b015.js +1 -0
  186. package/.next/static/chunks/8759-2ef1cec1061e251a.js +1 -0
  187. package/.next/static/chunks/9531-6d130ea1232ee102.js +1 -0
  188. package/.next/static/chunks/app/_not-found/page-5634011a1475aa0d.js +1 -0
  189. package/.next/static/chunks/app/api/backlog/route-5634011a1475aa0d.js +1 -0
  190. package/.next/static/chunks/app/api/browse-directory/route-5634011a1475aa0d.js +1 -0
  191. package/.next/static/chunks/app/api/filesystem/browse/route-5634011a1475aa0d.js +1 -0
  192. package/.next/static/chunks/app/api/issues/route-5634011a1475aa0d.js +1 -0
  193. package/.next/static/chunks/app/api/meta/[name]/start/route-5634011a1475aa0d.js +1 -0
  194. package/.next/static/chunks/app/api/meta/route-5634011a1475aa0d.js +1 -0
  195. package/.next/static/chunks/app/api/observability/route-5634011a1475aa0d.js +1 -0
  196. package/.next/static/chunks/app/api/orchestrators/route-5634011a1475aa0d.js +1 -0
  197. package/.next/static/chunks/app/api/projects/[id]/route-5634011a1475aa0d.js +1 -0
  198. package/.next/static/chunks/app/api/projects/reload/route-5634011a1475aa0d.js +1 -0
  199. package/.next/static/chunks/app/api/projects/route-5634011a1475aa0d.js +1 -0
  200. package/.next/static/chunks/app/api/prs/[id]/merge/route-5634011a1475aa0d.js +1 -0
  201. package/.next/static/chunks/app/api/reviews/execute/route-5634011a1475aa0d.js +1 -0
  202. package/.next/static/chunks/app/api/reviews/findings/route-5634011a1475aa0d.js +1 -0
  203. package/.next/static/chunks/app/api/reviews/route-5634011a1475aa0d.js +1 -0
  204. package/.next/static/chunks/app/api/reviews/send/route-5634011a1475aa0d.js +1 -0
  205. package/.next/static/chunks/app/api/runtime/terminal/route-5634011a1475aa0d.js +1 -0
  206. package/.next/static/chunks/app/api/sessions/[id]/kill/route-5634011a1475aa0d.js +1 -0
  207. package/.next/static/chunks/app/api/sessions/[id]/message/route-5634011a1475aa0d.js +1 -0
  208. package/.next/static/chunks/app/api/sessions/[id]/remap/route-5634011a1475aa0d.js +1 -0
  209. package/.next/static/chunks/app/api/sessions/[id]/restore/route-5634011a1475aa0d.js +1 -0
  210. package/.next/static/chunks/app/api/sessions/[id]/route-5634011a1475aa0d.js +1 -0
  211. package/.next/static/chunks/app/api/sessions/[id]/send/route-5634011a1475aa0d.js +1 -0
  212. package/.next/static/chunks/app/api/sessions/patches/route-5634011a1475aa0d.js +1 -0
  213. package/.next/static/chunks/app/api/sessions/route-5634011a1475aa0d.js +1 -0
  214. package/.next/static/chunks/app/api/setup-labels/route-5634011a1475aa0d.js +1 -0
  215. package/.next/static/chunks/app/api/spawn/route-5634011a1475aa0d.js +1 -0
  216. package/.next/static/chunks/app/api/update/route-5634011a1475aa0d.js +1 -0
  217. package/.next/static/chunks/app/api/verify/route-5634011a1475aa0d.js +1 -0
  218. package/.next/static/chunks/app/api/version/route-5634011a1475aa0d.js +1 -0
  219. package/.next/static/chunks/app/api/webhooks/[...slug]/route-5634011a1475aa0d.js +1 -0
  220. package/.next/static/chunks/app/apple-icon/route-5634011a1475aa0d.js +1 -0
  221. package/.next/static/chunks/app/dev/terminal-test/page-2a26b5fc208a0a35.js +1 -0
  222. package/.next/static/chunks/app/error-362a1ff5db756e6f.js +1 -0
  223. package/.next/static/chunks/app/{global-error-f6bef179169bcdae.js → global-error-ca208f2a552a271f.js} +1 -1
  224. package/.next/static/chunks/app/icon/route-5634011a1475aa0d.js +1 -0
  225. package/.next/static/chunks/app/icon-192/route-5634011a1475aa0d.js +1 -0
  226. package/.next/static/chunks/app/icon-512/route-5634011a1475aa0d.js +1 -0
  227. package/.next/static/chunks/app/layout-3937228484f6c652.js +1 -0
  228. package/.next/static/chunks/app/loading-5634011a1475aa0d.js +1 -0
  229. package/.next/static/chunks/app/manifest.webmanifest/route-5634011a1475aa0d.js +1 -0
  230. package/.next/static/chunks/app/meta/[name]/page-305f42c2c391f520.js +1 -0
  231. package/.next/static/chunks/app/{not-found-cba3f587e1f98dcb.js → not-found-3d7a362f3eaf10aa.js} +1 -1
  232. package/.next/static/chunks/app/page-305f42c2c391f520.js +1 -0
  233. package/.next/static/chunks/app/projects/[projectId]/layout-5634011a1475aa0d.js +1 -0
  234. package/.next/static/chunks/app/projects/[projectId]/loading-5634011a1475aa0d.js +1 -0
  235. package/.next/static/chunks/app/projects/[projectId]/page-daf2aefa15d58404.js +1 -0
  236. package/.next/static/chunks/app/projects/[projectId]/sessions/[id]/page-e3e30f31bc5a683f.js +1 -0
  237. package/.next/static/chunks/app/projects/[projectId]/settings/{page-63572555892d7a61.js → page-804b824af9b9d550.js} +1 -1
  238. package/.next/static/chunks/app/projects/layout-f7f6bc8388761510.js +1 -0
  239. package/.next/static/chunks/app/prs/page-220d66ff3931dad7.js +1 -0
  240. package/.next/static/chunks/app/review/{page-022b2d2c326ff413.js → page-13ec034d995001ab.js} +1 -1
  241. package/.next/static/chunks/app/reviews/page-5634011a1475aa0d.js +1 -0
  242. package/.next/static/chunks/app/sessions/[id]/{error-67c0d27f977a1cc1.js → error-419d086d9f9cee0d.js} +1 -1
  243. package/.next/static/chunks/app/sessions/[id]/loading-5634011a1475aa0d.js +1 -0
  244. package/.next/static/chunks/app/sessions/[id]/{not-found-cba3f587e1f98dcb.js → not-found-3d7a362f3eaf10aa.js} +1 -1
  245. package/.next/static/chunks/app/sessions/[id]/page-9879b78853fe3a80.js +1 -0
  246. package/.next/static/chunks/app/test-direct/{page-8b80ed180c0f2f42.js → page-ca223477414cb95d.js} +1 -1
  247. package/.next/static/chunks/{main-app-162601c3f1c01b19.js → main-app-bd2a1b10332da5d9.js} +1 -1
  248. package/.next/static/chunks/{webpack-f9566aaa604a1b07.js → webpack-cc5626a562806e84.js} +1 -1
  249. package/.next/static/css/0863eb7d19a9924a.css +1 -0
  250. package/.next/static/css/3effacfd2e5df88c.css +1 -0
  251. package/dist-server/mux-websocket.js +46 -25
  252. package/dist-server/single-port-server.js +2 -2
  253. package/dist-server/start-all.js +3 -3
  254. package/package.json +33 -33
  255. package/.next/server/chunks/2347.js +0 -3
  256. package/.next/server/chunks/4148.js +0 -942
  257. package/.next/server/chunks/5689.js +0 -1
  258. package/.next/server/chunks/9493.js +0 -1
  259. package/.next/static/chunks/1089-c6d7995c7c19039a.js +0 -1
  260. package/.next/static/chunks/3764.4c736d9a181489a4.js +0 -1
  261. package/.next/static/chunks/4115-1a4fa80ec67a29d3.js +0 -1
  262. package/.next/static/chunks/5204.7de7e266895bced7.js +0 -1
  263. package/.next/static/chunks/8204-7c7837ed694da99c.js +0 -1
  264. package/.next/static/chunks/8759-490573536f93f85c.js +0 -1
  265. package/.next/static/chunks/9531-a5175e55fa0db48d.js +0 -1
  266. package/.next/static/chunks/app/_not-found/page-6add9dacf1870b4b.js +0 -1
  267. package/.next/static/chunks/app/api/backlog/route-6add9dacf1870b4b.js +0 -1
  268. package/.next/static/chunks/app/api/browse-directory/route-6add9dacf1870b4b.js +0 -1
  269. package/.next/static/chunks/app/api/filesystem/browse/route-6add9dacf1870b4b.js +0 -1
  270. package/.next/static/chunks/app/api/issues/route-6add9dacf1870b4b.js +0 -1
  271. package/.next/static/chunks/app/api/observability/route-6add9dacf1870b4b.js +0 -1
  272. package/.next/static/chunks/app/api/orchestrators/route-6add9dacf1870b4b.js +0 -1
  273. package/.next/static/chunks/app/api/projects/[id]/route-6add9dacf1870b4b.js +0 -1
  274. package/.next/static/chunks/app/api/projects/reload/route-6add9dacf1870b4b.js +0 -1
  275. package/.next/static/chunks/app/api/projects/route-6add9dacf1870b4b.js +0 -1
  276. package/.next/static/chunks/app/api/prs/[id]/merge/route-6add9dacf1870b4b.js +0 -1
  277. package/.next/static/chunks/app/api/reviews/execute/route-6add9dacf1870b4b.js +0 -1
  278. package/.next/static/chunks/app/api/reviews/findings/route-6add9dacf1870b4b.js +0 -1
  279. package/.next/static/chunks/app/api/reviews/route-6add9dacf1870b4b.js +0 -1
  280. package/.next/static/chunks/app/api/reviews/send/route-6add9dacf1870b4b.js +0 -1
  281. package/.next/static/chunks/app/api/runtime/terminal/route-6add9dacf1870b4b.js +0 -1
  282. package/.next/static/chunks/app/api/sessions/[id]/kill/route-6add9dacf1870b4b.js +0 -1
  283. package/.next/static/chunks/app/api/sessions/[id]/message/route-6add9dacf1870b4b.js +0 -1
  284. package/.next/static/chunks/app/api/sessions/[id]/remap/route-6add9dacf1870b4b.js +0 -1
  285. package/.next/static/chunks/app/api/sessions/[id]/restore/route-6add9dacf1870b4b.js +0 -1
  286. package/.next/static/chunks/app/api/sessions/[id]/route-6add9dacf1870b4b.js +0 -1
  287. package/.next/static/chunks/app/api/sessions/[id]/send/route-6add9dacf1870b4b.js +0 -1
  288. package/.next/static/chunks/app/api/sessions/patches/route-6add9dacf1870b4b.js +0 -1
  289. package/.next/static/chunks/app/api/sessions/route-6add9dacf1870b4b.js +0 -1
  290. package/.next/static/chunks/app/api/setup-labels/route-6add9dacf1870b4b.js +0 -1
  291. package/.next/static/chunks/app/api/spawn/route-6add9dacf1870b4b.js +0 -1
  292. package/.next/static/chunks/app/api/update/route-6add9dacf1870b4b.js +0 -1
  293. package/.next/static/chunks/app/api/verify/route-6add9dacf1870b4b.js +0 -1
  294. package/.next/static/chunks/app/api/version/route-6add9dacf1870b4b.js +0 -1
  295. package/.next/static/chunks/app/api/webhooks/[...slug]/route-6add9dacf1870b4b.js +0 -1
  296. package/.next/static/chunks/app/apple-icon/route-6add9dacf1870b4b.js +0 -1
  297. package/.next/static/chunks/app/dev/terminal-test/page-d0132109f9d8524e.js +0 -1
  298. package/.next/static/chunks/app/error-d632d0714b987864.js +0 -1
  299. package/.next/static/chunks/app/icon/route-6add9dacf1870b4b.js +0 -1
  300. package/.next/static/chunks/app/icon-192/route-6add9dacf1870b4b.js +0 -1
  301. package/.next/static/chunks/app/icon-512/route-6add9dacf1870b4b.js +0 -1
  302. package/.next/static/chunks/app/layout-5cac6fe817194d7a.js +0 -1
  303. package/.next/static/chunks/app/loading-6add9dacf1870b4b.js +0 -1
  304. package/.next/static/chunks/app/manifest.webmanifest/route-6add9dacf1870b4b.js +0 -1
  305. package/.next/static/chunks/app/page-cf7bccb75990950d.js +0 -1
  306. package/.next/static/chunks/app/projects/[projectId]/layout-6add9dacf1870b4b.js +0 -1
  307. package/.next/static/chunks/app/projects/[projectId]/loading-6add9dacf1870b4b.js +0 -1
  308. package/.next/static/chunks/app/projects/[projectId]/page-039a93b16089ed57.js +0 -1
  309. package/.next/static/chunks/app/projects/[projectId]/sessions/[id]/page-043b525bedb8f0f7.js +0 -1
  310. package/.next/static/chunks/app/projects/layout-d43b2e38d46221bd.js +0 -1
  311. package/.next/static/chunks/app/prs/page-e447852fbe0c6ee4.js +0 -1
  312. package/.next/static/chunks/app/reviews/page-6add9dacf1870b4b.js +0 -1
  313. package/.next/static/chunks/app/sessions/[id]/loading-6add9dacf1870b4b.js +0 -1
  314. package/.next/static/chunks/app/sessions/[id]/page-863cf8dd2c76d06d.js +0 -1
  315. package/.next/static/css/0c9b7451c2ce7c02.css +0 -1
  316. package/.next/static/css/b4a15f23f468892a.css +0 -1
  317. package/.next/static/pROr0laPuZIdA4NYNygMD/_buildManifest.js +0 -1
  318. package/LICENSE +0 -22
  319. /package/.next/static/{pROr0laPuZIdA4NYNygMD → TSIgyOuEpSp86lKtHn-Y4}/_ssgManifest.js +0 -0
@@ -1,13 +1,13 @@
1
- "use strict";exports.id=9472,exports.ids=[9472],exports.modules={49472:(a,b,c)=>{c.d(b,{ix:()=>cz,wp:()=>cB,Z1:()=>cp,uj:()=>cA,g8:()=>cq,Az:()=>cu});var d=c(43780),e=c(31421),f=c(57975),g=c(58500),h=c(77598),i=c(73024),j=c(48161),k=c(76760);let l=(0,f.promisify)(e.execFile),m=/^[a-zA-Z0-9_-]+$/;function n(a){return`${a.replace(/\n+$/,"")}
1
+ "use strict";exports.id=9472,exports.ids=[9472],exports.modules={49472:(a,b,c)=>{c.d(b,{ix:()=>cA,wp:()=>cC,Z1:()=>cq,uj:()=>cB,g8:()=>cr,Az:()=>cv});var d=c(8868),e=c(31421),f=c(57975),g=c(58500),h=c(77598),i=c(73024),j=c(48161),k=c(76760);let l=(0,f.promisify)(e.execFile),m=/^[a-zA-Z0-9_-]+$/;function n(a){return`${a.replace(/\n+$/,"")}
2
2
  exec "\${SHELL:-/bin/bash}" -i`}async function o(...a){let{stdout:b}=await l("tmux",a,{timeout:5e3});return b.trimEnd()}let p={manifest:{name:"tmux",slot:"runtime",description:"Runtime plugin: tmux sessions",version:"0.1.0"},create:function(){return{name:"tmux",async create(a){var b=a.sessionId;if(!m.test(b))throw Error(`Invalid session ID "${b}": must match ${m}`);let c=a.sessionId,e=[];for(let[b,c]of Object.entries(a.environment??{}))e.push("-e",`${b}=${c}`);let f=a.environment?.PATH,g=a.launchCommand;f&&(g=`export PATH=$(printf '%s' ${JSON.stringify(f)})
3
3
  ${g}`);let l=g.length>200?function(a){let b=(0,k.join)((0,j.tmpdir)(),`ao-launch-${(0,h.randomUUID)()}.sh`),c=`#!/usr/bin/env bash
4
4
  rm -- "$0" 2>/dev/null || true
5
5
  ${n(a)}
6
- `;return(0,i.writeFileSync)(b,c,{encoding:"utf-8",mode:448}),`bash ${(0,d.kct)(b)}`}(g):n(g);await o("new-session","-d","-s",c,"-c",a.workspacePath,...e,l);try{await o("set-option","-t",c,"status","off")}catch(b){try{await o("kill-session","-t",c)}catch{}let a=b instanceof Error?b.message:String(b);throw Error(`Failed to configure or launch session "${c}": ${a}`,{cause:b})}return{id:c,runtimeName:"tmux",data:{createdAt:Date.now(),workspacePath:a.workspacePath}}},async destroy(a){try{await o("kill-session","-t",a.id)}catch{}},async sendMessage(a,b){if(await o("send-keys","-t",a.id,"C-u"),b.includes("\n")||b.length>200){let c=`ao-${(0,h.randomUUID)()}`,d=(0,k.join)((0,j.tmpdir)(),`ao-send-${(0,h.randomUUID)()}.txt`);(0,i.writeFileSync)(d,b,{encoding:"utf-8",mode:384});try{await o("load-buffer","-b",c,d),await o("paste-buffer","-b",c,"-t",a.id,"-d")}finally{try{(0,i.unlinkSync)(d)}catch{}try{await o("delete-buffer","-b",c)}catch{}}}else await o("send-keys","-t",a.id,"-l",b);await (0,g.setTimeout)(300),await o("send-keys","-t",a.id,"Enter")},async getOutput(a,b=50){try{return await o("capture-pane","-t",a.id,"-p","-S",`-${b}`)}catch{return""}},async isAlive(a){try{return await o("has-session","-t",a.id),!0}catch{return!1}},async getMetrics(a){let b=a.data.createdAt??Date.now();return{uptimeMs:Date.now()-b}},getAttachInfo:async a=>({type:"tmux",target:a.id,command:`tmux attach -t ${a.id}`}),async preflight(){try{await l("tmux",["-V"],{timeout:5e3})}catch{let a="darwin"===process.platform?"brew install tmux":"win32"===process.platform?"tmux is not available on Windows. Use WSL: wsl --install, then: sudo apt install tmux":"sudo apt install tmux (Debian/Ubuntu) or sudo dnf install tmux (Fedora)";throw Error(`tmux is not installed. Install it: ${a}`)}}}}};var q=c(73136),r=c(77030);function s(a,b){let c="string"==typeof b?Buffer.from(b,"utf-8"):b,d=Buffer.allocUnsafe(5+c.length);return d.writeUInt8(a,0),d.writeUInt32BE(c.length,1),c.copy(d,5),d}class t{constructor(a){this._buf=Buffer.alloc(0),this._onMessage=a}feed(a){for(this._buf=Buffer.concat([this._buf,a]);this._buf.length>=5;){let a=5+this._buf.readUInt32BE(1);if(this._buf.length<a)break;let b=this._buf.readUInt8(0),c=this._buf.slice(5,a);this._buf=this._buf.slice(a),this._onMessage(b,c)}}}async function u(){let a,[,,b,d,e,f,...g]=process.argv;b&&d&&e&&f||(process.stderr.write("Usage: node pty-host.js <sessionId> <pipePath> <cwd> <shellCmd> [shellArg...]\n"),process.exit(1));let{spawn:h}=await Promise.resolve().then(c.t.bind(c,14566,19)),i=f;"win32"!==process.platform||f.includes("\\")||f.includes("/")||f.endsWith(".exe")||f.endsWith(".cmd")||(i=f+".exe");let j=[],k=new Set,l=h(i,g,{name:"xterm-256color",cols:220,rows:50,cwd:e,env:process.env,encoding:null});process.stdout.write(`READY:${l.pid}
6
+ `;return(0,i.writeFileSync)(b,c,{encoding:"utf-8",mode:448}),`bash ${(0,d.kct)(b)}`}(g):n(g);await o("new-session","-d","-s",c,"-c",a.workspacePath,...e,l);try{await o("set-option","-t",c,"status","off")}catch(b){try{await o("kill-session","-t",c)}catch{}let a=b instanceof Error?b.message:String(b);throw Error(`Failed to configure or launch session "${c}": ${a}`,{cause:b})}return{id:c,runtimeName:"tmux",data:{createdAt:Date.now(),workspacePath:a.workspacePath}}},async destroy(a){try{await o("kill-session","-t",a.id)}catch{}},async sendMessage(a,b){if(await o("send-keys","-t",a.id,"C-u"),b.includes("\n")||b.length>200){let c=`ao-${(0,h.randomUUID)()}`,d=(0,k.join)((0,j.tmpdir)(),`ao-send-${(0,h.randomUUID)()}.txt`);(0,i.writeFileSync)(d,b,{encoding:"utf-8",mode:384});try{await o("load-buffer","-b",c,d),await o("paste-buffer","-b",c,"-t",a.id,"-d")}finally{try{(0,i.unlinkSync)(d)}catch{}try{await o("delete-buffer","-b",c)}catch{}}}else await o("send-keys","-t",a.id,"-l",b);await (0,g.setTimeout)(300),await o("send-keys","-t",a.id,"Enter")},async getOutput(a,b=50){try{return await o("capture-pane","-t",a.id,"-p","-S",`-${b}`)}catch{return""}},async isAlive(a){try{return await o("has-session","-t",a.id),!0}catch{return!1}},async getMetrics(a){let b=a.data.createdAt??Date.now();return{uptimeMs:Date.now()-b}},async listSessions(){let a;try{a=await o("list-sessions","-F","#{session_name} #{session_created} #{pane_pid} #{pane_tty}")}catch{return[]}return a.split("\n").map(a=>a.trim()).filter(Boolean).map(a=>{let[b="",c="",d="",e=""]=a.split(" "),f=Number(c),g=Number(d);return{id:b,createdAt:Number.isFinite(f)&&f>0?1e3*f:void 0,pid:Number.isInteger(g)&&g>0?g:void 0,tty:e||void 0}}).filter(a=>a.id.length>0)},getAttachInfo:async a=>({type:"tmux",target:a.id,command:`tmux attach -t ${a.id}`}),async preflight(){try{await l("tmux",["-V"],{timeout:5e3})}catch{let a="darwin"===process.platform?"brew install tmux":"win32"===process.platform?"tmux is not available on Windows. Use WSL: wsl --install, then: sudo apt install tmux":"sudo apt install tmux (Debian/Ubuntu) or sudo dnf install tmux (Fedora)";throw Error(`tmux is not installed. Install it: ${a}`)}}}}};var q=c(73136),r=c(77030);function s(a,b){let c="string"==typeof b?Buffer.from(b,"utf-8"):b,d=Buffer.allocUnsafe(5+c.length);return d.writeUInt8(a,0),d.writeUInt32BE(c.length,1),c.copy(d,5),d}class t{constructor(a){this._buf=Buffer.alloc(0),this._onMessage=a}feed(a){for(this._buf=Buffer.concat([this._buf,a]);this._buf.length>=5;){let a=5+this._buf.readUInt32BE(1);if(this._buf.length<a)break;let b=this._buf.readUInt8(0),c=this._buf.slice(5,a);this._buf=this._buf.slice(a),this._onMessage(b,c)}}}async function u(){let a,[,,b,d,e,f,...g]=process.argv;b&&d&&e&&f||(process.stderr.write("Usage: node pty-host.js <sessionId> <pipePath> <cwd> <shellCmd> [shellArg...]\n"),process.exit(1));let{spawn:h}=await Promise.resolve().then(c.t.bind(c,14566,19)),i=f;"win32"!==process.platform||f.includes("\\")||f.includes("/")||f.endsWith(".exe")||f.endsWith(".cmd")||(i=f+".exe");let j=[],k=new Set,l=h(i,g,{name:"xterm-256color",cols:220,rows:50,cwd:e,env:process.env,encoding:null});process.stdout.write(`READY:${l.pid}
7
7
  `);let m="";function n(a){for(let b of k)b.destroyed||b.write(a)}function o(a,b){a.destroyed||a.write(b)}l.onData(a=>{let b="string"==typeof a?Buffer.from(a,"utf-8"):Buffer.from(a),c=(m+b.toString("utf-8")).split("\n");for(let a of(m=c.pop(),c))j.push(a+"\n");j.length>1e3&&j.splice(0,j.length-1e3),n(s(1,b))}),l.onExit(({exitCode:b})=>{a=b,m&&(j.push(m),m=""),n(s(7,JSON.stringify({alive:!1,pid:l.pid,exitCode:b})))});let p=r.createServer(b=>{k.add(b),j.length>0&&o(b,s(1,Buffer.from(j.join(""),"utf-8")));let c=new t((c,d)=>{!function(b,c,d){switch(c){case 2:void 0===a&&l.write(d.toString("utf-8"));break;case 3:if(void 0===a)try{let{cols:a,rows:b}=JSON.parse(d.toString("utf-8"));"number"==typeof a&&"number"==typeof b&&l.resize(a,b)}catch{}break;case 4:{let a=50;try{let b=JSON.parse(d.toString("utf-8"));"number"==typeof b.lines&&(a=b.lines)}catch{}let c=Math.max(0,j.length-a);o(b,s(5,j.slice(c).join("")));break}case 6:{let c=void 0===a,d={alive:c,pid:l.pid};c||(d.exitCode=a),o(b,s(7,JSON.stringify(d)));break}case 8:u("MSG_KILL_REQ")}}(b,c,d)});b.on("data",a=>{c.feed(a)}),b.on("close",()=>{k.delete(b)}),b.on("error",()=>{k.delete(b)})});await new Promise((a,b)=>{p.once("error",b),p.listen(d,()=>{p.removeListener("error",b),a()})});let q=!1;function u(c){if(!q){q=!0;try{if(void 0===a)try{l.kill()}catch{}}catch{}for(let a of k)try{a.destroy()}catch{}k.clear();try{p.close()}catch{}setTimeout(()=>process.exit(0),50).unref(),process.stderr.write(`pty-host [${b}] shutdown: ${c}
8
8
  `)}}process.on("SIGTERM",()=>u("SIGTERM")),process.on("SIGINT",()=>u("SIGINT")),process.on("SIGHUP",()=>u("SIGHUP")),process.on("SIGBREAK",()=>u("SIGBREAK")),process.on("beforeExit",()=>u("beforeExit")),process.on("uncaughtException",a=>{process.stderr.write(`pty-host [${b}] uncaught: ${String(a)}
9
9
  `),u("uncaughtException")}),process.on("unhandledRejection",a=>{process.stderr.write(`pty-host [${b}] unhandled rejection: ${String(a)}
10
- `)}),process.on("exit",()=>{try{void 0===a&&l.kill()}catch{}})}function v(a,b=3e3){return new Promise((c,d)=>{let e=!1,f=(0,r.connect)(a),g=setTimeout(()=>{e||(e=!0,f.destroy(),d(Error(`Timed out connecting to pty-host at ${a} (${b}ms)`)))},b);f.once("connect",()=>{e||(e=!0,clearTimeout(g),c(f))}),f.once("error",a=>{e||(e=!0,clearTimeout(g),d(a))})})}function w(a,b){return new Promise((c,d)=>{a.write(b,a=>{a?d(a):c()})})}function x(a){return new Promise(b=>setTimeout(b,a))}async function y(a,b){let c=await v(a);return new Promise((a,d)=>{let e=!1,f=b=>{e||(e=!0,b?(c.destroy(),d(b)):(c.end(),a()))};c.once("error",f),(async()=>{try{for(let a=0;a<b.length;a+=512){let d=b.slice(a,a+512);await w(c,s(2,d)),a+512<b.length&&await x(15)}await x(300),await w(c,s(2,"\r")),f()}catch(a){f(a)}})()})}async function z(a,b=50){let c;try{c=await v(a,3e3)}catch{return""}return new Promise(a=>{let d=!1,e=b=>{d||(d=!0,clearTimeout(f),c.destroy(),a(b))},f=setTimeout(()=>e(""),3e3),g=new t((a,b)=>{5===a&&e(b.toString("utf-8"))});c.on("data",a=>g.feed(a)),c.once("error",()=>e("")),c.once("close",()=>e(""));let h=s(4,JSON.stringify({lines:b}));c.write(h)})}async function A(a){let b;try{b=await v(a,2e3)}catch{return!1}return new Promise(a=>{let c=!1,d=d=>{c||(c=!0,clearTimeout(e),b.destroy(),a(d))},e=setTimeout(()=>d(!1),2e3),f=new t((a,b)=>{if(7===a)try{JSON.parse(b.toString("utf-8")),d(!0)}catch{d(!1)}});b.on("data",a=>f.feed(a)),b.once("error",()=>d(!1)),b.once("close",()=>d(!1)),b.write(s(6,""))})}async function B(a){let b;try{b=await v(a,2e3)}catch{return}await new Promise(a=>{b.once("error",()=>a());let c=s(8,"");b.write(c,()=>{b.end(),a()})})}(process.argv[1]?.endsWith("pty-host.js")||process.argv[1]?.endsWith("pty-host.ts"))&&u();let C=/^[a-zA-Z0-9_-]+$/,D={manifest:{name:"process",slot:"runtime",description:"Runtime plugin: child processes",version:"0.1.0"},create:function(){let a=new Map;return{name:"process",async create(b){let c;var f=b.sessionId;if(!C.test(f))throw Error(`Invalid session ID "${f}": must match ${C}`);let g=b.sessionId;if(a.has(g))throw Error(`Session "${g}" already exists — destroy it before re-creating`);let h={process:null,outputBuffer:[],createdAt:Date.now()};if(a.set(g,h),(0,d.uFH)()){let c=`\\\\.\\pipe\\ao-pty-${g}`,f=(0,d.ry1)(),i=(0,k.resolve)((0,k.dirname)((0,q.fileURLToPath)("file:///home/slievr/proj/Athene/packages/plugins/runtime-process/dist/index.js")),"pty-host.js"),j={...process.env,...b.environment};try{let a=(0,e.spawn)(process.execPath,[i,g,c,b.workspacePath,f.cmd,...f.args(b.launchCommand)],{cwd:b.workspacePath,env:j,stdio:["ignore","pipe","pipe"],detached:!0,windowsHide:!0}),k=await new Promise((b,c)=>{let d=setTimeout(()=>{a.kill(),c(Error("PTY host startup timeout (10s)"))},1e4),e="";a.stdout?.on("data",a=>{let c=(e+=a.toString()).match(/READY:(\d+)/);c&&(clearTimeout(d),b(parseInt(c[1],10)))}),a.stderr?.on("data",a=>{e+=a.toString()}),a.on("error",a=>{clearTimeout(d),c(Error(`PTY host spawn error: ${a.message}`))}),a.on("exit",a=>{clearTimeout(d),c(Error(`PTY host exited during startup with code ${a}: ${e}`))})});if(a.unref(),a.stdout?.destroy(),a.stderr?.destroy(),"number"==typeof a.pid)try{(0,d.YEV)({sessionId:g,ptyHostPid:a.pid,pipePath:c})}catch{}return{id:g,runtimeName:"process",data:{pid:k,ptyHostPid:a.pid,pipePath:c,createdAt:h.createdAt}}}catch(b){throw a.delete(g),b}}let i=(0,d.ry1)();try{c=(0,e.spawn)(i.cmd,i.args(b.launchCommand),{cwd:b.workspacePath,env:{...process.env,...b.environment},stdio:["pipe","pipe","pipe"],detached:!(0,d.uFH)()})}catch(c){a.delete(g);let b=c instanceof Error?c.message:String(c);throw Error(`Failed to spawn process for session ${g}: ${b}`,{cause:c})}function j(){let a="";return b=>{let c=(a+b.toString("utf-8")).split("\n");for(let b of(a=c.pop(),c))h.outputBuffer.push(b);h.outputBuffer.length>1e3&&h.outputBuffer.splice(0,h.outputBuffer.length-1e3)}}h.process=c,c.once("exit",()=>{h.outputBuffer.push(`[process exited with code ${c.exitCode}]`),a.delete(g)}),c.on("error",()=>{}),await new Promise((b,d)=>{let e=b=>{c.removeListener("spawn",f),a.delete(g),d(Error(`Failed to spawn process for session ${g}: ${b.message}`))},f=()=>{c.removeListener("error",e),b()};c.once("error",e),c.once("spawn",f)});let l=j(),m=j();return c.stdout?.on("data",l),c.stderr?.on("data",m),c.once("exit",()=>{l(Buffer.from("\n")),m(Buffer.from("\n"))}),{id:g,runtimeName:"process",data:{pid:c.pid,createdAt:h.createdAt}}},async destroy(b){let c=b.data?.pipePath;if(c){await B(c);let e=b.data?.ptyHostPid;if("number"==typeof e&&e>0){let c=Date.now()+500;for(;Date.now()<c;){try{process.kill(e,0)}catch(c){if("EPERM"===c.code)break;a.delete(b.id);try{(0,d.unregisterWindowsPtyHost)(b.id)}catch{}return}await new Promise(a=>setTimeout(a,25))}await (0,d.g8K)(e,"SIGKILL")}a.delete(b.id);try{(0,d.unregisterWindowsPtyHost)(b.id)}catch{}return}let e=a.get(b.id);if(!e){let a=b.data?.pid;"number"==typeof a&&a>0&&await (0,d.g8K)(a,"SIGKILL");return}let f=e.process;if(!f)return void a.delete(b.id);if(null===f.exitCode&&null===f.signalCode){let a=f.pid,b=new Promise(b=>{let c=setTimeout(()=>{Promise.resolve(null===f.exitCode&&null===f.signalCode?a?(0,d.g8K)(a,"SIGKILL"):void f.kill("SIGKILL"):void 0).catch(()=>{}).finally(b)},5e3);f.once("exit",()=>{clearTimeout(c),b()})});a?await (0,d.g8K)(a,"SIGTERM"):f.kill("SIGTERM"),await b}a.delete(b.id)},async sendMessage(b,c){let d=b.data?.pipePath;if(d)return void await y(d,c);let e=a.get(b.id);if(!e)throw Error(`No process found for session ${b.id}`);let f=e.process;if(!f)throw Error(`Process for session ${b.id} is still spawning`);let g=f.stdin;if(!g||!g.writable)throw Error(`stdin not writable for session ${b.id}`);await new Promise((a,b)=>{let d=!1,e=c=>{d||(d=!0,i(),c?b(c):a())},f=a=>e(a),h=()=>{},i=()=>{g.removeListener("error",f),g.removeListener("drain",h)};g.on("error",f),g.on("drain",h),g.write(c+"\n",a=>e(a??null))})},async getOutput(b,c=50){let d=b.data?.pipePath;if(d)return z(d,c);let e=a.get(b.id);if(!e)return"";let f=e.outputBuffer,g=Math.max(0,f.length-c);return f.slice(g).join("\n")},async isAlive(b){let c=b.data?.pipePath;if(c)return A(c);let d=a.get(b.id);if(!d||!d.process){let a=b.data?.pid;if("number"==typeof a&&a>0)try{return process.kill(a,0),!0}catch(a){if("EPERM"===a.code)return!0}return!1}return null===d.process.exitCode&&null===d.process.signalCode},async getMetrics(b){let c=a.get(b.id),d=c?.createdAt??Date.now();return{uptimeMs:Date.now()-d}},async getAttachInfo(b){let c=b.data?.pipePath;if(c)return await A(c)?{type:"process",target:String(b.data?.pid??""),command:c}:{type:"process",target:"",command:`# process for session ${b.id} is no longer running`};let d=a.get(b.id);return d&&d.process&&null===d.process.exitCode&&null===d.process.signalCode?{type:"process",target:String(d.process.pid)}:{type:"process",target:"",command:`# process for session ${b.id} is no longer running`}}}}};var E=c(51455);let F=(0,f.promisify)(e.execFile);function G(a){return a.replace(/\\/g,"/").replace(/[^a-zA-Z0-9-]/g,"-")}async function H(a){try{return await (0,E.realpath)(a)}catch{return a}}let I=new Set;async function J(a,b){let c;if(b){let c=(0,k.join)(a,`${b}.jsonl`);try{return await (0,E.stat)(c),c}catch{}}try{c=await (0,E.readdir)(a)}catch(b){if(b instanceof Error&&"code"in b&&"ENOENT"!==b.code&&!I.has(a)){I.add(a);let c=b.code;console.warn(`[claude-code] failed to read ${a} (${c}): ${b.message}. Session activity will fall back to AO JSONL only. (This warning is shown once per path for the process lifetime.)`)}return null}let d=c.filter(a=>a.endsWith(".jsonl")&&!a.startsWith("agent-"));if(0===d.length)return null;let e=await Promise.all(d.map(async b=>{let c=(0,k.join)(a,b);try{let a=await (0,E.stat)(c);return{path:c,mtime:a.mtimeMs}}catch{return{path:c,mtime:0}}}));return e.sort((a,b)=>b.mtime-a.mtime),e[0]?.path??null}let K=null;async function L(){if((0,d.uFH)())return"";let a=Date.now();if(K&&a-K.timestamp<5e3)return K.promise?K.promise:K.output;let b=F("ps",["-eo","pid,tty,args"],{timeout:3e4}).then(({stdout:a})=>(K?.promise===b&&(K={output:a||d.HkR,timestamp:Date.now()}),a||d.HkR)).catch(()=>(K?.promise===b&&(K={output:d.HkR,timestamp:Date.now()}),d.HkR));return K={output:"",timestamp:a,promise:b},b}async function M(a){try{if("tmux"===a.runtimeName&&a.id){if((0,d.uFH)())return null;let{stdout:b}=await F("tmux",["list-panes","-t",a.id,"-F","#{pane_tty}"],{timeout:3e4}),c=b.trim().split("\n").map(a=>a.trim()).filter(Boolean);if(0===c.length)return null;let e=await L();if(e===d.HkR)return d.HkR;let f=new Set(c.map(a=>a.replace(/^\/dev\//,""))),g=/(?:^|\/)(?:\.)?claude(?:[-.][\w-]+)*(?:[\s/]|$)/;for(let a of e.split("\n")){let b=a.trimStart().split(/\s+/);if(b.length<3||!f.has(b[1]??""))continue;let c=b.slice(2).join(" ");if(g.test(c))return parseInt(b[0]??"0",10)}return null}let b=a.data.pid,c="number"==typeof b?b:Number(b);if(Number.isFinite(c)&&c>0)try{return process.kill(c,0),c}catch(a){if(a instanceof Error&&"code"in a&&"EPERM"===a.code)return c}return null}catch{return d.HkR}}async function N(a){let b=await M(a);return b===d.HkR?d.HkR:null!==b}let O=new Set(["permission-mode","ai-title","agent-color","agent-name","custom-title","pr-link"]);async function P(a,b,c=N){let e=b??d.PES,f=new Date;if(!a.runtimeHandle)return{state:"exited",timestamp:f};let g=await c(a.runtimeHandle);if(g===d.HkR)return null;if(!g)return{state:"exited",timestamp:f};if(!a.workspacePath)return null;let h=G(await H(a.workspacePath)),i=(0,k.join)((0,j.homedir)(),".claude","projects",h),l=a.metadata?.claudeSessionUuid,m="string"==typeof l&&l.trim()?l.trim():void 0,n=await J(i,m),o=null;if(n){let b=await (0,d.XIc)(n);if(b)if(a.createdAt&&b.modifiedAt<a.createdAt)o={state:"idle",timestamp:a.createdAt};else if(b.lastType&&O.has(b.lastType))o={state:"idle",timestamp:a.createdAt};else{let a=Date.now()-b.modifiedAt.getTime(),c=b.modifiedAt,f=Math.min(d.V1$,e);switch(b.lastType){case"user":case"progress":default:if(a<=f)return{state:"active",timestamp:c};return{state:a>e?"idle":"ready",timestamp:c};case"system":if("api_error"===b.lastSubtype&&"error"===b.lastLevel)return{state:"blocked",timestamp:c};return{state:a>e?"idle":"ready",timestamp:c};case"assistant":case"summary":case"file-history-snapshot":case"attachment":case"queue-operation":case"last-prompt":return{state:a>e?"idle":"ready",timestamp:c}}}}let p=await (0,d.Ahw)(a.workspacePath),q=(0,d.Bmx)(p);if(q)return q;let r=Math.min(d.V1$,e),s=(0,d.Vo2)(p,r,e);return s||o||null}let Q=`#!/usr/bin/env bash
10
+ `)}),process.on("exit",()=>{try{void 0===a&&l.kill()}catch{}})}function v(a,b=3e3){return new Promise((c,d)=>{let e=!1,f=(0,r.connect)(a),g=setTimeout(()=>{e||(e=!0,f.destroy(),d(Error(`Timed out connecting to pty-host at ${a} (${b}ms)`)))},b);f.once("connect",()=>{e||(e=!0,clearTimeout(g),c(f))}),f.once("error",a=>{e||(e=!0,clearTimeout(g),d(a))})})}function w(a,b){return new Promise((c,d)=>{a.write(b,a=>{a?d(a):c()})})}function x(a){return new Promise(b=>setTimeout(b,a))}async function y(a,b){let c=await v(a);return new Promise((a,d)=>{let e=!1,f=b=>{e||(e=!0,b?(c.destroy(),d(b)):(c.end(),a()))};c.once("error",f),(async()=>{try{for(let a=0;a<b.length;a+=512){let d=b.slice(a,a+512);await w(c,s(2,d)),a+512<b.length&&await x(15)}await x(300),await w(c,s(2,"\r")),f()}catch(a){f(a)}})()})}async function z(a,b=50){let c;try{c=await v(a,3e3)}catch{return""}return new Promise(a=>{let d=!1,e=b=>{d||(d=!0,clearTimeout(f),c.destroy(),a(b))},f=setTimeout(()=>e(""),3e3),g=new t((a,b)=>{5===a&&e(b.toString("utf-8"))});c.on("data",a=>g.feed(a)),c.once("error",()=>e("")),c.once("close",()=>e(""));let h=s(4,JSON.stringify({lines:b}));c.write(h)})}async function A(a){let b;try{b=await v(a,2e3)}catch{return!1}return new Promise(a=>{let c=!1,d=d=>{c||(c=!0,clearTimeout(e),b.destroy(),a(d))},e=setTimeout(()=>d(!1),2e3),f=new t((a,b)=>{if(7===a)try{JSON.parse(b.toString("utf-8")),d(!0)}catch{d(!1)}});b.on("data",a=>f.feed(a)),b.once("error",()=>d(!1)),b.once("close",()=>d(!1)),b.write(s(6,""))})}async function B(a){let b;try{b=await v(a,2e3)}catch{return}await new Promise(a=>{b.once("error",()=>a());let c=s(8,"");b.write(c,()=>{b.end(),a()})})}(process.argv[1]?.endsWith("pty-host.js")||process.argv[1]?.endsWith("pty-host.ts"))&&u();let C=/^[a-zA-Z0-9_-]+$/,D={manifest:{name:"process",slot:"runtime",description:"Runtime plugin: child processes",version:"0.1.0"},create:function(){let a=new Map;return{name:"process",async create(b){let c;var f=b.sessionId;if(!C.test(f))throw Error(`Invalid session ID "${f}": must match ${C}`);let g=b.sessionId;if(a.has(g))throw Error(`Session "${g}" already exists — destroy it before re-creating`);let h={process:null,outputBuffer:[],createdAt:Date.now()};if(a.set(g,h),(0,d.uFH)()){let c=`\\\\.\\pipe\\ao-pty-${g}`,f=(0,d.ry1)(),i=(0,k.resolve)((0,k.dirname)((0,q.fileURLToPath)("file:///home/runner/work/Athene/Athene/packages/plugins/runtime-process/dist/index.js")),"pty-host.js"),j={...process.env,...b.environment};try{let a=(0,e.spawn)(process.execPath,[i,g,c,b.workspacePath,f.cmd,...f.args(b.launchCommand)],{cwd:b.workspacePath,env:j,stdio:["ignore","pipe","pipe"],detached:!0,windowsHide:!0}),k=await new Promise((b,c)=>{let d=setTimeout(()=>{a.kill(),c(Error("PTY host startup timeout (10s)"))},1e4),e="";a.stdout?.on("data",a=>{let c=(e+=a.toString()).match(/READY:(\d+)/);c&&(clearTimeout(d),b(parseInt(c[1],10)))}),a.stderr?.on("data",a=>{e+=a.toString()}),a.on("error",a=>{clearTimeout(d),c(Error(`PTY host spawn error: ${a.message}`))}),a.on("exit",a=>{clearTimeout(d),c(Error(`PTY host exited during startup with code ${a}: ${e}`))})});if(a.unref(),a.stdout?.destroy(),a.stderr?.destroy(),"number"==typeof a.pid)try{(0,d.YEV)({sessionId:g,ptyHostPid:a.pid,pipePath:c})}catch{}return{id:g,runtimeName:"process",data:{pid:k,ptyHostPid:a.pid,pipePath:c,createdAt:h.createdAt}}}catch(b){throw a.delete(g),b}}let i=(0,d.ry1)();try{c=(0,e.spawn)(i.cmd,i.args(b.launchCommand),{cwd:b.workspacePath,env:{...process.env,...b.environment},stdio:["pipe","pipe","pipe"],detached:!(0,d.uFH)()})}catch(c){a.delete(g);let b=c instanceof Error?c.message:String(c);throw Error(`Failed to spawn process for session ${g}: ${b}`,{cause:c})}function j(){let a="";return b=>{let c=(a+b.toString("utf-8")).split("\n");for(let b of(a=c.pop(),c))h.outputBuffer.push(b);h.outputBuffer.length>1e3&&h.outputBuffer.splice(0,h.outputBuffer.length-1e3)}}h.process=c,c.once("exit",()=>{h.outputBuffer.push(`[process exited with code ${c.exitCode}]`),a.delete(g)}),c.on("error",()=>{}),await new Promise((b,d)=>{let e=b=>{c.removeListener("spawn",f),a.delete(g),d(Error(`Failed to spawn process for session ${g}: ${b.message}`))},f=()=>{c.removeListener("error",e),b()};c.once("error",e),c.once("spawn",f)});let l=j(),m=j();return c.stdout?.on("data",l),c.stderr?.on("data",m),c.once("exit",()=>{l(Buffer.from("\n")),m(Buffer.from("\n"))}),{id:g,runtimeName:"process",data:{pid:c.pid,createdAt:h.createdAt}}},async destroy(b){let c=b.data?.pipePath;if(c){await B(c);let e=b.data?.ptyHostPid;if("number"==typeof e&&e>0){let c=Date.now()+500;for(;Date.now()<c;){try{process.kill(e,0)}catch(c){if("EPERM"===c.code)break;a.delete(b.id);try{(0,d.unregisterWindowsPtyHost)(b.id)}catch{}return}await new Promise(a=>setTimeout(a,25))}await (0,d.g8K)(e,"SIGKILL")}a.delete(b.id);try{(0,d.unregisterWindowsPtyHost)(b.id)}catch{}return}let e=a.get(b.id);if(!e){let a=b.data?.pid;"number"==typeof a&&a>0&&await (0,d.g8K)(a,"SIGKILL");return}let f=e.process;if(!f)return void a.delete(b.id);if(null===f.exitCode&&null===f.signalCode){let a=f.pid,b=new Promise(b=>{let c=setTimeout(()=>{Promise.resolve(null===f.exitCode&&null===f.signalCode?a?(0,d.g8K)(a,"SIGKILL"):void f.kill("SIGKILL"):void 0).catch(()=>{}).finally(b)},5e3);f.once("exit",()=>{clearTimeout(c),b()})});a?await (0,d.g8K)(a,"SIGTERM"):f.kill("SIGTERM"),await b}a.delete(b.id)},async sendMessage(b,c){let d=b.data?.pipePath;if(d)return void await y(d,c);let e=a.get(b.id);if(!e)throw Error(`No process found for session ${b.id}`);let f=e.process;if(!f)throw Error(`Process for session ${b.id} is still spawning`);let g=f.stdin;if(!g||!g.writable)throw Error(`stdin not writable for session ${b.id}`);await new Promise((a,b)=>{let d=!1,e=c=>{d||(d=!0,i(),c?b(c):a())},f=a=>e(a),h=()=>{},i=()=>{g.removeListener("error",f),g.removeListener("drain",h)};g.on("error",f),g.on("drain",h),g.write(c+"\n",a=>e(a??null))})},async getOutput(b,c=50){let d=b.data?.pipePath;if(d)return z(d,c);let e=a.get(b.id);if(!e)return"";let f=e.outputBuffer,g=Math.max(0,f.length-c);return f.slice(g).join("\n")},async isAlive(b){let c=b.data?.pipePath;if(c)return A(c);let d=a.get(b.id);if(!d||!d.process){let a=b.data?.pid;if("number"==typeof a&&a>0)try{return process.kill(a,0),!0}catch(a){if("EPERM"===a.code)return!0}return!1}return null===d.process.exitCode&&null===d.process.signalCode},async getMetrics(b){let c=a.get(b.id),d=c?.createdAt??Date.now();return{uptimeMs:Date.now()-d}},async listSessions(){if((0,d.uFH)()){let{getWindowsPtyHosts:a}=await Promise.resolve().then(c.bind(c,8868));return a().map(a=>({id:a.sessionId,pid:a.ptyHostPid,createdAt:Date.parse(a.registeredAt)||void 0,handleData:{pipePath:a.pipePath,ptyHostPid:a.ptyHostPid,pid:a.ptyHostPid}}))}return[...a.entries()].map(([a,b])=>({id:a,pid:b.process?.pid??void 0,createdAt:b.createdAt}))},async getAttachInfo(b){let c=b.data?.pipePath;if(c)return await A(c)?{type:"process",target:String(b.data?.pid??""),command:c}:{type:"process",target:"",command:`# process for session ${b.id} is no longer running`};let d=a.get(b.id);return d&&d.process&&null===d.process.exitCode&&null===d.process.signalCode?{type:"process",target:String(d.process.pid)}:{type:"process",target:"",command:`# process for session ${b.id} is no longer running`}}}}};var E=c(51455);let F=(0,f.promisify)(e.execFile);function G(a){return a.replace(/\\/g,"/").replace(/[^a-zA-Z0-9-]/g,"-")}async function H(a){try{return await (0,E.realpath)(a)}catch{return a}}let I=new Set;async function J(a,b){let c;if(b){let c=(0,k.join)(a,`${b}.jsonl`);try{return await (0,E.stat)(c),c}catch{}}try{c=await (0,E.readdir)(a)}catch(b){if(b instanceof Error&&"code"in b&&"ENOENT"!==b.code&&!I.has(a)){I.add(a);let c=b.code;console.warn(`[claude-code] failed to read ${a} (${c}): ${b.message}. Session activity will fall back to AO JSONL only. (This warning is shown once per path for the process lifetime.)`)}return null}let d=c.filter(a=>a.endsWith(".jsonl")&&!a.startsWith("agent-"));if(0===d.length)return null;let e=await Promise.all(d.map(async b=>{let c=(0,k.join)(a,b);try{let a=await (0,E.stat)(c);return{path:c,mtime:a.mtimeMs}}catch{return{path:c,mtime:0}}}));return e.sort((a,b)=>b.mtime-a.mtime),e[0]?.path??null}let K=null;async function L(){if((0,d.uFH)())return"";let a=Date.now();if(K&&a-K.timestamp<5e3)return K.promise?K.promise:K.output;let b=F("ps",["-eo","pid,tty,args"],{timeout:3e4}).then(({stdout:a})=>(K?.promise===b&&(K={output:a||d.HkR,timestamp:Date.now()}),a||d.HkR)).catch(()=>(K?.promise===b&&(K={output:d.HkR,timestamp:Date.now()}),d.HkR));return K={output:"",timestamp:a,promise:b},b}async function M(a){try{if("tmux"===a.runtimeName&&a.id){if((0,d.uFH)())return null;let{stdout:b}=await F("tmux",["list-panes","-t",a.id,"-F","#{pane_tty}"],{timeout:3e4}),c=b.trim().split("\n").map(a=>a.trim()).filter(Boolean);if(0===c.length)return null;let e=await L();if(e===d.HkR)return d.HkR;let f=new Set(c.map(a=>a.replace(/^\/dev\//,""))),g=/(?:^|\/)(?:\.)?claude(?:[-.][\w-]+)*(?:[\s/]|$)/;for(let a of e.split("\n")){let b=a.trimStart().split(/\s+/);if(b.length<3||!f.has(b[1]??""))continue;let c=b.slice(2).join(" ");if(g.test(c))return parseInt(b[0]??"0",10)}return null}let b=a.data.pid,c="number"==typeof b?b:Number(b);if(Number.isFinite(c)&&c>0)try{return process.kill(c,0),c}catch(a){if(a instanceof Error&&"code"in a&&"EPERM"===a.code)return c}return null}catch{return d.HkR}}async function N(a){let b=await M(a);return b===d.HkR?d.HkR:null!==b}let O=new Set(["permission-mode","ai-title","agent-color","agent-name","custom-title","pr-link"]);async function P(a,b,c=N){let e=b??d.PES,f=new Date;if(!a.runtimeHandle)return{state:"exited",timestamp:f};let g=await c(a.runtimeHandle);if(g===d.HkR)return null;if(!g)return{state:"exited",timestamp:f};if(!a.workspacePath)return null;let h=G(await H(a.workspacePath)),i=(0,k.join)((0,j.homedir)(),".claude","projects",h),l=a.metadata?.claudeSessionUuid,m="string"==typeof l&&l.trim()?l.trim():void 0,n=await J(i,m),o=null;if(n){let b=await (0,d.XIc)(n);if(b)if(a.createdAt&&b.modifiedAt<a.createdAt)o={state:"idle",timestamp:a.createdAt};else if(b.lastType&&O.has(b.lastType))o={state:"idle",timestamp:a.createdAt};else{let a=Date.now()-b.modifiedAt.getTime(),c=b.modifiedAt,f=Math.min(d.V1$,e);switch(b.lastType){case"user":case"progress":default:if(a<=f)return{state:"active",timestamp:c};return{state:a>e?"idle":"ready",timestamp:c};case"system":if("api_error"===b.lastSubtype&&"error"===b.lastLevel)return{state:"blocked",timestamp:c};return{state:a>e?"idle":"ready",timestamp:c};case"assistant":case"summary":case"file-history-snapshot":case"attachment":case"queue-operation":case"last-prompt":return{state:a>e?"idle":"ready",timestamp:c}}}}let p=await (0,d.Ahw)(a.workspacePath),q=(0,d.Bmx)(p);if(q)return q;let r=Math.min(d.V1$,e),s=(0,d.Vo2)(p,r,e);return s||o||null}let Q=`#!/usr/bin/env bash
11
11
  # Metadata Updater Hook for Athene
12
12
  #
13
13
  # This PostToolUse hook automatically updates session metadata when:
@@ -17,8 +17,9 @@ ${n(a)}
17
17
 
18
18
  set -euo pipefail
19
19
 
20
- # Configuration
21
- AO_DATA_DIR="\${AO_DATA_DIR:-$HOME/.ao-sessions}"
20
+ # Configuration — prefer ATHENE_* and fall back to legacy AO_*, then seed locals
21
+ ${d.Kmu.DATA_DIR}="\${${d.Kmu.DATA_DIR}:-\${${(0,d.cI4)(d.Kmu.DATA_DIR)}:-$HOME/.ao-sessions}}"
22
+ ${d.Kmu.SESSION}="${(0,d._x4)(d.Kmu.SESSION)}"
22
23
 
23
24
  # Read hook input from stdin
24
25
  input=$(cat)
@@ -49,25 +50,25 @@ if [[ "$tool_name" != "Bash" ]]; then
49
50
  exit 0
50
51
  fi
51
52
 
52
- # Validate AO_SESSION is set
53
- if [[ -z "\${AO_SESSION:-}" ]]; then
54
- echo '{"systemMessage": "AO_SESSION environment variable not set, skipping metadata update"}'
53
+ # Validate ${d.Kmu.SESSION} is set
54
+ if [[ -z "\${${d.Kmu.SESSION}:-}" ]]; then
55
+ echo '{"systemMessage": "${d.Kmu.SESSION} environment variable not set, skipping metadata update"}'
55
56
  exit 0
56
57
  fi
57
58
 
58
59
  # Construct metadata file path
59
- # AO_DATA_DIR is already set to the project-specific sessions directory
60
+ # ${d.Kmu.DATA_DIR} is already set to the project-specific sessions directory
60
61
  # V2 storage uses .json extension
61
- metadata_file="$AO_DATA_DIR/\${AO_SESSION}.json"
62
+ metadata_file="$${d.Kmu.DATA_DIR}/\${${d.Kmu.SESSION}}.json"
62
63
 
63
64
  # Fallback to bare filename for pre-migration layouts
64
65
  if [[ ! -f "$metadata_file" ]]; then
65
- metadata_file="$AO_DATA_DIR/$AO_SESSION"
66
+ metadata_file="$${d.Kmu.DATA_DIR}/$${d.Kmu.SESSION}"
66
67
  fi
67
68
 
68
69
  # Ensure metadata file exists
69
70
  if [[ ! -f "$metadata_file" ]]; then
70
- echo '{"systemMessage": "Metadata file not found: '"$AO_DATA_DIR/\${AO_SESSION}"'"}'
71
+ echo '{"systemMessage": "Metadata file not found: '"$${d.Kmu.DATA_DIR}/\${${d.Kmu.SESSION}}"'"}'
71
72
  exit 0
72
73
  fi
73
74
 
@@ -224,8 +225,8 @@ const { readFileSync, writeFileSync, renameSync, existsSync, realpathSync } = re
224
225
  const { join, sep, resolve: resolvePath } = require("node:path");
225
226
  const os = require("node:os");
226
227
 
227
- const AO_DATA_DIR = process.env.AO_DATA_DIR || join(process.env.HOME || process.env.USERPROFILE || "", ".ao-sessions");
228
- const AO_SESSION = process.env.AO_SESSION || "";
228
+ const ${d.Kmu.DATA_DIR} = ${(0,d.Etf)(d.Kmu.DATA_DIR)} || join(process.env.HOME || process.env.USERPROFILE || "", ".ao-sessions");
229
+ const ${d.Kmu.SESSION} = ${(0,d.Etf)(d.Kmu.SESSION)} || "";
229
230
 
230
231
  // Read hook input from stdin (fd 0 is cross-platform, no /dev/stdin needed)
231
232
  let inputRaw = "";
@@ -260,29 +261,29 @@ if (toolName !== "Bash") {
260
261
  process.exit(0);
261
262
  }
262
263
 
263
- // Validate AO_SESSION is set
264
- if (!AO_SESSION) {
265
- process.stdout.write(JSON.stringify({ systemMessage: "AO_SESSION environment variable not set, skipping metadata update" }) + "\\n");
264
+ // Validate ${d.Kmu.SESSION} is set
265
+ if (!${d.Kmu.SESSION}) {
266
+ process.stdout.write(JSON.stringify({ systemMessage: "${d.Kmu.SESSION} environment variable not set, skipping metadata update" }) + "\\n");
266
267
  process.exit(0);
267
268
  }
268
269
 
269
- // Validate AO_SESSION contains no path traversal components
270
- if (AO_SESSION.includes("/") || AO_SESSION.includes("\\\\") || AO_SESSION.includes("..")) {
271
- process.stdout.write(JSON.stringify({ systemMessage: "AO_SESSION contains invalid path characters, skipping metadata update" }) + "\\n");
270
+ // Validate ${d.Kmu.SESSION} contains no path traversal components
271
+ if (${d.Kmu.SESSION}.includes("/") || ${d.Kmu.SESSION}.includes("\\\\") || ${d.Kmu.SESSION}.includes("..")) {
272
+ process.stdout.write(JSON.stringify({ systemMessage: "${d.Kmu.SESSION} contains invalid path characters, skipping metadata update" }) + "\\n");
272
273
  process.exit(0);
273
274
  }
274
275
 
275
- // Validate AO_DATA_DIR is within an allowed base directory (mirrors ao-metadata-helper.sh)
276
+ // Validate ${d.Kmu.DATA_DIR} is within an allowed base directory (mirrors ao-metadata-helper.sh)
276
277
  const home = os.homedir();
277
278
  let resolvedAoDir;
278
- try { resolvedAoDir = realpathSync(AO_DATA_DIR); } catch { resolvedAoDir = resolvePath(AO_DATA_DIR); }
279
+ try { resolvedAoDir = realpathSync(${d.Kmu.DATA_DIR}); } catch { resolvedAoDir = resolvePath(${d.Kmu.DATA_DIR}); }
279
280
  const allowedBases = [join(home, ".ao"), join(home, ".agent-orchestrator"), os.tmpdir()];
280
281
  if (!allowedBases.some((a) => resolvedAoDir === a || resolvedAoDir.startsWith(a + sep))) {
281
- process.stdout.write(JSON.stringify({ systemMessage: "AO_DATA_DIR is outside allowed directories, skipping metadata update" }) + "\\n");
282
+ process.stdout.write(JSON.stringify({ systemMessage: "${d.Kmu.DATA_DIR} is outside allowed directories, skipping metadata update" }) + "\\n");
282
283
  process.exit(0);
283
284
  }
284
285
 
285
- const metadataFile = join(AO_DATA_DIR, AO_SESSION);
286
+ const metadataFile = join(${d.Kmu.DATA_DIR}, ${d.Kmu.SESSION});
286
287
 
287
288
  if (!existsSync(metadataFile)) {
288
289
  process.stdout.write(JSON.stringify({ systemMessage: "Metadata file not found: " + metadataFile }) + "\\n");
@@ -583,11 +584,72 @@ try {
583
584
 
584
585
  process.stdout.write("{}\\n");
585
586
  process.exit(0);
586
- `;async function U(a,b=131072){let c,d;try{let{size:e=0}=await (0,E.stat)(a);if(d=Math.max(0,e-b),0===d)c=await (0,E.readFile)(a,"utf-8");else{let b=await (0,E.open)(a,"r");try{let a=e-d,f=Buffer.allocUnsafe(a);await b.read(f,0,a,d),c=f.toString("utf-8")}finally{await b.close()}}}catch{return[]}let e=c.indexOf("\n"),f=d>0&&e>=0?c.slice(e+1):c,g=[];for(let a of f.split("\n")){let b=a.trim();if(b)try{let a=JSON.parse(b);"object"!=typeof a||null===a||Array.isArray(a)||g.push(a)}catch{}}return g}async function V(a){let b,c,e=(0,k.join)(a,".claude"),f=(0,k.join)(e,"settings.json");try{await (0,E.mkdir)(e,{recursive:!0})}catch{}if((0,d.uFH)()){let a=(0,k.join)(e,"metadata-updater.cjs"),d=(0,k.join)(e,"activity-updater.cjs");await (0,E.writeFile)(a,R,"utf-8"),await (0,E.writeFile)(d,T,"utf-8"),b="node .claude/metadata-updater.cjs",c="node .claude/activity-updater.cjs"}else{let a=(0,k.join)(e,"metadata-updater.sh"),d=(0,k.join)(e,"activity-updater.sh");await (0,E.writeFile)(a,Q,"utf-8"),await (0,E.writeFile)(d,S,"utf-8"),await (0,E.chmod)(a,493),await (0,E.chmod)(d,493),b=".claude/metadata-updater.sh",c=".claude/activity-updater.sh"}let g={};if((0,i.existsSync)(f))try{let a=await (0,E.readFile)(f,"utf-8");g=JSON.parse(a)}catch{}let h=g.hooks??{};for(let a of function(a,b){let c=["activity-updater.sh","activity-updater.cjs"],d=[{event:"PostToolUse",matcher:"Bash",command:a,timeout:5e3,identifiers:["metadata-updater.sh","metadata-updater.cjs","metadata-updater.js"]}];for(let a of["SessionStart","UserPromptSubmit","PreToolUse","PostToolUse","PostToolUseFailure","PostToolBatch","Notification","PermissionRequest","Stop","StopFailure","SubagentStart","SubagentStop","PreCompact","PostCompact"])d.push({event:a,matcher:"",command:b,timeout:2e3,identifiers:c});return d}(b,c))!function(a,b){let c=a[b.event],d=Array.isArray(c)?c:[],e=-1,f=-1;for(let a=0;a<d.length;a++){let c=d[a];if("object"!=typeof c||null===c||Array.isArray(c))continue;let g=c.hooks;if(Array.isArray(g)){for(let c=0;c<g.length;c++){let d=g[c];if("object"!=typeof d||null===d||Array.isArray(d))continue;let h=d.command;if("string"==typeof h&&b.identifiers.some(a=>h.includes(a))){e=a,f=c;break}}if(e>=0)break}}if(-1===e)d.push({matcher:b.matcher,hooks:[{type:"command",command:b.command,timeout:b.timeout}]});else{let a=d[e],c=a.hooks;c[f].command=b.command,c[f].timeout=b.timeout,1===c.length&&(a.matcher=b.matcher)}a[b.event]=d}(h,a);g.hooks=h,await (0,E.writeFile)(f,JSON.stringify(g,null,2)+"\n","utf-8")}let W={manifest:{name:"claude-code",slot:"agent",description:"Agent plugin: Claude Code CLI",version:"0.1.0",displayName:"Claude Code"},create:function(){return{name:"claude-code",processName:"claude",getLaunchCommand(a){let b=["claude"],c=(0,d.DD3)(a.permissions);if(("permissionless"===c||"auto-edit"===c)&&b.push("--dangerously-skip-permissions"),a.model&&b.push("--model",(0,d.kct)(a.model)),a.systemPromptFile)if((0,d.uFH)()){let c=(0,i.readFileSync)(a.systemPromptFile,"utf-8");b.push("--append-system-prompt",(0,d.kct)(c))}else b.push("--append-system-prompt",`"$(cat ${(0,d.kct)(a.systemPromptFile)})"`);else a.systemPrompt&&b.push("--append-system-prompt",(0,d.kct)(a.systemPrompt));return a.prompt&&b.push("--",(0,d.kct)(a.prompt)),b.join(" ")},getEnvironment(a){let b={};return b.CLAUDECODE="",b.AO_SESSION_ID=a.sessionId,a.issueId&&(b.AO_ISSUE_ID=a.issueId),b},detectActivity:a=>"idle",isProcessRunning:async a=>N(a),async getActivityState(a,b){return P(a,b,a=>this.isProcessRunning(a))},async getSessionInfo(a){if(!a.workspacePath)return null;let b=G(await H(a.workspacePath)),c=(0,k.join)((0,j.homedir)(),".claude","projects",b),d=await J(c);if(!d)return null;let e=await U(d);if(0===e.length)return null;let f=(0,k.basename)(d,".jsonl"),g=function(a){for(let b=a.length-1;b>=0;b--){let c=a[b];if(c?.type==="summary"&&c.summary)return{summary:c.summary,isFallback:!1}}for(let b of a)if(b?.type==="user"&&b.message?.content&&"string"==typeof b.message.content){let a=b.message.content.trim();if(a.length>0)return{summary:a.length>120?a.substring(0,120)+"...":a,isFallback:!0}}return null}(e);return{summary:g?.summary??null,summaryIsFallback:g?.isFallback,agentSessionId:f,metadata:{claudeSessionUuid:f},cost:function(a){let b=0,c=0,d=0,e=0,f=0;for(let g of a)"number"==typeof g.costUSD?f+=g.costUSD:"number"==typeof g.estimatedCostUsd&&(f+=g.estimatedCostUsd),g.usage?(b+=g.usage.input_tokens??0,d+=g.usage.cache_read_input_tokens??0,e+=g.usage.cache_creation_input_tokens??0,c+=g.usage.output_tokens??0):("number"==typeof g.inputTokens&&(b+=g.inputTokens),"number"==typeof g.outputTokens&&(c+=g.outputTokens));if(0!==b||0!==c||0!==f||0!==d||0!==e)return 0===f&&(f=b/1e6*3+c/1e6*15+d/1e6*.3+e/1e6*3.75),{inputTokens:b+d+e,outputTokens:c,estimatedCostUsd:f}}(e)}},async getRestoreCommand(a,b){let c=a.metadata?.claudeSessionUuid?.trim();if(!c){if(!a.workspacePath)return null;let b=G(await H(a.workspacePath)),d=(0,k.join)((0,j.homedir)(),".claude","projects",b),e=await J(d);if(!e)return null;c=(0,k.basename)(e,".jsonl")}if(!c)return null;let e=["claude","--resume",(0,d.kct)(c)],f=(0,d.DD3)(b.agentConfig?.permissions);return("permissionless"===f||"auto-edit"===f)&&e.push("--dangerously-skip-permissions"),b.agentConfig?.model&&e.push("--model",(0,d.kct)(b.agentConfig.model)),e.join(" ")},async setupWorkspaceHooks(a,b){await V(a)},async postLaunchSetup(a){}}},detect:function(){try{return(0,e.execFileSync)("claude",["--version"],{stdio:"ignore",shell:(0,d.uFH)(),windowsHide:!0}),!0}catch{return!1}}};var X=c(46193),Y=c(80481);c(78474).EventEmitter;let Z=(0,f.promisify)(e.execFile),$=(0,k.join)((0,j.homedir)(),".codex","sessions");function _(a){return a.payload??a}async function aa(a,b=0){let c;if(b>4)return[];try{c=await (0,E.readdir)(a)}catch{return[]}let d=[];for(let e of c){let c=(0,k.join)(a,e);if(e.endsWith(".jsonl"))d.push(c);else try{if((await (0,E.lstat)(c)).isDirectory()){let a=await aa(c,b+1);d.push(...a)}}catch{}}return d}async function ab(a,b){let c=await (0,E.open)(a,"r"),d=[],e="",f=new X.StringDecoder("utf8");try{for(;d.length<b;){let a=Buffer.allocUnsafe(8192),{bytesRead:g}=await c.read(a,0,a.length,null);if(0===g){let a=(e+=f.end()).trim();a&&d.push(a);break}let h=(e+=f.write(a.subarray(0,g))).indexOf("\n");for(;-1!==h&&d.length<b;){let a=e.slice(0,h).trim();a&&d.push(a),h=(e=e.slice(h+1)).indexOf("\n")}}}finally{await c.close()}return d}function ac(a){return a.replace(/\\/g,"/").replace(/^([a-zA-Z]):/,(a,b)=>b.toLowerCase()+":")}async function ad(a,b){let c=ac(b);try{for(let b of(await ab(a,10)))try{let a=JSON.parse(b);if("object"==typeof a&&null!==a&&!Array.isArray(a)){let b=_(a);if("session_meta"===a.type&&"string"==typeof b.cwd&&ac(b.cwd)===c)return!0}}catch{}}catch{}return!1}async function ae(a,b){if(0===(b??=await aa($)).length)return null;let c=null;for(let d of b)if(await ad(d,a))try{let a=await (0,E.stat)(d);(!c||a.mtimeMs>c.mtime)&&(c={path:d,mtime:a.mtimeMs})}catch{}return c?.path??null}async function af(a,b){let c=(b??=await aa($)).filter(b=>(0,k.basename)(b).endsWith(`-${a}.jsonl`));if(0===c.length)return null;if(1===c.length)return c[0]??null;let d=null,e=null;for(let a of c){e??=a;try{let b=await (0,E.stat)(a);(!d||b.mtimeMs>d.mtime)&&(d={path:a,mtime:b.mtimeMs})}catch{}}return d?.path??e}async function ag(a){let b=null,c=null;try{let d={model:null,threadId:null,inputTokens:0,outputTokens:0,cachedTokens:0,reasoningTokens:0};for await(let e of(b=(0,i.createReadStream)(a,{encoding:"utf-8"}),c=(0,Y.createInterface)({input:b,crlfDelay:1/0}))){let a=e.trim();if(a)try{let b=JSON.parse(a);if("object"!=typeof b||null===b||Array.isArray(b))continue;let c=_(b);"session_meta"===b.type&&("string"==typeof c.id&&c.id?d.threadId=c.id:"string"==typeof c.threadId&&c.threadId&&(d.threadId=c.threadId)),!d.threadId&&("string"==typeof c.threadId&&c.threadId?d.threadId=c.threadId:"string"==typeof b.threadId&&b.threadId&&(d.threadId=b.threadId)),"turn_context"===b.type&&"string"==typeof c.model&&c.model?d.model=c.model:!d.model&&"string"==typeof c.model&&c.model&&(d.model=c.model);let e=c.info?.total_token_usage;if("number"==typeof e?.input_tokens){d.inputTokens=e.input_tokens,d.outputTokens=e.output_tokens??0;continue}let f=c.info?.last_token_usage;if("number"==typeof f?.input_tokens){d.inputTokens+=f.input_tokens,d.outputTokens+=f.output_tokens??0;continue}if("number"==typeof c.input_tokens){d.inputTokens+=c.input_tokens,d.outputTokens+=c.output_tokens??0;continue}"event_msg"===b.type&&b.msg?.type==="token_count"&&(d.inputTokens+=b.msg.input_tokens??0,d.outputTokens+=b.msg.output_tokens??0,d.cachedTokens+=b.msg.cached_tokens??0,d.reasoningTokens+=b.msg.reasoning_tokens??0)}catch{}}return d}catch{return null}finally{c?.close(),b?.destroy()}}async function ah(){if((0,d.uFH)())return ai();try{let{stdout:a}=await Z("which",["codex"],{timeout:1e4}),b=a.trim();if(b)return b}catch{}let a=(0,j.homedir)();for(let b of["/usr/local/bin/codex","/opt/homebrew/bin/codex",(0,k.join)(a,".cargo","bin","codex"),(0,k.join)(a,".npm","bin","codex")])try{return await (0,E.stat)(b),b}catch{}return"codex"}async function ai(){for(let a of["codex.cmd","codex.exe"])try{let{stdout:b}=await Z("where.exe",[a],{timeout:1e4,windowsHide:!0}),c=b.split(/\r?\n/).find(a=>a.trim().length>0);if(c)return c.trim()}catch{}let a=process.env.APPDATA,b=(0,j.homedir)();for(let c of[a?(0,k.join)(a,"npm","codex.cmd"):null,a?(0,k.join)(a,"npm","codex.exe"):null,(0,k.join)(b,".cargo","bin","codex.exe")].filter(a=>null!==a))try{return await (0,E.stat)(c),c}catch{}return"codex"}function aj(a,b,c=!0){let e=(0,d.DD3)(b);"permissionless"===e?c?a.push("--dangerously-bypass-approvals-and-sandbox"):a.push("--ask-for-approval","never"):"auto-edit"===e?a.push("--ask-for-approval","never"):"suggest"===e&&a.push("--ask-for-approval","untrusted")}function ak(a,b){b&&(a.push("--model",(0,d.kct)(b)),/^o[34]/i.test(b)&&a.push("-c","model_reasoning_effort=high"))}function al(a){a.push("-c","check_for_update_on_startup=false")}let am=new Map;function an(a,b){let c=a.metadata?.[b];return"string"==typeof c&&c.trim()?c.trim():null}async function ao(a,b){let c=am.get(a);if(c&&Date.now()<c.expiry)return c.path;let d=await b();return am.set(a,{path:d,expiry:Date.now()+3e4}),d}async function ap(a){let b=null,c=async()=>b??=await aa($),d=an(a,"codexThreadId");if(d){let a=await ao(`thread:${d}`,async()=>af(d,await c()));if(a)return a}return a.workspacePath?ao(`cwd:${ac(a.workspacePath)}`,async()=>ae(a.workspacePath,await c())):null}function aq(a){let b=a.join(" ");return(0,d.uFH)()?`& ${b}`:b}let ar={manifest:{name:"codex",slot:"agent",description:"Agent plugin: OpenAI Codex CLI",version:"0.1.1",displayName:"OpenAI Codex"},create:function(){let a,b;return a=null,b=null,{name:"codex",processName:"codex",getLaunchCommand(b){let c=a??"codex",e=[(0,d.kct)(c)];return al(e),aj(e,b.permissions),ak(e,b.model),b.systemPromptFile?e.push("-c",`model_instructions_file=${(0,d.kct)(b.systemPromptFile)}`):b.systemPrompt&&e.push("-c",`developer_instructions=${(0,d.kct)(b.systemPrompt)}`),b.prompt&&e.push("--",(0,d.kct)(b.prompt)),aq(e)},getEnvironment(a){let b={};return b.AO_SESSION_ID=a.sessionId,a.issueId&&(b.AO_ISSUE_ID=a.issueId),b.CODEX_DISABLE_UPDATE_CHECK="1",b},detectActivity(a){if(!a.trim())return"idle";let b=a.trim().split("\n"),c=b[b.length-1]?.trim()??"";if(/^[>$#]\s*$/.test(c))return"idle";let d=b.slice(-5).join("\n");return/approval required/i.test(d)||/\(y\)es.*\(n\)o/i.test(d)?"waiting_input":"active"},async getActivityState(a,b){let c=b??d.PES,e=new Date;if(!a.runtimeHandle)return{state:"exited",timestamp:e};let f=await this.isProcessRunning(a.runtimeHandle);if(f===d.HkR)return null;if(!f)return{state:"exited",timestamp:e};if(!a.workspacePath&&!an(a,"codexThreadId"))return null;let g=await ap(a);if(g){let a=await (0,d.XIc)(g);if(a){let b=Date.now()-a.modifiedAt.getTime(),e=a.modifiedAt,f=a.payloadType??a.lastType,g=Math.min(d.V1$,c);switch(f){case"approval_request":case"exec_approval_request":case"apply_patch_approval_request":return{state:"waiting_input",timestamp:e};case"error":case"stream_error":return{state:"blocked",timestamp:e};case"task_started":case"agent_reasoning":case"response_item":case"turn_context":case"user_input":case"tool_call":case"exec_command":case"exec_command_begin":case"exec_command_end":default:if(b<=g)return{state:"active",timestamp:e};return{state:b>c?"idle":"ready",timestamp:e};case"task_complete":case"turn_aborted":case"agent_message":case"assistant_message":case"session_meta":case"event_msg":case"compacted":case"token_count":return{state:b>c?"idle":"ready",timestamp:e}}}}let h=a.workspacePath?await (0,d.Ahw)(a.workspacePath):null,i=(0,d.Bmx)(h);if(i)return i;let j=Math.min(d.V1$,c),k=(0,d.Vo2)(h,j,c);if(k)return k;if(g)try{let a=await (0,E.stat)(g),b=Date.now()-a.mtimeMs,e=Math.min(d.V1$,c);if(b<=e)return{state:"active",timestamp:a.mtime};if(b<=c)return{state:"ready",timestamp:a.mtime};return{state:"idle",timestamp:a.mtime}}catch{}return null},async recordActivity(a,b){a.workspacePath&&await (0,d.JyZ)(a.workspacePath,b,a=>this.detectActivity(a))},async isProcessRunning(a){try{if("tmux"===a.runtimeName&&a.id){if((0,d.uFH)())return!1;let{stdout:b}=await Z("tmux",["list-panes","-t",a.id,"-F","#{pane_tty}"],{timeout:3e4}),c=b.trim().split("\n").map(a=>a.trim()).filter(Boolean);if(0===c.length)return!1;let{stdout:e}=await Z("ps",["-eo","pid,tty,args"],{timeout:3e4});if(!e)return d.HkR;let f=new Set(c.map(a=>a.replace(/^\/dev\//,""))),g=/(?:^|\/)codex(?:\s|$)/;for(let a of e.split("\n")){let b=a.trimStart().split(/\s+/);if(b.length<3||!f.has(b[1]??""))continue;let c=b.slice(2).join(" ");if(g.test(c))return!0}return!1}let b=a.data.pid,c="number"==typeof b?b:Number(b);if(Number.isFinite(c)&&c>0)try{return process.kill(c,0),!0}catch(a){if(a instanceof Error&&"code"in a&&"EPERM"===a.code)return!0}return!1}catch{return d.HkR}},async getSessionInfo(a){let b,c=await ap(a);if(!c)return null;let d=await ag(c);if(!d)return null;let e=(0,k.basename)(c,".jsonl"),f=d.inputTokens+d.cachedTokens;if(f>0||d.outputTokens>0||d.reasoningTokens>0){let a=d.inputTokens/1e6*2.5+d.cachedTokens/1e6*.625+(d.outputTokens+d.reasoningTokens)/1e6*10;b={inputTokens:f,outputTokens:d.outputTokens,estimatedCostUsd:a}}return{summary:d.model?`Codex session (${d.model})`:null,summaryIsFallback:!0,agentSessionId:e,metadata:d.threadId?{codexThreadId:d.threadId,...d.model?{codexModel:d.model}:{}}:void 0,cost:b}},async getRestoreCommand(b,c){let e=an(b,"codexThreadId"),f=an(b,"codexModel");if(!e){if(!b.workspacePath)return null;let a=await ap(b);if(!a)return null;let c=await ag(a);if(!c?.threadId)return null;e=c.threadId,f=c.model}let g=a??"codex",h=[(0,d.kct)(g),"resume"];return al(h),aj(h,c.agentConfig?.permissions),ak(h,c.agentConfig?.model??f??void 0),h.push((0,d.kct)(e)),aq(h)},async setupWorkspaceHooks(a,b){},async postLaunchSetup(c){if(!a){b||(b=ah());try{a=await b}finally{b=null}}}}},detect:function(){try{return(0,e.execFileSync)("codex",["--version"],{stdio:"ignore",shell:(0,d.uFH)(),windowsHide:!0}),!0}catch{return!1}}},as=(0,f.promisify)(e.execFile);async function at(a){try{let b=(0,k.join)(a,".cursor"),c=(0,k.join)(b,"chat.md");if((await (0,E.lstat)(b)).isSymbolicLink())return null;try{if((await (0,E.lstat)(c)).isSymbolicLink())return null;return(await (0,E.stat)(c)).mtime}catch{return await (0,E.access)(b,i.constants.R_OK),(await (0,E.stat)(b)).mtime}}catch{return null}}async function au(a){try{let b=(0,k.join)(a,".cursor"),c=(0,k.join)(b,"chat.md");try{if((await (0,E.lstat)(b)).isSymbolicLink()||(await (0,E.lstat)(c)).isSymbolicLink())return null;let d=(0,k.resolve)(c),e=(0,k.resolve)(a);if(!d.startsWith(e))return null;for(let a of(await (0,E.readFile)(c,"utf-8")).split("\n")){let b=a.trim();if(b.length>0&&!b.startsWith("#"))return b.length>120?b.substring(0,120)+"...":b}}catch{}}catch{}return null}let av={manifest:{name:"cursor",slot:"agent",description:"Agent plugin: Cursor Agent CLI",version:"0.1.0",displayName:"Cursor"},create:function(){return{name:"cursor",processName:"agent",getLaunchCommand(a){let b=["agent"],c=(0,d.DD3)(a.permissions);if(("permissionless"===c||"auto-edit"===c)&&b.push("--force","--sandbox","disabled","--approve-mcps"),a.model&&b.push("--model",(0,d.kct)(a.model)),a.systemPromptFile)try{if(!(0,i.lstatSync)(a.systemPromptFile).isSymbolicLink())return a.prompt?b.push("--",`"$(cat ${(0,d.kct)(a.systemPromptFile)}; printf '\\n\\n'; printf %s ${(0,d.kct)(a.prompt)})"`):b.push("--",`"$(cat ${(0,d.kct)(a.systemPromptFile)})"`),b.join(" ")}catch{}let e="";return a.systemPrompt&&(e=a.systemPrompt.trim()),a.prompt&&(e=e?e+"\n\n"+a.prompt:a.prompt),e&&b.push("--",(0,d.kct)(e)),b.join(" ")},getEnvironment(a){let b={};return b.AO_SESSION_ID=a.sessionId,a.issueId&&(b.AO_ISSUE_ID=a.issueId),b},detectActivity(a){if(!a.trim())return"idle";let b=a.trim().split("\n"),c=b[b.length-1]?.trim()??"",d=b.slice(-5).join("\n");return/\(Y\)es.*\(N\)o/i.test(d)||/Approve.*changes\?/i.test(d)||/Continue\?/i.test(d)||/\[Yes\].*\[No\]/i.test(d)||/proceed\?/i.test(d)||/Press Enter to continue/i.test(d)?"waiting_input":/^[>$#]\s*$/.test(c)||/^agent>\s*$/.test(c)||/^\[agent\]\s*$/.test(c)?"idle":"active"},async getActivityState(a,b){let c=b??d.PES,e=new Date;if(!a.runtimeHandle||!await this.isProcessRunning(a.runtimeHandle))return{state:"exited",timestamp:e};if(!a.workspacePath)return null;let f=await (0,d.Ahw)(a.workspacePath),g=(0,d.Bmx)(f);if(g)return g;if(await (0,d.Gfo)(a.workspacePath))return{state:"active"};let h=await at(a.workspacePath);if(h){let a=Date.now()-h.getTime();return a<=Math.min(d.V1$,c)?{state:"active",timestamp:h}:a<=c?{state:"ready",timestamp:h}:{state:"idle",timestamp:h}}let i=Math.min(d.V1$,c),j=(0,d.Vo2)(f,i,c);return j||null},async recordActivity(a,b){a.workspacePath&&await (0,d.JyZ)(a.workspacePath,b,a=>this.detectActivity(a))},async isProcessRunning(a){try{if("tmux"===a.runtimeName&&a.id){let{stdout:b}=await as("tmux",["list-panes","-t",a.id,"-F","#{pane_tty}"],{timeout:3e4}),c=b.trim().split("\n").map(a=>a.trim()).filter(Boolean);if(0===c.length)return!1;let{stdout:d}=await as("ps",["-eo","pid,tty,args"],{timeout:3e4}),e=new Set(c.map(a=>a.replace(/^\/dev\//,""))),f=/(?:^|\/)\.?agent\b(?:\s|$)/;for(let a of d.split("\n")){let b=a.trimStart().split(/\s+/);if(b.length<3||!e.has(b[1]??""))continue;let c=b.slice(2).join(" ");if(f.test(c))return!0}return!1}let b=a.data.pid,c="number"==typeof b?b:Number(b);if(Number.isFinite(c)&&c>0)try{return process.kill(c,0),!0}catch(a){if(a instanceof Error&&"code"in a&&"EPERM"===a.code)return!0}return!1}catch{return!1}},async getSessionInfo(a){if(!a.workspacePath)return null;let b=await au(a.workspacePath);return b?{summary:b,summaryIsFallback:!0,agentSessionId:null}:null},getRestoreCommand:async(a,b)=>null,async setupWorkspaceHooks(a,b){},async postLaunchSetup(a){}}},detect:function(){try{let a=(0,e.execFileSync)("agent",["--help"],{encoding:"utf-8",stdio:["ignore","pipe","ignore"],shell:(0,d.uFH)(),windowsHide:!0,timeout:5e3}),b=a.includes("Cursor Agent"),c=a.includes("--approve-mcps")&&a.includes("--sandbox");return b||c}catch{return!1}}};function aw(){let a=process.env.KIMI_SHARE_DIR;return a&&a.trim().length>0?a:(0,k.join)((0,j.homedir)(),".kimi")}let ax=".ao/kimi-baseline.json",ay=".ao/kimi-session-id.json";async function az(){try{let a=await (0,E.readFile)((0,k.join)(aw(),"kimi.json"),"utf-8"),b=JSON.parse(a);if(!b||"object"!=typeof b||Array.isArray(b))return null;return b}catch{return null}}async function aA(a){let b=await az();if(!b?.work_dirs||!Array.isArray(b.work_dirs))return null;let c=await aC(a);for(let a of b.work_dirs)if(a&&"string"==typeof a.path&&await aC(a.path)===c)return a;return null}function aB(a){return(0,h.createHash)("md5").update(a).digest("hex")}async function aC(a){try{return await (0,E.stat)(a),await (0,E.realpath)(a)}catch{return a}}async function aD(a){let b,c,d=(0,k.join)(aw(),"sessions");try{b=await (0,E.realpath)(d)}catch{return!1}try{c=await (0,E.realpath)(a)}catch{return!1}let e=b.endsWith(k.sep)?b:b+k.sep;return c===b||c.startsWith(e)}async function aE(a){try{return(await (0,E.lstat)(a)).isFile()}catch{return!1}}async function aF(a){let b=await Promise.all(["context.jsonl","wire.jsonl"].map(async b=>{try{let c=await (0,E.lstat)((0,k.join)(a,b));return c.isFile()?c:null}catch{return null}})),c=null;for(let a of b)a&&(!c||a.mtimeMs>c.getTime())&&(c=a.mtime);return c}async function aG(a){try{let b=await (0,E.readFile)((0,k.join)(a,ax),"utf-8"),c=JSON.parse(b);if(!Array.isArray(c.preExistingUuids))return null;return new Set(c.preExistingUuids)}catch{return null}}async function aH(a){let b=(0,k.join)(a,ax);try{await (0,E.stat)(b);return}catch{}let c=await aC(a),d=(0,k.join)(aw(),"sessions",aB(c)),e=[];try{e=await (0,E.readdir)(d)}catch{}let f={preExistingUuids:e,capturedAt:new Date().toISOString()};try{await (0,E.mkdir)((0,k.join)(a,".ao"),{recursive:!0}),await (0,E.writeFile)(b,JSON.stringify(f),"utf-8")}catch{}}async function aI(a){try{let b=await (0,E.readFile)((0,k.join)(a,ay),"utf-8"),c=JSON.parse(b);if("string"!=typeof c.sessionId||0===c.sessionId.length)return null;return c.sessionId}catch{return null}}async function aJ(a,b){let c={sessionId:b,pinnedAt:new Date().toISOString()};try{await (0,E.mkdir)((0,k.join)(a,".ao"),{recursive:!0}),await (0,E.writeFile)((0,k.join)(a,ay),JSON.stringify(c),"utf-8")}catch{}}async function aK(a){let b;if(!a.workspacePath)return null;let c=await aC(a.workspacePath),d=(0,k.join)(aw(),"sessions",aB(c));if(!await aD(d))return null;try{b=await (0,E.readdir)(d)}catch{return null}let e=await aI(a.workspacePath),f=null;if(!e){let b=await aA(a.workspacePath);b&&"string"==typeof b.last_session_id&&b.last_session_id.length>0&&(f=b.last_session_id)}let g=await aG(a.workspacePath),h=a.createdAt.getTime()-6e4,i=null,j=null;for(let a of b){let b=(0,k.join)(d,a);if(!await aD(b))continue;let c=await aF(b);if(!c)continue;if(e){if(a!==e)continue;return{dir:b,sessionId:a,mtime:c}}if(g?.has(a)||c.getTime()<h)continue;if(f&&a===f){j={dir:b,sessionId:a,mtime:c};continue}let l=c.getTime();(!i||l>i.mtimeMs)&&(i={dir:b,sessionId:a,mtime:c,mtimeMs:l})}return e?null:j?(await aJ(a.workspacePath,j.sessionId),j):i?(await aJ(a.workspacePath,i.sessionId),{dir:i.dir,sessionId:i.sessionId,mtime:i.mtime}):null}let aL=new Map;async function aM(a){let b=a.workspacePath;if(!b)return null;let c=Date.now(),d=aL.get(b);if(d&&d.expiry>c)return d.match;d&&aL.delete(b);let e=await aK(a),f=e?3e4:2e3;return aL.set(b,{match:e,expiry:c+f}),aL.size>256&&function(a){for(let[b,c]of aL)c.expiry<=a&&aL.delete(b);if(aL.size<=256)return;let b=[...aL.entries()].sort((a,b)=>a[1].expiry-b[1].expiry),c=aL.size-256;for(let a=0;a<c;a++){let c=b[a];c&&aL.delete(c[0])}}(c),e}let aN=(0,f.promisify)(e.execFile);async function aO(a){let b=(0,k.join)(a,"wire.jsonl");if(!await aE(b))return null;let c=null,d=null,e=null;try{d=(0,i.createReadStream)(b,{encoding:"utf-8"}),e=(0,Y.createInterface)({input:d,crlfDelay:1/0});let a=0;for await(let b of e){if((a+=b.length)>1e6)break;let d=b.trim();if(d)try{let a=JSON.parse(d);if(!a||"object"!=typeof a||Array.isArray(a))continue;let b=a.message;if(!b||"object"!=typeof b||Array.isArray(b)||"TurnBegin"!==b.type)continue;let e=b.payload;if(!e||"object"!=typeof e||Array.isArray(e))continue;let f=e.user_input;if("string"==typeof f&&f.length>0){c=f.length>120?f.slice(0,120)+"...":f;break}}catch{}}}catch{return null}finally{e?.close(),d?.destroy()}return c}function aP(a,b){let c=(0,d.DD3)(b);("permissionless"===c||"auto-edit"===c)&&a.push("--yolo")}function aQ(a){let b=a.join(" ");return(0,d.uFH)()?`& ${b}`:b}let aR=/kimi[-_](?:cli|code)|moonshot/i,aS={manifest:{name:"kimicode",slot:"agent",description:"Agent plugin: Kimi Code CLI (MoonshotAI)",version:"0.1.0",displayName:"Kimi Code"},create:function(){return{name:"kimicode",processName:"kimi",getLaunchCommand(a){let b=["kimi"],c=a.workspacePath??a.projectConfig.path;c&&b.push("--work-dir",(0,d.kct)(c)),aP(b,a.permissions),a.model&&b.push("--model",(0,d.kct)(a.model)),a.subagent&&b.push("--agent",(0,d.kct)(a.subagent));let e=a.prompt??"";if(a.systemPromptFile){let b=(0,i.readFileSync)(a.systemPromptFile,"utf-8");e=e?`${b}
587
+ `,U=`#!/usr/bin/env node
588
+ // Subagent Blocker Hook for Athene
589
+ //
590
+ // Blocks native Claude subagent dispatch (Task/Agent) in orchestrator
591
+ // sessions. Orchestrators delegate via \`ao spawn\`; only read-only
592
+ // Explore/Plan investigation agents are allowed. No-ops for workers.
593
+
594
+ const { readFileSync } = require("node:fs");
595
+
596
+ // Runtime gating: only act in orchestrator sessions. Worker sessions
597
+ // (${d.Kmu.CALLER_TYPE} === "agent") and every other caller type are unaffected even
598
+ // though the hook is installed everywhere.
599
+ if (${(0,d.Etf)(d.Kmu.CALLER_TYPE)} !== "orchestrator") {
600
+ process.exit(0);
601
+ }
602
+
603
+ let inputRaw = "";
604
+ try {
605
+ inputRaw = readFileSync(0, "utf-8");
606
+ } catch {
607
+ process.exit(0);
608
+ }
609
+
610
+ let payload;
611
+ try {
612
+ payload = JSON.parse(inputRaw || "{}");
613
+ } catch {
614
+ process.exit(0);
615
+ }
616
+
617
+ const toolName = typeof payload.tool_name === "string" ? payload.tool_name : "";
618
+ if (toolName !== "Task" && toolName !== "Agent") {
619
+ process.exit(0);
620
+ }
621
+
622
+ const toolInput =
623
+ payload.tool_input && typeof payload.tool_input === "object" ? payload.tool_input : {};
624
+ const subagentType =
625
+ typeof toolInput.subagent_type === "string" ? toolInput.subagent_type.toLowerCase() : "";
626
+
627
+ // Read-only investigation agents are permitted from the orchestrator.
628
+ if (subagentType === "explore" || subagentType === "plan") {
629
+ process.exit(0);
630
+ }
631
+
632
+ const reason =
633
+ "Orchestrator sessions must not dispatch native subagents. Delegate " +
634
+ "implementation work through \`ao spawn\`, which creates a tracked worker " +
635
+ "session (worktree, branch, lifecycle polling, dashboard visibility). Only " +
636
+ "read-only Explore/Plan investigation agents are permitted from the orchestrator.";
637
+
638
+ process.stdout.write(
639
+ JSON.stringify({
640
+ hookSpecificOutput: {
641
+ hookEventName: "PreToolUse",
642
+ permissionDecision: "deny",
643
+ permissionDecisionReason: reason,
644
+ },
645
+ }) + "\\n",
646
+ );
647
+ process.exit(0);
648
+ `;async function V(a,b=131072){let c,d;try{let{size:e=0}=await (0,E.stat)(a);if(d=Math.max(0,e-b),0===d)c=await (0,E.readFile)(a,"utf-8");else{let b=await (0,E.open)(a,"r");try{let a=e-d,f=Buffer.allocUnsafe(a);await b.read(f,0,a,d),c=f.toString("utf-8")}finally{await b.close()}}}catch{return[]}let e=c.indexOf("\n"),f=d>0&&e>=0?c.slice(e+1):c,g=[];for(let a of f.split("\n")){let b=a.trim();if(b)try{let a=JSON.parse(b);"object"!=typeof a||null===a||Array.isArray(a)||g.push(a)}catch{}}return g}async function W(a){let b,c,e=(0,k.join)(a,".claude"),f=(0,k.join)(e,"settings.json");try{await (0,E.mkdir)(e,{recursive:!0})}catch{}if((0,d.uFH)()){let a=(0,k.join)(e,"metadata-updater.cjs"),d=(0,k.join)(e,"activity-updater.cjs");await (0,E.writeFile)(a,R,"utf-8"),await (0,E.writeFile)(d,T,"utf-8"),b="node .claude/metadata-updater.cjs",c="node .claude/activity-updater.cjs"}else{let a=(0,k.join)(e,"metadata-updater.sh"),d=(0,k.join)(e,"activity-updater.sh");await (0,E.writeFile)(a,Q,"utf-8"),await (0,E.writeFile)(d,S,"utf-8"),await (0,E.chmod)(a,493),await (0,E.chmod)(d,493),b=".claude/metadata-updater.sh",c=".claude/activity-updater.sh"}let g=(0,k.join)(e,"subagent-blocker.cjs");await (0,E.writeFile)(g,U,"utf-8");let h={};if((0,i.existsSync)(f))try{let a=await (0,E.readFile)(f,"utf-8");h=JSON.parse(a)}catch{}let j=h.hooks??{};for(let a of function(a,b,c){let d=["activity-updater.sh","activity-updater.cjs"],e=[{event:"PostToolUse",matcher:"Bash",command:a,timeout:5e3,identifiers:["metadata-updater.sh","metadata-updater.cjs","metadata-updater.js"]},{event:"PreToolUse",matcher:"Task|Agent",command:c,timeout:2e3,identifiers:["subagent-blocker.cjs"]}];for(let a of["SessionStart","UserPromptSubmit","PreToolUse","PostToolUse","PostToolUseFailure","PostToolBatch","Notification","PermissionRequest","Stop","StopFailure","SubagentStart","SubagentStop","PreCompact","PostCompact"])e.push({event:a,matcher:"",command:b,timeout:2e3,identifiers:d});return e}(b,c,"node .claude/subagent-blocker.cjs"))!function(a,b){let c=a[b.event],d=Array.isArray(c)?c:[],e=-1,f=-1;for(let a=0;a<d.length;a++){let c=d[a];if("object"!=typeof c||null===c||Array.isArray(c))continue;let g=c.hooks;if(Array.isArray(g)){for(let c=0;c<g.length;c++){let d=g[c];if("object"!=typeof d||null===d||Array.isArray(d))continue;let h=d.command;if("string"==typeof h&&b.identifiers.some(a=>h.includes(a))){e=a,f=c;break}}if(e>=0)break}}if(-1===e)d.push({matcher:b.matcher,hooks:[{type:"command",command:b.command,timeout:b.timeout}]});else{let a=d[e],c=a.hooks;c[f].command=b.command,c[f].timeout=b.timeout,1===c.length&&(a.matcher=b.matcher)}a[b.event]=d}(j,a);h.hooks=j,await (0,E.writeFile)(f,JSON.stringify(h,null,2)+"\n","utf-8")}let X={manifest:{name:"claude-code",slot:"agent",description:"Agent plugin: Claude Code CLI",version:"0.1.0",displayName:"Claude Code"},create:function(){return{name:"claude-code",processName:"claude",getLaunchCommand(a){let b=["claude"],c=(0,d.DD3)(a.permissions);if(("permissionless"===c||"auto-edit"===c)&&b.push("--dangerously-skip-permissions"),a.model&&b.push("--model",(0,d.kct)(a.model)),a.systemPromptFile)if((0,d.uFH)()){let c=(0,i.readFileSync)(a.systemPromptFile,"utf-8");b.push("--append-system-prompt",(0,d.kct)(c))}else b.push("--append-system-prompt",`"$(cat ${(0,d.kct)(a.systemPromptFile)})"`);else a.systemPrompt&&b.push("--append-system-prompt",(0,d.kct)(a.systemPrompt));return a.prompt&&b.push("--",(0,d.kct)(a.prompt)),b.join(" ")},getEnvironment(a){let b={};return b.CLAUDECODE="",b[d.Kmu.SESSION_ID]=a.sessionId,a.issueId&&(b[d.Kmu.ISSUE_ID]=a.issueId),(0,d.Nv_)(b)},detectActivity:a=>"idle",isProcessRunning:async a=>N(a),async getActivityState(a,b){return P(a,b,a=>this.isProcessRunning(a))},async getSessionInfo(a){if(!a.workspacePath)return null;let b=G(await H(a.workspacePath)),c=(0,k.join)((0,j.homedir)(),".claude","projects",b),d=await J(c);if(!d)return null;let e=await V(d);if(0===e.length)return null;let f=(0,k.basename)(d,".jsonl"),g=function(a){for(let b=a.length-1;b>=0;b--){let c=a[b];if(c?.type==="summary"&&c.summary)return{summary:c.summary,isFallback:!1}}for(let b of a)if(b?.type==="user"&&b.message?.content&&"string"==typeof b.message.content){let a=b.message.content.trim();if(a.length>0)return{summary:a.length>120?a.substring(0,120)+"...":a,isFallback:!0}}return null}(e);return{summary:g?.summary??null,summaryIsFallback:g?.isFallback,agentSessionId:f,metadata:{claudeSessionUuid:f},cost:function(a){let b=0,c=0,d=0,e=0,f=0;for(let g of a)"number"==typeof g.costUSD?f+=g.costUSD:"number"==typeof g.estimatedCostUsd&&(f+=g.estimatedCostUsd),g.usage?(b+=g.usage.input_tokens??0,d+=g.usage.cache_read_input_tokens??0,e+=g.usage.cache_creation_input_tokens??0,c+=g.usage.output_tokens??0):("number"==typeof g.inputTokens&&(b+=g.inputTokens),"number"==typeof g.outputTokens&&(c+=g.outputTokens));if(0!==b||0!==c||0!==f||0!==d||0!==e)return 0===f&&(f=b/1e6*3+c/1e6*15+d/1e6*.3+e/1e6*3.75),{inputTokens:b+d+e,outputTokens:c,estimatedCostUsd:f}}(e),contextWindow:function(a){for(let c=a.length-1;c>=0;c--){var b;let d=a[c],e=d?.message?.usage??d?.usage;if(!e)continue;let f=(e.input_tokens??0)+(e.cache_read_input_tokens??0)+(e.cache_creation_input_tokens??0);if(f<=0)continue;let g=(b=d?.message?.model??d?.model)&&/\[?1m\]?/i.test(b)?1e6:2e5;return{usedTokens:f,limitTokens:g,pct:f/g}}}(e)}},async getRestoreCommand(a,b){let c=a.metadata?.claudeSessionUuid?.trim();if(!c){if(!a.workspacePath)return null;let b=G(await H(a.workspacePath)),d=(0,k.join)((0,j.homedir)(),".claude","projects",b),e=await J(d);if(!e)return null;c=(0,k.basename)(e,".jsonl")}if(!c)return null;let e=["claude","--resume",(0,d.kct)(c)],f=(0,d.DD3)(b.agentConfig?.permissions);return("permissionless"===f||"auto-edit"===f)&&e.push("--dangerously-skip-permissions"),b.agentConfig?.model&&e.push("--model",(0,d.kct)(b.agentConfig.model)),e.join(" ")},async setupWorkspaceHooks(a,b){await W(a)},async postLaunchSetup(a){}}},detect:function(){try{return(0,e.execFileSync)("claude",["--version"],{stdio:"ignore",shell:(0,d.uFH)(),windowsHide:!0}),!0}catch{return!1}}};var Y=c(46193),Z=c(80481);c(78474).EventEmitter;let $=(0,f.promisify)(e.execFile),_=(0,k.join)((0,j.homedir)(),".codex","sessions");function aa(a){return a.payload??a}async function ab(a,b=0){let c;if(b>4)return[];try{c=await (0,E.readdir)(a)}catch{return[]}let d=[];for(let e of c){let c=(0,k.join)(a,e);if(e.endsWith(".jsonl"))d.push(c);else try{if((await (0,E.lstat)(c)).isDirectory()){let a=await ab(c,b+1);d.push(...a)}}catch{}}return d}async function ac(a,b){let c=await (0,E.open)(a,"r"),d=[],e="",f=new Y.StringDecoder("utf8");try{for(;d.length<b;){let a=Buffer.allocUnsafe(8192),{bytesRead:g}=await c.read(a,0,a.length,null);if(0===g){let a=(e+=f.end()).trim();a&&d.push(a);break}let h=(e+=f.write(a.subarray(0,g))).indexOf("\n");for(;-1!==h&&d.length<b;){let a=e.slice(0,h).trim();a&&d.push(a),h=(e=e.slice(h+1)).indexOf("\n")}}}finally{await c.close()}return d}function ad(a){return a.replace(/\\/g,"/").replace(/^([a-zA-Z]):/,(a,b)=>b.toLowerCase()+":")}async function ae(a,b){let c=ad(b);try{for(let b of(await ac(a,10)))try{let a=JSON.parse(b);if("object"==typeof a&&null!==a&&!Array.isArray(a)){let b=aa(a);if("session_meta"===a.type&&"string"==typeof b.cwd&&ad(b.cwd)===c)return!0}}catch{}}catch{}return!1}async function af(a,b){if(0===(b??=await ab(_)).length)return null;let c=null;for(let d of b)if(await ae(d,a))try{let a=await (0,E.stat)(d);(!c||a.mtimeMs>c.mtime)&&(c={path:d,mtime:a.mtimeMs})}catch{}return c?.path??null}async function ag(a,b){let c=(b??=await ab(_)).filter(b=>(0,k.basename)(b).endsWith(`-${a}.jsonl`));if(0===c.length)return null;if(1===c.length)return c[0]??null;let d=null,e=null;for(let a of c){e??=a;try{let b=await (0,E.stat)(a);(!d||b.mtimeMs>d.mtime)&&(d={path:a,mtime:b.mtimeMs})}catch{}}return d?.path??e}async function ah(a){let b=null,c=null;try{let d={model:null,threadId:null,inputTokens:0,outputTokens:0,cachedTokens:0,reasoningTokens:0};for await(let e of(b=(0,i.createReadStream)(a,{encoding:"utf-8"}),c=(0,Z.createInterface)({input:b,crlfDelay:1/0}))){let a=e.trim();if(a)try{let b=JSON.parse(a);if("object"!=typeof b||null===b||Array.isArray(b))continue;let c=aa(b);"session_meta"===b.type&&("string"==typeof c.id&&c.id?d.threadId=c.id:"string"==typeof c.threadId&&c.threadId&&(d.threadId=c.threadId)),!d.threadId&&("string"==typeof c.threadId&&c.threadId?d.threadId=c.threadId:"string"==typeof b.threadId&&b.threadId&&(d.threadId=b.threadId)),"turn_context"===b.type&&"string"==typeof c.model&&c.model?d.model=c.model:!d.model&&"string"==typeof c.model&&c.model&&(d.model=c.model);let e=c.info?.total_token_usage;if("number"==typeof e?.input_tokens){d.inputTokens=e.input_tokens,d.outputTokens=e.output_tokens??0;continue}let f=c.info?.last_token_usage;if("number"==typeof f?.input_tokens){d.inputTokens+=f.input_tokens,d.outputTokens+=f.output_tokens??0;continue}if("number"==typeof c.input_tokens){d.inputTokens+=c.input_tokens,d.outputTokens+=c.output_tokens??0;continue}"event_msg"===b.type&&b.msg?.type==="token_count"&&(d.inputTokens+=b.msg.input_tokens??0,d.outputTokens+=b.msg.output_tokens??0,d.cachedTokens+=b.msg.cached_tokens??0,d.reasoningTokens+=b.msg.reasoning_tokens??0)}catch{}}return d}catch{return null}finally{c?.close(),b?.destroy()}}async function ai(){if((0,d.uFH)())return aj();try{let{stdout:a}=await $("which",["codex"],{timeout:1e4}),b=a.trim();if(b)return b}catch{}let a=(0,j.homedir)();for(let b of["/usr/local/bin/codex","/opt/homebrew/bin/codex",(0,k.join)(a,".cargo","bin","codex"),(0,k.join)(a,".npm","bin","codex")])try{return await (0,E.stat)(b),b}catch{}return"codex"}async function aj(){for(let a of["codex.cmd","codex.exe"])try{let{stdout:b}=await $("where.exe",[a],{timeout:1e4,windowsHide:!0}),c=b.split(/\r?\n/).find(a=>a.trim().length>0);if(c)return c.trim()}catch{}let a=process.env.APPDATA,b=(0,j.homedir)();for(let c of[a?(0,k.join)(a,"npm","codex.cmd"):null,a?(0,k.join)(a,"npm","codex.exe"):null,(0,k.join)(b,".cargo","bin","codex.exe")].filter(a=>null!==a))try{return await (0,E.stat)(c),c}catch{}return"codex"}function ak(a,b,c=!0){let e=(0,d.DD3)(b);"permissionless"===e?c?a.push("--dangerously-bypass-approvals-and-sandbox"):a.push("--ask-for-approval","never"):"auto-edit"===e?a.push("--ask-for-approval","never"):"suggest"===e&&a.push("--ask-for-approval","untrusted")}function al(a,b){b&&(a.push("--model",(0,d.kct)(b)),/^o[34]/i.test(b)&&a.push("-c","model_reasoning_effort=high"))}function am(a){a.push("-c","check_for_update_on_startup=false")}let an=new Map;function ao(a,b){let c=a.metadata?.[b];return"string"==typeof c&&c.trim()?c.trim():null}async function ap(a,b){let c=an.get(a);if(c&&Date.now()<c.expiry)return c.path;let d=await b();return an.set(a,{path:d,expiry:Date.now()+3e4}),d}async function aq(a){let b=null,c=async()=>b??=await ab(_),d=ao(a,"codexThreadId");if(d){let a=await ap(`thread:${d}`,async()=>ag(d,await c()));if(a)return a}return a.workspacePath?ap(`cwd:${ad(a.workspacePath)}`,async()=>af(a.workspacePath,await c())):null}function ar(a){let b=a.join(" ");return(0,d.uFH)()?`& ${b}`:b}let as={manifest:{name:"codex",slot:"agent",description:"Agent plugin: OpenAI Codex CLI",version:"0.1.1",displayName:"OpenAI Codex"},create:function(){let a,b;return a=null,b=null,{name:"codex",processName:"codex",getLaunchCommand(b){let c=a??"codex",e=[(0,d.kct)(c)];return am(e),ak(e,b.permissions),al(e,b.model),b.systemPromptFile?e.push("-c",`model_instructions_file=${(0,d.kct)(b.systemPromptFile)}`):b.systemPrompt&&e.push("-c",`developer_instructions=${(0,d.kct)(b.systemPrompt)}`),b.prompt&&e.push("--",(0,d.kct)(b.prompt)),ar(e)},getEnvironment(a){let b={};return b[d.Kmu.SESSION_ID]=a.sessionId,a.issueId&&(b[d.Kmu.ISSUE_ID]=a.issueId),b.CODEX_DISABLE_UPDATE_CHECK="1",(0,d.Nv_)(b)},detectActivity(a){if(!a.trim())return"idle";let b=a.trim().split("\n"),c=b[b.length-1]?.trim()??"";if(/^[>$#]\s*$/.test(c))return"idle";let d=b.slice(-5).join("\n");return/approval required/i.test(d)||/\(y\)es.*\(n\)o/i.test(d)?"waiting_input":"active"},async getActivityState(a,b){let c=b??d.PES,e=new Date;if(!a.runtimeHandle)return{state:"exited",timestamp:e};let f=await this.isProcessRunning(a.runtimeHandle);if(f===d.HkR)return null;if(!f)return{state:"exited",timestamp:e};if(!a.workspacePath&&!ao(a,"codexThreadId"))return null;let g=await aq(a);if(g){let a=await (0,d.XIc)(g);if(a){let b=Date.now()-a.modifiedAt.getTime(),e=a.modifiedAt,f=a.payloadType??a.lastType,g=Math.min(d.V1$,c);switch(f){case"approval_request":case"exec_approval_request":case"apply_patch_approval_request":return{state:"waiting_input",timestamp:e};case"error":case"stream_error":return{state:"blocked",timestamp:e};case"task_started":case"agent_reasoning":case"response_item":case"turn_context":case"user_input":case"tool_call":case"exec_command":case"exec_command_begin":case"exec_command_end":default:if(b<=g)return{state:"active",timestamp:e};return{state:b>c?"idle":"ready",timestamp:e};case"task_complete":case"turn_aborted":case"agent_message":case"assistant_message":case"session_meta":case"event_msg":case"compacted":case"token_count":return{state:b>c?"idle":"ready",timestamp:e}}}}let h=a.workspacePath?await (0,d.Ahw)(a.workspacePath):null,i=(0,d.Bmx)(h);if(i)return i;let j=Math.min(d.V1$,c),k=(0,d.Vo2)(h,j,c);if(k)return k;if(g)try{let a=await (0,E.stat)(g),b=Date.now()-a.mtimeMs,e=Math.min(d.V1$,c);if(b<=e)return{state:"active",timestamp:a.mtime};if(b<=c)return{state:"ready",timestamp:a.mtime};return{state:"idle",timestamp:a.mtime}}catch{}return null},async recordActivity(a,b){a.workspacePath&&await (0,d.JyZ)(a.workspacePath,b,a=>this.detectActivity(a))},async isProcessRunning(a){try{if("tmux"===a.runtimeName&&a.id){if((0,d.uFH)())return!1;let{stdout:b}=await $("tmux",["list-panes","-t",a.id,"-F","#{pane_tty}"],{timeout:3e4}),c=b.trim().split("\n").map(a=>a.trim()).filter(Boolean);if(0===c.length)return!1;let{stdout:e}=await $("ps",["-eo","pid,tty,args"],{timeout:3e4});if(!e)return d.HkR;let f=new Set(c.map(a=>a.replace(/^\/dev\//,""))),g=/(?:^|\/)codex(?:\s|$)/;for(let a of e.split("\n")){let b=a.trimStart().split(/\s+/);if(b.length<3||!f.has(b[1]??""))continue;let c=b.slice(2).join(" ");if(g.test(c))return!0}return!1}let b=a.data.pid,c="number"==typeof b?b:Number(b);if(Number.isFinite(c)&&c>0)try{return process.kill(c,0),!0}catch(a){if(a instanceof Error&&"code"in a&&"EPERM"===a.code)return!0}return!1}catch{return d.HkR}},async getSessionInfo(a){let b,c=await aq(a);if(!c)return null;let d=await ah(c);if(!d)return null;let e=(0,k.basename)(c,".jsonl"),f=d.inputTokens+d.cachedTokens;if(f>0||d.outputTokens>0||d.reasoningTokens>0){let a=d.inputTokens/1e6*2.5+d.cachedTokens/1e6*.625+(d.outputTokens+d.reasoningTokens)/1e6*10;b={inputTokens:f,outputTokens:d.outputTokens,estimatedCostUsd:a}}return{summary:d.model?`Codex session (${d.model})`:null,summaryIsFallback:!0,agentSessionId:e,metadata:d.threadId?{codexThreadId:d.threadId,...d.model?{codexModel:d.model}:{}}:void 0,cost:b}},async getRestoreCommand(b,c){let e=ao(b,"codexThreadId"),f=ao(b,"codexModel");if(!e){if(!b.workspacePath)return null;let a=await aq(b);if(!a)return null;let c=await ah(a);if(!c?.threadId)return null;e=c.threadId,f=c.model}let g=a??"codex",h=[(0,d.kct)(g),"resume"];return am(h),ak(h,c.agentConfig?.permissions),al(h,c.agentConfig?.model??f??void 0),h.push((0,d.kct)(e)),ar(h)},async setupWorkspaceHooks(a,b){},async postLaunchSetup(c){if(!a){b||(b=ai());try{a=await b}finally{b=null}}}}},detect:function(){try{return(0,e.execFileSync)("codex",["--version"],{stdio:"ignore",shell:(0,d.uFH)(),windowsHide:!0}),!0}catch{return!1}}},at=(0,f.promisify)(e.execFile);async function au(a){try{let b=(0,k.join)(a,".cursor"),c=(0,k.join)(b,"chat.md");if((await (0,E.lstat)(b)).isSymbolicLink())return null;try{if((await (0,E.lstat)(c)).isSymbolicLink())return null;return(await (0,E.stat)(c)).mtime}catch{return await (0,E.access)(b,i.constants.R_OK),(await (0,E.stat)(b)).mtime}}catch{return null}}async function av(a){try{let b=(0,k.join)(a,".cursor"),c=(0,k.join)(b,"chat.md");try{if((await (0,E.lstat)(b)).isSymbolicLink()||(await (0,E.lstat)(c)).isSymbolicLink())return null;let d=(0,k.resolve)(c),e=(0,k.resolve)(a);if(!d.startsWith(e))return null;for(let a of(await (0,E.readFile)(c,"utf-8")).split("\n")){let b=a.trim();if(b.length>0&&!b.startsWith("#"))return b.length>120?b.substring(0,120)+"...":b}}catch{}}catch{}return null}let aw={manifest:{name:"cursor",slot:"agent",description:"Agent plugin: Cursor Agent CLI",version:"0.1.0",displayName:"Cursor"},create:function(){return{name:"cursor",processName:"agent",getLaunchCommand(a){let b=["agent"],c=(0,d.DD3)(a.permissions);if(("permissionless"===c||"auto-edit"===c)&&b.push("--force","--sandbox","disabled","--approve-mcps"),a.model&&b.push("--model",(0,d.kct)(a.model)),a.systemPromptFile)try{if(!(0,i.lstatSync)(a.systemPromptFile).isSymbolicLink())return a.prompt?b.push("--",`"$(cat ${(0,d.kct)(a.systemPromptFile)}; printf '\\n\\n'; printf %s ${(0,d.kct)(a.prompt)})"`):b.push("--",`"$(cat ${(0,d.kct)(a.systemPromptFile)})"`),b.join(" ")}catch{}let e="";return a.systemPrompt&&(e=a.systemPrompt.trim()),a.prompt&&(e=e?e+"\n\n"+a.prompt:a.prompt),e&&b.push("--",(0,d.kct)(e)),b.join(" ")},getEnvironment(a){let b={};return b[d.Kmu.SESSION_ID]=a.sessionId,a.issueId&&(b[d.Kmu.ISSUE_ID]=a.issueId),(0,d.Nv_)(b)},detectActivity(a){if(!a.trim())return"idle";let b=a.trim().split("\n"),c=b[b.length-1]?.trim()??"",d=b.slice(-5).join("\n");return/\(Y\)es.*\(N\)o/i.test(d)||/Approve.*changes\?/i.test(d)||/Continue\?/i.test(d)||/\[Yes\].*\[No\]/i.test(d)||/proceed\?/i.test(d)||/Press Enter to continue/i.test(d)?"waiting_input":/^[>$#]\s*$/.test(c)||/^agent>\s*$/.test(c)||/^\[agent\]\s*$/.test(c)?"idle":"active"},async getActivityState(a,b){let c=b??d.PES,e=new Date;if(!a.runtimeHandle||!await this.isProcessRunning(a.runtimeHandle))return{state:"exited",timestamp:e};if(!a.workspacePath)return null;let f=await (0,d.Ahw)(a.workspacePath),g=(0,d.Bmx)(f);if(g)return g;if(await (0,d.Gfo)(a.workspacePath))return{state:"active"};let h=await au(a.workspacePath);if(h){let a=Date.now()-h.getTime();return a<=Math.min(d.V1$,c)?{state:"active",timestamp:h}:a<=c?{state:"ready",timestamp:h}:{state:"idle",timestamp:h}}let i=Math.min(d.V1$,c),j=(0,d.Vo2)(f,i,c);return j||null},async recordActivity(a,b){a.workspacePath&&await (0,d.JyZ)(a.workspacePath,b,a=>this.detectActivity(a))},async isProcessRunning(a){try{if("tmux"===a.runtimeName&&a.id){let{stdout:b}=await at("tmux",["list-panes","-t",a.id,"-F","#{pane_tty}"],{timeout:3e4}),c=b.trim().split("\n").map(a=>a.trim()).filter(Boolean);if(0===c.length)return!1;let{stdout:d}=await at("ps",["-eo","pid,tty,args"],{timeout:3e4}),e=new Set(c.map(a=>a.replace(/^\/dev\//,""))),f=/(?:^|\/)\.?agent\b(?:\s|$)/;for(let a of d.split("\n")){let b=a.trimStart().split(/\s+/);if(b.length<3||!e.has(b[1]??""))continue;let c=b.slice(2).join(" ");if(f.test(c))return!0}return!1}let b=a.data.pid,c="number"==typeof b?b:Number(b);if(Number.isFinite(c)&&c>0)try{return process.kill(c,0),!0}catch(a){if(a instanceof Error&&"code"in a&&"EPERM"===a.code)return!0}return!1}catch{return!1}},async getSessionInfo(a){if(!a.workspacePath)return null;let b=await av(a.workspacePath);return b?{summary:b,summaryIsFallback:!0,agentSessionId:null}:null},getRestoreCommand:async(a,b)=>null,async setupWorkspaceHooks(a,b){},async postLaunchSetup(a){}}},detect:function(){try{let a=(0,e.execFileSync)("agent",["--help"],{encoding:"utf-8",stdio:["ignore","pipe","ignore"],shell:(0,d.uFH)(),windowsHide:!0,timeout:5e3}),b=a.includes("Cursor Agent"),c=a.includes("--approve-mcps")&&a.includes("--sandbox");return b||c}catch{return!1}}};function ax(){let a=process.env.KIMI_SHARE_DIR;return a&&a.trim().length>0?a:(0,k.join)((0,j.homedir)(),".kimi")}let ay=".ao/kimi-baseline.json",az=".ao/kimi-session-id.json";async function aA(){try{let a=await (0,E.readFile)((0,k.join)(ax(),"kimi.json"),"utf-8"),b=JSON.parse(a);if(!b||"object"!=typeof b||Array.isArray(b))return null;return b}catch{return null}}async function aB(a){let b=await aA();if(!b?.work_dirs||!Array.isArray(b.work_dirs))return null;let c=await aD(a);for(let a of b.work_dirs)if(a&&"string"==typeof a.path&&await aD(a.path)===c)return a;return null}function aC(a){return(0,h.createHash)("md5").update(a).digest("hex")}async function aD(a){try{return await (0,E.stat)(a),await (0,E.realpath)(a)}catch{return a}}async function aE(a){let b,c,d=(0,k.join)(ax(),"sessions");try{b=await (0,E.realpath)(d)}catch{return!1}try{c=await (0,E.realpath)(a)}catch{return!1}let e=b.endsWith(k.sep)?b:b+k.sep;return c===b||c.startsWith(e)}async function aF(a){try{return(await (0,E.lstat)(a)).isFile()}catch{return!1}}async function aG(a){let b=await Promise.all(["context.jsonl","wire.jsonl"].map(async b=>{try{let c=await (0,E.lstat)((0,k.join)(a,b));return c.isFile()?c:null}catch{return null}})),c=null;for(let a of b)a&&(!c||a.mtimeMs>c.getTime())&&(c=a.mtime);return c}async function aH(a){try{let b=await (0,E.readFile)((0,k.join)(a,ay),"utf-8"),c=JSON.parse(b);if(!Array.isArray(c.preExistingUuids))return null;return new Set(c.preExistingUuids)}catch{return null}}async function aI(a){let b=(0,k.join)(a,ay);try{await (0,E.stat)(b);return}catch{}let c=await aD(a),d=(0,k.join)(ax(),"sessions",aC(c)),e=[];try{e=await (0,E.readdir)(d)}catch{}let f={preExistingUuids:e,capturedAt:new Date().toISOString()};try{await (0,E.mkdir)((0,k.join)(a,".ao"),{recursive:!0}),await (0,E.writeFile)(b,JSON.stringify(f),"utf-8")}catch{}}async function aJ(a){try{let b=await (0,E.readFile)((0,k.join)(a,az),"utf-8"),c=JSON.parse(b);if("string"!=typeof c.sessionId||0===c.sessionId.length)return null;return c.sessionId}catch{return null}}async function aK(a,b){let c={sessionId:b,pinnedAt:new Date().toISOString()};try{await (0,E.mkdir)((0,k.join)(a,".ao"),{recursive:!0}),await (0,E.writeFile)((0,k.join)(a,az),JSON.stringify(c),"utf-8")}catch{}}async function aL(a){let b;if(!a.workspacePath)return null;let c=await aD(a.workspacePath),d=(0,k.join)(ax(),"sessions",aC(c));if(!await aE(d))return null;try{b=await (0,E.readdir)(d)}catch{return null}let e=await aJ(a.workspacePath),f=null;if(!e){let b=await aB(a.workspacePath);b&&"string"==typeof b.last_session_id&&b.last_session_id.length>0&&(f=b.last_session_id)}let g=await aH(a.workspacePath),h=a.createdAt.getTime()-6e4,i=null,j=null;for(let a of b){let b=(0,k.join)(d,a);if(!await aE(b))continue;let c=await aG(b);if(!c)continue;if(e){if(a!==e)continue;return{dir:b,sessionId:a,mtime:c}}if(g?.has(a)||c.getTime()<h)continue;if(f&&a===f){j={dir:b,sessionId:a,mtime:c};continue}let l=c.getTime();(!i||l>i.mtimeMs)&&(i={dir:b,sessionId:a,mtime:c,mtimeMs:l})}return e?null:j?(await aK(a.workspacePath,j.sessionId),j):i?(await aK(a.workspacePath,i.sessionId),{dir:i.dir,sessionId:i.sessionId,mtime:i.mtime}):null}let aM=new Map;async function aN(a){let b=a.workspacePath;if(!b)return null;let c=Date.now(),d=aM.get(b);if(d&&d.expiry>c)return d.match;d&&aM.delete(b);let e=await aL(a),f=e?3e4:2e3;return aM.set(b,{match:e,expiry:c+f}),aM.size>256&&function(a){for(let[b,c]of aM)c.expiry<=a&&aM.delete(b);if(aM.size<=256)return;let b=[...aM.entries()].sort((a,b)=>a[1].expiry-b[1].expiry),c=aM.size-256;for(let a=0;a<c;a++){let c=b[a];c&&aM.delete(c[0])}}(c),e}let aO=(0,f.promisify)(e.execFile);async function aP(a){let b=(0,k.join)(a,"wire.jsonl");if(!await aF(b))return null;let c=null,d=null,e=null;try{d=(0,i.createReadStream)(b,{encoding:"utf-8"}),e=(0,Z.createInterface)({input:d,crlfDelay:1/0});let a=0;for await(let b of e){if((a+=b.length)>1e6)break;let d=b.trim();if(d)try{let a=JSON.parse(d);if(!a||"object"!=typeof a||Array.isArray(a))continue;let b=a.message;if(!b||"object"!=typeof b||Array.isArray(b)||"TurnBegin"!==b.type)continue;let e=b.payload;if(!e||"object"!=typeof e||Array.isArray(e))continue;let f=e.user_input;if("string"==typeof f&&f.length>0){c=f.length>120?f.slice(0,120)+"...":f;break}}catch{}}}catch{return null}finally{e?.close(),d?.destroy()}return c}function aQ(a,b){let c=(0,d.DD3)(b);("permissionless"===c||"auto-edit"===c)&&a.push("--yolo")}function aR(a){let b=a.join(" ");return(0,d.uFH)()?`& ${b}`:b}let aS=/kimi[-_](?:cli|code)|moonshot/i,aT={manifest:{name:"kimicode",slot:"agent",description:"Agent plugin: Kimi Code CLI (MoonshotAI)",version:"0.1.0",displayName:"Kimi Code"},create:function(){return{name:"kimicode",processName:"kimi",getLaunchCommand(a){let b=["kimi"],c=a.workspacePath??a.projectConfig.path;c&&b.push("--work-dir",(0,d.kct)(c)),aQ(b,a.permissions),a.model&&b.push("--model",(0,d.kct)(a.model)),a.subagent&&b.push("--agent",(0,d.kct)(a.subagent));let e=a.prompt??"";if(a.systemPromptFile){let b=(0,i.readFileSync)(a.systemPromptFile,"utf-8");e=e?`${b}
587
649
 
588
650
  ---
589
651
 
590
- ${e}`:b}return e&&b.push("--prompt",(0,d.kct)(e)),aQ(b)},getEnvironment(a){let b={};return b.AO_SESSION_ID=a.sessionId,a.issueId&&(b.AO_ISSUE_ID=a.issueId),b},detectActivity(a){if(!a.trim())return"idle";let b=a.trim().split("\n"),c=b[b.length-1]?.trim()??"",d=b.slice(-6).join("\n");return/\(y\)es.*\(n\)o/i.test(d)||/\[y\/n\]\s*[?:]?\s*$/im.test(d)||/^\s*approve\??\s*$/im.test(d)||/\bapproval required\b/i.test(d)||/^\s*do you want to (proceed|continue)\?\s*$/im.test(d)||/^\s*allow .+\?\s*$/im.test(d)?"waiting_input":/^\s*error:/im.test(d)||/^\s*(?:error:\s*)?failed to (connect|authenticate|load)\b/im.test(d)?"blocked":/^[>$#]\s*$/.test(c)||/^kimi[>:]?\s*$/i.test(c)?"idle":"active"},async getActivityState(a,b){let c=b??d.PES,e=Math.min(d.V1$,c),f=new Date;if(!a.runtimeHandle||!await this.isProcessRunning(a.runtimeHandle))return{state:"exited",timestamp:f};if(!a.workspacePath)return null;let g=await (0,d.Ahw)(a.workspacePath),h=(0,d.Bmx)(g);if(h)return h;let i=await aM(a);if(i){let a=Math.max(0,Date.now()-i.mtime.getTime());return a<=e?{state:"active",timestamp:i.mtime}:a<=c?{state:"ready",timestamp:i.mtime}:{state:"idle",timestamp:i.mtime}}let j=(0,d.Vo2)(g,e,c);return j||null},async recordActivity(a,b){a.workspacePath&&await (0,d.JyZ)(a.workspacePath,b,a=>this.detectActivity(a))},async isProcessRunning(a){try{if("tmux"===a.runtimeName&&a.id){if((0,d.uFH)())return!1;let{stdout:b}=await aN("tmux",["list-panes","-t",a.id,"-F","#{pane_tty}"],{timeout:3e4}),c=b.trim().split("\n").map(a=>a.trim()).filter(Boolean);if(0===c.length)return!1;let{stdout:e}=await aN("ps",["-eo","pid,tty,args"],{timeout:3e4}),f=new Set(c.map(a=>a.replace(/^\/dev\//,""))),g=/(?:^|\/)\.?kimi$/,h=/(?:^|\/)(?:uv|python3?|node)$/;for(let a of e.split("\n")){let b=a.trimStart().split(/\s+/);if(b.length<3||!f.has(b[1]??""))continue;let c=b.slice(2),d=c[0]??"";if(g.test(d))return!0;if(h.test(d))for(let a=1;a<c.length;a++){let b=c[a];if(!(!b||b.startsWith("-"))&&"run"!==b&&"tool"!==b&&"-m"!==b){if(g.test(b))return!0;break}}}return!1}let b=a.data.pid,c="number"==typeof b?b:Number(b);if(Number.isFinite(c)&&c>0)try{return process.kill(c,0),!0}catch(a){if(a instanceof Error&&"code"in a&&"EPERM"===a.code)return!0}return!1}catch{return!1}},async getSessionInfo(a){if(!a.workspacePath)return null;let b=await aM(a);return b?{summary:await aO(b.dir),summaryIsFallback:!0,agentSessionId:b.sessionId}:null},async getRestoreCommand(a,b){if(!a.workspacePath)return null;let c=await aM(a);if(!c)return null;let e="string"==typeof b.agentConfig?.model?b.agentConfig.model:void 0,f=["kimi","--resume",(0,d.kct)(c.sessionId)];return aP(f,b.agentConfig?.permissions),e&&f.push("--model",(0,d.kct)(e)),aQ(f)},async setupWorkspaceHooks(a,b){await (0,d.J06)(a)},async preLaunchSetup(a){await aH(a)},async postLaunchSetup(a){a.workspacePath&&await (0,d.J06)(a.workspacePath)}}},detect:function(){try{let a=(0,e.execFileSync)("kimi",["info"],{encoding:"utf-8",stdio:["ignore","pipe","ignore"],timeout:1e4,maxBuffer:65536});return aR.test(a)}catch{return!1}}};var aT=c(72649);let aU=JSON.parse('{"UU":"@made-by-moonlight/athene-plugin-agent-grok","rE":"0.1.3","h_":"Agent plugin: Grok"}'),aV="@made-by-moonlight/athene-plugin-agent-",aW=aU.UU.startsWith(aV)?aU.UU.slice(aV.length):aU.UU,aX=(0,f.promisify)(e.execFile),aY="grok",aZ=RegExp(`(?:[@-Z\\-_]|\\[[0-?]*[ -/]*[@-~])`,"g"),a$=/(?:allow|approve|do you want to continue|continue anyway|proceed).*(?:y\/n|yes\/no|\[[YyNn]\/ ?[YyNn]\]|\([YyNn]\/ ?[YyNn]\)|\?)\s*:?$/i,a_=/(?:sign in with grok|open this url to sign in|oauth2\/authorize)/i;function a0(a){if("string"!=typeof a)return null;let b=a.trim();return!b||/\p{C}/u.test(b)?null:b.length<=512?b:null}function a1(a,b){let c=b??a0(a.projectConfig.agentConfig?.grokSessionId),e=[aY,"--no-alt-screen"];c||e.push("--worktree");let f=function(a){let b=a.model??a.projectConfig.agentConfig?.model;return"string"==typeof b&&b.trim()?b.trim():null}(a);return f&&e.push("--model",(0,d.kct)(f)),a.systemPromptFile?e.push("--rules",(0,d.kct)(`@${a.systemPromptFile}`)):a.systemPrompt&&e.push("--rules",(0,d.kct)(a.systemPrompt)),c&&e.push("--resume",(0,d.kct)(c)),e.join(" ")}async function a2(a){let{stdout:b}=await aX("tmux",["capture-pane","-t",a.id,"-p","-S","-120"],{timeout:5e3});return b}async function a3(a){let b=a.runtimeHandle;if(!b||"tmux"!==b.runtimeName||!b.id||(0,d.uFH)()||a0(a.metadata?.grokSessionId))return;let c=Date.now();for(;Date.now()-c<3e4;){let a=await a2(b);if(/Worktree ready:/i.test(a))return;await (0,g.setTimeout)(500)}}function a4(a){let b=a.replaceAll(aZ,"").trim();if(!b)return"idle";let c=b.split("\n").map(a=>a.trim()),d=c[c.length-1]??"",e=[...c].reverse().find(Boolean)??"";return/^[>$#›]\s*$/.test(d)?"idle":a_.test(b)||a$.test(e)?"waiting_input":/\b(error|failed|exception|not authenticated|device not configured)\b/i.test(d)?"blocked":"active"}let a5={manifest:{name:aW,slot:"agent",description:aU.h_,version:aU.rE,displayName:"Grok"},create:function(){return{name:aW,processName:aW,promptDelivery:"post-launch",getLaunchCommand:a=>a1(a),getEnvironment(a){let b={};b.AO_SESSION_ID=a.sessionId,a.issueId&&(b.AO_ISSUE_ID=a.issueId);let c=function(a){let b=a.projectConfig.agentConfig?.grokSandbox;return"string"==typeof b&&b.trim()?b.trim():null}(a);return c&&(b.GROK_SANDBOX=c),b},detectActivity:a=>a4(a),async getActivityState(a,b){let c=b??d.PES,e=Math.min(d.V1$,c),f=new Date;if(!a.runtimeHandle||!1===await this.isProcessRunning(a.runtimeHandle))return{state:"exited",timestamp:f};let g=null;if(a.workspacePath){g=await (0,d.Ahw)(a.workspacePath);let b=(0,d.Bmx)(g);if(b)return b}let h=(0,d.Vo2)(g,e,c);return h||null},async recordActivity(a,b){a.workspacePath&&await (0,d.JyZ)(a.workspacePath,b,a=>a4(a))},async isProcessRunning(a){try{if("tmux"===a.runtimeName&&a.id){if((0,d.uFH)())return d.HkR;let{stdout:b}=await aX("tmux",["list-panes","-t",a.id,"-F","#{pane_tty}"],{timeout:3e4}),c=b.trim().split("\n").map(a=>a.trim()).filter(Boolean);if(0===c.length)return!1;let{stdout:e}=await aX("ps",["-eo","pid,tty,args"],{timeout:3e4}),f=new Set(c.map(a=>a.replace(/^\/dev\//,""))),g=/(?:^|[\s/])\.?grok(?:\s|$)/;for(let a of e.split("\n")){let b=a.trimStart().split(/\s+/);if(b.length<3||!f.has(b[1]??""))continue;let c=b.slice(2).join(" ");if(g.test(c))return!0}return!1}let b=a.data.pid,c="number"==typeof b?b:Number(b);if(Number.isFinite(c)&&c>0)try{return process.kill(c,0),!0}catch(a){if(a instanceof Error&&"EPERM"===a.code)return!0;if(a instanceof Error&&"ESRCH"===a.code)return!1;return d.HkR}return!1}catch{return d.HkR}},async getSessionInfo(a){let b=a0(a.metadata?.grokSessionId);return b?{agentSessionId:b,summary:null}:null},async getRestoreCommand(a,b){let c=a0(a.metadata?.grokSessionId);return c?a1({sessionId:a.id,projectConfig:b,workspacePath:a.workspacePath??void 0,issueId:a.issueId??void 0},c):null},async setupWorkspaceHooks(a,b){await (0,d.J06)(a)},async postLaunchSetup(a){a.workspacePath&&await (0,d.J06)(a.workspacePath),await a3(a)}}},detect:function(){try{return!!aT.sync(aY)}catch{return!1}}},a6=(0,f.promisify)(e.execFile);function a7(a){if("number"==typeof a){if(!Number.isFinite(a))return null;let b=new Date(a);return Number.isNaN(b.getTime())?null:b}if("string"!=typeof a)return null;let b=a.trim();if(0===b.length)return null;if(/^\d+$/.test(b)){let a=Number(b);if(!Number.isFinite(a))return null;let c=new Date(a);return Number.isNaN(c.getTime())?null:c}let c=Date.parse(b);return Number.isFinite(c)?new Date(c):null}async function a8(a){try{let b=await (0,d.mKg)();if(a.metadata?.opencodeSessionId){let c=b.find(b=>b.id===a.metadata.opencodeSessionId);if(c)return c}let c=b.filter(b=>b.title===`AO:${a.id}`);if(0===c.length)return null;if(1===c.length)return c[0];return c.reduce((a,b)=>{let c=a7(a.updated)?.getTime()??0;return(a7(b.updated)?.getTime()??0)>c?b:a})}catch{return null}}let a9={manifest:{name:"opencode",slot:"agent",description:"Agent plugin: OpenCode",version:"0.1.0",displayName:"OpenCode"},create:function(){return{name:"opencode",processName:"opencode",getLaunchCommand(a){let b=[],c=[],e=a.projectConfig.agentConfig,f=(0,d.HrC)(e?.opencodeSessionId);f&&b.push("--session",(0,d.kct)(f));let g=a.subagent;g&&c.push("--agent",(0,d.kct)(g));let h=a.prompt?(0,d.kct)(a.prompt):void 0;if(a.model&&c.push("--model",(0,d.kct)(a.model)),!f){let b=["--format","json","--title",(0,d.kct)(`AO:${a.sessionId}`),...c],e=`
652
+ ${e}`:b}return e&&b.push("--prompt",(0,d.kct)(e)),aR(b)},getEnvironment(a){let b={};return b[d.Kmu.SESSION_ID]=a.sessionId,a.issueId&&(b[d.Kmu.ISSUE_ID]=a.issueId),(0,d.Nv_)(b)},detectActivity(a){if(!a.trim())return"idle";let b=a.trim().split("\n"),c=b[b.length-1]?.trim()??"",d=b.slice(-6).join("\n");return/\(y\)es.*\(n\)o/i.test(d)||/\[y\/n\]\s*[?:]?\s*$/im.test(d)||/^\s*approve\??\s*$/im.test(d)||/\bapproval required\b/i.test(d)||/^\s*do you want to (proceed|continue)\?\s*$/im.test(d)||/^\s*allow .+\?\s*$/im.test(d)?"waiting_input":/^\s*error:/im.test(d)||/^\s*(?:error:\s*)?failed to (connect|authenticate|load)\b/im.test(d)?"blocked":/^[>$#]\s*$/.test(c)||/^kimi[>:]?\s*$/i.test(c)?"idle":"active"},async getActivityState(a,b){let c=b??d.PES,e=Math.min(d.V1$,c),f=new Date;if(!a.runtimeHandle||!await this.isProcessRunning(a.runtimeHandle))return{state:"exited",timestamp:f};if(!a.workspacePath)return null;let g=await (0,d.Ahw)(a.workspacePath),h=(0,d.Bmx)(g);if(h)return h;let i=await aN(a);if(i){let a=Math.max(0,Date.now()-i.mtime.getTime());return a<=e?{state:"active",timestamp:i.mtime}:a<=c?{state:"ready",timestamp:i.mtime}:{state:"idle",timestamp:i.mtime}}let j=(0,d.Vo2)(g,e,c);return j||null},async recordActivity(a,b){a.workspacePath&&await (0,d.JyZ)(a.workspacePath,b,a=>this.detectActivity(a))},async isProcessRunning(a){try{if("tmux"===a.runtimeName&&a.id){if((0,d.uFH)())return!1;let{stdout:b}=await aO("tmux",["list-panes","-t",a.id,"-F","#{pane_tty}"],{timeout:3e4}),c=b.trim().split("\n").map(a=>a.trim()).filter(Boolean);if(0===c.length)return!1;let{stdout:e}=await aO("ps",["-eo","pid,tty,args"],{timeout:3e4}),f=new Set(c.map(a=>a.replace(/^\/dev\//,""))),g=/(?:^|\/)\.?kimi$/,h=/(?:^|\/)(?:uv|python3?|node)$/;for(let a of e.split("\n")){let b=a.trimStart().split(/\s+/);if(b.length<3||!f.has(b[1]??""))continue;let c=b.slice(2),d=c[0]??"";if(g.test(d))return!0;if(h.test(d))for(let a=1;a<c.length;a++){let b=c[a];if(!(!b||b.startsWith("-"))&&"run"!==b&&"tool"!==b&&"-m"!==b){if(g.test(b))return!0;break}}}return!1}let b=a.data.pid,c="number"==typeof b?b:Number(b);if(Number.isFinite(c)&&c>0)try{return process.kill(c,0),!0}catch(a){if(a instanceof Error&&"code"in a&&"EPERM"===a.code)return!0}return!1}catch{return!1}},async getSessionInfo(a){if(!a.workspacePath)return null;let b=await aN(a);return b?{summary:await aP(b.dir),summaryIsFallback:!0,agentSessionId:b.sessionId}:null},async getRestoreCommand(a,b){if(!a.workspacePath)return null;let c=await aN(a);if(!c)return null;let e="string"==typeof b.agentConfig?.model?b.agentConfig.model:void 0,f=["kimi","--resume",(0,d.kct)(c.sessionId)];return aQ(f,b.agentConfig?.permissions),e&&f.push("--model",(0,d.kct)(e)),aR(f)},async setupWorkspaceHooks(a,b){await (0,d.J06)(a)},async preLaunchSetup(a){await aI(a)},async postLaunchSetup(a){a.workspacePath&&await (0,d.J06)(a.workspacePath)}}},detect:function(){try{let a=(0,e.execFileSync)("kimi",["info"],{encoding:"utf-8",stdio:["ignore","pipe","ignore"],timeout:1e4,maxBuffer:65536});return aS.test(a)}catch{return!1}}};var aU=c(72649);let aV=JSON.parse('{"UU":"@made-by-moonlight/athene-plugin-agent-grok","rE":"0.2.0","h_":"Agent plugin: Grok"}'),aW="@made-by-moonlight/athene-plugin-agent-",aX=aV.UU.startsWith(aW)?aV.UU.slice(aW.length):aV.UU,aY=(0,f.promisify)(e.execFile),aZ="grok",a$=RegExp(`(?:[@-Z\\-_]|\\[[0-?]*[ -/]*[@-~])`,"g"),a_=/(?:allow|approve|do you want to continue|continue anyway|proceed).*(?:y\/n|yes\/no|\[[YyNn]\/ ?[YyNn]\]|\([YyNn]\/ ?[YyNn]\)|\?)\s*:?$/i,a0=/(?:sign in with grok|open this url to sign in|oauth2\/authorize)/i;function a1(a){if("string"!=typeof a)return null;let b=a.trim();return!b||/\p{C}/u.test(b)?null:b.length<=512?b:null}function a2(a,b){let c=b??a1(a.projectConfig.agentConfig?.grokSessionId),e=[aZ,"--no-alt-screen"];c||e.push("--worktree");let f=function(a){let b=a.model??a.projectConfig.agentConfig?.model;return"string"==typeof b&&b.trim()?b.trim():null}(a);return f&&e.push("--model",(0,d.kct)(f)),a.systemPromptFile?e.push("--rules",(0,d.kct)(`@${a.systemPromptFile}`)):a.systemPrompt&&e.push("--rules",(0,d.kct)(a.systemPrompt)),c&&e.push("--resume",(0,d.kct)(c)),e.join(" ")}async function a3(a){let{stdout:b}=await aY("tmux",["capture-pane","-t",a.id,"-p","-S","-120"],{timeout:5e3});return b}async function a4(a){let b=a.runtimeHandle;if(!b||"tmux"!==b.runtimeName||!b.id||(0,d.uFH)()||a1(a.metadata?.grokSessionId))return;let c=Date.now();for(;Date.now()-c<3e4;){let a=await a3(b);if(/Worktree ready:/i.test(a))return;await (0,g.setTimeout)(500)}}function a5(a){let b=a.replaceAll(a$,"").trim();if(!b)return"idle";let c=b.split("\n").map(a=>a.trim()),d=c[c.length-1]??"",e=[...c].reverse().find(Boolean)??"";return/^[>$#›]\s*$/.test(d)?"idle":a0.test(b)||a_.test(e)?"waiting_input":/\b(error|failed|exception|not authenticated|device not configured)\b/i.test(d)?"blocked":"active"}let a6={manifest:{name:aX,slot:"agent",description:aV.h_,version:aV.rE,displayName:"Grok"},create:function(){return{name:aX,processName:aX,promptDelivery:"post-launch",getLaunchCommand:a=>a2(a),getEnvironment(a){let b={};b[d.Kmu.SESSION_ID]=a.sessionId,a.issueId&&(b[d.Kmu.ISSUE_ID]=a.issueId);let c=function(a){let b=a.projectConfig.agentConfig?.grokSandbox;return"string"==typeof b&&b.trim()?b.trim():null}(a);return c&&(b.GROK_SANDBOX=c),(0,d.Nv_)(b)},detectActivity:a=>a5(a),async getActivityState(a,b){let c=b??d.PES,e=Math.min(d.V1$,c),f=new Date;if(!a.runtimeHandle||!1===await this.isProcessRunning(a.runtimeHandle))return{state:"exited",timestamp:f};let g=null;if(a.workspacePath){g=await (0,d.Ahw)(a.workspacePath);let b=(0,d.Bmx)(g);if(b)return b}let h=(0,d.Vo2)(g,e,c);return h||null},async recordActivity(a,b){a.workspacePath&&await (0,d.JyZ)(a.workspacePath,b,a=>a5(a))},async isProcessRunning(a){try{if("tmux"===a.runtimeName&&a.id){if((0,d.uFH)())return d.HkR;let{stdout:b}=await aY("tmux",["list-panes","-t",a.id,"-F","#{pane_tty}"],{timeout:3e4}),c=b.trim().split("\n").map(a=>a.trim()).filter(Boolean);if(0===c.length)return!1;let{stdout:e}=await aY("ps",["-eo","pid,tty,args"],{timeout:3e4}),f=new Set(c.map(a=>a.replace(/^\/dev\//,""))),g=/(?:^|[\s/])\.?grok(?:\s|$)/;for(let a of e.split("\n")){let b=a.trimStart().split(/\s+/);if(b.length<3||!f.has(b[1]??""))continue;let c=b.slice(2).join(" ");if(g.test(c))return!0}return!1}let b=a.data.pid,c="number"==typeof b?b:Number(b);if(Number.isFinite(c)&&c>0)try{return process.kill(c,0),!0}catch(a){if(a instanceof Error&&"EPERM"===a.code)return!0;if(a instanceof Error&&"ESRCH"===a.code)return!1;return d.HkR}return!1}catch{return d.HkR}},async getSessionInfo(a){let b=a1(a.metadata?.grokSessionId);return b?{agentSessionId:b,summary:null}:null},async getRestoreCommand(a,b){let c=a1(a.metadata?.grokSessionId);return c?a2({sessionId:a.id,projectConfig:b,workspacePath:a.workspacePath??void 0,issueId:a.issueId??void 0},c):null},async setupWorkspaceHooks(a,b){await (0,d.J06)(a)},async postLaunchSetup(a){a.workspacePath&&await (0,d.J06)(a.workspacePath),await a4(a)}}},detect:function(){try{return!!aU.sync(aZ)}catch{return!1}}},a7=(0,f.promisify)(e.execFile);function a8(a){if("number"==typeof a){if(!Number.isFinite(a))return null;let b=new Date(a);return Number.isNaN(b.getTime())?null:b}if("string"!=typeof a)return null;let b=a.trim();if(0===b.length)return null;if(/^\d+$/.test(b)){let a=Number(b);if(!Number.isFinite(a))return null;let c=new Date(a);return Number.isNaN(c.getTime())?null:c}let c=Date.parse(b);return Number.isFinite(c)?new Date(c):null}async function a9(a){try{let b=await (0,d.mKg)();if(a.metadata?.opencodeSessionId){let c=b.find(b=>b.id===a.metadata.opencodeSessionId);if(c)return c}let c=b.filter(b=>b.title===`AO:${a.id}`);if(0===c.length)return null;if(1===c.length)return c[0];return c.reduce((a,b)=>{let c=a8(a.updated)?.getTime()??0;return(a8(b.updated)?.getTime()??0)>c?b:a})}catch{return null}}let ba={manifest:{name:"opencode",slot:"agent",description:"Agent plugin: OpenCode",version:"0.1.0",displayName:"OpenCode"},create:function(){return{name:"opencode",processName:"opencode",getLaunchCommand(a){let b=[],c=[],e=a.projectConfig.agentConfig,f=(0,d.HrC)(e?.opencodeSessionId);f&&b.push("--session",(0,d.kct)(f));let g=a.subagent;g&&c.push("--agent",(0,d.kct)(g));let h=a.prompt?(0,d.kct)(a.prompt):void 0;if(a.model&&c.push("--model",(0,d.kct)(a.model)),!f){let b=["--format","json","--title",(0,d.kct)(`AO:${a.sessionId}`),...c],e=`
591
653
  let buffer = '';
592
654
  let captured = null;
593
655
  process.stdin.on('data', chunk => {
@@ -649,7 +711,7 @@ process.stdin.on('data', c => input += c).on('end', () => {
649
711
  if (matches.length === 0) process.exit(1);
650
712
  process.stdout.write(matches[0].id);
651
713
  });
652
- `.trim().replace(/\n/g," ").replace(/\s+/g," "),g=["opencode","run",...b,"--command","true"].join(" "),i=[...h?["--prompt",h]:[],...c],j=i.length>0?` ${i.join(" ")}`:"",k=(0,d.kct)(`failed to discover OpenCode session ID for AO:${a.sessionId}`);return`SES_ID=$(${g} | node -e ${(0,d.kct)(e)}); if [ -z "$SES_ID" ]; then SES_ID=$(opencode session list --format json | node -e ${(0,d.kct)(f)} ${(0,d.kct)(`AO:${a.sessionId}`)}); fi; [ -n "$SES_ID" ] && exec opencode --session "$SES_ID"${j}; echo ${k} >&2; exit 1`}return h&&b.push("--prompt",h),b.push(...c),["opencode",...b].join(" ")},getEnvironment(a){let b={};b.AO_SESSION_ID=a.sessionId,a.issueId&&(b.AO_ISSUE_ID=a.issueId);let c=(0,d.sa4)();return b.TMPDIR=c,b.TMP=c,b.TEMP=c,b},detectActivity(a){if(!a.trim())return"idle";let b=a.trim().split("\n"),c=b[b.length-1]?.trim()??"";if(/^[>$#]\s*$/.test(c))return"idle";let d=b.slice(-5).join("\n");return/\(Y\)es.*\(N\)o/i.test(d)||/approval required/i.test(d)||/Do you want to proceed\?/i.test(d)||/Allow .+\?/i.test(d)?"waiting_input":"active"},async getActivityState(a,b){let c=b??d.PES,e=Math.min(d.V1$,c),f=new Date;if(!a.runtimeHandle)return{state:"exited",timestamp:f};let g=await this.isProcessRunning(a.runtimeHandle);if(g===d.HkR)return null;if(!g)return{state:"exited",timestamp:f};let h=null;if(a.workspacePath){h=await (0,d.Ahw)(a.workspacePath);let b=(0,d.Bmx)(h);if(b)return b}let i=await a8(a);if(i){let a=a7(i.updated);if(a){let b=Math.max(0,Date.now()-a.getTime());return b<=e?{state:"active",timestamp:a}:b<=c?{state:"ready",timestamp:a}:{state:"idle",timestamp:a}}}let j=(0,d.Vo2)(h,e,c);return j||null},async recordActivity(a,b){a.workspacePath&&await (0,d.JyZ)(a.workspacePath,b,a=>this.detectActivity(a))},async isProcessRunning(a){try{if("tmux"===a.runtimeName&&a.id){if((0,d.uFH)())return!1;let{stdout:b}=await a6("tmux",["list-panes","-t",a.id,"-F","#{pane_tty}"],{timeout:3e4}),c=b.trim().split("\n").map(a=>a.trim()).filter(Boolean);if(0===c.length)return!1;let{stdout:e}=await a6("ps",["-eo","pid,tty,args"],{timeout:3e4});if(!e)return d.HkR;let f=new Set(c.map(a=>a.replace(/^\/dev\//,""))),g=/(?:^|\/)opencode(?:\s|$)/;for(let a of e.split("\n")){let b=a.trimStart().split(/\s+/);if(b.length<3||!f.has(b[1]??""))continue;let c=b.slice(2).join(" ");if(g.test(c))return!0}return!1}let b=a.data.pid,c="number"==typeof b?b:Number(b);if(Number.isFinite(c)&&c>0)try{return process.kill(c,0),!0}catch(a){if(a instanceof Error&&"code"in a&&"EPERM"===a.code)return!0}return!1}catch{return d.HkR}},async getSessionInfo(a){let b=await a8(a);return b?{summary:b.title??null,summaryIsFallback:!0,agentSessionId:b.id}:null},async getRestoreCommand(a,b){let c=(0,d.HrC)(a.metadata?.opencodeSessionId)??(await a8(a))?.id??null;if(!c)return null;let e=["opencode","--session",(0,d.kct)(c)],f=b.agentConfig;return f?.model&&e.push("--model",(0,d.kct)(f.model)),e.join(" ")},async setupWorkspaceHooks(a,b){},async postLaunchSetup(a){}}},detect:function(){try{return(0,e.execFileSync)("opencode",["version"],{stdio:"ignore",shell:(0,d.uFH)(),windowsHide:!0,env:(0,d.RxI)()}),!0}catch{return!1}}},ba=(0,f.promisify)(e.execFile);async function bb(a,...b){let{stdout:c}=await ba("git",b,{cwd:a,windowsHide:!0,timeout:3e4});return c.trimEnd()}function bc(a){return a.replace(/\\/g,"/").replace(/^([a-zA-Z]):/,(a,b)=>b.toLowerCase()+":")}async function bd(a){let b;if(!(0,d.uFH)())return void(0,i.rmSync)(a,{recursive:!0,force:!0});let c=[0,100,250,500,1e3,2e3];for(let d of c){d>0&&await new Promise(a=>setTimeout(a,d));try{if((0,i.rmSync)(a,{recursive:!0,force:!0}),!(0,i.existsSync)(a))return}catch(a){b=a}}if((0,i.existsSync)(a))throw Error(`Failed to remove "${a}" after ${c.length} attempts (Windows file-handle drain). Last error: ${b instanceof Error?b.message:String(b)}`)}async function be(a){try{return await bb(a,"remote","get-url","origin"),!0}catch{return!1}}async function bf(a,b){try{return await bb(a,"rev-parse","--verify","--quiet",b),!0}catch{return!1}}async function bg(a,b,c){if(c?.hasOrigin??await be(a)){if(c?.branch){let b=`origin/${c.branch}`;if(await bf(a,b))return b}let d=`origin/${b}`;if(await bf(a,d))return d}let d=`refs/heads/${b}`;if(await bf(a,d))return d;throw Error(`Unable to resolve base ref for default branch "${b}"`)}async function bh(a,b){try{let c=await bb(a,"worktree","list","--porcelain"),d=bc((0,k.resolve)(b));return c.split("\n").some(a=>a.startsWith("worktree ")&&bc((0,k.resolve)(a.slice(9)))===d)}catch{return!1}}async function bi(a,b){if((0,i.existsSync)(b)){try{await bb(a,"worktree","prune")}catch{}if(await bh(a,b))throw Error(`Worktree path "${b}" already exists and is still registered with git`);(0,i.rmSync)(b,{recursive:!0,force:!0})}}async function bj(a,b){try{await bb(a,"worktree","remove","--force",b)}catch{}if((0,i.existsSync)(b)){if(await bh(a,b))throw Error(`Worktree path "${b}" already exists and is still registered with git`);await bd(b)}}async function bk(a,b,c){await bj(a,b),await bb(a,"worktree","add",b,c)}async function bl(a,b,c,d,e){await bj(a,b);let f=await bg(a,d,{branch:c,hasOrigin:e});if(!f.startsWith("origin/"))return void await bb(a,"worktree","add","-b",c,b,f);try{await bb(a,"worktree","add","-b",c,b,f)}catch{await bb(a,"worktree","add","-b",c,b,`refs/heads/${d}`)}}let bm=/^[a-zA-Z0-9_-]+$/;function bn(a,b){if(!bm.test(a))throw Error(`Invalid ${b} "${a}": must match ${bm}`)}function bo(a){return a.startsWith("~/")?(0,k.join)((0,j.homedir)(),a.slice(2)):a}let bp={manifest:{name:"worktree",slot:"workspace",description:"Workspace plugin: git worktrees",version:"0.1.0"},create:function(a){let b=a?.worktreeDir?bo(a.worktreeDir):(0,k.join)((0,j.homedir)(),".worktrees");return{name:"worktree",async create(a){bn(a.projectId,"projectId"),bn(a.sessionId,"sessionId");let c=bo(a.project.path),e=a.worktreeDir??b,f=a.worktreeDir?e:(0,k.join)(e,a.projectId),g=(0,k.join)(f,a.sessionId);(0,i.mkdirSync)(f,{recursive:!0}),await bi(c,g);let h=await be(c);if(h)try{await bb(c,"fetch","origin","--quiet")}catch{}let j=await bg(c,a.project.defaultBranch,{hasOrigin:h});try{await bb(c,"worktree","add","-b",a.branch,g,j)}catch(i){let b=i instanceof Error?i.message:String(i);if(!b.includes("already exists"))throw Error(`Failed to create worktree for branch "${a.branch}": ${b}`,{cause:i});(0,d.plx)({projectId:a.projectId,sessionId:a.sessionId,source:"workspace",kind:"workspace.branch_collision",level:"warn",summary:`branch "${a.branch}" already exists; falling back to worktree recovery`,data:{plugin:"workspace-worktree",branch:a.branch,errorMessage:b}});let e=await bb(c,"rev-parse",j),f=`refs/heads/${a.branch}`,h=await bf(c,f)?await bb(c,"rev-parse",f):void 0;try{h===e?await bb(c,"worktree","add",g,a.branch):await bb(c,"worktree","add","-B",a.branch,g,j)}catch(d){try{await bb(c,"worktree","remove","--force",g)}catch{}let b=d instanceof Error?d.message:String(d);throw Error(`Failed to create worktree for branch "${a.branch}": ${b}`,{cause:d})}}return{path:g,branch:a.branch,sessionId:a.sessionId,projectId:a.projectId}},async findManagedWorkspace(a){bn(a.projectId,"projectId"),bn(a.sessionId,"sessionId");let c=bo(a.project.path),d=a.worktreeDir??b,e=a.worktreeDir?d:(0,k.join)(d,a.projectId),f=new Set([(0,k.resolve)((0,k.join)(e,a.sessionId)),(0,k.resolve)((0,k.join)(b,a.projectId,a.sessionId))]),g=(function(a){let b=a.replace(/\r\n/g,"\n").trim();return b?b.split("\n\n").map(a=>{let b="",c=null;for(let d of a.split("\n"))d.startsWith("worktree ")?b=(0,k.resolve)(d.slice(9)):d.startsWith("branch ")&&(c=d.slice(7).replace("refs/heads/",""));return{path:b,branch:c}}).filter(a=>a.path.length>0):[]})(await bb(c,"worktree","list","--porcelain")).filter(b=>b.branch===a.branch&&(0,i.existsSync)(b.path));if(0===g.length)return null;if(g.length>1)throw Error(`Found multiple worktrees for orchestrator branch "${a.branch}". Reuse one workspace or remove the extras before starting the orchestrator.`);let h=g[0];if(!f.has(h.path))throw Error(`Found existing worktree for orchestrator branch "${a.branch}" at "${h.path}", but it is outside AO-managed worktree directories. Reuse it manually or remove it and try again.`);return{path:h.path,branch:a.branch,sessionId:a.sessionId,projectId:a.projectId}},async destroy(a){try{let b=await bb(a,"rev-parse","--path-format=absolute","--git-common-dir"),c=(0,k.resolve)(b,"..");await bb(c,"worktree","remove","--force",a)}catch(c){let b=c instanceof Error?c.message:String(c);(0,d.plx)({source:"workspace",kind:"workspace.destroy_fell_back",level:"warn",summary:"destroy fell back to rmSync; git worktree metadata may be stale",data:{plugin:"workspace-worktree",workspacePath:a,errorMessage:b}}),(0,i.existsSync)(a)&&await bd(a)}},async list(a){bn(a,"projectId");let c=(0,k.join)(b,a);if(!(0,i.existsSync)(c))return[];let d=(0,i.readdirSync)(c,{withFileTypes:!0}).filter(a=>a.isDirectory()).map(a=>(0,k.join)(c,a.name));if(0===d.length)return[];let e="";for(let a of d)try{e=await bb(a,"worktree","list","--porcelain");break}catch{continue}if(!e)return[];let f=[],g=e.split("\n\n"),h=bc(c);for(let b of g){let c=b.trim().split("\n"),d="",e="";for(let a of c)a.startsWith("worktree ")?d=a.slice(9):a.startsWith("branch ")&&(e=a.slice(7).replace("refs/heads/",""));let g=d?bc(d):"";if(d&&(g===h||g.startsWith(h+"/"))){let b=(0,k.basename)(d);f.push({path:d,branch:e||"detached",sessionId:b,projectId:a})}}return f},async exists(a){if(!(0,i.existsSync)(a))return!1;try{return await ba("git",["rev-parse","--is-inside-work-tree"],{cwd:a,timeout:3e4,windowsHide:!0}),!0}catch{return!1}},async restore(a,b){let c=bo(a.project.path);try{await bb(c,"worktree","prune")}catch{}let d=await be(c);if(d)try{await bb(c,"fetch","origin","--quiet")}catch{}try{await bb(c,"worktree","add",b,a.branch)}catch{await bf(c,`refs/heads/${a.branch}`)?await bk(c,b,a.branch):await bl(c,b,a.branch,a.project.defaultBranch,d)}return{path:b,branch:a.branch,sessionId:a.sessionId,projectId:a.projectId}},async postCreate(a,b){let c=bo(b.path);if(b.symlinks)for(let e of b.symlinks){if(e.startsWith("/")||e.includes("..")||/^[a-zA-Z]:[\\/]/.test(e)||e.startsWith("\\\\"))throw Error(`Invalid symlink path "${e}": must be a relative path without ".." segments`);let b=(0,k.join)(c,e),f=(0,k.resolve)(a.path,e),g=(0,k.resolve)(a.path);if(!f.startsWith(g+k.sep)&&f!==g)throw Error(`Symlink target "${e}" resolves outside workspace: ${f}`);if((0,i.existsSync)(b)){try{let a=(0,i.lstatSync)(f);(a.isSymbolicLink()||a.isFile()||a.isDirectory())&&(0,i.rmSync)(f,{recursive:!0,force:!0})}catch{}(0,i.mkdirSync)((0,k.dirname)(f),{recursive:!0});try{(0,i.symlinkSync)(b,f)}catch(a){if((0,d.uFH)()){let a=(()=>{try{return(0,i.statSync)(b).isDirectory()}catch{return!1}})();try{a?(0,i.symlinkSync)(b,f,"junction"):(0,i.linkSync)(b,f)}catch{i.cpSync(b,f,{recursive:!0})}}else throw a}}}if(b.postCreate){let c=(0,d.ry1)();for(let e of b.postCreate)try{await ba(c.cmd,c.args(e),{cwd:a.path,windowsHide:!0})}catch(c){let b=c instanceof Error?c.message:String(c);throw(0,d.plx)({projectId:a.projectId,sessionId:a.sessionId,source:"workspace",kind:"workspace.post_create_failed",level:"error",summary:`postCreate command failed for session ${a.sessionId}`,data:{plugin:"workspace-worktree",command:e,errorMessage:b}}),c}}}}}};class bq{constructor(a){if(this.cache=new Map,this.accessOrder=[],this.maxSize=a,a<=0)throw Error("LRUCache maxSize must be greater than 0")}get(a){if(this.cache.has(a))return this.moveToEnd(a),this.cache.get(a)}set(a,b){if(this.cache.has(a)){this.moveToEnd(a),this.cache.set(a,b);return}if(this.cache.set(a,b),this.accessOrder.push(a),this.accessOrder.length>this.maxSize){let a=this.accessOrder.shift();void 0!==a&&this.cache.delete(a)}}delete(a){this.cache.delete(a);let b=this.accessOrder.indexOf(a);-1!==b&&this.accessOrder.splice(b,1)}clear(){this.cache.clear(),this.accessOrder=[]}get size(){return this.cache.size}has(a){return this.cache.has(a)}keys(){return[...this.accessOrder]}moveToEnd(a){let b=this.accessOrder.indexOf(a);-1!==b&&(this.accessOrder.splice(b,1),this.accessOrder.push(a))}toMap(){return new Map(this.cache)}}let br=(0,f.promisify)(e.execFile),bs=async(a,b,c)=>(0,d.vQK)(a,{component:"scm-github-batch",operation:c},b),bt={prList:new bq(100),commitStatus:new bq(500),reviewComments:new bq(500)};function bu(a,b,c){bt.prList.set(`${a}/${b}`,c)}function bv(a,b,c,d){bt.commitStatus.set(`${a}/${b}#${c}`,d)}let bw=new bq(200),bx=new bq(200);async function by(a,b=[],c){let d=[],e=!1,f=new Map;for(let b of a){let a=`${b.owner}/${b.repo}`;f.has(a)||f.set(a,[]);let c=f.get(a);c&&c.push(b)}for(let a of b)f.has(a)||f.set(a,[]);if(0===f.size)return{shouldRefresh:!1,details:["No repos to check"],prListUnchangedRepos:new Set};let g=!1,h=new Set;for(let[a]of f){let[b,f]=a.split("/");await bF(b,f,c)?(g=!0,e=!0,d.push(`PR list changed for ${a} (Guard 1)`)):h.add(a)}if(!g)for(let b of a){let a=`${b.owner}/${b.repo}#${b.number}`,f=bw.get(a);if(f&&null===f.headSha){e=!0,d.push(`First time seeing PR #${b.number} (Guard 2: no cached head SHA)`);continue}f&&f.headSha&&await bG(b.owner,b.repo,f.headSha,c)&&(e=!0,d.push(`CI status changed for ${b.owner}/${b.repo}#${b.number} (Guard 2)`))}return{shouldRefresh:e,details:d,prListUnchangedRepos:h}}let bz=!1,bA=new Set;async function bB(){try{await br("gh",["--version"],{timeout:5e3})}catch(b){if(!bz){bz=!0;let a=b instanceof Error?b.message:String(b);(0,d.plx)({source:"scm",kind:"scm.gh_unavailable",level:"error",summary:"gh CLI not available or not authenticated",data:{plugin:"scm-github",errorMessage:a}})}let a=Error("gh CLI not available or not authenticated. GraphQL batch enrichment requires gh CLI to be installed and configured.");throw a.cause="GH_CLI_UNAVAILABLE",a}}function bC(a){return/HTTP\/[\d.]+ 304/i.test(a)}function bD(a){let b=("string"==typeof a.stdout?a.stdout:"")+("string"==typeof a.stderr?a.stderr:"");return b.length>0?b:null}function bE(a){let b=a.match(/etag:\s*(.+)/i);return b?b[1].trim():void 0}async function bF(a,b,c){let d=`${a}/${b}`,e=bt.prList.get(d),f=["api","--method","GET",`repos/${d}/pulls?state=open&sort=updated&direction=desc&per_page=1`,"-i"];e&&f.push("-H",`If-None-Match: ${e}`);try{let c=await bs(f,1e4,"gh.api.guard-pr-list");if(bC(c)){let d=bE(c);return d&&bu(a,b,d),!1}let d=bE(c);return d&&bu(a,b,d),!0}catch(g){let e=bD(g);if(e&&bC(e)){let c=bE(e);return c&&bu(a,b,c),!1}let f=g instanceof Error?g.message:String(g);if(bC(f))return!1;return c?.log("warn",`[ETag Guard 1] PR list check failed for ${d}: ${f}`),!0}}async function bG(a,b,c,d){let e=`${a}/${b}#${c}`,f=bt.commitStatus.get(e),g=["api","--method","GET",`repos/${a}/${b}/commits/${c}/check-runs?per_page=1`,"-i"];f&&g.push("-H",`If-None-Match: ${f}`);try{let d=await bs(g,1e4,"gh.api.guard-commit-status");if(bC(d)){let e=bE(d);return e&&bv(a,b,c,e),!1}let e=bE(d);return e&&bv(a,b,c,e),!0}catch(h){let f=bD(h);if(f&&bC(f)){let d=bE(f);return d&&bv(a,b,c,d),!1}let g=h instanceof Error?h.message:String(h);if(bC(g))return!1;return d?.log("warn",`[ETag Guard 2] Commit status check failed for ${e}: ${g}`),!0}}async function bH(a,b,c,d){let e=`${a}/${b}#${c}`,f=bt.reviewComments.get(e),g=["api","--method","GET",`repos/${a}/${b}/pulls/${c}/comments`,"-i"];f&&g.push("-H",`If-None-Match: ${f}`);try{let a=await bs(g,1e4,"gh.api.guard-review-comments");if(bC(a)){let b=bE(a);return b&&bt.reviewComments.set(e,b),!1}let b=bE(a);return b&&bt.reviewComments.set(e,b),!0}catch(c){let a=bD(c);if(a&&bC(a)){let b=bE(a);return b&&bt.reviewComments.set(e,b),!1}let b=c instanceof Error?c.message:String(c);if(bC(b))return!1;return d?.log("warn",`[ETag Guard 3] Review comments check failed for ${e}: ${b}`),!0}}let bI=`
714
+ `.trim().replace(/\n/g," ").replace(/\s+/g," "),g=["opencode","run",...b,"--command","true"].join(" "),i=[...h?["--prompt",h]:[],...c],j=i.length>0?` ${i.join(" ")}`:"",k=(0,d.kct)(`failed to discover OpenCode session ID for AO:${a.sessionId}`);return`SES_ID=$(${g} | node -e ${(0,d.kct)(e)}); if [ -z "$SES_ID" ]; then SES_ID=$(opencode session list --format json | node -e ${(0,d.kct)(f)} ${(0,d.kct)(`AO:${a.sessionId}`)}); fi; [ -n "$SES_ID" ] && exec opencode --session "$SES_ID"${j}; echo ${k} >&2; exit 1`}return h&&b.push("--prompt",h),b.push(...c),["opencode",...b].join(" ")},getEnvironment(a){let b={};b[d.Kmu.SESSION_ID]=a.sessionId,a.issueId&&(b[d.Kmu.ISSUE_ID]=a.issueId);let c=(0,d.sa4)();return b.TMPDIR=c,b.TMP=c,b.TEMP=c,(0,d.Nv_)(b)},detectActivity(a){if(!a.trim())return"idle";let b=a.trim().split("\n"),c=b[b.length-1]?.trim()??"";if(/^[>$#]\s*$/.test(c))return"idle";let d=b.slice(-5).join("\n");return/\(Y\)es.*\(N\)o/i.test(d)||/approval required/i.test(d)||/Do you want to proceed\?/i.test(d)||/Allow .+\?/i.test(d)?"waiting_input":"active"},async getActivityState(a,b){let c=b??d.PES,e=Math.min(d.V1$,c),f=new Date;if(!a.runtimeHandle)return{state:"exited",timestamp:f};let g=await this.isProcessRunning(a.runtimeHandle);if(g===d.HkR)return null;if(!g)return{state:"exited",timestamp:f};let h=null;if(a.workspacePath){h=await (0,d.Ahw)(a.workspacePath);let b=(0,d.Bmx)(h);if(b)return b}let i=await a9(a);if(i){let a=a8(i.updated);if(a){let b=Math.max(0,Date.now()-a.getTime());return b<=e?{state:"active",timestamp:a}:b<=c?{state:"ready",timestamp:a}:{state:"idle",timestamp:a}}}let j=(0,d.Vo2)(h,e,c);return j||null},async recordActivity(a,b){a.workspacePath&&await (0,d.JyZ)(a.workspacePath,b,a=>this.detectActivity(a))},async isProcessRunning(a){try{if("tmux"===a.runtimeName&&a.id){if((0,d.uFH)())return!1;let{stdout:b}=await a7("tmux",["list-panes","-t",a.id,"-F","#{pane_tty}"],{timeout:3e4}),c=b.trim().split("\n").map(a=>a.trim()).filter(Boolean);if(0===c.length)return!1;let{stdout:e}=await a7("ps",["-eo","pid,tty,args"],{timeout:3e4});if(!e)return d.HkR;let f=new Set(c.map(a=>a.replace(/^\/dev\//,""))),g=/(?:^|\/)opencode(?:\s|$)/;for(let a of e.split("\n")){let b=a.trimStart().split(/\s+/);if(b.length<3||!f.has(b[1]??""))continue;let c=b.slice(2).join(" ");if(g.test(c))return!0}return!1}let b=a.data.pid,c="number"==typeof b?b:Number(b);if(Number.isFinite(c)&&c>0)try{return process.kill(c,0),!0}catch(a){if(a instanceof Error&&"code"in a&&"EPERM"===a.code)return!0}return!1}catch{return d.HkR}},async getSessionInfo(a){let b=await a9(a);return b?{summary:b.title??null,summaryIsFallback:!0,agentSessionId:b.id}:null},async getRestoreCommand(a,b){let c=(0,d.HrC)(a.metadata?.opencodeSessionId)??(await a9(a))?.id??null;if(!c)return null;let e=["opencode","--session",(0,d.kct)(c)],f=b.agentConfig;return f?.model&&e.push("--model",(0,d.kct)(f.model)),e.join(" ")},async setupWorkspaceHooks(a,b){},async postLaunchSetup(a){}}},detect:function(){try{return(0,e.execFileSync)("opencode",["version"],{stdio:"ignore",shell:(0,d.uFH)(),windowsHide:!0,env:(0,d.RxI)()}),!0}catch{return!1}}},bb=(0,f.promisify)(e.execFile);async function bc(a,...b){let{stdout:c}=await bb("git",b,{cwd:a,windowsHide:!0,timeout:3e4});return c.trimEnd()}function bd(a){return a.replace(/\\/g,"/").replace(/^([a-zA-Z]):/,(a,b)=>b.toLowerCase()+":")}async function be(a){let b;if(!(0,d.uFH)())return void(0,i.rmSync)(a,{recursive:!0,force:!0});let c=[0,100,250,500,1e3,2e3];for(let d of c){d>0&&await new Promise(a=>setTimeout(a,d));try{if((0,i.rmSync)(a,{recursive:!0,force:!0}),!(0,i.existsSync)(a))return}catch(a){b=a}}if((0,i.existsSync)(a))throw Error(`Failed to remove "${a}" after ${c.length} attempts (Windows file-handle drain). Last error: ${b instanceof Error?b.message:String(b)}`)}async function bf(a){try{return await bc(a,"remote","get-url","origin"),!0}catch{return!1}}async function bg(a,b){try{return await bc(a,"rev-parse","--verify","--quiet",b),!0}catch{return!1}}async function bh(a,b,c){if(c?.hasOrigin??await bf(a)){if(c?.branch){let b=`origin/${c.branch}`;if(await bg(a,b))return b}let d=`origin/${b}`;if(await bg(a,d))return d}let d=`refs/heads/${b}`;if(await bg(a,d))return d;throw Error(`Unable to resolve base ref for default branch "${b}"`)}async function bi(a,b){try{let c=await bc(a,"worktree","list","--porcelain"),d=bd((0,k.resolve)(b));return c.split("\n").some(a=>a.startsWith("worktree ")&&bd((0,k.resolve)(a.slice(9)))===d)}catch{return!1}}async function bj(a,b){if((0,i.existsSync)(b)){try{await bc(a,"worktree","prune")}catch{}if(await bi(a,b))throw Error(`Worktree path "${b}" already exists and is still registered with git`);(0,i.rmSync)(b,{recursive:!0,force:!0})}}async function bk(a,b){try{await bc(a,"worktree","remove","--force",b)}catch{}if((0,i.existsSync)(b)){if(await bi(a,b))throw Error(`Worktree path "${b}" already exists and is still registered with git`);await be(b)}}async function bl(a,b,c){await bk(a,b),await bc(a,"worktree","add",b,c)}async function bm(a,b,c,d,e){await bk(a,b);let f=await bh(a,d,{branch:c,hasOrigin:e});if(!f.startsWith("origin/"))return void await bc(a,"worktree","add","-b",c,b,f);try{await bc(a,"worktree","add","-b",c,b,f)}catch{await bc(a,"worktree","add","-b",c,b,`refs/heads/${d}`)}}let bn=/^[a-zA-Z0-9_-]+$/;function bo(a,b){if(!bn.test(a))throw Error(`Invalid ${b} "${a}": must match ${bn}`)}function bp(a){return a.startsWith("~/")?(0,k.join)((0,j.homedir)(),a.slice(2)):a}let bq={manifest:{name:"worktree",slot:"workspace",description:"Workspace plugin: git worktrees",version:"0.1.0"},create:function(a){let b=a?.worktreeDir?bp(a.worktreeDir):(0,k.join)((0,j.homedir)(),".worktrees");return{name:"worktree",async create(a){bo(a.projectId,"projectId"),bo(a.sessionId,"sessionId");let c=bp(a.project.path),e=a.worktreeDir??b,f=a.worktreeDir?e:(0,k.join)(e,a.projectId),g=(0,k.join)(f,a.sessionId);(0,i.mkdirSync)(f,{recursive:!0}),await bj(c,g);let h=await bf(c);if(h)try{await bc(c,"fetch","origin","--quiet")}catch{}let j=await bh(c,a.project.defaultBranch,{hasOrigin:h});try{await bc(c,"worktree","add","-b",a.branch,g,j)}catch(i){let b=i instanceof Error?i.message:String(i);if(!b.includes("already exists"))throw Error(`Failed to create worktree for branch "${a.branch}": ${b}`,{cause:i});(0,d.plx)({projectId:a.projectId,sessionId:a.sessionId,source:"workspace",kind:"workspace.branch_collision",level:"warn",summary:`branch "${a.branch}" already exists; falling back to worktree recovery`,data:{plugin:"workspace-worktree",branch:a.branch,errorMessage:b}});try{await bc(c,"worktree","prune")}catch{}let e=await bc(c,"rev-parse",j),f=`refs/heads/${a.branch}`,h=await bg(c,f)?await bc(c,"rev-parse",f):void 0;try{h===e?await bc(c,"worktree","add",g,a.branch):await bc(c,"worktree","add","-B",a.branch,g,j)}catch(d){try{await bc(c,"worktree","remove","--force",g)}catch{}let b=d instanceof Error?d.message:String(d);throw Error(`Failed to create worktree for branch "${a.branch}": ${b}`,{cause:d})}}return{path:g,branch:a.branch,sessionId:a.sessionId,projectId:a.projectId}},async findManagedWorkspace(a){bo(a.projectId,"projectId"),bo(a.sessionId,"sessionId");let c=bp(a.project.path),d=a.worktreeDir??b,e=a.worktreeDir?d:(0,k.join)(d,a.projectId),f=new Set([(0,k.resolve)((0,k.join)(e,a.sessionId)),(0,k.resolve)((0,k.join)(b,a.projectId,a.sessionId))]),g=(function(a){let b=a.replace(/\r\n/g,"\n").trim();return b?b.split("\n\n").map(a=>{let b="",c=null;for(let d of a.split("\n"))d.startsWith("worktree ")?b=(0,k.resolve)(d.slice(9)):d.startsWith("branch ")&&(c=d.slice(7).replace("refs/heads/",""));return{path:b,branch:c}}).filter(a=>a.path.length>0):[]})(await bc(c,"worktree","list","--porcelain")).filter(b=>b.branch===a.branch&&(0,i.existsSync)(b.path));if(0===g.length)return null;if(g.length>1)throw Error(`Found multiple worktrees for orchestrator branch "${a.branch}". Reuse one workspace or remove the extras before starting the orchestrator.`);let h=g[0];if(!f.has(h.path))throw Error(`Found existing worktree for orchestrator branch "${a.branch}" at "${h.path}", but it is outside AO-managed worktree directories. Reuse it manually or remove it and try again.`);return{path:h.path,branch:a.branch,sessionId:a.sessionId,projectId:a.projectId}},async destroy(a){try{let b=await bc(a,"rev-parse","--path-format=absolute","--git-common-dir"),c=(0,k.resolve)(b,"..");await bc(c,"worktree","remove","--force",a)}catch(c){let b=c instanceof Error?c.message:String(c);(0,d.plx)({source:"workspace",kind:"workspace.destroy_fell_back",level:"warn",summary:"destroy fell back to rmSync; git worktree metadata may be stale",data:{plugin:"workspace-worktree",workspacePath:a,errorMessage:b}}),(0,i.existsSync)(a)&&await be(a)}},async list(a){bo(a,"projectId");let c=(0,k.join)(b,a);if(!(0,i.existsSync)(c))return[];let d=(0,i.readdirSync)(c,{withFileTypes:!0}).filter(a=>a.isDirectory()).map(a=>(0,k.join)(c,a.name));if(0===d.length)return[];let e="";for(let a of d)try{e=await bc(a,"worktree","list","--porcelain");break}catch{continue}if(!e)return[];let f=[],g=e.split("\n\n"),h=bd(c);for(let b of g){let c=b.trim().split("\n"),d="",e="";for(let a of c)a.startsWith("worktree ")?d=a.slice(9):a.startsWith("branch ")&&(e=a.slice(7).replace("refs/heads/",""));let g=d?bd(d):"";if(d&&(g===h||g.startsWith(h+"/"))){let b=(0,k.basename)(d);f.push({path:d,branch:e||"detached",sessionId:b,projectId:a})}}return f},async exists(a){if(!(0,i.existsSync)(a))return!1;try{return await bb("git",["rev-parse","--is-inside-work-tree"],{cwd:a,timeout:3e4,windowsHide:!0}),!0}catch{return!1}},async restore(a,b){let c=bp(a.project.path);try{await bc(c,"worktree","prune")}catch{}let d=await bf(c);if(d)try{await bc(c,"fetch","origin","--quiet")}catch{}try{await bc(c,"worktree","add",b,a.branch)}catch{await bg(c,`refs/heads/${a.branch}`)?await bl(c,b,a.branch):await bm(c,b,a.branch,a.project.defaultBranch,d)}return{path:b,branch:a.branch,sessionId:a.sessionId,projectId:a.projectId}},async postCreate(a,b){let c=bp(b.path);if(b.symlinks)for(let e of b.symlinks){if(e.startsWith("/")||e.includes("..")||/^[a-zA-Z]:[\\/]/.test(e)||e.startsWith("\\\\"))throw Error(`Invalid symlink path "${e}": must be a relative path without ".." segments`);let b=(0,k.join)(c,e),f=(0,k.resolve)(a.path,e),g=(0,k.resolve)(a.path);if(!f.startsWith(g+k.sep)&&f!==g)throw Error(`Symlink target "${e}" resolves outside workspace: ${f}`);if((0,i.existsSync)(b)){try{let a=(0,i.lstatSync)(f);(a.isSymbolicLink()||a.isFile()||a.isDirectory())&&(0,i.rmSync)(f,{recursive:!0,force:!0})}catch{}(0,i.mkdirSync)((0,k.dirname)(f),{recursive:!0});try{(0,i.symlinkSync)(b,f)}catch(a){if((0,d.uFH)()){let a=(()=>{try{return(0,i.statSync)(b).isDirectory()}catch{return!1}})();try{a?(0,i.symlinkSync)(b,f,"junction"):(0,i.linkSync)(b,f)}catch{i.cpSync(b,f,{recursive:!0})}}else throw a}}}if(b.postCreate){let c=(0,d.ry1)();for(let e of b.postCreate)try{await bb(c.cmd,c.args(e),{cwd:a.path,windowsHide:!0})}catch(c){let b=c instanceof Error?c.message:String(c);throw(0,d.plx)({projectId:a.projectId,sessionId:a.sessionId,source:"workspace",kind:"workspace.post_create_failed",level:"error",summary:`postCreate command failed for session ${a.sessionId}`,data:{plugin:"workspace-worktree",command:e,errorMessage:b}}),c}}}}}};class br{constructor(a){if(this.cache=new Map,this.accessOrder=[],this.maxSize=a,a<=0)throw Error("LRUCache maxSize must be greater than 0")}get(a){if(this.cache.has(a))return this.moveToEnd(a),this.cache.get(a)}set(a,b){if(this.cache.has(a)){this.moveToEnd(a),this.cache.set(a,b);return}if(this.cache.set(a,b),this.accessOrder.push(a),this.accessOrder.length>this.maxSize){let a=this.accessOrder.shift();void 0!==a&&this.cache.delete(a)}}delete(a){this.cache.delete(a);let b=this.accessOrder.indexOf(a);-1!==b&&this.accessOrder.splice(b,1)}clear(){this.cache.clear(),this.accessOrder=[]}get size(){return this.cache.size}has(a){return this.cache.has(a)}keys(){return[...this.accessOrder]}moveToEnd(a){let b=this.accessOrder.indexOf(a);-1!==b&&(this.accessOrder.splice(b,1),this.accessOrder.push(a))}toMap(){return new Map(this.cache)}}let bs=(0,f.promisify)(e.execFile),bt=async(a,b,c)=>(0,d.vQK)(a,{component:"scm-github-batch",operation:c},b),bu={prList:new br(100),commitStatus:new br(500),reviewComments:new br(500)};function bv(a,b,c){bu.prList.set(`${a}/${b}`,c)}function bw(a,b,c,d){bu.commitStatus.set(`${a}/${b}#${c}`,d)}let bx=new br(200),by=new br(200);async function bz(a,b=[],c){let d=[],e=!1,f=new Map;for(let b of a){let a=`${b.owner}/${b.repo}`;f.has(a)||f.set(a,[]);let c=f.get(a);c&&c.push(b)}for(let a of b)f.has(a)||f.set(a,[]);if(0===f.size)return{shouldRefresh:!1,details:["No repos to check"],prListUnchangedRepos:new Set};let g=!1,h=new Set;for(let[a]of f){let[b,f]=a.split("/");await bG(b,f,c)?(g=!0,e=!0,d.push(`PR list changed for ${a} (Guard 1)`)):h.add(a)}if(!g)for(let b of a){let a=`${b.owner}/${b.repo}#${b.number}`,f=bx.get(a);if(f&&null===f.headSha){e=!0,d.push(`First time seeing PR #${b.number} (Guard 2: no cached head SHA)`);continue}f&&f.headSha&&await bH(b.owner,b.repo,f.headSha,c)&&(e=!0,d.push(`CI status changed for ${b.owner}/${b.repo}#${b.number} (Guard 2)`))}return{shouldRefresh:e,details:d,prListUnchangedRepos:h}}let bA=!1,bB=new Set;async function bC(){try{await bs("gh",["--version"],{timeout:5e3})}catch(b){if(!bA){bA=!0;let a=b instanceof Error?b.message:String(b);(0,d.plx)({source:"scm",kind:"scm.gh_unavailable",level:"error",summary:"gh CLI not available or not authenticated",data:{plugin:"scm-github",errorMessage:a}})}let a=Error("gh CLI not available or not authenticated. GraphQL batch enrichment requires gh CLI to be installed and configured.");throw a.cause="GH_CLI_UNAVAILABLE",a}}function bD(a){return/HTTP\/[\d.]+ 304/i.test(a)}function bE(a){let b=("string"==typeof a.stdout?a.stdout:"")+("string"==typeof a.stderr?a.stderr:"");return b.length>0?b:null}function bF(a){let b=a.match(/etag:\s*(.+)/i);return b?b[1].trim():void 0}async function bG(a,b,c){let d=`${a}/${b}`,e=bu.prList.get(d),f=["api","--method","GET",`repos/${d}/pulls?state=open&sort=updated&direction=desc&per_page=1`,"-i"];e&&f.push("-H",`If-None-Match: ${e}`);try{let c=await bt(f,1e4,"gh.api.guard-pr-list");if(bD(c)){let d=bF(c);return d&&bv(a,b,d),!1}let d=bF(c);return d&&bv(a,b,d),!0}catch(g){let e=bE(g);if(e&&bD(e)){let c=bF(e);return c&&bv(a,b,c),!1}let f=g instanceof Error?g.message:String(g);if(bD(f))return!1;return c?.log("warn",`[ETag Guard 1] PR list check failed for ${d}: ${f}`),!0}}async function bH(a,b,c,d){let e=`${a}/${b}#${c}`,f=bu.commitStatus.get(e),g=["api","--method","GET",`repos/${a}/${b}/commits/${c}/check-runs?per_page=1`,"-i"];f&&g.push("-H",`If-None-Match: ${f}`);try{let d=await bt(g,1e4,"gh.api.guard-commit-status");if(bD(d)){let e=bF(d);return e&&bw(a,b,c,e),!1}let e=bF(d);return e&&bw(a,b,c,e),!0}catch(h){let f=bE(h);if(f&&bD(f)){let d=bF(f);return d&&bw(a,b,c,d),!1}let g=h instanceof Error?h.message:String(h);if(bD(g))return!1;return d?.log("warn",`[ETag Guard 2] Commit status check failed for ${e}: ${g}`),!0}}async function bI(a,b,c,d){let e=`${a}/${b}#${c}`,f=bu.reviewComments.get(e),g=["api","--method","GET",`repos/${a}/${b}/pulls/${c}/comments`,"-i"];f&&g.push("-H",`If-None-Match: ${f}`);try{let a=await bt(g,1e4,"gh.api.guard-review-comments");if(bD(a)){let b=bF(a);return b&&bu.reviewComments.set(e,b),!1}let b=bF(a);return b&&bu.reviewComments.set(e,b),!0}catch(c){let a=bE(c);if(a&&bD(a)){let b=bF(a);return b&&bu.reviewComments.set(e,b),!1}let b=c instanceof Error?c.message:String(c);if(bD(b))return!1;return d?.log("warn",`[ETag Guard 3] Review comments check failed for ${e}: ${b}`),!0}}let bJ=`
653
715
  title
654
716
  state
655
717
  additions
@@ -691,16 +753,16 @@ process.stdin.on('data', c => input += c).on('end', () => {
691
753
  }
692
754
  }
693
755
  }
694
- `;async function bJ(a){let{query:b,variables:c}=function(a){if(0===a.length)return{query:"",variables:{}};let b=[],c={};a.forEach((a,d)=>{let e=`pr${d}`;b.push(`
756
+ `;async function bK(a){let{query:b,variables:c}=function(a){if(0===a.length)return{query:"",variables:{}};let b=[],c={};a.forEach((a,d)=>{let e=`pr${d}`;b.push(`
695
757
  ${e}: repository(owner: $${e}Owner, name: $${e}Name) {
696
758
  ... on Repository {
697
- pullRequest(number: $${e}Number) { ${bI} }
759
+ pullRequest(number: $${e}Number) { ${bJ} }
698
760
  }
699
761
  }
700
762
  `),c[`${e}Owner`]=a.owner,c[`${e}Name`]=a.repo,c[`${e}Number`]=a.number});let d=Object.entries(c).map(([a,b])=>`$${a}: ${"number"==typeof b?"Int!":"String!"}`).join(", ");return{query:`query BatchPRs(${d}) {
701
763
  ${b.join("\n")}
702
764
  rateLimit { cost remaining resetAt }
703
- }`,variables:c}}(a);if(!b||0===a.length)return{};await bB();let d=[];for(let[a,b]of Object.entries(c))"string"==typeof b?d.push("-f",`${a}=${b}`):d.push("-F",`${a}=${b}`);let e=["api","graphql","-i",...d,"-f",`query=${b}`],f=3e4+Math.max(0,(a.length-10)*2e3),g=await bs(e,f,"gh.api.graphql-batch"),h=g.indexOf("\r\n\r\n"),i=g.indexOf("\n\n"),j=h>=0&&(i<0||h<i)?h+4:i>=0?i+2:0,k=JSON.parse((j>0?g.slice(j):g).trim());if(k.errors&&k.errors.length>0){let a=k.errors.map(a=>a.message).join("; ");throw Error(`GraphQL query errors: ${a}`)}return k.data??{}}async function bK(a,b,c=[]){let e=new Map,f=await by(a,c,b);if(b?.reportPRListUnchangedRepos?.(f.prListUnchangedRepos),!f.shouldRefresh){let c=[];for(let b of a){let a=`${b.owner}/${b.repo}#${b.number}`,d=bx.get(a);d?e.set(a,d):c.push(b)}if(0===c.length)return b?.log("info",`[ETag Guard] Skipping GraphQL batch - all ${e.size} PRs cached. Reasons: ${f.details.join(", ")}`),{enrichment:e,prListUnchangedRepos:f.prListUnchangedRepos};b?.log("info",`[ETag Guard] Partial cache: ${e.size} cached, ${c.length} missing. Fetching missing PRs via GraphQL.`),a=c}let g=[];for(let b=0;b<a.length;b+=25)g.push(a.slice(b,b+25));for(let a=0;a<g.length;a++){let c,f=g[a],h=e.size,i=Date.now();try{let j=await bJ(f);c=Date.now()-i,f.forEach((a,b)=>{let c=`pr${b}`,f=`${a.owner}/${a.repo}#${a.number}`,g=j[c];if(g?.pullRequest){let b=function(a){if(!a||"object"!=typeof a||void 0===a.state&&void 0===a.title&&void 0===a.commits)return null;let b=function(a){let b="string"==typeof a?a.toUpperCase():"";return"MERGED"===b?"merged":"CLOSED"===b?"closed":"open"}(a.state),c="string"==typeof a.title?a.title:void 0,d="number"==typeof a.additions?a.additions:0,e="number"==typeof a.deletions?a.deletions:0,f=!0===a.isDraft,g="string"==typeof a.headRefOid?a.headRefOid:"string"==typeof a.headSha?a.headSha:null,h=a.mergeable,i="string"==typeof a.mergeStateStatus?a.mergeStateStatus.toUpperCase():"",j="CONFLICTING"===h,k="BEHIND"===i,l=function(a){let b="string"==typeof a?a.toUpperCase():"";return"APPROVED"===b?"approved":"CHANGES_REQUESTED"===b?"changes_requested":"REVIEW_REQUIRED"===b?"pending":"none"}(a.reviewDecision),m=a.commits,n=m?.nodes?.[0]?.commit?.statusCheckRollup,o=n?function(a){if(!a||"object"!=typeof a)return"none";let b="string"==typeof a.state?a.state.toUpperCase():"";return"SUCCESS"===b?"passing":"FAILURE"===b||"ERROR"===b?"failing":"PENDING"===b||"EXPECTED"===b?"pending":"TIMED_OUT"===b||"CANCELLED"===b||"ACTION_REQUIRED"===b?"failing":"QUEUED"===b||"IN_PROGRESS"===b||"WAITING"===b?"pending":"none"}(n):"none",p=n?.contexts,q=p?.pageInfo,r=null!=q&&"object"==typeof q&&!0===q.hasNextPage,s=p&&!r?function(a){if(!a||"object"!=typeof a)return[];let b=a.nodes;if(!Array.isArray(b))return[];let c=[];for(let a of b)if(a&&"object"==typeof a){if("string"==typeof a.name&&"string"==typeof a.status){let b,d=a.status.toUpperCase(),e="string"==typeof a.conclusion?a.conclusion.toUpperCase():null;b="COMPLETED"===d?"SUCCESS"===e?"passed":"SKIPPED"===e||"NEUTRAL"===e||"STALE"===e||"NOT_REQUIRED"===e||"NONE"===e?"skipped":"FAILURE"===e||"TIMED_OUT"===e||"CANCELLED"===e||"ACTION_REQUIRED"===e||"ERROR"===e?"failed":"skipped":"IN_PROGRESS"===d?"running":"pending",c.push({name:a.name,status:b,conclusion:e??void 0,url:"string"==typeof a.detailsUrl?a.detailsUrl:void 0});continue}if("string"==typeof a.context&&"string"==typeof a.state){let b,d=a.state.toUpperCase();b="SUCCESS"===d?"passed":"FAILURE"===d||"ERROR"===d?"failed":"pending",c.push({name:a.context,status:b,conclusion:d,url:"string"==typeof a.targetUrl?a.targetUrl:void 0})}}return c}(p):void 0,t=[];"failing"===o&&t.push("CI is failing"),"changes_requested"===l&&t.push("Changes requested in review"),"pending"===l&&t.push("Review required"),j&&t.push("Merge conflicts"),k&&t.push("Branch is behind base branch"),f&&t.push("PR is still a draft");let u="open"===b&&("passing"===o||"none"===o)&&("approved"===l||"none"===l)&&!j&&!k&&!f;return{data:{state:b,ciStatus:o,reviewDecision:l,mergeable:u,title:c,additions:d,deletions:e,isDraft:f,hasConflicts:j,isBehind:k,blockers:t,...void 0!==s?{ciChecks:s}:{}},headSha:g}}(g.pullRequest);if(b){let{data:a,headSha:c}=b;e.set(f,a),bw.set(f,{headSha:c,ciStatus:a.ciStatus}),bx.set(f,a)}else bA.has(f)||(bA.add(f),(0,d.plx)({source:"scm",kind:"scm.batch_enrich_pr_failed",level:"warn",summary:`batch enrich extraction failed for PR #${a.number}`,data:{plugin:"scm-github",prNumber:a.number,prOwner:a.owner,prRepo:a.repo}}))}});let k=e.size;if(k>h){let d={batchIndex:a,totalBatches:g.length,prCount:k-h,durationMs:c};b?.recordSuccess(d),b?.log("info",`[GraphQL Batch Success] Batch ${a+1}/${g.length} succeeded: added ${k-h} PRs to cache (${c}ms)`)}}catch(e){c=Date.now()-i;let d=e instanceof Error?e.message:String(e);b?.recordFailure({batchIndex:a,totalBatches:g.length,prCount:f.length,error:d,durationMs:c}),b?.log("error",`[GraphQL Batch] Batch enrichment partially failed: ${d}`)}}return{enrichment:e,prListUnchangedRepos:f.prListUnchangedRepos}}function bL(a,b){let c=b.toLowerCase();for(let[b,d]of Object.entries(a))if(b.toLowerCase()===c){if(Array.isArray(d))return d[0];return d}}function bM(a){if("string"!=typeof a)return;let b=new Date(a);return Number.isNaN(b.getTime())?void 0:b}function bN(a){return"string"!=typeof a||0===a.length?void 0:a.startsWith("refs/heads/")?a.slice(11):a.startsWith("refs/")?void 0:a}let bO=(0,f.promisify)(e.execFile),bP=new Set(["cursor[bot]","github-actions[bot]","codecov[bot]","sonarcloud[bot]","dependabot[bot]","renovate[bot]","codeclimate[bot]","deepsource-autofix[bot]","snyk-bot","lgtm-com[bot]"]),bQ=new Set;async function bR(a,b,c){try{let{stdout:d}=await bO(a,b,{...c?{cwd:c}:{},maxBuffer:0xa00000,timeout:3e4});return d.trim()}catch(c){throw Error(`${a} ${b.slice(0,3).join(" ")} failed: ${c.message}`,{cause:c})}}async function bS(a){return(0,d.vQK)(a,{component:"scm-github"},3e4)}async function bT(a,b){return(0,d.vQK)(a,{component:"scm-github",cwd:b},3e4)}async function bU(a,b){return bR("git",a,b)}function bV(a){let b=a.split("/");if(2!==b.length||!b[0]||!b[1])throw Error(`Invalid repo format "${a}", expected "owner/repo"`);return[b[0],b[1]]}function bW(a,b){let[c,d]=bV(b);return{number:a.number,url:a.url,title:a.title,owner:c,repo:d,branch:a.headRefName,baseBranch:a.baseRefName,isDraft:a.isDraft}}function bX(a){let b=(a??"").toUpperCase();return"IN_PROGRESS"===b?"running":"PENDING"===b||"QUEUED"===b||"REQUESTED"===b||"WAITING"===b||"EXPECTED"===b?"pending":"SUCCESS"===b?"passed":"FAILURE"===b||"TIMED_OUT"===b||"CANCELLED"===b||"ACTION_REQUIRED"===b||"ERROR"===b?"failed":("SKIPPED"===b||"NEUTRAL"===b||"STALE"===b||"NOT_REQUIRED"===b,"skipped")}function bY(a){return"failed"===a.status||a.conclusion?.toUpperCase()==="FAILURE"}function bZ(a){return a.length>0&&[...a].every(a=>a>="0"&&a<="9")}async function b$(a,b){try{return await bS(["run","view",b.runId,"--repo",b1(a),"--log-failed",...b.jobId?["--job",b.jobId]:[]])}catch(c){if(!b.jobId)throw c;return bS(["api",`repos/${a.owner}/${a.repo}/actions/jobs/${b.jobId}/logs`])}}async function b_(a){let b=JSON.parse(await bS(["pr","view",String(a.number),"--repo",b1(a),"--json","statusCheckRollup"]));return(Array.isArray(b.statusCheckRollup)?b.statusCheckRollup:[]).map(a=>{if(!a||"object"!=typeof a)return null;let b="string"==typeof a.name&&a.name||"string"==typeof a.context&&a.context;if(!b)return null;let c="string"==typeof a.conclusion?a.conclusion:"string"==typeof a.state?a.state:"string"==typeof a.status?a.status:void 0,d="string"==typeof a.link&&a.link||"string"==typeof a.detailsUrl&&a.detailsUrl||"string"==typeof a.targetUrl&&a.targetUrl||void 0,e="string"==typeof a.startedAt?a.startedAt:"string"==typeof a.createdAt?a.createdAt:void 0,f="string"==typeof a.completedAt?a.completedAt:void 0,g={name:b,status:bX(c),conclusion:"string"==typeof c?c.toUpperCase():void 0,startedAt:e?new Date(e):void 0,completedAt:f?new Date(f):void 0};return d&&(g.url=d),g}).filter(a=>null!==a)}function b0(a){let b=a.scm?.webhook;return{enabled:b?.enabled!==!1,path:b?.path??"/api/webhooks/github",secretEnvVar:b?.secretEnvVar,signatureHeader:b?.signatureHeader??"x-hub-signature-256",eventHeader:b?.eventHeader??"x-github-event",deliveryHeader:b?.deliveryHeader??"x-github-delivery",maxBodyBytes:b?.maxBodyBytes}}function b1(a){return`${a.owner}/${a.repo}`}function b2(a){if(!a)return new Date(0);let b=new Date(a);return isNaN(b.getTime())?new Date(0):b}let b3={resolvePR:6e4,getPRState:5e3,getPRSummary:5e3,getReviews:1e4,getReviewDecision:1e4,getCIChecks:5e3,getMergeability:5e3,getPendingComments:1e4,detectPR:3e4},b4={manifest:{name:"github",slot:"scm",description:"SCM plugin: GitHub PRs, CI checks, reviews, merge readiness",version:"0.1.0"},create:function(){return function(){let a,b=new Map,c=new Map;function e(a,b,c,d){return`${a}/${b}#${c}:${d}`}function f(a){let c=b.get(a);return c?Date.now()>c.expiresAt?(b.delete(a),null):c.value:null}function g(a,c,d){if(b.size>=1e3){let a=b.keys().next().value;void 0!==a&&b.delete(a)}b.set(a,{value:c,expiresAt:Date.now()+d})}function i(a){let d=`${a.owner}/${a.repo}#${a.number}:`;for(let a of b.keys())a.startsWith(d)&&b.delete(a);b.delete(e(a.owner,a.repo,a.branch,"detectPR")),c.delete(`${a.owner}/${a.repo}#${a.number}`)}async function j(a,b,c,d,h){let i=e(a,b,c,d),j=f(i);if(null!==j)return j;let k=await h();return g(i,k,b3[d]),k}return{name:"github",async verifyWebhook(a,b){let c=b0(b);if(!c.enabled)return{ok:!1,reason:"Webhook is disabled for this project"};if("POST"!==a.method.toUpperCase())return{ok:!1,reason:"Webhook requests must use POST"};if(void 0!==c.maxBodyBytes&&Buffer.byteLength(a.body,"utf8")>c.maxBodyBytes)return{ok:!1,reason:"Webhook payload exceeds configured maxBodyBytes"};let d=bL(a.headers,c.eventHeader);if(!d)return{ok:!1,reason:`Missing ${c.eventHeader} header`};let e=bL(a.headers,c.deliveryHeader),f=c.secretEnvVar;if(!f)return{ok:!0,deliveryId:e,eventType:d};let g=process.env[f];if(!g)return{ok:!1,reason:`Webhook secret env var ${f} is not configured`};let i=bL(a.headers,c.signatureHeader);return i?!function(a,b,c){if(!c.startsWith("sha256="))return!1;let d=(0,h.createHmac)("sha256",b).update(a).digest("hex"),e=c.slice(7),f=Buffer.from(d,"hex"),g=Buffer.from(e,"hex");return f.length===g.length&&(0,h.timingSafeEqual)(f,g)}(a.rawBody??a.body,g,i)?{ok:!1,reason:"Webhook signature verification failed",deliveryId:e,eventType:d}:{ok:!0,deliveryId:e,eventType:d}:{ok:!1,reason:`Missing ${c.signatureHeader} header`}},async parseWebhook(a,b){let c=b0(b),d=function(a){let b=JSON.parse(a);if(!b||"object"!=typeof b||Array.isArray(b))throw Error("Webhook payload must be a JSON object");return b}(a.body);return function(a,b,c){let d=bL(a.headers,c.eventHeader);if(!d)return null;let e=bL(a.headers,c.deliveryHeader),f=function(a){let b=a.repository;if(!b||"object"!=typeof b)return;let c=b.owner,d=c&&"object"==typeof c?c.login:void 0,e="string"==typeof d?d:void 0,f="string"==typeof b.name?b.name:void 0;if(e&&f)return{owner:e,name:f}}(b),g="string"==typeof b.action?b.action:d;if("pull_request"===d){let a=b.pull_request;if(!a||"object"!=typeof a)return null;let c=a.head;return{provider:"github",kind:"pull_request",action:g,rawEventType:d,deliveryId:e,repository:f,prNumber:"number"==typeof b.number?b.number:"number"==typeof a.number?a.number:void 0,branch:"string"==typeof c?.ref?c.ref:void 0,sha:"string"==typeof c?.sha?c.sha:void 0,timestamp:bM(a.updated_at),data:b}}if("pull_request_review"===d||"pull_request_review_comment"===d){let a=b.pull_request;if(!a||"object"!=typeof a)return null;let c=a.head;return{provider:"github",kind:"pull_request_review"===d?"review":"comment",action:g,rawEventType:d,deliveryId:e,repository:f,prNumber:"number"==typeof b.number?b.number:"number"==typeof a.number?a.number:void 0,branch:"string"==typeof c?.ref?c.ref:void 0,sha:"string"==typeof c?.sha?c.sha:void 0,timestamp:"pull_request_review"===d?bM(b.review?.submitted_at):bM(b.comment?.updated_at??b.comment?.created_at),data:b}}if("issue_comment"===d){let a=b.issue;return a&&"object"==typeof a&&"pull_request"in a?{provider:"github",kind:"comment",action:g,rawEventType:d,deliveryId:e,repository:f,prNumber:"number"==typeof a.number?a.number:void 0,timestamp:bM(b.comment?.updated_at??b.comment?.created_at),data:b}:null}if("check_run"===d||"check_suite"===d){let a=b[d],c=(Array.isArray(a?.pull_requests)?a?.pull_requests:[])[0];return{provider:"github",kind:"ci",action:g,rawEventType:d,deliveryId:e,repository:f,prNumber:"number"==typeof c?.number?c.number:void 0,branch:"string"==typeof a?.head_branch?a.head_branch:"string"==typeof a?.check_suite?.head_branch?(a?.check_suite).head_branch:void 0,sha:"string"==typeof a?.head_sha?a.head_sha:void 0,timestamp:bM(a?.updated_at),data:b}}if("status"===d){let a=Array.isArray(b.branches)?b.branches:[];return{provider:"github",kind:"ci",action:"string"==typeof b.state?b.state:g,rawEventType:d,deliveryId:e,repository:f,branch:bN(a[0]?.name??b.ref),sha:"string"==typeof b.sha?b.sha:void 0,timestamp:bM(b.updated_at),data:b}}if("push"===d){let a=b.head_commit&&"object"==typeof b.head_commit?b.head_commit:void 0;return{provider:"github",kind:"push",action:g,rawEventType:d,deliveryId:e,repository:f,branch:bN(b.ref),sha:"string"==typeof b.after?b.after:void 0,timestamp:bM(a?.timestamp??b.updated_at),data:b}}return{provider:"github",kind:"unknown",action:g,rawEventType:d,deliveryId:e,repository:f,timestamp:bM(b.updated_at),data:b}}(a,d,c)},async detectPR(a,b){if(!a.branch||!b.repo)return null;bV(b.repo);let[c,d]=b.repo.split("/"),h=e(c??"",d??"",a.branch,"detectPR"),i=f(h);if(null!==i)return i;try{let c=await bS(["pr","list","--repo",b.repo,"--head",a.branch,"--json","number,url,title,headRefName,baseRefName,isDraft","--limit","1"]),d=JSON.parse(c);if(0===d.length)return null;let e=bW(d[0],b.repo);return g(h,e,b3.detectPR),e}catch{return null}},async resolvePR(a,b){if(!b.repo)throw Error("Cannot resolve PR: project has no repo configured");let c=b.repo,[d,e]=c.split("/");return j(d??"",e??"",`ref=${a}`,"resolvePR",async()=>bW(JSON.parse(await bS(["pr","view",a,"--repo",c,"--json","number,url,title,headRefName,baseRefName,isDraft"])),c))},async assignPRToCurrentUser(a){await bS(["pr","edit",String(a.number),"--repo",b1(a),"--add-assignee","@me"]),i(a)},async checkoutPR(a,b){if(await bU(["branch","--show-current"],b)===a.branch)return!1;if(await bU(["status","--porcelain"],b))throw Error(`Workspace has uncommitted changes; cannot switch to PR branch "${a.branch}" safely`);return await bT(["pr","checkout",String(a.number),"--repo",b1(a)],b),!0},getPRState:async a=>j(a.owner,a.repo,String(a.number),"getPRState",async()=>{let b=JSON.parse(await bS(["pr","view",String(a.number),"--repo",b1(a),"--json","state"])).state.toUpperCase();return"MERGED"===b?"merged":"CLOSED"===b?"closed":"open"}),getPRSummary:async a=>j(a.owner,a.repo,String(a.number),"getPRSummary",async()=>{let b=JSON.parse(await bS(["pr","view",String(a.number),"--repo",b1(a),"--json","state,title,additions,deletions"])),c=b.state.toUpperCase();return{state:"MERGED"===c?"merged":"CLOSED"===c?"closed":"open",title:b.title??"",additions:b.additions??0,deletions:b.deletions??0}}),async mergePR(a,b="squash"){await bS(["pr","merge",String(a.number),"--repo",b1(a),"rebase"===b?"--rebase":"merge"===b?"--merge":"--squash","--delete-branch"]),i(a)},async closePR(a){await bS(["pr","close",String(a.number),"--repo",b1(a)]),i(a)},getCIChecks:async a=>j(a.owner,a.repo,String(a.number),"getCIChecks",async()=>{try{let b=await bS(["pr","checks",String(a.number),"--repo",b1(a),"--json","name,state,link,startedAt,completedAt"]);return JSON.parse(b).map(a=>{let b=a.state?.toUpperCase();return{name:a.name,status:bX(b),url:a.link||void 0,conclusion:b||void 0,startedAt:a.startedAt?new Date(a.startedAt):void 0,completedAt:a.completedAt?new Date(a.completedAt):void 0}})}catch(b){if(b instanceof Error&&/pr checks/i.test(b.message)&&/unknown json field/i.test(b.message))return b_(a);throw Error("Failed to fetch CI checks",{cause:b})}}),async getCIFailureSummary(a,b){try{let c=(b??await this.getCIChecks(a)).filter(bY);if(0===c.length)return null;let d=[],e=new Set;for(let b of c){let c=function(a){let b;if(!a.url)return null;try{b=new URL(a.url).pathname.split("/").filter(Boolean)}catch{return null}let c=b.findIndex((a,c)=>"actions"===a&&"runs"===b[c+1]),d=c>=0?b[c+2]:void 0;if(!d||!bZ(d))return null;let e=b.findIndex((a,b)=>b>c&&"job"===a),f=e>=0?b[e+1]:void 0;return{runId:d,...f&&bZ(f)?{jobId:f}:{},runUrl:a.url}}(b);if(!c)continue;let f=`${c.runId}:${c.jobId??""}`;if(e.has(f))continue;e.add(f);let g=await b$(a,c),h={name:b.name,runUrl:c.runUrl},i=function(a){let b;for(let c of a.split(/\r?\n/)){let a=c.split(" "),d=a.length>=3?a[1]?.trim():void 0;d&&(b=d)}return b}(g);i&&(h.failedStep=i);let j=function(a,b){let c=a.split(/\r?\n/).slice(-120).join("\n").trimEnd();return c.length>0?c:void 0}(g,0);j&&(h.logTail=j),d.push(h)}return d.length>0?{failedJobs:d}:null}catch{return null}},async getCISummary(a){let b;try{b=await this.getCIChecks(a)}catch(c){try{let b=await this.getPRState(a);if("merged"===b||"closed"===b)return"none"}catch{}let b=`${b1(a)}#${a.number}`;if(!bQ.has(b)){bQ.add(b);let e=c instanceof Error?c.message:String(c);(0,d.plx)({source:"scm",kind:"scm.ci_summary_failclosed",level:"warn",summary:`getCISummary failed-closed for PR #${a.number}`,data:{plugin:"scm-github",prNumber:a.number,prOwner:a.owner,prRepo:a.repo,errorMessage:e}})}return"failing"}return 0===b.length?"none":b.some(a=>"failed"===a.status)?"failing":b.some(a=>"pending"===a.status||"running"===a.status)?"pending":b.some(a=>"passed"===a.status)?"passing":"none"},getReviews:async a=>j(a.owner,a.repo,String(a.number),"getReviews",async()=>JSON.parse(await bS(["pr","view",String(a.number),"--repo",b1(a),"--json","reviews"])).reviews.map(a=>{let b,c=a.state?.toUpperCase();return b="APPROVED"===c?"approved":"CHANGES_REQUESTED"===c?"changes_requested":"DISMISSED"===c?"dismissed":"PENDING"===c?"pending":"commented",{author:a.author?.login??"unknown",state:b,body:a.body||void 0,submittedAt:b2(a.submittedAt)}})),getReviewDecision:async a=>j(a.owner,a.repo,String(a.number),"getReviewDecision",async()=>{let b=(JSON.parse(await bS(["pr","view",String(a.number),"--repo",b1(a),"--json","reviewDecision"])).reviewDecision??"").toUpperCase();return"APPROVED"===b?"approved":"CHANGES_REQUESTED"===b?"changes_requested":"REVIEW_REQUIRED"===b?"pending":"none"}),getPendingComments:async a=>j(a.owner,a.repo,String(a.number),"getPendingComments",async()=>{try{let b=await bS(["api","graphql","-f",`owner=${a.owner}`,"-f",`name=${a.repo}`,"-F",`number=${a.number}`,"-f",`query=query($owner: String!, $name: String!, $number: Int!) {
765
+ }`,variables:c}}(a);if(!b||0===a.length)return{};await bC();let d=[];for(let[a,b]of Object.entries(c))"string"==typeof b?d.push("-f",`${a}=${b}`):d.push("-F",`${a}=${b}`);let e=["api","graphql","-i",...d,"-f",`query=${b}`],f=3e4+Math.max(0,(a.length-10)*2e3),g=await bt(e,f,"gh.api.graphql-batch"),h=g.indexOf("\r\n\r\n"),i=g.indexOf("\n\n"),j=h>=0&&(i<0||h<i)?h+4:i>=0?i+2:0,k=JSON.parse((j>0?g.slice(j):g).trim());if(k.errors&&k.errors.length>0){let a=k.errors.map(a=>a.message).join("; ");throw Error(`GraphQL query errors: ${a}`)}return k.data??{}}async function bL(a,b,c=[]){let e=new Map,f=await bz(a,c,b);if(b?.reportPRListUnchangedRepos?.(f.prListUnchangedRepos),!f.shouldRefresh){let c=[];for(let b of a){let a=`${b.owner}/${b.repo}#${b.number}`,d=by.get(a);d?e.set(a,d):c.push(b)}if(0===c.length)return b?.log("info",`[ETag Guard] Skipping GraphQL batch - all ${e.size} PRs cached. Reasons: ${f.details.join(", ")}`),{enrichment:e,prListUnchangedRepos:f.prListUnchangedRepos};b?.log("info",`[ETag Guard] Partial cache: ${e.size} cached, ${c.length} missing. Fetching missing PRs via GraphQL.`),a=c}let g=[];for(let b=0;b<a.length;b+=25)g.push(a.slice(b,b+25));for(let a=0;a<g.length;a++){let c,f=g[a],h=e.size,i=Date.now();try{let j=await bK(f);c=Date.now()-i,f.forEach((a,b)=>{let c=`pr${b}`,f=`${a.owner}/${a.repo}#${a.number}`,g=j[c];if(g?.pullRequest){let b=function(a){if(!a||"object"!=typeof a||void 0===a.state&&void 0===a.title&&void 0===a.commits)return null;let b=function(a){let b="string"==typeof a?a.toUpperCase():"";return"MERGED"===b?"merged":"CLOSED"===b?"closed":"open"}(a.state),c="string"==typeof a.title?a.title:void 0,d="number"==typeof a.additions?a.additions:0,e="number"==typeof a.deletions?a.deletions:0,f=!0===a.isDraft,g="string"==typeof a.headRefOid?a.headRefOid:"string"==typeof a.headSha?a.headSha:null,h=a.mergeable,i="string"==typeof a.mergeStateStatus?a.mergeStateStatus.toUpperCase():"",j="CONFLICTING"===h,k="BEHIND"===i,l=function(a){let b="string"==typeof a?a.toUpperCase():"";return"APPROVED"===b?"approved":"CHANGES_REQUESTED"===b?"changes_requested":"REVIEW_REQUIRED"===b?"pending":"none"}(a.reviewDecision),m=a.commits,n=m?.nodes?.[0]?.commit?.statusCheckRollup,o=n?function(a){if(!a||"object"!=typeof a)return"none";let b="string"==typeof a.state?a.state.toUpperCase():"";return"SUCCESS"===b?"passing":"FAILURE"===b||"ERROR"===b?"failing":"PENDING"===b||"EXPECTED"===b?"pending":"TIMED_OUT"===b||"CANCELLED"===b||"ACTION_REQUIRED"===b?"failing":"QUEUED"===b||"IN_PROGRESS"===b||"WAITING"===b?"pending":"none"}(n):"none",p=n?.contexts,q=p?.pageInfo,r=null!=q&&"object"==typeof q&&!0===q.hasNextPage,s=p&&!r?function(a){if(!a||"object"!=typeof a)return[];let b=a.nodes;if(!Array.isArray(b))return[];let c=[];for(let a of b)if(a&&"object"==typeof a){if("string"==typeof a.name&&"string"==typeof a.status){let b,d=a.status.toUpperCase(),e="string"==typeof a.conclusion?a.conclusion.toUpperCase():null;b="COMPLETED"===d?"SUCCESS"===e?"passed":"SKIPPED"===e||"NEUTRAL"===e||"STALE"===e||"NOT_REQUIRED"===e||"NONE"===e?"skipped":"FAILURE"===e||"TIMED_OUT"===e||"CANCELLED"===e||"ACTION_REQUIRED"===e||"ERROR"===e?"failed":"skipped":"IN_PROGRESS"===d?"running":"pending",c.push({name:a.name,status:b,conclusion:e??void 0,url:"string"==typeof a.detailsUrl?a.detailsUrl:void 0});continue}if("string"==typeof a.context&&"string"==typeof a.state){let b,d=a.state.toUpperCase();b="SUCCESS"===d?"passed":"FAILURE"===d||"ERROR"===d?"failed":"pending",c.push({name:a.context,status:b,conclusion:d,url:"string"==typeof a.targetUrl?a.targetUrl:void 0})}}return c}(p):void 0,t=[];"failing"===o&&t.push("CI is failing"),"changes_requested"===l&&t.push("Changes requested in review"),"pending"===l&&t.push("Review required"),j&&t.push("Merge conflicts"),k&&t.push("Branch is behind base branch"),f&&t.push("PR is still a draft");let u="open"===b&&("passing"===o||"none"===o)&&("approved"===l||"none"===l)&&!j&&!k&&!f;return{data:{state:b,ciStatus:o,reviewDecision:l,mergeable:u,title:c,additions:d,deletions:e,isDraft:f,hasConflicts:j,isBehind:k,blockers:t,...void 0!==s?{ciChecks:s}:{}},headSha:g}}(g.pullRequest);if(b){let{data:a,headSha:c}=b;e.set(f,a),bx.set(f,{headSha:c,ciStatus:a.ciStatus}),by.set(f,a)}else bB.has(f)||(bB.add(f),(0,d.plx)({source:"scm",kind:"scm.batch_enrich_pr_failed",level:"warn",summary:`batch enrich extraction failed for PR #${a.number}`,data:{plugin:"scm-github",prNumber:a.number,prOwner:a.owner,prRepo:a.repo}}))}});let k=e.size;if(k>h){let d={batchIndex:a,totalBatches:g.length,prCount:k-h,durationMs:c};b?.recordSuccess(d),b?.log("info",`[GraphQL Batch Success] Batch ${a+1}/${g.length} succeeded: added ${k-h} PRs to cache (${c}ms)`)}}catch(e){c=Date.now()-i;let d=e instanceof Error?e.message:String(e);b?.recordFailure({batchIndex:a,totalBatches:g.length,prCount:f.length,error:d,durationMs:c}),b?.log("error",`[GraphQL Batch] Batch enrichment partially failed: ${d}`)}}return{enrichment:e,prListUnchangedRepos:f.prListUnchangedRepos}}function bM(a,b){let c=b.toLowerCase();for(let[b,d]of Object.entries(a))if(b.toLowerCase()===c){if(Array.isArray(d))return d[0];return d}}function bN(a){if("string"!=typeof a)return;let b=new Date(a);return Number.isNaN(b.getTime())?void 0:b}function bO(a){return"string"!=typeof a||0===a.length?void 0:a.startsWith("refs/heads/")?a.slice(11):a.startsWith("refs/")?void 0:a}let bP=(0,f.promisify)(e.execFile),bQ=new Set(["cursor[bot]","github-actions[bot]","codecov[bot]","sonarcloud[bot]","dependabot[bot]","renovate[bot]","codeclimate[bot]","deepsource-autofix[bot]","snyk-bot","lgtm-com[bot]"]),bR=new Set;async function bS(a,b,c){try{let{stdout:d}=await bP(a,b,{...c?{cwd:c}:{},maxBuffer:0xa00000,timeout:3e4});return d.trim()}catch(c){throw Error(`${a} ${b.slice(0,3).join(" ")} failed: ${c.message}`,{cause:c})}}async function bT(a){return(0,d.vQK)(a,{component:"scm-github"},3e4)}async function bU(a,b){return(0,d.vQK)(a,{component:"scm-github",cwd:b},3e4)}async function bV(a,b){return bS("git",a,b)}function bW(a){let b=a.split("/");if(2!==b.length||!b[0]||!b[1])throw Error(`Invalid repo format "${a}", expected "owner/repo"`);return[b[0],b[1]]}function bX(a,b){let[c,d]=bW(b);return{number:a.number,url:a.url,title:a.title,owner:c,repo:d,branch:a.headRefName,baseBranch:a.baseRefName,isDraft:a.isDraft}}function bY(a){let b=(a??"").toUpperCase();return"IN_PROGRESS"===b?"running":"PENDING"===b||"QUEUED"===b||"REQUESTED"===b||"WAITING"===b||"EXPECTED"===b?"pending":"SUCCESS"===b?"passed":"FAILURE"===b||"TIMED_OUT"===b||"CANCELLED"===b||"ACTION_REQUIRED"===b||"ERROR"===b?"failed":("SKIPPED"===b||"NEUTRAL"===b||"STALE"===b||"NOT_REQUIRED"===b,"skipped")}function bZ(a){return"failed"===a.status||a.conclusion?.toUpperCase()==="FAILURE"}function b$(a){return a.length>0&&[...a].every(a=>a>="0"&&a<="9")}async function b_(a,b){try{return await bT(["run","view",b.runId,"--repo",b2(a),"--log-failed",...b.jobId?["--job",b.jobId]:[]])}catch(c){if(!b.jobId)throw c;return bT(["api",`repos/${a.owner}/${a.repo}/actions/jobs/${b.jobId}/logs`])}}async function b0(a){let b=JSON.parse(await bT(["pr","view",String(a.number),"--repo",b2(a),"--json","statusCheckRollup"]));return(Array.isArray(b.statusCheckRollup)?b.statusCheckRollup:[]).map(a=>{if(!a||"object"!=typeof a)return null;let b="string"==typeof a.name&&a.name||"string"==typeof a.context&&a.context;if(!b)return null;let c="string"==typeof a.conclusion?a.conclusion:"string"==typeof a.state?a.state:"string"==typeof a.status?a.status:void 0,d="string"==typeof a.link&&a.link||"string"==typeof a.detailsUrl&&a.detailsUrl||"string"==typeof a.targetUrl&&a.targetUrl||void 0,e="string"==typeof a.startedAt?a.startedAt:"string"==typeof a.createdAt?a.createdAt:void 0,f="string"==typeof a.completedAt?a.completedAt:void 0,g={name:b,status:bY(c),conclusion:"string"==typeof c?c.toUpperCase():void 0,startedAt:e?new Date(e):void 0,completedAt:f?new Date(f):void 0};return d&&(g.url=d),g}).filter(a=>null!==a)}function b1(a){let b=a.scm?.webhook;return{enabled:b?.enabled!==!1,path:b?.path??"/api/webhooks/github",secretEnvVar:b?.secretEnvVar,signatureHeader:b?.signatureHeader??"x-hub-signature-256",eventHeader:b?.eventHeader??"x-github-event",deliveryHeader:b?.deliveryHeader??"x-github-delivery",maxBodyBytes:b?.maxBodyBytes}}function b2(a){return`${a.owner}/${a.repo}`}function b3(a){if(!a)return new Date(0);let b=new Date(a);return isNaN(b.getTime())?new Date(0):b}let b4={resolvePR:6e4,getPRState:5e3,getPRSummary:5e3,getReviews:1e4,getReviewDecision:1e4,getCIChecks:5e3,getMergeability:5e3,getPendingComments:1e4,detectPR:3e4},b5={manifest:{name:"github",slot:"scm",description:"SCM plugin: GitHub PRs, CI checks, reviews, merge readiness",version:"0.1.0"},create:function(){return function(){let a,b=new Map,c=new Map;function e(a,b,c,d){return`${a}/${b}#${c}:${d}`}function f(a){let c=b.get(a);return c?Date.now()>c.expiresAt?(b.delete(a),null):c.value:null}function g(a,c,d){if(b.size>=1e3){let a=b.keys().next().value;void 0!==a&&b.delete(a)}b.set(a,{value:c,expiresAt:Date.now()+d})}function i(a){let d=`${a.owner}/${a.repo}#${a.number}:`;for(let a of b.keys())a.startsWith(d)&&b.delete(a);b.delete(e(a.owner,a.repo,a.branch,"detectPR")),c.delete(`${a.owner}/${a.repo}#${a.number}`)}async function j(a,b,c,d,h){let i=e(a,b,c,d),j=f(i);if(null!==j)return j;let k=await h();return g(i,k,b4[d]),k}return{name:"github",async verifyWebhook(a,b){let c=b1(b);if(!c.enabled)return{ok:!1,reason:"Webhook is disabled for this project"};if("POST"!==a.method.toUpperCase())return{ok:!1,reason:"Webhook requests must use POST"};if(void 0!==c.maxBodyBytes&&Buffer.byteLength(a.body,"utf8")>c.maxBodyBytes)return{ok:!1,reason:"Webhook payload exceeds configured maxBodyBytes"};let d=bM(a.headers,c.eventHeader);if(!d)return{ok:!1,reason:`Missing ${c.eventHeader} header`};let e=bM(a.headers,c.deliveryHeader),f=c.secretEnvVar;if(!f)return{ok:!0,deliveryId:e,eventType:d};let g=process.env[f];if(!g)return{ok:!1,reason:`Webhook secret env var ${f} is not configured`};let i=bM(a.headers,c.signatureHeader);return i?!function(a,b,c){if(!c.startsWith("sha256="))return!1;let d=(0,h.createHmac)("sha256",b).update(a).digest("hex"),e=c.slice(7),f=Buffer.from(d,"hex"),g=Buffer.from(e,"hex");return f.length===g.length&&(0,h.timingSafeEqual)(f,g)}(a.rawBody??a.body,g,i)?{ok:!1,reason:"Webhook signature verification failed",deliveryId:e,eventType:d}:{ok:!0,deliveryId:e,eventType:d}:{ok:!1,reason:`Missing ${c.signatureHeader} header`}},async parseWebhook(a,b){let c=b1(b),d=function(a){let b=JSON.parse(a);if(!b||"object"!=typeof b||Array.isArray(b))throw Error("Webhook payload must be a JSON object");return b}(a.body);return function(a,b,c){let d=bM(a.headers,c.eventHeader);if(!d)return null;let e=bM(a.headers,c.deliveryHeader),f=function(a){let b=a.repository;if(!b||"object"!=typeof b)return;let c=b.owner,d=c&&"object"==typeof c?c.login:void 0,e="string"==typeof d?d:void 0,f="string"==typeof b.name?b.name:void 0;if(e&&f)return{owner:e,name:f}}(b),g="string"==typeof b.action?b.action:d;if("pull_request"===d){let a=b.pull_request;if(!a||"object"!=typeof a)return null;let c=a.head;return{provider:"github",kind:"pull_request",action:g,rawEventType:d,deliveryId:e,repository:f,prNumber:"number"==typeof b.number?b.number:"number"==typeof a.number?a.number:void 0,branch:"string"==typeof c?.ref?c.ref:void 0,sha:"string"==typeof c?.sha?c.sha:void 0,timestamp:bN(a.updated_at),data:b}}if("pull_request_review"===d||"pull_request_review_comment"===d){let a=b.pull_request;if(!a||"object"!=typeof a)return null;let c=a.head;return{provider:"github",kind:"pull_request_review"===d?"review":"comment",action:g,rawEventType:d,deliveryId:e,repository:f,prNumber:"number"==typeof b.number?b.number:"number"==typeof a.number?a.number:void 0,branch:"string"==typeof c?.ref?c.ref:void 0,sha:"string"==typeof c?.sha?c.sha:void 0,timestamp:"pull_request_review"===d?bN(b.review?.submitted_at):bN(b.comment?.updated_at??b.comment?.created_at),data:b}}if("issue_comment"===d){let a=b.issue;return a&&"object"==typeof a&&"pull_request"in a?{provider:"github",kind:"comment",action:g,rawEventType:d,deliveryId:e,repository:f,prNumber:"number"==typeof a.number?a.number:void 0,timestamp:bN(b.comment?.updated_at??b.comment?.created_at),data:b}:null}if("check_run"===d||"check_suite"===d){let a=b[d],c=(Array.isArray(a?.pull_requests)?a?.pull_requests:[])[0];return{provider:"github",kind:"ci",action:g,rawEventType:d,deliveryId:e,repository:f,prNumber:"number"==typeof c?.number?c.number:void 0,branch:"string"==typeof a?.head_branch?a.head_branch:"string"==typeof a?.check_suite?.head_branch?(a?.check_suite).head_branch:void 0,sha:"string"==typeof a?.head_sha?a.head_sha:void 0,timestamp:bN(a?.updated_at),data:b}}if("status"===d){let a=Array.isArray(b.branches)?b.branches:[];return{provider:"github",kind:"ci",action:"string"==typeof b.state?b.state:g,rawEventType:d,deliveryId:e,repository:f,branch:bO(a[0]?.name??b.ref),sha:"string"==typeof b.sha?b.sha:void 0,timestamp:bN(b.updated_at),data:b}}if("push"===d){let a=b.head_commit&&"object"==typeof b.head_commit?b.head_commit:void 0;return{provider:"github",kind:"push",action:g,rawEventType:d,deliveryId:e,repository:f,branch:bO(b.ref),sha:"string"==typeof b.after?b.after:void 0,timestamp:bN(a?.timestamp??b.updated_at),data:b}}return{provider:"github",kind:"unknown",action:g,rawEventType:d,deliveryId:e,repository:f,timestamp:bN(b.updated_at),data:b}}(a,d,c)},async detectPR(a,b){if(!a.branch||!b.repo)return null;bW(b.repo);let[c,d]=b.repo.split("/"),h=e(c??"",d??"",a.branch,"detectPR"),i=f(h);if(null!==i)return i;try{let c=await bT(["pr","list","--repo",b.repo,"--head",a.branch,"--json","number,url,title,headRefName,baseRefName,isDraft","--limit","1"]),d=JSON.parse(c);if(0===d.length)return null;let e=bX(d[0],b.repo);return g(h,e,b4.detectPR),e}catch{return null}},async resolvePR(a,b){if(!b.repo)throw Error("Cannot resolve PR: project has no repo configured");let c=b.repo,[d,e]=c.split("/");return j(d??"",e??"",`ref=${a}`,"resolvePR",async()=>bX(JSON.parse(await bT(["pr","view",a,"--repo",c,"--json","number,url,title,headRefName,baseRefName,isDraft"])),c))},async assignPRToCurrentUser(a){await bT(["pr","edit",String(a.number),"--repo",b2(a),"--add-assignee","@me"]),i(a)},async checkoutPR(a,b){if(await bV(["branch","--show-current"],b)===a.branch)return!1;if(await bV(["status","--porcelain"],b))throw Error(`Workspace has uncommitted changes; cannot switch to PR branch "${a.branch}" safely`);return await bU(["pr","checkout",String(a.number),"--repo",b2(a)],b),!0},getPRState:async a=>j(a.owner,a.repo,String(a.number),"getPRState",async()=>{let b=JSON.parse(await bT(["pr","view",String(a.number),"--repo",b2(a),"--json","state"])).state.toUpperCase();return"MERGED"===b?"merged":"CLOSED"===b?"closed":"open"}),getPRSummary:async a=>j(a.owner,a.repo,String(a.number),"getPRSummary",async()=>{let b=JSON.parse(await bT(["pr","view",String(a.number),"--repo",b2(a),"--json","state,title,additions,deletions"])),c=b.state.toUpperCase();return{state:"MERGED"===c?"merged":"CLOSED"===c?"closed":"open",title:b.title??"",additions:b.additions??0,deletions:b.deletions??0}}),async mergePR(a,b="squash"){await bT(["pr","merge",String(a.number),"--repo",b2(a),"rebase"===b?"--rebase":"merge"===b?"--merge":"--squash","--delete-branch"]),i(a)},async closePR(a){await bT(["pr","close",String(a.number),"--repo",b2(a)]),i(a)},getCIChecks:async a=>j(a.owner,a.repo,String(a.number),"getCIChecks",async()=>{try{let b=await bT(["pr","checks",String(a.number),"--repo",b2(a),"--json","name,state,link,startedAt,completedAt"]);return JSON.parse(b).map(a=>{let b=a.state?.toUpperCase();return{name:a.name,status:bY(b),url:a.link||void 0,conclusion:b||void 0,startedAt:a.startedAt?new Date(a.startedAt):void 0,completedAt:a.completedAt?new Date(a.completedAt):void 0}})}catch(b){if(b instanceof Error&&/pr checks/i.test(b.message)&&/unknown json field/i.test(b.message))return b0(a);throw Error("Failed to fetch CI checks",{cause:b})}}),async getCIFailureSummary(a,b){try{let c=(b??await this.getCIChecks(a)).filter(bZ);if(0===c.length)return null;let d=[],e=new Set;for(let b of c){let c=function(a){let b;if(!a.url)return null;try{b=new URL(a.url).pathname.split("/").filter(Boolean)}catch{return null}let c=b.findIndex((a,c)=>"actions"===a&&"runs"===b[c+1]),d=c>=0?b[c+2]:void 0;if(!d||!b$(d))return null;let e=b.findIndex((a,b)=>b>c&&"job"===a),f=e>=0?b[e+1]:void 0;return{runId:d,...f&&b$(f)?{jobId:f}:{},runUrl:a.url}}(b);if(!c)continue;let f=`${c.runId}:${c.jobId??""}`;if(e.has(f))continue;e.add(f);let g=await b_(a,c),h={name:b.name,runUrl:c.runUrl},i=function(a){let b;for(let c of a.split(/\r?\n/)){let a=c.split(" "),d=a.length>=3?a[1]?.trim():void 0;d&&(b=d)}return b}(g);i&&(h.failedStep=i);let j=function(a,b){let c=a.split(/\r?\n/).slice(-120).join("\n").trimEnd();return c.length>0?c:void 0}(g,0);j&&(h.logTail=j),d.push(h)}return d.length>0?{failedJobs:d}:null}catch{return null}},async getCISummary(a){let b;try{b=await this.getCIChecks(a)}catch(c){try{let b=await this.getPRState(a);if("merged"===b||"closed"===b)return"none"}catch{}let b=`${b2(a)}#${a.number}`;if(!bR.has(b)){bR.add(b);let e=c instanceof Error?c.message:String(c);(0,d.plx)({source:"scm",kind:"scm.ci_summary_failclosed",level:"warn",summary:`getCISummary failed-closed for PR #${a.number}`,data:{plugin:"scm-github",prNumber:a.number,prOwner:a.owner,prRepo:a.repo,errorMessage:e}})}return"failing"}return 0===b.length?"none":b.some(a=>"failed"===a.status)?"failing":b.some(a=>"pending"===a.status||"running"===a.status)?"pending":b.some(a=>"passed"===a.status)?"passing":"none"},getReviews:async a=>j(a.owner,a.repo,String(a.number),"getReviews",async()=>JSON.parse(await bT(["pr","view",String(a.number),"--repo",b2(a),"--json","reviews"])).reviews.map(a=>{let b,c=a.state?.toUpperCase();return b="APPROVED"===c?"approved":"CHANGES_REQUESTED"===c?"changes_requested":"DISMISSED"===c?"dismissed":"PENDING"===c?"pending":"commented",{author:a.author?.login??"unknown",state:b,body:a.body||void 0,submittedAt:b3(a.submittedAt)}})),getReviewDecision:async a=>j(a.owner,a.repo,String(a.number),"getReviewDecision",async()=>{let b=(JSON.parse(await bT(["pr","view",String(a.number),"--repo",b2(a),"--json","reviewDecision"])).reviewDecision??"").toUpperCase();return"APPROVED"===b?"approved":"CHANGES_REQUESTED"===b?"changes_requested":"REVIEW_REQUIRED"===b?"pending":"none"}),getPendingComments:async a=>j(a.owner,a.repo,String(a.number),"getPendingComments",async()=>{try{let b=await bT(["api","graphql","-f",`owner=${a.owner}`,"-f",`name=${a.repo}`,"-F",`number=${a.number}`,"-f",`query=query($owner: String!, $name: String!, $number: Int!) {
704
766
  repository(owner: $owner, name: $name) {
705
767
  pullRequest(number: $number) {
706
768
  reviewThreads(first: 100) {
@@ -722,7 +784,7 @@ process.stdin.on('data', c => input += c).on('end', () => {
722
784
  }
723
785
  }
724
786
  }
725
- }`]);return JSON.parse(b).data.repository.pullRequest.reviewThreads.nodes.filter(a=>{if(a.isResolved)return!1;let b=a.comments.nodes[0];if(!b)return!1;let c=b.author?.login??"";return!bP.has(c)}).map(a=>{let b=a.comments.nodes[0];return{id:b.id,threadId:a.id,author:b.author?.login??"unknown",body:b.body,path:b.path||void 0,line:b.line??void 0,isResolved:a.isResolved,createdAt:b2(b.createdAt),url:b.url}})}catch(a){throw Error("Failed to fetch pending comments",{cause:a})}}),async getReviewThreads(b){let d=`${b.owner}/${b.repo}#${b.number}`;if(!await bH(b.owner,b.repo,b.number,a)){let a=c.get(d);if(a)return a}try{let a=(await bS(["api","graphql","-i","-f",`owner=${b.owner}`,"-f",`name=${b.repo}`,"-F",`number=${b.number}`,"-f",`query=query($owner: String!, $name: String!, $number: Int!) {
787
+ }`]);return JSON.parse(b).data.repository.pullRequest.reviewThreads.nodes.filter(a=>{if(a.isResolved)return!1;let b=a.comments.nodes[0];if(!b)return!1;let c=b.author?.login??"";return!bQ.has(c)}).map(a=>{let b=a.comments.nodes[0];return{id:b.id,threadId:a.id,author:b.author?.login??"unknown",body:b.body,path:b.path||void 0,line:b.line??void 0,isResolved:a.isResolved,createdAt:b3(b.createdAt),url:b.url}})}catch(a){throw Error("Failed to fetch pending comments",{cause:a})}}),async getReviewThreads(b){let d=`${b.owner}/${b.repo}#${b.number}`;if(!await bI(b.owner,b.repo,b.number,a)){let a=c.get(d);if(a)return a}try{let a=(await bT(["api","graphql","-i","-f",`owner=${b.owner}`,"-f",`name=${b.repo}`,"-F",`number=${b.number}`,"-f",`query=query($owner: String!, $name: String!, $number: Int!) {
726
788
  repository(owner: $owner, name: $name) {
727
789
  pullRequest(number: $number) {
728
790
  reviewThreads(last: 100) {
@@ -753,7 +815,7 @@ process.stdin.on('data', c => input += c).on('end', () => {
753
815
  }
754
816
  }
755
817
  rateLimit { cost remaining resetAt }
756
- }`])).replace(/^[\s\S]*?\r?\n\r?\n/,""),e=JSON.parse(a),f=e.data.repository.pullRequest.reviewThreads.nodes,g=e.data.repository.pullRequest.reviews.nodes,h=f.filter(a=>!a.isResolved&&!!a.comments.nodes[0]).map(a=>{let b=a.comments.nodes[0],c=b.author?.login??"unknown";return{id:b.id,threadId:a.id,author:c,body:b.body,path:b.path||void 0,line:b.line??void 0,isResolved:a.isResolved,createdAt:b2(b.createdAt),url:b.url,isBot:bP.has(c)}}),i=g.filter(a=>a.body&&a.body.trim().length>0).map(a=>({author:a.author?.login??"unknown",state:a.state,body:a.body,submittedAt:b2(a.submittedAt)})),j={threads:h,reviews:i};return c.set(d,j),j}catch(c){let b=c instanceof Error?c.message:String(c);throw a?.log("warn",`[getReviewThreads] Failed for ${d}: ${b}`),Error("Failed to fetch review threads",{cause:c})}},async getMergeability(a){return j(a.owner,a.repo,String(a.number),"getMergeability",async()=>{let b=[];if("merged"===await this.getPRState(a))return{mergeable:!0,ciPassing:!0,approved:!0,noConflicts:!0,blockers:[]};let c=JSON.parse(await bS(["pr","view",String(a.number),"--repo",b1(a),"--json","mergeable,reviewDecision,mergeStateStatus,isDraft"])),e=await this.getCISummary(a),f=e===d.U10.PASSING||e===d.U10.NONE;f||b.push(`CI is ${e}`);let g=(c.reviewDecision??"").toUpperCase();"CHANGES_REQUESTED"===g?b.push("Changes requested in review"):"REVIEW_REQUIRED"===g&&b.push("Review required");let h=(c.mergeable??"").toUpperCase(),i=(c.mergeStateStatus??"").toUpperCase();return"CONFLICTING"===h?b.push("Merge conflicts"):("UNKNOWN"===h||""===h)&&b.push("Merge status unknown (GitHub is computing)"),"BEHIND"===i?b.push("Branch is behind base branch"):"BLOCKED"===i?b.push("Merge is blocked by branch protection"):"UNSTABLE"===i&&b.push("Required checks are failing"),c.isDraft&&b.push("PR is still a draft"),{mergeable:0===b.length,ciPassing:f,approved:"APPROVED"===g,noConflicts:"MERGEABLE"===h,blockers:b}})},enrichSessionsPRBatch:async(b,c,d)=>(c&&(a=c),(await bK(b,c,d)).enrichment),async preflight(a){a.intent.willClaimExistingPR&&await (0,d.TF_)("gh-cli-auth",async()=>{try{await bO("gh",["--version"])}catch{throw Error("GitHub CLI (gh) is not installed. Install it: https://cli.github.com/")}try{await bO("gh",["auth","status"])}catch{throw Error("GitHub CLI is not authenticated. Run: gh auth login")}})}}}()}};async function b5(a){try{return await (0,d.vQK)(a,{component:"tracker-github"},3e4)}catch(b){throw Error(`gh ${a.slice(0,3).join(" ")} failed: ${b.message}`,{cause:b})}}async function b6(){return(0,d.TF_)("gh-cli-auth",async()=>{try{await b5(["--version"])}catch{throw Error("GitHub CLI (gh) is not installed. Install it: https://cli.github.com/")}try{await b5(["auth","status"])}catch{throw Error("GitHub CLI is not authenticated. Run: gh auth login")}})}function b7(a,b){let c=function a(b){if(!(b instanceof Error))return"";let c=[b.message];return"string"==typeof b.stderr&&c.push(b.stderr),"string"==typeof b.stdout&&c.push(b.stdout),b.cause instanceof Error&&c.push(a(b.cause)),c.join("\n").toLowerCase()}(a);return!!c&&(c.includes("unknown json field")||c.includes("unknown field")||c.includes("invalid field"))&&c.includes(b.toLowerCase())}async function b8(a,b){let c=cb(b);try{return await b5(["issue","view",a,"--repo",c,"--json","number,title,body,url,state,stateReason,labels,assignees"])}catch(b){if(!b7(b,"stateReason"))throw b;return b5(["issue","view",a,"--repo",c,"--json","number,title,body,url,state,labels,assignees"])}}async function b9(a){let b=[...a,"--json","number,title,body,url,state,stateReason,labels,assignees"];try{return await b5(b)}catch(b){if(!b7(b,"stateReason"))throw b;return b5([...a,"--json","number,title,body,url,state,labels,assignees"])}}function ca(a,b){return"CLOSED"===a.toUpperCase()?b?.toUpperCase()==="NOT_PLANNED"?"cancelled":"closed":"open"}function cb(a){if(!a.repo)throw Error("GitHub tracker requires a 'repo' field in project config");return a.repo}function cc(a,b){return`${a}#${b.replace(/^#/,"")}`}let cd={manifest:{name:"github",slot:"tracker",description:"Tracker plugin: GitHub Issues",version:"0.1.0"},create:function(){let a=new Map,b=new Map,c={name:"github",async getIssue(c,d){let e=cb(d),f=function(b,c){let d=cc(b,c),e=a.get(d);return e?Date.now()>e.expiresAt?(a.delete(d),null):e.issue:null}(e,c);if(f)return f;let g=cc(e,c),h=b.get(g);if(h)return h;let i=(async()=>{let b=JSON.parse(await b8(c,d)),f={id:String(b.number),title:b.title,description:b.body??"",url:b.url,state:ca(b.state,b.stateReason),labels:b.labels.map(a=>a.name),assignee:b.assignees[0]?.login};if(a.size>=500){let b=a.keys().next().value;void 0!==b&&a.delete(b)}return a.set(cc(e,c),{issue:f,expiresAt:Date.now()+3e5}),f})();b.set(g,i);try{return await i}finally{b.delete(g)}},async isCompleted(a,b){let d=await c.getIssue(a,b);return"closed"===d.state||"cancelled"===d.state},issueUrl(a,b){let c=a.replace(/^#/,"");return`https://github.com/${cb(b)}/issues/${c}`},issueLabel(a,b){let c=a.match(/\/issues\/(\d+)/);if(c)return`#${c[1]}`;let d=a.split("/"),e=d[d.length-1];return e?`#${e}`:a},branchName(a,b){let c=a.replace(/^#/,"");return`feat/issue-${c}`},async generatePrompt(a,b){let c=await this.getIssue(a,b),d=[`You are working on GitHub issue #${c.id}: ${c.title}`,`Issue URL: ${c.url}`,""];return c.labels.length>0&&d.push(`Labels: ${c.labels.join(", ")}`),c.description&&d.push("## Description","",c.description),d.push("","The issue title, description, and labels above are current. Fetch comments or linked issues via `gh` only if you need additional context beyond what is provided here.","","Please implement the changes described in this issue. When done, commit and push your changes."),d.join("\n")},async listIssues(a,b){let c=["issue","list","--repo",cb(b),"--limit",String(a.limit??30)];return"closed"===a.state?c.push("--state","closed"):"all"===a.state?c.push("--state","all"):c.push("--state","open"),a.labels&&a.labels.length>0&&c.push("--label",a.labels.join(",")),a.assignee&&c.push("--assignee",a.assignee),JSON.parse(await b9(c)).map(a=>({id:String(a.number),title:a.title,description:a.body??"",url:a.url,state:ca(a.state,a.stateReason),labels:a.labels.map(a=>a.name),assignee:a.assignees[0]?.login}))},async updateIssue(b,c,d){let e=cb(d);a.delete(cc(e,b)),"closed"===c.state?await b5(["issue","close",b,"--repo",e]):"open"===c.state&&await b5(["issue","reopen",b,"--repo",e]),c.removeLabels&&c.removeLabels.length>0&&await b5(["issue","edit",b,"--repo",e,"--remove-label",c.removeLabels.join(",")]),c.labels&&c.labels.length>0&&await b5(["issue","edit",b,"--repo",e,"--add-label",c.labels.join(",")]),c.assignee&&await b5(["issue","edit",b,"--repo",e,"--add-assignee",c.assignee]),c.comment&&await b5(["issue","comment",b,"--repo",e,"--body",c.comment])},async createIssue(a,b){let d=["issue","create","--repo",cb(b),"--title",a.title,"--body",a.description??""];a.labels&&a.labels.length>0&&d.push("--label",a.labels.join(",")),a.assignee&&d.push("--assignee",a.assignee);let e=await b5(d),f=e.match(/\/issues\/(\d+)/);if(!f)throw Error(`Failed to parse issue URL from gh output: ${e}`);let g=f[1];return c.getIssue(g,b)},async preflight(){await b6()}};return c}};var ce=c(44708);let cf=!1;function cg(a){try{(0,d.plx)(a)}catch{}}class ch extends Error{constructor(a,b){super(`Linear API returned HTTP ${a}: ${b.slice(0,200)}`),this.status=a}get transient(){return 408===this.status||429===this.status||this.status>=500}}class ci extends Error{constructor(a){super(`Linear API network error: ${a}`)}}class cj extends Error{constructor(){super("Linear API request timed out after 30s")}}function ck(a){switch(a){case"completed":return"closed";case"canceled":return"cancelled";case"started":return"in_progress";default:return"open"}}let cl=`
818
+ }`])).replace(/^[\s\S]*?\r?\n\r?\n/,""),e=JSON.parse(a),f=e.data.repository.pullRequest.reviewThreads.nodes,g=e.data.repository.pullRequest.reviews.nodes,h=f.filter(a=>!a.isResolved&&!!a.comments.nodes[0]).map(a=>{let b=a.comments.nodes[0],c=b.author?.login??"unknown";return{id:b.id,threadId:a.id,author:c,body:b.body,path:b.path||void 0,line:b.line??void 0,isResolved:a.isResolved,createdAt:b3(b.createdAt),url:b.url,isBot:bQ.has(c)}}),i=g.filter(a=>a.body&&a.body.trim().length>0).map(a=>({author:a.author?.login??"unknown",state:a.state,body:a.body,submittedAt:b3(a.submittedAt)})),j={threads:h,reviews:i};return c.set(d,j),j}catch(c){let b=c instanceof Error?c.message:String(c);throw a?.log("warn",`[getReviewThreads] Failed for ${d}: ${b}`),Error("Failed to fetch review threads",{cause:c})}},async getMergeability(a){return j(a.owner,a.repo,String(a.number),"getMergeability",async()=>{let b=[];if("merged"===await this.getPRState(a))return{mergeable:!0,ciPassing:!0,approved:!0,noConflicts:!0,blockers:[]};let c=JSON.parse(await bT(["pr","view",String(a.number),"--repo",b2(a),"--json","mergeable,reviewDecision,mergeStateStatus,isDraft"])),e=await this.getCISummary(a),f=e===d.U10.PASSING||e===d.U10.NONE;f||b.push(`CI is ${e}`);let g=(c.reviewDecision??"").toUpperCase();"CHANGES_REQUESTED"===g?b.push("Changes requested in review"):"REVIEW_REQUIRED"===g&&b.push("Review required");let h=(c.mergeable??"").toUpperCase(),i=(c.mergeStateStatus??"").toUpperCase();return"CONFLICTING"===h?b.push("Merge conflicts"):("UNKNOWN"===h||""===h)&&b.push("Merge status unknown (GitHub is computing)"),"BEHIND"===i?b.push("Branch is behind base branch"):"BLOCKED"===i?b.push("Merge is blocked by branch protection"):"UNSTABLE"===i&&b.push("Required checks are failing"),c.isDraft&&b.push("PR is still a draft"),{mergeable:0===b.length,ciPassing:f,approved:"APPROVED"===g,noConflicts:"MERGEABLE"===h,blockers:b}})},enrichSessionsPRBatch:async(b,c,d)=>(c&&(a=c),(await bL(b,c,d)).enrichment),async preflight(a){a.intent.willClaimExistingPR&&await (0,d.TF_)("gh-cli-auth",async()=>{try{await bP("gh",["--version"])}catch{throw Error("GitHub CLI (gh) is not installed. Install it: https://cli.github.com/")}try{await bP("gh",["auth","status"])}catch{throw Error("GitHub CLI is not authenticated. Run: gh auth login")}})}}}()}};async function b6(a){try{return await (0,d.vQK)(a,{component:"tracker-github"},3e4)}catch(b){throw Error(`gh ${a.slice(0,3).join(" ")} failed: ${b.message}`,{cause:b})}}async function b7(){return(0,d.TF_)("gh-cli-auth",async()=>{try{await b6(["--version"])}catch{throw Error("GitHub CLI (gh) is not installed. Install it: https://cli.github.com/")}try{await b6(["auth","status"])}catch{throw Error("GitHub CLI is not authenticated. Run: gh auth login")}})}function b8(a,b){let c=function a(b){if(!(b instanceof Error))return"";let c=[b.message];return"string"==typeof b.stderr&&c.push(b.stderr),"string"==typeof b.stdout&&c.push(b.stdout),b.cause instanceof Error&&c.push(a(b.cause)),c.join("\n").toLowerCase()}(a);return!!c&&(c.includes("unknown json field")||c.includes("unknown field")||c.includes("invalid field"))&&c.includes(b.toLowerCase())}async function b9(a,b){let c=cc(b);try{return await b6(["issue","view",a,"--repo",c,"--json","number,title,body,url,state,stateReason,labels,assignees"])}catch(b){if(!b8(b,"stateReason"))throw b;return b6(["issue","view",a,"--repo",c,"--json","number,title,body,url,state,labels,assignees"])}}async function ca(a){let b=[...a,"--json","number,title,body,url,state,stateReason,labels,assignees"];try{return await b6(b)}catch(b){if(!b8(b,"stateReason"))throw b;return b6([...a,"--json","number,title,body,url,state,labels,assignees"])}}function cb(a,b){return"CLOSED"===a.toUpperCase()?b?.toUpperCase()==="NOT_PLANNED"?"cancelled":"closed":"open"}function cc(a){if(!a.repo)throw Error("GitHub tracker requires a 'repo' field in project config");return a.repo}function cd(a,b){return`${a}#${b.replace(/^#/,"")}`}let ce={manifest:{name:"github",slot:"tracker",description:"Tracker plugin: GitHub Issues",version:"0.1.0"},create:function(){let a=new Map,b=new Map,c={name:"github",async getIssue(c,d){let e=cc(d),f=function(b,c){let d=cd(b,c),e=a.get(d);return e?Date.now()>e.expiresAt?(a.delete(d),null):e.issue:null}(e,c);if(f)return f;let g=cd(e,c),h=b.get(g);if(h)return h;let i=(async()=>{let b=JSON.parse(await b9(c,d)),f={id:String(b.number),title:b.title,description:b.body??"",url:b.url,state:cb(b.state,b.stateReason),labels:b.labels.map(a=>a.name),assignee:b.assignees[0]?.login};if(a.size>=500){let b=a.keys().next().value;void 0!==b&&a.delete(b)}return a.set(cd(e,c),{issue:f,expiresAt:Date.now()+3e5}),f})();b.set(g,i);try{return await i}finally{b.delete(g)}},async isCompleted(a,b){let d=await c.getIssue(a,b);return"closed"===d.state||"cancelled"===d.state},issueUrl(a,b){let c=a.replace(/^#/,"");return`https://github.com/${cc(b)}/issues/${c}`},issueLabel(a,b){let c=a.match(/\/issues\/(\d+)/);if(c)return`#${c[1]}`;let d=a.split("/"),e=d[d.length-1];return e?`#${e}`:a},branchName(a,b){let c=a.replace(/^#/,"");return`feat/issue-${c}`},async generatePrompt(a,b){let c=await this.getIssue(a,b),d=[`You are working on GitHub issue #${c.id}: ${c.title}`,`Issue URL: ${c.url}`,""];return c.labels.length>0&&d.push(`Labels: ${c.labels.join(", ")}`),c.description&&d.push("## Description","",c.description),d.push("","The issue title, description, and labels above are current. Fetch comments or linked issues via `gh` only if you need additional context beyond what is provided here.","","Please implement the changes described in this issue. When done, commit and push your changes."),d.join("\n")},async listIssues(a,b){let c=["issue","list","--repo",cc(b),"--limit",String(a.limit??30)];return"closed"===a.state?c.push("--state","closed"):"all"===a.state?c.push("--state","all"):c.push("--state","open"),a.labels&&a.labels.length>0&&c.push("--label",a.labels.join(",")),a.assignee&&c.push("--assignee",a.assignee),JSON.parse(await ca(c)).map(a=>({id:String(a.number),title:a.title,description:a.body??"",url:a.url,state:cb(a.state,a.stateReason),labels:a.labels.map(a=>a.name),assignee:a.assignees[0]?.login}))},async updateIssue(b,c,d){let e=cc(d);a.delete(cd(e,b)),"closed"===c.state?await b6(["issue","close",b,"--repo",e]):"open"===c.state&&await b6(["issue","reopen",b,"--repo",e]),c.removeLabels&&c.removeLabels.length>0&&await b6(["issue","edit",b,"--repo",e,"--remove-label",c.removeLabels.join(",")]),c.labels&&c.labels.length>0&&await b6(["issue","edit",b,"--repo",e,"--add-label",c.labels.join(",")]),c.assignee&&await b6(["issue","edit",b,"--repo",e,"--add-assignee",c.assignee]),c.comment&&await b6(["issue","comment",b,"--repo",e,"--body",c.comment])},async createIssue(a,b){let d=["issue","create","--repo",cc(b),"--title",a.title,"--body",a.description??""];a.labels&&a.labels.length>0&&d.push("--label",a.labels.join(",")),a.assignee&&d.push("--assignee",a.assignee);let e=await b6(d),f=e.match(/\/issues\/(\d+)/);if(!f)throw Error(`Failed to parse issue URL from gh output: ${e}`);let g=f[1];return c.getIssue(g,b)},async preflight(){await b7()}};return c}};var cf=c(44708);let cg=!1;function ch(a){try{(0,d.plx)(a)}catch{}}class ci extends Error{constructor(a,b){super(`Linear API returned HTTP ${a}: ${b.slice(0,200)}`),this.status=a}get transient(){return 408===this.status||429===this.status||this.status>=500}}class cj extends Error{constructor(a){super(`Linear API network error: ${a}`)}}class ck extends Error{constructor(){super("Linear API request timed out after 30s")}}function cl(a){switch(a){case"completed":return"closed";case"canceled":return"cancelled";case"started":return"in_progress";default:return"open"}}let cm=`
757
819
  id
758
820
  identifier
759
821
  title
@@ -765,21 +827,21 @@ process.stdin.on('data', c => input += c).on('end', () => {
765
827
  labels { nodes { name } }
766
828
  assignee { name displayName }
767
829
  team { key }
768
- `;function cm(a){return{name:"linear",async getIssue(b,c){let d=(await a(`query($id: String!) {
830
+ `;function cn(a){return{name:"linear",async getIssue(b,c){let d=(await a(`query($id: String!) {
769
831
  issue(id: $id) {
770
- ${cl}
832
+ ${cm}
771
833
  }
772
- }`,{id:b})).issue;return{id:d.identifier,title:d.title,description:d.description??"",url:d.url,state:ck(d.state.type),labels:d.labels.nodes.map(a=>a.name),assignee:d.assignee?.displayName??d.assignee?.name,priority:d.priority,branchName:d.branchName??void 0}},async isCompleted(b,c){let d=(await a(`query($id: String!) {
834
+ }`,{id:b})).issue;return{id:d.identifier,title:d.title,description:d.description??"",url:d.url,state:cl(d.state.type),labels:d.labels.nodes.map(a=>a.name),assignee:d.assignee?.displayName??d.assignee?.name,priority:d.priority,branchName:d.branchName??void 0}},async isCompleted(b,c){let d=(await a(`query($id: String!) {
773
835
  issue(id: $id) {
774
836
  state { type }
775
837
  }
776
838
  }`,{id:b})).issue.state.type;return"completed"===d||"canceled"===d},issueUrl(a,b){let c=b.tracker?.workspaceSlug;return c?`https://linear.app/${c}/issue/${a}`:`https://linear.app/issue/${a}`},issueLabel(a,b){let c=a.match(/\/issue\/([A-Z]+-\d+)/);if(c)return c[1];let d=a.split("/");return d[d.length-1]||a},branchName:(a,b)=>`feat/${a}`,async generatePrompt(a,b){let c=await this.getIssue(a,b),d=[`You are working on Linear ticket ${c.id}: ${c.title}`,`Issue URL: ${c.url}`,""];return c.labels.length>0&&d.push(`Labels: ${c.labels.join(", ")}`),void 0!==c.priority&&d.push(`Priority: ${{0:"No priority",1:"Urgent",2:"High",3:"Normal",4:"Low"}[c.priority]??String(c.priority)}`),c.description&&d.push("## Description","",c.description),d.push("","Please implement the changes described in this ticket. When done, commit and push your changes."),d.join("\n")},async listIssues(b,c){let d={},e={};"closed"===b.state?d.state={type:{in:["completed","canceled"]}}:"all"!==b.state&&(d.state={type:{nin:["completed","canceled"]}}),b.assignee&&(d.assignee={displayName:{eq:b.assignee}}),b.labels&&b.labels.length>0&&(d.labels={name:{in:b.labels}});let f=c.tracker?.teamId;return f&&(d.team={id:{eq:f}}),e.filter=Object.keys(d).length>0?d:void 0,e.first=b.limit??30,(await a(`query($filter: IssueFilter, $first: Int!) {
777
839
  issues(filter: $filter, first: $first) {
778
840
  nodes {
779
- ${cl}
841
+ ${cm}
780
842
  }
781
843
  }
782
- }`,e)).issues.nodes.map(a=>({id:a.identifier,title:a.title,description:a.description??"",url:a.url,state:ck(a.state.type),labels:a.labels.nodes.map(a=>a.name),assignee:a.assignee?.displayName??a.assignee?.name,priority:a.priority,branchName:a.branchName??void 0}))},async updateIssue(b,c,d){let e=await a(`query($id: String!) {
844
+ }`,e)).issues.nodes.map(a=>({id:a.identifier,title:a.title,description:a.description??"",url:a.url,state:cl(a.state.type),labels:a.labels.nodes.map(a=>a.name),assignee:a.assignee?.displayName??a.assignee?.name,priority:a.priority,branchName:a.branchName??void 0}))},async updateIssue(b,c,d){let e=await a(`query($id: String!) {
783
845
  issue(id: $id) {
784
846
  id
785
847
  team { id }
@@ -825,10 +887,10 @@ process.stdin.on('data', c => input += c).on('end', () => {
825
887
  }) {
826
888
  success
827
889
  issue {
828
- ${cl}
890
+ ${cm}
829
891
  }
830
892
  }
831
- }`,e)).issueCreate.issue,g={id:f.identifier,title:f.title,description:f.description??"",url:f.url,state:ck(f.state.type),labels:f.labels.nodes.map(a=>a.name),assignee:f.assignee?.displayName??f.assignee?.name,priority:f.priority,branchName:f.branchName??void 0};if(b.assignee)try{let c=(await a(`query($filter: UserFilter) {
893
+ }`,e)).issueCreate.issue,g={id:f.identifier,title:f.title,description:f.description??"",url:f.url,state:cl(f.state.type),labels:f.labels.nodes.map(a=>a.name),assignee:f.assignee?.displayName??f.assignee?.name,priority:f.priority,branchName:f.branchName??void 0};if(b.assignee)try{let c=(await a(`query($filter: UserFilter) {
832
894
  users(filter: $filter) {
833
895
  nodes { id displayName name }
834
896
  }
@@ -844,4 +906,4 @@ process.stdin.on('data', c => input += c).on('end', () => {
844
906
  issueUpdate(id: $id, input: { labelIds: $labelIds }) {
845
907
  success
846
908
  }
847
- }`,{id:f.id,labelIds:i}),g.labels=h)}catch{}return g}}}let cn={manifest:{name:"linear",slot:"tracker",description:"Tracker plugin: Linear issue tracker",version:"0.1.0"},create:function(){let a=process.env.COMPOSIO_API_KEY;if(a){let b,e=process.env.COMPOSIO_ENTITY_ID??"default";return cm(async(f,g)=>{let h,i=(await (!b&&(b=(async()=>{try{let{Composio:b}=await c.e(4422).then(c.bind(c,64422));return new b({apiKey:a}).tools}catch(b){let a=b instanceof Error?b.message:String(b);if(a.includes("Cannot find module")||a.includes("Cannot find package")||a.includes("ERR_MODULE_NOT_FOUND"))throw cf||(cf=!0,(0,d.plx)({source:"tracker",kind:"tracker.dep_missing",level:"error",summary:"Composio SDK (@composio/core) is not installed",data:{plugin:"tracker-linear",package:"@composio/core",installHint:"pnpm add @composio/core"}})),Error("Composio SDK (@composio/core) is not installed. Install it with: pnpm add @composio/core",{cause:b});throw b}})()),b)).execute("LINEAR_RUN_QUERY_OR_MUTATION",{entityId:e,arguments:{query_or_mutation:f,variables:g?JSON.stringify(g):"{}"}}),j=new Promise((a,b)=>{h=setTimeout(()=>{cg({source:"tracker",kind:"tracker.api_timeout",level:"warn",summary:"Composio Linear API request timed out after 30s",data:{plugin:"tracker-linear",transport:"composio",timeoutMs:3e4}}),b(Error("Composio Linear API request timed out after 30s"))},3e4)});i.catch(()=>{}),j.catch(()=>{});try{let a=await Promise.race([i,j]);if(!a.successful)throw Error(`Composio Linear API error: ${a.error??"unknown error"}`);if(!a.data)throw Error("Composio Linear API returned no data");return a.data}finally{clearTimeout(h)}})}return cm(async(a,b)=>{let c=function(){let a=process.env.LINEAR_API_KEY;if(!a)throw Error("LINEAR_API_KEY environment variable is required for the Linear tracker plugin");return a}(),d=JSON.stringify({query:a,variables:b}),e=()=>new Promise((a,b)=>{let e=new URL("https://api.linear.app/graphql"),f=!1,g=a=>{f||(f=!0,a())},h=(0,ce.request)({hostname:e.hostname,path:e.pathname,method:"POST",headers:{"Content-Type":"application/json",Authorization:c,"Content-Length":Buffer.byteLength(d)}},c=>{let d=[];c.on("error",a=>g(()=>b(new ci(a.message)))),c.on("data",a=>d.push(a)),c.on("end",()=>{g(()=>{try{let e=Buffer.concat(d).toString("utf-8"),f=c.statusCode??0;if(f<200||f>=300)return void b(new ch(f,e));let g=JSON.parse(e);if(g.errors&&g.errors.length>0)return void b(Error(`Linear API error: ${g.errors[0].message}`));if(!g.data)return void b(Error("Linear API returned no data"));a(g.data)}catch(a){b(a)}})})});h.setTimeout(3e4,()=>{g(()=>{h.destroy(),cg({source:"tracker",kind:"tracker.api_timeout",level:"warn",summary:"Linear API request timed out after 30s",data:{plugin:"tracker-linear",transport:"direct",timeoutMs:3e4}}),b(new cj)})}),h.on("error",a=>g(()=>b(new ci(a.message)))),h.write(d),h.end()});for(let a=1;a<=3;a++)try{return await e()}catch(b){if(!((b instanceof ch?b.transient:b instanceof cj||b instanceof ci)&&a<3))throw b;await function(a){return new Promise(b=>setTimeout(b,a))}(500*a)}throw Error("unreachable")})}},co=globalThis;function cp(){if(co._aoServices)return Promise.resolve(co._aoServices);if(!co._aoServicesInit){let a=co._aoServicesGeneration??0,b=cr().then(b=>(co._aoServicesGeneration??0)!==a?(b.lifecycleManager.stop(),cp()):(co._aoServices=b,b)).catch(a=>{throw co._aoServicesInit===b&&(co._aoServicesInit=void 0),a});co._aoServicesInit=b}return co._aoServicesInit}function cq(){co._aoServicesGeneration=(co._aoServicesGeneration??0)+1,co._aoServices&&co._aoServices.lifecycleManager.stop(),co._aoServices=void 0,co._aoServicesInit=void 0}async function cr(){let a=function(){let a=(0,d.NoB)();try{return(0,d.Z9L)(a)}catch(a){if(a instanceof Error&&"code"in a&&"ENOENT"===a.code||a instanceof d.kw3)return(0,d.Z9L)();throw a}}(),b=(0,d.RaB)();b.register(p),b.register(D),b.register(W),b.register(ar),b.register(av),b.register(aS),b.register(a5),b.register(a9),b.register(bp),b.register(b4),b.register(cd),b.register(cn);let c=(0,d.Qum)({config:a,registry:b}),e=(0,d.C1z)({config:a,registry:b,sessionManager:c});return{config:a,registry:b,sessionManager:c,lifecycleManager:e}}let cs="agent:backlog",ct=globalThis;function cu(){ct._aoBacklogStarted||(ct._aoBacklogStarted=!0,cy(),ct._aoBacklogTimer=setInterval(()=>void cy(),6e4))}let cv=new Set;async function cw(a,b,c){for(let d of a.filter(a=>"merged"===a.lifecycle.pr.state&&a.issueId&&!cv.has(`${a.projectId}:${a.issueId}`))){let a=`${d.projectId}:${d.issueId}`,e=b.projects[d.projectId];if(!e?.tracker?.plugin){cv.add(a);continue}let f=c.get("tracker",e.tracker.plugin);if(!f?.updateIssue){cv.add(a);continue}let g=d.issueId;if(!g){cv.add(a);continue}try{await f.updateIssue(g,{labels:["merged-unverified"],removeLabels:["agent:backlog","agent:in-progress"],comment:"PR merged. Issue awaiting human verification on staging."},e)}catch(a){console.error(`[backlog] Failed to close issue ${d.issueId}:`,a)}cv.add(a)}}async function cx(a,b){for(let[,c]of Object.entries(a.projects)){let a;if(!c.tracker?.plugin)continue;let d=b.get("tracker",c.tracker.plugin);if(d?.listIssues&&d.updateIssue){try{a=await d.listIssues({state:"open",labels:["agent:done"],limit:20},c)}catch{continue}for(let b of a)try{await d.updateIssue(b.id,{labels:[cs],removeLabels:["agent:done"],comment:"Issue reopened — returning to agent backlog."},c),console.log(`[backlog] Relabeled reopened issue ${b.id} → ${cs}`)}catch(a){console.error(`[backlog] Failed to relabel reopened issue ${b.id}:`,a)}}}}async function cy(){try{let{config:a,registry:b,sessionManager:c}=await cp(),e=await c.list();await cw(e,a,b),await cx(a,b);let f=Object.entries(a.projects).map(([a,b])=>b.sessionPrefix??a),g=e.filter(b=>!(0,d.tTz)(b,a.projects[b.projectId]?.sessionPrefix??b.projectId,f)&&!d.CMu.has(b.status)),h=new Set(g.map(a=>a.issueId?.toLowerCase()).filter(a=>!!a)),i=5-g.length;if(i<=0)return;for(let[d,e]of Object.entries(a.projects)){let a;if(i<=0)break;if(!e.tracker?.plugin)continue;let f=b.get("tracker",e.tracker.plugin);if(f?.listIssues){try{a=await f.listIssues({state:"open",labels:[cs],limit:10},e)}catch{continue}for(let b of a){if(i<=0)break;if(!h.has(b.id.toLowerCase()))try{await c.spawn({projectId:d,issueId:b.id}),i--,h.add(b.id.toLowerCase()),f.updateIssue&&await f.updateIssue(b.id,{labels:["agent:in-progress"],removeLabels:["agent:backlog"],comment:"Claimed by agent orchestrator — session spawned."},e)}catch(a){console.error(`[backlog] Failed to spawn session for issue ${b.id}:`,a)}}}}}catch(a){console.error("[backlog] Poll failed:",a)}}async function cz(){let a=[];try{let{config:b,registry:c}=await cp();for(let[d,e]of Object.entries(b.projects)){if(!e.tracker?.plugin)continue;let b=c.get("tracker",e.tracker.plugin);if(b?.listIssues)try{for(let c of(await b.listIssues({state:"open",labels:[cs],limit:20},e)))a.push({...c,projectId:d})}catch{}}}catch{}return a}async function cA(){let a=[];try{let{config:b,registry:c}=await cp();for(let[d,e]of Object.entries(b.projects)){if(!e.tracker?.plugin)continue;let b=c.get("tracker",e.tracker.plugin);if(b?.listIssues)try{for(let c of(await b.listIssues({state:"open",labels:["merged-unverified"],limit:20},e)))a.push({...c,projectId:d})}catch{}}}catch{}return a}function cB(a,b){return b?.scm?.plugin?a.get("scm",b.scm.plugin):null}}};
909
+ }`,{id:f.id,labelIds:i}),g.labels=h)}catch{}return g}}}let co={manifest:{name:"linear",slot:"tracker",description:"Tracker plugin: Linear issue tracker",version:"0.1.0"},create:function(){let a=process.env.COMPOSIO_API_KEY;if(a){let b,e=process.env.COMPOSIO_ENTITY_ID??"default";return cn(async(f,g)=>{let h,i=(await (!b&&(b=(async()=>{try{let{Composio:b}=await c.e(4422).then(c.bind(c,64422));return new b({apiKey:a}).tools}catch(b){let a=b instanceof Error?b.message:String(b);if(a.includes("Cannot find module")||a.includes("Cannot find package")||a.includes("ERR_MODULE_NOT_FOUND"))throw cg||(cg=!0,(0,d.plx)({source:"tracker",kind:"tracker.dep_missing",level:"error",summary:"Composio SDK (@composio/core) is not installed",data:{plugin:"tracker-linear",package:"@composio/core",installHint:"pnpm add @composio/core"}})),Error("Composio SDK (@composio/core) is not installed. Install it with: pnpm add @composio/core",{cause:b});throw b}})()),b)).execute("LINEAR_RUN_QUERY_OR_MUTATION",{entityId:e,arguments:{query_or_mutation:f,variables:g?JSON.stringify(g):"{}"}}),j=new Promise((a,b)=>{h=setTimeout(()=>{ch({source:"tracker",kind:"tracker.api_timeout",level:"warn",summary:"Composio Linear API request timed out after 30s",data:{plugin:"tracker-linear",transport:"composio",timeoutMs:3e4}}),b(Error("Composio Linear API request timed out after 30s"))},3e4)});i.catch(()=>{}),j.catch(()=>{});try{let a=await Promise.race([i,j]);if(!a.successful)throw Error(`Composio Linear API error: ${a.error??"unknown error"}`);if(!a.data)throw Error("Composio Linear API returned no data");return a.data}finally{clearTimeout(h)}})}return cn(async(a,b)=>{let c=function(){let a=process.env.LINEAR_API_KEY;if(!a)throw Error("LINEAR_API_KEY environment variable is required for the Linear tracker plugin");return a}(),d=JSON.stringify({query:a,variables:b}),e=()=>new Promise((a,b)=>{let e=new URL("https://api.linear.app/graphql"),f=!1,g=a=>{f||(f=!0,a())},h=(0,cf.request)({hostname:e.hostname,path:e.pathname,method:"POST",headers:{"Content-Type":"application/json",Authorization:c,"Content-Length":Buffer.byteLength(d)}},c=>{let d=[];c.on("error",a=>g(()=>b(new cj(a.message)))),c.on("data",a=>d.push(a)),c.on("end",()=>{g(()=>{try{let e=Buffer.concat(d).toString("utf-8"),f=c.statusCode??0;if(f<200||f>=300)return void b(new ci(f,e));let g=JSON.parse(e);if(g.errors&&g.errors.length>0)return void b(Error(`Linear API error: ${g.errors[0].message}`));if(!g.data)return void b(Error("Linear API returned no data"));a(g.data)}catch(a){b(a)}})})});h.setTimeout(3e4,()=>{g(()=>{h.destroy(),ch({source:"tracker",kind:"tracker.api_timeout",level:"warn",summary:"Linear API request timed out after 30s",data:{plugin:"tracker-linear",transport:"direct",timeoutMs:3e4}}),b(new ck)})}),h.on("error",a=>g(()=>b(new cj(a.message)))),h.write(d),h.end()});for(let a=1;a<=3;a++)try{return await e()}catch(b){if(!((b instanceof ci?b.transient:b instanceof ck||b instanceof cj)&&a<3))throw b;await function(a){return new Promise(b=>setTimeout(b,a))}(500*a)}throw Error("unreachable")})}},cp=globalThis;function cq(){if(cp._aoServices)return Promise.resolve(cp._aoServices);if(!cp._aoServicesInit){let a=cp._aoServicesGeneration??0,b=cs().then(b=>(cp._aoServicesGeneration??0)!==a?(b.lifecycleManager.stop(),cq()):(cp._aoServices=b,b)).catch(a=>{throw cp._aoServicesInit===b&&(cp._aoServicesInit=void 0),a});cp._aoServicesInit=b}return cp._aoServicesInit}function cr(){cp._aoServicesGeneration=(cp._aoServicesGeneration??0)+1,cp._aoServices&&cp._aoServices.lifecycleManager.stop(),cp._aoServices=void 0,cp._aoServicesInit=void 0}async function cs(){let a=function(){let a=(0,d.NoB)();try{return(0,d.Z9L)(a)}catch(a){if(a instanceof Error&&"code"in a&&"ENOENT"===a.code||a instanceof d.kw3)try{return(0,d.Z9L)()}catch(a){if(a instanceof d.kw3)return function(){let a=(0,d.$ry)({projects:{}});return a.configPath="",a.degradedProjects={},a}();throw a}throw a}}(),b=(0,d.RaB)();b.register(p),b.register(D),b.register(X),b.register(as),b.register(aw),b.register(aT),b.register(a6),b.register(ba),b.register(bq),b.register(b5),b.register(ce),b.register(co);let c=(0,d.Qum)({config:a,registry:b}),e=(0,d.C1z)({config:a,registry:b,sessionManager:c});return{config:a,registry:b,sessionManager:c,lifecycleManager:e}}let ct="agent:backlog",cu=globalThis;function cv(){cu._aoBacklogStarted||(cu._aoBacklogStarted=!0,cz(),cu._aoBacklogTimer=setInterval(()=>void cz(),6e4))}let cw=new Set;async function cx(a,b,c){for(let d of a.filter(a=>"merged"===a.lifecycle.pr.state&&a.issueId&&!cw.has(`${a.projectId}:${a.issueId}`))){let a=`${d.projectId}:${d.issueId}`,e=b.projects[d.projectId];if(!e?.tracker?.plugin){cw.add(a);continue}let f=c.get("tracker",e.tracker.plugin);if(!f?.updateIssue){cw.add(a);continue}let g=d.issueId;if(!g){cw.add(a);continue}try{await f.updateIssue(g,{labels:["merged-unverified"],removeLabels:["agent:backlog","agent:in-progress"],comment:"PR merged. Issue awaiting human verification on staging."},e)}catch(a){console.error(`[backlog] Failed to close issue ${d.issueId}:`,a)}cw.add(a)}}async function cy(a,b){for(let[,c]of Object.entries(a.projects)){let a;if(!c.tracker?.plugin)continue;let d=b.get("tracker",c.tracker.plugin);if(d?.listIssues&&d.updateIssue){try{a=await d.listIssues({state:"open",labels:["agent:done"],limit:20},c)}catch{continue}for(let b of a)try{await d.updateIssue(b.id,{labels:[ct],removeLabels:["agent:done"],comment:"Issue reopened — returning to agent backlog."},c),console.log(`[backlog] Relabeled reopened issue ${b.id} → ${ct}`)}catch(a){console.error(`[backlog] Failed to relabel reopened issue ${b.id}:`,a)}}}}async function cz(){try{let{config:a,registry:b,sessionManager:c}=await cq(),e=await c.list();await cx(e,a,b),await cy(a,b);let f=Object.entries(a.projects).map(([a,b])=>b.sessionPrefix??a),g=e.filter(b=>!(0,d.tTz)(b,a.projects[b.projectId]?.sessionPrefix??b.projectId,f)&&!d.CMu.has(b.status)),h=new Set(g.map(a=>a.issueId?.toLowerCase()).filter(a=>!!a)),i=5-g.length;if(i<=0)return;for(let[d,e]of Object.entries(a.projects)){let a;if(i<=0)break;if(!e.tracker?.plugin)continue;let f=b.get("tracker",e.tracker.plugin);if(f?.listIssues){try{a=await f.listIssues({state:"open",labels:[ct],limit:10},e)}catch{continue}for(let b of a){if(i<=0)break;if(!h.has(b.id.toLowerCase()))try{await c.spawn({projectId:d,issueId:b.id}),i--,h.add(b.id.toLowerCase()),f.updateIssue&&await f.updateIssue(b.id,{labels:["agent:in-progress"],removeLabels:["agent:backlog"],comment:"Claimed by agent orchestrator — session spawned."},e)}catch(a){console.error(`[backlog] Failed to spawn session for issue ${b.id}:`,a)}}}}}catch(a){console.error("[backlog] Poll failed:",a)}}async function cA(){let a=[];try{let{config:b,registry:c}=await cq();for(let[d,e]of Object.entries(b.projects)){if(!e.tracker?.plugin)continue;let b=c.get("tracker",e.tracker.plugin);if(b?.listIssues)try{for(let c of(await b.listIssues({state:"open",labels:[ct],limit:20},e)))a.push({...c,projectId:d})}catch{}}}catch{}return a}async function cB(){let a=[];try{let{config:b,registry:c}=await cq();for(let[d,e]of Object.entries(b.projects)){if(!e.tracker?.plugin)continue;let b=c.get("tracker",e.tracker.plugin);if(b?.listIssues)try{for(let c of(await b.listIssues({state:"open",labels:["merged-unverified"],limit:20},e)))a.push({...c,projectId:d})}catch{}}}catch{}return a}function cC(a,b){return b?.scm?.plugin?a.get("scm",b.scm.plugin):null}}};