@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.
- package/.next/BUILD_ID +1 -0
- package/.next/app-path-routes-manifest.json +16 -0
- package/.next/build-manifest.json +23 -0
- package/.next/export-marker.json +6 -0
- package/.next/fallback-build-manifest.json +13 -0
- package/.next/images-manifest.json +68 -0
- package/.next/next-minimal-server.js.nft.json +1 -0
- package/.next/next-server.js.nft.json +1 -0
- package/.next/package.json +1 -0
- package/.next/prerender-manifest.json +114 -0
- package/.next/required-server-files.json +334 -0
- package/.next/routes-manifest.json +139 -0
- package/.next/server/app/_global-error/page/app-paths-manifest.json +3 -0
- package/.next/server/app/_global-error/page/build-manifest.json +19 -0
- package/.next/server/app/_global-error/page/next-font-manifest.json +6 -0
- package/.next/server/app/_global-error/page/react-loadable-manifest.json +1 -0
- package/.next/server/app/_global-error/page/server-reference-manifest.json +4 -0
- package/.next/server/app/_global-error/page.js +9 -0
- package/.next/server/app/_global-error/page.js.map +5 -0
- package/.next/server/app/_global-error/page.js.nft.json +1 -0
- package/.next/server/app/_global-error/page_client-reference-manifest.js +3 -0
- package/.next/server/app/_global-error.html +1 -0
- package/.next/server/app/_global-error.meta +15 -0
- package/.next/server/app/_global-error.rsc +14 -0
- package/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +5 -0
- package/.next/server/app/_global-error.segments/_full.segment.rsc +14 -0
- package/.next/server/app/_global-error.segments/_head.segment.rsc +5 -0
- package/.next/server/app/_global-error.segments/_index.segment.rsc +5 -0
- package/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -0
- package/.next/server/app/_not-found/page/app-paths-manifest.json +3 -0
- package/.next/server/app/_not-found/page/build-manifest.json +19 -0
- package/.next/server/app/_not-found/page/next-font-manifest.json +6 -0
- package/.next/server/app/_not-found/page/react-loadable-manifest.json +1 -0
- package/.next/server/app/_not-found/page/server-reference-manifest.json +4 -0
- package/.next/server/app/_not-found/page.js +13 -0
- package/.next/server/app/_not-found/page.js.map +5 -0
- package/.next/server/app/_not-found/page.js.nft.json +1 -0
- package/.next/server/app/_not-found/page_client-reference-manifest.js +3 -0
- package/.next/server/app/_not-found.html +1 -0
- package/.next/server/app/_not-found.meta +16 -0
- package/.next/server/app/_not-found.rsc +19 -0
- package/.next/server/app/_not-found.segments/_full.segment.rsc +19 -0
- package/.next/server/app/_not-found.segments/_head.segment.rsc +6 -0
- package/.next/server/app/_not-found.segments/_index.segment.rsc +8 -0
- package/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +6 -0
- package/.next/server/app/_not-found.segments/_not-found.segment.rsc +5 -0
- package/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -0
- package/.next/server/app/api/config/route/app-paths-manifest.json +3 -0
- package/.next/server/app/api/config/route/build-manifest.json +9 -0
- package/.next/server/app/api/config/route/server-reference-manifest.json +4 -0
- package/.next/server/app/api/config/route.js +8 -0
- package/.next/server/app/api/config/route.js.map +5 -0
- package/.next/server/app/api/config/route.js.nft.json +1 -0
- package/.next/server/app/api/config/route_client-reference-manifest.js +3 -0
- package/.next/server/app/api/digest/route/app-paths-manifest.json +3 -0
- package/.next/server/app/api/digest/route/build-manifest.json +9 -0
- package/.next/server/app/api/digest/route/server-reference-manifest.json +4 -0
- package/.next/server/app/api/digest/route.js +9 -0
- package/.next/server/app/api/digest/route.js.map +5 -0
- package/.next/server/app/api/digest/route.js.nft.json +1 -0
- package/.next/server/app/api/digest/route_client-reference-manifest.js +3 -0
- package/.next/server/app/api/runs/[runId]/events/route/app-paths-manifest.json +3 -0
- package/.next/server/app/api/runs/[runId]/events/route/build-manifest.json +9 -0
- package/.next/server/app/api/runs/[runId]/events/route/server-reference-manifest.json +4 -0
- package/.next/server/app/api/runs/[runId]/events/route.js +8 -0
- package/.next/server/app/api/runs/[runId]/events/route.js.map +5 -0
- package/.next/server/app/api/runs/[runId]/events/route.js.nft.json +1 -0
- package/.next/server/app/api/runs/[runId]/events/route_client-reference-manifest.js +3 -0
- package/.next/server/app/api/runs/[runId]/route/app-paths-manifest.json +3 -0
- package/.next/server/app/api/runs/[runId]/route/build-manifest.json +9 -0
- package/.next/server/app/api/runs/[runId]/route/server-reference-manifest.json +4 -0
- package/.next/server/app/api/runs/[runId]/route.js +9 -0
- package/.next/server/app/api/runs/[runId]/route.js.map +5 -0
- package/.next/server/app/api/runs/[runId]/route.js.nft.json +1 -0
- package/.next/server/app/api/runs/[runId]/route_client-reference-manifest.js +3 -0
- package/.next/server/app/api/runs/[runId]/tasks/[effectId]/route/app-paths-manifest.json +3 -0
- package/.next/server/app/api/runs/[runId]/tasks/[effectId]/route/build-manifest.json +9 -0
- package/.next/server/app/api/runs/[runId]/tasks/[effectId]/route/server-reference-manifest.json +4 -0
- package/.next/server/app/api/runs/[runId]/tasks/[effectId]/route.js +8 -0
- package/.next/server/app/api/runs/[runId]/tasks/[effectId]/route.js.map +5 -0
- package/.next/server/app/api/runs/[runId]/tasks/[effectId]/route.js.nft.json +1 -0
- package/.next/server/app/api/runs/[runId]/tasks/[effectId]/route_client-reference-manifest.js +3 -0
- package/.next/server/app/api/runs/route/app-paths-manifest.json +3 -0
- package/.next/server/app/api/runs/route/build-manifest.json +9 -0
- package/.next/server/app/api/runs/route/server-reference-manifest.json +4 -0
- package/.next/server/app/api/runs/route.js +9 -0
- package/.next/server/app/api/runs/route.js.map +5 -0
- package/.next/server/app/api/runs/route.js.nft.json +1 -0
- package/.next/server/app/api/runs/route_client-reference-manifest.js +3 -0
- package/.next/server/app/api/stream/route/app-paths-manifest.json +3 -0
- package/.next/server/app/api/stream/route/build-manifest.json +9 -0
- package/.next/server/app/api/stream/route/server-reference-manifest.json +4 -0
- package/.next/server/app/api/stream/route.js +8 -0
- package/.next/server/app/api/stream/route.js.map +5 -0
- package/.next/server/app/api/stream/route.js.nft.json +1 -0
- package/.next/server/app/api/stream/route_client-reference-manifest.js +3 -0
- package/.next/server/app/api/test/route/app-paths-manifest.json +3 -0
- package/.next/server/app/api/test/route/build-manifest.json +9 -0
- package/.next/server/app/api/test/route/server-reference-manifest.json +4 -0
- package/.next/server/app/api/test/route.js +6 -0
- package/.next/server/app/api/test/route.js.map +5 -0
- package/.next/server/app/api/test/route.js.nft.json +1 -0
- package/.next/server/app/api/test/route_client-reference-manifest.js +3 -0
- package/.next/server/app/api/version/route/app-paths-manifest.json +3 -0
- package/.next/server/app/api/version/route/build-manifest.json +9 -0
- package/.next/server/app/api/version/route/server-reference-manifest.json +4 -0
- package/.next/server/app/api/version/route.js +7 -0
- package/.next/server/app/api/version/route.js.map +5 -0
- package/.next/server/app/api/version/route.js.nft.json +1 -0
- package/.next/server/app/api/version/route_client-reference-manifest.js +3 -0
- package/.next/server/app/icon.svg/route/app-paths-manifest.json +3 -0
- package/.next/server/app/icon.svg/route/build-manifest.json +9 -0
- package/.next/server/app/icon.svg/route.js +7 -0
- package/.next/server/app/icon.svg/route.js.map +5 -0
- package/.next/server/app/icon.svg/route.js.nft.json +1 -0
- package/.next/server/app/icon.svg.body +20 -0
- package/.next/server/app/icon.svg.meta +1 -0
- package/.next/server/app/index.html +1 -0
- package/.next/server/app/index.meta +14 -0
- package/.next/server/app/index.rsc +21 -0
- package/.next/server/app/index.segments/__PAGE__.segment.rsc +9 -0
- package/.next/server/app/index.segments/_full.segment.rsc +21 -0
- package/.next/server/app/index.segments/_head.segment.rsc +6 -0
- package/.next/server/app/index.segments/_index.segment.rsc +8 -0
- package/.next/server/app/index.segments/_tree.segment.rsc +2 -0
- package/.next/server/app/page/app-paths-manifest.json +3 -0
- package/.next/server/app/page/build-manifest.json +19 -0
- package/.next/server/app/page/next-font-manifest.json +6 -0
- package/.next/server/app/page/react-loadable-manifest.json +1 -0
- package/.next/server/app/page/server-reference-manifest.json +17 -0
- package/.next/server/app/page.js +15 -0
- package/.next/server/app/page.js.map +5 -0
- package/.next/server/app/page.js.nft.json +1 -0
- package/.next/server/app/page_client-reference-manifest.js +3 -0
- package/.next/server/app/runs/[runId]/page/app-paths-manifest.json +3 -0
- package/.next/server/app/runs/[runId]/page/build-manifest.json +19 -0
- package/.next/server/app/runs/[runId]/page/next-font-manifest.json +6 -0
- package/.next/server/app/runs/[runId]/page/react-loadable-manifest.json +22 -0
- package/.next/server/app/runs/[runId]/page/server-reference-manifest.json +17 -0
- package/.next/server/app/runs/[runId]/page.js +15 -0
- package/.next/server/app/runs/[runId]/page.js.map +5 -0
- package/.next/server/app/runs/[runId]/page.js.nft.json +1 -0
- package/.next/server/app/runs/[runId]/page_client-reference-manifest.js +3 -0
- package/.next/server/app-paths-manifest.json +16 -0
- package/.next/server/chunks/01oi_server_app_api_runs_[runId]_tasks_[effectId]_route_actions_0r72yai.js +3 -0
- package/.next/server/chunks/01oi_server_app_api_runs_[runId]_tasks_[effectId]_route_actions_0r72yai.js.map +1 -0
- package/.next/server/chunks/0h.v__next-internal_server_app_api_runs_[runId]_events_route_actions_0~msldk.js +3 -0
- package/.next/server/chunks/0h.v__next-internal_server_app_api_runs_[runId]_events_route_actions_0~msldk.js.map +1 -0
- package/.next/server/chunks/0h.v__next-internal_server_app_api_runs_[runId]_route_actions_09iz0n6.js +3 -0
- package/.next/server/chunks/0h.v__next-internal_server_app_api_runs_[runId]_route_actions_09iz0n6.js.map +1 -0
- package/.next/server/chunks/0juq_observer-dashboard__next-internal_server_app_api_config_route_actions_0~eypoa.js +3 -0
- package/.next/server/chunks/0juq_observer-dashboard__next-internal_server_app_api_config_route_actions_0~eypoa.js.map +1 -0
- package/.next/server/chunks/0juq_observer-dashboard__next-internal_server_app_api_digest_route_actions_04jj5zs.js +3 -0
- package/.next/server/chunks/0juq_observer-dashboard__next-internal_server_app_api_digest_route_actions_04jj5zs.js.map +1 -0
- package/.next/server/chunks/0juq_observer-dashboard__next-internal_server_app_api_runs_route_actions_0~-t-o4.js +3 -0
- package/.next/server/chunks/0juq_observer-dashboard__next-internal_server_app_api_runs_route_actions_0~-t-o4.js.map +1 -0
- package/.next/server/chunks/0juq_observer-dashboard__next-internal_server_app_api_stream_route_actions_0fkmv2_.js +3 -0
- package/.next/server/chunks/0juq_observer-dashboard__next-internal_server_app_api_stream_route_actions_0fkmv2_.js.map +1 -0
- package/.next/server/chunks/0juq_observer-dashboard__next-internal_server_app_api_test_route_actions_00ugava.js +3 -0
- package/.next/server/chunks/0juq_observer-dashboard__next-internal_server_app_api_test_route_actions_00ugava.js.map +1 -0
- package/.next/server/chunks/0juq_observer-dashboard__next-internal_server_app_api_version_route_actions_0~v3ojm.js +3 -0
- package/.next/server/chunks/0juq_observer-dashboard__next-internal_server_app_api_version_route_actions_0~v3ojm.js.map +1 -0
- package/.next/server/chunks/0juq_observer-dashboard__next-internal_server_app_icon_svg_route_actions_0yypxkm.js +3 -0
- package/.next/server/chunks/0juq_observer-dashboard__next-internal_server_app_icon_svg_route_actions_0yypxkm.js.map +1 -0
- package/.next/server/chunks/[root-of-the-server]__0.6bt.6._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__0.6bt.6._.js.map +1 -0
- package/.next/server/chunks/[root-of-the-server]__08kwev1._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__08kwev1._.js.map +1 -0
- package/.next/server/chunks/[root-of-the-server]__096el.d._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__096el.d._.js.map +1 -0
- package/.next/server/chunks/[root-of-the-server]__0_bmt4z._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__0_bmt4z._.js.map +1 -0
- package/.next/server/chunks/[root-of-the-server]__0_ln2d2._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__0_ln2d2._.js.map +1 -0
- package/.next/server/chunks/[root-of-the-server]__0al3v65._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__0al3v65._.js.map +1 -0
- package/.next/server/chunks/[root-of-the-server]__0gf516b._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__0gf516b._.js.map +1 -0
- package/.next/server/chunks/[root-of-the-server]__0kdfw4x._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__0kdfw4x._.js.map +1 -0
- package/.next/server/chunks/[root-of-the-server]__0pxt00h._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__0pxt00h._.js.map +1 -0
- package/.next/server/chunks/[root-of-the-server]__0rubnza._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__0rubnza._.js.map +1 -0
- package/.next/server/chunks/[root-of-the-server]__0tn9iud._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__0tn9iud._.js.map +1 -0
- package/.next/server/chunks/[root-of-the-server]__0ws5o6i._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__0ws5o6i._.js.map +1 -0
- package/.next/server/chunks/[turbopack]_runtime.js +903 -0
- package/.next/server/chunks/[turbopack]_runtime.js.map +11 -0
- package/.next/server/chunks/node_modules_next_04~_e52._.js +13 -0
- package/.next/server/chunks/node_modules_next_04~_e52._.js.map +1 -0
- package/.next/server/chunks/node_modules_next_dist_esm_build_templates_app-route_0nyyph-.js +9 -0
- package/.next/server/chunks/node_modules_next_dist_esm_build_templates_app-route_0nyyph-.js.map +1 -0
- package/.next/server/chunks/packages_observer-dashboard_src_lib_02.vvb.._.js +3 -0
- package/.next/server/chunks/packages_observer-dashboard_src_lib_02.vvb.._.js.map +1 -0
- package/.next/server/chunks/packages_observer-dashboard_src_lib_0rqgpk0._.js +3 -0
- package/.next/server/chunks/packages_observer-dashboard_src_lib_0rqgpk0._.js.map +1 -0
- package/.next/server/chunks/ssr/0juq_observer-dashboard__next-internal_server_app__global-error_page_actions_0ekoxmy.js +3 -0
- package/.next/server/chunks/ssr/0juq_observer-dashboard__next-internal_server_app__global-error_page_actions_0ekoxmy.js.map +1 -0
- package/.next/server/chunks/ssr/0juq_observer-dashboard__next-internal_server_app__not-found_page_actions_09b3ti3.js +3 -0
- package/.next/server/chunks/ssr/0juq_observer-dashboard__next-internal_server_app__not-found_page_actions_09b3ti3.js.map +1 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__006f7~t._.js +4 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__006f7~t._.js.map +1 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__02jgvbi._.js +3 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__02jgvbi._.js.map +1 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__04j8t~1._.js +3 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__04j8t~1._.js.map +1 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__09c~s.0._.js +33 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__09c~s.0._.js.map +1 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__0cpy61n._.js +3 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__0cpy61n._.js.map +1 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__0cwa32j._.js +3 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__0cwa32j._.js.map +1 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__0fk_g0j._.js +19 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__0fk_g0j._.js.map +1 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__0pddpic._.js +3 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__0pddpic._.js.map +1 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__0pvtneq._.js +3 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__0pvtneq._.js.map +1 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__0xc-2vm._.js +3 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__0xc-2vm._.js.map +1 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__10xgshr._.js +33 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__10xgshr._.js.map +1 -0
- package/.next/server/chunks/ssr/[turbopack]_runtime.js +903 -0
- package/.next/server/chunks/ssr/[turbopack]_runtime.js.map +11 -0
- package/.next/server/chunks/ssr/_00yo1im._.js +3 -0
- package/.next/server/chunks/ssr/_00yo1im._.js.map +1 -0
- package/.next/server/chunks/ssr/_03sbc.o._.js +3 -0
- package/.next/server/chunks/ssr/_03sbc.o._.js.map +1 -0
- package/.next/server/chunks/ssr/_04z5ea0._.js +3 -0
- package/.next/server/chunks/ssr/_04z5ea0._.js.map +1 -0
- package/.next/server/chunks/ssr/_0gmb3g_._.js +3 -0
- package/.next/server/chunks/ssr/_0gmb3g_._.js.map +1 -0
- package/.next/server/chunks/ssr/_0okz9j8._.js +6 -0
- package/.next/server/chunks/ssr/_0okz9j8._.js.map +1 -0
- package/.next/server/chunks/ssr/_0wrbwro._.js +6 -0
- package/.next/server/chunks/ssr/_0wrbwro._.js.map +1 -0
- package/.next/server/chunks/ssr/node_modules_09w7yel._.js +33 -0
- package/.next/server/chunks/ssr/node_modules_09w7yel._.js.map +1 -0
- package/.next/server/chunks/ssr/node_modules_next_dist_0avqw4q._.js +3 -0
- package/.next/server/chunks/ssr/node_modules_next_dist_0avqw4q._.js.map +1 -0
- package/.next/server/chunks/ssr/node_modules_next_dist_0h9llsw._.js +6 -0
- package/.next/server/chunks/ssr/node_modules_next_dist_0h9llsw._.js.map +1 -0
- package/.next/server/chunks/ssr/node_modules_next_dist_0i_._k3._.js +3 -0
- package/.next/server/chunks/ssr/node_modules_next_dist_0i_._k3._.js.map +1 -0
- package/.next/server/chunks/ssr/node_modules_next_dist_client_components_0ee1czk._.js +3 -0
- package/.next/server/chunks/ssr/node_modules_next_dist_client_components_0ee1czk._.js.map +1 -0
- package/.next/server/chunks/ssr/node_modules_next_dist_client_components_builtin_global-error_0lgvd_..js +3 -0
- package/.next/server/chunks/ssr/node_modules_next_dist_client_components_builtin_global-error_0lgvd_..js.map +1 -0
- package/.next/server/chunks/ssr/node_modules_next_dist_client_components_builtin_unauthorized_0cjv-23.js +3 -0
- package/.next/server/chunks/ssr/node_modules_next_dist_client_components_builtin_unauthorized_0cjv-23.js.map +1 -0
- package/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_0amzg6z.js +4 -0
- package/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_0amzg6z.js.map +1 -0
- package/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_0dw1x0d.js +4 -0
- package/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_0dw1x0d.js.map +1 -0
- package/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_0rc3ul_.js +4 -0
- package/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_0rc3ul_.js.map +1 -0
- package/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_10iomok.js +4 -0
- package/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_10iomok.js.map +1 -0
- package/.next/server/chunks/ssr/packages_observer-dashboard_0~a2tmu._.js +3 -0
- package/.next/server/chunks/ssr/packages_observer-dashboard_0~a2tmu._.js.map +1 -0
- package/.next/server/chunks/ssr/packages_observer-dashboard_src_0f.ozc-._.js +3 -0
- package/.next/server/chunks/ssr/packages_observer-dashboard_src_0f.ozc-._.js.map +1 -0
- package/.next/server/chunks/ssr/packages_observer-dashboard_src_components_providers_tsx_03_vrrn._.js +7 -0
- package/.next/server/chunks/ssr/packages_observer-dashboard_src_components_providers_tsx_03_vrrn._.js.map +1 -0
- package/.next/server/functions-config-manifest.json +4 -0
- package/.next/server/interception-route-rewrite-manifest.js +1 -0
- package/.next/server/middleware-build-manifest.js +23 -0
- package/.next/server/middleware-manifest.json +6 -0
- package/.next/server/next-font-manifest.js +1 -0
- package/.next/server/next-font-manifest.json +6 -0
- package/.next/server/pages/404.html +1 -0
- package/.next/server/pages/500.html +1 -0
- package/.next/server/pages-manifest.json +4 -0
- package/.next/server/prefetch-hints.json +1 -0
- package/.next/server/server-reference-manifest.js +1 -0
- package/.next/server/server-reference-manifest.json +24 -0
- package/.next/static/MvfPly4ZXHqaveDVOG1qq/_buildManifest.js +11 -0
- package/.next/static/MvfPly4ZXHqaveDVOG1qq/_clientMiddlewareManifest.js +1 -0
- package/.next/static/MvfPly4ZXHqaveDVOG1qq/_ssgManifest.js +1 -0
- package/.next/static/chunks/00c87uqn~kk2z.js +1 -0
- package/.next/static/chunks/01xlw8hd842-c.js +1 -0
- package/.next/static/chunks/02p9dpa.0oxiz.js +1 -0
- package/.next/static/chunks/034i63v_muq~d.js +1 -0
- package/.next/static/chunks/03mo-6~4pxdio.js +1 -0
- package/.next/static/chunks/03~yq9q893hmn.js +1 -0
- package/.next/static/chunks/04dm5qn77.fc2.js +1 -0
- package/.next/static/chunks/07uz2g0_38qia.js +4 -0
- package/.next/static/chunks/08nqnwvixoxnk.js +2 -0
- package/.next/static/chunks/0d3shmwh5_nmn.js +1 -0
- package/.next/static/chunks/0e_wyjw3nx.a..js +1 -0
- package/.next/static/chunks/0mstyq17cbf8-.js +1 -0
- package/.next/static/chunks/0ntuxw9.how-q.js +1 -0
- package/.next/static/chunks/0t3uzajv1qzmo.js +1 -0
- package/.next/static/chunks/0u~_nwr5-v.xp.js +1 -0
- package/.next/static/chunks/0wxcxh6eyzams.js +1 -0
- package/.next/static/chunks/0x6y7yt4kiddp.css +1 -0
- package/.next/static/chunks/0z6-vonyxr0dn.js +4 -0
- package/.next/static/chunks/0ze4gu236oq96.js +31 -0
- package/.next/static/chunks/0zwozael9msy1.js +1 -0
- package/.next/static/chunks/10qd__0r7a~.l.js +1 -0
- package/.next/static/chunks/11jh_u1ynmatg.js +1 -0
- package/.next/static/chunks/13xer3cb9shu-.js +5 -0
- package/.next/static/chunks/142zlnch_xmgd.js +1 -0
- package/.next/static/chunks/144kcri75qczu.js +1 -0
- package/.next/static/chunks/turbopack-0-ww6fe7b37qt.js +1 -0
- package/.next/static/media/icon.08ljfy7xai2x_.svg +20 -0
- package/LICENSE +21 -0
- package/README.md +490 -0
- package/next.config.mjs +25 -0
- package/package.json +104 -0
- package/postcss.config.mjs +8 -0
- package/src/app/actions/__tests__/approve-breakpoint.test.ts +246 -0
- package/src/app/actions/approve-breakpoint.ts +145 -0
- package/src/app/api/config/route.ts +137 -0
- package/src/app/api/digest/route.ts +45 -0
- package/src/app/api/runs/[runId]/events/route.ts +56 -0
- package/src/app/api/runs/[runId]/route.ts +84 -0
- package/src/app/api/runs/[runId]/tasks/[effectId]/route.ts +44 -0
- package/src/app/api/runs/route.ts +48 -0
- package/src/app/api/stream/route.ts +136 -0
- package/src/app/api/test/route.ts +1 -0
- package/src/app/api/version/route.ts +57 -0
- package/src/app/globals.css +555 -0
- package/src/app/icon.svg +20 -0
- package/src/app/layout.tsx +39 -0
- package/src/app/not-found.tsx +16 -0
- package/src/app/page.tsx +120 -0
- package/src/app/runs/[runId]/page.tsx +279 -0
- package/src/cli.ts +271 -0
- package/src/components/breakpoint/__tests__/breakpoint-approval.test.tsx +212 -0
- package/src/components/breakpoint/__tests__/breakpoint-panel.test.tsx +130 -0
- package/src/components/breakpoint/__tests__/file-preview.test.tsx +313 -0
- package/src/components/breakpoint/breakpoint-approval.tsx +138 -0
- package/src/components/breakpoint/breakpoint-panel.tsx +95 -0
- package/src/components/breakpoint/file-preview.tsx +215 -0
- package/src/components/dashboard/.gitkeep +0 -0
- package/src/components/dashboard/__tests__/breakpoint-banner.test.tsx +177 -0
- package/src/components/dashboard/__tests__/catch-up-banner.test.tsx +141 -0
- package/src/components/dashboard/__tests__/executive-summary-banner.test.tsx +164 -0
- package/src/components/dashboard/__tests__/kpi-grid.test.tsx +101 -0
- package/src/components/dashboard/__tests__/pagination-controls.test.tsx +125 -0
- package/src/components/dashboard/__tests__/project-accordion.test.tsx +97 -0
- package/src/components/dashboard/__tests__/project-list-view.test.tsx +174 -0
- package/src/components/dashboard/__tests__/project-search-input.test.tsx +110 -0
- package/src/components/dashboard/__tests__/project-section-header.test.tsx +91 -0
- package/src/components/dashboard/__tests__/project-section.test.tsx +151 -0
- package/src/components/dashboard/__tests__/run-card.test.tsx +164 -0
- package/src/components/dashboard/__tests__/run-filter-bar.test.tsx +109 -0
- package/src/components/dashboard/__tests__/run-list.test.tsx +123 -0
- package/src/components/dashboard/__tests__/search-filter.test.tsx +150 -0
- package/src/components/dashboard/__tests__/virtualized-run-list.test.tsx +179 -0
- package/src/components/dashboard/breakpoint-banner.tsx +301 -0
- package/src/components/dashboard/catch-up-banner.tsx +88 -0
- package/src/components/dashboard/executive-summary-banner.tsx +174 -0
- package/src/components/dashboard/global-search.tsx +323 -0
- package/src/components/dashboard/kpi-grid.tsx +140 -0
- package/src/components/dashboard/pagination-controls.tsx +100 -0
- package/src/components/dashboard/project-accordion.tsx +72 -0
- package/src/components/dashboard/project-health-card.tsx +536 -0
- package/src/components/dashboard/project-list-view.tsx +246 -0
- package/src/components/dashboard/project-search-input.tsx +41 -0
- package/src/components/dashboard/project-section-header.tsx +73 -0
- package/src/components/dashboard/project-section.tsx +89 -0
- package/src/components/dashboard/run-card.tsx +218 -0
- package/src/components/dashboard/run-filter-bar.tsx +100 -0
- package/src/components/dashboard/run-list.tsx +77 -0
- package/src/components/dashboard/search-filter.tsx +69 -0
- package/src/components/dashboard/virtualized-run-list.tsx +130 -0
- package/src/components/details/.gitkeep +0 -0
- package/src/components/details/__tests__/agent-panel.test.tsx +236 -0
- package/src/components/details/__tests__/json-tree.test.tsx +347 -0
- package/src/components/details/__tests__/log-viewer.test.tsx +168 -0
- package/src/components/details/__tests__/task-detail.test.tsx +212 -0
- package/src/components/details/__tests__/timing-panel.test.tsx +271 -0
- package/src/components/details/agent-panel.tsx +234 -0
- package/src/components/details/json-tree/categorize.ts +131 -0
- package/src/components/details/json-tree/index.tsx +120 -0
- package/src/components/details/json-tree/json-node.tsx +223 -0
- package/src/components/details/json-tree/smart-summary.tsx +596 -0
- package/src/components/details/json-tree/tree-controls.tsx +47 -0
- package/src/components/details/json-tree.tsx +9 -0
- package/src/components/details/log-viewer.tsx +140 -0
- package/src/components/details/task-detail.tsx +114 -0
- package/src/components/details/timing-panel.tsx +247 -0
- package/src/components/events/.gitkeep +0 -0
- package/src/components/events/__tests__/event-item.test.tsx +211 -0
- package/src/components/events/__tests__/event-stream.test.tsx +225 -0
- package/src/components/events/event-item.tsx +121 -0
- package/src/components/events/event-stream.tsx +260 -0
- package/src/components/notifications/.gitkeep +0 -0
- package/src/components/notifications/__tests__/notification-panel.test.tsx +287 -0
- package/src/components/notifications/__tests__/notification-provider.test.tsx +585 -0
- package/src/components/notifications/__tests__/toast-stack.test.tsx +217 -0
- package/src/components/notifications/notification-panel.tsx +124 -0
- package/src/components/notifications/notification-provider.tsx +175 -0
- package/src/components/notifications/toast-stack.tsx +75 -0
- package/src/components/pipeline/.gitkeep +0 -0
- package/src/components/pipeline/__tests__/parallel-group.test.tsx +88 -0
- package/src/components/pipeline/__tests__/pipeline-view.test.tsx +345 -0
- package/src/components/pipeline/__tests__/step-card.test.tsx +330 -0
- package/src/components/pipeline/parallel-group.tsx +39 -0
- package/src/components/pipeline/pipeline-view.tsx +197 -0
- package/src/components/pipeline/step-card.tsx +166 -0
- package/src/components/providers/event-stream-provider.tsx +29 -0
- package/src/components/providers.tsx +24 -0
- package/src/components/shared/.gitkeep +0 -0
- package/src/components/shared/__tests__/empty-state.test.tsx +49 -0
- package/src/components/shared/__tests__/friendly-id.test.tsx +47 -0
- package/src/components/shared/__tests__/kbd.test.tsx +45 -0
- package/src/components/shared/__tests__/kind-badge.test.tsx +71 -0
- package/src/components/shared/__tests__/metrics-row.test.tsx +74 -0
- package/src/components/shared/__tests__/outcome-banner.test.tsx +71 -0
- package/src/components/shared/__tests__/progress-bar.test.tsx +89 -0
- package/src/components/shared/__tests__/session-pill.test.tsx +62 -0
- package/src/components/shared/__tests__/settings-modal.test.tsx +201 -0
- package/src/components/shared/__tests__/shortcuts-help.test.tsx +103 -0
- package/src/components/shared/__tests__/status-badge.test.tsx +98 -0
- package/src/components/shared/__tests__/theme-provider.test.tsx +100 -0
- package/src/components/shared/__tests__/truncated-id.test.tsx +53 -0
- package/src/components/shared/app-footer.tsx +80 -0
- package/src/components/shared/app-header.tsx +160 -0
- package/src/components/shared/empty-state.tsx +18 -0
- package/src/components/shared/error-boundary.tsx +81 -0
- package/src/components/shared/friendly-id.tsx +48 -0
- package/src/components/shared/kbd.tsx +15 -0
- package/src/components/shared/kind-badge.tsx +51 -0
- package/src/components/shared/metrics-row.tsx +106 -0
- package/src/components/shared/outcome-banner.tsx +56 -0
- package/src/components/shared/progress-bar.tsx +42 -0
- package/src/components/shared/session-pill.tsx +69 -0
- package/src/components/shared/settings-modal.tsx +509 -0
- package/src/components/shared/shortcuts-help.tsx +113 -0
- package/src/components/shared/status-badge.tsx +110 -0
- package/src/components/shared/theme-provider.tsx +46 -0
- package/src/components/shared/truncated-id.tsx +51 -0
- package/src/components/ui/.gitkeep +0 -0
- package/src/components/ui/__tests__/accordion.test.tsx +96 -0
- package/src/components/ui/__tests__/badge.test.tsx +69 -0
- package/src/components/ui/__tests__/button.test.tsx +113 -0
- package/src/components/ui/__tests__/tabs.test.tsx +75 -0
- package/src/components/ui/__tests__/tooltip.test.tsx +90 -0
- package/src/components/ui/accordion.tsx +61 -0
- package/src/components/ui/badge.tsx +25 -0
- package/src/components/ui/button.tsx +40 -0
- package/src/components/ui/card.tsx +21 -0
- package/src/components/ui/scroll-area.tsx +35 -0
- package/src/components/ui/separator.tsx +24 -0
- package/src/components/ui/tabs.tsx +64 -0
- package/src/components/ui/tooltip.tsx +37 -0
- package/src/hooks/.gitkeep +0 -0
- package/src/hooks/__tests__/use-animated-number.test.ts +184 -0
- package/src/hooks/__tests__/use-batched-updates.test.ts +315 -0
- package/src/hooks/__tests__/use-event-stream.test.ts +243 -0
- package/src/hooks/__tests__/use-keyboard.test.ts +217 -0
- package/src/hooks/__tests__/use-notifications.test.ts +230 -0
- package/src/hooks/__tests__/use-polling.test.ts +274 -0
- package/src/hooks/__tests__/use-project-runs.test.ts +163 -0
- package/src/hooks/__tests__/use-projects.test.ts +248 -0
- package/src/hooks/__tests__/use-run-dashboard.test.ts +168 -0
- package/src/hooks/__tests__/use-run-detail.test.ts +273 -0
- package/src/hooks/__tests__/use-smart-polling.test.ts +305 -0
- package/src/hooks/use-animated-number.ts +87 -0
- package/src/hooks/use-batched-updates.ts +150 -0
- package/src/hooks/use-event-stream.ts +150 -0
- package/src/hooks/use-keyboard.ts +45 -0
- package/src/hooks/use-notifications.ts +82 -0
- package/src/hooks/use-persisted-state.ts +60 -0
- package/src/hooks/use-polling.ts +60 -0
- package/src/hooks/use-project-runs.ts +51 -0
- package/src/hooks/use-projects.ts +26 -0
- package/src/hooks/use-run-dashboard.ts +207 -0
- package/src/hooks/use-run-detail.ts +77 -0
- package/src/hooks/use-smart-polling.ts +144 -0
- package/src/lib/.gitkeep +0 -0
- package/src/lib/__tests__/cn.test.ts +69 -0
- package/src/lib/__tests__/config-loader.test.ts +210 -0
- package/src/lib/__tests__/config.test.ts +561 -0
- package/src/lib/__tests__/error-handler.test.ts +143 -0
- package/src/lib/__tests__/fetcher.test.ts +517 -0
- package/src/lib/__tests__/global-registry.test.ts +214 -0
- package/src/lib/__tests__/parser.test.ts +1532 -0
- package/src/lib/__tests__/path-resolver.test.ts +112 -0
- package/src/lib/__tests__/run-cache.test.ts +591 -0
- package/src/lib/__tests__/server-init.test.ts +512 -0
- package/src/lib/__tests__/source-discovery.test.ts +246 -0
- package/src/lib/__tests__/utils.test.ts +160 -0
- package/src/lib/__tests__/watcher.test.ts +227 -0
- package/src/lib/cn.ts +6 -0
- package/src/lib/config-loader.ts +195 -0
- package/src/lib/config.ts +20 -0
- package/src/lib/error-handler.ts +76 -0
- package/src/lib/fetcher.ts +394 -0
- package/src/lib/global-registry.ts +117 -0
- package/src/lib/parser.ts +794 -0
- package/src/lib/path-resolver.ts +16 -0
- package/src/lib/run-cache.ts +404 -0
- package/src/lib/server-init.ts +226 -0
- package/src/lib/services/__tests__/run-query-service.test.ts +819 -0
- package/src/lib/services/run-query-service.ts +286 -0
- package/src/lib/source-discovery.ts +216 -0
- package/src/lib/utils.ts +103 -0
- package/src/lib/watcher.ts +265 -0
- package/src/test/fixtures.ts +269 -0
- package/src/test/mocks/handlers.ts +110 -0
- package/src/test/mocks/server.ts +17 -0
- package/src/test/setup.ts +200 -0
- package/src/test/test-utils.tsx +36 -0
- package/src/types/.gitkeep +0 -0
- package/src/types/breakpoint.ts +17 -0
- package/src/types/index.ts +214 -0
- 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 " 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
|
+
});
|