dev3000 0.0.72 → 0.0.74

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 (277) hide show
  1. package/README.md +78 -30
  2. package/dist/cli.js +3 -1
  3. package/dist/cli.js.map +1 -1
  4. package/dist/dev-environment.d.ts +10 -1
  5. package/dist/dev-environment.d.ts.map +1 -1
  6. package/dist/dev-environment.js +676 -6
  7. package/dist/dev-environment.js.map +1 -1
  8. package/dist/src/loading.html +1 -1
  9. package/dist/src/tui-interface-impl.tsx +35 -30
  10. package/dist/tui-interface-impl.d.ts.map +1 -1
  11. package/dist/tui-interface-impl.js +26 -20
  12. package/dist/tui-interface-impl.js.map +1 -1
  13. package/dist/tui-interface.d.ts.map +1 -1
  14. package/dist/tui-interface.js +26 -5
  15. package/dist/tui-interface.js.map +1 -1
  16. package/mcp-server/.next/BUILD_ID +1 -1
  17. package/mcp-server/.next/build-manifest.json +8 -8
  18. package/mcp-server/.next/fallback-build-manifest.json +2 -2
  19. package/mcp-server/.next/images-manifest.json +2 -2
  20. package/mcp-server/.next/next-minimal-server.js.nft.json +1 -1
  21. package/mcp-server/.next/next-server.js.nft.json +1 -1
  22. package/mcp-server/.next/prerender-manifest.json +10 -10
  23. package/mcp-server/.next/required-server-files.json +5 -6
  24. package/mcp-server/.next/routes-manifest.json +1 -0
  25. package/mcp-server/.next/server/app/_global-error/page/build-manifest.json +6 -6
  26. package/mcp-server/.next/server/app/_global-error/page.js +8 -8
  27. package/mcp-server/.next/server/app/_global-error/page.js.nft.json +1 -1
  28. package/mcp-server/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  29. package/mcp-server/.next/server/app/_global-error.html +2 -2
  30. package/mcp-server/.next/server/app/_global-error.rsc +8 -8
  31. package/mcp-server/.next/server/app/_not-found/page/build-manifest.json +6 -6
  32. package/mcp-server/.next/server/app/_not-found/page.js +10 -10
  33. package/mcp-server/.next/server/app/_not-found/page.js.nft.json +1 -1
  34. package/mcp-server/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  35. package/mcp-server/.next/server/app/_not-found.html +1 -1
  36. package/mcp-server/.next/server/app/_not-found.rsc +8 -8
  37. package/mcp-server/.next/server/app/api/logs/append/route/build-manifest.json +1 -8
  38. package/mcp-server/.next/server/app/api/logs/append/route.js +4 -4
  39. package/mcp-server/.next/server/app/api/logs/append/route.js.nft.json +1 -1
  40. package/mcp-server/.next/server/app/api/logs/head/route/build-manifest.json +1 -8
  41. package/mcp-server/.next/server/app/api/logs/head/route.js +4 -4
  42. package/mcp-server/.next/server/app/api/logs/head/route.js.nft.json +1 -1
  43. package/mcp-server/.next/server/app/api/logs/list/route/build-manifest.json +1 -8
  44. package/mcp-server/.next/server/app/api/logs/list/route.js +4 -4
  45. package/mcp-server/.next/server/app/api/logs/list/route.js.nft.json +1 -1
  46. package/mcp-server/.next/server/app/api/logs/rotate/route/build-manifest.json +1 -8
  47. package/mcp-server/.next/server/app/api/logs/rotate/route.js +5 -5
  48. package/mcp-server/.next/server/app/api/logs/rotate/route.js.nft.json +1 -1
  49. package/mcp-server/.next/server/app/api/logs/stream/route/build-manifest.json +1 -8
  50. package/mcp-server/.next/server/app/api/logs/stream/route.js +4 -4
  51. package/mcp-server/.next/server/app/api/logs/stream/route.js.nft.json +1 -1
  52. package/mcp-server/.next/server/app/api/logs/tail/route/build-manifest.json +1 -8
  53. package/mcp-server/.next/server/app/api/logs/tail/route.js +4 -4
  54. package/mcp-server/.next/server/app/api/logs/tail/route.js.nft.json +1 -1
  55. package/mcp-server/.next/server/app/api/screenshots/[filename]/route/build-manifest.json +1 -8
  56. package/mcp-server/.next/server/app/api/screenshots/[filename]/route.js +5 -5
  57. package/mcp-server/.next/server/app/api/screenshots/[filename]/route.js.nft.json +1 -1
  58. package/mcp-server/.next/server/app/api/tools/route/build-manifest.json +1 -8
  59. package/mcp-server/.next/server/app/api/tools/route.js +5 -5
  60. package/mcp-server/.next/server/app/api/tools/route.js.nft.json +1 -1
  61. package/mcp-server/.next/server/app/index.html +1 -1
  62. package/mcp-server/.next/server/app/index.rsc +10 -10
  63. package/mcp-server/.next/server/app/logs/page/build-manifest.json +6 -6
  64. package/mcp-server/.next/server/app/logs/page.js +13 -13
  65. package/mcp-server/.next/server/app/logs/page.js.nft.json +1 -1
  66. package/mcp-server/.next/server/app/logs/page_client-reference-manifest.js +1 -1
  67. package/mcp-server/.next/server/app/mcp/route/build-manifest.json +1 -8
  68. package/mcp-server/.next/server/app/mcp/route.js +6 -5
  69. package/mcp-server/.next/server/app/mcp/route.js.nft.json +1 -1
  70. package/mcp-server/.next/server/app/page/build-manifest.json +6 -6
  71. package/mcp-server/.next/server/app/page.js +12 -12
  72. package/mcp-server/.next/server/app/page.js.nft.json +1 -1
  73. package/mcp-server/.next/server/app/page_client-reference-manifest.js +1 -1
  74. package/mcp-server/.next/server/chunks/[root-of-the-server]__013bbeea._.js +7 -0
  75. package/mcp-server/.next/server/chunks/[root-of-the-server]__013bbeea._.js.map +1 -0
  76. package/mcp-server/.next/server/chunks/[root-of-the-server]__270b33b7._.js +33 -0
  77. package/mcp-server/.next/server/chunks/[root-of-the-server]__270b33b7._.js.map +1 -0
  78. package/mcp-server/.next/server/chunks/[root-of-the-server]__5580d2ea._.js +35 -0
  79. package/mcp-server/.next/server/chunks/[root-of-the-server]__5580d2ea._.js.map +1 -0
  80. package/mcp-server/.next/server/chunks/[root-of-the-server]__6fa7ea53._.js +3 -0
  81. package/mcp-server/.next/server/chunks/[root-of-the-server]__73645708._.js +11 -0
  82. package/mcp-server/.next/server/chunks/[root-of-the-server]__73645708._.js.map +1 -0
  83. package/mcp-server/.next/server/chunks/[root-of-the-server]__8fc8f497._.js +4 -0
  84. package/mcp-server/.next/server/chunks/[root-of-the-server]__8fc8f497._.js.map +1 -0
  85. package/mcp-server/.next/server/chunks/[root-of-the-server]__9c489027._.js +3 -0
  86. package/mcp-server/.next/server/chunks/[root-of-the-server]__9c489027._.js.map +1 -0
  87. package/mcp-server/.next/server/chunks/[root-of-the-server]__cc81580c._.js +3 -0
  88. package/mcp-server/.next/server/chunks/[root-of-the-server]__cc81580c._.js.map +1 -0
  89. package/mcp-server/.next/server/chunks/[root-of-the-server]__d1f9e389._.js +3 -0
  90. package/mcp-server/.next/server/chunks/[root-of-the-server]__d1f9e389._.js.map +1 -0
  91. package/mcp-server/.next/server/chunks/[root-of-the-server]__d200fe4a._.js +3 -0
  92. package/mcp-server/.next/server/chunks/[root-of-the-server]__d200fe4a._.js.map +1 -0
  93. package/mcp-server/.next/server/chunks/[root-of-the-server]__e2089993._.js +3 -0
  94. package/mcp-server/.next/server/chunks/[root-of-the-server]__e2089993._.js.map +1 -0
  95. package/mcp-server/.next/server/chunks/[root-of-the-server]__ffb73672._.js +3 -0
  96. package/mcp-server/.next/server/chunks/[root-of-the-server]__ffb73672._.js.map +1 -0
  97. package/mcp-server/.next/server/chunks/{0916f_next_ab257ac1._.js → d1d76_next_09a9e080._.js} +4 -4
  98. package/mcp-server/.next/server/chunks/d1d76_next_09a9e080._.js.map +1 -0
  99. package/mcp-server/.next/server/chunks/ssr/[root-of-the-server]__0217e89c._.js +3 -0
  100. package/mcp-server/.next/server/chunks/ssr/[root-of-the-server]__0217e89c._.js.map +1 -0
  101. package/mcp-server/.next/server/chunks/ssr/[root-of-the-server]__02a8c992._.js +3 -0
  102. package/mcp-server/.next/server/chunks/ssr/[root-of-the-server]__05689c01._.js +3 -0
  103. package/mcp-server/.next/server/chunks/ssr/{[root-of-the-server]__6518b3b8._.js.map → [root-of-the-server]__05689c01._.js.map} +1 -1
  104. package/mcp-server/.next/server/chunks/ssr/[root-of-the-server]__8db775f9._.js +3 -0
  105. package/mcp-server/.next/server/chunks/ssr/[root-of-the-server]__8db775f9._.js.map +1 -0
  106. package/mcp-server/.next/server/chunks/ssr/{[root-of-the-server]__524f1e5c._.js → [root-of-the-server]__91510608._.js} +2 -2
  107. package/mcp-server/.next/server/chunks/ssr/[root-of-the-server]__91510608._.js.map +1 -0
  108. package/mcp-server/.next/server/chunks/ssr/[root-of-the-server]__9f07837d._.js +3 -0
  109. package/mcp-server/.next/server/chunks/ssr/[root-of-the-server]__9f07837d._.js.map +1 -0
  110. package/mcp-server/.next/server/chunks/ssr/[root-of-the-server]__db74836a._.js +3 -0
  111. package/mcp-server/.next/server/chunks/ssr/[root-of-the-server]__db74836a._.js.map +1 -0
  112. package/mcp-server/.next/server/chunks/ssr/[root-of-the-server]__e5dec879._.js +3 -0
  113. package/mcp-server/.next/server/chunks/ssr/[root-of-the-server]__e5dec879._.js.map +1 -0
  114. package/mcp-server/.next/server/chunks/ssr/[root-of-the-server]__fb40854a._.js +3 -0
  115. package/mcp-server/.next/server/chunks/ssr/[root-of-the-server]__fb40854a._.js.map +1 -0
  116. package/mcp-server/.next/server/chunks/ssr/_0b8335fc._.js +8 -0
  117. package/mcp-server/.next/server/chunks/ssr/_0b8335fc._.js.map +1 -0
  118. package/mcp-server/.next/server/chunks/ssr/_28084f73._.js +3 -0
  119. package/mcp-server/.next/server/chunks/ssr/_28084f73._.js.map +1 -0
  120. package/mcp-server/.next/server/chunks/ssr/{_8babd77a._.js → _6129d8ec._.js} +3 -3
  121. package/mcp-server/.next/server/chunks/ssr/_6129d8ec._.js.map +1 -0
  122. package/mcp-server/.next/server/chunks/ssr/_62451611._.js +3 -0
  123. package/mcp-server/.next/server/chunks/ssr/_62451611._.js.map +1 -0
  124. package/mcp-server/.next/server/chunks/ssr/_7d3d2f5f._.js +4 -0
  125. package/mcp-server/.next/server/chunks/ssr/_7d3d2f5f._.js.map +1 -0
  126. package/mcp-server/.next/server/chunks/ssr/_b15f05ee._.js +3 -0
  127. package/mcp-server/.next/server/chunks/ssr/_b15f05ee._.js.map +1 -0
  128. package/mcp-server/.next/server/chunks/ssr/_bacf0748._.js +8 -0
  129. package/mcp-server/.next/server/chunks/ssr/_bacf0748._.js.map +1 -0
  130. package/mcp-server/.next/server/chunks/ssr/d1d76_next_dist_032c5c2e._.js +3 -0
  131. package/mcp-server/.next/server/chunks/ssr/d1d76_next_dist_032c5c2e._.js.map +1 -0
  132. package/mcp-server/.next/server/chunks/ssr/d1d76_next_dist_08b22e19._.js +3 -0
  133. package/mcp-server/.next/server/chunks/ssr/d1d76_next_dist_08b22e19._.js.map +1 -0
  134. package/mcp-server/.next/server/chunks/ssr/d1d76_next_dist_369453b3._.js +6 -0
  135. package/mcp-server/.next/server/chunks/ssr/d1d76_next_dist_369453b3._.js.map +1 -0
  136. package/mcp-server/.next/server/chunks/ssr/{0916f_next_dist_54420d8c._.js → d1d76_next_dist_ad253fdc._.js} +3 -3
  137. package/mcp-server/.next/server/chunks/ssr/d1d76_next_dist_ad253fdc._.js.map +1 -0
  138. package/mcp-server/.next/server/chunks/ssr/d1d76_next_dist_b9509b36._.js +6 -0
  139. package/mcp-server/.next/server/chunks/ssr/d1d76_next_dist_b9509b36._.js.map +1 -0
  140. package/mcp-server/.next/server/chunks/ssr/{0916f_next_dist_client_components_f453b63e._.js → d1d76_next_dist_client_components_6557bb14._.js} +2 -2
  141. package/mcp-server/.next/server/chunks/ssr/d1d76_next_dist_client_components_6557bb14._.js.map +1 -0
  142. package/mcp-server/.next/server/chunks/ssr/{0916f_next_dist_client_components_builtin_forbidden_7b57efa5.js → d1d76_next_dist_client_components_builtin_forbidden_c162dd05.js} +2 -2
  143. package/mcp-server/.next/server/chunks/ssr/d1d76_next_dist_client_components_builtin_forbidden_c162dd05.js.map +1 -0
  144. package/mcp-server/.next/server/chunks/ssr/d1d76_next_dist_client_components_builtin_global-error_3d982957.js +3 -0
  145. package/mcp-server/.next/server/chunks/ssr/d1d76_next_dist_client_components_builtin_global-error_3d982957.js.map +1 -0
  146. package/mcp-server/.next/server/chunks/ssr/{0916f_next_dist_client_components_builtin_unauthorized_6614f15c.js → d1d76_next_dist_client_components_builtin_unauthorized_e4f02ffd.js} +2 -2
  147. package/mcp-server/.next/server/chunks/ssr/d1d76_next_dist_client_components_builtin_unauthorized_e4f02ffd.js.map +1 -0
  148. package/mcp-server/.next/server/chunks/ssr/d1d76_next_dist_esm_build_templates_app-page_134a93a5.js +4 -0
  149. package/mcp-server/.next/server/chunks/ssr/d1d76_next_dist_esm_build_templates_app-page_134a93a5.js.map +1 -0
  150. package/mcp-server/.next/server/chunks/ssr/mcp-server_app_layout_tsx_afa41767._.js +1 -1
  151. package/mcp-server/.next/server/middleware-build-manifest.js +7 -8
  152. package/mcp-server/.next/server/server-reference-manifest.js +1 -1
  153. package/mcp-server/.next/server/server-reference-manifest.json +1 -1
  154. package/mcp-server/.next/static/chunks/11ac0d0e69696c72.js +1 -0
  155. package/mcp-server/.next/static/chunks/172f6179d608c15f.js +1 -0
  156. package/mcp-server/.next/static/chunks/526448e84b58822c.js +1 -0
  157. package/mcp-server/.next/static/chunks/571fbcba7786c174.js +1 -0
  158. package/mcp-server/.next/static/chunks/{044e917a180dc576.js → 711519b5a2e53fc8.js} +1 -1
  159. package/mcp-server/.next/static/chunks/addab50e23821c6c.js +1 -0
  160. package/mcp-server/.next/static/chunks/bb8a4e5f381a85ec.js +1 -0
  161. package/mcp-server/.next/static/chunks/dbbdc51e76f4cea4.js +1 -0
  162. package/mcp-server/.next/static/chunks/e09be78bba2194fd.js +1 -0
  163. package/mcp-server/.next/static/chunks/fec3a6ddaef02b8b.js +1 -0
  164. package/mcp-server/.next/static/chunks/{turbopack-ef2dba9946ddb22a.js → turbopack-7cd5a898ed038e26.js} +2 -2
  165. package/mcp-server/app/mcp/route.ts +133 -2
  166. package/mcp-server/app/mcp/tools.ts +991 -5
  167. package/mcp-server/next.config.ts +4 -0
  168. package/mcp-server/package.json +12 -6
  169. package/package.json +4 -4
  170. package/src/tui-interface-impl.tsx +35 -30
  171. package/mcp-server/.next/app-build-manifest.json +0 -52
  172. package/mcp-server/.next/postcss.js +0 -6
  173. package/mcp-server/.next/postcss.js.map +0 -5
  174. package/mcp-server/.next/server/app/_global-error/page/app-build-manifest.json +0 -14
  175. package/mcp-server/.next/server/app/_not-found/page/app-build-manifest.json +0 -15
  176. package/mcp-server/.next/server/app/api/logs/append/route/app-build-manifest.json +0 -12
  177. package/mcp-server/.next/server/app/api/logs/head/route/app-build-manifest.json +0 -12
  178. package/mcp-server/.next/server/app/api/logs/list/route/app-build-manifest.json +0 -12
  179. package/mcp-server/.next/server/app/api/logs/rotate/route/app-build-manifest.json +0 -12
  180. package/mcp-server/.next/server/app/api/logs/stream/route/app-build-manifest.json +0 -12
  181. package/mcp-server/.next/server/app/api/logs/tail/route/app-build-manifest.json +0 -12
  182. package/mcp-server/.next/server/app/api/screenshots/[filename]/route/app-build-manifest.json +0 -12
  183. package/mcp-server/.next/server/app/api/tools/route/app-build-manifest.json +0 -12
  184. package/mcp-server/.next/server/app/logs/page/app-build-manifest.json +0 -18
  185. package/mcp-server/.next/server/app/mcp/route/app-build-manifest.json +0 -12
  186. package/mcp-server/.next/server/app/page/app-build-manifest.json +0 -17
  187. package/mcp-server/.next/server/chunks/0916f_next_ab257ac1._.js.map +0 -1
  188. package/mcp-server/.next/server/chunks/[root-of-the-server]__1b561deb._.js +0 -3
  189. package/mcp-server/.next/server/chunks/[root-of-the-server]__1b561deb._.js.map +0 -1
  190. package/mcp-server/.next/server/chunks/[root-of-the-server]__38e8baae._.js +0 -21
  191. package/mcp-server/.next/server/chunks/[root-of-the-server]__38e8baae._.js.map +0 -1
  192. package/mcp-server/.next/server/chunks/[root-of-the-server]__47380b6c._.js +0 -7
  193. package/mcp-server/.next/server/chunks/[root-of-the-server]__47380b6c._.js.map +0 -1
  194. package/mcp-server/.next/server/chunks/[root-of-the-server]__674284d7._.js +0 -3
  195. package/mcp-server/.next/server/chunks/[root-of-the-server]__674284d7._.js.map +0 -1
  196. package/mcp-server/.next/server/chunks/[root-of-the-server]__6a89b7dc._.js +0 -3
  197. package/mcp-server/.next/server/chunks/[root-of-the-server]__6a89b7dc._.js.map +0 -1
  198. package/mcp-server/.next/server/chunks/[root-of-the-server]__729bfe09._.js +0 -11
  199. package/mcp-server/.next/server/chunks/[root-of-the-server]__729bfe09._.js.map +0 -1
  200. package/mcp-server/.next/server/chunks/[root-of-the-server]__a433711a._.js +0 -3
  201. package/mcp-server/.next/server/chunks/[root-of-the-server]__a433711a._.js.map +0 -1
  202. package/mcp-server/.next/server/chunks/[root-of-the-server]__a58600d8._.js +0 -3
  203. package/mcp-server/.next/server/chunks/[root-of-the-server]__a58600d8._.js.map +0 -1
  204. package/mcp-server/.next/server/chunks/[root-of-the-server]__bc43993b._.js +0 -3
  205. package/mcp-server/.next/server/chunks/[root-of-the-server]__c464573d._.js +0 -3
  206. package/mcp-server/.next/server/chunks/[root-of-the-server]__c464573d._.js.map +0 -1
  207. package/mcp-server/.next/server/chunks/[root-of-the-server]__e6d29491._.js +0 -4
  208. package/mcp-server/.next/server/chunks/[root-of-the-server]__e6d29491._.js.map +0 -1
  209. package/mcp-server/.next/server/chunks/ssr/0916f_next_dist_54420d8c._.js.map +0 -1
  210. package/mcp-server/.next/server/chunks/ssr/0916f_next_dist_927c15f3._.js +0 -3
  211. package/mcp-server/.next/server/chunks/ssr/0916f_next_dist_927c15f3._.js.map +0 -1
  212. package/mcp-server/.next/server/chunks/ssr/0916f_next_dist_c17417af._.js +0 -3
  213. package/mcp-server/.next/server/chunks/ssr/0916f_next_dist_c17417af._.js.map +0 -1
  214. package/mcp-server/.next/server/chunks/ssr/0916f_next_dist_c724e947._.js +0 -6
  215. package/mcp-server/.next/server/chunks/ssr/0916f_next_dist_c724e947._.js.map +0 -1
  216. package/mcp-server/.next/server/chunks/ssr/0916f_next_dist_client_components_builtin_forbidden_7b57efa5.js.map +0 -1
  217. package/mcp-server/.next/server/chunks/ssr/0916f_next_dist_client_components_builtin_global-error_118601bd.js +0 -3
  218. package/mcp-server/.next/server/chunks/ssr/0916f_next_dist_client_components_builtin_global-error_118601bd.js.map +0 -1
  219. package/mcp-server/.next/server/chunks/ssr/0916f_next_dist_client_components_builtin_unauthorized_6614f15c.js.map +0 -1
  220. package/mcp-server/.next/server/chunks/ssr/0916f_next_dist_client_components_f453b63e._.js.map +0 -1
  221. package/mcp-server/.next/server/chunks/ssr/0916f_next_dist_esm_87a80014._.js +0 -6
  222. package/mcp-server/.next/server/chunks/ssr/0916f_next_dist_esm_87a80014._.js.map +0 -1
  223. package/mcp-server/.next/server/chunks/ssr/0916f_next_dist_esm_build_templates_app-page_25a3dd8d.js +0 -4
  224. package/mcp-server/.next/server/chunks/ssr/0916f_next_dist_esm_build_templates_app-page_25a3dd8d.js.map +0 -1
  225. package/mcp-server/.next/server/chunks/ssr/[root-of-the-server]__224ddd99._.js +0 -3
  226. package/mcp-server/.next/server/chunks/ssr/[root-of-the-server]__224ddd99._.js.map +0 -1
  227. package/mcp-server/.next/server/chunks/ssr/[root-of-the-server]__2cdf0446._.js +0 -3
  228. package/mcp-server/.next/server/chunks/ssr/[root-of-the-server]__2cdf0446._.js.map +0 -1
  229. package/mcp-server/.next/server/chunks/ssr/[root-of-the-server]__524f1e5c._.js.map +0 -1
  230. package/mcp-server/.next/server/chunks/ssr/[root-of-the-server]__6518b3b8._.js +0 -3
  231. package/mcp-server/.next/server/chunks/ssr/[root-of-the-server]__73b7df71._.js +0 -3
  232. package/mcp-server/.next/server/chunks/ssr/[root-of-the-server]__73b7df71._.js.map +0 -1
  233. package/mcp-server/.next/server/chunks/ssr/[root-of-the-server]__83ee047c._.js +0 -3
  234. package/mcp-server/.next/server/chunks/ssr/[root-of-the-server]__83ee047c._.js.map +0 -1
  235. package/mcp-server/.next/server/chunks/ssr/[root-of-the-server]__b2efa505._.js +0 -3
  236. package/mcp-server/.next/server/chunks/ssr/[root-of-the-server]__b2efa505._.js.map +0 -1
  237. package/mcp-server/.next/server/chunks/ssr/[root-of-the-server]__d9cb0b6d._.js +0 -3
  238. package/mcp-server/.next/server/chunks/ssr/[root-of-the-server]__d9cb0b6d._.js.map +0 -1
  239. package/mcp-server/.next/server/chunks/ssr/[root-of-the-server]__db132681._.js +0 -3
  240. package/mcp-server/.next/server/chunks/ssr/_188bfe33._.js +0 -6
  241. package/mcp-server/.next/server/chunks/ssr/_188bfe33._.js.map +0 -1
  242. package/mcp-server/.next/server/chunks/ssr/_3a061fbf._.js +0 -4
  243. package/mcp-server/.next/server/chunks/ssr/_3a061fbf._.js.map +0 -1
  244. package/mcp-server/.next/server/chunks/ssr/_8babd77a._.js.map +0 -1
  245. package/mcp-server/.next/server/chunks/ssr/_9d670a6b._.js +0 -5
  246. package/mcp-server/.next/server/chunks/ssr/_9d670a6b._.js.map +0 -1
  247. package/mcp-server/.next/server/chunks/ssr/_d858c4cd._.js +0 -3
  248. package/mcp-server/.next/server/chunks/ssr/_d858c4cd._.js.map +0 -1
  249. package/mcp-server/.next/server/chunks/ssr/_dae9c1d5._.js +0 -8
  250. package/mcp-server/.next/server/chunks/ssr/_dae9c1d5._.js.map +0 -1
  251. package/mcp-server/.next/server/chunks/ssr/_f03e80a8._.js +0 -6
  252. package/mcp-server/.next/server/chunks/ssr/_f03e80a8._.js.map +0 -1
  253. package/mcp-server/.next/static/chunks/1415a83da347ea73.js +0 -1
  254. package/mcp-server/.next/static/chunks/14ca28aed9ba7e16.js +0 -1
  255. package/mcp-server/.next/static/chunks/259312562b58ea20.js +0 -5
  256. package/mcp-server/.next/static/chunks/37a3ca444b4e0ebc.js +0 -1
  257. package/mcp-server/.next/static/chunks/37f62e06d680d8df.js +0 -1
  258. package/mcp-server/.next/static/chunks/40b55f6f752f90a1.js +0 -1
  259. package/mcp-server/.next/static/chunks/5a5edc75ee7e7de4.js +0 -1
  260. package/mcp-server/.next/static/chunks/5dd333b6181425ad.js +0 -1
  261. package/mcp-server/.next/static/chunks/6839f59cc7f3e68c.js +0 -1
  262. package/mcp-server/.next/static/chunks/7a1b61971931d3f6.js +0 -1
  263. package/mcp-server/.next/static/chunks/881ec25f9292cb32.js +0 -1
  264. package/mcp-server/.next/static/chunks/8a5ef92054eb3f68.js +0 -1
  265. package/mcp-server/.next/static/chunks/af081359d0245052.js +0 -5
  266. package/mcp-server/.next/static/chunks/b137bfc92ad8bec0.js +0 -1
  267. package/mcp-server/.next/static/chunks/c5f8464bc8083ee7.js +0 -1
  268. package/mcp-server/.next/static/chunks/eab992a4c8e8981a.js +0 -1
  269. package/mcp-server/.next/static/chunks/turbopack-aef1414f7c590584.js +0 -3
  270. package/mcp-server/.next/static/chunks/turbopack-e808877bd413e182.js +0 -3
  271. package/mcp-server/.next/webpack-loaders.js +0 -6
  272. package/mcp-server/.next/webpack-loaders.js.map +0 -5
  273. /package/mcp-server/.next/server/chunks/{[root-of-the-server]__bc43993b._.js.map → [root-of-the-server]__6fa7ea53._.js.map} +0 -0
  274. /package/mcp-server/.next/server/chunks/ssr/{[root-of-the-server]__db132681._.js.map → [root-of-the-server]__02a8c992._.js.map} +0 -0
  275. /package/mcp-server/.next/static/{3E55dEq7tPut9JesZEs2c → e3oE33k8Pj7aB0H8XMR1s}/_buildManifest.js +0 -0
  276. /package/mcp-server/.next/static/{3E55dEq7tPut9JesZEs2c → e3oE33k8Pj7aB0H8XMR1s}/_clientMiddlewareManifest.json +0 -0
  277. /package/mcp-server/.next/static/{3E55dEq7tPut9JesZEs2c → e3oE33k8Pj7aB0H8XMR1s}/_ssgManifest.js +0 -0
