@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,347 @@
1
+ import React from 'react';
2
+ import { describe, it, expect, vi, beforeEach } from 'vitest';
3
+ import { render, screen, setupUser } from '@/test/test-utils';
4
+ import { JsonTree, JsonTreeView } from '../json-tree';
5
+ import { createMockTaskDetail } from '@/test/fixtures';
6
+
7
+ // Mock clipboard
8
+ beforeEach(() => {
9
+ Object.defineProperty(navigator, 'clipboard', {
10
+ writable: true,
11
+ configurable: true,
12
+ value: {
13
+ writeText: vi.fn().mockResolvedValue(undefined),
14
+ readText: vi.fn().mockResolvedValue(''),
15
+ write: vi.fn().mockResolvedValue(undefined),
16
+ read: vi.fn().mockResolvedValue([]),
17
+ addEventListener: vi.fn(),
18
+ removeEventListener: vi.fn(),
19
+ dispatchEvent: vi.fn().mockReturnValue(false),
20
+ },
21
+ });
22
+ });
23
+
24
+ // ========================================================================
25
+ // JsonTreeView (generic JSON viewer)
26
+ // ========================================================================
27
+
28
+ describe('JsonTreeView', () => {
29
+ it('renders null data as "null" text', () => {
30
+ render(<JsonTreeView data={null} />);
31
+ expect(screen.getByText('null')).toBeInTheDocument();
32
+ });
33
+
34
+ it('renders undefined data as "null" text', () => {
35
+ render(<JsonTreeView data={undefined} />);
36
+ expect(screen.getByText('null')).toBeInTheDocument();
37
+ });
38
+
39
+ it('renders string values with quotes', () => {
40
+ render(<JsonTreeView data="hello" />);
41
+ // PrimitiveValue wraps strings in &quot; entities
42
+ expect(screen.getByText(/hello/)).toBeInTheDocument();
43
+ });
44
+
45
+ it('renders number values', () => {
46
+ render(<JsonTreeView data={42} />);
47
+ expect(screen.getByText('42')).toBeInTheDocument();
48
+ });
49
+
50
+ it('renders boolean true', () => {
51
+ render(<JsonTreeView data={true} />);
52
+ expect(screen.getByText('true')).toBeInTheDocument();
53
+ });
54
+
55
+ it('renders boolean false', () => {
56
+ render(<JsonTreeView data={false} />);
57
+ expect(screen.getByText('false')).toBeInTheDocument();
58
+ });
59
+
60
+ it('renders null value inside an object', () => {
61
+ render(<JsonTreeView data={{ key: null }} defaultExpanded />);
62
+ expect(screen.getByText('null')).toBeInTheDocument();
63
+ expect(screen.getByText('key')).toBeInTheDocument();
64
+ });
65
+
66
+ it('renders a simple object with keys expanded by default (<=10 keys)', () => {
67
+ render(<JsonTreeView data={{ name: 'Alice', age: 30 }} />);
68
+ expect(screen.getByText('name')).toBeInTheDocument();
69
+ expect(screen.getByText('age')).toBeInTheDocument();
70
+ expect(screen.getByText('30')).toBeInTheDocument();
71
+ });
72
+
73
+ it('renders array items expanded by default (<=5 items)', () => {
74
+ render(<JsonTreeView data={[1, 2, 3]} />);
75
+ expect(screen.getByText('1')).toBeInTheDocument();
76
+ expect(screen.getByText('2')).toBeInTheDocument();
77
+ expect(screen.getByText('3')).toBeInTheDocument();
78
+ });
79
+
80
+ it('collapses large arrays by default (>5 items) showing item count', () => {
81
+ const arr = [1, 2, 3, 4, 5, 6];
82
+ render(<JsonTreeView data={arr} />);
83
+ expect(screen.getByText('6 items')).toBeInTheDocument();
84
+ });
85
+
86
+ it('collapses large objects by default (>10 keys) showing key count', () => {
87
+ const obj: Record<string, number> = {};
88
+ for (let i = 0; i < 12; i++) {
89
+ obj[`key${i}`] = i;
90
+ }
91
+ render(<JsonTreeView data={obj} />);
92
+ expect(screen.getByText('12 keys')).toBeInTheDocument();
93
+ });
94
+
95
+ it('toggles expand/collapse on click', async () => {
96
+ const user = setupUser();
97
+ const data = { a: 1, b: 2 };
98
+ render(<JsonTreeView data={data} />);
99
+
100
+ // Should be expanded by default (2 keys <= 10)
101
+ expect(screen.getByText('a')).toBeInTheDocument();
102
+
103
+ // Click the toggle row (the first role="button" is the expandable node)
104
+ const toggleRows = screen.getAllByRole('button');
105
+ const toggleRow = toggleRows[0];
106
+ await user.click(toggleRow);
107
+
108
+ // After collapsing, should show key count summary
109
+ expect(screen.getByText('2 keys')).toBeInTheDocument();
110
+ });
111
+
112
+ it('expands a collapsed node on click', async () => {
113
+ const user = setupUser();
114
+ // Large array starts collapsed
115
+ const arr = [10, 20, 30, 40, 50, 60];
116
+ render(<JsonTreeView data={arr} />);
117
+
118
+ // Collapsed - shows count
119
+ expect(screen.getByText('6 items')).toBeInTheDocument();
120
+
121
+ // Click to expand
122
+ const toggleRow = screen.getByRole('button');
123
+ await user.click(toggleRow);
124
+
125
+ // Should now show individual values
126
+ expect(screen.getByText('10')).toBeInTheDocument();
127
+ expect(screen.getByText('60')).toBeInTheDocument();
128
+ });
129
+
130
+ it('renders nested objects', () => {
131
+ const data = { outer: { inner: 'value' } };
132
+ render(<JsonTreeView data={data} defaultExpanded />);
133
+ expect(screen.getByText('outer')).toBeInTheDocument();
134
+ expect(screen.getByText('inner')).toBeInTheDocument();
135
+ });
136
+
137
+ it('shows empty text for empty object', () => {
138
+ render(<JsonTreeView data={{}} defaultExpanded />);
139
+ expect(screen.getByText('empty')).toBeInTheDocument();
140
+ });
141
+
142
+ it('shows empty text for empty array', () => {
143
+ render(<JsonTreeView data={[]} defaultExpanded />);
144
+ expect(screen.getByText('empty')).toBeInTheDocument();
145
+ });
146
+
147
+ it('renders copy button on leaf values', () => {
148
+ render(<JsonTreeView data={{ name: 'test' }} />);
149
+ const copyButtons = screen.getAllByTitle('Copy');
150
+ expect(copyButtons.length).toBeGreaterThanOrEqual(1);
151
+ });
152
+
153
+ it('shows 1 item for single-element array', () => {
154
+ // Single item array is <=5 so expanded by default. Collapse it first.
155
+ // Actually, let's test the count label text using defaultExpanded=false
156
+ render(<JsonTreeView data={[42]} defaultExpanded={false} />);
157
+ expect(screen.getByText('1 item')).toBeInTheDocument();
158
+ });
159
+
160
+ it('shows 1 key for single-key object', () => {
161
+ render(<JsonTreeView data={{ solo: true }} defaultExpanded={false} />);
162
+ expect(screen.getByText('1 key')).toBeInTheDocument();
163
+ });
164
+
165
+ it('supports keyboard toggle with Enter key', async () => {
166
+ const user = setupUser();
167
+ const data = { a: 1 };
168
+ render(<JsonTreeView data={data} />);
169
+
170
+ // Expanded by default
171
+ expect(screen.getByText('a')).toBeInTheDocument();
172
+
173
+ const toggleRows = screen.getAllByRole('button');
174
+ const toggleRow = toggleRows[0];
175
+ toggleRow.focus();
176
+ await user.keyboard('{Enter}');
177
+
178
+ // Should collapse and show count
179
+ expect(screen.getByText('1 key')).toBeInTheDocument();
180
+ });
181
+
182
+ it('supports keyboard toggle with Space key', async () => {
183
+ const user = setupUser();
184
+ const data = { a: 1 };
185
+ render(<JsonTreeView data={data} />);
186
+
187
+ const toggleRows = screen.getAllByRole('button');
188
+ const toggleRow = toggleRows[0];
189
+ toggleRow.focus();
190
+ await user.keyboard(' ');
191
+
192
+ expect(screen.getByText('1 key')).toBeInTheDocument();
193
+ });
194
+ });
195
+
196
+ // ========================================================================
197
+ // JsonTree (task-specific I/O viewer)
198
+ // ========================================================================
199
+
200
+ describe('JsonTree', () => {
201
+ it('renders null task state with placeholder message', () => {
202
+ render(<JsonTree task={null} />);
203
+ expect(screen.getByText('Select a task to view data')).toBeInTheDocument();
204
+ });
205
+
206
+ it('renders "No I/O data" when task has neither input nor result', () => {
207
+ const base = createMockTaskDetail();
208
+ // Explicitly remove input and result (factory defaults them via ??)
209
+ const task = { ...base, input: undefined, result: undefined };
210
+ render(<JsonTree task={task} />);
211
+ expect(screen.getByText('No I/O data for this task')).toBeInTheDocument();
212
+ });
213
+
214
+ it('renders Input tab active by default', () => {
215
+ const task = createMockTaskDetail({
216
+ input: { query: 'test' },
217
+ result: { output: 'done' },
218
+ });
219
+ render(<JsonTree task={task} />);
220
+
221
+ const inputBtn = screen.getByText('Input');
222
+ const outputBtn = screen.getByText('Output');
223
+ expect(inputBtn).toBeInTheDocument();
224
+ expect(outputBtn).toBeInTheDocument();
225
+
226
+ // Input data should be visible — key rendered as formatted label "Query" in metadata
227
+ expect(screen.getByText('Query')).toBeInTheDocument();
228
+ });
229
+
230
+ it('switches to Output tab on click', async () => {
231
+ const user = setupUser();
232
+ const task = createMockTaskDetail({
233
+ input: { query: 'test' },
234
+ result: { status: 'ok', value: 42 },
235
+ });
236
+ render(<JsonTree task={task} />);
237
+
238
+ // Click Output tab
239
+ const outputBtn = screen.getByText('Output');
240
+ await user.click(outputBtn);
241
+
242
+ // Output data should now be visible — status rendered as StatusPill
243
+ expect(screen.getByText('ok')).toBeInTheDocument();
244
+ });
245
+
246
+ it('renders input metadata section for requirements array', () => {
247
+ const task = createMockTaskDetail({
248
+ input: { requirements: ['req1', 'req2', 'req3'] },
249
+ result: { done: true },
250
+ });
251
+ render(<JsonTree task={task} />);
252
+ // Requirements is an array of strings but "requirements" is not in FINDINGS_KEYS,
253
+ // so it goes to metadata. The Metadata section header should be present.
254
+ expect(screen.getByText('Metadata')).toBeInTheDocument();
255
+ });
256
+
257
+ it('renders output score bar with score value', async () => {
258
+ const user = setupUser();
259
+ const task = createMockTaskDetail({
260
+ input: { data: 'x' },
261
+ result: { score: 85 },
262
+ });
263
+ render(<JsonTree task={task} />);
264
+
265
+ // Switch to output
266
+ await user.click(screen.getByText('Output'));
267
+
268
+ // ScoreBar renders the score number and /100
269
+ expect(screen.getByText('85')).toBeInTheDocument();
270
+ expect(screen.getByText('/100')).toBeInTheDocument();
271
+ });
272
+
273
+ it('renders output summary block from summary field', async () => {
274
+ const user = setupUser();
275
+ const task = createMockTaskDetail({
276
+ input: { data: 'x' },
277
+ result: { summary: 'All tests passed successfully' },
278
+ });
279
+ render(<JsonTree task={task} />);
280
+
281
+ await user.click(screen.getByText('Output'));
282
+
283
+ // SummaryBlock renders the summary text
284
+ expect(screen.getByText('All tests passed successfully')).toBeInTheDocument();
285
+ // And the Summary section header
286
+ expect(screen.getByText('Summary')).toBeInTheDocument();
287
+ });
288
+
289
+ it('renders output metadata for file arrays', async () => {
290
+ const user = setupUser();
291
+ const task = createMockTaskDetail({
292
+ input: { data: 'x' },
293
+ result: { filesCreated: ['a.ts', 'b.ts'], filesModified: ['c.ts'] },
294
+ });
295
+ render(<JsonTree task={task} />);
296
+
297
+ await user.click(screen.getByText('Output'));
298
+
299
+ // File arrays are complex objects rendered in Metadata section
300
+ expect(screen.getByText('Metadata')).toBeInTheDocument();
301
+ });
302
+
303
+ it('renders metadata section for input with no recognized patterns', () => {
304
+ const task = createMockTaskDetail({
305
+ input: { foo: 'bar', baz: 42 },
306
+ result: { done: true },
307
+ });
308
+ render(<JsonTree task={task} />);
309
+ // Simple key-value pairs go to Metadata section
310
+ expect(screen.getByText('Metadata')).toBeInTheDocument();
311
+ });
312
+
313
+ it('renders input metadata with iteration value', () => {
314
+ const task = createMockTaskDetail({
315
+ input: { iteration: 3, config: {} },
316
+ result: { done: true },
317
+ });
318
+ render(<JsonTree task={task} />);
319
+ // iteration=3 goes to Metadata, rendered as a number
320
+ expect(screen.getByText('Metadata')).toBeInTheDocument();
321
+ });
322
+
323
+ it('renders when task has only input and no result', () => {
324
+ const task = createMockTaskDetail({
325
+ input: { query: 'only-input' },
326
+ result: undefined,
327
+ });
328
+ render(<JsonTree task={task} />);
329
+ // Key rendered as formatted label "Query" in metadata grid
330
+ expect(screen.getByText('Query')).toBeInTheDocument();
331
+ });
332
+
333
+ it('renders when task has only result and no input', async () => {
334
+ const user = setupUser();
335
+ const task = createMockTaskDetail({
336
+ input: undefined,
337
+ result: { output: 'only-result' },
338
+ });
339
+ render(<JsonTree task={task} />);
340
+
341
+ // Switch to output since input is undefined
342
+ await user.click(screen.getByText('Output'));
343
+ // "output" key rendered as "Output" label, but "Output" is also the tab button text.
344
+ // Check for the value instead to avoid ambiguity.
345
+ expect(screen.getByText('only-result')).toBeInTheDocument();
346
+ });
347
+ });
@@ -0,0 +1,168 @@
1
+ import React from 'react';
2
+ import { describe, it, expect, vi, beforeEach } from 'vitest';
3
+ import { render, screen, setupUser } from '@/test/test-utils';
4
+ import { LogViewer } from '../log-viewer';
5
+ import { createMockTaskDetail } from '@/test/fixtures';
6
+
7
+ // Mock clipboard
8
+ beforeEach(() => {
9
+ Object.defineProperty(navigator, 'clipboard', {
10
+ writable: true,
11
+ configurable: true,
12
+ value: {
13
+ writeText: vi.fn().mockResolvedValue(undefined),
14
+ readText: vi.fn().mockResolvedValue(''),
15
+ write: vi.fn().mockResolvedValue(undefined),
16
+ read: vi.fn().mockResolvedValue([]),
17
+ addEventListener: vi.fn(),
18
+ removeEventListener: vi.fn(),
19
+ dispatchEvent: vi.fn().mockReturnValue(false),
20
+ },
21
+ });
22
+ });
23
+
24
+ describe('LogViewer', () => {
25
+ it('renders null task state with placeholder message', () => {
26
+ render(<LogViewer task={null} />);
27
+ expect(screen.getByText('Select a task to view logs')).toBeInTheDocument();
28
+ });
29
+
30
+ it('renders "No logs captured" for non-agent task with no stdout/stderr', () => {
31
+ const base = createMockTaskDetail({ kind: 'node' });
32
+ const task = { ...base, stdout: undefined, stderr: undefined, result: undefined };
33
+ render(<LogViewer task={task} />);
34
+ expect(screen.getByText('No logs captured for this task.')).toBeInTheDocument();
35
+ });
36
+
37
+ it('renders agent hint when agent task has no logs and no result', () => {
38
+ const base = createMockTaskDetail({ kind: 'agent' });
39
+ const task = { ...base, stdout: undefined, stderr: undefined, result: undefined };
40
+ render(<LogViewer task={task} />);
41
+ expect(screen.getByText(/Agent tasks don't produce stdout\/stderr/)).toBeInTheDocument();
42
+ });
43
+
44
+ it('renders skill hint when skill task has no logs and no result', () => {
45
+ const base = createMockTaskDetail({ kind: 'skill' });
46
+ const task = { ...base, stdout: undefined, stderr: undefined, result: undefined };
47
+ render(<LogViewer task={task} />);
48
+ expect(screen.getByText(/Agent tasks don't produce stdout\/stderr/)).toBeInTheDocument();
49
+ });
50
+
51
+ it('renders stdout section with correct label and content', () => {
52
+ const task = createMockTaskDetail({
53
+ stdout: 'Hello world\nLine two',
54
+ stderr: undefined,
55
+ });
56
+ render(<LogViewer task={task} />);
57
+ expect(screen.getByText('stdout')).toBeInTheDocument();
58
+ expect(screen.getByText('Hello world')).toBeInTheDocument();
59
+ expect(screen.getByText('Line two')).toBeInTheDocument();
60
+ });
61
+
62
+ it('renders stderr section with correct label and content', () => {
63
+ const task = createMockTaskDetail({
64
+ stdout: undefined,
65
+ stderr: 'Error: something failed',
66
+ });
67
+ render(<LogViewer task={task} />);
68
+ expect(screen.getByText('stderr')).toBeInTheDocument();
69
+ expect(screen.getByText('Error: something failed')).toBeInTheDocument();
70
+ });
71
+
72
+ it('renders both stdout and stderr sections', () => {
73
+ const task = createMockTaskDetail({
74
+ stdout: 'Standard output text',
75
+ stderr: 'Standard error text',
76
+ });
77
+ render(<LogViewer task={task} />);
78
+ expect(screen.getByText('stdout')).toBeInTheDocument();
79
+ expect(screen.getByText('stderr')).toBeInTheDocument();
80
+ expect(screen.getByText('Standard output text')).toBeInTheDocument();
81
+ expect(screen.getByText('Standard error text')).toBeInTheDocument();
82
+ });
83
+
84
+ it('renders line numbers for stdout', () => {
85
+ const task = createMockTaskDetail({
86
+ stdout: 'Line A\nLine B\nLine C',
87
+ stderr: undefined,
88
+ });
89
+ render(<LogViewer task={task} />);
90
+ expect(screen.getByText('1')).toBeInTheDocument();
91
+ expect(screen.getByText('2')).toBeInTheDocument();
92
+ expect(screen.getByText('3')).toBeInTheDocument();
93
+ });
94
+
95
+ it('renders agent output section when agent task has result but no process logs', () => {
96
+ const base = createMockTaskDetail({
97
+ kind: 'agent',
98
+ result: { result: { message: 'Agent completed' } },
99
+ });
100
+ // Explicitly remove stdout/stderr so hasProcessLogs is false
101
+ const task = { ...base, stdout: undefined, stderr: undefined };
102
+ render(<LogViewer task={task} />);
103
+ expect(screen.getByText('output')).toBeInTheDocument();
104
+ });
105
+
106
+ it('does not render agent output section when stdout is present', () => {
107
+ const task = createMockTaskDetail({
108
+ kind: 'agent',
109
+ stdout: 'Some stdout',
110
+ stderr: undefined,
111
+ result: { result: 'agent output' },
112
+ });
113
+ render(<LogViewer task={task} />);
114
+ // Should show stdout, not the "output" section
115
+ expect(screen.getByText('stdout')).toBeInTheDocument();
116
+ expect(screen.queryByText('output')).not.toBeInTheDocument();
117
+ });
118
+
119
+ it('renders copy button for each log section', () => {
120
+ const task = createMockTaskDetail({
121
+ stdout: 'some stdout',
122
+ stderr: 'some stderr',
123
+ });
124
+ render(<LogViewer task={task} />);
125
+ const copyButtons = screen.getAllByText('Copy');
126
+ expect(copyButtons).toHaveLength(2);
127
+ });
128
+
129
+ it('shows "Show all N lines" button for long stdout', () => {
130
+ // Generate >100 lines
131
+ const lines = Array.from({ length: 120 }, (_, i) => `Line ${i + 1}`).join('\n');
132
+ const task = createMockTaskDetail({
133
+ stdout: lines,
134
+ stderr: undefined,
135
+ });
136
+ render(<LogViewer task={task} />);
137
+ expect(screen.getByText('Show all 120 lines')).toBeInTheDocument();
138
+ });
139
+
140
+ it('expands long stdout on "Show all" click', async () => {
141
+ const user = setupUser();
142
+ const lines = Array.from({ length: 120 }, (_, i) => `Line ${i + 1}`).join('\n');
143
+ const task = createMockTaskDetail({
144
+ stdout: lines,
145
+ stderr: undefined,
146
+ });
147
+ render(<LogViewer task={task} />);
148
+
149
+ const showAllBtn = screen.getByText('Show all 120 lines');
150
+ await user.click(showAllBtn);
151
+
152
+ // After expansion, the "Show all" button should disappear
153
+ expect(screen.queryByText('Show all 120 lines')).not.toBeInTheDocument();
154
+ // Line 120 should now be visible
155
+ expect(screen.getByText('Line 120')).toBeInTheDocument();
156
+ });
157
+
158
+ it('renders empty stderr without rendering stderr section', () => {
159
+ const task = createMockTaskDetail({
160
+ stdout: 'output',
161
+ stderr: '',
162
+ });
163
+ render(<LogViewer task={task} />);
164
+ expect(screen.getByText('stdout')).toBeInTheDocument();
165
+ // Empty string is falsy, so stderr section should not render
166
+ expect(screen.queryByText('stderr')).not.toBeInTheDocument();
167
+ });
168
+ });