@claudeye/linux-arm64 1.0.7 → 1.0.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (275) hide show
  1. package/assets/dist/hooks-api.d.ts +43 -0
  2. package/assets/dist/hooks-api.js +1 -0
  3. package/assets/dist/index.d.ts +2 -0
  4. package/assets/dist/index.js +1 -1
  5. package/assets/dist/loader.js +2 -2
  6. package/assets/standalone/.next/BUILD_ID +1 -1
  7. package/assets/standalone/.next/app-path-routes-manifest.json +2 -1
  8. package/assets/standalone/.next/build-manifest.json +8 -8
  9. package/assets/standalone/.next/prerender-manifest.json +27 -3
  10. package/assets/standalone/.next/routes-manifest.json +12 -6
  11. package/assets/standalone/.next/server/app/_global-error/page/build-manifest.json +5 -5
  12. package/assets/standalone/.next/server/app/_global-error/page/server-reference-manifest.json +14 -1
  13. package/assets/standalone/.next/server/app/_global-error/page.js +5 -5
  14. package/assets/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  15. package/assets/standalone/.next/server/app/_global-error.html +1 -1
  16. package/assets/standalone/.next/server/app/_global-error.rsc +7 -7
  17. package/assets/standalone/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +2 -2
  18. package/assets/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +7 -7
  19. package/assets/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +3 -3
  20. package/assets/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +3 -3
  21. package/assets/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  22. package/assets/standalone/.next/server/app/_not-found/page/build-manifest.json +5 -5
  23. package/assets/standalone/.next/server/app/_not-found/page/server-reference-manifest.json +2 -2
  24. package/assets/standalone/.next/server/app/_not-found/page.js +6 -7
  25. package/assets/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  26. package/assets/standalone/.next/server/app/_not-found.html +2 -2
  27. package/assets/standalone/.next/server/app/_not-found.rsc +27 -30
  28. package/assets/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +27 -30
  29. package/assets/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +4 -4
  30. package/assets/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +12 -15
  31. package/assets/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +2 -2
  32. package/assets/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +3 -3
  33. package/assets/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
  34. package/assets/standalone/.next/server/app/api/completed-history/route.js +2 -2
  35. package/assets/standalone/.next/server/app/api/download/[project]/[session]/route.js +1 -1
  36. package/assets/standalone/.next/server/app/api/queue-item/route.js +2 -2
  37. package/assets/standalone/.next/server/app/api/queue-status/route.js +2 -2
  38. package/assets/standalone/.next/server/app/dashboard/[viewName]/page/build-manifest.json +5 -5
  39. package/assets/standalone/.next/server/app/dashboard/[viewName]/page/server-reference-manifest.json +5 -5
  40. package/assets/standalone/.next/server/app/dashboard/[viewName]/page.js +8 -9
  41. package/assets/standalone/.next/server/app/dashboard/[viewName]/page_client-reference-manifest.js +1 -1
  42. package/assets/standalone/.next/server/app/dashboard/page/build-manifest.json +5 -5
  43. package/assets/standalone/.next/server/app/dashboard/page/server-reference-manifest.json +5 -5
  44. package/assets/standalone/.next/server/app/dashboard/page.js +9 -10
  45. package/assets/standalone/.next/server/app/dashboard/page_client-reference-manifest.js +1 -1
  46. package/assets/standalone/.next/server/app/index.html +1 -0
  47. package/assets/standalone/.next/server/app/index.meta +15 -0
  48. package/assets/standalone/.next/server/app/index.rsc +22 -0
  49. package/assets/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +6 -0
  50. package/assets/standalone/.next/server/app/index.segments/_full.segment.rsc +22 -0
  51. package/assets/standalone/.next/server/app/index.segments/_head.segment.rsc +6 -0
  52. package/assets/standalone/.next/server/app/index.segments/_index.segment.rsc +12 -0
  53. package/assets/standalone/.next/server/app/index.segments/_tree.segment.rsc +2 -0
  54. package/assets/standalone/.next/server/app/login/page/build-manifest.json +5 -5
  55. package/assets/standalone/.next/server/app/login/page/server-reference-manifest.json +3 -3
  56. package/assets/standalone/.next/server/app/login/page.js +6 -7
  57. package/assets/standalone/.next/server/app/login/page_client-reference-manifest.js +1 -1
  58. package/assets/standalone/.next/server/app/login.html +2 -2
  59. package/assets/standalone/.next/server/app/login.rsc +30 -34
  60. package/assets/standalone/.next/server/app/login.segments/_full.segment.rsc +30 -34
  61. package/assets/standalone/.next/server/app/login.segments/_head.segment.rsc +4 -4
  62. package/assets/standalone/.next/server/app/login.segments/_index.segment.rsc +12 -15
  63. package/assets/standalone/.next/server/app/login.segments/_tree.segment.rsc +2 -2
  64. package/assets/standalone/.next/server/app/login.segments/login/__PAGE__.segment.rsc +4 -4
  65. package/assets/standalone/.next/server/app/login.segments/login.segment.rsc +3 -3
  66. package/assets/standalone/.next/server/app/page/build-manifest.json +5 -5
  67. package/assets/standalone/.next/server/app/page/server-reference-manifest.json +2 -2
  68. package/assets/standalone/.next/server/app/page.js +7 -8
  69. package/assets/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  70. package/assets/standalone/.next/server/app/policies/page/app-paths-manifest.json +3 -0
  71. package/assets/standalone/.next/server/app/{hooks → policies}/page/build-manifest.json +5 -5
  72. package/assets/standalone/.next/server/app/{hooks → policies}/page/server-reference-manifest.json +36 -24
  73. package/assets/standalone/.next/server/app/{hooks → policies}/page.js +9 -10
  74. package/assets/standalone/.next/server/app/policies/page_client-reference-manifest.js +3 -0
  75. package/assets/standalone/.next/server/app/project/[name]/page/build-manifest.json +5 -5
  76. package/assets/standalone/.next/server/app/project/[name]/page/server-reference-manifest.json +2 -2
  77. package/assets/standalone/.next/server/app/project/[name]/page.js +7 -9
  78. package/assets/standalone/.next/server/app/project/[name]/page_client-reference-manifest.js +1 -1
  79. package/assets/standalone/.next/server/app/project/[name]/session/[sessionId]/page/build-manifest.json +5 -5
  80. package/assets/standalone/.next/server/app/project/[name]/session/[sessionId]/page/react-loadable-manifest.json +2 -2
  81. package/assets/standalone/.next/server/app/project/[name]/session/[sessionId]/page/server-reference-manifest.json +10 -10
  82. package/assets/standalone/.next/server/app/project/[name]/session/[sessionId]/page.js +8 -9
  83. package/assets/standalone/.next/server/app/project/[name]/session/[sessionId]/page_client-reference-manifest.js +1 -1
  84. package/assets/standalone/.next/server/app/projects/page/app-paths-manifest.json +3 -0
  85. package/assets/standalone/.next/server/app/projects/page/build-manifest.json +18 -0
  86. package/assets/standalone/.next/server/app/projects/page/next-font-manifest.json +6 -0
  87. package/assets/standalone/.next/server/app/projects/page/react-loadable-manifest.json +1 -0
  88. package/assets/standalone/.next/server/app/projects/page/server-reference-manifest.json +29 -0
  89. package/assets/standalone/.next/server/app/projects/page.js +18 -0
  90. package/assets/standalone/.next/server/app/projects/page_client-reference-manifest.js +3 -0
  91. package/assets/standalone/.next/server/app/queue/page/build-manifest.json +5 -5
  92. package/assets/standalone/.next/server/app/queue/page/server-reference-manifest.json +4 -4
  93. package/assets/standalone/.next/server/app/queue/page.js +8 -9
  94. package/assets/standalone/.next/server/app/queue/page_client-reference-manifest.js +1 -1
  95. package/assets/standalone/.next/server/app-paths-manifest.json +2 -1
  96. package/assets/standalone/.next/server/chunks/[root-of-the-server]__0-_qfa9._.js +1 -1
  97. package/assets/standalone/.next/server/chunks/[root-of-the-server]__0.lwwrp._.js +3 -0
  98. package/assets/standalone/.next/server/chunks/[root-of-the-server]__072w.g0._.js +1 -1
  99. package/assets/standalone/.next/server/chunks/[root-of-the-server]__08lgurx._.js +1 -1
  100. package/assets/standalone/.next/server/chunks/[root-of-the-server]__0bps8pa._.js +1 -1
  101. package/assets/standalone/.next/server/chunks/[root-of-the-server]__0f_5ws6._.js +1 -1
  102. package/assets/standalone/.next/server/chunks/[root-of-the-server]__0g72weg._.js +1 -1
  103. package/assets/standalone/.next/server/chunks/[root-of-the-server]__0ld-~9t._.js +1 -1
  104. package/assets/standalone/.next/server/chunks/[root-of-the-server]__0ndqa7s._.js +8 -3
  105. package/assets/standalone/.next/server/chunks/{[root-of-the-server]__0wkrejt._.js → [root-of-the-server]__0rtkhr~._.js} +1 -1
  106. package/assets/standalone/.next/server/chunks/{[root-of-the-server]__031vvrp._.js → [root-of-the-server]__0tlbu6c._.js} +1 -1
  107. package/assets/standalone/.next/server/chunks/[root-of-the-server]__0vfmej5._.js +4 -0
  108. package/assets/standalone/.next/server/chunks/_04cgd3m._.js +11 -0
  109. package/assets/standalone/.next/server/chunks/_0aylu-q._.js +2 -2
  110. package/assets/standalone/.next/server/chunks/_0h9z2~x._.js +11 -0
  111. package/assets/standalone/.next/server/chunks/_0lq2_wn._.js +2 -2
  112. package/assets/standalone/.next/server/chunks/_0oqawqx._.js +2 -2
  113. package/assets/standalone/.next/server/chunks/_0vt409y._.js +2 -2
  114. package/assets/standalone/.next/server/chunks/lib_0a9kq7-._.js +11 -0
  115. package/assets/standalone/.next/server/chunks/lib_0b2.9p5._.js +11 -0
  116. package/assets/standalone/.next/server/chunks/lib_13x.g8a._.js +11 -0
  117. package/assets/standalone/.next/server/chunks/lib_eval-queue_ts_08t8vgq._.js +1 -1
  118. package/assets/standalone/.next/server/chunks/lib_eval-queue_ts_0h8e7f.._.js +1 -1
  119. package/assets/standalone/.next/server/chunks/node_modules_next_dist_esm_build_templates_app-route_0l15kkr.js +1 -1
  120. package/assets/standalone/.next/server/chunks/package_json_[json]_cjs_0z7w.hh._.js +1 -1
  121. package/assets/standalone/.next/server/chunks/ssr/[root-of-the-server]__0-9w~bh._.js +3 -0
  122. package/assets/standalone/.next/server/chunks/ssr/[root-of-the-server]__0-_oq51._.js +4 -0
  123. package/assets/standalone/.next/server/chunks/ssr/[root-of-the-server]__0-om19y._.js +11 -0
  124. package/assets/standalone/.next/server/chunks/ssr/[root-of-the-server]__0-wbic0._.js +45 -0
  125. package/assets/standalone/.next/server/chunks/ssr/[root-of-the-server]__02l2rag._.js +3 -0
  126. package/assets/standalone/.next/server/chunks/ssr/[root-of-the-server]__04qo1w2._.js +4 -0
  127. package/assets/standalone/.next/server/chunks/ssr/[root-of-the-server]__09y6src._.js +4 -0
  128. package/assets/standalone/.next/server/chunks/ssr/[root-of-the-server]__09y7ni.._.js +3 -0
  129. package/assets/standalone/.next/server/chunks/ssr/[root-of-the-server]__0bubgf_._.js +4 -0
  130. package/assets/standalone/.next/server/chunks/ssr/[root-of-the-server]__0f7wkrr._.js +3 -0
  131. package/assets/standalone/.next/server/chunks/ssr/{[root-of-the-server]__0l897tw._.js → [root-of-the-server]__0iv48_z._.js} +2 -2
  132. package/assets/standalone/.next/server/chunks/ssr/[root-of-the-server]__0j7bj94._.js +3 -0
  133. package/assets/standalone/.next/server/chunks/ssr/[root-of-the-server]__0m0x9dt._.js +4 -0
  134. package/assets/standalone/.next/server/chunks/ssr/[root-of-the-server]__0oy2.6r._.js +3 -0
  135. package/assets/standalone/.next/server/chunks/ssr/[root-of-the-server]__0pw0g9c._.js +4 -0
  136. package/assets/standalone/.next/server/chunks/ssr/[root-of-the-server]__0rm4qtt._.js +4 -0
  137. package/assets/standalone/.next/server/chunks/ssr/[root-of-the-server]__0sn21jm._.js +3 -0
  138. package/assets/standalone/.next/server/chunks/ssr/[root-of-the-server]__0spfsp5._.js +4 -0
  139. package/assets/standalone/.next/server/chunks/ssr/[root-of-the-server]__0uz88bg._.js +3 -0
  140. package/assets/standalone/.next/server/chunks/ssr/[root-of-the-server]__0x7-awk._.js +4 -0
  141. package/assets/standalone/.next/server/chunks/ssr/[root-of-the-server]__0zva2n_._.js +4 -0
  142. package/assets/standalone/.next/server/chunks/ssr/[root-of-the-server]__1370kzv._.js +4 -0
  143. package/assets/standalone/.next/server/chunks/ssr/_01fj_8s._.js +1 -1
  144. package/assets/standalone/.next/server/chunks/ssr/_02_tcps._.js +32 -0
  145. package/assets/standalone/.next/server/chunks/ssr/_04.u7zx._.js +3 -0
  146. package/assets/standalone/.next/server/chunks/ssr/_06383ya._.js +3 -0
  147. package/assets/standalone/.next/server/chunks/ssr/_06nq9qk._.js +1 -1
  148. package/assets/standalone/.next/server/chunks/ssr/_0i~.gk_._.js +1 -1
  149. package/assets/standalone/.next/server/chunks/ssr/_0kfjwwu._.js +1 -1
  150. package/assets/standalone/.next/server/chunks/ssr/_0km.fsf._.js +3 -0
  151. package/assets/standalone/.next/server/chunks/ssr/_0rr.uoo._.js +3 -3
  152. package/assets/standalone/.next/server/chunks/ssr/_0x26hbi._.js +3 -0
  153. package/assets/standalone/.next/server/chunks/ssr/{_0_ia8tm._.js → _0xg44oj._.js} +2 -2
  154. package/assets/standalone/.next/server/chunks/ssr/_11ou~_x._.js +3 -0
  155. package/assets/standalone/.next/server/chunks/ssr/_1207ol.._.js +1 -1
  156. package/assets/standalone/.next/server/chunks/ssr/app_04qfs8z._.js +1 -1
  157. package/assets/standalone/.next/server/chunks/ssr/app_05evmdg._.js +1 -1
  158. package/assets/standalone/.next/server/chunks/ssr/app_07izk21._.js +1 -1
  159. package/assets/standalone/.next/server/chunks/ssr/app_0uosk1e._.js +1 -1
  160. package/assets/standalone/.next/server/chunks/ssr/app_13f0ohr._.js +1 -1
  161. package/assets/standalone/.next/server/chunks/ssr/app_actions_compute-dashboard_ts_13cb_9d._.js +1 -1
  162. package/assets/standalone/.next/server/chunks/ssr/app_global-error_tsx_0m9qisk._.js +3 -0
  163. package/assets/standalone/.next/server/chunks/ssr/app_global-error_tsx_0xerkr6._.js +3 -0
  164. package/assets/standalone/.next/server/chunks/ssr/app_login_page_tsx_0z71ad3._.js +1 -1
  165. package/assets/standalone/.next/server/chunks/ssr/app_policies_hooks-client_tsx_0q-m0y-._.js +8 -0
  166. package/assets/standalone/.next/server/chunks/ssr/{app_loading_tsx_05semg5._.js → app_projects_loading_tsx_13veom4._.js} +2 -2
  167. package/assets/standalone/.next/server/chunks/ssr/app_queue_queue-client_tsx_0c0olxv._.js +1 -1
  168. package/assets/standalone/.next/server/chunks/ssr/node_modules_next_0rd0oc-._.js +2 -2
  169. package/assets/standalone/.next/server/chunks/ssr/node_modules_next_dist_0h9llsw._.js +2 -2
  170. package/assets/standalone/.next/server/chunks/ssr/node_modules_next_dist_0~3yv~8._.js +3 -0
  171. 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
  172. 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
  173. package/assets/standalone/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_0a_7sdg.js +4 -0
  174. 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
  175. 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
  176. 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
  177. 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
  178. package/assets/standalone/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_0r6o0i2.js +4 -0
  179. 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
  180. 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
  181. 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
  182. package/assets/standalone/.next/server/middleware-build-manifest.js +8 -8
  183. package/assets/standalone/.next/server/pages/404.html +2 -2
  184. package/assets/standalone/.next/server/pages/500.html +1 -1
  185. package/assets/standalone/.next/server/server-reference-manifest.js +1 -1
  186. package/assets/standalone/.next/server/server-reference-manifest.json +82 -52
  187. package/assets/standalone/.next/static/chunks/0.llxyobdk9ao.js +1 -0
  188. package/assets/standalone/.next/static/chunks/{0lkh25hviflid.js → 013e6ucdn~oej.js} +1 -1
  189. package/assets/standalone/.next/static/chunks/01i5gpaes1u49.js +6 -0
  190. package/assets/standalone/.next/static/chunks/01q52wg_amm60.js +2 -0
  191. package/assets/standalone/.next/static/chunks/{053grpfc7gghs.js → 01z1mkd0jlg01.js} +1 -1
  192. package/assets/standalone/.next/static/chunks/041yg1qijsts_.js +1 -0
  193. package/assets/standalone/.next/static/chunks/0_s0luks5tay-.js +1 -0
  194. package/assets/standalone/.next/static/chunks/0c0j9cso1kkr_.css +1 -0
  195. package/assets/standalone/.next/static/chunks/0dji_r0j6sq~f.js +1 -0
  196. package/assets/standalone/.next/static/chunks/0eozapv72nxu9.js +1 -0
  197. package/assets/standalone/.next/static/chunks/0r-uj~~hfjn~d.js +4 -0
  198. package/assets/standalone/.next/static/chunks/0r33ook0mzjdp.js +3 -0
  199. package/assets/standalone/.next/static/chunks/0tdv9t00~jli0.js +1 -0
  200. package/assets/standalone/.next/static/chunks/0tyw4u3~2isbh.js +1 -0
  201. package/assets/standalone/.next/static/chunks/{0h4bq73pogmtb.js → 0u95dh6lcl7tm.js} +31 -1
  202. package/assets/standalone/.next/static/chunks/0yby34zxp~u9y.js +1 -0
  203. package/assets/standalone/.next/static/chunks/10qr1cqizt~sp.js +1 -0
  204. package/assets/standalone/.next/static/chunks/{04aem330ymbdp.js → 150i0n26fnvso.js} +1 -1
  205. package/assets/standalone/.next/static/chunks/15fklyav5py5m.js +1 -0
  206. package/assets/standalone/.next/static/chunks/16g-s3n9.r1ua.js +1 -0
  207. package/assets/standalone/.next/static/chunks/17.b3suj8zjjj.js +1 -0
  208. package/assets/standalone/.next/static/chunks/{turbopack-05k-ytyhplqy7.js → turbopack-0.w3uhj.ln7pt.js} +1 -1
  209. package/assets/standalone/README.md +119 -5
  210. package/assets/standalone/design-docs/custom-hooks.md +722 -0
  211. package/assets/standalone/design-docs/e2e-hook-testing.md +420 -0
  212. package/assets/standalone/package.json +4 -2
  213. package/assets/standalone/vitest.config.e2e.mts +21 -0
  214. package/bin/claudeye +0 -0
  215. package/package.json +1 -1
  216. package/assets/standalone/.next/server/app/hooks/page/app-paths-manifest.json +0 -3
  217. package/assets/standalone/.next/server/app/hooks/page_client-reference-manifest.js +0 -3
  218. package/assets/standalone/.next/server/chunks/[root-of-the-server]__0_03u6.._.js +0 -4
  219. package/assets/standalone/.next/server/chunks/[root-of-the-server]__0ynza7q._.js +0 -3
  220. package/assets/standalone/.next/server/chunks/_0fx1kj9._.js +0 -7
  221. package/assets/standalone/.next/server/chunks/_12qi01p._.js +0 -7
  222. package/assets/standalone/.next/server/chunks/lib_0it0qxy._.js +0 -7
  223. package/assets/standalone/.next/server/chunks/lib_0k3u5ri._.js +0 -7
  224. package/assets/standalone/.next/server/chunks/ssr/[root-of-the-server]__0-j~_e.._.js +0 -3
  225. package/assets/standalone/.next/server/chunks/ssr/[root-of-the-server]__00fve8g._.js +0 -36
  226. package/assets/standalone/.next/server/chunks/ssr/[root-of-the-server]__028-6zz._.js +0 -3
  227. package/assets/standalone/.next/server/chunks/ssr/[root-of-the-server]__02x4-91._.js +0 -4
  228. package/assets/standalone/.next/server/chunks/ssr/[root-of-the-server]__06tqxbp._.js +0 -4
  229. package/assets/standalone/.next/server/chunks/ssr/[root-of-the-server]__08a4wva._.js +0 -3
  230. package/assets/standalone/.next/server/chunks/ssr/[root-of-the-server]__0a-4fjm._.js +0 -33
  231. package/assets/standalone/.next/server/chunks/ssr/[root-of-the-server]__0cnf9rp._.js +0 -3
  232. package/assets/standalone/.next/server/chunks/ssr/[root-of-the-server]__0dsucx_._.js +0 -4
  233. package/assets/standalone/.next/server/chunks/ssr/[root-of-the-server]__0e9ohz2._.js +0 -4
  234. package/assets/standalone/.next/server/chunks/ssr/[root-of-the-server]__0fltiz1._.js +0 -4
  235. package/assets/standalone/.next/server/chunks/ssr/[root-of-the-server]__0ksoh6e._.js +0 -3
  236. package/assets/standalone/.next/server/chunks/ssr/[root-of-the-server]__0ni-as.._.js +0 -4
  237. package/assets/standalone/.next/server/chunks/ssr/[root-of-the-server]__0tsew7c._.js +0 -4
  238. package/assets/standalone/.next/server/chunks/ssr/[root-of-the-server]__0x5abxa._.js +0 -3
  239. package/assets/standalone/.next/server/chunks/ssr/[root-of-the-server]__0yi-883._.js +0 -4
  240. package/assets/standalone/.next/server/chunks/ssr/[root-of-the-server]__0zn.1q2._.js +0 -3
  241. package/assets/standalone/.next/server/chunks/ssr/[root-of-the-server]__10_wjge._.js +0 -4
  242. package/assets/standalone/.next/server/chunks/ssr/[root-of-the-server]__11xi38p._.js +0 -7
  243. package/assets/standalone/.next/server/chunks/ssr/_03l0_j6._.js +0 -3
  244. package/assets/standalone/.next/server/chunks/ssr/_050qnuh._.js +0 -3
  245. package/assets/standalone/.next/server/chunks/ssr/_0_~1-jh._.js +0 -3
  246. package/assets/standalone/.next/server/chunks/ssr/_0ndt7tj._.js +0 -3
  247. package/assets/standalone/.next/server/chunks/ssr/_0uig1kl._.js +0 -3
  248. package/assets/standalone/.next/server/chunks/ssr/_0vc9nu-._.js +0 -32
  249. package/assets/standalone/.next/server/chunks/ssr/_next-internal_server_app__global-error_page_actions_0k77kol.js +0 -3
  250. package/assets/standalone/.next/server/chunks/ssr/app_hooks_hooks-client_tsx_0n~.yoz._.js +0 -3
  251. package/assets/standalone/.next/server/chunks/ssr/node_modules_0gyjybr._.js +0 -3
  252. package/assets/standalone/.next/server/chunks/ssr/node_modules_next_dist_client_components_06j6hww._.js +0 -33
  253. package/assets/standalone/.next/server/chunks/ssr/node_modules_next_dist_client_components_builtin_global-error_0lgvd_..js +0 -3
  254. package/assets/standalone/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_0~flnue.js +0 -4
  255. package/assets/standalone/.next/static/chunks/0-06jeyuuf3mf.js +0 -1
  256. package/assets/standalone/.next/static/chunks/0.z9o1xk80npg.js +0 -2
  257. package/assets/standalone/.next/static/chunks/01xlw8hd842-c.js +0 -1
  258. package/assets/standalone/.next/static/chunks/09f624.buk6jr.js +0 -1
  259. package/assets/standalone/.next/static/chunks/0g5cvlv5.8drd.js +0 -3
  260. package/assets/standalone/.next/static/chunks/0g~w.4hiyi_1j.js +0 -1
  261. package/assets/standalone/.next/static/chunks/0il8_19l.4u-p.js +0 -1
  262. package/assets/standalone/.next/static/chunks/0j1-mgai_b50s.css +0 -1
  263. package/assets/standalone/.next/static/chunks/0ljjv.c03-d.y.js +0 -1
  264. package/assets/standalone/.next/static/chunks/0n6vo_gsuay4v.js +0 -4
  265. package/assets/standalone/.next/static/chunks/0nntcr2py4m14.js +0 -1
  266. package/assets/standalone/.next/static/chunks/0sp_gwqc7ka~z.js +0 -1
  267. package/assets/standalone/.next/static/chunks/0z0dljl8fz7.-.js +0 -1
  268. package/assets/standalone/.next/static/chunks/0z9fpf50h7mcq.js +0 -1
  269. package/assets/standalone/.next/static/chunks/115dplafwys-z.js +0 -31
  270. package/assets/standalone/.next/static/chunks/119bhqt_bddam.js +0 -1
  271. /package/assets/standalone/.next/server/app/{hooks → policies}/page/next-font-manifest.json +0 -0
  272. /package/assets/standalone/.next/server/app/{hooks → policies}/page/react-loadable-manifest.json +0 -0
  273. /package/assets/standalone/.next/static/{l1G516WtxNj1aLrIr5STH → T2uFRf42cIG4zxcRtc0qK}/_buildManifest.js +0 -0
  274. /package/assets/standalone/.next/static/{l1G516WtxNj1aLrIr5STH → T2uFRf42cIG4zxcRtc0qK}/_clientMiddlewareManifest.js +0 -0
  275. /package/assets/standalone/.next/static/{l1G516WtxNj1aLrIr5STH → T2uFRf42cIG4zxcRtc0qK}/_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.7",
3
+ "version": "1.0.9",
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,6 +1,6 @@
1
1
  {
2
2
  "name": "@claudeye/linux-arm64",
3
- "version": "1.0.7",
3
+ "version": "1.0.9",
4
4
  "description": "Claudeye platform binary for Linux ARM64",
5
5
  "os": [
6
6
  "linux"
@@ -1,3 +0,0 @@
1
- {
2
- "/hooks/page": "app/hooks/page.js"
3
- }
@@ -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