@a5c-ai/babysitter-observer-dashboard 5.0.1-staging.7a8768ec

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 (513) hide show
  1. package/.next/BUILD_ID +1 -0
  2. package/.next/app-path-routes-manifest.json +16 -0
  3. package/.next/build-manifest.json +23 -0
  4. package/.next/export-marker.json +6 -0
  5. package/.next/fallback-build-manifest.json +13 -0
  6. package/.next/images-manifest.json +68 -0
  7. package/.next/next-minimal-server.js.nft.json +1 -0
  8. package/.next/next-server.js.nft.json +1 -0
  9. package/.next/package.json +1 -0
  10. package/.next/prerender-manifest.json +114 -0
  11. package/.next/required-server-files.json +334 -0
  12. package/.next/routes-manifest.json +139 -0
  13. package/.next/server/app/_global-error/page/app-paths-manifest.json +3 -0
  14. package/.next/server/app/_global-error/page/build-manifest.json +19 -0
  15. package/.next/server/app/_global-error/page/next-font-manifest.json +6 -0
  16. package/.next/server/app/_global-error/page/react-loadable-manifest.json +1 -0
  17. package/.next/server/app/_global-error/page/server-reference-manifest.json +4 -0
  18. package/.next/server/app/_global-error/page.js +9 -0
  19. package/.next/server/app/_global-error/page.js.map +5 -0
  20. package/.next/server/app/_global-error/page.js.nft.json +1 -0
  21. package/.next/server/app/_global-error/page_client-reference-manifest.js +3 -0
  22. package/.next/server/app/_global-error.html +1 -0
  23. package/.next/server/app/_global-error.meta +15 -0
  24. package/.next/server/app/_global-error.rsc +14 -0
  25. package/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +5 -0
  26. package/.next/server/app/_global-error.segments/_full.segment.rsc +14 -0
  27. package/.next/server/app/_global-error.segments/_head.segment.rsc +5 -0
  28. package/.next/server/app/_global-error.segments/_index.segment.rsc +5 -0
  29. package/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -0
  30. package/.next/server/app/_not-found/page/app-paths-manifest.json +3 -0
  31. package/.next/server/app/_not-found/page/build-manifest.json +19 -0
  32. package/.next/server/app/_not-found/page/next-font-manifest.json +6 -0
  33. package/.next/server/app/_not-found/page/react-loadable-manifest.json +1 -0
  34. package/.next/server/app/_not-found/page/server-reference-manifest.json +4 -0
  35. package/.next/server/app/_not-found/page.js +13 -0
  36. package/.next/server/app/_not-found/page.js.map +5 -0
  37. package/.next/server/app/_not-found/page.js.nft.json +1 -0
  38. package/.next/server/app/_not-found/page_client-reference-manifest.js +3 -0
  39. package/.next/server/app/_not-found.html +1 -0
  40. package/.next/server/app/_not-found.meta +16 -0
  41. package/.next/server/app/_not-found.rsc +19 -0
  42. package/.next/server/app/_not-found.segments/_full.segment.rsc +19 -0
  43. package/.next/server/app/_not-found.segments/_head.segment.rsc +6 -0
  44. package/.next/server/app/_not-found.segments/_index.segment.rsc +8 -0
  45. package/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +6 -0
  46. package/.next/server/app/_not-found.segments/_not-found.segment.rsc +5 -0
  47. package/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -0
  48. package/.next/server/app/api/config/route/app-paths-manifest.json +3 -0
  49. package/.next/server/app/api/config/route/build-manifest.json +9 -0
  50. package/.next/server/app/api/config/route/server-reference-manifest.json +4 -0
  51. package/.next/server/app/api/config/route.js +8 -0
  52. package/.next/server/app/api/config/route.js.map +5 -0
  53. package/.next/server/app/api/config/route.js.nft.json +1 -0
  54. package/.next/server/app/api/config/route_client-reference-manifest.js +3 -0
  55. package/.next/server/app/api/digest/route/app-paths-manifest.json +3 -0
  56. package/.next/server/app/api/digest/route/build-manifest.json +9 -0
  57. package/.next/server/app/api/digest/route/server-reference-manifest.json +4 -0
  58. package/.next/server/app/api/digest/route.js +9 -0
  59. package/.next/server/app/api/digest/route.js.map +5 -0
  60. package/.next/server/app/api/digest/route.js.nft.json +1 -0
  61. package/.next/server/app/api/digest/route_client-reference-manifest.js +3 -0
  62. package/.next/server/app/api/runs/[runId]/events/route/app-paths-manifest.json +3 -0
  63. package/.next/server/app/api/runs/[runId]/events/route/build-manifest.json +9 -0
  64. package/.next/server/app/api/runs/[runId]/events/route/server-reference-manifest.json +4 -0
  65. package/.next/server/app/api/runs/[runId]/events/route.js +8 -0
  66. package/.next/server/app/api/runs/[runId]/events/route.js.map +5 -0
  67. package/.next/server/app/api/runs/[runId]/events/route.js.nft.json +1 -0
  68. package/.next/server/app/api/runs/[runId]/events/route_client-reference-manifest.js +3 -0
  69. package/.next/server/app/api/runs/[runId]/route/app-paths-manifest.json +3 -0
  70. package/.next/server/app/api/runs/[runId]/route/build-manifest.json +9 -0
  71. package/.next/server/app/api/runs/[runId]/route/server-reference-manifest.json +4 -0
  72. package/.next/server/app/api/runs/[runId]/route.js +9 -0
  73. package/.next/server/app/api/runs/[runId]/route.js.map +5 -0
  74. package/.next/server/app/api/runs/[runId]/route.js.nft.json +1 -0
  75. package/.next/server/app/api/runs/[runId]/route_client-reference-manifest.js +3 -0
  76. package/.next/server/app/api/runs/[runId]/tasks/[effectId]/route/app-paths-manifest.json +3 -0
  77. package/.next/server/app/api/runs/[runId]/tasks/[effectId]/route/build-manifest.json +9 -0
  78. package/.next/server/app/api/runs/[runId]/tasks/[effectId]/route/server-reference-manifest.json +4 -0
  79. package/.next/server/app/api/runs/[runId]/tasks/[effectId]/route.js +8 -0
  80. package/.next/server/app/api/runs/[runId]/tasks/[effectId]/route.js.map +5 -0
  81. package/.next/server/app/api/runs/[runId]/tasks/[effectId]/route.js.nft.json +1 -0
  82. package/.next/server/app/api/runs/[runId]/tasks/[effectId]/route_client-reference-manifest.js +3 -0
  83. package/.next/server/app/api/runs/route/app-paths-manifest.json +3 -0
  84. package/.next/server/app/api/runs/route/build-manifest.json +9 -0
  85. package/.next/server/app/api/runs/route/server-reference-manifest.json +4 -0
  86. package/.next/server/app/api/runs/route.js +9 -0
  87. package/.next/server/app/api/runs/route.js.map +5 -0
  88. package/.next/server/app/api/runs/route.js.nft.json +1 -0
  89. package/.next/server/app/api/runs/route_client-reference-manifest.js +3 -0
  90. package/.next/server/app/api/stream/route/app-paths-manifest.json +3 -0
  91. package/.next/server/app/api/stream/route/build-manifest.json +9 -0
  92. package/.next/server/app/api/stream/route/server-reference-manifest.json +4 -0
  93. package/.next/server/app/api/stream/route.js +8 -0
  94. package/.next/server/app/api/stream/route.js.map +5 -0
  95. package/.next/server/app/api/stream/route.js.nft.json +1 -0
  96. package/.next/server/app/api/stream/route_client-reference-manifest.js +3 -0
  97. package/.next/server/app/api/test/route/app-paths-manifest.json +3 -0
  98. package/.next/server/app/api/test/route/build-manifest.json +9 -0
  99. package/.next/server/app/api/test/route/server-reference-manifest.json +4 -0
  100. package/.next/server/app/api/test/route.js +6 -0
  101. package/.next/server/app/api/test/route.js.map +5 -0
  102. package/.next/server/app/api/test/route.js.nft.json +1 -0
  103. package/.next/server/app/api/test/route_client-reference-manifest.js +3 -0
  104. package/.next/server/app/api/version/route/app-paths-manifest.json +3 -0
  105. package/.next/server/app/api/version/route/build-manifest.json +9 -0
  106. package/.next/server/app/api/version/route/server-reference-manifest.json +4 -0
  107. package/.next/server/app/api/version/route.js +7 -0
  108. package/.next/server/app/api/version/route.js.map +5 -0
  109. package/.next/server/app/api/version/route.js.nft.json +1 -0
  110. package/.next/server/app/api/version/route_client-reference-manifest.js +3 -0
  111. package/.next/server/app/icon.svg/route/app-paths-manifest.json +3 -0
  112. package/.next/server/app/icon.svg/route/build-manifest.json +9 -0
  113. package/.next/server/app/icon.svg/route.js +7 -0
  114. package/.next/server/app/icon.svg/route.js.map +5 -0
  115. package/.next/server/app/icon.svg/route.js.nft.json +1 -0
  116. package/.next/server/app/icon.svg.body +20 -0
  117. package/.next/server/app/icon.svg.meta +1 -0
  118. package/.next/server/app/index.html +1 -0
  119. package/.next/server/app/index.meta +14 -0
  120. package/.next/server/app/index.rsc +21 -0
  121. package/.next/server/app/index.segments/__PAGE__.segment.rsc +9 -0
  122. package/.next/server/app/index.segments/_full.segment.rsc +21 -0
  123. package/.next/server/app/index.segments/_head.segment.rsc +6 -0
  124. package/.next/server/app/index.segments/_index.segment.rsc +8 -0
  125. package/.next/server/app/index.segments/_tree.segment.rsc +2 -0
  126. package/.next/server/app/page/app-paths-manifest.json +3 -0
  127. package/.next/server/app/page/build-manifest.json +19 -0
  128. package/.next/server/app/page/next-font-manifest.json +6 -0
  129. package/.next/server/app/page/react-loadable-manifest.json +1 -0
  130. package/.next/server/app/page/server-reference-manifest.json +17 -0
  131. package/.next/server/app/page.js +15 -0
  132. package/.next/server/app/page.js.map +5 -0
  133. package/.next/server/app/page.js.nft.json +1 -0
  134. package/.next/server/app/page_client-reference-manifest.js +3 -0
  135. package/.next/server/app/runs/[runId]/page/app-paths-manifest.json +3 -0
  136. package/.next/server/app/runs/[runId]/page/build-manifest.json +19 -0
  137. package/.next/server/app/runs/[runId]/page/next-font-manifest.json +6 -0
  138. package/.next/server/app/runs/[runId]/page/react-loadable-manifest.json +22 -0
  139. package/.next/server/app/runs/[runId]/page/server-reference-manifest.json +17 -0
  140. package/.next/server/app/runs/[runId]/page.js +15 -0
  141. package/.next/server/app/runs/[runId]/page.js.map +5 -0
  142. package/.next/server/app/runs/[runId]/page.js.nft.json +1 -0
  143. package/.next/server/app/runs/[runId]/page_client-reference-manifest.js +3 -0
  144. package/.next/server/app-paths-manifest.json +16 -0
  145. package/.next/server/chunks/01oi_server_app_api_runs_[runId]_tasks_[effectId]_route_actions_0r72yai.js +3 -0
  146. package/.next/server/chunks/01oi_server_app_api_runs_[runId]_tasks_[effectId]_route_actions_0r72yai.js.map +1 -0
  147. package/.next/server/chunks/0h.v__next-internal_server_app_api_runs_[runId]_events_route_actions_0~msldk.js +3 -0
  148. package/.next/server/chunks/0h.v__next-internal_server_app_api_runs_[runId]_events_route_actions_0~msldk.js.map +1 -0
  149. package/.next/server/chunks/0h.v__next-internal_server_app_api_runs_[runId]_route_actions_09iz0n6.js +3 -0
  150. package/.next/server/chunks/0h.v__next-internal_server_app_api_runs_[runId]_route_actions_09iz0n6.js.map +1 -0
  151. package/.next/server/chunks/0juq_observer-dashboard__next-internal_server_app_api_config_route_actions_0~eypoa.js +3 -0
  152. package/.next/server/chunks/0juq_observer-dashboard__next-internal_server_app_api_config_route_actions_0~eypoa.js.map +1 -0
  153. package/.next/server/chunks/0juq_observer-dashboard__next-internal_server_app_api_digest_route_actions_04jj5zs.js +3 -0
  154. package/.next/server/chunks/0juq_observer-dashboard__next-internal_server_app_api_digest_route_actions_04jj5zs.js.map +1 -0
  155. package/.next/server/chunks/0juq_observer-dashboard__next-internal_server_app_api_runs_route_actions_0~-t-o4.js +3 -0
  156. package/.next/server/chunks/0juq_observer-dashboard__next-internal_server_app_api_runs_route_actions_0~-t-o4.js.map +1 -0
  157. package/.next/server/chunks/0juq_observer-dashboard__next-internal_server_app_api_stream_route_actions_0fkmv2_.js +3 -0
  158. package/.next/server/chunks/0juq_observer-dashboard__next-internal_server_app_api_stream_route_actions_0fkmv2_.js.map +1 -0
  159. package/.next/server/chunks/0juq_observer-dashboard__next-internal_server_app_api_test_route_actions_00ugava.js +3 -0
  160. package/.next/server/chunks/0juq_observer-dashboard__next-internal_server_app_api_test_route_actions_00ugava.js.map +1 -0
  161. package/.next/server/chunks/0juq_observer-dashboard__next-internal_server_app_api_version_route_actions_0~v3ojm.js +3 -0
  162. package/.next/server/chunks/0juq_observer-dashboard__next-internal_server_app_api_version_route_actions_0~v3ojm.js.map +1 -0
  163. package/.next/server/chunks/0juq_observer-dashboard__next-internal_server_app_icon_svg_route_actions_0yypxkm.js +3 -0
  164. package/.next/server/chunks/0juq_observer-dashboard__next-internal_server_app_icon_svg_route_actions_0yypxkm.js.map +1 -0
  165. package/.next/server/chunks/[root-of-the-server]__0.6bt.6._.js +3 -0
  166. package/.next/server/chunks/[root-of-the-server]__0.6bt.6._.js.map +1 -0
  167. package/.next/server/chunks/[root-of-the-server]__08kwev1._.js +3 -0
  168. package/.next/server/chunks/[root-of-the-server]__08kwev1._.js.map +1 -0
  169. package/.next/server/chunks/[root-of-the-server]__096el.d._.js +3 -0
  170. package/.next/server/chunks/[root-of-the-server]__096el.d._.js.map +1 -0
  171. package/.next/server/chunks/[root-of-the-server]__0_bmt4z._.js +3 -0
  172. package/.next/server/chunks/[root-of-the-server]__0_bmt4z._.js.map +1 -0
  173. package/.next/server/chunks/[root-of-the-server]__0_ln2d2._.js +3 -0
  174. package/.next/server/chunks/[root-of-the-server]__0_ln2d2._.js.map +1 -0
  175. package/.next/server/chunks/[root-of-the-server]__0al3v65._.js +3 -0
  176. package/.next/server/chunks/[root-of-the-server]__0al3v65._.js.map +1 -0
  177. package/.next/server/chunks/[root-of-the-server]__0gf516b._.js +3 -0
  178. package/.next/server/chunks/[root-of-the-server]__0gf516b._.js.map +1 -0
  179. package/.next/server/chunks/[root-of-the-server]__0kdfw4x._.js +3 -0
  180. package/.next/server/chunks/[root-of-the-server]__0kdfw4x._.js.map +1 -0
  181. package/.next/server/chunks/[root-of-the-server]__0pxt00h._.js +3 -0
  182. package/.next/server/chunks/[root-of-the-server]__0pxt00h._.js.map +1 -0
  183. package/.next/server/chunks/[root-of-the-server]__0rubnza._.js +3 -0
  184. package/.next/server/chunks/[root-of-the-server]__0rubnza._.js.map +1 -0
  185. package/.next/server/chunks/[root-of-the-server]__0tn9iud._.js +3 -0
  186. package/.next/server/chunks/[root-of-the-server]__0tn9iud._.js.map +1 -0
  187. package/.next/server/chunks/[root-of-the-server]__0ws5o6i._.js +3 -0
  188. package/.next/server/chunks/[root-of-the-server]__0ws5o6i._.js.map +1 -0
  189. package/.next/server/chunks/[turbopack]_runtime.js +903 -0
  190. package/.next/server/chunks/[turbopack]_runtime.js.map +11 -0
  191. package/.next/server/chunks/node_modules_next_04~_e52._.js +13 -0
  192. package/.next/server/chunks/node_modules_next_04~_e52._.js.map +1 -0
  193. package/.next/server/chunks/node_modules_next_dist_esm_build_templates_app-route_0nyyph-.js +9 -0
  194. package/.next/server/chunks/node_modules_next_dist_esm_build_templates_app-route_0nyyph-.js.map +1 -0
  195. package/.next/server/chunks/packages_observer-dashboard_src_lib_02.vvb.._.js +3 -0
  196. package/.next/server/chunks/packages_observer-dashboard_src_lib_02.vvb.._.js.map +1 -0
  197. package/.next/server/chunks/packages_observer-dashboard_src_lib_0rqgpk0._.js +3 -0
  198. package/.next/server/chunks/packages_observer-dashboard_src_lib_0rqgpk0._.js.map +1 -0
  199. package/.next/server/chunks/ssr/0juq_observer-dashboard__next-internal_server_app__global-error_page_actions_0ekoxmy.js +3 -0
  200. package/.next/server/chunks/ssr/0juq_observer-dashboard__next-internal_server_app__global-error_page_actions_0ekoxmy.js.map +1 -0
  201. package/.next/server/chunks/ssr/0juq_observer-dashboard__next-internal_server_app__not-found_page_actions_09b3ti3.js +3 -0
  202. package/.next/server/chunks/ssr/0juq_observer-dashboard__next-internal_server_app__not-found_page_actions_09b3ti3.js.map +1 -0
  203. package/.next/server/chunks/ssr/[root-of-the-server]__006f7~t._.js +4 -0
  204. package/.next/server/chunks/ssr/[root-of-the-server]__006f7~t._.js.map +1 -0
  205. package/.next/server/chunks/ssr/[root-of-the-server]__02jgvbi._.js +3 -0
  206. package/.next/server/chunks/ssr/[root-of-the-server]__02jgvbi._.js.map +1 -0
  207. package/.next/server/chunks/ssr/[root-of-the-server]__04j8t~1._.js +3 -0
  208. package/.next/server/chunks/ssr/[root-of-the-server]__04j8t~1._.js.map +1 -0
  209. package/.next/server/chunks/ssr/[root-of-the-server]__09c~s.0._.js +33 -0
  210. package/.next/server/chunks/ssr/[root-of-the-server]__09c~s.0._.js.map +1 -0
  211. package/.next/server/chunks/ssr/[root-of-the-server]__0cpy61n._.js +3 -0
  212. package/.next/server/chunks/ssr/[root-of-the-server]__0cpy61n._.js.map +1 -0
  213. package/.next/server/chunks/ssr/[root-of-the-server]__0cwa32j._.js +3 -0
  214. package/.next/server/chunks/ssr/[root-of-the-server]__0cwa32j._.js.map +1 -0
  215. package/.next/server/chunks/ssr/[root-of-the-server]__0fk_g0j._.js +19 -0
  216. package/.next/server/chunks/ssr/[root-of-the-server]__0fk_g0j._.js.map +1 -0
  217. package/.next/server/chunks/ssr/[root-of-the-server]__0pddpic._.js +3 -0
  218. package/.next/server/chunks/ssr/[root-of-the-server]__0pddpic._.js.map +1 -0
  219. package/.next/server/chunks/ssr/[root-of-the-server]__0pvtneq._.js +3 -0
  220. package/.next/server/chunks/ssr/[root-of-the-server]__0pvtneq._.js.map +1 -0
  221. package/.next/server/chunks/ssr/[root-of-the-server]__0xc-2vm._.js +3 -0
  222. package/.next/server/chunks/ssr/[root-of-the-server]__0xc-2vm._.js.map +1 -0
  223. package/.next/server/chunks/ssr/[root-of-the-server]__10xgshr._.js +33 -0
  224. package/.next/server/chunks/ssr/[root-of-the-server]__10xgshr._.js.map +1 -0
  225. package/.next/server/chunks/ssr/[turbopack]_runtime.js +903 -0
  226. package/.next/server/chunks/ssr/[turbopack]_runtime.js.map +11 -0
  227. package/.next/server/chunks/ssr/_00yo1im._.js +3 -0
  228. package/.next/server/chunks/ssr/_00yo1im._.js.map +1 -0
  229. package/.next/server/chunks/ssr/_03sbc.o._.js +3 -0
  230. package/.next/server/chunks/ssr/_03sbc.o._.js.map +1 -0
  231. package/.next/server/chunks/ssr/_04z5ea0._.js +3 -0
  232. package/.next/server/chunks/ssr/_04z5ea0._.js.map +1 -0
  233. package/.next/server/chunks/ssr/_0gmb3g_._.js +3 -0
  234. package/.next/server/chunks/ssr/_0gmb3g_._.js.map +1 -0
  235. package/.next/server/chunks/ssr/_0okz9j8._.js +6 -0
  236. package/.next/server/chunks/ssr/_0okz9j8._.js.map +1 -0
  237. package/.next/server/chunks/ssr/_0wrbwro._.js +6 -0
  238. package/.next/server/chunks/ssr/_0wrbwro._.js.map +1 -0
  239. package/.next/server/chunks/ssr/node_modules_09w7yel._.js +33 -0
  240. package/.next/server/chunks/ssr/node_modules_09w7yel._.js.map +1 -0
  241. package/.next/server/chunks/ssr/node_modules_next_dist_0avqw4q._.js +3 -0
  242. package/.next/server/chunks/ssr/node_modules_next_dist_0avqw4q._.js.map +1 -0
  243. package/.next/server/chunks/ssr/node_modules_next_dist_0h9llsw._.js +6 -0
  244. package/.next/server/chunks/ssr/node_modules_next_dist_0h9llsw._.js.map +1 -0
  245. package/.next/server/chunks/ssr/node_modules_next_dist_0i_._k3._.js +3 -0
  246. package/.next/server/chunks/ssr/node_modules_next_dist_0i_._k3._.js.map +1 -0
  247. package/.next/server/chunks/ssr/node_modules_next_dist_client_components_0ee1czk._.js +3 -0
  248. package/.next/server/chunks/ssr/node_modules_next_dist_client_components_0ee1czk._.js.map +1 -0
  249. package/.next/server/chunks/ssr/node_modules_next_dist_client_components_builtin_global-error_0lgvd_..js +3 -0
  250. package/.next/server/chunks/ssr/node_modules_next_dist_client_components_builtin_global-error_0lgvd_..js.map +1 -0
  251. package/.next/server/chunks/ssr/node_modules_next_dist_client_components_builtin_unauthorized_0cjv-23.js +3 -0
  252. package/.next/server/chunks/ssr/node_modules_next_dist_client_components_builtin_unauthorized_0cjv-23.js.map +1 -0
  253. package/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_0amzg6z.js +4 -0
  254. package/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_0amzg6z.js.map +1 -0
  255. package/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_0dw1x0d.js +4 -0
  256. package/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_0dw1x0d.js.map +1 -0
  257. package/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_0rc3ul_.js +4 -0
  258. package/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_0rc3ul_.js.map +1 -0
  259. package/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_10iomok.js +4 -0
  260. package/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_10iomok.js.map +1 -0
  261. package/.next/server/chunks/ssr/packages_observer-dashboard_0~a2tmu._.js +3 -0
  262. package/.next/server/chunks/ssr/packages_observer-dashboard_0~a2tmu._.js.map +1 -0
  263. package/.next/server/chunks/ssr/packages_observer-dashboard_src_0f.ozc-._.js +3 -0
  264. package/.next/server/chunks/ssr/packages_observer-dashboard_src_0f.ozc-._.js.map +1 -0
  265. package/.next/server/chunks/ssr/packages_observer-dashboard_src_components_providers_tsx_03_vrrn._.js +7 -0
  266. package/.next/server/chunks/ssr/packages_observer-dashboard_src_components_providers_tsx_03_vrrn._.js.map +1 -0
  267. package/.next/server/functions-config-manifest.json +4 -0
  268. package/.next/server/interception-route-rewrite-manifest.js +1 -0
  269. package/.next/server/middleware-build-manifest.js +23 -0
  270. package/.next/server/middleware-manifest.json +6 -0
  271. package/.next/server/next-font-manifest.js +1 -0
  272. package/.next/server/next-font-manifest.json +6 -0
  273. package/.next/server/pages/404.html +1 -0
  274. package/.next/server/pages/500.html +1 -0
  275. package/.next/server/pages-manifest.json +4 -0
  276. package/.next/server/prefetch-hints.json +1 -0
  277. package/.next/server/server-reference-manifest.js +1 -0
  278. package/.next/server/server-reference-manifest.json +24 -0
  279. package/.next/static/MvfPly4ZXHqaveDVOG1qq/_buildManifest.js +11 -0
  280. package/.next/static/MvfPly4ZXHqaveDVOG1qq/_clientMiddlewareManifest.js +1 -0
  281. package/.next/static/MvfPly4ZXHqaveDVOG1qq/_ssgManifest.js +1 -0
  282. package/.next/static/chunks/00c87uqn~kk2z.js +1 -0
  283. package/.next/static/chunks/01xlw8hd842-c.js +1 -0
  284. package/.next/static/chunks/02p9dpa.0oxiz.js +1 -0
  285. package/.next/static/chunks/034i63v_muq~d.js +1 -0
  286. package/.next/static/chunks/03mo-6~4pxdio.js +1 -0
  287. package/.next/static/chunks/03~yq9q893hmn.js +1 -0
  288. package/.next/static/chunks/04dm5qn77.fc2.js +1 -0
  289. package/.next/static/chunks/07uz2g0_38qia.js +4 -0
  290. package/.next/static/chunks/08nqnwvixoxnk.js +2 -0
  291. package/.next/static/chunks/0d3shmwh5_nmn.js +1 -0
  292. package/.next/static/chunks/0e_wyjw3nx.a..js +1 -0
  293. package/.next/static/chunks/0mstyq17cbf8-.js +1 -0
  294. package/.next/static/chunks/0ntuxw9.how-q.js +1 -0
  295. package/.next/static/chunks/0t3uzajv1qzmo.js +1 -0
  296. package/.next/static/chunks/0u~_nwr5-v.xp.js +1 -0
  297. package/.next/static/chunks/0wxcxh6eyzams.js +1 -0
  298. package/.next/static/chunks/0x6y7yt4kiddp.css +1 -0
  299. package/.next/static/chunks/0z6-vonyxr0dn.js +4 -0
  300. package/.next/static/chunks/0ze4gu236oq96.js +31 -0
  301. package/.next/static/chunks/0zwozael9msy1.js +1 -0
  302. package/.next/static/chunks/10qd__0r7a~.l.js +1 -0
  303. package/.next/static/chunks/11jh_u1ynmatg.js +1 -0
  304. package/.next/static/chunks/13xer3cb9shu-.js +5 -0
  305. package/.next/static/chunks/142zlnch_xmgd.js +1 -0
  306. package/.next/static/chunks/144kcri75qczu.js +1 -0
  307. package/.next/static/chunks/turbopack-0-ww6fe7b37qt.js +1 -0
  308. package/.next/static/media/icon.08ljfy7xai2x_.svg +20 -0
  309. package/LICENSE +21 -0
  310. package/README.md +490 -0
  311. package/next.config.mjs +25 -0
  312. package/package.json +104 -0
  313. package/postcss.config.mjs +8 -0
  314. package/src/app/actions/__tests__/approve-breakpoint.test.ts +246 -0
  315. package/src/app/actions/approve-breakpoint.ts +145 -0
  316. package/src/app/api/config/route.ts +137 -0
  317. package/src/app/api/digest/route.ts +45 -0
  318. package/src/app/api/runs/[runId]/events/route.ts +56 -0
  319. package/src/app/api/runs/[runId]/route.ts +84 -0
  320. package/src/app/api/runs/[runId]/tasks/[effectId]/route.ts +44 -0
  321. package/src/app/api/runs/route.ts +48 -0
  322. package/src/app/api/stream/route.ts +136 -0
  323. package/src/app/api/test/route.ts +1 -0
  324. package/src/app/api/version/route.ts +57 -0
  325. package/src/app/globals.css +555 -0
  326. package/src/app/icon.svg +20 -0
  327. package/src/app/layout.tsx +39 -0
  328. package/src/app/not-found.tsx +16 -0
  329. package/src/app/page.tsx +120 -0
  330. package/src/app/runs/[runId]/page.tsx +279 -0
  331. package/src/cli.ts +271 -0
  332. package/src/components/breakpoint/__tests__/breakpoint-approval.test.tsx +212 -0
  333. package/src/components/breakpoint/__tests__/breakpoint-panel.test.tsx +130 -0
  334. package/src/components/breakpoint/__tests__/file-preview.test.tsx +313 -0
  335. package/src/components/breakpoint/breakpoint-approval.tsx +138 -0
  336. package/src/components/breakpoint/breakpoint-panel.tsx +95 -0
  337. package/src/components/breakpoint/file-preview.tsx +215 -0
  338. package/src/components/dashboard/.gitkeep +0 -0
  339. package/src/components/dashboard/__tests__/breakpoint-banner.test.tsx +177 -0
  340. package/src/components/dashboard/__tests__/catch-up-banner.test.tsx +141 -0
  341. package/src/components/dashboard/__tests__/executive-summary-banner.test.tsx +164 -0
  342. package/src/components/dashboard/__tests__/kpi-grid.test.tsx +101 -0
  343. package/src/components/dashboard/__tests__/pagination-controls.test.tsx +125 -0
  344. package/src/components/dashboard/__tests__/project-accordion.test.tsx +97 -0
  345. package/src/components/dashboard/__tests__/project-list-view.test.tsx +174 -0
  346. package/src/components/dashboard/__tests__/project-search-input.test.tsx +110 -0
  347. package/src/components/dashboard/__tests__/project-section-header.test.tsx +91 -0
  348. package/src/components/dashboard/__tests__/project-section.test.tsx +151 -0
  349. package/src/components/dashboard/__tests__/run-card.test.tsx +164 -0
  350. package/src/components/dashboard/__tests__/run-filter-bar.test.tsx +109 -0
  351. package/src/components/dashboard/__tests__/run-list.test.tsx +123 -0
  352. package/src/components/dashboard/__tests__/search-filter.test.tsx +150 -0
  353. package/src/components/dashboard/__tests__/virtualized-run-list.test.tsx +179 -0
  354. package/src/components/dashboard/breakpoint-banner.tsx +301 -0
  355. package/src/components/dashboard/catch-up-banner.tsx +88 -0
  356. package/src/components/dashboard/executive-summary-banner.tsx +174 -0
  357. package/src/components/dashboard/global-search.tsx +323 -0
  358. package/src/components/dashboard/kpi-grid.tsx +140 -0
  359. package/src/components/dashboard/pagination-controls.tsx +100 -0
  360. package/src/components/dashboard/project-accordion.tsx +72 -0
  361. package/src/components/dashboard/project-health-card.tsx +536 -0
  362. package/src/components/dashboard/project-list-view.tsx +246 -0
  363. package/src/components/dashboard/project-search-input.tsx +41 -0
  364. package/src/components/dashboard/project-section-header.tsx +73 -0
  365. package/src/components/dashboard/project-section.tsx +89 -0
  366. package/src/components/dashboard/run-card.tsx +218 -0
  367. package/src/components/dashboard/run-filter-bar.tsx +100 -0
  368. package/src/components/dashboard/run-list.tsx +77 -0
  369. package/src/components/dashboard/search-filter.tsx +69 -0
  370. package/src/components/dashboard/virtualized-run-list.tsx +130 -0
  371. package/src/components/details/.gitkeep +0 -0
  372. package/src/components/details/__tests__/agent-panel.test.tsx +236 -0
  373. package/src/components/details/__tests__/json-tree.test.tsx +347 -0
  374. package/src/components/details/__tests__/log-viewer.test.tsx +168 -0
  375. package/src/components/details/__tests__/task-detail.test.tsx +212 -0
  376. package/src/components/details/__tests__/timing-panel.test.tsx +271 -0
  377. package/src/components/details/agent-panel.tsx +234 -0
  378. package/src/components/details/json-tree/categorize.ts +131 -0
  379. package/src/components/details/json-tree/index.tsx +120 -0
  380. package/src/components/details/json-tree/json-node.tsx +223 -0
  381. package/src/components/details/json-tree/smart-summary.tsx +596 -0
  382. package/src/components/details/json-tree/tree-controls.tsx +47 -0
  383. package/src/components/details/json-tree.tsx +9 -0
  384. package/src/components/details/log-viewer.tsx +140 -0
  385. package/src/components/details/task-detail.tsx +114 -0
  386. package/src/components/details/timing-panel.tsx +247 -0
  387. package/src/components/events/.gitkeep +0 -0
  388. package/src/components/events/__tests__/event-item.test.tsx +211 -0
  389. package/src/components/events/__tests__/event-stream.test.tsx +225 -0
  390. package/src/components/events/event-item.tsx +121 -0
  391. package/src/components/events/event-stream.tsx +260 -0
  392. package/src/components/notifications/.gitkeep +0 -0
  393. package/src/components/notifications/__tests__/notification-panel.test.tsx +287 -0
  394. package/src/components/notifications/__tests__/notification-provider.test.tsx +585 -0
  395. package/src/components/notifications/__tests__/toast-stack.test.tsx +217 -0
  396. package/src/components/notifications/notification-panel.tsx +124 -0
  397. package/src/components/notifications/notification-provider.tsx +175 -0
  398. package/src/components/notifications/toast-stack.tsx +75 -0
  399. package/src/components/pipeline/.gitkeep +0 -0
  400. package/src/components/pipeline/__tests__/parallel-group.test.tsx +88 -0
  401. package/src/components/pipeline/__tests__/pipeline-view.test.tsx +345 -0
  402. package/src/components/pipeline/__tests__/step-card.test.tsx +330 -0
  403. package/src/components/pipeline/parallel-group.tsx +39 -0
  404. package/src/components/pipeline/pipeline-view.tsx +197 -0
  405. package/src/components/pipeline/step-card.tsx +166 -0
  406. package/src/components/providers/event-stream-provider.tsx +29 -0
  407. package/src/components/providers.tsx +24 -0
  408. package/src/components/shared/.gitkeep +0 -0
  409. package/src/components/shared/__tests__/empty-state.test.tsx +49 -0
  410. package/src/components/shared/__tests__/friendly-id.test.tsx +47 -0
  411. package/src/components/shared/__tests__/kbd.test.tsx +45 -0
  412. package/src/components/shared/__tests__/kind-badge.test.tsx +71 -0
  413. package/src/components/shared/__tests__/metrics-row.test.tsx +74 -0
  414. package/src/components/shared/__tests__/outcome-banner.test.tsx +71 -0
  415. package/src/components/shared/__tests__/progress-bar.test.tsx +89 -0
  416. package/src/components/shared/__tests__/session-pill.test.tsx +62 -0
  417. package/src/components/shared/__tests__/settings-modal.test.tsx +201 -0
  418. package/src/components/shared/__tests__/shortcuts-help.test.tsx +103 -0
  419. package/src/components/shared/__tests__/status-badge.test.tsx +98 -0
  420. package/src/components/shared/__tests__/theme-provider.test.tsx +100 -0
  421. package/src/components/shared/__tests__/truncated-id.test.tsx +53 -0
  422. package/src/components/shared/app-footer.tsx +80 -0
  423. package/src/components/shared/app-header.tsx +160 -0
  424. package/src/components/shared/empty-state.tsx +18 -0
  425. package/src/components/shared/error-boundary.tsx +81 -0
  426. package/src/components/shared/friendly-id.tsx +48 -0
  427. package/src/components/shared/kbd.tsx +15 -0
  428. package/src/components/shared/kind-badge.tsx +51 -0
  429. package/src/components/shared/metrics-row.tsx +106 -0
  430. package/src/components/shared/outcome-banner.tsx +56 -0
  431. package/src/components/shared/progress-bar.tsx +42 -0
  432. package/src/components/shared/session-pill.tsx +69 -0
  433. package/src/components/shared/settings-modal.tsx +509 -0
  434. package/src/components/shared/shortcuts-help.tsx +113 -0
  435. package/src/components/shared/status-badge.tsx +110 -0
  436. package/src/components/shared/theme-provider.tsx +46 -0
  437. package/src/components/shared/truncated-id.tsx +51 -0
  438. package/src/components/ui/.gitkeep +0 -0
  439. package/src/components/ui/__tests__/accordion.test.tsx +96 -0
  440. package/src/components/ui/__tests__/badge.test.tsx +69 -0
  441. package/src/components/ui/__tests__/button.test.tsx +113 -0
  442. package/src/components/ui/__tests__/tabs.test.tsx +75 -0
  443. package/src/components/ui/__tests__/tooltip.test.tsx +90 -0
  444. package/src/components/ui/accordion.tsx +61 -0
  445. package/src/components/ui/badge.tsx +25 -0
  446. package/src/components/ui/button.tsx +40 -0
  447. package/src/components/ui/card.tsx +21 -0
  448. package/src/components/ui/scroll-area.tsx +35 -0
  449. package/src/components/ui/separator.tsx +24 -0
  450. package/src/components/ui/tabs.tsx +64 -0
  451. package/src/components/ui/tooltip.tsx +37 -0
  452. package/src/hooks/.gitkeep +0 -0
  453. package/src/hooks/__tests__/use-animated-number.test.ts +184 -0
  454. package/src/hooks/__tests__/use-batched-updates.test.ts +315 -0
  455. package/src/hooks/__tests__/use-event-stream.test.ts +243 -0
  456. package/src/hooks/__tests__/use-keyboard.test.ts +217 -0
  457. package/src/hooks/__tests__/use-notifications.test.ts +230 -0
  458. package/src/hooks/__tests__/use-polling.test.ts +274 -0
  459. package/src/hooks/__tests__/use-project-runs.test.ts +163 -0
  460. package/src/hooks/__tests__/use-projects.test.ts +248 -0
  461. package/src/hooks/__tests__/use-run-dashboard.test.ts +168 -0
  462. package/src/hooks/__tests__/use-run-detail.test.ts +273 -0
  463. package/src/hooks/__tests__/use-smart-polling.test.ts +305 -0
  464. package/src/hooks/use-animated-number.ts +87 -0
  465. package/src/hooks/use-batched-updates.ts +150 -0
  466. package/src/hooks/use-event-stream.ts +150 -0
  467. package/src/hooks/use-keyboard.ts +45 -0
  468. package/src/hooks/use-notifications.ts +82 -0
  469. package/src/hooks/use-persisted-state.ts +60 -0
  470. package/src/hooks/use-polling.ts +60 -0
  471. package/src/hooks/use-project-runs.ts +51 -0
  472. package/src/hooks/use-projects.ts +26 -0
  473. package/src/hooks/use-run-dashboard.ts +207 -0
  474. package/src/hooks/use-run-detail.ts +77 -0
  475. package/src/hooks/use-smart-polling.ts +144 -0
  476. package/src/lib/.gitkeep +0 -0
  477. package/src/lib/__tests__/cn.test.ts +69 -0
  478. package/src/lib/__tests__/config-loader.test.ts +210 -0
  479. package/src/lib/__tests__/config.test.ts +561 -0
  480. package/src/lib/__tests__/error-handler.test.ts +143 -0
  481. package/src/lib/__tests__/fetcher.test.ts +517 -0
  482. package/src/lib/__tests__/global-registry.test.ts +214 -0
  483. package/src/lib/__tests__/parser.test.ts +1532 -0
  484. package/src/lib/__tests__/path-resolver.test.ts +112 -0
  485. package/src/lib/__tests__/run-cache.test.ts +591 -0
  486. package/src/lib/__tests__/server-init.test.ts +512 -0
  487. package/src/lib/__tests__/source-discovery.test.ts +246 -0
  488. package/src/lib/__tests__/utils.test.ts +160 -0
  489. package/src/lib/__tests__/watcher.test.ts +227 -0
  490. package/src/lib/cn.ts +6 -0
  491. package/src/lib/config-loader.ts +195 -0
  492. package/src/lib/config.ts +20 -0
  493. package/src/lib/error-handler.ts +76 -0
  494. package/src/lib/fetcher.ts +394 -0
  495. package/src/lib/global-registry.ts +117 -0
  496. package/src/lib/parser.ts +794 -0
  497. package/src/lib/path-resolver.ts +16 -0
  498. package/src/lib/run-cache.ts +404 -0
  499. package/src/lib/server-init.ts +226 -0
  500. package/src/lib/services/__tests__/run-query-service.test.ts +819 -0
  501. package/src/lib/services/run-query-service.ts +286 -0
  502. package/src/lib/source-discovery.ts +216 -0
  503. package/src/lib/utils.ts +103 -0
  504. package/src/lib/watcher.ts +265 -0
  505. package/src/test/fixtures.ts +269 -0
  506. package/src/test/mocks/handlers.ts +110 -0
  507. package/src/test/mocks/server.ts +17 -0
  508. package/src/test/setup.ts +200 -0
  509. package/src/test/test-utils.tsx +36 -0
  510. package/src/types/.gitkeep +0 -0
  511. package/src/types/breakpoint.ts +17 -0
  512. package/src/types/index.ts +214 -0
  513. package/tsconfig.json +50 -0
