@claudeye/linux-arm64 1.0.7 → 1.0.8
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/assets/dist/hooks-api.d.ts +43 -0
- package/assets/dist/hooks-api.js +1 -0
- package/assets/dist/index.d.ts +2 -0
- package/assets/dist/index.js +1 -1
- package/assets/dist/loader.js +2 -2
- package/assets/standalone/.next/BUILD_ID +1 -1
- package/assets/standalone/.next/app-path-routes-manifest.json +2 -1
- package/assets/standalone/.next/build-manifest.json +8 -8
- package/assets/standalone/.next/prerender-manifest.json +27 -3
- package/assets/standalone/.next/routes-manifest.json +12 -6
- package/assets/standalone/.next/server/app/_global-error/page/build-manifest.json +5 -5
- package/assets/standalone/.next/server/app/_global-error/page/server-reference-manifest.json +14 -1
- package/assets/standalone/.next/server/app/_global-error/page.js +5 -5
- package/assets/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
- package/assets/standalone/.next/server/app/_global-error.html +1 -1
- package/assets/standalone/.next/server/app/_global-error.rsc +7 -7
- package/assets/standalone/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +2 -2
- package/assets/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +7 -7
- package/assets/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +3 -3
- package/assets/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +3 -3
- package/assets/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/assets/standalone/.next/server/app/_not-found/page/build-manifest.json +5 -5
- package/assets/standalone/.next/server/app/_not-found/page/server-reference-manifest.json +2 -2
- package/assets/standalone/.next/server/app/_not-found/page.js +6 -7
- package/assets/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/assets/standalone/.next/server/app/_not-found.html +2 -2
- package/assets/standalone/.next/server/app/_not-found.rsc +27 -30
- package/assets/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +27 -30
- package/assets/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +4 -4
- package/assets/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +12 -15
- package/assets/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +2 -2
- package/assets/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +3 -3
- package/assets/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
- package/assets/standalone/.next/server/app/api/completed-history/route.js +2 -2
- package/assets/standalone/.next/server/app/api/download/[project]/[session]/route.js +1 -1
- package/assets/standalone/.next/server/app/api/queue-item/route.js +2 -2
- package/assets/standalone/.next/server/app/api/queue-status/route.js +2 -2
- package/assets/standalone/.next/server/app/dashboard/[viewName]/page/build-manifest.json +5 -5
- package/assets/standalone/.next/server/app/dashboard/[viewName]/page/server-reference-manifest.json +5 -5
- package/assets/standalone/.next/server/app/dashboard/[viewName]/page.js +8 -9
- package/assets/standalone/.next/server/app/dashboard/[viewName]/page_client-reference-manifest.js +1 -1
- package/assets/standalone/.next/server/app/dashboard/page/build-manifest.json +5 -5
- package/assets/standalone/.next/server/app/dashboard/page/server-reference-manifest.json +5 -5
- package/assets/standalone/.next/server/app/dashboard/page.js +9 -10
- package/assets/standalone/.next/server/app/dashboard/page_client-reference-manifest.js +1 -1
- package/assets/standalone/.next/server/app/index.html +1 -0
- package/assets/standalone/.next/server/app/index.meta +15 -0
- package/assets/standalone/.next/server/app/index.rsc +22 -0
- package/assets/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +6 -0
- package/assets/standalone/.next/server/app/index.segments/_full.segment.rsc +22 -0
- package/assets/standalone/.next/server/app/index.segments/_head.segment.rsc +6 -0
- package/assets/standalone/.next/server/app/index.segments/_index.segment.rsc +12 -0
- package/assets/standalone/.next/server/app/index.segments/_tree.segment.rsc +2 -0
- package/assets/standalone/.next/server/app/login/page/build-manifest.json +5 -5
- package/assets/standalone/.next/server/app/login/page/server-reference-manifest.json +3 -3
- package/assets/standalone/.next/server/app/login/page.js +6 -7
- package/assets/standalone/.next/server/app/login/page_client-reference-manifest.js +1 -1
- package/assets/standalone/.next/server/app/login.html +2 -2
- package/assets/standalone/.next/server/app/login.rsc +30 -34
- package/assets/standalone/.next/server/app/login.segments/_full.segment.rsc +30 -34
- package/assets/standalone/.next/server/app/login.segments/_head.segment.rsc +4 -4
- package/assets/standalone/.next/server/app/login.segments/_index.segment.rsc +12 -15
- package/assets/standalone/.next/server/app/login.segments/_tree.segment.rsc +2 -2
- package/assets/standalone/.next/server/app/login.segments/login/__PAGE__.segment.rsc +4 -4
- package/assets/standalone/.next/server/app/login.segments/login.segment.rsc +3 -3
- package/assets/standalone/.next/server/app/page/build-manifest.json +5 -5
- package/assets/standalone/.next/server/app/page/server-reference-manifest.json +2 -2
- package/assets/standalone/.next/server/app/page.js +7 -8
- package/assets/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
- package/assets/standalone/.next/server/app/policies/page/app-paths-manifest.json +3 -0
- package/assets/standalone/.next/server/app/{hooks → policies}/page/build-manifest.json +5 -5
- package/assets/standalone/.next/server/app/{hooks → policies}/page/server-reference-manifest.json +36 -24
- package/assets/standalone/.next/server/app/{hooks → policies}/page.js +9 -10
- package/assets/standalone/.next/server/app/policies/page_client-reference-manifest.js +3 -0
- package/assets/standalone/.next/server/app/project/[name]/page/build-manifest.json +5 -5
- package/assets/standalone/.next/server/app/project/[name]/page/server-reference-manifest.json +2 -2
- package/assets/standalone/.next/server/app/project/[name]/page.js +7 -9
- package/assets/standalone/.next/server/app/project/[name]/page_client-reference-manifest.js +1 -1
- package/assets/standalone/.next/server/app/project/[name]/session/[sessionId]/page/build-manifest.json +5 -5
- package/assets/standalone/.next/server/app/project/[name]/session/[sessionId]/page/react-loadable-manifest.json +2 -2
- package/assets/standalone/.next/server/app/project/[name]/session/[sessionId]/page/server-reference-manifest.json +10 -10
- package/assets/standalone/.next/server/app/project/[name]/session/[sessionId]/page.js +8 -9
- package/assets/standalone/.next/server/app/project/[name]/session/[sessionId]/page_client-reference-manifest.js +1 -1
- package/assets/standalone/.next/server/app/projects/page/app-paths-manifest.json +3 -0
- package/assets/standalone/.next/server/app/projects/page/build-manifest.json +18 -0
- package/assets/standalone/.next/server/app/projects/page/next-font-manifest.json +6 -0
- package/assets/standalone/.next/server/app/projects/page/react-loadable-manifest.json +1 -0
- package/assets/standalone/.next/server/app/projects/page/server-reference-manifest.json +29 -0
- package/assets/standalone/.next/server/app/projects/page.js +18 -0
- package/assets/standalone/.next/server/app/projects/page_client-reference-manifest.js +3 -0
- package/assets/standalone/.next/server/app/queue/page/build-manifest.json +5 -5
- package/assets/standalone/.next/server/app/queue/page/server-reference-manifest.json +4 -4
- package/assets/standalone/.next/server/app/queue/page.js +8 -9
- package/assets/standalone/.next/server/app/queue/page_client-reference-manifest.js +1 -1
- package/assets/standalone/.next/server/app-paths-manifest.json +2 -1
- package/assets/standalone/.next/server/chunks/[root-of-the-server]__0-_qfa9._.js +1 -1
- package/assets/standalone/.next/server/chunks/[root-of-the-server]__0.lwwrp._.js +3 -0
- package/assets/standalone/.next/server/chunks/[root-of-the-server]__072w.g0._.js +1 -1
- package/assets/standalone/.next/server/chunks/[root-of-the-server]__08lgurx._.js +1 -1
- package/assets/standalone/.next/server/chunks/[root-of-the-server]__0bps8pa._.js +1 -1
- package/assets/standalone/.next/server/chunks/[root-of-the-server]__0f_5ws6._.js +1 -1
- package/assets/standalone/.next/server/chunks/[root-of-the-server]__0g72weg._.js +1 -1
- package/assets/standalone/.next/server/chunks/[root-of-the-server]__0ld-~9t._.js +1 -1
- package/assets/standalone/.next/server/chunks/[root-of-the-server]__0ndqa7s._.js +8 -3
- package/assets/standalone/.next/server/chunks/{[root-of-the-server]__0wkrejt._.js → [root-of-the-server]__0rtkhr~._.js} +1 -1
- package/assets/standalone/.next/server/chunks/{[root-of-the-server]__031vvrp._.js → [root-of-the-server]__0tlbu6c._.js} +1 -1
- package/assets/standalone/.next/server/chunks/[root-of-the-server]__0vfmej5._.js +4 -0
- package/assets/standalone/.next/server/chunks/_04cgd3m._.js +11 -0
- package/assets/standalone/.next/server/chunks/_0aylu-q._.js +2 -2
- package/assets/standalone/.next/server/chunks/_0h9z2~x._.js +11 -0
- package/assets/standalone/.next/server/chunks/_0lq2_wn._.js +2 -2
- package/assets/standalone/.next/server/chunks/_0oqawqx._.js +2 -2
- package/assets/standalone/.next/server/chunks/_0vt409y._.js +2 -2
- package/assets/standalone/.next/server/chunks/lib_0a9kq7-._.js +11 -0
- package/assets/standalone/.next/server/chunks/lib_0b2.9p5._.js +11 -0
- package/assets/standalone/.next/server/chunks/lib_13x.g8a._.js +11 -0
- package/assets/standalone/.next/server/chunks/lib_eval-queue_ts_08t8vgq._.js +1 -1
- package/assets/standalone/.next/server/chunks/lib_eval-queue_ts_0h8e7f.._.js +1 -1
- package/assets/standalone/.next/server/chunks/node_modules_next_dist_esm_build_templates_app-route_0l15kkr.js +1 -1
- package/assets/standalone/.next/server/chunks/package_json_[json]_cjs_0z7w.hh._.js +1 -1
- package/assets/standalone/.next/server/chunks/ssr/[root-of-the-server]__0-_oq51._.js +4 -0
- package/assets/standalone/.next/server/chunks/ssr/[root-of-the-server]__0-om19y._.js +11 -0
- package/assets/standalone/.next/server/chunks/ssr/[root-of-the-server]__0-wbic0._.js +45 -0
- package/assets/standalone/.next/server/chunks/ssr/[root-of-the-server]__02l2rag._.js +3 -0
- package/assets/standalone/.next/server/chunks/ssr/[root-of-the-server]__04qo1w2._.js +4 -0
- package/assets/standalone/.next/server/chunks/ssr/[root-of-the-server]__07ifmkx._.js +3 -0
- package/assets/standalone/.next/server/chunks/ssr/[root-of-the-server]__09y6src._.js +4 -0
- package/assets/standalone/.next/server/chunks/ssr/[root-of-the-server]__09y7ni.._.js +3 -0
- package/assets/standalone/.next/server/chunks/ssr/[root-of-the-server]__0bubgf_._.js +4 -0
- package/assets/standalone/.next/server/chunks/ssr/{[root-of-the-server]__0l897tw._.js → [root-of-the-server]__0iv48_z._.js} +2 -2
- package/assets/standalone/.next/server/chunks/ssr/[root-of-the-server]__0j7bj94._.js +3 -0
- package/assets/standalone/.next/server/chunks/ssr/[root-of-the-server]__0m0x9dt._.js +4 -0
- package/assets/standalone/.next/server/chunks/ssr/[root-of-the-server]__0oy2.6r._.js +3 -0
- package/assets/standalone/.next/server/chunks/ssr/[root-of-the-server]__0pw0g9c._.js +4 -0
- package/assets/standalone/.next/server/chunks/ssr/[root-of-the-server]__0rm4qtt._.js +4 -0
- package/assets/standalone/.next/server/chunks/ssr/[root-of-the-server]__0sn21jm._.js +3 -0
- package/assets/standalone/.next/server/chunks/ssr/[root-of-the-server]__0spfsp5._.js +4 -0
- package/assets/standalone/.next/server/chunks/ssr/[root-of-the-server]__0sq7snp._.js +3 -0
- package/assets/standalone/.next/server/chunks/ssr/[root-of-the-server]__0uz88bg._.js +3 -0
- package/assets/standalone/.next/server/chunks/ssr/[root-of-the-server]__0x7-awk._.js +4 -0
- package/assets/standalone/.next/server/chunks/ssr/[root-of-the-server]__0zva2n_._.js +4 -0
- package/assets/standalone/.next/server/chunks/ssr/[root-of-the-server]__1370kzv._.js +4 -0
- package/assets/standalone/.next/server/chunks/ssr/_02_tcps._.js +32 -0
- package/assets/standalone/.next/server/chunks/ssr/_04.u7zx._.js +3 -0
- package/assets/standalone/.next/server/chunks/ssr/_06383ya._.js +3 -0
- package/assets/standalone/.next/server/chunks/ssr/_0kfjwwu._.js +1 -1
- package/assets/standalone/.next/server/chunks/ssr/_0km.fsf._.js +3 -0
- package/assets/standalone/.next/server/chunks/ssr/_0x26hbi._.js +3 -0
- package/assets/standalone/.next/server/chunks/ssr/{_0_ia8tm._.js → _0xg44oj._.js} +2 -2
- package/assets/standalone/.next/server/chunks/ssr/_11ou~_x._.js +3 -0
- package/assets/standalone/.next/server/chunks/ssr/app_04qfs8z._.js +1 -1
- package/assets/standalone/.next/server/chunks/ssr/app_05evmdg._.js +1 -1
- package/assets/standalone/.next/server/chunks/ssr/app_07izk21._.js +1 -1
- package/assets/standalone/.next/server/chunks/ssr/app_0uosk1e._.js +1 -1
- package/assets/standalone/.next/server/chunks/ssr/app_13f0ohr._.js +1 -1
- package/assets/standalone/.next/server/chunks/ssr/app_actions_compute-dashboard_ts_13cb_9d._.js +1 -1
- package/assets/standalone/.next/server/chunks/ssr/app_global-error_tsx_0m9qisk._.js +3 -0
- package/assets/standalone/.next/server/chunks/ssr/app_global-error_tsx_0xerkr6._.js +3 -0
- package/assets/standalone/.next/server/chunks/ssr/app_login_page_tsx_0z71ad3._.js +1 -1
- package/assets/standalone/.next/server/chunks/ssr/app_policies_hooks-client_tsx_0q-m0y-._.js +8 -0
- package/assets/standalone/.next/server/chunks/ssr/{app_loading_tsx_05semg5._.js → app_projects_loading_tsx_13veom4._.js} +2 -2
- package/assets/standalone/.next/server/chunks/ssr/app_queue_queue-client_tsx_0c0olxv._.js +1 -1
- package/assets/standalone/.next/server/chunks/ssr/node_modules_next_dist_0~3yv~8._.js +3 -0
- package/assets/standalone/.next/server/chunks/ssr/{node_modules_next_dist_esm_build_templates_app-page_0s-cxl7.js → node_modules_next_dist_esm_build_templates_app-page_06pwt.d.js} +3 -3
- package/assets/standalone/.next/server/chunks/ssr/{node_modules_next_dist_esm_build_templates_app-page_0j.ij4e.js → node_modules_next_dist_esm_build_templates_app-page_091vo_-.js} +3 -3
- package/assets/standalone/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_0a_7sdg.js +4 -0
- package/assets/standalone/.next/server/chunks/ssr/{node_modules_next_dist_esm_build_templates_app-page_0blr8v-.js → node_modules_next_dist_esm_build_templates_app-page_0ef3uwk.js} +3 -3
- package/assets/standalone/.next/server/chunks/ssr/{node_modules_next_dist_esm_build_templates_app-page_0_4obh1.js → node_modules_next_dist_esm_build_templates_app-page_0ft_6~o.js} +3 -3
- package/assets/standalone/.next/server/chunks/ssr/{node_modules_next_dist_esm_build_templates_app-page_0rc3ul_.js → node_modules_next_dist_esm_build_templates_app-page_0j79~gv.js} +3 -3
- package/assets/standalone/.next/server/chunks/ssr/{node_modules_next_dist_esm_build_templates_app-page_0za6ylf.js → node_modules_next_dist_esm_build_templates_app-page_0pbja1x.js} +3 -3
- package/assets/standalone/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_0r6o0i2.js +4 -0
- package/assets/standalone/.next/server/chunks/ssr/{node_modules_next_dist_esm_build_templates_app-page_13mo15i.js → node_modules_next_dist_esm_build_templates_app-page_0w9nerp.js} +3 -3
- package/assets/standalone/.next/server/chunks/ssr/{node_modules_next_dist_esm_build_templates_app-page_0xv8hin.js → node_modules_next_dist_esm_build_templates_app-page_11y81~_.js} +3 -3
- package/assets/standalone/.next/server/chunks/ssr/{node_modules_next_dist_esm_build_templates_app-page_0cmo95h.js → node_modules_next_dist_esm_build_templates_app-page_12or2kf.js} +3 -3
- package/assets/standalone/.next/server/middleware-build-manifest.js +8 -8
- package/assets/standalone/.next/server/pages/404.html +2 -2
- package/assets/standalone/.next/server/pages/500.html +1 -1
- package/assets/standalone/.next/server/server-reference-manifest.js +1 -1
- package/assets/standalone/.next/server/server-reference-manifest.json +82 -52
- package/assets/standalone/.next/static/chunks/0.~t6_2r7n04x.js +4 -0
- package/assets/standalone/.next/static/chunks/01q52wg_amm60.js +2 -0
- package/assets/standalone/.next/static/chunks/07tkt19hty~w~.js +1 -0
- package/assets/standalone/.next/static/chunks/08eqdulekk8l-.js +1 -0
- package/assets/standalone/.next/static/chunks/0_s0luks5tay-.js +1 -0
- package/assets/standalone/.next/static/chunks/0c0j9cso1kkr_.css +1 -0
- package/assets/standalone/.next/static/chunks/0dji_r0j6sq~f.js +1 -0
- package/assets/standalone/.next/static/chunks/0h2.~bz5i.4.g.js +1 -0
- package/assets/standalone/.next/static/chunks/0l8ej7oju~.oy.js +1 -0
- package/assets/standalone/.next/static/chunks/{053grpfc7gghs.js → 0nc3no0r1i66_.js} +1 -1
- package/assets/standalone/.next/static/chunks/0tp7ck~nhe8-g.js +3 -0
- package/assets/standalone/.next/static/chunks/0tyw4u3~2isbh.js +1 -0
- package/assets/standalone/.next/static/chunks/{0h4bq73pogmtb.js → 0u95dh6lcl7tm.js} +31 -1
- package/assets/standalone/.next/static/chunks/0y8d5uz5f1m~..js +6 -0
- package/assets/standalone/.next/static/chunks/10qr1cqizt~sp.js +1 -0
- package/assets/standalone/.next/static/chunks/{0lkh25hviflid.js → 11nnvwnj7e__0.js} +1 -1
- package/assets/standalone/.next/static/chunks/14trwlfhtz63l.js +1 -0
- package/assets/standalone/.next/static/chunks/{04aem330ymbdp.js → 150i0n26fnvso.js} +1 -1
- package/assets/standalone/.next/static/chunks/15fklyav5py5m.js +1 -0
- package/assets/standalone/.next/static/chunks/162jxog7oodad.js +1 -0
- package/assets/standalone/.next/static/chunks/17.b3suj8zjjj.js +1 -0
- package/assets/standalone/.next/static/chunks/{turbopack-05k-ytyhplqy7.js → turbopack-0.w3uhj.ln7pt.js} +1 -1
- package/assets/standalone/README.md +119 -5
- package/assets/standalone/design-docs/custom-hooks.md +722 -0
- package/assets/standalone/design-docs/e2e-hook-testing.md +420 -0
- package/assets/standalone/package.json +4 -2
- package/assets/standalone/vitest.config.e2e.mts +21 -0
- package/bin/claudeye +0 -0
- package/package.json +1 -1
- package/assets/standalone/.next/server/app/hooks/page/app-paths-manifest.json +0 -3
- package/assets/standalone/.next/server/app/hooks/page_client-reference-manifest.js +0 -3
- package/assets/standalone/.next/server/chunks/[root-of-the-server]__0_03u6.._.js +0 -4
- package/assets/standalone/.next/server/chunks/[root-of-the-server]__0ynza7q._.js +0 -3
- package/assets/standalone/.next/server/chunks/_0fx1kj9._.js +0 -7
- package/assets/standalone/.next/server/chunks/_12qi01p._.js +0 -7
- package/assets/standalone/.next/server/chunks/lib_0it0qxy._.js +0 -7
- package/assets/standalone/.next/server/chunks/lib_0k3u5ri._.js +0 -7
- package/assets/standalone/.next/server/chunks/ssr/[root-of-the-server]__0-j~_e.._.js +0 -3
- package/assets/standalone/.next/server/chunks/ssr/[root-of-the-server]__00fve8g._.js +0 -36
- package/assets/standalone/.next/server/chunks/ssr/[root-of-the-server]__028-6zz._.js +0 -3
- package/assets/standalone/.next/server/chunks/ssr/[root-of-the-server]__02x4-91._.js +0 -4
- package/assets/standalone/.next/server/chunks/ssr/[root-of-the-server]__06tqxbp._.js +0 -4
- package/assets/standalone/.next/server/chunks/ssr/[root-of-the-server]__08a4wva._.js +0 -3
- package/assets/standalone/.next/server/chunks/ssr/[root-of-the-server]__0a-4fjm._.js +0 -33
- package/assets/standalone/.next/server/chunks/ssr/[root-of-the-server]__0cnf9rp._.js +0 -3
- package/assets/standalone/.next/server/chunks/ssr/[root-of-the-server]__0dsucx_._.js +0 -4
- package/assets/standalone/.next/server/chunks/ssr/[root-of-the-server]__0e9ohz2._.js +0 -4
- package/assets/standalone/.next/server/chunks/ssr/[root-of-the-server]__0fltiz1._.js +0 -4
- package/assets/standalone/.next/server/chunks/ssr/[root-of-the-server]__0ksoh6e._.js +0 -3
- package/assets/standalone/.next/server/chunks/ssr/[root-of-the-server]__0ni-as.._.js +0 -4
- package/assets/standalone/.next/server/chunks/ssr/[root-of-the-server]__0tsew7c._.js +0 -4
- package/assets/standalone/.next/server/chunks/ssr/[root-of-the-server]__0x5abxa._.js +0 -3
- package/assets/standalone/.next/server/chunks/ssr/[root-of-the-server]__0yi-883._.js +0 -4
- package/assets/standalone/.next/server/chunks/ssr/[root-of-the-server]__0zn.1q2._.js +0 -3
- package/assets/standalone/.next/server/chunks/ssr/[root-of-the-server]__10_wjge._.js +0 -4
- package/assets/standalone/.next/server/chunks/ssr/[root-of-the-server]__11xi38p._.js +0 -7
- package/assets/standalone/.next/server/chunks/ssr/_03l0_j6._.js +0 -3
- package/assets/standalone/.next/server/chunks/ssr/_050qnuh._.js +0 -3
- package/assets/standalone/.next/server/chunks/ssr/_0_~1-jh._.js +0 -3
- package/assets/standalone/.next/server/chunks/ssr/_0ndt7tj._.js +0 -3
- package/assets/standalone/.next/server/chunks/ssr/_0uig1kl._.js +0 -3
- package/assets/standalone/.next/server/chunks/ssr/_0vc9nu-._.js +0 -32
- package/assets/standalone/.next/server/chunks/ssr/_next-internal_server_app__global-error_page_actions_0k77kol.js +0 -3
- package/assets/standalone/.next/server/chunks/ssr/app_hooks_hooks-client_tsx_0n~.yoz._.js +0 -3
- package/assets/standalone/.next/server/chunks/ssr/node_modules_0gyjybr._.js +0 -3
- package/assets/standalone/.next/server/chunks/ssr/node_modules_next_dist_client_components_06j6hww._.js +0 -33
- package/assets/standalone/.next/server/chunks/ssr/node_modules_next_dist_client_components_builtin_global-error_0lgvd_..js +0 -3
- package/assets/standalone/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_0~flnue.js +0 -4
- package/assets/standalone/.next/static/chunks/0-06jeyuuf3mf.js +0 -1
- package/assets/standalone/.next/static/chunks/0.z9o1xk80npg.js +0 -2
- package/assets/standalone/.next/static/chunks/01xlw8hd842-c.js +0 -1
- package/assets/standalone/.next/static/chunks/09f624.buk6jr.js +0 -1
- package/assets/standalone/.next/static/chunks/0g5cvlv5.8drd.js +0 -3
- package/assets/standalone/.next/static/chunks/0g~w.4hiyi_1j.js +0 -1
- package/assets/standalone/.next/static/chunks/0il8_19l.4u-p.js +0 -1
- package/assets/standalone/.next/static/chunks/0j1-mgai_b50s.css +0 -1
- package/assets/standalone/.next/static/chunks/0ljjv.c03-d.y.js +0 -1
- package/assets/standalone/.next/static/chunks/0n6vo_gsuay4v.js +0 -4
- package/assets/standalone/.next/static/chunks/0nntcr2py4m14.js +0 -1
- package/assets/standalone/.next/static/chunks/0sp_gwqc7ka~z.js +0 -1
- package/assets/standalone/.next/static/chunks/0z0dljl8fz7.-.js +0 -1
- package/assets/standalone/.next/static/chunks/0z9fpf50h7mcq.js +0 -1
- package/assets/standalone/.next/static/chunks/115dplafwys-z.js +0 -31
- package/assets/standalone/.next/static/chunks/119bhqt_bddam.js +0 -1
- /package/assets/standalone/.next/server/app/{hooks → policies}/page/next-font-manifest.json +0 -0
- /package/assets/standalone/.next/server/app/{hooks → policies}/page/react-loadable-manifest.json +0 -0
- /package/assets/standalone/.next/static/{l1G516WtxNj1aLrIr5STH → 5FBEWHgw7h8OR_JoJzccY}/_buildManifest.js +0 -0
- /package/assets/standalone/.next/static/{l1G516WtxNj1aLrIr5STH → 5FBEWHgw7h8OR_JoJzccY}/_clientMiddlewareManifest.js +0 -0
- /package/assets/standalone/.next/static/{l1G516WtxNj1aLrIr5STH → 5FBEWHgw7h8OR_JoJzccY}/_ssgManifest.js +0 -0
|
@@ -0,0 +1,420 @@
|
|
|
1
|
+
STATUS: COMPLETED
|
|
2
|
+
|
|
3
|
+
# E2E Hook Testing System for CI
|
|
4
|
+
|
|
5
|
+
## Problem / Motivation
|
|
6
|
+
|
|
7
|
+
Claudeye's hook tests are unit tests that mock heavily — `hooks-config`, `builtin-policies`, `policy-evaluator`, `custom-hooks-loader`, etc. are all faked out. This means:
|
|
8
|
+
|
|
9
|
+
- Policy logic is tested in isolation, but the **full integration path** (stdin → config load → policy eval → stdout) is never exercised
|
|
10
|
+
- Config scope merging, custom hook loading, param injection, and decision formatting are all tested separately but never together
|
|
11
|
+
- Build regressions (e.g., binary compilation breaking hook dispatch) go undetected until a user reports them
|
|
12
|
+
|
|
13
|
+
We need a suite of **end-to-end tests** that invoke `claudeye --hook <event>` as a real subprocess — exactly as Claude Code does — and assert on the actual stdout output and exit codes. No mocking. No Claude needed. Just stdin/stdout.
|
|
14
|
+
|
|
15
|
+
## Goals & Non-Goals
|
|
16
|
+
|
|
17
|
+
**Goals:**
|
|
18
|
+
- Invoke the real compiled npm package binary (same one users get via `npx claudeye`)
|
|
19
|
+
- Assert on exact stdout JSON shape and exit codes
|
|
20
|
+
- Cover: builtin policies, policy params, config scope precedence, custom hooks
|
|
21
|
+
- Run in parallel in CI without flakiness
|
|
22
|
+
- Telemetry disabled unconditionally in all test invocations
|
|
23
|
+
|
|
24
|
+
**Non-Goals:**
|
|
25
|
+
- Testing Claude Code itself or any LLM behavior
|
|
26
|
+
- Testing the web dashboard or API mode
|
|
27
|
+
- Replacing unit tests — this is additive coverage of the integration path
|
|
28
|
+
|
|
29
|
+
## How the Interface Works
|
|
30
|
+
|
|
31
|
+
`claudeye --hook <EventType>` reads a JSON payload from stdin, loads config, evaluates policies, writes a decision to stdout, and exits. This is the exact protocol Claude Code uses.
|
|
32
|
+
|
|
33
|
+
**Invocation:**
|
|
34
|
+
```bash
|
|
35
|
+
echo '<payload-json>' \
|
|
36
|
+
| CLAUDEYE_TELEMETRY_DISABLED=1 \
|
|
37
|
+
.test-npx/node_modules/@claudeye/<platform>/bin/claudeye --hook PreToolUse
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
No Node.js bridge. The native binary intercepts `--hook` before any mode routing (`binary-entry.ts:41-46`), so `--mode=cli` is not needed. `CLAUDEYE_DIST_PATH` must be set when custom hooks are involved (the binary uses it for the ESM shim that resolves `import { allow, deny } from "claudeye"`).
|
|
41
|
+
|
|
42
|
+
**Payload shape** (sourced from `src/hooks/handler.ts` parsing logic):
|
|
43
|
+
```json
|
|
44
|
+
{
|
|
45
|
+
"session_id": "test-session-001",
|
|
46
|
+
"transcript_path": "/tmp/transcript.jsonl",
|
|
47
|
+
"cwd": "/tmp/fixture-dir",
|
|
48
|
+
"permission_mode": "default",
|
|
49
|
+
"hook_event_name": "PreToolUse",
|
|
50
|
+
"tool_name": "Bash",
|
|
51
|
+
"tool_input": { "command": "sudo apt install nodejs" }
|
|
52
|
+
}
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
**Decision output shapes:**
|
|
56
|
+
| Decision | Exit code | stdout |
|
|
57
|
+
|---|---|---|
|
|
58
|
+
| `PreToolUse` deny | 0 | `{"hookSpecificOutput":{"permissionDecision":"deny","reason":"..."}}` |
|
|
59
|
+
| Instruct (any event) | 0 | `{"hookSpecificOutput":{"additionalContext":"Instruction from claudeye: ..."}}` |
|
|
60
|
+
| Allow | 0 | *(empty)* |
|
|
61
|
+
| Non-PreToolUse deny | 2 | *(empty or reason)* |
|
|
62
|
+
|
|
63
|
+
**Config isolation:** Set `cwd` in the payload to a temp dir containing `.claudeye/hooks-config.json`. Set `HOME` env to a fresh empty temp dir so the CI runner's real `~/.claudeye` never leaks in. This mirrors exactly how `src/hooks/hooks-config.ts:33-73` resolves config.
|
|
64
|
+
|
|
65
|
+
## Options Considered
|
|
66
|
+
|
|
67
|
+
### Option A: Invoke raw TypeScript via `bun src/binary-entry.ts --hook`
|
|
68
|
+
**Pros:** No build step, fast, straightforward.
|
|
69
|
+
**Cons:** Doesn't test the compiled binary; won't catch binary-specific regressions (bundling, bun compile quirks). Telemetry code path in the binary might differ. Users never run raw TypeScript.
|
|
70
|
+
|
|
71
|
+
### Option B: Use `claudeye-local` (from `bun build --compile`)
|
|
72
|
+
**Pros:** Tests the compiled binary. Faster than full npm pack.
|
|
73
|
+
**Cons:** Still not the full npm distribution path; skips the wrapper (`bin/claudeye.mjs`) and the pack/install steps.
|
|
74
|
+
|
|
75
|
+
### Option C: Use the full npm package (via `bun run test:npx`) ✓ **Selected**
|
|
76
|
+
**Pros:** Exactly the user experience. Exercises the full build pipeline. Validates binary compile + npm pack + install + wrapper dispatch. `test:npx` already exists, exits cleanly (no interactive shell), and has retry logic.
|
|
77
|
+
**Cons:** Slower CI step (~15 min for full build). Mitigated by caching and running in parallel with other jobs.
|
|
78
|
+
|
|
79
|
+
## Architecture
|
|
80
|
+
|
|
81
|
+
### Setup Phase
|
|
82
|
+
|
|
83
|
+
`bun run test:npx` runs `scripts/test-npx.sh`:
|
|
84
|
+
1. Builds Next.js standalone
|
|
85
|
+
2. Compiles native binary (`bun build --compile`)
|
|
86
|
+
3. `npm pack` both platform and wrapper packages into tarballs
|
|
87
|
+
4. `npm install` both into `.test-npx/` temp environment
|
|
88
|
+
5. Exits (prints instructions, no interactive shell)
|
|
89
|
+
|
|
90
|
+
The installed binary is then available at:
|
|
91
|
+
```
|
|
92
|
+
.test-npx/node_modules/@claudeye/<platform>/bin/claudeye ← native binary (used directly by tests)
|
|
93
|
+
.test-npx/node_modules/claudeye/dist/ ← set as CLAUDEYE_DIST_PATH for custom hooks
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
### Test Infrastructure
|
|
97
|
+
|
|
98
|
+
```
|
|
99
|
+
__tests__/e2e/
|
|
100
|
+
helpers/
|
|
101
|
+
hook-runner.ts # spawn claudeye.mjs --hook, pipe stdin, capture exit+stdout+stderr
|
|
102
|
+
fixture-env.ts # mkdtemp per test, write configs/hooks, register afterEach cleanup
|
|
103
|
+
payloads.ts # Claude-accurate payload factories per event type and tool
|
|
104
|
+
hooks/
|
|
105
|
+
builtin-policies.e2e.test.ts
|
|
106
|
+
custom-hooks.e2e.test.ts
|
|
107
|
+
config-scopes.e2e.test.ts
|
|
108
|
+
policy-params.e2e.test.ts
|
|
109
|
+
|
|
110
|
+
vitest.config.e2e.mts # node env, forks pool, 20s timeout, e2e glob
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
**`hook-runner.ts`** — the core helper:
|
|
114
|
+
```typescript
|
|
115
|
+
interface HookRunResult {
|
|
116
|
+
exitCode: number;
|
|
117
|
+
stdout: string;
|
|
118
|
+
stderr: string;
|
|
119
|
+
parsed?: Record<string, unknown>;
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
async function runHook(
|
|
123
|
+
event: string,
|
|
124
|
+
payload: Record<string, unknown>,
|
|
125
|
+
opts?: { homeDir?: string }
|
|
126
|
+
): Promise<HookRunResult>
|
|
127
|
+
// Always sets CLAUDEYE_TELEMETRY_DISABLED=1
|
|
128
|
+
// Sets HOME to opts.homeDir when provided
|
|
129
|
+
// Binary path: <repo-root>/.test-npx/node_modules/claudeye/bin/claudeye.mjs
|
|
130
|
+
// Falls back to <repo-root>/claudeye-local if .test-npx doesn't exist
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
**`fixture-env.ts`** — per-test isolation:
|
|
134
|
+
```typescript
|
|
135
|
+
interface FixtureEnv {
|
|
136
|
+
cwd: string; // pass as payload.cwd → picks up .claudeye/hooks-config.json
|
|
137
|
+
home: string; // pass as runHook homeDir → isolated from real ~/.claudeye
|
|
138
|
+
writeConfig(config: object, scope?: "project" | "local"): void;
|
|
139
|
+
writeHooks(filename: string, content: string): string; // returns absolute path
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
function createFixtureEnv(): FixtureEnv
|
|
143
|
+
// Registers afterEach() cleanup automatically
|
|
144
|
+
// home starts empty (no .claudeye inside)
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
**`payloads.ts`** — Claude-accurate payloads:
|
|
148
|
+
```typescript
|
|
149
|
+
const Payloads = {
|
|
150
|
+
preToolUse: {
|
|
151
|
+
bash: (command: string, cwd: string) => { session_id, hook_event_name, tool_name: "Bash", tool_input: { command }, cwd },
|
|
152
|
+
write: (filePath: string, content: string, cwd: string) => { ..., tool_name: "Write", tool_input: { file_path, content } },
|
|
153
|
+
read: (filePath: string, cwd: string) => { ..., tool_name: "Read", tool_input: { file_path } },
|
|
154
|
+
},
|
|
155
|
+
postToolUse: {
|
|
156
|
+
bash: (command: string, output: string, cwd: string) => { ..., tool_result: output },
|
|
157
|
+
read: (filePath: string, content: string, cwd: string) => { ..., tool_result: content },
|
|
158
|
+
},
|
|
159
|
+
notification: (message: string, cwd: string) => { ..., hook_event_name: "Notification", message },
|
|
160
|
+
stop: (cwd: string) => { ..., hook_event_name: "Stop" },
|
|
161
|
+
}
|
|
162
|
+
```
|
|
163
|
+
|
|
164
|
+
### Vitest Config
|
|
165
|
+
|
|
166
|
+
```typescript
|
|
167
|
+
// vitest.config.e2e.mts
|
|
168
|
+
export default defineConfig({
|
|
169
|
+
test: {
|
|
170
|
+
globals: true,
|
|
171
|
+
environment: "node",
|
|
172
|
+
include: ["__tests__/e2e/**/*.e2e.test.ts"],
|
|
173
|
+
testTimeout: 20_000,
|
|
174
|
+
hookTimeout: 10_000,
|
|
175
|
+
pool: "forks",
|
|
176
|
+
poolOptions: { forks: { singleFork: false } },
|
|
177
|
+
},
|
|
178
|
+
});
|
|
179
|
+
```
|
|
180
|
+
|
|
181
|
+
`forks` pool (true process isolation) is important because:
|
|
182
|
+
1. Tests spawn subprocesses — thread-based workers share globalThis which can interfere
|
|
183
|
+
2. Parallel subprocess invocations are safer across fork boundaries
|
|
184
|
+
|
|
185
|
+
### New package.json scripts
|
|
186
|
+
|
|
187
|
+
```json
|
|
188
|
+
"test:e2e": "vitest run --config vitest.config.e2e.mts",
|
|
189
|
+
"test:e2e:watch": "vitest --config vitest.config.e2e.mts"
|
|
190
|
+
```
|
|
191
|
+
|
|
192
|
+
### New CI job
|
|
193
|
+
|
|
194
|
+
```yaml
|
|
195
|
+
test-e2e:
|
|
196
|
+
runs-on: ubuntu-latest
|
|
197
|
+
env:
|
|
198
|
+
CLAUDEYE_TELEMETRY_DISABLED: "1" # covers both build and hook invocations
|
|
199
|
+
steps:
|
|
200
|
+
- uses: actions/checkout@v6
|
|
201
|
+
- uses: oven-sh/setup-bun@v2
|
|
202
|
+
with: { bun-version: latest }
|
|
203
|
+
- uses: actions/cache@v4
|
|
204
|
+
with:
|
|
205
|
+
path: ~/.bun/install/cache
|
|
206
|
+
key: bun-${{ runner.os }}-${{ hashFiles('bun.lockb') }}
|
|
207
|
+
restore-keys: bun-${{ runner.os }}-
|
|
208
|
+
- name: Install dependencies
|
|
209
|
+
uses: nick-fields/retry@v4
|
|
210
|
+
with: { max_attempts: 3, timeout_minutes: 5, command: bun install --frozen-lockfile }
|
|
211
|
+
- name: Build npm package (setup E2E env)
|
|
212
|
+
uses: nick-fields/retry@v4
|
|
213
|
+
with: { max_attempts: 2, timeout_minutes: 15, command: bun run test:npx }
|
|
214
|
+
- name: E2E Hook Tests
|
|
215
|
+
uses: nick-fields/retry@v4
|
|
216
|
+
with: { max_attempts: 2, timeout_minutes: 10, command: bun run test:e2e }
|
|
217
|
+
```
|
|
218
|
+
|
|
219
|
+
Runs in parallel with existing `test` and `build` jobs.
|
|
220
|
+
|
|
221
|
+
## Test Coverage Plan
|
|
222
|
+
|
|
223
|
+
### `builtin-policies.e2e.test.ts`
|
|
224
|
+
Each test uses `FixtureEnv` with exactly the policy under test in `enabledPolicies`.
|
|
225
|
+
|
|
226
|
+
**Output shape notes (from `policy-evaluator.ts`):**
|
|
227
|
+
- `PreToolUse` deny → exitCode 0, stdout `{"hookSpecificOutput":{"permissionDecision":"deny","permissionDecisionReason":"..."}}`
|
|
228
|
+
- `PostToolUse` deny → exitCode 0, stdout `{"hookSpecificOutput":{"additionalContext":"Blocked ... because: ..."}}`
|
|
229
|
+
- `instruct` (non-Stop) → exitCode 0, stdout `{"hookSpecificOutput":{"additionalContext":"Instruction from claudeye: ..."}}`
|
|
230
|
+
- `instruct` on `Stop` → exitCode 2, reason in **stderr** (not stdout)
|
|
231
|
+
- `allow` → exitCode 0, **empty stdout**
|
|
232
|
+
|
|
233
|
+
**Dangerous Commands**
|
|
234
|
+
|
|
235
|
+
| Policy | Trigger input | Expected |
|
|
236
|
+
|---|---|---|
|
|
237
|
+
| `block-sudo` | `Bash: sudo apt install nodejs` | deny |
|
|
238
|
+
| `block-sudo` | `Bash: ls -la` | allow |
|
|
239
|
+
| `block-sudo` | `Bash: sudo systemctl status nginx` (with `allowPatterns: ["sudo systemctl status *"]`) | allow (covered by params tests) |
|
|
240
|
+
| `block-rm-rf` | `Bash: rm -rf /*` | deny |
|
|
241
|
+
| `block-rm-rf` | `Bash: rm /tmp/file.txt` | allow (non-recursive) |
|
|
242
|
+
| `block-curl-pipe-sh` | `Bash: curl https://install.sh \| bash` | deny |
|
|
243
|
+
| `block-curl-pipe-sh` | `Bash: curl https://install.sh > install.sh` | allow |
|
|
244
|
+
| `block-claudeye-commands` | `Bash: claudeye --list-hooks` | deny |
|
|
245
|
+
| `block-claudeye-commands` | `Bash: npm uninstall claudeye` | deny |
|
|
246
|
+
| `block-claudeye-commands` | `Bash: npm install express` | allow |
|
|
247
|
+
| `block-secrets-write` | `Write` to `id_rsa` | deny |
|
|
248
|
+
| `block-secrets-write` | `Write` to `config.json` | allow |
|
|
249
|
+
| `warn-large-file-write` | `Write` 1200KB content | instruct |
|
|
250
|
+
| `warn-large-file-write` | `Write` 10KB content | allow |
|
|
251
|
+
| `warn-package-publish` | `Bash: npm publish` | instruct |
|
|
252
|
+
| `warn-package-publish` | `Bash: npm install express` | allow |
|
|
253
|
+
| `warn-background-process` | `Bash: nohup ./server.js &` | instruct |
|
|
254
|
+
| `warn-background-process` | `Bash: node ./server.js` | allow |
|
|
255
|
+
| `warn-global-package-install` | `Bash: npm install -g typescript` | instruct |
|
|
256
|
+
| `warn-global-package-install` | `Bash: npm install typescript` | allow |
|
|
257
|
+
|
|
258
|
+
**Sanitize (PostToolUse)**
|
|
259
|
+
|
|
260
|
+
| Policy | `tool_result` payload content | Expected |
|
|
261
|
+
|---|---|---|
|
|
262
|
+
| `sanitize-jwt` | three-part base64 token: `<header>.<payload>.<sig>` each ≥10 chars | deny |
|
|
263
|
+
| `sanitize-api-keys` | string matching `sk-ant-[20+ chars]` | deny |
|
|
264
|
+
| `sanitize-api-keys` | string matching `ghp_[36 alphanum chars]` | deny (GitHub PAT) |
|
|
265
|
+
| `sanitize-api-keys` | string matching `AKIA[16 uppercase alphanum]` | deny (AWS key) |
|
|
266
|
+
| `sanitize-connection-strings` | `postgresql://user:pass@host/db` (with credentials before `@`) | deny |
|
|
267
|
+
| `sanitize-private-key-content` | string containing `-----BEGIN PRIVATE KEY-----` | deny |
|
|
268
|
+
| `sanitize-bearer-tokens` | string containing `Authorization: Bearer ` + 20+ char token | deny |
|
|
269
|
+
| *(any sanitize policy)* | clean output with no secrets | allow |
|
|
270
|
+
|
|
271
|
+
> **Stdin limit note:** The binary enforces `MAX_STDIN_BYTES = 1MB` (handler.ts). Any payload exceeding this is discarded — no policies fire. The default `warn-large-file-write` threshold is 1024KB, which means a triggering payload would itself exceed the limit. Test this policy with a custom `thresholdKb` param (e.g. `10`) and proportionally smaller content.
|
|
272
|
+
|
|
273
|
+
> **Test data note:** Sanitize policies fire on the full `tool_result` payload, which includes Edit/Write diffs and Bash stdout. Never put real-format secrets (actual JWT strings, real key prefixes) in test fixtures or design docs — they will trigger policies during development. Use descriptions like `<header>.<payload>.<sig>` or partial patterns instead.
|
|
274
|
+
|
|
275
|
+
**Environment**
|
|
276
|
+
|
|
277
|
+
| Policy | Trigger input | Expected |
|
|
278
|
+
|---|---|---|
|
|
279
|
+
| `protect-env-vars` | `Bash: printenv` | deny |
|
|
280
|
+
| `protect-env-vars` | `Bash: echo $HOME` | deny |
|
|
281
|
+
| `protect-env-vars` | `Bash: ls -la` | allow |
|
|
282
|
+
| `block-env-files` | `Bash: cat .env` | deny |
|
|
283
|
+
| `block-env-files` | `Read` with `file_path: ".env"` | deny |
|
|
284
|
+
| `block-env-files` | `Bash: cat .envrc` | allow (`.envrc` ≠ `.env`) |
|
|
285
|
+
|
|
286
|
+
**Git**
|
|
287
|
+
|
|
288
|
+
| Policy | Trigger input | Expected |
|
|
289
|
+
|---|---|---|
|
|
290
|
+
| `block-push-master` | `Bash: git push origin main` | deny |
|
|
291
|
+
| `block-push-master` | `Bash: git push origin feat/x` | allow |
|
|
292
|
+
| `block-force-push` | `Bash: git push -f origin feat/x` | deny |
|
|
293
|
+
| `block-force-push` | `Bash: git push origin feat/x` | allow |
|
|
294
|
+
| `warn-git-amend` | `Bash: git commit --amend -m "fix"` | instruct |
|
|
295
|
+
| `warn-git-amend` | `Bash: git commit -m "fix"` | allow |
|
|
296
|
+
| `warn-git-stash-drop` | `Bash: git stash drop` | instruct |
|
|
297
|
+
| `warn-git-stash-drop` | `Bash: git stash list` | allow |
|
|
298
|
+
| `warn-all-files-staged` | `Bash: git add -A` | instruct |
|
|
299
|
+
| `warn-all-files-staged` | `Bash: git add src/foo.ts` | allow |
|
|
300
|
+
|
|
301
|
+
**Database**
|
|
302
|
+
|
|
303
|
+
| Policy | Trigger input | Expected |
|
|
304
|
+
|---|---|---|
|
|
305
|
+
| `warn-destructive-sql` | `Bash: psql -c "DROP TABLE users"` | instruct |
|
|
306
|
+
| `warn-destructive-sql` | `Bash: psql -c "DELETE FROM users"` (no WHERE) | instruct |
|
|
307
|
+
| `warn-destructive-sql` | `Bash: psql -c "SELECT * FROM users"` | allow |
|
|
308
|
+
| `warn-schema-alteration` | `Bash: psql -c "ALTER TABLE users DROP COLUMN email"` | instruct |
|
|
309
|
+
| `warn-schema-alteration` | `Bash: psql -c "ALTER TABLE users ADD COLUMN age INT"` | instruct |
|
|
310
|
+
| `warn-schema-alteration` | `Bash: psql -c "SELECT * FROM users"` | allow |
|
|
311
|
+
|
|
312
|
+
**Baseline**
|
|
313
|
+
|
|
314
|
+
| Scenario | Expected |
|
|
315
|
+
|---|---|
|
|
316
|
+
| No `enabledPolicies` | Any Bash input → allow, empty stdout |
|
|
317
|
+
| Policy registered but non-matching event type | `block-sudo` enabled, send `PostToolUse` Bash → allow |
|
|
318
|
+
|
|
319
|
+
### `config-scopes.e2e.test.ts`
|
|
320
|
+
Tests merge behavior of `src/hooks/hooks-config.ts:33-73`.
|
|
321
|
+
|
|
322
|
+
- Project config enables `block-sudo` → blocked
|
|
323
|
+
- No config anywhere → no policies fire → allow
|
|
324
|
+
- Global `policyParams.warn-large-file-write.thresholdKb: 500`, local overrides to `200` → 200KB triggers (local beats global; project beats local)
|
|
325
|
+
- Project enables `block-sudo`, local enables `block-rm-rf` → union: both fire on respective inputs
|
|
326
|
+
|
|
327
|
+
### `policy-params.e2e.test.ts`
|
|
328
|
+
Tests param injection from config into `policy-evaluator.ts`. Each test sets `policyParams` in the project-scope config alongside the policy in `enabledPolicies`.
|
|
329
|
+
|
|
330
|
+
**`block-sudo` — `allowPatterns: string[]`**
|
|
331
|
+
- `allowPatterns: ["sudo systemctl status *"]` → `sudo systemctl status nginx` → allow
|
|
332
|
+
- `allowPatterns: ["sudo systemctl status *"]` → `sudo rm /etc/hosts` → deny (pattern doesn't match)
|
|
333
|
+
- `allowPatterns: []` (default) → `sudo systemctl status nginx` → deny
|
|
334
|
+
|
|
335
|
+
**`block-push-master` — `protectedBranches: string[]`**
|
|
336
|
+
- `protectedBranches: ["release"]` → `git push origin release` → deny; `git push origin main` → allow (main no longer protected)
|
|
337
|
+
- `protectedBranches: []` → `git push origin main` → allow (empty = nothing protected)
|
|
338
|
+
|
|
339
|
+
**`block-rm-rf` — `allowPaths: string[]`**
|
|
340
|
+
- `allowPaths: ["/tmp/safe"]` → `rm -rf /tmp/safe/subdir` → allow
|
|
341
|
+
- `allowPaths: ["/tmp/safe"]` → `rm -rf /home` → deny
|
|
342
|
+
- `allowPaths: []` (default) → `rm -rf /tmp/*` → deny
|
|
343
|
+
|
|
344
|
+
**`warn-large-file-write` — `thresholdKb: number`**
|
|
345
|
+
- `thresholdKb: 100` → 150KB content → instruct
|
|
346
|
+
- `thresholdKb: 100` → 50KB content → allow
|
|
347
|
+
- default (`thresholdKb: 1024`) → 500KB content → allow (under default threshold)
|
|
348
|
+
|
|
349
|
+
**`sanitize-api-keys` — `additionalPatterns: {regex, label}[]`**
|
|
350
|
+
- `additionalPatterns: [{ regex: "MY_TOKEN_[A-Z0-9]{16}", label: "Internal token" }]` → PostToolUse output with matching token → deny
|
|
351
|
+
- same config → PostToolUse output with no matching token → allow
|
|
352
|
+
|
|
353
|
+
**`block-secrets-write` — `additionalPatterns: string[]`**
|
|
354
|
+
- `additionalPatterns: [".token"]` → Write to `auth.token` → deny
|
|
355
|
+
- `additionalPatterns: [".token"]` → Write to `auth.json` → allow
|
|
356
|
+
|
|
357
|
+
**`block-read-outside-cwd` — `allowPaths: string[]`**
|
|
358
|
+
- `allowPaths: ["/shared/data"]` → `Read /shared/data/schema.json` → allow
|
|
359
|
+
- `allowPaths: ["/shared/data"]` → `Read /etc/passwd` → deny
|
|
360
|
+
|
|
361
|
+
### `custom-hooks.e2e.test.ts`
|
|
362
|
+
Each test writes a temp `.mjs` file and sets `customHooksPath` in config.
|
|
363
|
+
|
|
364
|
+
**Core mechanics (inline hook files)**
|
|
365
|
+
|
|
366
|
+
| Scenario | Hook content | Input | Expected |
|
|
367
|
+
|---|---|---|---|
|
|
368
|
+
| deny path | `fn: async () => deny("blocked")` | any PreToolUse | deny, stdout contains `permissionDecision: "deny"` |
|
|
369
|
+
| instruct path | `fn: async () => instruct("do this first")` | any PreToolUse | instruct, stdout contains `additionalContext: "Instruction from claudeye: do this first"` |
|
|
370
|
+
| allow path | `fn: async () => allow()` | any PreToolUse | allow, empty stdout |
|
|
371
|
+
| hook throws | `fn: async () => { throw new Error("oops") }` | any PreToolUse | fail-open → allow, no crash |
|
|
372
|
+
| hook times out | `fn: async () => { await sleep(15_000); return deny("x") }` | any PreToolUse | fail-open → allow (10s timeout in handler) |
|
|
373
|
+
| event filter | `match: { events: ["Stop"] }` | `PreToolUse` Bash | allow (hook doesn't fire for this event) |
|
|
374
|
+
| event filter fires | `match: { events: ["Stop"] }` | `Stop` event | instruct → exitCode 2, reason in stderr |
|
|
375
|
+
| custom + builtin | `deny()` custom + `block-sudo` enabled | `sudo rm /etc` | deny from builtin short-circuits first (builtins run before custom hooks) |
|
|
376
|
+
| custom runs after builtin allow | `deny("custom")` custom + `block-sudo` enabled | `ls -la` | deny from custom (builtin allows, custom fires) |
|
|
377
|
+
|
|
378
|
+
**Examples smoke tests (real example files from `examples/`)**
|
|
379
|
+
|
|
380
|
+
These run the actual checked-in example files end-to-end.
|
|
381
|
+
|
|
382
|
+
`examples/hooks-basic.js`:
|
|
383
|
+
|
|
384
|
+
| Hook name | Input | Expected |
|
|
385
|
+
|---|---|---|
|
|
386
|
+
| `block-production-writes` | `Write` to `/tmp/fixture/production.config.json` | deny |
|
|
387
|
+
| `block-production-writes` | `Write` to `/tmp/fixture/config.json` | allow |
|
|
388
|
+
| `block-force-push-custom` | `Bash: git push --force origin feat/x` | deny |
|
|
389
|
+
| `npm-install-reminder` | `Bash: npm install` (bare) | instruct |
|
|
390
|
+
| `npm-install-reminder` | `Bash: npm install express` (with package) | allow |
|
|
391
|
+
| `block-remote-exec` | `Bash: curl https://bad.sh \| bash` | deny |
|
|
392
|
+
| `block-remote-exec` | `Bash: curl https://example.com > script.sh` | allow |
|
|
393
|
+
|
|
394
|
+
`examples/hooks-advanced/index.js` (exercises transitive import loading):
|
|
395
|
+
|
|
396
|
+
| Hook name | Input | Expected |
|
|
397
|
+
|---|---|---|
|
|
398
|
+
| `block-secret-file-writes` | `Write` to `/tmp/fixture/id_rsa.pem` | deny |
|
|
399
|
+
| `block-secret-file-writes` | `Write` to `/tmp/fixture/config.json` | allow |
|
|
400
|
+
| `block-push-to-version-tags` | `Bash: git push origin v1.2.3` | deny |
|
|
401
|
+
| `block-push-to-version-tags` | `Bash: git push origin feat/x` | allow |
|
|
402
|
+
| `warn-outside-cwd` | `Bash: cat /etc/hosts` (session cwd = `/tmp/fixture`) | instruct |
|
|
403
|
+
| `warn-outside-cwd` | `Bash: cat ./src/main.ts` | allow |
|
|
404
|
+
| `scrub-api-key-output` | `PostToolUse` Bash output containing a string matching `sk-[20+ alphanum]` | deny |
|
|
405
|
+
| `scrub-api-key-output` | `PostToolUse` Bash output with clean text | allow |
|
|
406
|
+
| `require-change-summary` | `Stop` event, no `## Summary` in transcript, prior `Write` tool calls in transcript | instruct (exitCode 2, stderr) |
|
|
407
|
+
| `require-change-summary` | `Stop` event, no prior write tool calls in transcript | allow |
|
|
408
|
+
|
|
409
|
+
## Open Questions
|
|
410
|
+
|
|
411
|
+
- **`test:npx` build time in CI**: Full build takes ~10-15 min. Should we add a binary-only fast path for E2E (skip Next.js build, just compile binary + hook handler)? Trade-off: less realistic vs faster feedback.
|
|
412
|
+
- **Parallelism tuning**: How many fork workers? Default vitest forks = CPU count. With subprocess spawning per test, this could be a lot. May need `maxForks` cap.
|
|
413
|
+
- **Test:npx cleanup**: The script leaves `.test-npx/` on disk after completion. CI runners are ephemeral so this is fine, but local devs running `bun run test:e2e` repeatedly would need the package pre-built. Document the workflow clearly.
|
|
414
|
+
- **PostToolUse payload shape**: Need to verify exact field names for `tool_result` vs `output` — cross-reference with real Claude Code hook payloads.
|
|
415
|
+
|
|
416
|
+
## Decision / Direction
|
|
417
|
+
|
|
418
|
+
Build the E2E suite using Option C (full npm package via `test:npx`). Start with the helpers and a small set of `builtin-policies` tests to validate the approach, then expand to all four test files. Add the CI job once the local suite is stable.
|
|
419
|
+
|
|
420
|
+
Use an inline implementation checklist in this doc as items are completed.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "claudeye",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.8",
|
|
4
4
|
"description": "Watchtower for Claude Code & Agents SDK — replay sessions, run custom evals, debug agent traces locally",
|
|
5
5
|
"bin": {
|
|
6
6
|
"claudeye": "./bin/claudeye.mjs"
|
|
@@ -36,7 +36,9 @@
|
|
|
36
36
|
"set-versions": "bun scripts/set-versions.mjs",
|
|
37
37
|
"test:binary": "bash scripts/test-local.sh",
|
|
38
38
|
"test:binary:quick": "bash scripts/test-local.sh --skip-build",
|
|
39
|
-
"test:npx": "bash scripts/test-npx.sh"
|
|
39
|
+
"test:npx": "bash scripts/test-npx.sh",
|
|
40
|
+
"test:e2e": "vitest run --config vitest.config.e2e.mts",
|
|
41
|
+
"test:e2e:watch": "vitest --config vitest.config.e2e.mts"
|
|
40
42
|
},
|
|
41
43
|
"keywords": [
|
|
42
44
|
"claude",
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { defineConfig } from "vitest/config";
|
|
2
|
+
import { resolve } from "path";
|
|
3
|
+
|
|
4
|
+
export default defineConfig({
|
|
5
|
+
resolve: {
|
|
6
|
+
alias: {
|
|
7
|
+
"@": resolve(__dirname, "."),
|
|
8
|
+
},
|
|
9
|
+
},
|
|
10
|
+
test: {
|
|
11
|
+
globals: true,
|
|
12
|
+
environment: "node",
|
|
13
|
+
include: ["__tests__/e2e/**/*.e2e.test.ts"],
|
|
14
|
+
exclude: [],
|
|
15
|
+
testTimeout: 20_000,
|
|
16
|
+
hookTimeout: 10_000,
|
|
17
|
+
// forks pool: true process isolation — tests spawn subprocesses,
|
|
18
|
+
// thread workers share globalThis which can interfere.
|
|
19
|
+
pool: "forks",
|
|
20
|
+
},
|
|
21
|
+
});
|
package/bin/claudeye
CHANGED
|
Binary file
|
package/package.json
CHANGED
|
@@ -1,3 +0,0 @@
|
|
|
1
|
-
globalThis.__RSC_MANIFEST = globalThis.__RSC_MANIFEST || {};
|
|
2
|
-
globalThis.__RSC_MANIFEST["/hooks/page"] = {"moduleLoading":{"prefix":"","crossOrigin":null},"clientModules":{"[project]/node_modules/next/dist/esm/client/components/layout-router.js <module evaluation>":{"id":39756,"name":"*","chunks":["/_next/static/chunks/0wx~5navv~b2r.js","/_next/static/chunks/0_879ixarc_93.js","/_next/static/chunks/0g5cvlv5.8drd.js"],"async":false},"[project]/node_modules/next/dist/esm/client/components/layout-router.js":{"id":39756,"name":"*","chunks":["/_next/static/chunks/0wx~5navv~b2r.js","/_next/static/chunks/0_879ixarc_93.js","/_next/static/chunks/0g5cvlv5.8drd.js"],"async":false},"[project]/node_modules/next/dist/esm/client/components/render-from-template-context.js <module evaluation>":{"id":37457,"name":"*","chunks":["/_next/static/chunks/0wx~5navv~b2r.js","/_next/static/chunks/0_879ixarc_93.js","/_next/static/chunks/0g5cvlv5.8drd.js"],"async":false},"[project]/node_modules/next/dist/esm/client/components/render-from-template-context.js":{"id":37457,"name":"*","chunks":["/_next/static/chunks/0wx~5navv~b2r.js","/_next/static/chunks/0_879ixarc_93.js","/_next/static/chunks/0g5cvlv5.8drd.js"],"async":false},"[project]/node_modules/next/dist/esm/client/components/client-page.js <module evaluation>":{"id":47257,"name":"*","chunks":["/_next/static/chunks/0wx~5navv~b2r.js","/_next/static/chunks/0_879ixarc_93.js","/_next/static/chunks/0g5cvlv5.8drd.js"],"async":false},"[project]/node_modules/next/dist/esm/client/components/client-page.js":{"id":47257,"name":"*","chunks":["/_next/static/chunks/0wx~5navv~b2r.js","/_next/static/chunks/0_879ixarc_93.js","/_next/static/chunks/0g5cvlv5.8drd.js"],"async":false},"[project]/node_modules/next/dist/esm/client/components/client-segment.js <module evaluation>":{"id":92825,"name":"*","chunks":["/_next/static/chunks/0wx~5navv~b2r.js","/_next/static/chunks/0_879ixarc_93.js","/_next/static/chunks/0g5cvlv5.8drd.js"],"async":false},"[project]/node_modules/next/dist/esm/client/components/client-segment.js":{"id":92825,"name":"*","chunks":["/_next/static/chunks/0wx~5navv~b2r.js","/_next/static/chunks/0_879ixarc_93.js","/_next/static/chunks/0g5cvlv5.8drd.js"],"async":false},"[project]/node_modules/next/dist/esm/client/components/http-access-fallback/error-boundary.js <module evaluation>":{"id":68017,"name":"*","chunks":["/_next/static/chunks/0wx~5navv~b2r.js","/_next/static/chunks/0_879ixarc_93.js","/_next/static/chunks/0g5cvlv5.8drd.js"],"async":false},"[project]/node_modules/next/dist/esm/client/components/http-access-fallback/error-boundary.js":{"id":68017,"name":"*","chunks":["/_next/static/chunks/0wx~5navv~b2r.js","/_next/static/chunks/0_879ixarc_93.js","/_next/static/chunks/0g5cvlv5.8drd.js"],"async":false},"[project]/node_modules/next/dist/esm/lib/framework/boundary-components.js <module evaluation>":{"id":97367,"name":"*","chunks":["/_next/static/chunks/0wx~5navv~b2r.js","/_next/static/chunks/0_879ixarc_93.js","/_next/static/chunks/0g5cvlv5.8drd.js"],"async":false},"[project]/node_modules/next/dist/esm/lib/framework/boundary-components.js":{"id":97367,"name":"*","chunks":["/_next/static/chunks/0wx~5navv~b2r.js","/_next/static/chunks/0_879ixarc_93.js","/_next/static/chunks/0g5cvlv5.8drd.js"],"async":false},"[project]/node_modules/next/dist/esm/lib/metadata/generate/icon-mark.js <module evaluation>":{"id":27201,"name":"*","chunks":["/_next/static/chunks/0wx~5navv~b2r.js","/_next/static/chunks/0_879ixarc_93.js","/_next/static/chunks/0g5cvlv5.8drd.js"],"async":false},"[project]/node_modules/next/dist/esm/lib/metadata/generate/icon-mark.js":{"id":27201,"name":"*","chunks":["/_next/static/chunks/0wx~5navv~b2r.js","/_next/static/chunks/0_879ixarc_93.js","/_next/static/chunks/0g5cvlv5.8drd.js"],"async":false},"[project]/contexts/PostHogContext.tsx <module evaluation>":{"id":12344,"name":"*","chunks":["/_next/static/chunks/0wx~5navv~b2r.js","/_next/static/chunks/0_879ixarc_93.js","/_next/static/chunks/0g5cvlv5.8drd.js"],"async":false},"[project]/contexts/PostHogContext.tsx":{"id":12344,"name":"*","chunks":["/_next/static/chunks/0wx~5navv~b2r.js","/_next/static/chunks/0_879ixarc_93.js","/_next/static/chunks/0g5cvlv5.8drd.js"],"async":false},"[project]/contexts/ThemeContext.tsx <module evaluation>":{"id":47613,"name":"*","chunks":["/_next/static/chunks/0wx~5navv~b2r.js","/_next/static/chunks/0_879ixarc_93.js","/_next/static/chunks/0g5cvlv5.8drd.js"],"async":false},"[project]/contexts/ThemeContext.tsx":{"id":47613,"name":"*","chunks":["/_next/static/chunks/0wx~5navv~b2r.js","/_next/static/chunks/0_879ixarc_93.js","/_next/static/chunks/0g5cvlv5.8drd.js"],"async":false},"[project]/contexts/AutoRefreshContext.tsx <module evaluation>":{"id":85881,"name":"*","chunks":["/_next/static/chunks/0wx~5navv~b2r.js","/_next/static/chunks/0_879ixarc_93.js","/_next/static/chunks/0g5cvlv5.8drd.js"],"async":false},"[project]/contexts/AutoRefreshContext.tsx":{"id":85881,"name":"*","chunks":["/_next/static/chunks/0wx~5navv~b2r.js","/_next/static/chunks/0_879ixarc_93.js","/_next/static/chunks/0g5cvlv5.8drd.js"],"async":false},"[project]/components/navbar.tsx <module evaluation>":{"id":63780,"name":"*","chunks":["/_next/static/chunks/0wx~5navv~b2r.js","/_next/static/chunks/0_879ixarc_93.js","/_next/static/chunks/0g5cvlv5.8drd.js"],"async":false},"[project]/components/navbar.tsx":{"id":63780,"name":"*","chunks":["/_next/static/chunks/0wx~5navv~b2r.js","/_next/static/chunks/0_879ixarc_93.js","/_next/static/chunks/0g5cvlv5.8drd.js"],"async":false},"[project]/app/components/toast.tsx <module evaluation>":{"id":55574,"name":"*","chunks":["/_next/static/chunks/0wx~5navv~b2r.js","/_next/static/chunks/0_879ixarc_93.js","/_next/static/chunks/0g5cvlv5.8drd.js"],"async":false},"[project]/app/components/toast.tsx":{"id":55574,"name":"*","chunks":["/_next/static/chunks/0wx~5navv~b2r.js","/_next/static/chunks/0_879ixarc_93.js","/_next/static/chunks/0g5cvlv5.8drd.js"],"async":false},"[project]/app/error.tsx <module evaluation>":{"id":8821,"name":"*","chunks":["/_next/static/chunks/0wx~5navv~b2r.js","/_next/static/chunks/0_879ixarc_93.js","/_next/static/chunks/0g5cvlv5.8drd.js","/_next/static/chunks/0-06jeyuuf3mf.js"],"async":false},"[project]/app/error.tsx":{"id":8821,"name":"*","chunks":["/_next/static/chunks/0wx~5navv~b2r.js","/_next/static/chunks/0_879ixarc_93.js","/_next/static/chunks/0g5cvlv5.8drd.js","/_next/static/chunks/0-06jeyuuf3mf.js"],"async":false},"[project]/node_modules/next/dist/client/components/builtin/global-error.js <module evaluation>":{"id":68027,"name":"*","chunks":["/_next/static/chunks/0wx~5navv~b2r.js","/_next/static/chunks/0_879ixarc_93.js","/_next/static/chunks/0g5cvlv5.8drd.js"],"async":false},"[project]/node_modules/next/dist/client/components/builtin/global-error.js":{"id":68027,"name":"*","chunks":["/_next/static/chunks/0wx~5navv~b2r.js","/_next/static/chunks/0_879ixarc_93.js","/_next/static/chunks/0g5cvlv5.8drd.js"],"async":false},"[project]/app/hooks/hooks-client.tsx <module evaluation>":{"id":93938,"name":"*","chunks":["/_next/static/chunks/0wx~5navv~b2r.js","/_next/static/chunks/0_879ixarc_93.js","/_next/static/chunks/0g5cvlv5.8drd.js","/_next/static/chunks/119bhqt_bddam.js"],"async":false},"[project]/app/hooks/hooks-client.tsx":{"id":93938,"name":"*","chunks":["/_next/static/chunks/0wx~5navv~b2r.js","/_next/static/chunks/0_879ixarc_93.js","/_next/static/chunks/0g5cvlv5.8drd.js","/_next/static/chunks/119bhqt_bddam.js"],"async":false}},"ssrModuleMapping":{"39756":{"*":{"id":2420,"name":"*","chunks":["server/chunks/ssr/[root-of-the-server]__08a4wva._.js","server/chunks/ssr/_0rr.uoo._.js","server/chunks/ssr/_0uig1kl._.js","server/chunks/ssr/node_modules_0gyjybr._.js","server/chunks/ssr/lib_utils_ts_068jk73._.js","server/chunks/ssr/node_modules_next_dist_0h9llsw._.js","server/chunks/ssr/node_modules_next_0rd0oc-._.js"],"async":false}},"37457":{"*":{"id":24017,"name":"*","chunks":["server/chunks/ssr/[root-of-the-server]__08a4wva._.js","server/chunks/ssr/_0rr.uoo._.js","server/chunks/ssr/_0uig1kl._.js","server/chunks/ssr/node_modules_0gyjybr._.js","server/chunks/ssr/lib_utils_ts_068jk73._.js","server/chunks/ssr/node_modules_next_dist_0h9llsw._.js","server/chunks/ssr/node_modules_next_0rd0oc-._.js"],"async":false}},"47257":{"*":{"id":77682,"name":"*","chunks":["server/chunks/ssr/[root-of-the-server]__08a4wva._.js","server/chunks/ssr/_0rr.uoo._.js","server/chunks/ssr/_0uig1kl._.js","server/chunks/ssr/node_modules_0gyjybr._.js","server/chunks/ssr/lib_utils_ts_068jk73._.js","server/chunks/ssr/node_modules_next_dist_0h9llsw._.js","server/chunks/ssr/node_modules_next_0rd0oc-._.js"],"async":false}},"92825":{"*":{"id":97296,"name":"*","chunks":["server/chunks/ssr/[root-of-the-server]__08a4wva._.js","server/chunks/ssr/_0rr.uoo._.js","server/chunks/ssr/_0uig1kl._.js","server/chunks/ssr/node_modules_0gyjybr._.js","server/chunks/ssr/lib_utils_ts_068jk73._.js","server/chunks/ssr/node_modules_next_dist_0h9llsw._.js","server/chunks/ssr/node_modules_next_0rd0oc-._.js"],"async":false}},"68017":{"*":{"id":61660,"name":"*","chunks":["server/chunks/ssr/[root-of-the-server]__08a4wva._.js","server/chunks/ssr/_0rr.uoo._.js","server/chunks/ssr/_0uig1kl._.js","server/chunks/ssr/node_modules_0gyjybr._.js","server/chunks/ssr/lib_utils_ts_068jk73._.js","server/chunks/ssr/node_modules_next_dist_0h9llsw._.js","server/chunks/ssr/node_modules_next_0rd0oc-._.js"],"async":false}},"97367":{"*":{"id":90574,"name":"*","chunks":["server/chunks/ssr/[root-of-the-server]__08a4wva._.js","server/chunks/ssr/_0rr.uoo._.js","server/chunks/ssr/_0uig1kl._.js","server/chunks/ssr/node_modules_0gyjybr._.js","server/chunks/ssr/lib_utils_ts_068jk73._.js","server/chunks/ssr/node_modules_next_dist_0h9llsw._.js","server/chunks/ssr/node_modules_next_0rd0oc-._.js"],"async":false}},"27201":{"*":{"id":60704,"name":"*","chunks":["server/chunks/ssr/[root-of-the-server]__08a4wva._.js","server/chunks/ssr/_0rr.uoo._.js","server/chunks/ssr/_0uig1kl._.js","server/chunks/ssr/node_modules_0gyjybr._.js","server/chunks/ssr/lib_utils_ts_068jk73._.js","server/chunks/ssr/node_modules_next_dist_0h9llsw._.js","server/chunks/ssr/node_modules_next_0rd0oc-._.js"],"async":false}},"12344":{"*":{"id":10765,"name":"*","chunks":["server/chunks/ssr/[root-of-the-server]__08a4wva._.js","server/chunks/ssr/_0rr.uoo._.js","server/chunks/ssr/_0uig1kl._.js","server/chunks/ssr/node_modules_0gyjybr._.js","server/chunks/ssr/lib_utils_ts_068jk73._.js","server/chunks/ssr/node_modules_next_dist_0h9llsw._.js","server/chunks/ssr/node_modules_next_0rd0oc-._.js"],"async":false}},"47613":{"*":{"id":18200,"name":"*","chunks":["server/chunks/ssr/[root-of-the-server]__08a4wva._.js","server/chunks/ssr/_0rr.uoo._.js","server/chunks/ssr/_0uig1kl._.js","server/chunks/ssr/node_modules_0gyjybr._.js","server/chunks/ssr/lib_utils_ts_068jk73._.js","server/chunks/ssr/node_modules_next_dist_0h9llsw._.js","server/chunks/ssr/node_modules_next_0rd0oc-._.js"],"async":false}},"85881":{"*":{"id":6236,"name":"*","chunks":["server/chunks/ssr/[root-of-the-server]__08a4wva._.js","server/chunks/ssr/_0rr.uoo._.js","server/chunks/ssr/_0uig1kl._.js","server/chunks/ssr/node_modules_0gyjybr._.js","server/chunks/ssr/lib_utils_ts_068jk73._.js","server/chunks/ssr/node_modules_next_dist_0h9llsw._.js","server/chunks/ssr/node_modules_next_0rd0oc-._.js"],"async":false}},"63780":{"*":{"id":10815,"name":"*","chunks":["server/chunks/ssr/[root-of-the-server]__08a4wva._.js","server/chunks/ssr/_0rr.uoo._.js","server/chunks/ssr/_0uig1kl._.js","server/chunks/ssr/node_modules_0gyjybr._.js","server/chunks/ssr/lib_utils_ts_068jk73._.js","server/chunks/ssr/node_modules_next_dist_0h9llsw._.js","server/chunks/ssr/node_modules_next_0rd0oc-._.js"],"async":false}},"55574":{"*":{"id":18952,"name":"*","chunks":["server/chunks/ssr/[root-of-the-server]__08a4wva._.js","server/chunks/ssr/_0rr.uoo._.js","server/chunks/ssr/_0uig1kl._.js","server/chunks/ssr/node_modules_0gyjybr._.js","server/chunks/ssr/lib_utils_ts_068jk73._.js","server/chunks/ssr/node_modules_next_dist_0h9llsw._.js","server/chunks/ssr/node_modules_next_0rd0oc-._.js"],"async":false}},"8821":{"*":{"id":78141,"name":"*","chunks":["server/chunks/ssr/[root-of-the-server]__08a4wva._.js","server/chunks/ssr/_0rr.uoo._.js","server/chunks/ssr/_0uig1kl._.js","server/chunks/ssr/node_modules_0gyjybr._.js","server/chunks/ssr/lib_utils_ts_068jk73._.js","server/chunks/ssr/node_modules_next_dist_0h9llsw._.js","server/chunks/ssr/node_modules_next_0rd0oc-._.js","server/chunks/ssr/app_13f0ohr._.js"],"async":false}},"68027":{"*":{"id":40622,"name":"*","chunks":["server/chunks/ssr/[root-of-the-server]__08a4wva._.js","server/chunks/ssr/_0rr.uoo._.js","server/chunks/ssr/_0uig1kl._.js","server/chunks/ssr/node_modules_0gyjybr._.js","server/chunks/ssr/lib_utils_ts_068jk73._.js","server/chunks/ssr/node_modules_next_dist_0h9llsw._.js","server/chunks/ssr/node_modules_next_0rd0oc-._.js","server/chunks/ssr/node_modules_next_dist_client_components_06j6hww._.js"],"async":false}},"93938":{"*":{"id":63616,"name":"*","chunks":["server/chunks/ssr/[root-of-the-server]__08a4wva._.js","server/chunks/ssr/_0rr.uoo._.js","server/chunks/ssr/_0uig1kl._.js","server/chunks/ssr/node_modules_0gyjybr._.js","server/chunks/ssr/lib_utils_ts_068jk73._.js","server/chunks/ssr/node_modules_next_dist_0h9llsw._.js","server/chunks/ssr/node_modules_next_0rd0oc-._.js","server/chunks/ssr/_0_ia8tm._.js","server/chunks/ssr/app_hooks_hooks-client_tsx_0n~.yoz._.js"],"async":false}}},"edgeSSRModuleMapping":{},"rscModuleMapping":{"39756":{"*":{"id":26768,"name":"*","chunks":[],"async":false}},"37457":{"*":{"id":17910,"name":"*","chunks":[],"async":false}},"47257":{"*":{"id":92977,"name":"*","chunks":[],"async":false}},"92825":{"*":{"id":48552,"name":"*","chunks":[],"async":false}},"68017":{"*":{"id":83919,"name":"*","chunks":[],"async":false}},"97367":{"*":{"id":24150,"name":"*","chunks":[],"async":false}},"27201":{"*":{"id":40771,"name":"*","chunks":[],"async":false}},"12344":{"*":{"id":92036,"name":"*","chunks":[],"async":false}},"47613":{"*":{"id":86124,"name":"*","chunks":[],"async":false}},"85881":{"*":{"id":54950,"name":"*","chunks":[],"async":false}},"63780":{"*":{"id":42976,"name":"*","chunks":[],"async":false}},"55574":{"*":{"id":33711,"name":"*","chunks":[],"async":false}},"8821":{"*":{"id":50757,"name":"*","chunks":[],"async":false}},"68027":{"*":{"id":82509,"name":"*","chunks":[],"async":false}},"93938":{"*":{"id":55836,"name":"*","chunks":[],"async":false}}},"edgeRscModuleMapping":{},"entryCSSFiles":{"[project]/app/layout":[{"path":"static/chunks/0j1-mgai_b50s.css","inlined":false}],"[project]/app/error":[{"path":"static/chunks/0j1-mgai_b50s.css","inlined":false}],"[project]/node_modules/next/dist/client/components/builtin/global-error":[{"path":"static/chunks/0j1-mgai_b50s.css","inlined":false}],"[project]/app/hooks/page":[{"path":"static/chunks/0j1-mgai_b50s.css","inlined":false}]},"entryJSFiles":{"[project]/app/layout":["static/chunks/0wx~5navv~b2r.js","static/chunks/0_879ixarc_93.js","static/chunks/0g5cvlv5.8drd.js"],"[project]/app/error":["static/chunks/0wx~5navv~b2r.js","static/chunks/0_879ixarc_93.js","static/chunks/0g5cvlv5.8drd.js","static/chunks/0-06jeyuuf3mf.js"],"[project]/node_modules/next/dist/client/components/builtin/global-error":["static/chunks/0wx~5navv~b2r.js","static/chunks/0_879ixarc_93.js","static/chunks/0g5cvlv5.8drd.js"],"[project]/app/hooks/page":["static/chunks/0wx~5navv~b2r.js","static/chunks/0_879ixarc_93.js","static/chunks/0g5cvlv5.8drd.js","static/chunks/119bhqt_bddam.js"]}};
|
|
3
|
-
|
|
@@ -1,4 +0,0 @@
|
|
|
1
|
-
module.exports=[92509,(e,r,t)=>{r.exports=e.x("url",()=>require("url"))},14747,(e,r,t)=>{r.exports=e.x("path",()=>require("path"))},24868,(e,r,t)=>{r.exports=e.x("fs/promises",()=>require("fs/promises"))},46786,(e,r,t)=>{r.exports=e.x("os",()=>require("os"))},54799,(e,r,t)=>{r.exports=e.x("crypto",()=>require("crypto"))},2157,(e,r,t)=>{r.exports=e.x("node:fs",()=>require("node:fs"))},60526,(e,r,t)=>{r.exports=e.x("node:os",()=>require("node:os"))},50227,(e,r,t)=>{r.exports=e.x("node:path",()=>require("node:path"))},66680,(e,r,t)=>{r.exports=e.x("node:crypto",()=>require("node:crypto"))},74533,(e,r,t)=>{r.exports=e.x("node:child_process",()=>require("node:child_process"))},18622,(e,r,t)=>{r.exports=e.x("next/dist/compiled/next-server/app-page-turbo.runtime.prod.js",()=>require("next/dist/compiled/next-server/app-page-turbo.runtime.prod.js"))},56704,(e,r,t)=>{r.exports=e.x("next/dist/server/app-render/work-async-storage.external.js",()=>require("next/dist/server/app-render/work-async-storage.external.js"))},32319,(e,r,t)=>{r.exports=e.x("next/dist/server/app-render/work-unit-async-storage.external.js",()=>require("next/dist/server/app-render/work-unit-async-storage.external.js"))},24725,(e,r,t)=>{r.exports=e.x("next/dist/server/app-render/after-task-async-storage.external.js",()=>require("next/dist/server/app-render/after-task-async-storage.external.js"))},70406,(e,r,t)=>{r.exports=e.x("next/dist/compiled/@opentelemetry/api",()=>require("next/dist/compiled/@opentelemetry/api"))},93695,(e,r,t)=>{r.exports=e.x("next/dist/shared/lib/no-fallback-error.external.js",()=>require("next/dist/shared/lib/no-fallback-error.external.js"))},91560,e=>{"use strict";var r=e.i(45015),t=e.i(28753),s=e.i(84234),n=e.i(7420),a=e.i(54214),o=e.i(26287);e.i(14214);var i=e.i(88107),l=e.i(39864);async function u(e,r,c,d=!1){try{await (0,t.ensureEvalsLoaded)();let u=(0,s.getSessionScopedEnrichers)().find(e=>e.name===c);if(!u)return{ok:!1,error:`Enricher "${c}" not found`};let p=await (0,i.hashSessionFile)(e,r);if(!d&&p){let t=(0,i.hashItemCode)(u.fn),s=await (0,l.getPerItemCacheWithHook)("enrichments",e,r,u.name,t,p);if(s)return{ok:!0,result:s.value}}let{entries:f,rawLines:m}=await (0,a.getCachedSessionLog)(e,r),h=(0,o.calculateLogStats)(f),g=(await (0,n.runAllEnrichers)(m,h,e,r,[u],{source:"session"})).results[0];if(!g)return{ok:!1,error:"No result returned from enricher"};if(p){let t=(0,i.hashItemCode)(u.fn);await (0,l.setPerItemCache)("enrichments",e,r,u.name,t,g,p)}return{ok:!0,result:g}}catch(e){return{ok:!1,error:e instanceof Error?e.message:String(e)}}}(0,e.i(95975).ensureServerEntryExports)([u]),(0,r.registerServerReference)(u,"7801c448952e2d0b6dc0b82d0709436c6495eb4fc4",null),e.s(["processSessionEnrichment",0,u])},81929,e=>{"use strict";var r=e.i(45015),t=e.i(28753),s=e.i(77879),n=e.i(22308),a=e.i(54214),o=e.i(26287);e.i(14214);var i=e.i(88107),l=e.i(39864);async function u(e,r,c,d=!1){try{await (0,t.ensureEvalsLoaded)();let u=(0,s.getSessionScopedEvals)().find(e=>e.name===c);if(!u)return{ok:!1,error:`Eval "${c}" not found`};let p=await (0,i.hashSessionFile)(e,r);if(!d&&p){let t=(0,i.hashItemCode)(u.fn),s=await (0,l.getPerItemCacheWithHook)("evals",e,r,u.name,t,p);if(s)return{ok:!0,result:s.value}}let{entries:f,rawLines:m}=await (0,a.getCachedSessionLog)(e,r),h=(0,o.calculateLogStats)(f),g=(await (0,n.runAllEvals)(m,h,e,r,[u],{source:"session"})).results[0];if(!g)return{ok:!1,error:"No result returned from eval"};if(p){let t=(0,i.hashItemCode)(u.fn);await (0,l.setPerItemCache)("evals",e,r,u.name,t,g,p)}return{ok:!0,result:g}}catch(e){return{ok:!1,error:e instanceof Error?e.message:String(e)}}}(0,e.i(95975).ensureServerEntryExports)([u]),(0,r.registerServerReference)(u,"7892254fc48c81fdbf866245900884047ce268f158",null),e.s(["processSessionEval",0,u])},77879,e=>{"use strict";let r=(0,e.i(44967).createScopedRegistry)("__CLAUDEYE_EVAL_REGISTRY__"),t=r.getAll,s=r.getSessionScoped,n=r.getSubagentScoped,a=r.hasSubagent,o=r.has,i=r.clear;e.s(["clearEvals",0,i,"getRegisteredEvals",0,t,"getSessionScopedEvals",0,s,"getSubagentScopedEvals",0,n,"hasEvals",0,o,"hasSubagentEvals",0,a,"registerEval",0,function(e,t,s,n="session",a){let o={name:e,fn:t,scope:n};s&&(o.condition=s),a&&(o.subagentType=a),r.register(o)}])},22308,e=>{"use strict";var r=e.i(77879),t=e.i(14543);async function s(e,s,n,a,o,i){let l=o??(0,r.getRegisteredEvals)(),u={entries:e,stats:s,projectName:n,sessionId:a,source:"session",...i};return(0,t.runAll)(l,u,{skipResult:e=>({name:e.name,pass:!1,score:0,durationMs:0,skipped:!0}),successResult:(e,r,t)=>{var s;return{name:e.name,pass:r.pass,score:null==(s=r.score)?1:Math.max(0,Math.min(1,s)),message:r.message,metadata:r.metadata,durationMs:t}},errorResult:(e,r,t)=>({name:e.name,pass:!1,score:0,durationMs:t,error:r}),unexpectedResult:()=>({name:"?",pass:!1,score:0,durationMs:0,error:"Unexpected rejection"}),buildSummary:(e,r)=>{let t=0,s=0,n=0,a=0;for(let r of e)r.skipped?a++:r.error?n++:r.pass?t++:s++;return{results:e,totalDurationMs:r,passCount:t,failCount:s,errorCount:n,skippedCount:a}}})}e.s(["runAllEvals",0,s])},25396,e=>{"use strict";var r=e.i(45015),t=e.i(28753),s=e.i(77879),n=e.i(22308),a=e.i(54214),o=e.i(26287);e.i(14214);var i=e.i(88107),l=e.i(39864);async function u(e,r,c,d,p=!1,f,m){try{await (0,t.ensureEvalsLoaded)();let u=(0,s.getSubagentScopedEvals)(f).find(e=>e.name===d);if(!u)return{ok:!1,error:`Eval "${d}" not found for subagent type "${f??"any"}"`};let h=`${r}/agent-${c}`,g=await (0,i.hashSubagentFile)(e,r,c);if(!p&&g){let r=(0,i.hashItemCode)(u.fn),t=await (0,l.getPerItemCacheWithHook)("evals",e,h,u.name,r,g);if(t)return{ok:!0,result:t.value}}let{entries:v,rawLines:S}=await (0,a.getCachedSessionLog)(e,r),x=(0,o.calculateLogStats)(v),E=(0,a.extractSubagentMeta)(v,c),y=f??E?.type,b=m??E?.description,_=(await (0,n.runAllEvals)(S,x,e,r,[u],{source:`agent-${c}`,subagentType:y,subagentDescription:b,parentSessionId:r})).results[0];if(!_)return{ok:!1,error:"No result returned from eval"};if(g){let r=(0,i.hashItemCode)(u.fn);await (0,l.setPerItemCache)("evals",e,h,u.name,r,_,g)}return{ok:!0,result:_}}catch(e){return{ok:!1,error:e instanceof Error?e.message:String(e)}}}(0,e.i(95975).ensureServerEntryExports)([u]),(0,r.registerServerReference)(u,"7f997a99a412be88d90500a8ae54a44045494a9404",null),e.s(["processSubagentEval",0,u])},84234,e=>{"use strict";let r=(0,e.i(44967).createScopedRegistry)("__CLAUDEYE_ENRICHER_REGISTRY__"),t=r.getAll,s=r.getSessionScoped,n=r.getSubagentScoped,a=r.hasSubagent,o=r.has,i=r.clear;e.s(["clearEnrichers",0,i,"getRegisteredEnrichers",0,t,"getSessionScopedEnrichers",0,s,"getSubagentScopedEnrichers",0,n,"hasEnrichers",0,o,"hasSubagentEnrichers",0,a,"registerEnricher",0,function(e,t,s,n="session",a){let o={name:e,fn:t,scope:n};s&&(o.condition=s),a&&(o.subagentType=a),r.register(o)}])},97953,(e,r,t)=>{"use strict";r.exports=e.r(42315).vendored["react-rsc"].ReactServerDOMTurbopackServer},45015,(e,r,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"registerServerReference",{enumerable:!0,get:function(){return s.registerServerReference}});let s=e.r(97953)},14543,26287,e=>{"use strict";async function r(e,r,t){let s=[],n=performance.now(),a=globalThis.__CLAUDEYE_CONDITION_REGISTRY__??null,o=!1;if(a)try{await a(r)||(o=!0)}catch{o=!0}if(o)for(let r of e)s.push(t.skipResult(r));else{let n=e.map(async e=>{if(e.condition)try{if(!await e.condition(r))return t.skipResult(e)}catch(r){return t.errorResult(e,`Condition error: ${r instanceof Error?r.message:String(r)}`,0)}let s=performance.now();try{let n=await e.fn(r),a=Math.round(performance.now()-s);return t.successResult(e,n,a)}catch(n){let r=Math.round(performance.now()-s);return t.errorResult(e,n instanceof Error?n.message:String(n),r)}});for(let e of(await Promise.allSettled(n)))s.push("fulfilled"===e.status?e.value:t.unexpectedResult())}let i=Math.round(performance.now()-n);return t.buildSummary(s,i)}e.s(["runAll",0,r],14543);var t=e.i(67405);e.s(["calculateLogStats",0,function(e){let r=0,s=0,n=0,a=0,o=0,i=new Set;for(let t of e)if("user"===t.type&&r++,"queue-operation"===t.type&&o++,"assistant"===t.type){for(let e of(s++,t.message.content))"tool_use"===e.type&&("Task"===e.name&&(e.subagentType||e.subagentId)?a++:n++);t.message.model&&i.add(t.message.model)}let l="";if(e.length>=2){let r=e[e.length-1].timestampMs-e[0].timestampMs;l=(0,t.formatDuration)(r)}return{turnCount:o,userCount:r,assistantCount:s,toolCallCount:n,subagentCount:a,duration:l,models:Array.from(i)}}],26287)},95975,(e,r,t)=>{"use strict";function s(e){for(let r=0;r<e.length;r++){let t=e[r];if("function"!=typeof t)throw Object.defineProperty(Error(`A "use server" file can only export async functions, found ${typeof t}.
|
|
2
|
-
Read more: https://nextjs.org/docs/messages/invalid-use-server-value`),"__NEXT_ERROR_CODE",{value:"E352",enumerable:!1,configurable:!0})}}Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"ensureServerEntryExports",{enumerable:!0,get:function(){return s}})},7420,e=>{"use strict";var r=e.i(84234),t=e.i(14543);async function s(e,s,n,a,o,i){let l=o??(0,r.getRegisteredEnrichers)(),u={entries:e,stats:s,projectName:n,sessionId:a,source:"session",...i};return(0,t.runAll)(l,u,{skipResult:e=>({name:e.name,data:{},durationMs:0,skipped:!0}),successResult:(e,r,t)=>({name:e.name,data:r,durationMs:t}),errorResult:(e,r,t)=>({name:e.name,data:{},durationMs:t,error:r}),unexpectedResult:()=>({name:"?",data:{},durationMs:0,error:"Unexpected rejection"}),buildSummary:(e,r)=>{let t=0,s=0;for(let r of e)r.skipped?s++:r.error&&t++;return{results:e,totalDurationMs:r,errorCount:t,skippedCount:s}}})}e.s(["runAllEnrichers",0,s])},28488,e=>{"use strict";var r=e.i(45015),t=e.i(28753),s=e.i(84234),n=e.i(7420),a=e.i(54214),o=e.i(26287);e.i(14214);var i=e.i(88107),l=e.i(39864);async function u(e,r,c,d,p=!1,f,m){try{await (0,t.ensureEvalsLoaded)();let u=(0,s.getSubagentScopedEnrichers)(f).find(e=>e.name===d);if(!u)return{ok:!1,error:`Enricher "${d}" not found for subagent type "${f??"any"}"`};let h=`${r}/agent-${c}`,g=await (0,i.hashSubagentFile)(e,r,c);if(!p&&g){let r=(0,i.hashItemCode)(u.fn),t=await (0,l.getPerItemCacheWithHook)("enrichments",e,h,u.name,r,g);if(t)return{ok:!0,result:t.value}}let{entries:v,rawLines:S}=await (0,a.getCachedSessionLog)(e,r),x=(0,o.calculateLogStats)(v),E=(0,a.extractSubagentMeta)(v,c),y=f??E?.type,b=m??E?.description,_=(await (0,n.runAllEnrichers)(S,x,e,r,[u],{source:`agent-${c}`,subagentType:y,subagentDescription:b,parentSessionId:r})).results[0];if(!_)return{ok:!1,error:"No result returned from enricher"};if(g){let r=(0,i.hashItemCode)(u.fn);await (0,l.setPerItemCache)("enrichments",e,h,u.name,r,_,g)}return{ok:!0,result:_}}catch(e){return{ok:!1,error:e instanceof Error?e.message:String(e)}}}(0,e.i(95975).ensureServerEntryExports)([u]),(0,r.registerServerReference)(u,"7f7b79e5c7b615fe59950455cac1c3bb360f1abd57",null),e.s(["processSubagentEnrichment",0,u])},6878,e=>{e.v(r=>Promise.all(["server/chunks/node_modules_next_124cnn1._.js"].map(r=>e.l(r))).then(()=>r(93458)))},26404,e=>{e.v(r=>Promise.all(["server/chunks/lib_auth_ts_05~zlc~._.js"].map(r=>e.l(r))).then(()=>r(68105)))},49590,e=>{e.v(r=>Promise.all(["server/chunks/lib_evals_cache-invalidation-registry_ts_098zh5h._.js"].map(r=>e.l(r))).then(()=>r(3539)))},16865,e=>{e.v(e=>Promise.resolve().then(()=>e(77879)))},10772,e=>{e.v(e=>Promise.resolve().then(()=>e(84234)))},85691,e=>{e.v(r=>Promise.all(["server/chunks/[externals]__12dv.x0._.js","server/chunks/node_modules_posthog-node_dist_entrypoints_index_node_mjs_00~~2w9._.js"].map(r=>e.l(r))).then(()=>r(39702)))},31966,e=>{e.v(e=>Promise.resolve().then(()=>e(81929)))},66834,e=>{e.v(e=>Promise.resolve().then(()=>e(91560)))},4122,e=>{e.v(e=>Promise.resolve().then(()=>e(25396)))},15086,e=>{e.v(e=>Promise.resolve().then(()=>e(28488)))}];
|
|
3
|
-
|
|
4
|
-
//# sourceMappingURL=%5Broot-of-the-server%5D__0_03u6.._.js.map
|
|
@@ -1,3 +0,0 @@
|
|
|
1
|
-
module.exports=[14747,(e,t,n)=>{t.exports=e.x("path",()=>require("path"))},24868,(e,t,n)=>{t.exports=e.x("fs/promises",()=>require("fs/promises"))},46786,(e,t,n)=>{t.exports=e.x("os",()=>require("os"))},18622,(e,t,n)=>{t.exports=e.x("next/dist/compiled/next-server/app-page-turbo.runtime.prod.js",()=>require("next/dist/compiled/next-server/app-page-turbo.runtime.prod.js"))},56704,(e,t,n)=>{t.exports=e.x("next/dist/server/app-render/work-async-storage.external.js",()=>require("next/dist/server/app-render/work-async-storage.external.js"))},32319,(e,t,n)=>{t.exports=e.x("next/dist/server/app-render/work-unit-async-storage.external.js",()=>require("next/dist/server/app-render/work-unit-async-storage.external.js"))},24725,(e,t,n)=>{t.exports=e.x("next/dist/server/app-render/after-task-async-storage.external.js",()=>require("next/dist/server/app-render/after-task-async-storage.external.js"))},70406,(e,t,n)=>{t.exports=e.x("next/dist/compiled/@opentelemetry/api",()=>require("next/dist/compiled/@opentelemetry/api"))},93695,(e,t,n)=>{t.exports=e.x("next/dist/shared/lib/no-fallback-error.external.js",()=>require("next/dist/shared/lib/no-fallback-error.external.js"))},42315,(e,t,n)=>{"use strict";t.exports=e.r(18622)},40911,e=>{"use strict";let t={info:0,warn:1,error:2};function n(e){return t[e]>=t.warn}function r(e){return`[claudeye ${new Date().toISOString()}] ${e}`}async function a(){try{let{cookies:t}=await e.A(6878),n=await t(),r=n.get("claudeye_session")?.value;if(!r)return"anonymous";let a=process.env.CLAUDEYE_AUTH_SECRET??"",{verifySessionCookie:s}=await e.A(26404);return await s(r,a)??"anonymous"}catch{return"anonymous"}}e.s(["getRequestUsername",0,a,"logActivity",0,function(e,t,a){if(!n("info"))return;let s=[`user=${e}`,`action=${t}`];a&&s.push(a),console.log(r("ACTIVITY"),s.join(" "))},"logError",0,function(e,t){void 0!==t?console.error(r("ERROR"),e,t):console.error(r("ERROR"),e)},"logWarn",0,function(e,t){n("warn")&&(void 0!==t?console.warn(r("WARN"),e,t):console.warn(r("WARN"),e))}])},81580,e=>{"use strict";var t=e.i(46786),n=e.i(14747);e.s(["getClaudeProjectsPath",0,function(){let e=process.env.CLAUDE_PROJECTS_PATH;return e||(0,n.join)((0,t.homedir)(),".claude","projects")}])},54214,83534,41444,67405,e=>{"use strict";var t=e.i(24868),n=e.i(14747),r=e.i(81580);async function a(e,r,a,s){let i=`agent-${s}.jsonl`;for(let s of[(0,n.join)(e,r,i),(0,n.join)(e,r,a,i),(0,n.join)(e,r,a,"subagents",i)])if(!(0,n.relative)(e,s).startsWith(".."))try{return await (0,t.access)(s),s}catch(e){if("ENOENT"!==e.code)continue}return null}function s(e,t,n){let r=new Map,a=new Map,s=n?.maxSize;return async(...n)=>{let i=JSON.stringify(n),o=r.get(i);if(o&&Date.now()<o.expiry)return s&&(r.delete(i),r.set(i,o)),o.data;let l=a.get(i);if(l)return l;let u=e(...n).then(e=>{if(a.delete(i),s&&r.size>=s){let e=r.keys().next().value;r.delete(e)}return r.set(i,{data:e,expiry:Date.now()+1e3*t}),e},e=>{throw a.delete(i),e});return a.set(i,u),u}}function i(e){return new Intl.DateTimeFormat("en-US",{month:"short",day:"numeric",year:"numeric",hour:"numeric",minute:"2-digit",hour12:!0}).format(e)}function o(e){if(e<1e3)return`${e}ms`;let t=e/1e3;if(t<60)return`${t.toFixed(1)}s`;let n=Math.floor(t/60);if(n>=60){let e=Math.floor(n/60);return`${e}h ${n%60}m`}let r=(t%60).toFixed(0);return`${n}m ${r}s`}function l(e){let t=i(e),n=e.getMilliseconds().toString().padStart(3,"0");return`${t}.${n}`}function u(e,t,n,r){return{_source:r,uuid:e.uuid||"",parentUuid:e.parentUuid??null,timestamp:t,timestampMs:n.getTime(),timestampFormatted:l(n)}}async function d(e,t){let n=e.split("\n").filter(e=>""!==e.trim()),r=new Map,a=[],s=[],i=new Set,d=!1;for(let e=0;e<n.length;e++){let o;e>0&&e%200==0&&await new Promise(e=>setImmediate(e));let l=n[e];try{o=JSON.parse(l)}catch{continue}let p={...o,_source:t};s.push(p);let c=o.type,m=o.timestamp;if(!m)continue;let f=new Date(m),g=f.getTime();if("user"===c){let e=o.message;if(Array.isArray(e?.content)){let t=e.content;if(t.some(e=>"tool_result"===e.type)){let e=o.toolUseResult,n="string"==typeof e?.agentId?e.agentId:void 0;for(let e of(n&&/^[a-f0-9]+$/.test(n)&&i.add(n),t)){if("tool_result"!==e.type)continue;let t=e.tool_use_id;if(!t)continue;let{text:a,images:s}=function(e){let t=e.content;if("string"==typeof t)return{text:t};if(Array.isArray(t)){let e=t.filter(e=>"text"===e.type).map(e=>e.text),n=t.filter(e=>"image"===e.type).map(e=>{let t=e.source;return{base64:t.data,mediaType:t.media_type}}).filter(e=>e.base64&&e.mediaType);return{text:e.length>0?e.join("\n"):void 0,images:n.length>0?n:void 0}}return{}}(e);r.set(t,{timestamp:m,timestampMs:g,content:a,images:s,agentId:n})}continue}}let n="string"==typeof e?.content?e.content:"";a.push({type:"user",...u(o,m,f,t),message:{role:"user",content:n}});continue}if("assistant"===c){let e=o.message,n=[];if(Array.isArray(e?.content)&&(n=e.content.filter(e=>["text","tool_use","thinking"].includes(e.type)).map(e=>{if("text"===e.type)return{type:"text",text:e.text};if("tool_use"===e.type){let t=e.input;return{type:"tool_use",id:e.id,name:e.name,input:e.input??{},..."Task"===e.name&&t?{subagentType:t.subagent_type,subagentDescription:t.description}:{}}}return{type:"thinking",thinking:e.thinking,signature:e.signature}})),0===n.length)continue;a.push({type:"assistant",...u(o,m,f,t),message:{role:"assistant",content:n,model:e?.model}});continue}if("file-history-snapshot"===c||"progress"===c||"system"===c){a.push({type:c,...u(o,m,f,t),raw:{...o}});continue}if("queue-operation"===c){let e=d?"Session Resumed":"Session Started";d=!0,a.push({type:"queue-operation",...u(o,m,f,t),label:e});continue}}let p=0;for(let e of a)if("assistant"===e.type)for(let t of(++p%200==0&&await new Promise(e=>setImmediate(e)),e.message.content)){if("tool_use"!==t.type)continue;let n=r.get(t.id);if(!n)continue;let a=new Date(n.timestamp),s=n.timestampMs-e.timestampMs;t.result={timestamp:n.timestamp,timestampFormatted:l(a),content:n.content,images:n.images,durationMs:s,durationFormatted:o(s)},n.agentId&&(t.subagentId=n.agentId)}return a.length>500&&await new Promise(e=>setImmediate(e)),a.sort((e,t)=>e.timestampMs-t.timestampMs),{entries:a,rawLines:s,subagentIds:Array.from(i)}}async function p(e,s){let i=(0,r.getClaudeProjectsPath)(),o=(0,n.join)(i,e,`${s}.jsonl`),l=await (0,t.readFile)(o,"utf-8"),{entries:u,rawLines:p,subagentIds:c}=await d(l,"session");if(0===c.length)return{entries:u,rawLines:p,subagentIds:[]};let m=await Promise.allSettled(c.map(async n=>{let r=`agent-${n}`,o=await a(i,e,s,n);if(!o)return null;let l=await (0,t.readFile)(o,"utf-8"),{entries:u,rawLines:p}=await d(l,r);return{entries:u,rawLines:p}})),f=[...u],g=[...p];for(let e of m)"fulfilled"===e.status&&e.value&&(f.push(...e.value.entries),g.push(...e.value.rawLines));return f.length>500&&await new Promise(e=>setImmediate(e)),f.sort((e,t)=>e.timestampMs-t.timestampMs),{entries:f,rawLines:g,subagentIds:c}}e.s(["runtimeCache",0,s],83534),e.s(["formatDate",0,i],41444),e.s(["formatDuration",0,o],67405);let c=s((e,t)=>p(e,t),60,{maxSize:50});e.s(["extractSubagentMeta",0,function(e,t){for(let n of e)if("assistant"===n.type){for(let e of n.message.content)if("tool_use"===e.type&&"Task"===e.name&&e.subagentId===t)return{type:e.subagentType,description:e.subagentDescription}}},"getCachedSessionLog",0,c],54214)},9311,e=>{"use strict";var t=e.i(47909),n=e.i(74017),r=e.i(96250),a=e.i(59756),s=e.i(61916),i=e.i(74677),o=e.i(69741),l=e.i(16795),u=e.i(87718),d=e.i(95169),p=e.i(47587),c=e.i(66012),m=e.i(70101),f=e.i(26937),g=e.i(10372),h=e.i(93695);e.i(20232);var y=e.i(220),x=e.i(89171),w=e.i(40911),v=e.i(54214);let R=/^[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}$/,E=/(^|[\\/])\.\.($|[\\/])/;function A(e,t){return x.NextResponse.json({error:e},{status:t})}async function C(e,{params:t}){let{project:n,session:r}=await t;if(!R.test(r))return A("Invalid session ID",400);if(!n||E.test(n))return A("Invalid project name",400);let a=await (0,w.getRequestUsername)();(0,w.logActivity)(a,"download-log",`project=${n} session=${r}`);try{let{rawLines:e}=await (0,v.getCachedSessionLog)(n,r),t=e.map(e=>JSON.stringify(e)).join("\n")+"\n";return new x.NextResponse(t,{headers:{"Content-Type":"application/x-ndjson","Content-Disposition":`attachment; filename="${r}.jsonl"`}})}catch(e){if("ENOENT"===e.code)return A("Session log not found",404);return A("Failed to read session log",500)}}e.s(["GET",0,C],32525);var _=e.i(32525);let T=new t.AppRouteRouteModule({definition:{kind:n.RouteKind.APP_ROUTE,page:"/api/download/[project]/[session]/route",pathname:"/api/download/[project]/[session]",filename:"route",bundlePath:""},distDir:".next",relativeProjectDir:"",resolvedPagePath:"[project]/app/api/download/[project]/[session]/route.ts",nextConfigOutput:"standalone",userland:_}),{workAsyncStorage:b,workUnitAsyncStorage:S,serverHooks:j}=T;async function P(e,t,r){r.requestMeta&&(0,a.setRequestMeta)(e,r.requestMeta),T.isDev&&(0,a.addRequestMeta)(e,"devRequestTimingInternalsEnd",process.hrtime.bigint());let x="/api/download/[project]/[session]/route";x=x.replace(/\/index$/,"")||"/";let w=await T.prepare(e,t,{srcPage:x,multiZoneDraftMode:!1});if(!w)return t.statusCode=400,t.end("Bad Request"),null==r.waitUntil||r.waitUntil.call(r,Promise.resolve()),null;let{buildId:v,params:R,nextConfig:E,parsedUrl:A,isDraftMode:C,prerenderManifest:_,routerServerContext:b,isOnDemandRevalidate:S,revalidateOnlyGenerated:j,resolvedPathname:P,clientReferenceManifest:N,serverActionsManifest:I}=w,q=(0,o.normalizeAppPath)(x),k=!!(_.dynamicRoutes[q]||_.routes[P]),O=async()=>((null==b?void 0:b.render404)?await b.render404(e,t,A,!1):t.end("This page could not be found"),null);if(k&&!C){let e=!!_.routes[P],t=_.dynamicRoutes[q];if(t&&!1===t.fallback&&!e){if(E.adapterPath)return await O();throw new h.NoFallbackError}}let $=null;!k||T.isDev||C||($="/index"===($=P)?"/":$);let M=!0===T.isDev||!k,D=k&&!M;I&&N&&(0,i.setManifestsSingleton)({page:x,clientReferenceManifest:N,serverActionsManifest:I});let U=e.method||"GET",H=(0,s.getTracer)(),F=H.getActiveScopeSpan(),L=!!(null==b?void 0:b.isWrappedByNextServer),K=!!(0,a.getRequestMeta)(e,"minimalMode"),W=(0,a.getRequestMeta)(e,"incrementalCache")||await T.getIncrementalCache(e,E,_,K);null==W||W.resetRequestCache(),globalThis.__incrementalCache=W;let B={params:R,previewProps:_.preview,renderOpts:{experimental:{authInterrupts:!!E.experimental.authInterrupts},cacheComponents:!!E.cacheComponents,supportsDynamicResponse:M,incrementalCache:W,cacheLifeProfiles:E.cacheLife,waitUntil:r.waitUntil,onClose:e=>{t.on("close",e)},onAfterTaskError:void 0,onInstrumentationRequestError:(t,n,r,a)=>T.onRequestError(e,t,r,a,b)},sharedContext:{buildId:v}},z=new l.NodeNextRequest(e),G=new l.NodeNextResponse(t),J=u.NextRequestAdapter.fromNodeNextRequest(z,(0,u.signalFromNodeResponse)(t));try{let a,i=async e=>T.handle(J,B).finally(()=>{if(!e)return;e.setAttributes({"http.status_code":t.statusCode,"next.rsc":!1});let n=H.getRootSpanAttributes();if(!n)return;if(n.get("next.span_type")!==d.BaseServerSpan.handleRequest)return void console.warn(`Unexpected root span type '${n.get("next.span_type")}'. Please report this Next.js issue https://github.com/vercel/next.js`);let r=n.get("next.route");if(r){let t=`${U} ${r}`;e.setAttributes({"next.route":r,"http.route":r,"next.span_name":t}),e.updateName(t),a&&a!==e&&(a.setAttribute("http.route",r),a.updateName(t))}else e.updateName(`${U} ${x}`)}),o=async a=>{var s,o;let l=async({previousCacheEntry:n})=>{try{if(!K&&S&&j&&!n)return t.statusCode=404,t.setHeader("x-nextjs-cache","REVALIDATED"),t.end("This page could not be found"),null;let s=await i(a);e.fetchMetrics=B.renderOpts.fetchMetrics;let o=B.renderOpts.pendingWaitUntil;o&&r.waitUntil&&(r.waitUntil(o),o=void 0);let l=B.renderOpts.collectedTags;if(!k)return await (0,c.sendResponse)(z,G,s,B.renderOpts.pendingWaitUntil),null;{let e=await s.blob(),t=(0,m.toNodeOutgoingHttpHeaders)(s.headers);l&&(t[g.NEXT_CACHE_TAGS_HEADER]=l),!t["content-type"]&&e.type&&(t["content-type"]=e.type);let n=void 0!==B.renderOpts.collectedRevalidate&&!(B.renderOpts.collectedRevalidate>=g.INFINITE_CACHE)&&B.renderOpts.collectedRevalidate,r=void 0===B.renderOpts.collectedExpire||B.renderOpts.collectedExpire>=g.INFINITE_CACHE?void 0:B.renderOpts.collectedExpire;return{value:{kind:y.CachedRouteKind.APP_ROUTE,status:s.status,body:Buffer.from(await e.arrayBuffer()),headers:t},cacheControl:{revalidate:n,expire:r}}}}catch(t){throw(null==n?void 0:n.isStale)&&await T.onRequestError(e,t,{routerKind:"App Router",routePath:x,routeType:"route",revalidateReason:(0,p.getRevalidateReason)({isStaticGeneration:D,isOnDemandRevalidate:S})},!1,b),t}},u=await T.handleResponse({req:e,nextConfig:E,cacheKey:$,routeKind:n.RouteKind.APP_ROUTE,isFallback:!1,prerenderManifest:_,isRoutePPREnabled:!1,isOnDemandRevalidate:S,revalidateOnlyGenerated:j,responseGenerator:l,waitUntil:r.waitUntil,isMinimalMode:K});if(!k)return null;if((null==u||null==(s=u.value)?void 0:s.kind)!==y.CachedRouteKind.APP_ROUTE)throw Object.defineProperty(Error(`Invariant: app-route received invalid cache entry ${null==u||null==(o=u.value)?void 0:o.kind}`),"__NEXT_ERROR_CODE",{value:"E701",enumerable:!1,configurable:!0});K||t.setHeader("x-nextjs-cache",S?"REVALIDATED":u.isMiss?"MISS":u.isStale?"STALE":"HIT"),C&&t.setHeader("Cache-Control","private, no-cache, no-store, max-age=0, must-revalidate");let d=(0,m.fromNodeOutgoingHttpHeaders)(u.value.headers);return K&&k||d.delete(g.NEXT_CACHE_TAGS_HEADER),!u.cacheControl||t.getHeader("Cache-Control")||d.get("Cache-Control")||d.set("Cache-Control",(0,f.getCacheControlHeader)(u.cacheControl)),await (0,c.sendResponse)(z,G,new Response(u.value.body,{headers:d,status:u.value.status||200})),null};L&&F?await o(F):(a=H.getActiveScopeSpan(),await H.withPropagatedContext(e.headers,()=>H.trace(d.BaseServerSpan.handleRequest,{spanName:`${U} ${x}`,kind:s.SpanKind.SERVER,attributes:{"http.method":U,"http.target":e.url}},o),void 0,!L))}catch(t){if(t instanceof h.NoFallbackError||await T.onRequestError(e,t,{routerKind:"App Router",routePath:q,routeType:"route",revalidateReason:(0,p.getRevalidateReason)({isStaticGeneration:D,isOnDemandRevalidate:S})},!1,b),k)throw t;return await (0,c.sendResponse)(z,G,new Response(null,{status:500})),null}}e.s(["handler",0,P,"patchFetch",0,function(){return(0,r.patchFetch)({workAsyncStorage:b,workUnitAsyncStorage:S})},"routeModule",0,T,"serverHooks",0,j,"workAsyncStorage",0,b,"workUnitAsyncStorage",0,S],9311)},6878,e=>{e.v(t=>Promise.all(["server/chunks/node_modules_next_124cnn1._.js"].map(t=>e.l(t))).then(()=>t(93458)))},26404,e=>{e.v(t=>Promise.all(["server/chunks/lib_auth_ts_05~zlc~._.js"].map(t=>e.l(t))).then(()=>t(68105)))}];
|
|
2
|
-
|
|
3
|
-
//# sourceMappingURL=%5Broot-of-the-server%5D__0ynza7q._.js.map
|