vibepulse 0.2.2 → 0.3.1-beta

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 (424) hide show
  1. package/.next/BUILD_ID +1 -1
  2. package/.next/app-path-routes-manifest.json +1 -0
  3. package/.next/build-manifest.json +2 -2
  4. package/.next/cache/.previewinfo +1 -1
  5. package/.next/cache/.rscinfo +1 -1
  6. package/.next/cache/.tsbuildinfo +1 -1
  7. package/.next/cache/config.json +3 -3
  8. package/.next/fallback-build-manifest.json +2 -2
  9. package/.next/prerender-manifest.json +3 -3
  10. package/.next/routes-manifest.json +8 -0
  11. package/.next/server/app/_global-error/page.js +1 -1
  12. package/.next/server/app/_global-error/page.js.nft.json +1 -1
  13. package/.next/server/app/_global-error.html +2 -2
  14. package/.next/server/app/_global-error.rsc +1 -1
  15. package/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  16. package/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  17. package/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  18. package/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  19. package/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  20. package/.next/server/app/_not-found/page.js +1 -1
  21. package/.next/server/app/_not-found/page.js.nft.json +1 -1
  22. package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  23. package/.next/server/app/_not-found.html +1 -1
  24. package/.next/server/app/_not-found.rsc +2 -2
  25. package/.next/server/app/_not-found.segments/_full.segment.rsc +2 -2
  26. package/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  27. package/.next/server/app/_not-found.segments/_index.segment.rsc +2 -2
  28. package/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  29. package/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  30. package/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
  31. package/.next/server/app/api/node/events/route.js +2 -2
  32. package/.next/server/app/api/node/events/route.js.nft.json +1 -1
  33. package/.next/server/app/api/node/sessions/[id]/delete/route.js +2 -2
  34. package/.next/server/app/api/node/sessions/[id]/delete/route.js.nft.json +1 -1
  35. package/.next/server/app/api/node/sessions/[id]/open-editor/route.js +2 -2
  36. package/.next/server/app/api/node/sessions/[id]/open-editor/route.js.nft.json +1 -1
  37. package/.next/server/app/api/node/sessions/route.js +6 -4
  38. package/.next/server/app/api/node/sessions/route.js.nft.json +1 -1
  39. package/.next/server/app/api/nodes/route.js +2 -2
  40. package/.next/server/app/api/nodes/route.js.nft.json +1 -1
  41. package/.next/server/app/api/opencode-config/route.js +2 -2
  42. package/.next/server/app/api/opencode-config/route.js.nft.json +1 -1
  43. package/.next/server/app/api/opencode-config/status/route.js +2 -2
  44. package/.next/server/app/api/opencode-config/status/route.js.nft.json +1 -1
  45. package/.next/server/app/api/opencode-events/route.js +3 -3
  46. package/.next/server/app/api/opencode-events/route.js.nft.json +1 -1
  47. package/.next/server/app/api/profiles/[id]/apply/route.js +2 -2
  48. package/.next/server/app/api/profiles/[id]/apply/route.js.nft.json +1 -1
  49. package/.next/server/app/api/profiles/[id]/export/route.js +2 -2
  50. package/.next/server/app/api/profiles/[id]/export/route.js.nft.json +1 -1
  51. package/.next/server/app/api/profiles/[id]/route.js +2 -2
  52. package/.next/server/app/api/profiles/[id]/route.js.nft.json +1 -1
  53. package/.next/server/app/api/profiles/import/route.js +2 -2
  54. package/.next/server/app/api/profiles/import/route.js.nft.json +1 -1
  55. package/.next/server/app/api/profiles/route.js +2 -2
  56. package/.next/server/app/api/profiles/route.js.nft.json +1 -1
  57. package/.next/server/app/api/sessions/[id]/archive/route.js +3 -2
  58. package/.next/server/app/api/sessions/[id]/archive/route.js.nft.json +1 -1
  59. package/.next/server/app/api/sessions/[id]/delete/route.js +4 -3
  60. package/.next/server/app/api/sessions/[id]/delete/route.js.nft.json +1 -1
  61. package/.next/server/app/api/sessions/[id]/open-editor/route.js +2 -2
  62. package/.next/server/app/api/sessions/[id]/open-editor/route.js.nft.json +1 -1
  63. package/.next/server/app/api/sessions/[id]/restore/route/app-paths-manifest.json +3 -0
  64. package/.next/server/app/api/sessions/[id]/restore/route/build-manifest.json +11 -0
  65. package/.next/server/app/api/sessions/[id]/restore/route/server-reference-manifest.json +4 -0
  66. package/.next/server/app/api/sessions/[id]/restore/route.js +8 -0
  67. package/.next/server/app/api/sessions/[id]/restore/route.js.map +5 -0
  68. package/.next/server/app/api/sessions/[id]/restore/route.js.nft.json +1 -0
  69. package/.next/server/app/api/sessions/[id]/restore/route_client-reference-manifest.js +2 -0
  70. package/.next/server/app/api/sessions/[id]/route.js +2 -2
  71. package/.next/server/app/api/sessions/[id]/route.js.nft.json +1 -1
  72. package/.next/server/app/api/sessions/route.js +5 -3
  73. package/.next/server/app/api/sessions/route.js.nft.json +1 -1
  74. package/.next/server/app/index.html +1 -1
  75. package/.next/server/app/index.rsc +3 -3
  76. package/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
  77. package/.next/server/app/index.segments/_full.segment.rsc +3 -3
  78. package/.next/server/app/index.segments/_head.segment.rsc +1 -1
  79. package/.next/server/app/index.segments/_index.segment.rsc +2 -2
  80. package/.next/server/app/index.segments/_tree.segment.rsc +2 -2
  81. package/.next/server/app/page_client-reference-manifest.js +1 -1
  82. package/.next/server/app-paths-manifest.json +1 -0
  83. package/.next/server/chunks/[root-of-the-server]__005eb0c5._.js +3 -0
  84. package/.next/server/chunks/[root-of-the-server]__005eb0c5._.js.map +1 -0
  85. package/.next/server/chunks/[root-of-the-server]__09e90d57._.js +3 -0
  86. package/.next/server/chunks/[root-of-the-server]__09e90d57._.js.map +1 -0
  87. package/.next/server/chunks/[root-of-the-server]__18dd0ce9._.js +3 -0
  88. package/.next/server/chunks/[root-of-the-server]__18dd0ce9._.js.map +1 -0
  89. package/.next/server/chunks/[root-of-the-server]__19468536._.js +3 -0
  90. package/.next/server/chunks/[root-of-the-server]__19468536._.js.map +1 -0
  91. package/.next/server/chunks/[root-of-the-server]__1b87ec42._.js +1 -1
  92. package/.next/server/chunks/[root-of-the-server]__1b87ec42._.js.map +1 -1
  93. package/.next/server/chunks/[root-of-the-server]__2b912935._.js +3 -0
  94. package/.next/server/chunks/[root-of-the-server]__2b912935._.js.map +1 -0
  95. package/.next/server/chunks/[root-of-the-server]__303d3bac._.js +3 -0
  96. package/.next/server/chunks/[root-of-the-server]__303d3bac._.js.map +1 -0
  97. package/.next/server/chunks/[root-of-the-server]__3fac2b91._.js +5 -0
  98. package/.next/server/chunks/[root-of-the-server]__3fac2b91._.js.map +1 -0
  99. package/.next/server/chunks/[root-of-the-server]__43440b8d._.js +3 -0
  100. package/.next/server/chunks/[root-of-the-server]__43440b8d._.js.map +1 -0
  101. package/.next/server/chunks/[root-of-the-server]__438f8bbe._.js +3 -0
  102. package/.next/server/chunks/[root-of-the-server]__438f8bbe._.js.map +1 -0
  103. package/.next/server/chunks/[root-of-the-server]__4a0bfb55._.js +3 -0
  104. package/.next/server/chunks/[root-of-the-server]__4a0bfb55._.js.map +1 -0
  105. package/.next/server/chunks/[root-of-the-server]__534c3949._.js +3 -0
  106. package/.next/server/chunks/[root-of-the-server]__534c3949._.js.map +1 -0
  107. package/.next/server/chunks/[root-of-the-server]__59160266._.js +1 -1
  108. package/.next/server/chunks/[root-of-the-server]__59160266._.js.map +1 -1
  109. package/.next/server/chunks/[root-of-the-server]__6f812da0._.js +3 -0
  110. package/.next/server/chunks/[root-of-the-server]__6f812da0._.js.map +1 -0
  111. package/.next/server/chunks/[root-of-the-server]__71aac504._.js +3 -0
  112. package/.next/server/chunks/[root-of-the-server]__71aac504._.js.map +1 -0
  113. package/.next/server/chunks/[root-of-the-server]__907a8bf2._.js +3 -0
  114. package/.next/server/chunks/[root-of-the-server]__907a8bf2._.js.map +1 -0
  115. package/.next/server/chunks/[root-of-the-server]__92089220._.js +3 -0
  116. package/.next/server/chunks/[root-of-the-server]__92089220._.js.map +1 -0
  117. package/.next/server/chunks/[root-of-the-server]__9b7bc2d0._.js +3 -0
  118. package/.next/server/chunks/[root-of-the-server]__9b7bc2d0._.js.map +1 -0
  119. package/.next/server/chunks/[root-of-the-server]__b2640944._.js +3 -0
  120. package/.next/server/chunks/[root-of-the-server]__b2640944._.js.map +1 -0
  121. package/.next/server/chunks/[root-of-the-server]__c2267cf1._.js +3 -0
  122. package/.next/server/chunks/[root-of-the-server]__c2267cf1._.js.map +1 -0
  123. package/.next/server/chunks/[root-of-the-server]__d7f7e6dd._.js +3 -0
  124. package/.next/server/chunks/{[root-of-the-server]__6924c09d._.js.map → [root-of-the-server]__d7f7e6dd._.js.map} +1 -1
  125. package/.next/server/chunks/[root-of-the-server]__d8e61048._.js +1 -1
  126. package/.next/server/chunks/[root-of-the-server]__d8e61048._.js.map +1 -1
  127. package/.next/server/chunks/[root-of-the-server]__f6d0d488._.js +3 -0
  128. package/.next/server/chunks/{[root-of-the-server]__192ed2f4._.js.map → [root-of-the-server]__f6d0d488._.js.map} +1 -1
  129. package/.next/server/chunks/[root-of-the-server]__fa559e1e._.js +3 -0
  130. package/.next/server/chunks/[root-of-the-server]__fa559e1e._.js.map +1 -0
  131. package/.next/server/chunks/_next-internal_server_app_api_sessions_[id]_restore_route_actions_af7d6b6c.js +3 -0
  132. package/.next/server/chunks/_next-internal_server_app_api_sessions_[id]_restore_route_actions_af7d6b6c.js.map +1 -0
  133. package/.next/server/chunks/node_modules_next_dist_esm_build_templates_app-route_7e181e75.js +1 -1
  134. package/.next/server/chunks/node_modules_next_dist_esm_build_templates_app-route_7e181e75.js.map +1 -1
  135. package/.next/server/chunks/node_modules_next_dist_esm_build_templates_app-route_aca45402.js +1 -1
  136. package/.next/server/chunks/node_modules_next_dist_esm_build_templates_app-route_aca45402.js.map +1 -1
  137. package/.next/server/chunks/node_modules_next_dist_esm_build_templates_app-route_b054aff3.js +1 -1
  138. package/.next/server/chunks/node_modules_next_dist_esm_build_templates_app-route_b054aff3.js.map +1 -1
  139. package/.next/server/chunks/node_modules_next_dist_esm_build_templates_app-route_fa835ac3.js +2 -2
  140. package/.next/server/chunks/node_modules_next_dist_esm_build_templates_app-route_fa835ac3.js.map +1 -1
  141. package/.next/server/chunks/src_lib_opencodeConfig_ts_8e209941._.js +3 -0
  142. package/.next/server/chunks/src_lib_opencodeConfig_ts_8e209941._.js.map +1 -0
  143. package/.next/server/chunks/src_lib_session-providers_claudeCode_ts_0f9590ed._.js +3 -0
  144. package/.next/server/chunks/src_lib_session-providers_claudeCode_ts_0f9590ed._.js.map +1 -0
  145. package/.next/server/chunks/ssr/{[root-of-the-server]__631e12d0._.js → [root-of-the-server]__c91a8380._.js} +2 -2
  146. package/.next/server/chunks/ssr/{[root-of-the-server]__631e12d0._.js.map → [root-of-the-server]__c91a8380._.js.map} +1 -1
  147. package/.next/server/chunks/ssr/src_app_page_tsx_a7111f3e._.js +3 -3
  148. package/.next/server/chunks/ssr/src_app_page_tsx_a7111f3e._.js.map +1 -1
  149. package/.next/server/pages/404.html +1 -1
  150. package/.next/server/pages/500.html +2 -2
  151. package/.next/server/server-reference-manifest.js +1 -1
  152. package/.next/server/server-reference-manifest.json +1 -1
  153. package/.next/standalone/.next/BUILD_ID +1 -1
  154. package/.next/standalone/.next/app-path-routes-manifest.json +1 -0
  155. package/.next/standalone/.next/build-manifest.json +2 -2
  156. package/.next/standalone/.next/prerender-manifest.json +3 -3
  157. package/.next/standalone/.next/routes-manifest.json +8 -0
  158. package/.next/standalone/.next/server/app/_global-error/page.js +1 -1
  159. package/.next/standalone/.next/server/app/_global-error/page.js.nft.json +1 -1
  160. package/.next/standalone/.next/server/app/_global-error.html +2 -2
  161. package/.next/standalone/.next/server/app/_global-error.rsc +1 -1
  162. package/.next/standalone/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  163. package/.next/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  164. package/.next/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  165. package/.next/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  166. package/.next/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  167. package/.next/standalone/.next/server/app/_not-found/page.js +1 -1
  168. package/.next/standalone/.next/server/app/_not-found/page.js.nft.json +1 -1
  169. package/.next/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  170. package/.next/standalone/.next/server/app/_not-found.html +1 -1
  171. package/.next/standalone/.next/server/app/_not-found.rsc +2 -2
  172. package/.next/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +2 -2
  173. package/.next/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  174. package/.next/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +2 -2
  175. package/.next/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  176. package/.next/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  177. package/.next/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
  178. package/.next/standalone/.next/server/app/api/node/events/route.js +2 -2
  179. package/.next/standalone/.next/server/app/api/node/events/route.js.nft.json +1 -1
  180. package/.next/standalone/.next/server/app/api/node/sessions/[id]/delete/route.js +2 -2
  181. package/.next/standalone/.next/server/app/api/node/sessions/[id]/delete/route.js.nft.json +1 -1
  182. package/.next/standalone/.next/server/app/api/node/sessions/[id]/open-editor/route.js +2 -2
  183. package/.next/standalone/.next/server/app/api/node/sessions/[id]/open-editor/route.js.nft.json +1 -1
  184. package/.next/standalone/.next/server/app/api/node/sessions/route.js +6 -4
  185. package/.next/standalone/.next/server/app/api/node/sessions/route.js.nft.json +1 -1
  186. package/.next/standalone/.next/server/app/api/nodes/route.js +2 -2
  187. package/.next/standalone/.next/server/app/api/nodes/route.js.nft.json +1 -1
  188. package/.next/standalone/.next/server/app/api/opencode-config/route.js +2 -2
  189. package/.next/standalone/.next/server/app/api/opencode-config/route.js.nft.json +1 -1
  190. package/.next/standalone/.next/server/app/api/opencode-config/status/route.js +2 -2
  191. package/.next/standalone/.next/server/app/api/opencode-config/status/route.js.nft.json +1 -1
  192. package/.next/standalone/.next/server/app/api/opencode-events/route.js +3 -3
  193. package/.next/standalone/.next/server/app/api/opencode-events/route.js.nft.json +1 -1
  194. package/.next/standalone/.next/server/app/api/profiles/[id]/apply/route.js +2 -2
  195. package/.next/standalone/.next/server/app/api/profiles/[id]/apply/route.js.nft.json +1 -1
  196. package/.next/standalone/.next/server/app/api/profiles/[id]/export/route.js +2 -2
  197. package/.next/standalone/.next/server/app/api/profiles/[id]/export/route.js.nft.json +1 -1
  198. package/.next/standalone/.next/server/app/api/profiles/[id]/route.js +2 -2
  199. package/.next/standalone/.next/server/app/api/profiles/[id]/route.js.nft.json +1 -1
  200. package/.next/standalone/.next/server/app/api/profiles/import/route.js +2 -2
  201. package/.next/standalone/.next/server/app/api/profiles/import/route.js.nft.json +1 -1
  202. package/.next/standalone/.next/server/app/api/profiles/route.js +2 -2
  203. package/.next/standalone/.next/server/app/api/profiles/route.js.nft.json +1 -1
  204. package/.next/standalone/.next/server/app/api/sessions/[id]/archive/route.js +3 -2
  205. package/.next/standalone/.next/server/app/api/sessions/[id]/archive/route.js.nft.json +1 -1
  206. package/.next/standalone/.next/server/app/api/sessions/[id]/delete/route.js +4 -3
  207. package/.next/standalone/.next/server/app/api/sessions/[id]/delete/route.js.nft.json +1 -1
  208. package/.next/standalone/.next/server/app/api/sessions/[id]/open-editor/route.js +2 -2
  209. package/.next/standalone/.next/server/app/api/sessions/[id]/open-editor/route.js.nft.json +1 -1
  210. package/.next/standalone/.next/server/app/api/sessions/[id]/restore/route/app-paths-manifest.json +3 -0
  211. package/.next/standalone/.next/server/app/api/sessions/[id]/restore/route/build-manifest.json +11 -0
  212. package/.next/standalone/.next/server/app/api/sessions/[id]/restore/route/server-reference-manifest.json +4 -0
  213. package/.next/standalone/.next/server/app/api/sessions/[id]/restore/route.js +8 -0
  214. package/.next/standalone/.next/server/app/api/sessions/[id]/restore/route.js.map +5 -0
  215. package/.next/standalone/.next/server/app/api/sessions/[id]/restore/route.js.nft.json +1 -0
  216. package/.next/standalone/.next/server/app/api/sessions/[id]/restore/route_client-reference-manifest.js +2 -0
  217. package/.next/standalone/.next/server/app/api/sessions/[id]/route.js +2 -2
  218. package/.next/standalone/.next/server/app/api/sessions/[id]/route.js.nft.json +1 -1
  219. package/.next/standalone/.next/server/app/api/sessions/route.js +5 -3
  220. package/.next/standalone/.next/server/app/api/sessions/route.js.nft.json +1 -1
  221. package/.next/standalone/.next/server/app/index.html +1 -1
  222. package/.next/standalone/.next/server/app/index.rsc +3 -3
  223. package/.next/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
  224. package/.next/standalone/.next/server/app/index.segments/_full.segment.rsc +3 -3
  225. package/.next/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  226. package/.next/standalone/.next/server/app/index.segments/_index.segment.rsc +2 -2
  227. package/.next/standalone/.next/server/app/index.segments/_tree.segment.rsc +2 -2
  228. package/.next/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  229. package/.next/standalone/.next/server/app-paths-manifest.json +1 -0
  230. package/.next/standalone/.next/server/chunks/[root-of-the-server]__005eb0c5._.js +3 -0
  231. package/.next/standalone/.next/server/chunks/[root-of-the-server]__09e90d57._.js +3 -0
  232. package/.next/standalone/.next/server/chunks/[root-of-the-server]__18dd0ce9._.js +3 -0
  233. package/.next/standalone/.next/server/chunks/[root-of-the-server]__19468536._.js +3 -0
  234. package/.next/standalone/.next/server/chunks/[root-of-the-server]__1b87ec42._.js +1 -1
  235. package/.next/standalone/.next/server/chunks/[root-of-the-server]__2b912935._.js +3 -0
  236. package/.next/standalone/.next/server/chunks/[root-of-the-server]__303d3bac._.js +3 -0
  237. package/.next/standalone/.next/server/chunks/[root-of-the-server]__3fac2b91._.js +5 -0
  238. package/.next/standalone/.next/server/chunks/[root-of-the-server]__43440b8d._.js +3 -0
  239. package/.next/standalone/.next/server/chunks/[root-of-the-server]__438f8bbe._.js +3 -0
  240. package/.next/standalone/.next/server/chunks/[root-of-the-server]__4a0bfb55._.js +3 -0
  241. package/.next/standalone/.next/server/chunks/[root-of-the-server]__534c3949._.js +3 -0
  242. package/.next/standalone/.next/server/chunks/[root-of-the-server]__59160266._.js +1 -1
  243. package/.next/standalone/.next/server/chunks/[root-of-the-server]__6f812da0._.js +3 -0
  244. package/.next/standalone/.next/server/chunks/[root-of-the-server]__71aac504._.js +3 -0
  245. package/.next/standalone/.next/server/chunks/[root-of-the-server]__907a8bf2._.js +3 -0
  246. package/.next/standalone/.next/server/chunks/[root-of-the-server]__92089220._.js +3 -0
  247. package/.next/standalone/.next/server/chunks/[root-of-the-server]__9b7bc2d0._.js +3 -0
  248. package/.next/standalone/.next/server/chunks/[root-of-the-server]__b2640944._.js +3 -0
  249. package/.next/standalone/.next/server/chunks/[root-of-the-server]__c2267cf1._.js +3 -0
  250. package/.next/standalone/.next/server/chunks/[root-of-the-server]__d7f7e6dd._.js +3 -0
  251. package/.next/standalone/.next/server/chunks/[root-of-the-server]__d8e61048._.js +1 -1
  252. package/.next/standalone/.next/server/chunks/[root-of-the-server]__f6d0d488._.js +3 -0
  253. package/.next/standalone/.next/server/chunks/[root-of-the-server]__fa559e1e._.js +3 -0
  254. package/.next/standalone/.next/server/chunks/_next-internal_server_app_api_sessions_[id]_restore_route_actions_af7d6b6c.js +3 -0
  255. package/.next/standalone/.next/server/chunks/node_modules_next_dist_esm_build_templates_app-route_7e181e75.js +1 -1
  256. package/.next/standalone/.next/server/chunks/node_modules_next_dist_esm_build_templates_app-route_aca45402.js +1 -1
  257. package/.next/standalone/.next/server/chunks/node_modules_next_dist_esm_build_templates_app-route_b054aff3.js +1 -1
  258. package/.next/standalone/.next/server/chunks/node_modules_next_dist_esm_build_templates_app-route_fa835ac3.js +2 -2
  259. package/.next/standalone/.next/server/chunks/src_lib_opencodeConfig_ts_8e209941._.js +3 -0
  260. package/.next/standalone/.next/server/chunks/src_lib_session-providers_claudeCode_ts_0f9590ed._.js +3 -0
  261. package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__631e12d0._.js → [root-of-the-server]__c91a8380._.js} +2 -2
  262. package/.next/standalone/.next/server/chunks/ssr/src_app_page_tsx_a7111f3e._.js +3 -3
  263. package/.next/standalone/.next/server/pages/404.html +1 -1
  264. package/.next/standalone/.next/server/pages/500.html +2 -2
  265. package/.next/standalone/.next/server/server-reference-manifest.js +1 -1
  266. package/.next/standalone/.next/server/server-reference-manifest.json +1 -1
  267. package/.next/standalone/.next/static/chunks/9e790b67c80f853c.js +13 -0
  268. package/.next/standalone/.next/static/chunks/c3dc8cd80979c971.css +3 -0
  269. package/.next/standalone/AGENTS.md +4 -0
  270. package/.next/standalone/README.md +54 -5
  271. package/.next/standalone/check-hsql.mjs +1 -1
  272. package/.next/standalone/docs/session-status-detection.md +36 -0
  273. package/.next/standalone/docs/superpowers/specs/2026-04-09-claude-capability-alignment-design.md +39 -0
  274. package/.next/standalone/eslint.config.mjs +1 -0
  275. package/.next/standalone/package-lock.json +74 -13
  276. package/.next/standalone/package.json +2 -2
  277. package/.next/standalone/src/app/api/node/events/route.ts +3 -3
  278. package/.next/standalone/src/app/api/node/sessions/[id]/archive/route.test.ts +60 -1
  279. package/.next/standalone/src/app/api/node/sessions/[id]/archive/route.ts +77 -22
  280. package/.next/standalone/src/app/api/node/sessions/[id]/delete/route.ts +6 -5
  281. package/.next/standalone/src/app/api/node/sessions/[id]/open-editor/route.ts +6 -5
  282. package/.next/standalone/src/app/api/node/sessions/route.test.ts +282 -0
  283. package/.next/standalone/src/app/api/node/sessions/route.ts +156 -30
  284. package/.next/standalone/src/app/api/opencode-config/route.test.ts +613 -0
  285. package/.next/standalone/src/app/api/opencode-config/route.ts +336 -185
  286. package/.next/standalone/src/app/api/opencode-events/route.test.ts +77 -1
  287. package/.next/standalone/src/app/api/opencode-events/route.ts +3 -3
  288. package/.next/standalone/src/app/api/opencode-models/route.test.ts +19 -0
  289. package/.next/standalone/src/app/api/opencode-models/route.ts +4 -1
  290. package/.next/standalone/src/app/api/profiles/[id]/apply/route.test.ts +227 -0
  291. package/.next/standalone/src/app/api/profiles/[id]/apply/route.ts +13 -9
  292. package/.next/standalone/src/app/api/sessions/[id]/archive/route.test.ts +126 -0
  293. package/.next/standalone/src/app/api/sessions/[id]/archive/route.ts +47 -12
  294. package/.next/standalone/src/app/api/sessions/[id]/delete/route.test.ts +140 -0
  295. package/.next/standalone/src/app/api/sessions/[id]/delete/route.ts +51 -16
  296. package/.next/standalone/src/app/api/sessions/[id]/open-editor/route.test.ts +74 -0
  297. package/.next/standalone/src/app/api/sessions/[id]/open-editor/route.ts +22 -2
  298. package/.next/standalone/src/app/api/sessions/[id]/restore/route.test.ts +186 -0
  299. package/.next/standalone/src/app/api/sessions/[id]/restore/route.ts +184 -0
  300. package/.next/standalone/src/app/api/sessions/[id]/route.ts +3 -3
  301. package/.next/standalone/src/app/api/sessions/route.test.ts +1955 -100
  302. package/.next/standalone/src/app/api/sessions/route.ts +361 -986
  303. package/.next/standalone/src/components/KanbanBoard.test.tsx +307 -1
  304. package/.next/standalone/src/components/KanbanBoard.tsx +106 -19
  305. package/.next/standalone/src/components/ProjectCard.test.tsx +420 -6
  306. package/.next/standalone/src/components/ProjectCard.tsx +238 -86
  307. package/.next/standalone/src/components/SessionCard.test.tsx +259 -8
  308. package/.next/standalone/src/components/SessionCard.tsx +182 -76
  309. package/.next/standalone/src/components/opencode-config/AgentConfigForm.test.tsx +141 -1
  310. package/.next/standalone/src/components/opencode-config/AgentConfigForm.tsx +99 -7
  311. package/.next/standalone/src/components/opencode-config/GeneralSettingsForm.test.tsx +11 -0
  312. package/.next/standalone/src/components/opencode-config/GeneralSettingsForm.tsx +41 -2
  313. package/.next/standalone/src/components/opencode-config/categories/CategoriesManager.tsx +3 -1
  314. package/.next/standalone/src/components/opencode-config/categories/CategoryConfigForm.test.tsx +106 -8
  315. package/.next/standalone/src/components/opencode-config/categories/CategoryConfigForm.tsx +82 -5
  316. package/.next/standalone/src/hooks/useHostSources.test.ts +0 -41
  317. package/.next/standalone/src/hooks/useOpencodeSync.test.ts +321 -1
  318. package/.next/standalone/src/hooks/useOpencodeSync.ts +16 -12
  319. package/.next/standalone/src/lib/claudeSessionOverrides.test.ts +75 -0
  320. package/.next/standalone/src/lib/claudeSessionOverrides.ts +169 -0
  321. package/.next/standalone/src/lib/fixtures/opencode-config/oh-my-openagent.v4.jsonc +70 -0
  322. package/.next/standalone/src/lib/fixtures/opencode-config/oh-my-openagent.v4.secret-like.jsonc +21 -0
  323. package/.next/standalone/src/lib/fixtures/opencode-config/oh-my-opencode.v3.jsonc +17 -0
  324. package/.next/standalone/src/lib/opencodeConfig.test.ts +430 -3
  325. package/.next/standalone/src/lib/opencodeConfig.ts +157 -4
  326. package/.next/standalone/src/lib/opencodeDiscovery.test.ts +241 -0
  327. package/.next/standalone/src/lib/opencodeDiscovery.ts +164 -9
  328. package/.next/standalone/src/lib/profiles/share.test.ts +92 -0
  329. package/.next/standalone/src/lib/profiles/share.ts +1 -0
  330. package/.next/standalone/src/lib/profiles/storage.test.ts +77 -1
  331. package/.next/standalone/src/lib/profiles/storage.ts +10 -9
  332. package/.next/standalone/src/lib/session-providers/claudeCode.test.ts +2288 -0
  333. package/.next/standalone/src/lib/session-providers/claudeCode.ts +1083 -0
  334. package/.next/standalone/src/lib/session-providers/localAggregator.test.ts +322 -0
  335. package/.next/standalone/src/lib/session-providers/localAggregator.ts +302 -0
  336. package/.next/standalone/src/lib/session-providers/opencodeProvider.test.ts +170 -0
  337. package/.next/standalone/src/lib/session-providers/opencodeProvider.ts +721 -0
  338. package/.next/standalone/src/lib/session-providers/opencodeSdkCompat.ts +92 -0
  339. package/.next/standalone/src/lib/session-providers/providerIds.test.ts +337 -0
  340. package/.next/standalone/src/lib/session-providers/providerIds.ts +176 -0
  341. package/.next/standalone/src/lib/session-providers/types.ts +131 -0
  342. package/.next/standalone/src/lib/transform.test.ts +253 -0
  343. package/.next/standalone/src/lib/transform.ts +96 -37
  344. package/.next/standalone/src/types/index.ts +23 -17
  345. package/.next/standalone/src/types/opencodeConfig.ts +55 -0
  346. package/.next/static/chunks/9e790b67c80f853c.js +13 -0
  347. package/.next/static/chunks/c3dc8cd80979c971.css +3 -0
  348. package/.next/trace +1 -1
  349. package/.next/trace-build +1 -1
  350. package/.next/types/routes.d.ts +2 -1
  351. package/.next/types/validator.ts +9 -0
  352. package/README.md +54 -5
  353. package/package.json +2 -2
  354. package/.next/server/chunks/[root-of-the-server]__1211da38._.js +0 -3
  355. package/.next/server/chunks/[root-of-the-server]__1211da38._.js.map +0 -1
  356. package/.next/server/chunks/[root-of-the-server]__192ed2f4._.js +0 -3
  357. package/.next/server/chunks/[root-of-the-server]__2b526e7a._.js +0 -3
  358. package/.next/server/chunks/[root-of-the-server]__2b526e7a._.js.map +0 -1
  359. package/.next/server/chunks/[root-of-the-server]__2f981540._.js +0 -3
  360. package/.next/server/chunks/[root-of-the-server]__2f981540._.js.map +0 -1
  361. package/.next/server/chunks/[root-of-the-server]__3745b314._.js +0 -3
  362. package/.next/server/chunks/[root-of-the-server]__3745b314._.js.map +0 -1
  363. package/.next/server/chunks/[root-of-the-server]__56690af0._.js +0 -3
  364. package/.next/server/chunks/[root-of-the-server]__56690af0._.js.map +0 -1
  365. package/.next/server/chunks/[root-of-the-server]__56f5f249._.js +0 -3
  366. package/.next/server/chunks/[root-of-the-server]__56f5f249._.js.map +0 -1
  367. package/.next/server/chunks/[root-of-the-server]__59175de4._.js +0 -3
  368. package/.next/server/chunks/[root-of-the-server]__59175de4._.js.map +0 -1
  369. package/.next/server/chunks/[root-of-the-server]__64fffc02._.js +0 -3
  370. package/.next/server/chunks/[root-of-the-server]__64fffc02._.js.map +0 -1
  371. package/.next/server/chunks/[root-of-the-server]__6924c09d._.js +0 -3
  372. package/.next/server/chunks/[root-of-the-server]__6c428a24._.js +0 -3
  373. package/.next/server/chunks/[root-of-the-server]__6c428a24._.js.map +0 -1
  374. package/.next/server/chunks/[root-of-the-server]__73a00b88._.js +0 -3
  375. package/.next/server/chunks/[root-of-the-server]__73a00b88._.js.map +0 -1
  376. package/.next/server/chunks/[root-of-the-server]__7e757f50._.js +0 -3
  377. package/.next/server/chunks/[root-of-the-server]__7e757f50._.js.map +0 -1
  378. package/.next/server/chunks/[root-of-the-server]__89c5eeab._.js +0 -3
  379. package/.next/server/chunks/[root-of-the-server]__89c5eeab._.js.map +0 -1
  380. package/.next/server/chunks/[root-of-the-server]__8da6c5a8._.js +0 -3
  381. package/.next/server/chunks/[root-of-the-server]__8da6c5a8._.js.map +0 -1
  382. package/.next/server/chunks/[root-of-the-server]__b796d06c._.js +0 -3
  383. package/.next/server/chunks/[root-of-the-server]__b796d06c._.js.map +0 -1
  384. package/.next/server/chunks/[root-of-the-server]__c2ce5c0f._.js +0 -3
  385. package/.next/server/chunks/[root-of-the-server]__c2ce5c0f._.js.map +0 -1
  386. package/.next/server/chunks/[root-of-the-server]__db285678._.js +0 -3
  387. package/.next/server/chunks/[root-of-the-server]__db285678._.js.map +0 -1
  388. package/.next/server/chunks/[root-of-the-server]__e00a9200._.js +0 -5
  389. package/.next/server/chunks/[root-of-the-server]__e00a9200._.js.map +0 -1
  390. package/.next/server/chunks/[root-of-the-server]__e5df5e5f._.js +0 -3
  391. package/.next/server/chunks/[root-of-the-server]__e5df5e5f._.js.map +0 -1
  392. package/.next/server/chunks/[root-of-the-server]__edbc8d9e._.js +0 -3
  393. package/.next/server/chunks/[root-of-the-server]__edbc8d9e._.js.map +0 -1
  394. package/.next/standalone/.next/server/chunks/[root-of-the-server]__1211da38._.js +0 -3
  395. package/.next/standalone/.next/server/chunks/[root-of-the-server]__192ed2f4._.js +0 -3
  396. package/.next/standalone/.next/server/chunks/[root-of-the-server]__2b526e7a._.js +0 -3
  397. package/.next/standalone/.next/server/chunks/[root-of-the-server]__2f981540._.js +0 -3
  398. package/.next/standalone/.next/server/chunks/[root-of-the-server]__3745b314._.js +0 -3
  399. package/.next/standalone/.next/server/chunks/[root-of-the-server]__56690af0._.js +0 -3
  400. package/.next/standalone/.next/server/chunks/[root-of-the-server]__56f5f249._.js +0 -3
  401. package/.next/standalone/.next/server/chunks/[root-of-the-server]__59175de4._.js +0 -3
  402. package/.next/standalone/.next/server/chunks/[root-of-the-server]__64fffc02._.js +0 -3
  403. package/.next/standalone/.next/server/chunks/[root-of-the-server]__6924c09d._.js +0 -3
  404. package/.next/standalone/.next/server/chunks/[root-of-the-server]__6c428a24._.js +0 -3
  405. package/.next/standalone/.next/server/chunks/[root-of-the-server]__73a00b88._.js +0 -3
  406. package/.next/standalone/.next/server/chunks/[root-of-the-server]__7e757f50._.js +0 -3
  407. package/.next/standalone/.next/server/chunks/[root-of-the-server]__89c5eeab._.js +0 -3
  408. package/.next/standalone/.next/server/chunks/[root-of-the-server]__8da6c5a8._.js +0 -3
  409. package/.next/standalone/.next/server/chunks/[root-of-the-server]__b796d06c._.js +0 -3
  410. package/.next/standalone/.next/server/chunks/[root-of-the-server]__c2ce5c0f._.js +0 -3
  411. package/.next/standalone/.next/server/chunks/[root-of-the-server]__db285678._.js +0 -3
  412. package/.next/standalone/.next/server/chunks/[root-of-the-server]__e00a9200._.js +0 -5
  413. package/.next/standalone/.next/server/chunks/[root-of-the-server]__e5df5e5f._.js +0 -3
  414. package/.next/standalone/.next/server/chunks/[root-of-the-server]__edbc8d9e._.js +0 -3
  415. package/.next/standalone/.next/static/chunks/65d5354ba0add961.js +0 -13
  416. package/.next/standalone/.next/static/chunks/f42202943f6742e5.css +0 -3
  417. package/.next/static/chunks/65d5354ba0add961.js +0 -13
  418. package/.next/static/chunks/f42202943f6742e5.css +0 -3
  419. /package/.next/standalone/.next/static/{5kq9DtuBFVxu4jsgmL5Q- → 0WaQ6UjiNBgvh531pJVh0}/_buildManifest.js +0 -0
  420. /package/.next/standalone/.next/static/{5kq9DtuBFVxu4jsgmL5Q- → 0WaQ6UjiNBgvh531pJVh0}/_clientMiddlewareManifest.json +0 -0
  421. /package/.next/standalone/.next/static/{5kq9DtuBFVxu4jsgmL5Q- → 0WaQ6UjiNBgvh531pJVh0}/_ssgManifest.js +0 -0
  422. /package/.next/static/{5kq9DtuBFVxu4jsgmL5Q- → 0WaQ6UjiNBgvh531pJVh0}/_buildManifest.js +0 -0
  423. /package/.next/static/{5kq9DtuBFVxu4jsgmL5Q- → 0WaQ6UjiNBgvh531pJVh0}/_clientMiddlewareManifest.json +0 -0
  424. /package/.next/static/{5kq9DtuBFVxu4jsgmL5Q- → 0WaQ6UjiNBgvh531pJVh0}/_ssgManifest.js +0 -0
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/app/api/node/sessions/route.ts","../../../node_modules/next/dist/esm/build/templates/app-route.js"],"sourcesContent":["import { createOpencodeClient } from '@opencode-ai/sdk';\nimport { execSync } from 'child_process';\nimport path from 'path';\nimport {\n discoverOpencodePortsWithMeta,\n discoverOpencodeProcessCwdsWithoutPortWithMeta,\n} from '@/lib/opencodeDiscovery';\nimport { readConfig } from '@/lib/opencodeConfig';\nimport { composeSourceKey } from '@/lib/hostIdentity';\nimport {\n NODE_PROTOCOL_VERSION,\n createNodeFailureResponse,\n guardNodeRequest,\n toNodeRequestGuardResponse,\n type NodeFailureReason,\n} from '@/lib/nodeProtocol';\nimport {\n clearSessionForceUnarchived,\n markSessionForceUnarchived,\n pruneSessionStickyStatusBlocked,\n pruneSessionForceUnarchived,\n shouldForceSessionUnarchived,\n takeSessionStickyStatusBlocked,\n} from '@/lib/sessionArchiveOverrides';\n\ntype SessionLike = {\n id: string;\n slug?: string;\n title?: string;\n directory: string;\n debugReason?: string;\n parentID?: string;\n time?: {\n created: number;\n updated: number;\n archived?: number;\n };\n};\n\ntype ProcessHint = {\n pid: number;\n directory: string;\n projectName: string;\n reason: 'process_without_api_port';\n};\n\nconst CHILD_ACTIVE_WINDOW_MS = 30 * 60 * 1000;\nconst CHILD_UNKNOWN_STATE_BUSY_WINDOW_MS = 2 * 60 * 1000;\nconst CHILD_STATUS_MESSAGE_CHECK_LIMIT = 50;\nconst STALL_DETECTION_WINDOW_MS = 30 * 1000;\nconst STATUS_STICKY_RETENTION_MS = 24 * 60 * 60 * 1000;\nconst STATUS_STICKY_ABSENT_RETENTION_MS = 30 * 60 * 1000;\nconst DEFAULT_STATUS_STICKY_MAX_ENTRIES = 5000;\nconst GIT_COMMAND_TIMEOUT_MS = 1200;\nconst sessionListTimeoutMs = readPositiveTimeoutEnv('OPENCODE_SESSIONS_LIST_TIMEOUT_MS', 6000);\nconst sessionStatusTimeoutMs = readPositiveTimeoutEnv('OPENCODE_SESSIONS_STATUS_TIMEOUT_MS', 4000);\nconst sessionMessagesTimeoutMs = readPositiveTimeoutEnv('OPENCODE_SESSIONS_MESSAGES_TIMEOUT_MS', 2500);\n\nconst LOCAL_SOURCE = {\n hostId: 'local',\n hostLabel: 'Local',\n hostKind: 'local',\n} as const;\n\ntype StableRealtimeStatus = 'idle' | 'busy' | 'retry';\n\ntype StatusStickyState = {\n lastBusyAt: number;\n lastSeenAt: number;\n};\n\ntype HostAwareFields = {\n hostId?: typeof LOCAL_SOURCE.hostId;\n hostLabel?: typeof LOCAL_SOURCE.hostLabel;\n hostKind?: typeof LOCAL_SOURCE.hostKind;\n rawSessionId?: string;\n sourceSessionKey?: string;\n readOnly?: boolean;\n};\n\ntype ChildEntry = HostAwareFields & {\n id: string;\n slug?: string;\n title?: string;\n directory?: string;\n debugReason?: string;\n parentID?: string;\n time?: { created: number; updated: number; archived?: number };\n realTimeStatus: string;\n waitingForUser: boolean;\n};\n\ntype EnrichedSession = SessionLike & HostAwareFields & {\n projectName: string;\n branch: string | null;\n realTimeStatus: StableRealtimeStatus;\n waitingForUser: boolean;\n children: ChildEntry[];\n};\n\ntype SessionStatusStabilizationTarget = {\n id: string;\n time?: {\n archived?: number;\n };\n realTimeStatus: string;\n waitingForUser: boolean;\n children: Array<{\n id: string;\n time?: {\n archived?: number;\n };\n realTimeStatus: string;\n waitingForUser: boolean;\n }>;\n};\n\ntype MessageStateStatus = string;\n\ntype MessagePart = {\n state?: {\n status?: unknown;\n };\n};\n\ntype LocalResultMeta = {\n online: boolean;\n degraded?: boolean;\n reason?: string;\n};\n\ntype LocalSessionsSuccessPayload = {\n sessions: EnrichedSession[];\n processHints: ProcessHint[];\n failedPorts?: Array<{ port: number; reason: string }>;\n degraded?: boolean;\n};\n\ntype LocalSessionsResult =\n | {\n ok: true;\n payload: LocalSessionsSuccessPayload;\n meta: LocalResultMeta;\n }\n | {\n ok: false;\n reason: NodeFailureReason;\n extras: Record<string, unknown>;\n };\n\ntype LocalHostStatus = {\n hostId: typeof LOCAL_SOURCE.hostId;\n hostLabel: typeof LOCAL_SOURCE.hostLabel;\n hostKind: typeof LOCAL_SOURCE.hostKind;\n online: boolean;\n degraded?: boolean;\n reason?: string;\n};\n\ntype NodeSessionsSuccessPayload = {\n ok: true;\n role: 'node';\n protocolVersion: typeof NODE_PROTOCOL_VERSION;\n source: typeof LOCAL_SOURCE;\n upstream: {\n kind: 'opencode';\n reachable: true;\n };\n sessions: EnrichedSession[];\n processHints: ProcessHint[];\n hosts: [LocalHostStatus];\n hostStatuses: [LocalHostStatus];\n failedPorts?: Array<{ port: number; reason: string }>;\n degraded?: true;\n};\n\nconst statusStickyState = new Map<string, StatusStickyState>();\n\nconst WAITING_PART_STATUSES = new Set<string>([\n 'awaiting-input',\n 'awaiting_input',\n 'input-required',\n 'input_required',\n 'requires-input',\n 'requires_input',\n 'blocked',\n 'paused',\n]);\n\nexport const dynamic = 'force-dynamic';\n\nexport async function GET(request: Request) {\n const guardResult = guardNodeRequest(request);\n if (!guardResult.ok) {\n return toNodeRequestGuardResponse(guardResult);\n }\n\n const stickyBusyDelayMs = await readStickyBusyDelayMs();\n const result = await getLocalSessionsResult(stickyBusyDelayMs);\n\n if (!result.ok) {\n return createNodeFailureResponse(result.reason, result.extras);\n }\n\n const hostStatus = toLocalHostStatus(result.meta);\n\n const payload: NodeSessionsSuccessPayload = {\n ok: true,\n role: 'node',\n protocolVersion: NODE_PROTOCOL_VERSION,\n source: LOCAL_SOURCE,\n upstream: {\n kind: 'opencode',\n reachable: true,\n },\n sessions: result.payload.sessions.map((session) => addLocalHostMetadataToSession(session)),\n processHints: result.payload.processHints,\n hosts: [hostStatus],\n hostStatuses: [hostStatus],\n ...(result.payload.failedPorts ? { failedPorts: result.payload.failedPorts } : {}),\n ...(result.payload.degraded ? { degraded: true as const } : {}),\n };\n\n return Response.json(payload);\n}\n\nfunction readPositiveTimeoutEnv(name: string, fallback: number): number {\n const raw = process.env[name];\n const parsed = Number(raw);\n if (Number.isFinite(parsed) && parsed > 0) {\n return Math.floor(parsed);\n }\n return fallback;\n}\n\nfunction withTimeout<T>(operation: (signal: AbortSignal) => Promise<T>, timeoutMs: number, label: string): Promise<T> {\n const timeoutError = new Error(`${label} timed out after ${timeoutMs}ms`);\n const timeoutController = new AbortController();\n let timeoutHandle: NodeJS.Timeout | undefined;\n const timeoutPromise = new Promise<never>((_, reject) => {\n timeoutHandle = setTimeout(() => {\n timeoutController.abort();\n reject(timeoutError);\n }, timeoutMs);\n });\n\n const operationPromise = operation(timeoutController.signal).catch((error) => {\n if (timeoutController.signal.aborted) {\n throw timeoutError;\n }\n\n throw error;\n });\n\n return Promise.race([operationPromise, timeoutPromise]).finally(() => {\n if (timeoutHandle) {\n clearTimeout(timeoutHandle);\n }\n });\n}\n\nfunction normalizePartStatus(status: string): string {\n return status.trim().toLowerCase();\n}\n\nfunction isWaitingPartStatus(status: string): boolean {\n return WAITING_PART_STATUSES.has(normalizePartStatus(status));\n}\n\nfunction collectPartStatuses(messages: Array<{ parts?: MessagePart[] }>): MessageStateStatus[] {\n const partStatuses: MessageStateStatus[] = [];\n\n for (const message of messages) {\n for (const part of message.parts || []) {\n const status = part?.state?.status;\n if (typeof status === 'string') {\n const normalized = normalizePartStatus(status);\n if (normalized) {\n partStatuses.push(normalized);\n }\n }\n }\n }\n\n return partStatuses;\n}\n\nasync function fetchPartStatuses(\n client: ReturnType<typeof createOpencodeClient>,\n sessionId: string,\n timeoutMs: number\n): Promise<MessageStateStatus[]> {\n const messagesResult = await withTimeout(\n (signal) =>\n client.session.messages({\n path: { id: sessionId },\n query: { limit: 8 },\n signal,\n }),\n timeoutMs,\n `session.messages(${sessionId})`\n );\n const messages = (messagesResult.data || []) as Array<{ parts?: MessagePart[] }>;\n return collectPartStatuses(messages);\n}\n\nfunction getUpdatedAt(session: { time?: { updated?: number; created?: number } }): number {\n return session.time?.updated || session.time?.created || 0;\n}\n\nfunction normalizeRealtimeStatus(value: string | undefined): StableRealtimeStatus {\n if (value === 'busy' || value === 'retry') return value;\n return 'idle';\n}\n\nfunction clearStickyStatusState(sessionId: string): void {\n statusStickyState.delete(sessionId);\n statusStickyState.delete(`child:${sessionId}`);\n}\n\nfunction applyStickyBusyStatus(\n id: string,\n status: StableRealtimeStatus,\n now: number,\n stickyBusyWindowMs: number\n): StableRealtimeStatus {\n const existing = statusStickyState.get(id) ?? { lastBusyAt: 0, lastSeenAt: now };\n\n if (status === 'busy') {\n existing.lastBusyAt = now;\n existing.lastSeenAt = now;\n statusStickyState.set(id, existing);\n return status;\n }\n\n if (status === 'retry') {\n existing.lastSeenAt = now;\n statusStickyState.set(id, existing);\n return status;\n }\n\n const shouldKeepBusy = existing.lastBusyAt > 0 && now - existing.lastBusyAt <= stickyBusyWindowMs;\n existing.lastSeenAt = now;\n statusStickyState.set(id, existing);\n return shouldKeepBusy ? 'busy' : 'idle';\n}\n\nfunction getStickyStateMaxEntries(): number {\n const raw = Number(process.env.OPENCODE_STATUS_STICKY_MAX_ENTRIES);\n if (Number.isFinite(raw) && raw > 0) {\n return Math.floor(raw);\n }\n return DEFAULT_STATUS_STICKY_MAX_ENTRIES;\n}\n\nfunction pruneStickyState(now: number, activeIds: Set<string>): void {\n for (const [id, state] of statusStickyState) {\n const ageMs = now - state.lastSeenAt;\n const isActive = activeIds.has(id);\n if (ageMs > STATUS_STICKY_RETENTION_MS || (!isActive && ageMs > STATUS_STICKY_ABSENT_RETENTION_MS)) {\n statusStickyState.delete(id);\n }\n }\n\n const maxEntries = getStickyStateMaxEntries();\n if (statusStickyState.size <= maxEntries) {\n return;\n }\n\n const overflow = statusStickyState.size - maxEntries;\n const sortedByLastSeen = Array.from(statusStickyState.entries()).sort((a, b) => a[1].lastSeenAt - b[1].lastSeenAt);\n\n let removed = 0;\n for (const [id] of sortedByLastSeen) {\n if (removed >= overflow) break;\n if (activeIds.has(id)) continue;\n statusStickyState.delete(id);\n removed++;\n }\n\n if (removed >= overflow) {\n return;\n }\n\n for (const [id] of sortedByLastSeen) {\n if (removed >= overflow) break;\n if (!statusStickyState.has(id)) continue;\n statusStickyState.delete(id);\n removed++;\n }\n}\n\nfunction hasRecentActivity(session: { time?: { updated?: number } }, now: number): boolean {\n const updatedAt = session.time?.updated;\n if (!updatedAt) return false;\n return now - updatedAt <= STALL_DETECTION_WINDOW_MS;\n}\n\nfunction toChildEntry(\n child: SessionLike,\n status: StableRealtimeStatus,\n waitingForUser = false\n): ChildEntry {\n return {\n id: child.id,\n slug: child.slug,\n title: child.title,\n directory: child.directory,\n debugReason: child.debugReason,\n parentID: child.parentID,\n time: child.time,\n realTimeStatus: status,\n waitingForUser,\n };\n}\n\nfunction clearSessionStabilizationState(session: SessionStatusStabilizationTarget): void {\n clearStickyStatusState(session.id);\n clearSessionForceUnarchived(session.id);\n for (const child of session.children) {\n clearStickyStatusState(`child:${child.id}`);\n clearSessionForceUnarchived(child.id);\n }\n}\n\nfunction shouldSkipSessionStatusStabilization(\n session: SessionStatusStabilizationTarget,\n now: number\n): boolean {\n if (takeSessionStickyStatusBlocked(session.id, now)) {\n clearSessionStabilizationState(session);\n return true;\n }\n\n if (session.time?.archived) {\n clearSessionStabilizationState(session);\n return true;\n }\n\n return false;\n}\n\nfunction applyStickyStatusStabilization(\n session: SessionStatusStabilizationTarget,\n stickyNow: number,\n stickyBusyDelayMs: number\n): void {\n for (const child of session.children) {\n if (child.time?.archived) {\n clearStickyStatusState(`child:${child.id}`);\n clearSessionForceUnarchived(child.id);\n continue;\n }\n\n const normalizedChildStatus = normalizeRealtimeStatus(child.realTimeStatus);\n const childStatusForStabilization =\n child.waitingForUser && normalizedChildStatus === 'idle' ? 'retry' : normalizedChildStatus;\n child.realTimeStatus = applyStickyBusyStatus(\n `child:${child.id}`,\n childStatusForStabilization,\n stickyNow,\n stickyBusyDelayMs\n );\n\n if (child.realTimeStatus === 'busy' || child.realTimeStatus === 'retry' || child.waitingForUser) {\n markSessionForceUnarchived(child.id, stickyNow);\n }\n }\n\n const normalizedSessionStatus = normalizeRealtimeStatus(session.realTimeStatus);\n const sessionStatusForStabilization =\n session.waitingForUser && normalizedSessionStatus === 'idle' ? 'retry' : normalizedSessionStatus;\n session.realTimeStatus = applyStickyBusyStatus(\n session.id,\n sessionStatusForStabilization,\n stickyNow,\n stickyBusyDelayMs\n );\n\n const hasActiveChildren = session.children.some(\n (child) => child.realTimeStatus === 'busy' || child.realTimeStatus === 'retry' || child.waitingForUser\n );\n const shouldAutoUnarchive =\n session.realTimeStatus === 'busy' ||\n session.realTimeStatus === 'retry' ||\n session.waitingForUser ||\n hasActiveChildren;\n\n if (shouldAutoUnarchive) {\n markSessionForceUnarchived(session.id, stickyNow);\n }\n}\n\nfunction getProjectName(directory: string): string {\n return path.basename(directory);\n}\n\nfunction isGitRepo(directory: string): boolean {\n try {\n const result = execSync('git rev-parse --is-inside-work-tree', {\n cwd: directory,\n encoding: 'utf-8',\n stdio: ['ignore', 'pipe', 'ignore'],\n timeout: GIT_COMMAND_TIMEOUT_MS,\n });\n return result.trim() === 'true';\n } catch {\n return false;\n }\n}\n\nfunction getGitBranch(directory: string): string | null {\n if (!isGitRepo(directory)) return null;\n try {\n const branch = execSync('git branch --show-current', {\n cwd: directory,\n encoding: 'utf-8',\n stdio: ['ignore', 'pipe', 'ignore'],\n timeout: GIT_COMMAND_TIMEOUT_MS,\n });\n return branch.trim() || null;\n } catch {\n return null;\n }\n}\n\nasync function readStickyBusyDelayMs(): Promise<number> {\n let stickyBusyDelayMs = 1000;\n try {\n const config = await readConfig();\n const vibepulseRaw =\n config.vibepulse && typeof config.vibepulse === 'object' && !Array.isArray(config.vibepulse)\n ? config.vibepulse\n : {};\n const vibepulse = vibepulseRaw as Record<string, unknown>;\n const stickyDelay = vibepulse['stickyBusyDelayMs'] as number | undefined;\n if (typeof stickyDelay === 'number' && Number.isFinite(stickyDelay) && stickyDelay >= 0) {\n stickyBusyDelayMs = stickyDelay;\n }\n } catch {\n }\n\n return stickyBusyDelayMs;\n}\n\nfunction sortChildEntries(children: ChildEntry[]): void {\n children.sort((a, b) => {\n const aActive = a.realTimeStatus === 'busy' || a.realTimeStatus === 'retry';\n const bActive = b.realTimeStatus === 'busy' || b.realTimeStatus === 'retry';\n\n if (aActive && !bActive) return -1;\n if (!aActive && bActive) return 1;\n\n const aTime = a.time?.updated || a.time?.created || 0;\n const bTime = b.time?.updated || b.time?.created || 0;\n return bTime - aTime;\n });\n}\n\nfunction addLocalHostMetadataToChildEntry(child: ChildEntry): ChildEntry {\n const rawSessionId = child.rawSessionId ?? child.id;\n const sourceSessionKey = composeSourceKey(LOCAL_SOURCE.hostId, rawSessionId);\n\n return {\n ...child,\n id: sourceSessionKey,\n parentID: child.parentID ? composeSourceKey(LOCAL_SOURCE.hostId, child.parentID) : child.parentID,\n hostId: LOCAL_SOURCE.hostId,\n hostLabel: LOCAL_SOURCE.hostLabel,\n hostKind: LOCAL_SOURCE.hostKind,\n rawSessionId,\n sourceSessionKey,\n readOnly: false,\n };\n}\n\nfunction addLocalHostMetadataToSession(session: EnrichedSession): EnrichedSession {\n const rawSessionId = session.rawSessionId ?? session.id;\n const sourceSessionKey = composeSourceKey(LOCAL_SOURCE.hostId, rawSessionId);\n\n return {\n ...session,\n id: sourceSessionKey,\n parentID: session.parentID ? composeSourceKey(LOCAL_SOURCE.hostId, session.parentID) : session.parentID,\n hostId: LOCAL_SOURCE.hostId,\n hostLabel: LOCAL_SOURCE.hostLabel,\n hostKind: LOCAL_SOURCE.hostKind,\n rawSessionId,\n sourceSessionKey,\n readOnly: false,\n children: session.children.map((child) => addLocalHostMetadataToChildEntry(child)),\n };\n}\n\nfunction toLocalHostStatus(meta: LocalResultMeta): LocalHostStatus {\n return {\n hostId: LOCAL_SOURCE.hostId,\n hostLabel: LOCAL_SOURCE.hostLabel,\n hostKind: LOCAL_SOURCE.hostKind,\n online: meta.online,\n ...(meta.degraded ? { degraded: true } : {}),\n ...(meta.reason ? { reason: meta.reason } : {}),\n };\n}\n\nfunction isTimeoutErrorMessage(value: string): boolean {\n return value.toLowerCase().includes('timed out');\n}\n\nfunction getFailureMeta(reason: NodeFailureReason): { statusReason: string; reachable: false } {\n if (reason === 'upstream_timeout') {\n return {\n statusReason: 'OpenCode discovery timed out',\n reachable: false,\n };\n }\n\n return {\n statusReason: 'OpenCode server not found',\n reachable: false,\n };\n}\n\nfunction createLocalFailureResult(\n reason: NodeFailureReason,\n processHints: ProcessHint[],\n extras: Record<string, unknown> = {}\n): Extract<LocalSessionsResult, { ok: false }> {\n const failureMeta = getFailureMeta(reason);\n const hostStatus = toLocalHostStatus({\n online: false,\n degraded: true,\n reason: failureMeta.statusReason,\n });\n\n return {\n ok: false,\n reason,\n extras: {\n role: 'node',\n source: LOCAL_SOURCE,\n upstream: {\n kind: 'opencode',\n reachable: failureMeta.reachable,\n },\n processHints,\n hosts: [hostStatus],\n hostStatuses: [hostStatus],\n ...extras,\n },\n };\n}\n\nfunction resolveFailureReasonFromMessages(messages: string[]): NodeFailureReason {\n if (messages.length > 0 && messages.every(isTimeoutErrorMessage)) {\n return 'upstream_timeout';\n }\n\n return 'upstream_unreachable';\n}\n\nasync function getLocalSessionsResult(stickyBusyDelayMs: number): Promise<LocalSessionsResult> {\n const { processes: rawProcessHints, timedOut: processDiscoveryTimedOut } =\n discoverOpencodeProcessCwdsWithoutPortWithMeta();\n const processHintsByDirectory = new Map<string, ProcessHint>();\n for (const process of rawProcessHints) {\n if (!process.cwd || process.cwd.startsWith('/private/tmp/opencode')) {\n continue;\n }\n if (processHintsByDirectory.has(process.cwd)) {\n continue;\n }\n processHintsByDirectory.set(process.cwd, {\n pid: process.pid,\n directory: process.cwd,\n projectName: getProjectName(process.cwd),\n reason: 'process_without_api_port',\n });\n }\n\n const processHints = Array.from(processHintsByDirectory.values());\n const { ports, timedOut: portDiscoveryTimedOut } = discoverOpencodePortsWithMeta();\n\n if (!ports.length) {\n if (portDiscoveryTimedOut || processDiscoveryTimedOut) {\n return createLocalFailureResult('upstream_timeout', processHints);\n }\n\n return createLocalFailureResult('upstream_unreachable', processHints);\n }\n\n try {\n const results = await Promise.allSettled(\n ports.map(async (port) => {\n const client = createOpencodeClient({ baseUrl: `http://localhost:${port}` });\n const sessionsResult = await withTimeout(\n (signal) => client.session.list({ signal }),\n sessionListTimeoutMs,\n `session.list(${port})`\n );\n const statusResult = await withTimeout(\n (signal) => client.session.status({ signal }),\n sessionStatusTimeoutMs,\n `session.status(${port})`\n ).catch(() => ({ data: {} }));\n return { port, client, sessions: sessionsResult.data || [], status: statusResult.data || {} };\n })\n );\n\n const allSessions: SessionLike[] = [];\n const statusMap: Record<string, { type: StableRealtimeStatus }> = {};\n const clientByPort: Record<number, ReturnType<typeof createOpencodeClient>> = {};\n const sessionPortMap: Record<string, number> = {};\n const failedPorts: Array<{ port: number; reason: string }> = [];\n\n for (let i = 0; i < results.length; i++) {\n const result = results[i];\n const port = ports[i];\n\n if (result.status !== 'fulfilled') {\n failedPorts.push({\n port,\n reason: result.reason instanceof Error ? result.reason.message : String(result.reason),\n });\n continue;\n }\n\n allSessions.push(...(result.value.sessions as SessionLike[]));\n Object.assign(statusMap, result.value.status);\n clientByPort[result.value.port] = result.value.client;\n for (const session of result.value.sessions as SessionLike[]) {\n if (!(session.id in sessionPortMap)) {\n sessionPortMap[session.id] = result.value.port;\n }\n }\n }\n\n const uniqueSessions: SessionLike[] = [];\n const seen = new Set<string>();\n for (const session of allSessions) {\n if (seen.has(session.id)) {\n continue;\n }\n seen.add(session.id);\n uniqueSessions.push(session);\n }\n\n const parentSessions = uniqueSessions.filter((session) => !session.parentID);\n const childSessions = uniqueSessions.filter((session) => !!session.parentID);\n\n const lifecycleNow = Date.now();\n pruneSessionForceUnarchived(lifecycleNow);\n pruneSessionStickyStatusBlocked(lifecycleNow);\n\n for (const session of parentSessions) {\n if (session.time?.archived !== undefined && shouldForceSessionUnarchived(session.id, lifecycleNow)) {\n session.time = {\n ...session.time,\n archived: undefined,\n };\n }\n }\n\n for (const child of childSessions) {\n if (child.time?.archived !== undefined && shouldForceSessionUnarchived(child.id, lifecycleNow)) {\n child.time = {\n ...child.time,\n archived: undefined,\n };\n }\n }\n\n if (results.length > 0 && failedPorts.length === results.length) {\n pruneStickyState(Date.now(), new Set<string>());\n return createLocalFailureResult(resolveFailureReasonFromMessages(failedPorts.map((entry) => entry.reason)), processHints, {\n failedPorts,\n });\n }\n\n const enrichedSessions: EnrichedSession[] = parentSessions.map((session) => ({\n ...session,\n projectName: getProjectName(session.directory),\n branch: getGitBranch(session.directory),\n realTimeStatus: statusMap[session.id]?.type || 'idle',\n waitingForUser: false,\n children: [],\n }));\n\n const parentById = new Map(enrichedSessions.map((session) => [session.id, session]));\n const now = Date.now();\n const unresolvedChildren: Array<{ parentId: string; child: SessionLike; childUpdatedAt: number }> = [];\n\n for (const child of childSessions) {\n let parent = child.parentID ? parentById.get(child.parentID) : undefined;\n\n if (!parent) {\n const candidates = enrichedSessions\n .filter((session) => session.directory === child.directory)\n .sort((a, b) => getUpdatedAt(b) - getUpdatedAt(a));\n\n parent =\n candidates.find((session) => session.realTimeStatus === 'busy' || session.realTimeStatus === 'retry') ||\n candidates[0];\n }\n\n if (!parent) {\n continue;\n }\n\n const statusFromMap = statusMap[child.id]?.type;\n const childUpdatedAt = getUpdatedAt(child);\n const isRecent = childUpdatedAt > 0 && now - childUpdatedAt <= CHILD_ACTIVE_WINDOW_MS;\n const shouldSkipArchivedChild = !!child.time?.archived && !statusFromMap && !isRecent;\n\n if (shouldSkipArchivedChild) {\n continue;\n }\n\n if (statusFromMap && statusFromMap !== 'idle') {\n parent.children.push(toChildEntry(child, statusFromMap));\n } else if (isRecent) {\n if (unresolvedChildren.length < CHILD_STATUS_MESSAGE_CHECK_LIMIT) {\n unresolvedChildren.push({ parentId: parent.id, child, childUpdatedAt });\n }\n }\n }\n\n if (unresolvedChildren.length > 0) {\n const unresolvedChecks = await Promise.allSettled(\n unresolvedChildren.map(async ({ parentId, child, childUpdatedAt }) => {\n const port = sessionPortMap[child.id] ?? sessionPortMap[parentId];\n const client = port ? clientByPort[port] : undefined;\n const assumeBusyForUnknown = childUpdatedAt > 0 && now - childUpdatedAt <= CHILD_UNKNOWN_STATE_BUSY_WINDOW_MS;\n if (!client) {\n return {\n parentId,\n child,\n childStatus: assumeBusyForUnknown ? ('busy' as const) : ('idle' as const),\n };\n }\n\n try {\n const partStatuses = await fetchPartStatuses(client, child.id, sessionMessagesTimeoutMs);\n const hasRunningState = partStatuses.some((status) => status === 'running');\n const hasWaitingState = !hasRunningState && partStatuses.some(isWaitingPartStatus);\n const hasActiveState = hasWaitingState || hasRunningState;\n const recentlyActive = childUpdatedAt > 0 && now - childUpdatedAt <= 5 * 60 * 1000;\n\n return {\n parentId,\n child,\n childWaitingForUser: hasWaitingState,\n childStatus: hasActiveState\n ? ('busy' as const)\n : recentlyActive || assumeBusyForUnknown\n ? ('busy' as const)\n : ('idle' as const),\n };\n } catch {\n return {\n parentId,\n child,\n childWaitingForUser: false,\n childStatus: assumeBusyForUnknown ? ('busy' as const) : ('idle' as const),\n };\n }\n })\n );\n\n for (const result of unresolvedChecks) {\n if (result.status !== 'fulfilled') continue;\n if (result.value.childStatus === 'idle') continue;\n const parent = parentById.get(result.value.parentId);\n if (!parent) continue;\n parent.children.push(toChildEntry(result.value.child, result.value.childStatus, result.value.childWaitingForUser));\n }\n }\n\n const parentStatusFallbackCandidates = enrichedSessions\n .filter((session) => {\n if (session.realTimeStatus !== 'idle') return false;\n const updatedAt = getUpdatedAt(session);\n if (updatedAt > 0 && now - updatedAt <= CHILD_ACTIVE_WINDOW_MS) return true;\n return !!session.time?.archived;\n })\n .sort((a, b) => getUpdatedAt(b) - getUpdatedAt(a))\n .slice(0, CHILD_STATUS_MESSAGE_CHECK_LIMIT);\n\n if (parentStatusFallbackCandidates.length > 0) {\n const parentFallbackChecks = await Promise.allSettled(\n parentStatusFallbackCandidates.map(async (session) => {\n const updatedAt = getUpdatedAt(session);\n const assumeBusyForUnknown = updatedAt > 0 && now - updatedAt <= CHILD_UNKNOWN_STATE_BUSY_WINDOW_MS;\n const port = sessionPortMap[session.id];\n const client = port ? clientByPort[port] : undefined;\n\n if (!client) {\n return {\n sessionId: session.id,\n status: assumeBusyForUnknown ? ('busy' as const) : ('idle' as const),\n waitingForUser: false,\n };\n }\n\n try {\n const partStatuses = await fetchPartStatuses(client, session.id, sessionMessagesTimeoutMs);\n const hasRunningState = partStatuses.some((status) => status === 'running');\n const hasWaitingState = !hasRunningState && partStatuses.some(isWaitingPartStatus);\n const hasCompletedState = partStatuses.length > 0 && partStatuses.every((status) => status === 'completed');\n const recentlyActive = hasRecentActivity(session, now);\n\n return {\n sessionId: session.id,\n status: hasRunningState || hasWaitingState\n ? ('busy' as const)\n : hasCompletedState && !recentlyActive\n ? ('idle' as const)\n : assumeBusyForUnknown || recentlyActive\n ? ('busy' as const)\n : ('idle' as const),\n waitingForUser: hasWaitingState,\n };\n } catch {\n return {\n sessionId: session.id,\n status: assumeBusyForUnknown ? ('busy' as const) : ('idle' as const),\n waitingForUser: false,\n };\n }\n })\n );\n\n for (const result of parentFallbackChecks) {\n if (result.status !== 'fulfilled') continue;\n if (result.value.status === 'idle') continue;\n const session = parentById.get(result.value.sessionId);\n if (!session) continue;\n session.realTimeStatus = result.value.status;\n if (result.value.waitingForUser) {\n session.waitingForUser = true;\n }\n }\n }\n\n for (const session of enrichedSessions) {\n if (session.children.length > 0) {\n sortChildEntries(session.children);\n }\n }\n\n const sessionsForInteractionChecks = enrichedSessions.filter(\n (session) =>\n session.realTimeStatus === 'busy' ||\n !!session.time?.archived ||\n session.children.some((child) => child.realTimeStatus === 'busy' || child.realTimeStatus === 'retry')\n );\n\n if (sessionsForInteractionChecks.length > 0) {\n const pendingChecks = await Promise.allSettled(\n sessionsForInteractionChecks.map(async (session) => {\n const port = sessionPortMap[session.id];\n const client = port ? clientByPort[port] : undefined;\n if (!client) {\n return {\n sessionId: session.id,\n parentWaiting: false,\n running: false,\n waitingChildIds: new Set<string>(),\n };\n }\n\n try {\n const partStatuses = await fetchPartStatuses(client, session.id, sessionMessagesTimeoutMs);\n const hasRunning = partStatuses.some((status) => status === 'running');\n const hasInteractionWait = !hasRunning && partStatuses.some(isWaitingPartStatus);\n\n const childStateChecks = await Promise.allSettled(\n session.children\n .filter((child) => child.realTimeStatus === 'busy' || child.realTimeStatus === 'retry')\n .map(async (child) => {\n const childPort = sessionPortMap[child.id] ?? sessionPortMap[session.id];\n const childClient = childPort ? clientByPort[childPort] : undefined;\n if (!childClient) {\n return { childId: child.id, waiting: false };\n }\n\n try {\n const childStatuses = await fetchPartStatuses(childClient, child.id, sessionMessagesTimeoutMs);\n const childHasRunning = childStatuses.some((status) => status === 'running');\n return {\n childId: child.id,\n waiting: !childHasRunning && childStatuses.some(isWaitingPartStatus),\n };\n } catch {\n return { childId: child.id, waiting: false };\n }\n })\n );\n\n const waitingChildIds = new Set(\n childStateChecks\n .filter((entry): entry is PromiseFulfilledResult<{ childId: string; waiting: boolean }> => entry.status === 'fulfilled')\n .filter((entry) => entry.value.waiting)\n .map((entry) => entry.value.childId)\n );\n\n return {\n sessionId: session.id,\n parentWaiting: hasInteractionWait,\n running: hasRunning,\n waitingChildIds,\n };\n } catch {\n return {\n sessionId: session.id,\n parentWaiting: false,\n running: false,\n waitingChildIds: new Set<string>(),\n };\n }\n })\n );\n\n for (const result of pendingChecks) {\n if (result.status !== 'fulfilled') continue;\n const session = enrichedSessions.find((candidate) => candidate.id === result.value.sessionId);\n if (!session) continue;\n\n for (const child of session.children) {\n if (result.value.waitingChildIds.has(child.id)) {\n child.waitingForUser = true;\n }\n }\n\n if (result.value.running) {\n session.realTimeStatus = 'busy';\n }\n if (result.value.parentWaiting) {\n session.waitingForUser = true;\n }\n }\n }\n\n const stickyNow = Date.now();\n const activeStickyIds = new Set<string>();\n for (const session of enrichedSessions) {\n activeStickyIds.add(session.id);\n for (const child of session.children) {\n activeStickyIds.add(`child:${child.id}`);\n }\n }\n\n for (const session of enrichedSessions) {\n if (shouldSkipSessionStatusStabilization(session, stickyNow)) {\n continue;\n }\n\n applyStickyStatusStabilization(session, stickyNow, stickyBusyDelayMs);\n }\n\n pruneStickyState(stickyNow, activeStickyIds);\n\n const knownDirectories = new Set<string>();\n for (const session of uniqueSessions) {\n if (session.directory) {\n knownDirectories.add(session.directory);\n }\n }\n\n const filteredProcessHints = processHints.filter((hint) => !knownDirectories.has(hint.directory));\n\n return {\n ok: true,\n payload: {\n sessions: enrichedSessions,\n processHints: filteredProcessHints,\n ...(failedPorts.length > 0 ? { failedPorts, degraded: true } : {}),\n },\n meta: {\n online: true,\n ...(failedPorts.length > 0 ? { degraded: true } : {}),\n },\n };\n } catch (error) {\n console.error('Error fetching node-local sessions:', error);\n return createLocalFailureResult(\n error instanceof Error && isTimeoutErrorMessage(error.message) ? 'upstream_timeout' : 'upstream_unreachable',\n processHints,\n {\n details: error instanceof Error ? error.message : String(error),\n }\n );\n }\n}\n","import { AppRouteRouteModule } from \"next/dist/esm/server/route-modules/app-route/module.compiled\";\nimport { RouteKind } from \"next/dist/esm/server/route-kind\";\nimport { patchFetch as _patchFetch } from \"next/dist/esm/server/lib/patch-fetch\";\nimport { addRequestMeta, getRequestMeta } from \"next/dist/esm/server/request-meta\";\nimport { getTracer, SpanKind } from \"next/dist/esm/server/lib/trace/tracer\";\nimport { setManifestsSingleton } from \"next/dist/esm/server/app-render/manifests-singleton\";\nimport { normalizeAppPath } from \"next/dist/esm/shared/lib/router/utils/app-paths\";\nimport { NodeNextRequest, NodeNextResponse } from \"next/dist/esm/server/base-http/node\";\nimport { NextRequestAdapter, signalFromNodeResponse } from \"next/dist/esm/server/web/spec-extension/adapters/next-request\";\nimport { BaseServerSpan } from \"next/dist/esm/server/lib/trace/constants\";\nimport { getRevalidateReason } from \"next/dist/esm/server/instrumentation/utils\";\nimport { sendResponse } from \"next/dist/esm/server/send-response\";\nimport { fromNodeOutgoingHttpHeaders, toNodeOutgoingHttpHeaders } from \"next/dist/esm/server/web/utils\";\nimport { getCacheControlHeader } from \"next/dist/esm/server/lib/cache-control\";\nimport { INFINITE_CACHE, NEXT_CACHE_TAGS_HEADER } from \"next/dist/esm/lib/constants\";\nimport { NoFallbackError } from \"next/dist/esm/shared/lib/no-fallback-error.external\";\nimport { CachedRouteKind } from \"next/dist/esm/server/response-cache\";\nimport * as userland from \"INNER_APP_ROUTE\";\n// We inject the nextConfigOutput here so that we can use them in the route\n// module.\nconst nextConfigOutput = \"standalone\"\nconst routeModule = new AppRouteRouteModule({\n definition: {\n kind: RouteKind.APP_ROUTE,\n page: \"/api/node/sessions/route\",\n pathname: \"/api/node/sessions\",\n filename: \"route\",\n bundlePath: \"\"\n },\n distDir: process.env.__NEXT_RELATIVE_DIST_DIR || '',\n relativeProjectDir: process.env.__NEXT_RELATIVE_PROJECT_DIR || '',\n resolvedPagePath: \"[project]/src/app/api/node/sessions/route.ts\",\n nextConfigOutput,\n userland\n});\n// Pull out the exports that we need to expose from the module. This should\n// be eliminated when we've moved the other routes to the new format. These\n// are used to hook into the route.\nconst { workAsyncStorage, workUnitAsyncStorage, serverHooks } = routeModule;\nfunction patchFetch() {\n return _patchFetch({\n workAsyncStorage,\n workUnitAsyncStorage\n });\n}\nexport { routeModule, workAsyncStorage, workUnitAsyncStorage, serverHooks, patchFetch, };\nexport async function handler(req, res, ctx) {\n if (routeModule.isDev) {\n addRequestMeta(req, 'devRequestTimingInternalsEnd', process.hrtime.bigint());\n }\n let srcPage = \"/api/node/sessions/route\";\n // turbopack doesn't normalize `/index` in the page name\n // so we need to to process dynamic routes properly\n // TODO: fix turbopack providing differing value from webpack\n if (process.env.TURBOPACK) {\n srcPage = srcPage.replace(/\\/index$/, '') || '/';\n } else if (srcPage === '/index') {\n // we always normalize /index specifically\n srcPage = '/';\n }\n const multiZoneDraftMode = process.env.__NEXT_MULTI_ZONE_DRAFT_MODE;\n const prepareResult = await routeModule.prepare(req, res, {\n srcPage,\n multiZoneDraftMode\n });\n if (!prepareResult) {\n res.statusCode = 400;\n res.end('Bad Request');\n ctx.waitUntil == null ? void 0 : ctx.waitUntil.call(ctx, Promise.resolve());\n return null;\n }\n const { buildId, params, nextConfig, parsedUrl, isDraftMode, prerenderManifest, routerServerContext, isOnDemandRevalidate, revalidateOnlyGenerated, resolvedPathname, clientReferenceManifest, serverActionsManifest } = prepareResult;\n const normalizedSrcPage = normalizeAppPath(srcPage);\n let isIsr = Boolean(prerenderManifest.dynamicRoutes[normalizedSrcPage] || prerenderManifest.routes[resolvedPathname]);\n const render404 = async ()=>{\n // TODO: should route-module itself handle rendering the 404\n if (routerServerContext == null ? void 0 : routerServerContext.render404) {\n await routerServerContext.render404(req, res, parsedUrl, false);\n } else {\n res.end('This page could not be found');\n }\n return null;\n };\n if (isIsr && !isDraftMode) {\n const isPrerendered = Boolean(prerenderManifest.routes[resolvedPathname]);\n const prerenderInfo = prerenderManifest.dynamicRoutes[normalizedSrcPage];\n if (prerenderInfo) {\n if (prerenderInfo.fallback === false && !isPrerendered) {\n if (nextConfig.experimental.adapterPath) {\n return await render404();\n }\n throw new NoFallbackError();\n }\n }\n }\n let cacheKey = null;\n if (isIsr && !routeModule.isDev && !isDraftMode) {\n cacheKey = resolvedPathname;\n // ensure /index and / is normalized to one key\n cacheKey = cacheKey === '/index' ? '/' : cacheKey;\n }\n const supportsDynamicResponse = // If we're in development, we always support dynamic HTML\n routeModule.isDev === true || // If this is not SSG or does not have static paths, then it supports\n // dynamic HTML.\n !isIsr;\n // This is a revalidation request if the request is for a static\n // page and it is not being resumed from a postponed render and\n // it is not a dynamic RSC request then it is a revalidation\n // request.\n const isStaticGeneration = isIsr && !supportsDynamicResponse;\n // Before rendering (which initializes component tree modules), we have to\n // set the reference manifests to our global store so Server Action's\n // encryption util can access to them at the top level of the page module.\n if (serverActionsManifest && clientReferenceManifest) {\n setManifestsSingleton({\n page: srcPage,\n clientReferenceManifest,\n serverActionsManifest\n });\n }\n const method = req.method || 'GET';\n const tracer = getTracer();\n const activeSpan = tracer.getActiveScopeSpan();\n const context = {\n params,\n prerenderManifest,\n renderOpts: {\n experimental: {\n authInterrupts: Boolean(nextConfig.experimental.authInterrupts)\n },\n cacheComponents: Boolean(nextConfig.cacheComponents),\n supportsDynamicResponse,\n incrementalCache: getRequestMeta(req, 'incrementalCache'),\n cacheLifeProfiles: nextConfig.cacheLife,\n waitUntil: ctx.waitUntil,\n onClose: (cb)=>{\n res.on('close', cb);\n },\n onAfterTaskError: undefined,\n onInstrumentationRequestError: (error, _request, errorContext, silenceLog)=>routeModule.onRequestError(req, error, errorContext, silenceLog, routerServerContext)\n },\n sharedContext: {\n buildId\n }\n };\n const nodeNextReq = new NodeNextRequest(req);\n const nodeNextRes = new NodeNextResponse(res);\n const nextReq = NextRequestAdapter.fromNodeNextRequest(nodeNextReq, signalFromNodeResponse(res));\n try {\n const invokeRouteModule = async (span)=>{\n return routeModule.handle(nextReq, context).finally(()=>{\n if (!span) return;\n span.setAttributes({\n 'http.status_code': res.statusCode,\n 'next.rsc': false\n });\n const rootSpanAttributes = tracer.getRootSpanAttributes();\n // We were unable to get attributes, probably OTEL is not enabled\n if (!rootSpanAttributes) {\n return;\n }\n if (rootSpanAttributes.get('next.span_type') !== BaseServerSpan.handleRequest) {\n console.warn(`Unexpected root span type '${rootSpanAttributes.get('next.span_type')}'. Please report this Next.js issue https://github.com/vercel/next.js`);\n return;\n }\n const route = rootSpanAttributes.get('next.route');\n if (route) {\n const name = `${method} ${route}`;\n span.setAttributes({\n 'next.route': route,\n 'http.route': route,\n 'next.span_name': name\n });\n span.updateName(name);\n } else {\n span.updateName(`${method} ${srcPage}`);\n }\n });\n };\n const isMinimalMode = Boolean(process.env.MINIMAL_MODE || getRequestMeta(req, 'minimalMode'));\n const handleResponse = async (currentSpan)=>{\n var _cacheEntry_value;\n const responseGenerator = async ({ previousCacheEntry })=>{\n try {\n if (!isMinimalMode && isOnDemandRevalidate && revalidateOnlyGenerated && !previousCacheEntry) {\n res.statusCode = 404;\n // on-demand revalidate always sets this header\n res.setHeader('x-nextjs-cache', 'REVALIDATED');\n res.end('This page could not be found');\n return null;\n }\n const response = await invokeRouteModule(currentSpan);\n req.fetchMetrics = context.renderOpts.fetchMetrics;\n let pendingWaitUntil = context.renderOpts.pendingWaitUntil;\n // Attempt using provided waitUntil if available\n // if it's not we fallback to sendResponse's handling\n if (pendingWaitUntil) {\n if (ctx.waitUntil) {\n ctx.waitUntil(pendingWaitUntil);\n pendingWaitUntil = undefined;\n }\n }\n const cacheTags = context.renderOpts.collectedTags;\n // If the request is for a static response, we can cache it so long\n // as it's not edge.\n if (isIsr) {\n const blob = await response.blob();\n // Copy the headers from the response.\n const headers = toNodeOutgoingHttpHeaders(response.headers);\n if (cacheTags) {\n headers[NEXT_CACHE_TAGS_HEADER] = cacheTags;\n }\n if (!headers['content-type'] && blob.type) {\n headers['content-type'] = blob.type;\n }\n const revalidate = typeof context.renderOpts.collectedRevalidate === 'undefined' || context.renderOpts.collectedRevalidate >= INFINITE_CACHE ? false : context.renderOpts.collectedRevalidate;\n const expire = typeof context.renderOpts.collectedExpire === 'undefined' || context.renderOpts.collectedExpire >= INFINITE_CACHE ? undefined : context.renderOpts.collectedExpire;\n // Create the cache entry for the response.\n const cacheEntry = {\n value: {\n kind: CachedRouteKind.APP_ROUTE,\n status: response.status,\n body: Buffer.from(await blob.arrayBuffer()),\n headers\n },\n cacheControl: {\n revalidate,\n expire\n }\n };\n return cacheEntry;\n } else {\n // send response without caching if not ISR\n await sendResponse(nodeNextReq, nodeNextRes, response, context.renderOpts.pendingWaitUntil);\n return null;\n }\n } catch (err) {\n // if this is a background revalidate we need to report\n // the request error here as it won't be bubbled\n if (previousCacheEntry == null ? void 0 : previousCacheEntry.isStale) {\n const silenceLog = false;\n await routeModule.onRequestError(req, err, {\n routerKind: 'App Router',\n routePath: srcPage,\n routeType: 'route',\n revalidateReason: getRevalidateReason({\n isStaticGeneration,\n isOnDemandRevalidate\n })\n }, silenceLog, routerServerContext);\n }\n throw err;\n }\n };\n const cacheEntry = await routeModule.handleResponse({\n req,\n nextConfig,\n cacheKey,\n routeKind: RouteKind.APP_ROUTE,\n isFallback: false,\n prerenderManifest,\n isRoutePPREnabled: false,\n isOnDemandRevalidate,\n revalidateOnlyGenerated,\n responseGenerator,\n waitUntil: ctx.waitUntil,\n isMinimalMode\n });\n // we don't create a cacheEntry for ISR\n if (!isIsr) {\n return null;\n }\n if ((cacheEntry == null ? void 0 : (_cacheEntry_value = cacheEntry.value) == null ? void 0 : _cacheEntry_value.kind) !== CachedRouteKind.APP_ROUTE) {\n var _cacheEntry_value1;\n throw Object.defineProperty(new Error(`Invariant: app-route received invalid cache entry ${cacheEntry == null ? void 0 : (_cacheEntry_value1 = cacheEntry.value) == null ? void 0 : _cacheEntry_value1.kind}`), \"__NEXT_ERROR_CODE\", {\n value: \"E701\",\n enumerable: false,\n configurable: true\n });\n }\n if (!isMinimalMode) {\n res.setHeader('x-nextjs-cache', isOnDemandRevalidate ? 'REVALIDATED' : cacheEntry.isMiss ? 'MISS' : cacheEntry.isStale ? 'STALE' : 'HIT');\n }\n // Draft mode should never be cached\n if (isDraftMode) {\n res.setHeader('Cache-Control', 'private, no-cache, no-store, max-age=0, must-revalidate');\n }\n const headers = fromNodeOutgoingHttpHeaders(cacheEntry.value.headers);\n if (!(isMinimalMode && isIsr)) {\n headers.delete(NEXT_CACHE_TAGS_HEADER);\n }\n // If cache control is already set on the response we don't\n // override it to allow users to customize it via next.config\n if (cacheEntry.cacheControl && !res.getHeader('Cache-Control') && !headers.get('Cache-Control')) {\n headers.set('Cache-Control', getCacheControlHeader(cacheEntry.cacheControl));\n }\n await sendResponse(nodeNextReq, nodeNextRes, // @ts-expect-error - Argument of type 'Buffer<ArrayBufferLike>' is not assignable to parameter of type 'BodyInit | null | undefined'.\n new Response(cacheEntry.value.body, {\n headers,\n status: cacheEntry.value.status || 200\n }));\n return null;\n };\n // TODO: activeSpan code path is for when wrapped by\n // next-server can be removed when this is no longer used\n if (activeSpan) {\n await handleResponse(activeSpan);\n } else {\n await tracer.withPropagatedContext(req.headers, ()=>tracer.trace(BaseServerSpan.handleRequest, {\n spanName: `${method} ${srcPage}`,\n kind: SpanKind.SERVER,\n attributes: {\n 'http.method': method,\n 'http.target': req.url\n }\n }, handleResponse));\n }\n } catch (err) {\n if (!(err instanceof NoFallbackError)) {\n const silenceLog = false;\n await routeModule.onRequestError(req, err, {\n routerKind: 'App Router',\n routePath: normalizedSrcPage,\n routeType: 'route',\n revalidateReason: getRevalidateReason({\n isStaticGeneration,\n isOnDemandRevalidate\n })\n }, silenceLog, routerServerContext);\n }\n // rethrow so that we can handle serving error page\n // If this is during static generation, throw the error again.\n if (isIsr) throw err;\n // Otherwise, send a 500 response.\n await sendResponse(nodeNextReq, nodeNextRes, new Response(null, {\n status: 500\n }));\n return null;\n }\n}\n\n//# sourceMappingURL=app-route.js.map\n"],"names":[],"mappings":"uCCAA,IAAA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,CAAA,CAAA,OAAA,IAAA,EAAA,EAAA,CAAA,CAAA,KDhBA,EAAA,CAAA,CAAA,OAAA,IAAA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,EAAA,CAAA,CAAA,OAIA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,EAAA,CAAA,CAAA,KACA,EAAA,EAAA,CAAA,CAAA,OAOA,EAAA,EAAA,CAAA,CAAA,OAsCA,IAAM,EAAuB,EAAuB,oCAAqC,KACnF,EAAyB,EAAuB,sCAAuC,KACvF,EAA2B,EAAuB,wCAAyC,MAE3F,EAAe,CACnB,OAAQ,QACR,UAAW,QACX,SAAU,OACZ,EAkHM,EAAoB,IAAI,IAExB,EAAwB,IAAI,IAAY,CAC5C,iBACA,iBACA,iBACA,iBACA,iBACA,iBACA,UACA,SACD,EAIM,eAAe,EAAI,CAAgB,EACxC,IAAM,EAAc,CAAA,EAAA,EAAA,gBAAA,AAAgB,EAAC,GACrC,GAAI,CAAC,EAAY,EAAE,CACjB,CADmB,KACZ,CAAA,EAAA,EAAA,0BAAA,AAA0B,EAAC,GAGpC,IAAM,EAAoB,MAAM,IAC1B,EAAS,MAAM,EAAuB,GAE5C,GAAI,CAAC,EAAO,EAAE,CACZ,CADc,KACP,CAAA,EAAA,EAAA,yBAAA,AAAyB,EAAC,EAAO,MAAM,CAAE,EAAO,MAAM,EAG/D,IAAM,EAAa,EAAkB,EAAO,IAAI,EAE1C,EAAsC,CAC1C,IAAI,EACJ,KAAM,OACN,gBAAiB,EAAA,qBAAqB,CACtC,OAAQ,EACR,SAAU,CACR,KAAM,WACN,WAAW,CACb,EACA,SAAU,EAAO,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,AAAC,QAyWJ,EAzWgB,KAyWQ,CAEvD,SADA,EAAe,GA1W8D,GA0WtD,YAAY,EAAI,EAAQ,EAAE,GAC9B,CAAA,EAAA,EAAA,gBAAA,AAAgB,EAAC,EAAa,MAAM,CAAE,GAExD,CACL,GAAG,CAAO,CACV,GAAI,EACJ,SAAU,EAAQ,QAAQ,CAAG,CAAA,EAAA,EAAA,gBAAA,AAAgB,EAAC,EAAa,MAAM,CAAE,EAAQ,QAAQ,EAAI,EAAQ,QAAQ,CACvG,OAAQ,EAAa,MAAM,CAC3B,UAAW,EAAa,SAAS,CACjC,SAAU,EAAa,QAAQ,cAC/B,mBACA,EACA,UAAU,EACV,SAAU,EAAQ,QAAQ,CAAC,GAAG,CAAC,AAAC,QAAU,WA9BtC,EAAe,EAAM,YAAY,EAAI,EAAM,EAAE,CAC7C,EAAmB,CAAA,EAAA,EAAA,gBAAA,AAAgB,EAAC,EAAa,MAAM,CAAE,GAExD,CACL,GAAG,CA0BwE,CAzB3E,GAAI,AADI,EAER,SAAU,EAAM,QAAQ,CAAG,CAAA,EAAA,EAAA,gBAAA,AAAgB,EAAC,EAAa,MAAM,CAAE,EAAM,QAAQ,EAAI,AAwBR,EAxBc,QAAQ,CACjG,OAAQ,EAAa,MAAM,CAC3B,UAAW,EAAa,SAAS,CACjC,SAAU,EAAa,QAAQ,cAC/B,mBACA,EACA,SAAU,EACZ,GAkBA,IAvXE,aAAc,EAAO,OAAO,CAAC,YAAY,CACzC,MAAO,CAAC,EAAW,CACnB,aAAc,CAAC,EAAW,CAC1B,GAAI,EAAO,OAAO,CAAC,WAAW,CAAG,CAAE,YAAa,EAAO,OAAO,CAAC,WAAW,AAAC,EAAI,CAAC,CAAC,CACjF,GAAI,EAAO,OAAO,CAAC,QAAQ,CAAG,CAAE,UAAU,CAAc,EAAI,CAAC,CAAC,AAChE,EAEA,OAAO,SAAS,IAAI,CAAC,EACvB,CAEA,SAAS,EAAuB,CAAY,CAAE,CAAgB,EAE5D,IAAM,EAAS,OADH,AACU,QADF,GAAG,CAAC,EAAK,SAE7B,AAAI,OAAO,QAAQ,CAAC,IAAW,EAAS,EAC/B,CADkC,IAC7B,KAAK,CAAC,GAEb,CACT,CAEA,SAAS,EAAe,CAA8C,CAAE,CAAiB,CAAE,CAAa,EACtG,IAEI,EAFE,EAAmB,AAAJ,MAAU,CAAA,EAAG,EAAM,iBAAiB,EAAE,EAAU,EAAE,CAAC,EAClE,EAAoB,IAAI,gBAExB,EAAiB,IAAI,QAAe,CAAC,EAAG,KAC5C,EAAgB,WAAW,KACzB,EAAkB,KAAK,GACvB,EAAO,EACT,EAAG,EACL,GAUA,OAAO,QAAQ,IAAI,CAAC,CARK,EAAU,EAAkB,MAAM,EAAE,KAAK,CAAC,AAAC,IAClE,GAAI,EAAkB,MAAM,CAAC,OAAO,CAClC,CADoC,KAC9B,CAGR,OAAM,CACR,GAEuC,EAAe,EAAE,OAAO,CAAC,KAC1D,GACF,YADiB,CACJ,EAEjB,EACF,CAEA,SAAS,EAAoB,CAAc,EACzC,OAAO,EAAO,IAAI,GAAG,WAAW,EAClC,CAEA,SAAS,EAAoB,CAAc,EACzC,OAAO,EAAsB,GAAG,CAAC,EAAoB,GACvD,CAoBA,eAAe,EACb,CAA+C,CAC/C,CAAiB,CACjB,CAAiB,MArBU,EAiCT,CAVK,KAvB8C,CAuBxC,EAC3B,AAAC,GACC,EAAO,OAAO,CAAC,QAAQ,CAAC,CACtB,KAAM,CAAE,GAAI,CAAU,EACtB,MAAO,CAAE,MAAO,CAAE,SAClB,CACF,GACF,EACA,CAAC,iBAAiB,EAAE,EAAU,CAAC,EAAC,EAED,IAAI,EAAI,EAAE,CAhC3C,IAAM,EAAqC,EAAE,CAE7C,IAAK,IAAM,KAAW,EACpB,IAAK,GADyB,CACnB,KAAQ,EAAQ,KAAK,EAAI,EAAE,CAAE,CACtC,IAAM,EAAS,GAAM,OAAO,OAC5B,GAAsB,UAAlB,OAAO,EAAqB,CAC9B,IAAM,EAAa,EAAoB,GACnC,GACF,EAAa,IAAI,CAAC,EADJ,AAGlB,CACF,CAGF,OAAO,CAoBT,CAEA,SAAS,EAAa,CAA0D,EAC9E,OAAO,EAAQ,IAAI,EAAE,SAAW,EAAQ,IAAI,EAAE,SAAW,CAC3D,CAEA,SAAS,EAAwB,CAAyB,QACxD,AAAI,AAAU,YAAU,AAAU,SAAS,GAAO,EAC3C,MACT,CAEA,SAAS,EAAuB,CAAiB,EAC/C,EAAkB,MAAM,CAAC,GACzB,EAAkB,MAAM,CAAC,CAAC,MAAM,EAAE,EAAA,CAAW,CAC/C,CAEA,SAAS,EACP,CAAU,CACV,CAA4B,CAC5B,CAAW,CACX,CAA0B,EAE1B,IAAM,EAAW,EAAkB,GAAG,CAAC,IAAO,CAAE,WAAY,EAAG,WAAY,CAAI,EAE/E,GAAI,AAAW,QAAQ,GAIrB,OAHA,EAAS,UAAU,CAAG,EACtB,EAAS,UAAU,CAAG,EACtB,EAAkB,GAAG,CAAC,EAAI,GACnB,EAGT,GAAI,AAAW,SAAS,GAGtB,OAFA,EAAS,UAAU,CAAG,EACtB,EAAkB,GAAG,CAAC,EAAI,GACnB,EAGT,IAAM,EAAiB,EAAS,UAAU,CAAG,GAAK,EAAM,EAAS,UAAU,EAAI,EAG/E,OAFA,EAAS,UAAU,CAAG,EACtB,EAAkB,GAAG,CAAC,EAAI,GACnB,EAAiB,OAAS,MACnC,CAUA,SAAS,EAAiB,CAAW,CAAE,CAAsB,MAPrD,EAQN,IAAK,GAAM,CAAC,EAAI,EAAM,GAAI,EAAmB,CAC3C,IAAM,EAAQ,EAAM,EAAM,UAAU,CAC9B,EAAW,EAAU,GAAG,CAAC,GAC3B,GArT2B,KAAK,AAqTxB,EAA+B,CAAC,EArTH,CAqTe,EApTlB,EADQ,EAqTkB,CApTrB,CAoTqB,CAAoC,AAClG,EAAkB,CArT4B,KAqTtB,CAAC,EAE7B,CAEA,IAAM,EAfF,OAAO,IAeQ,IAfA,CAAC,EADR,OAAO,QAAQ,GAAG,CAAC,kCAAkC,IACrC,EAAM,EACzB,CAD4B,IACvB,KAAK,CAAC,GA1SoB,IAyTxC,GAAI,EAAkB,IAAI,EAAI,EAC5B,OAGF,GAJ0C,CAIpC,EAAW,EAAkB,IAAI,CAAG,EACpC,EAAmB,MAAM,IAAI,CAAC,EAAkB,OAAO,IAAI,IAAI,CAAC,CAAC,EAAG,IAAM,CAAC,CAAC,EAAE,CAAC,UAAU,CAAG,CAAC,CAAC,EAAE,CAAC,UAAU,EAE7G,EAAU,EACd,IAAK,GAAM,CAAC,EAAG,GAAI,EAAkB,CACnC,GAAI,GAAW,EAAU,OACrB,EAAU,GAAG,CAAC,KAAK,AACvB,EAAkB,MAAM,CAAC,GACzB,IACF,CAEA,KAAI,GAAW,CAAA,EAIf,CAJyB,GAIpB,GAAM,CAAC,EAAG,GAAI,EAAkB,CACnC,GAAI,GAAW,EAAU,MACpB,EAAkB,GAAG,CAAC,KAAK,AAChC,EAAkB,MAAM,CAAC,GACzB,IACF,CACF,CAQA,SAAS,EACP,CAAkB,CAClB,CAA4B,CAC5B,GAAiB,CAAK,EAEtB,MAAO,CACL,GAAI,EAAM,EAAE,CACZ,KAAM,EAAM,IAAI,CAChB,MAAO,EAAM,KAAK,CAClB,UAAW,EAAM,SAAS,CAC1B,YAAa,EAAM,WAAW,CAC9B,SAAU,EAAM,QAAQ,CACxB,KAAM,EAAM,IAAI,CAChB,eAAgB,iBAChB,CACF,CACF,CA+EA,SAAS,EAAe,CAAiB,EACvC,OAAO,EAAA,OAAI,CAAC,QAAQ,CAAC,EACvB,CA+BA,eAAe,IACb,IAAI,EAAoB,IACxB,GAAI,CACF,IAAM,EAAS,MAAM,CAAA,EAAA,EAAA,UAAA,AAAU,IAMzB,EAAc,CAJlB,EAAO,MAIoB,GAJX,EAAgC,UAA5B,OAAO,EAAO,SAAS,EAAiB,CAAC,MAAM,OAAO,CAAC,EAAO,SAAS,EACvF,EAAO,SAAS,CAChB,CAAC,GAEuB,iBAAoB,CACvB,UAAvB,OAAO,GAA4B,OAAO,QAAQ,CAAC,IAAgB,GAAe,GAAG,CACvF,EAAoB,CAAA,CAExB,CAAE,KAAM,CACR,CAEA,OAAO,CACT,CAmDA,SAAS,EAAkB,CAAqB,EAC9C,MAAO,CACL,OAAQ,EAAa,MAAM,CAC3B,UAAW,EAAa,SAAS,CACjC,SAAU,EAAa,QAAQ,CAC/B,OAAQ,EAAK,MAAM,CACnB,GAAI,EAAK,QAAQ,CAAG,CAAE,UAAU,CAAK,EAAI,CAAC,CAAC,CAC3C,GAAI,EAAK,MAAM,CAAG,CAAE,OAAQ,EAAK,MAAM,AAAC,EAAI,CAAC,CAC/C,AADgD,CAElD,CAEA,SAAS,EAAsB,CAAa,EAC1C,OAAO,EAAM,WAAW,GAAG,QAAQ,CAAC,YACtC,CAgBA,SAAS,EACP,CAAyB,CACzB,CAA2B,CAC3B,EAAkC,CAAC,CAAC,EAEpC,IAAM,EAlBN,AAAI,AAAW,YAkBK,QAlBe,CAkBA,EAjB1B,CACL,aAAc,+BACd,WAAW,CACb,EAGK,CACL,aAAc,4BACd,WAAW,CACb,EASM,EAAa,EAAkB,CACnC,QAAQ,EACR,UAAU,EACV,OAAQ,EAAY,YAAY,AAClC,GAEA,MAAO,CACL,IAAI,EACJ,SACA,OAAQ,CACN,KAAM,OACN,OAAQ,EACR,SAAU,CACR,KAAM,WACN,UAAW,EAAY,SAAS,AAClC,eACA,EACA,MAAO,CAAC,EAAW,CACnB,aAAc,CAAC,EAAW,CAC1B,GAAG,CAAM,AACX,CACF,CACF,CAUA,eAAe,EAAuB,CAAyB,EAC7D,GAAM,CAAE,UAAW,CAAe,CAAE,SAAU,CAAwB,CAAE,CACtE,CAAA,EAAA,EAAA,8CAAA,AAA8C,IAC1C,EAA0B,IAAI,IACpC,IAAK,IAAM,KAAW,IAChB,CAAC,EAAQ,GAAG,EAAI,EAAQ,EADS,CACN,CAAC,UAAU,CAAC,wBAAA,GAA0B,CAGjE,EAAwB,GAAG,CAAC,EAAQ,GAAG,GAAG,AAG9C,EAAwB,GAAG,CAAC,EAAQ,GAAG,CAAE,CACvC,IAAK,EAAQ,GAAG,CAChB,UAAW,EAAQ,GAAG,CACtB,YAAa,EAAe,EAAQ,GAAG,EACvC,OAAQ,0BACV,IAGF,IAAM,EAAe,MAAM,IAAI,CAAC,EAAwB,MAAM,IACxD,OAAE,CAAK,CAAE,SAAU,CAAqB,CAAE,CAAG,CAAA,EAAA,EAAA,6BAAA,AAA6B,IAEhF,GAAI,CAAC,EAAM,MAAM,EAAE,MACjB,AAAI,GAAyB,EACpB,EAAyB,mBAAoB,GADC,AAIhD,EAAyB,uBAAwB,GAG1D,GAAI,KAtCoC,EAuCtC,IAAM,EAAU,AAvCwC,MAuClC,QAAQ,UAAU,CACtC,EAAM,GAAG,CAAC,MAAO,IACf,IAAM,EAAS,CAAA,EAAA,EAAA,oBAAA,AAAoB,EAAC,CAAE,QAAS,CAAC,iBAAiB,EAAE,EAAA,CAAM,AAAC,GACpE,EAAiB,MAAM,EAC3B,AAAC,GAAW,EAAO,OAAO,CAAC,IAAI,CAAC,QAAE,CAAO,GACzC,EACA,CAAC,aAAa,EAAE,EAAK,CAAC,CAAC,EAEnB,EAAe,MAAM,EACzB,AAAC,GAAW,EAAO,OAAO,CAAC,MAAM,CAAC,QAAE,CAAO,GAC3C,EACA,CAAC,eAAe,EAAE,EAAK,CAAC,CAAC,EACzB,KAAK,CAAC,IAAM,CAAC,CAAE,KAAM,CAAC,EAAE,CAAC,EAC3B,MAAO,MAAE,SAAM,EAAQ,SAAU,EAAe,IAAI,EAAI,EAAE,CAAE,OAAQ,EAAa,IAAI,EAAI,CAAC,CAAE,CAC9F,IAGI,EAA6B,EAAE,CAC/B,EAA4D,CAAC,EAC7D,EAAwE,CAAC,EACzE,EAAyC,CAAC,EAC1C,EAAuD,EAAE,CAE/D,IAAK,IAAI,EAAI,EAAG,EAAI,EAAQ,MAAM,CAAE,IAAK,CACvC,IAAM,EAAS,CAAO,CAAC,EAAE,CACnB,EAAO,CAAK,CAAC,EAAE,CAErB,GAAsB,cAAlB,EAAO,MAAM,CAAkB,CACjC,EAAY,IAAI,CAAC,CACf,OACA,OAAQ,EAAO,MAAM,YAAY,MAAQ,EAAO,MAAM,CAAC,OAAO,CAAG,OAAO,EAAO,MAAM,CACvF,GACA,QACF,CAKA,IAAK,IAAM,KAHX,EAAY,IAAI,IAAK,EAAO,KAAK,CAAC,QAAQ,EAC1C,OAAO,MAAM,CAAC,EAAW,EAAO,KAAK,CAAC,MAAM,EAC5C,CAAY,CAAC,EAAO,KAAK,CAAC,IAAI,CAAC,CAAG,EAAO,KAAK,CAAC,MAAM,CAC/B,EAAO,KAAK,CAAC,QAAQ,CAAmB,CACxD,AAAE,CAAD,CAAS,EAAE,IAAI,IAClB,CAAc,CAAC,EAAQ,EAAE,CAAC,CAAG,EADG,AACI,GADD,EACM,CAAC,IAAA,AAAI,CAGpD,CAEA,IAAM,EAAgC,EAAE,CAClC,EAAO,IAAI,IACjB,IAAK,IAAM,KAAW,EAChB,EAAK,GAAG,CAAC,EAAQ,EADY,AACV,GAAG,CAG1B,EAAK,GAAG,CAAC,EAAQ,EAAE,EACnB,EAAe,IAAI,CAAC,IAGtB,IAAM,EAAiB,EAAe,MAAM,CAAC,AAAC,GAAY,CAAC,EAAQ,QAAQ,EACrE,EAAgB,EAAe,MAAM,CAAC,AAAC,GAAY,CAAC,CAAC,EAAQ,QAAQ,EAErE,EAAe,KAAK,GAAG,GAI7B,IAAK,IAAM,KAHX,CAAA,EAAA,EAAA,2BAAA,AAA2B,EAAC,GAC5B,CAAA,EAAA,EAAA,+BAA+B,AAA/B,EAAgC,GAEV,GAChB,EAAQ,IAAI,EAAE,IADkB,YACL,GAAa,CAAA,EAAA,EAAA,4BAAA,AAA4B,EAAC,EAAQ,EAAE,CAAE,KACnF,EAAQ,IAAI,CAAG,CACb,EAFgG,CAE7F,EAAQ,IAAI,CACf,cAAU,EACZ,EAIJ,IAAK,IAAM,KAAS,EACd,EAAM,IAAI,EAAE,IADiB,YACJ,GAAa,CAAA,EAAA,EAAA,4BAAA,AAA4B,EAAC,EAAM,EAAE,CAAE,KAC/E,EAAM,IAAI,CAAG,CACX,EAF4F,CAEzF,EAAM,IAAI,CACb,cAAU,CACZ,GAIJ,GAAI,EAAQ,MAAM,CAAG,GAAK,EAAY,MAAM,GAAK,EAAQ,MAAM,CAE7D,CAF+D,MAC/D,EAAiB,KAAK,GAAG,GAAI,IAAI,KAC1B,EAxHX,AAAI,GAwHiE,EAAY,GAAG,CAAE,AAAD,GAAW,EAAM,MAAM,GAxH/F,AAwHuB,MAxHjB,CAAG,GAAK,EAAS,KAAK,CAAC,GACjC,mBAGF,EAJ2D,qBAwH8C,EAAc,aACxH,CACF,GAGF,IAAM,EAAsC,EAAe,GAAG,CAAC,AAAC,IAAa,CAC3E,GAAG,CAAO,CADgE,AAE1E,YAAa,EAAe,EAAQ,SAAS,EAC7C,OAAQ,AA/Qd,SAAS,AAAa,CAAiB,EACrC,GAAI,CAfN,AAeO,SAfE,AAAU,CAAiB,EAClC,GAAI,CACF,IAAM,EAAS,CAAA,EAAA,EAAA,QAAQ,AAAR,EAAS,sCAAuC,CAC7D,IAAK,EACL,SAAU,QACV,MAAO,CAAC,SAAU,OAAQ,SAAS,CACnC,SAAS,GACX,GACA,MAAyB,SAAlB,EAAO,IAAI,EACpB,CAAE,KAAM,CACN,OAAO,CACT,CACF,EAGiB,GAAY,OAAO,KAClC,GAAI,CAOF,MAAO,AANQ,CAAA,EAAA,EAAA,QAAA,AAAQ,EAAC,4BAA6B,CACnD,IAAK,EACL,SAAU,QACV,MAAO,CAAC,SAAU,OAAQ,SAAS,CACnC,QAjdyB,CAidhB,GACX,GACc,IAAI,IAAM,IAC1B,CAAE,KAAM,CACN,OAAO,IACT,CACF,EAkQ2B,EAAQ,SAAS,EACtC,eAAgB,CAAS,CAAC,EAAQ,EAAE,CAAC,EAAE,MAAQ,OAC/C,gBAAgB,EAChB,SAAU,EAAE,CACd,CAAC,EAEK,EAAa,IAAI,IAAI,EAAiB,GAAG,CAAC,AAAC,GAAY,CAAC,EAAQ,EAAE,CAAE,EAAQ,GAC5E,EAAM,KAAK,GAAG,GACd,EAA8F,EAAE,CAEtG,IAAK,IAAM,KAAS,EAAe,CACjC,IAAI,EAAS,EAAM,QAAQ,CAAG,EAAW,GAAG,CAAC,EAAM,QAAQ,OAAI,EAE/D,GAAI,CAAC,EAAQ,CACX,IAAM,EAAa,EAChB,MAAM,CAAC,AAAC,GAAY,EAAQ,SAAS,GAAK,EAAM,SAAS,EACzD,IAAI,CAAC,CAAC,EAAG,IAAM,EAAa,GAAK,EAAa,IAEjD,EACE,EAAW,IAAI,CAAC,AAAC,GAAuC,SAA3B,EAAQ,cAAc,EAA0C,UAA3B,EAAQ,cAAc,GACxF,CAAU,CAAC,EAAE,AACjB,CAEA,GAAI,CAAC,EACH,MADW,GAIb,IAAM,EAAgB,CAAS,CAAC,EAAM,EAAE,CAAC,EAAE,KACrC,EAAiB,EAAa,GAC9B,EAAW,EAAiB,GAAK,EAAM,SACb,CAAC,AAAC,EAAM,IAAI,EAAE,AADiB,UACL,CAAC,GAAiB,CAAC,CAAA,IAMzE,GAAmC,QAAQ,CAA1B,EACnB,EAAO,QAAQ,CAAC,IAAI,CAAC,EAAa,EAAO,IAChC,GACL,EAAmB,KADJ,CACU,GAAG,EAC9B,EAAmB,IAAI,CAAC,CAAE,SAAU,EAAO,EAAE,OAAE,IADiB,aACV,CAAe,GAG3E,CAEA,GAAI,EAAmB,MAAM,CAAG,EA0C9B,CA1CiC,GA0C5B,IAAM,KAzCc,KAyCJ,CAzCU,QAAQ,UAAU,CAC/C,EAAmB,GAAG,CAAC,MAAO,UAAE,CAAQ,OAAE,CAAK,gBAAE,CAAc,CAAE,IAC/D,IAAM,EAAO,CAAc,CAAC,EAAM,EAAE,CAAC,EAAI,CAAc,CAAC,EAAS,CAC3D,EAAS,EAAO,CAAY,CAAC,EAAK,MAAG,EACrC,EAAuB,EAAiB,GAAK,EAAM,QACzD,GAAI,CAAC,EACH,IAFyE,EAC9D,AACJ,UACL,QACA,EACA,YAAa,EAAwB,OAAoB,MAC3D,EAGF,GAAI,CACF,IAAM,EAAe,MAAM,EAAkB,EAAQ,EAAM,EAAE,CAAE,GACzD,EAAkB,EAAa,IAAI,CAAC,AAAC,GAAsB,YAAX,GAChD,EAAkB,CAAC,GAAmB,EAAa,IAAI,CAAC,GAI9D,MAAO,UACL,QACA,EACA,oBAAqB,EACrB,WAAA,CAPqB,CAOR,EAP2B,GACnB,EAAiB,GAAK,EAAM,GAAkB,EAO9D,EAPkE,CAQjD,EACf,EATqE,EAQxE,GAEG,MACT,CACF,CAAE,KAAM,CACN,MAAO,UACL,QACA,EACA,qBAAqB,EACrB,YAAa,EAAwB,OAAoB,MAC3D,CACF,CACF,GAAA,EAGqC,CACrC,GAAsB,cAAlB,EAAO,MAAM,EACgB,QAAQ,CAArC,EAAO,KAAK,CAAC,WAAW,CADO,SAEnC,IAAM,EAAS,EAAW,GAAG,CAAC,EAAO,KAAK,CAAC,QAAQ,EAC9C,GACL,EAAO,GADM,KACE,CAAC,IAAI,CAAC,EAAa,EAAO,KAAK,CAAC,KAAK,CAAE,EAAO,KAAK,CAAC,WAAW,CAAE,EAAO,KAAK,CAAC,mBAAmB,EAClH,CAGF,IAAM,EAAiC,EACpC,MAAM,CAAE,AAAD,IACN,GAA+B,SAA3B,EAAQ,cAAc,CAAa,OAAO,EAC9C,IAAM,EAAY,EAAa,UAC/B,AAAI,EAAY,GAAK,EAAM,GAp0BJ,KAAK,CAq0BrB,CAAC,CAAC,EAD+B,AAp0BP,AAq0BhB,IAAI,EAAE,QACzB,GACC,IAAI,CAAC,CAAC,CAH2D,CAGxD,IAAM,EAAa,AAH4C,GAGvC,EAAa,IAC9C,KAAK,CAAC,EAt0B4B,CAs0BzB,GAEZ,GAAI,EAA+B,MAAM,CAAG,EA4C1C,CA5C6C,GA4CxC,IAAM,KA3CkB,KA2CR,CA3Cc,QAAQ,UAAU,CACnD,EAA+B,GAAG,CAAC,MAAO,IACxC,IAAM,EAAY,EAAa,GACzB,EAAuB,EAAY,GAAK,EAAM,GA70BnB,IAAI,CA80B/B,EAAO,CAAc,CAAC,AA90Bc,CA60BuB,CAC7B,EAAE,CAAC,CACjC,EAAS,EAAO,CAAY,CAAC,EAAK,MAAG,EAE3C,GAAI,CAAC,EACH,MADW,AACJ,CACL,UAAW,EAAQ,EAAE,CACrB,OAAQ,EAAwB,OAAoB,OACpD,gBAAgB,CAClB,EAGF,GAAI,CACF,MAAM,EAAe,MAAM,EAAkB,EAAQ,EAAQ,EAAE,CAAE,GAC3D,EAAkB,EAAa,IAAI,CAAC,AAAC,GAAsB,YAAX,GAChD,EAAkB,CAAC,GAAmB,EAAa,IAAI,CAAC,GACxD,EAAoB,EAAa,MAAM,CAAG,GAAK,EAAa,KAAK,CAAC,AAAC,GAAsB,cAAX,GAC9E,EAngBhB,CAAI,CAAC,CADC,EAogB6C,AApgBjC,EAAQ,IAAI,EAAE,AAChB,EAmgBiB,KAngBV,GAmgBqC,AAlgBrD,EAAM,GA1VmB,IA81BtB,CA91B2B,KA81BpB,AApgBS,CAqgBd,UAAW,EAAQ,EAAE,CACrB,OAAQ,GAAmB,EACtB,OACD,GAAqB,CAAC,EACnB,OACD,GAAwB,EACrB,OACA,OACT,eAAgB,CAClB,CACF,CAAE,KAAM,CACN,MAAO,CACL,UAAW,EAAQ,EAAE,CACrB,OAAQ,EAAwB,OAAoB,OACpD,gBAAgB,CAClB,CACF,CACF,GAAA,EAGyC,CACzC,GAAsB,cAAlB,EAAO,MAAM,EACW,QAAQ,CAAhC,EAAO,KAAK,CAAC,MAAM,CADY,SAEnC,IAAM,EAAU,EAAW,GAAG,CAAC,EAAO,KAAK,CAAC,SAAS,EAChD,IACL,EAAQ,GADM,WACQ,CAAG,EAAO,KAAK,CAAC,MAAM,CACxC,EAAO,KAAK,CAAC,cAAc,EAAE,CAC/B,EAAQ,cAAc,EAAG,CAAA,EAE7B,CAGF,IAAK,IAAM,KAAW,EAChB,EAAQ,QAAQ,CAAC,IADiB,EACX,CAAG,GA/YlC,AA+YqC,AACd,EAAQ,QAAQ,CAhZ9B,IAAI,CAAC,CAAC,EAAG,KAChB,IAAM,EAA+B,SAArB,EAAE,cAAc,EAAoC,UAArB,EAAE,cAAc,CACzD,EAA+B,SAArB,EAAE,cAAc,EAAe,AAAqB,YAAnB,cAAc,CAE/D,GAAI,GAAW,CAAC,EAAS,OAAO,CAAC,EACjC,GAAI,CAAC,GAAW,EAAS,OAAO,EAEhC,IAAM,EAAQ,EAAE,IAAI,EAAE,SAAW,EAAE,IAAI,EAAE,SAAW,EAEpD,MAAO,CADO,EAAE,IAAI,EAAE,SAAW,EAAE,IAAI,EAAE,UAAW,EACrC,CACjB,GA0YE,IAAM,EAA+B,EAAiB,MAAM,CAC1D,AAAC,GAC4B,SAA3B,EAAQ,cAAc,EACtB,CAAC,CAAC,EAAQ,IAAI,EAAE,UAChB,EAAQ,QAAQ,CAAC,IAAI,CAAC,AAAC,GAAmC,SAAzB,EAAM,cAAc,EAAwC,UAAzB,EAAM,cAAc,GAG5F,GAAI,EAA6B,MAAM,CAAG,EAkExC,CAlE2C,GAkEtC,IAAM,KAjEW,KAiED,CAjEO,QAAQ,UAAU,CAC5C,EAA6B,GAAG,CAAC,MAAO,IACtC,IAAM,EAAO,CAAc,CAAC,EAAQ,EAAE,CAAC,CACjC,EAAS,EAAO,CAAY,CAAC,EAAK,MAAG,EAC3C,GAAI,CAAC,EACH,MADW,AACJ,CACL,UAAW,EAAQ,EAAE,CACrB,eAAe,EACf,SAAS,EACT,gBAAiB,IAAI,GACvB,EAGF,GAAI,CACF,IAAM,EAAe,MAAM,EAAkB,EAAQ,EAAQ,EAAE,CAAE,GAC3D,EAAa,EAAa,IAAI,CAAC,AAAC,GAAsB,YAAX,GAC3C,EAAqB,CAAC,GAAc,EAAa,IAAI,CAAC,GAEtD,EAAmB,MAAM,QAAQ,UAAU,CAC/C,EAAQ,QAAQ,CACb,MAAM,CAAC,AAAC,GAAmC,SAAzB,EAAM,cAAc,EAAwC,UAAzB,EAAM,cAAc,EACzE,GAAG,CAAC,MAAO,IACV,IAAM,EAAY,CAAc,CAAC,EAAM,EAAE,CAAC,EAAI,CAAc,CAAC,EAAQ,EAAE,CAAC,CAClE,EAAc,EAAY,CAAY,CAAC,EAAU,MAAG,EAC1D,GAAI,CAAC,EACH,MAAO,CAAE,IADO,IACE,EAAM,EAAE,CAAE,SAAS,CAAM,EAG7C,GAAI,CACF,IAAM,EAAgB,MAAM,EAAkB,EAAa,EAAM,EAAE,CAAE,GAC/D,EAAkB,EAAc,IAAI,CAAC,AAAC,GAAsB,YAAX,GACvD,MAAO,CACL,QAAS,EAAM,EAAE,CACjB,QAAS,CAAC,GAAmB,EAAc,IAAI,CAAC,EAClD,CACF,CAAE,KAAM,CACN,MAAO,CAAE,QAAS,EAAM,EAAE,CAAE,SAAS,CAAM,CAC7C,CACF,IAGE,EAAkB,IAAI,IAC1B,EACG,MAAM,CAAE,AAAD,GAAoG,cAAjB,EAAM,MAAM,EACtG,MAAM,CAAC,AAAC,GAAU,EAAM,KAAK,CAAC,OAAO,EACrC,GAAG,CAAC,AAAC,GAAU,EAAM,KAAK,CAAC,OAAO,GAGvC,MAAO,CACL,UAAW,EAAQ,EAAE,CACrB,cAAe,EACf,QAAS,kBACT,CACF,CACF,CAAE,KAAM,CACN,MAAO,CACL,UAAW,EAAQ,EAAE,CACrB,eAAe,EACf,SAAS,EACT,gBAAiB,IAAI,GACvB,CACF,CACF,GAAA,EAGkC,CAClC,GAAsB,cAAlB,EAAO,MAAM,CAAkB,SACnC,IAAM,EAAU,EAAiB,IAAI,CAAC,AAAC,GAAc,EAAU,EAAE,GAAK,EAAO,KAAK,CAAC,SAAS,EAC5F,GAAK,CAAD,EAEJ,IAAK,EAFS,EAEH,KAAS,EAAQ,QAAQ,CAAE,AAChC,EAAO,KAAK,CAAC,eAAe,CAAC,GAAG,CAAC,EAAM,EAAE,GAAG,CAC9C,EAAM,cAAc,CAAG,EAAA,EAIvB,EAAO,KAAK,CAAC,OAAO,EAAE,CACxB,EAAQ,cAAc,CAAG,MAAA,EAEvB,EAAO,KAAK,CAAC,aAAa,EAAE,AAC9B,GAAQ,cAAc,EAAG,CAAA,EAE7B,CAGF,IAAM,EAAY,KAAK,GAAG,GACpB,EAAkB,IAAI,IAC5B,IAAK,IAAM,KAAW,EAEpB,IAAK,IAAM,KADX,EADsC,AACtB,GAAG,CAAC,EAAQ,EAAE,EACV,EAAQ,QAAQ,CAAE,CACpC,EAAgB,GAAG,CAAC,CAAC,MAAM,EAAE,EAAM,EAAE,CAAA,CAAE,EAI3C,IAAK,IAAM,KAAW,GA/mBxB,EAAI,CAAA,EAAA,EAAA,OA+mBsC,uBA/mBR,AAA9B,EAA+B,EAAQ,EAAE,CAgnBS,CAhnBP,GAK3C,EAAQ,CALyC,GAKrC,EA2mBkD,AA3mBhD,UAAU,EAJ1B,AAdJ,SAAwC,AAA/B,CAAwE,EAG/E,IAAK,IAAM,KAFX,EAAuB,EAAQ,EAAE,AAaA,EAZjC,CAAA,EAAA,EAAA,2BAAA,AAA2B,EAAC,EAAQ,EAAE,EAClB,EAAQ,QAAQ,CAAE,CACpC,EAAuB,CAAC,MAAM,EAAE,EAAM,EAAE,CAAA,CAAE,EAC1C,CAAA,EAAA,EAAA,2BAAA,AAA2B,EAAC,EAAM,EAAE,CAExC,EAsnB+C,KA7mB7C,GAUF,AAumBM,SAtmBJ,AADO,CACkC,CACzC,CAAiB,CACjB,CAAyB,EAEzB,IAAK,IAAM,KAAS,EAAQ,QAAQ,CAAE,CACpC,GAAI,EAAM,IAAI,EAAE,SAAU,CACxB,EAAuB,CAAC,MAAM,EAAE,EAAM,EAAE,CAAA,CAAE,EAC1C,CAAA,EAAA,EAAA,2BAAA,AAA2B,EAAC,EAAM,EAAE,EACpC,QACF,CAEA,IAAM,EAAwB,EAAwB,EAAM,cAAc,EACpE,EACJ,EAAM,cAAc,EAA8B,SAA1B,EAAmC,QAAU,CACvE,GAAM,cAAc,CAAG,EACrB,CAAC,MAAM,EAAE,EAAM,EAAE,CAAA,CAAE,CACnB,EACA,EACA,IAG2B,SAAzB,EAAM,cAAc,EAAwC,UAAzB,EAAM,cAAc,EAAgB,EAAM,cAAA,AAAc,EAAE,CAC/F,CAAA,EAAA,EAAA,0BAAA,AAA0B,EAAC,EAAM,EAAE,CAAE,EAEzC,CAEA,IAAM,EAA0B,EAAwB,EAAQ,cAAc,EACxE,EACJ,EAAQ,cAAc,EAAgC,SAA5B,EAAqC,QAAU,EAC3E,EAAQ,cAAc,CAAG,EACvB,EAAQ,EAAE,CACV,EACA,EACA,GAGF,IAAM,EAAoB,EAAQ,QAAQ,CAAC,IAAI,CAC7C,AAAC,GAAmC,SAAzB,EAAM,cAAc,EAAwC,UAAzB,EAAM,cAAc,EAAgB,EAAM,cAAc,CAQpG,EALyB,SAA3B,EAAQ,QAKe,MALD,EACK,UAA3B,EAAQ,cAAc,EACtB,EAAQ,cAAc,EACtB,CAAA,GAGA,CAAA,EAAA,EAAA,0BAAA,AAA0B,EAAC,EAAQ,EAAE,CAAE,EAE3C,EAsjBqC,EAAS,EAAW,GAGrD,EAAiB,EAAW,GAE5B,IAAM,EAAmB,IAAI,IAC7B,IAAK,IAAM,KAAW,EAChB,EAAQ,SAAS,EADe,AACb,AACrB,EAAiB,GAAG,CAAC,EAAQ,SAAS,EAI1C,IAAM,EAAuB,EAAa,MAAM,CAAC,AAAC,GAAS,CAAC,EAAiB,GAAG,CAAC,EAAK,SAAS,GAE/F,MAAO,CACL,IAAI,EACJ,QAAS,CACP,SAAU,EACV,aAAc,EACd,GAAI,EAAY,MAAM,CAAG,EAAI,aAAE,EAAa,SAAU,EAAK,EAAI,CAAC,CAAC,AACnE,EACA,KAAM,CACJ,QAAQ,EACR,GAAI,EAAY,MAAM,CAAG,EAAI,CAAE,UAAU,CAAK,EAAI,CAAC,CAAC,AACtD,CACF,CACF,CAAE,MAAO,EAAO,CAEd,OADA,QAAQ,KAAK,CAAC,sCAAuC,GAC9C,EACL,aAAiB,OAAS,EAAsB,EAAM,OAAO,EAAI,mBAAqB,uBACtF,EACA,CACE,QAAS,aAAiB,MAAQ,EAAM,OAAO,CAAG,OAAO,EAC3D,EAEJ,CACF,8BAx4BuB,wBC5KvB,IAAA,EAAA,EAAA,CAAA,CAAA,OAIA,IAAM,EAAc,IAAI,EAAA,mBAAmB,CAAC,CACxC,WAAY,CACR,KAAM,EAAA,SAAS,CAAC,SAAS,CACzB,KAAM,2BACN,SAAU,qBACV,SAAU,QACV,WAAY,EAChB,EACA,QAAS,CAAA,OACT,IADiD,eACc,CAA3C,EACpB,iBAAkB,+CAClB,iBAZqB,aAarB,SAAA,CACJ,GAIM,CAAE,kBAAgB,CAAE,sBAAoB,CAAE,cAAW,CAAE,CAAG,EAChE,SAAS,KACL,MAAO,CAAA,EAAA,EAAA,UAAA,AAAW,EAAC,kBACf,uBACA,CACJ,EACJ,CAEO,eAAe,GAAQ,CAAG,CAAE,CAAG,CAAE,CAAG,EACnC,EAAY,KAAK,EAAE,AACnB,CAAA,EAAA,EAAA,cAAA,AAAc,EAAC,EAAK,+BAAgC,QAAQ,MAAM,CAAC,MAAM,IAE7E,IAAI,EAAU,2BAKV,EAAU,EAAQ,OAAO,CAAC,WAAY,KAAO,IAMjD,IAAM,EAAgB,MAAM,EAAY,OAAO,CAAC,EAAK,EAAK,SACtD,EACA,mBAHE,CAAA,CAIN,GACA,GAAI,CAAC,EAID,OAHA,EAAI,IADY,MACF,CAAG,IACjB,EAAI,GAAG,CAAC,eACS,MAAjB,CAAwB,CAApB,IAAyB,KAAhB,EAAoB,EAAI,SAAS,CAAC,IAAI,CAAC,EAAK,QAAQ,OAAO,IACjE,KAEX,GAAM,SAAE,CAAO,QAAE,CAAM,YAAE,CAAU,WAAE,CAAS,aAAE,CAAW,mBAAE,CAAiB,qBAAE,CAAmB,sBAAE,CAAoB,yBAAE,CAAuB,CAAE,kBAAgB,yBAAE,CAAuB,uBAAE,CAAqB,CAAE,CAAG,EACnN,EAAoB,CAAA,EAAA,EAAA,gBAAA,AAAgB,EAAC,GACvC,GAAQ,EAAQ,EAAkB,aAAa,CAAC,EAAkB,EAAI,EAAkB,MAAM,CAAC,EAAA,AAAiB,EAC9G,EAAY,WAEa,MAAvB,EAA8B,KAAK,EAAI,EAAoB,SAAA,AAAS,EAAE,AACtE,MAAM,EAAoB,SAAS,CAAC,EAAK,EAAK,EAAW,IAEzD,EAAI,GAAG,CAAC,gCAEL,MAEX,GAAI,GAAS,CAAC,EAAa,CACvB,IAAM,GAAgB,CAAQ,EAAkB,MAAM,CAAC,EAAiB,CAClE,EAAgB,EAAkB,aAAa,CAAC,EAAkB,CACxE,GAAI,IAC+B,IAA3B,EAAc,KADH,GACW,EAAc,CAAC,EAAe,CACpD,GAAI,EAAW,YAAY,CAAC,WAAW,CACnC,CADqC,MAC9B,MAAM,GAEjB,OAAM,IAAI,EAAA,eAAe,AAC7B,CAER,CACA,IAAI,EAAW,MACX,GAAU,EAAY,IAAb,CAAkB,EAAK,EAAD,EAG/B,EAAW,AAAa,OAHqB,KAC7C,EAAW,CAAA,EAEwB,IAAM,CAAA,EAE7C,IAAM,EACN,CAAsB,MAAV,EAAkB,GAAb,EAEjB,CAAC,EAKK,EAAqB,GAAS,CAAC,EAIjC,GAAyB,GACzB,CAAA,EAAA,EAAA,iBADkD,IAClD,AAAqB,EAAC,CAClB,KAAM,EACN,WAd2F,eAe3F,uBACJ,GAEJ,IAAM,EAAS,EAAI,MAAM,EAAI,MACvB,EAAS,CAAA,EAAA,EAAA,SAAA,AAAS,IAClB,EAAa,EAAO,kBAAkB,GACtC,EAAU,CACZ,2BACA,EACA,WAAY,CACR,aAAc,CACV,gBAAgB,CAAQ,EAAW,YAAY,CAAC,cAAc,AAClE,EACA,iBAAiB,CAAQ,EAAW,eAAe,yBACnD,EACA,iBAAkB,CAAA,EAAA,EAAA,cAAA,AAAc,EAAC,EAAK,oBACtC,kBAAmB,EAAW,SAAS,CACvC,UAAW,EAAI,SAAS,CACxB,QAAS,AAAC,IACN,EAAI,EAAE,CAAC,QAAS,EACpB,EACA,sBAAkB,EAClB,8BAA+B,CAAC,EAAO,EAAU,EAAc,IAAa,EAAY,cAAc,CAAC,EAAK,EAAO,EAAc,EAAY,EACjJ,EACA,cAAe,SACX,CACJ,CACJ,EACM,EAAc,IAAI,EAAA,eAAe,CAAC,GAClC,EAAc,IAAI,EAAA,gBAAgB,CAAC,GACnC,EAAU,EAAA,kBAAkB,CAAC,mBAAmB,CAAC,EAAa,CAAA,EAAA,EAAA,sBAAA,AAAsB,EAAC,IAC3F,GAAI,CACA,IAAM,EAAoB,MAAO,GACtB,EAAY,MAAM,CAAC,EAAS,GAAS,OAAO,CAAC,KAChD,GAAI,CAAC,EAAM,OACX,EAAK,aAAa,CAAC,CACf,mBAAoB,EAAI,UAAU,CAClC,YAAY,CAChB,GACA,IAAM,EAAqB,EAAO,qBAAqB,GAEvD,GAAI,CAAC,EACD,OAEJ,GAAI,EAAmB,GAAG,CAAC,EAHF,kBAGwB,EAAA,cAAc,CAAC,aAAa,CAAE,YAC3E,QAAQ,IAAI,CAAC,CAAC,2BAA2B,EAAE,EAAmB,GAAG,CAAC,kBAAkB,qEAAqE,CAAC,EAG9J,IAAM,EAAQ,EAAmB,GAAG,CAAC,cACrC,GAAI,EAAO,CACP,IAAM,EAAO,CAAA,EAAG,EAAO,CAAC,EAAE,EAAA,CAAO,CACjC,EAAK,aAAa,CAAC,CACf,aAAc,EACd,aAAc,EACd,iBAAkB,CACtB,GACA,EAAK,UAAU,CAAC,EACpB,MACI,CADG,CACE,UAAU,CAAC,CAAA,EAAG,EAAO,CAAC,EAAE,EAAA,CAAS,CAE9C,GAEE,GAAgB,CAAoC,CAAA,EAAA,EAAA,EAA5B,YAA4B,AAAc,EAAC,EAAK,eACxE,EAAiB,MAAO,QACtB,EA4FI,EA3FR,IAAM,EAAoB,MAAO,CAAE,oBAAkB,CAAE,IACnD,GAAI,CACA,GAAI,CAAC,GAAiB,GAAwB,GAA2B,CAAC,EAKtE,OAJA,EAAI,SADsF,CAC5E,CAAG,IAEjB,EAAI,SAAS,CAAC,iBAAkB,eAChC,EAAI,GAAG,CAAC,gCACD,KAEX,IAAM,EAAW,MAAM,EAAkB,GACzC,EAAI,YAAY,CAAG,EAAQ,UAAU,CAAC,YAAY,CAClD,IAAI,EAAmB,EAAQ,UAAU,CAAC,gBAAgB,CAGtD,GACI,EAAI,SAAS,EAAE,CACf,CAFc,CAEV,SAAS,CAAC,GACd,EAAmB,QAG3B,IAAM,EAAY,EAAQ,UAAU,CAAC,aAAa,CAGlD,IAAI,EA6BA,OADA,MAAM,CAAA,EAAA,EAAA,YAAA,AAAY,EAAC,EAAa,EAAa,EAAU,EAAQ,UAAU,CAAC,gBAAgB,EACnF,IA7BA,EACP,IAAM,EAAO,MAAM,EAAS,IAAI,GAE1B,EAAU,CAAA,EAAA,EAAA,yBAAA,AAAyB,EAAC,EAAS,OAAO,EACtD,IACA,CAAO,CAAC,EAAA,GADG,mBACmB,CAAC,CAAG,CAAA,EAElC,CAAC,CAAO,CAAC,eAAe,EAAI,EAAK,IAAI,EAAE,CACvC,CAAO,CAAC,eAAe,CAAG,EAAK,IAAA,AAAI,EAEvC,IAAM,EAAa,KAAkD,IAA3C,EAAQ,UAAU,CAAC,mBAAmB,IAAoB,EAAQ,UAAU,CAAC,mBAAmB,EAAI,EAAA,cAAA,AAAc,GAAW,AAAR,EAAgB,UAAU,CAAC,mBAAmB,CACvL,EAAS,AAA8C,SAAvC,EAAQ,UAAU,CAAC,eAAe,EAAoB,EAAQ,UAAU,CAAC,eAAe,EAAI,EAAA,cAAc,MAAG,EAAY,EAAQ,UAAU,CAAC,eAAe,CAcjL,MAZmB,CAYZ,AAXH,MAAO,CACH,KAAM,EAAA,eAAe,CAAC,SAAS,CAC/B,OAAQ,EAAS,MAAM,CACvB,KAAM,OAAO,IAAI,CAAC,MAAM,EAAK,WAAW,YACxC,CACJ,EACA,aAAc,YACV,SACA,CACJ,CACJ,CAEJ,CAKJ,CAAE,KALS,CAKF,EAAK,CAeV,MAZ0B,MAAtB,EAA6B,KAAK,EAAI,EAAmB,OAAA,AAAO,EAAE,CAElE,MAAM,EAAY,cAAc,CAAC,EAAK,EAAK,CACvC,WAAY,aACZ,UAAW,EACX,UAAW,QACX,iBAAkB,CAAA,EAAA,EAAA,mBAAA,AAAmB,EAAC,oBAClC,uBACA,CACJ,EACJ,GAAG,AATgB,EASJ,GAEb,CACV,CACJ,EACM,EAAa,MAAM,EAAY,cAAc,CAAC,KAChD,aACA,WACA,EACA,UAAW,EAAA,SAAS,CAAC,SAAS,CAC9B,YAAY,oBACZ,EACA,kBAAmB,wBACnB,0BACA,oBACA,EACA,UAAW,EAAI,SAAS,eACxB,CACJ,GAEA,GAAI,CAAC,EACD,KADQ,EACD,KAEX,GAAI,CAAe,MAAd,CAAqB,EAAS,AAA0C,GAA9C,GAAK,GAAoB,EAAW,KAAA,AAAK,EAAY,KAAK,EAAI,EAAkB,IAAI,IAAM,EAAA,eAAe,CAAC,SAAS,CAE9I,CAFgJ,KAE1I,OAAO,cAAc,CAAC,AAAI,MAAM,CAAC,kDAAkD,EAAgB,MAAd,CAAqB,EAAS,AAA2C,GAA/C,GAAK,GAAqB,EAAW,KAAA,AAAK,EAAY,KAAK,EAAI,EAAmB,IAAI,CAAA,CAAE,EAAG,oBAAqB,CACjO,MAAO,OACP,YAAY,EACZ,cAAc,CAClB,EAEA,CAAC,GACD,EAAI,SAAS,CADG,AACF,iBAAkB,EAAuB,cAAgB,EAAW,MAAM,CAAG,OAAS,EAAW,OAAO,CAAG,QAAU,OAGnI,GACA,EAAI,QADS,CACA,CAAC,gBAAiB,2DAEnC,IAAM,EAAU,CAAA,EAAA,EAAA,2BAAA,AAA2B,EAAC,EAAW,KAAK,CAAC,OAAO,EAcpE,OAbI,AAAE,CAAD,EAAkB,GACnB,EADwB,AAChB,GADmB,GACb,CAAC,EAAA,sBAAsB,GAIrC,EAAW,YAAY,EAAK,EAAD,AAAK,SAAS,CAAC,kBAAqB,EAAD,AAAS,GAAG,CAAC,kBAAkB,AAC7F,EAAQ,GAAG,CAAC,gBAAiB,CAAA,EAAA,EAAA,qBAAA,AAAqB,EAAC,EAAW,YAAY,GAE9E,MAAM,CAAA,EAAA,EAAA,YAAA,AAAY,EAAC,EAAa,EAChC,IAAI,SAAS,EAAW,KAAK,CAAC,IAAI,CAAE,SAChC,EACA,OAAQ,EAAW,KAAK,CAAC,MAAM,EAAI,GACvC,IACO,IACX,EAGI,EACA,MAAM,EAAe,EADT,CAGZ,MAAM,EAAO,qBAAqB,CAAC,EAAI,OAAO,CAAE,IAAI,EAAO,KAAK,CAAC,EAAA,cAAc,CAAC,aAAa,CAAE,CACvF,SAAU,CAAA,EAAG,EAAO,CAAC,EAAE,EAAA,CAAS,CAChC,KAAM,EAAA,QAAQ,CAAC,MAAM,CACrB,WAAY,CACR,cAAe,EACf,cAAe,EAAI,GAAG,AAC1B,CACJ,EAAG,GAEf,CAAE,MAAO,EAAK,CAeV,GAdM,aAAe,EAAA,eAAe,EAEhC,CAFmC,KAE7B,EAAY,cAAc,CAAC,EAAK,EAAK,CACvC,WAAY,aACZ,UAAW,EACX,UAAW,QACX,iBAAkB,CAAA,EAAA,EAAA,mBAAA,AAAmB,EAAC,oBAClC,uBACA,CACJ,EACJ,GAAG,AATgB,EASJ,GAIf,EAAO,MAAM,EAKjB,OAHA,MAAM,CAAA,EAAA,EAAA,YAAA,AAAY,EAAC,EAAa,EAAa,IAAI,SAAS,KAAM,CAC5D,OAAQ,GACZ,IACO,IACX,CACJ,EAEA,qCAAqC","ignoreList":[1]}
1
+ {"version":3,"sources":["../../../src/app/api/node/sessions/route.ts","../../../node_modules/next/dist/esm/build/templates/app-route.js"],"sourcesContent":["import { execSync } from 'child_process';\nimport path from 'path';\nimport {\n discoverOpencodePortsWithMeta,\n discoverOpencodeProcessCwdsWithoutPortWithMeta,\n} from '@/lib/opencodeDiscovery';\nimport { readConfig } from '@/lib/opencodeConfig';\nimport { claudeCodeLocalSessionProvider } from '@/lib/session-providers/claudeCode';\nimport {\n composeProviderSourceKey,\n detectProviderFromRawId,\n extractProviderRawId,\n} from '@/lib/session-providers/providerIds';\nimport {\n NODE_PROTOCOL_VERSION,\n createNodeFailureResponse,\n guardNodeRequest,\n toNodeRequestGuardResponse,\n type NodeFailureReason,\n} from '@/lib/nodeProtocol';\nimport {\n clearSessionForceUnarchived,\n markSessionForceUnarchived,\n pruneSessionStickyStatusBlocked,\n pruneSessionForceUnarchived,\n shouldForceSessionUnarchived,\n takeSessionStickyStatusBlocked,\n} from '@/lib/sessionArchiveOverrides';\nimport {\n createVibePulseOpencodeClient,\n formatOpencodeSdkError,\n getOpencodeSessionMessages,\n getOpencodeSessionStatus,\n listOpencodeSessions,\n type OpencodeSdkClient,\n} from '@/lib/session-providers/opencodeSdkCompat';\n\ntype SessionLike = {\n id: string;\n slug?: string;\n title?: string;\n directory: string;\n debugReason?: string;\n parentID?: string;\n time?: {\n created: number;\n updated: number;\n archived?: number;\n };\n};\n\ntype ProcessHint = {\n pid: number;\n directory: string;\n projectName: string;\n reason: 'process_without_api_port';\n};\n\nconst CHILD_ACTIVE_WINDOW_MS = 30 * 60 * 1000;\nconst CHILD_UNKNOWN_STATE_BUSY_WINDOW_MS = 2 * 60 * 1000;\nconst CHILD_STATUS_MESSAGE_CHECK_LIMIT = 50;\nconst STALL_DETECTION_WINDOW_MS = 30 * 1000;\nconst STATUS_STICKY_RETENTION_MS = 24 * 60 * 60 * 1000;\nconst STATUS_STICKY_ABSENT_RETENTION_MS = 30 * 60 * 1000;\nconst DEFAULT_STATUS_STICKY_MAX_ENTRIES = 5000;\nconst GIT_COMMAND_TIMEOUT_MS = 1200;\nconst sessionListTimeoutMs = readPositiveTimeoutEnv('OPENCODE_SESSIONS_LIST_TIMEOUT_MS', 6000);\nconst sessionStatusTimeoutMs = readPositiveTimeoutEnv('OPENCODE_SESSIONS_STATUS_TIMEOUT_MS', 4000);\nconst sessionMessagesTimeoutMs = readPositiveTimeoutEnv('OPENCODE_SESSIONS_MESSAGES_TIMEOUT_MS', 2500);\n\nconst LOCAL_SOURCE = {\n hostId: 'local',\n hostLabel: 'Local',\n hostKind: 'local',\n} as const;\n\ntype StableRealtimeStatus = 'idle' | 'busy' | 'retry';\n\ntype StatusStickyState = {\n lastBusyAt: number;\n lastSeenAt: number;\n};\n\ntype HostAwareFields = {\n hostId?: typeof LOCAL_SOURCE.hostId;\n hostLabel?: typeof LOCAL_SOURCE.hostLabel;\n hostKind?: typeof LOCAL_SOURCE.hostKind;\n provider?: 'opencode' | 'claude-code';\n providerRawId?: string;\n rawSessionId?: string;\n sourceSessionKey?: string;\n readOnly?: boolean;\n capabilities?: {\n openProject: boolean;\n openEditor: boolean;\n archive: boolean;\n delete: boolean;\n };\n topology?: {\n childSessions: 'flat' | 'authoritative';\n };\n};\n\ntype ChildEntry = HostAwareFields & {\n id: string;\n slug?: string;\n title?: string;\n directory?: string;\n debugReason?: string;\n parentID?: string;\n time?: { created: number; updated: number; archived?: number };\n realTimeStatus: string;\n waitingForUser: boolean;\n};\n\ntype EnrichedSession = SessionLike & HostAwareFields & {\n projectName: string;\n branch: string | null;\n realTimeStatus: StableRealtimeStatus;\n waitingForUser: boolean;\n children: ChildEntry[];\n};\n\ntype SessionStatusStabilizationTarget = {\n id: string;\n time?: {\n archived?: number;\n };\n realTimeStatus: string;\n waitingForUser: boolean;\n children: Array<{\n id: string;\n time?: {\n archived?: number;\n };\n realTimeStatus: string;\n waitingForUser: boolean;\n }>;\n};\n\ntype MessageStateStatus = string;\n\ntype MessagePart = {\n state?: {\n status?: unknown;\n };\n};\n\ntype LocalResultMeta = {\n online: boolean;\n degraded?: boolean;\n reason?: string;\n};\n\ntype LocalSessionsSuccessPayload = {\n sessions: EnrichedSession[];\n processHints: ProcessHint[];\n failedPorts?: Array<{ port: number; reason: string }>;\n degraded?: boolean;\n};\n\ntype LocalSessionsResult =\n | {\n ok: true;\n payload: LocalSessionsSuccessPayload;\n meta: LocalResultMeta;\n }\n | {\n ok: false;\n reason: NodeFailureReason;\n extras: Record<string, unknown>;\n };\n\ntype LocalHostStatus = {\n hostId: typeof LOCAL_SOURCE.hostId;\n hostLabel: typeof LOCAL_SOURCE.hostLabel;\n hostKind: typeof LOCAL_SOURCE.hostKind;\n online: boolean;\n degraded?: boolean;\n reason?: string;\n};\n\ntype NodeSessionsSuccessPayload = {\n ok: true;\n role: 'node';\n protocolVersion: typeof NODE_PROTOCOL_VERSION;\n source: typeof LOCAL_SOURCE;\n upstream: {\n kind: 'opencode';\n reachable: true;\n };\n sessions: EnrichedSession[];\n processHints: ProcessHint[];\n hosts: [LocalHostStatus];\n hostStatuses: [LocalHostStatus];\n failedPorts?: Array<{ port: number; reason: string }>;\n degraded?: true;\n};\n\nconst statusStickyState = new Map<string, StatusStickyState>();\n\nconst WAITING_PART_STATUSES = new Set<string>([\n 'awaiting-input',\n 'awaiting_input',\n 'input-required',\n 'input_required',\n 'requires-input',\n 'requires_input',\n 'blocked',\n 'paused',\n]);\n\nexport const dynamic = 'force-dynamic';\n\nexport async function GET(request: Request) {\n const guardResult = guardNodeRequest(request);\n if (!guardResult.ok) {\n return toNodeRequestGuardResponse(guardResult);\n }\n\n const stickyBusyDelayMs = await readStickyBusyDelayMs();\n const result = await getLocalSessionsResult(stickyBusyDelayMs);\n\n if (!result.ok) {\n return createNodeFailureResponse(result.reason, result.extras);\n }\n\n const hostStatus = toLocalHostStatus(result.meta);\n\n const payload: NodeSessionsSuccessPayload = {\n ok: true,\n role: 'node',\n protocolVersion: NODE_PROTOCOL_VERSION,\n source: LOCAL_SOURCE,\n upstream: {\n kind: 'opencode',\n reachable: true,\n },\n sessions: result.payload.sessions.map((session) => addLocalHostMetadataToSession(session)),\n processHints: result.payload.processHints,\n hosts: [hostStatus],\n hostStatuses: [hostStatus],\n ...(result.payload.failedPorts ? { failedPorts: result.payload.failedPorts } : {}),\n ...(result.payload.degraded ? { degraded: true as const } : {}),\n };\n\n return Response.json(payload);\n}\n\nfunction readPositiveTimeoutEnv(name: string, fallback: number): number {\n const raw = process.env[name];\n const parsed = Number(raw);\n if (Number.isFinite(parsed) && parsed > 0) {\n return Math.floor(parsed);\n }\n return fallback;\n}\n\nfunction withTimeout<T>(operation: (signal: AbortSignal) => Promise<T>, timeoutMs: number, label: string): Promise<T> {\n const timeoutError = new Error(`${label} timed out after ${timeoutMs}ms`);\n const timeoutController = new AbortController();\n let timeoutHandle: NodeJS.Timeout | undefined;\n const timeoutPromise = new Promise<never>((_, reject) => {\n timeoutHandle = setTimeout(() => {\n timeoutController.abort();\n reject(timeoutError);\n }, timeoutMs);\n });\n\n const operationPromise = operation(timeoutController.signal).catch((error) => {\n if (timeoutController.signal.aborted) {\n throw timeoutError;\n }\n\n throw error;\n });\n\n return Promise.race([operationPromise, timeoutPromise]).finally(() => {\n if (timeoutHandle) {\n clearTimeout(timeoutHandle);\n }\n });\n}\n\nfunction normalizePartStatus(status: string): string {\n return status.trim().toLowerCase();\n}\n\nfunction isWaitingPartStatus(status: string): boolean {\n return WAITING_PART_STATUSES.has(normalizePartStatus(status));\n}\n\nfunction collectPartStatuses(messages: Array<{ parts?: MessagePart[] }>): MessageStateStatus[] {\n const partStatuses: MessageStateStatus[] = [];\n\n for (const message of messages) {\n for (const part of message.parts || []) {\n const status = part?.state?.status;\n if (typeof status === 'string') {\n const normalized = normalizePartStatus(status);\n if (normalized) {\n partStatuses.push(normalized);\n }\n }\n }\n }\n\n return partStatuses;\n}\n\nasync function fetchPartStatuses(\n client: OpencodeSdkClient,\n sessionId: string,\n timeoutMs: number\n): Promise<MessageStateStatus[]> {\n const messagesResult = await withTimeout(\n (signal) => getOpencodeSessionMessages(client, sessionId, 8, signal),\n timeoutMs,\n `session.messages(${sessionId})`\n );\n const messages = (messagesResult.data || []) as Array<{ parts?: MessagePart[] }>;\n return collectPartStatuses(messages);\n}\n\nfunction getUpdatedAt(session: { time?: { updated?: number; created?: number } }): number {\n return session.time?.updated || session.time?.created || 0;\n}\n\nfunction normalizeRealtimeStatus(value: string | undefined): StableRealtimeStatus {\n if (value === 'busy' || value === 'retry') return value;\n return 'idle';\n}\n\nfunction clearStickyStatusState(sessionId: string): void {\n statusStickyState.delete(sessionId);\n statusStickyState.delete(`child:${sessionId}`);\n}\n\nfunction applyStickyBusyStatus(\n id: string,\n status: StableRealtimeStatus,\n now: number,\n stickyBusyWindowMs: number\n): StableRealtimeStatus {\n const existing = statusStickyState.get(id) ?? { lastBusyAt: 0, lastSeenAt: now };\n\n if (status === 'busy') {\n existing.lastBusyAt = now;\n existing.lastSeenAt = now;\n statusStickyState.set(id, existing);\n return status;\n }\n\n if (status === 'retry') {\n existing.lastSeenAt = now;\n statusStickyState.set(id, existing);\n return status;\n }\n\n const shouldKeepBusy = existing.lastBusyAt > 0 && now - existing.lastBusyAt <= stickyBusyWindowMs;\n existing.lastSeenAt = now;\n statusStickyState.set(id, existing);\n return shouldKeepBusy ? 'busy' : 'idle';\n}\n\nfunction getStickyStateMaxEntries(): number {\n const raw = Number(process.env.OPENCODE_STATUS_STICKY_MAX_ENTRIES);\n if (Number.isFinite(raw) && raw > 0) {\n return Math.floor(raw);\n }\n return DEFAULT_STATUS_STICKY_MAX_ENTRIES;\n}\n\nfunction pruneStickyState(now: number, activeIds: Set<string>): void {\n for (const [id, state] of statusStickyState) {\n const ageMs = now - state.lastSeenAt;\n const isActive = activeIds.has(id);\n if (ageMs > STATUS_STICKY_RETENTION_MS || (!isActive && ageMs > STATUS_STICKY_ABSENT_RETENTION_MS)) {\n statusStickyState.delete(id);\n }\n }\n\n const maxEntries = getStickyStateMaxEntries();\n if (statusStickyState.size <= maxEntries) {\n return;\n }\n\n const overflow = statusStickyState.size - maxEntries;\n const sortedByLastSeen = Array.from(statusStickyState.entries()).sort((a, b) => a[1].lastSeenAt - b[1].lastSeenAt);\n\n let removed = 0;\n for (const [id] of sortedByLastSeen) {\n if (removed >= overflow) break;\n if (activeIds.has(id)) continue;\n statusStickyState.delete(id);\n removed++;\n }\n\n if (removed >= overflow) {\n return;\n }\n\n for (const [id] of sortedByLastSeen) {\n if (removed >= overflow) break;\n if (!statusStickyState.has(id)) continue;\n statusStickyState.delete(id);\n removed++;\n }\n}\n\nfunction hasRecentActivity(session: { time?: { updated?: number } }, now: number): boolean {\n const updatedAt = session.time?.updated;\n if (!updatedAt) return false;\n return now - updatedAt <= STALL_DETECTION_WINDOW_MS;\n}\n\nfunction toChildEntry(\n child: SessionLike,\n status: StableRealtimeStatus,\n waitingForUser = false\n): ChildEntry {\n return {\n id: child.id,\n slug: child.slug,\n title: child.title,\n directory: child.directory,\n debugReason: child.debugReason,\n parentID: child.parentID,\n time: child.time,\n realTimeStatus: status,\n waitingForUser,\n };\n}\n\nfunction clearSessionStabilizationState(session: SessionStatusStabilizationTarget): void {\n clearStickyStatusState(session.id);\n clearSessionForceUnarchived(session.id);\n for (const child of session.children) {\n clearStickyStatusState(`child:${child.id}`);\n clearSessionForceUnarchived(child.id);\n }\n}\n\nfunction shouldSkipSessionStatusStabilization(\n session: SessionStatusStabilizationTarget,\n now: number\n): boolean {\n if (takeSessionStickyStatusBlocked(session.id, now)) {\n clearSessionStabilizationState(session);\n return true;\n }\n\n if (session.time?.archived) {\n clearSessionStabilizationState(session);\n return true;\n }\n\n return false;\n}\n\nfunction applyStickyStatusStabilization(\n session: SessionStatusStabilizationTarget,\n stickyNow: number,\n stickyBusyDelayMs: number\n): void {\n for (const child of session.children) {\n if (child.time?.archived) {\n clearStickyStatusState(`child:${child.id}`);\n clearSessionForceUnarchived(child.id);\n continue;\n }\n\n const normalizedChildStatus = normalizeRealtimeStatus(child.realTimeStatus);\n const childStatusForStabilization =\n child.waitingForUser && normalizedChildStatus === 'idle' ? 'retry' : normalizedChildStatus;\n child.realTimeStatus = applyStickyBusyStatus(\n `child:${child.id}`,\n childStatusForStabilization,\n stickyNow,\n stickyBusyDelayMs\n );\n\n if (child.realTimeStatus === 'busy' || child.realTimeStatus === 'retry' || child.waitingForUser) {\n markSessionForceUnarchived(child.id, stickyNow);\n }\n }\n\n const normalizedSessionStatus = normalizeRealtimeStatus(session.realTimeStatus);\n const sessionStatusForStabilization =\n session.waitingForUser && normalizedSessionStatus === 'idle' ? 'retry' : normalizedSessionStatus;\n session.realTimeStatus = applyStickyBusyStatus(\n session.id,\n sessionStatusForStabilization,\n stickyNow,\n stickyBusyDelayMs\n );\n\n const hasActiveChildren = session.children.some(\n (child) => child.realTimeStatus === 'busy' || child.realTimeStatus === 'retry' || child.waitingForUser\n );\n const shouldAutoUnarchive =\n session.realTimeStatus === 'busy' ||\n session.realTimeStatus === 'retry' ||\n session.waitingForUser ||\n hasActiveChildren;\n\n if (shouldAutoUnarchive) {\n markSessionForceUnarchived(session.id, stickyNow);\n }\n}\n\nfunction getProjectName(directory: string): string {\n return path.basename(directory);\n}\n\nfunction isGitRepo(directory: string): boolean {\n try {\n const result = execSync('git rev-parse --is-inside-work-tree', {\n cwd: directory,\n encoding: 'utf-8',\n stdio: ['ignore', 'pipe', 'ignore'],\n timeout: GIT_COMMAND_TIMEOUT_MS,\n });\n return result.trim() === 'true';\n } catch {\n return false;\n }\n}\n\nfunction getGitBranch(directory: string): string | null {\n if (!isGitRepo(directory)) return null;\n try {\n const branch = execSync('git branch --show-current', {\n cwd: directory,\n encoding: 'utf-8',\n stdio: ['ignore', 'pipe', 'ignore'],\n timeout: GIT_COMMAND_TIMEOUT_MS,\n });\n return branch.trim() || null;\n } catch {\n return null;\n }\n}\n\nasync function readStickyBusyDelayMs(): Promise<number> {\n let stickyBusyDelayMs = 1000;\n try {\n const config = await readConfig();\n const vibepulseRaw =\n config.vibepulse && typeof config.vibepulse === 'object' && !Array.isArray(config.vibepulse)\n ? config.vibepulse\n : {};\n const vibepulse = vibepulseRaw as Record<string, unknown>;\n const stickyDelay = vibepulse['stickyBusyDelayMs'] as number | undefined;\n if (typeof stickyDelay === 'number' && Number.isFinite(stickyDelay) && stickyDelay >= 0) {\n stickyBusyDelayMs = stickyDelay;\n }\n } catch {\n }\n\n return stickyBusyDelayMs;\n}\n\nfunction sortChildEntries(children: ChildEntry[]): void {\n children.sort((a, b) => {\n const aActive = a.realTimeStatus === 'busy' || a.realTimeStatus === 'retry';\n const bActive = b.realTimeStatus === 'busy' || b.realTimeStatus === 'retry';\n\n if (aActive && !bActive) return -1;\n if (!aActive && bActive) return 1;\n\n const aTime = a.time?.updated || a.time?.created || 0;\n const bTime = b.time?.updated || b.time?.created || 0;\n return bTime - aTime;\n });\n}\n\nfunction readSupplementalProviderPayload(payload: unknown): Pick<LocalSessionsSuccessPayload, 'sessions' | 'processHints'> {\n if (!payload || typeof payload !== 'object' || Array.isArray(payload)) {\n return { sessions: [], processHints: [] };\n }\n\n const record = payload as Record<string, unknown>;\n\n return {\n sessions: Array.isArray(record['sessions']) ? (record['sessions'] as EnrichedSession[]) : [],\n processHints: Array.isArray(record['processHints']) ? (record['processHints'] as ProcessHint[]) : [],\n };\n}\n\nasync function getSupplementalClaudePayload(stickyBusyDelayMs: number): Promise<\n Pick<LocalSessionsSuccessPayload, 'sessions' | 'processHints'>\n> {\n try {\n const result = await claudeCodeLocalSessionProvider.getSessionsResult({ stickyBusyDelayMs });\n return readSupplementalProviderPayload(result.payload);\n } catch {\n return { sessions: [], processHints: [] };\n }\n}\n\nfunction composeLocalProviderSourceKey(\n rawSessionId: string,\n fields: Pick<HostAwareFields, 'provider' | 'readOnly' | 'capabilities' | 'topology'>\n) {\n return composeProviderSourceKey(LOCAL_SOURCE.hostId, rawSessionId, {\n ...(fields.provider ? { provider: fields.provider } : {}),\n ...(fields.readOnly !== undefined ? { readOnly: fields.readOnly } : {}),\n ...(fields.capabilities ? { capabilities: fields.capabilities } : {}),\n ...(fields.topology ? { topology: fields.topology } : {}),\n });\n}\n\nfunction addLocalHostMetadataToChildEntry(\n child: ChildEntry,\n parentSourceSessionKey?: string,\n parentProvider?: HostAwareFields['provider']\n): ChildEntry {\n const rawSessionId = child.rawSessionId ?? extractProviderRawId(child.id);\n const inferredProvider = child.provider ?? detectProviderFromRawId(child.id);\n const provider = inferredProvider === 'claude-code' ? inferredProvider : (parentProvider ?? inferredProvider);\n const sourceKey = composeLocalProviderSourceKey(rawSessionId, {\n provider,\n readOnly: child.readOnly,\n capabilities: child.capabilities,\n topology: child.topology,\n });\n const rawParentId = child.parentID ? extractProviderRawId(child.parentID) : undefined;\n const sourceParentKey = parentSourceSessionKey\n ?? (rawParentId\n ? composeLocalProviderSourceKey(rawParentId, {\n provider,\n }).sourceKey\n : child.parentID);\n\n return {\n ...child,\n id: sourceKey.sourceKey,\n parentID: sourceParentKey,\n hostId: LOCAL_SOURCE.hostId,\n hostLabel: LOCAL_SOURCE.hostLabel,\n hostKind: LOCAL_SOURCE.hostKind,\n rawSessionId,\n sourceSessionKey: sourceKey.sourceKey,\n provider,\n providerRawId: child.providerRawId ?? sourceKey.providerRawId,\n readOnly: child.readOnly ?? sourceKey.readOnly,\n capabilities: child.capabilities ?? sourceKey.capabilities,\n topology: child.topology ?? sourceKey.topology,\n };\n}\n\nfunction addLocalHostMetadataToSession(session: EnrichedSession): EnrichedSession {\n const rawSessionId = session.rawSessionId ?? extractProviderRawId(session.id);\n const provider = session.provider ?? detectProviderFromRawId(session.id);\n const sourceKey = composeLocalProviderSourceKey(rawSessionId, {\n provider,\n readOnly: session.readOnly,\n capabilities: session.capabilities,\n topology: session.topology,\n });\n const rawParentId = session.parentID ? extractProviderRawId(session.parentID) : undefined;\n const sourceParentKey = rawParentId\n ? composeLocalProviderSourceKey(rawParentId, {\n provider,\n }).sourceKey\n : session.parentID;\n\n return {\n ...session,\n id: sourceKey.sourceKey,\n parentID: sourceParentKey,\n hostId: LOCAL_SOURCE.hostId,\n hostLabel: LOCAL_SOURCE.hostLabel,\n hostKind: LOCAL_SOURCE.hostKind,\n rawSessionId,\n sourceSessionKey: sourceKey.sourceKey,\n provider,\n providerRawId: session.providerRawId ?? sourceKey.providerRawId,\n readOnly: session.readOnly ?? sourceKey.readOnly,\n capabilities: session.capabilities ?? sourceKey.capabilities,\n topology: session.topology ?? sourceKey.topology,\n children: session.children.map((child) => addLocalHostMetadataToChildEntry(child, sourceKey.sourceKey, provider)),\n };\n}\n\nfunction toLocalHostStatus(meta: LocalResultMeta): LocalHostStatus {\n return {\n hostId: LOCAL_SOURCE.hostId,\n hostLabel: LOCAL_SOURCE.hostLabel,\n hostKind: LOCAL_SOURCE.hostKind,\n online: meta.online,\n ...(meta.degraded ? { degraded: true } : {}),\n ...(meta.reason ? { reason: meta.reason } : {}),\n };\n}\n\nfunction isTimeoutErrorMessage(value: string): boolean {\n return value.toLowerCase().includes('timed out');\n}\n\nfunction getFailureMeta(reason: NodeFailureReason): { statusReason: string; reachable: false } {\n if (reason === 'upstream_timeout') {\n return {\n statusReason: 'OpenCode discovery timed out',\n reachable: false,\n };\n }\n\n return {\n statusReason: 'OpenCode server not found',\n reachable: false,\n };\n}\n\nfunction createLocalFailureResult(\n reason: NodeFailureReason,\n processHints: ProcessHint[],\n extras: Record<string, unknown> = {}\n): Extract<LocalSessionsResult, { ok: false }> {\n const failureMeta = getFailureMeta(reason);\n const hostStatus = toLocalHostStatus({\n online: false,\n degraded: true,\n reason: failureMeta.statusReason,\n });\n\n return {\n ok: false,\n reason,\n extras: {\n role: 'node',\n source: LOCAL_SOURCE,\n upstream: {\n kind: 'opencode',\n reachable: failureMeta.reachable,\n },\n processHints,\n hosts: [hostStatus],\n hostStatuses: [hostStatus],\n ...extras,\n },\n };\n}\n\nfunction resolveFailureReasonFromMessages(messages: string[]): NodeFailureReason {\n if (messages.length > 0 && messages.every(isTimeoutErrorMessage)) {\n return 'upstream_timeout';\n }\n\n return 'upstream_unreachable';\n}\n\nasync function getLocalSessionsResult(stickyBusyDelayMs: number): Promise<LocalSessionsResult> {\n const { processes: rawProcessHints, timedOut: processDiscoveryTimedOut } =\n discoverOpencodeProcessCwdsWithoutPortWithMeta();\n const processHintsByDirectory = new Map<string, ProcessHint>();\n for (const process of rawProcessHints) {\n if (!process.cwd || process.cwd.startsWith('/private/tmp/opencode')) {\n continue;\n }\n if (processHintsByDirectory.has(process.cwd)) {\n continue;\n }\n processHintsByDirectory.set(process.cwd, {\n pid: process.pid,\n directory: process.cwd,\n projectName: getProjectName(process.cwd),\n reason: 'process_without_api_port',\n });\n }\n\n const processHints = Array.from(processHintsByDirectory.values());\n const { ports, timedOut: portDiscoveryTimedOut } = discoverOpencodePortsWithMeta();\n\n if (!ports.length) {\n if (portDiscoveryTimedOut || processDiscoveryTimedOut) {\n return createLocalFailureResult('upstream_timeout', processHints);\n }\n\n const supplementalClaudePayload = await getSupplementalClaudePayload(stickyBusyDelayMs);\n if (supplementalClaudePayload.sessions.length > 0 || supplementalClaudePayload.processHints.length > 0) {\n return {\n ok: true,\n payload: {\n sessions: supplementalClaudePayload.sessions,\n processHints: [...processHints, ...supplementalClaudePayload.processHints],\n },\n meta: {\n online: true,\n },\n };\n }\n\n return createLocalFailureResult('upstream_unreachable', processHints);\n }\n\n try {\n const results = await Promise.allSettled(\n ports.map(async (port) => {\n const client = createVibePulseOpencodeClient(`http://localhost:${port}`);\n const sessionsResult = await withTimeout(\n (signal) => listOpencodeSessions(client, signal),\n sessionListTimeoutMs,\n `session.list(${port})`\n );\n const statusResult = await withTimeout(\n (signal) => getOpencodeSessionStatus(client, signal),\n sessionStatusTimeoutMs,\n `session.status(${port})`\n ).catch(() => ({ data: {} }));\n return { port, client, sessions: sessionsResult.data || [], status: statusResult.data || {} };\n })\n );\n\n const allSessions: SessionLike[] = [];\n const statusMap: Record<string, { type: StableRealtimeStatus }> = {};\n const clientByPort: Record<number, OpencodeSdkClient> = {};\n const sessionPortMap: Record<string, number> = {};\n const failedPorts: Array<{ port: number; reason: string }> = [];\n\n for (let i = 0; i < results.length; i++) {\n const result = results[i];\n const port = ports[i];\n\n if (result.status !== 'fulfilled') {\n failedPorts.push({\n port,\n reason: formatOpencodeSdkError(result.reason),\n });\n continue;\n }\n\n allSessions.push(...(result.value.sessions as SessionLike[]));\n Object.assign(statusMap, result.value.status);\n clientByPort[result.value.port] = result.value.client;\n for (const session of result.value.sessions as SessionLike[]) {\n if (!(session.id in sessionPortMap)) {\n sessionPortMap[session.id] = result.value.port;\n }\n }\n }\n\n const uniqueSessions: SessionLike[] = [];\n const seen = new Set<string>();\n for (const session of allSessions) {\n if (seen.has(session.id)) {\n continue;\n }\n seen.add(session.id);\n uniqueSessions.push(session);\n }\n\n const parentSessions = uniqueSessions.filter((session) => !session.parentID);\n const childSessions = uniqueSessions.filter((session) => !!session.parentID);\n\n const lifecycleNow = Date.now();\n pruneSessionForceUnarchived(lifecycleNow);\n pruneSessionStickyStatusBlocked(lifecycleNow);\n\n for (const session of parentSessions) {\n if (session.time?.archived !== undefined && shouldForceSessionUnarchived(session.id, lifecycleNow)) {\n session.time = {\n ...session.time,\n archived: undefined,\n };\n }\n }\n\n for (const child of childSessions) {\n if (child.time?.archived !== undefined && shouldForceSessionUnarchived(child.id, lifecycleNow)) {\n child.time = {\n ...child.time,\n archived: undefined,\n };\n }\n }\n\n if (results.length > 0 && failedPorts.length === results.length) {\n const supplementalClaudePayload = await getSupplementalClaudePayload(stickyBusyDelayMs);\n if (supplementalClaudePayload.sessions.length > 0 || supplementalClaudePayload.processHints.length > 0) {\n return {\n ok: true,\n payload: {\n sessions: supplementalClaudePayload.sessions,\n processHints: [...processHints, ...supplementalClaudePayload.processHints],\n failedPorts,\n degraded: true,\n },\n meta: {\n online: true,\n degraded: true,\n reason: resolveFailureReasonFromMessages(failedPorts.map((entry) => entry.reason)),\n },\n };\n }\n\n pruneStickyState(Date.now(), new Set<string>());\n return createLocalFailureResult(resolveFailureReasonFromMessages(failedPorts.map((entry) => entry.reason)), processHints, {\n failedPorts,\n });\n }\n\n const enrichedSessions: EnrichedSession[] = parentSessions.map((session) => ({\n ...session,\n projectName: getProjectName(session.directory),\n branch: getGitBranch(session.directory),\n realTimeStatus: statusMap[session.id]?.type || 'idle',\n waitingForUser: false,\n children: [],\n }));\n\n const parentById = new Map(enrichedSessions.map((session) => [session.id, session]));\n const now = Date.now();\n const unresolvedChildren: Array<{ parentId: string; child: SessionLike; childUpdatedAt: number }> = [];\n\n for (const child of childSessions) {\n let parent = child.parentID ? parentById.get(child.parentID) : undefined;\n\n if (!parent) {\n const candidates = enrichedSessions\n .filter((session) => session.directory === child.directory)\n .sort((a, b) => getUpdatedAt(b) - getUpdatedAt(a));\n\n parent =\n candidates.find((session) => session.realTimeStatus === 'busy' || session.realTimeStatus === 'retry') ||\n candidates[0];\n }\n\n if (!parent) {\n continue;\n }\n\n const statusFromMap = statusMap[child.id]?.type;\n const childUpdatedAt = getUpdatedAt(child);\n const isRecent = childUpdatedAt > 0 && now - childUpdatedAt <= CHILD_ACTIVE_WINDOW_MS;\n const shouldSkipArchivedChild = !!child.time?.archived && !statusFromMap && !isRecent;\n\n if (shouldSkipArchivedChild) {\n continue;\n }\n\n if (statusFromMap && statusFromMap !== 'idle') {\n parent.children.push(toChildEntry(child, statusFromMap));\n } else if (isRecent) {\n if (unresolvedChildren.length < CHILD_STATUS_MESSAGE_CHECK_LIMIT) {\n unresolvedChildren.push({ parentId: parent.id, child, childUpdatedAt });\n }\n }\n }\n\n if (unresolvedChildren.length > 0) {\n const unresolvedChecks = await Promise.allSettled(\n unresolvedChildren.map(async ({ parentId, child, childUpdatedAt }) => {\n const port = sessionPortMap[child.id] ?? sessionPortMap[parentId];\n const client = port ? clientByPort[port] : undefined;\n const assumeBusyForUnknown = childUpdatedAt > 0 && now - childUpdatedAt <= CHILD_UNKNOWN_STATE_BUSY_WINDOW_MS;\n if (!client) {\n return {\n parentId,\n child,\n childStatus: assumeBusyForUnknown ? ('busy' as const) : ('idle' as const),\n };\n }\n\n try {\n const partStatuses = await fetchPartStatuses(client, child.id, sessionMessagesTimeoutMs);\n const hasRunningState = partStatuses.some((status) => status === 'running');\n const hasWaitingState = !hasRunningState && partStatuses.some(isWaitingPartStatus);\n const hasActiveState = hasWaitingState || hasRunningState;\n const recentlyActive = childUpdatedAt > 0 && now - childUpdatedAt <= 5 * 60 * 1000;\n\n return {\n parentId,\n child,\n childWaitingForUser: hasWaitingState,\n childStatus: hasActiveState\n ? ('busy' as const)\n : recentlyActive || assumeBusyForUnknown\n ? ('busy' as const)\n : ('idle' as const),\n };\n } catch {\n return {\n parentId,\n child,\n childWaitingForUser: false,\n childStatus: assumeBusyForUnknown ? ('busy' as const) : ('idle' as const),\n };\n }\n })\n );\n\n for (const result of unresolvedChecks) {\n if (result.status !== 'fulfilled') continue;\n if (result.value.childStatus === 'idle') continue;\n const parent = parentById.get(result.value.parentId);\n if (!parent) continue;\n parent.children.push(toChildEntry(result.value.child, result.value.childStatus, result.value.childWaitingForUser));\n }\n }\n\n const parentStatusFallbackCandidates = enrichedSessions\n .filter((session) => {\n if (session.realTimeStatus !== 'idle') return false;\n const updatedAt = getUpdatedAt(session);\n if (updatedAt > 0 && now - updatedAt <= CHILD_ACTIVE_WINDOW_MS) return true;\n return !!session.time?.archived;\n })\n .sort((a, b) => getUpdatedAt(b) - getUpdatedAt(a))\n .slice(0, CHILD_STATUS_MESSAGE_CHECK_LIMIT);\n\n if (parentStatusFallbackCandidates.length > 0) {\n const parentFallbackChecks = await Promise.allSettled(\n parentStatusFallbackCandidates.map(async (session) => {\n const updatedAt = getUpdatedAt(session);\n const assumeBusyForUnknown = updatedAt > 0 && now - updatedAt <= CHILD_UNKNOWN_STATE_BUSY_WINDOW_MS;\n const port = sessionPortMap[session.id];\n const client = port ? clientByPort[port] : undefined;\n\n if (!client) {\n return {\n sessionId: session.id,\n status: assumeBusyForUnknown ? ('busy' as const) : ('idle' as const),\n waitingForUser: false,\n };\n }\n\n try {\n const partStatuses = await fetchPartStatuses(client, session.id, sessionMessagesTimeoutMs);\n const hasRunningState = partStatuses.some((status) => status === 'running');\n const hasWaitingState = !hasRunningState && partStatuses.some(isWaitingPartStatus);\n const hasCompletedState = partStatuses.length > 0 && partStatuses.every((status) => status === 'completed');\n const recentlyActive = hasRecentActivity(session, now);\n\n return {\n sessionId: session.id,\n status: hasRunningState || hasWaitingState\n ? ('busy' as const)\n : hasCompletedState && !recentlyActive\n ? ('idle' as const)\n : assumeBusyForUnknown || recentlyActive\n ? ('busy' as const)\n : ('idle' as const),\n waitingForUser: hasWaitingState,\n };\n } catch {\n return {\n sessionId: session.id,\n status: assumeBusyForUnknown ? ('busy' as const) : ('idle' as const),\n waitingForUser: false,\n };\n }\n })\n );\n\n for (const result of parentFallbackChecks) {\n if (result.status !== 'fulfilled') continue;\n if (result.value.status === 'idle') continue;\n const session = parentById.get(result.value.sessionId);\n if (!session) continue;\n session.realTimeStatus = result.value.status;\n if (result.value.waitingForUser) {\n session.waitingForUser = true;\n }\n }\n }\n\n for (const session of enrichedSessions) {\n if (session.children.length > 0) {\n sortChildEntries(session.children);\n }\n }\n\n const sessionsForInteractionChecks = enrichedSessions.filter(\n (session) =>\n session.realTimeStatus === 'busy' ||\n !!session.time?.archived ||\n session.children.some((child) => child.realTimeStatus === 'busy' || child.realTimeStatus === 'retry')\n );\n\n if (sessionsForInteractionChecks.length > 0) {\n const pendingChecks = await Promise.allSettled(\n sessionsForInteractionChecks.map(async (session) => {\n const port = sessionPortMap[session.id];\n const client = port ? clientByPort[port] : undefined;\n if (!client) {\n return {\n sessionId: session.id,\n parentWaiting: false,\n running: false,\n waitingChildIds: new Set<string>(),\n };\n }\n\n try {\n const partStatuses = await fetchPartStatuses(client, session.id, sessionMessagesTimeoutMs);\n const hasRunning = partStatuses.some((status) => status === 'running');\n const hasInteractionWait = !hasRunning && partStatuses.some(isWaitingPartStatus);\n\n const childStateChecks = await Promise.allSettled(\n session.children\n .filter((child) => child.realTimeStatus === 'busy' || child.realTimeStatus === 'retry')\n .map(async (child) => {\n const childPort = sessionPortMap[child.id] ?? sessionPortMap[session.id];\n const childClient = childPort ? clientByPort[childPort] : undefined;\n if (!childClient) {\n return { childId: child.id, waiting: false };\n }\n\n try {\n const childStatuses = await fetchPartStatuses(childClient, child.id, sessionMessagesTimeoutMs);\n const childHasRunning = childStatuses.some((status) => status === 'running');\n return {\n childId: child.id,\n waiting: !childHasRunning && childStatuses.some(isWaitingPartStatus),\n };\n } catch {\n return { childId: child.id, waiting: false };\n }\n })\n );\n\n const waitingChildIds = new Set(\n childStateChecks\n .filter((entry): entry is PromiseFulfilledResult<{ childId: string; waiting: boolean }> => entry.status === 'fulfilled')\n .filter((entry) => entry.value.waiting)\n .map((entry) => entry.value.childId)\n );\n\n return {\n sessionId: session.id,\n parentWaiting: hasInteractionWait,\n running: hasRunning,\n waitingChildIds,\n };\n } catch {\n return {\n sessionId: session.id,\n parentWaiting: false,\n running: false,\n waitingChildIds: new Set<string>(),\n };\n }\n })\n );\n\n for (const result of pendingChecks) {\n if (result.status !== 'fulfilled') continue;\n const session = enrichedSessions.find((candidate) => candidate.id === result.value.sessionId);\n if (!session) continue;\n\n for (const child of session.children) {\n if (result.value.waitingChildIds.has(child.id)) {\n child.waitingForUser = true;\n }\n }\n\n if (result.value.running) {\n session.realTimeStatus = 'busy';\n }\n if (result.value.parentWaiting) {\n session.waitingForUser = true;\n }\n }\n }\n\n const stickyNow = Date.now();\n const activeStickyIds = new Set<string>();\n for (const session of enrichedSessions) {\n activeStickyIds.add(session.id);\n for (const child of session.children) {\n activeStickyIds.add(`child:${child.id}`);\n }\n }\n\n for (const session of enrichedSessions) {\n if (shouldSkipSessionStatusStabilization(session, stickyNow)) {\n continue;\n }\n\n applyStickyStatusStabilization(session, stickyNow, stickyBusyDelayMs);\n }\n\n pruneStickyState(stickyNow, activeStickyIds);\n\n const knownDirectories = new Set<string>();\n for (const session of uniqueSessions) {\n if (session.directory) {\n knownDirectories.add(session.directory);\n }\n }\n\n const filteredProcessHints = processHints.filter((hint) => !knownDirectories.has(hint.directory));\n\n const supplementalClaudePayload = await getSupplementalClaudePayload(stickyBusyDelayMs);\n\n return {\n ok: true,\n payload: {\n sessions: [...enrichedSessions, ...supplementalClaudePayload.sessions],\n processHints: [...filteredProcessHints, ...supplementalClaudePayload.processHints],\n ...(failedPorts.length > 0 ? { failedPorts, degraded: true } : {}),\n },\n meta: {\n online: true,\n ...(failedPorts.length > 0 ? { degraded: true } : {}),\n },\n };\n } catch (error) {\n console.error('Error fetching node-local sessions:', error);\n return createLocalFailureResult(\n error instanceof Error && isTimeoutErrorMessage(error.message) ? 'upstream_timeout' : 'upstream_unreachable',\n processHints,\n {\n details: error instanceof Error ? error.message : String(error),\n }\n );\n }\n}\n","import { AppRouteRouteModule } from \"next/dist/esm/server/route-modules/app-route/module.compiled\";\nimport { RouteKind } from \"next/dist/esm/server/route-kind\";\nimport { patchFetch as _patchFetch } from \"next/dist/esm/server/lib/patch-fetch\";\nimport { addRequestMeta, getRequestMeta } from \"next/dist/esm/server/request-meta\";\nimport { getTracer, SpanKind } from \"next/dist/esm/server/lib/trace/tracer\";\nimport { setManifestsSingleton } from \"next/dist/esm/server/app-render/manifests-singleton\";\nimport { normalizeAppPath } from \"next/dist/esm/shared/lib/router/utils/app-paths\";\nimport { NodeNextRequest, NodeNextResponse } from \"next/dist/esm/server/base-http/node\";\nimport { NextRequestAdapter, signalFromNodeResponse } from \"next/dist/esm/server/web/spec-extension/adapters/next-request\";\nimport { BaseServerSpan } from \"next/dist/esm/server/lib/trace/constants\";\nimport { getRevalidateReason } from \"next/dist/esm/server/instrumentation/utils\";\nimport { sendResponse } from \"next/dist/esm/server/send-response\";\nimport { fromNodeOutgoingHttpHeaders, toNodeOutgoingHttpHeaders } from \"next/dist/esm/server/web/utils\";\nimport { getCacheControlHeader } from \"next/dist/esm/server/lib/cache-control\";\nimport { INFINITE_CACHE, NEXT_CACHE_TAGS_HEADER } from \"next/dist/esm/lib/constants\";\nimport { NoFallbackError } from \"next/dist/esm/shared/lib/no-fallback-error.external\";\nimport { CachedRouteKind } from \"next/dist/esm/server/response-cache\";\nimport * as userland from \"INNER_APP_ROUTE\";\n// We inject the nextConfigOutput here so that we can use them in the route\n// module.\nconst nextConfigOutput = \"standalone\"\nconst routeModule = new AppRouteRouteModule({\n definition: {\n kind: RouteKind.APP_ROUTE,\n page: \"/api/node/sessions/route\",\n pathname: \"/api/node/sessions\",\n filename: \"route\",\n bundlePath: \"\"\n },\n distDir: process.env.__NEXT_RELATIVE_DIST_DIR || '',\n relativeProjectDir: process.env.__NEXT_RELATIVE_PROJECT_DIR || '',\n resolvedPagePath: \"[project]/src/app/api/node/sessions/route.ts\",\n nextConfigOutput,\n userland\n});\n// Pull out the exports that we need to expose from the module. This should\n// be eliminated when we've moved the other routes to the new format. These\n// are used to hook into the route.\nconst { workAsyncStorage, workUnitAsyncStorage, serverHooks } = routeModule;\nfunction patchFetch() {\n return _patchFetch({\n workAsyncStorage,\n workUnitAsyncStorage\n });\n}\nexport { routeModule, workAsyncStorage, workUnitAsyncStorage, serverHooks, patchFetch, };\nexport async function handler(req, res, ctx) {\n if (routeModule.isDev) {\n addRequestMeta(req, 'devRequestTimingInternalsEnd', process.hrtime.bigint());\n }\n let srcPage = \"/api/node/sessions/route\";\n // turbopack doesn't normalize `/index` in the page name\n // so we need to to process dynamic routes properly\n // TODO: fix turbopack providing differing value from webpack\n if (process.env.TURBOPACK) {\n srcPage = srcPage.replace(/\\/index$/, '') || '/';\n } else if (srcPage === '/index') {\n // we always normalize /index specifically\n srcPage = '/';\n }\n const multiZoneDraftMode = process.env.__NEXT_MULTI_ZONE_DRAFT_MODE;\n const prepareResult = await routeModule.prepare(req, res, {\n srcPage,\n multiZoneDraftMode\n });\n if (!prepareResult) {\n res.statusCode = 400;\n res.end('Bad Request');\n ctx.waitUntil == null ? void 0 : ctx.waitUntil.call(ctx, Promise.resolve());\n return null;\n }\n const { buildId, params, nextConfig, parsedUrl, isDraftMode, prerenderManifest, routerServerContext, isOnDemandRevalidate, revalidateOnlyGenerated, resolvedPathname, clientReferenceManifest, serverActionsManifest } = prepareResult;\n const normalizedSrcPage = normalizeAppPath(srcPage);\n let isIsr = Boolean(prerenderManifest.dynamicRoutes[normalizedSrcPage] || prerenderManifest.routes[resolvedPathname]);\n const render404 = async ()=>{\n // TODO: should route-module itself handle rendering the 404\n if (routerServerContext == null ? void 0 : routerServerContext.render404) {\n await routerServerContext.render404(req, res, parsedUrl, false);\n } else {\n res.end('This page could not be found');\n }\n return null;\n };\n if (isIsr && !isDraftMode) {\n const isPrerendered = Boolean(prerenderManifest.routes[resolvedPathname]);\n const prerenderInfo = prerenderManifest.dynamicRoutes[normalizedSrcPage];\n if (prerenderInfo) {\n if (prerenderInfo.fallback === false && !isPrerendered) {\n if (nextConfig.experimental.adapterPath) {\n return await render404();\n }\n throw new NoFallbackError();\n }\n }\n }\n let cacheKey = null;\n if (isIsr && !routeModule.isDev && !isDraftMode) {\n cacheKey = resolvedPathname;\n // ensure /index and / is normalized to one key\n cacheKey = cacheKey === '/index' ? '/' : cacheKey;\n }\n const supportsDynamicResponse = // If we're in development, we always support dynamic HTML\n routeModule.isDev === true || // If this is not SSG or does not have static paths, then it supports\n // dynamic HTML.\n !isIsr;\n // This is a revalidation request if the request is for a static\n // page and it is not being resumed from a postponed render and\n // it is not a dynamic RSC request then it is a revalidation\n // request.\n const isStaticGeneration = isIsr && !supportsDynamicResponse;\n // Before rendering (which initializes component tree modules), we have to\n // set the reference manifests to our global store so Server Action's\n // encryption util can access to them at the top level of the page module.\n if (serverActionsManifest && clientReferenceManifest) {\n setManifestsSingleton({\n page: srcPage,\n clientReferenceManifest,\n serverActionsManifest\n });\n }\n const method = req.method || 'GET';\n const tracer = getTracer();\n const activeSpan = tracer.getActiveScopeSpan();\n const context = {\n params,\n prerenderManifest,\n renderOpts: {\n experimental: {\n authInterrupts: Boolean(nextConfig.experimental.authInterrupts)\n },\n cacheComponents: Boolean(nextConfig.cacheComponents),\n supportsDynamicResponse,\n incrementalCache: getRequestMeta(req, 'incrementalCache'),\n cacheLifeProfiles: nextConfig.cacheLife,\n waitUntil: ctx.waitUntil,\n onClose: (cb)=>{\n res.on('close', cb);\n },\n onAfterTaskError: undefined,\n onInstrumentationRequestError: (error, _request, errorContext, silenceLog)=>routeModule.onRequestError(req, error, errorContext, silenceLog, routerServerContext)\n },\n sharedContext: {\n buildId\n }\n };\n const nodeNextReq = new NodeNextRequest(req);\n const nodeNextRes = new NodeNextResponse(res);\n const nextReq = NextRequestAdapter.fromNodeNextRequest(nodeNextReq, signalFromNodeResponse(res));\n try {\n const invokeRouteModule = async (span)=>{\n return routeModule.handle(nextReq, context).finally(()=>{\n if (!span) return;\n span.setAttributes({\n 'http.status_code': res.statusCode,\n 'next.rsc': false\n });\n const rootSpanAttributes = tracer.getRootSpanAttributes();\n // We were unable to get attributes, probably OTEL is not enabled\n if (!rootSpanAttributes) {\n return;\n }\n if (rootSpanAttributes.get('next.span_type') !== BaseServerSpan.handleRequest) {\n console.warn(`Unexpected root span type '${rootSpanAttributes.get('next.span_type')}'. Please report this Next.js issue https://github.com/vercel/next.js`);\n return;\n }\n const route = rootSpanAttributes.get('next.route');\n if (route) {\n const name = `${method} ${route}`;\n span.setAttributes({\n 'next.route': route,\n 'http.route': route,\n 'next.span_name': name\n });\n span.updateName(name);\n } else {\n span.updateName(`${method} ${srcPage}`);\n }\n });\n };\n const isMinimalMode = Boolean(process.env.MINIMAL_MODE || getRequestMeta(req, 'minimalMode'));\n const handleResponse = async (currentSpan)=>{\n var _cacheEntry_value;\n const responseGenerator = async ({ previousCacheEntry })=>{\n try {\n if (!isMinimalMode && isOnDemandRevalidate && revalidateOnlyGenerated && !previousCacheEntry) {\n res.statusCode = 404;\n // on-demand revalidate always sets this header\n res.setHeader('x-nextjs-cache', 'REVALIDATED');\n res.end('This page could not be found');\n return null;\n }\n const response = await invokeRouteModule(currentSpan);\n req.fetchMetrics = context.renderOpts.fetchMetrics;\n let pendingWaitUntil = context.renderOpts.pendingWaitUntil;\n // Attempt using provided waitUntil if available\n // if it's not we fallback to sendResponse's handling\n if (pendingWaitUntil) {\n if (ctx.waitUntil) {\n ctx.waitUntil(pendingWaitUntil);\n pendingWaitUntil = undefined;\n }\n }\n const cacheTags = context.renderOpts.collectedTags;\n // If the request is for a static response, we can cache it so long\n // as it's not edge.\n if (isIsr) {\n const blob = await response.blob();\n // Copy the headers from the response.\n const headers = toNodeOutgoingHttpHeaders(response.headers);\n if (cacheTags) {\n headers[NEXT_CACHE_TAGS_HEADER] = cacheTags;\n }\n if (!headers['content-type'] && blob.type) {\n headers['content-type'] = blob.type;\n }\n const revalidate = typeof context.renderOpts.collectedRevalidate === 'undefined' || context.renderOpts.collectedRevalidate >= INFINITE_CACHE ? false : context.renderOpts.collectedRevalidate;\n const expire = typeof context.renderOpts.collectedExpire === 'undefined' || context.renderOpts.collectedExpire >= INFINITE_CACHE ? undefined : context.renderOpts.collectedExpire;\n // Create the cache entry for the response.\n const cacheEntry = {\n value: {\n kind: CachedRouteKind.APP_ROUTE,\n status: response.status,\n body: Buffer.from(await blob.arrayBuffer()),\n headers\n },\n cacheControl: {\n revalidate,\n expire\n }\n };\n return cacheEntry;\n } else {\n // send response without caching if not ISR\n await sendResponse(nodeNextReq, nodeNextRes, response, context.renderOpts.pendingWaitUntil);\n return null;\n }\n } catch (err) {\n // if this is a background revalidate we need to report\n // the request error here as it won't be bubbled\n if (previousCacheEntry == null ? void 0 : previousCacheEntry.isStale) {\n const silenceLog = false;\n await routeModule.onRequestError(req, err, {\n routerKind: 'App Router',\n routePath: srcPage,\n routeType: 'route',\n revalidateReason: getRevalidateReason({\n isStaticGeneration,\n isOnDemandRevalidate\n })\n }, silenceLog, routerServerContext);\n }\n throw err;\n }\n };\n const cacheEntry = await routeModule.handleResponse({\n req,\n nextConfig,\n cacheKey,\n routeKind: RouteKind.APP_ROUTE,\n isFallback: false,\n prerenderManifest,\n isRoutePPREnabled: false,\n isOnDemandRevalidate,\n revalidateOnlyGenerated,\n responseGenerator,\n waitUntil: ctx.waitUntil,\n isMinimalMode\n });\n // we don't create a cacheEntry for ISR\n if (!isIsr) {\n return null;\n }\n if ((cacheEntry == null ? void 0 : (_cacheEntry_value = cacheEntry.value) == null ? void 0 : _cacheEntry_value.kind) !== CachedRouteKind.APP_ROUTE) {\n var _cacheEntry_value1;\n throw Object.defineProperty(new Error(`Invariant: app-route received invalid cache entry ${cacheEntry == null ? void 0 : (_cacheEntry_value1 = cacheEntry.value) == null ? void 0 : _cacheEntry_value1.kind}`), \"__NEXT_ERROR_CODE\", {\n value: \"E701\",\n enumerable: false,\n configurable: true\n });\n }\n if (!isMinimalMode) {\n res.setHeader('x-nextjs-cache', isOnDemandRevalidate ? 'REVALIDATED' : cacheEntry.isMiss ? 'MISS' : cacheEntry.isStale ? 'STALE' : 'HIT');\n }\n // Draft mode should never be cached\n if (isDraftMode) {\n res.setHeader('Cache-Control', 'private, no-cache, no-store, max-age=0, must-revalidate');\n }\n const headers = fromNodeOutgoingHttpHeaders(cacheEntry.value.headers);\n if (!(isMinimalMode && isIsr)) {\n headers.delete(NEXT_CACHE_TAGS_HEADER);\n }\n // If cache control is already set on the response we don't\n // override it to allow users to customize it via next.config\n if (cacheEntry.cacheControl && !res.getHeader('Cache-Control') && !headers.get('Cache-Control')) {\n headers.set('Cache-Control', getCacheControlHeader(cacheEntry.cacheControl));\n }\n await sendResponse(nodeNextReq, nodeNextRes, // @ts-expect-error - Argument of type 'Buffer<ArrayBufferLike>' is not assignable to parameter of type 'BodyInit | null | undefined'.\n new Response(cacheEntry.value.body, {\n headers,\n status: cacheEntry.value.status || 200\n }));\n return null;\n };\n // TODO: activeSpan code path is for when wrapped by\n // next-server can be removed when this is no longer used\n if (activeSpan) {\n await handleResponse(activeSpan);\n } else {\n await tracer.withPropagatedContext(req.headers, ()=>tracer.trace(BaseServerSpan.handleRequest, {\n spanName: `${method} ${srcPage}`,\n kind: SpanKind.SERVER,\n attributes: {\n 'http.method': method,\n 'http.target': req.url\n }\n }, handleResponse));\n }\n } catch (err) {\n if (!(err instanceof NoFallbackError)) {\n const silenceLog = false;\n await routeModule.onRequestError(req, err, {\n routerKind: 'App Router',\n routePath: normalizedSrcPage,\n routeType: 'route',\n revalidateReason: getRevalidateReason({\n isStaticGeneration,\n isOnDemandRevalidate\n })\n }, silenceLog, routerServerContext);\n }\n // rethrow so that we can handle serving error page\n // If this is during static generation, throw the error again.\n if (isIsr) throw err;\n // Otherwise, send a 500 response.\n await sendResponse(nodeNextReq, nodeNextRes, new Response(null, {\n status: 500\n }));\n return null;\n }\n}\n\n//# sourceMappingURL=app-route.js.map\n"],"names":[],"mappings":"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","ignoreList":[1]}
@@ -1,3 +1,3 @@
1
- module.exports=[86100,e=>{"use strict";var t=e.i(47909),r=e.i(74017),s=e.i(96250),i=e.i(59756),n=e.i(61916),a=e.i(74677),o=e.i(69741),l=e.i(16795),d=e.i(87718),u=e.i(95169),c=e.i(47587),p=e.i(66012),f=e.i(70101),h=e.i(26937),y=e.i(10372),g=e.i(93695);e.i(52474);var m=e.i(220);e.i(39354);var S=e.i(34959),w=e.i(33405),v=e.i(14747),b=e.i(99686),I=e.i(57181),E=e.i(74579),T=e.i(586),R=e.i(68817),A=e.i(82414),O=e.i(81951);let _=H("OPENCODE_SESSIONS_LIST_TIMEOUT_MS",6e3),U=H("OPENCODE_SESSIONS_STATUS_TIMEOUT_MS",4e3),C=H("OPENCODE_SESSIONS_MESSAGES_TIMEOUT_MS",2500),P=H("VIBEPULSE_NODE_SESSIONS_TIMEOUT_MS",6e3),M=new Map;function N(e){M.delete(e),M.delete(`child:${e}`)}let D={hostId:"local",hostLabel:"Local",hostKind:"local"};async function F(){return ef()}async function x(e){return eh(e)}function H(e,t){let r=Number(process.env[e]);return Number.isFinite(r)&&r>0?Math.floor(r):t}function k(e,t,r){let s,i=Error(`${r} timed out after ${t}ms`),n=new AbortController,a=new Promise((e,r)=>{s=setTimeout(()=>{n.abort(),r(i)},t)});return Promise.race([e(n.signal).catch(e=>{if(n.signal.aborted)throw i;throw e}),a]).finally(()=>{s&&clearTimeout(s)})}let K=new Set(["awaiting-input","awaiting_input","input-required","input_required","requires-input","requires_input","blocked","paused"]);function L(e){return e.trim().toLowerCase()}function $(e){return K.has(L(e))}async function j(e,t,r){var s=(await k(r=>e.session.messages({path:{id:t},query:{limit:8},signal:r}),r,`session.messages(${t})`)).data||[];let i=[];for(let e of s)for(let t of e.parts||[]){let e=t?.state?.status;if("string"==typeof e){let t=L(e);t&&i.push(t)}}return i}function q(e){return e.time?.updated||e.time?.created||0}function B(e){return"busy"===e||"retry"===e?e:"idle"}function W(e,t,r,s){let i=M.get(e)??{lastBusyAt:0,lastSeenAt:r};if("busy"===t)return i.lastBusyAt=r,i.lastSeenAt=r,M.set(e,i),t;if("retry"===t)return i.lastSeenAt=r,M.set(e,i),t;let n=i.lastBusyAt>0&&r-i.lastBusyAt<=s;return i.lastSeenAt=r,M.set(e,i),n?"busy":"idle"}function V(e,t){let r;for(let[r,s]of M){let i=e-s.lastSeenAt,n=t.has(r);(i>864e5||!n&&i>18e5)&&M.delete(r)}let s=Number.isFinite(r=Number(process.env.OPENCODE_STATUS_STICKY_MAX_ENTRIES))&&r>0?Math.floor(r):5e3;if(M.size<=s)return;let i=M.size-s,n=Array.from(M.entries()).sort((e,t)=>e[1].lastSeenAt-t[1].lastSeenAt),a=0;for(let[e]of n){if(a>=i)break;!t.has(e)&&(M.delete(e),a++)}if(!(a>=i))for(let[e]of n){if(a>=i)break;M.has(e)&&(M.delete(e),a++)}}function z(e,t,r=!1){return{id:e.id,slug:e.slug,title:e.title,directory:e.directory,debugReason:e.debugReason,parentID:e.parentID,time:e.time,realTimeStatus:t,waitingForUser:r}}function G(e,t){return!!((0,E.takeSessionStickyStatusBlocked)(e.id,t)||e.time?.archived)&&(function(e){for(let t of(N(e.id),(0,E.clearSessionForceUnarchived)(e.id),e.children))N(`child:${t.id}`),(0,E.clearSessionForceUnarchived)(t.id)}(e),!0)}function X(e,t,r){for(let s of e.children){if(s.time?.archived){N(`child:${s.id}`),(0,E.clearSessionForceUnarchived)(s.id);continue}let e=B(s.realTimeStatus),i=s.waitingForUser&&"idle"===e?"retry":e;s.realTimeStatus=W(`child:${s.id}`,i,t,r),("busy"===s.realTimeStatus||"retry"===s.realTimeStatus||s.waitingForUser)&&(0,E.markSessionForceUnarchived)(s.id,t)}let s=B(e.realTimeStatus),i=e.waitingForUser&&"idle"===s?"retry":s;e.realTimeStatus=W(e.id,i,t,r);let n=e.children.some(e=>"busy"===e.realTimeStatus||"retry"===e.realTimeStatus||e.waitingForUser);("busy"===e.realTimeStatus||"retry"===e.realTimeStatus||e.waitingForUser||n)&&(0,E.markSessionForceUnarchived)(e.id,t)}function Y(e){return v.default.basename(e)}async function J(){let e=1e3;try{let t=await (0,I.readConfig)(),r=(t.vibepulse&&"object"==typeof t.vibepulse&&!Array.isArray(t.vibepulse)?t.vibepulse:{}).stickyBusyDelayMs;"number"==typeof r&&Number.isFinite(r)&&r>=0&&(e=r)}catch{}return e}function Z(e){return"object"==typeof e&&null!==e&&!Array.isArray(e)}function Q(e){return"remote"===e.hostKind}function ee(e){return"idle"===e||"busy"===e||"retry"===e}function et(e){if(!Z(e))return!1;let t=e.created,r=e.updated,s=e.archived;return"number"==typeof t&&"number"==typeof r&&(void 0===s||"number"==typeof s)}function er(e){if(!Z(e))return null;let t="string"==typeof e.hostId?e.hostId.trim():e.hostId,r="string"==typeof e.hostLabel?e.hostLabel.trim():e.hostLabel,s=e.hostKind;if(t===D.hostId&&r===D.hostLabel&&s===D.hostKind)return D;let i=e.baseUrl,n=e.enabled;if("string"!=typeof t||"string"!=typeof r||"remote"!==s||"string"!=typeof i||"boolean"!=typeof n)return null;let a=function(e){let t=e.trim();if(!t)return null;try{let e=new URL(t);if("http:"!==e.protocol&&"https:"!==e.protocol||e.username||e.password)return null;return e.hash="",e.toString().replace(/\/+$/,"")}catch{return null}}(i);return a?{hostId:t,hostLabel:r,hostKind:s,baseUrl:a,enabled:n}:null}function es(e){return e.status?Response.json(e.payload,{status:e.status}):Response.json(e.payload)}function ei(e,t){return{hostId:e.hostId,hostLabel:e.hostLabel,hostKind:e.hostKind,online:t.online,...t.degraded?{degraded:!0}:{},...t.reason?{reason:t.reason}:{},...Q(e)?{baseUrl:e.baseUrl}:{}}}function en(e,t){return{...e,hosts:t,hostStatuses:t}}function ea(e){if(!e.includes(":"))return e;try{return(0,T.parseSourceKey)(e).sessionId}catch{return e}}function eo(e,t){try{return(0,T.composeSourceKey)(e,t)}catch{return}}function el(e,t){let r=e.rawSessionId??ea(e.id),s=e.parentID?ea(e.parentID):e.parentID,i=eo(t.hostId,r);if(!i)return null;let n=s?eo(t.hostId,s)??void 0:void 0,a=[];for(let r of e.children){let e=function(e,t){let r=e.rawSessionId??ea(e.id),s=e.parentID?ea(e.parentID):e.parentID,i=eo(t.hostId,r);if(!i)return null;let n=s?eo(t.hostId,s)??void 0:void 0;return{...e,id:i,parentID:n,hostId:t.hostId,hostLabel:t.hostLabel,hostKind:t.hostKind,...Q(t)?{hostBaseUrl:t.baseUrl}:{},rawSessionId:r,sourceSessionKey:i,readOnly:!1}}(r,t);e&&a.push(e)}return{...e,id:i,parentID:n,hostId:t.hostId,hostLabel:t.hostLabel,hostKind:t.hostKind,...Q(t)?{hostBaseUrl:t.baseUrl}:{},rawSessionId:r,sourceSessionKey:i,readOnly:!1,children:a}}async function ed(e){try{return await e.json()}catch{return null}}async function eu(e,t){let r=`node.sessions(${e.hostId})`,s=new AbortController,i=!1,n=setTimeout(()=>{i=!0,s.abort()},P);try{return await fetch(`${t.baseUrl}/api/node/sessions`,{method:"GET",headers:(0,R.createNodeRequestHeaders)(t.token),signal:s.signal})}catch(e){if(i)throw Error(`${r} timed out after ${P}ms`);throw e}finally{clearTimeout(n)}}async function ec(e,t){if(!t)return{payload:{sessions:[],processHints:[],degraded:!0},sourceMeta:{online:!1,degraded:!0,reason:"node_not_configured"}};if(!t.enabled)return{payload:{sessions:[],processHints:[],degraded:!0},sourceMeta:{online:!1,degraded:!0,reason:"node_disabled"}};try{let r=await eu(e,t),s=await ed(r);if(!r.ok){let e=Z(s)&&"string"==typeof s.reason?s.reason:`node_request_failed_${r.status}`;return{payload:{sessions:[],processHints:[],degraded:!0},sourceMeta:{online:!0,degraded:!0,reason:e}}}let i=function(e){if(!Z(e)||!0!==e.ok||"node"!==e.role||e.protocolVersion!==R.NODE_PROTOCOL_VERSION)return null;let t=e.source;if(!Z(t)||"local"!==t.hostId||"Local"!==t.hostLabel||"local"!==t.hostKind)return null;let r=e.upstream;if(!Z(r)||"opencode"!==r.kind||"boolean"!=typeof r.reachable)return null;let s=e.sessions,i=e.processHints;return!Array.isArray(s)||s.some(e=>!function(e){if(!Z(e)||"string"!=typeof e.id||"string"!=typeof e.directory||"string"!=typeof e.projectName)return!1;let t=e.branch;if(null!=t&&"string"!=typeof t||!ee(e.realTimeStatus)||"boolean"!=typeof e.waitingForUser)return!1;let r=e.children;if(!Array.isArray(r)||r.some(e=>!function(e){if(!Z(e)||"string"!=typeof e.id||!ee(e.realTimeStatus)||"boolean"!=typeof e.waitingForUser)return!1;let t=e.parentID,r=e.directory,s=e.time;return(void 0===t||"string"==typeof t)&&(void 0===r||"string"==typeof r)&&(void 0===s||!!et(s))}(e)))return!1;let s=e.time;return void 0===s||!!et(s)}(e))||!Array.isArray(i)||i.some(e=>!(Z(e)&&"number"==typeof e.pid&&"string"==typeof e.directory&&"string"==typeof e.projectName&&"process_without_api_port"===e.reason))?null:{sessions:s,processHints:i,degraded:!0===e.degraded}}(s);if(!i)return{payload:{sessions:[],processHints:[],degraded:!0},sourceMeta:{online:!0,degraded:!0,reason:"node_payload_invalid"}};return{payload:{sessions:i.sessions,processHints:i.processHints,...i.degraded?{degraded:!0}:{}},sourceMeta:{online:!0,...i.degraded?{degraded:!0}:{}}}}catch(e){return{payload:{sessions:[],processHints:[],degraded:!0},sourceMeta:{online:!1,degraded:!0,reason:e instanceof Error?e.message:String(e)}}}}async function ep(e){let{processes:t,timedOut:r}=(0,b.discoverOpencodeProcessCwdsWithoutPortWithMeta)(),s=new Map;for(let e of t)!(!e.cwd||e.cwd.startsWith("/private/tmp/opencode"))&&(s.has(e.cwd)||s.set(e.cwd,{pid:e.pid,directory:e.cwd,projectName:Y(e.cwd),reason:"process_without_api_port"}));let{ports:i,timedOut:n}=(0,b.discoverOpencodePortsWithMeta)();if(!i.length){let e=Array.from(s.values());return n||r?{payload:{error:"OpenCode discovery timed out",hint:"Host process discovery exceeded timeout. Retry shortly, or increase OPENCODE_DISCOVERY_TIMEOUT_MS.",...e.length>0?{processHints:e}:{}},status:503,sourceMeta:{online:!1,degraded:!0,reason:"OpenCode discovery timed out"}}:e.length>0?{payload:{sessions:[],processHints:e},sourceMeta:{online:!1,reason:"OpenCode server not found"}}:{payload:{error:"OpenCode server not found",hint:"Make sure OpenCode is running with an exposed API port. Example: opencode --port <PORT> (VibePulse auto-detects active ports)."},status:503,sourceMeta:{online:!1,reason:"OpenCode server not found"}}}try{let t=await Promise.allSettled(i.map(async e=>{let t=(0,S.createOpencodeClient)({baseUrl:`http://localhost:${e}`}),r=await k(e=>t.session.list({signal:e}),_,`session.list(${e})`),s=await k(e=>t.session.status({signal:e}),U,`session.status(${e})`).catch(()=>({data:{}}));return{port:e,client:t,sessions:r.data||[],status:s.data||{}}})),r=[],n={},a={},o={},l=[];for(let e=0;e<t.length;e++){let s=t[e],d=i[e];if("fulfilled"!==s.status){l.push({port:d,reason:s.reason instanceof Error?s.reason.message:String(s.reason)});continue}for(let e of(r.push(...s.value.sessions),Object.assign(n,s.value.status),a[s.value.port]=s.value.client,s.value.sessions))e.id in o||(o[e.id]=s.value.port)}let d=new Set,u=r.filter(e=>!d.has(e.id)&&(d.add(e.id),!0)),c=u.filter(e=>!e.parentID),p=u.filter(e=>!!e.parentID),f=Date.now();for(let e of((0,E.pruneSessionForceUnarchived)(f),(0,E.pruneSessionStickyStatusBlocked)(f),c))e.time?.archived!==void 0&&(0,E.shouldForceSessionUnarchived)(e.id,f)&&(e.time={...e.time,archived:void 0});for(let e of p)e.time?.archived!==void 0&&(0,E.shouldForceSessionUnarchived)(e.id,f)&&(e.time={...e.time,archived:void 0});if(t.length>0&&l.length===t.length)return V(Date.now(),new Set),{payload:{error:"Failed to fetch sessions from OpenCode ports",hint:"All discovered OpenCode API ports timed out or failed. Retry shortly or increase OPENCODE_SESSIONS_LIST_TIMEOUT_MS.",failedPorts:l},status:503,sourceMeta:{online:!1,degraded:!0,reason:"Failed to fetch sessions from OpenCode ports"}};if(l.length>0&&0===c.length&&0===p.length){V(Date.now(),new Set);let e=Array.from(s.values());return{payload:{sessions:[],processHints:e,failedPorts:l,degraded:!0},sourceMeta:{online:!0,degraded:!0}}}let h=c.map(e=>{let t=Y(e.directory),r=function(e){if(!function(e){try{let t=(0,w.execSync)("git rev-parse --is-inside-work-tree",{cwd:e,encoding:"utf-8",stdio:["ignore","pipe","ignore"],timeout:1200});return"true"===t.trim()}catch{return!1}}(e))return null;try{return(0,w.execSync)("git branch --show-current",{cwd:e,encoding:"utf-8",stdio:["ignore","pipe","ignore"],timeout:1200}).trim()||null}catch{return null}}(e.directory);return{...e,projectName:t,branch:r,realTimeStatus:n[e.id]?.type||"idle",waitingForUser:!1,children:[]}}),y=new Map(h.map(e=>[e.id,e])),g=Date.now(),m=[];for(let e of p){let t=e.parentID?h.find(t=>t.id===e.parentID):null;if(!t){let r=h.filter(t=>t.directory===e.directory).sort((e,t)=>q(t)-q(e));t=r.find(e=>"busy"===e.realTimeStatus||"retry"===e.realTimeStatus)||r[0]}if(!t)continue;let r=n[e.id]?.type,s=q(e),i=s>0&&g-s<=18e5;if(!(e.time?.archived&&!r&&!i))if(r&&"idle"!==r)t.children.push(z(e,r));else{if(!i)continue;m.length<50&&m.push({parentId:t.id,child:e,childUpdatedAt:s})}}if(m.length>0)for(let e of(await Promise.allSettled(m.map(async({parentId:e,child:t,childUpdatedAt:r})=>{let s=o[t.id]??o[e],i=s?a[s]:void 0,n=r>0&&g-r<=12e4;if(!i)return{parentId:e,child:t,childStatus:n?"busy":"idle"};try{let s=await j(i,t.id,C),a=s.some(e=>"running"===e),o=!a&&s.some($);return{parentId:e,child:t,childWaitingForUser:o,childStatus:o||a||r>0&&g-r<=3e5||n?"busy":"idle"}}catch{return{parentId:e,child:t,childWaitingForUser:!1,childStatus:n?"busy":"idle"}}})))){if("fulfilled"!==e.status||"idle"===e.value.childStatus)continue;let t=y.get(e.value.parentId);t&&t.children.push(z(e.value.child,e.value.childStatus,e.value.childWaitingForUser))}let v=h.filter(e=>{if("idle"!==e.realTimeStatus)return!1;let t=q(e);return t>0&&g-t<=18e5||!!e.time?.archived}).sort((e,t)=>q(t)-q(e)).slice(0,50);if(v.length>0)for(let e of(await Promise.allSettled(v.map(async e=>{let t=q(e),r=t>0&&g-t<=12e4,s=o[e.id],i=s?a[s]:void 0;if(!i)return{sessionId:e.id,status:r?"busy":"idle",waitingForUser:!1};try{let t,s=await j(i,e.id,C),n=s.some(e=>"running"===e),a=!n&&s.some($),o=s.length>0&&s.every(e=>"completed"===e),l=!!(t=e.time?.updated)&&g-t<=3e4;return{sessionId:e.id,status:n||a?"busy":o&&!l?"idle":r||l?"busy":"idle",waitingForUser:a}}catch{return{sessionId:e.id,status:r?"busy":"idle",waitingForUser:!1}}})))){if("fulfilled"!==e.status||"idle"===e.value.status)continue;let t=y.get(e.value.sessionId);t&&(t.realTimeStatus=e.value.status,e.value.waitingForUser&&(t.waitingForUser=!0))}for(let e of h)e.children.length>0&&e.children.sort((e,t)=>{let r="busy"===e.realTimeStatus||"retry"===e.realTimeStatus,s="busy"===t.realTimeStatus||"retry"===t.realTimeStatus;if(r&&!s)return -1;if(!r&&s)return 1;let i=e.time?.updated||e.time?.created||0;return(t.time?.updated||t.time?.created||0)-i});let b=h.filter(e=>"busy"===e.realTimeStatus||!!e.time?.archived||e.children.some(e=>"busy"===e.realTimeStatus||"retry"===e.realTimeStatus));if(b.length>0){for(let e of(await Promise.allSettled(b.map(async e=>{let t=o[e.id],r=t?a[t]:void 0;if(!r)return{sessionId:e.id,parentWaiting:!1,waiting:!1,running:!1,waitingChildIds:new Set};try{let t=await j(r,e.id,C),s=t.some(e=>"running"===e),i=!s&&t.some($),n=await Promise.allSettled(e.children.filter(e=>"busy"===e.realTimeStatus||"retry"===e.realTimeStatus).map(async t=>{let r=o[t.id]??o[e.id],s=r?a[r]:void 0;if(!s)return{childId:t.id,waiting:!1};try{let e=await j(s,t.id,C),r=e.some(e=>"running"===e);return{childId:t.id,waiting:!r&&e.some($)}}catch{return{childId:t.id,waiting:!1}}})),l=new Set(n.filter(e=>"fulfilled"===e.status).filter(e=>e.value.waiting).map(e=>e.value.childId)),d=l.size>0||e.children.some(e=>e.waitingForUser||"retry"===e.realTimeStatus);return{sessionId:e.id,parentWaiting:i,waiting:i||d,running:s,waitingChildIds:l}}catch{return{sessionId:e.id,parentWaiting:!1,waiting:!1,running:!1,waitingChildIds:new Set}}}))))if("fulfilled"===e.status){let t=h.find(t=>t.id===e.value.sessionId);if(!t)continue;for(let r of t.children)e.value.waitingChildIds.has(r.id)&&(r.waitingForUser=!0);e.value.running&&(t.realTimeStatus="busy"),e.value.parentWaiting&&(t.waitingForUser=!0)}}let I=Date.now(),T=new Set;for(let e of h)for(let t of(T.add(e.id),e.children))T.add(`child:${t.id}`);for(let t of h)G(t,I)||X(t,I,e);V(I,T);let R=new Set;for(let e of u)e.directory&&R.add(e.directory);let A=Array.from(s.values()).filter(e=>!R.has(e.directory)),O={sessions:h,processHints:A};return l.length>0&&(O.failedPorts=l,O.degraded=!0),{payload:O,sourceMeta:{online:!0,...l.length>0?{degraded:!0}:{}}}}catch(e){return console.error("Error fetching sessions:",e),{payload:{error:"Failed to fetch sessions",details:e instanceof Error?e.message:String(e),hint:"Make sure OpenCode is running with an exposed API port. Example: opencode --port <PORT> (VibePulse auto-detects active ports)."},status:500,sourceMeta:{online:!1,degraded:!0,reason:"Failed to fetch sessions"}}}}async function ef(){let e=await J();return es(await ep(e))}async function eh(e){let t;try{let r=await e.json();t=function(e){if(!Z(e)||!Array.isArray(e.sources)||0===e.sources.length)throw Error("Invalid sources payload");let t=e.sources.map(er);if(t.some(e=>null===e))throw Error("Invalid sources payload");return t}(r)}catch{return Response.json({error:"Invalid sources payload",hint:"POST /api/sessions expects a JSON body with a non-empty sources array."},{status:400})}let r="node"===process.env[O.RUNTIME_ROLE_ENV_VAR]?[D]:t.filter(e=>"local"===e.hostKind||e.enabled);if(0===r.length)return Response.json({sessions:[],processHints:[],hosts:[],hostStatuses:[]});if(1===r.length&&"local"===r[0].hostKind){let e=await J(),t=await ep(e),r=t.sourceMeta??{online:!t.status,...t.status?{degraded:!0}:{}},s=r.online?r:{...r,degraded:!0},i=ei(D,s),n=!s.online&&Z(t.payload)?en({sessions:[],processHints:Array.isArray(t.payload.processHints)?t.payload.processHints:[],degraded:!0},[i]):null;if(n){let e=t.status??503;return Response.json(n,{status:e})}return es({...t,payload:Z(t.payload)?en(function(e,t){if(!Array.isArray(e.sessions))return e;let r=[],s=0;for(let i of e.sessions){let e=el(i,t);if(e){r.push(e);continue}s+=1}let i=!0===e.degraded;return{...e,sessions:r,...i||s>0?{degraded:!0}:{}}}(t.payload,D),[i]):t.payload})}let s=r.some(e=>"local"===e.hostKind)?await J():0,i=new Map((await (0,A.listNodeRecords)()).map(e=>[e.nodeId,e])),n=r.map(e=>{if(!Q(e))return e;let t=i.get(e.hostId);return t?{...e,baseUrl:t.baseUrl,enabled:t.enabled}:e}),a=await Promise.allSettled(n.map(async e=>({source:e,result:"local"===e.hostKind?await ep(s):await ec(e,i.get(e.hostId))}))),o=[],l=[],d=[],u=!1;for(let e of a){if("fulfilled"!==e.status){u=!0;continue}let{source:t,result:r}=e.value,s=r.sourceMeta??{online:!r.status,...r.status?{degraded:!0}:{}},i=function(e){if(!Z(e.payload))return{sessions:[],processHints:[]};let t=Array.isArray(e.payload.sessions)?e.payload.sessions:[],r=Array.isArray(e.payload.processHints)?e.payload.processHints:[],s=Array.isArray(e.payload.failedPorts)?e.payload.failedPorts:void 0,i=!0===e.payload.degraded;return{sessions:t,processHints:r,...s?{failedPorts:s}:{},...i?{degraded:!0}:{}}}(r),n=!1;for(let e of(d.push(...i.processHints),i.sessions)){let r=el(e,t);if(r){l.push(r);continue}n=!0}let a=n?{...s,degraded:!0,reason:s.reason??"node_payload_invalid_session_id"}:s;o.push(ei(t,a)),(!a.online||a.degraded||i.degraded)&&(u=!0)}return Response.json({sessions:l,processHints:d,hosts:o,hostStatuses:o,...u?{degraded:!0}:{}})}e.s(["GET",()=>F,"POST",()=>x,"applyStickyBusyStatus",()=>W,"applyStickyStatusStabilization",()=>X,"dynamic",0,"force-dynamic","shouldSkipSessionStatusStabilization",()=>G],72626);var ey=e.i(72626);let eg=new t.AppRouteRouteModule({definition:{kind:r.RouteKind.APP_ROUTE,page:"/api/sessions/route",pathname:"/api/sessions",filename:"route",bundlePath:""},distDir:".next",relativeProjectDir:"",resolvedPagePath:"[project]/src/app/api/sessions/route.ts",nextConfigOutput:"standalone",userland:ey}),{workAsyncStorage:em,workUnitAsyncStorage:eS,serverHooks:ew}=eg;function ev(){return(0,s.patchFetch)({workAsyncStorage:em,workUnitAsyncStorage:eS})}async function eb(e,t,s){eg.isDev&&(0,i.addRequestMeta)(e,"devRequestTimingInternalsEnd",process.hrtime.bigint());let S="/api/sessions/route";S=S.replace(/\/index$/,"")||"/";let w=await eg.prepare(e,t,{srcPage:S,multiZoneDraftMode:!1});if(!w)return t.statusCode=400,t.end("Bad Request"),null==s.waitUntil||s.waitUntil.call(s,Promise.resolve()),null;let{buildId:v,params:b,nextConfig:I,parsedUrl:E,isDraftMode:T,prerenderManifest:R,routerServerContext:A,isOnDemandRevalidate:O,revalidateOnlyGenerated:_,resolvedPathname:U,clientReferenceManifest:C,serverActionsManifest:P}=w,M=(0,o.normalizeAppPath)(S),N=!!(R.dynamicRoutes[M]||R.routes[U]),D=async()=>((null==A?void 0:A.render404)?await A.render404(e,t,E,!1):t.end("This page could not be found"),null);if(N&&!T){let e=!!R.routes[U],t=R.dynamicRoutes[M];if(t&&!1===t.fallback&&!e){if(I.experimental.adapterPath)return await D();throw new g.NoFallbackError}}let F=null;!N||eg.isDev||T||(F="/index"===(F=U)?"/":F);let x=!0===eg.isDev||!N,H=N&&!x;P&&C&&(0,a.setManifestsSingleton)({page:S,clientReferenceManifest:C,serverActionsManifest:P});let k=e.method||"GET",K=(0,n.getTracer)(),L=K.getActiveScopeSpan(),$={params:b,prerenderManifest:R,renderOpts:{experimental:{authInterrupts:!!I.experimental.authInterrupts},cacheComponents:!!I.cacheComponents,supportsDynamicResponse:x,incrementalCache:(0,i.getRequestMeta)(e,"incrementalCache"),cacheLifeProfiles:I.cacheLife,waitUntil:s.waitUntil,onClose:e=>{t.on("close",e)},onAfterTaskError:void 0,onInstrumentationRequestError:(t,r,s,i)=>eg.onRequestError(e,t,s,i,A)},sharedContext:{buildId:v}},j=new l.NodeNextRequest(e),q=new l.NodeNextResponse(t),B=d.NextRequestAdapter.fromNodeNextRequest(j,(0,d.signalFromNodeResponse)(t));try{let a=async e=>eg.handle(B,$).finally(()=>{if(!e)return;e.setAttributes({"http.status_code":t.statusCode,"next.rsc":!1});let r=K.getRootSpanAttributes();if(!r)return;if(r.get("next.span_type")!==u.BaseServerSpan.handleRequest)return void console.warn(`Unexpected root span type '${r.get("next.span_type")}'. Please report this Next.js issue https://github.com/vercel/next.js`);let s=r.get("next.route");if(s){let t=`${k} ${s}`;e.setAttributes({"next.route":s,"http.route":s,"next.span_name":t}),e.updateName(t)}else e.updateName(`${k} ${S}`)}),o=!!(0,i.getRequestMeta)(e,"minimalMode"),l=async i=>{var n,l;let d=async({previousCacheEntry:r})=>{try{if(!o&&O&&_&&!r)return t.statusCode=404,t.setHeader("x-nextjs-cache","REVALIDATED"),t.end("This page could not be found"),null;let n=await a(i);e.fetchMetrics=$.renderOpts.fetchMetrics;let l=$.renderOpts.pendingWaitUntil;l&&s.waitUntil&&(s.waitUntil(l),l=void 0);let d=$.renderOpts.collectedTags;if(!N)return await (0,p.sendResponse)(j,q,n,$.renderOpts.pendingWaitUntil),null;{let e=await n.blob(),t=(0,f.toNodeOutgoingHttpHeaders)(n.headers);d&&(t[y.NEXT_CACHE_TAGS_HEADER]=d),!t["content-type"]&&e.type&&(t["content-type"]=e.type);let r=void 0!==$.renderOpts.collectedRevalidate&&!($.renderOpts.collectedRevalidate>=y.INFINITE_CACHE)&&$.renderOpts.collectedRevalidate,s=void 0===$.renderOpts.collectedExpire||$.renderOpts.collectedExpire>=y.INFINITE_CACHE?void 0:$.renderOpts.collectedExpire;return{value:{kind:m.CachedRouteKind.APP_ROUTE,status:n.status,body:Buffer.from(await e.arrayBuffer()),headers:t},cacheControl:{revalidate:r,expire:s}}}}catch(t){throw(null==r?void 0:r.isStale)&&await eg.onRequestError(e,t,{routerKind:"App Router",routePath:S,routeType:"route",revalidateReason:(0,c.getRevalidateReason)({isStaticGeneration:H,isOnDemandRevalidate:O})},!1,A),t}},u=await eg.handleResponse({req:e,nextConfig:I,cacheKey:F,routeKind:r.RouteKind.APP_ROUTE,isFallback:!1,prerenderManifest:R,isRoutePPREnabled:!1,isOnDemandRevalidate:O,revalidateOnlyGenerated:_,responseGenerator:d,waitUntil:s.waitUntil,isMinimalMode:o});if(!N)return null;if((null==u||null==(n=u.value)?void 0:n.kind)!==m.CachedRouteKind.APP_ROUTE)throw Object.defineProperty(Error(`Invariant: app-route received invalid cache entry ${null==u||null==(l=u.value)?void 0:l.kind}`),"__NEXT_ERROR_CODE",{value:"E701",enumerable:!1,configurable:!0});o||t.setHeader("x-nextjs-cache",O?"REVALIDATED":u.isMiss?"MISS":u.isStale?"STALE":"HIT"),T&&t.setHeader("Cache-Control","private, no-cache, no-store, max-age=0, must-revalidate");let g=(0,f.fromNodeOutgoingHttpHeaders)(u.value.headers);return o&&N||g.delete(y.NEXT_CACHE_TAGS_HEADER),!u.cacheControl||t.getHeader("Cache-Control")||g.get("Cache-Control")||g.set("Cache-Control",(0,h.getCacheControlHeader)(u.cacheControl)),await (0,p.sendResponse)(j,q,new Response(u.value.body,{headers:g,status:u.value.status||200})),null};L?await l(L):await K.withPropagatedContext(e.headers,()=>K.trace(u.BaseServerSpan.handleRequest,{spanName:`${k} ${S}`,kind:n.SpanKind.SERVER,attributes:{"http.method":k,"http.target":e.url}},l))}catch(t){if(t instanceof g.NoFallbackError||await eg.onRequestError(e,t,{routerKind:"App Router",routePath:M,routeType:"route",revalidateReason:(0,c.getRevalidateReason)({isStaticGeneration:H,isOnDemandRevalidate:O})},!1,A),N)throw t;return await (0,p.sendResponse)(j,q,new Response(null,{status:500})),null}}e.s(["handler",()=>eb,"patchFetch",()=>ev,"routeModule",()=>eg,"serverHooks",()=>ew,"workAsyncStorage",()=>em,"workUnitAsyncStorage",()=>eS],86100)}];
1
+ module.exports=[86100,e=>{"use strict";let t;var r=e.i(47909),i=e.i(74017),s=e.i(96250),n=e.i(59756),a=e.i(61916),o=e.i(74677),d=e.i(69741),l=e.i(16795),u=e.i(87718),c=e.i(95169),p=e.i(47587),f=e.i(66012),h=e.i(70101),y=e.i(26937),g=e.i(10372),m=e.i(93695);e.i(52474);var v=e.i(220),S=e.i(57181),w=e.i(63127),b=e.i(74579);let I=new Map;function T(e){I.delete(e),I.delete(`child:${e}`)}async function E({stickyBusyDelayMs:e,providers:t}){let r;if(0===t.length)return{payload:{sessions:[],processHints:[]},sourceMeta:{online:!1,degraded:!0,reason:"No local session provider configured"}};let i=await Promise.allSettled(t.map(t=>t.getSessionsResult({stickyBusyDelayMs:e}))),s=[],n=[],a=[],o=null,d=!1,l=!1;for(let e of i){if("fulfilled"!==e.status){l=!0,r||(r=e.reason instanceof Error?e.reason.message:String(e.reason));continue}let t=e.value,i=function(e){if(!e||"object"!=typeof e||Array.isArray(e))return{sessions:[],processHints:[]};let t=Array.isArray(e.sessions)?e.sessions:[],r=Array.isArray(e.processHints)?e.processHints:[],i=Array.isArray(e.failedPorts)?e.failedPorts:void 0,s=!0===e.degraded;return{sessions:t,processHints:r,...i?{failedPorts:i}:{},...s?{degraded:!0}:{}}}(t.payload),u=t.sourceMeta??{online:i.sessions.length>0,...t.status?{degraded:!0}:{}};!o&&t.status&&0===i.sessions.length&&0===i.processHints.length&&(o=t),(i.sessions.length>0||i.processHints.length>0||(i.failedPorts?.length??0)>0)&&(s.push(...i.sessions),n.push(...i.processHints),i.failedPorts&&a.push(...i.failedPorts)),(u.online||i.sessions.length>0)&&(d=!0),d||r||!u.reason||(r=u.reason),(u.degraded||i.degraded)&&(l=!0)}if(0===s.length&&0===n.length&&o)return o;let u=d?{online:!0,...l?{degraded:!0}:{}}:{online:!1,...l?{degraded:!0}:{},...r?{reason:r}:{}};return{payload:{sessions:s,processHints:n,...a.length>0?{failedPorts:a}:{},...l?{degraded:!0}:{}},sourceMeta:u}}function R(e,t,r,i){let s=I.get(e)??{lastBusyAt:0,lastSeenAt:r};if("busy"===t)return s.lastBusyAt=r,s.lastSeenAt=r,I.set(e,s),t;if("retry"===t)return s.lastSeenAt=r,I.set(e,s),t;let n=s.lastBusyAt>0&&r-s.lastBusyAt<=i;return s.lastSeenAt=r,I.set(e,s),n?"busy":"idle"}function A(e,t){let r;for(let[r,i]of I){let s=e-i.lastSeenAt,n=t.has(r);(s>864e5||!n&&s>18e5)&&I.delete(r)}let i=Number.isFinite(r=Number(process.env.OPENCODE_STATUS_STICKY_MAX_ENTRIES))&&r>0?Math.floor(r):5e3;if(I.size<=i)return;let s=I.size-i,n=Array.from(I.entries()).sort((e,t)=>e[1].lastSeenAt-t[1].lastSeenAt),a=0;for(let[e]of n){if(a>=s)break;!t.has(e)&&(I.delete(e),a++)}if(!(a>=s))for(let[e]of n){if(a>=s)break;I.has(e)&&(I.delete(e),a++)}}function O(e){return"busy"===e||"retry"===e?e:"idle"}function _(e,t){return!!((0,b.takeSessionStickyStatusBlocked)(e.id,t)||e.time?.archived)&&(function(e){for(let t of(T(e.id),(0,b.clearSessionForceUnarchived)(e.id),e.children))T(`child:${t.id}`),(0,b.clearSessionForceUnarchived)(t.id)}(e),!0)}function P(e,t,r){for(let i of e.children){if(i.time?.archived){T(`child:${i.id}`),(0,b.clearSessionForceUnarchived)(i.id);continue}let e=O(i.realTimeStatus),s=i.waitingForUser&&"idle"===e?"retry":e;i.realTimeStatus=R(`child:${i.id}`,s,t,r),("busy"===i.realTimeStatus||"retry"===i.realTimeStatus||i.waitingForUser)&&(0,b.markSessionForceUnarchived)(i.id,t)}let i=O(e.realTimeStatus),s=e.waitingForUser&&"idle"===i?"retry":i;e.realTimeStatus=R(e.id,s,t,r);let n=e.children.some(e=>"busy"===e.realTimeStatus||"retry"===e.realTimeStatus||e.waitingForUser);("busy"===e.realTimeStatus||"retry"===e.realTimeStatus||e.waitingForUser||n)&&(0,b.markSessionForceUnarchived)(e.id,t)}var M=e.i(33405),U=e.i(14747),C=e.i(99686),N=e.i(84044);let D=k("OPENCODE_SESSIONS_LIST_TIMEOUT_MS",6e3),F=k("OPENCODE_SESSIONS_STATUS_TIMEOUT_MS",4e3),H=k("OPENCODE_SESSIONS_MESSAGES_TIMEOUT_MS",2500),x=new Set(["awaiting-input","awaiting_input","input-required","input_required","requires-input","requires_input","blocked","paused"]);function k(e,t){let r=Number(process.env[e]);return Number.isFinite(r)&&r>0?Math.floor(r):t}function K(e,t,r){let i,s=Error(`${r} timed out after ${t}ms`),n=new AbortController,a=new Promise((e,r)=>{i=setTimeout(()=>{n.abort(),r(s)},t)});return Promise.race([e(n.signal).catch(e=>{if(n.signal.aborted)throw s;throw e}),a]).finally(()=>{i&&clearTimeout(i)})}function j(e){return e.trim().toLowerCase()}function L(e){return x.has(j(e))}async function $(e,t,r){var i=(await K(r=>(0,N.getOpencodeSessionMessages)(e,t,8,r),r,`session.messages(${t})`)).data||[];let s=[];for(let e of i)for(let t of e.parts||[]){let e=t?.state?.status;if("string"==typeof e){let t=j(e);t&&s.push(t)}}return s}function q(e){return e.time?.updated||e.time?.created||0}function B(e,t,r=!1){return{id:e.id,slug:e.slug,title:e.title,directory:e.directory,debugReason:e.debugReason,parentID:e.parentID,time:e.time,realTimeStatus:t,waitingForUser:r}}function G(e){return U.default.basename(e)}var W=e.i(586),V=e.i(68817),z=e.i(39948),X=e.i(82414),Y=e.i(81951);let J=Number.isFinite(t=Number(process.env.VIBEPULSE_NODE_SESSIONS_TIMEOUT_MS))&&t>0?Math.floor(t):6e3,Z={hostId:"local",hostLabel:"Local",hostKind:"local"},Q=[{id:"opencode",async getSessionsResult({stickyBusyDelayMs:e}){let{processes:t,timedOut:r}=(0,C.discoverOpencodeProcessCwdsWithoutPortWithMeta)(),i=new Map;for(let e of t)!(!e.cwd||e.cwd.startsWith("/private/tmp/opencode"))&&(i.has(e.cwd)||i.set(e.cwd,{pid:e.pid,directory:e.cwd,projectName:G(e.cwd),reason:"process_without_api_port"}));let{ports:s,timedOut:n}=(0,C.discoverOpencodePortsWithMeta)();if(!s.length){let e=Array.from(i.values());return n||r?{payload:{error:"OpenCode discovery timed out",hint:"Host process discovery exceeded timeout. Retry shortly, or increase OPENCODE_DISCOVERY_TIMEOUT_MS.",...e.length>0?{processHints:e}:{}},status:503,sourceMeta:{online:!1,degraded:!0,reason:"OpenCode discovery timed out"}}:e.length>0?{payload:{sessions:[],processHints:e},sourceMeta:{online:!1,reason:"OpenCode server not found"}}:{payload:{error:"OpenCode server not found",hint:"Make sure OpenCode is running with an exposed API port. Example: opencode --port <PORT> (VibePulse auto-detects active ports)."},status:503,sourceMeta:{online:!1,reason:"OpenCode server not found"}}}try{let t=await Promise.allSettled(s.map(async e=>{let t=(0,N.createVibePulseOpencodeClient)(`http://localhost:${e}`),r=await K(e=>(0,N.listOpencodeSessions)(t,e),D,`session.list(${e})`),i=await K(e=>(0,N.getOpencodeSessionStatus)(t,e),F,`session.status(${e})`).catch(()=>({data:{}}));return{port:e,client:t,sessions:r.data||[],status:i.data||{}}})),r=[],n={},a={},o={},d=[];for(let e=0;e<t.length;e++){let i=t[e],l=s[e];if("fulfilled"!==i.status){d.push({port:l,reason:(0,N.formatOpencodeSdkError)(i.reason)});continue}for(let e of(r.push(...i.value.sessions),Object.assign(n,i.value.status),a[i.value.port]=i.value.client,i.value.sessions))e.id in o||(o[e.id]=i.value.port)}let l=[],u=new Set;for(let e of r)u.has(e.id)||(u.add(e.id),l.push(e));let c=l.filter(e=>!e.parentID),p=l.filter(e=>!!e.parentID),f=Date.now();for(let e of((0,b.pruneSessionForceUnarchived)(f),(0,b.pruneSessionStickyStatusBlocked)(f),c))e.time?.archived!==void 0&&(0,b.shouldForceSessionUnarchived)(e.id,f)&&(e.time={...e.time,archived:void 0});for(let e of p)e.time?.archived!==void 0&&(0,b.shouldForceSessionUnarchived)(e.id,f)&&(e.time={...e.time,archived:void 0});if(t.length>0&&d.length===t.length)return A(Date.now(),new Set),{payload:{error:"Failed to fetch sessions from OpenCode ports",hint:"All discovered OpenCode API ports timed out or failed. Retry shortly or increase OPENCODE_SESSIONS_LIST_TIMEOUT_MS.",failedPorts:d},status:503,sourceMeta:{online:!1,degraded:!0,reason:"Failed to fetch sessions from OpenCode ports"}};if(d.length>0&&0===c.length&&0===p.length)return A(Date.now(),new Set),{payload:{sessions:[],processHints:Array.from(i.values()),failedPorts:d,degraded:!0},sourceMeta:{online:!0,degraded:!0}};let h=c.map(e=>({...e,projectName:G(e.directory),branch:function(e){if(!function(e){try{let t=(0,M.execSync)("git rev-parse --is-inside-work-tree",{cwd:e,encoding:"utf-8",stdio:["ignore","pipe","ignore"],timeout:1200});return"true"===t.trim()}catch{return!1}}(e))return null;try{return(0,M.execSync)("git branch --show-current",{cwd:e,encoding:"utf-8",stdio:["ignore","pipe","ignore"],timeout:1200}).trim()||null}catch{return null}}(e.directory),realTimeStatus:n[e.id]?.type||"idle",waitingForUser:!1,children:[]})),y=new Map(h.map(e=>[e.id,e])),g=Date.now(),m=[];for(let e of p){let t=e.parentID?y.get(e.parentID):void 0;if(!t){let r=h.filter(t=>t.directory===e.directory).sort((e,t)=>q(t)-q(e));t=r.find(e=>"busy"===e.realTimeStatus||"retry"===e.realTimeStatus)||r[0]}if(!t)continue;let r=n[e.id]?.type,i=q(e),s=i>0&&g-i<=18e5;if(!(e.time?.archived&&!r&&!s))if(r&&"idle"!==r)t.children.push(B(e,r));else{if(!s)continue;m.length<50&&m.push({parentId:t.id,child:e,childUpdatedAt:i})}}if(m.length>0)for(let e of(await Promise.allSettled(m.map(async({parentId:e,child:t,childUpdatedAt:r})=>{let i=o[t.id]??o[e],s=i?a[i]:void 0,n=r>0&&g-r<=12e4;if(!s)return{parentId:e,child:t,childStatus:n?"busy":"idle"};try{let i=await $(s,t.id,H),a=i.some(e=>"running"===e),o=!a&&i.some(L);return{parentId:e,child:t,childWaitingForUser:o,childStatus:o||a||r>0&&g-r<=3e5||n?"busy":"idle"}}catch{return{parentId:e,child:t,childWaitingForUser:!1,childStatus:n?"busy":"idle"}}})))){if("fulfilled"!==e.status||"idle"===e.value.childStatus)continue;let t=y.get(e.value.parentId);t&&t.children.push(B(e.value.child,e.value.childStatus,e.value.childWaitingForUser))}let v=h.filter(e=>{if("idle"!==e.realTimeStatus)return!1;let t=q(e);return t>0&&g-t<=18e5||!!e.time?.archived}).sort((e,t)=>q(t)-q(e)).slice(0,50);if(v.length>0)for(let e of(await Promise.allSettled(v.map(async e=>{let t=q(e),r=t>0&&g-t<=12e4,i=o[e.id],s=i?a[i]:void 0;if(!s)return{sessionId:e.id,status:r?"busy":"idle",waitingForUser:!1};try{let t,i=await $(s,e.id,H),n=i.some(e=>"running"===e),a=!n&&i.some(L),o=i.length>0&&i.every(e=>"completed"===e),d=!!(t=e.time?.updated)&&g-t<=3e4;return{sessionId:e.id,status:n||a?"busy":o&&!d?"idle":r||d?"busy":"idle",waitingForUser:a}}catch{return{sessionId:e.id,status:r?"busy":"idle",waitingForUser:!1}}})))){if("fulfilled"!==e.status||"idle"===e.value.status)continue;let t=y.get(e.value.sessionId);t&&(t.realTimeStatus=e.value.status,e.value.waitingForUser&&(t.waitingForUser=!0))}for(let e of h)e.children.length>0&&e.children.sort((e,t)=>{let r="busy"===e.realTimeStatus||"retry"===e.realTimeStatus,i="busy"===t.realTimeStatus||"retry"===t.realTimeStatus;if(r&&!i)return -1;if(!r&&i)return 1;let s=e.time?.updated||e.time?.created||0;return(t.time?.updated||t.time?.created||0)-s});let S=h.filter(e=>"busy"===e.realTimeStatus||!!e.time?.archived||e.children.some(e=>"busy"===e.realTimeStatus||"retry"===e.realTimeStatus));if(S.length>0){for(let e of(await Promise.allSettled(S.map(async e=>{let t=o[e.id],r=t?a[t]:void 0;if(!r)return{sessionId:e.id,parentWaiting:!1,waiting:!1,running:!1,waitingChildIds:new Set};try{let t=await $(r,e.id,H),i=t.some(e=>"running"===e),s=!i&&t.some(L),n=await Promise.allSettled(e.children.filter(e=>"busy"===e.realTimeStatus||"retry"===e.realTimeStatus).map(async t=>{let r=o[t.id]??o[e.id],i=r?a[r]:void 0;if(!i)return{childId:t.id,waiting:!1};try{let e=await $(i,t.id,H),r=e.some(e=>"running"===e);return{childId:t.id,waiting:!r&&e.some(L)}}catch{return{childId:t.id,waiting:!1}}})),d=new Set(n.filter(e=>"fulfilled"===e.status).filter(e=>e.value.waiting).map(e=>e.value.childId)),l=d.size>0||e.children.some(e=>e.waitingForUser||"retry"===e.realTimeStatus);return{sessionId:e.id,parentWaiting:s,waiting:s||l,running:i,waitingChildIds:d}}catch{return{sessionId:e.id,parentWaiting:!1,waiting:!1,running:!1,waitingChildIds:new Set}}}))))if("fulfilled"===e.status){let t=h.find(t=>t.id===e.value.sessionId);if(!t)continue;for(let r of t.children)e.value.waitingChildIds.has(r.id)&&(r.waitingForUser=!0);e.value.running&&(t.realTimeStatus="busy"),e.value.parentWaiting&&(t.waitingForUser=!0)}}let w=Date.now(),I=new Set;for(let e of h)for(let t of(I.add(e.id),e.children))I.add(`child:${t.id}`);for(let t of h)_(t,w)||P(t,w,e);A(w,I);let T=new Set;for(let e of l)e.directory&&T.add(e.directory);let E=Array.from(i.values()).filter(e=>!T.has(e.directory)),R={sessions:h,processHints:E};return d.length>0&&(R.failedPorts=d,R.degraded=!0),{payload:R,sourceMeta:{online:!0,...d.length>0?{degraded:!0}:{}}}}catch(e){return console.error("Error fetching sessions:",e),{payload:{error:"Failed to fetch sessions",details:e instanceof Error?e.message:String(e),hint:"Make sure OpenCode is running with an exposed API port. Example: opencode --port <PORT> (VibePulse auto-detects active ports)."},status:500,sourceMeta:{online:!1,degraded:!0,reason:"Failed to fetch sessions"}}}}},w.claudeCodeLocalSessionProvider],ee="force-dynamic";async function et(){return eA()}async function er(e){return eO(e)}async function ei(){let e=1e3;try{let t=await (0,S.readConfig)(),r=(t.vibepulse&&"object"==typeof t.vibepulse&&!Array.isArray(t.vibepulse)?t.vibepulse:{}).stickyBusyDelayMs;"number"==typeof r&&Number.isFinite(r)&&r>=0&&(e=r)}catch{}return e}function es(e){return"object"==typeof e&&null!==e&&!Array.isArray(e)}function en(e){return"remote"===e.hostKind}function ea(e,t,r){return en(r)&&"claude-code"===t?{openProject:e?.openProject??!0,openEditor:!1,archive:!1,delete:!1}:e}function eo(e){return"idle"===e||"busy"===e||"retry"===e}function ed(e){if(!es(e))return!1;let t=e.created,r=e.updated,i=e.archived;return"number"==typeof t&&"number"==typeof r&&(null==i||"number"==typeof i)}function el(e){return e&&null===e.archived?{created:e.created,updated:e.updated}:e}function eu(e){if(!es(e))return null;let t="string"==typeof e.hostId?e.hostId.trim():e.hostId,r="string"==typeof e.hostLabel?e.hostLabel.trim():e.hostLabel,i=e.hostKind;if(t===Z.hostId&&r===Z.hostLabel&&i===Z.hostKind)return Z;let s=e.baseUrl,n=e.enabled;if("string"!=typeof t||"string"!=typeof r||"remote"!==i||"string"!=typeof s||"boolean"!=typeof n)return null;let a=function(e){let t=e.trim();if(!t)return null;try{let e=new URL(t);if("http:"!==e.protocol&&"https:"!==e.protocol||e.username||e.password)return null;return e.hash="",e.toString().replace(/\/+$/,"")}catch{return null}}(s);return a?{hostId:t,hostLabel:r,hostKind:i,baseUrl:a,enabled:n}:null}function ec(e){return e.status?Response.json(e.payload,{status:e.status}):Response.json(e.payload)}function ep(e,t){return{hostId:e.hostId,hostLabel:e.hostLabel,hostKind:e.hostKind,online:t.online,...t.degraded?{degraded:!0}:{},...t.reason?{reason:t.reason}:{},...en(e)?{baseUrl:e.baseUrl}:{}}}function ef(e,t){return{...e,hosts:t,hostStatuses:t}}function eh(e){return(0,z.extractProviderRawId)(function(e){if(!e.includes(":"))return e;try{return(0,W.parseSourceKey)(e).sessionId}catch{return e}}(e))}function ey(e,t,r,i){try{return(0,z.composeProviderSourceKey)(e,t,{readOnly:r,...i?{provider:i}:{}}).sourceKey}catch{return}}function eg(e,t){let r=e.rawSessionId??eh(e.id),i=e.parentID?eh(e.parentID):e.parentID,s=(0,z.detectProviderFromRawId)(e.id),n=ea(e.capabilities,s,t),a=ey(t.hostId,r,e.readOnly,s);if(!a)return null;let o=i?ey(t.hostId,i,void 0,s)??void 0:void 0,d=e.provider??("claude-code"===s?s:void 0),l="claude-code"===d?e.providerRawId??r:e.providerRawId,u=[];for(let r of e.children){let e=function(e,t,r){let i=e.rawSessionId??eh(e.id),s=e.parentID?eh(e.parentID):e.parentID,n=(0,z.detectProviderFromRawId)(e.id),a=r?(0,z.detectProviderFromRawId)(r):void 0,o="claude-code"===n?n:a??n,d=ea(e.capabilities,o,t),l=ey(t.hostId,i,e.readOnly,o);if(!l)return null;let u=r?eh(r):void 0,c="string"==typeof s&&"string"==typeof r&&u===s,p=s?c?r:ey(t.hostId,s,void 0,o)??void 0:void 0,f=e.provider??("claude-code"===o?o:void 0),h="claude-code"===f?e.providerRawId??i:e.providerRawId;return{...e,id:l,parentID:p,hostId:t.hostId,hostLabel:t.hostLabel,hostKind:t.hostKind,...en(t)?{hostBaseUrl:t.baseUrl}:{},time:el(e.time),rawSessionId:i,sourceSessionKey:l,readOnly:e.readOnly??!1,capabilities:d,...f?{provider:f}:{},...h?{providerRawId:h}:{}}}(r,t,a);e&&u.push(e)}return{...e,id:a,parentID:o,hostId:t.hostId,hostLabel:t.hostLabel,hostKind:t.hostKind,...en(t)?{hostBaseUrl:t.baseUrl}:{},time:el(e.time),rawSessionId:r,sourceSessionKey:a,readOnly:e.readOnly??!1,capabilities:n,...d?{provider:d}:{},...l?{providerRawId:l}:{},children:u}}function em(e){return"claude-code"===e.provider}function ev(e){return"number"==typeof e&&Number.isFinite(e)?e:void 0}function eS(e){return ev(e.time?.created)}function ew(e){return ev(e.time?.updated)}function eb(e,t){return e.hostId===t.hostId&&e.hostKind===t.hostKind}function eI(e){let t=new Map(e.map(e=>[e.id,e])),r=new Set,i=(e,i)=>{let s=i,n=new Set([e.id]);for(;s&&!n.has(s.id);){if(n.add(s.id),!r.has(s.id))return s;if("string"!=typeof s.parentID)break;s=t.get(s.parentID)}};for(let s of[...e].sort((e,t)=>{let r=(eS(t)??0)-(eS(e)??0);return 0!==r?r:(ew(t)??0)-(ew(e)??0)})){let n;if(!em(s)||r.has(s.id))continue;if("string"==typeof s.parentID){let e=t.get(s.parentID);if(e){if(e===s||!em(e)||!eb(e,s))continue;let t=i(s,e);if(!t){r.has(e.id)&&(s.parentID=void 0);continue}n=t,s.parentID!==t.id&&(s.parentID=t.id)}}if(!n&&(n=function(e,t,r){if(e.topology?.childSessions==="authoritative")return;let i=eS(e);if(void 0===i)return;let s=ew(e)??i,n=[];for(let a of t){if(a.id===e.id||r.has(a.id)||!em(a)||!eb(a,e)||"string"==typeof a.parentID||a.directory!==e.directory||a.projectName!==e.projectName)continue;let t=eS(a);if(void 0===t||t>i)continue;let o=i-t;if(o>6e4||!("busy"===a.realTimeStatus||"retry"===a.realTimeStatus||a.waitingForUser))continue;let d=Math.abs(s-(ew(a)??t));n.push({parent:a,createdGapMs:o,updatedGapMs:d})}if(0===n.length)return;n.sort((e,t)=>e.createdGapMs!==t.createdGapMs?e.createdGapMs-t.createdGapMs:e.updatedGapMs-t.updatedGapMs);let a=n[0],o=n[1];if(!(o&&5e3>=Math.abs(o.createdGapMs-a.createdGapMs)))return a.parent}(s,e,r))&&(s.parentID=n.id),!n||s.children.length>0)continue;let a=function(e){let t={...e};return delete t.children,t}(s),o=n.children.findIndex(e=>e.id===a.id);o>=0?n.children[o]={...n.children[o],...a}:n.children.push(a),n.children.sort((e,t)=>{let r="busy"===e.realTimeStatus||"retry"===e.realTimeStatus,i="busy"===t.realTimeStatus||"retry"===t.realTimeStatus;if(r&&!i)return -1;if(!r&&i)return 1;let s=e.time?.updated||e.time?.created||0;return(t.time?.updated||t.time?.created||0)-s}),r.add(s.id)}return e.filter(e=>!r.has(e.id))}async function eT(e){try{return await e.json()}catch{return null}}async function eE(e,t){let r=`node.sessions(${e.hostId})`,i=new AbortController,s=!1,n=setTimeout(()=>{s=!0,i.abort()},J);try{return await fetch(`${t.baseUrl}/api/node/sessions`,{method:"GET",headers:(0,V.createNodeRequestHeaders)(t.token),signal:i.signal})}catch(e){if(s)throw Error(`${r} timed out after ${J}ms`);throw e}finally{clearTimeout(n)}}async function eR(e,t){if(!t)return{payload:{sessions:[],processHints:[],degraded:!0},sourceMeta:{online:!1,degraded:!0,reason:"node_not_configured"}};if(!t.enabled)return{payload:{sessions:[],processHints:[],degraded:!0},sourceMeta:{online:!1,degraded:!0,reason:"node_disabled"}};try{let r=await eE(e,t),i=await eT(r);if(!r.ok){let e=es(i)&&"string"==typeof i.reason?i.reason:`node_request_failed_${r.status}`;return{payload:{sessions:[],processHints:[],degraded:!0},sourceMeta:{online:!0,degraded:!0,reason:e}}}let s=function(e){if(!es(e)||!0!==e.ok||"node"!==e.role||e.protocolVersion!==V.NODE_PROTOCOL_VERSION)return null;let t=e.source;if(!es(t)||"local"!==t.hostId||"Local"!==t.hostLabel||"local"!==t.hostKind)return null;let r=e.upstream;if(!es(r)||"opencode"!==r.kind||"boolean"!=typeof r.reachable)return null;let i=e.sessions,s=e.processHints;return!Array.isArray(i)||i.some(e=>!function(e){if(!es(e)||"string"!=typeof e.id||"string"!=typeof e.directory||"string"!=typeof e.projectName)return!1;let t=e.branch;if(null!=t&&"string"!=typeof t||!eo(e.realTimeStatus)||"boolean"!=typeof e.waitingForUser)return!1;let r=e.children;if(!Array.isArray(r)||r.some(e=>!function(e){if(!es(e)||"string"!=typeof e.id||!eo(e.realTimeStatus)||"boolean"!=typeof e.waitingForUser)return!1;let t=e.parentID,r=e.directory,i=e.time;return(void 0===t||"string"==typeof t)&&(void 0===r||"string"==typeof r)&&(void 0===i||!!ed(i))}(e)))return!1;let i=e.time;return void 0===i||!!ed(i)}(e))||!Array.isArray(s)||s.some(e=>!(es(e)&&"number"==typeof e.pid&&"string"==typeof e.directory&&"string"==typeof e.projectName&&"process_without_api_port"===e.reason))?null:{sessions:i,processHints:s,degraded:!0===e.degraded}}(i);if(!s)return{payload:{sessions:[],processHints:[],degraded:!0},sourceMeta:{online:!0,degraded:!0,reason:"node_payload_invalid"}};return{payload:{sessions:s.sessions,processHints:s.processHints,...s.degraded?{degraded:!0}:{}},sourceMeta:{online:!0,...s.degraded?{degraded:!0}:{}}}}catch(e){return{payload:{sessions:[],processHints:[],degraded:!0},sourceMeta:{online:!1,degraded:!0,reason:e instanceof Error?e.message:String(e)}}}}async function eA(){let e=await ei();return ec(await E({stickyBusyDelayMs:e,providers:[...Q]}))}async function eO(e){let t;try{let r=await e.json();t=function(e){if(!es(e)||!Array.isArray(e.sources)||0===e.sources.length)throw Error("Invalid sources payload");let t=e.sources.map(eu);if(t.some(e=>null===e))throw Error("Invalid sources payload");return t}(r)}catch{return Response.json({error:"Invalid sources payload",hint:"POST /api/sessions expects a JSON body with a non-empty sources array."},{status:400})}let r="node"===process.env[Y.RUNTIME_ROLE_ENV_VAR]?[Z]:t.filter(e=>"local"===e.hostKind||e.enabled);if(0===r.length)return Response.json({sessions:[],processHints:[],hosts:[],hostStatuses:[]});if(1===r.length&&"local"===r[0].hostKind){let e=await ei(),t=await E({stickyBusyDelayMs:e,providers:[...Q]}),r=t.sourceMeta??{online:!t.status,...t.status?{degraded:!0}:{}},i=r.online?r:{...r,degraded:!0},s=ep(Z,i),n=!i.online&&es(t.payload)?ef({sessions:[],processHints:Array.isArray(t.payload.processHints)?t.payload.processHints:[],degraded:!0},[s]):null;if(n){let e=t.status??503;return Response.json(n,{status:e})}return ec({...t,payload:es(t.payload)?ef(function(e,t){if(!Array.isArray(e.sessions))return e;let r=[],i=0;for(let s of e.sessions){let e=eg(s,t);if(e){r.push(e);continue}i+=1}let s=!0===e.degraded;return{...e,sessions:eI(r),...s||i>0?{degraded:!0}:{}}}(t.payload,Z),[s]):t.payload})}let i=r.some(e=>"local"===e.hostKind)?await ei():0,s=new Map((await (0,X.listNodeRecords)()).map(e=>[e.nodeId,e])),n=r.map(e=>{if(!en(e))return e;let t=s.get(e.hostId);return t?{...e,baseUrl:t.baseUrl,enabled:t.enabled}:e}),a=await Promise.allSettled(n.map(async e=>({source:e,result:"local"===e.hostKind?await E({stickyBusyDelayMs:i,providers:[...Q]}):await eR(e,s.get(e.hostId))}))),o=[],d=[],l=[],u=!1;for(let e of a){if("fulfilled"!==e.status){u=!0;continue}let{source:t,result:r}=e.value,i=r.sourceMeta??{online:!r.status,...r.status?{degraded:!0}:{}},s=function(e){if(!es(e.payload))return{sessions:[],processHints:[]};let t=Array.isArray(e.payload.sessions)?e.payload.sessions:[],r=Array.isArray(e.payload.processHints)?e.payload.processHints:[],i=Array.isArray(e.payload.failedPorts)?e.payload.failedPorts:void 0,s=!0===e.payload.degraded;return{sessions:t,processHints:r,...i?{failedPorts:i}:{},...s?{degraded:!0}:{}}}(r),n=!1;for(let e of(l.push(...s.processHints),s.sessions)){let r=eg(e,t);if(r){d.push(r);continue}n=!0}let a=n?{...i,degraded:!0,reason:i.reason??"node_payload_invalid_session_id"}:i;o.push(ep(t,a)),(!a.online||a.degraded||s.degraded)&&(u=!0)}return Response.json({sessions:eI(d),processHints:l,hosts:o,hostStatuses:o,...u?{degraded:!0}:{}})}e.s(["GET",()=>et,"POST",()=>er,"dynamic",0,ee],27809),e.i(27809),e.s(["GET",()=>et,"POST",()=>er,"applyStickyBusyStatus",()=>R,"applyStickyStatusStabilization",()=>P,"dynamic",0,ee,"shouldSkipSessionStatusStabilization",()=>_],72626);var e_=e.i(72626);let eP=new r.AppRouteRouteModule({definition:{kind:i.RouteKind.APP_ROUTE,page:"/api/sessions/route",pathname:"/api/sessions",filename:"route",bundlePath:""},distDir:".next",relativeProjectDir:"",resolvedPagePath:"[project]/src/app/api/sessions/route.ts",nextConfigOutput:"standalone",userland:e_}),{workAsyncStorage:eM,workUnitAsyncStorage:eU,serverHooks:eC}=eP;function eN(){return(0,s.patchFetch)({workAsyncStorage:eM,workUnitAsyncStorage:eU})}async function eD(e,t,r){eP.isDev&&(0,n.addRequestMeta)(e,"devRequestTimingInternalsEnd",process.hrtime.bigint());let s="/api/sessions/route";s=s.replace(/\/index$/,"")||"/";let S=await eP.prepare(e,t,{srcPage:s,multiZoneDraftMode:!1});if(!S)return t.statusCode=400,t.end("Bad Request"),null==r.waitUntil||r.waitUntil.call(r,Promise.resolve()),null;let{buildId:w,params:b,nextConfig:I,parsedUrl:T,isDraftMode:E,prerenderManifest:R,routerServerContext:A,isOnDemandRevalidate:O,revalidateOnlyGenerated:_,resolvedPathname:P,clientReferenceManifest:M,serverActionsManifest:U}=S,C=(0,d.normalizeAppPath)(s),N=!!(R.dynamicRoutes[C]||R.routes[P]),D=async()=>((null==A?void 0:A.render404)?await A.render404(e,t,T,!1):t.end("This page could not be found"),null);if(N&&!E){let e=!!R.routes[P],t=R.dynamicRoutes[C];if(t&&!1===t.fallback&&!e){if(I.experimental.adapterPath)return await D();throw new m.NoFallbackError}}let F=null;!N||eP.isDev||E||(F="/index"===(F=P)?"/":F);let H=!0===eP.isDev||!N,x=N&&!H;U&&M&&(0,o.setManifestsSingleton)({page:s,clientReferenceManifest:M,serverActionsManifest:U});let k=e.method||"GET",K=(0,a.getTracer)(),j=K.getActiveScopeSpan(),L={params:b,prerenderManifest:R,renderOpts:{experimental:{authInterrupts:!!I.experimental.authInterrupts},cacheComponents:!!I.cacheComponents,supportsDynamicResponse:H,incrementalCache:(0,n.getRequestMeta)(e,"incrementalCache"),cacheLifeProfiles:I.cacheLife,waitUntil:r.waitUntil,onClose:e=>{t.on("close",e)},onAfterTaskError:void 0,onInstrumentationRequestError:(t,r,i,s)=>eP.onRequestError(e,t,i,s,A)},sharedContext:{buildId:w}},$=new l.NodeNextRequest(e),q=new l.NodeNextResponse(t),B=u.NextRequestAdapter.fromNodeNextRequest($,(0,u.signalFromNodeResponse)(t));try{let o=async e=>eP.handle(B,L).finally(()=>{if(!e)return;e.setAttributes({"http.status_code":t.statusCode,"next.rsc":!1});let r=K.getRootSpanAttributes();if(!r)return;if(r.get("next.span_type")!==c.BaseServerSpan.handleRequest)return void console.warn(`Unexpected root span type '${r.get("next.span_type")}'. Please report this Next.js issue https://github.com/vercel/next.js`);let i=r.get("next.route");if(i){let t=`${k} ${i}`;e.setAttributes({"next.route":i,"http.route":i,"next.span_name":t}),e.updateName(t)}else e.updateName(`${k} ${s}`)}),d=!!(0,n.getRequestMeta)(e,"minimalMode"),l=async n=>{var a,l;let u=async({previousCacheEntry:i})=>{try{if(!d&&O&&_&&!i)return t.statusCode=404,t.setHeader("x-nextjs-cache","REVALIDATED"),t.end("This page could not be found"),null;let s=await o(n);e.fetchMetrics=L.renderOpts.fetchMetrics;let a=L.renderOpts.pendingWaitUntil;a&&r.waitUntil&&(r.waitUntil(a),a=void 0);let l=L.renderOpts.collectedTags;if(!N)return await (0,f.sendResponse)($,q,s,L.renderOpts.pendingWaitUntil),null;{let e=await s.blob(),t=(0,h.toNodeOutgoingHttpHeaders)(s.headers);l&&(t[g.NEXT_CACHE_TAGS_HEADER]=l),!t["content-type"]&&e.type&&(t["content-type"]=e.type);let r=void 0!==L.renderOpts.collectedRevalidate&&!(L.renderOpts.collectedRevalidate>=g.INFINITE_CACHE)&&L.renderOpts.collectedRevalidate,i=void 0===L.renderOpts.collectedExpire||L.renderOpts.collectedExpire>=g.INFINITE_CACHE?void 0:L.renderOpts.collectedExpire;return{value:{kind:v.CachedRouteKind.APP_ROUTE,status:s.status,body:Buffer.from(await e.arrayBuffer()),headers:t},cacheControl:{revalidate:r,expire:i}}}}catch(t){throw(null==i?void 0:i.isStale)&&await eP.onRequestError(e,t,{routerKind:"App Router",routePath:s,routeType:"route",revalidateReason:(0,p.getRevalidateReason)({isStaticGeneration:x,isOnDemandRevalidate:O})},!1,A),t}},c=await eP.handleResponse({req:e,nextConfig:I,cacheKey:F,routeKind:i.RouteKind.APP_ROUTE,isFallback:!1,prerenderManifest:R,isRoutePPREnabled:!1,isOnDemandRevalidate:O,revalidateOnlyGenerated:_,responseGenerator:u,waitUntil:r.waitUntil,isMinimalMode:d});if(!N)return null;if((null==c||null==(a=c.value)?void 0:a.kind)!==v.CachedRouteKind.APP_ROUTE)throw Object.defineProperty(Error(`Invariant: app-route received invalid cache entry ${null==c||null==(l=c.value)?void 0:l.kind}`),"__NEXT_ERROR_CODE",{value:"E701",enumerable:!1,configurable:!0});d||t.setHeader("x-nextjs-cache",O?"REVALIDATED":c.isMiss?"MISS":c.isStale?"STALE":"HIT"),E&&t.setHeader("Cache-Control","private, no-cache, no-store, max-age=0, must-revalidate");let m=(0,h.fromNodeOutgoingHttpHeaders)(c.value.headers);return d&&N||m.delete(g.NEXT_CACHE_TAGS_HEADER),!c.cacheControl||t.getHeader("Cache-Control")||m.get("Cache-Control")||m.set("Cache-Control",(0,y.getCacheControlHeader)(c.cacheControl)),await (0,f.sendResponse)($,q,new Response(c.value.body,{headers:m,status:c.value.status||200})),null};j?await l(j):await K.withPropagatedContext(e.headers,()=>K.trace(c.BaseServerSpan.handleRequest,{spanName:`${k} ${s}`,kind:a.SpanKind.SERVER,attributes:{"http.method":k,"http.target":e.url}},l))}catch(t){if(t instanceof m.NoFallbackError||await eP.onRequestError(e,t,{routerKind:"App Router",routePath:C,routeType:"route",revalidateReason:(0,p.getRevalidateReason)({isStaticGeneration:x,isOnDemandRevalidate:O})},!1,A),N)throw t;return await (0,f.sendResponse)($,q,new Response(null,{status:500})),null}}e.s(["handler",()=>eD,"patchFetch",()=>eN,"routeModule",()=>eP,"serverHooks",()=>eC,"workAsyncStorage",()=>eM,"workUnitAsyncStorage",()=>eU],86100)}];
2
2
 
3
3
  //# sourceMappingURL=node_modules_next_dist_esm_build_templates_app-route_b054aff3.js.map