@@ -0,0 +1,140 @@
1
+ "use client";
2
+
3
+ import { useState, useCallback } from "react";
4
+ import { Copy, Check, Terminal, AlertTriangle, Info, ChevronDown } from "lucide-react";
5
+ import { ScrollArea } from "@/components/ui/scroll-area";
6
+ import type { TaskDetail } from "@/types";
7
+
8
+ const LINE_LIMIT = 100;
9
+
10
+ /** Adds line numbers to a text block with optional line limit */
11
+ function NumberedPre({ text, colorClass, limit }: { text: string; colorClass: string; limit?: number }) {
12
+ const allLines = text.split("\n");
13
+ const [showAll, setShowAll] = useState(false);
14
+ const isLong = limit != null && allLines.length > limit;
15
+ const lines = isLong && !showAll ? allLines.slice(0, limit) : allLines;
16
+
17
+ return (
18
+ <>
19
+ <pre className="rounded-b-md bg-background p-0 text-xs font-mono whitespace-pre-wrap overflow-x-auto">
20
+ {lines.map((line, i) => (
21
+ <div key={i} className="flex hover:bg-background-secondary/50 transition-colors">
22
+ <span className="select-none text-foreground-muted/40 text-right w-8 flex-shrink-0 pr-2 py-px border-r border-border/30">
23
+ {i + 1}
24
+ </span>
25
+ <span className={`${colorClass} pl-2 py-px flex-1 break-all`}>{line}</span>
26
+ </div>
27
+ ))}
28
+ </pre>
29
+ {isLong && !showAll && (
30
+ <button
31
+ onClick={() => setShowAll(true)}
32
+ className="w-full flex items-center justify-center gap-1.5 py-1.5 text-xs leading-tight text-foreground-muted hover:text-primary bg-background-secondary/30 hover:bg-background-secondary hover:shadow-neon-glow-primary-xs transition-all border-t border-border/30"
33
+ >
34
+ <ChevronDown className="h-3 w-3" />
35
+ Show all {allLines.length} lines
36
+ </button>
37
+ )}
38
+ </>
39
+ );
40
+ }
41
+
42
+ /** Copy button for log sections */
43
+ function LogCopyButton({ text }: { text: string }) {
44
+ const [copied, setCopied] = useState(false);
45
+ const handleCopy = useCallback(() => {
46
+ navigator.clipboard.writeText(text).then(() => {
47
+ setCopied(true);
48
+ setTimeout(() => setCopied(false), 1500);
49
+ });
50
+ }, [text]);
51
+
52
+ return (
53
+ <button
54
+ type="button"
55
+ onClick={handleCopy}
56
+ className="inline-flex items-center gap-1 text-xs leading-tight text-foreground-muted hover:text-primary hover:shadow-glow-primary transition-all px-1.5 py-0.5 rounded hover:bg-primary-muted"
57
+ title="Copy all"
58
+ >
59
+ {copied ? <Check className="h-3 w-3 text-success" /> : <Copy className="h-3 w-3" />}
60
+ {copied ? "Copied" : "Copy"}
61
+ </button>
62
+ );
63
+ }
64
+
65
+ /** Section header bar for each log type */
66
+ function LogSectionHeader({ label, colorClass, icon, text }: { label: string; colorClass: string; icon: React.ReactNode; text: string }) {
67
+ return (
68
+ <div className="flex items-center justify-between rounded-t-md bg-background-secondary/60 border-b border-border/50 px-3 py-1.5">
69
+ <div className="flex items-center gap-1.5">
70
+ {icon}
71
+ <span className={`text-xs font-medium tracking-wider ${colorClass}`}>{label}</span>
72
+ </div>
73
+ <LogCopyButton text={text} />
74
+ </div>
75
+ );
76
+ }
77
+
78
+ export function LogViewer({ task }: { task: TaskDetail | null }) {
79
+ if (!task) return <div className="p-4 text-sm text-foreground-muted">Select a task to view logs</div>;
80
+
81
+ const hasProcessLogs = task.stdout || task.stderr;
82
+
83
+ // For agent/skill tasks without process logs, show the result summary as output
84
+ const agentOutput = !hasProcessLogs && task.result
85
+ ? JSON.stringify(task.result.result ?? task.result.value ?? task.result, null, 2)
86
+ : undefined;
87
+
88
+ const hasAnyOutput = hasProcessLogs || agentOutput;
89
+
90
+ if (!hasAnyOutput) {
91
+ const hint = (task.kind === "agent" || task.kind === "skill")
92
+ ? "Agent tasks don't produce stdout/stderr. Results will appear here once the task completes."
93
+ : "No logs captured for this task.";
94
+ return <div className="p-4 text-sm text-foreground-muted">{hint}</div>;
95
+ }
96
+
97
+ return (
98
+ <div className="space-y-4 p-4">
99
+ {task.stdout && (
100
+ <div className="rounded-md border border-border/50 overflow-hidden">
101
+ <LogSectionHeader
102
+ label="stdout"
103
+ colorClass="text-success"
104
+ icon={<Terminal className="h-3 w-3 text-success" />}
105
+ text={task.stdout}
106
+ />
107
+ <ScrollArea className="max-h-[60vh]">
108
+ <NumberedPre text={task.stdout} colorClass="text-success" limit={LINE_LIMIT} />
109
+ </ScrollArea>
110
+ </div>
111
+ )}
112
+ {task.stderr && (
113
+ <div className="rounded-md border border-error/20 overflow-hidden">
114
+ <LogSectionHeader
115
+ label="stderr"
116
+ colorClass="text-error"
117
+ icon={<AlertTriangle className="h-3 w-3 text-error" />}
118
+ text={task.stderr}
119
+ />
120
+ <ScrollArea className="max-h-[60vh]">
121
+ <NumberedPre text={task.stderr} colorClass="text-error" limit={LINE_LIMIT} />
122
+ </ScrollArea>
123
+ </div>
124
+ )}
125
+ {agentOutput && (
126
+ <div className="rounded-md border border-secondary/20 overflow-hidden">
127
+ <LogSectionHeader
128
+ label="output"
129
+ colorClass="text-secondary"
130
+ icon={<Info className="h-3 w-3 text-secondary" />}
131
+ text={agentOutput}
132
+ />
133
+ <ScrollArea className="max-h-[60vh]">
134
+ <NumberedPre text={agentOutput} colorClass="text-secondary" limit={LINE_LIMIT} />
135
+ </ScrollArea>
136
+ </div>
137
+ )}
138
+ </div>
139
+ );
140
+ }
@@ -0,0 +1,114 @@
1
+ "use client";
2
+ import dynamic from "next/dynamic";
3
+ import { Tabs, TabsList, TabsTrigger, TabsContent } from "@/components/ui/tabs";
4
+ import { useTaskDetail } from "@/hooks/use-run-detail";
5
+ import { Loader2, Hand } from "lucide-react";
6
+ import { Kbd } from "@/components/shared/kbd";
7
+
8
+ /* -------------------------------------------------------------------------- */
9
+ /* Loading skeletons for lazy-loaded tab panels */
10
+ /* -------------------------------------------------------------------------- */
11
+
12
+ function PanelSkeleton() {
13
+ return (
14
+ <div className="p-4 space-y-3 animate-pulse">
15
+ <div className="h-4 w-48 rounded bg-foreground-muted/10" />
16
+ <div className="h-3 w-full rounded bg-foreground-muted/10" />
17
+ <div className="h-3 w-3/4 rounded bg-foreground-muted/10" />
18
+ <div className="h-3 w-1/2 rounded bg-foreground-muted/10" />
19
+ </div>
20
+ );
21
+ }
22
+
23
+ /* -------------------------------------------------------------------------- */
24
+ /* Lazy-loaded heavy components (code-split per tab) */
25
+ /* -------------------------------------------------------------------------- */
26
+
27
+ const AgentPanel = dynamic(
28
+ () => import("./agent-panel").then((mod) => ({ default: mod.AgentPanel })),
29
+ { ssr: false, loading: PanelSkeleton }
30
+ );
31
+
32
+ const TimingPanel = dynamic(
33
+ () => import("./timing-panel").then((mod) => ({ default: mod.TimingPanel })),
34
+ { ssr: false, loading: PanelSkeleton }
35
+ );
36
+
37
+ const LogViewer = dynamic(
38
+ () => import("./log-viewer").then((mod) => ({ default: mod.LogViewer })),
39
+ { ssr: false, loading: PanelSkeleton }
40
+ );
41
+
42
+ const JsonTree = dynamic(
43
+ () => import("./json-tree").then((mod) => ({ default: mod.JsonTree })),
44
+ { ssr: false, loading: PanelSkeleton }
45
+ );
46
+
47
+ const BreakpointPanel = dynamic(
48
+ () => import("@/components/breakpoint/breakpoint-panel").then((mod) => ({ default: mod.BreakpointPanel })),
49
+ { ssr: false, loading: PanelSkeleton }
50
+ );
51
+
52
+ interface TaskDetailPanelProps {
53
+ runId: string;
54
+ effectId: string | null;
55
+ activeTab?: string;
56
+ onTabChange?: (tab: string) => void;
57
+ runDuration?: number;
58
+ allTasks?: import("@/types").TaskEffect[];
59
+ }
60
+
61
+ export function TaskDetailPanel({ runId, effectId, activeTab, onTabChange, runDuration, allTasks }: TaskDetailPanelProps) {
62
+ const { task, loading } = useTaskDetail(runId, effectId);
63
+
64
+ if (!effectId) {
65
+ return (
66
+ <div className="flex items-center justify-center h-full text-sm text-foreground-muted">
67
+ Click a task to view details
68
+ </div>
69
+ );
70
+ }
71
+
72
+ if (loading && !task) {
73
+ return (
74
+ <div className="flex items-center justify-center h-full">
75
+ <Loader2 className="h-5 w-5 animate-spin text-foreground-muted" />
76
+ </div>
77
+ );
78
+ }
79
+
80
+ const isBreakpoint = task?.kind === "breakpoint";
81
+ const defaultTab = isBreakpoint ? "breakpoint" : "agent";
82
+
83
+ return (
84
+ <Tabs data-testid="task-detail-tabs" value={activeTab} onValueChange={onTabChange} defaultValue={defaultTab} className="h-full flex flex-col">
85
+ <TabsList className="shrink-0 mx-4 mt-3">
86
+ {isBreakpoint && (
87
+ <TabsTrigger value="breakpoint" className="gap-1.5">
88
+ <Hand className="h-3 w-3" />
89
+ Approval
90
+ <Kbd className="ml-0.5 opacity-50">5</Kbd>
91
+ </TabsTrigger>
92
+ )}
93
+ <TabsTrigger value="agent" className="gap-1.5">Agent <Kbd className="ml-0.5 opacity-50">1</Kbd></TabsTrigger>
94
+ <TabsTrigger value="timing" className="gap-1.5">Timing <Kbd className="ml-0.5 opacity-50">2</Kbd></TabsTrigger>
95
+ <TabsTrigger value="logs" className="gap-1.5">Logs <Kbd className="ml-0.5 opacity-50">3</Kbd></TabsTrigger>
96
+ <TabsTrigger value="data" className="gap-1.5">Data <Kbd className="ml-0.5 opacity-50">4</Kbd></TabsTrigger>
97
+ </TabsList>
98
+ <div className="flex-1 overflow-y-auto">
99
+ {isBreakpoint && task && (
100
+ <TabsContent value="breakpoint">
101
+ <BreakpointPanel
102
+ task={task}
103
+ runId={runId}
104
+ />
105
+ </TabsContent>
106
+ )}
107
+ <TabsContent value="agent"><AgentPanel task={task} /></TabsContent>
108
+ <TabsContent value="timing"><TimingPanel task={task} runDuration={runDuration} allTasks={allTasks} /></TabsContent>
109
+ <TabsContent value="logs"><LogViewer task={task} /></TabsContent>
110
+ <TabsContent value="data"><JsonTree task={task} /></TabsContent>
111
+ </div>
112
+ </Tabs>
113
+ );
114
+ }
@@ -0,0 +1,247 @@
1
+ import { formatDuration, formatTimestamp } from "@/lib/utils";
2
+ import type { TaskDetail, TaskEffect } from "@/types";
3
+
4
+ // Step colors for the timeline bar — neon gradient cycle
5
+ const STEP_COLORS = [
6
+ "bg-primary", // magenta
7
+ "bg-secondary", // neon cyan
8
+ "bg-success", // neon green
9
+ "bg-warning", // sun yellow
10
+ "bg-error", // hot red
11
+ "bg-primary/60", // magenta light
12
+ "bg-secondary/60", // cyan light
13
+ "bg-success/60", // green light
14
+ ];
15
+
16
+ function getStepColor(index: number): string {
17
+ return STEP_COLORS[index % STEP_COLORS.length];
18
+ }
19
+
20
+ function getTimestampMs(value: string | undefined): number | null {
21
+ if (!value) return null;
22
+ const ms = new Date(value).getTime();
23
+ return Number.isFinite(ms) ? ms : null;
24
+ }
25
+
26
+ /**
27
+ * Compute effective execution duration for a task.
28
+ * Prefer the parsed task duration, then explicit execution timestamps, and only
29
+ * fall back to requested/resolved when no execution window is available.
30
+ */
31
+ function getEffectiveDuration(t: TaskEffect): number {
32
+ if (t.duration && t.duration > 0) return t.duration;
33
+
34
+ const execStart = getTimestampMs(t.startedAt);
35
+ const execEnd = getTimestampMs(t.finishedAt);
36
+ if (execStart != null && execEnd != null) {
37
+ return Math.max(execEnd - execStart, 0);
38
+ }
39
+
40
+ const requestedAt = getTimestampMs(t.requestedAt);
41
+ const resolvedAt = getTimestampMs(t.resolvedAt);
42
+ if (requestedAt != null && resolvedAt != null) {
43
+ return Math.max(resolvedAt - requestedAt, 0);
44
+ }
45
+
46
+ return 0;
47
+ }
48
+
49
+ /**
50
+ * Compute the overall run duration from the earliest requestedAt
51
+ * to the latest resolvedAt across all tasks.
52
+ * Falls back to Date.now() for any task still in "requested" state.
53
+ */
54
+ function computeTimelineDuration(tasks: TaskEffect[]): number {
55
+ if (tasks.length === 0) return 0;
56
+ let earliest = Infinity;
57
+ let latest = -Infinity;
58
+ for (const t of tasks) {
59
+ const reqTime = new Date(t.requestedAt).getTime();
60
+ if (reqTime < earliest) earliest = reqTime;
61
+ const endTime = t.resolvedAt
62
+ ? new Date(t.resolvedAt).getTime()
63
+ : (t.status === "requested" ? Date.now() : reqTime);
64
+ if (endTime > latest) latest = endTime;
65
+ }
66
+ return Math.max(latest - earliest, 0);
67
+ }
68
+
69
+ interface TimingPanelProps {
70
+ task: TaskDetail | null;
71
+ runDuration?: number;
72
+ /** All tasks in the run — needed for the cascading timeline */
73
+ allTasks?: TaskEffect[];
74
+ }
75
+
76
+ export function TimingPanel({ task, runDuration, allTasks }: TimingPanelProps) {
77
+ if (!task) return <div className="p-4 text-sm text-foreground-muted">Select a task to view timing</div>;
78
+
79
+ const effectiveDuration = getEffectiveDuration(task as TaskEffect);
80
+
81
+ const rows = [
82
+ { label: "Requested", value: formatTimestamp(task.requestedAt) },
83
+ { label: "Resolved", value: formatTimestamp(task.resolvedAt) },
84
+ { label: "Duration", value: formatDuration(effectiveDuration) },
85
+ ];
86
+
87
+ // Show startedAt/finishedAt only if they differ from requestedAt/resolvedAt
88
+ const hasExecTiming = task.startedAt && task.finishedAt &&
89
+ (task.startedAt !== task.requestedAt || task.finishedAt !== task.resolvedAt);
90
+
91
+ if (hasExecTiming) {
92
+ rows.push(
93
+ { label: "Exec Started", value: formatTimestamp(task.startedAt) },
94
+ { label: "Exec Finished", value: formatTimestamp(task.finishedAt) },
95
+ );
96
+ }
97
+
98
+ // Build cascading timeline segments from all tasks
99
+ const sortedTasks = allTasks
100
+ ? [...allTasks].sort((a, b) => new Date(a.requestedAt).getTime() - new Date(b.requestedAt).getTime())
101
+ : [];
102
+
103
+ // Compute timeline duration from earliest requestedAt to latest resolvedAt
104
+ // instead of relying solely on the passed-in runDuration prop
105
+ const timelineDuration = sortedTasks.length > 0
106
+ ? computeTimelineDuration(sortedTasks)
107
+ : (runDuration || 0);
108
+ const effectiveRunDuration = timelineDuration > 0 ? timelineDuration : (runDuration || 0);
109
+
110
+ // Compute the earliest requestedAt timestamp for offset calculations
111
+ const earliestTime = sortedTasks.length > 0
112
+ ? new Date(sortedTasks[0].requestedAt).getTime()
113
+ : 0;
114
+
115
+ // Calculate each task's position and width relative to total timeline
116
+ const segments = sortedTasks.map((t, i) => {
117
+ const dur = getEffectiveDuration(t);
118
+ if (!effectiveRunDuration || effectiveRunDuration <= 0) {
119
+ return { taskId: t.effectId, start: 0, width: 0, color: getStepColor(i), title: t.title, duration: dur };
120
+ }
121
+ // Position based on wall-clock offset from earliest task
122
+ const taskStart = new Date(t.requestedAt).getTime();
123
+ const startPct = Math.min(((taskStart - earliestTime) / effectiveRunDuration) * 100, 100);
124
+ const widthPct = Math.min((dur / effectiveRunDuration) * 100, 100 - startPct);
125
+ return {
126
+ taskId: t.effectId,
127
+ start: startPct,
128
+ width: widthPct,
129
+ color: getStepColor(i),
130
+ title: t.title,
131
+ duration: dur,
132
+ };
133
+ });
134
+
135
+ // Compute idle gap segments between consecutive tasks
136
+ const idleSegments: { start: number; width: number; duration: number }[] = [];
137
+ if (segments.length > 1) {
138
+ for (let i = 0; i < segments.length - 1; i++) {
139
+ const currentEnd = segments[i].start + segments[i].width;
140
+ const nextStart = segments[i + 1].start;
141
+ const gapWidth = nextStart - currentEnd;
142
+ if (gapWidth > 0.5) { // Only show gaps > 0.5% of timeline
143
+ const gapDuration = (gapWidth / 100) * effectiveRunDuration;
144
+ idleSegments.push({ start: currentEnd, width: gapWidth, duration: gapDuration });
145
+ }
146
+ }
147
+ }
148
+ const totalIdleDuration = idleSegments.reduce((sum, g) => sum + g.duration, 0);
149
+
150
+ // Current task's segment
151
+ const currentIdx = sortedTasks.findIndex((t) => t.effectId === task.effectId);
152
+ const currentSegment = currentIdx >= 0 ? segments[currentIdx] : null;
153
+
154
+ return (
155
+ <div className="p-4">
156
+ <div className="space-y-3">
157
+ {rows.map(({ label, value }) => (
158
+ <div key={label} className="flex items-center gap-3">
159
+ <span className="flex-shrink-0 w-1.5 h-1.5 rounded-full bg-primary" />
160
+ <div className="flex items-center justify-between flex-1 min-w-0">
161
+ <span className="text-xs text-foreground-muted">{label}</span>
162
+ <span className="font-mono text-sm text-foreground">{value}</span>
163
+ </div>
164
+ </div>
165
+ ))}
166
+ </div>
167
+
168
+ {/* Cascading timeline bar showing all steps */}
169
+ {effectiveRunDuration > 0 && segments.length > 0 && (
170
+ <div className="mt-4 pt-4 border-t border-border">
171
+ <div className="flex items-center justify-between text-xs mb-2">
172
+ <span className="text-foreground-muted">Run Timeline</span>
173
+ <span className="font-mono text-foreground">{formatDuration(effectiveRunDuration)}</span>
174
+ </div>
175
+
176
+ {/* Full timeline bar with neon gradient fill */}
177
+ <div className="w-full h-4 bg-muted/30 rounded-full overflow-hidden relative">
178
+ {segments.map((seg) => (
179
+ <div
180
+ key={seg.taskId}
181
+ className={`absolute top-0 h-full ${seg.color} transition-all duration-300 ${
182
+ seg.taskId === task.effectId ? "opacity-100 ring-1 ring-primary/50 z-10" : "opacity-60"
183
+ }`}
184
+ style={{
185
+ left: `${seg.start}%`,
186
+ width: `${Math.max(seg.width, 0.5)}%`,
187
+ }}
188
+ title={`${seg.title}: ${formatDuration(seg.duration)} (${seg.width.toFixed(1)}%)`}
189
+ />
190
+ ))}
191
+ {idleSegments.map((gap, i) => (
192
+ <div
193
+ key={`idle-${i}`}
194
+ className="absolute top-0 h-full bg-idle-stripes opacity-40"
195
+ style={{
196
+ left: `${gap.start}%`,
197
+ width: `${Math.max(gap.width, 0.5)}%`,
198
+ }}
199
+ title={`Idle: ${formatDuration(gap.duration)} (${gap.width.toFixed(1)}%)`}
200
+ />
201
+ ))}
202
+ </div>
203
+
204
+ {/* Current step info — neon percentage label when significant */}
205
+ {currentSegment && (
206
+ <div className="mt-2 flex items-center justify-between text-xs">
207
+ <div className="flex items-center gap-2">
208
+ <div className={`w-2.5 h-2.5 rounded-sm ${currentSegment.color}`} />
209
+ <span className="text-foreground-secondary">
210
+ Step {currentIdx + 1}/{sortedTasks.length}
211
+ </span>
212
+ </div>
213
+ <span className={`font-mono ${currentSegment.width >= 25 ? "text-primary neon-text-subtle" : "text-foreground"}`}>
214
+ {currentSegment.width.toFixed(1)}% of total
215
+ </span>
216
+ </div>
217
+ )}
218
+
219
+ {/* Step legend (compact) */}
220
+ {segments.length > 1 && (
221
+ <div className="mt-3 space-y-1">
222
+ {segments.map((seg, i) => (
223
+ <div
224
+ key={seg.taskId}
225
+ className={`flex items-center gap-2 text-xs leading-tight ${
226
+ seg.taskId === task.effectId ? "text-foreground" : "text-foreground-muted"
227
+ }`}
228
+ >
229
+ <div className={`w-2 h-2 rounded-sm shrink-0 ${seg.color}`} />
230
+ <span className="truncate flex-1">{i + 1}. {seg.title}</span>
231
+ <span className={`font-mono shrink-0 ${seg.width >= 25 ? "text-warning" : ""}`}>{formatDuration(seg.duration)}</span>
232
+ </div>
233
+ ))}
234
+ {totalIdleDuration > 0 && (
235
+ <div className="flex items-center gap-2 text-xs leading-tight text-foreground-muted">
236
+ <div className="w-2 h-2 rounded-sm shrink-0 bg-idle-stripes border border-border" />
237
+ <span className="truncate flex-1">Idle / Wait</span>
238
+ <span className="font-mono shrink-0">{formatDuration(totalIdleDuration)}</span>
239
+ </div>
240
+ )}
241
+ </div>
242
+ )}
243
+ </div>
244
+ )}
245
+ </div>
246
+ );
247
+ }
File without changes