@@ -1 +0,0 @@
1
- {"version":3,"sources":["turbopack:///[project]/node_modules/.pnpm/next@15.5.1-canary.30_babel-plugin-react-compiler@19.1.0-rc.3_react-dom@19.2.0-canary-d_5eea965284f26eb4e30482e6426df099/node_modules/next/src/shared/lib/image-blur-svg.ts","turbopack:///[project]/node_modules/.pnpm/next@15.5.1-canary.30_babel-plugin-react-compiler@19.1.0-rc.3_react-dom@19.2.0-canary-d_5eea965284f26eb4e30482e6426df099/node_modules/next/src/shared/lib/image-config.ts","turbopack:///[project]/node_modules/.pnpm/next@15.5.1-canary.30_babel-plugin-react-compiler@19.1.0-rc.3_react-dom@19.2.0-canary-d_5eea965284f26eb4e30482e6426df099/node_modules/next/src/shared/lib/get-img-props.ts","turbopack:///[project]/node_modules/.pnpm/next@15.5.1-canary.30_babel-plugin-react-compiler@19.1.0-rc.3_react-dom@19.2.0-canary-d_5eea965284f26eb4e30482e6426df099/node_modules/next/src/shared/lib/side-effect.tsx","turbopack:///[project]/node_modules/.pnpm/next@15.5.1-canary.30_babel-plugin-react-compiler@19.1.0-rc.3_react-dom@19.2.0-canary-d_5eea965284f26eb4e30482e6426df099/node_modules/next/src/server/route-modules/app-page/vendored/contexts/amp-context.ts","turbopack:///[project]/node_modules/.pnpm/next@15.5.1-canary.30_babel-plugin-react-compiler@19.1.0-rc.3_react-dom@19.2.0-canary-d_5eea965284f26eb4e30482e6426df099/node_modules/next/src/server/route-modules/app-page/vendored/contexts/head-manager-context.ts","turbopack:///[project]/node_modules/.pnpm/next@15.5.1-canary.30_babel-plugin-react-compiler@19.1.0-rc.3_react-dom@19.2.0-canary-d_5eea965284f26eb4e30482e6426df099/node_modules/next/src/shared/lib/amp-mode.ts","turbopack:///[project]/node_modules/.pnpm/next@15.5.1-canary.30_babel-plugin-react-compiler@19.1.0-rc.3_react-dom@19.2.0-canary-d_5eea965284f26eb4e30482e6426df099/node_modules/next/src/shared/lib/head.tsx","turbopack:///[project]/node_modules/.pnpm/next@15.5.1-canary.30_babel-plugin-react-compiler@19.1.0-rc.3_react-dom@19.2.0-canary-d_5eea965284f26eb4e30482e6426df099/node_modules/next/src/server/route-modules/app-page/vendored/contexts/image-config-context.ts","turbopack:///[project]/node_modules/.pnpm/next@15.5.1-canary.30_babel-plugin-react-compiler@19.1.0-rc.3_react-dom@19.2.0-canary-d_5eea965284f26eb4e30482e6426df099/node_modules/next/src/server/route-modules/app-page/vendored/contexts/router-context.ts","turbopack:///[project]/node_modules/.pnpm/next@15.5.1-canary.30_babel-plugin-react-compiler@19.1.0-rc.3_react-dom@19.2.0-canary-d_5eea965284f26eb4e30482e6426df099/node_modules/next/src/shared/lib/find-closest-quality.ts","turbopack:///[project]/node_modules/.pnpm/next@15.5.1-canary.30_babel-plugin-react-compiler@19.1.0-rc.3_react-dom@19.2.0-canary-d_5eea965284f26eb4e30482e6426df099/node_modules/next/src/shared/lib/image-loader.ts","turbopack:///[project]/node_modules/.pnpm/next@15.5.1-canary.30_babel-plugin-react-compiler@19.1.0-rc.3_react-dom@19.2.0-canary-d_5eea965284f26eb4e30482e6426df099/node_modules/next/src/client/image-component.tsx","turbopack:///[project]/node_modules/.pnpm/next@15.5.1-canary.30_babel-plugin-react-compiler@19.1.0-rc.3_react-dom@19.2.0-canary-d_5eea965284f26eb4e30482e6426df099/node_modules/next/src/shared/lib/image-external.tsx","turbopack:///[project]/node_modules/.pnpm/next@15.5.1-canary.30_babel-plugin-react-compiler@19.1.0-rc.3_react-dom@19.2.0-canary-d_5eea965284f26eb4e30482e6426df099/node_modules/next/image.js","turbopack:///[project]/node_modules/.pnpm/next@15.5.1-canary.30_babel-plugin-react-compiler@19.1.0-rc.3_react-dom@19.2.0-canary-d_5eea965284f26eb4e30482e6426df099/node_modules/next/navigation.js","turbopack:///[project]/mcp-server/app/logs/LogsClient.tsx","turbopack:///[project]/src/constants/log-colors.ts","turbopack:///[project]/mcp-server/app/logs/utils.ts"],"sourcesContent":["/**\n * A shared function, used on both client and server, to generate a SVG blur placeholder.\n */\nexport function getImageBlurSvg({\n widthInt,\n heightInt,\n blurWidth,\n blurHeight,\n blurDataURL,\n objectFit,\n}: {\n widthInt?: number\n heightInt?: number\n blurWidth?: number\n blurHeight?: number\n blurDataURL: string\n objectFit?: string\n}): string {\n const std = 20\n const svgWidth = blurWidth ? blurWidth * 40 : widthInt\n const svgHeight = blurHeight ? blurHeight * 40 : heightInt\n\n const viewBox =\n svgWidth && svgHeight ? `viewBox='0 0 ${svgWidth} ${svgHeight}'` : ''\n const preserveAspectRatio = viewBox\n ? 'none'\n : objectFit === 'contain'\n ? 'xMidYMid'\n : objectFit === 'cover'\n ? 'xMidYMid slice'\n : 'none'\n\n return `%3Csvg xmlns='http://www.w3.org/2000/svg' ${viewBox}%3E%3Cfilter id='b' color-interpolation-filters='sRGB'%3E%3CfeGaussianBlur stdDeviation='${std}'/%3E%3CfeColorMatrix values='1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 100 -1' result='s'/%3E%3CfeFlood x='0' y='0' width='100%25' height='100%25'/%3E%3CfeComposite operator='out' in='s'/%3E%3CfeComposite in2='SourceGraphic'/%3E%3CfeGaussianBlur stdDeviation='${std}'/%3E%3C/filter%3E%3Cimage width='100%25' height='100%25' x='0' y='0' preserveAspectRatio='${preserveAspectRatio}' style='filter: url(%23b);' href='${blurDataURL}'/%3E%3C/svg%3E`\n}\n","export const VALID_LOADERS = [\n 'default',\n 'imgix',\n 'cloudinary',\n 'akamai',\n 'custom',\n] as const\n\nexport type LoaderValue = (typeof VALID_LOADERS)[number]\n\nexport type ImageLoaderProps = {\n src: string\n width: number\n quality?: number\n}\n\nexport type ImageLoaderPropsWithConfig = ImageLoaderProps & {\n config: Readonly<ImageConfig>\n}\n\nexport type LocalPattern = {\n /**\n * Can be literal or wildcard.\n * Single `*` matches a single path segment.\n * Double `**` matches any number of path segments.\n */\n pathname?: string\n\n /**\n * Can be literal query string such as `?v=1` or\n * empty string meaning no query string.\n */\n search?: string\n}\n\nexport type RemotePattern = {\n /**\n * Must be `http` or `https`.\n */\n protocol?: 'http' | 'https'\n\n /**\n * Can be literal or wildcard.\n * Single `*` matches a single subdomain.\n * Double `**` matches any number of subdomains.\n */\n hostname: string\n\n /**\n * Can be literal port such as `8080` or empty string\n * meaning no port.\n */\n port?: string\n\n /**\n * Can be literal or wildcard.\n * Single `*` matches a single path segment.\n * Double `**` matches any number of path segments.\n */\n pathname?: string\n\n /**\n * Can be literal query string such as `?v=1` or\n * empty string meaning no query string.\n */\n search?: string\n}\n\ntype ImageFormat = 'image/avif' | 'image/webp'\n\n/**\n * Image configurations\n *\n * @see [Image configuration options](https://nextjs.org/docs/api-reference/next/image#configuration-options)\n */\nexport type ImageConfigComplete = {\n /** @see [Device sizes documentation](https://nextjs.org/docs/api-reference/next/image#device-sizes) */\n deviceSizes: number[]\n\n /** @see [Image sizing documentation](https://nextjs.org/docs/app/building-your-application/optimizing/images#image-sizing) */\n imageSizes: number[]\n\n /** @see [Image loaders configuration](https://nextjs.org/docs/api-reference/next/legacy/image#loader) */\n loader: LoaderValue\n\n /** @see [Image loader configuration](https://nextjs.org/docs/app/api-reference/components/image#path) */\n path: string\n\n /** @see [Image loader configuration](https://nextjs.org/docs/api-reference/next/image#loader-configuration) */\n loaderFile: string\n\n /**\n * @deprecated Use `remotePatterns` instead.\n */\n domains: string[]\n\n /** @see [Disable static image import configuration](https://nextjs.org/docs/api-reference/next/image#disable-static-imports) */\n disableStaticImages: boolean\n\n /** @see [Cache behavior](https://nextjs.org/docs/api-reference/next/image#caching-behavior) */\n minimumCacheTTL: number\n\n /** @see [Acceptable formats](https://nextjs.org/docs/api-reference/next/image#acceptable-formats) */\n formats: ImageFormat[]\n\n /** @see [Dangerously Allow SVG](https://nextjs.org/docs/api-reference/next/image#dangerously-allow-svg) */\n dangerouslyAllowSVG: boolean\n\n /** @see [Content Security Policy](https://nextjs.org/docs/api-reference/next/image#contentsecuritypolicy) */\n contentSecurityPolicy: string\n\n /** @see [Content Disposition Type](https://nextjs.org/docs/api-reference/next/image#contentdispositiontype) */\n contentDispositionType: 'inline' | 'attachment'\n\n /** @see [Remote Patterns](https://nextjs.org/docs/api-reference/next/image#remotepatterns) */\n remotePatterns: Array<URL | RemotePattern>\n\n /** @see [Local Patterns](https://nextjs.org/docs/api-reference/next/image#localPatterns) */\n localPatterns: LocalPattern[] | undefined\n\n /** @see [Qualities](https://nextjs.org/docs/api-reference/next/image#qualities) */\n qualities: number[] | undefined\n\n /** @see [Unoptimized](https://nextjs.org/docs/api-reference/next/image#unoptimized) */\n unoptimized: boolean\n}\n\nexport type ImageConfig = Partial<ImageConfigComplete>\n\nexport const imageConfigDefault: ImageConfigComplete = {\n deviceSizes: [640, 750, 828, 1080, 1200, 1920, 2048, 3840],\n imageSizes: [16, 32, 48, 64, 96, 128, 256, 384],\n path: '/_next/image',\n loader: 'default',\n loaderFile: '',\n domains: [],\n disableStaticImages: false,\n minimumCacheTTL: 60,\n formats: ['image/webp'],\n dangerouslyAllowSVG: false,\n contentSecurityPolicy: `script-src 'none'; frame-src 'none'; sandbox;`,\n contentDispositionType: 'attachment',\n localPatterns: undefined, // default: allow all local images\n remotePatterns: [], // default: allow no remote images\n qualities: [75],\n unoptimized: false,\n}\n","import { warnOnce } from './utils/warn-once'\nimport { getImageBlurSvg } from './image-blur-svg'\nimport { imageConfigDefault } from './image-config'\nimport type {\n ImageConfigComplete,\n ImageLoaderProps,\n ImageLoaderPropsWithConfig,\n} from './image-config'\n\nimport type { CSSProperties, JSX } from 'react'\n\nexport interface StaticImageData {\n src: string\n height: number\n width: number\n blurDataURL?: string\n blurWidth?: number\n blurHeight?: number\n}\n\nexport interface StaticRequire {\n default: StaticImageData\n}\n\nexport type StaticImport = StaticRequire | StaticImageData\n\nexport type ImageProps = Omit<\n JSX.IntrinsicElements['img'],\n 'src' | 'srcSet' | 'ref' | 'alt' | 'width' | 'height' | 'loading'\n> & {\n src: string | StaticImport\n alt: string\n width?: number | `${number}`\n height?: number | `${number}`\n fill?: boolean\n loader?: ImageLoader\n quality?: number | `${number}`\n preload?: boolean\n /**\n * @deprecated Use `preload` prop instead.\n * See https://nextjs.org/docs/app/api-reference/components/image#preload\n */\n priority?: boolean\n loading?: LoadingValue\n placeholder?: PlaceholderValue\n blurDataURL?: string\n unoptimized?: boolean\n overrideSrc?: string\n /**\n * @deprecated Use `onLoad` instead.\n * @see https://nextjs.org/docs/app/api-reference/components/image#onload\n */\n onLoadingComplete?: OnLoadingComplete\n /**\n * @deprecated Use `fill` prop instead of `layout=\"fill\"` or change import to `next/legacy/image`.\n * @see https://nextjs.org/docs/api-reference/next/legacy/image\n */\n layout?: string\n /**\n * @deprecated Use `style` prop instead.\n */\n objectFit?: string\n /**\n * @deprecated Use `style` prop instead.\n */\n objectPosition?: string\n /**\n * @deprecated This prop does not do anything.\n */\n lazyBoundary?: string\n /**\n * @deprecated This prop does not do anything.\n */\n lazyRoot?: string\n}\n\nexport type ImgProps = Omit<ImageProps, 'src' | 'loader'> & {\n loading: LoadingValue\n width: number | undefined\n height: number | undefined\n style: NonNullable<JSX.IntrinsicElements['img']['style']>\n sizes: string | undefined\n srcSet: string | undefined\n src: string\n}\n\nconst VALID_LOADING_VALUES = ['lazy', 'eager', undefined] as const\n\n// Object-fit values that are not valid background-size values\nconst INVALID_BACKGROUND_SIZE_VALUES = [\n '-moz-initial',\n 'fill',\n 'none',\n 'scale-down',\n undefined,\n]\ntype LoadingValue = (typeof VALID_LOADING_VALUES)[number]\ntype ImageConfig = ImageConfigComplete & {\n allSizes: number[]\n output?: 'standalone' | 'export'\n}\n\nexport type ImageLoader = (p: ImageLoaderProps) => string\n\n// Do not export - this is an internal type only\n// because `next.config.js` is only meant for the\n// built-in loaders, not for a custom loader() prop.\ntype ImageLoaderWithConfig = (p: ImageLoaderPropsWithConfig) => string\n\nexport type PlaceholderValue = 'blur' | 'empty' | `data:image/${string}`\nexport type OnLoad = React.ReactEventHandler<HTMLImageElement> | undefined\nexport type OnLoadingComplete = (img: HTMLImageElement) => void\n\nexport type PlaceholderStyle = Partial<\n Pick<\n CSSProperties,\n | 'backgroundSize'\n | 'backgroundPosition'\n | 'backgroundRepeat'\n | 'backgroundImage'\n >\n>\n\nfunction isStaticRequire(\n src: StaticRequire | StaticImageData\n): src is StaticRequire {\n return (src as StaticRequire).default !== undefined\n}\n\nfunction isStaticImageData(\n src: StaticRequire | StaticImageData\n): src is StaticImageData {\n return (src as StaticImageData).src !== undefined\n}\n\nfunction isStaticImport(src: string | StaticImport): src is StaticImport {\n return (\n !!src &&\n typeof src === 'object' &&\n (isStaticRequire(src as StaticImport) ||\n isStaticImageData(src as StaticImport))\n )\n}\n\nconst allImgs = new Map<\n string,\n { src: string; loading: LoadingValue; placeholder: PlaceholderValue }\n>()\nlet perfObserver: PerformanceObserver | undefined\n\nfunction getInt(x: unknown): number | undefined {\n if (typeof x === 'undefined') {\n return x\n }\n if (typeof x === 'number') {\n return Number.isFinite(x) ? x : NaN\n }\n if (typeof x === 'string' && /^[0-9]+$/.test(x)) {\n return parseInt(x, 10)\n }\n return NaN\n}\n\nfunction getWidths(\n { deviceSizes, allSizes }: ImageConfig,\n width: number | undefined,\n sizes: string | undefined\n): { widths: number[]; kind: 'w' | 'x' } {\n if (sizes) {\n // Find all the \"vw\" percent sizes used in the sizes prop\n const viewportWidthRe = /(^|\\s)(1?\\d?\\d)vw/g\n const percentSizes = []\n for (let match; (match = viewportWidthRe.exec(sizes)); match) {\n percentSizes.push(parseInt(match[2]))\n }\n if (percentSizes.length) {\n const smallestRatio = Math.min(...percentSizes) * 0.01\n return {\n widths: allSizes.filter((s) => s >= deviceSizes[0] * smallestRatio),\n kind: 'w',\n }\n }\n return { widths: allSizes, kind: 'w' }\n }\n if (typeof width !== 'number') {\n return { widths: deviceSizes, kind: 'w' }\n }\n\n const widths = [\n ...new Set(\n // > This means that most OLED screens that say they are 3x resolution,\n // > are actually 3x in the green color, but only 1.5x in the red and\n // > blue colors. Showing a 3x resolution image in the app vs a 2x\n // > resolution image will be visually the same, though the 3x image\n // > takes significantly more data. Even true 3x resolution screens are\n // > wasteful as the human eye cannot see that level of detail without\n // > something like a magnifying glass.\n // https://blog.twitter.com/engineering/en_us/topics/infrastructure/2019/capping-image-fidelity-on-ultra-high-resolution-devices.html\n [width, width * 2 /*, width * 3*/].map(\n (w) => allSizes.find((p) => p >= w) || allSizes[allSizes.length - 1]\n )\n ),\n ]\n return { widths, kind: 'x' }\n}\n\ntype GenImgAttrsData = {\n config: ImageConfig\n src: string\n unoptimized: boolean\n loader: ImageLoaderWithConfig\n width?: number\n quality?: number\n sizes?: string\n}\n\ntype GenImgAttrsResult = {\n src: string\n srcSet: string | undefined\n sizes: string | undefined\n}\n\nfunction generateImgAttrs({\n config,\n src,\n unoptimized,\n width,\n quality,\n sizes,\n loader,\n}: GenImgAttrsData): GenImgAttrsResult {\n if (unoptimized) {\n return { src, srcSet: undefined, sizes: undefined }\n }\n\n const { widths, kind } = getWidths(config, width, sizes)\n const last = widths.length - 1\n\n return {\n sizes: !sizes && kind === 'w' ? '100vw' : sizes,\n srcSet: widths\n .map(\n (w, i) =>\n `${loader({ config, src, quality, width: w })} ${\n kind === 'w' ? w : i + 1\n }${kind}`\n )\n .join(', '),\n\n // It's intended to keep `src` the last attribute because React updates\n // attributes in order. If we keep `src` the first one, Safari will\n // immediately start to fetch `src`, before `sizes` and `srcSet` are even\n // updated by React. That causes multiple unnecessary requests if `srcSet`\n // and `sizes` are defined.\n // This bug cannot be reproduced in Chrome or Firefox.\n src: loader({ config, src, quality, width: widths[last] }),\n }\n}\n\n/**\n * A shared function, used on both client and server, to generate the props for <img>.\n */\nexport function getImgProps(\n {\n src,\n sizes,\n unoptimized = false,\n priority = false,\n preload = false,\n loading,\n className,\n quality,\n width,\n height,\n fill = false,\n style,\n overrideSrc,\n onLoad,\n onLoadingComplete,\n placeholder = 'empty',\n blurDataURL,\n fetchPriority,\n decoding = 'async',\n layout,\n objectFit,\n objectPosition,\n lazyBoundary,\n lazyRoot,\n ...rest\n }: ImageProps,\n _state: {\n defaultLoader: ImageLoaderWithConfig\n imgConf: ImageConfigComplete\n showAltText?: boolean\n blurComplete?: boolean\n }\n): {\n props: ImgProps\n meta: {\n unoptimized: boolean\n preload: boolean\n placeholder: NonNullable<ImageProps['placeholder']>\n fill: boolean\n }\n} {\n const { imgConf, showAltText, blurComplete, defaultLoader } = _state\n let config: ImageConfig\n let c = imgConf || imageConfigDefault\n if ('allSizes' in c) {\n config = c as ImageConfig\n } else {\n const allSizes = [...c.deviceSizes, ...c.imageSizes].sort((a, b) => a - b)\n const deviceSizes = c.deviceSizes.sort((a, b) => a - b)\n const qualities = c.qualities?.sort((a, b) => a - b)\n config = { ...c, allSizes, deviceSizes, qualities }\n }\n\n if (typeof defaultLoader === 'undefined') {\n throw new Error(\n 'images.loaderFile detected but the file is missing default export.\\nRead more: https://nextjs.org/docs/messages/invalid-images-config'\n )\n }\n let loader: ImageLoaderWithConfig = rest.loader || defaultLoader\n\n // Remove property so it's not spread on <img> element\n delete rest.loader\n delete (rest as any).srcSet\n\n // This special value indicates that the user\n // didn't define a \"loader\" prop or \"loader\" config.\n const isDefaultLoader = '__next_img_default' in loader\n\n if (isDefaultLoader) {\n if (config.loader === 'custom') {\n throw new Error(\n `Image with src \"${src}\" is missing \"loader\" prop.` +\n `\\nRead more: https://nextjs.org/docs/messages/next-image-missing-loader`\n )\n }\n } else {\n // The user defined a \"loader\" prop or config.\n // Since the config object is internal only, we\n // must not pass it to the user-defined \"loader\".\n const customImageLoader = loader as ImageLoader\n loader = (obj) => {\n const { config: _, ...opts } = obj\n return customImageLoader(opts)\n }\n }\n\n if (layout) {\n if (layout === 'fill') {\n fill = true\n }\n const layoutToStyle: Record<string, Record<string, string> | undefined> = {\n intrinsic: { maxWidth: '100%', height: 'auto' },\n responsive: { width: '100%', height: 'auto' },\n }\n const layoutToSizes: Record<string, string | undefined> = {\n responsive: '100vw',\n fill: '100vw',\n }\n const layoutStyle = layoutToStyle[layout]\n if (layoutStyle) {\n style = { ...style, ...layoutStyle }\n }\n const layoutSizes = layoutToSizes[layout]\n if (layoutSizes && !sizes) {\n sizes = layoutSizes\n }\n }\n\n let staticSrc = ''\n let widthInt = getInt(width)\n let heightInt = getInt(height)\n let blurWidth: number | undefined\n let blurHeight: number | undefined\n if (isStaticImport(src)) {\n const staticImageData = isStaticRequire(src) ? src.default : src\n\n if (!staticImageData.src) {\n throw new Error(\n `An object should only be passed to the image component src parameter if it comes from a static image import. It must include src. Received ${JSON.stringify(\n staticImageData\n )}`\n )\n }\n if (!staticImageData.height || !staticImageData.width) {\n throw new Error(\n `An object should only be passed to the image component src parameter if it comes from a static image import. It must include height and width. Received ${JSON.stringify(\n staticImageData\n )}`\n )\n }\n\n blurWidth = staticImageData.blurWidth\n blurHeight = staticImageData.blurHeight\n blurDataURL = blurDataURL || staticImageData.blurDataURL\n staticSrc = staticImageData.src\n\n if (!fill) {\n if (!widthInt && !heightInt) {\n widthInt = staticImageData.width\n heightInt = staticImageData.height\n } else if (widthInt && !heightInt) {\n const ratio = widthInt / staticImageData.width\n heightInt = Math.round(staticImageData.height * ratio)\n } else if (!widthInt && heightInt) {\n const ratio = heightInt / staticImageData.height\n widthInt = Math.round(staticImageData.width * ratio)\n }\n }\n }\n src = typeof src === 'string' ? src : staticSrc\n\n let isLazy =\n !priority &&\n !preload &&\n (loading === 'lazy' || typeof loading === 'undefined')\n if (!src || src.startsWith('data:') || src.startsWith('blob:')) {\n // https://developer.mozilla.org/docs/Web/HTTP/Basics_of_HTTP/Data_URIs\n unoptimized = true\n isLazy = false\n }\n if (config.unoptimized) {\n unoptimized = true\n }\n if (\n isDefaultLoader &&\n !config.dangerouslyAllowSVG &&\n src.split('?', 1)[0].endsWith('.svg')\n ) {\n // Special case to make svg serve as-is to avoid proxying\n // through the built-in Image Optimization API.\n unoptimized = true\n }\n\n const qualityInt = getInt(quality)\n\n if (process.env.NODE_ENV !== 'production') {\n if (config.output === 'export' && isDefaultLoader && !unoptimized) {\n throw new Error(\n `Image Optimization using the default loader is not compatible with \\`{ output: 'export' }\\`.\n Possible solutions:\n - Remove \\`{ output: 'export' }\\` and run \"next start\" to run server mode including the Image Optimization API.\n - Configure \\`{ images: { unoptimized: true } }\\` in \\`next.config.js\\` to disable the Image Optimization API.\n Read more: https://nextjs.org/docs/messages/export-image-api`\n )\n }\n if (!src) {\n // React doesn't show the stack trace and there's\n // no `src` to help identify which image, so we\n // instead console.error(ref) during mount.\n unoptimized = true\n } else {\n if (fill) {\n if (width) {\n throw new Error(\n `Image with src \"${src}\" has both \"width\" and \"fill\" properties. Only one should be used.`\n )\n }\n if (height) {\n throw new Error(\n `Image with src \"${src}\" has both \"height\" and \"fill\" properties. Only one should be used.`\n )\n }\n if (style?.position && style.position !== 'absolute') {\n throw new Error(\n `Image with src \"${src}\" has both \"fill\" and \"style.position\" properties. Images with \"fill\" always use position absolute - it cannot be modified.`\n )\n }\n if (style?.width && style.width !== '100%') {\n throw new Error(\n `Image with src \"${src}\" has both \"fill\" and \"style.width\" properties. Images with \"fill\" always use width 100% - it cannot be modified.`\n )\n }\n if (style?.height && style.height !== '100%') {\n throw new Error(\n `Image with src \"${src}\" has both \"fill\" and \"style.height\" properties. Images with \"fill\" always use height 100% - it cannot be modified.`\n )\n }\n } else {\n if (typeof widthInt === 'undefined') {\n throw new Error(\n `Image with src \"${src}\" is missing required \"width\" property.`\n )\n } else if (isNaN(widthInt)) {\n throw new Error(\n `Image with src \"${src}\" has invalid \"width\" property. Expected a numeric value in pixels but received \"${width}\".`\n )\n }\n if (typeof heightInt === 'undefined') {\n throw new Error(\n `Image with src \"${src}\" is missing required \"height\" property.`\n )\n } else if (isNaN(heightInt)) {\n throw new Error(\n `Image with src \"${src}\" has invalid \"height\" property. Expected a numeric value in pixels but received \"${height}\".`\n )\n }\n // eslint-disable-next-line no-control-regex\n if (/^[\\x00-\\x20]/.test(src)) {\n throw new Error(\n `Image with src \"${src}\" cannot start with a space or control character. Use src.trimStart() to remove it or encodeURIComponent(src) to keep it.`\n )\n }\n // eslint-disable-next-line no-control-regex\n if (/[\\x00-\\x20]$/.test(src)) {\n throw new Error(\n `Image with src \"${src}\" cannot end with a space or control character. Use src.trimEnd() to remove it or encodeURIComponent(src) to keep it.`\n )\n }\n }\n }\n if (!VALID_LOADING_VALUES.includes(loading)) {\n throw new Error(\n `Image with src \"${src}\" has invalid \"loading\" property. Provided \"${loading}\" should be one of ${VALID_LOADING_VALUES.map(\n String\n ).join(',')}.`\n )\n }\n if (priority && loading === 'lazy') {\n throw new Error(\n `Image with src \"${src}\" has both \"priority\" and \"loading='lazy'\" properties. Only one should be used.`\n )\n }\n if (preload && loading === 'lazy') {\n throw new Error(\n `Image with src \"${src}\" has both \"preload\" and \"loading='lazy'\" properties. Only one should be used.`\n )\n }\n if (preload && priority) {\n throw new Error(\n `Image with src \"${src}\" has both \"preload\" and \"priority\" properties. Only \"preload\" should be used.`\n )\n }\n if (\n placeholder !== 'empty' &&\n placeholder !== 'blur' &&\n !placeholder.startsWith('data:image/')\n ) {\n throw new Error(\n `Image with src \"${src}\" has invalid \"placeholder\" property \"${placeholder}\".`\n )\n }\n if (placeholder !== 'empty') {\n if (widthInt && heightInt && widthInt * heightInt < 1600) {\n warnOnce(\n `Image with src \"${src}\" is smaller than 40x40. Consider removing the \"placeholder\" property to improve performance.`\n )\n }\n }\n if (\n qualityInt &&\n config.qualities &&\n !config.qualities.includes(qualityInt)\n ) {\n warnOnce(\n `Image with src \"${src}\" is using quality \"${qualityInt}\" which is not configured in images.qualities [${config.qualities.join(', ')}]. Please update your config to [${[...config.qualities, qualityInt].sort().join(', ')}].` +\n `\\nRead more: https://nextjs.org/docs/messages/next-image-unconfigured-qualities`\n )\n }\n if (\n src.startsWith('/') &&\n src.includes('?') &&\n (!config?.localPatterns?.length ||\n (config.localPatterns.length === 1 &&\n config.localPatterns[0].pathname === '/_next/static/media/**'))\n ) {\n warnOnce(\n `Image with src \"${src}\" is using a query string which is not configured in images.localPatterns. This config will be required starting in Next.js 16.` +\n `\\nRead more: https://nextjs.org/docs/messages/next-image-unconfigured-localpatterns`\n )\n }\n if (placeholder === 'blur' && !blurDataURL) {\n const VALID_BLUR_EXT = ['jpeg', 'png', 'webp', 'avif'] // should match next-image-loader\n\n throw new Error(\n `Image with src \"${src}\" has \"placeholder='blur'\" property but is missing the \"blurDataURL\" property.\n Possible solutions:\n - Add a \"blurDataURL\" property, the contents should be a small Data URL to represent the image\n - Change the \"src\" property to a static import with one of the supported file types: ${VALID_BLUR_EXT.join(\n ','\n )} (animated images not supported)\n - Remove the \"placeholder\" property, effectively no blur effect\n Read more: https://nextjs.org/docs/messages/placeholder-blur-data-url`\n )\n }\n if ('ref' in rest) {\n warnOnce(\n `Image with src \"${src}\" is using unsupported \"ref\" property. Consider using the \"onLoad\" property instead.`\n )\n }\n\n if (!unoptimized && !isDefaultLoader) {\n const urlStr = loader({\n config,\n src,\n width: widthInt || 400,\n quality: qualityInt || 75,\n })\n let url: URL | undefined\n try {\n url = new URL(urlStr)\n } catch (err) {}\n if (urlStr === src || (url && url.pathname === src && !url.search)) {\n warnOnce(\n `Image with src \"${src}\" has a \"loader\" property that does not implement width. Please implement it or use the \"unoptimized\" property instead.` +\n `\\nRead more: https://nextjs.org/docs/messages/next-image-missing-loader-width`\n )\n }\n }\n\n if (onLoadingComplete) {\n warnOnce(\n `Image with src \"${src}\" is using deprecated \"onLoadingComplete\" property. Please use the \"onLoad\" property instead.`\n )\n }\n\n for (const [legacyKey, legacyValue] of Object.entries({\n layout,\n objectFit,\n objectPosition,\n lazyBoundary,\n lazyRoot,\n })) {\n if (legacyValue) {\n warnOnce(\n `Image with src \"${src}\" has legacy prop \"${legacyKey}\". Did you forget to run the codemod?` +\n `\\nRead more: https://nextjs.org/docs/messages/next-image-upgrade-to-13`\n )\n }\n }\n\n if (\n typeof window !== 'undefined' &&\n !perfObserver &&\n window.PerformanceObserver\n ) {\n perfObserver = new PerformanceObserver((entryList) => {\n for (const entry of entryList.getEntries()) {\n // @ts-ignore - missing \"LargestContentfulPaint\" class with \"element\" prop\n const imgSrc = entry?.element?.src || ''\n const lcpImage = allImgs.get(imgSrc)\n if (\n lcpImage &&\n lcpImage.loading === 'lazy' &&\n lcpImage.placeholder === 'empty' &&\n !lcpImage.src.startsWith('data:') &&\n !lcpImage.src.startsWith('blob:')\n ) {\n // https://web.dev/lcp/#measure-lcp-in-javascript\n warnOnce(\n `Image with src \"${lcpImage.src}\" was detected as the Largest Contentful Paint (LCP). Please add the \\`loading=\"eager\"\\` property if this image is above the fold.` +\n `\\nRead more: https://nextjs.org/docs/app/api-reference/components/image#loading`\n )\n }\n }\n })\n try {\n perfObserver.observe({\n type: 'largest-contentful-paint',\n buffered: true,\n })\n } catch (err) {\n // Log error but don't crash the app\n console.error(err)\n }\n }\n }\n const imgStyle = Object.assign(\n fill\n ? {\n position: 'absolute',\n height: '100%',\n width: '100%',\n left: 0,\n top: 0,\n right: 0,\n bottom: 0,\n objectFit,\n objectPosition,\n }\n : {},\n showAltText ? {} : { color: 'transparent' },\n style\n )\n\n const backgroundImage =\n !blurComplete && placeholder !== 'empty'\n ? placeholder === 'blur'\n ? `url(\"data:image/svg+xml;charset=utf-8,${getImageBlurSvg({\n widthInt,\n heightInt,\n blurWidth,\n blurHeight,\n blurDataURL: blurDataURL || '', // assume not undefined\n objectFit: imgStyle.objectFit,\n })}\")`\n : `url(\"${placeholder}\")` // assume `data:image/`\n : null\n\n const backgroundSize = !INVALID_BACKGROUND_SIZE_VALUES.includes(\n imgStyle.objectFit\n )\n ? imgStyle.objectFit\n : imgStyle.objectFit === 'fill'\n ? '100% 100%' // the background-size equivalent of `fill`\n : 'cover'\n\n let placeholderStyle: PlaceholderStyle = backgroundImage\n ? {\n backgroundSize,\n backgroundPosition: imgStyle.objectPosition || '50% 50%',\n backgroundRepeat: 'no-repeat',\n backgroundImage,\n }\n : {}\n\n if (process.env.NODE_ENV === 'development') {\n if (\n placeholderStyle.backgroundImage &&\n placeholder === 'blur' &&\n blurDataURL?.startsWith('/')\n ) {\n // During `next dev`, we don't want to generate blur placeholders with webpack\n // because it can delay starting the dev server. Instead, `next-image-loader.js`\n // will inline a special url to lazily generate the blur placeholder at request time.\n placeholderStyle.backgroundImage = `url(\"${blurDataURL}\")`\n }\n }\n\n const imgAttributes = generateImgAttrs({\n config,\n src,\n unoptimized,\n width: widthInt,\n quality: qualityInt,\n sizes,\n loader,\n })\n\n const loadingFinal = isLazy ? 'lazy' : loading\n\n if (process.env.NODE_ENV !== 'production') {\n if (typeof window !== 'undefined') {\n let fullUrl: URL\n try {\n fullUrl = new URL(imgAttributes.src)\n } catch (e) {\n fullUrl = new URL(imgAttributes.src, window.location.href)\n }\n allImgs.set(fullUrl.href, { src, loading: loadingFinal, placeholder })\n }\n }\n\n const props: ImgProps = {\n ...rest,\n loading: loadingFinal,\n fetchPriority,\n width: widthInt,\n height: heightInt,\n decoding,\n className,\n style: { ...imgStyle, ...placeholderStyle },\n sizes: imgAttributes.sizes,\n srcSet: imgAttributes.srcSet,\n src: overrideSrc || imgAttributes.src,\n }\n const meta = { unoptimized, preload: preload || priority, placeholder, fill }\n return { props, meta }\n}\n","import type React from 'react'\nimport { Children, useEffect, useLayoutEffect, type JSX } from 'react'\n\ntype State = JSX.Element[] | undefined\n\nexport type SideEffectProps = {\n reduceComponentsToState: <T extends {}>(\n components: Array<React.ReactElement<any>>,\n props: T\n ) => State\n handleStateChange?: (state: State) => void\n headManager: any\n inAmpMode?: boolean\n children: React.ReactNode\n}\n\nconst isServer = typeof window === 'undefined'\nconst useClientOnlyLayoutEffect = isServer ? () => {} : useLayoutEffect\nconst useClientOnlyEffect = isServer ? () => {} : useEffect\n\nexport default function SideEffect(props: SideEffectProps) {\n const { headManager, reduceComponentsToState } = props\n\n function emitChange() {\n if (headManager && headManager.mountedInstances) {\n const headElements = Children.toArray(\n Array.from(headManager.mountedInstances as Set<React.ReactNode>).filter(\n Boolean\n )\n ) as React.ReactElement[]\n headManager.updateHead(reduceComponentsToState(headElements, props))\n }\n }\n\n if (isServer) {\n headManager?.mountedInstances?.add(props.children)\n emitChange()\n }\n\n useClientOnlyLayoutEffect(() => {\n headManager?.mountedInstances?.add(props.children)\n return () => {\n headManager?.mountedInstances?.delete(props.children)\n }\n })\n\n // We need to call `updateHead` method whenever the `SideEffect` is trigger in all\n // life-cycles: mount, update, unmount. However, if there are multiple `SideEffect`s\n // being rendered, we only trigger the method from the last one.\n // This is ensured by keeping the last unflushed `updateHead` in the `_pendingUpdate`\n // singleton in the layout effect pass, and actually trigger it in the effect pass.\n useClientOnlyLayoutEffect(() => {\n if (headManager) {\n headManager._pendingUpdate = emitChange\n }\n return () => {\n if (headManager) {\n headManager._pendingUpdate = emitChange\n }\n }\n })\n\n useClientOnlyEffect(() => {\n if (headManager && headManager._pendingUpdate) {\n headManager._pendingUpdate()\n headManager._pendingUpdate = null\n }\n return () => {\n if (headManager && headManager._pendingUpdate) {\n headManager._pendingUpdate()\n headManager._pendingUpdate = null\n }\n }\n })\n\n return null\n}\n","module.exports = (\n require('../../module.compiled') as typeof import('../../module.compiled')\n).vendored['contexts'].AmpContext\n","module.exports = (\n require('../../module.compiled') as typeof import('../../module.compiled')\n).vendored['contexts'].HeadManagerContext\n","export function isInAmpMode({\n ampFirst = false,\n hybrid = false,\n hasQuery = false,\n} = {}): boolean {\n return ampFirst || (hybrid && hasQuery)\n}\n","'use client'\n\nimport React, { useContext, type JSX } from 'react'\nimport Effect from './side-effect'\nimport { AmpStateContext } from './amp-context.shared-runtime'\nimport { HeadManagerContext } from './head-manager-context.shared-runtime'\nimport { isInAmpMode } from './amp-mode'\nimport { warnOnce } from './utils/warn-once'\n\ntype WithInAmpMode = {\n inAmpMode?: boolean\n}\n\nexport function defaultHead(inAmpMode = false): JSX.Element[] {\n const head = [<meta charSet=\"utf-8\" key=\"charset\" />]\n if (!inAmpMode) {\n head.push(\n <meta name=\"viewport\" content=\"width=device-width\" key=\"viewport\" />\n )\n }\n return head\n}\n\nfunction onlyReactElement(\n list: Array<React.ReactElement<any>>,\n child: React.ReactElement | number | string\n): Array<React.ReactElement<any>> {\n // React children can be \"string\" or \"number\" in this case we ignore them for backwards compat\n if (typeof child === 'string' || typeof child === 'number') {\n return list\n }\n // Adds support for React.Fragment\n if (child.type === React.Fragment) {\n return list.concat(\n // @ts-expect-error @types/react does not remove fragments but this could also return ReactPortal[]\n React.Children.toArray(child.props.children).reduce(\n // @ts-expect-error @types/react does not remove fragments but this could also return ReactPortal[]\n (\n fragmentList: Array<React.ReactElement<any>>,\n fragmentChild: React.ReactElement | number | string\n ): Array<React.ReactElement<any>> => {\n if (\n typeof fragmentChild === 'string' ||\n typeof fragmentChild === 'number'\n ) {\n return fragmentList\n }\n return fragmentList.concat(fragmentChild)\n },\n []\n )\n )\n }\n return list.concat(child)\n}\n\nconst METATYPES = ['name', 'httpEquiv', 'charSet', 'itemProp']\n\n/*\n returns a function for filtering head child elements\n which shouldn't be duplicated, like <title/>\n Also adds support for deduplicated `key` properties\n*/\nfunction unique() {\n const keys = new Set()\n const tags = new Set()\n const metaTypes = new Set()\n const metaCategories: { [metatype: string]: Set<string> } = {}\n\n return (h: React.ReactElement<any>) => {\n let isUnique = true\n let hasKey = false\n\n if (h.key && typeof h.key !== 'number' && h.key.indexOf('$') > 0) {\n hasKey = true\n const key = h.key.slice(h.key.indexOf('$') + 1)\n if (keys.has(key)) {\n isUnique = false\n } else {\n keys.add(key)\n }\n }\n\n // eslint-disable-next-line default-case\n switch (h.type) {\n case 'title':\n case 'base':\n if (tags.has(h.type)) {\n isUnique = false\n } else {\n tags.add(h.type)\n }\n break\n case 'meta':\n for (let i = 0, len = METATYPES.length; i < len; i++) {\n const metatype = METATYPES[i]\n if (!h.props.hasOwnProperty(metatype)) continue\n\n if (metatype === 'charSet') {\n if (metaTypes.has(metatype)) {\n isUnique = false\n } else {\n metaTypes.add(metatype)\n }\n } else {\n const category = h.props[metatype]\n const categories = metaCategories[metatype] || new Set()\n if ((metatype !== 'name' || !hasKey) && categories.has(category)) {\n isUnique = false\n } else {\n categories.add(category)\n metaCategories[metatype] = categories\n }\n }\n }\n break\n }\n\n return isUnique\n }\n}\n\n/**\n *\n * @param headChildrenElements List of children of <Head>\n */\nfunction reduceComponents<T extends {} & WithInAmpMode>(\n headChildrenElements: Array<React.ReactElement<any>>,\n props: T\n) {\n const { inAmpMode } = props\n return headChildrenElements\n .reduce(onlyReactElement, [])\n .reverse()\n .concat(defaultHead(inAmpMode).reverse())\n .filter(unique())\n .reverse()\n .map((c: React.ReactElement<any>, i: number) => {\n const key = c.key || i\n if (process.env.NODE_ENV === 'development') {\n // omit JSON-LD structured data snippets from the warning\n if (c.type === 'script' && c.props['type'] !== 'application/ld+json') {\n const srcMessage = c.props['src']\n ? `<script> tag with src=\"${c.props['src']}\"`\n : `inline <script>`\n warnOnce(\n `Do not add <script> tags using next/head (see ${srcMessage}). Use next/script instead. \\nSee more info here: https://nextjs.org/docs/messages/no-script-tags-in-head-component`\n )\n } else if (c.type === 'link' && c.props['rel'] === 'stylesheet') {\n warnOnce(\n `Do not add stylesheets using next/head (see <link rel=\"stylesheet\"> tag with href=\"${c.props['href']}\"). Use Document instead. \\nSee more info here: https://nextjs.org/docs/messages/no-stylesheets-in-head-component`\n )\n }\n }\n return React.cloneElement(c, { key })\n })\n}\n\n/**\n * This component injects elements to `<head>` of your page.\n * To avoid duplicated `tags` in `<head>` you can use the `key` property, which will make sure every tag is only rendered once.\n */\nfunction Head({ children }: { children: React.ReactNode }) {\n const ampState = useContext(AmpStateContext)\n const headManager = useContext(HeadManagerContext)\n return (\n <Effect\n reduceComponentsToState={reduceComponents}\n headManager={headManager}\n inAmpMode={isInAmpMode(ampState)}\n >\n {children}\n </Effect>\n )\n}\n\nexport default Head\n","module.exports = (\n require('../../module.compiled') as typeof import('../../module.compiled')\n).vendored['contexts'].ImageConfigContext\n","module.exports = (\n require('../../module.compiled') as typeof import('../../module.compiled')\n).vendored['contexts'].RouterContext\n","import type { NextConfig } from '../../server/config-shared'\n\n/**\n * Find the closest matching `quality` in the list of `config.qualities`\n * @param quality the quality prop passed to the image component\n * @param config the \"images\" configuration from next.config.js\n * @returns the closest matching quality value\n */\nexport function findClosestQuality(\n quality: number | undefined,\n config: NextConfig['images'] | undefined\n): number {\n const q = quality || 75\n if (!config?.qualities?.length) {\n return q\n }\n return config.qualities.reduce(\n (prev, cur) => (Math.abs(cur - q) < Math.abs(prev - q) ? cur : prev),\n 0\n )\n}\n","import type { ImageLoaderPropsWithConfig } from './image-config'\nimport { findClosestQuality } from './find-closest-quality'\n\nfunction defaultLoader({\n config,\n src,\n width,\n quality,\n}: ImageLoaderPropsWithConfig): string {\n if (process.env.NODE_ENV !== 'production') {\n const missingValues = []\n\n // these should always be provided but make sure they are\n if (!src) missingValues.push('src')\n if (!width) missingValues.push('width')\n\n if (missingValues.length > 0) {\n throw new Error(\n `Next Image Optimization requires ${missingValues.join(\n ', '\n )} to be provided. Make sure you pass them as props to the \\`next/image\\` component. Received: ${JSON.stringify(\n { src, width, quality }\n )}`\n )\n }\n\n if (src.startsWith('//')) {\n throw new Error(\n `Failed to parse src \"${src}\" on \\`next/image\\`, protocol-relative URL (//) must be changed to an absolute URL (http:// or https://)`\n )\n }\n\n if (src.startsWith('/') && config.localPatterns) {\n if (\n process.env.NODE_ENV !== 'test' &&\n // micromatch isn't compatible with edge runtime\n process.env.NEXT_RUNTIME !== 'edge'\n ) {\n // We use dynamic require because this should only error in development\n const { hasLocalMatch } =\n require('./match-local-pattern') as typeof import('./match-local-pattern')\n if (!hasLocalMatch(config.localPatterns, src)) {\n throw new Error(\n `Invalid src prop (${src}) on \\`next/image\\` does not match \\`images.localPatterns\\` configured in your \\`next.config.js\\`\\n` +\n `See more info: https://nextjs.org/docs/messages/next-image-unconfigured-localpatterns`\n )\n }\n }\n }\n\n if (!src.startsWith('/') && (config.domains || config.remotePatterns)) {\n let parsedSrc: URL\n try {\n parsedSrc = new URL(src)\n } catch (err) {\n console.error(err)\n throw new Error(\n `Failed to parse src \"${src}\" on \\`next/image\\`, if using relative image it must start with a leading slash \"/\" or be an absolute URL (http:// or https://)`\n )\n }\n\n if (\n process.env.NODE_ENV !== 'test' &&\n // micromatch isn't compatible with edge runtime\n process.env.NEXT_RUNTIME !== 'edge'\n ) {\n // We use dynamic require because this should only error in development\n const { hasRemoteMatch } =\n require('./match-remote-pattern') as typeof import('./match-remote-pattern')\n if (\n !hasRemoteMatch(config.domains!, config.remotePatterns!, parsedSrc)\n ) {\n throw new Error(\n `Invalid src prop (${src}) on \\`next/image\\`, hostname \"${parsedSrc.hostname}\" is not configured under images in your \\`next.config.js\\`\\n` +\n `See more info: https://nextjs.org/docs/messages/next-image-unconfigured-host`\n )\n }\n }\n }\n }\n\n const q = findClosestQuality(quality, config)\n\n return `${config.path}?url=${encodeURIComponent(src)}&w=${width}&q=${q}${\n src.startsWith('/_next/static/media/') && process.env.NEXT_DEPLOYMENT_ID\n ? `&dpl=${process.env.NEXT_DEPLOYMENT_ID}`\n : ''\n }`\n}\n\n// We use this to determine if the import is the default loader\n// or a custom loader defined by the user in next.config.js\ndefaultLoader.__next_img_default = true\n\nexport default defaultLoader\n","'use client'\n\nimport React, {\n useRef,\n useEffect,\n useCallback,\n useContext,\n useMemo,\n useState,\n forwardRef,\n use,\n} from 'react'\nimport ReactDOM from 'react-dom'\nimport Head from '../shared/lib/head'\nimport { getImgProps } from '../shared/lib/get-img-props'\nimport type {\n ImageProps,\n ImgProps,\n OnLoad,\n OnLoadingComplete,\n PlaceholderValue,\n} from '../shared/lib/get-img-props'\nimport type {\n ImageConfigComplete,\n ImageLoaderProps,\n} from '../shared/lib/image-config'\nimport { imageConfigDefault } from '../shared/lib/image-config'\nimport { ImageConfigContext } from '../shared/lib/image-config-context.shared-runtime'\nimport { warnOnce } from '../shared/lib/utils/warn-once'\nimport { RouterContext } from '../shared/lib/router-context.shared-runtime'\n\n// This is replaced by webpack alias\nimport defaultLoader from 'next/dist/shared/lib/image-loader'\nimport { useMergedRef } from './use-merged-ref'\n\n// This is replaced by webpack define plugin\nconst configEnv = process.env.__NEXT_IMAGE_OPTS as any as ImageConfigComplete\n\nif (typeof window === 'undefined') {\n ;(globalThis as any).__NEXT_IMAGE_IMPORTED = true\n}\n\nexport type { ImageLoaderProps }\nexport type ImageLoader = (p: ImageLoaderProps) => string\n\ntype ImgElementWithDataProp = HTMLImageElement & {\n 'data-loaded-src': string | undefined\n}\n\ntype ImageElementProps = ImgProps & {\n unoptimized: boolean\n placeholder: PlaceholderValue\n onLoadRef: React.MutableRefObject<OnLoad | undefined>\n onLoadingCompleteRef: React.MutableRefObject<OnLoadingComplete | undefined>\n setBlurComplete: (b: boolean) => void\n setShowAltText: (b: boolean) => void\n sizesInput: string | undefined\n}\n\n// See https://stackoverflow.com/q/39777833/266535 for why we use this ref\n// handler instead of the img's onLoad attribute.\nfunction handleLoading(\n img: ImgElementWithDataProp,\n placeholder: PlaceholderValue,\n onLoadRef: React.MutableRefObject<OnLoad | undefined>,\n onLoadingCompleteRef: React.MutableRefObject<OnLoadingComplete | undefined>,\n setBlurComplete: (b: boolean) => void,\n unoptimized: boolean,\n sizesInput: string | undefined\n) {\n const src = img?.src\n if (!img || img['data-loaded-src'] === src) {\n return\n }\n img['data-loaded-src'] = src\n const p = 'decode' in img ? img.decode() : Promise.resolve()\n p.catch(() => {}).then(() => {\n if (!img.parentElement || !img.isConnected) {\n // Exit early in case of race condition:\n // - onload() is called\n // - decode() is called but incomplete\n // - unmount is called\n // - decode() completes\n return\n }\n if (placeholder !== 'empty') {\n setBlurComplete(true)\n }\n if (onLoadRef?.current) {\n // Since we don't have the SyntheticEvent here,\n // we must create one with the same shape.\n // See https://reactjs.org/docs/events.html\n const event = new Event('load')\n Object.defineProperty(event, 'target', { writable: false, value: img })\n let prevented = false\n let stopped = false\n onLoadRef.current({\n ...event,\n nativeEvent: event,\n currentTarget: img,\n target: img,\n isDefaultPrevented: () => prevented,\n isPropagationStopped: () => stopped,\n persist: () => {},\n preventDefault: () => {\n prevented = true\n event.preventDefault()\n },\n stopPropagation: () => {\n stopped = true\n event.stopPropagation()\n },\n })\n }\n if (onLoadingCompleteRef?.current) {\n onLoadingCompleteRef.current(img)\n }\n if (process.env.NODE_ENV !== 'production') {\n const origSrc = new URL(src, 'http://n').searchParams.get('url') || src\n if (img.getAttribute('data-nimg') === 'fill') {\n if (!unoptimized && (!sizesInput || sizesInput === '100vw')) {\n let widthViewportRatio =\n img.getBoundingClientRect().width / window.innerWidth\n if (widthViewportRatio < 0.6) {\n if (sizesInput === '100vw') {\n warnOnce(\n `Image with src \"${origSrc}\" has \"fill\" prop and \"sizes\" prop of \"100vw\", but image is not rendered at full viewport width. Please adjust \"sizes\" to improve page performance. Read more: https://nextjs.org/docs/api-reference/next/image#sizes`\n )\n } else {\n warnOnce(\n `Image with src \"${origSrc}\" has \"fill\" but is missing \"sizes\" prop. Please add it to improve page performance. Read more: https://nextjs.org/docs/api-reference/next/image#sizes`\n )\n }\n }\n }\n if (img.parentElement) {\n const { position } = window.getComputedStyle(img.parentElement)\n const valid = ['absolute', 'fixed', 'relative']\n if (!valid.includes(position)) {\n warnOnce(\n `Image with src \"${origSrc}\" has \"fill\" and parent element with invalid \"position\". Provided \"${position}\" should be one of ${valid\n .map(String)\n .join(',')}.`\n )\n }\n }\n if (img.height === 0) {\n warnOnce(\n `Image with src \"${origSrc}\" has \"fill\" and a height value of 0. This is likely because the parent element of the image has not been styled to have a set height.`\n )\n }\n }\n\n const heightModified =\n img.height.toString() !== img.getAttribute('height')\n const widthModified = img.width.toString() !== img.getAttribute('width')\n if (\n (heightModified && !widthModified) ||\n (!heightModified && widthModified)\n ) {\n warnOnce(\n `Image with src \"${origSrc}\" has either width or height modified, but not the other. If you use CSS to change the size of your image, also include the styles 'width: \"auto\"' or 'height: \"auto\"' to maintain the aspect ratio.`\n )\n }\n }\n })\n}\n\nfunction getDynamicProps(\n fetchPriority?: string\n): Record<string, string | undefined> {\n if (Boolean(use)) {\n // In React 19.0.0 or newer, we must use camelCase\n // prop to avoid \"Warning: Invalid DOM property\".\n // See https://github.com/facebook/react/pull/25927\n return { fetchPriority }\n }\n // In React 18.2.0 or older, we must use lowercase prop\n // to avoid \"Warning: Invalid DOM property\".\n return { fetchpriority: fetchPriority }\n}\n\nconst ImageElement = forwardRef<HTMLImageElement | null, ImageElementProps>(\n (\n {\n src,\n srcSet,\n sizes,\n height,\n width,\n decoding,\n className,\n style,\n fetchPriority,\n placeholder,\n loading,\n unoptimized,\n fill,\n onLoadRef,\n onLoadingCompleteRef,\n setBlurComplete,\n setShowAltText,\n sizesInput,\n onLoad,\n onError,\n ...rest\n },\n forwardedRef\n ) => {\n const ownRef = useCallback(\n (img: ImgElementWithDataProp | null) => {\n if (!img) {\n return\n }\n if (onError) {\n // If the image has an error before react hydrates, then the error is lost.\n // The workaround is to wait until the image is mounted which is after hydration,\n // then we set the src again to trigger the error handler (if there was an error).\n // eslint-disable-next-line no-self-assign\n img.src = img.src\n }\n if (process.env.NODE_ENV !== 'production') {\n if (!src) {\n console.error(`Image is missing required \"src\" property:`, img)\n }\n if (img.getAttribute('alt') === null) {\n console.error(\n `Image is missing required \"alt\" property. Please add Alternative Text to describe the image for screen readers and search engines.`\n )\n }\n }\n if (img.complete) {\n handleLoading(\n img,\n placeholder,\n onLoadRef,\n onLoadingCompleteRef,\n setBlurComplete,\n unoptimized,\n sizesInput\n )\n }\n },\n [\n src,\n placeholder,\n onLoadRef,\n onLoadingCompleteRef,\n setBlurComplete,\n onError,\n unoptimized,\n sizesInput,\n ]\n )\n\n const ref = useMergedRef(forwardedRef, ownRef)\n\n return (\n <img\n {...rest}\n {...getDynamicProps(fetchPriority)}\n // It's intended to keep `loading` before `src` because React updates\n // props in order which causes Safari/Firefox to not lazy load properly.\n // See https://github.com/facebook/react/issues/25883\n loading={loading}\n width={width}\n height={height}\n decoding={decoding}\n data-nimg={fill ? 'fill' : '1'}\n className={className}\n style={style}\n // It's intended to keep `src` the last attribute because React updates\n // attributes in order. If we keep `src` the first one, Safari will\n // immediately start to fetch `src`, before `sizes` and `srcSet` are even\n // updated by React. That causes multiple unnecessary requests if `srcSet`\n // and `sizes` are defined.\n // This bug cannot be reproduced in Chrome or Firefox.\n sizes={sizes}\n srcSet={srcSet}\n src={src}\n ref={ref}\n onLoad={(event) => {\n const img = event.currentTarget as ImgElementWithDataProp\n handleLoading(\n img,\n placeholder,\n onLoadRef,\n onLoadingCompleteRef,\n setBlurComplete,\n unoptimized,\n sizesInput\n )\n }}\n onError={(event) => {\n // if the real image fails to load, this will ensure \"alt\" is visible\n setShowAltText(true)\n if (placeholder !== 'empty') {\n // If the real image fails to load, this will still remove the placeholder.\n setBlurComplete(true)\n }\n if (onError) {\n onError(event)\n }\n }}\n />\n )\n }\n)\n\nfunction ImagePreload({\n isAppRouter,\n imgAttributes,\n}: {\n isAppRouter: boolean\n imgAttributes: ImgProps\n}) {\n const opts: ReactDOM.PreloadOptions = {\n as: 'image',\n imageSrcSet: imgAttributes.srcSet,\n imageSizes: imgAttributes.sizes,\n crossOrigin: imgAttributes.crossOrigin,\n referrerPolicy: imgAttributes.referrerPolicy,\n ...getDynamicProps(imgAttributes.fetchPriority),\n }\n\n if (isAppRouter && ReactDOM.preload) {\n ReactDOM.preload(imgAttributes.src, opts)\n return null\n }\n\n return (\n <Head>\n <link\n key={\n '__nimg-' +\n imgAttributes.src +\n imgAttributes.srcSet +\n imgAttributes.sizes\n }\n rel=\"preload\"\n // Note how we omit the `href` attribute, as it would only be relevant\n // for browsers that do not support `imagesrcset`, and in those cases\n // it would cause the incorrect image to be preloaded.\n //\n // https://html.spec.whatwg.org/multipage/semantics.html#attr-link-imagesrcset\n href={imgAttributes.srcSet ? undefined : imgAttributes.src}\n {...opts}\n />\n </Head>\n )\n}\n\n/**\n * The `Image` component is used to optimize images.\n *\n * Read more: [Next.js docs: `Image`](https://nextjs.org/docs/app/api-reference/components/image)\n */\nexport const Image = forwardRef<HTMLImageElement | null, ImageProps>(\n (props, forwardedRef) => {\n const pagesRouter = useContext(RouterContext)\n // We're in the app directory if there is no pages router.\n const isAppRouter = !pagesRouter\n\n const configContext = useContext(ImageConfigContext)\n const config = useMemo(() => {\n const c = configEnv || configContext || imageConfigDefault\n const allSizes = [...c.deviceSizes, ...c.imageSizes].sort((a, b) => a - b)\n const deviceSizes = c.deviceSizes.sort((a, b) => a - b)\n const qualities = c.qualities?.sort((a, b) => a - b)\n return { ...c, allSizes, deviceSizes, qualities }\n }, [configContext])\n\n const { onLoad, onLoadingComplete } = props\n const onLoadRef = useRef(onLoad)\n\n useEffect(() => {\n onLoadRef.current = onLoad\n }, [onLoad])\n\n const onLoadingCompleteRef = useRef(onLoadingComplete)\n\n useEffect(() => {\n onLoadingCompleteRef.current = onLoadingComplete\n }, [onLoadingComplete])\n\n const [blurComplete, setBlurComplete] = useState(false)\n const [showAltText, setShowAltText] = useState(false)\n\n const { props: imgAttributes, meta: imgMeta } = getImgProps(props, {\n defaultLoader,\n imgConf: config,\n blurComplete,\n showAltText,\n })\n\n return (\n <>\n {\n <ImageElement\n {...imgAttributes}\n unoptimized={imgMeta.unoptimized}\n placeholder={imgMeta.placeholder}\n fill={imgMeta.fill}\n onLoadRef={onLoadRef}\n onLoadingCompleteRef={onLoadingCompleteRef}\n setBlurComplete={setBlurComplete}\n setShowAltText={setShowAltText}\n sizesInput={props.sizes}\n ref={forwardedRef}\n />\n }\n {imgMeta.preload ? (\n <ImagePreload\n isAppRouter={isAppRouter}\n imgAttributes={imgAttributes}\n />\n ) : null}\n </>\n )\n }\n)\n","import type { ImageConfigComplete, ImageLoaderProps } from './image-config'\nimport type { ImageProps, ImageLoader, StaticImageData } from './get-img-props'\n\nimport { getImgProps } from './get-img-props'\nimport { Image } from '../../client/image-component'\n\n// This is replaced by webpack alias\nimport defaultLoader from 'next/dist/shared/lib/image-loader'\n\n/**\n * For more advanced use cases, you can call `getImageProps()`\n * to get the props that would be passed to the underlying `<img>` element,\n * and instead pass to them to another component, style, canvas, etc.\n *\n * Read more: [Next.js docs: `getImageProps`](https://nextjs.org/docs/app/api-reference/components/image#getimageprops)\n */\nexport function getImageProps(imgProps: ImageProps) {\n const { props } = getImgProps(imgProps, {\n defaultLoader,\n // This is replaced by webpack define plugin\n imgConf: process.env.__NEXT_IMAGE_OPTS as any as ImageConfigComplete,\n })\n // Normally we don't care about undefined props because we pass to JSX,\n // but this exported function could be used by the end user for anything\n // so we delete undefined props to clean it up a little.\n for (const [key, value] of Object.entries(props)) {\n if (value === undefined) {\n delete props[key as keyof typeof props]\n }\n }\n return { props }\n}\n\nexport default Image\n\nexport type { ImageProps, ImageLoaderProps, ImageLoader, StaticImageData }\n","module.exports = require('./dist/shared/lib/image-external')\n","module.exports = require('./dist/client/components/navigation')\n","\"use client\"\n\nimport Image from \"next/image\"\nimport { useRouter, useSearchParams } from \"next/navigation\"\nimport { useCallback, useEffect, useMemo, useRef, useState } from \"react\"\nimport { DarkModeToggle } from \"@/components/dark-mode-toggle\"\nimport { useDarkMode } from \"@/hooks/use-dark-mode\"\nimport type { LogEntry, LogFile, LogListResponse, LogsApiResponse } from \"@/types\"\nimport { getTextColor, LOG_COLORS } from \"../../../src/constants/log-colors\"\n\n// Define interfaces for object property rendering\ninterface PropertyData {\n name: string\n value: string | number | boolean | null\n type: string\n subtype?: string\n}\n\ninterface ReplayEvent {\n timestamp: string\n event: string\n details: string\n type?: string\n x?: number\n y?: number\n target?: string\n direction?: string\n distance?: number\n key?: string\n}\n\nimport { parseLogEntries } from \"./utils\"\n\n// Keep this for backwards compatibility, but it's not used anymore\nfunction _parseLogLine(line: string): LogEntry | null {\n const match = line.match(/^\\[([^\\]]+)\\] \\[([^\\]]+)\\] (.*)$/s)\n if (!match) return null\n\n const [, timestamp, source, message] = match\n const screenshot = message.match(/\\[SCREENSHOT\\] (.+)/)?.[1]\n\n return {\n timestamp,\n source,\n message,\n screenshot,\n original: line\n }\n}\n\n// Component to render truncated URLs with click-to-expand\nfunction URLRenderer({ url, maxLength = 60 }: { url: string; maxLength?: number }) {\n const [isExpanded, setIsExpanded] = useState(false)\n\n if (url.length <= maxLength) {\n return (\n <a\n href={url}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"text-blue-600 dark:text-blue-400 hover:text-blue-800 dark:hover:text-blue-300 underline\"\n >\n {url}\n </a>\n )\n }\n\n const truncated = `${url.substring(0, maxLength)}...`\n\n return (\n <span className=\"inline-block\">\n {isExpanded ? (\n <span>\n <a\n href={url}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"text-blue-600 dark:text-blue-400 hover:text-blue-800 dark:hover:text-blue-300 underline\"\n >\n {url}\n </a>\n <button\n type=\"button\"\n onClick={() => setIsExpanded(false)}\n className=\"ml-2 text-xs text-muted-foreground hover:text-foreground px-1 py-0.5 rounded hover:bg-muted\"\n >\n [collapse]\n </button>\n </span>\n ) : (\n <span>\n <a\n href={url}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"text-blue-600 dark:text-blue-400 hover:text-blue-800 dark:hover:text-blue-300 underline\"\n >\n {truncated}\n </a>\n <button\n type=\"button\"\n onClick={() => setIsExpanded(true)}\n className=\"ml-1 text-xs text-muted-foreground hover:text-foreground px-1 py-0.5 rounded hover:bg-muted\"\n >\n [expand]\n </button>\n </span>\n )}\n </span>\n )\n}\n\n// Component to render Chrome DevTools-style collapsible objects\nfunction ObjectRenderer({ content }: { content: string }) {\n const [isExpanded, setIsExpanded] = useState(false)\n\n try {\n const obj = JSON.parse(content)\n\n // Check if it's a Chrome DevTools object representation\n if (obj && typeof obj === \"object\" && obj.type === \"object\" && obj.properties) {\n const properties = obj.properties\n const description = obj.description || \"Object\"\n const overflow = obj.overflow\n\n return (\n <div className=\"inline-block\">\n <button\n type=\"button\"\n onClick={() => setIsExpanded(!isExpanded)}\n className=\"inline-flex items-center gap-1 text-blue-600 hover:text-blue-800 font-mono text-sm\"\n >\n <svg\n className={`w-3 h-3 transition-transform ${isExpanded ? \"rotate-90\" : \"\"}`}\n fill=\"currentColor\"\n viewBox=\"0 0 20 20\"\n >\n <path\n fillRule=\"evenodd\"\n d=\"M7.293 14.707a1 1 0 010-1.414L10.586 10 7.293 6.707a1 1 0 111.414-1.414l4 4a1 1 0 010 1.414l-4 4a1 1 0 01-1.414 0z\"\n clipRule=\"evenodd\"\n />\n </svg>\n <span className=\"text-purple-600\">{description}</span>\n {!isExpanded && (\n <span className=\"text-gray-500\">\n {overflow ? \"...\" : \"\"} {\"{\"}\n {properties.slice(0, 3).map((prop: PropertyData, idx: number) => (\n <span key={`${prop.name}-${idx}`}>\n {idx > 0 && \", \"}\n <span className=\"text-red-600\">{prop.name}</span>:\n <span className=\"text-blue-600\">\n {prop.type === \"string\"\n ? `\"${prop.value}\"`\n : prop.type === \"number\"\n ? prop.value\n : prop.type === \"object\"\n ? prop.subtype === \"array\"\n ? prop.value\n : \"{...}\"\n : prop.value}\n </span>\n </span>\n ))}\n {properties.length > 3 && \", ...\"}\n {\"}\"}\n </span>\n )}\n </button>\n\n {isExpanded && (\n <div className=\"mt-1 ml-4 border-l-2 border-gray-200 pl-3\">\n <div className=\"font-mono text-sm\">\n <div className=\"text-gray-600\">\n {description} {\"{\"}\n <div className=\"ml-4\">\n {properties.map((prop: PropertyData, idx: number) => (\n <div key={`${prop.name}-${idx}`} className=\"py-0.5\">\n <span className=\"text-red-600\">{prop.name}</span>\n <span className=\"text-gray-500\">: </span>\n <span\n className={\n prop.type === \"string\"\n ? \"text-green-600\"\n : prop.type === \"number\"\n ? \"text-blue-600\"\n : prop.type === \"object\"\n ? \"text-purple-600\"\n : \"text-orange-600\"\n }\n >\n {prop.type === \"string\"\n ? `\"${String(prop.value)}\"`\n : prop.type === \"number\"\n ? String(prop.value)\n : prop.type === \"object\"\n ? prop.subtype === \"array\"\n ? String(prop.value)\n : \"{...}\"\n : String(prop.value)}\n </span>\n {idx < properties.length - 1 && <span className=\"text-gray-500\">,</span>}\n </div>\n ))}\n {overflow && <div className=\"text-gray-500 italic\">... and more properties</div>}\n </div>\n <div className=\"text-gray-600\">{\"}\"}</div>\n </div>\n </div>\n </div>\n )}\n </div>\n )\n }\n\n // For regular JSON objects, render them nicely too\n return (\n <div className=\"inline-block\">\n <button\n type=\"button\"\n onClick={() => setIsExpanded(!isExpanded)}\n className=\"inline-flex items-center gap-1 text-blue-600 hover:text-blue-800 font-mono text-sm\"\n >\n <svg\n className={`w-3 h-3 transition-transform ${isExpanded ? \"rotate-90\" : \"\"}`}\n fill=\"currentColor\"\n viewBox=\"0 0 20 20\"\n >\n <path\n fillRule=\"evenodd\"\n d=\"M7.293 14.707a1 1 0 010-1.414L10.586 10 7.293 6.707a1 1 0 111.414-1.414l4 4a1 1 0 010 1.414l-4 4a1 1 0 01-1.414 0z\"\n clipRule=\"evenodd\"\n />\n </svg>\n <span className=\"text-purple-600\">Object</span>\n {!isExpanded && (\n <span className=\"text-gray-500\">\n {\"{\"}...{\"}\"}\n </span>\n )}\n </button>\n\n {isExpanded && (\n <div className=\"mt-1 ml-4 border-l-2 border-gray-200 pl-3\">\n <pre className=\"font-mono text-sm text-foreground whitespace-pre-wrap\">{JSON.stringify(obj, null, 2)}</pre>\n </div>\n )}\n </div>\n )\n } catch (_e) {\n // If it's not valid JSON, just return the original content\n return <span>{content}</span>\n }\n}\n\nfunction LogEntryComponent({ entry, darkMode }: { entry: LogEntry; darkMode: boolean }) {\n // Parse log type from message patterns - using shared TUI colors\n const parseLogType = (message: string) => {\n if (message.includes(\"[INTERACTION]\"))\n return {\n type: \"INTERACTION\",\n backgroundColor: LOG_COLORS.CONSOLE_DEBUG,\n textColor: getTextColor(LOG_COLORS.CONSOLE_DEBUG)\n }\n if (message.includes(\"[CONSOLE ERROR]\"))\n return {\n type: \"CONSOLE ERROR\",\n backgroundColor: LOG_COLORS.CONSOLE_ERROR,\n textColor: getTextColor(LOG_COLORS.CONSOLE_ERROR)\n }\n if (message.includes(\"[CONSOLE WARN]\"))\n return {\n type: \"CONSOLE WARN\",\n backgroundColor: LOG_COLORS.CONSOLE_WARN,\n textColor: getTextColor(LOG_COLORS.CONSOLE_WARN)\n }\n if (message.includes(\"[CONSOLE INFO]\"))\n return {\n type: \"CONSOLE INFO\",\n backgroundColor: LOG_COLORS.CONSOLE_INFO,\n textColor: getTextColor(LOG_COLORS.CONSOLE_INFO)\n }\n if (message.includes(\"[CONSOLE LOG]\"))\n return {\n type: \"CONSOLE LOG\",\n backgroundColor: LOG_COLORS.CONSOLE_LOG,\n textColor: getTextColor(LOG_COLORS.CONSOLE_LOG)\n }\n if (message.includes(\"[CONSOLE DEBUG]\"))\n return {\n type: \"CONSOLE DEBUG\",\n backgroundColor: LOG_COLORS.CONSOLE_DEBUG,\n textColor: getTextColor(LOG_COLORS.CONSOLE_DEBUG)\n }\n if (message.includes(\"[SCREENSHOT]\"))\n return {\n type: \"SCREENSHOT\",\n backgroundColor: LOG_COLORS.SCREENSHOT,\n textColor: getTextColor(LOG_COLORS.SCREENSHOT)\n }\n if (message.includes(\"[NAVIGATION]\") || message.includes(\"[PAGE]\"))\n return {\n type: \"PAGE\",\n backgroundColor: LOG_COLORS.PAGE,\n textColor: getTextColor(LOG_COLORS.PAGE)\n }\n if (message.includes(\"[DOM]\"))\n return {\n type: \"DOM\",\n backgroundColor: LOG_COLORS.DOM,\n textColor: getTextColor(LOG_COLORS.DOM)\n }\n if (message.includes(\"[CDP]\"))\n return {\n type: \"CDP\",\n backgroundColor: LOG_COLORS.CDP,\n textColor: getTextColor(LOG_COLORS.CDP)\n }\n if (message.includes(\"[NETWORK]\"))\n return {\n type: \"NETWORK\",\n backgroundColor: LOG_COLORS.NETWORK,\n textColor: getTextColor(LOG_COLORS.NETWORK)\n }\n if (message.includes(\"[ERROR]\") || message.includes(\"[PAGE ERROR]\") || message.includes(\"[NETWORK ERROR]\"))\n return {\n type: \"ERROR\",\n backgroundColor: LOG_COLORS.ERROR,\n textColor: getTextColor(LOG_COLORS.ERROR)\n }\n if (message.includes(\"[CRITICAL ERROR]\"))\n return {\n type: \"CRITICAL ERROR\",\n backgroundColor: LOG_COLORS.CRITICAL_ERROR,\n textColor: getTextColor(LOG_COLORS.CRITICAL_ERROR)\n }\n return {\n type: \"DEFAULT\",\n color: \"bg-gray-50 dark:bg-gray-800/50 border-gray-200 dark:border-gray-700\",\n backgroundColor: LOG_COLORS.DEFAULT,\n textColor: getTextColor(LOG_COLORS.DEFAULT)\n }\n }\n\n const logTypeInfo = parseLogType(entry.message)\n\n // Extract and highlight type tags, detect JSON objects and URLs\n const renderMessage = (message: string) => {\n const typeTagRegex = /\\[([A-Z\\s]+)\\]/g\n const jsonRegex = /\\{[^{}]*(?:\\{[^{}]*\\}[^{}]*)*\\}/g\n const urlRegex = /(https?:\\/\\/[^\\s]+)/g\n\n const parts = []\n let lastIndex = 0\n let match: RegExpExecArray | null\n\n // First, handle type tags\n match = typeTagRegex.exec(message)\n while (match !== null) {\n // Add text before the tag\n if (match.index > lastIndex) {\n parts.push(message.slice(lastIndex, match.index))\n }\n\n // Add the tag with styling using TUI colors\n parts.push(\n <span\n key={match.index}\n className=\"inline-block px-1.5 py-0.5 rounded text-xs font-medium mr-1\"\n style={{\n backgroundColor: logTypeInfo.backgroundColor,\n color: logTypeInfo.textColor\n }}\n >\n {match[1]}\n </span>\n )\n\n lastIndex = match.index + match[0].length\n match = typeTagRegex.exec(message)\n }\n\n // Add remaining text\n const remainingText = message.slice(lastIndex)\n\n // Process remaining text for JSON objects and URLs\n const processTextForObjects = (text: string, keyPrefix: string) => {\n const jsonMatches = [...text.matchAll(jsonRegex)]\n const urlMatches = [...text.matchAll(urlRegex)]\n const allMatches = [\n ...jsonMatches.map((m) => ({ ...m, type: \"json\" })),\n ...urlMatches.map((m) => ({ ...m, type: \"url\" }))\n ]\n\n // Sort matches by index\n allMatches.sort((a, b) => (a.index ?? 0) - (b.index ?? 0))\n\n if (allMatches.length === 0) {\n return [text]\n }\n\n const finalParts = []\n let textLastIndex = 0\n\n allMatches.forEach((objMatch, _idx) => {\n // Add text before match\n if ((objMatch.index ?? 0) > textLastIndex) {\n finalParts.push(text.slice(textLastIndex, objMatch.index ?? 0))\n }\n\n // Add appropriate renderer\n if (objMatch.type === \"json\") {\n finalParts.push(\n <ObjectRenderer\n key={`${keyPrefix}-json-${objMatch.index}-${objMatch[0].slice(0, 20)}`}\n content={objMatch[0]}\n />\n )\n } else if (objMatch.type === \"url\") {\n finalParts.push(<URLRenderer key={`${keyPrefix}-url-${objMatch.index}-${objMatch[0]}`} url={objMatch[0]} />)\n }\n\n textLastIndex = (objMatch.index ?? 0) + objMatch[0].length\n })\n\n // Add any text after the last match\n if (textLastIndex < text.length) {\n finalParts.push(text.slice(textLastIndex))\n }\n\n return finalParts\n }\n\n const processedRemaining = processTextForObjects(remainingText, \"main\")\n parts.push(...processedRemaining)\n\n return parts.length > 0 ? parts : message\n }\n\n // Determine the background color based on log type and dark mode\n const getBackgroundStyle = () => {\n const type = logTypeInfo.type\n if (darkMode) {\n // Dark mode colors\n switch (type) {\n case \"INTERACTION\":\n case \"CONSOLE DEBUG\":\n case \"DOM\":\n return { backgroundColor: \"rgba(88, 28, 135, 0.3)\" } // purple-950/30\n case \"CONSOLE ERROR\":\n case \"ERROR\":\n case \"CRITICAL ERROR\":\n return { backgroundColor: \"rgba(127, 29, 29, 0.3)\" } // red-950/30\n case \"CONSOLE WARN\":\n case \"CDP\":\n case \"NETWORK\":\n return { backgroundColor: \"rgba(133, 77, 14, 0.3)\" } // yellow-950/30\n case \"CONSOLE INFO\":\n case \"SCREENSHOT\":\n return { backgroundColor: \"rgba(30, 58, 138, 0.3)\" } // blue-950/30\n case \"PAGE\":\n return { backgroundColor: \"rgba(20, 83, 45, 0.3)\" } // green-950/30\n default:\n return { backgroundColor: \"rgba(17, 24, 39, 0.3)\" } // gray-900/30\n }\n } else {\n // Light mode colors\n switch (type) {\n case \"INTERACTION\":\n case \"CONSOLE DEBUG\":\n case \"DOM\":\n return { backgroundColor: \"rgba(250, 245, 255, 0.5)\" } // purple-50/50\n case \"CONSOLE ERROR\":\n case \"ERROR\":\n case \"CRITICAL ERROR\":\n return { backgroundColor: \"rgba(254, 242, 242, 0.5)\" } // red-50/50\n case \"CONSOLE WARN\":\n case \"CDP\":\n case \"NETWORK\":\n return { backgroundColor: \"rgba(254, 252, 232, 0.5)\" } // yellow-50/50\n case \"CONSOLE INFO\":\n case \"SCREENSHOT\":\n return { backgroundColor: \"rgba(239, 246, 255, 0.5)\" } // blue-50/50\n case \"PAGE\":\n return { backgroundColor: \"rgba(240, 253, 244, 0.5)\" } // green-50/50\n default:\n return { backgroundColor: \"transparent\" }\n }\n }\n }\n\n // Determine the border class based on log type\n const getBorderClass = () => {\n const type = logTypeInfo.type\n switch (type) {\n case \"INTERACTION\":\n case \"CONSOLE DEBUG\":\n case \"DOM\":\n return \"border-purple-200 dark:border-purple-800\"\n case \"CONSOLE ERROR\":\n case \"ERROR\":\n case \"CRITICAL ERROR\":\n return \"border-red-200 dark:border-red-800\"\n case \"CONSOLE WARN\":\n case \"CDP\":\n case \"NETWORK\":\n return \"border-yellow-200 dark:border-yellow-800\"\n case \"CONSOLE INFO\":\n case \"SCREENSHOT\":\n return \"border-blue-200 dark:border-blue-800\"\n case \"PAGE\":\n return \"border-green-200 dark:border-green-800\"\n default:\n return \"border-gray-200 dark:border-gray-700\"\n }\n }\n\n return (\n <div className={`border-l-4 ${getBorderClass()} pl-4 py-2`} style={getBackgroundStyle()}>\n {/* Table-like layout using CSS Grid */}\n <div className=\"grid grid-cols-[auto_auto_1fr] gap-3 items-start\">\n {/* Column 1: Timestamp */}\n <div className=\"text-xs text-muted-foreground font-mono whitespace-nowrap pt-1\">\n {new Date(entry.timestamp).toLocaleTimeString()}\n </div>\n\n {/* Column 2: Source */}\n <div\n className=\"px-2 py-1 rounded text-xs font-medium whitespace-nowrap\"\n style={{\n backgroundColor: entry.source === \"SERVER\" ? LOG_COLORS.SERVER : LOG_COLORS.BROWSER,\n color: \"#000\"\n }}\n >\n {entry.source}\n </div>\n\n {/* Column 3: Message content with user agent info */}\n <div className=\"font-mono text-sm min-w-0 text-foreground\">\n <div className=\"flex flex-wrap items-start gap-2\">\n <div className=\"flex-1 min-w-0\">{renderMessage(entry.message)}</div>\n {/* User Agent and Tab Identifier Pills */}\n <div className=\"flex items-center gap-1 flex-shrink-0\">\n {entry.tabIdentifier && (\n <span className=\"inline-flex items-center px-1.5 py-0.5 rounded text-xs font-medium bg-muted text-muted-foreground\">\n {entry.tabIdentifier}\n </span>\n )}\n {entry.userAgent && (\n <span className=\"inline-flex items-center px-1.5 py-0.5 rounded text-xs font-medium bg-green-100 dark:bg-green-800 text-green-700 dark:text-green-200\">\n {entry.userAgent.includes(\"Chrome\")\n ? \"Chrome\"\n : entry.userAgent.includes(\"Firefox\")\n ? \"Firefox\"\n : entry.userAgent.includes(\"Safari\")\n ? \"Safari\"\n : entry.userAgent.includes(\"Edge\")\n ? \"Edge\"\n : \"Browser\"}\n </span>\n )}\n {/* Browser Type Pill (Chrome Extension vs Playwright) - only show if browser source */}\n {entry.source === \"BROWSER\" &&\n (() => {\n const isPlaywright = entry.message.includes(\"[PLAYWRIGHT]\")\n const isChromeExtension = entry.message.includes(\"[CHROME_EXTENSION]\") || entry.tabIdentifier // Tab identifier indicates Chrome Extension\n\n if (isPlaywright) {\n return (\n <span className=\"inline-flex items-center px-1.5 py-0.5 rounded text-xs font-medium bg-purple-100 dark:bg-purple-800 text-purple-700 dark:text-purple-200\">\n 🎭 Playwright\n </span>\n )\n } else if (isChromeExtension) {\n return (\n <span className=\"inline-flex items-center px-1.5 py-0.5 rounded text-xs font-medium bg-blue-100 dark:bg-blue-800 text-blue-700 dark:text-blue-200\">\n 🧩 Extension\n </span>\n )\n }\n return null\n })()}\n {/* Server Framework Pill - only show if server source */}\n {entry.source === \"SERVER\" &&\n (() => {\n const message = entry.message.toLowerCase()\n\n // Next.js - look for Next.js specific patterns\n if (\n message.includes(\"ready on http://localhost\") ||\n message.includes(\"ready in \") ||\n message.includes(\"next.js\") ||\n message.includes(\"compiled client and server\")\n ) {\n return (\n <span className=\"inline-flex items-center px-1.5 py-0.5 rounded text-xs font-medium bg-black text-white\">\n ▲ Next.js\n </span>\n )\n }\n\n // Nuxt.js - look for Nuxt specific patterns\n else if (\n message.includes(\"nuxt\") ||\n (message.includes(\"nitro\") && message.includes(\"http://localhost\")) ||\n message.includes(\"universal mode\") ||\n message.includes(\"spa mode\")\n ) {\n return (\n <span className=\"inline-flex items-center px-1.5 py-0.5 rounded text-xs font-medium bg-green-500 text-white\">\n 💚 Nuxt\n </span>\n )\n }\n\n // Vue CLI/Vite + Vue - look for Vue specific patterns\n else if (\n message.includes(\"vue-cli-service\") ||\n (message.includes(\"vue\") && (message.includes(\"dev server\") || message.includes(\"local:\"))) ||\n message.includes(\"@vue/cli-service\")\n ) {\n return (\n <span className=\"inline-flex items-center px-1.5 py-0.5 rounded text-xs font-medium bg-green-600 text-white\">\n 🟢 Vue\n </span>\n )\n }\n\n // Vite (generic) - look for Vite patterns\n else if (\n (message.includes(\"local:\") && message.includes(\"vite\")) ||\n message.includes(\"dev server running\") ||\n message.includes(\"vite v\")\n ) {\n return (\n <span className=\"inline-flex items-center px-1.5 py-0.5 rounded text-xs font-medium bg-blue-500 text-white\">\n ⚡ Vite\n </span>\n )\n }\n\n // Ruby on Rails - look for Rails patterns\n else if (\n message.includes(\"rails server\") ||\n message.includes(\"puma starting\") ||\n message.includes(\"use ctrl-c to stop\") ||\n (message.includes(\"listening on tcp://\") && message.includes(\"3000\"))\n ) {\n return (\n <span className=\"inline-flex items-center px-1.5 py-0.5 rounded text-xs font-medium bg-red-600 text-white\">\n 💎 Rails\n </span>\n )\n }\n\n // Laravel - look for Laravel/Artisan patterns\n else if (\n message.includes(\"laravel development server\") ||\n message.includes(\"artisan serve\") ||\n (message.includes(\"laravel\") && message.includes(\"127.0.0.1:8000\"))\n ) {\n return (\n <span className=\"inline-flex items-center px-1.5 py-0.5 rounded text-xs font-medium bg-red-500 text-white\">\n 🅻 Laravel\n </span>\n )\n }\n\n // Express.js/Node.js - look for Express patterns\n else if (\n message.includes(\"express server\") ||\n message.includes(\"server listening on\") ||\n message.includes(\"app listening on port\") ||\n message.includes(\"node server\")\n ) {\n return (\n <span className=\"inline-flex items-center px-1.5 py-0.5 rounded text-xs font-medium bg-green-700 text-white\">\n 🟩 Express\n </span>\n )\n }\n\n // Django - look for Django patterns\n else if (\n message.includes(\"django\") ||\n (message.includes(\"development server\") && message.includes(\"127.0.0.1:8000\")) ||\n message.includes(\"runserver\")\n ) {\n return (\n <span className=\"inline-flex items-center px-1.5 py-0.5 rounded text-xs font-medium bg-green-800 text-white\">\n 🐍 Django\n </span>\n )\n }\n\n // Flask - look for Flask patterns\n else if (\n message.includes(\"flask\") ||\n message.includes(\"running on http://127.0.0.1:5000\") ||\n message.includes(\"debug mode: on\")\n ) {\n return (\n <span className=\"inline-flex items-center px-1.5 py-0.5 rounded text-xs font-medium bg-blue-800 text-white\">\n 🌶️ Flask\n </span>\n )\n }\n\n // Svelte/SvelteKit - look for Svelte patterns\n else if (\n message.includes(\"sveltekit\") ||\n (message.includes(\"svelte\") && message.includes(\"dev\")) ||\n message.includes(\"@sveltejs\")\n ) {\n return (\n <span className=\"inline-flex items-center px-1.5 py-0.5 rounded text-xs font-medium bg-orange-500 text-white\">\n 🔥 Svelte\n </span>\n )\n }\n\n // Remix - look for Remix patterns\n else if (message.includes(\"remix\") || message.includes(\"@remix-run\")) {\n return (\n <span className=\"inline-flex items-center px-1.5 py-0.5 rounded text-xs font-medium bg-blue-400 text-white\">\n 💿 Remix\n </span>\n )\n }\n\n // Astro - look for Astro patterns\n else if (message.includes(\"astro\") || message.includes(\"@astrojs\")) {\n return (\n <span className=\"inline-flex items-center px-1.5 py-0.5 rounded text-xs font-medium bg-purple-600 text-white\">\n 🚀 Astro\n </span>\n )\n }\n\n // Spring Boot - look for Spring patterns\n else if (\n message.includes(\"spring boot\") ||\n message.includes(\"tomcat started on port\") ||\n (message.includes(\"started application\") && message.includes(\"seconds\"))\n ) {\n return (\n <span className=\"inline-flex items-center px-1.5 py-0.5 rounded text-xs font-medium bg-green-500 text-white\">\n 🍃 Spring\n </span>\n )\n }\n\n // Generic React (CRA, webpack-dev-server) - fallback for React patterns\n else if (\n message.includes(\"webpack compiled\") ||\n message.includes(\"compiled successfully\") ||\n message.includes(\"webpack-dev-server\")\n ) {\n return (\n <span className=\"inline-flex items-center px-1.5 py-0.5 rounded text-xs font-medium bg-blue-600 text-white\">\n ⚛️ React\n </span>\n )\n }\n\n return null\n })()}\n </div>\n </div>\n </div>\n </div>\n\n {entry.screenshot && (\n <div className=\"mt-2\">\n <Image\n src={`/api/screenshots/${entry.screenshot}`}\n alt=\"Screenshot\"\n width={0}\n height={0}\n sizes=\"100vw\"\n className=\"w-full h-auto max-w-2xl border rounded shadow-sm\"\n style={{ maxHeight: \"600px\", objectFit: \"contain\" }}\n unoptimized\n />\n </div>\n )}\n </div>\n )\n}\n\ninterface LogsClientProps {\n version: string\n initialData?: {\n logs: LogEntry[]\n logFiles: LogFile[]\n currentLogFile: string\n mode: \"head\" | \"tail\"\n }\n}\n\nexport default function LogsClient({ version, initialData }: LogsClientProps) {\n const router = useRouter()\n const searchParams = useSearchParams()\n const [darkMode, setDarkMode] = useDarkMode()\n const [logs, setLogs] = useState<LogEntry[]>(initialData?.logs || [])\n const [mode, setMode] = useState<\"head\" | \"tail\">(initialData?.mode || \"tail\")\n\n // Update mode when URL parameters change\n useEffect(() => {\n const urlMode = searchParams.get(\"mode\") as \"head\" | \"tail\" | null\n if (urlMode && urlMode !== mode) {\n setMode(urlMode)\n }\n }, [searchParams, mode])\n const [isAtBottom, setIsAtBottom] = useState(true)\n const [isInitialLoading, setIsInitialLoading] = useState(!initialData)\n const [lastLogCount, setLastLogCount] = useState(initialData?.logs.length || 0)\n const [lastFetched, setLastFetched] = useState<Date | null>(null)\n const [availableLogs, setAvailableLogs] = useState<LogFile[]>(initialData?.logFiles || [])\n const [currentLogFile, setCurrentLogFile] = useState<string>(initialData?.currentLogFile || \"\")\n const [projectName, setProjectName] = useState<string>(\"\")\n const [showLogSelector, setShowLogSelector] = useState(false)\n const [isReplaying, setIsReplaying] = useState(false)\n const [showFilters, setShowFilters] = useState(false)\n const [showReplayPreview, setShowReplayPreview] = useState(false)\n const [replayEvents, setReplayEvents] = useState<ReplayEvent[]>([])\n const [isRotatingLog, setIsRotatingLog] = useState(false)\n const [retryCount, setRetryCount] = useState(0)\n const [maxRetries] = useState(5)\n const [lastFailedUrl, setLastFailedUrl] = useState<string | null>(null)\n const [hasLoadedInitial, setHasLoadedInitial] = useState(false)\n const [filters, setFilters] = useState({\n browser: true,\n server: true,\n interaction: true,\n screenshot: true\n })\n const [userAgentFilters, setUserAgentFilters] = useState<Record<string, boolean>>({})\n const [logBuffer, setLogBuffer] = useState<LogEntry[]>([]) // Buffer logs when not in live mode\n const bottomRef = useRef<HTMLDivElement>(null)\n const containerRef = useRef<HTMLDivElement>(null)\n const pollIntervalRef = useRef<NodeJS.Timeout | null>(null)\n const dropdownRef = useRef<HTMLDivElement>(null)\n const filterDropdownRef = useRef<HTMLDivElement>(null)\n const userScrolledManually = useRef<boolean>(false) // Track if user manually scrolled away from live mode\n\n const loadAvailableLogs = useCallback(async () => {\n try {\n const response = await fetch(\"/api/logs/list\")\n if (response.ok) {\n const data: LogListResponse = await response.json()\n setAvailableLogs(data.files)\n setCurrentLogFile(data.currentFile)\n setProjectName(data.projectName)\n return true\n }\n return false\n } catch (error) {\n console.error(\"Error loading available logs:\", error)\n return false\n }\n }, [])\n\n const pollForNewLogs = useCallback(async () => {\n if (mode !== \"tail\") return\n\n try {\n // Determine which log file to poll\n const requestedFile = searchParams.get(\"file\")\n let logPath = \"\"\n let isCurrentFile = true\n\n if (requestedFile && availableLogs.length > 0) {\n // Find the specific log file requested\n const foundFile = availableLogs.find((f) => f.name === requestedFile)\n logPath = foundFile?.path || currentLogFile\n isCurrentFile = foundFile?.isCurrent !== false\n } else {\n // Use current log file\n logPath = currentLogFile\n isCurrentFile = true\n }\n\n // Only poll for new logs if viewing the current (active) log file\n if (!isCurrentFile) return\n\n // Build API URL with logPath parameter if needed\n // For polling, only fetch a small number of new lines to reduce server load\n const apiUrl = logPath\n ? `/api/logs/tail?lines=50&logPath=${encodeURIComponent(logPath)}`\n : `/api/logs/tail?lines=50`\n\n // Check if we've exceeded retry limit for this specific URL\n if (lastFailedUrl === apiUrl && retryCount >= maxRetries) {\n console.error(`Maximum retry attempts (${maxRetries}) reached for ${apiUrl}. Stopping polling.`)\n // Clear the polling interval to stop further attempts\n if (pollIntervalRef.current) {\n clearInterval(pollIntervalRef.current)\n pollIntervalRef.current = null\n }\n return\n }\n\n const response = await fetch(apiUrl)\n if (!response.ok) {\n throw new Error(`HTTP ${response.status}: ${response.statusText}`)\n }\n\n // Reset retry count on successful fetch\n if (lastFailedUrl === apiUrl || retryCount > 0) {\n setRetryCount(0)\n setLastFailedUrl(null)\n }\n\n const data: LogsApiResponse = await response.json()\n\n if (!data.logs) {\n console.warn(\"No logs data in response\")\n return\n }\n\n const entries = parseLogEntries(data.logs)\n\n if (entries.length > lastLogCount) {\n if (isAtBottom) {\n // In live mode - apply logs immediately and flush buffer\n setLastFetched(new Date()) // Only update \"Last updated\" when actually showing new logs\n\n if (logBuffer.length > 0) {\n // Merge buffer with latest entries\n setLogs([...logs, ...logBuffer, ...entries.slice(lastLogCount)])\n setLogBuffer([]) // Clear buffer\n } else {\n setLogs(entries)\n }\n setLastLogCount(entries.length)\n\n // Auto-scroll to bottom - but only if user hasn't manually scrolled away\n if (!userScrolledManually.current) {\n setTimeout(() => {\n bottomRef.current?.scrollIntoView({ behavior: \"smooth\" })\n }, 50)\n }\n } else {\n // Not in live mode - buffer the new entries (don't update \"Last updated\")\n const newEntries = entries.slice(lastLogCount)\n if (newEntries.length > 0) {\n setLogBuffer((prev) => [...prev, ...newEntries])\n setLastLogCount(entries.length)\n }\n }\n }\n } catch (error) {\n console.error(\"Error polling logs:\", error)\n\n // Build the failed URL for tracking\n const requestedFile = searchParams.get(\"file\")\n let logPath = \"\"\n if (requestedFile && availableLogs.length > 0) {\n const foundFile = availableLogs.find((f) => f.name === requestedFile)\n logPath = foundFile?.path || currentLogFile\n } else {\n logPath = currentLogFile\n }\n const failedUrl = logPath\n ? `/api/logs/tail?lines=50&logPath=${encodeURIComponent(logPath)}`\n : `/api/logs/tail?lines=50`\n\n // Increment retry count if it's the same URL, otherwise reset\n if (lastFailedUrl === failedUrl) {\n const newRetryCount = retryCount + 1\n setRetryCount(newRetryCount)\n\n if (newRetryCount >= maxRetries) {\n console.error(`Maximum retry attempts (${maxRetries}) reached for ${failedUrl}. Stopping polling.`)\n // Clear the polling interval to stop further attempts\n if (pollIntervalRef.current) {\n clearInterval(pollIntervalRef.current)\n pollIntervalRef.current = null\n }\n }\n } else {\n setLastFailedUrl(failedUrl)\n setRetryCount(1)\n }\n }\n }, [\n mode,\n isAtBottom,\n searchParams,\n availableLogs,\n currentLogFile,\n lastLogCount,\n logBuffer,\n logs,\n retryCount,\n lastFailedUrl,\n maxRetries\n ])\n\n // Start/stop polling based on mode (always poll in tail mode, but buffer when not at bottom)\n useEffect(() => {\n if (mode === \"tail\" && retryCount < maxRetries) {\n pollIntervalRef.current = setInterval(pollForNewLogs, 3000) // Poll every 3 seconds\n return () => {\n if (pollIntervalRef.current) {\n clearInterval(pollIntervalRef.current)\n }\n }\n } else {\n if (pollIntervalRef.current) {\n clearInterval(pollIntervalRef.current)\n }\n }\n }, [mode, pollForNewLogs, retryCount, maxRetries]) // Removed isAtBottom - now always poll in tail mode\n\n // Handle returning to live mode - ONLY flush buffer when user explicitly clicks \"Live\" button\n // This effect is removed to prevent race conditions - buffer flushing now happens only on explicit user action\n\n const loadInitialLogs = useCallback(async () => {\n if (retryCount >= maxRetries) {\n console.log(\"Max retries reached, not attempting to load\")\n return\n }\n\n setIsInitialLoading(true)\n\n // Load available logs list first\n const logsListLoaded = await loadAvailableLogs()\n if (!logsListLoaded) {\n setIsInitialLoading(false)\n return\n }\n\n try {\n // Determine which log file to load\n const requestedFile = searchParams.get(\"file\")\n let logPath = \"\"\n\n if (requestedFile && availableLogs.length > 0) {\n // Find the specific log file requested\n const foundFile = availableLogs.find((f) => f.name === requestedFile)\n logPath = foundFile?.path || currentLogFile\n } else {\n // Use current log file\n logPath = currentLogFile\n }\n\n // Build API URL with logPath parameter if needed\n const apiUrl = logPath\n ? `/api/logs/${mode}?lines=1000&logPath=${encodeURIComponent(logPath)}`\n : `/api/logs/${mode}?lines=1000`\n\n // Check if we've exceeded retry limit for this specific URL\n if (lastFailedUrl === apiUrl && retryCount >= maxRetries) {\n console.error(`Maximum retry attempts (${maxRetries}) reached for ${apiUrl}. Not attempting to load.`)\n setLogs([])\n setIsInitialLoading(false)\n return\n }\n\n const response = await fetch(apiUrl)\n if (!response.ok) {\n throw new Error(`HTTP ${response.status}: ${response.statusText}`)\n }\n\n // Reset retry count on successful fetch\n if (lastFailedUrl === apiUrl || retryCount > 0) {\n setRetryCount(0)\n setLastFailedUrl(null)\n }\n\n const data: LogsApiResponse = await response.json()\n\n if (!data.logs) {\n console.warn(\"No logs data in response\")\n setLogs([])\n setIsInitialLoading(false)\n return\n }\n\n const entries = parseLogEntries(data.logs)\n\n setLogs(entries)\n setLastLogCount(entries.length)\n setLastFetched(new Date())\n setIsInitialLoading(false)\n\n // Auto-scroll to bottom for tail mode - only if user hasn't manually scrolled away\n if (mode === \"tail\" && !userScrolledManually.current) {\n setIsAtBottom(true)\n const scrollToBottom = () => {\n if (bottomRef.current) {\n bottomRef.current.scrollIntoView({ behavior: \"auto\" })\n } else if (containerRef.current) {\n containerRef.current.scrollTop = containerRef.current.scrollHeight\n }\n }\n // Try multiple times to ensure it works\n setTimeout(scrollToBottom, 0)\n setTimeout(scrollToBottom, 100)\n }\n } catch (error) {\n console.error(\"Error loading logs:\", error)\n\n // Build the failed URL for tracking\n const requestedFile = searchParams.get(\"file\")\n let logPath = \"\"\n if (requestedFile && availableLogs.length > 0) {\n const foundFile = availableLogs.find((f) => f.name === requestedFile)\n logPath = foundFile?.path || currentLogFile\n } else {\n logPath = currentLogFile\n }\n const failedUrl = logPath\n ? `/api/logs/${mode}?lines=1000&logPath=${encodeURIComponent(logPath)}`\n : `/api/logs/${mode}?lines=1000`\n\n // Track retry attempts\n if (lastFailedUrl === failedUrl) {\n const newRetryCount = retryCount + 1\n setRetryCount(newRetryCount)\n\n if (newRetryCount >= maxRetries) {\n console.error(`Maximum retry attempts (${maxRetries}) reached for initial load of ${failedUrl}.`)\n }\n } else {\n setLastFailedUrl(failedUrl)\n setRetryCount(1)\n }\n\n setLogs([])\n } finally {\n setIsInitialLoading(false)\n }\n }, [loadAvailableLogs, searchParams, availableLogs, currentLogFile, mode, retryCount, lastFailedUrl, maxRetries])\n\n useEffect(() => {\n // Only load logs if we don't have initial data and haven't tried loading yet\n const hasInitialData = initialData?.logs && initialData?.logs.length > 0\n\n if (!hasLoadedInitial && !hasInitialData && !logs.length) {\n // No server-side data and no client data - load fresh\n setHasLoadedInitial(true)\n loadInitialLogs()\n } else if (hasInitialData && logs.length === 0) {\n // We have server-side data but client state is empty - use server data\n setLogs(initialData.logs)\n setIsInitialLoading(false)\n if (mode === \"tail\" && !userScrolledManually.current) {\n // Scroll to bottom for tail mode with server data - only if user hasn't manually scrolled away\n setIsAtBottom(true)\n const scrollToBottom = () => {\n if (bottomRef.current) {\n bottomRef.current.scrollIntoView({ behavior: \"auto\" })\n } else if (containerRef.current) {\n containerRef.current.scrollTop = containerRef.current.scrollHeight\n }\n }\n // Try multiple times to ensure it works\n setTimeout(scrollToBottom, 0)\n setTimeout(scrollToBottom, 100)\n setTimeout(scrollToBottom, 300)\n }\n }\n }, [mode, initialData, logs.length, hasLoadedInitial, loadInitialLogs]) // eslint-disable-line react-hooks/exhaustive-deps\n // CRITICAL: loadInitialLogs must NEVER be added to dependencies - it will cause infinite loops\n // The linter will complain but this is intentional. DO NOT \"FIX\" THIS.\n\n // Separate effect to handle scrolling after logs are rendered\n useEffect(() => {\n if (logs.length > 0 && mode === \"tail\" && isAtBottom && !userScrolledManually.current) {\n const scrollToBottom = () => {\n if (bottomRef.current) {\n bottomRef.current.scrollIntoView({ behavior: \"auto\" })\n } else if (containerRef.current) {\n containerRef.current.scrollTop = containerRef.current.scrollHeight\n }\n }\n // Scroll after DOM updates\n setTimeout(scrollToBottom, 0)\n }\n }, [logs.length, mode, isAtBottom]) // Trigger when logs are actually rendered\n\n useEffect(() => {\n return () => {\n if (pollIntervalRef.current) {\n clearInterval(pollIntervalRef.current)\n }\n }\n }, [])\n\n // Close dropdowns when clicking outside\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (dropdownRef.current && !dropdownRef.current.contains(event.target as Node)) {\n setShowLogSelector(false)\n }\n if (filterDropdownRef.current && !filterDropdownRef.current.contains(event.target as Node)) {\n setShowFilters(false)\n }\n }\n\n if (showLogSelector || showFilters) {\n document.addEventListener(\"mousedown\", handleClickOutside)\n return () => document.removeEventListener(\"mousedown\", handleClickOutside)\n }\n }, [showLogSelector, showFilters])\n\n const handleScroll = () => {\n if (containerRef.current) {\n const { scrollTop, scrollHeight, clientHeight } = containerRef.current\n const atBottom = scrollTop + clientHeight >= scrollHeight - 10\n\n // If user scrolled up from the bottom, mark as manual scroll\n if (isAtBottom && !atBottom) {\n userScrolledManually.current = true\n }\n\n // If user scrolled back to bottom, clear manual scroll flag only via explicit action\n // (not automatically - they need to click the \"Live\" button)\n\n setIsAtBottom(atBottom)\n }\n }\n\n const handleReplay = async () => {\n if (isReplaying) return\n\n setIsReplaying(true)\n\n try {\n // Get replay data from logs\n const response = await fetch(\"/api/replay?action=parse\")\n if (!response.ok) {\n throw new Error(\"Failed to parse replay data\")\n }\n\n const replayData = await response.json()\n\n if (replayData.interactions.length === 0) {\n alert(\"No user interactions found in logs to replay\")\n return\n }\n\n // Generate CDP commands for replay\n const response2 = await fetch(\"/api/replay\", {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n action: \"execute\",\n replayData: replayData,\n speed: 2\n })\n })\n\n const result = await response2.json()\n\n if (result.success) {\n console.log(\"Replay executed successfully:\", result)\n alert(`Replay completed! Executed ${result.totalCommands} commands.`)\n } else {\n console.log(\"CDP execution failed, showing commands:\", result)\n alert(\n `CDP execution not available. Generated ${result.commands?.length || 0} commands. Check console for details.`\n )\n }\n } catch (error) {\n console.error(\"Replay error:\", error)\n alert(`Failed to start replay: ${error instanceof Error ? error.message : \"Unknown error\"}`)\n } finally {\n setIsReplaying(false)\n }\n }\n\n const loadReplayPreview = () => {\n // Extract interactions from current logs instead of making API call\n const interactions = logs\n .filter((log) => log.message.includes(\"[INTERACTION]\"))\n .map((log) => {\n const match = log.message.match(/\\[INTERACTION\\] (.+)/)\n if (match) {\n try {\n // Try parsing as JSON (new format)\n const data = JSON.parse(match[1])\n return {\n timestamp: log.timestamp,\n event: data.type || \"unknown\",\n details: JSON.stringify(data),\n type: data.type,\n x: data.x,\n y: data.y,\n target: data.target,\n direction: data.direction,\n distance: data.distance,\n key: data.key\n } as ReplayEvent\n } catch {\n // Fallback to old format parsing\n const oldMatch = match[1].match(/(CLICK|TAP|SCROLL|KEY) (.+)/)\n if (oldMatch) {\n return {\n timestamp: log.timestamp,\n event: oldMatch[1],\n details: oldMatch[2],\n type: oldMatch[1]\n } as ReplayEvent\n }\n }\n }\n return null\n })\n .filter((item): item is ReplayEvent => item !== null)\n\n setReplayEvents(interactions)\n }\n\n const handleRotateLog = async () => {\n if (!currentLogFile || isRotatingLog) return\n\n const confirmed = window.confirm(\n \"Clear logs and start fresh?\\n\\n\" +\n \"This will:\\n\" +\n \"• Archive the current log file\\n\" +\n \"• Start a new empty log file\\n\" +\n \"• Clear the current view\\n\\n\" +\n \"The archived logs will still be available in the dropdown.\"\n )\n\n if (!confirmed) return\n\n setIsRotatingLog(true)\n try {\n const response = await fetch(\"/api/logs/rotate\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\"\n },\n body: JSON.stringify({ currentLogPath: currentLogFile })\n })\n\n if (response.ok) {\n // Clear current logs from UI\n setLogs([])\n setLastLogCount(0)\n setLastFetched(null)\n\n // Reload available logs to show the new archived file\n await loadAvailableLogs()\n\n // Start fresh polling\n await loadInitialLogs()\n } else {\n const error = await response.json()\n console.error(\"Failed to rotate log:\", error)\n alert(`Failed to rotate log: ${error.error}`)\n }\n } catch (error) {\n console.error(\"Error rotating log:\", error)\n alert(\"Error rotating log\")\n } finally {\n setIsRotatingLog(false)\n }\n }\n\n // Compute available user agents from browser logs\n const availableUserAgents = useMemo(() => {\n const userAgents = new Set<string>()\n logs.forEach((entry) => {\n if (entry.source === \"BROWSER\" && entry.userAgent) {\n userAgents.add(entry.userAgent)\n }\n })\n return Array.from(userAgents).sort()\n }, [logs])\n\n // Update user agent filters when available user agents change\n useEffect(() => {\n if (availableUserAgents.length > 0) {\n setUserAgentFilters((prev) => {\n const newFilters = { ...prev }\n // Enable all user agents by default if not already set\n availableUserAgents.forEach((ua) => {\n if (!(ua in newFilters)) {\n newFilters[ua] = true\n }\n })\n return newFilters\n })\n }\n }, [availableUserAgents])\n\n const filteredLogs = useMemo(() => {\n return logs.filter((entry) => {\n // Check specific message types first (these override source filtering)\n const isInteraction = entry.message.includes(\"[INTERACTION]\")\n const isScreenshot = entry.message.includes(\"[SCREENSHOT]\")\n\n if (isInteraction) return filters.interaction\n if (isScreenshot) return filters.screenshot\n\n // For other logs, filter by source\n if (entry.source === \"SERVER\") return filters.server\n if (entry.source === \"BROWSER\") {\n // First check if browser logs are enabled at all\n if (!filters.browser) return false\n\n // If there are user agent filters and this entry has a user agent, apply UA filtering\n if (availableUserAgents.length > 0 && entry.userAgent) {\n return userAgentFilters[entry.userAgent] !== false\n }\n\n // Otherwise, just show if browser is enabled\n return true\n }\n\n return true\n })\n }, [logs, filters, userAgentFilters, availableUserAgents])\n\n return (\n <div className=\"h-screen bg-background text-foreground flex flex-col transition-colors\">\n {/* Header - Fixed */}\n <div className=\"bg-card shadow-sm border-b border-border flex-none z-10\">\n <div className=\"max-w-7xl mx-auto px-4 py-3\">\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-2 sm:gap-4\">\n <div className=\"flex items-center gap-1\">\n <h1 className=\"text-xl sm:text-2xl font-bold whitespace-nowrap\">dev3000</h1>\n <span className=\"text-xs text-muted-foreground whitespace-nowrap\">(v{version})</span>\n </div>\n {/* Log File Selector */}\n {availableLogs.length > 1 ? (\n <div className=\"relative\" ref={dropdownRef}>\n <button\n type=\"button\"\n onClick={() => setShowLogSelector(!showLogSelector)}\n className=\"flex items-center gap-2 px-3 py-1 text-sm text-muted-foreground hover:text-foreground hover:bg-accent rounded-md transition-colors\"\n >\n <span className=\"font-mono text-xs whitespace-nowrap\">\n {isInitialLoading && !currentLogFile ? (\n <div className=\"h-4 bg-muted rounded animate-pulse\" style={{ width: \"220px\" }} />\n ) : currentLogFile ? (\n \"Current\"\n ) : (\n \"No log file\"\n )}\n </span>\n <svg\n className={`w-4 h-4 transition-transform ${showLogSelector ? \"rotate-180\" : \"\"}`}\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M19 9l-7 7-7-7\" />\n </svg>\n </button>\n {/* Dropdown */}\n {showLogSelector && availableLogs.length > 1 && (\n <div className=\"absolute top-full left-0 mt-1 bg-card border border-border rounded-md shadow-lg z-20 min-w-80\">\n <div className=\"py-1 max-h-60 overflow-y-auto\">\n <div className=\"px-3 py-2 text-xs font-medium text-muted-foreground border-b border-border\">\n {projectName} logs ({availableLogs.length})\n </div>\n {availableLogs.map((logFile) => (\n <button\n type=\"button\"\n key={logFile.path}\n onClick={() => {\n setShowLogSelector(false)\n router.push(`/logs?file=${encodeURIComponent(logFile.name)}&mode=${mode}`)\n }}\n className={`w-full text-left px-3 py-2 text-sm hover:bg-accent flex items-center justify-between ${\n logFile.isCurrent ? \"bg-primary/10 text-primary\" : \"text-foreground\"\n }`}\n >\n <div className=\"flex flex-col\">\n <span className=\"font-mono text-xs\">{logFile.name}</span>\n <span className=\"text-xs text-muted-foreground\">\n {new Date(logFile.mtime).toLocaleString()} • {Math.round(logFile.size / 1024)}KB\n </span>\n </div>\n {logFile.isCurrent && <span className=\"text-xs text-blue-600 font-medium\">current</span>}\n </button>\n ))}\n </div>\n </div>\n )}\n </div>\n ) : (\n <div className=\"flex items-center gap-2\">\n <span className=\"font-mono text-xs text-gray-600 px-3 py-1 whitespace-nowrap\">\n {isInitialLoading && !currentLogFile ? (\n <div className=\"h-4 bg-gray-200 rounded animate-pulse\" style={{ width: \"220px\" }} />\n ) : currentLogFile ? (\n // Show basename for all files\n currentLogFile\n .split(\"/\")\n .pop()\n ) : (\n \"No log file\"\n )}\n </span>\n </div>\n )}\n\n {/* Entries count with clear button */}\n {logs.length > 0 && (\n <div className=\"flex items-center gap-1 hidden sm:flex\">\n <span className=\"text-sm text-muted-foreground\">{logs.length} entries</span>\n {currentLogFile && !isInitialLoading && (\n <button\n type=\"button\"\n onClick={handleRotateLog}\n disabled={isRotatingLog}\n className=\"p-0.5 text-muted-foreground hover:text-foreground hover:bg-accent rounded transition-colors disabled:opacity-50 disabled:cursor-not-allowed\"\n title=\"Clear logs (rotate current log to archive and start fresh)\"\n >\n {isRotatingLog ? (\n <div className=\"w-3 h-3 border border-current border-t-transparent rounded-full animate-spin\" />\n ) : (\n <svg className=\"w-3 h-3\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M6 18L18 6M6 6l12 12\" />\n </svg>\n )}\n </button>\n )}\n </div>\n )}\n\n {/* Buffered logs indicator */}\n {logBuffer.length > 0 && !isAtBottom && (\n <span className=\"text-xs bg-blue-100 dark:bg-blue-900 text-blue-800 dark:text-blue-200 px-2 py-1 rounded-full\">\n +{logBuffer.length} buffered\n </span>\n )}\n </div>\n\n {/* Mode Toggle */}\n <div className=\"flex items-center gap-2\">\n {/* Replay Button - Hidden until functionality is complete */}\n {false && (\n <div className=\"relative\">\n <button\n type=\"button\"\n onClick={handleReplay}\n disabled={isReplaying}\n onMouseEnter={() => {\n if (!isReplaying) {\n loadReplayPreview()\n setShowReplayPreview(true)\n }\n }}\n onMouseLeave={() => setShowReplayPreview(false)}\n className={`flex items-center gap-1 px-3 py-1 rounded text-sm font-medium transition-colors whitespace-nowrap ${\n isReplaying\n ? \"bg-gray-100 text-gray-400 cursor-not-allowed\"\n : \"bg-purple-100 text-purple-800 hover:bg-purple-200\"\n }`}\n >\n {isReplaying ? (\n <>\n <div className=\"w-3 h-3 border border-purple-300 border-t-purple-600 rounded-full animate-spin\"></div>\n Replaying...\n </>\n ) : (\n <>\n <svg className=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M14.828 14.828a4 4 0 01-5.656 0M9 10h1m4 0h1m-6 4h1m4 0h1m6-10V4a1 1 0 00-1-1h-4a1 1 0 00-1 1v3M7 7V4a1 1 0 011-1h4a1 1 0 011 1v3m-9 4h16m-5 4v1a1 1 0 01-1 1H8a1 1 0 01-1-1v-1m8 0V9a1 1 0 00-1-1H8a1 1 0 00-1 1v8.001\"\n />\n </svg>\n Replay\n </>\n )}\n </button>\n {/* Replay Preview Dropdown */}\n {showReplayPreview && !isReplaying && (\n <div className=\"absolute top-full left-0 mt-1 bg-white border border-gray-200 rounded-md shadow-lg z-30 w-80\">\n <div className=\"py-2\">\n <div className=\"px-3 py-2 text-xs font-medium text-gray-500 border-b\">\n Replay Events ({replayEvents.length})\n </div>\n <div className=\"max-h-60 overflow-y-auto\">\n {replayEvents.length === 0 ? (\n <div className=\"px-3 py-4 text-sm text-gray-500 text-center\">No interactions to replay</div>\n ) : (\n replayEvents.map((event, index) => (\n <div\n key={`${event.timestamp}-${index}`}\n className=\"px-3 py-2 text-sm hover:bg-gray-50 border-b border-gray-100 last:border-b-0\"\n >\n <div className=\"flex items-center gap-2\">\n <span\n className={`px-1.5 py-0.5 rounded text-xs font-medium ${\n event.type === \"CLICK\"\n ? \"bg-blue-100 text-blue-800\"\n : event.type === \"SCROLL\"\n ? \"bg-green-100 text-green-800\"\n : \"bg-muted text-muted-foreground\"\n }`}\n >\n {event.type}\n </span>\n <span className=\"text-xs text-gray-500 font-mono\">\n {new Date(event.timestamp).toLocaleTimeString()}\n </span>\n </div>\n <div className=\"mt-1 text-xs text-gray-600 font-mono truncate\">\n {event.type === \"CLICK\" && `(${event.x}, ${event.y}) on ${event.target}`}\n {event.type === \"SCROLL\" &&\n `${event.direction} ${event.distance}px to (${event.x}, ${event.y})`}\n {event.type === \"KEY\" && `${event.key} in ${event.target}`}\n </div>\n </div>\n ))\n )}\n </div>\n </div>\n </div>\n )}\n </div>\n )}\n {/* Filter Button */}\n <div className=\"relative\" ref={filterDropdownRef}>\n <button\n type=\"button\"\n onClick={() => setShowFilters(!showFilters)}\n className=\"flex items-center gap-1 px-3 py-1 rounded text-sm font-medium transition-colors whitespace-nowrap bg-muted text-muted-foreground hover:bg-muted/80\"\n >\n <svg className=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M3 4a1 1 0 011-1h16a1 1 0 011 1v2.586a1 1 0 01-.293.707l-6.414 6.414a1 1 0 00-.293.707V17l-4 4v-6.586a1 1 0 00-.293-.707L3.293 7.293A1 1 0 013 6.586V4z\"\n />\n </svg>\n Filter\n </button>\n {/* Filter Dropdown */}\n {showFilters && (\n <div className=\"absolute top-full right-0 mt-1 bg-card border border-border rounded-md shadow-lg z-20 min-w-48\">\n <div className=\"py-2\">\n <div className=\"px-3 py-2 text-xs font-medium text-muted-foreground border-b border-border\">\n Log Types\n </div>\n\n {/* Server Logs */}\n <label className=\"flex items-center justify-between px-3 py-2 text-sm hover:bg-accent cursor-pointer\">\n <div className=\"flex items-center gap-2\">\n <input\n type=\"checkbox\"\n checked={filters.server}\n onChange={(e) =>\n setFilters((prev) => ({\n ...prev,\n server: e.target.checked\n }))\n }\n className=\"rounded border-input text-primary focus:ring-ring\"\n />\n <span className=\"text-foreground\">Server</span>\n </div>\n <span className=\"text-xs text-muted-foreground\">\n {logs.filter((l) => l.source === \"SERVER\").length}\n </span>\n </label>\n\n {/* Browser Logs */}\n <label className=\"flex items-center justify-between px-3 py-2 text-sm hover:bg-accent cursor-pointer\">\n <div className=\"flex items-center gap-2\">\n <input\n type=\"checkbox\"\n checked={filters.browser}\n onChange={(e) =>\n setFilters((prev) => ({\n ...prev,\n browser: e.target.checked\n }))\n }\n className=\"rounded border-input text-primary focus:ring-ring\"\n />\n <span className=\"text-foreground\">Browser</span>\n </div>\n <span className=\"text-xs text-muted-foreground\">\n {logs.filter((l) => l.source === \"BROWSER\").length}\n </span>\n </label>\n\n {/* User Agent Sub-filters */}\n {availableUserAgents.length > 1 && filters.browser && (\n <div className=\"ml-6 border-l border-border pl-2\">\n {availableUserAgents.map((ua) => {\n const shortUA = ua.includes(\"Chrome\")\n ? \"Chrome\"\n : ua.includes(\"Firefox\")\n ? \"Firefox\"\n : ua.includes(\"Safari\")\n ? \"Safari\"\n : ua.includes(\"Edge\")\n ? \"Edge\"\n : \"Browser\"\n return (\n <label\n key={ua}\n className=\"flex items-center justify-between px-2 py-1 text-xs hover:bg-accent cursor-pointer\"\n >\n <div className=\"flex items-center gap-2\">\n <input\n type=\"checkbox\"\n checked={userAgentFilters[ua] !== false}\n onChange={(e) =>\n setUserAgentFilters((prev) => ({\n ...prev,\n [ua]: e.target.checked\n }))\n }\n className=\"rounded border-input text-primary focus:ring-ring w-3 h-3\"\n />\n <span className=\"text-foreground\">{shortUA}</span>\n </div>\n <span className=\"text-xs text-muted-foreground\">\n {logs.filter((l) => l.source === \"BROWSER\" && l.userAgent === ua).length}\n </span>\n </label>\n )\n })}\n </div>\n )}\n\n {/* Interaction Logs */}\n <label className=\"flex items-center justify-between px-3 py-2 text-sm hover:bg-accent cursor-pointer\">\n <div className=\"flex items-center gap-2\">\n <input\n type=\"checkbox\"\n checked={filters.interaction}\n onChange={(e) =>\n setFilters((prev) => ({\n ...prev,\n interaction: e.target.checked\n }))\n }\n className=\"rounded border-input text-primary focus:ring-ring\"\n />\n <span className=\"text-foreground\">Interaction</span>\n </div>\n <span className=\"text-xs text-muted-foreground\">\n {logs.filter((l) => l.message.includes(\"[INTERACTION]\")).length}\n </span>\n </label>\n\n {/* Screenshot Logs */}\n <label className=\"flex items-center justify-between px-3 py-2 text-sm hover:bg-accent cursor-pointer\">\n <div className=\"flex items-center gap-2\">\n <input\n type=\"checkbox\"\n checked={filters.screenshot}\n onChange={(e) =>\n setFilters((prev) => ({\n ...prev,\n screenshot: e.target.checked\n }))\n }\n className=\"rounded border-input text-primary focus:ring-ring\"\n />\n <span className=\"text-foreground\">Screenshot</span>\n </div>\n <span className=\"text-xs text-muted-foreground\">\n {logs.filter((l) => l.message.includes(\"[SCREENSHOT]\")).length}\n </span>\n </label>\n </div>\n </div>\n )}\n </div>\n {/* Head/Tail toggle - commented out for now as it's too noisy */}\n {/* <div className=\"flex items-center bg-muted rounded-md p-1\">\n <button\n type=\"button\"\n onClick={() => {\n const currentFile = searchParams.get(\"file\")\n if (currentFile) {\n router.push(`/logs?file=${encodeURIComponent(currentFile)}&mode=head`)\n } else {\n router.push(\"/logs?mode=head\")\n }\n }}\n className={`px-2 sm:px-3 py-1 rounded text-xs sm:text-sm font-medium transition-colors whitespace-nowrap ${\n mode === \"head\"\n ? \"bg-background text-foreground shadow-sm\"\n : \"text-muted-foreground hover:text-foreground\"\n }`}\n >\n Head\n </button>\n <button\n type=\"button\"\n onClick={() => {\n const currentFile = searchParams.get(\"file\")\n if (currentFile) {\n router.push(`/logs?file=${encodeURIComponent(currentFile)}&mode=tail`)\n } else {\n router.push(\"/logs?mode=tail\")\n }\n }}\n className={`px-2 sm:px-3 py-1 rounded text-xs sm:text-sm font-medium transition-colors whitespace-nowrap ${\n mode === \"tail\"\n ? \"bg-background text-foreground shadow-sm\"\n : \"text-muted-foreground hover:text-foreground\"\n }`}\n >\n Tail\n </button>\n </div> */}\n {/* Dark Mode Toggle - moved to last item */}\n <DarkModeToggle darkMode={darkMode} setDarkMode={setDarkMode} className=\"ml-2\" />\n </div>\n </div>\n </div>\n </div>\n\n {/* Content Area - Fills remaining space */}\n <div className=\"flex-1 overflow-hidden\">\n <div ref={containerRef} className=\"max-w-7xl mx-auto px-4 py-6 h-full overflow-y-auto\" onScroll={handleScroll}>\n {isInitialLoading ? (\n <div className=\"text-center py-12\">\n <div className=\"inline-block animate-spin rounded-full h-8 w-8 border-b-2 border-primary\"></div>\n <div className=\"text-muted-foreground text-sm mt-4\">Loading logs...</div>\n </div>\n ) : logs.length === 0 ? (\n <div className=\"text-center py-12\">\n <div className=\"text-muted-foreground text-lg\">📝 No logs yet</div>\n <div className=\"text-muted-foreground text-sm mt-2\">\n {retryCount >= maxRetries ? (\n <>\n <p className=\"text-red-500 mb-2\">Failed to load logs after {maxRetries} attempts.</p>\n <button\n type=\"button\"\n onClick={() => {\n setRetryCount(0)\n setLastFailedUrl(null)\n setHasLoadedInitial(false)\n loadInitialLogs()\n }}\n className=\"px-4 py-2 bg-blue-600 text-white rounded hover:bg-blue-700 transition-colors\"\n >\n Retry\n </button>\n </>\n ) : (\n \"Logs will appear here as your development server runs\"\n )}\n </div>\n </div>\n ) : filteredLogs.length === 0 ? (\n <div className=\"text-center py-12\">\n <div className=\"text-muted-foreground text-lg\">🔍 No logs match current filters</div>\n <div className=\"text-muted-foreground text-sm mt-2\">\n Try adjusting your filter settings to see more logs\n </div>\n </div>\n ) : (\n <div className=\"space-y-1 pb-4\">\n {filteredLogs.map((entry, index) => (\n <LogEntryComponent key={`${entry.timestamp}-${index}`} entry={entry} darkMode={darkMode} />\n ))}\n <div ref={bottomRef} />\n </div>\n )}\n </div>\n </div>\n\n {/* Footer - Fixed */}\n <div className=\"border-t border-border bg-muted/50 flex-none\">\n <div className=\"max-w-7xl mx-auto px-4 py-3 flex items-center justify-between\">\n <div className=\"flex items-center gap-3\">\n {lastFetched && (\n <span className=\"text-xs text-muted-foreground font-mono\">\n Last updated {lastFetched.toLocaleTimeString()}\n </span>\n )}\n {currentLogFile && (\n <span className=\"text-xs text-muted-foreground font-mono break-all\">{currentLogFile}</span>\n )}\n </div>\n\n {/* Live indicator or scroll to bottom button - positioned on the right */}\n <div className=\"relative\">\n {/* Live indicator when at bottom */}\n <div\n className={`flex items-center gap-1 text-green-600 ${\n mode === \"tail\" && isAtBottom ? \"visible\" : \"invisible\"\n }`}\n >\n <div className=\"w-2 h-2 bg-green-500 rounded-full animate-pulse\"></div>\n <span className=\"text-xs\">Live</span>\n </div>\n\n {/* Scroll to bottom button when not at bottom */}\n <button\n type=\"button\"\n onClick={() => {\n userScrolledManually.current = false // Clear manual scroll flag\n\n // Flush any buffered logs when explicitly returning to live mode\n if (logBuffer.length > 0) {\n setLogs((prevLogs) => [...prevLogs, ...logBuffer])\n setLogBuffer([])\n setLastFetched(new Date()) // Update \"Last updated\" when showing buffered logs\n }\n\n bottomRef.current?.scrollIntoView({ behavior: \"smooth\" })\n }}\n className={`absolute top-0 right-0 flex items-center gap-1 px-2 py-0.5 bg-blue-600 text-white rounded text-xs hover:bg-blue-700 whitespace-nowrap ${\n mode === \"tail\" && !isAtBottom ? \"visible\" : \"invisible\"\n }`}\n >\n ↓ Live\n </button>\n </div>\n </div>\n </div>\n </div>\n )\n}\n","/**\n * Shared color constants for log entries\n * Used by both TUI and web logs viewer to ensure consistency\n */\n\nexport const LOG_COLORS = {\n // Source colors\n BROWSER: \"#00CED1\", // Cyan\n SERVER: \"#32CD32\", // Lime green\n\n // Log type colors\n NETWORK: \"#4A7C7E\", // Soft teal\n CONSOLE_ERROR: \"#FF6B6B\", // Red\n CONSOLE_WARN: \"#FFA500\", // Orange\n CONSOLE_INFO: \"#87CEEB\", // Sky blue\n CONSOLE_LOG: \"#B0B0B0\", // Gray\n CONSOLE_DEBUG: \"#9370DB\", // Purple\n SCREENSHOT: \"#FF69B4\", // Hot pink\n PAGE: \"#98FB98\", // Pale green\n DOM: \"#DDA0DD\", // Plum\n CDP: \"#F0E68C\", // Khaki\n ERROR: \"#FF6B6B\", // Red\n CRITICAL_ERROR: \"#DC143C\", // Crimson\n DEFAULT: \"#A0A0A0\" // Dark gray\n} as const\n\n// Helper to determine text color based on background\nexport function getTextColor(bgColor: string): string {\n // Light backgrounds need dark text\n const lightColors: string[] = [\n LOG_COLORS.CONSOLE_INFO,\n LOG_COLORS.SCREENSHOT,\n LOG_COLORS.PAGE,\n LOG_COLORS.DOM,\n LOG_COLORS.CDP\n ]\n return lightColors.includes(bgColor) ? \"#000\" : \"#FFF\"\n}\n\n// Map log type names to color keys\nexport const TYPE_COLOR_MAP = {\n NETWORK: \"NETWORK\",\n \"NETWORK.REQUEST\": \"NETWORK\",\n \"CONSOLE.ERROR\": \"CONSOLE_ERROR\",\n \"CONSOLE.WARN\": \"CONSOLE_WARN\",\n \"CONSOLE.INFO\": \"CONSOLE_INFO\",\n \"CONSOLE.LOG\": \"CONSOLE_LOG\",\n \"CONSOLE.DEBUG\": \"CONSOLE_DEBUG\",\n \"RUNTIME.ERROR\": \"ERROR\",\n \"CDP.ERROR\": \"CDP\",\n \"CHROME.ERROR\": \"ERROR\",\n \"CHROME.CRASH\": \"CRITICAL_ERROR\",\n NAVIGATION: \"PAGE\",\n INTERACTION: \"DOM\",\n SCREENSHOT: \"SCREENSHOT\",\n PAGE: \"PAGE\",\n DOM: \"DOM\",\n CDP: \"CDP\",\n ERROR: \"ERROR\",\n \"CRITICAL ERROR\": \"CRITICAL_ERROR\"\n} as const\n","import type { LogEntry } from \"@/types\"\n\n/**\n * Cleans up console log messages that contain CSS formatting directives\n * Example: \"%c[Vercel Web Analytics]%c Debug mode... color: rgb(120, 120, 120) color: inherit\"\n * Becomes: \"[Vercel Web Analytics] Debug mode...\"\n */\nfunction cleanConsoleFormatting(message: string): string {\n // Pattern to match console log entries with CSS formatting\n const consoleLogPattern = /^\\[CONSOLE LOG\\] (.+)$/\n const match = message.match(consoleLogPattern)\n\n if (!match) {\n return message\n }\n\n const consoleMessage = match[1]\n\n // Check if this message has %c CSS formatting directives\n if (!consoleMessage.includes(\"%c\")) {\n return message // No formatting to clean\n }\n\n // Remove CSS formatting directives step by step\n let cleaned = consoleMessage\n\n // Remove %c markers\n cleaned = cleaned.replace(/%c/g, \"\")\n\n // Remove trailing CSS color declarations - look for CSS patterns before JSON or at end of string\n // Match CSS color declarations that appear after %c removal\n cleaned = cleaned.replace(/\\s+color:\\s*[^{}\\n]*?(?=\\s*[{[]|$)/g, \"\")\n\n // Clean up any extra whitespace\n cleaned = cleaned.replace(/\\s+/g, \" \").trim()\n\n return `[CONSOLE LOG] ${cleaned}`\n}\n\nexport function parseLogEntries(logContent: string): LogEntry[] {\n // Enhanced pattern to handle multiple timestamp formats:\n // Format 1 (CDP): [timestamp] [SOURCE] message\n // Format 2 (Extension): [timestamp] [TAB-id] [SOURCE] [event] message\n // Format 3 (Short): [HH:MM:SS.mmm] [SOURCE] message\n const timestampPattern = /\\[(\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}\\.\\d{3}Z|\\d{2}:\\d{2}:\\d{2}\\.\\d{3})\\] \\[([^\\]]+)\\] /\n\n const entries: LogEntry[] = []\n const lines = logContent.split(\"\\n\")\n let currentEntry: LogEntry | null = null\n\n for (const line of lines) {\n if (!line.trim()) continue\n\n const match = line.match(timestampPattern)\n if (match) {\n // Save previous entry if exists\n if (currentEntry) {\n entries.push(currentEntry)\n }\n\n const [fullMatch, timestamp, firstBracket] = match\n const remainingLine = line.substring(fullMatch.length)\n\n // Check if this is a Chrome extension format with tab identifier\n const isTabIdentifier = /^TAB-\\d+\\.\\d+$/.test(firstBracket)\n let source = firstBracket\n let message = remainingLine\n let tabIdentifier: string | undefined\n let userAgent: string | undefined\n\n if (isTabIdentifier) {\n // Chrome extension format: [TAB-id] [SOURCE] [event] message\n tabIdentifier = firstBracket\n\n // Look for the next bracketed section which should be the actual source\n const sourceMatch = remainingLine.match(/^\\[([^\\]]+)\\] /)\n if (sourceMatch) {\n source = sourceMatch[1] // This should be \"BROWSER\"\n message = remainingLine.substring(sourceMatch[0].length)\n\n // Extract user agent from INFO entries if present\n if (message.includes(\"User-Agent:\")) {\n const uaMatch = message.match(/User-Agent: ([^,\\n]+)/)\n if (uaMatch) {\n userAgent = uaMatch[1]\n }\n }\n }\n }\n\n const screenshot = message.match(/\\[SCREENSHOT\\] ([^\\s[]+)/)?.[1]\n\n // Clean up CSS formatting directives in console log messages\n let cleanedMessage = cleanConsoleFormatting(message)\n\n // Remove browser type markers from displayed message (they'll show as pills instead)\n // cleanedMessage = cleanedMessage.replace(/ \\[PLAYWRIGHT\\]$/, \"\").replace(/ \\[CHROME_EXTENSION\\]$/, \"\")\n cleanedMessage = cleanedMessage.replace(/ \\[CHROME_EXTENSION\\]$/, \"\") // Only remove Chrome Extension tag\n\n // Filter out noisy WebSocket logs from Next.js dev server\n const isNoisyWebSocketLog =\n cleanedMessage.includes(\"[Network.webSocketFrameSent]\") ||\n cleanedMessage.includes(\"[Network.webSocketFrameReceived]\") ||\n cleanedMessage.includes(\"[Network.webSocketFrame\") ||\n (cleanedMessage.includes(\"webSocketDebuggerUrl\") && cleanedMessage.includes(\"localhost\")) ||\n (cleanedMessage.includes(\"[NETWORK\") &&\n cleanedMessage.includes(\"__PAGE__\") &&\n cleanedMessage.includes(\"refresh\"))\n\n // Skip noisy WebSocket logs unless user specifically wants to see them\n if (isNoisyWebSocketLog) {\n currentEntry = null // Skip this entry\n continue\n }\n\n // Normalize timestamp to full ISO format if it's just time\n let normalizedTimestamp = timestamp\n if (/^\\d{2}:\\d{2}:\\d{2}\\.\\d{3}$/.test(timestamp)) {\n // It's just HH:MM:SS.mmm, convert to today's date with this time\n const today = new Date()\n const [hours, minutes, secondsMs] = timestamp.split(\":\")\n const [seconds, ms] = secondsMs.split(\".\")\n today.setHours(parseInt(hours, 10), parseInt(minutes, 10), parseInt(seconds, 10), parseInt(ms, 10))\n normalizedTimestamp = today.toISOString()\n }\n\n currentEntry = {\n timestamp: normalizedTimestamp,\n source,\n message: cleanedMessage,\n screenshot,\n original: line,\n tabIdentifier,\n userAgent\n }\n } else if (currentEntry) {\n // Append to current entry's message\n currentEntry.message += `\\n${line}`\n currentEntry.original += `\\n${line}`\n }\n }\n\n // Don't forget the last entry\n if (currentEntry) {\n entries.push(currentEntry)\n }\n\n return entries\n}\n"],"names":["getImageBlurSvg","widthInt","heightInt","blurWidth","blurHeight","blurDataURL","objectFit","std","svgWidth","svgHeight","viewBox","preserveAspectRatio","VALID_LOADERS","imageConfigDefault","deviceSizes","imageSizes","path","loader","loaderFile","domains","disableStaticImages","minimumCacheTTL","formats","dangerouslyAllowSVG","contentSecurityPolicy","contentDispositionType","localPatterns","undefined","remotePatterns","qualities","unoptimized","getImgProps","VALID_LOADING_VALUES","INVALID_BACKGROUND_SIZE_VALUES","isStaticRequire","src","default","isStaticImageData","isStaticImport","allImgs","Map","perfObserver","getInt","x","Number","isFinite","NaN","test","parseInt","getWidths","width","sizes","allSizes","viewportWidthRe","percentSizes","match","exec","push","length","smallestRatio","Math","min","widths","filter","s","kind","Set","map","w","find","p","generateImgAttrs","config","quality","srcSet","last","i","join","_state","priority","preload","loading","className","height","fill","style","overrideSrc","onLoad","onLoadingComplete","placeholder","fetchPriority","decoding","layout","objectPosition","lazyBoundary","lazyRoot","rest","imgConf","showAltText","blurComplete","defaultLoader","c","sort","a","b","Error","isDefaultLoader","customImageLoader","obj","_","opts","layoutToStyle","intrinsic","maxWidth","responsive","layoutToSizes","layoutStyle","layoutSizes","staticSrc","staticImageData","JSON","stringify","ratio","round","isLazy","startsWith","split","endsWith","qualityInt","process","env","NODE_ENV","output","position","isNaN","includes","String","warnOnce","pathname","VALID_BLUR_EXT","urlStr","url","URL","err","search","legacyKey","legacyValue","Object","entries","window","PerformanceObserver","entryList","entry","getEntries","imgSrc","element","lcpImage","get","observe","type","buffered","console","error","imgStyle","assign","left","top","right","bottom","color","backgroundImage","backgroundSize","placeholderStyle","backgroundPosition","backgroundRepeat","imgAttributes","loadingFinal","fullUrl","e","location","href","set","props","meta","SideEffect","isServer","useClientOnlyLayoutEffect","useLayoutEffect","useClientOnlyEffect","useEffect","headManager","reduceComponentsToState","emitChange","mountedInstances","headElements","Children","toArray","Array","from","Boolean","updateHead","add","children","delete","_pendingUpdate","module","exports","require","vendored","AmpContext","HeadManagerContext","isInAmpMode","ampFirst","hybrid","hasQuery","defaultHead","inAmpMode","head","charSet","name","content","onlyReactElement","list","child","React","Fragment","concat","reduce","fragmentList","fragmentChild","METATYPES","unique","keys","tags","metaTypes","metaCategories","h","isUnique","hasKey","key","indexOf","slice","has","len","metatype","hasOwnProperty","category","categories","reduceComponents","headChildrenElements","reverse","srcMessage","cloneElement","Head","ampState","useContext","AmpStateContext","Effect","ImageConfigContext","RouterContext","findClosestQuality","q","prev","cur","abs","missingValues","NEXT_RUNTIME","hasLocalMatch","parsedSrc","hasRemoteMatch","hostname","encodeURIComponent","NEXT_DEPLOYMENT_ID","__next_img_default","Image","configEnv","__NEXT_IMAGE_OPTS","globalThis","__NEXT_IMAGE_IMPORTED","handleLoading","img","onLoadRef","onLoadingCompleteRef","setBlurComplete","sizesInput","decode","Promise","resolve","catch","then","parentElement","isConnected","current","event","Event","defineProperty","writable","value","prevented","stopped","nativeEvent","currentTarget","target","isDefaultPrevented","isPropagationStopped","persist","preventDefault","stopPropagation","origSrc","searchParams","getAttribute","widthViewportRatio","getBoundingClientRect","innerWidth","getComputedStyle","valid","heightModified","toString","widthModified","getDynamicProps","use","fetchpriority","ImageElement","forwardRef","forwardedRef","setShowAltText","onError","ownRef","useCallback","complete","ref","useMergedRef","data-nimg","ImagePreload","isAppRouter","as","imageSrcSet","crossOrigin","referrerPolicy","ReactDOM","link","rel","pagesRouter","configContext","useMemo","useRef","useState","imgMeta","getImageProps","imgProps"],"mappings":"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","ignoreList":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15]}