dev3000 0.0.136 → 0.0.138

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 (326) hide show
  1. package/dist/cdp-monitor.d.ts +1 -1
  2. package/dist/cdp-monitor.d.ts.map +1 -1
  3. package/dist/cdp-monitor.js +5 -3
  4. package/dist/cdp-monitor.js.map +1 -1
  5. package/dist/cli.js +15 -3
  6. package/dist/cli.js.map +1 -1
  7. package/dist/dev-environment.d.ts +15 -0
  8. package/dist/dev-environment.d.ts.map +1 -1
  9. package/dist/dev-environment.js +63 -22
  10. package/dist/dev-environment.js.map +1 -1
  11. package/dist/src/tui-interface-impl.tsx +46 -24
  12. package/dist/tui-interface-impl.d.ts +2 -0
  13. package/dist/tui-interface-impl.d.ts.map +1 -1
  14. package/dist/tui-interface-impl.js +28 -15
  15. package/dist/tui-interface-impl.js.map +1 -1
  16. package/dist/tui-interface.d.ts +3 -0
  17. package/dist/tui-interface.d.ts.map +1 -1
  18. package/dist/tui-interface.js +12 -7
  19. package/dist/tui-interface.js.map +1 -1
  20. package/dist/utils/tmux-helpers.d.ts.map +1 -1
  21. package/dist/utils/tmux-helpers.js +18 -3
  22. package/dist/utils/tmux-helpers.js.map +1 -1
  23. package/mcp-server/.next/BUILD_ID +1 -1
  24. package/mcp-server/.next/build/chunks/[root-of-the-server]__c438ef56._.js +2 -2
  25. package/mcp-server/.next/build/chunks/[root-of-the-server]__c438ef56._.js.map +1 -1
  26. package/mcp-server/.next/build/chunks/[turbopack-node]_transforms_postcss_ts_7988927e._.js +1 -1
  27. package/mcp-server/.next/build/chunks/{node_modules__pnpm_806d01c0._.js → node_modules__bun_19755e4f._.js} +167 -167
  28. package/mcp-server/.next/build/chunks/node_modules__bun_19755e4f._.js.map +47 -0
  29. package/mcp-server/.next/build-manifest.json +7 -7
  30. package/mcp-server/.next/fallback-build-manifest.json +2 -2
  31. package/mcp-server/.next/next-minimal-server.js.nft.json +1 -1
  32. package/mcp-server/.next/next-server.js.nft.json +1 -1
  33. package/mcp-server/.next/prerender-manifest.json +3 -3
  34. package/mcp-server/.next/server/app/_global-error/page/build-manifest.json +5 -5
  35. package/mcp-server/.next/server/app/_global-error/page.js +8 -8
  36. package/mcp-server/.next/server/app/_global-error/page.js.nft.json +1 -1
  37. package/mcp-server/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  38. package/mcp-server/.next/server/app/_global-error.html +2 -2
  39. package/mcp-server/.next/server/app/_global-error.rsc +7 -7
  40. package/mcp-server/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +2 -2
  41. package/mcp-server/.next/server/app/_global-error.segments/_full.segment.rsc +7 -7
  42. package/mcp-server/.next/server/app/_global-error.segments/_head.segment.rsc +3 -3
  43. package/mcp-server/.next/server/app/_global-error.segments/_index.segment.rsc +3 -3
  44. package/mcp-server/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  45. package/mcp-server/.next/server/app/_not-found/page/build-manifest.json +5 -5
  46. package/mcp-server/.next/server/app/_not-found/page.js +10 -10
  47. package/mcp-server/.next/server/app/_not-found/page.js.nft.json +1 -1
  48. package/mcp-server/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  49. package/mcp-server/.next/server/app/_not-found.html +1 -1
  50. package/mcp-server/.next/server/app/_not-found.rsc +7 -7
  51. package/mcp-server/.next/server/app/_not-found.segments/_full.segment.rsc +7 -7
  52. package/mcp-server/.next/server/app/_not-found.segments/_head.segment.rsc +3 -3
  53. package/mcp-server/.next/server/app/_not-found.segments/_index.segment.rsc +3 -3
  54. package/mcp-server/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +2 -2
  55. package/mcp-server/.next/server/app/_not-found.segments/_not-found.segment.rsc +3 -3
  56. package/mcp-server/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  57. package/mcp-server/.next/server/app/api/jank/[session]/route.js +7 -7
  58. package/mcp-server/.next/server/app/api/jank/[session]/route.js.nft.json +1 -1
  59. package/mcp-server/.next/server/app/api/logs/append/route.js +4 -4
  60. package/mcp-server/.next/server/app/api/logs/append/route.js.nft.json +1 -1
  61. package/mcp-server/.next/server/app/api/logs/head/route.js +4 -4
  62. package/mcp-server/.next/server/app/api/logs/head/route.js.nft.json +1 -1
  63. package/mcp-server/.next/server/app/api/logs/list/route.js +4 -4
  64. package/mcp-server/.next/server/app/api/logs/list/route.js.nft.json +1 -1
  65. package/mcp-server/.next/server/app/api/logs/rotate/route.js +6 -6
  66. package/mcp-server/.next/server/app/api/logs/rotate/route.js.nft.json +1 -1
  67. package/mcp-server/.next/server/app/api/logs/stream/route.js +4 -4
  68. package/mcp-server/.next/server/app/api/logs/stream/route.js.nft.json +1 -1
  69. package/mcp-server/.next/server/app/api/logs/tail/route.js +4 -4
  70. package/mcp-server/.next/server/app/api/logs/tail/route.js.nft.json +1 -1
  71. package/mcp-server/.next/server/app/api/orchestrator/route.js +7 -7
  72. package/mcp-server/.next/server/app/api/orchestrator/route.js.nft.json +1 -1
  73. package/mcp-server/.next/server/app/api/screenshots/[filename]/route.js +6 -6
  74. package/mcp-server/.next/server/app/api/screenshots/[filename]/route.js.nft.json +1 -1
  75. package/mcp-server/.next/server/app/api/screenshots/capture/route.js +7 -7
  76. package/mcp-server/.next/server/app/api/screenshots/capture/route.js.nft.json +1 -1
  77. package/mcp-server/.next/server/app/api/screenshots/clear/route.js +6 -6
  78. package/mcp-server/.next/server/app/api/screenshots/clear/route.js.nft.json +1 -1
  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 +9 -9
  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 +9 -9
  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 +3 -3
  91. package/mcp-server/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  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 -8
  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/chunks/{[root-of-the-server]__945b2b7b._.js → [root-of-the-server]__21541e6b._.js} +3 -3
  107. package/mcp-server/.next/server/chunks/[root-of-the-server]__21541e6b._.js.map +1 -0
  108. package/mcp-server/.next/server/chunks/[root-of-the-server]__2f95edf0._.js +17 -0
  109. package/mcp-server/.next/server/chunks/[root-of-the-server]__2f95edf0._.js.map +1 -0
  110. package/mcp-server/.next/server/chunks/[root-of-the-server]__377f76d7._.js +7 -0
  111. package/mcp-server/.next/server/chunks/[root-of-the-server]__377f76d7._.js.map +1 -0
  112. package/mcp-server/.next/server/chunks/[root-of-the-server]__454b0d3c._.js +7 -0
  113. package/mcp-server/.next/server/chunks/[root-of-the-server]__454b0d3c._.js.map +1 -0
  114. package/mcp-server/.next/server/chunks/[root-of-the-server]__6728fd4b._.js +3 -0
  115. package/mcp-server/.next/server/chunks/[root-of-the-server]__6728fd4b._.js.map +1 -0
  116. package/mcp-server/.next/server/chunks/[root-of-the-server]__69498adb._.js +3 -0
  117. package/mcp-server/.next/server/chunks/[root-of-the-server]__69498adb._.js.map +1 -0
  118. package/mcp-server/.next/server/chunks/[root-of-the-server]__6c914ee2._.js +3 -0
  119. package/mcp-server/.next/server/chunks/[root-of-the-server]__6c914ee2._.js.map +1 -0
  120. package/mcp-server/.next/server/chunks/[root-of-the-server]__6f790e1f._.js +3 -0
  121. package/mcp-server/.next/server/chunks/[root-of-the-server]__6f790e1f._.js.map +1 -0
  122. package/mcp-server/.next/server/chunks/[root-of-the-server]__7049acd5._.js +3 -0
  123. package/mcp-server/.next/server/chunks/[root-of-the-server]__7049acd5._.js.map +1 -0
  124. package/mcp-server/.next/server/chunks/{[root-of-the-server]__340a77dc._.js → [root-of-the-server]__73c9cc46._.js} +2 -2
  125. package/mcp-server/.next/server/chunks/[root-of-the-server]__73c9cc46._.js.map +1 -0
  126. package/mcp-server/.next/server/chunks/[root-of-the-server]__78991125._.js +3 -0
  127. package/mcp-server/.next/server/chunks/[root-of-the-server]__78991125._.js.map +1 -0
  128. package/mcp-server/.next/server/chunks/[root-of-the-server]__7ae828c6._.js +3 -0
  129. package/mcp-server/.next/server/chunks/[root-of-the-server]__7ae828c6._.js.map +1 -0
  130. package/mcp-server/.next/server/chunks/{[root-of-the-server]__532c5da6._.js → [root-of-the-server]__7ed5139a._.js} +1 -1
  131. package/mcp-server/.next/server/chunks/[root-of-the-server]__95098840._.js +3 -0
  132. package/mcp-server/.next/server/chunks/[root-of-the-server]__95098840._.js.map +1 -0
  133. package/mcp-server/.next/server/chunks/{[root-of-the-server]__8589759c._.js → [root-of-the-server]__99274dd8._.js} +3 -3
  134. package/mcp-server/.next/server/chunks/[root-of-the-server]__99274dd8._.js.map +1 -0
  135. package/mcp-server/.next/server/chunks/[root-of-the-server]__af8a6500._.js +3 -0
  136. package/mcp-server/.next/server/chunks/[root-of-the-server]__af8a6500._.js.map +1 -0
  137. package/mcp-server/.next/server/chunks/{[root-of-the-server]__4aa77621._.js → [root-of-the-server]__b56464d6._.js} +3 -3
  138. package/mcp-server/.next/server/chunks/[root-of-the-server]__b56464d6._.js.map +1 -0
  139. package/mcp-server/.next/server/chunks/{[root-of-the-server]__714e8bcf._.js → [root-of-the-server]__b698502d._.js} +2 -2
  140. package/mcp-server/.next/server/chunks/[root-of-the-server]__b698502d._.js.map +1 -0
  141. package/mcp-server/.next/server/chunks/[root-of-the-server]__daca64a4._.js +3 -0
  142. package/mcp-server/.next/server/chunks/[root-of-the-server]__daca64a4._.js.map +1 -0
  143. package/mcp-server/.next/server/chunks/[root-of-the-server]__ee39655c._.js +4 -0
  144. package/mcp-server/.next/server/chunks/[root-of-the-server]__ee39655c._.js.map +1 -0
  145. package/mcp-server/.next/server/chunks/[root-of-the-server]__f4213a2f._.js +4 -0
  146. package/mcp-server/.next/server/chunks/[root-of-the-server]__f4213a2f._.js.map +1 -0
  147. package/mcp-server/.next/server/chunks/edd96_next_80752ad3._.js +3 -0
  148. package/mcp-server/.next/server/chunks/edd96_next_80752ad3._.js.map +1 -0
  149. package/mcp-server/.next/server/chunks/edd96_next_dist_esm_build_templates_app-route_f51c5640.js +3 -0
  150. package/mcp-server/.next/server/chunks/edd96_next_dist_esm_build_templates_app-route_f51c5640.js.map +1 -0
  151. package/mcp-server/.next/server/chunks/{c80b1_next_dist_579c473d._.js → edd96_next_dist_fa47e982._.js} +3 -3
  152. package/mcp-server/.next/server/chunks/edd96_next_dist_fa47e982._.js.map +1 -0
  153. package/mcp-server/.next/server/chunks/edd96_next_ef93dda6._.js +14 -0
  154. package/mcp-server/.next/server/chunks/edd96_next_ef93dda6._.js.map +1 -0
  155. package/mcp-server/.next/server/chunks/mcp-server_app_mcp_tools_ts_faf6d7df._.js +1 -1
  156. package/mcp-server/.next/server/chunks/mcp-server_app_mcp_tools_ts_faf6d7df._.js.map +1 -1
  157. package/mcp-server/.next/server/chunks/ssr/{[root-of-the-server]__ab72cb3d._.js → [root-of-the-server]__163e0fe2._.js} +2 -2
  158. package/mcp-server/.next/server/chunks/ssr/[root-of-the-server]__163e0fe2._.js.map +1 -0
  159. package/mcp-server/.next/server/chunks/ssr/{[root-of-the-server]__bbed00c8._.js → [root-of-the-server]__250a4cf3._.js} +2 -2
  160. package/mcp-server/.next/server/chunks/ssr/[root-of-the-server]__250a4cf3._.js.map +1 -0
  161. package/mcp-server/.next/server/chunks/ssr/[root-of-the-server]__41e244ae._.js +3 -0
  162. package/mcp-server/.next/server/chunks/ssr/[root-of-the-server]__41e244ae._.js.map +1 -0
  163. package/mcp-server/.next/server/chunks/ssr/{[root-of-the-server]__50b48a29._.js → [root-of-the-server]__4a45fb1f._.js} +2 -2
  164. package/mcp-server/.next/server/chunks/ssr/[root-of-the-server]__4a45fb1f._.js.map +1 -0
  165. package/mcp-server/.next/server/chunks/ssr/{[root-of-the-server]__64e0f342._.js → [root-of-the-server]__4b74b898._.js} +2 -2
  166. package/mcp-server/.next/server/chunks/ssr/[root-of-the-server]__4b74b898._.js.map +1 -0
  167. package/mcp-server/.next/server/chunks/ssr/{[root-of-the-server]__bc51e8b7._.js → [root-of-the-server]__4feaccaf._.js} +2 -2
  168. package/mcp-server/.next/server/chunks/ssr/[root-of-the-server]__4feaccaf._.js.map +1 -0
  169. package/mcp-server/.next/server/chunks/ssr/[root-of-the-server]__6d9fa861._.js +3 -0
  170. package/mcp-server/.next/server/chunks/ssr/{[root-of-the-server]__90e175f7._.js → [root-of-the-server]__9913ce94._.js} +2 -2
  171. package/mcp-server/.next/server/chunks/ssr/[root-of-the-server]__9923da5e._.js +3 -0
  172. package/mcp-server/.next/server/chunks/ssr/[root-of-the-server]__9923da5e._.js.map +1 -0
  173. package/mcp-server/.next/server/chunks/ssr/{[root-of-the-server]__3c6c75a6._.js → [root-of-the-server]__a8fcf205._.js} +2 -2
  174. package/mcp-server/.next/server/chunks/ssr/[root-of-the-server]__df4ed844._.js +3 -0
  175. package/mcp-server/.next/server/chunks/ssr/[root-of-the-server]__df4ed844._.js.map +1 -0
  176. package/mcp-server/.next/server/chunks/ssr/{_be1b41b5._.js → _213c874b._.js} +3 -3
  177. package/mcp-server/.next/server/chunks/ssr/_213c874b._.js.map +1 -0
  178. package/mcp-server/.next/server/chunks/ssr/{c80b1_next_dist_5f2de86d._.js → _69be9abe._.js} +3 -3
  179. package/mcp-server/.next/server/chunks/ssr/_69be9abe._.js.map +1 -0
  180. package/mcp-server/.next/server/chunks/ssr/{_e92c871d._.js → _b38781f1._.js} +3 -3
  181. package/mcp-server/.next/server/chunks/ssr/_b38781f1._.js.map +1 -0
  182. package/mcp-server/.next/server/chunks/ssr/{_9a178862._.js → _edba94b0._.js} +3 -3
  183. package/mcp-server/.next/server/chunks/ssr/_edba94b0._.js.map +1 -0
  184. package/mcp-server/.next/server/chunks/ssr/{_aabc0f14._.js → _f478416d._.js} +3 -3
  185. package/mcp-server/.next/server/chunks/ssr/_f478416d._.js.map +1 -0
  186. package/mcp-server/.next/server/chunks/ssr/{c80b1_next_dist_esm_build_templates_app-page_9b0ce51c.js → edd96_next_dist_22d4e869._.js} +3 -3
  187. package/mcp-server/.next/server/chunks/ssr/edd96_next_dist_22d4e869._.js.map +1 -0
  188. package/mcp-server/.next/server/chunks/ssr/edd96_next_dist_329c4a9b._.js +10 -0
  189. package/mcp-server/.next/server/chunks/ssr/edd96_next_dist_329c4a9b._.js.map +1 -0
  190. package/mcp-server/.next/server/chunks/ssr/edd96_next_dist_6cceb2cd._.js +3 -0
  191. package/mcp-server/.next/server/chunks/ssr/edd96_next_dist_6cceb2cd._.js.map +1 -0
  192. package/mcp-server/.next/server/chunks/ssr/edd96_next_dist_861297ac._.js +6 -0
  193. package/mcp-server/.next/server/chunks/ssr/edd96_next_dist_861297ac._.js.map +1 -0
  194. package/mcp-server/.next/server/chunks/ssr/{c80b1_next_dist_client_components_43abb007._.js → edd96_next_dist_client_components_85c7e922._.js} +2 -2
  195. package/mcp-server/.next/server/chunks/ssr/edd96_next_dist_client_components_85c7e922._.js.map +1 -0
  196. package/mcp-server/.next/server/chunks/ssr/{c80b1_next_dist_client_components_builtin_forbidden_462fb25e.js → edd96_next_dist_client_components_builtin_forbidden_0eb1cacd.js} +2 -2
  197. package/mcp-server/.next/server/chunks/ssr/edd96_next_dist_client_components_builtin_forbidden_0eb1cacd.js.map +1 -0
  198. package/mcp-server/.next/server/chunks/ssr/edd96_next_dist_client_components_builtin_global-error_e64e654b.js +3 -0
  199. package/mcp-server/.next/server/chunks/ssr/edd96_next_dist_client_components_builtin_global-error_e64e654b.js.map +1 -0
  200. package/mcp-server/.next/server/chunks/ssr/{c80b1_next_dist_client_components_builtin_unauthorized_9a1b3d4d.js → edd96_next_dist_client_components_builtin_unauthorized_06e7b5f5.js} +2 -2
  201. package/mcp-server/.next/server/chunks/ssr/edd96_next_dist_client_components_builtin_unauthorized_06e7b5f5.js.map +1 -0
  202. package/mcp-server/.next/server/chunks/ssr/{_262bbdcd._.js → edd96_next_dist_esm_build_templates_app-page_f82c7ca4.js} +3 -3
  203. package/mcp-server/.next/server/chunks/ssr/edd96_next_dist_esm_build_templates_app-page_f82c7ca4.js.map +1 -0
  204. package/mcp-server/.next/server/chunks/ssr/mcp-server_app_layout_tsx_afa41767._.js +1 -1
  205. package/mcp-server/.next/server/chunks/ssr/mcp-server_app_page_tsx_9fc46577._.js +1 -1
  206. package/mcp-server/.next/server/chunks/ssr/mcp-server_components_dark-mode-toggle_tsx_f31dd15d._.js +1 -1
  207. package/mcp-server/.next/server/chunks/ssr/mcp-server_components_dark-mode-toggle_tsx_f31dd15d._.js.map +1 -1
  208. package/mcp-server/.next/server/chunks/ssr/node_modules__bun_39d5fbaf._.js +3 -0
  209. package/mcp-server/.next/server/chunks/ssr/node_modules__bun_39d5fbaf._.js.map +1 -0
  210. package/mcp-server/.next/server/chunks/ssr/node_modules__bun_d6d37386._.js +5 -0
  211. package/mcp-server/.next/server/chunks/ssr/node_modules__bun_d6d37386._.js.map +1 -0
  212. package/mcp-server/.next/server/middleware-build-manifest.js +5 -5
  213. package/mcp-server/.next/server/pages/404.html +1 -1
  214. package/mcp-server/.next/server/pages/500.html +2 -2
  215. package/mcp-server/.next/server/server-reference-manifest.js +1 -1
  216. package/mcp-server/.next/server/server-reference-manifest.json +1 -1
  217. package/mcp-server/.next/static/chunks/10099c90a1ca89ea.js +4 -0
  218. package/mcp-server/.next/static/chunks/{86092b19e32d6ddb.js → 10c04cb580a9beec.js} +1 -1
  219. package/mcp-server/.next/static/chunks/13606014ef33124c.js +2 -0
  220. package/mcp-server/.next/static/chunks/2422ea9ed874427b.js +1 -0
  221. package/mcp-server/.next/static/chunks/39e9bdcc541cc428.js +1 -0
  222. package/mcp-server/.next/static/chunks/4785978304fb9e19.js +1 -0
  223. package/mcp-server/.next/static/chunks/5df77c9395248155.js +1 -0
  224. package/mcp-server/.next/static/chunks/807aef58565dccb1.js +1 -0
  225. package/mcp-server/.next/static/chunks/a6dad97d9634a72d.js.map +1 -1
  226. package/mcp-server/.next/static/chunks/{5c8ff2f81b2fec4d.js → b8eb42a9560f7980.js} +3 -3
  227. package/mcp-server/.next/static/chunks/{ba2f63419c181083.js → cbbf49c419347401.js} +1 -1
  228. package/mcp-server/.next/static/chunks/ea7b53054294e7bb.js +3 -0
  229. package/mcp-server/.next/static/chunks/{turbopack-2c2bdfdb92058782.js → turbopack-b64e111cadf03885.js} +2 -2
  230. package/mcp-server/app/mcp/tools.ts +4 -1
  231. package/mcp-server/package.json +1 -0
  232. package/mcp-server/start-production.mjs +5 -1
  233. package/package.json +8 -12
  234. package/src/tui-interface-impl.tsx +46 -24
  235. package/mcp-server/.next/build/chunks/node_modules__pnpm_806d01c0._.js.map +0 -47
  236. package/mcp-server/.next/server/chunks/[root-of-the-server]__141a5bc7._.js +0 -17
  237. package/mcp-server/.next/server/chunks/[root-of-the-server]__141a5bc7._.js.map +0 -1
  238. package/mcp-server/.next/server/chunks/[root-of-the-server]__1ca296d3._.js +0 -3
  239. package/mcp-server/.next/server/chunks/[root-of-the-server]__1ca296d3._.js.map +0 -1
  240. package/mcp-server/.next/server/chunks/[root-of-the-server]__21bdfd19._.js +0 -3
  241. package/mcp-server/.next/server/chunks/[root-of-the-server]__21bdfd19._.js.map +0 -1
  242. package/mcp-server/.next/server/chunks/[root-of-the-server]__31a16876._.js +0 -3
  243. package/mcp-server/.next/server/chunks/[root-of-the-server]__31a16876._.js.map +0 -1
  244. package/mcp-server/.next/server/chunks/[root-of-the-server]__340a77dc._.js.map +0 -1
  245. package/mcp-server/.next/server/chunks/[root-of-the-server]__4aa77621._.js.map +0 -1
  246. package/mcp-server/.next/server/chunks/[root-of-the-server]__52809b10._.js +0 -3
  247. package/mcp-server/.next/server/chunks/[root-of-the-server]__52809b10._.js.map +0 -1
  248. package/mcp-server/.next/server/chunks/[root-of-the-server]__714e8bcf._.js.map +0 -1
  249. package/mcp-server/.next/server/chunks/[root-of-the-server]__81270bcf._.js +0 -3
  250. package/mcp-server/.next/server/chunks/[root-of-the-server]__81270bcf._.js.map +0 -1
  251. package/mcp-server/.next/server/chunks/[root-of-the-server]__8589759c._.js.map +0 -1
  252. package/mcp-server/.next/server/chunks/[root-of-the-server]__90514e85._.js +0 -4
  253. package/mcp-server/.next/server/chunks/[root-of-the-server]__90514e85._.js.map +0 -1
  254. package/mcp-server/.next/server/chunks/[root-of-the-server]__90569352._.js +0 -3
  255. package/mcp-server/.next/server/chunks/[root-of-the-server]__90569352._.js.map +0 -1
  256. package/mcp-server/.next/server/chunks/[root-of-the-server]__94037b23._.js +0 -7
  257. package/mcp-server/.next/server/chunks/[root-of-the-server]__94037b23._.js.map +0 -1
  258. package/mcp-server/.next/server/chunks/[root-of-the-server]__945b2b7b._.js.map +0 -1
  259. package/mcp-server/.next/server/chunks/[root-of-the-server]__ad4d66b0._.js +0 -3
  260. package/mcp-server/.next/server/chunks/[root-of-the-server]__ad4d66b0._.js.map +0 -1
  261. package/mcp-server/.next/server/chunks/[root-of-the-server]__b4ecebbe._.js +0 -3
  262. package/mcp-server/.next/server/chunks/[root-of-the-server]__b4ecebbe._.js.map +0 -1
  263. package/mcp-server/.next/server/chunks/[root-of-the-server]__cc74dbef._.js +0 -7
  264. package/mcp-server/.next/server/chunks/[root-of-the-server]__cc74dbef._.js.map +0 -1
  265. package/mcp-server/.next/server/chunks/[root-of-the-server]__e7efb7fe._.js +0 -3
  266. package/mcp-server/.next/server/chunks/[root-of-the-server]__e7efb7fe._.js.map +0 -1
  267. package/mcp-server/.next/server/chunks/[root-of-the-server]__fa4b0e38._.js +0 -4
  268. package/mcp-server/.next/server/chunks/[root-of-the-server]__fa4b0e38._.js.map +0 -1
  269. package/mcp-server/.next/server/chunks/[root-of-the-server]__fd2bf649._.js +0 -3
  270. package/mcp-server/.next/server/chunks/[root-of-the-server]__fd2bf649._.js.map +0 -1
  271. package/mcp-server/.next/server/chunks/c80b1_next_d479b5fa._.js +0 -14
  272. package/mcp-server/.next/server/chunks/c80b1_next_d479b5fa._.js.map +0 -1
  273. package/mcp-server/.next/server/chunks/c80b1_next_dist_579c473d._.js.map +0 -1
  274. package/mcp-server/.next/server/chunks/c80b1_next_dist_esm_build_templates_app-route_ea10d5ad.js +0 -3
  275. package/mcp-server/.next/server/chunks/c80b1_next_dist_esm_build_templates_app-route_ea10d5ad.js.map +0 -1
  276. package/mcp-server/.next/server/chunks/c80b1_next_f225a77d._.js +0 -3
  277. package/mcp-server/.next/server/chunks/c80b1_next_f225a77d._.js.map +0 -1
  278. package/mcp-server/.next/server/chunks/ssr/[root-of-the-server]__1d6b73d5._.js +0 -3
  279. package/mcp-server/.next/server/chunks/ssr/[root-of-the-server]__1d6b73d5._.js.map +0 -1
  280. package/mcp-server/.next/server/chunks/ssr/[root-of-the-server]__27ae22d6._.js +0 -3
  281. package/mcp-server/.next/server/chunks/ssr/[root-of-the-server]__27ae22d6._.js.map +0 -1
  282. package/mcp-server/.next/server/chunks/ssr/[root-of-the-server]__324715a4._.js +0 -3
  283. package/mcp-server/.next/server/chunks/ssr/[root-of-the-server]__324715a4._.js.map +0 -1
  284. package/mcp-server/.next/server/chunks/ssr/[root-of-the-server]__50b48a29._.js.map +0 -1
  285. package/mcp-server/.next/server/chunks/ssr/[root-of-the-server]__64e0f342._.js.map +0 -1
  286. package/mcp-server/.next/server/chunks/ssr/[root-of-the-server]__75b45b88._.js +0 -3
  287. package/mcp-server/.next/server/chunks/ssr/[root-of-the-server]__ab72cb3d._.js.map +0 -1
  288. package/mcp-server/.next/server/chunks/ssr/[root-of-the-server]__bbed00c8._.js.map +0 -1
  289. package/mcp-server/.next/server/chunks/ssr/[root-of-the-server]__bc51e8b7._.js.map +0 -1
  290. package/mcp-server/.next/server/chunks/ssr/_262bbdcd._.js.map +0 -1
  291. package/mcp-server/.next/server/chunks/ssr/_9a178862._.js.map +0 -1
  292. package/mcp-server/.next/server/chunks/ssr/_aabc0f14._.js.map +0 -1
  293. package/mcp-server/.next/server/chunks/ssr/_be1b41b5._.js.map +0 -1
  294. package/mcp-server/.next/server/chunks/ssr/_e92c871d._.js.map +0 -1
  295. package/mcp-server/.next/server/chunks/ssr/c80b1_next_dist_0d37e039._.js +0 -3
  296. package/mcp-server/.next/server/chunks/ssr/c80b1_next_dist_0d37e039._.js.map +0 -1
  297. package/mcp-server/.next/server/chunks/ssr/c80b1_next_dist_5f2de86d._.js.map +0 -1
  298. package/mcp-server/.next/server/chunks/ssr/c80b1_next_dist_81d07c6e._.js +0 -10
  299. package/mcp-server/.next/server/chunks/ssr/c80b1_next_dist_81d07c6e._.js.map +0 -1
  300. package/mcp-server/.next/server/chunks/ssr/c80b1_next_dist_889a708f._.js +0 -6
  301. package/mcp-server/.next/server/chunks/ssr/c80b1_next_dist_889a708f._.js.map +0 -1
  302. package/mcp-server/.next/server/chunks/ssr/c80b1_next_dist_client_components_43abb007._.js.map +0 -1
  303. package/mcp-server/.next/server/chunks/ssr/c80b1_next_dist_client_components_builtin_forbidden_462fb25e.js.map +0 -1
  304. package/mcp-server/.next/server/chunks/ssr/c80b1_next_dist_client_components_builtin_global-error_f3bf1365.js +0 -3
  305. package/mcp-server/.next/server/chunks/ssr/c80b1_next_dist_client_components_builtin_global-error_f3bf1365.js.map +0 -1
  306. package/mcp-server/.next/server/chunks/ssr/c80b1_next_dist_client_components_builtin_unauthorized_9a1b3d4d.js.map +0 -1
  307. package/mcp-server/.next/server/chunks/ssr/c80b1_next_dist_esm_build_templates_app-page_9b0ce51c.js.map +0 -1
  308. package/mcp-server/.next/server/chunks/ssr/node_modules__pnpm_98754805._.js +0 -5
  309. package/mcp-server/.next/server/chunks/ssr/node_modules__pnpm_98754805._.js.map +0 -1
  310. package/mcp-server/.next/server/chunks/ssr/node_modules__pnpm_b801224a._.js +0 -3
  311. package/mcp-server/.next/server/chunks/ssr/node_modules__pnpm_b801224a._.js.map +0 -1
  312. package/mcp-server/.next/static/chunks/0ceacd9ff62ffa24.js +0 -1
  313. package/mcp-server/.next/static/chunks/41c5312e59752fb5.js +0 -1
  314. package/mcp-server/.next/static/chunks/47219b9a153e0530.js +0 -3
  315. package/mcp-server/.next/static/chunks/4b70aaeeb4b78390.js +0 -1
  316. package/mcp-server/.next/static/chunks/6bd8e9b9ad938cba.js +0 -1
  317. package/mcp-server/.next/static/chunks/a782bd48b8755eeb.js +0 -1
  318. package/mcp-server/.next/static/chunks/f09e07f5359ffb6b.js +0 -4
  319. package/mcp-server/.next/static/chunks/f5ae99caea655ac1.js +0 -2
  320. /package/mcp-server/.next/server/chunks/{[root-of-the-server]__532c5da6._.js.map → [root-of-the-server]__7ed5139a._.js.map} +0 -0
  321. /package/mcp-server/.next/server/chunks/ssr/{[root-of-the-server]__75b45b88._.js.map → [root-of-the-server]__6d9fa861._.js.map} +0 -0
  322. /package/mcp-server/.next/server/chunks/ssr/{[root-of-the-server]__90e175f7._.js.map → [root-of-the-server]__9913ce94._.js.map} +0 -0
  323. /package/mcp-server/.next/server/chunks/ssr/{[root-of-the-server]__3c6c75a6._.js.map → [root-of-the-server]__a8fcf205._.js.map} +0 -0
  324. /package/mcp-server/.next/static/{cxkSEJwFEcrBT_84gOgdA → gicQOhS3xoSQe_xAaJ-se}/_buildManifest.js +0 -0
  325. /package/mcp-server/.next/static/{cxkSEJwFEcrBT_84gOgdA → gicQOhS3xoSQe_xAaJ-se}/_clientMiddlewareManifest.json +0 -0
  326. /package/mcp-server/.next/static/{cxkSEJwFEcrBT_84gOgdA → gicQOhS3xoSQe_xAaJ-se}/_ssgManifest.js +0 -0
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../mcp-server/app/mcp/tools.ts"],"sourcesContent":["import { exec, spawn } from \"child_process\"\nimport { appendFileSync, existsSync, mkdirSync, readdirSync, readFileSync, statSync } from \"fs\"\nimport { homedir, tmpdir } from \"os\"\nimport { join } from \"path\"\nimport pixelmatch from \"pixelmatch\"\nimport { PNG } from \"pngjs\"\nimport { promisify } from \"util\"\nimport { WebSocket } from \"ws\"\n\nconst execAsync = promisify(exec)\n\n/**\n * Detect if we're in a sandbox environment (Vercel Sandbox, Docker, etc.)\n * where lsof and other system utilities may not be available.\n */\nfunction isInSandbox(): boolean {\n return (\n process.env.VERCEL_SANDBOX === \"1\" ||\n process.env.VERCEL === \"1\" ||\n existsSync(\"/.dockerenv\") ||\n existsSync(\"/run/.containerenv\")\n )\n}\n\n// Tool descriptions\nexport const TOOL_DESCRIPTIONS = {\n // Meta-description for MCP coordination - Claude should see this when listing tools\n _mcp_coordination:\n \"**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.\",\n\n fix_my_app:\n \"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```\",\n\n execute_browser_action:\n \"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\",\n\n analyze_visual_diff:\n \"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\",\n\n find_component_source:\n \"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\",\n\n restart_dev_server:\n \"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\",\n\n crawl_app:\n \"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\"\n}\n\n// Types\nexport interface Session {\n projectName: string\n startTime: string\n logFilePath: string\n sessionFile: string\n lastModified: Date\n}\n\nexport interface FixMyAppParams {\n projectName?: string\n focusArea?: string\n mode?: \"snapshot\" | \"bisect\" | \"monitor\"\n waitForUserInteraction?: boolean\n timeRangeMinutes?: number\n includeTimestampInstructions?: boolean\n integrateNextjs?: boolean\n integrateChromeDevtools?: boolean\n returnRawData?: boolean\n createPR?: boolean // Create a PR for the highest priority issue\n}\n\nexport interface CreateIntegratedWorkflowParams {\n availableMcps?: string[] // Optional - will auto-discover if not provided\n focusArea?: string\n errorContext?: string\n}\n\nexport interface ExecuteBrowserActionParams {\n action: string\n params?: Record<string, unknown>\n}\n\nexport interface GetMcpCapabilitiesParams {\n mcpName?: string // Optional - if not provided, shows all available MCPs\n}\n\n// Structured data types for raw data output\nexport interface ErrorWithInteractions {\n timestamp: string\n category: string\n message: string\n interactions: string[]\n severity: \"critical\" | \"error\" | \"warning\"\n}\n\nexport interface CodeFix {\n file: string\n line?: number\n description: string\n code: string\n reason: string\n}\n\nexport interface McpFunctionSuggestion {\n function: string\n params?: Record<string, unknown>\n reason: string\n priority: \"high\" | \"medium\" | \"low\"\n}\n\nexport interface WorkflowPhase {\n name: string\n description: string\n actions: Array<{\n mcp: string\n function: string\n params?: Record<string, unknown>\n reason: string\n }>\n estimatedTime: string\n}\n\nexport interface StructuredAnalysisResult {\n errors: ErrorWithInteractions[]\n fixes: CodeFix[]\n suggestedIntegrations: {\n nextjs?: McpFunctionSuggestion[]\n chrome?: McpFunctionSuggestion[]\n }\n workflowPlan?: {\n phase1: WorkflowPhase\n phase2: WorkflowPhase\n phase3: WorkflowPhase\n }\n summary: {\n totalErrors: number\n criticalErrors: number\n hasIntegrations: boolean\n estimatedFixTime: string\n }\n}\n\nexport interface PrioritizedError {\n error: string\n category: \"build\" | \"server\" | \"browser\" | \"network\" | \"warning\"\n severity: \"critical\" | \"error\" | \"warning\"\n priorityScore: number\n interactions: string[]\n timestamp?: string\n suggestedFix?: string\n}\n\n// Helper functions\n\n/**\n * Calculate priority score for an error\n * Higher score = higher priority to fix\n *\n * Scoring system:\n * - Build errors: 1000+ (blocks development)\n * - Server errors: 500+ (affects functionality)\n * - Browser errors: 300+ (user-facing issues)\n * - Network errors: 200+ (intermittent issues)\n * - Warnings: 100+ (nice to fix)\n *\n * Additional modifiers:\n * - Multiple occurrences: +50 per occurrence\n * - Recent (last minute): +100\n * - Has user interactions: +50 (reproducible)\n */\nfunction calculateErrorPriority(\n errorLine: string,\n category: PrioritizedError[\"category\"],\n interactions: string[],\n allErrors: string[]\n): number {\n let score = 0\n\n // Base score by category\n if (category === \"build\") {\n score = 1000\n } else if (category === \"server\") {\n score = 500\n } else if (category === \"browser\") {\n score = 300\n } else if (category === \"network\") {\n score = 200\n } else if (category === \"warning\") {\n score = 100\n }\n\n // Severity multipliers\n if (/CRITICAL|FATAL|crashed/i.test(errorLine)) {\n score *= 2\n } else if (/ERROR|Exception|FAIL/i.test(errorLine)) {\n score *= 1.5\n }\n\n // Count occurrences of similar errors\n const errorPattern = errorLine.replace(/\\d+/g, \"\\\\d+\").substring(0, 100)\n const occurrences = allErrors.filter((e) => new RegExp(errorPattern).test(e)).length\n if (occurrences > 1) {\n score += (occurrences - 1) * 50\n }\n\n // Boost if has interactions (reproducible)\n if (interactions.length > 0) {\n score += 50\n }\n\n // Boost if recent (within last minute)\n const timestampMatch = errorLine.match(/\\[(\\d{2}):(\\d{2}):(\\d{2})\\.\\d{3}\\]/)\n if (timestampMatch) {\n const now = new Date()\n const errorTime = new Date()\n errorTime.setHours(parseInt(timestampMatch[1], 10))\n errorTime.setMinutes(parseInt(timestampMatch[2], 10))\n errorTime.setSeconds(parseInt(timestampMatch[3], 10))\n\n const ageMinutes = (now.getTime() - errorTime.getTime()) / 1000 / 60\n if (ageMinutes < 1) {\n score += 100\n }\n }\n\n return score\n}\n\n/**\n * Find the single highest priority error from categorized errors\n */\nfunction findHighestPriorityError(\n categorizedErrors: {\n serverErrors: string[]\n browserErrors: string[]\n buildErrors: string[]\n networkErrors: string[]\n warnings: string[]\n },\n allErrors: string[],\n logLines: string[]\n): PrioritizedError | null {\n const prioritizedErrors: PrioritizedError[] = []\n\n // Helper to find interactions before an error\n const findInteractions = (errorLine: string): string[] => {\n const errorIndex = logLines.indexOf(errorLine)\n if (errorIndex === -1) return []\n\n const interactions: string[] = []\n for (let i = errorIndex - 1; i >= Math.max(0, errorIndex - 20) && interactions.length < 5; i--) {\n if (\n logLines[i].includes(\"[INTERACTION]\") ||\n logLines[i].includes(\"[NAVIGATION]\") ||\n logLines[i].includes(\"[PAGE]\")\n ) {\n interactions.unshift(logLines[i])\n }\n }\n return interactions\n }\n\n // Process build errors\n for (const error of categorizedErrors.buildErrors) {\n const interactions = findInteractions(error)\n prioritizedErrors.push({\n error,\n category: \"build\",\n severity: \"critical\",\n priorityScore: calculateErrorPriority(error, \"build\", interactions, allErrors),\n interactions\n })\n }\n\n // Process server errors\n for (const error of categorizedErrors.serverErrors) {\n const interactions = findInteractions(error)\n const severity: PrioritizedError[\"severity\"] = /CRITICAL|FATAL/i.test(error) ? \"critical\" : \"error\"\n prioritizedErrors.push({\n error,\n category: \"server\",\n severity,\n priorityScore: calculateErrorPriority(error, \"server\", interactions, allErrors),\n interactions\n })\n }\n\n // Process browser errors\n for (const error of categorizedErrors.browserErrors) {\n const interactions = findInteractions(error)\n const severity: PrioritizedError[\"severity\"] = /CRITICAL|FATAL/i.test(error) ? \"critical\" : \"error\"\n prioritizedErrors.push({\n error,\n category: \"browser\",\n severity,\n priorityScore: calculateErrorPriority(error, \"browser\", interactions, allErrors),\n interactions\n })\n }\n\n // Process network errors\n for (const error of categorizedErrors.networkErrors) {\n const interactions = findInteractions(error)\n prioritizedErrors.push({\n error,\n category: \"network\",\n severity: \"error\",\n priorityScore: calculateErrorPriority(error, \"network\", interactions, allErrors),\n interactions\n })\n }\n\n // Process warnings (only if no errors found)\n if (prioritizedErrors.length === 0) {\n for (const error of categorizedErrors.warnings) {\n const interactions = findInteractions(error)\n prioritizedErrors.push({\n error,\n category: \"warning\",\n severity: \"warning\",\n priorityScore: calculateErrorPriority(error, \"warning\", interactions, allErrors),\n interactions\n })\n }\n }\n\n // Sort by priority score (highest first)\n prioritizedErrors.sort((a, b) => b.priorityScore - a.priorityScore)\n\n return prioritizedErrors[0] || null\n}\n\n/**\n * Create a PR for the highest priority issue\n */\nasync function createPRForIssue(prioritizedError: PrioritizedError, _projectName: string): Promise<string> {\n try {\n // Extract error details for PR title and body\n const errorType = prioritizedError.category.toUpperCase()\n const errorMessage = prioritizedError.error\n .replace(/\\[[^\\]]+\\]/g, \"\") // Remove timestamps and tags\n .trim()\n .substring(0, 100)\n\n const prTitle = `Fix: ${errorType} - ${errorMessage}`\n\n // Build PR body\n const prBody = `## 🐛 Bug Fix - ${prioritizedError.category} Error\n\n**Priority Score:** ${prioritizedError.priorityScore} (${prioritizedError.severity})\n\n### Error Details\n\\`\\`\\`\n${prioritizedError.error}\n\\`\\`\\`\n\n${\n prioritizedError.interactions.length > 0\n ? `### Reproduction Steps\nThe error occurred after these user interactions:\n${prioritizedError.interactions.map((i, idx) => `${idx + 1}. ${i}`).join(\"\\n\")}\n\n### Verification\nAfter implementing the fix, verify by:\n1. Replaying the same interactions using \\`execute_browser_action\\`\n2. Confirming the error no longer appears in logs\n3. Checking that functionality works as expected\n`\n : \"\"\n}\n\n### Suggested Fix\nThis PR addresses the ${prioritizedError.severity}-level ${prioritizedError.category} error detected by dev3000.\n\n${prioritizedError.suggestedFix || \"Please analyze the error and implement the appropriate fix.\"}\n\n---\n🤖 Generated with [dev3000](https://github.com/vercel-labs/dev3000) - AI-powered debugging\n`\n\n // Create a new branch\n const branchName = `fix/${prioritizedError.category}-${Date.now()}`\n\n // Use execAsync to run git and gh commands\n await execAsync(`git checkout -b ${branchName}`)\n\n // Create the PR using gh\n await execAsync(`gh pr create --title \"${prTitle}\" --body \"${prBody}\" --head ${branchName}`)\n\n return `✅ Created PR: ${prTitle}\\n\\nBranch: ${branchName}\\n\\nNext steps:\\n1. Implement the fix in your code\\n2. Commit and push changes\\n3. PR is ready for review!`\n } catch (error) {\n return `❌ Failed to create PR: ${error instanceof Error ? error.message : String(error)}\\n\\nYou can manually create a PR with the error details above.`\n }\n}\n\n// Helper functions\nexport function findActiveSessions(): Session[] {\n const sessionDir = join(homedir(), \".d3k\")\n if (!existsSync(sessionDir)) {\n return []\n }\n\n try {\n const files = readdirSync(sessionDir)\n .filter((f) => f.endsWith(\".json\"))\n .map((f) => {\n const filePath = join(sessionDir, f)\n const content = JSON.parse(readFileSync(filePath, \"utf-8\"))\n const stat = statSync(filePath)\n return {\n ...content,\n sessionFile: filePath,\n lastModified: stat.mtime\n }\n })\n .filter((session) => {\n // Check if the process is still running by checking the PID\n if (!session.pid) {\n return false\n }\n try {\n process.kill(session.pid, 0) // Signal 0 just checks if process exists\n return true // Process is still running\n } catch {\n return false // Process is not running\n }\n })\n .sort((a, b) => new Date(b.startTime).getTime() - new Date(a.startTime).getTime())\n\n return files\n } catch (_error) {\n return []\n }\n}\n\nexport function getLogPath(projectName?: string): string | null {\n // If explicit project name provided, look it up\n if (projectName) {\n const sessions = findActiveSessions()\n const session = sessions.find((s) => s.projectName === projectName)\n if (session) {\n // Return the log path even if file doesn't exist yet\n // (it will be created when logs start, especially in sandbox environments)\n return session.logFilePath\n }\n }\n\n // Fall back to environment variable\n const envPath = process.env.LOG_FILE_PATH\n if (envPath) {\n // Return the path even if file doesn't exist yet\n return envPath\n }\n\n // If no project specified and no env var, show available sessions\n return null\n}\n\n// Main tool implementations\nexport async function fixMyApp({\n projectName,\n focusArea = \"all\",\n mode = \"snapshot\",\n waitForUserInteraction = false,\n timeRangeMinutes = 10,\n includeTimestampInstructions = true,\n integrateNextjs = false,\n integrateChromeDevtools = false,\n returnRawData = false,\n createPR = false\n}: FixMyAppParams): Promise<{ content: Array<{ type: \"text\"; text: string }> }> {\n // 🎯 MCP ORCHESTRATION: Check which downstream MCPs are available\n const { getMCPClientManager } = await import(\"./client-manager\")\n const clientManager = getMCPClientManager()\n const connectedMCPs = clientManager.getConnectedMCPs()\n\n const hasNextjsDev = connectedMCPs.includes(\"nextjs-dev\")\n const hasChromeDevtools = connectedMCPs.includes(\"chrome-devtools\")\n\n if (connectedMCPs.length > 0) {\n logToDevFile(`Fix My App: Connected to downstream MCPs: ${connectedMCPs.join(\", \")}`)\n }\n\n // Auto-detect integration flags based on connected MCPs\n if (hasNextjsDev && integrateNextjs === false) {\n integrateNextjs = true\n }\n if (hasChromeDevtools && integrateChromeDevtools === false) {\n integrateChromeDevtools = true\n }\n\n // Legacy delegation check (keeping for backwards compatibility)\n const canDelegateNextjs = await canDelegateToNextjs()\n if (canDelegateNextjs) {\n logToDevFile(`Fix My App: Recommending dev3000-nextjs-dev MCP for Next.js-specific analysis`)\n }\n let logPath = getLogPath(projectName)\n if (!logPath) {\n const sessions = findActiveSessions()\n if (sessions.length === 0) {\n return {\n content: [\n {\n type: \"text\",\n text: \"❌ No active dev3000 sessions found. Make sure dev3000 is running!\"\n }\n ]\n }\n }\n\n // Auto-select if there's only one session\n logToDevFile(`fix_my_app: Found ${sessions.length} sessions`)\n if (sessions.length === 1) {\n projectName = sessions[0].projectName\n logPath = getLogPath(projectName)\n logToDevFile(`fix_my_app: Auto-selected single session: ${projectName}, logPath: ${logPath}`)\n\n // If still no log path after auto-select, return error\n if (!logPath) {\n return {\n content: [\n {\n type: \"text\",\n text: `❌ Could not find log file for project \"${projectName}\". The session may not be properly initialized yet.`\n }\n ]\n }\n }\n } else {\n const sessionList = sessions\n .map((s) => `• ${s.projectName} (started ${new Date(s.startTime).toLocaleString()})`)\n .join(\"\\n\")\n\n return {\n content: [\n {\n type: \"text\",\n text: `🔍 Found ${sessions.length} dev3000 sessions. Please specify which project to fix:\\n${sessionList}\\n\\n💡 Use: projectName: \"your-project-name\" parameter`\n }\n ]\n }\n }\n }\n\n const results: string[] = []\n\n // Mode-specific handling\n if (mode === \"bisect\" && waitForUserInteraction) {\n const startTime = new Date().toISOString()\n results.push(\"🕐 **TIMESTAMP BISECT MODE ACTIVATED**\")\n results.push(`📍 Start Time: ${startTime}`)\n results.push(\"\")\n results.push(\"🎯 **NOW INTERACT WITH YOUR APP TO REPRODUCE THE ISSUE!**\")\n results.push(\"• Click buttons, navigate, submit forms, etc.\")\n results.push(\"• Reproduce the exact error scenario\")\n results.push(\"• When done, run this tool again WITHOUT waitForUserInteraction\")\n results.push(\"\")\n results.push(\"💡 I'll analyze everything that happens between these timestamps!\")\n\n return {\n content: [{ type: \"text\", text: results.join(\"\\n\") }]\n }\n }\n\n try {\n // Check if log file exists before reading\n if (!existsSync(logPath)) {\n results.push(\"📋 Log file doesn't exist yet. The dev server may still be starting up.\")\n results.push(\"💡 Wait a few seconds for the server to generate logs, then try again.\")\n return {\n content: [{ type: \"text\", text: results.join(\"\\n\") }]\n }\n }\n\n const content = readFileSync(logPath, \"utf-8\")\n const logLines = content.trim().split(\"\\n\").filter(Boolean)\n\n if (logLines.length === 0) {\n results.push(\"📋 Log file is empty. Make sure your app is running and generating logs.\")\n return {\n content: [{ type: \"text\", text: results.join(\"\\n\") }]\n }\n }\n\n results.push(`🔍 **FIX MY APP ANALYSIS** - Mode: ${mode.toUpperCase()}`)\n results.push(`📁 Log file: ${logPath}`)\n results.push(`📊 Total log entries: ${logLines.length}`)\n results.push(\"\")\n\n // Time-based filtering\n const now = new Date()\n const cutoffTime = new Date(now.getTime() - timeRangeMinutes * 60 * 1000)\n\n // Comprehensive error patterns\n const errorPatterns = [\n /ERROR/i,\n /FAIL/i,\n /Exception/i,\n /CRITICAL/i,\n /FATAL/i,\n /crashed/i,\n /undefined/i,\n /null reference/i,\n /cannot read/i,\n /cannot find/i,\n /not found/i,\n /timeout/i,\n /refused/i,\n /denied/i,\n /unauthorized/i,\n /404/,\n /500/,\n /503/,\n /WARN/i,\n /WARNING/i,\n /deprecated/i,\n /slow/i,\n /retry/i,\n /RUNTIME\\.ERROR/,\n /hydration.*mismatch/i,\n /Uncaught/i,\n /throwOnHydrationMismatch/i\n ]\n\n // Filter logs by time range (replaces get_logs_between_timestamps)\n const timeFilteredLines = logLines.filter((line) => {\n // Try ISO format first (e.g., 2025-09-23T22:03:55.068Z)\n const isoMatch = line.match(/\\[(\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}\\.\\d{3}Z)\\]/)\n if (isoMatch) {\n const logTime = new Date(isoMatch[1])\n return logTime >= cutoffTime\n }\n\n // Try time-only format (e.g., 15:04:03.987)\n const timeMatch = line.match(/\\[(\\d{2}):(\\d{2}):(\\d{2})\\.(\\d{3})\\]/)\n if (timeMatch) {\n // For time-only format, assume it's from today\n const now = new Date()\n const logTime = new Date(\n now.getFullYear(),\n now.getMonth(),\n now.getDate(),\n parseInt(timeMatch[1], 10),\n parseInt(timeMatch[2], 10),\n parseInt(timeMatch[3], 10),\n parseInt(timeMatch[4], 10)\n )\n\n // If the time is in the future (e.g., log shows 15:04 but now is 14:00),\n // assume it was from yesterday\n if (logTime > now) {\n logTime.setDate(logTime.getDate() - 1)\n }\n\n return logTime >= cutoffTime\n }\n\n // If no timestamp found, include the line (better to show more than miss errors)\n return true\n })\n\n // Extract ALL error types (replaces multiple error detection tools)\n const allErrors = timeFilteredLines.filter((line) => {\n return errorPatterns.some((pattern) => pattern.test(line))\n })\n\n // Extract react-scan performance data\n const reactScanLines = timeFilteredLines.filter(\n (line) => line.includes(\"react-scan\") || line.includes(\"ReactScan\") || line.includes(\"React render\")\n )\n\n // Parse react-scan performance metrics\n const reactScanMetrics = {\n unnecessaryRenders: reactScanLines.filter(\n (line) => line.includes(\"unnecessary\") || line.includes(\"re-render\") || line.includes(\"wasted\")\n ),\n slowComponents: reactScanLines.filter(\n (line) => line.includes(\"slow\") || line.includes(\"performance\") || /\\d+ms/.test(line)\n ),\n totalRenders: reactScanLines.filter((line) => line.includes(\"render\")).length\n }\n\n // Filter out framework noise (unfixable warnings from Next.js, React, etc.)\n const frameworkNoisePatterns = [\n /link rel=preload.*must have.*valid.*as/i, // Next.js font optimization warning - not actionable\n /next\\/font/i, // Next.js font-related warnings\n /automatically generated/i, // Auto-generated code warnings\n /\\[NETWORK\\].*\\b(200|201|204|304)\\b\\s+(OK|Created|No Content|Not Modified)/i // Successful HTTP responses - not errors\n ]\n\n const actionableErrors = allErrors.filter((line) => {\n return !frameworkNoisePatterns.some((pattern) => pattern.test(line))\n })\n\n // Categorize errors for better analysis\n const categorizedErrors = {\n serverErrors: actionableErrors.filter(\n (line) => line.includes(\"[SERVER]\") && (line.includes(\"ERROR\") || line.includes(\"Exception\"))\n ),\n browserErrors: actionableErrors.filter(\n (line) =>\n line.includes(\"[BROWSER]\") &&\n (line.includes(\"ERROR\") || line.includes(\"CONSOLE ERROR\") || line.includes(\"RUNTIME.ERROR\"))\n ),\n buildErrors: actionableErrors.filter(\n (line) => line.includes(\"Failed to compile\") || line.includes(\"Type error\") || line.includes(\"Build failed\")\n ),\n networkErrors: actionableErrors.filter((line) => {\n // Exclude successful status codes\n if (/\\b(200|201|204|304)\\b/.test(line)) return false\n return line.includes(\"NETWORK\") || line.includes(\"404\") || line.includes(\"500\") || line.includes(\"timeout\")\n }),\n warnings: actionableErrors.filter(\n (line) => /WARN|WARNING|deprecated/i.test(line) && !/ERROR|Exception|FAIL/i.test(line)\n )\n }\n\n const totalErrors = actionableErrors.length\n const criticalErrors = totalErrors - categorizedErrors.warnings.length\n\n // Also check for any errors in the entire log file (not just time filtered)\n const allLogErrors = logLines.filter((line) => {\n return errorPatterns.some((pattern) => pattern.test(line))\n })\n const recentErrorsOutsideTimeRange = allLogErrors.length > totalErrors\n\n // Helper function to find preceding interaction events for any error\n const findInteractionsBeforeError = (errorLine: string, allLines: string[]): string[] => {\n const errorIndex = allLines.indexOf(errorLine)\n if (errorIndex === -1) return []\n\n const interactions: string[] = []\n // Look back up to 20 lines or 5 interactions\n for (let i = errorIndex - 1; i >= Math.max(0, errorIndex - 20) && interactions.length < 5; i--) {\n if (\n allLines[i].includes(\"[INTERACTION]\") ||\n allLines[i].includes(\"[NAVIGATION]\") ||\n allLines[i].includes(\"[PAGE]\")\n ) {\n interactions.unshift(allLines[i])\n }\n }\n return interactions\n }\n\n if (totalErrors === 0 && !recentErrorsOutsideTimeRange) {\n results.push(`No errors found in last ${timeRangeMinutes} minutes.`)\n results.push(\"Application appears healthy.\")\n\n if (includeTimestampInstructions && mode !== \"monitor\") {\n results.push(\"\")\n results.push(\"Options:\")\n results.push(\"• Use mode='bisect' to compare before/after states during testing\")\n results.push(\"• Use mode='monitor' for continuous monitoring\")\n results.push(\"• Increase timeRangeMinutes to analyze a longer period\")\n }\n } else if (totalErrors === 0 && recentErrorsOutsideTimeRange) {\n results.push(\n `No errors in last ${timeRangeMinutes} minutes, but found ${allLogErrors.length} errors in full log.`\n )\n results.push(\"\")\n results.push(\"Older errors (outside time range):\")\n // Show last 5 errors from the full log with their interactions\n allLogErrors.slice(-5).forEach((error) => {\n const interactions = findInteractionsBeforeError(error, logLines)\n if (interactions.length > 0) {\n results.push(\" Preceding interactions:\")\n for (const interaction of interactions) {\n results.push(` ${interaction}`)\n }\n }\n results.push(` - ${error}`)\n results.push(\"\")\n })\n results.push(\"To analyze these errors, increase timeRangeMinutes (e.g., timeRangeMinutes=60)\")\n } else {\n results.push(\n `**${totalErrors} ISSUES DETECTED** (${criticalErrors} critical, ${categorizedErrors.warnings.length} warnings)`\n )\n results.push(\"\")\n results.push(\"**ACTION REQUIRED:** Fix the highest-priority error below, then call fix_my_app again to verify.\")\n results.push(\"\")\n\n // Show categorized errors with their preceding interactions\n if (categorizedErrors.serverErrors.length > 0) {\n results.push(\"SERVER ERRORS:\")\n categorizedErrors.serverErrors.slice(-5).forEach((error) => {\n const interactions = findInteractionsBeforeError(error, logLines)\n if (interactions.length > 0) {\n results.push(\" Preceding interactions:\")\n for (const interaction of interactions) {\n results.push(` ${interaction}`)\n }\n }\n results.push(` - ${error}`)\n results.push(\"\")\n })\n }\n\n if (categorizedErrors.browserErrors.length > 0) {\n results.push(\"BROWSER/CONSOLE ERRORS:\")\n categorizedErrors.browserErrors.slice(-5).forEach((error) => {\n const interactions = findInteractionsBeforeError(error, logLines)\n if (interactions.length > 0) {\n results.push(\" Preceding interactions:\")\n for (const interaction of interactions) {\n results.push(` ${interaction}`)\n }\n }\n results.push(` - ${error}`)\n results.push(\"\")\n })\n }\n\n if (categorizedErrors.buildErrors.length > 0) {\n results.push(\"BUILD/COMPILATION ERRORS:\")\n categorizedErrors.buildErrors.slice(-5).forEach((error) => {\n const interactions = findInteractionsBeforeError(error, logLines)\n if (interactions.length > 0) {\n results.push(\" Preceding interactions:\")\n for (const interaction of interactions) {\n results.push(` ${interaction}`)\n }\n }\n results.push(` - ${error}`)\n results.push(\"\")\n })\n }\n\n if (categorizedErrors.networkErrors.length > 0) {\n results.push(\"NETWORK/API ERRORS:\")\n categorizedErrors.networkErrors.slice(-5).forEach((error) => {\n const interactions = findInteractionsBeforeError(error, logLines)\n if (interactions.length > 0) {\n results.push(\" Preceding interactions:\")\n for (const interaction of interactions) {\n results.push(` ${interaction}`)\n }\n }\n results.push(` - ${error}`)\n results.push(\"\")\n })\n }\n\n if (categorizedErrors.warnings.length > 0 && focusArea === \"all\") {\n results.push(`WARNINGS (${categorizedErrors.warnings.length} found, showing recent):`)\n results.push(categorizedErrors.warnings.slice(-3).join(\"\\n\"))\n results.push(\"\")\n }\n\n // Show the diagnose-fix-verify loop\n results.push(\"---\")\n results.push(\"**NEXT: Fix the highest-priority issue, then call fix_my_app again to verify.**\")\n results.push(\"\")\n results.push(\"Keep calling fix_my_app after each fix until no errors remain.\")\n\n // Add integration-aware suggestions\n if (integrateNextjs || integrateChromeDevtools) {\n // Log that integrations are being used in fix analysis\n const activeIntegrations = []\n if (integrateNextjs) activeIntegrations.push(\"Next.js\")\n if (integrateChromeDevtools) activeIntegrations.push(\"Chrome DevTools\")\n logToDevFile(\n `Fix Analysis: Using active MCP integrations [${activeIntegrations.join(\", \")}] for enhanced error analysis`,\n projectName\n )\n\n results.push(\"\")\n results.push(\"**Available MCP integrations:**\")\n\n if (integrateNextjs) {\n results.push(\"\")\n results.push(\"Next.js MCP (nextjs-dev):\")\n const nextjsSuggestions = await generateNextjsSuggestions(allErrors.join(\" \"))\n nextjsSuggestions.forEach((suggestion) => {\n const params = suggestion.params\n ? `(${Object.entries(suggestion.params)\n .map(([k, v]) => `${k}=${JSON.stringify(v)}`)\n .join(\", \")})`\n : \"()\"\n results.push(` • nextjs-dev.${suggestion.function}${params}`)\n results.push(` Reason: ${suggestion.reason}`)\n })\n\n if (categorizedErrors.serverErrors.length > 0) {\n results.push(\" • Check Next.js build/runtime logs for SSR/hydration issues\")\n }\n }\n\n if (integrateChromeDevtools) {\n results.push(\"\")\n results.push(\"Chrome DevTools MCP (chrome-devtools):\")\n const chromeSuggestions = await generateChromeDevtoolsSuggestions(allErrors.join(\" \"))\n chromeSuggestions.forEach((suggestion) => {\n const params = suggestion.params\n ? `(${Object.entries(suggestion.params)\n .map(([k, v]) => `${k}=${JSON.stringify(v)}`)\n .join(\", \")})`\n : \"()\"\n results.push(` • chrome-devtools.${suggestion.function}${params}`)\n results.push(` Reason: ${suggestion.reason}`)\n })\n\n if (categorizedErrors.browserErrors.length > 0) {\n results.push(\" • Use DOM inspection for UI issues\")\n }\n if (categorizedErrors.networkErrors.length > 0) {\n results.push(\" • Inspect network requests for detailed error context\")\n }\n }\n }\n\n // Find the single highest priority error and optionally create a PR\n const highestPriorityError = findHighestPriorityError(categorizedErrors, actionableErrors, logLines)\n\n if (highestPriorityError) {\n results.push(\"\")\n results.push(\"---\")\n results.push(\"**HIGHEST PRIORITY ISSUE (fix this first):**\")\n results.push(`Priority Score: ${highestPriorityError.priorityScore}`)\n results.push(`Category: ${highestPriorityError.category.toUpperCase()}`)\n results.push(`Severity: ${highestPriorityError.severity.toUpperCase()}`)\n results.push(\"\")\n results.push(\"Error:\")\n results.push(` ${highestPriorityError.error}`)\n\n if (highestPriorityError.interactions.length > 0) {\n results.push(\"\")\n results.push(\"Reproduction steps:\")\n highestPriorityError.interactions.forEach((interaction, idx) => {\n results.push(` ${idx + 1}. ${interaction}`)\n })\n }\n\n // Create PR if requested\n if (createPR) {\n results.push(\"\")\n results.push(\"Creating PR branch for this issue...\")\n const prResult = await createPRForIssue(highestPriorityError, projectName || \"\")\n results.push(prResult)\n } else {\n results.push(\"\")\n results.push(\"To create a PR branch for this issue, run: fix_my_app(createPR=true)\")\n }\n }\n }\n\n // Extract screenshot information (replaces get_recent_screenshots)\n const screenshotLines = logLines.filter(\n (line) => line.includes(\"[SCREENSHOT]\") || line.includes(\"Screenshot captured\")\n )\n if (screenshotLines.length > 0) {\n results.push(\"\")\n results.push(`📸 **SCREENSHOTS CAPTURED** (${screenshotLines.length} total):`)\n screenshotLines.slice(-5).forEach((line) => {\n const match = line.match(/Screenshot captured: (.+)$/)\n if (match) {\n results.push(`• ${match[1]}`)\n }\n })\n results.push(\"\")\n results.push(\"💡 **TIP**: Use analyze_visual_diff tool to compare screenshots and identify changes\")\n results.push(\" (Advanced: screenshots are also accessible via curl if needed)\")\n }\n\n // Jank/Layout Shift Detection (from ScreencastManager passive captures)\n if (focusArea === \"performance\" || focusArea === \"all\") {\n const jankResult = await detectJankFromScreenshots(projectName)\n if (jankResult.detections.length > 0) {\n // Get MCP port for video viewer URL\n const sessionInfo = findActiveSessions().find((s) => s.projectName === projectName)\n const mcpPort = sessionInfo ? sessionInfo.sessionFile.match(/\"mcpPort\":\\s*\"(\\d+)\"/)?.[1] || \"3684\" : \"3684\"\n const videoUrl = `http://localhost:${mcpPort}/video/${jankResult.sessionId}`\n\n results.push(\"\")\n\n if (jankResult.realCLS) {\n results.push(\n `🚨 **LAYOUT SHIFT DETECTED** (${jankResult.detections.length} ${jankResult.detections.length === 1 ? \"shift\" : \"shifts\"} during page load):`\n )\n } else {\n results.push(\n `🚨 **LOADING JANK DETECTED** (${jankResult.detections.length} layout ${jankResult.detections.length === 1 ? \"shift\" : \"shifts\"} found):`\n )\n }\n\n const triggerLabel =\n jankResult.captureTrigger === \"navigation\"\n ? \"Navigation complete\"\n : jankResult.captureTrigger === \"load\"\n ? \"Load complete\"\n : \"View all frames\"\n results.push(`📹 **${triggerLabel}**: ${videoUrl}`)\n results.push(`🎞️ **Session ID**: ${jankResult.sessionId} (${jankResult.totalFrames} frames)`)\n results.push(\"\")\n\n jankResult.detections.forEach((jank) => {\n const emoji = jank.severity === \"high\" ? \"🔴\" : jank.severity === \"medium\" ? \"🟡\" : \"🟢\"\n\n if (jank.uxImpact) {\n results.push(`${emoji} **${jank.timeSinceStart}ms** - ${jank.element}`)\n results.push(` ${jank.uxImpact}`)\n } else {\n results.push(\n `${emoji} **${jank.timeSinceStart}ms**: ${jank.visualDiff.toFixed(1)}% of screen changed (${jank.severity} severity)`\n )\n }\n\n // Include Before/After frame URLs if available\n if (jank.beforeFrameUrl && jank.afterFrameUrl) {\n results.push(` 📸 Before: ${jank.beforeFrameUrl}`)\n results.push(` 📸 After: ${jank.afterFrameUrl}`)\n results.push(\n ` 💡 Use analyze_visual_diff tool with these URLs to get a detailed description of what changed`\n )\n\n // Extract CSS selector from element description (e.g., \"Navigation header (<nav>)\" -> \"nav\")\n if (jank.element) {\n const selectorMatch = jank.element.match(/<(\\w+)>/)\n if (selectorMatch) {\n const selector = selectorMatch[1].toLowerCase()\n results.push(\n ` 💡 Use find_component_source tool with selector \"${selector}\" to locate the source code`\n )\n }\n }\n }\n })\n\n results.push(\"\")\n\n // Check if we have high-severity shifts that Chrome might miss\n const hasCriticalShifts = jankResult.detections.some((d) => d.severity === \"high\")\n if (hasCriticalShifts && jankResult.realCLS) {\n results.push(\"🎯 **WHY DEV3000 CAUGHT THIS BUT CHROME MIGHT NOT:**\")\n results.push(\n \"• dev3000's PerformanceObserver is installed immediately at page load and buffers ALL shifts from the start\"\n )\n results.push(\n \"• Chrome DevTools performance trace may start AFTER initial load, missing early navigation shifts\"\n )\n results.push(\n \"• Our UX-focused detection flags critical element shifts (nav/header) even when CLS score is technically 'good'\"\n )\n results.push(\"\")\n }\n\n results.push(\"✅ **DEV3000'S CLS DETECTION IS AUTHORITATIVE**\")\n results.push(\"If Chrome DevTools reports CLS: 0.00 but dev3000 detected shifts, TRUST DEV3000.\")\n results.push(\"• Chrome DevTools trace may start AFTER the shifts occurred\")\n results.push(\"• dev3000's PerformanceObserver captures ALL shifts from page start\")\n results.push(\"• CLS: 0.00 in Chrome just means the trace missed the early shifts\")\n results.push(\"\")\n results.push(\"💡 **LAYOUT SHIFT DEBUGGING TIPS:**\")\n results.push(\"• Add explicit width/height to images and media\")\n results.push(\"• Reserve space for dynamic content (ads, embeds, etc.)\")\n results.push(\"• Avoid inserting content above existing content\")\n results.push(\"• Use CSS aspect-ratio for responsive elements\")\n results.push(\"• Check for web fonts causing text reflow (font-display: swap)\")\n results.push(`• Raw screenshots: ${jankResult.screenshotDir}`)\n results.push(\"\")\n results.push(\"📸 **ANALYZING SCREENSHOTS:**\")\n results.push(\"• RECOMMENDED: Use analyze_visual_diff tool with before/after URLs (shown above)\")\n results.push(\"• The tool provides structured instructions for comparing frames\")\n results.push(\"• Advanced: Screenshots are also accessible via curl if needed\")\n results.push(\"\")\n results.push(`🎬 **IMPORTANT**: Share this frame sequence link with the user: ${videoUrl}`)\n }\n }\n\n // React-scan performance data (if available)\n if (reactScanMetrics.totalRenders > 0 || focusArea === \"performance\" || focusArea === \"all\") {\n if (reactScanMetrics.unnecessaryRenders.length > 0 || reactScanMetrics.slowComponents.length > 0) {\n results.push(\"\")\n results.push(\"⚛️ **REACT PERFORMANCE ANALYSIS (react-scan):**\")\n\n if (reactScanMetrics.unnecessaryRenders.length > 0) {\n results.push(`🔄 **Unnecessary Re-renders Detected (${reactScanMetrics.unnecessaryRenders.length}):**`)\n reactScanMetrics.unnecessaryRenders.slice(-5).forEach((line) => {\n results.push(`• ${line}`)\n })\n results.push(\"\")\n }\n\n if (reactScanMetrics.slowComponents.length > 0) {\n results.push(`🐌 **Slow Components Found (${reactScanMetrics.slowComponents.length}):**`)\n reactScanMetrics.slowComponents.slice(-5).forEach((line) => {\n results.push(`• ${line}`)\n })\n results.push(\"\")\n }\n\n results.push(\"💡 **REACT OPTIMIZATION TIPS:**\")\n results.push(\"• Use React.memo() for components with expensive renders\")\n results.push(\"• Use useMemo/useCallback to prevent unnecessary re-renders\")\n results.push(\"• Check for unstable prop references (objects/arrays created in render)\")\n results.push(\"• Consider using React DevTools Profiler for deeper analysis\")\n }\n }\n\n // Performance insights (if no errors but looking at performance)\n if (totalErrors === 0 && focusArea === \"all\") {\n const performanceLines = logLines.filter((line) => line.includes(\"took\") && line.includes(\"ms\"))\n if (performanceLines.length > 0) {\n results.push(\"\")\n results.push(\"⚡ **PERFORMANCE INSIGHTS:**\")\n performanceLines.slice(-5).forEach((line) => {\n results.push(`• ${line}`)\n })\n }\n }\n\n // Return structured data if requested\n if (returnRawData) {\n logToDevFile(\n `Structured Output: Returning structured data for Claude orchestration with ${totalErrors} errors and ${integrateNextjs || integrateChromeDevtools ? \"active\" : \"no\"} integrations`,\n projectName\n )\n const structuredErrors: ErrorWithInteractions[] = allErrors.map((error) => {\n const interactions = findInteractionsBeforeError(error, logLines)\n const category = categorizedErrors.serverErrors.includes(error)\n ? \"server\"\n : categorizedErrors.browserErrors.includes(error)\n ? \"browser\"\n : categorizedErrors.buildErrors.includes(error)\n ? \"build\"\n : categorizedErrors.networkErrors.includes(error)\n ? \"network\"\n : categorizedErrors.warnings.includes(error)\n ? \"warning\"\n : \"general\"\n\n const severity = categorizedErrors.warnings.includes(error)\n ? (\"warning\" as const)\n : error.includes(\"CRITICAL\") || error.includes(\"FATAL\") || error.includes(\"crashed\")\n ? (\"critical\" as const)\n : (\"error\" as const)\n\n // Extract timestamp from error line\n const timestampMatch =\n error.match(/\\[(\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}\\.\\d{3}Z)\\]/) ||\n error.match(/\\[(\\d{2}:\\d{2}:\\d{2}\\.\\d{3})\\]/)\n const timestamp = timestampMatch ? timestampMatch[1] : new Date().toISOString()\n\n return {\n timestamp,\n category,\n message: error,\n interactions,\n severity\n }\n })\n\n const structuredFixes: CodeFix[] = []\n\n // Generate intelligent fix suggestions based on error patterns\n structuredErrors.forEach((error) => {\n if (error.category === \"hydration\" || error.message.includes(\"hydration\")) {\n structuredFixes.push({\n file: \"pages/_app.js or components/[component].tsx\",\n description: \"Fix hydration mismatch\",\n code: `// Ensure server and client render the same content\n// Use useEffect for client-only logic\nuseEffect(() => {\n // Client-only code here\n}, [])`,\n reason: \"Hydration errors occur when server and client render different content\"\n })\n }\n\n if (error.message.includes(\"TypeError\") || error.message.includes(\"undefined\")) {\n structuredFixes.push({\n file: \"Identify from stack trace in error message\",\n description: \"Add null/undefined checks\",\n code: `// Add defensive programming checks\nif (data && data.property) {\n // Safe to use data.property\n}\n// Or use optional chaining\nconst value = data?.property?.nestedProperty`,\n reason: \"Prevent TypeError by checking for undefined/null values\"\n })\n }\n\n if (error.message.includes(\"404\") || error.message.includes(\"not found\")) {\n structuredFixes.push({\n file: \"routing configuration or API endpoints\",\n description: \"Fix missing route or resource\",\n code: `// Check route configuration\n// Ensure API endpoint exists\n// Verify file paths are correct`,\n reason: \"404 errors indicate missing resources or incorrect paths\"\n })\n }\n })\n\n const suggestedIntegrations: StructuredAnalysisResult[\"suggestedIntegrations\"] = {}\n\n if (integrateNextjs) {\n suggestedIntegrations.nextjs = await generateNextjsSuggestions(allErrors.join(\" \"))\n }\n\n if (integrateChromeDevtools) {\n suggestedIntegrations.chrome = await generateChromeDevtoolsSuggestions(allErrors.join(\" \"))\n }\n\n // Create workflow plan if integrations are available\n let workflowPlan: StructuredAnalysisResult[\"workflowPlan\"]\n\n if (integrateNextjs || integrateChromeDevtools) {\n workflowPlan = {\n phase1: {\n name: \"Data Collection\",\n description: \"Parallel data gathering across all available MCPs\",\n actions: [\n {\n mcp: \"dev3000\",\n function: \"fix_my_app\",\n params: { focusArea, integrateNextjs, integrateChromeDevtools, returnRawData: true },\n reason: \"Get comprehensive error analysis with interaction data\"\n }\n ],\n estimatedTime: \"2-3 minutes\"\n },\n phase2: {\n name: \"Deep Analysis\",\n description: \"Cross-MCP correlation and targeted investigation\",\n actions: [\n {\n mcp: \"dev3000\",\n function: \"fix_my_app\",\n params: { mode: \"bisect\" },\n reason: \"Regression analysis if needed\"\n }\n ],\n estimatedTime: \"3-5 minutes\"\n },\n phase3: {\n name: \"Fix & Verify\",\n description: \"Implementation and verification across all layers\",\n actions: [\n {\n mcp: \"dev3000\",\n function: \"execute_browser_action\",\n reason: \"Replay interactions to verify fixes\"\n }\n ],\n estimatedTime: \"5-10 minutes\"\n }\n }\n\n // Add Next.js actions to workflow\n if (integrateNextjs && suggestedIntegrations.nextjs) {\n workflowPlan.phase1.actions.push(\n ...suggestedIntegrations.nextjs\n .filter((s) => s.priority === \"high\")\n .map((s) => ({\n mcp: \"nextjs-dev\",\n function: s.function,\n params: s.params,\n reason: s.reason\n }))\n )\n\n workflowPlan.phase3.actions.push({\n mcp: \"nextjs-dev\",\n function: \"check_build_status\",\n reason: \"Verify build success after fixes\"\n })\n }\n\n // Add Chrome actions to workflow\n if (integrateChromeDevtools && suggestedIntegrations.chrome) {\n workflowPlan.phase1.actions.push(\n ...suggestedIntegrations.chrome\n .filter((s) => s.priority === \"high\")\n .map((s) => ({\n mcp: \"chrome-devtools\",\n function: s.function,\n params: s.params,\n reason: s.reason\n }))\n )\n }\n }\n\n const structuredResult: StructuredAnalysisResult = {\n errors: structuredErrors,\n fixes: structuredFixes,\n suggestedIntegrations,\n workflowPlan,\n summary: {\n totalErrors: totalErrors,\n criticalErrors: criticalErrors,\n hasIntegrations: integrateNextjs || integrateChromeDevtools,\n estimatedFixTime: calculateEstimatedTime(totalErrors, integrateNextjs || integrateChromeDevtools)\n }\n }\n\n return {\n content: [{ type: \"text\", text: JSON.stringify(structuredResult, null, 2) }]\n }\n }\n\n // Add augmented analysis suggestions when specialized MCPs are available\n const canDelegateChrome = await canDelegateToChromeDevtools(\"profile_performance\")\n\n if (canDelegateNextjs || canDelegateChrome) {\n results.push(\"\")\n results.push(\"🔗 **AUGMENTED ANALYSIS AVAILABLE**\")\n results.push(\"\")\n results.push(\"dev3000 provided the core log analysis above. For deeper insights, consider also gathering:\")\n results.push(\"\")\n\n if (canDelegateNextjs) {\n results.push(\"**Next.js Framework Analysis:**\")\n const dynamicNextjsSuggestions = await generateNextjsSuggestions(allErrors.join(\" \"))\n dynamicNextjsSuggestions.slice(0, 3).forEach((suggestion) => {\n results.push(`• \\`dev3000-nextjs-dev:${suggestion.function}()\\` - ${suggestion.reason}`)\n })\n results.push(\"\")\n }\n\n if (canDelegateChrome) {\n results.push(\"**Browser-Side Analysis:**\")\n const dynamicChromeSuggestions = await generateChromeDevtoolsSuggestions(allErrors.join(\" \"))\n dynamicChromeSuggestions.slice(0, 3).forEach((suggestion) => {\n results.push(`• \\`dev3000-chrome-devtools:${suggestion.function}()\\` - ${suggestion.reason}`)\n })\n results.push(\"\")\n }\n\n results.push(\n \"💡 **Best approach:** Use dev3000's log analysis as your foundation, then gather specific additional data as needed for a complete picture.\"\n )\n }\n\n return {\n content: [{ type: \"text\", text: results.join(\"\\n\") }]\n }\n } catch (error) {\n return {\n content: [\n {\n type: \"text\",\n text: `Error analyzing logs: ${error instanceof Error ? error.message : String(error)}`\n }\n ]\n }\n }\n}\n\n// Dynamic MCP capability discovery and filtering\ninterface McpCapability {\n function: string\n description?: string\n parameters?: Record<string, unknown>\n category: \"advanced\" | \"basic\"\n reason: string\n}\n\ninterface McpSchemaCache {\n timestamp: number\n capabilities: McpCapability[]\n}\n\n// Cache for discovered MCP capabilities (5 minute TTL)\nconst MCP_CAPABILITY_CACHE = new Map<string, McpSchemaCache>()\nconst CAPABILITY_CACHE_TTL = 5 * 60 * 1000 // 5 minutes\n\n// Keywords that indicate advanced capabilities (vs basic automation)\nconst ADVANCED_CAPABILITY_KEYWORDS = {\n chrome: [\n \"inspect\",\n \"debug\",\n \"profile\",\n \"performance\",\n \"console\",\n \"devtools\",\n \"breakpoint\",\n \"intercept\",\n \"storage\",\n \"memory\",\n \"trace\"\n ],\n nextjs: [\"build\", \"hydration\", \"ssr\", \"routing\", \"analyze\", \"debug\", \"render\", \"middleware\", \"optimization\"]\n}\n\n// Basic capabilities that dev3000 handles well (should not suggest these)\nconst DEV3000_BASIC_CAPABILITIES = [\n \"screenshot\",\n \"navigate\",\n \"click\",\n \"type\",\n \"scroll\",\n \"evaluate\",\n \"simple_script\",\n \"get_logs\",\n \"basic_build_status\",\n \"simple_error_check\"\n]\n\n/**\n * Dynamically discover MCP capabilities by introspecting their schemas\n */\nasync function discoverMcpCapabilities(mcpName: string): Promise<McpCapability[]> {\n const cacheKey = mcpName\n const cached = MCP_CAPABILITY_CACHE.get(cacheKey)\n\n // Return cached capabilities if still fresh\n if (cached && Date.now() - cached.timestamp < CAPABILITY_CACHE_TTL) {\n logToDevFile(\n `Capability Discovery: Using cached capabilities for ${mcpName} (${cached.capabilities.length} functions)`\n )\n return cached.capabilities\n }\n\n logToDevFile(`Capability Discovery: Fetching fresh capabilities for ${mcpName}`)\n\n try {\n // Method 1: Try to get MCP schema via tools/list request (MCP protocol standard)\n const capabilities = await introspectMcpTools(mcpName)\n\n if (capabilities.length > 0) {\n // Cache the results\n MCP_CAPABILITY_CACHE.set(cacheKey, {\n timestamp: Date.now(),\n capabilities\n })\n\n logToDevFile(`Capability Discovery: Successfully discovered ${capabilities.length} capabilities for ${mcpName}`)\n return capabilities\n }\n\n // Method 2: Fallback to checking available function names from logs/errors\n const fallbackCapabilities = await inferCapabilitiesFromLogs(mcpName)\n\n // Cache even fallback results to avoid repeated failures\n MCP_CAPABILITY_CACHE.set(cacheKey, {\n timestamp: Date.now(),\n capabilities: fallbackCapabilities\n })\n\n logToDevFile(\n `Capability Discovery: Using fallback inference for ${mcpName} (${fallbackCapabilities.length} functions)`\n )\n return fallbackCapabilities\n } catch (error) {\n logToDevFile(`Capability Discovery: Failed to discover capabilities for ${mcpName} - ${error}`)\n return []\n }\n}\n\n/**\n * Introspect MCP tools using the standard tools/list request\n */\nasync function introspectMcpTools(mcpName: string): Promise<McpCapability[]> {\n // For stdio MCPs, we can try to discover their capabilities by checking Claude's cache directory\n // which often contains MCP schema information or error logs that reveal function names\n\n try {\n const cacheDir = `/Users/${process.env.USER}/Library/Caches/claude-cli-nodejs`\n const { readdirSync, existsSync, readFileSync } = await import(\"fs\")\n\n if (!existsSync(cacheDir)) return []\n\n const cacheDirs = readdirSync(cacheDir)\n const projectDir = cacheDirs.find((dir) => dir.includes(process.cwd().replace(/\\//g, \"-\")))\n\n if (!projectDir) return []\n\n const mcpLogDir = `${cacheDir}/${projectDir}/mcp-logs-${mcpName}`\n if (!existsSync(mcpLogDir)) return []\n\n // Look for schema information in MCP logs\n const logFiles = readdirSync(mcpLogDir)\n const capabilities: McpCapability[] = []\n\n for (const logFile of logFiles.slice(-5)) {\n // Check recent logs only\n try {\n const logPath = `${mcpLogDir}/${logFile}`\n const logContent = readFileSync(logPath, \"utf8\")\n\n // Parse log content for function definitions, tool lists, or schema information\n const discoveredFunctions = extractFunctionsFromLog(logContent, mcpName)\n capabilities.push(...discoveredFunctions)\n } catch (_error) {\n // Skip files that can't be read\n }\n }\n\n return deduplicateCapabilities(capabilities)\n } catch (error) {\n logToDevFile(`MCP Introspection: Failed to introspect ${mcpName} - ${error}`)\n return []\n }\n}\n\n/**\n * Extract function names and descriptions from MCP log content\n */\nfunction extractFunctionsFromLog(logContent: string, mcpName: string): McpCapability[] {\n const capabilities: McpCapability[] = []\n const mcpType: \"chrome\" | \"nextjs\" = mcpName.includes(\"chrome\")\n ? \"chrome\"\n : mcpName.includes(\"nextjs\")\n ? \"nextjs\"\n : \"chrome\" // default to chrome if unknown\n const advancedKeywords = ADVANCED_CAPABILITY_KEYWORDS[mcpType]\n\n // Look for function definitions in various formats\n const patterns = [\n // JSON-RPC method calls: {\"method\": \"tools/list\", \"result\": {\"tools\": [{\"name\": \"function_name\", \"description\": \"...\"}]}}\n /\"name\":\\s*\"([^\"]+)\"/g,\n // Function call patterns: functionName(params)\n /(\\w+)\\s*\\([^)]*\\)/g,\n // Tool definition patterns: tool: function_name\n /tool:\\s*(\\w+)/g,\n // Error messages that reveal function names: \"Unknown function: function_name\"\n /unknown function[:\\s]+(\\w+)/gi,\n // Function export patterns: exports.function_name\n /exports\\.(\\w+)/g\n ]\n\n for (const pattern of patterns) {\n let match: RegExpExecArray | null = pattern.exec(logContent)\n while (match !== null) {\n const functionName = match[1]\n\n // Skip if this is a basic capability that dev3000 handles\n if (DEV3000_BASIC_CAPABILITIES.some((basic) => functionName.toLowerCase().includes(basic))) {\n match = pattern.exec(logContent)\n continue\n }\n\n // Determine if this is an advanced capability\n const isAdvanced = advancedKeywords.some((keyword) => functionName.toLowerCase().includes(keyword))\n\n // Generate reason based on function name and MCP type\n const reason = generateCapabilityReason(functionName, mcpType, isAdvanced)\n\n capabilities.push({\n function: functionName,\n description: undefined, // Will be filled from actual description if available\n category: isAdvanced ? \"advanced\" : \"basic\",\n reason\n })\n\n match = pattern.exec(logContent)\n }\n }\n\n return capabilities\n}\n\n/**\n * Generate intelligent reason text for a discovered capability\n */\nfunction generateCapabilityReason(functionName: string, mcpType: string, isAdvanced: boolean): string {\n const name = functionName.toLowerCase()\n\n // Chrome DevTools specific reasons\n if (mcpType === \"chrome\") {\n if (name.includes(\"inspect\")) return \"Deep DOM inspection with DevTools-level detail\"\n if (name.includes(\"console\")) return \"Direct browser console access and manipulation\"\n if (name.includes(\"debug\") || name.includes(\"breakpoint\"))\n return \"JavaScript debugging with breakpoints and call stack\"\n if (name.includes(\"profile\") || name.includes(\"performance\")) return \"Advanced performance profiling and analysis\"\n if (name.includes(\"network\") || name.includes(\"request\")) return \"Network request interception and analysis\"\n if (name.includes(\"storage\")) return \"Browser storage manipulation (cookies, localStorage, etc.)\"\n if (name.includes(\"trace\") || name.includes(\"memory\")) return \"Memory usage and execution tracing\"\n }\n\n // Next.js specific reasons\n if (mcpType === \"nextjs\") {\n if (name.includes(\"build\")) return \"Advanced Next.js build system analysis\"\n if (name.includes(\"hydration\")) return \"Client-server hydration debugging and analysis\"\n if (name.includes(\"ssr\") || name.includes(\"render\")) return \"Server-side rendering debugging\"\n if (name.includes(\"route\") || name.includes(\"routing\")) return \"Next.js routing system inspection and debugging\"\n if (name.includes(\"middleware\")) return \"Next.js middleware analysis and debugging\"\n if (name.includes(\"optimization\") || name.includes(\"performance\"))\n return \"Next.js-specific performance optimization\"\n }\n\n // Generic advanced vs basic\n if (isAdvanced) {\n return `Advanced ${mcpType} capability beyond dev3000's basic automation`\n }\n\n return `${mcpType} capability for specialized analysis`\n}\n\n/**\n * Infer capabilities from error patterns and log analysis when direct introspection fails\n */\nasync function inferCapabilitiesFromLogs(mcpName: string): Promise<McpCapability[]> {\n // This is a fallback when we can't directly introspect the MCP\n // We'll return commonly expected capabilities based on the MCP type\n\n const mcpType = mcpName.includes(\"chrome\") ? \"chrome\" : mcpName.includes(\"nextjs\") ? \"nextjs\" : \"unknown\"\n const capabilities: McpCapability[] = []\n\n if (mcpType === \"chrome\") {\n // Common chrome-devtools capabilities that are likely to exist\n const commonChromeFunctions = [\n \"inspect_element\",\n \"access_console\",\n \"start_performance_profile\",\n \"intercept_requests\",\n \"set_breakpoint\",\n \"take_screenshot\",\n \"get_dom_snapshot\",\n \"modify_storage\",\n \"execute_script\"\n ]\n\n for (const func of commonChromeFunctions) {\n capabilities.push({\n function: func,\n category: DEV3000_BASIC_CAPABILITIES.includes(func) ? \"basic\" : \"advanced\",\n reason: generateCapabilityReason(func, mcpType, true)\n })\n }\n }\n\n if (mcpType === \"nextjs\") {\n // Common nextjs-dev capabilities that are likely to exist\n const commonNextjsFunctions = [\n \"analyze_build_process\",\n \"debug_server_rendering\",\n \"debug_hydration\",\n \"inspect_routing\",\n \"analyze_next_performance\",\n \"get_build_info\",\n \"check_build_status\",\n \"get_server_logs\"\n ]\n\n for (const func of commonNextjsFunctions) {\n capabilities.push({\n function: func,\n category: DEV3000_BASIC_CAPABILITIES.includes(func) ? \"basic\" : \"advanced\",\n reason: generateCapabilityReason(func, mcpType, true)\n })\n }\n }\n\n logToDevFile(`Capability Inference: Generated ${capabilities.length} inferred capabilities for ${mcpName}`)\n return capabilities\n}\n\n/**\n * Remove duplicate capabilities while preserving the most detailed ones\n */\nfunction deduplicateCapabilities(capabilities: McpCapability[]): McpCapability[] {\n const seen = new Map<string, McpCapability>()\n\n for (const capability of capabilities) {\n const existing = seen.get(capability.function)\n\n // Keep the one with more information (description, better reason, etc.)\n if (\n !existing ||\n (capability.description && !existing.description) ||\n capability.reason.length > existing.reason.length\n ) {\n seen.set(capability.function, capability)\n }\n }\n\n return Array.from(seen.values())\n}\n\n/**\n * Check if chrome-devtools MCP is available and get its capabilities\n */\nasync function canDelegateToChromeDevtools(action?: string): Promise<boolean> {\n try {\n // Check if MCP is available\n const availableMcps = await discoverAvailableMcps()\n if (!availableMcps.includes(\"dev3000-chrome-devtools\")) {\n return false\n }\n\n // If no specific action, just return availability\n if (!action) return true\n\n // Get dynamic capabilities\n const capabilities = await discoverMcpCapabilities(\"dev3000-chrome-devtools\")\n\n // Check if the MCP has relevant capabilities for the action\n const hasRelevantCapability = capabilities.some(\n (cap) => cap.function.toLowerCase().includes(action.toLowerCase()) || cap.category === \"advanced\" // Any advanced capability indicates delegation worthiness\n )\n\n return hasRelevantCapability\n } catch (error) {\n logToDevFile(`Chrome DevTools delegation check failed: ${error}`)\n return false\n }\n}\n\n/**\n * Check if nextjs-dev MCP is available and get its capabilities\n */\nasync function canDelegateToNextjs(): Promise<boolean> {\n try {\n // Check if MCP is available\n const availableMcps = await discoverAvailableMcps()\n if (!availableMcps.includes(\"dev3000-nextjs-dev\")) {\n return false\n }\n\n // Get dynamic capabilities to verify it has useful functions\n const capabilities = await discoverMcpCapabilities(\"dev3000-nextjs-dev\")\n\n // Return true if we found any advanced Next.js capabilities\n return capabilities.some((cap) => cap.category === \"advanced\")\n } catch (error) {\n logToDevFile(`NextJS delegation check failed: ${error}`)\n return false\n }\n}\n\n/**\n * Delegate browser action to chrome-devtools MCP\n */\nasync function delegateToChromeDevtools(\n action: string,\n params: Record<string, unknown>\n): Promise<{ content: Array<{ type: \"text\"; text: string }> }> {\n // Get dynamic capabilities from chrome-devtools MCP\n const capabilities = await discoverMcpCapabilities(\"dev3000-chrome-devtools\")\n\n // Find a relevant capability for this action\n const relevantCap = capabilities.find(\n (cap) =>\n cap.function.toLowerCase().includes(action.toLowerCase()) ||\n cap.description?.toLowerCase().includes(action.toLowerCase())\n )\n\n if (!relevantCap) {\n throw new Error(`Action ${action} cannot be delegated to chrome-devtools`)\n }\n\n return {\n content: [\n {\n type: \"text\",\n text: `🔗 **ADVANCED BROWSER DEBUGGING AVAILABLE**\n\nFor advanced debugging capabilities, use the \\`dev3000-chrome-devtools\\` MCP:\n\n\\`\\`\\`\ndev3000-chrome-devtools:${relevantCap.function}(${JSON.stringify(params, null, 2)})\n\\`\\`\\`\n\n🎯 **Why use chrome-devtools for this:** ${relevantCap.reason}\n\n💡 **When to use each tool:**\n• **dev3000**: Basic browser automation (screenshots, navigation, clicks, simple scripts)\n• **dev3000-chrome-devtools**: Advanced debugging (DOM inspection, breakpoints, performance profiling, network interception)\n\n⚡ **Both tools share the same Chrome instance** - no conflicts or duplicate browsers`\n }\n ]\n }\n}\n\n/**\n * Delegate to nextjs-dev MCP with suggested functions\n */\nasync function _delegateToNextjs(): Promise<{ content: Array<{ type: \"text\"; text: string }> }> {\n // Get dynamic capabilities from nextjs-dev MCP\n const capabilities = await discoverMcpCapabilities(\"dev3000-nextjs-dev\")\n\n const availableFunctions = capabilities\n .map((cap) => `• \\`dev3000-nextjs-dev:${cap.function}()\\` - ${cap.reason}`)\n .join(\"\\n\")\n\n return {\n content: [\n {\n type: \"text\",\n text: `🔗 **ADVANCED NEXT.JS ANALYSIS AVAILABLE**\n\nFor Next.js-specific advanced analysis, use the \\`dev3000-nextjs-dev\\` MCP:\n\n**Available Advanced Functions:**\n${availableFunctions}\n\n💡 **When to use each tool:**\n• **dev3000**: General log analysis, basic error detection, simple build monitoring\n• **dev3000-nextjs-dev**: Advanced Next.js debugging (SSR issues, hydration problems, build system analysis, routing inspection)\n\n⚡ **Best of both worlds:** Use dev3000 for general monitoring and nextjs-dev for framework-specific deep dives`\n }\n ]\n }\n}\n\nexport async function executeBrowserAction({\n action,\n params = {}\n}: ExecuteBrowserActionParams): Promise<{ content: Array<{ type: \"text\"; text: string }> }> {\n try {\n // 🎯 INTELLIGENT DELEGATION: Check if chrome-devtools MCP can handle this action\n const canDelegate = await canDelegateToChromeDevtools(action)\n if (canDelegate) {\n logToDevFile(`Browser Action Delegation: Routing '${action}' to chrome-devtools MCP`)\n return await delegateToChromeDevtools(action, params)\n }\n\n // Log fallback to dev3000's own implementation\n logToDevFile(`Browser Action Fallback: Using dev3000's execute_browser_action for '${action}'`)\n\n // First, find active session to get CDP URL\n const sessions = findActiveSessions()\n if (sessions.length === 0) {\n return {\n content: [\n {\n type: \"text\",\n text: \"❌ No active dev3000 sessions found. Make sure dev3000 is running with a browser!\"\n }\n ]\n }\n }\n\n // Get the most recent session's CDP URL (stored in session data)\n const sessionData = JSON.parse(readFileSync(sessions[0].sessionFile, \"utf-8\"))\n let cdpUrl = sessionData.cdpUrl\n\n if (!cdpUrl) {\n // Try to get CDP URL from Chrome debugging port as fallback\n try {\n const response = await fetch(\"http://localhost:9222/json\")\n const pages = await response.json()\n const activePage = pages.find(\n (page: { type: string; url: string }) => page.type === \"page\" && !page.url.startsWith(\"chrome://\")\n )\n if (activePage) {\n cdpUrl = activePage.webSocketDebuggerUrl\n logToDevFile(`CDP Discovery: Found fallback CDP URL ${cdpUrl}`, sessions[0].projectName)\n }\n } catch (error) {\n logToDevFile(`CDP Discovery: Failed to find fallback CDP URL - ${error}`, sessions[0].projectName)\n }\n }\n\n if (!cdpUrl) {\n return {\n content: [\n {\n type: \"text\",\n text: `❌ No Chrome DevTools Protocol URL found. Make sure dev3000 is running with browser monitoring enabled (not --servers-only mode). Session CDP URL: ${sessionData.cdpUrl || \"null\"}`\n }\n ]\n }\n }\n\n // Connect to Chrome DevTools Protocol with timeout\n const result = await new Promise<Record<string, unknown>>((resolve, reject) => {\n const ws = new WebSocket(cdpUrl)\n\n // Overall timeout for the entire browser action (60 seconds)\n const overallTimeout = setTimeout(() => {\n ws.close()\n reject(\n new Error(\n `Browser action '${action}' timed out after 60 seconds. This may indicate an issue with the browser or invalid parameters.`\n )\n )\n }, 60000)\n\n ws.on(\"open\", async () => {\n try {\n // Get the first page target\n ws.send(JSON.stringify({ id: 1, method: \"Target.getTargets\", params: {} }))\n\n let targetId: string | null = null\n let _sessionId: string | null = null\n let messageId = 2\n\n ws.on(\"message\", async (data) => {\n try {\n const message = JSON.parse(data.toString())\n\n // Handle getting targets\n if (message.id === 1) {\n // Check for CDP protocol errors (e.g., \"Not allowed\" in sandboxed environments)\n if (message.error) {\n clearTimeout(overallTimeout)\n ws.close()\n reject(\n new Error(\n `Browser protocol error: ${message.error.message || JSON.stringify(message.error)}. This may occur in sandboxed browser environments where certain CDP commands are restricted.`\n )\n )\n return\n }\n\n const pageTarget = message.result?.targetInfos?.find((t: Record<string, unknown>) => t.type === \"page\")\n if (!pageTarget) {\n clearTimeout(overallTimeout)\n ws.close()\n reject(new Error(\"No page targets found\"))\n return\n }\n\n targetId = pageTarget.targetId\n\n // Attach to the target\n ws.send(\n JSON.stringify({\n id: messageId++,\n method: \"Target.attachToTarget\",\n params: { targetId, flatten: true }\n })\n )\n return\n }\n\n // Handle session creation\n if (message.method === \"Target.attachedToTarget\") {\n _sessionId = message.params.sessionId\n\n // Now execute the requested action\n let cdpResult: Record<string, unknown>\n\n switch (action) {\n case \"click\": {\n let clickX: number\n let clickY: number\n\n // Support both coordinate-based and selector-based clicks\n if (typeof params.selector === \"string\") {\n // Get element coordinates from selector and ensure we click in the center\n const selectorResult = (await sendCDPCommand(ws, messageId++, \"Runtime.evaluate\", {\n expression: `(() => {\n const el = document.querySelector(${JSON.stringify(params.selector)});\n if (!el) return { found: false };\n const rect = el.getBoundingClientRect();\n // Calculate center point, rounding to avoid fractional pixels\n const centerX = Math.round(rect.left + rect.width / 2);\n const centerY = Math.round(rect.top + rect.height / 2);\n // Verify what element is at this point\n const elementAtPoint = document.elementFromPoint(centerX, centerY);\n const isCorrectElement = elementAtPoint === el || el.contains(elementAtPoint);\n return {\n found: true,\n x: centerX,\n y: centerY,\n width: rect.width,\n height: rect.height,\n elementAtPoint: elementAtPoint?.tagName + (elementAtPoint?.className ? '.' + elementAtPoint.className : ''),\n isCorrectElement: isCorrectElement\n };\n })()`,\n returnByValue: true\n })) as {\n result?: {\n value?: {\n found: boolean\n x?: number\n y?: number\n width?: number\n height?: number\n elementAtPoint?: string\n isCorrectElement?: boolean\n }\n }\n }\n\n if (\n selectorResult.result?.value?.found === true &&\n typeof selectorResult.result.value.x === \"number\" &&\n typeof selectorResult.result.value.y === \"number\"\n ) {\n clickX = selectorResult.result.value.x\n clickY = selectorResult.result.value.y\n\n // Log diagnostic info if element at point doesn't match\n if (selectorResult.result.value.isCorrectElement === false) {\n console.warn(\n `[execute_browser_action] Warning: Center point (${clickX}, ${clickY}) is over ${selectorResult.result.value.elementAtPoint}, not the target element. ` +\n `This may cause unexpected click behavior. Element size: ${selectorResult.result.value.width}x${selectorResult.result.value.height}`\n )\n }\n } else {\n throw new Error(`Element not found for selector: ${params.selector}`)\n }\n } else if (typeof params.x === \"number\" && typeof params.y === \"number\") {\n clickX = params.x\n clickY = params.y\n } else {\n throw new Error(\"Click action requires either {x, y} coordinates or a {selector} CSS selector\")\n }\n\n cdpResult = await sendCDPCommand(ws, messageId++, \"Input.dispatchMouseEvent\", {\n type: \"mousePressed\",\n x: clickX,\n y: clickY,\n button: \"left\",\n clickCount: 1\n })\n await sendCDPCommand(ws, messageId++, \"Input.dispatchMouseEvent\", {\n type: \"mouseReleased\",\n x: clickX,\n y: clickY,\n button: \"left\",\n clickCount: 1\n })\n break\n }\n\n case \"navigate\":\n if (typeof params.url !== \"string\") {\n throw new Error(\"Navigate action requires url parameter as string\")\n }\n cdpResult = await sendCDPCommand(ws, messageId++, \"Page.navigate\", { url: params.url })\n break\n\n case \"reload\":\n // Use CDP Page.reload for reliable page refresh that triggers CLS capture\n cdpResult = await sendCDPCommand(ws, messageId++, \"Page.reload\", {})\n break\n\n case \"screenshot\":\n ws.close()\n resolve({\n warning: \"Screenshot action is not recommended!\",\n advice:\n \"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.\",\n suggestion: \"Run fix_my_app to see all auto-captured screenshots from your session.\"\n })\n return\n\n case \"evaluate\": {\n if (typeof params.expression !== \"string\") {\n throw new Error(\"Evaluate action requires expression parameter as string\")\n }\n const expression = params.expression\n // Validate that the expression is safe (read-only DOM queries)\n // Block dangerous patterns\n const dangerousPatterns = [\n /eval\\s*\\(/,\n /Function\\s*\\(/,\n /setTimeout/,\n /setInterval/,\n /\\.innerHTML\\s*=/,\n /\\.outerHTML\\s*=/,\n /document\\.write/,\n /document\\.cookie\\s*=/,\n /localStorage\\.setItem/,\n /sessionStorage\\.setItem/,\n /\\.src\\s*=/,\n /\\.href\\s*=/,\n /location\\s*=/,\n /\\.addEventListener/,\n /\\.removeEventListener/,\n /new\\s+Function/,\n /import\\s*\\(/,\n /fetch\\s*\\(/,\n /XMLHttpRequest/\n ]\n\n if (dangerousPatterns.some((regex) => regex.test(expression))) {\n throw new Error(\n \"Expression contains dangerous patterns. Only safe read-only expressions allowed.\"\n )\n }\n\n cdpResult = await sendCDPCommand(ws, messageId++, \"Runtime.evaluate\", {\n expression: expression,\n returnByValue: true\n })\n break\n }\n\n case \"scroll\": {\n const scrollX = typeof params.deltaX === \"number\" ? params.deltaX : 0\n const scrollY = typeof params.deltaY === \"number\" ? params.deltaY : 0\n cdpResult = await sendCDPCommand(ws, messageId++, \"Input.dispatchMouseEvent\", {\n type: \"mouseWheel\",\n x: typeof params.x === \"number\" ? params.x : 500,\n y: typeof params.y === \"number\" ? params.y : 500,\n deltaX: scrollX,\n deltaY: scrollY\n })\n break\n }\n\n case \"type\":\n if (typeof params.text !== \"string\") {\n throw new Error(\"Type action requires text parameter as string\")\n }\n // Type each character\n for (const char of params.text) {\n await sendCDPCommand(ws, messageId++, \"Input.dispatchKeyEvent\", {\n type: \"char\",\n text: char\n })\n }\n cdpResult = { action: \"type\", text: params.text }\n break\n\n default:\n throw new Error(`Unsupported action: ${action}`)\n }\n\n ws.close()\n clearTimeout(overallTimeout)\n resolve(cdpResult)\n }\n } catch (error) {\n // Catch any errors that occur during message handling\n ws.close()\n clearTimeout(overallTimeout)\n reject(\n error instanceof Error\n ? error\n : new Error(`Browser action failed: ${error instanceof Error ? error.message : String(error)}`)\n )\n }\n })\n\n ws.on(\"error\", (error) => {\n clearTimeout(overallTimeout)\n reject(error)\n })\n\n // Helper function to send CDP commands\n async function sendCDPCommand(\n ws: WebSocket,\n id: number,\n method: string,\n params: Record<string, unknown>\n ): Promise<Record<string, unknown>> {\n return new Promise((cmdResolve, cmdReject) => {\n const command = { id, method, params }\n\n const messageHandler = (data: Buffer) => {\n const message = JSON.parse(data.toString())\n if (message.id === id) {\n ws.removeListener(\"message\", messageHandler)\n if (message.error) {\n cmdReject(new Error(message.error.message))\n } else {\n cmdResolve(message.result)\n }\n }\n }\n\n ws.on(\"message\", messageHandler)\n ws.send(JSON.stringify(command))\n\n // Command timeout (30 seconds for complex evaluate expressions)\n setTimeout(() => {\n ws.removeListener(\"message\", messageHandler)\n cmdReject(new Error(`CDP command timeout after 30s: ${method}`))\n }, 30000)\n })\n }\n } catch (error) {\n ws.close()\n clearTimeout(overallTimeout)\n reject(error)\n }\n })\n\n ws.on(\"error\", (error) => {\n clearTimeout(overallTimeout)\n reject(error)\n })\n })\n\n // Build success message with augmented suggestions\n let successMessage = `Browser action '${action}' executed successfully. Result: ${JSON.stringify(result, null, 2)}`\n\n // Add augmented suggestions for enhanced capabilities\n const canDelegateChrome = await canDelegateToChromeDevtools(\"inspect_element\")\n if (canDelegateChrome) {\n successMessage += \"\\n\\n🔗 **ENHANCED BROWSER ANALYSIS AVAILABLE**\"\n successMessage +=\n \"\\n\\ndev3000 completed the basic browser action above. For deeper browser insights, consider also:\"\n\n // Generate dynamic suggestions based on the action and available capabilities\n const dynamicSuggestions = await generateChromeDevtoolsSuggestions(action)\n const actionRelevantSuggestions = dynamicSuggestions.filter((suggestion) => {\n const funcName = suggestion.function.toLowerCase()\n const actionName = action.toLowerCase()\n\n // Match suggestions to specific actions\n if (actionName === \"screenshot\" && (funcName.includes(\"inspect\") || funcName.includes(\"performance\")))\n return true\n if (actionName === \"evaluate\" && (funcName.includes(\"console\") || funcName.includes(\"inspect\"))) return true\n if (actionName === \"navigate\" && (funcName.includes(\"network\") || funcName.includes(\"performance\"))) return true\n if (actionName === \"click\" && (funcName.includes(\"console\") || funcName.includes(\"inspect\"))) return true\n\n // Include high-priority suggestions regardless\n return suggestion.priority === \"high\"\n })\n\n actionRelevantSuggestions.slice(0, 2).forEach((suggestion) => {\n successMessage += `\\n• \\`dev3000-chrome-devtools:${suggestion.function}()\\` - ${suggestion.reason}`\n })\n\n successMessage +=\n \"\\n\\n💡 **Augmented approach:** Use dev3000 for basic automation, chrome-devtools for detailed analysis and debugging.\"\n }\n\n return {\n content: [\n {\n type: \"text\",\n text: successMessage\n }\n ]\n }\n } catch (error) {\n return {\n content: [\n {\n type: \"text\",\n text: `Browser action failed: ${error instanceof Error ? error.message : String(error)}`\n }\n ]\n }\n }\n}\n\n// MCP Integration and Workflow Orchestration Functions\n\n/**\n * Known MCP patterns for process detection\n */\nconst KNOWN_MCP_PATTERNS = {\n \"nextjs-dev\": [\n \"nextjs-dev\",\n \"nextjs-dev-mcp\",\n \"@modelcontextprotocol/server-nextjs-dev\",\n \"mcp-server-nextjs-dev\",\n \"nextjs-mcp\"\n ],\n \"chrome-devtools\": [\n \"chrome-devtools\",\n \"chrome-devtools-mcp\",\n \"@modelcontextprotocol/server-chrome-devtools\",\n \"mcp-server-chrome-devtools\",\n \"chrome-mcp\"\n ]\n}\n\n/**\n * Standard MCP ports to try pinging\n */\nconst STANDARD_MCP_PORTS = {\n \"nextjs-dev\": [3001, 3002, 8080, 8081],\n \"chrome-devtools\": [9222, 9223, 9224, 3003]\n}\n\n/**\n * Detect running processes that match known MCP patterns\n */\nasync function detectMcpProcesses(): Promise<string[]> {\n const detectedMcps: string[] = []\n\n try {\n // Get running processes on different platforms\n const platform = process.platform\n let psCommand: string\n\n if (platform === \"darwin\" || platform === \"linux\") {\n psCommand = \"ps aux\"\n } else if (platform === \"win32\") {\n psCommand = \"tasklist\"\n } else {\n logToDevFile(\"MCP Discovery: Unsupported platform for process detection\")\n return []\n }\n\n const { stdout } = await execAsync(psCommand)\n const processes = stdout.toLowerCase()\n\n // Check for each known MCP pattern\n for (const [mcpName, patterns] of Object.entries(KNOWN_MCP_PATTERNS)) {\n for (const pattern of patterns) {\n if (processes.includes(pattern.toLowerCase())) {\n if (!detectedMcps.includes(mcpName)) {\n detectedMcps.push(mcpName)\n logToDevFile(`MCP Discovery: Found ${mcpName} MCP via process detection [${pattern}]`)\n }\n break\n }\n }\n }\n } catch (error) {\n logToDevFile(`MCP Discovery: Process detection failed - ${error instanceof Error ? error.message : String(error)}`)\n }\n\n return detectedMcps\n}\n\n/**\n * Try to ping MCP services on standard ports\n */\nasync function pingMcpPorts(): Promise<string[]> {\n const detectedMcps: string[] = []\n\n for (const [mcpName, ports] of Object.entries(STANDARD_MCP_PORTS)) {\n for (const port of ports) {\n try {\n // Try HTTP health check first\n const response = await fetch(`http://localhost:${port}/health`, {\n method: \"GET\",\n signal: AbortSignal.timeout(2000)\n })\n\n if (response.ok) {\n detectedMcps.push(mcpName)\n logToDevFile(`MCP Discovery: Found ${mcpName} MCP via HTTP ping on port ${port}`)\n break\n }\n } catch {\n // Try WebSocket connection for MCP protocol\n try {\n const ws = new WebSocket(`ws://localhost:${port}`)\n await new Promise((resolve, reject) => {\n const timeout = setTimeout(() => {\n ws.close()\n reject(new Error(\"timeout\"))\n }, 1000)\n\n ws.on(\"open\", () => {\n clearTimeout(timeout)\n ws.close()\n detectedMcps.push(mcpName)\n logToDevFile(`MCP Discovery: Found ${mcpName} MCP via WebSocket ping on port ${port}`)\n resolve(null)\n })\n\n ws.on(\"error\", () => {\n clearTimeout(timeout)\n reject(new Error(\"connection failed\"))\n })\n })\n break\n } catch {}\n }\n }\n }\n\n return detectedMcps\n}\n\n/**\n * Comprehensive MCP discovery using multiple methods\n */\nexport async function discoverAvailableMcps(projectName?: string): Promise<string[]> {\n logToDevFile(\"MCP Discovery: Starting proactive MCP discovery\", projectName)\n\n const discoveredMcps = new Set<string>()\n\n // Method 1: Process detection\n const processDetected = await detectMcpProcesses()\n for (const mcp of processDetected) {\n discoveredMcps.add(mcp)\n }\n\n // Method 2: Check for dev3000-configured MCPs by testing their functionality\n try {\n // Test if dev3000-chrome-devtools MCP is working by checking Claude logs\n const cacheDir = `/Users/${process.env.USER}/Library/Caches/claude-cli-nodejs`\n const { readdirSync, existsSync } = await import(\"fs\")\n\n if (existsSync(cacheDir)) {\n const cacheDirs = readdirSync(cacheDir)\n const projectDir = cacheDirs.find((dir) => dir.includes(process.cwd().replace(/\\//g, \"-\")))\n\n if (projectDir) {\n const projectCacheDir = `${cacheDir}/${projectDir}`\n\n // Check for chrome-devtools MCP logs\n const chromeDevtoolsLogDir = `${projectCacheDir}/mcp-logs-dev3000-chrome-devtools`\n if (existsSync(chromeDevtoolsLogDir)) {\n const chromeDevtoolsLogs = readdirSync(chromeDevtoolsLogDir)\n if (chromeDevtoolsLogs.length > 0) {\n discoveredMcps.add(\"dev3000-chrome-devtools\")\n logToDevFile(\"MCP Discovery: Found dev3000-chrome-devtools via Claude cache logs\", projectName)\n }\n }\n\n // Check for nextjs-dev MCP logs\n const nextjsDevLogDir = `${projectCacheDir}/mcp-logs-dev3000-nextjs-dev`\n if (existsSync(nextjsDevLogDir)) {\n const nextjsDevLogs = readdirSync(nextjsDevLogDir)\n if (nextjsDevLogs.length > 0) {\n discoveredMcps.add(\"dev3000-nextjs-dev\")\n logToDevFile(\"MCP Discovery: Found dev3000-nextjs-dev via Claude cache logs\", projectName)\n }\n }\n }\n }\n } catch (_error) {\n logToDevFile(\"MCP Discovery: Claude cache check failed, falling back to port detection\", projectName)\n }\n\n // Method 3: Port pinging (fallback)\n if (discoveredMcps.size === 0) {\n logToDevFile(\"MCP Discovery: No MCPs found via process or cache detection, trying port pinging\", projectName)\n const portDetected = await pingMcpPorts()\n for (const mcp of portDetected) {\n discoveredMcps.add(mcp)\n }\n }\n\n const finalMcps = Array.from(discoveredMcps)\n\n if (finalMcps.length > 0) {\n logToDevFile(`MCP Discovery: Successfully discovered MCPs [${finalMcps.join(\", \")}]`, projectName)\n } else {\n logToDevFile(\"MCP Discovery: No MCPs detected - will run in standalone mode\", projectName)\n }\n\n return finalMcps\n}\n\n/**\n * Get and display MCP capabilities for debugging and inspection\n */\nexport async function getMcpCapabilities({\n mcpName\n}: GetMcpCapabilitiesParams = {}): Promise<{ content: Array<{ type: \"text\"; text: string }> }> {\n const results: string[] = []\n\n results.push(\"🔍 **MCP CAPABILITY INSPECTOR**\")\n results.push(\"\")\n\n try {\n // Discover available MCPs if no specific one requested\n const availableMcps = await discoverAvailableMcps()\n\n if (availableMcps.length === 0) {\n results.push(\"❌ **NO MCPs DETECTED**\")\n results.push(\"No dev3000-chrome-devtools or dev3000-nextjs-dev MCPs found.\")\n results.push(\"\")\n results.push(\"💡 **To enable enhanced capabilities:**\")\n results.push(\"• Ensure Chrome DevTools MCP is configured: `dev3000-chrome-devtools`\")\n results.push(\"• Ensure Next.js Dev MCP is configured: `dev3000-nextjs-dev`\")\n results.push(\"• Check that Claude Code has MCPs properly configured\")\n\n return {\n content: [{ type: \"text\", text: results.join(\"\\n\") }]\n }\n }\n\n results.push(`✅ **DISCOVERED MCPs:** ${availableMcps.join(\", \")}`)\n results.push(\"\")\n\n // Filter to specific MCP if requested\n const mcpsToInspect = mcpName ? availableMcps.filter((name) => name.includes(mcpName)) : availableMcps\n\n if (mcpsToInspect.length === 0 && mcpName) {\n results.push(`❌ **MCP NOT FOUND:** ${mcpName}`)\n results.push(`Available MCPs: ${availableMcps.join(\", \")}`)\n\n return {\n content: [{ type: \"text\", text: results.join(\"\\n\") }]\n }\n }\n\n // Inspect capabilities for each MCP\n for (const mcp of mcpsToInspect) {\n results.push(`📋 **${mcp.toUpperCase()} CAPABILITIES:**`)\n results.push(\"\")\n\n const capabilities = await discoverMcpCapabilities(mcp)\n\n if (capabilities.length === 0) {\n results.push(\" ❌ No capabilities discovered\")\n results.push(\" 💡 This might indicate the MCP is not properly configured or accessible\")\n results.push(\"\")\n continue\n }\n\n // Group by category\n const advanced = capabilities.filter((cap) => cap.category === \"advanced\")\n const basic = capabilities.filter((cap) => cap.category === \"basic\")\n\n results.push(` 🚀 **ADVANCED CAPABILITIES** (${advanced.length} functions):`)\n if (advanced.length > 0) {\n advanced.forEach((cap) => {\n results.push(` • \\`${cap.function}()\\` - ${cap.reason}`)\n })\n } else {\n results.push(\" No advanced capabilities discovered\")\n }\n results.push(\"\")\n\n results.push(` ⚙️ **BASIC CAPABILITIES** (${basic.length} functions):`)\n if (basic.length > 0) {\n basic.forEach((cap) => {\n results.push(` • \\`${cap.function}()\\` - ${cap.reason}`)\n })\n } else {\n results.push(\" No basic capabilities discovered\")\n }\n results.push(\"\")\n\n // Cache info\n const cached = MCP_CAPABILITY_CACHE.get(mcp)\n if (cached) {\n const age = Date.now() - cached.timestamp\n const ageMinutes = Math.floor(age / 60000)\n results.push(` 📝 **CACHE INFO:** Discovered ${ageMinutes} minutes ago`)\n if (age > CAPABILITY_CACHE_TTL * 0.8) {\n results.push(\" ⚠️ Cache will refresh soon on next use\")\n }\n }\n results.push(\"\")\n }\n\n // Summary\n const totalCapabilities = mcpsToInspect.reduce(async (accPromise, mcp) => {\n const acc = await accPromise\n const caps = await discoverMcpCapabilities(mcp)\n return acc + caps.length\n }, Promise.resolve(0))\n\n results.push(\"🎯 **AUGMENTED DELEGATION STATUS:**\")\n results.push(`• Total discovered capabilities: ${await totalCapabilities}`)\n results.push(\n `• MCPs with advanced capabilities: ${\n mcpsToInspect.filter(async (mcp) => {\n const caps = await discoverMcpCapabilities(mcp)\n return caps.some((cap) => cap.category === \"advanced\")\n }).length\n }`\n )\n results.push(\"• Dynamic discovery: ✅ Active (updates automatically)\")\n results.push(\"• Cache TTL: 5 minutes\")\n results.push(\"\")\n results.push(\"💡 **These capabilities are automatically suggested in dev3000's enhanced responses!**\")\n\n return {\n content: [{ type: \"text\", text: results.join(\"\\n\") }]\n }\n } catch (error) {\n results.push(`❌ **ERROR INSPECTING CAPABILITIES:** ${error instanceof Error ? error.message : String(error)}`)\n results.push(\"\")\n results.push(\"💡 **Troubleshooting:**\")\n results.push(\"• Check that MCPs are properly configured in Claude Code\")\n results.push(\"• Verify dev3000 can access Claude cache directories\")\n\n return {\n content: [{ type: \"text\", text: results.join(\"\\n\") }]\n }\n }\n}\n\n/**\n * Detect if pixel changes represent a layout shift (elements moving) vs content change (images loading)\n *\n * Key distinction:\n * - Layout shifts: Elements move to new positions (top region changes while bottom stays same)\n * - Content changes: Same regions change in-place (image loads with pixels appearing)\n */\nfunction detectLayoutShiftVsContentChange(\n prevPng: PNG,\n currPng: PNG\n): { isLayoutShift: boolean; shiftScore: number; isOverlayNoise: boolean } {\n const width = prevPng.width\n const height = prevPng.height\n\n // Track changes at row-level for detecting correlated shifts\n const rowChangeCounts = new Array(height).fill(0)\n\n // Count changed pixels per row (for correlation analysis)\n for (let y = 0; y < height; y++) {\n for (let x = 0; x < width; x++) {\n const idx = (width * y + x) << 2\n const rDiff = Math.abs(prevPng.data[idx] - currPng.data[idx])\n const gDiff = Math.abs(prevPng.data[idx + 1] - currPng.data[idx + 1])\n const bDiff = Math.abs(prevPng.data[idx + 2] - currPng.data[idx + 2])\n\n if (rDiff > 30 || gDiff > 30 || bDiff > 30) {\n rowChangeCounts[y]++\n }\n }\n }\n\n // Calculate percentage of pixels changed per row\n const rowChangePercents = rowChangeCounts.map((count) => (count / width) * 100)\n\n // Detect consecutive rows with high change (indicates shift boundary)\n // True CLS: Many consecutive rows change together (content moved as a block)\n let maxConsecutiveHighChangeRows = 0\n let currentConsecutive = 0\n\n for (let i = 0; i < height; i++) {\n if (rowChangePercents[i] > 50) {\n // >50% of row changed\n currentConsecutive++\n maxConsecutiveHighChangeRows = Math.max(maxConsecutiveHighChangeRows, currentConsecutive)\n } else {\n currentConsecutive = 0\n }\n }\n\n // Detect isolated hotspots (fixed/absolute overlay noise)\n // Pattern: low change → spike → low change (element appearing in place)\n let isolatedHotspots = 0\n const windowSize = 5\n\n for (let i = windowSize; i < height - windowSize; i++) {\n // Calculate average change in windows before, during, and after\n const before = rowChangePercents.slice(i - windowSize, i).reduce((a, b) => a + b, 0) / windowSize\n const during = rowChangePercents[i]\n const after = rowChangePercents.slice(i + 1, i + windowSize + 1).reduce((a, b) => a + b, 0) / windowSize\n\n // Isolated spike: calm before/after, high during\n if (before < 10 && during > 60 && after < 10) {\n isolatedHotspots++\n }\n }\n\n // Detect narrow fixed elements (toolbars, indicators)\n // Pattern: Many rows with LOW percentage change (5-25%) = narrow element across many rows\n // This catches toolbars/indicators that are thin but tall\n let narrowChangeRows = 0\n for (let i = 0; i < height; i++) {\n // Low but consistent change (narrow element)\n if (rowChangePercents[i] > 5 && rowChangePercents[i] < 25) {\n narrowChangeRows++\n }\n }\n\n // If many rows have narrow changes, this is likely a fixed toolbar/sidebar\n const hasNarrowFixedElement = narrowChangeRows > height * 0.3 // >30% of rows have narrow changes\n\n // Calculate band-based metrics for backward compatibility\n const bandHeight = Math.floor(height / 8)\n const bands = Array(8).fill(0)\n\n for (let y = 0; y < height; y++) {\n const bandIndex = Math.min(Math.floor(y / bandHeight), 7)\n bands[bandIndex] += rowChangeCounts[y]\n }\n\n const pixelsPerBand = width * bandHeight\n const bandPercentages = bands.map((count) => (count / pixelsPerBand) * 100)\n const topBandChange = (bandPercentages[0] + bandPercentages[1]) / 2\n const bottomBandChange = (bandPercentages[6] + bandPercentages[7]) / 2\n\n // Calculate variance to detect if changes are uniform (shift) or scattered (overlay)\n const meanChange = bandPercentages.reduce((a, b) => a + b, 0) / bandPercentages.length\n const variance = bandPercentages.reduce((sum, val) => sum + (val - meanChange) ** 2, 0) / bandPercentages.length\n\n // Determine if this is a layout shift or overlay noise\n // True layout shift indicators:\n // 1. Many consecutive rows changed (>20 rows = significant shift)\n // 2. Top heavy change pattern (topBandChange > bottomBandChange)\n // 3. Low variance (uniform change across bands)\n // 4. Few isolated hotspots\n\n const hasConsecutiveShift = maxConsecutiveHighChangeRows > 20\n const hasTopHeavyPattern = topBandChange > 5 && bottomBandChange < 2 && topBandChange > bottomBandChange * 2\n const hasUniformChange = variance < 200 && meanChange > 10\n const hasIsolatedHotspots = isolatedHotspots >= 3\n\n // Overlay noise indicators:\n // 1. High variance (scattered changes)\n // 2. Multiple isolated hotspots\n // 3. Few consecutive rows changed\n // 4. Narrow fixed element (toolbar/indicator pattern)\n const isOverlayNoise =\n hasNarrowFixedElement || // Narrow element like toolbar\n (hasIsolatedHotspots && !hasConsecutiveShift && (variance > 500 || meanChange < 10))\n\n // Layout shift: Either consecutive shift pattern OR traditional top-heavy pattern\n // But NOT if it looks like overlay noise\n const isLayoutShift = !isOverlayNoise && (hasConsecutiveShift || hasTopHeavyPattern || hasUniformChange)\n\n // Calculate shift score\n const totalChanged = bands.reduce((sum, count) => sum + count, 0)\n const totalPixels = width * height\n const shiftScore = (totalChanged / totalPixels) * 0.1\n\n return { isLayoutShift, shiftScore, isOverlayNoise }\n}\n\n/**\n * Detect jank/layout shifts by comparing screenshots from ScreencastManager\n * Returns array of jank detections with timing and visual impact data\n */\nasync function detectJankFromScreenshots(_projectName?: string): Promise<{\n detections: Array<{\n timestamp: string\n timeSinceStart: number\n visualDiff: number\n severity: \"low\" | \"medium\" | \"high\"\n element?: string\n clsScore?: number\n uxImpact?: string\n beforeFrameUrl?: string\n afterFrameUrl?: string\n }>\n sessionId: string\n totalFrames: number\n screenshotDir: string\n realCLS?: { score: number; grade: string }\n captureTrigger?: \"navigation\" | \"load\"\n}> {\n const screenshotDir = process.env.SCREENSHOT_DIR || join(tmpdir(), \"dev3000-mcp-deps\", \"public\", \"screenshots\")\n\n if (!existsSync(screenshotDir)) {\n return { detections: [], sessionId: \"\", totalFrames: 0, screenshotDir }\n }\n\n // Find the most recent screencast session (files like 2025-10-06T01-54-45Z-jank-*.png)\n const files = readdirSync(screenshotDir)\n .filter((f) => f.includes(\"-jank-\") && f.endsWith(\".png\"))\n .sort()\n .reverse()\n\n if (files.length === 0) {\n return { detections: [], sessionId: \"\", totalFrames: 0, screenshotDir }\n }\n\n // Get the most recent session ID (timestamp prefix)\n const latestSessionId = files[0].split(\"-jank-\")[0]\n const sessionFiles = files\n .filter((f) => f.startsWith(latestSessionId))\n .sort((a, b) => {\n // Extract timestamp (e.g., \"28ms\" from \"2025-10-06T01-54-45Z-jank-28ms.png\")\n const aTime = parseInt(a.match(/-(\\d+)ms\\.png$/)?.[1] || \"0\", 10)\n const bTime = parseInt(b.match(/-(\\d+)ms\\.png$/)?.[1] || \"0\", 10)\n return aTime - bTime\n })\n\n if (sessionFiles.length < 2) {\n return { detections: [], sessionId: latestSessionId, totalFrames: sessionFiles.length, screenshotDir }\n }\n\n // Try to read real CLS data from metadata\n const metadataPath = join(screenshotDir, `${latestSessionId}-metadata.json`)\n let realCLSData:\n | {\n score: number\n grade: string\n shifts: Array<{\n score: number\n timestamp: number\n sources?: Array<{ node?: string; position?: string | null }>\n }>\n }\n | undefined\n let captureTrigger: \"navigation\" | \"load\" | undefined\n\n if (existsSync(metadataPath)) {\n try {\n const metadata = JSON.parse(readFileSync(metadataPath, \"utf-8\"))\n // Capture the trigger type for use in output messages\n captureTrigger = metadata.captureTrigger\n // Set realCLSData even if there are zero shifts - this tells us Chrome ran and found nothing\n if (metadata.layoutShifts !== undefined) {\n realCLSData = {\n score: metadata.totalCLS || 0,\n grade: metadata.clsGrade || \"unknown\",\n shifts: metadata.layoutShifts\n }\n }\n } catch {\n // Ignore metadata read errors\n }\n }\n\n const jankDetections: Array<{\n timestamp: string\n timeSinceStart: number\n visualDiff: number\n severity: \"low\" | \"medium\" | \"high\"\n element?: string\n clsScore?: number\n uxImpact?: string\n beforeFrameUrl?: string\n afterFrameUrl?: string\n }> = []\n\n // Parse log file to extract Before/After frame URLs for each CLS event\n const frameUrlMap: Map<number, { before: string; after: string }> = new Map()\n try {\n const logPath = getLogPath(_projectName)\n if (logPath && existsSync(logPath)) {\n const logContent = readFileSync(logPath, \"utf-8\")\n const lines = logContent.split(\"\\n\")\n\n // Look for CLS entries with Before/After URLs\n // Format: [BROWSER] [CDP] CLS #N (score: X, time: Yms):\n // [BROWSER] [CDP] - <ELEMENT> shifted... (variable number of these)\n // [BROWSER] [CDP] Before: http://...\n // [BROWSER] [CDP] After: http://...\n for (let i = 0; i < lines.length; i++) {\n const clsMatch = lines[i].match(/\\[CDP\\] CLS #\\d+ \\(score: [\\d.]+, time: (\\d+)ms\\):/)\n if (clsMatch) {\n const timestamp = parseInt(clsMatch[1], 10)\n // Look ahead for Before and After URLs (scan next 10 lines for them)\n let beforeUrl: string | null = null\n let afterUrl: string | null = null\n\n for (let j = i + 1; j < Math.min(i + 10, lines.length); j++) {\n if (!beforeUrl) {\n const beforeMatch = lines[j].match(/Before:\\s+(http:\\/\\/\\S+)/)\n if (beforeMatch) beforeUrl = beforeMatch[1]\n }\n if (!afterUrl) {\n const afterMatch = lines[j].match(/After:\\s+(http:\\/\\/\\S+)/)\n if (afterMatch) afterUrl = afterMatch[1]\n }\n // Stop if we found both\n if (beforeUrl && afterUrl) {\n frameUrlMap.set(timestamp, {\n before: beforeUrl,\n after: afterUrl\n })\n break\n }\n }\n }\n }\n }\n } catch (_error) {\n // Ignore log parsing errors\n }\n\n // If we have real CLS data from Chrome's PerformanceObserver, trust it completely\n if (realCLSData) {\n // If Chrome says there are no shifts, validate with pixel diff as backup\n // Chrome's PerformanceObserver can miss very fast hydration shifts\n if (realCLSData.shifts.length === 0) {\n // Run pixel diff validation on early frames (first 1500ms) to catch hydration issues\n const earlyFrames = sessionFiles.filter((f) => {\n const timeMatch = f.match(/-(\\d+)ms\\.png$/)\n const time = timeMatch ? parseInt(timeMatch[1], 10) : 0\n return time < 1500 // Hydration window\n })\n\n let foundHydrationShift = false\n\n // Only check consecutive early frames\n for (let i = 1; i < earlyFrames.length && i < 10; i++) {\n const prevFile = join(screenshotDir, earlyFrames[i - 1])\n const currFile = join(screenshotDir, earlyFrames[i])\n\n try {\n const prevPng = PNG.sync.read(readFileSync(prevFile))\n const currPng = PNG.sync.read(readFileSync(currFile))\n\n if (prevPng.width !== currPng.width || prevPng.height !== currPng.height) {\n continue\n }\n\n // Detect if this is a layout shift vs content change vs overlay noise\n const shiftAnalysis = detectLayoutShiftVsContentChange(prevPng, currPng)\n\n // Skip if this looks like overlay noise (fixed/absolute elements like Next.js dev indicator or Vercel toolbar)\n if (shiftAnalysis.isOverlayNoise) {\n logToDevFile(\n `Pixel Diff Hydration: Skipping frame ${i} - detected overlay noise (fixed/absolute elements), not true CLS`\n )\n continue\n }\n\n // If we detect a true layout shift (not just content loading or overlay noise), flag it\n if (shiftAnalysis.isLayoutShift) {\n foundHydrationShift = true\n const timeMatch = earlyFrames[i].match(/-(\\d+)ms\\.png$/)\n const timeSinceStart = timeMatch ? parseInt(timeMatch[1], 10) : 0\n\n logToDevFile(\n `Pixel Diff Hydration: Detected true layout shift at ${timeSinceStart}ms (score: ${shiftAnalysis.shiftScore.toFixed(4)})`\n )\n\n const mcpPort = process.env.MCP_PORT || \"3684\"\n jankDetections.push({\n timestamp: `${timeSinceStart}ms`,\n timeSinceStart,\n visualDiff: shiftAnalysis.shiftScore * 100,\n severity: \"high\", // Hydration shifts are always high severity\n element: \"Hydration-related element\",\n clsScore: shiftAnalysis.shiftScore,\n uxImpact: \"🚨 CRITICAL: Fast hydration shift detected - Chrome's observer missed this early shift\",\n beforeFrameUrl: `http://localhost:${mcpPort}/api/screenshots/${earlyFrames[i - 1]}`,\n afterFrameUrl: `http://localhost:${mcpPort}/api/screenshots/${earlyFrames[i]}`\n })\n }\n } catch {\n // Skip frames that can't be compared\n }\n }\n\n // If we found hydration shifts, return them with a note\n if (foundHydrationShift) {\n return {\n detections: jankDetections,\n sessionId: latestSessionId,\n totalFrames: sessionFiles.length,\n screenshotDir,\n realCLS: { score: 0.05, grade: \"good\" } // Estimate CLS for hydration shifts\n }\n }\n\n // Chrome is correct - no shifts detected\n return {\n detections: [],\n sessionId: latestSessionId,\n totalFrames: sessionFiles.length,\n screenshotDir,\n realCLS: { score: 0, grade: realCLSData.grade }\n }\n }\n\n // Process actual layout shifts detected by Chrome\n // Trust Chrome's Layout Instability API - BUT ONLY if we can identify the culprit element\n // and verify it's not a fixed/absolute positioned overlay\n realCLSData.shifts.forEach((shift) => {\n const element = shift.sources?.[0]?.node || \"unknown\"\n const position = shift.sources?.[0]?.position\n\n // FILTER: Skip shifts where we couldn't identify the element\n // Chrome sometimes reports CLS for fixed overlays but fails to identify the element\n if (!shift.sources?.[0] || element === \"unknown\" || position === null || position === undefined) {\n logToDevFile(\n `Chrome CLS: Skipping unidentified shift (score: ${shift.score.toFixed(4)}) - cannot verify if it's a true CLS or fixed overlay noise`\n )\n return // Skip this shift - can't verify it's real\n }\n\n // FILTER: Skip fixed/absolute positioned elements - these are overlays, not true CLS\n if (position === \"fixed\" || position === \"absolute\") {\n logToDevFile(\n `Chrome CLS: Filtering out ${element} shift (position: ${position}) - fixed/absolute elements don't cause true layout shifts`\n )\n return // Skip this shift\n }\n\n const isCriticalElement = [\"NAV\", \"HEADER\", \"BUTTON\", \"A\"].includes(element.toUpperCase())\n const isDuringLoad = shift.timestamp < 1000 // First second\n\n // Make element names more descriptive\n const elementDescriptions: Record<string, string> = {\n NAV: \"Navigation header (<nav>)\",\n HEADER: \"Page header (<header>)\",\n BUTTON: \"Button (<button>)\",\n A: \"Link (<a>)\"\n }\n const elementDisplay = elementDescriptions[element.toUpperCase()] || element\n\n // UX impact assessment (not just CLS score!)\n let severity: \"low\" | \"medium\" | \"high\" = \"low\"\n let uxImpact = \"Minor visual adjustment\"\n\n if (isCriticalElement && isDuringLoad) {\n severity = \"high\"\n uxImpact = `🚨 CRITICAL: ${elementDisplay} shifted during initial load - highly visible and disruptive to user interaction`\n } else if (isCriticalElement) {\n severity = \"medium\"\n uxImpact = `⚠️ ${elementDisplay} shifted - affects navigation/interaction`\n } else if (isDuringLoad) {\n severity = \"medium\"\n uxImpact = \"Shift during page load - may cause mis-clicks\"\n }\n\n // Look up Before/After URLs for this shift timestamp\n const roundedTimestamp = Math.round(shift.timestamp)\n const frameUrls = frameUrlMap.get(roundedTimestamp)\n\n jankDetections.push({\n timestamp: `${shift.timestamp.toFixed(0)}ms`,\n timeSinceStart: roundedTimestamp,\n visualDiff: shift.score * 100, // Convert to percentage-like scale\n severity,\n element: elementDisplay,\n clsScore: shift.score,\n uxImpact,\n beforeFrameUrl: frameUrls?.before,\n afterFrameUrl: frameUrls?.after\n })\n })\n\n return {\n detections: jankDetections,\n sessionId: latestSessionId,\n totalFrames: sessionFiles.length,\n screenshotDir,\n realCLS: { score: realCLSData.score, grade: realCLSData.grade }\n }\n }\n\n // Fallback to pixel-diff if no real CLS data (old behavior)\n\n // Compare each frame with the previous frame\n for (let i = 1; i < sessionFiles.length; i++) {\n const prevFile = join(screenshotDir, sessionFiles[i - 1])\n const currFile = join(screenshotDir, sessionFiles[i])\n\n try {\n const prevPng = PNG.sync.read(readFileSync(prevFile))\n const currPng = PNG.sync.read(readFileSync(currFile))\n\n // Ensure same dimensions\n if (prevPng.width !== currPng.width || prevPng.height !== currPng.height) {\n continue\n }\n\n const diff = new PNG({ width: prevPng.width, height: prevPng.height })\n const numDiffPixels = pixelmatch(prevPng.data, currPng.data, diff.data, prevPng.width, prevPng.height, {\n threshold: 0.1\n })\n\n const totalPixels = prevPng.width * prevPng.height\n const diffPercentage = (numDiffPixels / totalPixels) * 100\n\n // Consider it jank if more than 1% of pixels changed (layout shift threshold)\n if (diffPercentage > 1) {\n const timeMatch = sessionFiles[i].match(/-(\\d+)ms\\.png$/)\n const timeSinceStart = timeMatch ? parseInt(timeMatch[1], 10) : 0\n\n jankDetections.push({\n timestamp: latestSessionId,\n timeSinceStart,\n visualDiff: diffPercentage,\n severity: diffPercentage > 10 ? \"high\" : diffPercentage > 5 ? \"medium\" : \"low\"\n })\n }\n } catch {\n // Skip frames that can't be compared\n }\n }\n\n return {\n detections: jankDetections,\n sessionId: latestSessionId,\n totalFrames: sessionFiles.length,\n screenshotDir,\n captureTrigger\n }\n}\n\n/**\n * Log MCP-related events to the project-specific D3K log file (NOT main project log)\n * This prevents Claude from seeing dev3000's orchestration logs as application errors\n */\nfunction logToDevFile(message: string, projectName?: string) {\n try {\n // Write to project-specific D3K log instead of main project log\n const homeDir = process.env.HOME || process.env.USERPROFILE\n if (!homeDir) return\n\n const debugLogDir = join(homeDir, \".d3k\", \"logs\")\n if (!existsSync(debugLogDir)) {\n mkdirSync(debugLogDir, { recursive: true })\n }\n\n // Use project name from parameter or try to detect from current session\n const actualProjectName = projectName || getCurrentProjectName()\n if (!actualProjectName) return\n\n const d3kLogFile = join(debugLogDir, `dev3000-${actualProjectName}-d3k.log`)\n const timestamp = new Date().toISOString()\n const logEntry = `[${timestamp}] [D3K] ${message}\\n`\n appendFileSync(d3kLogFile, logEntry)\n } catch (_error) {\n // Silently fail to avoid breaking MCP functionality\n }\n}\n\n/**\n * Get current project name from active sessions\n */\nfunction getCurrentProjectName(): string | null {\n try {\n const homeDir = process.env.HOME || process.env.USERPROFILE\n if (!homeDir) return null\n\n const sessionDir = join(homeDir, \".d3k\")\n if (!existsSync(sessionDir)) return null\n\n // Find the most recent session file\n const sessionFiles = readdirSync(sessionDir).filter((file) => file.endsWith(\".json\"))\n if (sessionFiles.length === 0) return null\n\n // Use the first session file's project name (could be improved to find the \"current\" one)\n const sessionFile = join(sessionDir, sessionFiles[0])\n const sessionData = JSON.parse(readFileSync(sessionFile, \"utf8\"))\n return sessionData.projectName || null\n } catch {\n return null\n }\n}\n\n/**\n * Detect available MCPs and set integration flags\n */\nexport function detectMcpIntegrations(\n availableMcps: string[],\n projectName?: string\n): {\n integrateNextjs: boolean\n integrateChromeDevtools: boolean\n} {\n const integrateNextjs = availableMcps.includes(\"nextjs-dev\")\n const integrateChromeDevtools = availableMcps.includes(\"chrome-devtools\")\n\n // Log MCP detection results\n if (availableMcps.length > 0) {\n logToDevFile(`MCP Detection: Available MCPs [${availableMcps.join(\", \")}]`, projectName)\n\n const integrations: string[] = []\n if (integrateNextjs) integrations.push(\"Next.js\")\n if (integrateChromeDevtools) integrations.push(\"Chrome DevTools\")\n\n if (integrations.length > 0) {\n logToDevFile(`MCP Integration: Activated integrations [${integrations.join(\", \")}]`, projectName)\n } else {\n logToDevFile(\"MCP Integration: No compatible MCPs detected - running in standalone mode\", projectName)\n }\n } else {\n logToDevFile(\"MCP Detection: No MCPs provided - running in standalone mode\", projectName)\n }\n\n return {\n integrateNextjs,\n integrateChromeDevtools\n }\n}\n\n/**\n * Calculate estimated time based on available tools and error complexity\n */\nexport function calculateEstimatedTime(errorCount: number, hasIntegrations: boolean): string {\n const baseTime = Math.min(errorCount * 2, 20) // 2 minutes per error, max 20 minutes\n const integrationBonus = hasIntegrations ? 0.5 : 1 // 50% faster with integrations\n const totalMinutes = Math.ceil(baseTime * integrationBonus)\n\n if (totalMinutes <= 5) return `${totalMinutes} minutes`\n if (totalMinutes <= 60) return `${totalMinutes} minutes`\n return `${Math.ceil(totalMinutes / 60)} hours`\n}\n\n/**\n * Generate dynamic Next.js specific MCP function suggestions based on discovered capabilities\n */\nexport async function generateNextjsSuggestions(errorContext?: string): Promise<McpFunctionSuggestion[]> {\n try {\n // Get dynamic capabilities from the MCP\n const capabilities = await discoverMcpCapabilities(\"dev3000-nextjs-dev\")\n\n // Filter for advanced capabilities and create suggestions\n const suggestions: McpFunctionSuggestion[] = capabilities\n .filter((cap) => cap.category === \"advanced\")\n .slice(0, 8) // Limit to most relevant suggestions\n .map((cap) => ({\n function: cap.function,\n reason: cap.reason,\n priority: determinePriority(cap.function, errorContext) as \"high\" | \"medium\" | \"low\"\n }))\n\n logToDevFile(\n `Dynamic Suggestions: Generated ${suggestions.length} Next.js suggestions from ${capabilities.length} discovered capabilities`\n )\n\n return suggestions\n } catch (error) {\n logToDevFile(`Dynamic Suggestions: Failed to generate Next.js suggestions - ${error}`)\n\n // Fallback to basic suggestions if discovery fails\n return [\n {\n function: \"analyze_build_process\",\n reason: \"Advanced Next.js build system analysis\",\n priority: \"high\"\n },\n {\n function: \"debug_server_rendering\",\n reason: \"Server-side rendering debugging\",\n priority: \"high\"\n }\n ]\n }\n}\n\n/**\n * Generate dynamic Chrome DevTools specific MCP function suggestions based on discovered capabilities\n */\nexport async function generateChromeDevtoolsSuggestions(errorContext?: string): Promise<McpFunctionSuggestion[]> {\n try {\n // Get dynamic capabilities from the MCP\n const capabilities = await discoverMcpCapabilities(\"dev3000-chrome-devtools\")\n\n // Filter for advanced capabilities and create suggestions\n const suggestions: McpFunctionSuggestion[] = capabilities\n .filter((cap) => cap.category === \"advanced\")\n .slice(0, 8) // Limit to most relevant suggestions\n .map((cap) => ({\n function: cap.function,\n reason: cap.reason,\n priority: determinePriority(cap.function, errorContext) as \"high\" | \"medium\" | \"low\"\n }))\n\n logToDevFile(\n `Dynamic Suggestions: Generated ${suggestions.length} Chrome DevTools suggestions from ${capabilities.length} discovered capabilities`\n )\n\n return suggestions\n } catch (error) {\n logToDevFile(`Dynamic Suggestions: Failed to generate Chrome DevTools suggestions - ${error}`)\n\n // Fallback to basic suggestions if discovery fails\n return [\n {\n function: \"inspect_element\",\n reason: \"Deep DOM inspection with DevTools-level detail\",\n priority: \"high\"\n },\n {\n function: \"access_console\",\n reason: \"Direct browser console access and manipulation\",\n priority: \"high\"\n }\n ]\n }\n}\n\n/**\n * Determine priority of a capability based on error context and function relevance\n */\nfunction determinePriority(functionName: string, errorContext?: string): \"high\" | \"medium\" | \"low\" {\n const name = functionName.toLowerCase()\n const context = errorContext?.toLowerCase() || \"\"\n\n // High priority matches - function directly relates to error context\n const highPriorityPatterns = [\n { pattern: /hydration/, keywords: [\"hydration\", \"ssr\", \"render\"] },\n { pattern: /build|compile/, keywords: [\"build\", \"compile\", \"analyze\"] },\n { pattern: /network|fetch|api/, keywords: [\"network\", \"request\", \"intercept\", \"performance\"] },\n { pattern: /console|error/, keywords: [\"console\", \"error\", \"debug\"] },\n { pattern: /click|interaction/, keywords: [\"dom\", \"element\", \"inspect\"] }\n ]\n\n for (const { pattern, keywords } of highPriorityPatterns) {\n if (pattern.test(context) && keywords.some((keyword) => name.includes(keyword))) {\n return \"high\"\n }\n }\n\n // Medium priority - advanced debugging capabilities\n const mediumPriorityKeywords = [\"debug\", \"profile\", \"analyze\", \"trace\", \"inspect\"]\n if (mediumPriorityKeywords.some((keyword) => name.includes(keyword))) {\n return \"medium\"\n }\n\n // Low priority - basic or less critical functions\n return \"low\"\n}\n\n/**\n * Create integrated workflow with 3-phase debugging plan\n */\nexport async function createIntegratedWorkflow({\n availableMcps,\n focusArea = \"all\",\n errorContext\n}: CreateIntegratedWorkflowParams): Promise<{ content: Array<{ type: \"text\"; text: string }> }> {\n const results: string[] = []\n\n // Log workflow creation\n logToDevFile(\n `Workflow Creation: Creating integrated workflow with focus area [${focusArea}]${errorContext ? `, error context [${errorContext}]` : \"\"}`\n )\n\n // Use provided MCPs or discover them proactively\n let finalMcps: string[] = availableMcps || []\n if (!availableMcps || availableMcps.length === 0) {\n logToDevFile(\"Workflow Creation: No MCPs provided, starting proactive discovery\")\n finalMcps = await discoverAvailableMcps()\n }\n\n // Detect available integrations\n const { integrateNextjs, integrateChromeDevtools } = detectMcpIntegrations(finalMcps)\n\n results.push(\"🎼 **INTELLIGENT DEBUGGING ORCHESTRATOR**\")\n results.push(`🔍 Available MCPs: ${finalMcps.length > 0 ? finalMcps.join(\", \") : \"none (will attempt discovery)\"}`)\n results.push(\n `⚡ Integrations: ${integrateNextjs ? \"✅ Next.js\" : \"❌ Next.js\"} | ${integrateChromeDevtools ? \"✅ Chrome DevTools\" : \"❌ Chrome DevTools\"}`\n )\n\n if (errorContext) {\n results.push(`🎯 Error Context: ${errorContext}`)\n }\n results.push(\"\")\n\n // Generate MCP-specific suggestions\n const nextjsSuggestions = integrateNextjs ? await generateNextjsSuggestions(errorContext) : []\n const chromeSuggestions = integrateChromeDevtools ? await generateChromeDevtoolsSuggestions(errorContext) : []\n\n if (!integrateNextjs && !integrateChromeDevtools) {\n results.push(\"⚠️ **NO INTEGRATIONS DETECTED**\")\n results.push(\"Running in standalone mode. For enhanced debugging:\")\n results.push(\"• Add 'nextjs-dev' MCP for Next.js-specific analysis\")\n results.push(\"• Add 'chrome-devtools' MCP for browser inspection\")\n results.push(\"\")\n results.push(\"💡 **STANDALONE WORKFLOW:**\")\n results.push(\"1. Use fix_my_app(mode='snapshot') to analyze current issues\")\n results.push(\"2. Use execute_browser_action to reproduce and verify fixes\")\n results.push(\"3. Implement suggested code fixes\")\n\n return {\n content: [{ type: \"text\", text: results.join(\"\\n\") }]\n }\n }\n\n // Create 3-phase integrated workflow\n results.push(\"🎪 **3-PHASE INTEGRATED WORKFLOW**\")\n results.push(\"\")\n\n // Phase 1: Parallel Data Collection\n results.push(\"🕐 **PHASE 1: PARALLEL DATA COLLECTION** (2-3 minutes)\")\n results.push(\"Execute these functions in parallel across all available MCPs:\")\n results.push(\"\")\n\n results.push(\"📊 **dev3000 (this MCP):**\")\n results.push(\n `• fix_my_app(focusArea='${focusArea}', integrateNextjs=${integrateNextjs}, integrateChromeDevtools=${integrateChromeDevtools}, returnRawData=true)`\n )\n results.push(\" → Get comprehensive error analysis with interaction data\")\n results.push(\"\")\n\n if (integrateNextjs) {\n results.push(\"⚛️ **nextjs-dev MCP:**\")\n nextjsSuggestions\n .filter((s) => s.priority === \"high\")\n .forEach((suggestion) => {\n const params = suggestion.params\n ? `(${Object.entries(suggestion.params)\n .map(([k, v]) => `${k}=${JSON.stringify(v)}`)\n .join(\", \")})`\n : \"()\"\n results.push(`• ${suggestion.function}${params}`)\n results.push(` → ${suggestion.reason}`)\n })\n results.push(\"\")\n }\n\n if (integrateChromeDevtools) {\n results.push(\"🌐 **chrome-devtools MCP:**\")\n chromeSuggestions\n .filter((s) => s.priority === \"high\")\n .forEach((suggestion) => {\n const params = suggestion.params\n ? `(${Object.entries(suggestion.params)\n .map(([k, v]) => `${k}=${JSON.stringify(v)}`)\n .join(\", \")})`\n : \"()\"\n results.push(`• ${suggestion.function}${params}`)\n results.push(` → ${suggestion.reason}`)\n })\n results.push(\"\")\n }\n\n // Phase 2: Deep Analysis\n results.push(\"🕑 **PHASE 2: DEEP TARGETED ANALYSIS** (3-5 minutes)\")\n results.push(\"Based on Phase 1 findings, execute these functions sequentially:\")\n results.push(\"\")\n\n results.push(\"🔗 **Cross-MCP Correlation:**\")\n results.push(\"• Compare dev3000 interaction data with browser console errors\")\n if (integrateNextjs) {\n results.push(\"• Correlate dev3000 server errors with Next.js build/runtime logs\")\n results.push(\"• Match interaction timestamps with Next.js request handling\")\n }\n results.push(\"• Identify root cause by combining all data sources\")\n results.push(\"\")\n\n results.push(\"🎯 **Targeted Deep Dive:**\")\n results.push(\"• Use fix_my_app(mode='bisect') for regression analysis if needed\")\n if (integrateChromeDevtools) {\n chromeSuggestions\n .filter((s) => s.priority === \"medium\")\n .forEach((suggestion) => {\n const params = suggestion.params\n ? `(${Object.entries(suggestion.params)\n .map(([k, v]) => `${k}=${JSON.stringify(v)}`)\n .join(\", \")})`\n : \"()\"\n results.push(`• ${suggestion.function}${params} - ${suggestion.reason}`)\n })\n }\n results.push(\"\")\n\n // Phase 3: Fix Implementation & Verification\n results.push(\"🕒 **PHASE 3: FIX IMPLEMENTATION & VERIFICATION** (5-10 minutes)\")\n results.push(\"Orchestrated fix implementation with cross-MCP verification:\")\n results.push(\"\")\n\n results.push(\"🔧 **Implementation:**\")\n results.push(\"• Apply code fixes identified by dev3000 error analysis\")\n if (integrateNextjs) {\n results.push(\"• Address Next.js-specific issues (hydration, build, etc.)\")\n }\n results.push(\"• Use dev3000's interaction data to create comprehensive test scenarios\")\n results.push(\"\")\n\n results.push(\"✅ **Verification Workflow:**\")\n results.push(\"• Use execute_browser_action to replay exact user interactions that caused errors\")\n if (integrateChromeDevtools) {\n results.push(\"• Use chrome-devtools to monitor console for error resolution\")\n results.push(\"• Take before/after screenshots to verify UI fixes\")\n }\n if (integrateNextjs) {\n results.push(\"• Use nextjs-dev to verify build success and runtime stability\")\n }\n results.push(\"• Re-run fix_my_app to confirm error resolution\")\n results.push(\"\")\n\n // Integration Benefits\n results.push(\"🚀 **INTEGRATION BENEFITS:**\")\n\n if (integrateNextjs && integrateChromeDevtools) {\n results.push(\"🎯 **Triple-Stack Coverage:**\")\n results.push(\"• dev3000: AI-powered error correlation + interaction replay\")\n results.push(\"• nextjs-dev: Framework-specific server-side analysis\")\n results.push(\"• chrome-devtools: Precise browser state inspection\")\n results.push(\"• Combined: Complete full-stack debugging with 90%+ issue resolution\")\n results.push(\"\")\n results.push(\"⚡ **Expected Results:**\")\n results.push(\"• 3x faster debugging vs using tools individually\")\n results.push(\"• AI-powered error correlation across all layers\")\n results.push(\"• Systematic fix verification workflow\")\n results.push(\"• Comprehensive interaction-based testing\")\n } else if (integrateNextjs) {\n results.push(\"🎯 **Server-Side Enhanced Coverage:**\")\n results.push(\"• dev3000: Client error analysis + interaction data\")\n results.push(\"• nextjs-dev: Server-side logs and build analysis\")\n results.push(\"• Combined: Full-stack Next.js debugging coverage\")\n } else if (integrateChromeDevtools) {\n results.push(\"🎯 **Browser-Enhanced Coverage:**\")\n results.push(\"• dev3000: Error detection + interaction replay\")\n results.push(\"• chrome-devtools: Detailed browser state inspection\")\n results.push(\"• Combined: Complete client-side debugging workflow\")\n }\n\n const estimatedTime = calculateEstimatedTime(5, integrateNextjs || integrateChromeDevtools) // Assume 5 errors for estimation\n results.push(\"\")\n results.push(`⏱️ **ESTIMATED TOTAL TIME:** ${estimatedTime}`)\n results.push(`🎼 **dev3000 orchestrates ${finalMcps.length} MCPs for maximum debugging power!**`)\n\n return {\n content: [{ type: \"text\", text: results.join(\"\\n\") }]\n }\n}\n\n/**\n * Visual diff analyzer - provides instructions for Claude to load and compare two images\n */\nexport async function analyzeVisualDiff(params: {\n beforeImageUrl: string\n afterImageUrl: string\n context?: string\n}): Promise<{ content: Array<{ type: \"text\"; text: string }> }> {\n const { beforeImageUrl, afterImageUrl, context } = params\n\n const results: string[] = []\n\n results.push(\"🔍 **VISUAL DIFF ANALYSIS**\")\n results.push(\"\")\n results.push(\"To analyze the visual differences between these two screenshots:\")\n results.push(\"\")\n results.push(\"**Step 1: Fetch and analyze the BEFORE image**\")\n results.push(`Use WebFetch with URL: \\`${beforeImageUrl}\\``)\n results.push(`Prompt: \"Describe this screenshot in detail, focusing on layout and visible elements\"`)\n results.push(\"\")\n results.push(\"**Step 2: Fetch and analyze the AFTER image**\")\n results.push(`Use WebFetch with URL: \\`${afterImageUrl}\\``)\n results.push(`Prompt: \"Describe this screenshot in detail, focusing on layout and visible elements\"`)\n results.push(\"\")\n results.push(\"**Step 3: Compare and describe the differences**\")\n\n if (context) {\n results.push(`Focus on: ${context}`)\n } else {\n results.push(\"Look for:\")\n results.push(\"• Elements that appeared or disappeared\")\n results.push(\"• Elements that moved or changed position\")\n results.push(\"• Elements that changed size or style\")\n results.push(\"• New content that pushed existing content\")\n }\n\n results.push(\"\")\n results.push(\"**Step 4: Identify the layout shift cause**\")\n results.push(\"Describe what visual change occurred that caused the layout shift.\")\n results.push(\"Be specific about:\")\n results.push(\"• Which element(s) changed\")\n results.push(\"• What appeared/moved/resized\")\n results.push(\"• Why this caused other elements to shift\")\n\n return {\n content: [{ type: \"text\", text: results.join(\"\\n\") }]\n }\n}\n\nexport async function findComponentSource(params: {\n selector: string\n projectName?: string\n}): Promise<{ content: Array<{ type: \"text\"; text: string }> }> {\n const { selector } = params\n\n try {\n const sessions = findActiveSessions()\n if (sessions.length === 0) {\n return {\n content: [\n {\n type: \"text\",\n text: \"❌ **NO ACTIVE SESSIONS**\\n\\nNo active dev3000 sessions found. Make sure your app is running with dev3000.\"\n }\n ]\n }\n }\n\n const sessionData = JSON.parse(readFileSync(sessions[0].sessionFile, \"utf-8\"))\n let cdpUrl = sessionData.cdpUrl\n\n if (!cdpUrl) {\n try {\n const response = await fetch(\"http://localhost:9222/json\")\n const pages = await response.json()\n const activePage = pages.find(\n (page: { type: string; url: string }) => page.type === \"page\" && !page.url.startsWith(\"chrome://\")\n )\n if (activePage) {\n cdpUrl = activePage.webSocketDebuggerUrl\n }\n } catch {\n return {\n content: [\n {\n type: \"text\",\n text: \"❌ **NO CDP CONNECTION**\\n\\nFailed to find Chrome DevTools Protocol URL.\"\n }\n ]\n }\n }\n }\n\n if (!cdpUrl) {\n return {\n content: [\n {\n type: \"text\",\n text: \"❌ **NO CDP CONNECTION**\\n\\nNo Chrome DevTools Protocol URL found.\"\n }\n ]\n }\n }\n\n // Execute the component extraction script\n const extractScript = `\n (function() {\n try {\n const element = document.querySelector(${JSON.stringify(selector)});\n if (!element) {\n return { error: \"Element not found with selector: ${selector}\" };\n }\n\n // Try to find React Fiber\n const fiberKey = Object.keys(element).find(k => k.startsWith(\"__reactFiber$\"));\n if (!fiberKey) {\n return { error: \"No React internals found - element may not be a React component\" };\n }\n\n const fiber = element[fiberKey];\n let componentFunction = null;\n let componentName = \"Unknown\";\n\n // Walk up the fiber tree to find a function component\n let current = fiber;\n let depth = 0;\n\n while (current && depth < 10) {\n if (typeof current.type === 'function') {\n componentFunction = current.type;\n componentName = current.type.name || current.type.displayName || \"Anonymous\";\n break;\n }\n current = current.return;\n depth++;\n }\n\n if (!componentFunction) {\n return { error: \"Could not find component function in fiber tree\" };\n }\n\n // Get the source code\n const sourceCode = componentFunction.toString();\n\n return {\n success: true,\n componentName,\n sourceCode\n };\n } catch (error) {\n return { error: error.message };\n }\n })()\n `\n\n const result = await new Promise<unknown>((resolve, reject) => {\n const ws = new WebSocket(cdpUrl)\n let evalId: number | null = null\n let resolved = false\n\n const timeout = setTimeout(() => {\n if (!resolved) {\n resolved = true\n ws.close()\n reject(new Error(\"CDP evaluation timeout after 5 seconds\"))\n }\n }, 5000)\n\n ws.on(\"open\", async () => {\n try {\n ws.send(JSON.stringify({ id: 1, method: \"Target.getTargets\", params: {} }))\n\n let messageId = 2\n\n ws.on(\"message\", async (data) => {\n const message = JSON.parse(data.toString())\n\n if (message.id === 1) {\n // Check for CDP protocol errors (e.g., \"Not allowed\" in sandboxed environments)\n if (message.error) {\n clearTimeout(timeout)\n resolved = true\n ws.close()\n reject(\n new Error(\n `Browser protocol error: ${message.error.message || JSON.stringify(message.error)}. This may occur in sandboxed browser environments where certain CDP commands are restricted.`\n )\n )\n return\n }\n\n const pageTarget = message.result?.targetInfos?.find((t: Record<string, unknown>) => t.type === \"page\")\n if (!pageTarget) {\n clearTimeout(timeout)\n resolved = true\n ws.close()\n reject(new Error(\"No page targets found\"))\n return\n }\n\n ws.send(\n JSON.stringify({\n id: messageId++,\n method: \"Target.attachToTarget\",\n params: { targetId: pageTarget.targetId, flatten: true }\n })\n )\n return\n }\n\n if (message.method === \"Target.attachedToTarget\") {\n evalId = messageId++\n ws.send(\n JSON.stringify({\n id: evalId,\n method: \"Runtime.evaluate\",\n params: { expression: extractScript, returnByValue: true }\n })\n )\n return\n }\n\n if (evalId !== null && message.id === evalId) {\n clearTimeout(timeout)\n resolved = true\n ws.close()\n if (message.error) {\n reject(new Error(message.error.message))\n } else {\n const value = message.result?.result?.value\n resolve(value)\n }\n }\n })\n\n ws.on(\"error\", (err) => {\n clearTimeout(timeout)\n if (!resolved) {\n resolved = true\n reject(err)\n }\n })\n } catch (error) {\n clearTimeout(timeout)\n resolved = true\n ws.close()\n reject(error)\n }\n })\n\n ws.on(\"error\", (err) => {\n clearTimeout(timeout)\n if (!resolved) {\n resolved = true\n reject(err)\n }\n })\n })\n\n const evalResult = result as\n | { error: string }\n | {\n success: true\n componentName: string\n sourceCode: string\n }\n\n if (\"error\" in evalResult) {\n return {\n content: [\n {\n type: \"text\",\n text: `❌ **ERROR EXTRACTING COMPONENT**\\n\\n${evalResult.error}\\n\\n💡 **TIPS:**\\n• Make sure the selector matches an element on the page\\n• Ensure the element is rendered by a React component\\n• Try a simpler selector like 'nav' or '.header'`\n }\n ]\n }\n }\n\n if (!evalResult.success) {\n return {\n content: [\n {\n type: \"text\",\n text: \"❌ **FAILED TO EXTRACT COMPONENT**\\n\\nUnexpected result format.\"\n }\n ]\n }\n }\n\n // Extract unique patterns from the source code\n const { componentName, sourceCode } = evalResult\n const patterns: string[] = []\n\n // Look for unique JSX patterns (excluding common ones like <div>, <span>)\n const jsxPattern = /<([A-Z][a-zA-Z0-9]*)/g\n const customComponents = new Set<string>()\n let jsxMatch = jsxPattern.exec(sourceCode)\n\n while (jsxMatch !== null) {\n customComponents.add(jsxMatch[1])\n jsxMatch = jsxPattern.exec(sourceCode)\n }\n\n // Look for unique className patterns\n const classNamePattern = /className=[\"']([^\"']+)[\"']/g\n const classNames = new Set<string>()\n let classNameMatch = classNamePattern.exec(sourceCode)\n\n while (classNameMatch !== null) {\n classNames.add(classNameMatch[1])\n classNameMatch = classNamePattern.exec(sourceCode)\n }\n\n // Build search patterns\n const lines: string[] = []\n lines.push(\"🔍 **COMPONENT SOURCE FINDER**\")\n lines.push(\"\")\n lines.push(`**Selector:** \\`${selector}\\``)\n lines.push(`**Component:** ${componentName}`)\n lines.push(\"\")\n\n if (componentName !== \"Anonymous\") {\n patterns.push(`function ${componentName}`)\n patterns.push(`const ${componentName} =`)\n patterns.push(`export default function ${componentName}`)\n }\n\n // Add unique component references\n if (customComponents.size > 0) {\n const uniqueComponents = Array.from(customComponents).filter(\n (name) => ![\"Fragment\", \"Suspense\", \"ErrorBoundary\"].includes(name)\n )\n if (uniqueComponents.length > 0) {\n patterns.push(`<${uniqueComponents[0]}`)\n }\n }\n\n // Add unique classNames\n if (classNames.size > 0) {\n const firstClassName = Array.from(classNames)[0]\n patterns.push(`className=\"${firstClassName}\"`)\n }\n\n if (patterns.length === 0) {\n lines.push(\"⚠️ **NO UNIQUE PATTERNS FOUND**\")\n lines.push(\"\")\n lines.push(\"The component source code doesn't contain distinctive patterns to search for.\")\n lines.push(\"You may need to manually search for the component.\")\n } else {\n lines.push(\"📍 **SEARCH PATTERNS**\")\n lines.push(\"\")\n lines.push(\"Use these grep patterns to find the source file:\")\n lines.push(\"\")\n\n for (const pattern of patterns.slice(0, 3)) {\n lines.push(`\\`\\`\\``)\n lines.push(`grep -r \"${pattern.replace(/\"/g, '\\\\\"')}\" .`)\n lines.push(`\\`\\`\\``)\n lines.push(\"\")\n }\n\n lines.push(\"💡 **TIP:** Start with the first pattern. If it returns multiple results, try combining patterns.\")\n }\n\n // Show a preview of the source code\n const preview = sourceCode.substring(0, 300)\n lines.push(\"\")\n lines.push(\"**Source Code Preview:**\")\n lines.push(\"```javascript\")\n lines.push(`${preview}...`)\n lines.push(\"```\")\n\n return {\n content: [{ type: \"text\", text: lines.join(\"\\n\") }]\n }\n } catch (error) {\n return {\n content: [\n {\n type: \"text\",\n text: `❌ **ERROR**\\n\\n${error instanceof Error ? error.message : String(error)}`\n }\n ]\n }\n }\n}\n\n/**\n * Restart the development server while preserving logs and monitoring\n */\nexport async function restartDevServer(params: {\n projectName?: string\n}): Promise<{ content: Array<{ type: \"text\"; text: string }> }> {\n const { projectName } = params\n\n try {\n // Find active session\n const sessions = findActiveSessions()\n if (sessions.length === 0) {\n return {\n content: [\n {\n type: \"text\",\n text: \"❌ **NO ACTIVE SESSIONS**\\n\\nNo active dev3000 sessions found. Make sure your app is running with dev3000.\"\n }\n ]\n }\n }\n\n // Use specified project or first available session\n let targetSession = sessions[0]\n if (projectName) {\n const found = sessions.find((s) => s.projectName === projectName)\n if (found) {\n targetSession = found\n }\n }\n\n const sessionData = JSON.parse(readFileSync(targetSession.sessionFile, \"utf-8\"))\n const appPort = sessionData.appPort\n const serverCommand = sessionData.serverCommand\n const cwd = sessionData.cwd\n\n if (!appPort) {\n return {\n content: [\n {\n type: \"text\",\n text: \"❌ **NO APP PORT FOUND**\\n\\nSession file doesn't contain app port information.\"\n }\n ]\n }\n }\n\n if (!serverCommand) {\n return {\n content: [\n {\n type: \"text\",\n 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.\"\n }\n ]\n }\n }\n\n logToDevFile(\n `Restart Dev Server: Starting restart for project [${targetSession.projectName}] on port ${appPort} with command [${serverCommand}]`\n )\n\n // Check if nextjs-dev MCP is available\n const availableMcps = await discoverAvailableMcps(targetSession.projectName)\n const hasNextjsDev = availableMcps.includes(\"nextjs-dev\")\n\n logToDevFile(`Restart Dev Server: Has nextjs-dev MCP: ${hasNextjsDev}`)\n\n // Try nextjs-dev MCP first if available\n if (hasNextjsDev) {\n try {\n logToDevFile(\"Restart Dev Server: Attempting to use nextjs-dev MCP restart\")\n\n // Check if nextjs-dev has restart capability\n const capabilities = await getMcpCapabilities({ mcpName: \"nextjs-dev\" })\n const capabilitiesText =\n capabilities.content[0] && \"text\" in capabilities.content[0] ? capabilities.content[0].text : \"\"\n\n if (capabilitiesText.includes(\"restart\") || capabilitiesText.includes(\"reload\")) {\n logToDevFile(\"Restart Dev Server: nextjs-dev MCP has restart capability, delegating\")\n\n return {\n content: [\n {\n type: \"text\",\n 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.\"\n }\n ]\n }\n }\n\n logToDevFile(\"Restart Dev Server: nextjs-dev MCP doesn't have restart capability, falling back\")\n } catch (error) {\n logToDevFile(`Restart Dev Server: Failed to check nextjs-dev capabilities - ${error}`)\n }\n }\n\n // Fallback: Use dev3000's own restart mechanism\n logToDevFile(\"Restart Dev Server: Using dev3000 restart mechanism\")\n\n // In sandbox environments, lsof doesn't exist - skip process killing\n if (isInSandbox()) {\n logToDevFile(\"Restart Dev Server: Skipping lsof-based kill in sandbox environment\")\n return {\n content: [\n {\n type: \"text\",\n text: `⚠️ **RESTART NOT SUPPORTED IN SANDBOX**\\n\\nDev server restart is not supported in sandbox environments (Vercel Sandbox, Docker containers).\\n\\nThe \\`lsof\\` utility needed for process management is not available.\\n\\n💡 If running in Vercel Sandbox, the dev server is managed by the sandbox infrastructure.`\n }\n ]\n }\n }\n\n // Kill processes on the app port\n const killCommand = `lsof -ti :${appPort} | xargs kill 2>/dev/null || true`\n logToDevFile(`Restart Dev Server: Executing kill command: ${killCommand}`)\n\n try {\n await execAsync(killCommand)\n logToDevFile(\"Restart Dev Server: Kill command executed successfully\")\n } catch (error) {\n logToDevFile(`Restart Dev Server: Kill command failed (may be ok) - ${error}`)\n }\n\n // Wait for clean shutdown\n await new Promise((resolve) => setTimeout(resolve, 2000))\n\n // Check if port is now free\n const checkCommand = `lsof -ti :${appPort}`\n let portFree = false\n try {\n const { stdout } = await execAsync(checkCommand)\n portFree = stdout.trim() === \"\"\n logToDevFile(`Restart Dev Server: Port check result - free: ${portFree}`)\n } catch {\n // Command failed means no process on port (port is free)\n portFree = true\n logToDevFile(\"Restart Dev Server: Port is free (lsof returned no results)\")\n }\n\n if (!portFree) {\n return {\n content: [\n {\n type: \"text\",\n text: `⚠️ **PORT STILL IN USE**\\n\\nFailed to free port ${appPort}. There may be a process that couldn't be killed.\\n\\nTry manually killing the process:\\n\\`\\`\\`bash\\nlsof -ti :${appPort} | xargs kill -9\\n\\`\\`\\``\n }\n ]\n }\n }\n\n logToDevFile(\"Restart Dev Server: Port is now free, spawning new server process\")\n\n // Spawn new server process\n try {\n const serverProcess = spawn(serverCommand, {\n stdio: \"inherit\", // Inherit stdio so output goes to dev3000's logs\n shell: true,\n detached: true, // Run independently\n cwd: cwd || process.cwd() // Use original working directory\n })\n\n // Unref so this process doesn't keep MCP server alive\n serverProcess.unref()\n\n logToDevFile(`Restart Dev Server: Spawned new server process with PID ${serverProcess.pid}`)\n\n // Wait a moment for server to start\n await new Promise((resolve) => setTimeout(resolve, 1000))\n\n // Check if server is actually running on the port\n try {\n const { stdout: checkResult } = await execAsync(`lsof -ti :${appPort}`)\n const isRunning = checkResult.trim() !== \"\"\n\n if (isRunning) {\n logToDevFile(\"Restart Dev Server: Server successfully restarted and running on port\")\n return {\n content: [\n {\n type: \"text\",\n text: `✅ **DEV SERVER RESTARTED**\\n\\nSuccessfully restarted the development server on port ${appPort}.\\n\\n🎯 **STATUS:**\\n• Old server process: Killed\\n• New server process: Running (PID ${serverProcess.pid})\\n• Port ${appPort}: Active\\n• Browser monitoring: Unchanged\\n• Logs: Still being captured\\n\\n💡 The server has been restarted while keeping dev3000's monitoring, screenshots, and logging intact.`\n }\n ]\n }\n }\n logToDevFile(\"Restart Dev Server: Server process spawned but not yet listening on port (may still be starting)\")\n } catch {\n logToDevFile(\"Restart Dev Server: Server process spawned but not yet listening on port (may still be starting)\")\n }\n\n return {\n content: [\n {\n type: \"text\",\n text: `🔄 **DEV SERVER RESTARTING**\\n\\nStarted a new server process (PID ${serverProcess.pid}).\\n\\n⏳ **STATUS:**\\n• Old server: Killed\\n• New server: Starting (may take a few moments)\\n• Command: \\`${serverCommand}\\`\\n• Port: ${appPort}\\n\\nThe server is restarting. Check the dev3000 logs to see when it's ready.`\n }\n ]\n }\n } catch (spawnError) {\n logToDevFile(`Restart Dev Server: Failed to spawn new server process - ${spawnError}`)\n return {\n content: [\n {\n type: \"text\",\n text: `❌ **RESTART FAILED**\\n\\nFailed to start new server process.\\n\\n**Error:** ${spawnError instanceof Error ? spawnError.message : String(spawnError)}\\n\\n**Command:** \\`${serverCommand}\\`\\n\\nThe old server was killed but the new one failed to start. You may need to manually restart dev3000.`\n }\n ]\n }\n }\n } catch (error) {\n logToDevFile(`Restart Dev Server: Error - ${error}`)\n return {\n content: [\n {\n type: \"text\",\n text: `❌ **ERROR**\\n\\n${error instanceof Error ? error.message : String(error)}`\n }\n ]\n }\n }\n}\n\n// Crawl app - discover all URLs\nexport interface CrawlAppParams {\n depth?: number | \"all\"\n limit?: number\n projectName?: string\n}\n\nexport async function crawlApp(params: CrawlAppParams) {\n const { depth = 1, limit = 3, projectName } = params\n\n try {\n // Find active session\n const sessions = findActiveSessions()\n const session = projectName ? sessions.find((s) => s.projectName === projectName) : sessions[0]\n\n if (!session) {\n return {\n content: [\n {\n type: \"text\" as const,\n text: projectName\n ? `❌ No active session found for project \"${projectName}\". Available projects: ${sessions.map((s) => s.projectName).join(\", \") || \"none\"}`\n : \"❌ No active dev3000 sessions found. Start dev3000 first with `d3k` in your project directory.\"\n }\n ]\n }\n }\n\n // Get CDP URL and app port from session\n const sessionData = JSON.parse(readFileSync(session.sessionFile, \"utf-8\"))\n const cdpUrl = sessionData.cdpUrl?.replace(\"http://\", \"ws://\")\n const appPort = sessionData.appPort || \"3000\"\n const baseUrl = `http://localhost:${appPort}`\n\n if (!cdpUrl) {\n return {\n content: [\n {\n type: \"text\" as const,\n text: \"❌ No Chrome DevTools connection found. Browser monitoring must be active to crawl.\"\n }\n ]\n }\n }\n\n logToDevFile(`Crawl App: Starting crawl at depth ${depth} with limit ${limit} for ${baseUrl}`)\n\n // Connect to CDP\n const ws = new WebSocket(cdpUrl)\n await new Promise((resolve, reject) => {\n ws.on(\"open\", resolve)\n ws.on(\"error\", reject)\n setTimeout(() => reject(new Error(\"CDP connection timeout\")), 5000)\n })\n\n let messageId = 2000\n // biome-ignore lint/suspicious/noExplicitAny: CDP protocol responses are dynamic\n const sendCommand = (method: string, params: Record<string, unknown> = {}): Promise<any> => {\n return new Promise((resolve, reject) => {\n const id = messageId++\n const message = JSON.stringify({ id, method, params })\n\n const handler = (data: Buffer) => {\n const response = JSON.parse(data.toString())\n if (response.id === id) {\n ws.off(\"message\", handler)\n if (response.error) {\n reject(new Error(response.error.message))\n } else {\n resolve(response.result)\n }\n }\n }\n\n ws.on(\"message\", handler)\n ws.send(message)\n\n setTimeout(() => {\n ws.off(\"message\", handler)\n reject(new Error(\"Command timeout\"))\n }, 10000)\n })\n }\n\n // Enable necessary domains\n await sendCommand(\"Runtime.enable\")\n await sendCommand(\"Page.enable\")\n\n // Discovered URLs\n const discovered = new Set<string>([baseUrl])\n const visited = new Set<string>()\n const toVisit: string[] = [baseUrl]\n\n let currentDepth = 0\n const maxDepth = depth === \"all\" ? Number.POSITIVE_INFINITY : depth\n\n while (toVisit.length > 0 && currentDepth <= maxDepth) {\n const currentLevelUrls = [...toVisit]\n toVisit.length = 0\n\n logToDevFile(`Crawl App: Processing depth ${currentDepth} with ${currentLevelUrls.length} URLs`)\n\n for (const url of currentLevelUrls) {\n if (visited.has(url)) continue\n visited.add(url)\n\n try {\n // Navigate to URL\n logToDevFile(`Crawl App: Visiting ${url}`)\n await sendCommand(\"Page.navigate\", { url })\n\n // Wait for page load\n await new Promise((resolve) => setTimeout(resolve, 2000))\n\n // Extract all links\n const result = await sendCommand(\"Runtime.evaluate\", {\n expression: `\n Array.from(document.querySelectorAll('a[href]')).map(a => {\n try {\n const url = new URL(a.href, window.location.href);\n // Only return same-origin links\n if (url.origin === window.location.origin) {\n // Remove hash and query params for deduplication\n return url.origin + url.pathname;\n }\n } catch {}\n return null;\n }).filter(Boolean)\n `,\n returnByValue: true\n })\n\n const links = result.result?.value || []\n\n // Apply limit to prevent following too many links per page\n let linksAdded = 0\n for (const link of links) {\n if (!discovered.has(link)) {\n discovered.add(link)\n if (currentDepth < maxDepth && linksAdded < limit) {\n toVisit.push(link)\n linksAdded++\n }\n }\n }\n\n logToDevFile(\n `Crawl App: Found ${links.length} links on ${url}, added ${linksAdded} to queue (limit: ${limit})`\n )\n } catch (error) {\n logToDevFile(`Crawl App: Error visiting ${url} - ${error}`)\n }\n }\n\n currentDepth++\n\n // For \"all\" mode, stop when no new URLs are found\n if (depth === \"all\" && toVisit.length === 0) {\n break\n }\n }\n\n ws.close()\n\n const urls = Array.from(discovered).sort()\n const depthReached = depth === \"all\" ? currentDepth - 1 : Math.min(currentDepth - 1, maxDepth)\n\n logToDevFile(`Crawl App: Complete - discovered ${urls.length} URLs at depth ${depthReached}`)\n\n return {\n content: [\n {\n type: \"text\" as const,\n text: `🕷️ **APP CRAWL COMPLETE**\\n\\n📊 **SUMMARY:**\\n• Base URL: ${baseUrl}\\n• Depth: ${depthReached}${depth === \"all\" ? \" (exhaustive)\" : \"\"}\\n• Total URLs: ${urls.length}\\n\\n📍 **DISCOVERED URLs:**\\n${urls.map((url) => `• ${url}`).join(\"\\n\")}\\n\\n💡 **NEXT STEPS:**\\n• Use fix_my_app to check for errors across all pages\\n• Use execute_browser_action to test specific pages\\n• Verify all routes are working correctly`\n }\n ]\n }\n } catch (error) {\n logToDevFile(`Crawl App: Error - ${error}`)\n return {\n content: [\n {\n type: \"text\" as const,\n text: `❌ **CRAWL FAILED**\\n\\n${error instanceof Error ? error.message : String(error)}`\n }\n ]\n }\n }\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"sources":["../../../../mcp-server/app/mcp/tools.ts"],"sourcesContent":["import { exec, spawn } from \"child_process\"\nimport { appendFileSync, existsSync, mkdirSync, readdirSync, readFileSync, statSync } from \"fs\"\nimport { homedir, tmpdir } from \"os\"\nimport { join } from \"path\"\nimport pixelmatch from \"pixelmatch\"\nimport { PNG } from \"pngjs\"\nimport { promisify } from \"util\"\nimport { WebSocket } from \"ws\"\n\nconst execAsync = promisify(exec)\n\n/**\n * Detect if we're in a sandbox environment (Vercel Sandbox, Docker, etc.)\n * where lsof and other system utilities may not be available.\n */\nfunction isInSandbox(): boolean {\n return (\n process.env.VERCEL_SANDBOX === \"1\" ||\n process.env.VERCEL === \"1\" ||\n existsSync(\"/.dockerenv\") ||\n existsSync(\"/run/.containerenv\")\n )\n}\n\n// Tool descriptions\nexport const TOOL_DESCRIPTIONS = {\n // Meta-description for MCP coordination - Claude should see this when listing tools\n _mcp_coordination:\n \"**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.\",\n\n fix_my_app:\n \"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```\",\n\n execute_browser_action:\n \"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\",\n\n analyze_visual_diff:\n \"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\",\n\n find_component_source:\n \"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\",\n\n restart_dev_server:\n \"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\",\n\n crawl_app:\n \"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\"\n}\n\n// Types\nexport interface Session {\n projectName: string\n startTime: string\n logFilePath: string\n sessionFile: string\n lastModified: Date\n}\n\nexport interface FixMyAppParams {\n projectName?: string\n focusArea?: string\n mode?: \"snapshot\" | \"bisect\" | \"monitor\"\n waitForUserInteraction?: boolean\n timeRangeMinutes?: number\n includeTimestampInstructions?: boolean\n integrateNextjs?: boolean\n integrateChromeDevtools?: boolean\n returnRawData?: boolean\n createPR?: boolean // Create a PR for the highest priority issue\n}\n\nexport interface CreateIntegratedWorkflowParams {\n availableMcps?: string[] // Optional - will auto-discover if not provided\n focusArea?: string\n errorContext?: string\n}\n\nexport interface ExecuteBrowserActionParams {\n action: string\n params?: Record<string, unknown>\n}\n\nexport interface GetMcpCapabilitiesParams {\n mcpName?: string // Optional - if not provided, shows all available MCPs\n}\n\n// Structured data types for raw data output\nexport interface ErrorWithInteractions {\n timestamp: string\n category: string\n message: string\n interactions: string[]\n severity: \"critical\" | \"error\" | \"warning\"\n}\n\nexport interface CodeFix {\n file: string\n line?: number\n description: string\n code: string\n reason: string\n}\n\nexport interface McpFunctionSuggestion {\n function: string\n params?: Record<string, unknown>\n reason: string\n priority: \"high\" | \"medium\" | \"low\"\n}\n\nexport interface WorkflowPhase {\n name: string\n description: string\n actions: Array<{\n mcp: string\n function: string\n params?: Record<string, unknown>\n reason: string\n }>\n estimatedTime: string\n}\n\nexport interface StructuredAnalysisResult {\n errors: ErrorWithInteractions[]\n fixes: CodeFix[]\n suggestedIntegrations: {\n nextjs?: McpFunctionSuggestion[]\n chrome?: McpFunctionSuggestion[]\n }\n workflowPlan?: {\n phase1: WorkflowPhase\n phase2: WorkflowPhase\n phase3: WorkflowPhase\n }\n summary: {\n totalErrors: number\n criticalErrors: number\n hasIntegrations: boolean\n estimatedFixTime: string\n }\n}\n\nexport interface PrioritizedError {\n error: string\n category: \"build\" | \"server\" | \"browser\" | \"network\" | \"warning\"\n severity: \"critical\" | \"error\" | \"warning\"\n priorityScore: number\n interactions: string[]\n timestamp?: string\n suggestedFix?: string\n}\n\n// Helper functions\n\n/**\n * Calculate priority score for an error\n * Higher score = higher priority to fix\n *\n * Scoring system:\n * - Build errors: 1000+ (blocks development)\n * - Server errors: 500+ (affects functionality)\n * - Browser errors: 300+ (user-facing issues)\n * - Network errors: 200+ (intermittent issues)\n * - Warnings: 100+ (nice to fix)\n *\n * Additional modifiers:\n * - Multiple occurrences: +50 per occurrence\n * - Recent (last minute): +100\n * - Has user interactions: +50 (reproducible)\n */\nfunction calculateErrorPriority(\n errorLine: string,\n category: PrioritizedError[\"category\"],\n interactions: string[],\n allErrors: string[]\n): number {\n let score = 0\n\n // Base score by category\n if (category === \"build\") {\n score = 1000\n } else if (category === \"server\") {\n score = 500\n } else if (category === \"browser\") {\n score = 300\n } else if (category === \"network\") {\n score = 200\n } else if (category === \"warning\") {\n score = 100\n }\n\n // Severity multipliers\n if (/CRITICAL|FATAL|crashed/i.test(errorLine)) {\n score *= 2\n } else if (/ERROR|Exception|FAIL/i.test(errorLine)) {\n score *= 1.5\n }\n\n // Count occurrences of similar errors\n // Strip ANSI escape codes before constructing regex pattern (fixes #74)\n // biome-ignore lint/suspicious/noControlCharactersInRegex: ANSI escape codes require control characters\n const cleanLine = errorLine.replace(/\\x1b\\[[0-9;]*m/g, \"\")\n const errorPattern = cleanLine.replace(/\\d+/g, \"\\\\d+\").substring(0, 100)\n const occurrences = allErrors.filter((e) => new RegExp(errorPattern).test(e)).length\n if (occurrences > 1) {\n score += (occurrences - 1) * 50\n }\n\n // Boost if has interactions (reproducible)\n if (interactions.length > 0) {\n score += 50\n }\n\n // Boost if recent (within last minute)\n const timestampMatch = errorLine.match(/\\[(\\d{2}):(\\d{2}):(\\d{2})\\.\\d{3}\\]/)\n if (timestampMatch) {\n const now = new Date()\n const errorTime = new Date()\n errorTime.setHours(parseInt(timestampMatch[1], 10))\n errorTime.setMinutes(parseInt(timestampMatch[2], 10))\n errorTime.setSeconds(parseInt(timestampMatch[3], 10))\n\n const ageMinutes = (now.getTime() - errorTime.getTime()) / 1000 / 60\n if (ageMinutes < 1) {\n score += 100\n }\n }\n\n return score\n}\n\n/**\n * Find the single highest priority error from categorized errors\n */\nfunction findHighestPriorityError(\n categorizedErrors: {\n serverErrors: string[]\n browserErrors: string[]\n buildErrors: string[]\n networkErrors: string[]\n warnings: string[]\n },\n allErrors: string[],\n logLines: string[]\n): PrioritizedError | null {\n const prioritizedErrors: PrioritizedError[] = []\n\n // Helper to find interactions before an error\n const findInteractions = (errorLine: string): string[] => {\n const errorIndex = logLines.indexOf(errorLine)\n if (errorIndex === -1) return []\n\n const interactions: string[] = []\n for (let i = errorIndex - 1; i >= Math.max(0, errorIndex - 20) && interactions.length < 5; i--) {\n if (\n logLines[i].includes(\"[INTERACTION]\") ||\n logLines[i].includes(\"[NAVIGATION]\") ||\n logLines[i].includes(\"[PAGE]\")\n ) {\n interactions.unshift(logLines[i])\n }\n }\n return interactions\n }\n\n // Process build errors\n for (const error of categorizedErrors.buildErrors) {\n const interactions = findInteractions(error)\n prioritizedErrors.push({\n error,\n category: \"build\",\n severity: \"critical\",\n priorityScore: calculateErrorPriority(error, \"build\", interactions, allErrors),\n interactions\n })\n }\n\n // Process server errors\n for (const error of categorizedErrors.serverErrors) {\n const interactions = findInteractions(error)\n const severity: PrioritizedError[\"severity\"] = /CRITICAL|FATAL/i.test(error) ? \"critical\" : \"error\"\n prioritizedErrors.push({\n error,\n category: \"server\",\n severity,\n priorityScore: calculateErrorPriority(error, \"server\", interactions, allErrors),\n interactions\n })\n }\n\n // Process browser errors\n for (const error of categorizedErrors.browserErrors) {\n const interactions = findInteractions(error)\n const severity: PrioritizedError[\"severity\"] = /CRITICAL|FATAL/i.test(error) ? \"critical\" : \"error\"\n prioritizedErrors.push({\n error,\n category: \"browser\",\n severity,\n priorityScore: calculateErrorPriority(error, \"browser\", interactions, allErrors),\n interactions\n })\n }\n\n // Process network errors\n for (const error of categorizedErrors.networkErrors) {\n const interactions = findInteractions(error)\n prioritizedErrors.push({\n error,\n category: \"network\",\n severity: \"error\",\n priorityScore: calculateErrorPriority(error, \"network\", interactions, allErrors),\n interactions\n })\n }\n\n // Process warnings (only if no errors found)\n if (prioritizedErrors.length === 0) {\n for (const error of categorizedErrors.warnings) {\n const interactions = findInteractions(error)\n prioritizedErrors.push({\n error,\n category: \"warning\",\n severity: \"warning\",\n priorityScore: calculateErrorPriority(error, \"warning\", interactions, allErrors),\n interactions\n })\n }\n }\n\n // Sort by priority score (highest first)\n prioritizedErrors.sort((a, b) => b.priorityScore - a.priorityScore)\n\n return prioritizedErrors[0] || null\n}\n\n/**\n * Create a PR for the highest priority issue\n */\nasync function createPRForIssue(prioritizedError: PrioritizedError, _projectName: string): Promise<string> {\n try {\n // Extract error details for PR title and body\n const errorType = prioritizedError.category.toUpperCase()\n const errorMessage = prioritizedError.error\n .replace(/\\[[^\\]]+\\]/g, \"\") // Remove timestamps and tags\n .trim()\n .substring(0, 100)\n\n const prTitle = `Fix: ${errorType} - ${errorMessage}`\n\n // Build PR body\n const prBody = `## 🐛 Bug Fix - ${prioritizedError.category} Error\n\n**Priority Score:** ${prioritizedError.priorityScore} (${prioritizedError.severity})\n\n### Error Details\n\\`\\`\\`\n${prioritizedError.error}\n\\`\\`\\`\n\n${\n prioritizedError.interactions.length > 0\n ? `### Reproduction Steps\nThe error occurred after these user interactions:\n${prioritizedError.interactions.map((i, idx) => `${idx + 1}. ${i}`).join(\"\\n\")}\n\n### Verification\nAfter implementing the fix, verify by:\n1. Replaying the same interactions using \\`execute_browser_action\\`\n2. Confirming the error no longer appears in logs\n3. Checking that functionality works as expected\n`\n : \"\"\n}\n\n### Suggested Fix\nThis PR addresses the ${prioritizedError.severity}-level ${prioritizedError.category} error detected by dev3000.\n\n${prioritizedError.suggestedFix || \"Please analyze the error and implement the appropriate fix.\"}\n\n---\n🤖 Generated with [dev3000](https://github.com/vercel-labs/dev3000) - AI-powered debugging\n`\n\n // Create a new branch\n const branchName = `fix/${prioritizedError.category}-${Date.now()}`\n\n // Use execAsync to run git and gh commands\n await execAsync(`git checkout -b ${branchName}`)\n\n // Create the PR using gh\n await execAsync(`gh pr create --title \"${prTitle}\" --body \"${prBody}\" --head ${branchName}`)\n\n return `✅ Created PR: ${prTitle}\\n\\nBranch: ${branchName}\\n\\nNext steps:\\n1. Implement the fix in your code\\n2. Commit and push changes\\n3. PR is ready for review!`\n } catch (error) {\n return `❌ Failed to create PR: ${error instanceof Error ? error.message : String(error)}\\n\\nYou can manually create a PR with the error details above.`\n }\n}\n\n// Helper functions\nexport function findActiveSessions(): Session[] {\n const sessionDir = join(homedir(), \".d3k\")\n if (!existsSync(sessionDir)) {\n return []\n }\n\n try {\n const files = readdirSync(sessionDir)\n .filter((f) => f.endsWith(\".json\"))\n .map((f) => {\n const filePath = join(sessionDir, f)\n const content = JSON.parse(readFileSync(filePath, \"utf-8\"))\n const stat = statSync(filePath)\n return {\n ...content,\n sessionFile: filePath,\n lastModified: stat.mtime\n }\n })\n .filter((session) => {\n // Check if the process is still running by checking the PID\n if (!session.pid) {\n return false\n }\n try {\n process.kill(session.pid, 0) // Signal 0 just checks if process exists\n return true // Process is still running\n } catch {\n return false // Process is not running\n }\n })\n .sort((a, b) => new Date(b.startTime).getTime() - new Date(a.startTime).getTime())\n\n return files\n } catch (_error) {\n return []\n }\n}\n\nexport function getLogPath(projectName?: string): string | null {\n // If explicit project name provided, look it up\n if (projectName) {\n const sessions = findActiveSessions()\n const session = sessions.find((s) => s.projectName === projectName)\n if (session) {\n // Return the log path even if file doesn't exist yet\n // (it will be created when logs start, especially in sandbox environments)\n return session.logFilePath\n }\n }\n\n // Fall back to environment variable\n const envPath = process.env.LOG_FILE_PATH\n if (envPath) {\n // Return the path even if file doesn't exist yet\n return envPath\n }\n\n // If no project specified and no env var, show available sessions\n return null\n}\n\n// Main tool implementations\nexport async function fixMyApp({\n projectName,\n focusArea = \"all\",\n mode = \"snapshot\",\n waitForUserInteraction = false,\n timeRangeMinutes = 10,\n includeTimestampInstructions = true,\n integrateNextjs = false,\n integrateChromeDevtools = false,\n returnRawData = false,\n createPR = false\n}: FixMyAppParams): Promise<{ content: Array<{ type: \"text\"; text: string }> }> {\n // 🎯 MCP ORCHESTRATION: Check which downstream MCPs are available\n const { getMCPClientManager } = await import(\"./client-manager\")\n const clientManager = getMCPClientManager()\n const connectedMCPs = clientManager.getConnectedMCPs()\n\n const hasNextjsDev = connectedMCPs.includes(\"nextjs-dev\")\n const hasChromeDevtools = connectedMCPs.includes(\"chrome-devtools\")\n\n if (connectedMCPs.length > 0) {\n logToDevFile(`Fix My App: Connected to downstream MCPs: ${connectedMCPs.join(\", \")}`)\n }\n\n // Auto-detect integration flags based on connected MCPs\n if (hasNextjsDev && integrateNextjs === false) {\n integrateNextjs = true\n }\n if (hasChromeDevtools && integrateChromeDevtools === false) {\n integrateChromeDevtools = true\n }\n\n // Legacy delegation check (keeping for backwards compatibility)\n const canDelegateNextjs = await canDelegateToNextjs()\n if (canDelegateNextjs) {\n logToDevFile(`Fix My App: Recommending dev3000-nextjs-dev MCP for Next.js-specific analysis`)\n }\n let logPath = getLogPath(projectName)\n if (!logPath) {\n const sessions = findActiveSessions()\n if (sessions.length === 0) {\n return {\n content: [\n {\n type: \"text\",\n text: \"❌ No active dev3000 sessions found. Make sure dev3000 is running!\"\n }\n ]\n }\n }\n\n // Auto-select if there's only one session\n logToDevFile(`fix_my_app: Found ${sessions.length} sessions`)\n if (sessions.length === 1) {\n projectName = sessions[0].projectName\n logPath = getLogPath(projectName)\n logToDevFile(`fix_my_app: Auto-selected single session: ${projectName}, logPath: ${logPath}`)\n\n // If still no log path after auto-select, return error\n if (!logPath) {\n return {\n content: [\n {\n type: \"text\",\n text: `❌ Could not find log file for project \"${projectName}\". The session may not be properly initialized yet.`\n }\n ]\n }\n }\n } else {\n const sessionList = sessions\n .map((s) => `• ${s.projectName} (started ${new Date(s.startTime).toLocaleString()})`)\n .join(\"\\n\")\n\n return {\n content: [\n {\n type: \"text\",\n text: `🔍 Found ${sessions.length} dev3000 sessions. Please specify which project to fix:\\n${sessionList}\\n\\n💡 Use: projectName: \"your-project-name\" parameter`\n }\n ]\n }\n }\n }\n\n const results: string[] = []\n\n // Mode-specific handling\n if (mode === \"bisect\" && waitForUserInteraction) {\n const startTime = new Date().toISOString()\n results.push(\"🕐 **TIMESTAMP BISECT MODE ACTIVATED**\")\n results.push(`📍 Start Time: ${startTime}`)\n results.push(\"\")\n results.push(\"🎯 **NOW INTERACT WITH YOUR APP TO REPRODUCE THE ISSUE!**\")\n results.push(\"• Click buttons, navigate, submit forms, etc.\")\n results.push(\"• Reproduce the exact error scenario\")\n results.push(\"• When done, run this tool again WITHOUT waitForUserInteraction\")\n results.push(\"\")\n results.push(\"💡 I'll analyze everything that happens between these timestamps!\")\n\n return {\n content: [{ type: \"text\", text: results.join(\"\\n\") }]\n }\n }\n\n try {\n // Check if log file exists before reading\n if (!existsSync(logPath)) {\n results.push(\"📋 Log file doesn't exist yet. The dev server may still be starting up.\")\n results.push(\"💡 Wait a few seconds for the server to generate logs, then try again.\")\n return {\n content: [{ type: \"text\", text: results.join(\"\\n\") }]\n }\n }\n\n const content = readFileSync(logPath, \"utf-8\")\n const logLines = content.trim().split(\"\\n\").filter(Boolean)\n\n if (logLines.length === 0) {\n results.push(\"📋 Log file is empty. Make sure your app is running and generating logs.\")\n return {\n content: [{ type: \"text\", text: results.join(\"\\n\") }]\n }\n }\n\n results.push(`🔍 **FIX MY APP ANALYSIS** - Mode: ${mode.toUpperCase()}`)\n results.push(`📁 Log file: ${logPath}`)\n results.push(`📊 Total log entries: ${logLines.length}`)\n results.push(\"\")\n\n // Time-based filtering\n const now = new Date()\n const cutoffTime = new Date(now.getTime() - timeRangeMinutes * 60 * 1000)\n\n // Comprehensive error patterns\n const errorPatterns = [\n /ERROR/i,\n /FAIL/i,\n /Exception/i,\n /CRITICAL/i,\n /FATAL/i,\n /crashed/i,\n /undefined/i,\n /null reference/i,\n /cannot read/i,\n /cannot find/i,\n /not found/i,\n /timeout/i,\n /refused/i,\n /denied/i,\n /unauthorized/i,\n /404/,\n /500/,\n /503/,\n /WARN/i,\n /WARNING/i,\n /deprecated/i,\n /slow/i,\n /retry/i,\n /RUNTIME\\.ERROR/,\n /hydration.*mismatch/i,\n /Uncaught/i,\n /throwOnHydrationMismatch/i\n ]\n\n // Filter logs by time range (replaces get_logs_between_timestamps)\n const timeFilteredLines = logLines.filter((line) => {\n // Try ISO format first (e.g., 2025-09-23T22:03:55.068Z)\n const isoMatch = line.match(/\\[(\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}\\.\\d{3}Z)\\]/)\n if (isoMatch) {\n const logTime = new Date(isoMatch[1])\n return logTime >= cutoffTime\n }\n\n // Try time-only format (e.g., 15:04:03.987)\n const timeMatch = line.match(/\\[(\\d{2}):(\\d{2}):(\\d{2})\\.(\\d{3})\\]/)\n if (timeMatch) {\n // For time-only format, assume it's from today\n const now = new Date()\n const logTime = new Date(\n now.getFullYear(),\n now.getMonth(),\n now.getDate(),\n parseInt(timeMatch[1], 10),\n parseInt(timeMatch[2], 10),\n parseInt(timeMatch[3], 10),\n parseInt(timeMatch[4], 10)\n )\n\n // If the time is in the future (e.g., log shows 15:04 but now is 14:00),\n // assume it was from yesterday\n if (logTime > now) {\n logTime.setDate(logTime.getDate() - 1)\n }\n\n return logTime >= cutoffTime\n }\n\n // If no timestamp found, include the line (better to show more than miss errors)\n return true\n })\n\n // Extract ALL error types (replaces multiple error detection tools)\n const allErrors = timeFilteredLines.filter((line) => {\n return errorPatterns.some((pattern) => pattern.test(line))\n })\n\n // Extract react-scan performance data\n const reactScanLines = timeFilteredLines.filter(\n (line) => line.includes(\"react-scan\") || line.includes(\"ReactScan\") || line.includes(\"React render\")\n )\n\n // Parse react-scan performance metrics\n const reactScanMetrics = {\n unnecessaryRenders: reactScanLines.filter(\n (line) => line.includes(\"unnecessary\") || line.includes(\"re-render\") || line.includes(\"wasted\")\n ),\n slowComponents: reactScanLines.filter(\n (line) => line.includes(\"slow\") || line.includes(\"performance\") || /\\d+ms/.test(line)\n ),\n totalRenders: reactScanLines.filter((line) => line.includes(\"render\")).length\n }\n\n // Filter out framework noise (unfixable warnings from Next.js, React, etc.)\n const frameworkNoisePatterns = [\n /link rel=preload.*must have.*valid.*as/i, // Next.js font optimization warning - not actionable\n /next\\/font/i, // Next.js font-related warnings\n /automatically generated/i, // Auto-generated code warnings\n /\\[NETWORK\\].*\\b(200|201|204|304)\\b\\s+(OK|Created|No Content|Not Modified)/i // Successful HTTP responses - not errors\n ]\n\n const actionableErrors = allErrors.filter((line) => {\n return !frameworkNoisePatterns.some((pattern) => pattern.test(line))\n })\n\n // Categorize errors for better analysis\n const categorizedErrors = {\n serverErrors: actionableErrors.filter(\n (line) => line.includes(\"[SERVER]\") && (line.includes(\"ERROR\") || line.includes(\"Exception\"))\n ),\n browserErrors: actionableErrors.filter(\n (line) =>\n line.includes(\"[BROWSER]\") &&\n (line.includes(\"ERROR\") || line.includes(\"CONSOLE ERROR\") || line.includes(\"RUNTIME.ERROR\"))\n ),\n buildErrors: actionableErrors.filter(\n (line) => line.includes(\"Failed to compile\") || line.includes(\"Type error\") || line.includes(\"Build failed\")\n ),\n networkErrors: actionableErrors.filter((line) => {\n // Exclude successful status codes\n if (/\\b(200|201|204|304)\\b/.test(line)) return false\n return line.includes(\"NETWORK\") || line.includes(\"404\") || line.includes(\"500\") || line.includes(\"timeout\")\n }),\n warnings: actionableErrors.filter(\n (line) => /WARN|WARNING|deprecated/i.test(line) && !/ERROR|Exception|FAIL/i.test(line)\n )\n }\n\n const totalErrors = actionableErrors.length\n const criticalErrors = totalErrors - categorizedErrors.warnings.length\n\n // Also check for any errors in the entire log file (not just time filtered)\n const allLogErrors = logLines.filter((line) => {\n return errorPatterns.some((pattern) => pattern.test(line))\n })\n const recentErrorsOutsideTimeRange = allLogErrors.length > totalErrors\n\n // Helper function to find preceding interaction events for any error\n const findInteractionsBeforeError = (errorLine: string, allLines: string[]): string[] => {\n const errorIndex = allLines.indexOf(errorLine)\n if (errorIndex === -1) return []\n\n const interactions: string[] = []\n // Look back up to 20 lines or 5 interactions\n for (let i = errorIndex - 1; i >= Math.max(0, errorIndex - 20) && interactions.length < 5; i--) {\n if (\n allLines[i].includes(\"[INTERACTION]\") ||\n allLines[i].includes(\"[NAVIGATION]\") ||\n allLines[i].includes(\"[PAGE]\")\n ) {\n interactions.unshift(allLines[i])\n }\n }\n return interactions\n }\n\n if (totalErrors === 0 && !recentErrorsOutsideTimeRange) {\n results.push(`No errors found in last ${timeRangeMinutes} minutes.`)\n results.push(\"Application appears healthy.\")\n\n if (includeTimestampInstructions && mode !== \"monitor\") {\n results.push(\"\")\n results.push(\"Options:\")\n results.push(\"• Use mode='bisect' to compare before/after states during testing\")\n results.push(\"• Use mode='monitor' for continuous monitoring\")\n results.push(\"• Increase timeRangeMinutes to analyze a longer period\")\n }\n } else if (totalErrors === 0 && recentErrorsOutsideTimeRange) {\n results.push(\n `No errors in last ${timeRangeMinutes} minutes, but found ${allLogErrors.length} errors in full log.`\n )\n results.push(\"\")\n results.push(\"Older errors (outside time range):\")\n // Show last 5 errors from the full log with their interactions\n allLogErrors.slice(-5).forEach((error) => {\n const interactions = findInteractionsBeforeError(error, logLines)\n if (interactions.length > 0) {\n results.push(\" Preceding interactions:\")\n for (const interaction of interactions) {\n results.push(` ${interaction}`)\n }\n }\n results.push(` - ${error}`)\n results.push(\"\")\n })\n results.push(\"To analyze these errors, increase timeRangeMinutes (e.g., timeRangeMinutes=60)\")\n } else {\n results.push(\n `**${totalErrors} ISSUES DETECTED** (${criticalErrors} critical, ${categorizedErrors.warnings.length} warnings)`\n )\n results.push(\"\")\n results.push(\"**ACTION REQUIRED:** Fix the highest-priority error below, then call fix_my_app again to verify.\")\n results.push(\"\")\n\n // Show categorized errors with their preceding interactions\n if (categorizedErrors.serverErrors.length > 0) {\n results.push(\"SERVER ERRORS:\")\n categorizedErrors.serverErrors.slice(-5).forEach((error) => {\n const interactions = findInteractionsBeforeError(error, logLines)\n if (interactions.length > 0) {\n results.push(\" Preceding interactions:\")\n for (const interaction of interactions) {\n results.push(` ${interaction}`)\n }\n }\n results.push(` - ${error}`)\n results.push(\"\")\n })\n }\n\n if (categorizedErrors.browserErrors.length > 0) {\n results.push(\"BROWSER/CONSOLE ERRORS:\")\n categorizedErrors.browserErrors.slice(-5).forEach((error) => {\n const interactions = findInteractionsBeforeError(error, logLines)\n if (interactions.length > 0) {\n results.push(\" Preceding interactions:\")\n for (const interaction of interactions) {\n results.push(` ${interaction}`)\n }\n }\n results.push(` - ${error}`)\n results.push(\"\")\n })\n }\n\n if (categorizedErrors.buildErrors.length > 0) {\n results.push(\"BUILD/COMPILATION ERRORS:\")\n categorizedErrors.buildErrors.slice(-5).forEach((error) => {\n const interactions = findInteractionsBeforeError(error, logLines)\n if (interactions.length > 0) {\n results.push(\" Preceding interactions:\")\n for (const interaction of interactions) {\n results.push(` ${interaction}`)\n }\n }\n results.push(` - ${error}`)\n results.push(\"\")\n })\n }\n\n if (categorizedErrors.networkErrors.length > 0) {\n results.push(\"NETWORK/API ERRORS:\")\n categorizedErrors.networkErrors.slice(-5).forEach((error) => {\n const interactions = findInteractionsBeforeError(error, logLines)\n if (interactions.length > 0) {\n results.push(\" Preceding interactions:\")\n for (const interaction of interactions) {\n results.push(` ${interaction}`)\n }\n }\n results.push(` - ${error}`)\n results.push(\"\")\n })\n }\n\n if (categorizedErrors.warnings.length > 0 && focusArea === \"all\") {\n results.push(`WARNINGS (${categorizedErrors.warnings.length} found, showing recent):`)\n results.push(categorizedErrors.warnings.slice(-3).join(\"\\n\"))\n results.push(\"\")\n }\n\n // Show the diagnose-fix-verify loop\n results.push(\"---\")\n results.push(\"**NEXT: Fix the highest-priority issue, then call fix_my_app again to verify.**\")\n results.push(\"\")\n results.push(\"Keep calling fix_my_app after each fix until no errors remain.\")\n\n // Add integration-aware suggestions\n if (integrateNextjs || integrateChromeDevtools) {\n // Log that integrations are being used in fix analysis\n const activeIntegrations = []\n if (integrateNextjs) activeIntegrations.push(\"Next.js\")\n if (integrateChromeDevtools) activeIntegrations.push(\"Chrome DevTools\")\n logToDevFile(\n `Fix Analysis: Using active MCP integrations [${activeIntegrations.join(\", \")}] for enhanced error analysis`,\n projectName\n )\n\n results.push(\"\")\n results.push(\"**Available MCP integrations:**\")\n\n if (integrateNextjs) {\n results.push(\"\")\n results.push(\"Next.js MCP (nextjs-dev):\")\n const nextjsSuggestions = await generateNextjsSuggestions(allErrors.join(\" \"))\n nextjsSuggestions.forEach((suggestion) => {\n const params = suggestion.params\n ? `(${Object.entries(suggestion.params)\n .map(([k, v]) => `${k}=${JSON.stringify(v)}`)\n .join(\", \")})`\n : \"()\"\n results.push(` • nextjs-dev.${suggestion.function}${params}`)\n results.push(` Reason: ${suggestion.reason}`)\n })\n\n if (categorizedErrors.serverErrors.length > 0) {\n results.push(\" • Check Next.js build/runtime logs for SSR/hydration issues\")\n }\n }\n\n if (integrateChromeDevtools) {\n results.push(\"\")\n results.push(\"Chrome DevTools MCP (chrome-devtools):\")\n const chromeSuggestions = await generateChromeDevtoolsSuggestions(allErrors.join(\" \"))\n chromeSuggestions.forEach((suggestion) => {\n const params = suggestion.params\n ? `(${Object.entries(suggestion.params)\n .map(([k, v]) => `${k}=${JSON.stringify(v)}`)\n .join(\", \")})`\n : \"()\"\n results.push(` • chrome-devtools.${suggestion.function}${params}`)\n results.push(` Reason: ${suggestion.reason}`)\n })\n\n if (categorizedErrors.browserErrors.length > 0) {\n results.push(\" • Use DOM inspection for UI issues\")\n }\n if (categorizedErrors.networkErrors.length > 0) {\n results.push(\" • Inspect network requests for detailed error context\")\n }\n }\n }\n\n // Find the single highest priority error and optionally create a PR\n const highestPriorityError = findHighestPriorityError(categorizedErrors, actionableErrors, logLines)\n\n if (highestPriorityError) {\n results.push(\"\")\n results.push(\"---\")\n results.push(\"**HIGHEST PRIORITY ISSUE (fix this first):**\")\n results.push(`Priority Score: ${highestPriorityError.priorityScore}`)\n results.push(`Category: ${highestPriorityError.category.toUpperCase()}`)\n results.push(`Severity: ${highestPriorityError.severity.toUpperCase()}`)\n results.push(\"\")\n results.push(\"Error:\")\n results.push(` ${highestPriorityError.error}`)\n\n if (highestPriorityError.interactions.length > 0) {\n results.push(\"\")\n results.push(\"Reproduction steps:\")\n highestPriorityError.interactions.forEach((interaction, idx) => {\n results.push(` ${idx + 1}. ${interaction}`)\n })\n }\n\n // Create PR if requested\n if (createPR) {\n results.push(\"\")\n results.push(\"Creating PR branch for this issue...\")\n const prResult = await createPRForIssue(highestPriorityError, projectName || \"\")\n results.push(prResult)\n } else {\n results.push(\"\")\n results.push(\"To create a PR branch for this issue, run: fix_my_app(createPR=true)\")\n }\n }\n }\n\n // Extract screenshot information (replaces get_recent_screenshots)\n const screenshotLines = logLines.filter(\n (line) => line.includes(\"[SCREENSHOT]\") || line.includes(\"Screenshot captured\")\n )\n if (screenshotLines.length > 0) {\n results.push(\"\")\n results.push(`📸 **SCREENSHOTS CAPTURED** (${screenshotLines.length} total):`)\n screenshotLines.slice(-5).forEach((line) => {\n const match = line.match(/Screenshot captured: (.+)$/)\n if (match) {\n results.push(`• ${match[1]}`)\n }\n })\n results.push(\"\")\n results.push(\"💡 **TIP**: Use analyze_visual_diff tool to compare screenshots and identify changes\")\n results.push(\" (Advanced: screenshots are also accessible via curl if needed)\")\n }\n\n // Jank/Layout Shift Detection (from ScreencastManager passive captures)\n if (focusArea === \"performance\" || focusArea === \"all\") {\n const jankResult = await detectJankFromScreenshots(projectName)\n if (jankResult.detections.length > 0) {\n // Get MCP port for video viewer URL\n const sessionInfo = findActiveSessions().find((s) => s.projectName === projectName)\n const mcpPort = sessionInfo ? sessionInfo.sessionFile.match(/\"mcpPort\":\\s*\"(\\d+)\"/)?.[1] || \"3684\" : \"3684\"\n const videoUrl = `http://localhost:${mcpPort}/video/${jankResult.sessionId}`\n\n results.push(\"\")\n\n if (jankResult.realCLS) {\n results.push(\n `🚨 **LAYOUT SHIFT DETECTED** (${jankResult.detections.length} ${jankResult.detections.length === 1 ? \"shift\" : \"shifts\"} during page load):`\n )\n } else {\n results.push(\n `🚨 **LOADING JANK DETECTED** (${jankResult.detections.length} layout ${jankResult.detections.length === 1 ? \"shift\" : \"shifts\"} found):`\n )\n }\n\n const triggerLabel =\n jankResult.captureTrigger === \"navigation\"\n ? \"Navigation complete\"\n : jankResult.captureTrigger === \"load\"\n ? \"Load complete\"\n : \"View all frames\"\n results.push(`📹 **${triggerLabel}**: ${videoUrl}`)\n results.push(`🎞️ **Session ID**: ${jankResult.sessionId} (${jankResult.totalFrames} frames)`)\n results.push(\"\")\n\n jankResult.detections.forEach((jank) => {\n const emoji = jank.severity === \"high\" ? \"🔴\" : jank.severity === \"medium\" ? \"🟡\" : \"🟢\"\n\n if (jank.uxImpact) {\n results.push(`${emoji} **${jank.timeSinceStart}ms** - ${jank.element}`)\n results.push(` ${jank.uxImpact}`)\n } else {\n results.push(\n `${emoji} **${jank.timeSinceStart}ms**: ${jank.visualDiff.toFixed(1)}% of screen changed (${jank.severity} severity)`\n )\n }\n\n // Include Before/After frame URLs if available\n if (jank.beforeFrameUrl && jank.afterFrameUrl) {\n results.push(` 📸 Before: ${jank.beforeFrameUrl}`)\n results.push(` 📸 After: ${jank.afterFrameUrl}`)\n results.push(\n ` 💡 Use analyze_visual_diff tool with these URLs to get a detailed description of what changed`\n )\n\n // Extract CSS selector from element description (e.g., \"Navigation header (<nav>)\" -> \"nav\")\n if (jank.element) {\n const selectorMatch = jank.element.match(/<(\\w+)>/)\n if (selectorMatch) {\n const selector = selectorMatch[1].toLowerCase()\n results.push(\n ` 💡 Use find_component_source tool with selector \"${selector}\" to locate the source code`\n )\n }\n }\n }\n })\n\n results.push(\"\")\n\n // Check if we have high-severity shifts that Chrome might miss\n const hasCriticalShifts = jankResult.detections.some((d) => d.severity === \"high\")\n if (hasCriticalShifts && jankResult.realCLS) {\n results.push(\"🎯 **WHY DEV3000 CAUGHT THIS BUT CHROME MIGHT NOT:**\")\n results.push(\n \"• dev3000's PerformanceObserver is installed immediately at page load and buffers ALL shifts from the start\"\n )\n results.push(\n \"• Chrome DevTools performance trace may start AFTER initial load, missing early navigation shifts\"\n )\n results.push(\n \"• Our UX-focused detection flags critical element shifts (nav/header) even when CLS score is technically 'good'\"\n )\n results.push(\"\")\n }\n\n results.push(\"✅ **DEV3000'S CLS DETECTION IS AUTHORITATIVE**\")\n results.push(\"If Chrome DevTools reports CLS: 0.00 but dev3000 detected shifts, TRUST DEV3000.\")\n results.push(\"• Chrome DevTools trace may start AFTER the shifts occurred\")\n results.push(\"• dev3000's PerformanceObserver captures ALL shifts from page start\")\n results.push(\"• CLS: 0.00 in Chrome just means the trace missed the early shifts\")\n results.push(\"\")\n results.push(\"💡 **LAYOUT SHIFT DEBUGGING TIPS:**\")\n results.push(\"• Add explicit width/height to images and media\")\n results.push(\"• Reserve space for dynamic content (ads, embeds, etc.)\")\n results.push(\"• Avoid inserting content above existing content\")\n results.push(\"• Use CSS aspect-ratio for responsive elements\")\n results.push(\"• Check for web fonts causing text reflow (font-display: swap)\")\n results.push(`• Raw screenshots: ${jankResult.screenshotDir}`)\n results.push(\"\")\n results.push(\"📸 **ANALYZING SCREENSHOTS:**\")\n results.push(\"• RECOMMENDED: Use analyze_visual_diff tool with before/after URLs (shown above)\")\n results.push(\"• The tool provides structured instructions for comparing frames\")\n results.push(\"• Advanced: Screenshots are also accessible via curl if needed\")\n results.push(\"\")\n results.push(`🎬 **IMPORTANT**: Share this frame sequence link with the user: ${videoUrl}`)\n }\n }\n\n // React-scan performance data (if available)\n if (reactScanMetrics.totalRenders > 0 || focusArea === \"performance\" || focusArea === \"all\") {\n if (reactScanMetrics.unnecessaryRenders.length > 0 || reactScanMetrics.slowComponents.length > 0) {\n results.push(\"\")\n results.push(\"⚛️ **REACT PERFORMANCE ANALYSIS (react-scan):**\")\n\n if (reactScanMetrics.unnecessaryRenders.length > 0) {\n results.push(`🔄 **Unnecessary Re-renders Detected (${reactScanMetrics.unnecessaryRenders.length}):**`)\n reactScanMetrics.unnecessaryRenders.slice(-5).forEach((line) => {\n results.push(`• ${line}`)\n })\n results.push(\"\")\n }\n\n if (reactScanMetrics.slowComponents.length > 0) {\n results.push(`🐌 **Slow Components Found (${reactScanMetrics.slowComponents.length}):**`)\n reactScanMetrics.slowComponents.slice(-5).forEach((line) => {\n results.push(`• ${line}`)\n })\n results.push(\"\")\n }\n\n results.push(\"💡 **REACT OPTIMIZATION TIPS:**\")\n results.push(\"• Use React.memo() for components with expensive renders\")\n results.push(\"• Use useMemo/useCallback to prevent unnecessary re-renders\")\n results.push(\"• Check for unstable prop references (objects/arrays created in render)\")\n results.push(\"• Consider using React DevTools Profiler for deeper analysis\")\n }\n }\n\n // Performance insights (if no errors but looking at performance)\n if (totalErrors === 0 && focusArea === \"all\") {\n const performanceLines = logLines.filter((line) => line.includes(\"took\") && line.includes(\"ms\"))\n if (performanceLines.length > 0) {\n results.push(\"\")\n results.push(\"⚡ **PERFORMANCE INSIGHTS:**\")\n performanceLines.slice(-5).forEach((line) => {\n results.push(`• ${line}`)\n })\n }\n }\n\n // Return structured data if requested\n if (returnRawData) {\n logToDevFile(\n `Structured Output: Returning structured data for Claude orchestration with ${totalErrors} errors and ${integrateNextjs || integrateChromeDevtools ? \"active\" : \"no\"} integrations`,\n projectName\n )\n const structuredErrors: ErrorWithInteractions[] = allErrors.map((error) => {\n const interactions = findInteractionsBeforeError(error, logLines)\n const category = categorizedErrors.serverErrors.includes(error)\n ? \"server\"\n : categorizedErrors.browserErrors.includes(error)\n ? \"browser\"\n : categorizedErrors.buildErrors.includes(error)\n ? \"build\"\n : categorizedErrors.networkErrors.includes(error)\n ? \"network\"\n : categorizedErrors.warnings.includes(error)\n ? \"warning\"\n : \"general\"\n\n const severity = categorizedErrors.warnings.includes(error)\n ? (\"warning\" as const)\n : error.includes(\"CRITICAL\") || error.includes(\"FATAL\") || error.includes(\"crashed\")\n ? (\"critical\" as const)\n : (\"error\" as const)\n\n // Extract timestamp from error line\n const timestampMatch =\n error.match(/\\[(\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}\\.\\d{3}Z)\\]/) ||\n error.match(/\\[(\\d{2}:\\d{2}:\\d{2}\\.\\d{3})\\]/)\n const timestamp = timestampMatch ? timestampMatch[1] : new Date().toISOString()\n\n return {\n timestamp,\n category,\n message: error,\n interactions,\n severity\n }\n })\n\n const structuredFixes: CodeFix[] = []\n\n // Generate intelligent fix suggestions based on error patterns\n structuredErrors.forEach((error) => {\n if (error.category === \"hydration\" || error.message.includes(\"hydration\")) {\n structuredFixes.push({\n file: \"pages/_app.js or components/[component].tsx\",\n description: \"Fix hydration mismatch\",\n code: `// Ensure server and client render the same content\n// Use useEffect for client-only logic\nuseEffect(() => {\n // Client-only code here\n}, [])`,\n reason: \"Hydration errors occur when server and client render different content\"\n })\n }\n\n if (error.message.includes(\"TypeError\") || error.message.includes(\"undefined\")) {\n structuredFixes.push({\n file: \"Identify from stack trace in error message\",\n description: \"Add null/undefined checks\",\n code: `// Add defensive programming checks\nif (data && data.property) {\n // Safe to use data.property\n}\n// Or use optional chaining\nconst value = data?.property?.nestedProperty`,\n reason: \"Prevent TypeError by checking for undefined/null values\"\n })\n }\n\n if (error.message.includes(\"404\") || error.message.includes(\"not found\")) {\n structuredFixes.push({\n file: \"routing configuration or API endpoints\",\n description: \"Fix missing route or resource\",\n code: `// Check route configuration\n// Ensure API endpoint exists\n// Verify file paths are correct`,\n reason: \"404 errors indicate missing resources or incorrect paths\"\n })\n }\n })\n\n const suggestedIntegrations: StructuredAnalysisResult[\"suggestedIntegrations\"] = {}\n\n if (integrateNextjs) {\n suggestedIntegrations.nextjs = await generateNextjsSuggestions(allErrors.join(\" \"))\n }\n\n if (integrateChromeDevtools) {\n suggestedIntegrations.chrome = await generateChromeDevtoolsSuggestions(allErrors.join(\" \"))\n }\n\n // Create workflow plan if integrations are available\n let workflowPlan: StructuredAnalysisResult[\"workflowPlan\"]\n\n if (integrateNextjs || integrateChromeDevtools) {\n workflowPlan = {\n phase1: {\n name: \"Data Collection\",\n description: \"Parallel data gathering across all available MCPs\",\n actions: [\n {\n mcp: \"dev3000\",\n function: \"fix_my_app\",\n params: { focusArea, integrateNextjs, integrateChromeDevtools, returnRawData: true },\n reason: \"Get comprehensive error analysis with interaction data\"\n }\n ],\n estimatedTime: \"2-3 minutes\"\n },\n phase2: {\n name: \"Deep Analysis\",\n description: \"Cross-MCP correlation and targeted investigation\",\n actions: [\n {\n mcp: \"dev3000\",\n function: \"fix_my_app\",\n params: { mode: \"bisect\" },\n reason: \"Regression analysis if needed\"\n }\n ],\n estimatedTime: \"3-5 minutes\"\n },\n phase3: {\n name: \"Fix & Verify\",\n description: \"Implementation and verification across all layers\",\n actions: [\n {\n mcp: \"dev3000\",\n function: \"execute_browser_action\",\n reason: \"Replay interactions to verify fixes\"\n }\n ],\n estimatedTime: \"5-10 minutes\"\n }\n }\n\n // Add Next.js actions to workflow\n if (integrateNextjs && suggestedIntegrations.nextjs) {\n workflowPlan.phase1.actions.push(\n ...suggestedIntegrations.nextjs\n .filter((s) => s.priority === \"high\")\n .map((s) => ({\n mcp: \"nextjs-dev\",\n function: s.function,\n params: s.params,\n reason: s.reason\n }))\n )\n\n workflowPlan.phase3.actions.push({\n mcp: \"nextjs-dev\",\n function: \"check_build_status\",\n reason: \"Verify build success after fixes\"\n })\n }\n\n // Add Chrome actions to workflow\n if (integrateChromeDevtools && suggestedIntegrations.chrome) {\n workflowPlan.phase1.actions.push(\n ...suggestedIntegrations.chrome\n .filter((s) => s.priority === \"high\")\n .map((s) => ({\n mcp: \"chrome-devtools\",\n function: s.function,\n params: s.params,\n reason: s.reason\n }))\n )\n }\n }\n\n const structuredResult: StructuredAnalysisResult = {\n errors: structuredErrors,\n fixes: structuredFixes,\n suggestedIntegrations,\n workflowPlan,\n summary: {\n totalErrors: totalErrors,\n criticalErrors: criticalErrors,\n hasIntegrations: integrateNextjs || integrateChromeDevtools,\n estimatedFixTime: calculateEstimatedTime(totalErrors, integrateNextjs || integrateChromeDevtools)\n }\n }\n\n return {\n content: [{ type: \"text\", text: JSON.stringify(structuredResult, null, 2) }]\n }\n }\n\n // Add augmented analysis suggestions when specialized MCPs are available\n const canDelegateChrome = await canDelegateToChromeDevtools(\"profile_performance\")\n\n if (canDelegateNextjs || canDelegateChrome) {\n results.push(\"\")\n results.push(\"🔗 **AUGMENTED ANALYSIS AVAILABLE**\")\n results.push(\"\")\n results.push(\"dev3000 provided the core log analysis above. For deeper insights, consider also gathering:\")\n results.push(\"\")\n\n if (canDelegateNextjs) {\n results.push(\"**Next.js Framework Analysis:**\")\n const dynamicNextjsSuggestions = await generateNextjsSuggestions(allErrors.join(\" \"))\n dynamicNextjsSuggestions.slice(0, 3).forEach((suggestion) => {\n results.push(`• \\`dev3000-nextjs-dev:${suggestion.function}()\\` - ${suggestion.reason}`)\n })\n results.push(\"\")\n }\n\n if (canDelegateChrome) {\n results.push(\"**Browser-Side Analysis:**\")\n const dynamicChromeSuggestions = await generateChromeDevtoolsSuggestions(allErrors.join(\" \"))\n dynamicChromeSuggestions.slice(0, 3).forEach((suggestion) => {\n results.push(`• \\`dev3000-chrome-devtools:${suggestion.function}()\\` - ${suggestion.reason}`)\n })\n results.push(\"\")\n }\n\n results.push(\n \"💡 **Best approach:** Use dev3000's log analysis as your foundation, then gather specific additional data as needed for a complete picture.\"\n )\n }\n\n return {\n content: [{ type: \"text\", text: results.join(\"\\n\") }]\n }\n } catch (error) {\n return {\n content: [\n {\n type: \"text\",\n text: `Error analyzing logs: ${error instanceof Error ? error.message : String(error)}`\n }\n ]\n }\n }\n}\n\n// Dynamic MCP capability discovery and filtering\ninterface McpCapability {\n function: string\n description?: string\n parameters?: Record<string, unknown>\n category: \"advanced\" | \"basic\"\n reason: string\n}\n\ninterface McpSchemaCache {\n timestamp: number\n capabilities: McpCapability[]\n}\n\n// Cache for discovered MCP capabilities (5 minute TTL)\nconst MCP_CAPABILITY_CACHE = new Map<string, McpSchemaCache>()\nconst CAPABILITY_CACHE_TTL = 5 * 60 * 1000 // 5 minutes\n\n// Keywords that indicate advanced capabilities (vs basic automation)\nconst ADVANCED_CAPABILITY_KEYWORDS = {\n chrome: [\n \"inspect\",\n \"debug\",\n \"profile\",\n \"performance\",\n \"console\",\n \"devtools\",\n \"breakpoint\",\n \"intercept\",\n \"storage\",\n \"memory\",\n \"trace\"\n ],\n nextjs: [\"build\", \"hydration\", \"ssr\", \"routing\", \"analyze\", \"debug\", \"render\", \"middleware\", \"optimization\"]\n}\n\n// Basic capabilities that dev3000 handles well (should not suggest these)\nconst DEV3000_BASIC_CAPABILITIES = [\n \"screenshot\",\n \"navigate\",\n \"click\",\n \"type\",\n \"scroll\",\n \"evaluate\",\n \"simple_script\",\n \"get_logs\",\n \"basic_build_status\",\n \"simple_error_check\"\n]\n\n/**\n * Dynamically discover MCP capabilities by introspecting their schemas\n */\nasync function discoverMcpCapabilities(mcpName: string): Promise<McpCapability[]> {\n const cacheKey = mcpName\n const cached = MCP_CAPABILITY_CACHE.get(cacheKey)\n\n // Return cached capabilities if still fresh\n if (cached && Date.now() - cached.timestamp < CAPABILITY_CACHE_TTL) {\n logToDevFile(\n `Capability Discovery: Using cached capabilities for ${mcpName} (${cached.capabilities.length} functions)`\n )\n return cached.capabilities\n }\n\n logToDevFile(`Capability Discovery: Fetching fresh capabilities for ${mcpName}`)\n\n try {\n // Method 1: Try to get MCP schema via tools/list request (MCP protocol standard)\n const capabilities = await introspectMcpTools(mcpName)\n\n if (capabilities.length > 0) {\n // Cache the results\n MCP_CAPABILITY_CACHE.set(cacheKey, {\n timestamp: Date.now(),\n capabilities\n })\n\n logToDevFile(`Capability Discovery: Successfully discovered ${capabilities.length} capabilities for ${mcpName}`)\n return capabilities\n }\n\n // Method 2: Fallback to checking available function names from logs/errors\n const fallbackCapabilities = await inferCapabilitiesFromLogs(mcpName)\n\n // Cache even fallback results to avoid repeated failures\n MCP_CAPABILITY_CACHE.set(cacheKey, {\n timestamp: Date.now(),\n capabilities: fallbackCapabilities\n })\n\n logToDevFile(\n `Capability Discovery: Using fallback inference for ${mcpName} (${fallbackCapabilities.length} functions)`\n )\n return fallbackCapabilities\n } catch (error) {\n logToDevFile(`Capability Discovery: Failed to discover capabilities for ${mcpName} - ${error}`)\n return []\n }\n}\n\n/**\n * Introspect MCP tools using the standard tools/list request\n */\nasync function introspectMcpTools(mcpName: string): Promise<McpCapability[]> {\n // For stdio MCPs, we can try to discover their capabilities by checking Claude's cache directory\n // which often contains MCP schema information or error logs that reveal function names\n\n try {\n const cacheDir = `/Users/${process.env.USER}/Library/Caches/claude-cli-nodejs`\n const { readdirSync, existsSync, readFileSync } = await import(\"fs\")\n\n if (!existsSync(cacheDir)) return []\n\n const cacheDirs = readdirSync(cacheDir)\n const projectDir = cacheDirs.find((dir) => dir.includes(process.cwd().replace(/\\//g, \"-\")))\n\n if (!projectDir) return []\n\n const mcpLogDir = `${cacheDir}/${projectDir}/mcp-logs-${mcpName}`\n if (!existsSync(mcpLogDir)) return []\n\n // Look for schema information in MCP logs\n const logFiles = readdirSync(mcpLogDir)\n const capabilities: McpCapability[] = []\n\n for (const logFile of logFiles.slice(-5)) {\n // Check recent logs only\n try {\n const logPath = `${mcpLogDir}/${logFile}`\n const logContent = readFileSync(logPath, \"utf8\")\n\n // Parse log content for function definitions, tool lists, or schema information\n const discoveredFunctions = extractFunctionsFromLog(logContent, mcpName)\n capabilities.push(...discoveredFunctions)\n } catch (_error) {\n // Skip files that can't be read\n }\n }\n\n return deduplicateCapabilities(capabilities)\n } catch (error) {\n logToDevFile(`MCP Introspection: Failed to introspect ${mcpName} - ${error}`)\n return []\n }\n}\n\n/**\n * Extract function names and descriptions from MCP log content\n */\nfunction extractFunctionsFromLog(logContent: string, mcpName: string): McpCapability[] {\n const capabilities: McpCapability[] = []\n const mcpType: \"chrome\" | \"nextjs\" = mcpName.includes(\"chrome\")\n ? \"chrome\"\n : mcpName.includes(\"nextjs\")\n ? \"nextjs\"\n : \"chrome\" // default to chrome if unknown\n const advancedKeywords = ADVANCED_CAPABILITY_KEYWORDS[mcpType]\n\n // Look for function definitions in various formats\n const patterns = [\n // JSON-RPC method calls: {\"method\": \"tools/list\", \"result\": {\"tools\": [{\"name\": \"function_name\", \"description\": \"...\"}]}}\n /\"name\":\\s*\"([^\"]+)\"/g,\n // Function call patterns: functionName(params)\n /(\\w+)\\s*\\([^)]*\\)/g,\n // Tool definition patterns: tool: function_name\n /tool:\\s*(\\w+)/g,\n // Error messages that reveal function names: \"Unknown function: function_name\"\n /unknown function[:\\s]+(\\w+)/gi,\n // Function export patterns: exports.function_name\n /exports\\.(\\w+)/g\n ]\n\n for (const pattern of patterns) {\n let match: RegExpExecArray | null = pattern.exec(logContent)\n while (match !== null) {\n const functionName = match[1]\n\n // Skip if this is a basic capability that dev3000 handles\n if (DEV3000_BASIC_CAPABILITIES.some((basic) => functionName.toLowerCase().includes(basic))) {\n match = pattern.exec(logContent)\n continue\n }\n\n // Determine if this is an advanced capability\n const isAdvanced = advancedKeywords.some((keyword) => functionName.toLowerCase().includes(keyword))\n\n // Generate reason based on function name and MCP type\n const reason = generateCapabilityReason(functionName, mcpType, isAdvanced)\n\n capabilities.push({\n function: functionName,\n description: undefined, // Will be filled from actual description if available\n category: isAdvanced ? \"advanced\" : \"basic\",\n reason\n })\n\n match = pattern.exec(logContent)\n }\n }\n\n return capabilities\n}\n\n/**\n * Generate intelligent reason text for a discovered capability\n */\nfunction generateCapabilityReason(functionName: string, mcpType: string, isAdvanced: boolean): string {\n const name = functionName.toLowerCase()\n\n // Chrome DevTools specific reasons\n if (mcpType === \"chrome\") {\n if (name.includes(\"inspect\")) return \"Deep DOM inspection with DevTools-level detail\"\n if (name.includes(\"console\")) return \"Direct browser console access and manipulation\"\n if (name.includes(\"debug\") || name.includes(\"breakpoint\"))\n return \"JavaScript debugging with breakpoints and call stack\"\n if (name.includes(\"profile\") || name.includes(\"performance\")) return \"Advanced performance profiling and analysis\"\n if (name.includes(\"network\") || name.includes(\"request\")) return \"Network request interception and analysis\"\n if (name.includes(\"storage\")) return \"Browser storage manipulation (cookies, localStorage, etc.)\"\n if (name.includes(\"trace\") || name.includes(\"memory\")) return \"Memory usage and execution tracing\"\n }\n\n // Next.js specific reasons\n if (mcpType === \"nextjs\") {\n if (name.includes(\"build\")) return \"Advanced Next.js build system analysis\"\n if (name.includes(\"hydration\")) return \"Client-server hydration debugging and analysis\"\n if (name.includes(\"ssr\") || name.includes(\"render\")) return \"Server-side rendering debugging\"\n if (name.includes(\"route\") || name.includes(\"routing\")) return \"Next.js routing system inspection and debugging\"\n if (name.includes(\"middleware\")) return \"Next.js middleware analysis and debugging\"\n if (name.includes(\"optimization\") || name.includes(\"performance\"))\n return \"Next.js-specific performance optimization\"\n }\n\n // Generic advanced vs basic\n if (isAdvanced) {\n return `Advanced ${mcpType} capability beyond dev3000's basic automation`\n }\n\n return `${mcpType} capability for specialized analysis`\n}\n\n/**\n * Infer capabilities from error patterns and log analysis when direct introspection fails\n */\nasync function inferCapabilitiesFromLogs(mcpName: string): Promise<McpCapability[]> {\n // This is a fallback when we can't directly introspect the MCP\n // We'll return commonly expected capabilities based on the MCP type\n\n const mcpType = mcpName.includes(\"chrome\") ? \"chrome\" : mcpName.includes(\"nextjs\") ? \"nextjs\" : \"unknown\"\n const capabilities: McpCapability[] = []\n\n if (mcpType === \"chrome\") {\n // Common chrome-devtools capabilities that are likely to exist\n const commonChromeFunctions = [\n \"inspect_element\",\n \"access_console\",\n \"start_performance_profile\",\n \"intercept_requests\",\n \"set_breakpoint\",\n \"take_screenshot\",\n \"get_dom_snapshot\",\n \"modify_storage\",\n \"execute_script\"\n ]\n\n for (const func of commonChromeFunctions) {\n capabilities.push({\n function: func,\n category: DEV3000_BASIC_CAPABILITIES.includes(func) ? \"basic\" : \"advanced\",\n reason: generateCapabilityReason(func, mcpType, true)\n })\n }\n }\n\n if (mcpType === \"nextjs\") {\n // Common nextjs-dev capabilities that are likely to exist\n const commonNextjsFunctions = [\n \"analyze_build_process\",\n \"debug_server_rendering\",\n \"debug_hydration\",\n \"inspect_routing\",\n \"analyze_next_performance\",\n \"get_build_info\",\n \"check_build_status\",\n \"get_server_logs\"\n ]\n\n for (const func of commonNextjsFunctions) {\n capabilities.push({\n function: func,\n category: DEV3000_BASIC_CAPABILITIES.includes(func) ? \"basic\" : \"advanced\",\n reason: generateCapabilityReason(func, mcpType, true)\n })\n }\n }\n\n logToDevFile(`Capability Inference: Generated ${capabilities.length} inferred capabilities for ${mcpName}`)\n return capabilities\n}\n\n/**\n * Remove duplicate capabilities while preserving the most detailed ones\n */\nfunction deduplicateCapabilities(capabilities: McpCapability[]): McpCapability[] {\n const seen = new Map<string, McpCapability>()\n\n for (const capability of capabilities) {\n const existing = seen.get(capability.function)\n\n // Keep the one with more information (description, better reason, etc.)\n if (\n !existing ||\n (capability.description && !existing.description) ||\n capability.reason.length > existing.reason.length\n ) {\n seen.set(capability.function, capability)\n }\n }\n\n return Array.from(seen.values())\n}\n\n/**\n * Check if chrome-devtools MCP is available and get its capabilities\n */\nasync function canDelegateToChromeDevtools(action?: string): Promise<boolean> {\n try {\n // Check if MCP is available\n const availableMcps = await discoverAvailableMcps()\n if (!availableMcps.includes(\"dev3000-chrome-devtools\")) {\n return false\n }\n\n // If no specific action, just return availability\n if (!action) return true\n\n // Get dynamic capabilities\n const capabilities = await discoverMcpCapabilities(\"dev3000-chrome-devtools\")\n\n // Check if the MCP has relevant capabilities for the action\n const hasRelevantCapability = capabilities.some(\n (cap) => cap.function.toLowerCase().includes(action.toLowerCase()) || cap.category === \"advanced\" // Any advanced capability indicates delegation worthiness\n )\n\n return hasRelevantCapability\n } catch (error) {\n logToDevFile(`Chrome DevTools delegation check failed: ${error}`)\n return false\n }\n}\n\n/**\n * Check if nextjs-dev MCP is available and get its capabilities\n */\nasync function canDelegateToNextjs(): Promise<boolean> {\n try {\n // Check if MCP is available\n const availableMcps = await discoverAvailableMcps()\n if (!availableMcps.includes(\"dev3000-nextjs-dev\")) {\n return false\n }\n\n // Get dynamic capabilities to verify it has useful functions\n const capabilities = await discoverMcpCapabilities(\"dev3000-nextjs-dev\")\n\n // Return true if we found any advanced Next.js capabilities\n return capabilities.some((cap) => cap.category === \"advanced\")\n } catch (error) {\n logToDevFile(`NextJS delegation check failed: ${error}`)\n return false\n }\n}\n\n/**\n * Delegate browser action to chrome-devtools MCP\n */\nasync function delegateToChromeDevtools(\n action: string,\n params: Record<string, unknown>\n): Promise<{ content: Array<{ type: \"text\"; text: string }> }> {\n // Get dynamic capabilities from chrome-devtools MCP\n const capabilities = await discoverMcpCapabilities(\"dev3000-chrome-devtools\")\n\n // Find a relevant capability for this action\n const relevantCap = capabilities.find(\n (cap) =>\n cap.function.toLowerCase().includes(action.toLowerCase()) ||\n cap.description?.toLowerCase().includes(action.toLowerCase())\n )\n\n if (!relevantCap) {\n throw new Error(`Action ${action} cannot be delegated to chrome-devtools`)\n }\n\n return {\n content: [\n {\n type: \"text\",\n text: `🔗 **ADVANCED BROWSER DEBUGGING AVAILABLE**\n\nFor advanced debugging capabilities, use the \\`dev3000-chrome-devtools\\` MCP:\n\n\\`\\`\\`\ndev3000-chrome-devtools:${relevantCap.function}(${JSON.stringify(params, null, 2)})\n\\`\\`\\`\n\n🎯 **Why use chrome-devtools for this:** ${relevantCap.reason}\n\n💡 **When to use each tool:**\n• **dev3000**: Basic browser automation (screenshots, navigation, clicks, simple scripts)\n• **dev3000-chrome-devtools**: Advanced debugging (DOM inspection, breakpoints, performance profiling, network interception)\n\n⚡ **Both tools share the same Chrome instance** - no conflicts or duplicate browsers`\n }\n ]\n }\n}\n\n/**\n * Delegate to nextjs-dev MCP with suggested functions\n */\nasync function _delegateToNextjs(): Promise<{ content: Array<{ type: \"text\"; text: string }> }> {\n // Get dynamic capabilities from nextjs-dev MCP\n const capabilities = await discoverMcpCapabilities(\"dev3000-nextjs-dev\")\n\n const availableFunctions = capabilities\n .map((cap) => `• \\`dev3000-nextjs-dev:${cap.function}()\\` - ${cap.reason}`)\n .join(\"\\n\")\n\n return {\n content: [\n {\n type: \"text\",\n text: `🔗 **ADVANCED NEXT.JS ANALYSIS AVAILABLE**\n\nFor Next.js-specific advanced analysis, use the \\`dev3000-nextjs-dev\\` MCP:\n\n**Available Advanced Functions:**\n${availableFunctions}\n\n💡 **When to use each tool:**\n• **dev3000**: General log analysis, basic error detection, simple build monitoring\n• **dev3000-nextjs-dev**: Advanced Next.js debugging (SSR issues, hydration problems, build system analysis, routing inspection)\n\n⚡ **Best of both worlds:** Use dev3000 for general monitoring and nextjs-dev for framework-specific deep dives`\n }\n ]\n }\n}\n\nexport async function executeBrowserAction({\n action,\n params = {}\n}: ExecuteBrowserActionParams): Promise<{ content: Array<{ type: \"text\"; text: string }> }> {\n try {\n // 🎯 INTELLIGENT DELEGATION: Check if chrome-devtools MCP can handle this action\n const canDelegate = await canDelegateToChromeDevtools(action)\n if (canDelegate) {\n logToDevFile(`Browser Action Delegation: Routing '${action}' to chrome-devtools MCP`)\n return await delegateToChromeDevtools(action, params)\n }\n\n // Log fallback to dev3000's own implementation\n logToDevFile(`Browser Action Fallback: Using dev3000's execute_browser_action for '${action}'`)\n\n // First, find active session to get CDP URL\n const sessions = findActiveSessions()\n if (sessions.length === 0) {\n return {\n content: [\n {\n type: \"text\",\n text: \"❌ No active dev3000 sessions found. Make sure dev3000 is running with a browser!\"\n }\n ]\n }\n }\n\n // Get the most recent session's CDP URL (stored in session data)\n const sessionData = JSON.parse(readFileSync(sessions[0].sessionFile, \"utf-8\"))\n let cdpUrl = sessionData.cdpUrl\n\n if (!cdpUrl) {\n // Try to get CDP URL from Chrome debugging port as fallback\n try {\n const response = await fetch(\"http://localhost:9222/json\")\n const pages = await response.json()\n const activePage = pages.find(\n (page: { type: string; url: string }) => page.type === \"page\" && !page.url.startsWith(\"chrome://\")\n )\n if (activePage) {\n cdpUrl = activePage.webSocketDebuggerUrl\n logToDevFile(`CDP Discovery: Found fallback CDP URL ${cdpUrl}`, sessions[0].projectName)\n }\n } catch (error) {\n logToDevFile(`CDP Discovery: Failed to find fallback CDP URL - ${error}`, sessions[0].projectName)\n }\n }\n\n if (!cdpUrl) {\n return {\n content: [\n {\n type: \"text\",\n text: `❌ No Chrome DevTools Protocol URL found. Make sure dev3000 is running with browser monitoring enabled (not --servers-only mode). Session CDP URL: ${sessionData.cdpUrl || \"null\"}`\n }\n ]\n }\n }\n\n // Connect to Chrome DevTools Protocol with timeout\n const result = await new Promise<Record<string, unknown>>((resolve, reject) => {\n const ws = new WebSocket(cdpUrl)\n\n // Overall timeout for the entire browser action (60 seconds)\n const overallTimeout = setTimeout(() => {\n ws.close()\n reject(\n new Error(\n `Browser action '${action}' timed out after 60 seconds. This may indicate an issue with the browser or invalid parameters.`\n )\n )\n }, 60000)\n\n ws.on(\"open\", async () => {\n try {\n // Get the first page target\n ws.send(JSON.stringify({ id: 1, method: \"Target.getTargets\", params: {} }))\n\n let targetId: string | null = null\n let _sessionId: string | null = null\n let messageId = 2\n\n ws.on(\"message\", async (data) => {\n try {\n const message = JSON.parse(data.toString())\n\n // Handle getting targets\n if (message.id === 1) {\n // Check for CDP protocol errors (e.g., \"Not allowed\" in sandboxed environments)\n if (message.error) {\n clearTimeout(overallTimeout)\n ws.close()\n reject(\n new Error(\n `Browser protocol error: ${message.error.message || JSON.stringify(message.error)}. This may occur in sandboxed browser environments where certain CDP commands are restricted.`\n )\n )\n return\n }\n\n const pageTarget = message.result?.targetInfos?.find((t: Record<string, unknown>) => t.type === \"page\")\n if (!pageTarget) {\n clearTimeout(overallTimeout)\n ws.close()\n reject(new Error(\"No page targets found\"))\n return\n }\n\n targetId = pageTarget.targetId\n\n // Attach to the target\n ws.send(\n JSON.stringify({\n id: messageId++,\n method: \"Target.attachToTarget\",\n params: { targetId, flatten: true }\n })\n )\n return\n }\n\n // Handle session creation\n if (message.method === \"Target.attachedToTarget\") {\n _sessionId = message.params.sessionId\n\n // Now execute the requested action\n let cdpResult: Record<string, unknown>\n\n switch (action) {\n case \"click\": {\n let clickX: number\n let clickY: number\n\n // Support both coordinate-based and selector-based clicks\n if (typeof params.selector === \"string\") {\n // Get element coordinates from selector and ensure we click in the center\n const selectorResult = (await sendCDPCommand(ws, messageId++, \"Runtime.evaluate\", {\n expression: `(() => {\n const el = document.querySelector(${JSON.stringify(params.selector)});\n if (!el) return { found: false };\n const rect = el.getBoundingClientRect();\n // Calculate center point, rounding to avoid fractional pixels\n const centerX = Math.round(rect.left + rect.width / 2);\n const centerY = Math.round(rect.top + rect.height / 2);\n // Verify what element is at this point\n const elementAtPoint = document.elementFromPoint(centerX, centerY);\n const isCorrectElement = elementAtPoint === el || el.contains(elementAtPoint);\n return {\n found: true,\n x: centerX,\n y: centerY,\n width: rect.width,\n height: rect.height,\n elementAtPoint: elementAtPoint?.tagName + (elementAtPoint?.className ? '.' + elementAtPoint.className : ''),\n isCorrectElement: isCorrectElement\n };\n })()`,\n returnByValue: true\n })) as {\n result?: {\n value?: {\n found: boolean\n x?: number\n y?: number\n width?: number\n height?: number\n elementAtPoint?: string\n isCorrectElement?: boolean\n }\n }\n }\n\n if (\n selectorResult.result?.value?.found === true &&\n typeof selectorResult.result.value.x === \"number\" &&\n typeof selectorResult.result.value.y === \"number\"\n ) {\n clickX = selectorResult.result.value.x\n clickY = selectorResult.result.value.y\n\n // Log diagnostic info if element at point doesn't match\n if (selectorResult.result.value.isCorrectElement === false) {\n console.warn(\n `[execute_browser_action] Warning: Center point (${clickX}, ${clickY}) is over ${selectorResult.result.value.elementAtPoint}, not the target element. ` +\n `This may cause unexpected click behavior. Element size: ${selectorResult.result.value.width}x${selectorResult.result.value.height}`\n )\n }\n } else {\n throw new Error(`Element not found for selector: ${params.selector}`)\n }\n } else if (typeof params.x === \"number\" && typeof params.y === \"number\") {\n clickX = params.x\n clickY = params.y\n } else {\n throw new Error(\"Click action requires either {x, y} coordinates or a {selector} CSS selector\")\n }\n\n cdpResult = await sendCDPCommand(ws, messageId++, \"Input.dispatchMouseEvent\", {\n type: \"mousePressed\",\n x: clickX,\n y: clickY,\n button: \"left\",\n clickCount: 1\n })\n await sendCDPCommand(ws, messageId++, \"Input.dispatchMouseEvent\", {\n type: \"mouseReleased\",\n x: clickX,\n y: clickY,\n button: \"left\",\n clickCount: 1\n })\n break\n }\n\n case \"navigate\":\n if (typeof params.url !== \"string\") {\n throw new Error(\"Navigate action requires url parameter as string\")\n }\n cdpResult = await sendCDPCommand(ws, messageId++, \"Page.navigate\", { url: params.url })\n break\n\n case \"reload\":\n // Use CDP Page.reload for reliable page refresh that triggers CLS capture\n cdpResult = await sendCDPCommand(ws, messageId++, \"Page.reload\", {})\n break\n\n case \"screenshot\":\n ws.close()\n resolve({\n warning: \"Screenshot action is not recommended!\",\n advice:\n \"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.\",\n suggestion: \"Run fix_my_app to see all auto-captured screenshots from your session.\"\n })\n return\n\n case \"evaluate\": {\n if (typeof params.expression !== \"string\") {\n throw new Error(\"Evaluate action requires expression parameter as string\")\n }\n const expression = params.expression\n // Validate that the expression is safe (read-only DOM queries)\n // Block dangerous patterns\n const dangerousPatterns = [\n /eval\\s*\\(/,\n /Function\\s*\\(/,\n /setTimeout/,\n /setInterval/,\n /\\.innerHTML\\s*=/,\n /\\.outerHTML\\s*=/,\n /document\\.write/,\n /document\\.cookie\\s*=/,\n /localStorage\\.setItem/,\n /sessionStorage\\.setItem/,\n /\\.src\\s*=/,\n /\\.href\\s*=/,\n /location\\s*=/,\n /\\.addEventListener/,\n /\\.removeEventListener/,\n /new\\s+Function/,\n /import\\s*\\(/,\n /fetch\\s*\\(/,\n /XMLHttpRequest/\n ]\n\n if (dangerousPatterns.some((regex) => regex.test(expression))) {\n throw new Error(\n \"Expression contains dangerous patterns. Only safe read-only expressions allowed.\"\n )\n }\n\n cdpResult = await sendCDPCommand(ws, messageId++, \"Runtime.evaluate\", {\n expression: expression,\n returnByValue: true\n })\n break\n }\n\n case \"scroll\": {\n const scrollX = typeof params.deltaX === \"number\" ? params.deltaX : 0\n const scrollY = typeof params.deltaY === \"number\" ? params.deltaY : 0\n cdpResult = await sendCDPCommand(ws, messageId++, \"Input.dispatchMouseEvent\", {\n type: \"mouseWheel\",\n x: typeof params.x === \"number\" ? params.x : 500,\n y: typeof params.y === \"number\" ? params.y : 500,\n deltaX: scrollX,\n deltaY: scrollY\n })\n break\n }\n\n case \"type\":\n if (typeof params.text !== \"string\") {\n throw new Error(\"Type action requires text parameter as string\")\n }\n // Type each character\n for (const char of params.text) {\n await sendCDPCommand(ws, messageId++, \"Input.dispatchKeyEvent\", {\n type: \"char\",\n text: char\n })\n }\n cdpResult = { action: \"type\", text: params.text }\n break\n\n default:\n throw new Error(`Unsupported action: ${action}`)\n }\n\n ws.close()\n clearTimeout(overallTimeout)\n resolve(cdpResult)\n }\n } catch (error) {\n // Catch any errors that occur during message handling\n ws.close()\n clearTimeout(overallTimeout)\n reject(\n error instanceof Error\n ? error\n : new Error(`Browser action failed: ${error instanceof Error ? error.message : String(error)}`)\n )\n }\n })\n\n ws.on(\"error\", (error) => {\n clearTimeout(overallTimeout)\n reject(error)\n })\n\n // Helper function to send CDP commands\n async function sendCDPCommand(\n ws: WebSocket,\n id: number,\n method: string,\n params: Record<string, unknown>\n ): Promise<Record<string, unknown>> {\n return new Promise((cmdResolve, cmdReject) => {\n const command = { id, method, params }\n\n const messageHandler = (data: Buffer) => {\n const message = JSON.parse(data.toString())\n if (message.id === id) {\n ws.removeListener(\"message\", messageHandler)\n if (message.error) {\n cmdReject(new Error(message.error.message))\n } else {\n cmdResolve(message.result)\n }\n }\n }\n\n ws.on(\"message\", messageHandler)\n ws.send(JSON.stringify(command))\n\n // Command timeout (30 seconds for complex evaluate expressions)\n setTimeout(() => {\n ws.removeListener(\"message\", messageHandler)\n cmdReject(new Error(`CDP command timeout after 30s: ${method}`))\n }, 30000)\n })\n }\n } catch (error) {\n ws.close()\n clearTimeout(overallTimeout)\n reject(error)\n }\n })\n\n ws.on(\"error\", (error) => {\n clearTimeout(overallTimeout)\n reject(error)\n })\n })\n\n // Build success message with augmented suggestions\n let successMessage = `Browser action '${action}' executed successfully. Result: ${JSON.stringify(result, null, 2)}`\n\n // Add augmented suggestions for enhanced capabilities\n const canDelegateChrome = await canDelegateToChromeDevtools(\"inspect_element\")\n if (canDelegateChrome) {\n successMessage += \"\\n\\n🔗 **ENHANCED BROWSER ANALYSIS AVAILABLE**\"\n successMessage +=\n \"\\n\\ndev3000 completed the basic browser action above. For deeper browser insights, consider also:\"\n\n // Generate dynamic suggestions based on the action and available capabilities\n const dynamicSuggestions = await generateChromeDevtoolsSuggestions(action)\n const actionRelevantSuggestions = dynamicSuggestions.filter((suggestion) => {\n const funcName = suggestion.function.toLowerCase()\n const actionName = action.toLowerCase()\n\n // Match suggestions to specific actions\n if (actionName === \"screenshot\" && (funcName.includes(\"inspect\") || funcName.includes(\"performance\")))\n return true\n if (actionName === \"evaluate\" && (funcName.includes(\"console\") || funcName.includes(\"inspect\"))) return true\n if (actionName === \"navigate\" && (funcName.includes(\"network\") || funcName.includes(\"performance\"))) return true\n if (actionName === \"click\" && (funcName.includes(\"console\") || funcName.includes(\"inspect\"))) return true\n\n // Include high-priority suggestions regardless\n return suggestion.priority === \"high\"\n })\n\n actionRelevantSuggestions.slice(0, 2).forEach((suggestion) => {\n successMessage += `\\n• \\`dev3000-chrome-devtools:${suggestion.function}()\\` - ${suggestion.reason}`\n })\n\n successMessage +=\n \"\\n\\n💡 **Augmented approach:** Use dev3000 for basic automation, chrome-devtools for detailed analysis and debugging.\"\n }\n\n return {\n content: [\n {\n type: \"text\",\n text: successMessage\n }\n ]\n }\n } catch (error) {\n return {\n content: [\n {\n type: \"text\",\n text: `Browser action failed: ${error instanceof Error ? error.message : String(error)}`\n }\n ]\n }\n }\n}\n\n// MCP Integration and Workflow Orchestration Functions\n\n/**\n * Known MCP patterns for process detection\n */\nconst KNOWN_MCP_PATTERNS = {\n \"nextjs-dev\": [\n \"nextjs-dev\",\n \"nextjs-dev-mcp\",\n \"@modelcontextprotocol/server-nextjs-dev\",\n \"mcp-server-nextjs-dev\",\n \"nextjs-mcp\"\n ],\n \"chrome-devtools\": [\n \"chrome-devtools\",\n \"chrome-devtools-mcp\",\n \"@modelcontextprotocol/server-chrome-devtools\",\n \"mcp-server-chrome-devtools\",\n \"chrome-mcp\"\n ]\n}\n\n/**\n * Standard MCP ports to try pinging\n */\nconst STANDARD_MCP_PORTS = {\n \"nextjs-dev\": [3001, 3002, 8080, 8081],\n \"chrome-devtools\": [9222, 9223, 9224, 3003]\n}\n\n/**\n * Detect running processes that match known MCP patterns\n */\nasync function detectMcpProcesses(): Promise<string[]> {\n const detectedMcps: string[] = []\n\n try {\n // Get running processes on different platforms\n const platform = process.platform\n let psCommand: string\n\n if (platform === \"darwin\" || platform === \"linux\") {\n psCommand = \"ps aux\"\n } else if (platform === \"win32\") {\n psCommand = \"tasklist\"\n } else {\n logToDevFile(\"MCP Discovery: Unsupported platform for process detection\")\n return []\n }\n\n const { stdout } = await execAsync(psCommand)\n const processes = stdout.toLowerCase()\n\n // Check for each known MCP pattern\n for (const [mcpName, patterns] of Object.entries(KNOWN_MCP_PATTERNS)) {\n for (const pattern of patterns) {\n if (processes.includes(pattern.toLowerCase())) {\n if (!detectedMcps.includes(mcpName)) {\n detectedMcps.push(mcpName)\n logToDevFile(`MCP Discovery: Found ${mcpName} MCP via process detection [${pattern}]`)\n }\n break\n }\n }\n }\n } catch (error) {\n logToDevFile(`MCP Discovery: Process detection failed - ${error instanceof Error ? error.message : String(error)}`)\n }\n\n return detectedMcps\n}\n\n/**\n * Try to ping MCP services on standard ports\n */\nasync function pingMcpPorts(): Promise<string[]> {\n const detectedMcps: string[] = []\n\n for (const [mcpName, ports] of Object.entries(STANDARD_MCP_PORTS)) {\n for (const port of ports) {\n try {\n // Try HTTP health check first\n const response = await fetch(`http://localhost:${port}/health`, {\n method: \"GET\",\n signal: AbortSignal.timeout(2000)\n })\n\n if (response.ok) {\n detectedMcps.push(mcpName)\n logToDevFile(`MCP Discovery: Found ${mcpName} MCP via HTTP ping on port ${port}`)\n break\n }\n } catch {\n // Try WebSocket connection for MCP protocol\n try {\n const ws = new WebSocket(`ws://localhost:${port}`)\n await new Promise((resolve, reject) => {\n const timeout = setTimeout(() => {\n ws.close()\n reject(new Error(\"timeout\"))\n }, 1000)\n\n ws.on(\"open\", () => {\n clearTimeout(timeout)\n ws.close()\n detectedMcps.push(mcpName)\n logToDevFile(`MCP Discovery: Found ${mcpName} MCP via WebSocket ping on port ${port}`)\n resolve(null)\n })\n\n ws.on(\"error\", () => {\n clearTimeout(timeout)\n reject(new Error(\"connection failed\"))\n })\n })\n break\n } catch {}\n }\n }\n }\n\n return detectedMcps\n}\n\n/**\n * Comprehensive MCP discovery using multiple methods\n */\nexport async function discoverAvailableMcps(projectName?: string): Promise<string[]> {\n logToDevFile(\"MCP Discovery: Starting proactive MCP discovery\", projectName)\n\n const discoveredMcps = new Set<string>()\n\n // Method 1: Process detection\n const processDetected = await detectMcpProcesses()\n for (const mcp of processDetected) {\n discoveredMcps.add(mcp)\n }\n\n // Method 2: Check for dev3000-configured MCPs by testing their functionality\n try {\n // Test if dev3000-chrome-devtools MCP is working by checking Claude logs\n const cacheDir = `/Users/${process.env.USER}/Library/Caches/claude-cli-nodejs`\n const { readdirSync, existsSync } = await import(\"fs\")\n\n if (existsSync(cacheDir)) {\n const cacheDirs = readdirSync(cacheDir)\n const projectDir = cacheDirs.find((dir) => dir.includes(process.cwd().replace(/\\//g, \"-\")))\n\n if (projectDir) {\n const projectCacheDir = `${cacheDir}/${projectDir}`\n\n // Check for chrome-devtools MCP logs\n const chromeDevtoolsLogDir = `${projectCacheDir}/mcp-logs-dev3000-chrome-devtools`\n if (existsSync(chromeDevtoolsLogDir)) {\n const chromeDevtoolsLogs = readdirSync(chromeDevtoolsLogDir)\n if (chromeDevtoolsLogs.length > 0) {\n discoveredMcps.add(\"dev3000-chrome-devtools\")\n logToDevFile(\"MCP Discovery: Found dev3000-chrome-devtools via Claude cache logs\", projectName)\n }\n }\n\n // Check for nextjs-dev MCP logs\n const nextjsDevLogDir = `${projectCacheDir}/mcp-logs-dev3000-nextjs-dev`\n if (existsSync(nextjsDevLogDir)) {\n const nextjsDevLogs = readdirSync(nextjsDevLogDir)\n if (nextjsDevLogs.length > 0) {\n discoveredMcps.add(\"dev3000-nextjs-dev\")\n logToDevFile(\"MCP Discovery: Found dev3000-nextjs-dev via Claude cache logs\", projectName)\n }\n }\n }\n }\n } catch (_error) {\n logToDevFile(\"MCP Discovery: Claude cache check failed, falling back to port detection\", projectName)\n }\n\n // Method 3: Port pinging (fallback)\n if (discoveredMcps.size === 0) {\n logToDevFile(\"MCP Discovery: No MCPs found via process or cache detection, trying port pinging\", projectName)\n const portDetected = await pingMcpPorts()\n for (const mcp of portDetected) {\n discoveredMcps.add(mcp)\n }\n }\n\n const finalMcps = Array.from(discoveredMcps)\n\n if (finalMcps.length > 0) {\n logToDevFile(`MCP Discovery: Successfully discovered MCPs [${finalMcps.join(\", \")}]`, projectName)\n } else {\n logToDevFile(\"MCP Discovery: No MCPs detected - will run in standalone mode\", projectName)\n }\n\n return finalMcps\n}\n\n/**\n * Get and display MCP capabilities for debugging and inspection\n */\nexport async function getMcpCapabilities({\n mcpName\n}: GetMcpCapabilitiesParams = {}): Promise<{ content: Array<{ type: \"text\"; text: string }> }> {\n const results: string[] = []\n\n results.push(\"🔍 **MCP CAPABILITY INSPECTOR**\")\n results.push(\"\")\n\n try {\n // Discover available MCPs if no specific one requested\n const availableMcps = await discoverAvailableMcps()\n\n if (availableMcps.length === 0) {\n results.push(\"❌ **NO MCPs DETECTED**\")\n results.push(\"No dev3000-chrome-devtools or dev3000-nextjs-dev MCPs found.\")\n results.push(\"\")\n results.push(\"💡 **To enable enhanced capabilities:**\")\n results.push(\"• Ensure Chrome DevTools MCP is configured: `dev3000-chrome-devtools`\")\n results.push(\"• Ensure Next.js Dev MCP is configured: `dev3000-nextjs-dev`\")\n results.push(\"• Check that Claude Code has MCPs properly configured\")\n\n return {\n content: [{ type: \"text\", text: results.join(\"\\n\") }]\n }\n }\n\n results.push(`✅ **DISCOVERED MCPs:** ${availableMcps.join(\", \")}`)\n results.push(\"\")\n\n // Filter to specific MCP if requested\n const mcpsToInspect = mcpName ? availableMcps.filter((name) => name.includes(mcpName)) : availableMcps\n\n if (mcpsToInspect.length === 0 && mcpName) {\n results.push(`❌ **MCP NOT FOUND:** ${mcpName}`)\n results.push(`Available MCPs: ${availableMcps.join(\", \")}`)\n\n return {\n content: [{ type: \"text\", text: results.join(\"\\n\") }]\n }\n }\n\n // Inspect capabilities for each MCP\n for (const mcp of mcpsToInspect) {\n results.push(`📋 **${mcp.toUpperCase()} CAPABILITIES:**`)\n results.push(\"\")\n\n const capabilities = await discoverMcpCapabilities(mcp)\n\n if (capabilities.length === 0) {\n results.push(\" ❌ No capabilities discovered\")\n results.push(\" 💡 This might indicate the MCP is not properly configured or accessible\")\n results.push(\"\")\n continue\n }\n\n // Group by category\n const advanced = capabilities.filter((cap) => cap.category === \"advanced\")\n const basic = capabilities.filter((cap) => cap.category === \"basic\")\n\n results.push(` 🚀 **ADVANCED CAPABILITIES** (${advanced.length} functions):`)\n if (advanced.length > 0) {\n advanced.forEach((cap) => {\n results.push(` • \\`${cap.function}()\\` - ${cap.reason}`)\n })\n } else {\n results.push(\" No advanced capabilities discovered\")\n }\n results.push(\"\")\n\n results.push(` ⚙️ **BASIC CAPABILITIES** (${basic.length} functions):`)\n if (basic.length > 0) {\n basic.forEach((cap) => {\n results.push(` • \\`${cap.function}()\\` - ${cap.reason}`)\n })\n } else {\n results.push(\" No basic capabilities discovered\")\n }\n results.push(\"\")\n\n // Cache info\n const cached = MCP_CAPABILITY_CACHE.get(mcp)\n if (cached) {\n const age = Date.now() - cached.timestamp\n const ageMinutes = Math.floor(age / 60000)\n results.push(` 📝 **CACHE INFO:** Discovered ${ageMinutes} minutes ago`)\n if (age > CAPABILITY_CACHE_TTL * 0.8) {\n results.push(\" ⚠️ Cache will refresh soon on next use\")\n }\n }\n results.push(\"\")\n }\n\n // Summary\n const totalCapabilities = mcpsToInspect.reduce(async (accPromise, mcp) => {\n const acc = await accPromise\n const caps = await discoverMcpCapabilities(mcp)\n return acc + caps.length\n }, Promise.resolve(0))\n\n results.push(\"🎯 **AUGMENTED DELEGATION STATUS:**\")\n results.push(`• Total discovered capabilities: ${await totalCapabilities}`)\n results.push(\n `• MCPs with advanced capabilities: ${\n mcpsToInspect.filter(async (mcp) => {\n const caps = await discoverMcpCapabilities(mcp)\n return caps.some((cap) => cap.category === \"advanced\")\n }).length\n }`\n )\n results.push(\"• Dynamic discovery: ✅ Active (updates automatically)\")\n results.push(\"• Cache TTL: 5 minutes\")\n results.push(\"\")\n results.push(\"💡 **These capabilities are automatically suggested in dev3000's enhanced responses!**\")\n\n return {\n content: [{ type: \"text\", text: results.join(\"\\n\") }]\n }\n } catch (error) {\n results.push(`❌ **ERROR INSPECTING CAPABILITIES:** ${error instanceof Error ? error.message : String(error)}`)\n results.push(\"\")\n results.push(\"💡 **Troubleshooting:**\")\n results.push(\"• Check that MCPs are properly configured in Claude Code\")\n results.push(\"• Verify dev3000 can access Claude cache directories\")\n\n return {\n content: [{ type: \"text\", text: results.join(\"\\n\") }]\n }\n }\n}\n\n/**\n * Detect if pixel changes represent a layout shift (elements moving) vs content change (images loading)\n *\n * Key distinction:\n * - Layout shifts: Elements move to new positions (top region changes while bottom stays same)\n * - Content changes: Same regions change in-place (image loads with pixels appearing)\n */\nfunction detectLayoutShiftVsContentChange(\n prevPng: PNG,\n currPng: PNG\n): { isLayoutShift: boolean; shiftScore: number; isOverlayNoise: boolean } {\n const width = prevPng.width\n const height = prevPng.height\n\n // Track changes at row-level for detecting correlated shifts\n const rowChangeCounts = new Array(height).fill(0)\n\n // Count changed pixels per row (for correlation analysis)\n for (let y = 0; y < height; y++) {\n for (let x = 0; x < width; x++) {\n const idx = (width * y + x) << 2\n const rDiff = Math.abs(prevPng.data[idx] - currPng.data[idx])\n const gDiff = Math.abs(prevPng.data[idx + 1] - currPng.data[idx + 1])\n const bDiff = Math.abs(prevPng.data[idx + 2] - currPng.data[idx + 2])\n\n if (rDiff > 30 || gDiff > 30 || bDiff > 30) {\n rowChangeCounts[y]++\n }\n }\n }\n\n // Calculate percentage of pixels changed per row\n const rowChangePercents = rowChangeCounts.map((count) => (count / width) * 100)\n\n // Detect consecutive rows with high change (indicates shift boundary)\n // True CLS: Many consecutive rows change together (content moved as a block)\n let maxConsecutiveHighChangeRows = 0\n let currentConsecutive = 0\n\n for (let i = 0; i < height; i++) {\n if (rowChangePercents[i] > 50) {\n // >50% of row changed\n currentConsecutive++\n maxConsecutiveHighChangeRows = Math.max(maxConsecutiveHighChangeRows, currentConsecutive)\n } else {\n currentConsecutive = 0\n }\n }\n\n // Detect isolated hotspots (fixed/absolute overlay noise)\n // Pattern: low change → spike → low change (element appearing in place)\n let isolatedHotspots = 0\n const windowSize = 5\n\n for (let i = windowSize; i < height - windowSize; i++) {\n // Calculate average change in windows before, during, and after\n const before = rowChangePercents.slice(i - windowSize, i).reduce((a, b) => a + b, 0) / windowSize\n const during = rowChangePercents[i]\n const after = rowChangePercents.slice(i + 1, i + windowSize + 1).reduce((a, b) => a + b, 0) / windowSize\n\n // Isolated spike: calm before/after, high during\n if (before < 10 && during > 60 && after < 10) {\n isolatedHotspots++\n }\n }\n\n // Detect narrow fixed elements (toolbars, indicators)\n // Pattern: Many rows with LOW percentage change (5-25%) = narrow element across many rows\n // This catches toolbars/indicators that are thin but tall\n let narrowChangeRows = 0\n for (let i = 0; i < height; i++) {\n // Low but consistent change (narrow element)\n if (rowChangePercents[i] > 5 && rowChangePercents[i] < 25) {\n narrowChangeRows++\n }\n }\n\n // If many rows have narrow changes, this is likely a fixed toolbar/sidebar\n const hasNarrowFixedElement = narrowChangeRows > height * 0.3 // >30% of rows have narrow changes\n\n // Calculate band-based metrics for backward compatibility\n const bandHeight = Math.floor(height / 8)\n const bands = Array(8).fill(0)\n\n for (let y = 0; y < height; y++) {\n const bandIndex = Math.min(Math.floor(y / bandHeight), 7)\n bands[bandIndex] += rowChangeCounts[y]\n }\n\n const pixelsPerBand = width * bandHeight\n const bandPercentages = bands.map((count) => (count / pixelsPerBand) * 100)\n const topBandChange = (bandPercentages[0] + bandPercentages[1]) / 2\n const bottomBandChange = (bandPercentages[6] + bandPercentages[7]) / 2\n\n // Calculate variance to detect if changes are uniform (shift) or scattered (overlay)\n const meanChange = bandPercentages.reduce((a, b) => a + b, 0) / bandPercentages.length\n const variance = bandPercentages.reduce((sum, val) => sum + (val - meanChange) ** 2, 0) / bandPercentages.length\n\n // Determine if this is a layout shift or overlay noise\n // True layout shift indicators:\n // 1. Many consecutive rows changed (>20 rows = significant shift)\n // 2. Top heavy change pattern (topBandChange > bottomBandChange)\n // 3. Low variance (uniform change across bands)\n // 4. Few isolated hotspots\n\n const hasConsecutiveShift = maxConsecutiveHighChangeRows > 20\n const hasTopHeavyPattern = topBandChange > 5 && bottomBandChange < 2 && topBandChange > bottomBandChange * 2\n const hasUniformChange = variance < 200 && meanChange > 10\n const hasIsolatedHotspots = isolatedHotspots >= 3\n\n // Overlay noise indicators:\n // 1. High variance (scattered changes)\n // 2. Multiple isolated hotspots\n // 3. Few consecutive rows changed\n // 4. Narrow fixed element (toolbar/indicator pattern)\n const isOverlayNoise =\n hasNarrowFixedElement || // Narrow element like toolbar\n (hasIsolatedHotspots && !hasConsecutiveShift && (variance > 500 || meanChange < 10))\n\n // Layout shift: Either consecutive shift pattern OR traditional top-heavy pattern\n // But NOT if it looks like overlay noise\n const isLayoutShift = !isOverlayNoise && (hasConsecutiveShift || hasTopHeavyPattern || hasUniformChange)\n\n // Calculate shift score\n const totalChanged = bands.reduce((sum, count) => sum + count, 0)\n const totalPixels = width * height\n const shiftScore = (totalChanged / totalPixels) * 0.1\n\n return { isLayoutShift, shiftScore, isOverlayNoise }\n}\n\n/**\n * Detect jank/layout shifts by comparing screenshots from ScreencastManager\n * Returns array of jank detections with timing and visual impact data\n */\nasync function detectJankFromScreenshots(_projectName?: string): Promise<{\n detections: Array<{\n timestamp: string\n timeSinceStart: number\n visualDiff: number\n severity: \"low\" | \"medium\" | \"high\"\n element?: string\n clsScore?: number\n uxImpact?: string\n beforeFrameUrl?: string\n afterFrameUrl?: string\n }>\n sessionId: string\n totalFrames: number\n screenshotDir: string\n realCLS?: { score: number; grade: string }\n captureTrigger?: \"navigation\" | \"load\"\n}> {\n const screenshotDir = process.env.SCREENSHOT_DIR || join(tmpdir(), \"dev3000-mcp-deps\", \"public\", \"screenshots\")\n\n if (!existsSync(screenshotDir)) {\n return { detections: [], sessionId: \"\", totalFrames: 0, screenshotDir }\n }\n\n // Find the most recent screencast session (files like 2025-10-06T01-54-45Z-jank-*.png)\n const files = readdirSync(screenshotDir)\n .filter((f) => f.includes(\"-jank-\") && f.endsWith(\".png\"))\n .sort()\n .reverse()\n\n if (files.length === 0) {\n return { detections: [], sessionId: \"\", totalFrames: 0, screenshotDir }\n }\n\n // Get the most recent session ID (timestamp prefix)\n const latestSessionId = files[0].split(\"-jank-\")[0]\n const sessionFiles = files\n .filter((f) => f.startsWith(latestSessionId))\n .sort((a, b) => {\n // Extract timestamp (e.g., \"28ms\" from \"2025-10-06T01-54-45Z-jank-28ms.png\")\n const aTime = parseInt(a.match(/-(\\d+)ms\\.png$/)?.[1] || \"0\", 10)\n const bTime = parseInt(b.match(/-(\\d+)ms\\.png$/)?.[1] || \"0\", 10)\n return aTime - bTime\n })\n\n if (sessionFiles.length < 2) {\n return { detections: [], sessionId: latestSessionId, totalFrames: sessionFiles.length, screenshotDir }\n }\n\n // Try to read real CLS data from metadata\n const metadataPath = join(screenshotDir, `${latestSessionId}-metadata.json`)\n let realCLSData:\n | {\n score: number\n grade: string\n shifts: Array<{\n score: number\n timestamp: number\n sources?: Array<{ node?: string; position?: string | null }>\n }>\n }\n | undefined\n let captureTrigger: \"navigation\" | \"load\" | undefined\n\n if (existsSync(metadataPath)) {\n try {\n const metadata = JSON.parse(readFileSync(metadataPath, \"utf-8\"))\n // Capture the trigger type for use in output messages\n captureTrigger = metadata.captureTrigger\n // Set realCLSData even if there are zero shifts - this tells us Chrome ran and found nothing\n if (metadata.layoutShifts !== undefined) {\n realCLSData = {\n score: metadata.totalCLS || 0,\n grade: metadata.clsGrade || \"unknown\",\n shifts: metadata.layoutShifts\n }\n }\n } catch {\n // Ignore metadata read errors\n }\n }\n\n const jankDetections: Array<{\n timestamp: string\n timeSinceStart: number\n visualDiff: number\n severity: \"low\" | \"medium\" | \"high\"\n element?: string\n clsScore?: number\n uxImpact?: string\n beforeFrameUrl?: string\n afterFrameUrl?: string\n }> = []\n\n // Parse log file to extract Before/After frame URLs for each CLS event\n const frameUrlMap: Map<number, { before: string; after: string }> = new Map()\n try {\n const logPath = getLogPath(_projectName)\n if (logPath && existsSync(logPath)) {\n const logContent = readFileSync(logPath, \"utf-8\")\n const lines = logContent.split(\"\\n\")\n\n // Look for CLS entries with Before/After URLs\n // Format: [BROWSER] [CDP] CLS #N (score: X, time: Yms):\n // [BROWSER] [CDP] - <ELEMENT> shifted... (variable number of these)\n // [BROWSER] [CDP] Before: http://...\n // [BROWSER] [CDP] After: http://...\n for (let i = 0; i < lines.length; i++) {\n const clsMatch = lines[i].match(/\\[CDP\\] CLS #\\d+ \\(score: [\\d.]+, time: (\\d+)ms\\):/)\n if (clsMatch) {\n const timestamp = parseInt(clsMatch[1], 10)\n // Look ahead for Before and After URLs (scan next 10 lines for them)\n let beforeUrl: string | null = null\n let afterUrl: string | null = null\n\n for (let j = i + 1; j < Math.min(i + 10, lines.length); j++) {\n if (!beforeUrl) {\n const beforeMatch = lines[j].match(/Before:\\s+(http:\\/\\/\\S+)/)\n if (beforeMatch) beforeUrl = beforeMatch[1]\n }\n if (!afterUrl) {\n const afterMatch = lines[j].match(/After:\\s+(http:\\/\\/\\S+)/)\n if (afterMatch) afterUrl = afterMatch[1]\n }\n // Stop if we found both\n if (beforeUrl && afterUrl) {\n frameUrlMap.set(timestamp, {\n before: beforeUrl,\n after: afterUrl\n })\n break\n }\n }\n }\n }\n }\n } catch (_error) {\n // Ignore log parsing errors\n }\n\n // If we have real CLS data from Chrome's PerformanceObserver, trust it completely\n if (realCLSData) {\n // If Chrome says there are no shifts, validate with pixel diff as backup\n // Chrome's PerformanceObserver can miss very fast hydration shifts\n if (realCLSData.shifts.length === 0) {\n // Run pixel diff validation on early frames (first 1500ms) to catch hydration issues\n const earlyFrames = sessionFiles.filter((f) => {\n const timeMatch = f.match(/-(\\d+)ms\\.png$/)\n const time = timeMatch ? parseInt(timeMatch[1], 10) : 0\n return time < 1500 // Hydration window\n })\n\n let foundHydrationShift = false\n\n // Only check consecutive early frames\n for (let i = 1; i < earlyFrames.length && i < 10; i++) {\n const prevFile = join(screenshotDir, earlyFrames[i - 1])\n const currFile = join(screenshotDir, earlyFrames[i])\n\n try {\n const prevPng = PNG.sync.read(readFileSync(prevFile))\n const currPng = PNG.sync.read(readFileSync(currFile))\n\n if (prevPng.width !== currPng.width || prevPng.height !== currPng.height) {\n continue\n }\n\n // Detect if this is a layout shift vs content change vs overlay noise\n const shiftAnalysis = detectLayoutShiftVsContentChange(prevPng, currPng)\n\n // Skip if this looks like overlay noise (fixed/absolute elements like Next.js dev indicator or Vercel toolbar)\n if (shiftAnalysis.isOverlayNoise) {\n logToDevFile(\n `Pixel Diff Hydration: Skipping frame ${i} - detected overlay noise (fixed/absolute elements), not true CLS`\n )\n continue\n }\n\n // If we detect a true layout shift (not just content loading or overlay noise), flag it\n if (shiftAnalysis.isLayoutShift) {\n foundHydrationShift = true\n const timeMatch = earlyFrames[i].match(/-(\\d+)ms\\.png$/)\n const timeSinceStart = timeMatch ? parseInt(timeMatch[1], 10) : 0\n\n logToDevFile(\n `Pixel Diff Hydration: Detected true layout shift at ${timeSinceStart}ms (score: ${shiftAnalysis.shiftScore.toFixed(4)})`\n )\n\n const mcpPort = process.env.MCP_PORT || \"3684\"\n jankDetections.push({\n timestamp: `${timeSinceStart}ms`,\n timeSinceStart,\n visualDiff: shiftAnalysis.shiftScore * 100,\n severity: \"high\", // Hydration shifts are always high severity\n element: \"Hydration-related element\",\n clsScore: shiftAnalysis.shiftScore,\n uxImpact: \"🚨 CRITICAL: Fast hydration shift detected - Chrome's observer missed this early shift\",\n beforeFrameUrl: `http://localhost:${mcpPort}/api/screenshots/${earlyFrames[i - 1]}`,\n afterFrameUrl: `http://localhost:${mcpPort}/api/screenshots/${earlyFrames[i]}`\n })\n }\n } catch {\n // Skip frames that can't be compared\n }\n }\n\n // If we found hydration shifts, return them with a note\n if (foundHydrationShift) {\n return {\n detections: jankDetections,\n sessionId: latestSessionId,\n totalFrames: sessionFiles.length,\n screenshotDir,\n realCLS: { score: 0.05, grade: \"good\" } // Estimate CLS for hydration shifts\n }\n }\n\n // Chrome is correct - no shifts detected\n return {\n detections: [],\n sessionId: latestSessionId,\n totalFrames: sessionFiles.length,\n screenshotDir,\n realCLS: { score: 0, grade: realCLSData.grade }\n }\n }\n\n // Process actual layout shifts detected by Chrome\n // Trust Chrome's Layout Instability API - BUT ONLY if we can identify the culprit element\n // and verify it's not a fixed/absolute positioned overlay\n realCLSData.shifts.forEach((shift) => {\n const element = shift.sources?.[0]?.node || \"unknown\"\n const position = shift.sources?.[0]?.position\n\n // FILTER: Skip shifts where we couldn't identify the element\n // Chrome sometimes reports CLS for fixed overlays but fails to identify the element\n if (!shift.sources?.[0] || element === \"unknown\" || position === null || position === undefined) {\n logToDevFile(\n `Chrome CLS: Skipping unidentified shift (score: ${shift.score.toFixed(4)}) - cannot verify if it's a true CLS or fixed overlay noise`\n )\n return // Skip this shift - can't verify it's real\n }\n\n // FILTER: Skip fixed/absolute positioned elements - these are overlays, not true CLS\n if (position === \"fixed\" || position === \"absolute\") {\n logToDevFile(\n `Chrome CLS: Filtering out ${element} shift (position: ${position}) - fixed/absolute elements don't cause true layout shifts`\n )\n return // Skip this shift\n }\n\n const isCriticalElement = [\"NAV\", \"HEADER\", \"BUTTON\", \"A\"].includes(element.toUpperCase())\n const isDuringLoad = shift.timestamp < 1000 // First second\n\n // Make element names more descriptive\n const elementDescriptions: Record<string, string> = {\n NAV: \"Navigation header (<nav>)\",\n HEADER: \"Page header (<header>)\",\n BUTTON: \"Button (<button>)\",\n A: \"Link (<a>)\"\n }\n const elementDisplay = elementDescriptions[element.toUpperCase()] || element\n\n // UX impact assessment (not just CLS score!)\n let severity: \"low\" | \"medium\" | \"high\" = \"low\"\n let uxImpact = \"Minor visual adjustment\"\n\n if (isCriticalElement && isDuringLoad) {\n severity = \"high\"\n uxImpact = `🚨 CRITICAL: ${elementDisplay} shifted during initial load - highly visible and disruptive to user interaction`\n } else if (isCriticalElement) {\n severity = \"medium\"\n uxImpact = `⚠️ ${elementDisplay} shifted - affects navigation/interaction`\n } else if (isDuringLoad) {\n severity = \"medium\"\n uxImpact = \"Shift during page load - may cause mis-clicks\"\n }\n\n // Look up Before/After URLs for this shift timestamp\n const roundedTimestamp = Math.round(shift.timestamp)\n const frameUrls = frameUrlMap.get(roundedTimestamp)\n\n jankDetections.push({\n timestamp: `${shift.timestamp.toFixed(0)}ms`,\n timeSinceStart: roundedTimestamp,\n visualDiff: shift.score * 100, // Convert to percentage-like scale\n severity,\n element: elementDisplay,\n clsScore: shift.score,\n uxImpact,\n beforeFrameUrl: frameUrls?.before,\n afterFrameUrl: frameUrls?.after\n })\n })\n\n return {\n detections: jankDetections,\n sessionId: latestSessionId,\n totalFrames: sessionFiles.length,\n screenshotDir,\n realCLS: { score: realCLSData.score, grade: realCLSData.grade }\n }\n }\n\n // Fallback to pixel-diff if no real CLS data (old behavior)\n\n // Compare each frame with the previous frame\n for (let i = 1; i < sessionFiles.length; i++) {\n const prevFile = join(screenshotDir, sessionFiles[i - 1])\n const currFile = join(screenshotDir, sessionFiles[i])\n\n try {\n const prevPng = PNG.sync.read(readFileSync(prevFile))\n const currPng = PNG.sync.read(readFileSync(currFile))\n\n // Ensure same dimensions\n if (prevPng.width !== currPng.width || prevPng.height !== currPng.height) {\n continue\n }\n\n const diff = new PNG({ width: prevPng.width, height: prevPng.height })\n const numDiffPixels = pixelmatch(prevPng.data, currPng.data, diff.data, prevPng.width, prevPng.height, {\n threshold: 0.1\n })\n\n const totalPixels = prevPng.width * prevPng.height\n const diffPercentage = (numDiffPixels / totalPixels) * 100\n\n // Consider it jank if more than 1% of pixels changed (layout shift threshold)\n if (diffPercentage > 1) {\n const timeMatch = sessionFiles[i].match(/-(\\d+)ms\\.png$/)\n const timeSinceStart = timeMatch ? parseInt(timeMatch[1], 10) : 0\n\n jankDetections.push({\n timestamp: latestSessionId,\n timeSinceStart,\n visualDiff: diffPercentage,\n severity: diffPercentage > 10 ? \"high\" : diffPercentage > 5 ? \"medium\" : \"low\"\n })\n }\n } catch {\n // Skip frames that can't be compared\n }\n }\n\n return {\n detections: jankDetections,\n sessionId: latestSessionId,\n totalFrames: sessionFiles.length,\n screenshotDir,\n captureTrigger\n }\n}\n\n/**\n * Log MCP-related events to the project-specific D3K log file (NOT main project log)\n * This prevents Claude from seeing dev3000's orchestration logs as application errors\n */\nfunction logToDevFile(message: string, projectName?: string) {\n try {\n // Write to project-specific D3K log instead of main project log\n const homeDir = process.env.HOME || process.env.USERPROFILE\n if (!homeDir) return\n\n const debugLogDir = join(homeDir, \".d3k\", \"logs\")\n if (!existsSync(debugLogDir)) {\n mkdirSync(debugLogDir, { recursive: true })\n }\n\n // Use project name from parameter or try to detect from current session\n const actualProjectName = projectName || getCurrentProjectName()\n if (!actualProjectName) return\n\n const d3kLogFile = join(debugLogDir, `dev3000-${actualProjectName}-d3k.log`)\n const timestamp = new Date().toISOString()\n const logEntry = `[${timestamp}] [D3K] ${message}\\n`\n appendFileSync(d3kLogFile, logEntry)\n } catch (_error) {\n // Silently fail to avoid breaking MCP functionality\n }\n}\n\n/**\n * Get current project name from active sessions\n */\nfunction getCurrentProjectName(): string | null {\n try {\n const homeDir = process.env.HOME || process.env.USERPROFILE\n if (!homeDir) return null\n\n const sessionDir = join(homeDir, \".d3k\")\n if (!existsSync(sessionDir)) return null\n\n // Find the most recent session file\n const sessionFiles = readdirSync(sessionDir).filter((file) => file.endsWith(\".json\"))\n if (sessionFiles.length === 0) return null\n\n // Use the first session file's project name (could be improved to find the \"current\" one)\n const sessionFile = join(sessionDir, sessionFiles[0])\n const sessionData = JSON.parse(readFileSync(sessionFile, \"utf8\"))\n return sessionData.projectName || null\n } catch {\n return null\n }\n}\n\n/**\n * Detect available MCPs and set integration flags\n */\nexport function detectMcpIntegrations(\n availableMcps: string[],\n projectName?: string\n): {\n integrateNextjs: boolean\n integrateChromeDevtools: boolean\n} {\n const integrateNextjs = availableMcps.includes(\"nextjs-dev\")\n const integrateChromeDevtools = availableMcps.includes(\"chrome-devtools\")\n\n // Log MCP detection results\n if (availableMcps.length > 0) {\n logToDevFile(`MCP Detection: Available MCPs [${availableMcps.join(\", \")}]`, projectName)\n\n const integrations: string[] = []\n if (integrateNextjs) integrations.push(\"Next.js\")\n if (integrateChromeDevtools) integrations.push(\"Chrome DevTools\")\n\n if (integrations.length > 0) {\n logToDevFile(`MCP Integration: Activated integrations [${integrations.join(\", \")}]`, projectName)\n } else {\n logToDevFile(\"MCP Integration: No compatible MCPs detected - running in standalone mode\", projectName)\n }\n } else {\n logToDevFile(\"MCP Detection: No MCPs provided - running in standalone mode\", projectName)\n }\n\n return {\n integrateNextjs,\n integrateChromeDevtools\n }\n}\n\n/**\n * Calculate estimated time based on available tools and error complexity\n */\nexport function calculateEstimatedTime(errorCount: number, hasIntegrations: boolean): string {\n const baseTime = Math.min(errorCount * 2, 20) // 2 minutes per error, max 20 minutes\n const integrationBonus = hasIntegrations ? 0.5 : 1 // 50% faster with integrations\n const totalMinutes = Math.ceil(baseTime * integrationBonus)\n\n if (totalMinutes <= 5) return `${totalMinutes} minutes`\n if (totalMinutes <= 60) return `${totalMinutes} minutes`\n return `${Math.ceil(totalMinutes / 60)} hours`\n}\n\n/**\n * Generate dynamic Next.js specific MCP function suggestions based on discovered capabilities\n */\nexport async function generateNextjsSuggestions(errorContext?: string): Promise<McpFunctionSuggestion[]> {\n try {\n // Get dynamic capabilities from the MCP\n const capabilities = await discoverMcpCapabilities(\"dev3000-nextjs-dev\")\n\n // Filter for advanced capabilities and create suggestions\n const suggestions: McpFunctionSuggestion[] = capabilities\n .filter((cap) => cap.category === \"advanced\")\n .slice(0, 8) // Limit to most relevant suggestions\n .map((cap) => ({\n function: cap.function,\n reason: cap.reason,\n priority: determinePriority(cap.function, errorContext) as \"high\" | \"medium\" | \"low\"\n }))\n\n logToDevFile(\n `Dynamic Suggestions: Generated ${suggestions.length} Next.js suggestions from ${capabilities.length} discovered capabilities`\n )\n\n return suggestions\n } catch (error) {\n logToDevFile(`Dynamic Suggestions: Failed to generate Next.js suggestions - ${error}`)\n\n // Fallback to basic suggestions if discovery fails\n return [\n {\n function: \"analyze_build_process\",\n reason: \"Advanced Next.js build system analysis\",\n priority: \"high\"\n },\n {\n function: \"debug_server_rendering\",\n reason: \"Server-side rendering debugging\",\n priority: \"high\"\n }\n ]\n }\n}\n\n/**\n * Generate dynamic Chrome DevTools specific MCP function suggestions based on discovered capabilities\n */\nexport async function generateChromeDevtoolsSuggestions(errorContext?: string): Promise<McpFunctionSuggestion[]> {\n try {\n // Get dynamic capabilities from the MCP\n const capabilities = await discoverMcpCapabilities(\"dev3000-chrome-devtools\")\n\n // Filter for advanced capabilities and create suggestions\n const suggestions: McpFunctionSuggestion[] = capabilities\n .filter((cap) => cap.category === \"advanced\")\n .slice(0, 8) // Limit to most relevant suggestions\n .map((cap) => ({\n function: cap.function,\n reason: cap.reason,\n priority: determinePriority(cap.function, errorContext) as \"high\" | \"medium\" | \"low\"\n }))\n\n logToDevFile(\n `Dynamic Suggestions: Generated ${suggestions.length} Chrome DevTools suggestions from ${capabilities.length} discovered capabilities`\n )\n\n return suggestions\n } catch (error) {\n logToDevFile(`Dynamic Suggestions: Failed to generate Chrome DevTools suggestions - ${error}`)\n\n // Fallback to basic suggestions if discovery fails\n return [\n {\n function: \"inspect_element\",\n reason: \"Deep DOM inspection with DevTools-level detail\",\n priority: \"high\"\n },\n {\n function: \"access_console\",\n reason: \"Direct browser console access and manipulation\",\n priority: \"high\"\n }\n ]\n }\n}\n\n/**\n * Determine priority of a capability based on error context and function relevance\n */\nfunction determinePriority(functionName: string, errorContext?: string): \"high\" | \"medium\" | \"low\" {\n const name = functionName.toLowerCase()\n const context = errorContext?.toLowerCase() || \"\"\n\n // High priority matches - function directly relates to error context\n const highPriorityPatterns = [\n { pattern: /hydration/, keywords: [\"hydration\", \"ssr\", \"render\"] },\n { pattern: /build|compile/, keywords: [\"build\", \"compile\", \"analyze\"] },\n { pattern: /network|fetch|api/, keywords: [\"network\", \"request\", \"intercept\", \"performance\"] },\n { pattern: /console|error/, keywords: [\"console\", \"error\", \"debug\"] },\n { pattern: /click|interaction/, keywords: [\"dom\", \"element\", \"inspect\"] }\n ]\n\n for (const { pattern, keywords } of highPriorityPatterns) {\n if (pattern.test(context) && keywords.some((keyword) => name.includes(keyword))) {\n return \"high\"\n }\n }\n\n // Medium priority - advanced debugging capabilities\n const mediumPriorityKeywords = [\"debug\", \"profile\", \"analyze\", \"trace\", \"inspect\"]\n if (mediumPriorityKeywords.some((keyword) => name.includes(keyword))) {\n return \"medium\"\n }\n\n // Low priority - basic or less critical functions\n return \"low\"\n}\n\n/**\n * Create integrated workflow with 3-phase debugging plan\n */\nexport async function createIntegratedWorkflow({\n availableMcps,\n focusArea = \"all\",\n errorContext\n}: CreateIntegratedWorkflowParams): Promise<{ content: Array<{ type: \"text\"; text: string }> }> {\n const results: string[] = []\n\n // Log workflow creation\n logToDevFile(\n `Workflow Creation: Creating integrated workflow with focus area [${focusArea}]${errorContext ? `, error context [${errorContext}]` : \"\"}`\n )\n\n // Use provided MCPs or discover them proactively\n let finalMcps: string[] = availableMcps || []\n if (!availableMcps || availableMcps.length === 0) {\n logToDevFile(\"Workflow Creation: No MCPs provided, starting proactive discovery\")\n finalMcps = await discoverAvailableMcps()\n }\n\n // Detect available integrations\n const { integrateNextjs, integrateChromeDevtools } = detectMcpIntegrations(finalMcps)\n\n results.push(\"🎼 **INTELLIGENT DEBUGGING ORCHESTRATOR**\")\n results.push(`🔍 Available MCPs: ${finalMcps.length > 0 ? finalMcps.join(\", \") : \"none (will attempt discovery)\"}`)\n results.push(\n `⚡ Integrations: ${integrateNextjs ? \"✅ Next.js\" : \"❌ Next.js\"} | ${integrateChromeDevtools ? \"✅ Chrome DevTools\" : \"❌ Chrome DevTools\"}`\n )\n\n if (errorContext) {\n results.push(`🎯 Error Context: ${errorContext}`)\n }\n results.push(\"\")\n\n // Generate MCP-specific suggestions\n const nextjsSuggestions = integrateNextjs ? await generateNextjsSuggestions(errorContext) : []\n const chromeSuggestions = integrateChromeDevtools ? await generateChromeDevtoolsSuggestions(errorContext) : []\n\n if (!integrateNextjs && !integrateChromeDevtools) {\n results.push(\"⚠️ **NO INTEGRATIONS DETECTED**\")\n results.push(\"Running in standalone mode. For enhanced debugging:\")\n results.push(\"• Add 'nextjs-dev' MCP for Next.js-specific analysis\")\n results.push(\"• Add 'chrome-devtools' MCP for browser inspection\")\n results.push(\"\")\n results.push(\"💡 **STANDALONE WORKFLOW:**\")\n results.push(\"1. Use fix_my_app(mode='snapshot') to analyze current issues\")\n results.push(\"2. Use execute_browser_action to reproduce and verify fixes\")\n results.push(\"3. Implement suggested code fixes\")\n\n return {\n content: [{ type: \"text\", text: results.join(\"\\n\") }]\n }\n }\n\n // Create 3-phase integrated workflow\n results.push(\"🎪 **3-PHASE INTEGRATED WORKFLOW**\")\n results.push(\"\")\n\n // Phase 1: Parallel Data Collection\n results.push(\"🕐 **PHASE 1: PARALLEL DATA COLLECTION** (2-3 minutes)\")\n results.push(\"Execute these functions in parallel across all available MCPs:\")\n results.push(\"\")\n\n results.push(\"📊 **dev3000 (this MCP):**\")\n results.push(\n `• fix_my_app(focusArea='${focusArea}', integrateNextjs=${integrateNextjs}, integrateChromeDevtools=${integrateChromeDevtools}, returnRawData=true)`\n )\n results.push(\" → Get comprehensive error analysis with interaction data\")\n results.push(\"\")\n\n if (integrateNextjs) {\n results.push(\"⚛️ **nextjs-dev MCP:**\")\n nextjsSuggestions\n .filter((s) => s.priority === \"high\")\n .forEach((suggestion) => {\n const params = suggestion.params\n ? `(${Object.entries(suggestion.params)\n .map(([k, v]) => `${k}=${JSON.stringify(v)}`)\n .join(\", \")})`\n : \"()\"\n results.push(`• ${suggestion.function}${params}`)\n results.push(` → ${suggestion.reason}`)\n })\n results.push(\"\")\n }\n\n if (integrateChromeDevtools) {\n results.push(\"🌐 **chrome-devtools MCP:**\")\n chromeSuggestions\n .filter((s) => s.priority === \"high\")\n .forEach((suggestion) => {\n const params = suggestion.params\n ? `(${Object.entries(suggestion.params)\n .map(([k, v]) => `${k}=${JSON.stringify(v)}`)\n .join(\", \")})`\n : \"()\"\n results.push(`• ${suggestion.function}${params}`)\n results.push(` → ${suggestion.reason}`)\n })\n results.push(\"\")\n }\n\n // Phase 2: Deep Analysis\n results.push(\"🕑 **PHASE 2: DEEP TARGETED ANALYSIS** (3-5 minutes)\")\n results.push(\"Based on Phase 1 findings, execute these functions sequentially:\")\n results.push(\"\")\n\n results.push(\"🔗 **Cross-MCP Correlation:**\")\n results.push(\"• Compare dev3000 interaction data with browser console errors\")\n if (integrateNextjs) {\n results.push(\"• Correlate dev3000 server errors with Next.js build/runtime logs\")\n results.push(\"• Match interaction timestamps with Next.js request handling\")\n }\n results.push(\"• Identify root cause by combining all data sources\")\n results.push(\"\")\n\n results.push(\"🎯 **Targeted Deep Dive:**\")\n results.push(\"• Use fix_my_app(mode='bisect') for regression analysis if needed\")\n if (integrateChromeDevtools) {\n chromeSuggestions\n .filter((s) => s.priority === \"medium\")\n .forEach((suggestion) => {\n const params = suggestion.params\n ? `(${Object.entries(suggestion.params)\n .map(([k, v]) => `${k}=${JSON.stringify(v)}`)\n .join(\", \")})`\n : \"()\"\n results.push(`• ${suggestion.function}${params} - ${suggestion.reason}`)\n })\n }\n results.push(\"\")\n\n // Phase 3: Fix Implementation & Verification\n results.push(\"🕒 **PHASE 3: FIX IMPLEMENTATION & VERIFICATION** (5-10 minutes)\")\n results.push(\"Orchestrated fix implementation with cross-MCP verification:\")\n results.push(\"\")\n\n results.push(\"🔧 **Implementation:**\")\n results.push(\"• Apply code fixes identified by dev3000 error analysis\")\n if (integrateNextjs) {\n results.push(\"• Address Next.js-specific issues (hydration, build, etc.)\")\n }\n results.push(\"• Use dev3000's interaction data to create comprehensive test scenarios\")\n results.push(\"\")\n\n results.push(\"✅ **Verification Workflow:**\")\n results.push(\"• Use execute_browser_action to replay exact user interactions that caused errors\")\n if (integrateChromeDevtools) {\n results.push(\"• Use chrome-devtools to monitor console for error resolution\")\n results.push(\"• Take before/after screenshots to verify UI fixes\")\n }\n if (integrateNextjs) {\n results.push(\"• Use nextjs-dev to verify build success and runtime stability\")\n }\n results.push(\"• Re-run fix_my_app to confirm error resolution\")\n results.push(\"\")\n\n // Integration Benefits\n results.push(\"🚀 **INTEGRATION BENEFITS:**\")\n\n if (integrateNextjs && integrateChromeDevtools) {\n results.push(\"🎯 **Triple-Stack Coverage:**\")\n results.push(\"• dev3000: AI-powered error correlation + interaction replay\")\n results.push(\"• nextjs-dev: Framework-specific server-side analysis\")\n results.push(\"• chrome-devtools: Precise browser state inspection\")\n results.push(\"• Combined: Complete full-stack debugging with 90%+ issue resolution\")\n results.push(\"\")\n results.push(\"⚡ **Expected Results:**\")\n results.push(\"• 3x faster debugging vs using tools individually\")\n results.push(\"• AI-powered error correlation across all layers\")\n results.push(\"• Systematic fix verification workflow\")\n results.push(\"• Comprehensive interaction-based testing\")\n } else if (integrateNextjs) {\n results.push(\"🎯 **Server-Side Enhanced Coverage:**\")\n results.push(\"• dev3000: Client error analysis + interaction data\")\n results.push(\"• nextjs-dev: Server-side logs and build analysis\")\n results.push(\"• Combined: Full-stack Next.js debugging coverage\")\n } else if (integrateChromeDevtools) {\n results.push(\"🎯 **Browser-Enhanced Coverage:**\")\n results.push(\"• dev3000: Error detection + interaction replay\")\n results.push(\"• chrome-devtools: Detailed browser state inspection\")\n results.push(\"• Combined: Complete client-side debugging workflow\")\n }\n\n const estimatedTime = calculateEstimatedTime(5, integrateNextjs || integrateChromeDevtools) // Assume 5 errors for estimation\n results.push(\"\")\n results.push(`⏱️ **ESTIMATED TOTAL TIME:** ${estimatedTime}`)\n results.push(`🎼 **dev3000 orchestrates ${finalMcps.length} MCPs for maximum debugging power!**`)\n\n return {\n content: [{ type: \"text\", text: results.join(\"\\n\") }]\n }\n}\n\n/**\n * Visual diff analyzer - provides instructions for Claude to load and compare two images\n */\nexport async function analyzeVisualDiff(params: {\n beforeImageUrl: string\n afterImageUrl: string\n context?: string\n}): Promise<{ content: Array<{ type: \"text\"; text: string }> }> {\n const { beforeImageUrl, afterImageUrl, context } = params\n\n const results: string[] = []\n\n results.push(\"🔍 **VISUAL DIFF ANALYSIS**\")\n results.push(\"\")\n results.push(\"To analyze the visual differences between these two screenshots:\")\n results.push(\"\")\n results.push(\"**Step 1: Fetch and analyze the BEFORE image**\")\n results.push(`Use WebFetch with URL: \\`${beforeImageUrl}\\``)\n results.push(`Prompt: \"Describe this screenshot in detail, focusing on layout and visible elements\"`)\n results.push(\"\")\n results.push(\"**Step 2: Fetch and analyze the AFTER image**\")\n results.push(`Use WebFetch with URL: \\`${afterImageUrl}\\``)\n results.push(`Prompt: \"Describe this screenshot in detail, focusing on layout and visible elements\"`)\n results.push(\"\")\n results.push(\"**Step 3: Compare and describe the differences**\")\n\n if (context) {\n results.push(`Focus on: ${context}`)\n } else {\n results.push(\"Look for:\")\n results.push(\"• Elements that appeared or disappeared\")\n results.push(\"• Elements that moved or changed position\")\n results.push(\"• Elements that changed size or style\")\n results.push(\"• New content that pushed existing content\")\n }\n\n results.push(\"\")\n results.push(\"**Step 4: Identify the layout shift cause**\")\n results.push(\"Describe what visual change occurred that caused the layout shift.\")\n results.push(\"Be specific about:\")\n results.push(\"• Which element(s) changed\")\n results.push(\"• What appeared/moved/resized\")\n results.push(\"• Why this caused other elements to shift\")\n\n return {\n content: [{ type: \"text\", text: results.join(\"\\n\") }]\n }\n}\n\nexport async function findComponentSource(params: {\n selector: string\n projectName?: string\n}): Promise<{ content: Array<{ type: \"text\"; text: string }> }> {\n const { selector } = params\n\n try {\n const sessions = findActiveSessions()\n if (sessions.length === 0) {\n return {\n content: [\n {\n type: \"text\",\n text: \"❌ **NO ACTIVE SESSIONS**\\n\\nNo active dev3000 sessions found. Make sure your app is running with dev3000.\"\n }\n ]\n }\n }\n\n const sessionData = JSON.parse(readFileSync(sessions[0].sessionFile, \"utf-8\"))\n let cdpUrl = sessionData.cdpUrl\n\n if (!cdpUrl) {\n try {\n const response = await fetch(\"http://localhost:9222/json\")\n const pages = await response.json()\n const activePage = pages.find(\n (page: { type: string; url: string }) => page.type === \"page\" && !page.url.startsWith(\"chrome://\")\n )\n if (activePage) {\n cdpUrl = activePage.webSocketDebuggerUrl\n }\n } catch {\n return {\n content: [\n {\n type: \"text\",\n text: \"❌ **NO CDP CONNECTION**\\n\\nFailed to find Chrome DevTools Protocol URL.\"\n }\n ]\n }\n }\n }\n\n if (!cdpUrl) {\n return {\n content: [\n {\n type: \"text\",\n text: \"❌ **NO CDP CONNECTION**\\n\\nNo Chrome DevTools Protocol URL found.\"\n }\n ]\n }\n }\n\n // Execute the component extraction script\n const extractScript = `\n (function() {\n try {\n const element = document.querySelector(${JSON.stringify(selector)});\n if (!element) {\n return { error: \"Element not found with selector: ${selector}\" };\n }\n\n // Try to find React Fiber\n const fiberKey = Object.keys(element).find(k => k.startsWith(\"__reactFiber$\"));\n if (!fiberKey) {\n return { error: \"No React internals found - element may not be a React component\" };\n }\n\n const fiber = element[fiberKey];\n let componentFunction = null;\n let componentName = \"Unknown\";\n\n // Walk up the fiber tree to find a function component\n let current = fiber;\n let depth = 0;\n\n while (current && depth < 10) {\n if (typeof current.type === 'function') {\n componentFunction = current.type;\n componentName = current.type.name || current.type.displayName || \"Anonymous\";\n break;\n }\n current = current.return;\n depth++;\n }\n\n if (!componentFunction) {\n return { error: \"Could not find component function in fiber tree\" };\n }\n\n // Get the source code\n const sourceCode = componentFunction.toString();\n\n return {\n success: true,\n componentName,\n sourceCode\n };\n } catch (error) {\n return { error: error.message };\n }\n })()\n `\n\n const result = await new Promise<unknown>((resolve, reject) => {\n const ws = new WebSocket(cdpUrl)\n let evalId: number | null = null\n let resolved = false\n\n const timeout = setTimeout(() => {\n if (!resolved) {\n resolved = true\n ws.close()\n reject(new Error(\"CDP evaluation timeout after 5 seconds\"))\n }\n }, 5000)\n\n ws.on(\"open\", async () => {\n try {\n ws.send(JSON.stringify({ id: 1, method: \"Target.getTargets\", params: {} }))\n\n let messageId = 2\n\n ws.on(\"message\", async (data) => {\n const message = JSON.parse(data.toString())\n\n if (message.id === 1) {\n // Check for CDP protocol errors (e.g., \"Not allowed\" in sandboxed environments)\n if (message.error) {\n clearTimeout(timeout)\n resolved = true\n ws.close()\n reject(\n new Error(\n `Browser protocol error: ${message.error.message || JSON.stringify(message.error)}. This may occur in sandboxed browser environments where certain CDP commands are restricted.`\n )\n )\n return\n }\n\n const pageTarget = message.result?.targetInfos?.find((t: Record<string, unknown>) => t.type === \"page\")\n if (!pageTarget) {\n clearTimeout(timeout)\n resolved = true\n ws.close()\n reject(new Error(\"No page targets found\"))\n return\n }\n\n ws.send(\n JSON.stringify({\n id: messageId++,\n method: \"Target.attachToTarget\",\n params: { targetId: pageTarget.targetId, flatten: true }\n })\n )\n return\n }\n\n if (message.method === \"Target.attachedToTarget\") {\n evalId = messageId++\n ws.send(\n JSON.stringify({\n id: evalId,\n method: \"Runtime.evaluate\",\n params: { expression: extractScript, returnByValue: true }\n })\n )\n return\n }\n\n if (evalId !== null && message.id === evalId) {\n clearTimeout(timeout)\n resolved = true\n ws.close()\n if (message.error) {\n reject(new Error(message.error.message))\n } else {\n const value = message.result?.result?.value\n resolve(value)\n }\n }\n })\n\n ws.on(\"error\", (err) => {\n clearTimeout(timeout)\n if (!resolved) {\n resolved = true\n reject(err)\n }\n })\n } catch (error) {\n clearTimeout(timeout)\n resolved = true\n ws.close()\n reject(error)\n }\n })\n\n ws.on(\"error\", (err) => {\n clearTimeout(timeout)\n if (!resolved) {\n resolved = true\n reject(err)\n }\n })\n })\n\n const evalResult = result as\n | { error: string }\n | {\n success: true\n componentName: string\n sourceCode: string\n }\n\n if (\"error\" in evalResult) {\n return {\n content: [\n {\n type: \"text\",\n text: `❌ **ERROR EXTRACTING COMPONENT**\\n\\n${evalResult.error}\\n\\n💡 **TIPS:**\\n• Make sure the selector matches an element on the page\\n• Ensure the element is rendered by a React component\\n• Try a simpler selector like 'nav' or '.header'`\n }\n ]\n }\n }\n\n if (!evalResult.success) {\n return {\n content: [\n {\n type: \"text\",\n text: \"❌ **FAILED TO EXTRACT COMPONENT**\\n\\nUnexpected result format.\"\n }\n ]\n }\n }\n\n // Extract unique patterns from the source code\n const { componentName, sourceCode } = evalResult\n const patterns: string[] = []\n\n // Look for unique JSX patterns (excluding common ones like <div>, <span>)\n const jsxPattern = /<([A-Z][a-zA-Z0-9]*)/g\n const customComponents = new Set<string>()\n let jsxMatch = jsxPattern.exec(sourceCode)\n\n while (jsxMatch !== null) {\n customComponents.add(jsxMatch[1])\n jsxMatch = jsxPattern.exec(sourceCode)\n }\n\n // Look for unique className patterns\n const classNamePattern = /className=[\"']([^\"']+)[\"']/g\n const classNames = new Set<string>()\n let classNameMatch = classNamePattern.exec(sourceCode)\n\n while (classNameMatch !== null) {\n classNames.add(classNameMatch[1])\n classNameMatch = classNamePattern.exec(sourceCode)\n }\n\n // Build search patterns\n const lines: string[] = []\n lines.push(\"🔍 **COMPONENT SOURCE FINDER**\")\n lines.push(\"\")\n lines.push(`**Selector:** \\`${selector}\\``)\n lines.push(`**Component:** ${componentName}`)\n lines.push(\"\")\n\n if (componentName !== \"Anonymous\") {\n patterns.push(`function ${componentName}`)\n patterns.push(`const ${componentName} =`)\n patterns.push(`export default function ${componentName}`)\n }\n\n // Add unique component references\n if (customComponents.size > 0) {\n const uniqueComponents = Array.from(customComponents).filter(\n (name) => ![\"Fragment\", \"Suspense\", \"ErrorBoundary\"].includes(name)\n )\n if (uniqueComponents.length > 0) {\n patterns.push(`<${uniqueComponents[0]}`)\n }\n }\n\n // Add unique classNames\n if (classNames.size > 0) {\n const firstClassName = Array.from(classNames)[0]\n patterns.push(`className=\"${firstClassName}\"`)\n }\n\n if (patterns.length === 0) {\n lines.push(\"⚠️ **NO UNIQUE PATTERNS FOUND**\")\n lines.push(\"\")\n lines.push(\"The component source code doesn't contain distinctive patterns to search for.\")\n lines.push(\"You may need to manually search for the component.\")\n } else {\n lines.push(\"📍 **SEARCH PATTERNS**\")\n lines.push(\"\")\n lines.push(\"Use these grep patterns to find the source file:\")\n lines.push(\"\")\n\n for (const pattern of patterns.slice(0, 3)) {\n lines.push(`\\`\\`\\``)\n lines.push(`grep -r \"${pattern.replace(/\"/g, '\\\\\"')}\" .`)\n lines.push(`\\`\\`\\``)\n lines.push(\"\")\n }\n\n lines.push(\"💡 **TIP:** Start with the first pattern. If it returns multiple results, try combining patterns.\")\n }\n\n // Show a preview of the source code\n const preview = sourceCode.substring(0, 300)\n lines.push(\"\")\n lines.push(\"**Source Code Preview:**\")\n lines.push(\"```javascript\")\n lines.push(`${preview}...`)\n lines.push(\"```\")\n\n return {\n content: [{ type: \"text\", text: lines.join(\"\\n\") }]\n }\n } catch (error) {\n return {\n content: [\n {\n type: \"text\",\n text: `❌ **ERROR**\\n\\n${error instanceof Error ? error.message : String(error)}`\n }\n ]\n }\n }\n}\n\n/**\n * Restart the development server while preserving logs and monitoring\n */\nexport async function restartDevServer(params: {\n projectName?: string\n}): Promise<{ content: Array<{ type: \"text\"; text: string }> }> {\n const { projectName } = params\n\n try {\n // Find active session\n const sessions = findActiveSessions()\n if (sessions.length === 0) {\n return {\n content: [\n {\n type: \"text\",\n text: \"❌ **NO ACTIVE SESSIONS**\\n\\nNo active dev3000 sessions found. Make sure your app is running with dev3000.\"\n }\n ]\n }\n }\n\n // Use specified project or first available session\n let targetSession = sessions[0]\n if (projectName) {\n const found = sessions.find((s) => s.projectName === projectName)\n if (found) {\n targetSession = found\n }\n }\n\n const sessionData = JSON.parse(readFileSync(targetSession.sessionFile, \"utf-8\"))\n const appPort = sessionData.appPort\n const serverCommand = sessionData.serverCommand\n const cwd = sessionData.cwd\n\n if (!appPort) {\n return {\n content: [\n {\n type: \"text\",\n text: \"❌ **NO APP PORT FOUND**\\n\\nSession file doesn't contain app port information.\"\n }\n ]\n }\n }\n\n if (!serverCommand) {\n return {\n content: [\n {\n type: \"text\",\n 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.\"\n }\n ]\n }\n }\n\n logToDevFile(\n `Restart Dev Server: Starting restart for project [${targetSession.projectName}] on port ${appPort} with command [${serverCommand}]`\n )\n\n // Check if nextjs-dev MCP is available\n const availableMcps = await discoverAvailableMcps(targetSession.projectName)\n const hasNextjsDev = availableMcps.includes(\"nextjs-dev\")\n\n logToDevFile(`Restart Dev Server: Has nextjs-dev MCP: ${hasNextjsDev}`)\n\n // Try nextjs-dev MCP first if available\n if (hasNextjsDev) {\n try {\n logToDevFile(\"Restart Dev Server: Attempting to use nextjs-dev MCP restart\")\n\n // Check if nextjs-dev has restart capability\n const capabilities = await getMcpCapabilities({ mcpName: \"nextjs-dev\" })\n const capabilitiesText =\n capabilities.content[0] && \"text\" in capabilities.content[0] ? capabilities.content[0].text : \"\"\n\n if (capabilitiesText.includes(\"restart\") || capabilitiesText.includes(\"reload\")) {\n logToDevFile(\"Restart Dev Server: nextjs-dev MCP has restart capability, delegating\")\n\n return {\n content: [\n {\n type: \"text\",\n 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.\"\n }\n ]\n }\n }\n\n logToDevFile(\"Restart Dev Server: nextjs-dev MCP doesn't have restart capability, falling back\")\n } catch (error) {\n logToDevFile(`Restart Dev Server: Failed to check nextjs-dev capabilities - ${error}`)\n }\n }\n\n // Fallback: Use dev3000's own restart mechanism\n logToDevFile(\"Restart Dev Server: Using dev3000 restart mechanism\")\n\n // In sandbox environments, lsof doesn't exist - skip process killing\n if (isInSandbox()) {\n logToDevFile(\"Restart Dev Server: Skipping lsof-based kill in sandbox environment\")\n return {\n content: [\n {\n type: \"text\",\n text: `⚠️ **RESTART NOT SUPPORTED IN SANDBOX**\\n\\nDev server restart is not supported in sandbox environments (Vercel Sandbox, Docker containers).\\n\\nThe \\`lsof\\` utility needed for process management is not available.\\n\\n💡 If running in Vercel Sandbox, the dev server is managed by the sandbox infrastructure.`\n }\n ]\n }\n }\n\n // Kill processes on the app port\n const killCommand = `lsof -ti :${appPort} | xargs kill 2>/dev/null || true`\n logToDevFile(`Restart Dev Server: Executing kill command: ${killCommand}`)\n\n try {\n await execAsync(killCommand)\n logToDevFile(\"Restart Dev Server: Kill command executed successfully\")\n } catch (error) {\n logToDevFile(`Restart Dev Server: Kill command failed (may be ok) - ${error}`)\n }\n\n // Wait for clean shutdown\n await new Promise((resolve) => setTimeout(resolve, 2000))\n\n // Check if port is now free\n const checkCommand = `lsof -ti :${appPort}`\n let portFree = false\n try {\n const { stdout } = await execAsync(checkCommand)\n portFree = stdout.trim() === \"\"\n logToDevFile(`Restart Dev Server: Port check result - free: ${portFree}`)\n } catch {\n // Command failed means no process on port (port is free)\n portFree = true\n logToDevFile(\"Restart Dev Server: Port is free (lsof returned no results)\")\n }\n\n if (!portFree) {\n return {\n content: [\n {\n type: \"text\",\n text: `⚠️ **PORT STILL IN USE**\\n\\nFailed to free port ${appPort}. There may be a process that couldn't be killed.\\n\\nTry manually killing the process:\\n\\`\\`\\`bash\\nlsof -ti :${appPort} | xargs kill -9\\n\\`\\`\\``\n }\n ]\n }\n }\n\n logToDevFile(\"Restart Dev Server: Port is now free, spawning new server process\")\n\n // Spawn new server process\n try {\n const serverProcess = spawn(serverCommand, {\n stdio: \"inherit\", // Inherit stdio so output goes to dev3000's logs\n shell: true,\n detached: true, // Run independently\n cwd: cwd || process.cwd() // Use original working directory\n })\n\n // Unref so this process doesn't keep MCP server alive\n serverProcess.unref()\n\n logToDevFile(`Restart Dev Server: Spawned new server process with PID ${serverProcess.pid}`)\n\n // Wait a moment for server to start\n await new Promise((resolve) => setTimeout(resolve, 1000))\n\n // Check if server is actually running on the port\n try {\n const { stdout: checkResult } = await execAsync(`lsof -ti :${appPort}`)\n const isRunning = checkResult.trim() !== \"\"\n\n if (isRunning) {\n logToDevFile(\"Restart Dev Server: Server successfully restarted and running on port\")\n return {\n content: [\n {\n type: \"text\",\n text: `✅ **DEV SERVER RESTARTED**\\n\\nSuccessfully restarted the development server on port ${appPort}.\\n\\n🎯 **STATUS:**\\n• Old server process: Killed\\n• New server process: Running (PID ${serverProcess.pid})\\n• Port ${appPort}: Active\\n• Browser monitoring: Unchanged\\n• Logs: Still being captured\\n\\n💡 The server has been restarted while keeping dev3000's monitoring, screenshots, and logging intact.`\n }\n ]\n }\n }\n logToDevFile(\"Restart Dev Server: Server process spawned but not yet listening on port (may still be starting)\")\n } catch {\n logToDevFile(\"Restart Dev Server: Server process spawned but not yet listening on port (may still be starting)\")\n }\n\n return {\n content: [\n {\n type: \"text\",\n text: `🔄 **DEV SERVER RESTARTING**\\n\\nStarted a new server process (PID ${serverProcess.pid}).\\n\\n⏳ **STATUS:**\\n• Old server: Killed\\n• New server: Starting (may take a few moments)\\n• Command: \\`${serverCommand}\\`\\n• Port: ${appPort}\\n\\nThe server is restarting. Check the dev3000 logs to see when it's ready.`\n }\n ]\n }\n } catch (spawnError) {\n logToDevFile(`Restart Dev Server: Failed to spawn new server process - ${spawnError}`)\n return {\n content: [\n {\n type: \"text\",\n text: `❌ **RESTART FAILED**\\n\\nFailed to start new server process.\\n\\n**Error:** ${spawnError instanceof Error ? spawnError.message : String(spawnError)}\\n\\n**Command:** \\`${serverCommand}\\`\\n\\nThe old server was killed but the new one failed to start. You may need to manually restart dev3000.`\n }\n ]\n }\n }\n } catch (error) {\n logToDevFile(`Restart Dev Server: Error - ${error}`)\n return {\n content: [\n {\n type: \"text\",\n text: `❌ **ERROR**\\n\\n${error instanceof Error ? error.message : String(error)}`\n }\n ]\n }\n }\n}\n\n// Crawl app - discover all URLs\nexport interface CrawlAppParams {\n depth?: number | \"all\"\n limit?: number\n projectName?: string\n}\n\nexport async function crawlApp(params: CrawlAppParams) {\n const { depth = 1, limit = 3, projectName } = params\n\n try {\n // Find active session\n const sessions = findActiveSessions()\n const session = projectName ? sessions.find((s) => s.projectName === projectName) : sessions[0]\n\n if (!session) {\n return {\n content: [\n {\n type: \"text\" as const,\n text: projectName\n ? `❌ No active session found for project \"${projectName}\". Available projects: ${sessions.map((s) => s.projectName).join(\", \") || \"none\"}`\n : \"❌ No active dev3000 sessions found. Start dev3000 first with `d3k` in your project directory.\"\n }\n ]\n }\n }\n\n // Get CDP URL and app port from session\n const sessionData = JSON.parse(readFileSync(session.sessionFile, \"utf-8\"))\n const cdpUrl = sessionData.cdpUrl?.replace(\"http://\", \"ws://\")\n const appPort = sessionData.appPort || \"3000\"\n const baseUrl = `http://localhost:${appPort}`\n\n if (!cdpUrl) {\n return {\n content: [\n {\n type: \"text\" as const,\n text: \"❌ No Chrome DevTools connection found. Browser monitoring must be active to crawl.\"\n }\n ]\n }\n }\n\n logToDevFile(`Crawl App: Starting crawl at depth ${depth} with limit ${limit} for ${baseUrl}`)\n\n // Connect to CDP\n const ws = new WebSocket(cdpUrl)\n await new Promise((resolve, reject) => {\n ws.on(\"open\", resolve)\n ws.on(\"error\", reject)\n setTimeout(() => reject(new Error(\"CDP connection timeout\")), 5000)\n })\n\n let messageId = 2000\n // biome-ignore lint/suspicious/noExplicitAny: CDP protocol responses are dynamic\n const sendCommand = (method: string, params: Record<string, unknown> = {}): Promise<any> => {\n return new Promise((resolve, reject) => {\n const id = messageId++\n const message = JSON.stringify({ id, method, params })\n\n const handler = (data: Buffer) => {\n const response = JSON.parse(data.toString())\n if (response.id === id) {\n ws.off(\"message\", handler)\n if (response.error) {\n reject(new Error(response.error.message))\n } else {\n resolve(response.result)\n }\n }\n }\n\n ws.on(\"message\", handler)\n ws.send(message)\n\n setTimeout(() => {\n ws.off(\"message\", handler)\n reject(new Error(\"Command timeout\"))\n }, 10000)\n })\n }\n\n // Enable necessary domains\n await sendCommand(\"Runtime.enable\")\n await sendCommand(\"Page.enable\")\n\n // Discovered URLs\n const discovered = new Set<string>([baseUrl])\n const visited = new Set<string>()\n const toVisit: string[] = [baseUrl]\n\n let currentDepth = 0\n const maxDepth = depth === \"all\" ? Number.POSITIVE_INFINITY : depth\n\n while (toVisit.length > 0 && currentDepth <= maxDepth) {\n const currentLevelUrls = [...toVisit]\n toVisit.length = 0\n\n logToDevFile(`Crawl App: Processing depth ${currentDepth} with ${currentLevelUrls.length} URLs`)\n\n for (const url of currentLevelUrls) {\n if (visited.has(url)) continue\n visited.add(url)\n\n try {\n // Navigate to URL\n logToDevFile(`Crawl App: Visiting ${url}`)\n await sendCommand(\"Page.navigate\", { url })\n\n // Wait for page load\n await new Promise((resolve) => setTimeout(resolve, 2000))\n\n // Extract all links\n const result = await sendCommand(\"Runtime.evaluate\", {\n expression: `\n Array.from(document.querySelectorAll('a[href]')).map(a => {\n try {\n const url = new URL(a.href, window.location.href);\n // Only return same-origin links\n if (url.origin === window.location.origin) {\n // Remove hash and query params for deduplication\n return url.origin + url.pathname;\n }\n } catch {}\n return null;\n }).filter(Boolean)\n `,\n returnByValue: true\n })\n\n const links = result.result?.value || []\n\n // Apply limit to prevent following too many links per page\n let linksAdded = 0\n for (const link of links) {\n if (!discovered.has(link)) {\n discovered.add(link)\n if (currentDepth < maxDepth && linksAdded < limit) {\n toVisit.push(link)\n linksAdded++\n }\n }\n }\n\n logToDevFile(\n `Crawl App: Found ${links.length} links on ${url}, added ${linksAdded} to queue (limit: ${limit})`\n )\n } catch (error) {\n logToDevFile(`Crawl App: Error visiting ${url} - ${error}`)\n }\n }\n\n currentDepth++\n\n // For \"all\" mode, stop when no new URLs are found\n if (depth === \"all\" && toVisit.length === 0) {\n break\n }\n }\n\n ws.close()\n\n const urls = Array.from(discovered).sort()\n const depthReached = depth === \"all\" ? currentDepth - 1 : Math.min(currentDepth - 1, maxDepth)\n\n logToDevFile(`Crawl App: Complete - discovered ${urls.length} URLs at depth ${depthReached}`)\n\n return {\n content: [\n {\n type: \"text\" as const,\n text: `🕷️ **APP CRAWL COMPLETE**\\n\\n📊 **SUMMARY:**\\n• Base URL: ${baseUrl}\\n• Depth: ${depthReached}${depth === \"all\" ? \" (exhaustive)\" : \"\"}\\n• Total URLs: ${urls.length}\\n\\n📍 **DISCOVERED URLs:**\\n${urls.map((url) => `• ${url}`).join(\"\\n\")}\\n\\n💡 **NEXT STEPS:**\\n• Use fix_my_app to check for errors across all pages\\n• Use execute_browser_action to test specific pages\\n• Verify all routes are working correctly`\n }\n ]\n }\n } catch (error) {\n logToDevFile(`Crawl App: Error - ${error}`)\n return {\n content: [\n {\n type: \"text\" as const,\n text: `❌ **CRAWL FAILED**\\n\\n${error instanceof Error ? error.message : String(error)}`\n }\n ]\n }\n }\n}\n"],"names":[],"mappings":"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"}