dev3000 0.0.126 → 0.0.127

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 (292) hide show
  1. package/dist/cdp-monitor.d.ts.map +1 -1
  2. package/dist/cdp-monitor.js +18 -0
  3. package/dist/cdp-monitor.js.map +1 -1
  4. package/dist/dev-environment.d.ts +0 -4
  5. package/dist/dev-environment.d.ts.map +1 -1
  6. package/dist/dev-environment.js +1 -236
  7. package/dist/dev-environment.js.map +1 -1
  8. package/dist/screencast-manager.d.ts +2 -1
  9. package/dist/screencast-manager.d.ts.map +1 -1
  10. package/dist/screencast-manager.js +85 -36
  11. package/dist/screencast-manager.js.map +1 -1
  12. package/dist/utils/version-check.d.ts +3 -0
  13. package/dist/utils/version-check.d.ts.map +1 -1
  14. package/dist/utils/version-check.js +13 -1
  15. package/dist/utils/version-check.js.map +1 -1
  16. package/mcp-server/.next/BUILD_ID +1 -1
  17. package/mcp-server/.next/app-path-routes-manifest.json +2 -0
  18. package/mcp-server/.next/build-manifest.json +7 -7
  19. package/mcp-server/.next/fallback-build-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 +3 -3
  23. package/mcp-server/.next/routes-manifest.json +12 -0
  24. package/mcp-server/.next/server/app/_global-error/page/build-manifest.json +5 -5
  25. package/mcp-server/.next/server/app/_global-error/page.js +8 -8
  26. package/mcp-server/.next/server/app/_global-error/page.js.nft.json +1 -1
  27. package/mcp-server/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  28. package/mcp-server/.next/server/app/_global-error.html +2 -2
  29. package/mcp-server/.next/server/app/_global-error.rsc +7 -7
  30. package/mcp-server/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +2 -2
  31. package/mcp-server/.next/server/app/_global-error.segments/_full.segment.rsc +7 -7
  32. package/mcp-server/.next/server/app/_global-error.segments/_head.segment.rsc +3 -3
  33. package/mcp-server/.next/server/app/_global-error.segments/_index.segment.rsc +3 -3
  34. package/mcp-server/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  35. package/mcp-server/.next/server/app/_not-found/page/build-manifest.json +5 -5
  36. package/mcp-server/.next/server/app/_not-found/page.js +10 -10
  37. package/mcp-server/.next/server/app/_not-found/page.js.nft.json +1 -1
  38. package/mcp-server/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  39. package/mcp-server/.next/server/app/_not-found.html +1 -1
  40. package/mcp-server/.next/server/app/_not-found.rsc +8 -8
  41. package/mcp-server/.next/server/app/_not-found.segments/_full.segment.rsc +8 -8
  42. package/mcp-server/.next/server/app/_not-found.segments/_head.segment.rsc +3 -3
  43. package/mcp-server/.next/server/app/_not-found.segments/_index.segment.rsc +4 -4
  44. package/mcp-server/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +2 -2
  45. package/mcp-server/.next/server/app/_not-found.segments/_not-found.segment.rsc +3 -3
  46. package/mcp-server/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
  47. package/mcp-server/.next/server/app/api/jank/[session]/route.js +8 -8
  48. package/mcp-server/.next/server/app/api/jank/[session]/route.js.nft.json +1 -1
  49. package/mcp-server/.next/server/app/api/logs/append/route.js +4 -4
  50. package/mcp-server/.next/server/app/api/logs/append/route.js.nft.json +1 -1
  51. package/mcp-server/.next/server/app/api/logs/head/route.js +4 -4
  52. package/mcp-server/.next/server/app/api/logs/head/route.js.nft.json +1 -1
  53. package/mcp-server/.next/server/app/api/logs/list/route.js +4 -4
  54. package/mcp-server/.next/server/app/api/logs/list/route.js.nft.json +1 -1
  55. package/mcp-server/.next/server/app/api/logs/rotate/route.js +6 -6
  56. package/mcp-server/.next/server/app/api/logs/rotate/route.js.nft.json +1 -1
  57. package/mcp-server/.next/server/app/api/logs/stream/route.js +4 -4
  58. package/mcp-server/.next/server/app/api/logs/stream/route.js.nft.json +1 -1
  59. package/mcp-server/.next/server/app/api/logs/tail/route.js +4 -4
  60. package/mcp-server/.next/server/app/api/logs/tail/route.js.nft.json +1 -1
  61. package/mcp-server/.next/server/app/api/orchestrator/route.js +6 -6
  62. package/mcp-server/.next/server/app/api/orchestrator/route.js.nft.json +1 -1
  63. package/mcp-server/.next/server/app/api/screenshots/[filename]/route.js +6 -6
  64. package/mcp-server/.next/server/app/api/screenshots/[filename]/route.js.nft.json +1 -1
  65. package/mcp-server/.next/server/app/api/screenshots/capture/route/app-paths-manifest.json +3 -0
  66. package/mcp-server/.next/server/app/api/screenshots/capture/route/build-manifest.json +11 -0
  67. package/mcp-server/.next/server/app/api/screenshots/capture/route/server-reference-manifest.json +4 -0
  68. package/mcp-server/.next/server/app/api/screenshots/capture/route.js +9 -0
  69. package/mcp-server/.next/server/app/api/screenshots/capture/route.js.map +5 -0
  70. package/mcp-server/.next/server/app/api/screenshots/capture/route.js.nft.json +1 -0
  71. package/mcp-server/.next/server/app/api/screenshots/capture/route_client-reference-manifest.js +2 -0
  72. package/mcp-server/.next/server/app/api/screenshots/clear/route/app-paths-manifest.json +3 -0
  73. package/mcp-server/.next/server/app/api/screenshots/clear/route/build-manifest.json +11 -0
  74. package/mcp-server/.next/server/app/api/screenshots/clear/route/server-reference-manifest.json +4 -0
  75. package/mcp-server/.next/server/app/api/screenshots/clear/route.js +8 -0
  76. package/mcp-server/.next/server/app/api/screenshots/clear/route.js.map +5 -0
  77. package/mcp-server/.next/server/app/api/screenshots/clear/route.js.nft.json +1 -0
  78. package/mcp-server/.next/server/app/api/screenshots/clear/route_client-reference-manifest.js +2 -0
  79. package/mcp-server/.next/server/app/api/screenshots/list/route.js +6 -6
  80. package/mcp-server/.next/server/app/api/screenshots/list/route.js.nft.json +1 -1
  81. package/mcp-server/.next/server/app/api/teams/route.js +5 -5
  82. package/mcp-server/.next/server/app/api/teams/route.js.nft.json +1 -1
  83. package/mcp-server/.next/server/app/api/tools/route.js +6 -6
  84. package/mcp-server/.next/server/app/api/tools/route.js.nft.json +1 -1
  85. package/mcp-server/.next/server/app/index.html +1 -1
  86. package/mcp-server/.next/server/app/index.rsc +10 -10
  87. package/mcp-server/.next/server/app/index.segments/__PAGE__.segment.rsc +4 -4
  88. package/mcp-server/.next/server/app/index.segments/_full.segment.rsc +10 -10
  89. package/mcp-server/.next/server/app/index.segments/_head.segment.rsc +3 -3
  90. package/mcp-server/.next/server/app/index.segments/_index.segment.rsc +4 -4
  91. package/mcp-server/.next/server/app/index.segments/_tree.segment.rsc +2 -2
  92. package/mcp-server/.next/server/app/logs/page/build-manifest.json +5 -5
  93. package/mcp-server/.next/server/app/logs/page.js +13 -13
  94. package/mcp-server/.next/server/app/logs/page.js.nft.json +1 -1
  95. package/mcp-server/.next/server/app/logs/page_client-reference-manifest.js +1 -1
  96. package/mcp-server/.next/server/app/mcp/route.js +8 -7
  97. package/mcp-server/.next/server/app/mcp/route.js.nft.json +1 -1
  98. package/mcp-server/.next/server/app/page/build-manifest.json +5 -5
  99. package/mcp-server/.next/server/app/page.js +12 -12
  100. package/mcp-server/.next/server/app/page.js.nft.json +1 -1
  101. package/mcp-server/.next/server/app/page_client-reference-manifest.js +1 -1
  102. package/mcp-server/.next/server/app/video/[session]/page/build-manifest.json +5 -5
  103. package/mcp-server/.next/server/app/video/[session]/page.js +12 -12
  104. package/mcp-server/.next/server/app/video/[session]/page.js.nft.json +1 -1
  105. package/mcp-server/.next/server/app/video/[session]/page_client-reference-manifest.js +1 -1
  106. package/mcp-server/.next/server/app-paths-manifest.json +2 -0
  107. package/mcp-server/.next/server/chunks/250ae__next-internal_server_app_api_screenshots_capture_route_actions_4034f26c.js +3 -0
  108. package/mcp-server/.next/server/chunks/250ae__next-internal_server_app_api_screenshots_clear_route_actions_e26206f4.js +3 -0
  109. package/mcp-server/.next/server/chunks/{8b111_next_70882466._.js → 433f5_next_5860112e._.js} +3 -3
  110. package/mcp-server/.next/server/chunks/{8b111_next_70882466._.js.map → 433f5_next_5860112e._.js.map} +1 -1
  111. package/mcp-server/.next/server/chunks/{8b111_next_dist_b45da2c0._.js → 433f5_next_dist_36978895._.js} +3 -3
  112. package/mcp-server/.next/server/chunks/{8b111_next_dist_b45da2c0._.js.map → 433f5_next_dist_36978895._.js.map} +1 -1
  113. package/mcp-server/.next/server/chunks/{8b111_next_dist_esm_build_templates_app-route_61845054.js → 433f5_next_dist_esm_build_templates_app-route_ac28ad10.js} +2 -2
  114. package/mcp-server/.next/server/chunks/{8b111_next_dist_esm_build_templates_app-route_61845054.js.map → 433f5_next_dist_esm_build_templates_app-route_ac28ad10.js.map} +1 -1
  115. package/mcp-server/.next/server/chunks/433f5_next_eab95237._.js +3 -0
  116. package/mcp-server/.next/server/chunks/{8b111_next_1353f498._.js.map → 433f5_next_eab95237._.js.map} +1 -1
  117. package/mcp-server/.next/server/chunks/[root-of-the-server]__0c791ce7._.js +3 -0
  118. package/mcp-server/.next/server/chunks/{[root-of-the-server]__f2de2bac._.js.map → [root-of-the-server]__0c791ce7._.js.map} +1 -1
  119. package/mcp-server/.next/server/chunks/[root-of-the-server]__262fc29c._.js +3 -0
  120. package/mcp-server/.next/server/chunks/{[root-of-the-server]__97925d45._.js.map → [root-of-the-server]__262fc29c._.js.map} +1 -1
  121. package/mcp-server/.next/server/chunks/[root-of-the-server]__340a77dc._.js +3 -0
  122. package/mcp-server/.next/server/chunks/{[root-of-the-server]__9a45c8f9._.js.map → [root-of-the-server]__340a77dc._.js.map} +1 -1
  123. package/mcp-server/.next/server/chunks/{[root-of-the-server]__880af90b._.js → [root-of-the-server]__3edbdbcd._.js} +3 -3
  124. package/mcp-server/.next/server/chunks/{[root-of-the-server]__880af90b._.js.map → [root-of-the-server]__3edbdbcd._.js.map} +1 -1
  125. package/mcp-server/.next/server/chunks/[root-of-the-server]__714e8bcf._.js +3 -0
  126. package/mcp-server/.next/server/chunks/{[root-of-the-server]__e1a64519._.js.map → [root-of-the-server]__714e8bcf._.js.map} +1 -1
  127. package/mcp-server/.next/server/chunks/[root-of-the-server]__7dc404bd._.js +3 -0
  128. package/mcp-server/.next/server/chunks/{[root-of-the-server]__92444e87._.js.map → [root-of-the-server]__7dc404bd._.js.map} +1 -1
  129. package/mcp-server/.next/server/chunks/[root-of-the-server]__90514e85._.js +4 -0
  130. package/mcp-server/.next/server/chunks/[root-of-the-server]__90514e85._.js.map +1 -0
  131. package/mcp-server/.next/server/chunks/[root-of-the-server]__9a5b611f._.js +3 -0
  132. package/mcp-server/.next/server/chunks/{[root-of-the-server]__8173a02b._.js.map → [root-of-the-server]__9a5b611f._.js.map} +1 -1
  133. package/mcp-server/.next/server/chunks/{[root-of-the-server]__72f849fd._.js → [root-of-the-server]__b4e8283a._.js} +2 -2
  134. package/mcp-server/.next/server/chunks/[root-of-the-server]__b5a27148._.js +3 -0
  135. package/mcp-server/.next/server/chunks/{[root-of-the-server]__7a6a57a4._.js.map → [root-of-the-server]__b5a27148._.js.map} +1 -1
  136. package/mcp-server/.next/server/chunks/[root-of-the-server]__b73733ab._.js +3 -0
  137. package/mcp-server/.next/server/chunks/[root-of-the-server]__b73733ab._.js.map +1 -0
  138. package/mcp-server/.next/server/chunks/[root-of-the-server]__d3743c8b._.js +7 -0
  139. package/mcp-server/.next/server/chunks/{[root-of-the-server]__45cf400e._.js.map → [root-of-the-server]__d3743c8b._.js.map} +1 -1
  140. package/mcp-server/.next/server/chunks/{[root-of-the-server]__9be3321c._.js → [root-of-the-server]__e3fa14dc._.js} +3 -3
  141. package/mcp-server/.next/server/chunks/{[root-of-the-server]__9be3321c._.js.map → [root-of-the-server]__e3fa14dc._.js.map} +1 -1
  142. package/mcp-server/.next/server/chunks/{[root-of-the-server]__97925d45._.js → [root-of-the-server]__e7678c16._.js} +2 -2
  143. package/mcp-server/.next/server/chunks/{[root-of-the-server]__5e1331cc._.js.map → [root-of-the-server]__e7678c16._.js.map} +1 -1
  144. package/mcp-server/.next/server/chunks/[root-of-the-server]__e767dfde._.js +3 -0
  145. package/mcp-server/.next/server/chunks/[root-of-the-server]__e767dfde._.js.map +1 -0
  146. package/mcp-server/.next/server/chunks/{[root-of-the-server]__86eb7852._.js → [root-of-the-server]__eb460e97._.js} +2 -2
  147. package/mcp-server/.next/server/chunks/{[root-of-the-server]__f449fffa._.js → [root-of-the-server]__ec4b3348._.js} +3 -3
  148. package/mcp-server/.next/server/chunks/{[root-of-the-server]__f449fffa._.js.map → [root-of-the-server]__ec4b3348._.js.map} +1 -1
  149. package/mcp-server/.next/server/chunks/{[root-of-the-server]__f9975293._.js → [root-of-the-server]__f71263ca._.js} +2 -2
  150. package/mcp-server/.next/server/chunks/{[root-of-the-server]__f9975293._.js.map → [root-of-the-server]__f71263ca._.js.map} +1 -1
  151. package/mcp-server/.next/server/chunks/[root-of-the-server]__fa4b0e38._.js +4 -0
  152. package/mcp-server/.next/server/chunks/[root-of-the-server]__fa4b0e38._.js.map +1 -0
  153. package/mcp-server/.next/server/chunks/{[root-of-the-server]__11cde0db._.js → [root-of-the-server]__ff23085a._.js} +2 -2
  154. package/mcp-server/.next/server/chunks/{[root-of-the-server]__11cde0db._.js.map → [root-of-the-server]__ff23085a._.js.map} +1 -1
  155. package/mcp-server/.next/server/chunks/mcp-server_app_mcp_tools_ts_faf6d7df._.js +216 -0
  156. package/mcp-server/.next/server/chunks/mcp-server_app_mcp_tools_ts_faf6d7df._.js.map +1 -0
  157. package/mcp-server/.next/server/chunks/ssr/{8b111_next_dist_a0631e8f._.js → 433f5_next_dist_319eb8f9._.js} +2 -2
  158. package/mcp-server/.next/server/chunks/ssr/433f5_next_dist_319eb8f9._.js.map +1 -0
  159. package/mcp-server/.next/server/chunks/ssr/433f5_next_dist_3356a03a._.js +6 -0
  160. package/mcp-server/.next/server/chunks/ssr/433f5_next_dist_3356a03a._.js.map +1 -0
  161. package/mcp-server/.next/server/chunks/ssr/433f5_next_dist_6d2930c9._.js +6 -0
  162. package/mcp-server/.next/server/chunks/ssr/{8b111_next_dist_2d5fda8a._.js.map → 433f5_next_dist_6d2930c9._.js.map} +1 -1
  163. package/mcp-server/.next/server/chunks/ssr/{8b111_next_dist_bc5bff92._.js → 433f5_next_dist_8f74ef27._.js} +3 -3
  164. package/mcp-server/.next/server/chunks/ssr/{8b111_next_dist_bc5bff92._.js.map → 433f5_next_dist_8f74ef27._.js.map} +1 -1
  165. package/mcp-server/.next/server/chunks/ssr/433f5_next_dist_client_components_1532728b._.js +3 -0
  166. package/mcp-server/.next/server/chunks/ssr/{8b111_next_dist_client_components_69dfdf5e._.js.map → 433f5_next_dist_client_components_1532728b._.js.map} +1 -1
  167. package/mcp-server/.next/server/chunks/ssr/433f5_next_dist_client_components_builtin_forbidden_443a1c24.js +3 -0
  168. package/mcp-server/.next/server/chunks/ssr/{8b111_next_dist_client_components_builtin_forbidden_5a705cc6.js.map → 433f5_next_dist_client_components_builtin_forbidden_443a1c24.js.map} +1 -1
  169. package/mcp-server/.next/server/chunks/ssr/433f5_next_dist_client_components_builtin_global-error_e298b8f7.js +3 -0
  170. package/mcp-server/.next/server/chunks/ssr/{8b111_next_dist_client_components_builtin_global-error_d996306b.js.map → 433f5_next_dist_client_components_builtin_global-error_e298b8f7.js.map} +1 -1
  171. package/mcp-server/.next/server/chunks/ssr/433f5_next_dist_client_components_builtin_unauthorized_9c23d540.js +3 -0
  172. package/mcp-server/.next/server/chunks/ssr/{8b111_next_dist_client_components_builtin_unauthorized_0df11997.js.map → 433f5_next_dist_client_components_builtin_unauthorized_9c23d540.js.map} +1 -1
  173. package/mcp-server/.next/server/chunks/ssr/{_3b1c49b6._.js → 433f5_next_dist_esm_build_templates_app-page_bb761d9a.js} +3 -3
  174. package/mcp-server/.next/server/chunks/ssr/{8b111_next_dist_esm_build_templates_app-page_4117d230.js.map → 433f5_next_dist_esm_build_templates_app-page_bb761d9a.js.map} +1 -1
  175. package/mcp-server/.next/server/chunks/ssr/[root-of-the-server]__0e37b86c._.js +3 -0
  176. package/mcp-server/.next/server/chunks/ssr/{[root-of-the-server]__016aaaae._.js.map → [root-of-the-server]__0e37b86c._.js.map} +1 -1
  177. package/mcp-server/.next/server/chunks/ssr/[root-of-the-server]__1bed47e4._.js +3 -0
  178. package/mcp-server/.next/server/chunks/ssr/{[root-of-the-server]__c73c0147._.js.map → [root-of-the-server]__1bed47e4._.js.map} +1 -1
  179. package/mcp-server/.next/server/chunks/ssr/[root-of-the-server]__1e4a60c6._.js +3 -0
  180. package/mcp-server/.next/server/chunks/ssr/[root-of-the-server]__1e4a60c6._.js.map +1 -0
  181. package/mcp-server/.next/server/chunks/ssr/[root-of-the-server]__2f9d6c3b._.js +3 -0
  182. package/mcp-server/.next/server/chunks/ssr/{[root-of-the-server]__baf72617._.js.map → [root-of-the-server]__2f9d6c3b._.js.map} +1 -1
  183. package/mcp-server/.next/server/chunks/ssr/[root-of-the-server]__77ed8c60._.js +3 -0
  184. package/mcp-server/.next/server/chunks/ssr/{[root-of-the-server]__0aa14b12._.js.map → [root-of-the-server]__77ed8c60._.js.map} +1 -1
  185. package/mcp-server/.next/server/chunks/ssr/[root-of-the-server]__8c027bae._.js +3 -0
  186. package/mcp-server/.next/server/chunks/ssr/{[root-of-the-server]__d9257d07._.js.map → [root-of-the-server]__8c027bae._.js.map} +1 -1
  187. package/mcp-server/.next/server/chunks/ssr/[root-of-the-server]__8fcdd573._.js +3 -0
  188. package/mcp-server/.next/server/chunks/ssr/{[root-of-the-server]__0e5de3ed._.js.map → [root-of-the-server]__8fcdd573._.js.map} +1 -1
  189. package/mcp-server/.next/server/chunks/ssr/[root-of-the-server]__a0ce1891._.js +3 -0
  190. package/mcp-server/.next/server/chunks/ssr/{[root-of-the-server]__ad363fb6._.js.map → [root-of-the-server]__a0ce1891._.js.map} +1 -1
  191. package/mcp-server/.next/server/chunks/ssr/[root-of-the-server]__bfde36b8._.js +3 -0
  192. package/mcp-server/.next/server/chunks/ssr/{[root-of-the-server]__23b471c0._.js.map → [root-of-the-server]__bfde36b8._.js.map} +1 -1
  193. package/mcp-server/.next/server/chunks/ssr/[root-of-the-server]__dcabe801._.js +3 -0
  194. package/mcp-server/.next/server/chunks/ssr/{[root-of-the-server]__f9ee1284._.js.map → [root-of-the-server]__dcabe801._.js.map} +1 -1
  195. package/mcp-server/.next/server/chunks/ssr/{[root-of-the-server]__5ba89445._.js → [root-of-the-server]__eafb9ac9._.js} +2 -2
  196. package/mcp-server/.next/server/chunks/ssr/{[root-of-the-server]__5ba89445._.js.map → [root-of-the-server]__eafb9ac9._.js.map} +1 -1
  197. package/mcp-server/.next/server/chunks/ssr/{_ba028667._.js → _6cd0eda9._.js} +3 -3
  198. package/mcp-server/.next/server/chunks/ssr/{_2eb35278._.js.map → _6cd0eda9._.js.map} +1 -1
  199. package/mcp-server/.next/server/chunks/ssr/{_af685f91._.js → _76837614._.js} +3 -3
  200. package/mcp-server/.next/server/chunks/ssr/{_af685f91._.js.map → _76837614._.js.map} +1 -1
  201. package/mcp-server/.next/server/chunks/ssr/{_5ba67898._.js → _dfef4eeb._.js} +3 -3
  202. package/mcp-server/.next/server/chunks/ssr/{_5ba67898._.js.map → _dfef4eeb._.js.map} +1 -1
  203. package/mcp-server/.next/server/chunks/ssr/_ee998c93._.js +4 -0
  204. package/mcp-server/.next/server/chunks/ssr/{_ba028667._.js.map → _ee998c93._.js.map} +1 -1
  205. package/mcp-server/.next/server/chunks/ssr/{_2eb35278._.js → _f701568c._.js} +3 -3
  206. package/mcp-server/.next/server/chunks/ssr/{_3b1c49b6._.js.map → _f701568c._.js.map} +1 -1
  207. package/mcp-server/.next/server/chunks/ssr/mcp-server_app_layout_tsx_afa41767._.js +1 -1
  208. package/mcp-server/.next/server/chunks/ssr/mcp-server_app_layout_tsx_afa41767._.js.map +1 -1
  209. package/mcp-server/.next/server/chunks/ssr/mcp-server_app_page_tsx_9fc46577._.js +1 -1
  210. package/mcp-server/.next/server/chunks/ssr/mcp-server_components_dark-mode-toggle_tsx_f31dd15d._.js +1 -1
  211. package/mcp-server/.next/server/chunks/ssr/node_modules__pnpm_0d033cf1._.js +5 -0
  212. package/mcp-server/.next/server/chunks/ssr/{node_modules__pnpm_3bd414fc._.js.map → node_modules__pnpm_0d033cf1._.js.map} +1 -1
  213. package/mcp-server/.next/server/chunks/ssr/node_modules__pnpm_bc9dc95d._.js +3 -0
  214. package/mcp-server/.next/server/chunks/ssr/{node_modules__pnpm_9d64b6f5._.js.map → node_modules__pnpm_bc9dc95d._.js.map} +1 -1
  215. package/mcp-server/.next/server/functions-config-manifest.json +1 -11
  216. package/mcp-server/.next/server/middleware-build-manifest.js +5 -5
  217. package/mcp-server/.next/server/pages/404.html +1 -1
  218. package/mcp-server/.next/server/pages/500.html +2 -2
  219. package/mcp-server/.next/server/server-reference-manifest.js +1 -1
  220. package/mcp-server/.next/server/server-reference-manifest.json +1 -1
  221. package/mcp-server/.next/static/X1Fi8LPe31lA0sFmINgXU/_clientMiddlewareManifest.json +1 -0
  222. package/mcp-server/.next/static/chunks/{45ba9786ab8c2e44.js → 08a78d62338c3d96.js} +1 -1
  223. package/mcp-server/.next/static/chunks/17797b93973bb065.js +1 -0
  224. package/mcp-server/.next/static/chunks/17d2f6f99b8f9354.js +2 -0
  225. package/mcp-server/.next/static/chunks/30950243aed68f90.js +3 -0
  226. package/mcp-server/.next/static/chunks/{95b89db5d1d54841.js → 352b1f4a58e2b0f6.js} +1 -1
  227. package/mcp-server/.next/static/chunks/{5171d9a831cc2de4.js → 4642be305803c7ba.js} +1 -1
  228. package/mcp-server/.next/static/chunks/59cdeaf92a780e96.css +1 -0
  229. package/mcp-server/.next/static/chunks/6bcb17537678c0c2.js +3 -0
  230. package/mcp-server/.next/static/chunks/8f35629757e9709d.js +1 -0
  231. package/mcp-server/.next/static/chunks/{3d612a0a5e49885d.js → 9e5b31ad403669a0.js} +1 -1
  232. package/mcp-server/.next/static/chunks/ab9bdd79609e2b89.js +1 -0
  233. package/mcp-server/.next/static/chunks/cbaf461889257de6.js +4 -0
  234. package/mcp-server/.next/static/chunks/{turbopack-39686e05867003be.js → turbopack-f72c45e89cd8b51e.js} +1 -1
  235. package/mcp-server/app/api/screenshots/capture/route.ts +137 -0
  236. package/mcp-server/app/api/screenshots/clear/route.ts +44 -0
  237. package/mcp-server/app/mcp/route.ts +3 -1
  238. package/mcp-server/app/mcp/tools.ts +6 -2
  239. package/mcp-server/package.json +1 -1
  240. package/package.json +2 -2
  241. package/mcp-server/.next/server/chunks/8b111_next_1353f498._.js +0 -3
  242. package/mcp-server/.next/server/chunks/[root-of-the-server]__3ac957e6._.js +0 -3
  243. package/mcp-server/.next/server/chunks/[root-of-the-server]__45cf400e._.js +0 -7
  244. package/mcp-server/.next/server/chunks/[root-of-the-server]__5e1331cc._.js +0 -3
  245. package/mcp-server/.next/server/chunks/[root-of-the-server]__7a6a57a4._.js +0 -3
  246. package/mcp-server/.next/server/chunks/[root-of-the-server]__8173a02b._.js +0 -3
  247. package/mcp-server/.next/server/chunks/[root-of-the-server]__92444e87._.js +0 -3
  248. package/mcp-server/.next/server/chunks/[root-of-the-server]__9a45c8f9._.js +0 -3
  249. package/mcp-server/.next/server/chunks/[root-of-the-server]__ae49815f._.js +0 -217
  250. package/mcp-server/.next/server/chunks/[root-of-the-server]__ae49815f._.js.map +0 -1
  251. package/mcp-server/.next/server/chunks/[root-of-the-server]__d4d47e5f._.js +0 -28
  252. package/mcp-server/.next/server/chunks/[root-of-the-server]__d4d47e5f._.js.map +0 -1
  253. package/mcp-server/.next/server/chunks/[root-of-the-server]__e1a64519._.js +0 -3
  254. package/mcp-server/.next/server/chunks/[root-of-the-server]__f2de2bac._.js +0 -3
  255. package/mcp-server/.next/server/chunks/ssr/8b111_next_dist_2d5fda8a._.js +0 -6
  256. package/mcp-server/.next/server/chunks/ssr/8b111_next_dist_416feb3b._.js +0 -6
  257. package/mcp-server/.next/server/chunks/ssr/8b111_next_dist_416feb3b._.js.map +0 -1
  258. package/mcp-server/.next/server/chunks/ssr/8b111_next_dist_a0631e8f._.js.map +0 -1
  259. package/mcp-server/.next/server/chunks/ssr/8b111_next_dist_client_components_69dfdf5e._.js +0 -3
  260. package/mcp-server/.next/server/chunks/ssr/8b111_next_dist_client_components_builtin_forbidden_5a705cc6.js +0 -3
  261. package/mcp-server/.next/server/chunks/ssr/8b111_next_dist_client_components_builtin_global-error_d996306b.js +0 -3
  262. package/mcp-server/.next/server/chunks/ssr/8b111_next_dist_client_components_builtin_unauthorized_0df11997.js +0 -3
  263. package/mcp-server/.next/server/chunks/ssr/8b111_next_dist_esm_build_templates_app-page_4117d230.js +0 -4
  264. package/mcp-server/.next/server/chunks/ssr/[root-of-the-server]__016aaaae._.js +0 -3
  265. package/mcp-server/.next/server/chunks/ssr/[root-of-the-server]__0aa14b12._.js +0 -3
  266. package/mcp-server/.next/server/chunks/ssr/[root-of-the-server]__0e5de3ed._.js +0 -3
  267. package/mcp-server/.next/server/chunks/ssr/[root-of-the-server]__23b471c0._.js +0 -3
  268. package/mcp-server/.next/server/chunks/ssr/[root-of-the-server]__ad363fb6._.js +0 -3
  269. package/mcp-server/.next/server/chunks/ssr/[root-of-the-server]__baf72617._.js +0 -3
  270. package/mcp-server/.next/server/chunks/ssr/[root-of-the-server]__bf7cd8c6._.js +0 -3
  271. package/mcp-server/.next/server/chunks/ssr/[root-of-the-server]__c73c0147._.js +0 -3
  272. package/mcp-server/.next/server/chunks/ssr/[root-of-the-server]__d9257d07._.js +0 -3
  273. package/mcp-server/.next/server/chunks/ssr/[root-of-the-server]__f9ee1284._.js +0 -3
  274. package/mcp-server/.next/server/chunks/ssr/node_modules__pnpm_3bd414fc._.js +0 -5
  275. package/mcp-server/.next/server/chunks/ssr/node_modules__pnpm_9d64b6f5._.js +0 -3
  276. package/mcp-server/.next/server/middleware.js +0 -5
  277. package/mcp-server/.next/server/middleware.js.nft.json +0 -1
  278. package/mcp-server/.next/static/chunks/37739dbbbff41860.js +0 -2
  279. package/mcp-server/.next/static/chunks/9af9038936981171.js +0 -3
  280. package/mcp-server/.next/static/chunks/9d9ea52745b7cee8.css +0 -1
  281. package/mcp-server/.next/static/chunks/a3771e169e1ff356.js +0 -1
  282. package/mcp-server/.next/static/chunks/a92901311ade94f3.js +0 -4
  283. package/mcp-server/.next/static/chunks/b3811fb9af254076.js +0 -1
  284. package/mcp-server/.next/static/chunks/eb96b27d3b73ef3b.js +0 -3
  285. package/mcp-server/.next/static/chunks/f9a2399752a0a1fa.js +0 -1
  286. package/mcp-server/.next/static/lSzvvkjD4ab_1CtchfQYo/_clientMiddlewareManifest.json +0 -6
  287. /package/mcp-server/.next/server/chunks/{[root-of-the-server]__3ac957e6._.js.map → 250ae__next-internal_server_app_api_screenshots_capture_route_actions_4034f26c.js.map} +0 -0
  288. /package/mcp-server/.next/server/chunks/{[root-of-the-server]__72f849fd._.js.map → 250ae__next-internal_server_app_api_screenshots_clear_route_actions_e26206f4.js.map} +0 -0
  289. /package/mcp-server/.next/server/chunks/{[root-of-the-server]__86eb7852._.js.map → [root-of-the-server]__b4e8283a._.js.map} +0 -0
  290. /package/mcp-server/.next/server/chunks/{ssr/[root-of-the-server]__bf7cd8c6._.js.map → [root-of-the-server]__eb460e97._.js.map} +0 -0
  291. /package/mcp-server/.next/static/{lSzvvkjD4ab_1CtchfQYo → X1Fi8LPe31lA0sFmINgXU}/_buildManifest.js +0 -0
  292. /package/mcp-server/.next/static/{lSzvvkjD4ab_1CtchfQYo → X1Fi8LPe31lA0sFmINgXU}/_ssgManifest.js +0 -0
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/utils/log-filename.ts","../../../../mcp-server/app/api/logs/list/route.ts","../../../../node_modules/.pnpm/next%4016.0.7_%40opentelemetry%2Bapi%401.9.0_babel-plugin-react-compiler%401.0.0_react-dom%4019.3.0_a20848594014cb183ab624f2be88a203/node_modules/next/dist/esm/build/templates/app-route.js"],"sourcesContent":["/**\n * Utilities for working with dev3000 log filenames\n *\n * Log files follow the pattern: <project-name>-<timestamp>.log\n * where timestamp is ISO 8601 with special chars replaced by hyphens\n * Example: tailwindui-studio-2025-10-27T17-57-15-014Z.log\n */\n\n/**\n * Extract the project name from a log filename\n *\n * @param filename - The log filename (e.g., \"tailwindui-studio-2025-10-27T17-57-15-014Z.log\")\n * @returns The project name (e.g., \"tailwindui-studio\") or null if invalid format\n */\nexport function extractProjectNameFromLogFilename(filename: string): string | null {\n // Pattern matches: <project-name>-YYYY-MM-DDTHH-MM-SS-SSSZ.log\n // The timestamp always starts with YYYY-MM-DD which is a reliable anchor\n const timestampMatch = filename.match(/^(.+?)-(\\d{4}-\\d{2}-\\d{2}T[\\d-]+Z)\\.log$/)\n if (timestampMatch) {\n return timestampMatch[1]\n }\n\n // Also handle current log file pattern: <project-name>-d3k.log\n const d3kMatch = filename.match(/^(.+)-d3k\\.log$/)\n if (d3kMatch) {\n return d3kMatch[1]\n }\n\n return null\n}\n\n/**\n * Check if a log filename matches a given project name\n *\n * @param filename - The log filename to check\n * @param projectName - The project name to match (supports partial matching)\n * @returns true if the filename belongs to this project\n */\nexport function logFilenameMatchesProject(filename: string, projectName: string): boolean {\n const extractedName = extractProjectNameFromLogFilename(filename)\n if (!extractedName) {\n return false\n }\n\n // Support partial matching (e.g., \"studio\" matches \"tailwindui-studio\")\n return extractedName.includes(projectName)\n}\n\n/**\n * Extract the timestamp from a log filename\n *\n * @param filename - The log filename\n * @returns ISO 8601 timestamp string or null if invalid format\n */\nexport function extractTimestampFromLogFilename(filename: string): string | null {\n const match = filename.match(/^.+?-(\\d{4}-\\d{2}-\\d{2}T[\\d-]+Z)\\.log$/)\n if (match) {\n // Convert back to proper ISO format (replace hyphens with colons and dots)\n const timestamp = match[1]\n // Format: 2025-10-27T17-57-15-014Z -> 2025-10-27T17:57:15.014Z\n const isoTimestamp = timestamp.replace(/T(\\d{2})-(\\d{2})-(\\d{2})-(\\d{3})Z/, \"T$1:$2:$3.$4Z\")\n return isoTimestamp\n }\n return null\n}\n","import { extractProjectNameFromLogFilename, logFilenameMatchesProject } from \"@dev3000/src/utils/log-filename\"\nimport { existsSync, readdirSync, statSync } from \"fs\"\nimport type { NextRequest } from \"next/server\"\nimport { basename, dirname, join } from \"path\"\nimport type { LogFile, LogListError, LogListResponse } from \"@/types\"\n\nexport async function GET(_request: NextRequest): Promise<Response> {\n try {\n const currentLogPath = process.env.LOG_FILE_PATH || \"/var/log/dev3000/dev3000.log\"\n\n if (!existsSync(currentLogPath)) {\n const errorResponse: LogListError = { error: \"Current log file not found\" }\n return Response.json(errorResponse, { status: 404 })\n }\n\n // Get the directory containing the current log\n const logDir = dirname(currentLogPath)\n const currentLogName = basename(currentLogPath)\n\n // Extract project name from current log filename using shared utility\n const projectName = extractProjectNameFromLogFilename(currentLogName) || \"unknown\"\n\n // Find all log files for this project\n const files: LogFile[] = []\n\n try {\n const dirContents = readdirSync(logDir)\n const logFiles = dirContents\n .filter((file) => logFilenameMatchesProject(file, projectName))\n .map((file) => {\n const filePath = join(logDir, file)\n const stats = statSync(filePath)\n\n // Extract timestamp from filename\n const timestampMatch = file.match(/(\\d{4}-\\d{2}-\\d{2}T[\\d-]+Z)/)\n const timestamp = timestampMatch ? timestampMatch[1].replace(/-/g, \":\") : \"\"\n\n return {\n name: file,\n path: filePath,\n timestamp,\n size: stats.size,\n mtime: stats.mtime,\n isCurrent: file === currentLogName\n }\n })\n .sort((a, b) => b.mtime.getTime() - a.mtime.getTime()) // Most recent first\n .map((file) => ({\n ...file,\n mtime: file.mtime.toISOString() // Convert to string after sorting\n }))\n\n files.push(...logFiles)\n } catch (error) {\n console.warn(\"Could not read log directory:\", error)\n }\n\n const response: LogListResponse = {\n files,\n currentFile: currentLogPath,\n projectName\n }\n\n return Response.json(response)\n } catch (error) {\n const errorResponse: LogListError = {\n error: error instanceof Error ? error.message : \"Unknown error\"\n }\n return Response.json(errorResponse, { status: 500 })\n }\n}\n","import { AppRouteRouteModule } from \"next/dist/esm/server/route-modules/app-route/module.compiled\";\nimport { RouteKind } from \"next/dist/esm/server/route-kind\";\nimport { patchFetch as _patchFetch } from \"next/dist/esm/server/lib/patch-fetch\";\nimport { addRequestMeta, getRequestMeta } from \"next/dist/esm/server/request-meta\";\nimport { getTracer, SpanKind } from \"next/dist/esm/server/lib/trace/tracer\";\nimport { setReferenceManifestsSingleton } from \"next/dist/esm/server/app-render/encryption-utils\";\nimport { createServerModuleMap } from \"next/dist/esm/server/app-render/action-utils\";\nimport { normalizeAppPath } from \"next/dist/esm/shared/lib/router/utils/app-paths\";\nimport { NodeNextRequest, NodeNextResponse } from \"next/dist/esm/server/base-http/node\";\nimport { NextRequestAdapter, signalFromNodeResponse } from \"next/dist/esm/server/web/spec-extension/adapters/next-request\";\nimport { BaseServerSpan } from \"next/dist/esm/server/lib/trace/constants\";\nimport { getRevalidateReason } from \"next/dist/esm/server/instrumentation/utils\";\nimport { sendResponse } from \"next/dist/esm/server/send-response\";\nimport { fromNodeOutgoingHttpHeaders, toNodeOutgoingHttpHeaders } from \"next/dist/esm/server/web/utils\";\nimport { getCacheControlHeader } from \"next/dist/esm/server/lib/cache-control\";\nimport { INFINITE_CACHE, NEXT_CACHE_TAGS_HEADER } from \"next/dist/esm/lib/constants\";\nimport { NoFallbackError } from \"next/dist/esm/shared/lib/no-fallback-error.external\";\nimport { CachedRouteKind } from \"next/dist/esm/server/response-cache\";\nimport * as userland from \"INNER_APP_ROUTE\";\n// We inject the nextConfigOutput here so that we can use them in the route\n// module.\nconst nextConfigOutput = \"\"\nconst routeModule = new AppRouteRouteModule({\n definition: {\n kind: RouteKind.APP_ROUTE,\n page: \"/api/logs/list/route\",\n pathname: \"/api/logs/list\",\n filename: \"route\",\n bundlePath: \"\"\n },\n distDir: process.env.__NEXT_RELATIVE_DIST_DIR || '',\n relativeProjectDir: process.env.__NEXT_RELATIVE_PROJECT_DIR || '',\n resolvedPagePath: \"[project]/mcp-server/app/api/logs/list/route.ts\",\n nextConfigOutput,\n userland\n});\n// Pull out the exports that we need to expose from the module. This should\n// be eliminated when we've moved the other routes to the new format. These\n// are used to hook into the route.\nconst { workAsyncStorage, workUnitAsyncStorage, serverHooks } = routeModule;\nfunction patchFetch() {\n return _patchFetch({\n workAsyncStorage,\n workUnitAsyncStorage\n });\n}\nexport { routeModule, workAsyncStorage, workUnitAsyncStorage, serverHooks, patchFetch, };\nexport async function handler(req, res, ctx) {\n if (routeModule.isDev) {\n addRequestMeta(req, 'devRequestTimingInternalsEnd', process.hrtime.bigint());\n }\n let srcPage = \"/api/logs/list/route\";\n // turbopack doesn't normalize `/index` in the page name\n // so we need to to process dynamic routes properly\n // TODO: fix turbopack providing differing value from webpack\n if (process.env.TURBOPACK) {\n srcPage = srcPage.replace(/\\/index$/, '') || '/';\n } else if (srcPage === '/index') {\n // we always normalize /index specifically\n srcPage = '/';\n }\n const multiZoneDraftMode = process.env.__NEXT_MULTI_ZONE_DRAFT_MODE;\n const prepareResult = await routeModule.prepare(req, res, {\n srcPage,\n multiZoneDraftMode\n });\n if (!prepareResult) {\n res.statusCode = 400;\n res.end('Bad Request');\n ctx.waitUntil == null ? void 0 : ctx.waitUntil.call(ctx, Promise.resolve());\n return null;\n }\n const { buildId, params, nextConfig, parsedUrl, isDraftMode, prerenderManifest, routerServerContext, isOnDemandRevalidate, revalidateOnlyGenerated, resolvedPathname, clientReferenceManifest, serverActionsManifest } = prepareResult;\n const normalizedSrcPage = normalizeAppPath(srcPage);\n let isIsr = Boolean(prerenderManifest.dynamicRoutes[normalizedSrcPage] || prerenderManifest.routes[resolvedPathname]);\n const render404 = async ()=>{\n // TODO: should route-module itself handle rendering the 404\n if (routerServerContext == null ? void 0 : routerServerContext.render404) {\n await routerServerContext.render404(req, res, parsedUrl, false);\n } else {\n res.end('This page could not be found');\n }\n return null;\n };\n if (isIsr && !isDraftMode) {\n const isPrerendered = Boolean(prerenderManifest.routes[resolvedPathname]);\n const prerenderInfo = prerenderManifest.dynamicRoutes[normalizedSrcPage];\n if (prerenderInfo) {\n if (prerenderInfo.fallback === false && !isPrerendered) {\n if (nextConfig.experimental.adapterPath) {\n return await render404();\n }\n throw new NoFallbackError();\n }\n }\n }\n let cacheKey = null;\n if (isIsr && !routeModule.isDev && !isDraftMode) {\n cacheKey = resolvedPathname;\n // ensure /index and / is normalized to one key\n cacheKey = cacheKey === '/index' ? '/' : cacheKey;\n }\n const supportsDynamicResponse = // If we're in development, we always support dynamic HTML\n routeModule.isDev === true || // If this is not SSG or does not have static paths, then it supports\n // dynamic HTML.\n !isIsr;\n // This is a revalidation request if the request is for a static\n // page and it is not being resumed from a postponed render and\n // it is not a dynamic RSC request then it is a revalidation\n // request.\n const isStaticGeneration = isIsr && !supportsDynamicResponse;\n // Before rendering (which initializes component tree modules), we have to\n // set the reference manifests to our global store so Server Action's\n // encryption util can access to them at the top level of the page module.\n if (serverActionsManifest && clientReferenceManifest) {\n setReferenceManifestsSingleton({\n page: srcPage,\n clientReferenceManifest,\n serverActionsManifest,\n serverModuleMap: createServerModuleMap({\n serverActionsManifest\n })\n });\n }\n const method = req.method || 'GET';\n const tracer = getTracer();\n const activeSpan = tracer.getActiveScopeSpan();\n const context = {\n params,\n prerenderManifest,\n renderOpts: {\n experimental: {\n authInterrupts: Boolean(nextConfig.experimental.authInterrupts)\n },\n cacheComponents: Boolean(nextConfig.cacheComponents),\n supportsDynamicResponse,\n incrementalCache: getRequestMeta(req, 'incrementalCache'),\n cacheLifeProfiles: nextConfig.cacheLife,\n waitUntil: ctx.waitUntil,\n onClose: (cb)=>{\n res.on('close', cb);\n },\n onAfterTaskError: undefined,\n onInstrumentationRequestError: (error, _request, errorContext)=>routeModule.onRequestError(req, error, errorContext, routerServerContext)\n },\n sharedContext: {\n buildId\n }\n };\n const nodeNextReq = new NodeNextRequest(req);\n const nodeNextRes = new NodeNextResponse(res);\n const nextReq = NextRequestAdapter.fromNodeNextRequest(nodeNextReq, signalFromNodeResponse(res));\n try {\n const invokeRouteModule = async (span)=>{\n return routeModule.handle(nextReq, context).finally(()=>{\n if (!span) return;\n span.setAttributes({\n 'http.status_code': res.statusCode,\n 'next.rsc': false\n });\n const rootSpanAttributes = tracer.getRootSpanAttributes();\n // We were unable to get attributes, probably OTEL is not enabled\n if (!rootSpanAttributes) {\n return;\n }\n if (rootSpanAttributes.get('next.span_type') !== BaseServerSpan.handleRequest) {\n console.warn(`Unexpected root span type '${rootSpanAttributes.get('next.span_type')}'. Please report this Next.js issue https://github.com/vercel/next.js`);\n return;\n }\n const route = rootSpanAttributes.get('next.route');\n if (route) {\n const name = `${method} ${route}`;\n span.setAttributes({\n 'next.route': route,\n 'http.route': route,\n 'next.span_name': name\n });\n span.updateName(name);\n } else {\n span.updateName(`${method} ${srcPage}`);\n }\n });\n };\n const isMinimalMode = Boolean(process.env.MINIMAL_MODE || getRequestMeta(req, 'minimalMode'));\n const handleResponse = async (currentSpan)=>{\n var _cacheEntry_value;\n const responseGenerator = async ({ previousCacheEntry })=>{\n try {\n if (!isMinimalMode && isOnDemandRevalidate && revalidateOnlyGenerated && !previousCacheEntry) {\n res.statusCode = 404;\n // on-demand revalidate always sets this header\n res.setHeader('x-nextjs-cache', 'REVALIDATED');\n res.end('This page could not be found');\n return null;\n }\n const response = await invokeRouteModule(currentSpan);\n req.fetchMetrics = context.renderOpts.fetchMetrics;\n let pendingWaitUntil = context.renderOpts.pendingWaitUntil;\n // Attempt using provided waitUntil if available\n // if it's not we fallback to sendResponse's handling\n if (pendingWaitUntil) {\n if (ctx.waitUntil) {\n ctx.waitUntil(pendingWaitUntil);\n pendingWaitUntil = undefined;\n }\n }\n const cacheTags = context.renderOpts.collectedTags;\n // If the request is for a static response, we can cache it so long\n // as it's not edge.\n if (isIsr) {\n const blob = await response.blob();\n // Copy the headers from the response.\n const headers = toNodeOutgoingHttpHeaders(response.headers);\n if (cacheTags) {\n headers[NEXT_CACHE_TAGS_HEADER] = cacheTags;\n }\n if (!headers['content-type'] && blob.type) {\n headers['content-type'] = blob.type;\n }\n const revalidate = typeof context.renderOpts.collectedRevalidate === 'undefined' || context.renderOpts.collectedRevalidate >= INFINITE_CACHE ? false : context.renderOpts.collectedRevalidate;\n const expire = typeof context.renderOpts.collectedExpire === 'undefined' || context.renderOpts.collectedExpire >= INFINITE_CACHE ? undefined : context.renderOpts.collectedExpire;\n // Create the cache entry for the response.\n const cacheEntry = {\n value: {\n kind: CachedRouteKind.APP_ROUTE,\n status: response.status,\n body: Buffer.from(await blob.arrayBuffer()),\n headers\n },\n cacheControl: {\n revalidate,\n expire\n }\n };\n return cacheEntry;\n } else {\n // send response without caching if not ISR\n await sendResponse(nodeNextReq, nodeNextRes, response, context.renderOpts.pendingWaitUntil);\n return null;\n }\n } catch (err) {\n // if this is a background revalidate we need to report\n // the request error here as it won't be bubbled\n if (previousCacheEntry == null ? void 0 : previousCacheEntry.isStale) {\n await routeModule.onRequestError(req, err, {\n routerKind: 'App Router',\n routePath: srcPage,\n routeType: 'route',\n revalidateReason: getRevalidateReason({\n isStaticGeneration,\n isOnDemandRevalidate\n })\n }, routerServerContext);\n }\n throw err;\n }\n };\n const cacheEntry = await routeModule.handleResponse({\n req,\n nextConfig,\n cacheKey,\n routeKind: RouteKind.APP_ROUTE,\n isFallback: false,\n prerenderManifest,\n isRoutePPREnabled: false,\n isOnDemandRevalidate,\n revalidateOnlyGenerated,\n responseGenerator,\n waitUntil: ctx.waitUntil,\n isMinimalMode\n });\n // we don't create a cacheEntry for ISR\n if (!isIsr) {\n return null;\n }\n if ((cacheEntry == null ? void 0 : (_cacheEntry_value = cacheEntry.value) == null ? void 0 : _cacheEntry_value.kind) !== CachedRouteKind.APP_ROUTE) {\n var _cacheEntry_value1;\n throw Object.defineProperty(new Error(`Invariant: app-route received invalid cache entry ${cacheEntry == null ? void 0 : (_cacheEntry_value1 = cacheEntry.value) == null ? void 0 : _cacheEntry_value1.kind}`), \"__NEXT_ERROR_CODE\", {\n value: \"E701\",\n enumerable: false,\n configurable: true\n });\n }\n if (!isMinimalMode) {\n res.setHeader('x-nextjs-cache', isOnDemandRevalidate ? 'REVALIDATED' : cacheEntry.isMiss ? 'MISS' : cacheEntry.isStale ? 'STALE' : 'HIT');\n }\n // Draft mode should never be cached\n if (isDraftMode) {\n res.setHeader('Cache-Control', 'private, no-cache, no-store, max-age=0, must-revalidate');\n }\n const headers = fromNodeOutgoingHttpHeaders(cacheEntry.value.headers);\n if (!(isMinimalMode && isIsr)) {\n headers.delete(NEXT_CACHE_TAGS_HEADER);\n }\n // If cache control is already set on the response we don't\n // override it to allow users to customize it via next.config\n if (cacheEntry.cacheControl && !res.getHeader('Cache-Control') && !headers.get('Cache-Control')) {\n headers.set('Cache-Control', getCacheControlHeader(cacheEntry.cacheControl));\n }\n await sendResponse(nodeNextReq, nodeNextRes, // @ts-expect-error - Argument of type 'Buffer<ArrayBufferLike>' is not assignable to parameter of type 'BodyInit | null | undefined'.\n new Response(cacheEntry.value.body, {\n headers,\n status: cacheEntry.value.status || 200\n }));\n return null;\n };\n // TODO: activeSpan code path is for when wrapped by\n // next-server can be removed when this is no longer used\n if (activeSpan) {\n await handleResponse(activeSpan);\n } else {\n await tracer.withPropagatedContext(req.headers, ()=>tracer.trace(BaseServerSpan.handleRequest, {\n spanName: `${method} ${srcPage}`,\n kind: SpanKind.SERVER,\n attributes: {\n 'http.method': method,\n 'http.target': req.url\n }\n }, handleResponse));\n }\n } catch (err) {\n if (!(err instanceof NoFallbackError)) {\n await routeModule.onRequestError(req, err, {\n routerKind: 'App Router',\n routePath: normalizedSrcPage,\n routeType: 'route',\n revalidateReason: getRevalidateReason({\n isStaticGeneration,\n isOnDemandRevalidate\n })\n });\n }\n // rethrow so that we can handle serving error page\n // If this is during static generation, throw the error again.\n if (isIsr) throw err;\n // Otherwise, send a 500 response.\n await sendResponse(nodeNextReq, nodeNextRes, new Response(null, {\n status: 500\n }));\n return null;\n }\n}\n\n//# sourceMappingURL=app-route.js.map\n"],"names":[],"mappings":"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","ignoreList":[2]}
1
+ {"version":3,"sources":["../../../../src/utils/log-filename.ts","../../../../mcp-server/app/api/logs/list/route.ts","../../../../node_modules/.pnpm/next%4016.0.9_%40opentelemetry%2Bapi%401.9.0_babel-plugin-react-compiler%401.0.0_react-dom%4019.3.0_fa664f6e74076e0531728f3cffad7b1f/node_modules/next/dist/esm/build/templates/app-route.js"],"sourcesContent":["/**\n * Utilities for working with dev3000 log filenames\n *\n * Log files follow the pattern: <project-name>-<timestamp>.log\n * where timestamp is ISO 8601 with special chars replaced by hyphens\n * Example: tailwindui-studio-2025-10-27T17-57-15-014Z.log\n */\n\n/**\n * Extract the project name from a log filename\n *\n * @param filename - The log filename (e.g., \"tailwindui-studio-2025-10-27T17-57-15-014Z.log\")\n * @returns The project name (e.g., \"tailwindui-studio\") or null if invalid format\n */\nexport function extractProjectNameFromLogFilename(filename: string): string | null {\n // Pattern matches: <project-name>-YYYY-MM-DDTHH-MM-SS-SSSZ.log\n // The timestamp always starts with YYYY-MM-DD which is a reliable anchor\n const timestampMatch = filename.match(/^(.+?)-(\\d{4}-\\d{2}-\\d{2}T[\\d-]+Z)\\.log$/)\n if (timestampMatch) {\n return timestampMatch[1]\n }\n\n // Also handle current log file pattern: <project-name>-d3k.log\n const d3kMatch = filename.match(/^(.+)-d3k\\.log$/)\n if (d3kMatch) {\n return d3kMatch[1]\n }\n\n return null\n}\n\n/**\n * Check if a log filename matches a given project name\n *\n * @param filename - The log filename to check\n * @param projectName - The project name to match (supports partial matching)\n * @returns true if the filename belongs to this project\n */\nexport function logFilenameMatchesProject(filename: string, projectName: string): boolean {\n const extractedName = extractProjectNameFromLogFilename(filename)\n if (!extractedName) {\n return false\n }\n\n // Support partial matching (e.g., \"studio\" matches \"tailwindui-studio\")\n return extractedName.includes(projectName)\n}\n\n/**\n * Extract the timestamp from a log filename\n *\n * @param filename - The log filename\n * @returns ISO 8601 timestamp string or null if invalid format\n */\nexport function extractTimestampFromLogFilename(filename: string): string | null {\n const match = filename.match(/^.+?-(\\d{4}-\\d{2}-\\d{2}T[\\d-]+Z)\\.log$/)\n if (match) {\n // Convert back to proper ISO format (replace hyphens with colons and dots)\n const timestamp = match[1]\n // Format: 2025-10-27T17-57-15-014Z -> 2025-10-27T17:57:15.014Z\n const isoTimestamp = timestamp.replace(/T(\\d{2})-(\\d{2})-(\\d{2})-(\\d{3})Z/, \"T$1:$2:$3.$4Z\")\n return isoTimestamp\n }\n return null\n}\n","import { extractProjectNameFromLogFilename, logFilenameMatchesProject } from \"@dev3000/src/utils/log-filename\"\nimport { existsSync, readdirSync, statSync } from \"fs\"\nimport type { NextRequest } from \"next/server\"\nimport { basename, dirname, join } from \"path\"\nimport type { LogFile, LogListError, LogListResponse } from \"@/types\"\n\nexport async function GET(_request: NextRequest): Promise<Response> {\n try {\n const currentLogPath = process.env.LOG_FILE_PATH || \"/var/log/dev3000/dev3000.log\"\n\n if (!existsSync(currentLogPath)) {\n const errorResponse: LogListError = { error: \"Current log file not found\" }\n return Response.json(errorResponse, { status: 404 })\n }\n\n // Get the directory containing the current log\n const logDir = dirname(currentLogPath)\n const currentLogName = basename(currentLogPath)\n\n // Extract project name from current log filename using shared utility\n const projectName = extractProjectNameFromLogFilename(currentLogName) || \"unknown\"\n\n // Find all log files for this project\n const files: LogFile[] = []\n\n try {\n const dirContents = readdirSync(logDir)\n const logFiles = dirContents\n .filter((file) => logFilenameMatchesProject(file, projectName))\n .map((file) => {\n const filePath = join(logDir, file)\n const stats = statSync(filePath)\n\n // Extract timestamp from filename\n const timestampMatch = file.match(/(\\d{4}-\\d{2}-\\d{2}T[\\d-]+Z)/)\n const timestamp = timestampMatch ? timestampMatch[1].replace(/-/g, \":\") : \"\"\n\n return {\n name: file,\n path: filePath,\n timestamp,\n size: stats.size,\n mtime: stats.mtime,\n isCurrent: file === currentLogName\n }\n })\n .sort((a, b) => b.mtime.getTime() - a.mtime.getTime()) // Most recent first\n .map((file) => ({\n ...file,\n mtime: file.mtime.toISOString() // Convert to string after sorting\n }))\n\n files.push(...logFiles)\n } catch (error) {\n console.warn(\"Could not read log directory:\", error)\n }\n\n const response: LogListResponse = {\n files,\n currentFile: currentLogPath,\n projectName\n }\n\n return Response.json(response)\n } catch (error) {\n const errorResponse: LogListError = {\n error: error instanceof Error ? error.message : \"Unknown error\"\n }\n return Response.json(errorResponse, { status: 500 })\n }\n}\n","import { AppRouteRouteModule } from \"next/dist/esm/server/route-modules/app-route/module.compiled\";\nimport { RouteKind } from \"next/dist/esm/server/route-kind\";\nimport { patchFetch as _patchFetch } from \"next/dist/esm/server/lib/patch-fetch\";\nimport { addRequestMeta, getRequestMeta } from \"next/dist/esm/server/request-meta\";\nimport { getTracer, SpanKind } from \"next/dist/esm/server/lib/trace/tracer\";\nimport { setReferenceManifestsSingleton } from \"next/dist/esm/server/app-render/encryption-utils\";\nimport { createServerModuleMap } from \"next/dist/esm/server/app-render/action-utils\";\nimport { normalizeAppPath } from \"next/dist/esm/shared/lib/router/utils/app-paths\";\nimport { NodeNextRequest, NodeNextResponse } from \"next/dist/esm/server/base-http/node\";\nimport { NextRequestAdapter, signalFromNodeResponse } from \"next/dist/esm/server/web/spec-extension/adapters/next-request\";\nimport { BaseServerSpan } from \"next/dist/esm/server/lib/trace/constants\";\nimport { getRevalidateReason } from \"next/dist/esm/server/instrumentation/utils\";\nimport { sendResponse } from \"next/dist/esm/server/send-response\";\nimport { fromNodeOutgoingHttpHeaders, toNodeOutgoingHttpHeaders } from \"next/dist/esm/server/web/utils\";\nimport { getCacheControlHeader } from \"next/dist/esm/server/lib/cache-control\";\nimport { INFINITE_CACHE, NEXT_CACHE_TAGS_HEADER } from \"next/dist/esm/lib/constants\";\nimport { NoFallbackError } from \"next/dist/esm/shared/lib/no-fallback-error.external\";\nimport { CachedRouteKind } from \"next/dist/esm/server/response-cache\";\nimport * as userland from \"INNER_APP_ROUTE\";\n// We inject the nextConfigOutput here so that we can use them in the route\n// module.\nconst nextConfigOutput = \"\"\nconst routeModule = new AppRouteRouteModule({\n definition: {\n kind: RouteKind.APP_ROUTE,\n page: \"/api/logs/list/route\",\n pathname: \"/api/logs/list\",\n filename: \"route\",\n bundlePath: \"\"\n },\n distDir: process.env.__NEXT_RELATIVE_DIST_DIR || '',\n relativeProjectDir: process.env.__NEXT_RELATIVE_PROJECT_DIR || '',\n resolvedPagePath: \"[project]/mcp-server/app/api/logs/list/route.ts\",\n nextConfigOutput,\n userland\n});\n// Pull out the exports that we need to expose from the module. This should\n// be eliminated when we've moved the other routes to the new format. These\n// are used to hook into the route.\nconst { workAsyncStorage, workUnitAsyncStorage, serverHooks } = routeModule;\nfunction patchFetch() {\n return _patchFetch({\n workAsyncStorage,\n workUnitAsyncStorage\n });\n}\nexport { routeModule, workAsyncStorage, workUnitAsyncStorage, serverHooks, patchFetch, };\nexport async function handler(req, res, ctx) {\n if (routeModule.isDev) {\n addRequestMeta(req, 'devRequestTimingInternalsEnd', process.hrtime.bigint());\n }\n let srcPage = \"/api/logs/list/route\";\n // turbopack doesn't normalize `/index` in the page name\n // so we need to to process dynamic routes properly\n // TODO: fix turbopack providing differing value from webpack\n if (process.env.TURBOPACK) {\n srcPage = srcPage.replace(/\\/index$/, '') || '/';\n } else if (srcPage === '/index') {\n // we always normalize /index specifically\n srcPage = '/';\n }\n const multiZoneDraftMode = process.env.__NEXT_MULTI_ZONE_DRAFT_MODE;\n const prepareResult = await routeModule.prepare(req, res, {\n srcPage,\n multiZoneDraftMode\n });\n if (!prepareResult) {\n res.statusCode = 400;\n res.end('Bad Request');\n ctx.waitUntil == null ? void 0 : ctx.waitUntil.call(ctx, Promise.resolve());\n return null;\n }\n const { buildId, params, nextConfig, parsedUrl, isDraftMode, prerenderManifest, routerServerContext, isOnDemandRevalidate, revalidateOnlyGenerated, resolvedPathname, clientReferenceManifest, serverActionsManifest } = prepareResult;\n const normalizedSrcPage = normalizeAppPath(srcPage);\n let isIsr = Boolean(prerenderManifest.dynamicRoutes[normalizedSrcPage] || prerenderManifest.routes[resolvedPathname]);\n const render404 = async ()=>{\n // TODO: should route-module itself handle rendering the 404\n if (routerServerContext == null ? void 0 : routerServerContext.render404) {\n await routerServerContext.render404(req, res, parsedUrl, false);\n } else {\n res.end('This page could not be found');\n }\n return null;\n };\n if (isIsr && !isDraftMode) {\n const isPrerendered = Boolean(prerenderManifest.routes[resolvedPathname]);\n const prerenderInfo = prerenderManifest.dynamicRoutes[normalizedSrcPage];\n if (prerenderInfo) {\n if (prerenderInfo.fallback === false && !isPrerendered) {\n if (nextConfig.experimental.adapterPath) {\n return await render404();\n }\n throw new NoFallbackError();\n }\n }\n }\n let cacheKey = null;\n if (isIsr && !routeModule.isDev && !isDraftMode) {\n cacheKey = resolvedPathname;\n // ensure /index and / is normalized to one key\n cacheKey = cacheKey === '/index' ? '/' : cacheKey;\n }\n const supportsDynamicResponse = // If we're in development, we always support dynamic HTML\n routeModule.isDev === true || // If this is not SSG or does not have static paths, then it supports\n // dynamic HTML.\n !isIsr;\n // This is a revalidation request if the request is for a static\n // page and it is not being resumed from a postponed render and\n // it is not a dynamic RSC request then it is a revalidation\n // request.\n const isStaticGeneration = isIsr && !supportsDynamicResponse;\n // Before rendering (which initializes component tree modules), we have to\n // set the reference manifests to our global store so Server Action's\n // encryption util can access to them at the top level of the page module.\n if (serverActionsManifest && clientReferenceManifest) {\n setReferenceManifestsSingleton({\n page: srcPage,\n clientReferenceManifest,\n serverActionsManifest,\n serverModuleMap: createServerModuleMap({\n serverActionsManifest\n })\n });\n }\n const method = req.method || 'GET';\n const tracer = getTracer();\n const activeSpan = tracer.getActiveScopeSpan();\n const context = {\n params,\n prerenderManifest,\n renderOpts: {\n experimental: {\n authInterrupts: Boolean(nextConfig.experimental.authInterrupts)\n },\n cacheComponents: Boolean(nextConfig.cacheComponents),\n supportsDynamicResponse,\n incrementalCache: getRequestMeta(req, 'incrementalCache'),\n cacheLifeProfiles: nextConfig.cacheLife,\n waitUntil: ctx.waitUntil,\n onClose: (cb)=>{\n res.on('close', cb);\n },\n onAfterTaskError: undefined,\n onInstrumentationRequestError: (error, _request, errorContext)=>routeModule.onRequestError(req, error, errorContext, routerServerContext)\n },\n sharedContext: {\n buildId\n }\n };\n const nodeNextReq = new NodeNextRequest(req);\n const nodeNextRes = new NodeNextResponse(res);\n const nextReq = NextRequestAdapter.fromNodeNextRequest(nodeNextReq, signalFromNodeResponse(res));\n try {\n const invokeRouteModule = async (span)=>{\n return routeModule.handle(nextReq, context).finally(()=>{\n if (!span) return;\n span.setAttributes({\n 'http.status_code': res.statusCode,\n 'next.rsc': false\n });\n const rootSpanAttributes = tracer.getRootSpanAttributes();\n // We were unable to get attributes, probably OTEL is not enabled\n if (!rootSpanAttributes) {\n return;\n }\n if (rootSpanAttributes.get('next.span_type') !== BaseServerSpan.handleRequest) {\n console.warn(`Unexpected root span type '${rootSpanAttributes.get('next.span_type')}'. Please report this Next.js issue https://github.com/vercel/next.js`);\n return;\n }\n const route = rootSpanAttributes.get('next.route');\n if (route) {\n const name = `${method} ${route}`;\n span.setAttributes({\n 'next.route': route,\n 'http.route': route,\n 'next.span_name': name\n });\n span.updateName(name);\n } else {\n span.updateName(`${method} ${srcPage}`);\n }\n });\n };\n const isMinimalMode = Boolean(process.env.MINIMAL_MODE || getRequestMeta(req, 'minimalMode'));\n const handleResponse = async (currentSpan)=>{\n var _cacheEntry_value;\n const responseGenerator = async ({ previousCacheEntry })=>{\n try {\n if (!isMinimalMode && isOnDemandRevalidate && revalidateOnlyGenerated && !previousCacheEntry) {\n res.statusCode = 404;\n // on-demand revalidate always sets this header\n res.setHeader('x-nextjs-cache', 'REVALIDATED');\n res.end('This page could not be found');\n return null;\n }\n const response = await invokeRouteModule(currentSpan);\n req.fetchMetrics = context.renderOpts.fetchMetrics;\n let pendingWaitUntil = context.renderOpts.pendingWaitUntil;\n // Attempt using provided waitUntil if available\n // if it's not we fallback to sendResponse's handling\n if (pendingWaitUntil) {\n if (ctx.waitUntil) {\n ctx.waitUntil(pendingWaitUntil);\n pendingWaitUntil = undefined;\n }\n }\n const cacheTags = context.renderOpts.collectedTags;\n // If the request is for a static response, we can cache it so long\n // as it's not edge.\n if (isIsr) {\n const blob = await response.blob();\n // Copy the headers from the response.\n const headers = toNodeOutgoingHttpHeaders(response.headers);\n if (cacheTags) {\n headers[NEXT_CACHE_TAGS_HEADER] = cacheTags;\n }\n if (!headers['content-type'] && blob.type) {\n headers['content-type'] = blob.type;\n }\n const revalidate = typeof context.renderOpts.collectedRevalidate === 'undefined' || context.renderOpts.collectedRevalidate >= INFINITE_CACHE ? false : context.renderOpts.collectedRevalidate;\n const expire = typeof context.renderOpts.collectedExpire === 'undefined' || context.renderOpts.collectedExpire >= INFINITE_CACHE ? undefined : context.renderOpts.collectedExpire;\n // Create the cache entry for the response.\n const cacheEntry = {\n value: {\n kind: CachedRouteKind.APP_ROUTE,\n status: response.status,\n body: Buffer.from(await blob.arrayBuffer()),\n headers\n },\n cacheControl: {\n revalidate,\n expire\n }\n };\n return cacheEntry;\n } else {\n // send response without caching if not ISR\n await sendResponse(nodeNextReq, nodeNextRes, response, context.renderOpts.pendingWaitUntil);\n return null;\n }\n } catch (err) {\n // if this is a background revalidate we need to report\n // the request error here as it won't be bubbled\n if (previousCacheEntry == null ? void 0 : previousCacheEntry.isStale) {\n await routeModule.onRequestError(req, err, {\n routerKind: 'App Router',\n routePath: srcPage,\n routeType: 'route',\n revalidateReason: getRevalidateReason({\n isStaticGeneration,\n isOnDemandRevalidate\n })\n }, routerServerContext);\n }\n throw err;\n }\n };\n const cacheEntry = await routeModule.handleResponse({\n req,\n nextConfig,\n cacheKey,\n routeKind: RouteKind.APP_ROUTE,\n isFallback: false,\n prerenderManifest,\n isRoutePPREnabled: false,\n isOnDemandRevalidate,\n revalidateOnlyGenerated,\n responseGenerator,\n waitUntil: ctx.waitUntil,\n isMinimalMode\n });\n // we don't create a cacheEntry for ISR\n if (!isIsr) {\n return null;\n }\n if ((cacheEntry == null ? void 0 : (_cacheEntry_value = cacheEntry.value) == null ? void 0 : _cacheEntry_value.kind) !== CachedRouteKind.APP_ROUTE) {\n var _cacheEntry_value1;\n throw Object.defineProperty(new Error(`Invariant: app-route received invalid cache entry ${cacheEntry == null ? void 0 : (_cacheEntry_value1 = cacheEntry.value) == null ? void 0 : _cacheEntry_value1.kind}`), \"__NEXT_ERROR_CODE\", {\n value: \"E701\",\n enumerable: false,\n configurable: true\n });\n }\n if (!isMinimalMode) {\n res.setHeader('x-nextjs-cache', isOnDemandRevalidate ? 'REVALIDATED' : cacheEntry.isMiss ? 'MISS' : cacheEntry.isStale ? 'STALE' : 'HIT');\n }\n // Draft mode should never be cached\n if (isDraftMode) {\n res.setHeader('Cache-Control', 'private, no-cache, no-store, max-age=0, must-revalidate');\n }\n const headers = fromNodeOutgoingHttpHeaders(cacheEntry.value.headers);\n if (!(isMinimalMode && isIsr)) {\n headers.delete(NEXT_CACHE_TAGS_HEADER);\n }\n // If cache control is already set on the response we don't\n // override it to allow users to customize it via next.config\n if (cacheEntry.cacheControl && !res.getHeader('Cache-Control') && !headers.get('Cache-Control')) {\n headers.set('Cache-Control', getCacheControlHeader(cacheEntry.cacheControl));\n }\n await sendResponse(nodeNextReq, nodeNextRes, // @ts-expect-error - Argument of type 'Buffer<ArrayBufferLike>' is not assignable to parameter of type 'BodyInit | null | undefined'.\n new Response(cacheEntry.value.body, {\n headers,\n status: cacheEntry.value.status || 200\n }));\n return null;\n };\n // TODO: activeSpan code path is for when wrapped by\n // next-server can be removed when this is no longer used\n if (activeSpan) {\n await handleResponse(activeSpan);\n } else {\n await tracer.withPropagatedContext(req.headers, ()=>tracer.trace(BaseServerSpan.handleRequest, {\n spanName: `${method} ${srcPage}`,\n kind: SpanKind.SERVER,\n attributes: {\n 'http.method': method,\n 'http.target': req.url\n }\n }, handleResponse));\n }\n } catch (err) {\n if (!(err instanceof NoFallbackError)) {\n await routeModule.onRequestError(req, err, {\n routerKind: 'App Router',\n routePath: normalizedSrcPage,\n routeType: 'route',\n revalidateReason: getRevalidateReason({\n isStaticGeneration,\n isOnDemandRevalidate\n })\n });\n }\n // rethrow so that we can handle serving error page\n // If this is during static generation, throw the error again.\n if (isIsr) throw err;\n // Otherwise, send a 500 response.\n await sendResponse(nodeNextReq, nodeNextRes, new Response(null, {\n status: 500\n }));\n return null;\n }\n}\n\n//# sourceMappingURL=app-route.js.map\n"],"names":[],"mappings":"qzBAcO,SAAS,EAAkC,CAAgB,EAGhE,IAAM,EAAiB,EAAS,KAAK,CAAC,4CACtC,GAAI,EACF,OAAO,CAAc,CAAC,EAAE,CAI1B,EALoB,EAKd,EAAW,EAAS,KAAK,CAAC,0BAChC,AAAI,EACK,CAAQ,CAAC,EAAE,CAGb,GAJO,CAKhB,CASO,SAAS,EAA0B,CAAgB,CAAE,CAAmB,EAC7E,IAAM,EAAgB,EAAkC,SACxD,CAAI,CAAC,GAKE,EAAc,QAAQ,CAAC,CALV,CAMtB,4GE9CA,IAAA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,EAAA,CAAA,CAAA,MACA,EAAA,EAAA,CAAA,CAAA,MACA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,CAAA,CAAA,MAAA,IAAA,EAAA,EAAA,CAAA,CAAA,ODjBA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,EAAA,CAAA,CAAA,OAEA,EAAA,EAAA,CAAA,CAAA,OAGO,eAAe,EAAI,CAAqB,EAC7C,GAAI,CACF,IAAM,EAAiB,QAAQ,GAAG,CAAC,aAAa,EAAI,+BAEpD,GAAI,CAAC,CAAA,EAAA,EAAA,UAAA,AAAU,EAAC,GAEd,OAAO,OAFwB,EAEf,IAAI,CAAC,AADe,CAAE,MAAO,4BAA6B,EACtC,CAAE,OAAQ,GAAI,GAIpD,IAAM,EAAS,CAAA,EAAA,EAAA,OAAA,AAAO,EAAC,GACjB,EAAiB,CAAA,EAAA,EAAA,QAAA,AAAQ,EAAC,GAG1B,EAAc,CAAA,EAAA,EAAA,iCAAiC,AAAjC,EAAkC,IAAmB,UAGnE,EAAmB,EAAE,CAE3B,GAAI,CAEF,IAAM,EADc,AACH,CADG,EAAA,EAAA,WAAA,AAAW,EAAC,GAE7B,MAAM,CAAC,AAAC,GAAS,CAAA,EAAA,EAAA,yBAAA,AAAyB,EAAC,EAAM,IACjD,GAAG,CAAC,AAAC,IACJ,IAAM,EAAW,CAAA,EAAA,EAAA,IAAA,AAAI,EAAC,EAAQ,GACxB,EAAQ,CAAA,EAAA,EAAA,QAAA,AAAQ,EAAC,GAGjB,EAAiB,EAAK,KAAK,CAAC,+BAC5B,EAAY,EAAiB,CAAc,CAAC,EAAE,CAAC,OAAO,CAAC,KAAM,KAAO,GAE1E,MAAO,CACL,KAAM,EACN,KAAM,YACN,EACA,KAAM,EAAM,IAAI,CAChB,MAAO,EAAM,KAAK,CAClB,UAAW,IAAS,CACtB,CACF,GACC,IAAI,CAAC,CAAC,EAAG,IAAM,EAAE,KAAK,CAAC,OAAO,GAAK,EAAE,KAAK,CAAC,OAAO,IAAI,AACtD,GAAG,CAAC,AAAC,GAAU,EACd,EADa,CACV,CAAI,CACP,MAAO,AAHkE,EAG7D,KAAK,CAAC,WAAW,GAAG,AAClC,CAAC,EAEH,EAAM,IAAI,IAAI,EAChB,CAAE,MAAO,EAAO,CACd,QAAQ,CAL8D,GAK1D,CAAC,gCAAiC,EAChD,CAQA,OAAO,SAAS,IAAI,CANc,AAMb,OALnB,EACA,YAAa,cACb,CACF,EAGF,CAAE,MAAO,EAAO,CACd,IAAM,EAA8B,CAClC,MAAO,aAAiB,MAAQ,EAAM,OAAO,CAAG,eAClD,EACA,OAAO,SAAS,IAAI,CAAC,EAAe,CAAE,OAAQ,GAAI,EACpD,CACF,yBCpDA,IAAA,EAAA,EAAA,CAAA,CAAA,MAIA,IAAM,EAAc,IAAI,EAAA,mBAAmB,CAAC,CACxC,WAAY,CACR,KAAM,EAAA,SAAS,CAAC,SAAS,CACzB,KAAM,uBACN,SAAU,iBACV,SAAU,QACV,WAAY,EAChB,EACA,QAAS,CAAA,OACT,IADiD,eACc,CAA3C,EACpB,iBAAkB,kDAClB,iBAZqB,GAarB,SAAA,CACJ,GAIM,kBAAE,CAAgB,sBAAE,CAAoB,aAAE,CAAW,CAAE,CAAG,EAChE,SAAS,IACL,MAAO,CAAA,EAAA,EAAA,UAAA,AAAW,EAAC,kBACf,uBACA,CACJ,EACJ,CAEO,eAAe,EAAQ,CAAG,CAAE,CAAG,CAAE,CAAG,EACnC,EAAY,KAAK,EAAE,AACnB,CAAA,EAAA,EAAA,cAAA,AAAc,EAAC,EAAK,+BAAgC,QAAQ,MAAM,CAAC,MAAM,IAE7E,IAAI,EAAU,uBAKV,EAAU,EAAQ,OAAO,CAAC,WAAY,KAAO,IAMjD,IAAM,EAAgB,MAAM,EAAY,OAAO,CAAC,EAAK,EAAK,SACtD,EACA,mBAHE,CAAA,CAIN,GACA,GAAI,CAAC,EAID,OAHA,EAAI,IADY,MACF,CAAG,IACjB,EAAI,GAAG,CAAC,eACS,MAAjB,CAAwB,CAApB,IAAyB,KAAhB,EAAoB,EAAI,SAAS,CAAC,IAAI,CAAC,EAAK,QAAQ,OAAO,IACjE,KAEX,GAAM,SAAE,CAAO,QAAE,CAAM,YAAE,CAAU,WAAE,CAAS,aAAE,CAAW,CAAE,mBAAiB,qBAAE,CAAmB,sBAAE,CAAoB,yBAAE,CAAuB,kBAAE,CAAgB,yBAAE,CAAuB,uBAAE,CAAqB,CAAE,CAAG,EACnN,EAAoB,CAAA,EAAA,EAAA,gBAAA,AAAgB,EAAC,GACvC,EAAQ,GAAQ,EAAkB,aAAa,CAAC,EAAkB,EAAI,EAAkB,MAAM,CAAC,EAAA,AAAiB,EAC9G,EAAY,WAEa,MAAvB,EAA8B,KAAK,EAAI,EAAoB,SAAA,AAAS,EAAE,AACtE,MAAM,EAAoB,SAAS,CAAC,EAAK,EAAK,GAAW,GAEzD,EAAI,GAAG,CAAC,gCAEL,MAEX,GAAI,GAAS,CAAC,EAAa,CACvB,IAAM,GAAgB,CAAQ,EAAkB,MAAM,CAAC,EAAiB,CAClE,EAAgB,EAAkB,aAAa,CAAC,EAAkB,CACxE,GAAI,IAC+B,IAA3B,EAAc,KADH,GACW,EAAc,CAAC,EAAe,CACpD,GAAI,EAAW,YAAY,CAAC,WAAW,CACnC,CADqC,MAC9B,MAAM,GAEjB,OAAM,IAAI,EAAA,eACd,AAD6B,CAGrC,CACA,IAAI,EAAW,MACX,GAAU,EAAY,IAAb,CAAkB,EAAK,EAAD,EAG/B,EAAW,AAAa,OAHqB,KAC7C,EAAW,CAAA,EAEwB,IAAM,CAAA,EAE7C,IAAM,GACgB,IAAtB,EAAY,EAAkB,GAAb,EAEjB,CAAC,EAKK,EAAqB,GAAS,CAAC,EAIjC,GAAyB,GACzB,CAAA,EAAA,EAAA,iBADkD,aAClD,AAA8B,EAAC,CAC3B,KAAM,IAbqF,sBAc3F,wBACA,EACA,gBAAiB,CAAA,EAAA,EAAA,qBAAA,AAAqB,EAAC,uBACnC,CACJ,EACJ,GAEJ,IAAM,EAAS,EAAI,MAAM,EAAI,MACvB,EAAS,CAAA,EAAA,EAAA,SAAA,AAAS,IAClB,EAAa,EAAO,kBAAkB,GACtC,EAAU,QACZ,EACA,oBACA,WAAY,CACR,aAAc,CACV,gBAAgB,CAAQ,EAAW,YAAY,CAAC,cAAc,AAClE,EACA,iBAAiB,CAAQ,EAAW,eAAe,yBACnD,EACA,iBAAkB,CAAA,EAAA,EAAA,cAAA,AAAc,EAAC,EAAK,oBACtC,kBAAmB,EAAW,SAAS,CACvC,UAAW,EAAI,SAAS,CACxB,QAAS,AAAC,IACN,EAAI,EAAE,CAAC,QAAS,EACpB,EACA,sBAAkB,EAClB,8BAA+B,CAAC,EAAO,EAAU,IAAe,EAAY,cAAc,CAAC,EAAK,EAAO,EAAc,EACzH,EACA,cAAe,SACX,CACJ,CACJ,EACM,EAAc,IAAI,EAAA,eAAe,CAAC,GAClC,EAAc,IAAI,EAAA,gBAAgB,CAAC,GACnC,EAAU,EAAA,kBAAkB,CAAC,mBAAmB,CAAC,EAAa,CAAA,EAAA,EAAA,sBAAA,AAAsB,EAAC,IAC3F,GAAI,CACA,IAAM,EAAoB,MAAO,GACtB,EAAY,MAAM,CAAC,EAAS,GAAS,OAAO,CAAC,KAChD,GAAI,CAAC,EAAM,OACX,EAAK,aAAa,CAAC,CACf,mBAAoB,EAAI,UAAU,CAClC,YAAY,CAChB,GACA,IAAM,EAAqB,EAAO,qBAAqB,GAEvD,GAAI,CAAC,EACD,OAEJ,GAAI,EAAmB,GAAG,CAAC,EAHF,kBAGwB,EAAA,cAAc,CAAC,aAAa,CAAE,YAC3E,QAAQ,IAAI,CAAC,CAAC,2BAA2B,EAAE,EAAmB,GAAG,CAAC,kBAAkB,qEAAqE,CAAC,EAG9J,IAAM,EAAQ,EAAmB,GAAG,CAAC,cACrC,GAAI,EAAO,CACP,IAAM,EAAO,CAAA,EAAG,EAAO,CAAC,EAAE,EAAA,CAAO,CACjC,EAAK,aAAa,CAAC,CACf,aAAc,EACd,aAAc,EACd,iBAAkB,CACtB,GACA,EAAK,UAAU,CAAC,EACpB,MACI,CADG,CACE,UAAU,CAAC,CAAA,EAAG,EAAO,CAAC,EAAE,EAAA,CAAS,CAE9C,GAEE,EAAgB,EAAoC,CAAA,EAAA,EAAA,CAA5B,aAA4B,AAAc,EAAC,EAAK,eACxE,EAAiB,MAAO,QACtB,EA2FI,EA1FR,IAAM,EAAoB,MAAO,oBAAE,CAAkB,CAAE,IACnD,GAAI,CACA,GAAI,CAAC,GAAiB,GAAwB,GAA2B,CAAC,EAKtE,OAJA,EAAI,SADsF,CAC5E,CAAG,IAEjB,EAAI,SAAS,CAAC,iBAAkB,eAChC,EAAI,GAAG,CAAC,gCACD,KAEX,IAAM,EAAW,MAAM,EAAkB,GACzC,EAAI,YAAY,CAAG,EAAQ,UAAU,CAAC,YAAY,CAClD,IAAI,EAAmB,EAAQ,UAAU,CAAC,gBAAgB,CAGtD,GACI,EAAI,SAAS,EAAE,CACf,CAFc,CAEV,SAAS,CAAC,GACd,OAAmB,GAG3B,IAAM,EAAY,EAAQ,UAAU,CAAC,aAAa,CAGlD,IAAI,EA6BA,OADA,MAAM,CAAA,EAAA,EAAA,YAAA,AAAY,EAAC,EAAa,EAAa,EAAU,EAAQ,UAAU,CAAC,gBAAgB,EACnF,IA7BA,EACP,IAAM,EAAO,MAAM,EAAS,IAAI,GAE1B,EAAU,CAAA,EAAA,EAAA,yBAAA,AAAyB,EAAC,EAAS,OAAO,EACtD,IACA,CAAO,CAAC,EAAA,GADG,mBACmB,CAAC,CAAG,CAAA,EAElC,CAAC,CAAO,CAAC,eAAe,EAAI,EAAK,IAAI,EAAE,CACvC,CAAO,CAAC,eAAe,CAAG,EAAK,IAAA,AAAI,EAEvC,IAAM,EAAa,AAAkD,SAA3C,EAAQ,UAAU,CAAC,mBAAmB,IAAoB,EAAQ,UAAU,CAAC,mBAAmB,EAAI,EAAA,cAAA,AAAc,GAAW,AAAR,EAAgB,UAAU,CAAC,mBAAmB,CACvL,EAAS,KAA8C,IAAvC,EAAQ,UAAU,CAAC,eAAe,EAAoB,EAAQ,UAAU,CAAC,eAAe,EAAI,EAAA,cAAc,MAAG,EAAY,EAAQ,UAAU,CAAC,eAAe,CAcjL,MAZmB,CAYZ,AAXH,MAAO,CACH,KAAM,EAAA,eAAe,CAAC,SAAS,CAC/B,OAAQ,EAAS,MAAM,CACvB,KAAM,OAAO,IAAI,CAAC,MAAM,EAAK,WAAW,IACxC,SACJ,EACA,aAAc,YACV,SACA,CACJ,CACJ,CAEJ,CAKJ,CAAE,KALS,CAKF,EAAK,CAcV,KAXI,CAAsB,QAAO,KAAK,EAAI,EAAmB,OAAA,AAAO,EAAE,CAClE,MAAM,EAAY,cAAc,CAAC,EAAK,EAAK,CACvC,WAAY,aACZ,UAAW,EACX,UAAW,QACX,iBAAkB,CAAA,EAAA,EAAA,mBAAA,AAAmB,EAAC,oBAClC,uBACA,CACJ,EACJ,EAAG,GAED,CACV,CACJ,EACM,EAAa,MAAM,EAAY,cAAc,CAAC,KAChD,aACA,WACA,EACA,UAAW,EAAA,SAAS,CAAC,SAAS,CAC9B,YAAY,oBACZ,EACA,mBAAmB,uBACnB,0BACA,oBACA,EACA,UAAW,EAAI,SAAS,eACxB,CACJ,GAEA,GAAI,CAAC,EACD,KADQ,EACD,KAEX,GAAI,CAAe,MAAd,CAAqB,EAAS,AAA0C,GAA9C,IAAK,EAAoB,EAAW,KAAA,AAAK,EAAY,KAAK,EAAI,EAAkB,IAAI,IAAM,EAAA,eAAe,CAAC,SAAS,CAE9I,CAFgJ,KAE1I,OAAO,cAAc,CAAC,AAAI,MAAM,CAAC,kDAAkD,EAAgB,MAAd,CAAqB,EAAS,AAA2C,GAA/C,IAAK,EAAqB,EAAW,KAAA,AAAK,EAAY,KAAK,EAAI,EAAmB,IAAI,CAAA,CAAE,EAAG,oBAAqB,CACjO,MAAO,OACP,YAAY,EACZ,cAAc,CAClB,EAEA,CAAC,GACD,EAAI,SAAS,CADG,AACF,iBAAkB,EAAuB,cAAgB,EAAW,MAAM,CAAG,OAAS,EAAW,OAAO,CAAG,QAAU,OAGnI,GACA,EAAI,QADS,CACA,CAAC,gBAAiB,2DAEnC,IAAM,EAAU,CAAA,EAAA,EAAA,2BAAA,AAA2B,EAAC,EAAW,KAAK,CAAC,OAAO,EAcpE,OAbM,AAAF,CAAC,EAAkB,GACnB,EADwB,AAChB,GADmB,GACb,CAAC,EAAA,sBAAsB,GAIrC,EAAW,YAAY,EAAK,EAAI,AAAL,SAAc,CAAC,kBAAqB,EAAD,AAAS,GAAG,CAAC,kBAAkB,AAC7F,EAAQ,GAAG,CAAC,gBAAiB,CAAA,EAAA,EAAA,qBAAA,AAAqB,EAAC,EAAW,YAAY,GAE9E,MAAM,CAAA,EAAA,EAAA,YAAA,AAAY,EAAC,EAAa,EAChC,IAAI,SAAS,EAAW,KAAK,CAAC,IAAI,CAAE,CAChC,UACA,OAAQ,EAAW,KAAK,CAAC,MAAM,EAAI,GACvC,IACO,IACX,EAGI,EACA,MAAM,EAAe,EADT,CAGZ,MAAM,EAAO,qBAAqB,CAAC,EAAI,OAAO,CAAE,IAAI,EAAO,KAAK,CAAC,EAAA,cAAc,CAAC,aAAa,CAAE,CACvF,SAAU,CAAA,EAAG,EAAO,CAAC,EAAE,EAAA,CAAS,CAChC,KAAM,EAAA,QAAQ,CAAC,MAAM,CACrB,WAAY,CACR,cAAe,EACf,cAAe,EAAI,GAAG,AAC1B,CACJ,EAAG,GAEf,CAAE,MAAO,EAAK,CAcV,GAbM,AAAF,CAAC,YAAgB,EAAA,eAAe,EAChC,CADmC,KAC7B,EAAY,cAAc,CAAC,EAAK,EAAK,CACvC,WAAY,aACZ,UAAW,EACX,UAAW,QACX,iBAAkB,CAAA,EAAA,EAAA,mBAAA,AAAmB,EAAC,oBAClC,uBACA,CACJ,EACJ,GAIA,EAAO,MAAM,EAKjB,OAHA,MAAM,CAAA,EAAA,EAAA,YAAA,AAAY,EAAC,EAAa,EAAa,IAAI,SAAS,KAAM,CAC5D,OAAQ,GACZ,IACO,IACX,CACJ,EAEA,qCAAqC","ignoreList":[2]}
@@ -0,0 +1,216 @@
1
+ module.exports=[56891,e=>{"use strict";var t=e.i(33405),r=e.i(22734),s=e.i(46786),n=e.i(14747),o=e.i(73169),i=e.i(60801),a=e.i(24361);e.i(69363);var c=e.i(6281),c=c;let l=(0,a.promisify)(t.exec);function u(e,t,r,s){let n=0;"build"===t?n=1e3:"server"===t?n=500:"browser"===t?n=300:"network"===t?n=200:"warning"===t&&(n=100),/CRITICAL|FATAL|crashed/i.test(e)?n*=2:/ERROR|Exception|FAIL/i.test(e)&&(n*=1.5);let o=e.replace(/\d+/g,"\\d+").substring(0,100),i=s.filter(e=>new RegExp(o).test(e)).length;i>1&&(n+=(i-1)*50),r.length>0&&(n+=50);let a=e.match(/\[(\d{2}):(\d{2}):(\d{2})\.\d{3}\]/);if(a){let e=new Date,t=new Date;t.setHours(parseInt(a[1],10)),t.setMinutes(parseInt(a[2],10)),t.setSeconds(parseInt(a[3],10)),(e.getTime()-t.getTime())/1e3/60<1&&(n+=100)}return n}async function d(e,t){try{let t=e.category.toUpperCase(),r=e.error.replace(/\[[^\]]+\]/g,"").trim().substring(0,100),s=`Fix: ${t} - ${r}`,n=`## 🐛 Bug Fix - ${e.category} Error
2
+
3
+ **Priority Score:** ${e.priorityScore} (${e.severity})
4
+
5
+ ### Error Details
6
+ \`\`\`
7
+ ${e.error}
8
+ \`\`\`
9
+
10
+ ${e.interactions.length>0?`### Reproduction Steps
11
+ The error occurred after these user interactions:
12
+ ${e.interactions.map((e,t)=>`${t+1}. ${e}`).join("\n")}
13
+
14
+ ### Verification
15
+ After implementing the fix, verify by:
16
+ 1. Replaying the same interactions using \`execute_browser_action\`
17
+ 2. Confirming the error no longer appears in logs
18
+ 3. Checking that functionality works as expected
19
+ `:""}
20
+
21
+ ### Suggested Fix
22
+ This PR addresses the ${e.severity}-level ${e.category} error detected by dev3000.
23
+
24
+ ${e.suggestedFix||"Please analyze the error and implement the appropriate fix."}
25
+
26
+ ---
27
+ 🤖 Generated with [dev3000](https://github.com/vercel-labs/dev3000) - AI-powered debugging
28
+ `,o=`fix/${e.category}-${Date.now()}`;return await l(`git checkout -b ${o}`),await l(`gh pr create --title "${s}" --body "${n}" --head ${o}`),`✅ Created PR: ${s}
29
+
30
+ Branch: ${o}
31
+
32
+ Next steps:
33
+ 1. Implement the fix in your code
34
+ 2. Commit and push changes
35
+ 3. PR is ready for review!`}catch(e){return`❌ Failed to create PR: ${e instanceof Error?e.message:String(e)}
36
+
37
+ You can manually create a PR with the error details above.`}}function p(){let e=(0,n.join)((0,s.homedir)(),".d3k");if(!(0,r.existsSync)(e))return[];try{return(0,r.readdirSync)(e).filter(e=>e.endsWith(".json")).map(t=>{let s=(0,n.join)(e,t),o=JSON.parse((0,r.readFileSync)(s,"utf-8")),i=(0,r.statSync)(s);return{...o,sessionFile:s,lastModified:i.mtime}}).filter(e=>{if(!e.pid)return!1;try{return process.kill(e.pid,0),!0}catch{return!1}}).sort((e,t)=>new Date(t.startTime).getTime()-new Date(e.startTime).getTime())}catch(e){return[]}}function h(e){if(e){let t=p().find(t=>t.projectName===e);if(t)return t.logFilePath}let t=process.env.LOG_FILE_PATH;return t||null}async function f({projectName:t,focusArea:s="all",mode:n="snapshot",waitForUserInteraction:o=!1,timeRangeMinutes:i=10,includeTimestampInstructions:a=!0,integrateNextjs:c=!1,integrateChromeDevtools:l=!1,returnRawData:f=!1,createPR:m=!1}){let{getMCPClientManager:g}=await e.A(20654),y=g().getConnectedMCPs(),v=y.includes("nextjs-dev"),w=y.includes("chrome-devtools");y.length>0&&O(`Fix My App: Connected to downstream MCPs: ${y.join(", ")}`),v&&!1===c&&(c=!0),w&&!1===l&&(l=!0);let S=await C();S&&O("Fix My App: Recommending dev3000-nextjs-dev MCP for Next.js-specific analysis");let x=h(t);if(!x){let e=p();if(0===e.length)return{content:[{type:"text",text:"❌ No active dev3000 sessions found. Make sure dev3000 is running!"}]};if(O(`fix_my_app: Found ${e.length} sessions`),1===e.length){if(x=h(t=e[0].projectName),O(`fix_my_app: Auto-selected single session: ${t}, logPath: ${x}`),!x)return{content:[{type:"text",text:`❌ Could not find log file for project "${t}". The session may not be properly initialized yet.`}]}}else{let t=e.map(e=>`• ${e.projectName} (started ${new Date(e.startTime).toLocaleString()})`).join("\n");return{content:[{type:"text",text:`🔍 Found ${e.length} dev3000 sessions. Please specify which project to fix:
38
+ ${t}
39
+
40
+ 💡 Use: projectName: "your-project-name" parameter`}]}}}let b=[];if("bisect"===n&&o){let e=new Date().toISOString();return b.push("🕐 **TIMESTAMP BISECT MODE ACTIVATED**"),b.push(`📍 Start Time: ${e}`),b.push(""),b.push("🎯 **NOW INTERACT WITH YOUR APP TO REPRODUCE THE ISSUE!**"),b.push("• Click buttons, navigate, submit forms, etc."),b.push("• Reproduce the exact error scenario"),b.push("• When done, run this tool again WITHOUT waitForUserInteraction"),b.push(""),b.push("💡 I'll analyze everything that happens between these timestamps!"),{content:[{type:"text",text:b.join("\n")}]}}try{if(!(0,r.existsSync)(x))return b.push("📋 Log file doesn't exist yet. The dev server may still be starting up."),b.push("💡 Wait a few seconds for the server to generate logs, then try again."),{content:[{type:"text",text:b.join("\n")}]};let e=(0,r.readFileSync)(x,"utf-8").trim().split("\n").filter(Boolean);if(0===e.length)return b.push("📋 Log file is empty. Make sure your app is running and generating logs."),{content:[{type:"text",text:b.join("\n")}]};b.push(`🔍 **FIX MY APP ANALYSIS** - Mode: ${n.toUpperCase()}`),b.push(`📁 Log file: ${x}`),b.push(`📊 Total log entries: ${e.length}`),b.push("");let o=new Date,h=new Date(o.getTime()-60*i*1e3),g=[/ERROR/i,/FAIL/i,/Exception/i,/CRITICAL/i,/FATAL/i,/crashed/i,/undefined/i,/null reference/i,/cannot read/i,/cannot find/i,/not found/i,/timeout/i,/refused/i,/denied/i,/unauthorized/i,/404/,/500/,/503/,/WARN/i,/WARNING/i,/deprecated/i,/slow/i,/retry/i,/RUNTIME\.ERROR/,/hydration.*mismatch/i,/Uncaught/i,/throwOnHydrationMismatch/i],y=e.filter(e=>{let t=e.match(/\[(\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\.\d{3}Z)\]/);if(t)return new Date(t[1])>=h;let r=e.match(/\[(\d{2}):(\d{2}):(\d{2})\.(\d{3})\]/);if(r){let e=new Date,t=new Date(e.getFullYear(),e.getMonth(),e.getDate(),parseInt(r[1],10),parseInt(r[2],10),parseInt(r[3],10),parseInt(r[4],10));return t>e&&t.setDate(t.getDate()-1),t>=h}return!0}),v=y.filter(e=>g.some(t=>t.test(e))),w=y.filter(e=>e.includes("react-scan")||e.includes("ReactScan")||e.includes("React render")),C={unnecessaryRenders:w.filter(e=>e.includes("unnecessary")||e.includes("re-render")||e.includes("wasted")),slowComponents:w.filter(e=>e.includes("slow")||e.includes("performance")||/\d+ms/.test(e)),totalRenders:w.filter(e=>e.includes("render")).length},$=[/link rel=preload.*must have.*valid.*as/i,/next\/font/i,/automatically generated/i,/\[NETWORK\].*\b(200|201|204|304)\b\s+(OK|Created|No Content|Not Modified)/i],T=v.filter(e=>!$.some(t=>t.test(e))),R={serverErrors:T.filter(e=>e.includes("[SERVER]")&&(e.includes("ERROR")||e.includes("Exception"))),browserErrors:T.filter(e=>e.includes("[BROWSER]")&&(e.includes("ERROR")||e.includes("CONSOLE ERROR")||e.includes("RUNTIME.ERROR"))),buildErrors:T.filter(e=>e.includes("Failed to compile")||e.includes("Type error")||e.includes("Build failed")),networkErrors:T.filter(e=>!/\b(200|201|204|304)\b/.test(e)&&(e.includes("NETWORK")||e.includes("404")||e.includes("500")||e.includes("timeout"))),warnings:T.filter(e=>/WARN|WARNING|deprecated/i.test(e)&&!/ERROR|Exception|FAIL/i.test(e))},A=T.length,N=A-R.warnings.length,I=e.filter(e=>g.some(t=>t.test(e))),P=I.length>A,k=(e,t)=>{let r=t.indexOf(e);if(-1===r)return[];let s=[];for(let e=r-1;e>=Math.max(0,r-20)&&s.length<5;e--)(t[e].includes("[INTERACTION]")||t[e].includes("[NAVIGATION]")||t[e].includes("[PAGE]"))&&s.unshift(t[e]);return s};if(0!==A||P)if(0===A&&P)b.push(`No errors in last ${i} minutes, but found ${I.length} errors in full log.`),b.push(""),b.push("Older errors (outside time range):"),I.slice(-5).forEach(t=>{let r=k(t,e);if(r.length>0)for(let e of(b.push(" Preceding interactions:"),r))b.push(` ${e}`);b.push(` - ${t}`),b.push("")}),b.push("To analyze these errors, increase timeRangeMinutes (e.g., timeRangeMinutes=60)");else{if(b.push(`**${A} ISSUES DETECTED** (${N} critical, ${R.warnings.length} warnings)`),b.push(""),b.push("**ACTION REQUIRED:** Fix the highest-priority error below, then call fix_my_app again to verify."),b.push(""),R.serverErrors.length>0&&(b.push("SERVER ERRORS:"),R.serverErrors.slice(-5).forEach(t=>{let r=k(t,e);if(r.length>0)for(let e of(b.push(" Preceding interactions:"),r))b.push(` ${e}`);b.push(` - ${t}`),b.push("")})),R.browserErrors.length>0&&(b.push("BROWSER/CONSOLE ERRORS:"),R.browserErrors.slice(-5).forEach(t=>{let r=k(t,e);if(r.length>0)for(let e of(b.push(" Preceding interactions:"),r))b.push(` ${e}`);b.push(` - ${t}`),b.push("")})),R.buildErrors.length>0&&(b.push("BUILD/COMPILATION ERRORS:"),R.buildErrors.slice(-5).forEach(t=>{let r=k(t,e);if(r.length>0)for(let e of(b.push(" Preceding interactions:"),r))b.push(` ${e}`);b.push(` - ${t}`),b.push("")})),R.networkErrors.length>0&&(b.push("NETWORK/API ERRORS:"),R.networkErrors.slice(-5).forEach(t=>{let r=k(t,e);if(r.length>0)for(let e of(b.push(" Preceding interactions:"),r))b.push(` ${e}`);b.push(` - ${t}`),b.push("")})),R.warnings.length>0&&"all"===s&&(b.push(`WARNINGS (${R.warnings.length} found, showing recent):`),b.push(R.warnings.slice(-3).join("\n")),b.push("")),b.push("---"),b.push("**NEXT: Fix the highest-priority issue, then call fix_my_app again to verify.**"),b.push(""),b.push("Keep calling fix_my_app after each fix until no errors remain."),c||l){let e=[];c&&e.push("Next.js"),l&&e.push("Chrome DevTools"),O(`Fix Analysis: Using active MCP integrations [${e.join(", ")}] for enhanced error analysis`,t),b.push(""),b.push("**Available MCP integrations:**"),c&&(b.push(""),b.push("Next.js MCP (nextjs-dev):"),(await j(v.join(" "))).forEach(e=>{let t=e.params?`(${Object.entries(e.params).map(([e,t])=>`${e}=${JSON.stringify(t)}`).join(", ")})`:"()";b.push(` • nextjs-dev.${e.function}${t}`),b.push(` Reason: ${e.reason}`)}),R.serverErrors.length>0&&b.push(" • Check Next.js build/runtime logs for SSR/hydration issues")),l&&(b.push(""),b.push("Chrome DevTools MCP (chrome-devtools):"),(await F(v.join(" "))).forEach(e=>{let t=e.params?`(${Object.entries(e.params).map(([e,t])=>`${e}=${JSON.stringify(t)}`).join(", ")})`:"()";b.push(` • chrome-devtools.${e.function}${t}`),b.push(` Reason: ${e.reason}`)}),R.browserErrors.length>0&&b.push(" • Use DOM inspection for UI issues"),R.networkErrors.length>0&&b.push(" • Inspect network requests for detailed error context"))}let r=function(e,t,r){let s=[],n=e=>{let t=r.indexOf(e);if(-1===t)return[];let s=[];for(let e=t-1;e>=Math.max(0,t-20)&&s.length<5;e--)(r[e].includes("[INTERACTION]")||r[e].includes("[NAVIGATION]")||r[e].includes("[PAGE]"))&&s.unshift(r[e]);return s};for(let r of e.buildErrors){let e=n(r);s.push({error:r,category:"build",severity:"critical",priorityScore:u(r,"build",e,t),interactions:e})}for(let r of e.serverErrors){let e=n(r),o=/CRITICAL|FATAL/i.test(r)?"critical":"error";s.push({error:r,category:"server",severity:o,priorityScore:u(r,"server",e,t),interactions:e})}for(let r of e.browserErrors){let e=n(r),o=/CRITICAL|FATAL/i.test(r)?"critical":"error";s.push({error:r,category:"browser",severity:o,priorityScore:u(r,"browser",e,t),interactions:e})}for(let r of e.networkErrors){let e=n(r);s.push({error:r,category:"network",severity:"error",priorityScore:u(r,"network",e,t),interactions:e})}if(0===s.length)for(let r of e.warnings){let e=n(r);s.push({error:r,category:"warning",severity:"warning",priorityScore:u(r,"warning",e,t),interactions:e})}return s.sort((e,t)=>t.priorityScore-e.priorityScore),s[0]||null}(R,T,e);if(r)if(b.push(""),b.push("---"),b.push("**HIGHEST PRIORITY ISSUE (fix this first):**"),b.push(`Priority Score: ${r.priorityScore}`),b.push(`Category: ${r.category.toUpperCase()}`),b.push(`Severity: ${r.severity.toUpperCase()}`),b.push(""),b.push("Error:"),b.push(` ${r.error}`),r.interactions.length>0&&(b.push(""),b.push("Reproduction steps:"),r.interactions.forEach((e,t)=>{b.push(` ${t+1}. ${e}`)})),m){b.push(""),b.push("Creating PR branch for this issue...");let e=await d(r,t||"");b.push(e)}else b.push(""),b.push("To create a PR branch for this issue, run: fix_my_app(createPR=true)")}else b.push(`No errors found in last ${i} minutes.`),b.push("Application appears healthy."),a&&"monitor"!==n&&(b.push(""),b.push("Options:"),b.push("• Use mode='bisect' to compare before/after states during testing"),b.push("• Use mode='monitor' for continuous monitoring"),b.push("• Increase timeRangeMinutes to analyze a longer period"));let L=e.filter(e=>e.includes("[SCREENSHOT]")||e.includes("Screenshot captured"));if(L.length>0&&(b.push(""),b.push(`📸 **SCREENSHOTS CAPTURED** (${L.length} total):`),L.slice(-5).forEach(e=>{let t=e.match(/Screenshot captured: (.+)$/);t&&b.push(`• ${t[1]}`)}),b.push(""),b.push("💡 **TIP**: Use analyze_visual_diff tool to compare screenshots and identify changes"),b.push(" (Advanced: screenshots are also accessible via curl if needed)")),"performance"===s||"all"===s){let e=await D(t);if(e.detections.length>0){let r=p().find(e=>e.projectName===t),s=r&&r.sessionFile.match(/"mcpPort":\s*"(\d+)"/)?.[1]||"3684",n=`http://localhost:${s}/video/${e.sessionId}`;b.push(""),e.realCLS?b.push(`🚨 **LAYOUT SHIFT DETECTED** (${e.detections.length} ${1===e.detections.length?"shift":"shifts"} during page load):`):b.push(`🚨 **LOADING JANK DETECTED** (${e.detections.length} layout ${1===e.detections.length?"shift":"shifts"} found):`);let o="navigation"===e.captureTrigger?"Navigation complete":"load"===e.captureTrigger?"Load complete":"View all frames";b.push(`📹 **${o}**: ${n}`),b.push(`🎞️ **Session ID**: ${e.sessionId} (${e.totalFrames} frames)`),b.push(""),e.detections.forEach(e=>{let t="high"===e.severity?"🔴":"medium"===e.severity?"🟡":"🟢";if(e.uxImpact?(b.push(`${t} **${e.timeSinceStart}ms** - ${e.element}`),b.push(` ${e.uxImpact}`)):b.push(`${t} **${e.timeSinceStart}ms**: ${e.visualDiff.toFixed(1)}% of screen changed (${e.severity} severity)`),e.beforeFrameUrl&&e.afterFrameUrl&&(b.push(` 📸 Before: ${e.beforeFrameUrl}`),b.push(` 📸 After: ${e.afterFrameUrl}`),b.push(` 💡 Use analyze_visual_diff tool with these URLs to get a detailed description of what changed`),e.element)){let t=e.element.match(/<(\w+)>/);if(t){let e=t[1].toLowerCase();b.push(` 💡 Use find_component_source tool with selector "${e}" to locate the source code`)}}}),b.push(""),e.detections.some(e=>"high"===e.severity)&&e.realCLS&&(b.push("🎯 **WHY DEV3000 CAUGHT THIS BUT CHROME MIGHT NOT:**"),b.push("• dev3000's PerformanceObserver is installed immediately at page load and buffers ALL shifts from the start"),b.push("• Chrome DevTools performance trace may start AFTER initial load, missing early navigation shifts"),b.push("• Our UX-focused detection flags critical element shifts (nav/header) even when CLS score is technically 'good'"),b.push("")),b.push("✅ **DEV3000'S CLS DETECTION IS AUTHORITATIVE**"),b.push("If Chrome DevTools reports CLS: 0.00 but dev3000 detected shifts, TRUST DEV3000."),b.push("• Chrome DevTools trace may start AFTER the shifts occurred"),b.push("• dev3000's PerformanceObserver captures ALL shifts from page start"),b.push("• CLS: 0.00 in Chrome just means the trace missed the early shifts"),b.push(""),b.push("💡 **LAYOUT SHIFT DEBUGGING TIPS:**"),b.push("• Add explicit width/height to images and media"),b.push("• Reserve space for dynamic content (ads, embeds, etc.)"),b.push("• Avoid inserting content above existing content"),b.push("• Use CSS aspect-ratio for responsive elements"),b.push("• Check for web fonts causing text reflow (font-display: swap)"),b.push(`• Raw screenshots: ${e.screenshotDir}`),b.push(""),b.push("📸 **ANALYZING SCREENSHOTS:**"),b.push("• RECOMMENDED: Use analyze_visual_diff tool with before/after URLs (shown above)"),b.push("• The tool provides structured instructions for comparing frames"),b.push("• Advanced: Screenshots are also accessible via curl if needed"),b.push(""),b.push(`🎬 **IMPORTANT**: Share this frame sequence link with the user: ${n}`)}}if((C.totalRenders>0||"performance"===s||"all"===s)&&(C.unnecessaryRenders.length>0||C.slowComponents.length>0)&&(b.push(""),b.push("⚛️ **REACT PERFORMANCE ANALYSIS (react-scan):**"),C.unnecessaryRenders.length>0&&(b.push(`🔄 **Unnecessary Re-renders Detected (${C.unnecessaryRenders.length}):**`),C.unnecessaryRenders.slice(-5).forEach(e=>{b.push(`• ${e}`)}),b.push("")),C.slowComponents.length>0&&(b.push(`🐌 **Slow Components Found (${C.slowComponents.length}):**`),C.slowComponents.slice(-5).forEach(e=>{b.push(`• ${e}`)}),b.push("")),b.push("💡 **REACT OPTIMIZATION TIPS:**"),b.push("• Use React.memo() for components with expensive renders"),b.push("• Use useMemo/useCallback to prevent unnecessary re-renders"),b.push("• Check for unstable prop references (objects/arrays created in render)"),b.push("• Consider using React DevTools Profiler for deeper analysis")),0===A&&"all"===s){let t=e.filter(e=>e.includes("took")&&e.includes("ms"));t.length>0&&(b.push(""),b.push("⚡ **PERFORMANCE INSIGHTS:**"),t.slice(-5).forEach(e=>{b.push(`• ${e}`)}))}if(f){let r;O(`Structured Output: Returning structured data for Claude orchestration with ${A} errors and ${c||l?"active":"no"} integrations`,t);let n=v.map(t=>{let r=k(t,e),s=R.serverErrors.includes(t)?"server":R.browserErrors.includes(t)?"browser":R.buildErrors.includes(t)?"build":R.networkErrors.includes(t)?"network":R.warnings.includes(t)?"warning":"general",n=R.warnings.includes(t)?"warning":t.includes("CRITICAL")||t.includes("FATAL")||t.includes("crashed")?"critical":"error",o=t.match(/\[(\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\.\d{3}Z)\]/)||t.match(/\[(\d{2}:\d{2}:\d{2}\.\d{3})\]/);return{timestamp:o?o[1]:new Date().toISOString(),category:s,message:t,interactions:r,severity:n}}),o=[];n.forEach(e=>{("hydration"===e.category||e.message.includes("hydration"))&&o.push({file:"pages/_app.js or components/[component].tsx",description:"Fix hydration mismatch",code:`// Ensure server and client render the same content
41
+ // Use useEffect for client-only logic
42
+ useEffect(() => {
43
+ // Client-only code here
44
+ }, [])`,reason:"Hydration errors occur when server and client render different content"}),(e.message.includes("TypeError")||e.message.includes("undefined"))&&o.push({file:"Identify from stack trace in error message",description:"Add null/undefined checks",code:`// Add defensive programming checks
45
+ if (data && data.property) {
46
+ // Safe to use data.property
47
+ }
48
+ // Or use optional chaining
49
+ const value = data?.property?.nestedProperty`,reason:"Prevent TypeError by checking for undefined/null values"}),(e.message.includes("404")||e.message.includes("not found"))&&o.push({file:"routing configuration or API endpoints",description:"Fix missing route or resource",code:`// Check route configuration
50
+ // Ensure API endpoint exists
51
+ // Verify file paths are correct`,reason:"404 errors indicate missing resources or incorrect paths"})});let i={};c&&(i.nextjs=await j(v.join(" "))),l&&(i.chrome=await F(v.join(" "))),(c||l)&&(r={phase1:{name:"Data Collection",description:"Parallel data gathering across all available MCPs",actions:[{mcp:"dev3000",function:"fix_my_app",params:{focusArea:s,integrateNextjs:c,integrateChromeDevtools:l,returnRawData:!0},reason:"Get comprehensive error analysis with interaction data"}],estimatedTime:"2-3 minutes"},phase2:{name:"Deep Analysis",description:"Cross-MCP correlation and targeted investigation",actions:[{mcp:"dev3000",function:"fix_my_app",params:{mode:"bisect"},reason:"Regression analysis if needed"}],estimatedTime:"3-5 minutes"},phase3:{name:"Fix & Verify",description:"Implementation and verification across all layers",actions:[{mcp:"dev3000",function:"execute_browser_action",reason:"Replay interactions to verify fixes"}],estimatedTime:"5-10 minutes"}},c&&i.nextjs&&(r.phase1.actions.push(...i.nextjs.filter(e=>"high"===e.priority).map(e=>({mcp:"nextjs-dev",function:e.function,params:e.params,reason:e.reason}))),r.phase3.actions.push({mcp:"nextjs-dev",function:"check_build_status",reason:"Verify build success after fixes"})),l&&i.chrome&&r.phase1.actions.push(...i.chrome.filter(e=>"high"===e.priority).map(e=>({mcp:"chrome-devtools",function:e.function,params:e.params,reason:e.reason}))));let a={errors:n,fixes:o,suggestedIntegrations:i,workflowPlan:r,summary:{totalErrors:A,criticalErrors:N,hasIntegrations:c||l,estimatedFixTime:M(A,c||l)}};return{content:[{type:"text",text:JSON.stringify(a,null,2)}]}}let U=await E("profile_performance");return(S||U)&&(b.push(""),b.push("🔗 **AUGMENTED ANALYSIS AVAILABLE**"),b.push(""),b.push("dev3000 provided the core log analysis above. For deeper insights, consider also gathering:"),b.push(""),S&&(b.push("**Next.js Framework Analysis:**"),(await j(v.join(" "))).slice(0,3).forEach(e=>{b.push(`• \`dev3000-nextjs-dev:${e.function}()\` - ${e.reason}`)}),b.push("")),U&&(b.push("**Browser-Side Analysis:**"),(await F(v.join(" "))).slice(0,3).forEach(e=>{b.push(`• \`dev3000-chrome-devtools:${e.function}()\` - ${e.reason}`)}),b.push("")),b.push("💡 **Best approach:** Use dev3000's log analysis as your foundation, then gather specific additional data as needed for a complete picture.")),{content:[{type:"text",text:b.join("\n")}]}}catch(e){return{content:[{type:"text",text:`Error analyzing logs: ${e instanceof Error?e.message:String(e)}`}]}}}let m=new Map,g={chrome:["inspect","debug","profile","performance","console","devtools","breakpoint","intercept","storage","memory","trace"],nextjs:["build","hydration","ssr","routing","analyze","debug","render","middleware","optimization"]},y=["screenshot","navigate","click","type","scroll","evaluate","simple_script","get_logs","basic_build_status","simple_error_check"];async function v(e){let t=m.get(e);if(t&&Date.now()-t.timestamp<3e5)return O(`Capability Discovery: Using cached capabilities for ${e} (${t.capabilities.length} functions)`),t.capabilities;O(`Capability Discovery: Fetching fresh capabilities for ${e}`);try{let t=await w(e);if(t.length>0)return m.set(e,{timestamp:Date.now(),capabilities:t}),O(`Capability Discovery: Successfully discovered ${t.length} capabilities for ${e}`),t;let r=await x(e);return m.set(e,{timestamp:Date.now(),capabilities:r}),O(`Capability Discovery: Using fallback inference for ${e} (${r.length} functions)`),r}catch(t){return O(`Capability Discovery: Failed to discover capabilities for ${e} - ${t}`),[]}}async function w(t){try{let s=`/Users/${process.env.USER}/Library/Caches/claude-cli-nodejs`,{readdirSync:n,existsSync:o,readFileSync:i}=await e.A(23970);if(!o(s))return[];let a=n(s).find(e=>e.includes(process.cwd().replace(/\//g,"-")));if(!a)return[];let c=`${s}/${a}/mcp-logs-${t}`;if(!o(c))return[];let l=n(c),u=[];for(let e of l.slice(-5))try{let r=`${c}/${e}`,s=i(r,"utf8"),n=function(e,t){let r=[],s=t.includes("chrome")?"chrome":t.includes("nextjs")?"nextjs":"chrome",n=g[s];for(let t of[/"name":\s*"([^"]+)"/g,/(\w+)\s*\([^)]*\)/g,/tool:\s*(\w+)/g,/unknown function[:\s]+(\w+)/gi,/exports\.(\w+)/g]){let o=t.exec(e);for(;null!==o;){let i=o[1];if(y.some(e=>i.toLowerCase().includes(e))){o=t.exec(e);continue}let a=n.some(e=>i.toLowerCase().includes(e)),c=S(i,s,a);r.push({function:i,description:void 0,category:a?"advanced":"basic",reason:c}),o=t.exec(e)}}return r}(s,t);u.push(...n)}catch(e){}var r=u;let d=new Map;for(let e of r){let t=d.get(e.function);(!t||e.description&&!t.description||e.reason.length>t.reason.length)&&d.set(e.function,e)}return Array.from(d.values())}catch(e){return O(`MCP Introspection: Failed to introspect ${t} - ${e}`),[]}}function S(e,t,r){let s=e.toLowerCase();if("chrome"===t){if(s.includes("inspect"))return"Deep DOM inspection with DevTools-level detail";if(s.includes("console"))return"Direct browser console access and manipulation";if(s.includes("debug")||s.includes("breakpoint"))return"JavaScript debugging with breakpoints and call stack";if(s.includes("profile")||s.includes("performance"))return"Advanced performance profiling and analysis";if(s.includes("network")||s.includes("request"))return"Network request interception and analysis";if(s.includes("storage"))return"Browser storage manipulation (cookies, localStorage, etc.)";if(s.includes("trace")||s.includes("memory"))return"Memory usage and execution tracing"}if("nextjs"===t){if(s.includes("build"))return"Advanced Next.js build system analysis";if(s.includes("hydration"))return"Client-server hydration debugging and analysis";if(s.includes("ssr")||s.includes("render"))return"Server-side rendering debugging";if(s.includes("route")||s.includes("routing"))return"Next.js routing system inspection and debugging";if(s.includes("middleware"))return"Next.js middleware analysis and debugging";if(s.includes("optimization")||s.includes("performance"))return"Next.js-specific performance optimization"}return r?`Advanced ${t} capability beyond dev3000's basic automation`:`${t} capability for specialized analysis`}async function x(e){let t=e.includes("chrome")?"chrome":e.includes("nextjs")?"nextjs":"unknown",r=[];if("chrome"===t)for(let e of["inspect_element","access_console","start_performance_profile","intercept_requests","set_breakpoint","take_screenshot","get_dom_snapshot","modify_storage","execute_script"])r.push({function:e,category:y.includes(e)?"basic":"advanced",reason:S(e,t,!0)});if("nextjs"===t)for(let e of["analyze_build_process","debug_server_rendering","debug_hydration","inspect_routing","analyze_next_performance","get_build_info","check_build_status","get_server_logs"])r.push({function:e,category:y.includes(e)?"basic":"advanced",reason:S(e,t,!0)});return O(`Capability Inference: Generated ${r.length} inferred capabilities for ${e}`),r}async function E(e){try{if(!(await I()).includes("dev3000-chrome-devtools"))return!1;if(!e)return!0;return(await v("dev3000-chrome-devtools")).some(t=>t.function.toLowerCase().includes(e.toLowerCase())||"advanced"===t.category)}catch(e){return O(`Chrome DevTools delegation check failed: ${e}`),!1}}async function C(){try{if(!(await I()).includes("dev3000-nextjs-dev"))return!1;return(await v("dev3000-nextjs-dev")).some(e=>"advanced"===e.category)}catch(e){return O(`NextJS delegation check failed: ${e}`),!1}}async function b(e,t){let r=(await v("dev3000-chrome-devtools")).find(t=>t.function.toLowerCase().includes(e.toLowerCase())||t.description?.toLowerCase().includes(e.toLowerCase()));if(!r)throw Error(`Action ${e} cannot be delegated to chrome-devtools`);return{content:[{type:"text",text:`🔗 **ADVANCED BROWSER DEBUGGING AVAILABLE**
52
+
53
+ For advanced debugging capabilities, use the \`dev3000-chrome-devtools\` MCP:
54
+
55
+ \`\`\`
56
+ dev3000-chrome-devtools:${r.function}(${JSON.stringify(t,null,2)})
57
+ \`\`\`
58
+
59
+ 🎯 **Why use chrome-devtools for this:** ${r.reason}
60
+
61
+ 💡 **When to use each tool:**
62
+ • **dev3000**: Basic browser automation (screenshots, navigation, clicks, simple scripts)
63
+ • **dev3000-chrome-devtools**: Advanced debugging (DOM inspection, breakpoints, performance profiling, network interception)
64
+
65
+ ⚡ **Both tools share the same Chrome instance** - no conflicts or duplicate browsers`}]}}async function $({action:e,params:t={}}){try{if(await E(e))return O(`Browser Action Delegation: Routing '${e}' to chrome-devtools MCP`),await b(e,t);O(`Browser Action Fallback: Using dev3000's execute_browser_action for '${e}'`);let s=p();if(0===s.length)return{content:[{type:"text",text:"❌ No active dev3000 sessions found. Make sure dev3000 is running with a browser!"}]};let n=JSON.parse((0,r.readFileSync)(s[0].sessionFile,"utf-8")),o=n.cdpUrl;if(!o)try{let e=await fetch("http://localhost:9222/json"),t=(await e.json()).find(e=>"page"===e.type&&!e.url.startsWith("chrome://"));t&&(o=t.webSocketDebuggerUrl,O(`CDP Discovery: Found fallback CDP URL ${o}`,s[0].projectName))}catch(e){O(`CDP Discovery: Failed to find fallback CDP URL - ${e}`,s[0].projectName)}if(!o)return{content:[{type:"text",text:`❌ No Chrome DevTools Protocol URL found. Make sure dev3000 is running with browser monitoring enabled (not --servers-only mode). Session CDP URL: ${n.cdpUrl||"null"}`}]};let i=await new Promise((r,s)=>{let n=new c.default(o),i=setTimeout(()=>{n.close(),s(Error(`Browser action '${e}' timed out after 60 seconds. This may indicate an issue with the browser or invalid parameters.`))},6e4);n.on("open",async()=>{try{n.send(JSON.stringify({id:1,method:"Target.getTargets",params:{}}));let a=null,c=2;async function o(e,t,r,s){return new Promise((n,o)=>{let i=r=>{let s=JSON.parse(r.toString());s.id===t&&(e.removeListener("message",i),s.error?o(Error(s.error.message)):n(s.result))};e.on("message",i),e.send(JSON.stringify({id:t,method:r,params:s})),setTimeout(()=>{e.removeListener("message",i),o(Error(`CDP command timeout after 30s: ${r}`))},3e4)})}n.on("message",async l=>{try{let u=JSON.parse(l.toString());if(1===u.id){if(u.error){clearTimeout(i),n.close(),s(Error(`Browser protocol error: ${u.error.message||JSON.stringify(u.error)}. This may occur in sandboxed browser environments where certain CDP commands are restricted.`));return}let e=u.result?.targetInfos?.find(e=>"page"===e.type);if(!e){clearTimeout(i),n.close(),s(Error("No page targets found"));return}a=e.targetId,n.send(JSON.stringify({id:c++,method:"Target.attachToTarget",params:{targetId:a,flatten:!0}}));return}if("Target.attachedToTarget"===u.method){let s;switch(u.params.sessionId,e){case"click":{let e,r;if("string"==typeof t.selector){let s=await o(n,c++,"Runtime.evaluate",{expression:`(() => {
66
+ const el = document.querySelector(${JSON.stringify(t.selector)});
67
+ if (!el) return { found: false };
68
+ const rect = el.getBoundingClientRect();
69
+ // Calculate center point, rounding to avoid fractional pixels
70
+ const centerX = Math.round(rect.left + rect.width / 2);
71
+ const centerY = Math.round(rect.top + rect.height / 2);
72
+ // Verify what element is at this point
73
+ const elementAtPoint = document.elementFromPoint(centerX, centerY);
74
+ const isCorrectElement = elementAtPoint === el || el.contains(elementAtPoint);
75
+ return {
76
+ found: true,
77
+ x: centerX,
78
+ y: centerY,
79
+ width: rect.width,
80
+ height: rect.height,
81
+ elementAtPoint: elementAtPoint?.tagName + (elementAtPoint?.className ? '.' + elementAtPoint.className : ''),
82
+ isCorrectElement: isCorrectElement
83
+ };
84
+ })()`,returnByValue:!0});if(s.result?.value?.found===!0&&"number"==typeof s.result.value.x&&"number"==typeof s.result.value.y)e=s.result.value.x,r=s.result.value.y,!1===s.result.value.isCorrectElement&&console.warn(`[execute_browser_action] Warning: Center point (${e}, ${r}) is over ${s.result.value.elementAtPoint}, not the target element. This may cause unexpected click behavior. Element size: ${s.result.value.width}x${s.result.value.height}`);else throw Error(`Element not found for selector: ${t.selector}`)}else if("number"==typeof t.x&&"number"==typeof t.y)e=t.x,r=t.y;else throw Error("Click action requires either {x, y} coordinates or a {selector} CSS selector");s=await o(n,c++,"Input.dispatchMouseEvent",{type:"mousePressed",x:e,y:r,button:"left",clickCount:1}),await o(n,c++,"Input.dispatchMouseEvent",{type:"mouseReleased",x:e,y:r,button:"left",clickCount:1});break}case"navigate":if("string"!=typeof t.url)throw Error("Navigate action requires url parameter as string");s=await o(n,c++,"Page.navigate",{url:t.url});break;case"reload":s=await o(n,c++,"Page.reload",{});break;case"screenshot":n.close(),r({warning:"Screenshot action is not recommended!",advice:"Dev3000 automatically captures screenshots during interactions. Instead of manual screenshots, use click/navigate/scroll/type actions to reproduce user workflows, and dev3000 will capture screenshots at optimal times.",suggestion:"Run fix_my_app to see all auto-captured screenshots from your session."});return;case"evaluate":{if("string"!=typeof t.expression)throw Error("Evaluate action requires expression parameter as string");let e=t.expression;if([/eval\s*\(/,/Function\s*\(/,/setTimeout/,/setInterval/,/\.innerHTML\s*=/,/\.outerHTML\s*=/,/document\.write/,/document\.cookie\s*=/,/localStorage\.setItem/,/sessionStorage\.setItem/,/\.src\s*=/,/\.href\s*=/,/location\s*=/,/\.addEventListener/,/\.removeEventListener/,/new\s+Function/,/import\s*\(/,/fetch\s*\(/,/XMLHttpRequest/].some(t=>t.test(e)))throw Error("Expression contains dangerous patterns. Only safe read-only expressions allowed.");s=await o(n,c++,"Runtime.evaluate",{expression:e,returnByValue:!0});break}case"scroll":{let e="number"==typeof t.deltaX?t.deltaX:0,r="number"==typeof t.deltaY?t.deltaY:0;s=await o(n,c++,"Input.dispatchMouseEvent",{type:"mouseWheel",x:"number"==typeof t.x?t.x:500,y:"number"==typeof t.y?t.y:500,deltaX:e,deltaY:r});break}case"type":if("string"!=typeof t.text)throw Error("Type action requires text parameter as string");for(let e of t.text)await o(n,c++,"Input.dispatchKeyEvent",{type:"char",text:e});s={action:"type",text:t.text};break;default:throw Error(`Unsupported action: ${e}`)}n.close(),clearTimeout(i),r(s)}}catch(e){n.close(),clearTimeout(i),s(e instanceof Error?e:Error(`Browser action failed: ${e instanceof Error?e.message:String(e)}`))}}),n.on("error",e=>{clearTimeout(i),s(e)})}catch(e){n.close(),clearTimeout(i),s(e)}}),n.on("error",e=>{clearTimeout(i),s(e)})}),a=`Browser action '${e}' executed successfully. Result: ${JSON.stringify(i,null,2)}`;return await E("inspect_element")&&(a+="\n\n🔗 **ENHANCED BROWSER ANALYSIS AVAILABLE**\n\ndev3000 completed the basic browser action above. For deeper browser insights, consider also:",(await F(e)).filter(t=>{let r=t.function.toLowerCase(),s=e.toLowerCase();return!!("screenshot"===s&&(r.includes("inspect")||r.includes("performance"))||"evaluate"===s&&(r.includes("console")||r.includes("inspect"))||"navigate"===s&&(r.includes("network")||r.includes("performance"))||"click"===s&&(r.includes("console")||r.includes("inspect")))||"high"===t.priority}).slice(0,2).forEach(e=>{a+=`
85
+ • \`dev3000-chrome-devtools:${e.function}()\` - ${e.reason}`}),a+="\n\n💡 **Augmented approach:** Use dev3000 for basic automation, chrome-devtools for detailed analysis and debugging."),{content:[{type:"text",text:a}]}}catch(e){return{content:[{type:"text",text:`Browser action failed: ${e instanceof Error?e.message:String(e)}`}]}}}let T={"nextjs-dev":["nextjs-dev","nextjs-dev-mcp","@modelcontextprotocol/server-nextjs-dev","mcp-server-nextjs-dev","nextjs-mcp"],"chrome-devtools":["chrome-devtools","chrome-devtools-mcp","@modelcontextprotocol/server-chrome-devtools","mcp-server-chrome-devtools","chrome-mcp"]},R={"nextjs-dev":[3001,3002,8080,8081],"chrome-devtools":[9222,9223,9224,3003]};async function A(){let e=[];try{process.platform;let{stdout:t}=await l("ps aux"),r=t.toLowerCase();for(let[t,s]of Object.entries(T))for(let n of s)if(r.includes(n.toLowerCase())){e.includes(t)||(e.push(t),O(`MCP Discovery: Found ${t} MCP via process detection [${n}]`));break}}catch(e){O(`MCP Discovery: Process detection failed - ${e instanceof Error?e.message:String(e)}`)}return e}async function N(){let e=[];for(let[t,r]of Object.entries(R))for(let s of r)try{if((await fetch(`http://localhost:${s}/health`,{method:"GET",signal:AbortSignal.timeout(2e3)})).ok){e.push(t),O(`MCP Discovery: Found ${t} MCP via HTTP ping on port ${s}`);break}}catch{try{let r=new c.default(`ws://localhost:${s}`);await new Promise((n,o)=>{let i=setTimeout(()=>{r.close(),o(Error("timeout"))},1e3);r.on("open",()=>{clearTimeout(i),r.close(),e.push(t),O(`MCP Discovery: Found ${t} MCP via WebSocket ping on port ${s}`),n(null)}),r.on("error",()=>{clearTimeout(i),o(Error("connection failed"))})});break}catch{}}return e}async function I(t){O("MCP Discovery: Starting proactive MCP discovery",t);let r=new Set;for(let e of(await A()))r.add(e);try{let s=`/Users/${process.env.USER}/Library/Caches/claude-cli-nodejs`,{readdirSync:n,existsSync:o}=await e.A(23970);if(o(s)){let e=n(s).find(e=>e.includes(process.cwd().replace(/\//g,"-")));if(e){let i=`${s}/${e}`,a=`${i}/mcp-logs-dev3000-chrome-devtools`;o(a)&&n(a).length>0&&(r.add("dev3000-chrome-devtools"),O("MCP Discovery: Found dev3000-chrome-devtools via Claude cache logs",t));let c=`${i}/mcp-logs-dev3000-nextjs-dev`;o(c)&&n(c).length>0&&(r.add("dev3000-nextjs-dev"),O("MCP Discovery: Found dev3000-nextjs-dev via Claude cache logs",t))}}}catch(e){O("MCP Discovery: Claude cache check failed, falling back to port detection",t)}if(0===r.size)for(let e of(O("MCP Discovery: No MCPs found via process or cache detection, trying port pinging",t),await N()))r.add(e);let s=Array.from(r);return s.length>0?O(`MCP Discovery: Successfully discovered MCPs [${s.join(", ")}]`,t):O("MCP Discovery: No MCPs detected - will run in standalone mode",t),s}async function P({mcpName:e}={}){let t=[];t.push("🔍 **MCP CAPABILITY INSPECTOR**"),t.push("");try{let r=await I();if(0===r.length)return t.push("❌ **NO MCPs DETECTED**"),t.push("No dev3000-chrome-devtools or dev3000-nextjs-dev MCPs found."),t.push(""),t.push("💡 **To enable enhanced capabilities:**"),t.push("• Ensure Chrome DevTools MCP is configured: `dev3000-chrome-devtools`"),t.push("• Ensure Next.js Dev MCP is configured: `dev3000-nextjs-dev`"),t.push("• Check that Claude Code has MCPs properly configured"),{content:[{type:"text",text:t.join("\n")}]};t.push(`✅ **DISCOVERED MCPs:** ${r.join(", ")}`),t.push("");let s=e?r.filter(t=>t.includes(e)):r;if(0===s.length&&e)return t.push(`❌ **MCP NOT FOUND:** ${e}`),t.push(`Available MCPs: ${r.join(", ")}`),{content:[{type:"text",text:t.join("\n")}]};for(let e of s){t.push(`📋 **${e.toUpperCase()} CAPABILITIES:**`),t.push("");let r=await v(e);if(0===r.length){t.push(" ❌ No capabilities discovered"),t.push(" 💡 This might indicate the MCP is not properly configured or accessible"),t.push("");continue}let s=r.filter(e=>"advanced"===e.category),n=r.filter(e=>"basic"===e.category);t.push(` 🚀 **ADVANCED CAPABILITIES** (${s.length} functions):`),s.length>0?s.forEach(e=>{t.push(` • \`${e.function}()\` - ${e.reason}`)}):t.push(" No advanced capabilities discovered"),t.push(""),t.push(` ⚙️ **BASIC CAPABILITIES** (${n.length} functions):`),n.length>0?n.forEach(e=>{t.push(` • \`${e.function}()\` - ${e.reason}`)}):t.push(" No basic capabilities discovered"),t.push("");let o=m.get(e);if(o){let e=Date.now()-o.timestamp,r=Math.floor(e/6e4);t.push(` 📝 **CACHE INFO:** Discovered ${r} minutes ago`),e>24e4&&t.push(" ⚠️ Cache will refresh soon on next use")}t.push("")}let n=s.reduce(async(e,t)=>{let r=await e,s=await v(t);return r+s.length},Promise.resolve(0));return t.push("🎯 **AUGMENTED DELEGATION STATUS:**"),t.push(`• Total discovered capabilities: ${await n}`),t.push(`• MCPs with advanced capabilities: ${s.filter(async e=>(await v(e)).some(e=>"advanced"===e.category)).length}`),t.push("• Dynamic discovery: ✅ Active (updates automatically)"),t.push("• Cache TTL: 5 minutes"),t.push(""),t.push("💡 **These capabilities are automatically suggested in dev3000's enhanced responses!**"),{content:[{type:"text",text:t.join("\n")}]}}catch(e){return t.push(`❌ **ERROR INSPECTING CAPABILITIES:** ${e instanceof Error?e.message:String(e)}`),t.push(""),t.push("💡 **Troubleshooting:**"),t.push("• Check that MCPs are properly configured in Claude Code"),t.push("• Verify dev3000 can access Claude cache directories"),{content:[{type:"text",text:t.join("\n")}]}}}async function D(e){let t,a,c=process.env.SCREENSHOT_DIR||(0,n.join)((0,s.tmpdir)(),"dev3000-mcp-deps","public","screenshots");if(!(0,r.existsSync)(c))return{detections:[],sessionId:"",totalFrames:0,screenshotDir:c};let l=(0,r.readdirSync)(c).filter(e=>e.includes("-jank-")&&e.endsWith(".png")).sort().reverse();if(0===l.length)return{detections:[],sessionId:"",totalFrames:0,screenshotDir:c};let u=l[0].split("-jank-")[0],d=l.filter(e=>e.startsWith(u)).sort((e,t)=>parseInt(e.match(/-(\d+)ms\.png$/)?.[1]||"0",10)-parseInt(t.match(/-(\d+)ms\.png$/)?.[1]||"0",10));if(d.length<2)return{detections:[],sessionId:u,totalFrames:d.length,screenshotDir:c};let p=(0,n.join)(c,`${u}-metadata.json`);if((0,r.existsSync)(p))try{let e=JSON.parse((0,r.readFileSync)(p,"utf-8"));a=e.captureTrigger,void 0!==e.layoutShifts&&(t={score:e.totalCLS||0,grade:e.clsGrade||"unknown",shifts:e.layoutShifts})}catch{}let f=[],m=new Map;try{let t=h(e);if(t&&(0,r.existsSync)(t)){let e=(0,r.readFileSync)(t,"utf-8").split("\n");for(let t=0;t<e.length;t++){let r=e[t].match(/\[CDP\] CLS #\d+ \(score: [\d.]+, time: (\d+)ms\):/);if(r){let s=parseInt(r[1],10),n=null,o=null;for(let r=t+1;r<Math.min(t+10,e.length);r++){if(!n){let t=e[r].match(/Before:\s+(http:\/\/\S+)/);t&&(n=t[1])}if(!o){let t=e[r].match(/After:\s+(http:\/\/\S+)/);t&&(o=t[1])}if(n&&o){m.set(s,{before:n,after:o});break}}}}}}catch(e){}if(t){if(0===t.shifts.length){let e=d.filter(e=>{let t=e.match(/-(\d+)ms\.png$/);return(t?parseInt(t[1],10):0)<1500}),s=!1;for(let t=1;t<e.length&&t<10;t++){let o=(0,n.join)(c,e[t-1]),a=(0,n.join)(c,e[t]);try{let n=i.PNG.sync.read((0,r.readFileSync)(o)),c=i.PNG.sync.read((0,r.readFileSync)(a));if(n.width!==c.width||n.height!==c.height)continue;let l=function(e,t){let r=e.width,s=e.height,n=Array(s).fill(0);for(let o=0;o<s;o++)for(let s=0;s<r;s++){let i=r*o+s<<2,a=Math.abs(e.data[i]-t.data[i]),c=Math.abs(e.data[i+1]-t.data[i+1]),l=Math.abs(e.data[i+2]-t.data[i+2]);(a>30||c>30||l>30)&&n[o]++}let o=n.map(e=>e/r*100),i=0,a=0;for(let e=0;e<s;e++)o[e]>50?i=Math.max(i,++a):a=0;let c=0;for(let e=5;e<s-5;e++){let t=o.slice(e-5,e).reduce((e,t)=>e+t,0)/5,r=o[e],s=o.slice(e+1,e+5+1).reduce((e,t)=>e+t,0)/5;t<10&&r>60&&s<10&&c++}let l=0;for(let e=0;e<s;e++)o[e]>5&&o[e]<25&&l++;let u=l>.3*s,d=Math.floor(s/8),p=Array(8).fill(0);for(let e=0;e<s;e++){let t=Math.min(Math.floor(e/d),7);p[t]+=n[e]}let h=r*d,f=p.map(e=>e/h*100),m=(f[0]+f[1])/2,g=(f[6]+f[7])/2,y=f.reduce((e,t)=>e+t,0)/f.length,v=f.reduce((e,t)=>e+(t-y)**2,0)/f.length,w=i>20,S=c>=3,x=u||S&&!w&&(v>500||y<10),E=!x&&(w||m>5&&g<2&&m>2*g||v<200&&y>10),C=p.reduce((e,t)=>e+t,0),b=r*s;return{isLayoutShift:E,shiftScore:C/b*.1,isOverlayNoise:x}}(n,c);if(l.isOverlayNoise){O(`Pixel Diff Hydration: Skipping frame ${t} - detected overlay noise (fixed/absolute elements), not true CLS`);continue}if(l.isLayoutShift){s=!0;let r=e[t].match(/-(\d+)ms\.png$/),n=r?parseInt(r[1],10):0;O(`Pixel Diff Hydration: Detected true layout shift at ${n}ms (score: ${l.shiftScore.toFixed(4)})`);let o=process.env.MCP_PORT||"3684";f.push({timestamp:`${n}ms`,timeSinceStart:n,visualDiff:100*l.shiftScore,severity:"high",element:"Hydration-related element",clsScore:l.shiftScore,uxImpact:"🚨 CRITICAL: Fast hydration shift detected - Chrome's observer missed this early shift",beforeFrameUrl:`http://localhost:${o}/api/screenshots/${e[t-1]}`,afterFrameUrl:`http://localhost:${o}/api/screenshots/${e[t]}`})}}catch{}}return s?{detections:f,sessionId:u,totalFrames:d.length,screenshotDir:c,realCLS:{score:.05,grade:"good"}}:{detections:[],sessionId:u,totalFrames:d.length,screenshotDir:c,realCLS:{score:0,grade:t.grade}}}return t.shifts.forEach(e=>{let t=e.sources?.[0]?.node||"unknown",r=e.sources?.[0]?.position;if(!e.sources?.[0]||"unknown"===t||null==r)return void O(`Chrome CLS: Skipping unidentified shift (score: ${e.score.toFixed(4)}) - cannot verify if it's a true CLS or fixed overlay noise`);if("fixed"===r||"absolute"===r)return void O(`Chrome CLS: Filtering out ${t} shift (position: ${r}) - fixed/absolute elements don't cause true layout shifts`);let s=["NAV","HEADER","BUTTON","A"].includes(t.toUpperCase()),n=e.timestamp<1e3,o={NAV:"Navigation header (<nav>)",HEADER:"Page header (<header>)",BUTTON:"Button (<button>)",A:"Link (<a>)"}[t.toUpperCase()]||t,i="low",a="Minor visual adjustment";s&&n?(i="high",a=`🚨 CRITICAL: ${o} shifted during initial load - highly visible and disruptive to user interaction`):s?(i="medium",a=`⚠️ ${o} shifted - affects navigation/interaction`):n&&(i="medium",a="Shift during page load - may cause mis-clicks");let c=Math.round(e.timestamp),l=m.get(c);f.push({timestamp:`${e.timestamp.toFixed(0)}ms`,timeSinceStart:c,visualDiff:100*e.score,severity:i,element:o,clsScore:e.score,uxImpact:a,beforeFrameUrl:l?.before,afterFrameUrl:l?.after})}),{detections:f,sessionId:u,totalFrames:d.length,screenshotDir:c,realCLS:{score:t.score,grade:t.grade}}}for(let e=1;e<d.length;e++){let t=(0,n.join)(c,d[e-1]),s=(0,n.join)(c,d[e]);try{let n=i.PNG.sync.read((0,r.readFileSync)(t)),a=i.PNG.sync.read((0,r.readFileSync)(s));if(n.width!==a.width||n.height!==a.height)continue;let c=new i.PNG({width:n.width,height:n.height}),l=(0,o.default)(n.data,a.data,c.data,n.width,n.height,{threshold:.1}),p=n.width*n.height,h=l/p*100;if(h>1){let t=d[e].match(/-(\d+)ms\.png$/),r=t?parseInt(t[1],10):0;f.push({timestamp:u,timeSinceStart:r,visualDiff:h,severity:h>10?"high":h>5?"medium":"low"})}}catch{}}return{detections:f,sessionId:u,totalFrames:d.length,screenshotDir:c,captureTrigger:a}}function O(e,t){try{let s=process.env.HOME||process.env.USERPROFILE;if(!s)return;let o=(0,n.join)(s,".d3k","logs");(0,r.existsSync)(o)||(0,r.mkdirSync)(o,{recursive:!0});let i=t||function(){try{let e=process.env.HOME||process.env.USERPROFILE;if(!e)return null;let t=(0,n.join)(e,".d3k");if(!(0,r.existsSync)(t))return null;let s=(0,r.readdirSync)(t).filter(e=>e.endsWith(".json"));if(0===s.length)return null;let o=(0,n.join)(t,s[0]);return JSON.parse((0,r.readFileSync)(o,"utf8")).projectName||null}catch{return null}}();if(!i)return;let a=(0,n.join)(o,`dev3000-${i}-d3k.log`),c=new Date().toISOString(),l=`[${c}] [D3K] ${e}
86
+ `;(0,r.appendFileSync)(a,l)}catch(e){}}function k(e,t){let r=e.includes("nextjs-dev"),s=e.includes("chrome-devtools");if(e.length>0){O(`MCP Detection: Available MCPs [${e.join(", ")}]`,t);let n=[];r&&n.push("Next.js"),s&&n.push("Chrome DevTools"),n.length>0?O(`MCP Integration: Activated integrations [${n.join(", ")}]`,t):O("MCP Integration: No compatible MCPs detected - running in standalone mode",t)}else O("MCP Detection: No MCPs provided - running in standalone mode",t);return{integrateNextjs:r,integrateChromeDevtools:s}}function M(e,t){let r=Math.ceil(Math.min(2*e,20)*(t?.5:1));return r<=5||r<=60?`${r} minutes`:`${Math.ceil(r/60)} hours`}async function j(e){try{let t=await v("dev3000-nextjs-dev"),r=t.filter(e=>"advanced"===e.category).slice(0,8).map(t=>({function:t.function,reason:t.reason,priority:L(t.function,e)}));return O(`Dynamic Suggestions: Generated ${r.length} Next.js suggestions from ${t.length} discovered capabilities`),r}catch(e){return O(`Dynamic Suggestions: Failed to generate Next.js suggestions - ${e}`),[{function:"analyze_build_process",reason:"Advanced Next.js build system analysis",priority:"high"},{function:"debug_server_rendering",reason:"Server-side rendering debugging",priority:"high"}]}}async function F(e){try{let t=await v("dev3000-chrome-devtools"),r=t.filter(e=>"advanced"===e.category).slice(0,8).map(t=>({function:t.function,reason:t.reason,priority:L(t.function,e)}));return O(`Dynamic Suggestions: Generated ${r.length} Chrome DevTools suggestions from ${t.length} discovered capabilities`),r}catch(e){return O(`Dynamic Suggestions: Failed to generate Chrome DevTools suggestions - ${e}`),[{function:"inspect_element",reason:"Deep DOM inspection with DevTools-level detail",priority:"high"},{function:"access_console",reason:"Direct browser console access and manipulation",priority:"high"}]}}function L(e,t){let r=e.toLowerCase(),s=t?.toLowerCase()||"";for(let{pattern:e,keywords:t}of[{pattern:/hydration/,keywords:["hydration","ssr","render"]},{pattern:/build|compile/,keywords:["build","compile","analyze"]},{pattern:/network|fetch|api/,keywords:["network","request","intercept","performance"]},{pattern:/console|error/,keywords:["console","error","debug"]},{pattern:/click|interaction/,keywords:["dom","element","inspect"]}])if(e.test(s)&&t.some(e=>r.includes(e)))return"high";return["debug","profile","analyze","trace","inspect"].some(e=>r.includes(e))?"medium":"low"}async function U({availableMcps:e,focusArea:t="all",errorContext:r}){let s=[];O(`Workflow Creation: Creating integrated workflow with focus area [${t}]${r?`, error context [${r}]`:""}`);let n=e||[];e&&0!==e.length||(O("Workflow Creation: No MCPs provided, starting proactive discovery"),n=await I());let{integrateNextjs:o,integrateChromeDevtools:i}=k(n);s.push("🎼 **INTELLIGENT DEBUGGING ORCHESTRATOR**"),s.push(`🔍 Available MCPs: ${n.length>0?n.join(", "):"none (will attempt discovery)"}`),s.push(`⚡ Integrations: ${o?"✅ Next.js":"❌ Next.js"} | ${i?"✅ Chrome DevTools":"❌ Chrome DevTools"}`),r&&s.push(`🎯 Error Context: ${r}`),s.push("");let a=o?await j(r):[],c=i?await F(r):[];if(!o&&!i)return s.push("⚠️ **NO INTEGRATIONS DETECTED**"),s.push("Running in standalone mode. For enhanced debugging:"),s.push("• Add 'nextjs-dev' MCP for Next.js-specific analysis"),s.push("• Add 'chrome-devtools' MCP for browser inspection"),s.push(""),s.push("💡 **STANDALONE WORKFLOW:**"),s.push("1. Use fix_my_app(mode='snapshot') to analyze current issues"),s.push("2. Use execute_browser_action to reproduce and verify fixes"),s.push("3. Implement suggested code fixes"),{content:[{type:"text",text:s.join("\n")}]};s.push("🎪 **3-PHASE INTEGRATED WORKFLOW**"),s.push(""),s.push("🕐 **PHASE 1: PARALLEL DATA COLLECTION** (2-3 minutes)"),s.push("Execute these functions in parallel across all available MCPs:"),s.push(""),s.push("📊 **dev3000 (this MCP):**"),s.push(`• fix_my_app(focusArea='${t}', integrateNextjs=${o}, integrateChromeDevtools=${i}, returnRawData=true)`),s.push(" → Get comprehensive error analysis with interaction data"),s.push(""),o&&(s.push("⚛️ **nextjs-dev MCP:**"),a.filter(e=>"high"===e.priority).forEach(e=>{let t=e.params?`(${Object.entries(e.params).map(([e,t])=>`${e}=${JSON.stringify(t)}`).join(", ")})`:"()";s.push(`• ${e.function}${t}`),s.push(` → ${e.reason}`)}),s.push("")),i&&(s.push("🌐 **chrome-devtools MCP:**"),c.filter(e=>"high"===e.priority).forEach(e=>{let t=e.params?`(${Object.entries(e.params).map(([e,t])=>`${e}=${JSON.stringify(t)}`).join(", ")})`:"()";s.push(`• ${e.function}${t}`),s.push(` → ${e.reason}`)}),s.push("")),s.push("🕑 **PHASE 2: DEEP TARGETED ANALYSIS** (3-5 minutes)"),s.push("Based on Phase 1 findings, execute these functions sequentially:"),s.push(""),s.push("🔗 **Cross-MCP Correlation:**"),s.push("• Compare dev3000 interaction data with browser console errors"),o&&(s.push("• Correlate dev3000 server errors with Next.js build/runtime logs"),s.push("• Match interaction timestamps with Next.js request handling")),s.push("• Identify root cause by combining all data sources"),s.push(""),s.push("🎯 **Targeted Deep Dive:**"),s.push("• Use fix_my_app(mode='bisect') for regression analysis if needed"),i&&c.filter(e=>"medium"===e.priority).forEach(e=>{let t=e.params?`(${Object.entries(e.params).map(([e,t])=>`${e}=${JSON.stringify(t)}`).join(", ")})`:"()";s.push(`• ${e.function}${t} - ${e.reason}`)}),s.push(""),s.push("🕒 **PHASE 3: FIX IMPLEMENTATION & VERIFICATION** (5-10 minutes)"),s.push("Orchestrated fix implementation with cross-MCP verification:"),s.push(""),s.push("🔧 **Implementation:**"),s.push("• Apply code fixes identified by dev3000 error analysis"),o&&s.push("• Address Next.js-specific issues (hydration, build, etc.)"),s.push("• Use dev3000's interaction data to create comprehensive test scenarios"),s.push(""),s.push("✅ **Verification Workflow:**"),s.push("• Use execute_browser_action to replay exact user interactions that caused errors"),i&&(s.push("• Use chrome-devtools to monitor console for error resolution"),s.push("• Take before/after screenshots to verify UI fixes")),o&&s.push("• Use nextjs-dev to verify build success and runtime stability"),s.push("• Re-run fix_my_app to confirm error resolution"),s.push(""),s.push("🚀 **INTEGRATION BENEFITS:**"),o&&i?(s.push("🎯 **Triple-Stack Coverage:**"),s.push("• dev3000: AI-powered error correlation + interaction replay"),s.push("• nextjs-dev: Framework-specific server-side analysis"),s.push("• chrome-devtools: Precise browser state inspection"),s.push("• Combined: Complete full-stack debugging with 90%+ issue resolution"),s.push(""),s.push("⚡ **Expected Results:**"),s.push("• 3x faster debugging vs using tools individually"),s.push("• AI-powered error correlation across all layers"),s.push("• Systematic fix verification workflow"),s.push("• Comprehensive interaction-based testing")):o?(s.push("🎯 **Server-Side Enhanced Coverage:**"),s.push("• dev3000: Client error analysis + interaction data"),s.push("• nextjs-dev: Server-side logs and build analysis"),s.push("• Combined: Full-stack Next.js debugging coverage")):i&&(s.push("🎯 **Browser-Enhanced Coverage:**"),s.push("• dev3000: Error detection + interaction replay"),s.push("• chrome-devtools: Detailed browser state inspection"),s.push("• Combined: Complete client-side debugging workflow"));let l=M(5,o||i);return s.push(""),s.push(`⏱️ **ESTIMATED TOTAL TIME:** ${l}`),s.push(`🎼 **dev3000 orchestrates ${n.length} MCPs for maximum debugging power!**`),{content:[{type:"text",text:s.join("\n")}]}}async function _(e){let{beforeImageUrl:t,afterImageUrl:r,context:s}=e,n=[];return n.push("🔍 **VISUAL DIFF ANALYSIS**"),n.push(""),n.push("To analyze the visual differences between these two screenshots:"),n.push(""),n.push("**Step 1: Fetch and analyze the BEFORE image**"),n.push(`Use WebFetch with URL: \`${t}\``),n.push('Prompt: "Describe this screenshot in detail, focusing on layout and visible elements"'),n.push(""),n.push("**Step 2: Fetch and analyze the AFTER image**"),n.push(`Use WebFetch with URL: \`${r}\``),n.push('Prompt: "Describe this screenshot in detail, focusing on layout and visible elements"'),n.push(""),n.push("**Step 3: Compare and describe the differences**"),s?n.push(`Focus on: ${s}`):(n.push("Look for:"),n.push("• Elements that appeared or disappeared"),n.push("• Elements that moved or changed position"),n.push("• Elements that changed size or style"),n.push("• New content that pushed existing content")),n.push(""),n.push("**Step 4: Identify the layout shift cause**"),n.push("Describe what visual change occurred that caused the layout shift."),n.push("Be specific about:"),n.push("• Which element(s) changed"),n.push("• What appeared/moved/resized"),n.push("• Why this caused other elements to shift"),{content:[{type:"text",text:n.join("\n")}]}}async function B(e){let{selector:t}=e;try{let e=p();if(0===e.length)return{content:[{type:"text",text:"❌ **NO ACTIVE SESSIONS**\n\nNo active dev3000 sessions found. Make sure your app is running with dev3000."}]};let s=JSON.parse((0,r.readFileSync)(e[0].sessionFile,"utf-8")).cdpUrl;if(!s)try{let e=await fetch("http://localhost:9222/json"),t=(await e.json()).find(e=>"page"===e.type&&!e.url.startsWith("chrome://"));t&&(s=t.webSocketDebuggerUrl)}catch{return{content:[{type:"text",text:"❌ **NO CDP CONNECTION**\n\nFailed to find Chrome DevTools Protocol URL."}]}}if(!s)return{content:[{type:"text",text:"❌ **NO CDP CONNECTION**\n\nNo Chrome DevTools Protocol URL found."}]};let n=`
87
+ (function() {
88
+ try {
89
+ const element = document.querySelector(${JSON.stringify(t)});
90
+ if (!element) {
91
+ return { error: "Element not found with selector: ${t}" };
92
+ }
93
+
94
+ // Try to find React Fiber
95
+ const fiberKey = Object.keys(element).find(k => k.startsWith("__reactFiber$"));
96
+ if (!fiberKey) {
97
+ return { error: "No React internals found - element may not be a React component" };
98
+ }
99
+
100
+ const fiber = element[fiberKey];
101
+ let componentFunction = null;
102
+ let componentName = "Unknown";
103
+
104
+ // Walk up the fiber tree to find a function component
105
+ let current = fiber;
106
+ let depth = 0;
107
+
108
+ while (current && depth < 10) {
109
+ if (typeof current.type === 'function') {
110
+ componentFunction = current.type;
111
+ componentName = current.type.name || current.type.displayName || "Anonymous";
112
+ break;
113
+ }
114
+ current = current.return;
115
+ depth++;
116
+ }
117
+
118
+ if (!componentFunction) {
119
+ return { error: "Could not find component function in fiber tree" };
120
+ }
121
+
122
+ // Get the source code
123
+ const sourceCode = componentFunction.toString();
124
+
125
+ return {
126
+ success: true,
127
+ componentName,
128
+ sourceCode
129
+ };
130
+ } catch (error) {
131
+ return { error: error.message };
132
+ }
133
+ })()
134
+ `,o=await new Promise((e,t)=>{let r=new c.default(s),o=null,i=!1,a=setTimeout(()=>{i||(i=!0,r.close(),t(Error("CDP evaluation timeout after 5 seconds")))},5e3);r.on("open",async()=>{try{r.send(JSON.stringify({id:1,method:"Target.getTargets",params:{}}));let s=2;r.on("message",async c=>{let l=JSON.parse(c.toString());if(1===l.id){if(l.error){clearTimeout(a),i=!0,r.close(),t(Error(`Browser protocol error: ${l.error.message||JSON.stringify(l.error)}. This may occur in sandboxed browser environments where certain CDP commands are restricted.`));return}let e=l.result?.targetInfos?.find(e=>"page"===e.type);if(!e){clearTimeout(a),i=!0,r.close(),t(Error("No page targets found"));return}r.send(JSON.stringify({id:s++,method:"Target.attachToTarget",params:{targetId:e.targetId,flatten:!0}}));return}if("Target.attachedToTarget"===l.method){o=s++,r.send(JSON.stringify({id:o,method:"Runtime.evaluate",params:{expression:n,returnByValue:!0}}));return}if(null!==o&&l.id===o)if(clearTimeout(a),i=!0,r.close(),l.error)t(Error(l.error.message));else{let t=l.result?.result?.value;e(t)}}),r.on("error",e=>{clearTimeout(a),i||(i=!0,t(e))})}catch(e){clearTimeout(a),i=!0,r.close(),t(e)}}),r.on("error",e=>{clearTimeout(a),i||(i=!0,t(e))})});if("error"in o)return{content:[{type:"text",text:`❌ **ERROR EXTRACTING COMPONENT**
135
+
136
+ ${o.error}
137
+
138
+ 💡 **TIPS:**
139
+ • Make sure the selector matches an element on the page
140
+ • Ensure the element is rendered by a React component
141
+ • Try a simpler selector like 'nav' or '.header'`}]};if(!o.success)return{content:[{type:"text",text:"❌ **FAILED TO EXTRACT COMPONENT**\n\nUnexpected result format."}]};let{componentName:i,sourceCode:a}=o,l=[],u=/<([A-Z][a-zA-Z0-9]*)/g,d=new Set,h=u.exec(a);for(;null!==h;)d.add(h[1]),h=u.exec(a);let f=/className=["']([^"']+)["']/g,m=new Set,g=f.exec(a);for(;null!==g;)m.add(g[1]),g=f.exec(a);let y=[];if(y.push("🔍 **COMPONENT SOURCE FINDER**"),y.push(""),y.push(`**Selector:** \`${t}\``),y.push(`**Component:** ${i}`),y.push(""),"Anonymous"!==i&&(l.push(`function ${i}`),l.push(`const ${i} =`),l.push(`export default function ${i}`)),d.size>0){let e=Array.from(d).filter(e=>!["Fragment","Suspense","ErrorBoundary"].includes(e));e.length>0&&l.push(`<${e[0]}`)}if(m.size>0){let e=Array.from(m)[0];l.push(`className="${e}"`)}if(0===l.length)y.push("⚠️ **NO UNIQUE PATTERNS FOUND**"),y.push(""),y.push("The component source code doesn't contain distinctive patterns to search for."),y.push("You may need to manually search for the component.");else{for(let e of(y.push("📍 **SEARCH PATTERNS**"),y.push(""),y.push("Use these grep patterns to find the source file:"),y.push(""),l.slice(0,3)))y.push("```"),y.push(`grep -r "${e.replace(/"/g,'\\"')}" .`),y.push("```"),y.push("");y.push("💡 **TIP:** Start with the first pattern. If it returns multiple results, try combining patterns.")}let v=a.substring(0,300);return y.push(""),y.push("**Source Code Preview:**"),y.push("```javascript"),y.push(`${v}...`),y.push("```"),{content:[{type:"text",text:y.join("\n")}]}}catch(e){return{content:[{type:"text",text:`❌ **ERROR**
142
+
143
+ ${e instanceof Error?e.message:String(e)}`}]}}}async function G(e){let{projectName:s}=e;try{let e=p();if(0===e.length)return{content:[{type:"text",text:"❌ **NO ACTIVE SESSIONS**\n\nNo active dev3000 sessions found. Make sure your app is running with dev3000."}]};let n=e[0];if(s){let t=e.find(e=>e.projectName===s);t&&(n=t)}let o=JSON.parse((0,r.readFileSync)(n.sessionFile,"utf-8")),i=o.appPort,a=o.serverCommand,c=o.cwd;if(!i)return{content:[{type:"text",text:"❌ **NO APP PORT FOUND**\n\nSession file doesn't contain app port information."}]};if(!a)return{content:[{type:"text",text:"❌ **NO SERVER COMMAND FOUND**\n\nSession file doesn't contain the original server command. This session may have been created with an older version of dev3000."}]};O(`Restart Dev Server: Starting restart for project [${n.projectName}] on port ${i} with command [${a}]`);let u=(await I(n.projectName)).includes("nextjs-dev");if(O(`Restart Dev Server: Has nextjs-dev MCP: ${u}`),u)try{O("Restart Dev Server: Attempting to use nextjs-dev MCP restart");let e=await P({mcpName:"nextjs-dev"}),t=e.content[0]&&"text"in e.content[0]?e.content[0].text:"";if(t.includes("restart")||t.includes("reload"))return O("Restart Dev Server: nextjs-dev MCP has restart capability, delegating"),{content:[{type:"text",text:"✅ **DELEGATING TO NEXTJS-DEV MCP**\n\nThe nextjs-dev MCP has restart capabilities. Please use the nextjs-dev MCP restart tool directly for better integration with Next.js."}]};O("Restart Dev Server: nextjs-dev MCP doesn't have restart capability, falling back")}catch(e){O(`Restart Dev Server: Failed to check nextjs-dev capabilities - ${e}`)}if(O("Restart Dev Server: Using dev3000 restart mechanism"),"1"===process.env.VERCEL_SANDBOX||"1"===process.env.VERCEL||(0,r.existsSync)("/.dockerenv")||(0,r.existsSync)("/run/.containerenv"))return O("Restart Dev Server: Skipping lsof-based kill in sandbox environment"),{content:[{type:"text",text:`⚠️ **RESTART NOT SUPPORTED IN SANDBOX**
144
+
145
+ Dev server restart is not supported in sandbox environments (Vercel Sandbox, Docker containers).
146
+
147
+ The \`lsof\` utility needed for process management is not available.
148
+
149
+ 💡 If running in Vercel Sandbox, the dev server is managed by the sandbox infrastructure.`}]};let d=`lsof -ti :${i} | xargs kill 2>/dev/null || true`;O(`Restart Dev Server: Executing kill command: ${d}`);try{await l(d),O("Restart Dev Server: Kill command executed successfully")}catch(e){O(`Restart Dev Server: Kill command failed (may be ok) - ${e}`)}await new Promise(e=>setTimeout(e,2e3));let h=`lsof -ti :${i}`,f=!1;try{let{stdout:e}=await l(h);f=""===e.trim(),O(`Restart Dev Server: Port check result - free: ${f}`)}catch{f=!0,O("Restart Dev Server: Port is free (lsof returned no results)")}if(!f)return{content:[{type:"text",text:`⚠️ **PORT STILL IN USE**
150
+
151
+ Failed to free port ${i}. There may be a process that couldn't be killed.
152
+
153
+ Try manually killing the process:
154
+ \`\`\`bash
155
+ lsof -ti :${i} | xargs kill -9
156
+ \`\`\``}]};O("Restart Dev Server: Port is now free, spawning new server process");try{let e=(0,t.spawn)(a,{stdio:"inherit",shell:!0,detached:!0,cwd:c||process.cwd()});e.unref(),O(`Restart Dev Server: Spawned new server process with PID ${e.pid}`),await new Promise(e=>setTimeout(e,1e3));try{let{stdout:t}=await l(`lsof -ti :${i}`);if(""!==t.trim())return O("Restart Dev Server: Server successfully restarted and running on port"),{content:[{type:"text",text:`✅ **DEV SERVER RESTARTED**
157
+
158
+ Successfully restarted the development server on port ${i}.
159
+
160
+ 🎯 **STATUS:**
161
+ • Old server process: Killed
162
+ • New server process: Running (PID ${e.pid})
163
+ • Port ${i}: Active
164
+ • Browser monitoring: Unchanged
165
+ • Logs: Still being captured
166
+
167
+ 💡 The server has been restarted while keeping dev3000's monitoring, screenshots, and logging intact.`}]};O("Restart Dev Server: Server process spawned but not yet listening on port (may still be starting)")}catch{O("Restart Dev Server: Server process spawned but not yet listening on port (may still be starting)")}return{content:[{type:"text",text:`🔄 **DEV SERVER RESTARTING**
168
+
169
+ Started a new server process (PID ${e.pid}).
170
+
171
+ ⏳ **STATUS:**
172
+ • Old server: Killed
173
+ • New server: Starting (may take a few moments)
174
+ • Command: \`${a}\`
175
+ • Port: ${i}
176
+
177
+ The server is restarting. Check the dev3000 logs to see when it's ready.`}]}}catch(e){return O(`Restart Dev Server: Failed to spawn new server process - ${e}`),{content:[{type:"text",text:`❌ **RESTART FAILED**
178
+
179
+ Failed to start new server process.
180
+
181
+ **Error:** ${e instanceof Error?e.message:String(e)}
182
+
183
+ **Command:** \`${a}\`
184
+
185
+ The old server was killed but the new one failed to start. You may need to manually restart dev3000.`}]}}}catch(e){return O(`Restart Dev Server: Error - ${e}`),{content:[{type:"text",text:`❌ **ERROR**
186
+
187
+ ${e instanceof Error?e.message:String(e)}`}]}}}async function V(e){let{depth:t=1,limit:s=3,projectName:n}=e;try{let e=p(),o=n?e.find(e=>e.projectName===n):e[0];if(!o)return{content:[{type:"text",text:n?`❌ No active session found for project "${n}". Available projects: ${e.map(e=>e.projectName).join(", ")||"none"}`:"❌ No active dev3000 sessions found. Start dev3000 first with `d3k` in your project directory."}]};let i=JSON.parse((0,r.readFileSync)(o.sessionFile,"utf-8")),a=i.cdpUrl?.replace("http://","ws://"),l=i.appPort||"3000",u=`http://localhost:${l}`;if(!a)return{content:[{type:"text",text:"❌ No Chrome DevTools connection found. Browser monitoring must be active to crawl."}]};O(`Crawl App: Starting crawl at depth ${t} with limit ${s} for ${u}`);let d=new c.default(a);await new Promise((e,t)=>{d.on("open",e),d.on("error",t),setTimeout(()=>t(Error("CDP connection timeout")),5e3)});let h=2e3,f=(e,t={})=>new Promise((r,s)=>{let n=h++,o=JSON.stringify({id:n,method:e,params:t}),i=e=>{let t=JSON.parse(e.toString());t.id===n&&(d.off("message",i),t.error?s(Error(t.error.message)):r(t.result))};d.on("message",i),d.send(o),setTimeout(()=>{d.off("message",i),s(Error("Command timeout"))},1e4)});await f("Runtime.enable"),await f("Page.enable");let m=new Set([u]),g=new Set,y=[u],v=0,w="all"===t?1/0:t;for(;y.length>0&&v<=w;){let e=[...y];for(let t of(y.length=0,O(`Crawl App: Processing depth ${v} with ${e.length} URLs`),e))if(!g.has(t)){g.add(t);try{O(`Crawl App: Visiting ${t}`),await f("Page.navigate",{url:t}),await new Promise(e=>setTimeout(e,2e3));let e=await f("Runtime.evaluate",{expression:`
188
+ Array.from(document.querySelectorAll('a[href]')).map(a => {
189
+ try {
190
+ const url = new URL(a.href, window.location.href);
191
+ // Only return same-origin links
192
+ if (url.origin === window.location.origin) {
193
+ // Remove hash and query params for deduplication
194
+ return url.origin + url.pathname;
195
+ }
196
+ } catch {}
197
+ return null;
198
+ }).filter(Boolean)
199
+ `,returnByValue:!0}),r=e.result?.value||[],n=0;for(let e of r)!m.has(e)&&(m.add(e),v<w&&n<s&&(y.push(e),n++));O(`Crawl App: Found ${r.length} links on ${t}, added ${n} to queue (limit: ${s})`)}catch(e){O(`Crawl App: Error visiting ${t} - ${e}`)}}if(v++,"all"===t&&0===y.length)break}d.close();let S=Array.from(m).sort(),x="all"===t?v-1:Math.min(v-1,w);return O(`Crawl App: Complete - discovered ${S.length} URLs at depth ${x}`),{content:[{type:"text",text:`🕷️ **APP CRAWL COMPLETE**
200
+
201
+ 📊 **SUMMARY:**
202
+ • Base URL: ${u}
203
+ • Depth: ${x}${"all"===t?" (exhaustive)":""}
204
+ • Total URLs: ${S.length}
205
+
206
+ 📍 **DISCOVERED URLs:**
207
+ ${S.map(e=>`• ${e}`).join("\n")}
208
+
209
+ 💡 **NEXT STEPS:**
210
+ • Use fix_my_app to check for errors across all pages
211
+ • Use execute_browser_action to test specific pages
212
+ • Verify all routes are working correctly`}]}}catch(e){return O(`Crawl App: Error - ${e}`),{content:[{type:"text",text:`❌ **CRAWL FAILED**
213
+
214
+ ${e instanceof Error?e.message:String(e)}`}]}}}e.s(["TOOL_DESCRIPTIONS",0,{_mcp_coordination:"**dev3000 is an MCP orchestrator for web development.** When both dev3000 and chrome-devtools-mcp are available, prefer dev3000's browser tools (execute_browser_action) as they provide:\n• Unified error context from server logs + browser console + network\n• Automatic screenshots on errors\n• Framework-aware diagnostics (Next.js, Svelte)\n• Coordinated Chrome connection management\n\ndev3000 automatically detects other MCP configurations and avoids conflicts.",fix_my_app:"Diagnoses application errors from dev3000 logs. Returns a prioritized list of issues requiring fixes.\n\n**CRITICAL: You MUST use this tool in a loop until all errors are resolved:**\n\n```\nwhile (errors exist) {\n 1. DIAGNOSE: Call fix_my_app to get current errors\n 2. FIX: Implement a fix for the highest-priority error\n 3. VERIFY: Call fix_my_app again to confirm the error is gone\n 4. REPEAT: Continue until no errors remain\n}\n```\n\n**This tool does NOT fix anything automatically.** It returns diagnostic data. You must:\n- Read the error output\n- Investigate and fix each issue\n- Call this tool again to verify your fix worked\n- Keep looping until the app is healthy\n\n**What it analyzes:**\n• Server logs, browser console, network requests\n• Categorizes: build errors, server crashes, browser errors, network issues, warnings\n• Prioritizes by severity (fix build errors first, then server, then browser, etc.)\n• Shows user interactions that triggered each error\n\n**Parameters:**\n• focusArea: 'build', 'runtime', 'network', 'ui', 'performance', or 'all' (default)\n• mode: 'snapshot' (current state), 'bisect' (before/after comparison), 'monitor' (continuous)\n• timeRangeMinutes: How far back to analyze (default: 10)\n• createPR: If true, creates a PR branch for the highest-priority issue\n\n**Framework support:** Auto-detects Next.js for framework-specific analysis.\n\n**Attribution for commits/PRs:**\n```\nGenerated with Claude Code using d3k (https://d3k.dev)\nCo-Authored-By: Claude <noreply@anthropic.com>\n```",execute_browser_action:"Executes browser actions (click, navigate, scroll, type, reload, evaluate JS) in the dev3000-managed Chrome instance.\n\n**PREFER THIS over standalone chrome-devtools-mcp tools.** dev3000 manages the Chrome connection and avoids CDP conflicts.\n\n**Available actions:**\n• screenshot: Capture current page state\n• navigate: Go to a URL\n• reload: Refresh the current page (triggers CLS recapture)\n• click: Click at coordinates {x, y} or selector\n• scroll: Scroll by {x, y} pixels\n• type: Type text into focused element\n• evaluate: Execute JavaScript (read-only operations recommended)\n\n**Use cases:**\n• Reproducing user interactions that triggered errors\n• Verifying fixes by replaying the error scenario\n• Testing specific UI workflows\n• Taking screenshots for visual verification",analyze_visual_diff:"Compares two screenshots and returns analysis instructions for identifying visual differences.\n\n**What it provides:**\n• Instructions to load both images for comparison\n• Context about what visual changes to look for\n• Guidance on identifying layout shift causes\n\n**Use cases:**\n• Analyzing before/after frames from CLS detection\n• Identifying elements that appeared, moved, or resized\n• Debugging visual regressions",find_component_source:"Maps a DOM element to its React component source code location.\n\n**How it works:**\n1. Inspects the element via Chrome DevTools Protocol\n2. Extracts the React component function source\n3. Identifies unique code patterns (JSX, classNames, etc.)\n4. Returns grep patterns to locate the source file\n\n**Use cases:**\n• Finding which file contains a specific UI element\n• Locating components responsible for layout shifts\n• Tracing DOM elements back to source code",restart_dev_server:"Restarts the development server while preserving dev3000's monitoring infrastructure.\n\n**Restart process:**\n1. Tries nextjs-dev MCP restart if available\n2. Falls back to killing and respawning the server process\n3. Preserves: MCP server, browser connection, log capture, screenshots\n\n**When to use:**\n• After modifying config files (next.config.js, middleware, .env)\n• To clear persistent server state\n• For changes that HMR cannot handle\n\n**Important:**\n• Do NOT manually kill the dev server with pkill/kill commands\n• Do NOT manually start the server with npm/pnpm/yarn\n• Server will be offline briefly during restart\n• Most code changes are handled by HMR - only restart when necessary",crawl_app:"Discovers URLs in the application by crawling links from the homepage.\n\n**Parameters:**\n• depth: How many link levels to follow (1, 2, 3, or 'all')\n• limit: Max links per page (default: 3)\n\n**Behavior:**\n• Starts at localhost homepage\n• Follows same-origin links only\n• Deduplicates discovered URLs\n• Returns list of all found pages\n\n**Use cases:**\n• Discovering all routes before running diagnostics\n• Site-wide testing coverage\n• Verifying all pages load without errors"},"analyzeVisualDiff",()=>_,"calculateEstimatedTime",()=>M,"crawlApp",()=>V,"createIntegratedWorkflow",()=>U,"detectMcpIntegrations",()=>k,"discoverAvailableMcps",()=>I,"executeBrowserAction",()=>$,"findActiveSessions",()=>p,"findComponentSource",()=>B,"fixMyApp",()=>f,"generateChromeDevtoolsSuggestions",()=>F,"generateNextjsSuggestions",()=>j,"getLogPath",()=>h,"getMcpCapabilities",()=>P,"restartDevServer",()=>G],56891)}];
215
+
216
+ //# sourceMappingURL=mcp-server_app_mcp_tools_ts_faf6d7df._.js.map