dev3000 0.0.153 → 0.0.154

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 (166) hide show
  1. package/README.md +121 -103
  2. package/dist/cdp-monitor.d.ts.map +1 -1
  3. package/dist/cdp-monitor.js +2 -3
  4. package/dist/cdp-monitor.js.map +1 -1
  5. package/dist/cli.js +301 -75
  6. package/dist/cli.js.map +1 -1
  7. package/dist/commands/cloud-check-pr.d.ts +1 -0
  8. package/dist/commands/cloud-check-pr.d.ts.map +1 -1
  9. package/dist/commands/cloud-check-pr.js +18 -6
  10. package/dist/commands/cloud-check-pr.js.map +1 -1
  11. package/dist/commands/crawl.d.ts +12 -0
  12. package/dist/commands/crawl.d.ts.map +1 -0
  13. package/dist/commands/crawl.js +140 -0
  14. package/dist/commands/crawl.js.map +1 -0
  15. package/dist/commands/errors.d.ts +14 -0
  16. package/dist/commands/errors.d.ts.map +1 -0
  17. package/dist/commands/errors.js +295 -0
  18. package/dist/commands/errors.js.map +1 -0
  19. package/dist/commands/find-component.d.ts +8 -0
  20. package/dist/commands/find-component.d.ts.map +1 -0
  21. package/dist/commands/find-component.js +182 -0
  22. package/dist/commands/find-component.js.map +1 -0
  23. package/dist/commands/fix.d.ts +13 -0
  24. package/dist/commands/fix.d.ts.map +1 -0
  25. package/dist/commands/fix.js +288 -0
  26. package/dist/commands/fix.js.map +1 -0
  27. package/dist/commands/logs.d.ts +13 -0
  28. package/dist/commands/logs.d.ts.map +1 -0
  29. package/dist/commands/logs.js +195 -0
  30. package/dist/commands/logs.js.map +1 -0
  31. package/dist/commands/restart.d.ts +8 -0
  32. package/dist/commands/restart.d.ts.map +1 -0
  33. package/dist/commands/restart.js +92 -0
  34. package/dist/commands/restart.js.map +1 -0
  35. package/dist/components/PackageSelector.d.ts +12 -0
  36. package/dist/components/PackageSelector.d.ts.map +1 -0
  37. package/dist/components/PackageSelector.js +74 -0
  38. package/dist/components/PackageSelector.js.map +1 -0
  39. package/dist/dev-environment.d.ts +0 -7
  40. package/dist/dev-environment.d.ts.map +1 -1
  41. package/dist/dev-environment.js +108 -674
  42. package/dist/dev-environment.js.map +1 -1
  43. package/dist/screencast-manager.d.ts.map +1 -1
  44. package/dist/screencast-manager.js +7 -8
  45. package/dist/screencast-manager.js.map +1 -1
  46. package/dist/skills/d3k/SKILL.md +38 -27
  47. package/dist/skills/index.d.ts +10 -14
  48. package/dist/skills/index.d.ts.map +1 -1
  49. package/dist/skills/index.js +47 -77
  50. package/dist/skills/index.js.map +1 -1
  51. package/dist/skills/index.test.ts +13 -55
  52. package/dist/skills/index.ts +48 -81
  53. package/dist/src/tui-interface-impl.tsx +6 -15
  54. package/dist/tui-interface-impl.d.ts.map +1 -1
  55. package/dist/tui-interface-impl.js +4 -4
  56. package/dist/tui-interface-impl.js.map +1 -1
  57. package/dist/tui-interface-opentui.d.ts.map +1 -1
  58. package/dist/tui-interface-opentui.js +211 -80
  59. package/dist/tui-interface-opentui.js.map +1 -1
  60. package/dist/utils/agent-browser.d.ts +2 -0
  61. package/dist/utils/agent-browser.d.ts.map +1 -1
  62. package/dist/utils/agent-browser.js +46 -8
  63. package/dist/utils/agent-browser.js.map +1 -1
  64. package/dist/utils/agent-selection.d.ts.map +1 -1
  65. package/dist/utils/agent-selection.js +9 -2
  66. package/dist/utils/agent-selection.js.map +1 -1
  67. package/dist/utils/skill-installer.d.ts +55 -29
  68. package/dist/utils/skill-installer.d.ts.map +1 -1
  69. package/dist/utils/skill-installer.js +118 -229
  70. package/dist/utils/skill-installer.js.map +1 -1
  71. package/dist/utils/tmux-helpers.d.ts +1 -2
  72. package/dist/utils/tmux-helpers.d.ts.map +1 -1
  73. package/dist/utils/tmux-helpers.js +17 -18
  74. package/dist/utils/tmux-helpers.js.map +1 -1
  75. package/dist/utils/version-check.d.ts +2 -1
  76. package/dist/utils/version-check.d.ts.map +1 -1
  77. package/dist/utils/version-check.js +9 -0
  78. package/dist/utils/version-check.js.map +1 -1
  79. package/mcp-server/.next/BUILD_ID +1 -1
  80. package/mcp-server/.next/build-manifest.json +2 -2
  81. package/mcp-server/.next/fallback-build-manifest.json +2 -2
  82. package/mcp-server/.next/prerender-manifest.json +3 -3
  83. package/mcp-server/.next/server/app/_global-error/page.js +1 -1
  84. package/mcp-server/.next/server/app/_global-error/page.js.nft.json +1 -1
  85. package/mcp-server/.next/server/app/_global-error.html +2 -2
  86. package/mcp-server/.next/server/app/_global-error.rsc +1 -1
  87. package/mcp-server/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  88. package/mcp-server/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  89. package/mcp-server/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  90. package/mcp-server/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  91. package/mcp-server/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  92. package/mcp-server/.next/server/app/_not-found/page.js +1 -1
  93. package/mcp-server/.next/server/app/_not-found/page.js.nft.json +1 -1
  94. package/mcp-server/.next/server/app/_not-found.html +1 -1
  95. package/mcp-server/.next/server/app/_not-found.rsc +1 -1
  96. package/mcp-server/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
  97. package/mcp-server/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  98. package/mcp-server/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
  99. package/mcp-server/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  100. package/mcp-server/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  101. package/mcp-server/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  102. package/mcp-server/.next/server/app/api/screenshots/capture/route.js +2 -2
  103. package/mcp-server/.next/server/app/api/screenshots/capture/route.js.nft.json +1 -1
  104. package/mcp-server/.next/server/app/index.html +1 -1
  105. package/mcp-server/.next/server/app/index.rsc +2 -2
  106. package/mcp-server/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
  107. package/mcp-server/.next/server/app/index.segments/_full.segment.rsc +2 -2
  108. package/mcp-server/.next/server/app/index.segments/_head.segment.rsc +1 -1
  109. package/mcp-server/.next/server/app/index.segments/_index.segment.rsc +1 -1
  110. package/mcp-server/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  111. package/mcp-server/.next/server/app/logs/page.js +1 -1
  112. package/mcp-server/.next/server/app/logs/page.js.nft.json +1 -1
  113. package/mcp-server/.next/server/app/mcp/route.js +4 -4
  114. package/mcp-server/.next/server/app/mcp/route.js.nft.json +1 -1
  115. package/mcp-server/.next/server/app/page.js +1 -1
  116. package/mcp-server/.next/server/app/page.js.nft.json +1 -1
  117. package/mcp-server/.next/server/app/page_client-reference-manifest.js +1 -1
  118. package/mcp-server/.next/server/app/video/[session]/page.js +1 -1
  119. package/mcp-server/.next/server/app/video/[session]/page.js.nft.json +1 -1
  120. package/mcp-server/.next/server/chunks/[root-of-the-server]__2f95edf0._.js +3 -3
  121. package/mcp-server/.next/server/chunks/[root-of-the-server]__2f95edf0._.js.map +1 -1
  122. package/mcp-server/.next/server/chunks/[root-of-the-server]__69e6dfb7._.js +3 -0
  123. package/mcp-server/.next/server/chunks/{[root-of-the-server]__444592aa._.js.map → [root-of-the-server]__69e6dfb7._.js.map} +1 -1
  124. package/mcp-server/.next/server/chunks/[root-of-the-server]__6baff21e._.js +4 -0
  125. package/mcp-server/.next/server/chunks/{[root-of-the-server]__130a5f58._.js.map → [root-of-the-server]__6baff21e._.js.map} +1 -1
  126. package/mcp-server/.next/server/chunks/[root-of-the-server]__6f790e1f._.js +1 -1
  127. package/mcp-server/.next/server/chunks/[root-of-the-server]__6f790e1f._.js.map +1 -1
  128. package/mcp-server/.next/server/chunks/[root-of-the-server]__c8cf5b23._.js +3 -0
  129. package/mcp-server/.next/server/chunks/[root-of-the-server]__e6a83e60._.js +4 -0
  130. package/mcp-server/.next/server/chunks/{[root-of-the-server]__b71c83ed._.js.map → [root-of-the-server]__e6a83e60._.js.map} +1 -1
  131. package/mcp-server/.next/server/chunks/mcp-server_app_mcp_tools_ts_faf6d7df._.js +32 -66
  132. package/mcp-server/.next/server/chunks/mcp-server_app_mcp_tools_ts_faf6d7df._.js.map +1 -1
  133. package/mcp-server/.next/server/chunks/src_utils_agent-browser_ts_cc00e0d8._.js +1 -1
  134. package/mcp-server/.next/server/chunks/src_utils_agent-browser_ts_cc00e0d8._.js.map +1 -1
  135. package/mcp-server/.next/server/chunks/src_utils_project-name_ts_1fab1dd5._.js +3 -0
  136. package/mcp-server/.next/server/chunks/src_utils_project-name_ts_1fab1dd5._.js.map +1 -0
  137. package/mcp-server/.next/server/chunks/ssr/{[root-of-the-server]__f66148e5._.js → [root-of-the-server]__b17d4048._.js} +2 -2
  138. package/mcp-server/.next/server/chunks/ssr/{[root-of-the-server]__50eb2eba._.js → [root-of-the-server]__dcf84f77._.js} +2 -2
  139. package/mcp-server/.next/server/chunks/ssr/mcp-server_app_page_tsx_9fc46577._.js +1 -1
  140. package/mcp-server/.next/server/chunks/ssr/mcp-server_app_page_tsx_9fc46577._.js.map +1 -1
  141. package/mcp-server/.next/server/pages/404.html +1 -1
  142. package/mcp-server/.next/server/pages/500.html +2 -2
  143. package/mcp-server/.next/server/server-reference-manifest.js +1 -1
  144. package/mcp-server/.next/server/server-reference-manifest.json +1 -1
  145. package/mcp-server/.next/static/chunks/{2422ea9ed874427b.js → 3f3f8e7d16ba3bf4.js} +1 -1
  146. package/mcp-server/app/api/tools/route.ts +5 -4
  147. package/mcp-server/app/mcp/route.ts +8 -63
  148. package/mcp-server/app/mcp/tools.ts +71 -445
  149. package/mcp-server/app/page.tsx +1 -1
  150. package/mcp-server/package.json +1 -0
  151. package/package.json +6 -6
  152. package/src/tui-interface-impl.tsx +6 -15
  153. package/dist/components/SkillSelector.d.ts +0 -10
  154. package/dist/components/SkillSelector.d.ts.map +0 -1
  155. package/dist/components/SkillSelector.js +0 -87
  156. package/dist/components/SkillSelector.js.map +0 -1
  157. package/mcp-server/.next/server/chunks/[root-of-the-server]__130a5f58._.js +0 -4
  158. package/mcp-server/.next/server/chunks/[root-of-the-server]__444592aa._.js +0 -3
  159. package/mcp-server/.next/server/chunks/[root-of-the-server]__8f84b4cc._.js +0 -3
  160. package/mcp-server/.next/server/chunks/[root-of-the-server]__b71c83ed._.js +0 -4
  161. /package/mcp-server/.next/server/chunks/{[root-of-the-server]__8f84b4cc._.js.map → [root-of-the-server]__c8cf5b23._.js.map} +0 -0
  162. /package/mcp-server/.next/server/chunks/ssr/{[root-of-the-server]__f66148e5._.js.map → [root-of-the-server]__b17d4048._.js.map} +0 -0
  163. /package/mcp-server/.next/server/chunks/ssr/{[root-of-the-server]__50eb2eba._.js.map → [root-of-the-server]__dcf84f77._.js.map} +0 -0
  164. /package/mcp-server/.next/static/{Mseg7iY2pocGklcPCObqM → MfA6U1EFS31sVuHA4xDF_}/_buildManifest.js +0 -0
  165. /package/mcp-server/.next/static/{Mseg7iY2pocGklcPCObqM → MfA6U1EFS31sVuHA4xDF_}/_clientMiddlewareManifest.json +0 -0
  166. /package/mcp-server/.next/static/{Mseg7iY2pocGklcPCObqM → MfA6U1EFS31sVuHA4xDF_}/_ssgManifest.js +0 -0
@@ -1,3 +1,3 @@
1
- module.exports=[23889,r=>{"use strict";var e=r.i(33405),t=r.i(22734),s=r.i(14747),n=r.i(92509);let c={get url(){return`file://${r.P("src/utils/agent-browser.ts")}`}};function a(){let r=(0,n.fileURLToPath)(c.url),e=(0,s.dirname)((0,s.dirname)((0,s.dirname)(r))),a=(0,s.join)(e,"node_modules",".bin","agent-browser");return(0,t.existsSync)(a)?a:"agent-browser"}async function o(r,t={}){let s,n=[...(s=[],t.headed&&s.push("--headed"),t.cdpPort&&s.push("--cdp",String(t.cdpPort)),t.session&&s.push("--session",t.session),s.push("--json"),s),...r],c=t.timeout||3e4,i=a();return new Promise((r,t)=>{let s=(0,e.spawn)(i,n,{stdio:["pipe","pipe","pipe"],timeout:c}),a="",o="";s.stdout?.on("data",r=>{a+=r.toString()}),s.stderr?.on("data",r=>{o+=r.toString()}),s.on("close",e=>{0===e?r(a):t(Error(`agent-browser failed (code ${e}): ${o||a}`))}),s.on("error",r=>{t(Error(`agent-browser spawn error: ${r.message}`))})})}async function i(r,e={}){try{let t=await o(["open",r],e);return{success:!0,output:t}}catch(r){return{success:!1,error:r instanceof Error?r.message:String(r)}}}async function u(r={}){let e=["snapshot"];!1!==r.interactive&&e.push("-i"),r.compact&&e.push("-c");let t=await o(e,r),s=[];try{let r=JSON.parse(t);if(r.success&&r.data?.refs)for(let[e,t]of Object.entries(r.data.refs))s.push({ref:`@${e}`,role:t.role||"unknown",name:t.name,text:t.text});return{elements:s,raw:r.data?.snapshot||t}}catch{for(let r of t.matchAll(/@(\w+)\s+(\w+)(?:\s+"([^"]*)")?/g))s.push({ref:`@${r[1]}`,role:r[2],name:r[3]});return{elements:s,raw:t}}}async function l(r,e={}){try{let t=await o(["click",r],e);return{success:!0,output:t}}catch(r){return{success:!1,error:r instanceof Error?r.message:String(r)}}}async function f(r,e={}){try{let t=await o(["type",r],e);return{success:!0,output:t}}catch(r){return{success:!1,error:r instanceof Error?r.message:String(r)}}}async function g(r,e,t={}){try{let s=await o(["fill",r,e],t);return{success:!0,output:s}}catch(r){return{success:!1,error:r instanceof Error?r.message:String(r)}}}async function y(r,e,t={}){try{let s=["scroll",r];e&&s.push(String(e));let n=await o(s,t);return{success:!0,output:n}}catch(r){return{success:!1,error:r instanceof Error?r.message:String(r)}}}async function h(r,e={}){try{let n=(0,s.dirname)(r);(0,t.existsSync)(n)||(0,t.mkdirSync)(n,{recursive:!0});let c=["screenshot",r];return e.fullPage&&c.push("--full-page"),await o(c,e),{success:!0,path:r}}catch(r){return{success:!1,error:r instanceof Error?r.message:String(r)}}}async function p(r={}){try{let e=await o(["console"],r),t=JSON.parse(e);return Array.isArray(t)?t:[]}catch{return[]}}async function w(r={}){try{let e=await o(["errors"],r),t=JSON.parse(e);return Array.isArray(t)?t:[]}catch{return[]}}async function m(r={}){try{let e=await o(["back"],r);return{success:!0,output:e}}catch(r){return{success:!1,error:r instanceof Error?r.message:String(r)}}}async function d(r={}){try{let e=await o(["forward"],r);return{success:!0,output:e}}catch(r){return{success:!1,error:r instanceof Error?r.message:String(r)}}}async function S(r={}){try{let e=await o(["reload"],r);return{success:!0,output:e}}catch(r){return{success:!1,error:r instanceof Error?r.message:String(r)}}}async function E(r={}){try{let e=await o(["close"],r);return{success:!0,output:e}}catch(r){return{success:!1,error:r instanceof Error?r.message:String(r)}}}async function b(r={}){try{return(await o(["url"],r)).trim()}catch{return null}}async function A(r={}){try{return(await o(["title"],r)).trim()}catch{return null}}async function P(r,e={}){try{let t=await o(["evaluate",r],e);return{success:!0,output:t}}catch(r){return{success:!1,error:r instanceof Error?r.message:String(r)}}}async function $(r,e={}){try{let t=["wait",r];e.timeout&&t.push("--timeout",String(e.timeout));let s=await o(t,e);return{success:!0,output:s}}catch(r){return{success:!1,error:r instanceof Error?r.message:String(r)}}}function k(){try{let r=a();return(0,e.execSync)(`"${r}" --help`,{stdio:"pipe"}),!0}catch{return!1}}function v(){return a()}r.s(["back",()=>m,"click",()=>l,"close",()=>E,"evaluate",()=>P,"fill",()=>g,"forward",()=>d,"getAgentBrowserBinaryPath",()=>v,"getConsoleMessages",()=>p,"getCurrentUrl",()=>b,"getErrors",()=>w,"getTitle",()=>A,"isAgentBrowserAvailable",()=>k,"openUrl",()=>i,"reload",()=>S,"screenshot",()=>h,"scroll",()=>y,"snapshot",()=>u,"type",()=>f,"waitFor",()=>$])}];
1
+ module.exports=[23889,r=>{"use strict";var e=r.i(33405),t=r.i(22734),s=r.i(14747),n=r.i(92509);let c={get url(){return`file://${r.P("src/utils/agent-browser.ts")}`}};function o(){if(process.env.AGENT_BROWSER_PATH&&(0,t.existsSync)(process.env.AGENT_BROWSER_PATH))return process.env.AGENT_BROWSER_PATH;let r=[];try{let e=(0,n.fileURLToPath)(c.url),t=(0,s.dirname)(e);(t.startsWith("/")||t.match(/^[A-Z]:\\/i))&&r.push((0,s.join)((0,s.dirname)((0,s.dirname)(t)),"node_modules",".bin","agent-browser"),(0,s.join)(t,"..","..","..","mcp-server","node_modules",".bin","agent-browser"),(0,s.join)((0,s.dirname)((0,s.dirname)(t)),"mcp-server","node_modules",".bin","agent-browser"),(0,s.join)(t,"..","..","..","..","mcp-server","node_modules",".bin","agent-browser"),(0,s.join)(t,"..","..","node_modules",".bin","agent-browser"))}catch{}let e=process.cwd();for(let n of(r.push((0,s.join)(e,"node_modules",".bin","agent-browser"),(0,s.join)(e,"mcp-server","node_modules",".bin","agent-browser"),(0,s.join)(e,"..","mcp-server","node_modules",".bin","agent-browser")),r))if((0,t.existsSync)(n))return n;return"agent-browser"}async function a(r,t={}){let s,n=[...(s=[],t.headed&&s.push("--headed"),t.cdpPort&&s.push("--cdp",String(t.cdpPort)),t.session&&s.push("--session",t.session),s.push("--json"),s),...r],c=t.timeout||3e4,i=o();return new Promise((r,t)=>{let s=(0,e.spawn)(i,n,{stdio:["pipe","pipe","pipe"],timeout:c}),o="",a="";s.stdout?.on("data",r=>{o+=r.toString()}),s.stderr?.on("data",r=>{a+=r.toString()}),s.on("close",e=>{0===e?r(o):t(Error(`agent-browser failed (code ${e}): ${a||o}`))}),s.on("error",r=>{t(Error(`agent-browser spawn error: ${r.message}`))})})}async function i(r,e={}){try{let t=await a(["open",r],e);return{success:!0,output:t}}catch(r){return{success:!1,error:r instanceof Error?r.message:String(r)}}}async function u(r={}){let e=["snapshot"];!1!==r.interactive&&e.push("-i"),r.compact&&e.push("-c");let t=await a(e,r),s=[];try{let r=JSON.parse(t);if(r.success&&r.data?.refs)for(let[e,t]of Object.entries(r.data.refs))s.push({ref:`@${e}`,role:t.role||"unknown",name:t.name,text:t.text});return{elements:s,raw:r.data?.snapshot||t}}catch{for(let r of t.matchAll(/@(\w+)\s+(\w+)(?:\s+"([^"]*)")?/g))s.push({ref:`@${r[1]}`,role:r[2],name:r[3]});return{elements:s,raw:t}}}async function l(r,e={}){try{let t=await a(["click",r],e);return{success:!0,output:t}}catch(r){return{success:!1,error:r instanceof Error?r.message:String(r)}}}async function f(r,e={}){try{let t=await a(["type",r],e);return{success:!0,output:t}}catch(r){return{success:!1,error:r instanceof Error?r.message:String(r)}}}async function g(r,e,t={}){try{let s=await a(["fill",r,e],t);return{success:!0,output:s}}catch(r){return{success:!1,error:r instanceof Error?r.message:String(r)}}}async function p(r,e,t={}){try{let s=["scroll",r];e&&s.push(String(e));let n=await a(s,t);return{success:!0,output:n}}catch(r){return{success:!1,error:r instanceof Error?r.message:String(r)}}}async function y(r,e={}){try{let n=(0,s.dirname)(r);(0,t.existsSync)(n)||(0,t.mkdirSync)(n,{recursive:!0});let c=["screenshot",r];return e.fullPage&&c.push("--full-page"),await a(c,e),{success:!0,path:r}}catch(r){return{success:!1,error:r instanceof Error?r.message:String(r)}}}async function d(r={}){try{let e=await a(["console"],r),t=JSON.parse(e);return Array.isArray(t)?t:[]}catch{return[]}}async function m(r={}){try{let e=await a(["errors"],r),t=JSON.parse(e);return Array.isArray(t)?t:[]}catch{return[]}}async function h(r={}){try{let e=await a(["back"],r);return{success:!0,output:e}}catch(r){return{success:!1,error:r instanceof Error?r.message:String(r)}}}async function w(r={}){try{let e=await a(["forward"],r);return{success:!0,output:e}}catch(r){return{success:!1,error:r instanceof Error?r.message:String(r)}}}async function S(r={}){try{let e=await a(["reload"],r);return{success:!0,output:e}}catch(r){return{success:!1,error:r instanceof Error?r.message:String(r)}}}async function b(r={}){try{let e=await a(["close"],r);return{success:!0,output:e}}catch(r){return{success:!1,error:r instanceof Error?r.message:String(r)}}}async function E(r={}){try{return(await a(["url"],r)).trim()}catch{return null}}async function A(r={}){try{return(await a(["title"],r)).trim()}catch{return null}}async function v(r,e={}){try{let t=await a(["evaluate",r],e);return{success:!0,output:t}}catch(r){return{success:!1,error:r instanceof Error?r.message:String(r)}}}async function _(r,e={}){try{let t=["wait",r];e.timeout&&t.push("--timeout",String(e.timeout));let s=await a(t,e);return{success:!0,output:s}}catch(r){return{success:!1,error:r instanceof Error?r.message:String(r)}}}function j(){try{let r=o();return(0,e.execSync)(`"${r}" --help`,{stdio:"pipe"}),!0}catch{return!1}}function P(){return o()}r.s(["back",()=>h,"click",()=>l,"close",()=>b,"evaluate",()=>v,"fill",()=>g,"forward",()=>w,"getAgentBrowserBinaryPath",()=>P,"getConsoleMessages",()=>d,"getCurrentUrl",()=>E,"getErrors",()=>m,"getTitle",()=>A,"isAgentBrowserAvailable",()=>j,"openUrl",()=>i,"reload",()=>S,"screenshot",()=>y,"scroll",()=>p,"snapshot",()=>u,"type",()=>f,"waitFor",()=>_])}];
2
2
 
3
3
  //# sourceMappingURL=src_utils_agent-browser_ts_cc00e0d8._.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/utils/agent-browser.ts"],"sourcesContent":["/**\n * Wrapper for agent-browser CLI\n *\n * Provides a TypeScript interface to agent-browser commands for browser automation.\n * Uses the CLI approach for reliability and to leverage agent-browser's daemon architecture.\n */\n\nimport { execSync, spawn } from \"child_process\"\nimport { existsSync, mkdirSync } from \"fs\"\nimport { dirname, join } from \"path\"\nimport { fileURLToPath } from \"url\"\n\n// Find the agent-browser binary in node_modules\nfunction getAgentBrowserPath(): string {\n // Try relative to this module first (for development)\n const currentFile = fileURLToPath(import.meta.url)\n const projectRoot = dirname(dirname(dirname(currentFile)))\n const localPath = join(projectRoot, \"node_modules\", \".bin\", \"agent-browser\")\n\n if (existsSync(localPath)) {\n return localPath\n }\n\n // Fallback to global command\n return \"agent-browser\"\n}\n\nexport interface AgentBrowserOptions {\n /** Run in headed mode (visible browser window) */\n headed?: boolean\n /** Connect to existing browser via CDP port */\n cdpPort?: number\n /** Session name for isolation */\n session?: string\n /** Timeout in milliseconds */\n timeout?: number\n}\n\nexport interface SnapshotElement {\n ref: string\n role: string\n name?: string\n text?: string\n}\n\nexport interface SnapshotResult {\n elements: SnapshotElement[]\n raw: string\n}\n\nexport interface ScreenshotResult {\n success: boolean\n path?: string\n error?: string\n}\n\nexport interface ActionResult {\n success: boolean\n output?: string\n error?: string\n}\n\n/**\n * Build CLI args from options\n */\nfunction buildArgs(options: AgentBrowserOptions): string[] {\n const args: string[] = []\n\n if (options.headed) {\n args.push(\"--headed\")\n }\n\n if (options.cdpPort) {\n args.push(\"--cdp\", String(options.cdpPort))\n }\n\n if (options.session) {\n args.push(\"--session\", options.session)\n }\n\n // Always use JSON output for parsing\n args.push(\"--json\")\n\n return args\n}\n\n/**\n * Execute an agent-browser command\n */\nasync function execAgentBrowser(command: string[], options: AgentBrowserOptions = {}): Promise<string> {\n const args = [...buildArgs(options), ...command]\n const timeout = options.timeout || 30000\n const agentBrowserPath = getAgentBrowserPath()\n\n return new Promise((resolve, reject) => {\n const proc = spawn(agentBrowserPath, args, {\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n timeout\n })\n\n let stdout = \"\"\n let stderr = \"\"\n\n proc.stdout?.on(\"data\", (data) => {\n stdout += data.toString()\n })\n\n proc.stderr?.on(\"data\", (data) => {\n stderr += data.toString()\n })\n\n proc.on(\"close\", (code) => {\n if (code === 0) {\n resolve(stdout)\n } else {\n reject(new Error(`agent-browser failed (code ${code}): ${stderr || stdout}`))\n }\n })\n\n proc.on(\"error\", (err) => {\n reject(new Error(`agent-browser spawn error: ${err.message}`))\n })\n })\n}\n\n/**\n * Open a URL in the browser\n */\nexport async function openUrl(url: string, options: AgentBrowserOptions = {}): Promise<ActionResult> {\n try {\n const output = await execAgentBrowser([\"open\", url], options)\n return { success: true, output }\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : String(error)\n }\n }\n}\n\n/**\n * Take a snapshot of the current page (accessibility tree with refs)\n */\nexport async function snapshot(\n options: AgentBrowserOptions & { interactive?: boolean; compact?: boolean } = {}\n): Promise<SnapshotResult> {\n const args = [\"snapshot\"]\n\n // -i for interactive elements only (reduces tokens)\n if (options.interactive !== false) {\n args.push(\"-i\")\n }\n\n // -c for compact output\n if (options.compact) {\n args.push(\"-c\")\n }\n\n const output = await execAgentBrowser(args, options)\n\n // Parse the JSON output to extract elements\n const elements: SnapshotElement[] = []\n\n try {\n const parsed = JSON.parse(output)\n if (parsed.success && parsed.data?.refs) {\n for (const [ref, info] of Object.entries(parsed.data.refs)) {\n const refInfo = info as { name?: string; role?: string; text?: string }\n elements.push({\n ref: `@${ref}`,\n role: refInfo.role || \"unknown\",\n name: refInfo.name,\n text: refInfo.text\n })\n }\n }\n return { elements, raw: parsed.data?.snapshot || output }\n } catch {\n // Fallback to text parsing if JSON fails\n const refPattern = /@(\\w+)\\s+(\\w+)(?:\\s+\"([^\"]*)\")?/g\n const matches = output.matchAll(refPattern)\n\n for (const match of matches) {\n elements.push({\n ref: `@${match[1]}`,\n role: match[2],\n name: match[3]\n })\n }\n\n return { elements, raw: output }\n }\n}\n\n/**\n * Click an element by ref or selector\n */\nexport async function click(target: string, options: AgentBrowserOptions = {}): Promise<ActionResult> {\n try {\n const output = await execAgentBrowser([\"click\", target], options)\n return { success: true, output }\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : String(error)\n }\n }\n}\n\n/**\n * Type text into the focused element\n */\nexport async function type(text: string, options: AgentBrowserOptions = {}): Promise<ActionResult> {\n try {\n const output = await execAgentBrowser([\"type\", text], options)\n return { success: true, output }\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : String(error)\n }\n }\n}\n\n/**\n * Fill an input field (by ref or selector)\n */\nexport async function fill(target: string, value: string, options: AgentBrowserOptions = {}): Promise<ActionResult> {\n try {\n const output = await execAgentBrowser([\"fill\", target, value], options)\n return { success: true, output }\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : String(error)\n }\n }\n}\n\n/**\n * Scroll the page\n */\nexport async function scroll(\n direction: \"up\" | \"down\" | \"left\" | \"right\",\n amount?: number,\n options: AgentBrowserOptions = {}\n): Promise<ActionResult> {\n try {\n const args = [\"scroll\", direction]\n if (amount) {\n args.push(String(amount))\n }\n const output = await execAgentBrowser(args, options)\n return { success: true, output }\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : String(error)\n }\n }\n}\n\n/**\n * Take a screenshot\n */\nexport async function screenshot(\n outputPath: string,\n options: AgentBrowserOptions & { fullPage?: boolean } = {}\n): Promise<ScreenshotResult> {\n try {\n // Ensure output directory exists\n const dir = dirname(outputPath)\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true })\n }\n\n const args = [\"screenshot\", outputPath]\n if (options.fullPage) {\n args.push(\"--full-page\")\n }\n\n await execAgentBrowser(args, options)\n return { success: true, path: outputPath }\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : String(error)\n }\n }\n}\n\n/**\n * Get console messages from the browser\n */\nexport async function getConsoleMessages(options: AgentBrowserOptions = {}): Promise<string[]> {\n try {\n const output = await execAgentBrowser([\"console\"], options)\n // Parse JSON output\n const parsed = JSON.parse(output)\n return Array.isArray(parsed) ? parsed : []\n } catch {\n return []\n }\n}\n\n/**\n * Get page errors\n */\nexport async function getErrors(options: AgentBrowserOptions = {}): Promise<string[]> {\n try {\n const output = await execAgentBrowser([\"errors\"], options)\n const parsed = JSON.parse(output)\n return Array.isArray(parsed) ? parsed : []\n } catch {\n return []\n }\n}\n\n/**\n * Navigate back\n */\nexport async function back(options: AgentBrowserOptions = {}): Promise<ActionResult> {\n try {\n const output = await execAgentBrowser([\"back\"], options)\n return { success: true, output }\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : String(error)\n }\n }\n}\n\n/**\n * Navigate forward\n */\nexport async function forward(options: AgentBrowserOptions = {}): Promise<ActionResult> {\n try {\n const output = await execAgentBrowser([\"forward\"], options)\n return { success: true, output }\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : String(error)\n }\n }\n}\n\n/**\n * Reload the page\n */\nexport async function reload(options: AgentBrowserOptions = {}): Promise<ActionResult> {\n try {\n const output = await execAgentBrowser([\"reload\"], options)\n return { success: true, output }\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : String(error)\n }\n }\n}\n\n/**\n * Close the browser\n */\nexport async function close(options: AgentBrowserOptions = {}): Promise<ActionResult> {\n try {\n const output = await execAgentBrowser([\"close\"], options)\n return { success: true, output }\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : String(error)\n }\n }\n}\n\n/**\n * Get the current URL\n */\nexport async function getCurrentUrl(options: AgentBrowserOptions = {}): Promise<string | null> {\n try {\n const output = await execAgentBrowser([\"url\"], options)\n return output.trim()\n } catch {\n return null\n }\n}\n\n/**\n * Get page title\n */\nexport async function getTitle(options: AgentBrowserOptions = {}): Promise<string | null> {\n try {\n const output = await execAgentBrowser([\"title\"], options)\n return output.trim()\n } catch {\n return null\n }\n}\n\n/**\n * Evaluate JavaScript in the browser\n */\nexport async function evaluate(expression: string, options: AgentBrowserOptions = {}): Promise<ActionResult> {\n try {\n const output = await execAgentBrowser([\"evaluate\", expression], options)\n return { success: true, output }\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : String(error)\n }\n }\n}\n\n/**\n * Wait for an element to appear\n */\nexport async function waitFor(\n selector: string,\n options: AgentBrowserOptions & { timeout?: number } = {}\n): Promise<ActionResult> {\n try {\n const args = [\"wait\", selector]\n if (options.timeout) {\n args.push(\"--timeout\", String(options.timeout))\n }\n const output = await execAgentBrowser(args, options)\n return { success: true, output }\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : String(error)\n }\n }\n}\n\n/**\n * Check if agent-browser is installed and accessible\n */\nexport function isAgentBrowserAvailable(): boolean {\n try {\n const agentBrowserPath = getAgentBrowserPath()\n // agent-browser doesn't have --version, just check if the binary exists and responds to --help\n execSync(`\"${agentBrowserPath}\" --help`, { stdio: \"pipe\" })\n return true\n } catch {\n return false\n }\n}\n\n/**\n * Get agent-browser path for debugging\n */\nexport function getAgentBrowserBinaryPath(): string {\n return getAgentBrowserPath()\n}\n"],"names":[],"mappings":"uCAOA,IAAA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,EAAA,CAAA,CAAA,8EAGA,SAAS,IAEP,IAAM,EAAc,CAAA,EAAA,EAAA,aAAA,AAAa,EAAC,EAAY,GAAG,EAC3C,EAAc,CAAA,EAAA,EAAA,OAAA,AAAO,EAAC,CAAA,EAAA,EAAA,OAAA,AAAO,EAAC,CAAA,EAAA,EAAA,OAAA,AAAO,EAAC,KACtC,EAAY,CAAA,EAAA,EAAA,IAAA,AAAI,EAAC,EAAa,eAAgB,OAAQ,uBAE5D,AAAI,CAAA,EAAA,EAAA,UAAA,AAAU,EAAC,GACN,EAIF,OALoB,QAM7B,CAgEA,eAAe,EAAiB,CAAiB,CAAE,EAA+B,CAAC,CAAC,QAC5E,EAAO,KAxBP,EAAiB,EAAE,CAErB,EAAQ,MAAM,EAAE,AAClB,EAAK,IAAI,CAAC,YAGR,EAAQ,OAAO,EAAE,AACnB,EAAK,IAAI,CAAC,QAAS,OAAO,EAAQ,OAAO,GAGvC,AAcuB,EAdf,OAAO,EAAE,AACnB,EAAK,IAAI,CAAC,YAAa,EAAQ,OAAO,EAIxC,EAAK,IAAI,CAAC,UAEH,MAOiC,EAAQ,CAC1C,EAAU,EAAQ,OAAO,EAAI,IAC7B,EAAmB,IAEzB,OAAO,IAAI,QAAQ,CAAC,EAAS,KAC3B,IAAM,EAAO,CAAA,EAAA,EAAA,KAAA,AAAK,EAAC,EAAkB,EAAM,CACzC,MAAO,CAAC,OAAQ,OAAQ,OAAO,SAC/B,CACF,GAEI,EAAS,GACT,EAAS,GAEb,EAAK,MAAM,EAAE,GAAG,OAAQ,AAAC,IACvB,GAAU,EAAK,QAAQ,EACzB,GAEA,EAAK,MAAM,EAAE,GAAG,OAAQ,AAAC,IACvB,GAAU,EAAK,QAAQ,EACzB,GAEA,EAAK,EAAE,CAAC,QAAS,AAAC,IACZ,AAAS,GAAG,GACd,EAAQ,GAER,EAAW,AAAJ,MAAU,CAAC,2BAA2B,EAAE,EAAK,GAAG,EAAE,GAAU,EAAA,CAAQ,EAE/E,GAEA,EAAK,EAAE,CAAC,QAAS,AAAC,IAChB,EAAO,AAAI,MAAM,CAAC,2BAA2B,EAAE,EAAI,OAAO,CAAA,CAAE,EAC9D,EACF,EACF,CAKO,eAAe,EAAQ,CAAW,CAAE,EAA+B,CAAC,CAAC,EAC1E,GAAI,CACF,IAAM,EAAS,MAAM,EAAiB,CAAC,OAAQ,EAAI,CAAE,GACrD,MAAO,CAAE,SAAS,SAAM,CAAO,CACjC,CAAE,MAAO,EAAO,CACd,MAAO,CACL,SAAS,EACT,MAAO,aAAiB,MAAQ,EAAM,OAAO,CAAG,OAAO,EACzD,CACF,CACF,CAKO,eAAe,EACpB,EAA8E,CAAC,CAAC,EAEhF,IAAM,EAAO,CAAC,WAAW,AAGrB,AAAwB,OAAO,CAAvB,WAAW,EACrB,EAAK,IAAI,CAAC,MAIR,EAAQ,OAAO,EAAE,AACnB,EAAK,IAAI,CAAC,MAGZ,IAAM,EAAS,MAAM,EAAiB,EAAM,GAGtC,EAA8B,EAAE,CAEtC,GAAI,CACF,IAAM,EAAS,KAAK,KAAK,CAAC,GAC1B,GAAI,EAAO,OAAO,EAAI,EAAO,IAAI,EAAE,KACjC,CADuC,GAClC,GAAM,CAAC,EAAK,EAAK,GAAI,OAAO,OAAO,CAAC,EAAO,IAAI,CAAC,IAAI,EAAG,AAE1D,EAAS,IAAI,CAAC,CACZ,IAAK,CAAC,CAAC,EAAE,EAAA,CAAK,CACd,KAAM,EAAQ,IAAI,EAAI,UACtB,KAAM,EAAQ,IAAI,CAClB,KAAM,AALQ,EAKA,IAAI,AACpB,GAGJ,MAAO,UAAE,EAAU,IAAK,EAAO,IAAI,EAAE,UAAY,CAAO,CAC1D,CAAE,KAAM,CAKN,IAAK,IAAM,KAFK,EAAO,EAEH,MAFW,CADZ,AACa,CAEH,mCAC3B,EAAS,IAAI,CAAC,CACZ,IAAK,CAAC,CAAC,EAAE,CAAK,CAAC,EAAE,CAAA,CAAE,CACnB,KAAM,CAAK,CAAC,EAAE,CACd,KAAM,CAAK,CAAC,EAAE,AAChB,GAGF,MAAO,UAAE,EAAU,IAAK,CAAO,CACjC,CACF,CAKO,eAAe,EAAM,CAAc,CAAE,EAA+B,CAAC,CAAC,EAC3E,GAAI,CACF,IAAM,EAAS,MAAM,EAAiB,CAAC,QAAS,EAAO,CAAE,GACzD,MAAO,CAAE,SAAS,SAAM,CAAO,CACjC,CAAE,MAAO,EAAO,CACd,MAAO,CACL,QAAS,GACT,MAAO,aAAiB,MAAQ,EAAM,OAAO,CAAG,OAAO,EACzD,CACF,CACF,CAKO,eAAe,EAAK,CAAY,CAAE,EAA+B,CAAC,CAAC,EACxE,GAAI,CACF,IAAM,EAAS,MAAM,EAAiB,CAAC,OAAQ,EAAK,CAAE,GACtD,MAAO,CAAE,SAAS,SAAM,CAAO,CACjC,CAAE,MAAO,EAAO,CACd,MAAO,CACL,SAAS,EACT,MAAO,aAAiB,MAAQ,EAAM,OAAO,CAAG,OAAO,EACzD,CACF,CACF,CAKO,eAAe,EAAK,CAAc,CAAE,CAAa,CAAE,EAA+B,CAAC,CAAC,EACzF,GAAI,CACF,IAAM,EAAS,MAAM,EAAiB,CAAC,OAAQ,EAAQ,EAAM,CAAE,GAC/D,MAAO,CAAE,SAAS,SAAM,CAAO,CACjC,CAAE,MAAO,EAAO,CACd,MAAO,CACL,SAAS,EACT,MAAO,aAAiB,MAAQ,EAAM,OAAO,CAAG,OAAO,EACzD,CACF,CACF,CAKO,eAAe,EACpB,CAA2C,CAC3C,CAAe,CACf,EAA+B,CAAC,CAAC,EAEjC,GAAI,CACF,IAAM,EAAO,CAAC,SAAU,EAAU,CAC9B,GACF,EAAK,GADK,CACD,CAAC,OAAO,IAEnB,IAAM,EAAS,MAAM,EAAiB,EAAM,GAC5C,MAAO,CAAE,SAAS,SAAM,CAAO,CACjC,CAAE,MAAO,EAAO,CACd,MAAO,CACL,QAAS,GACT,MAAO,aAAiB,MAAQ,EAAM,OAAO,CAAG,OAAO,EACzD,CACF,CACF,CAKO,eAAe,EACpB,CAAkB,CAClB,EAAwD,CAAC,CAAC,EAE1D,GAAI,CAEF,IAAM,EAAM,CAAA,EAAA,EAAA,OAAA,AAAO,EAAC,EAChB,CAAC,CAAA,EAAA,EAAA,UAAU,AAAV,EAAW,IACd,CAAA,CADoB,CACpB,EAAA,SAAA,AAAS,EAAC,EAAK,CAAE,WAAW,CAAK,GAGnC,IAAM,EAAO,CAAC,aAAc,EAAW,CAMvC,OALI,EAAQ,QAAQ,EAAE,AACpB,EAAK,IAAI,CAAC,eAGZ,MAAM,EAAiB,EAAM,GACtB,CAAE,SAAS,EAAM,KAAM,CAAW,CAC3C,CAAE,MAAO,EAAO,CACd,MAAO,CACL,SAAS,EACT,MAAO,aAAiB,MAAQ,EAAM,OAAO,CAAG,OAAO,EACzD,CACF,CACF,CAKO,eAAe,EAAmB,EAA+B,CAAC,CAAC,EACxE,GAAI,CACF,IAAM,EAAS,MAAM,EAAiB,CAAC,UAAU,CAAE,GAE7C,EAAS,KAAK,KAAK,CAAC,GAC1B,OAAO,MAAM,OAAO,CAAC,GAAU,EAAS,EAAE,AAC5C,CAAE,KAAM,CACN,MAAO,EAAE,AACX,CACF,CAKO,eAAe,EAAU,EAA+B,CAAC,CAAC,EAC/D,GAAI,CACF,IAAM,EAAS,MAAM,EAAiB,CAAC,SAAS,CAAE,GAC5C,EAAS,KAAK,KAAK,CAAC,GAC1B,OAAO,MAAM,OAAO,CAAC,GAAU,EAAS,EAAE,AAC5C,CAAE,KAAM,CACN,MAAO,EAAE,AACX,CACF,CAKO,eAAe,EAAK,EAA+B,CAAC,CAAC,EAC1D,GAAI,CACF,IAAM,EAAS,MAAM,EAAiB,CAAC,OAAO,CAAE,GAChD,MAAO,CAAE,SAAS,SAAM,CAAO,CACjC,CAAE,MAAO,EAAO,CACd,MAAO,CACL,SAAS,EACT,MAAO,aAAiB,MAAQ,EAAM,OAAO,CAAG,OAAO,EACzD,CACF,CACF,CAKO,eAAe,EAAQ,EAA+B,CAAC,CAAC,EAC7D,GAAI,CACF,IAAM,EAAS,MAAM,EAAiB,CAAC,UAAU,CAAE,GACnD,MAAO,CAAE,QAAS,GAAM,QAAO,CACjC,CAAE,MAAO,EAAO,CACd,MAAO,CACL,SAAS,EACT,MAAO,aAAiB,MAAQ,EAAM,OAAO,CAAG,OAAO,EACzD,CACF,CACF,CAKO,eAAe,EAAO,EAA+B,CAAC,CAAC,EAC5D,GAAI,CACF,IAAM,EAAS,MAAM,EAAiB,CAAC,SAAS,CAAE,GAClD,MAAO,CAAE,QAAS,UAAM,CAAO,CACjC,CAAE,MAAO,EAAO,CACd,MAAO,CACL,SAAS,EACT,MAAO,aAAiB,MAAQ,EAAM,OAAO,CAAG,OAAO,EACzD,CACF,CACF,CAKO,eAAe,EAAM,EAA+B,CAAC,CAAC,EAC3D,GAAI,CACF,IAAM,EAAS,MAAM,EAAiB,CAAC,QAAQ,CAAE,GACjD,MAAO,CAAE,SAAS,SAAM,CAAO,CACjC,CAAE,MAAO,EAAO,CACd,MAAO,CACL,SAAS,EACT,MAAO,aAAiB,MAAQ,EAAM,OAAO,CAAG,OAAO,EACzD,CACF,CACF,CAKO,eAAe,EAAc,EAA+B,CAAC,CAAC,EACnE,GAAI,CAEF,MAAO,CADQ,MAAM,EAAiB,CAAC,MAAM,CAAE,EAAA,EACjC,IAAI,EACpB,CAAE,KAAM,CACN,OAAO,IACT,CACF,CAKO,eAAe,EAAS,EAA+B,CAAC,CAAC,EAC9D,GAAI,CAEF,MAAO,CADQ,MAAM,EAAiB,CAAC,QAAQ,CAAE,EAAA,EACnC,IAAI,EACpB,CAAE,KAAM,CACN,OAAO,IACT,CACF,CAKO,eAAe,EAAS,CAAkB,CAAE,EAA+B,CAAC,CAAC,EAClF,GAAI,CACF,IAAM,EAAS,MAAM,EAAiB,CAAC,WAAY,EAAW,CAAE,GAChE,MAAO,CAAE,SAAS,SAAM,CAAO,CACjC,CAAE,MAAO,EAAO,CACd,MAAO,CACL,SAAS,EACT,MAAO,aAAiB,MAAQ,EAAM,OAAO,CAAG,OAAO,EACzD,CACF,CACF,CAKO,eAAe,EACpB,CAAgB,CAChB,EAAsD,CAAC,CAAC,EAExD,GAAI,CACF,IAAM,EAAO,CAAC,OAAQ,EAAS,CAC3B,EAAQ,OAAO,EAAE,AACnB,EAAK,IAAI,CAAC,YAAa,OAAO,EAAQ,OAAO,GAE/C,IAAM,EAAS,MAAM,EAAiB,EAAM,GAC5C,MAAO,CAAE,SAAS,SAAM,CAAO,CACjC,CAAE,MAAO,EAAO,CACd,MAAO,CACL,SAAS,EACT,MAAO,aAAiB,MAAQ,EAAM,OAAO,CAAG,OAAO,EACzD,CACF,CACF,CAKO,SAAS,IACd,GAAI,CACF,IAAM,EAAmB,IAGzB,MADA,CAAA,EAAA,EAAA,QAAA,AAAQ,EAAC,CAAC,CAAC,EAAE,EAAiB,QAAQ,CAAC,CAAE,CAAE,MAAO,MAAO,IAClD,CACT,CAAE,KAAM,CACN,OAAO,CACT,CACF,CAKO,SAAS,IACd,OAAO,GACT"}
1
+ {"version":3,"sources":["../../../../src/utils/agent-browser.ts"],"sourcesContent":["/**\n * Wrapper for agent-browser CLI\n *\n * Provides a TypeScript interface to agent-browser commands for browser automation.\n * Uses the CLI approach for reliability and to leverage agent-browser's daemon architecture.\n */\n\nimport { execSync, spawn } from \"child_process\"\nimport { existsSync, mkdirSync } from \"fs\"\nimport { dirname, join } from \"path\"\nimport { fileURLToPath } from \"url\"\n\n// Find the agent-browser binary in node_modules\nfunction getAgentBrowserPath(): string {\n // 1. Check environment variable first (set by d3k when starting MCP server)\n if (process.env.AGENT_BROWSER_PATH && existsSync(process.env.AGENT_BROWSER_PATH)) {\n return process.env.AGENT_BROWSER_PATH\n }\n\n // Build search paths from multiple starting points\n const searchPaths: string[] = []\n\n // 2. Try import.meta.url-based paths (works in dev, may not work in Next.js bundle)\n try {\n const currentFile = fileURLToPath(import.meta.url)\n const currentDir = dirname(currentFile)\n\n // Only use these paths if currentDir looks like a real filesystem path\n // (Next.js/Turbopack rewrites import.meta.url to virtual paths like \"src/utils/...\")\n if (currentDir.startsWith(\"/\") || currentDir.match(/^[A-Z]:\\\\/i)) {\n searchPaths.push(\n // Relative to src/utils/ or dist/utils/\n join(dirname(dirname(currentDir)), \"node_modules\", \".bin\", \"agent-browser\"),\n // MCP server's node_modules\n join(currentDir, \"..\", \"..\", \"..\", \"mcp-server\", \"node_modules\", \".bin\", \"agent-browser\"),\n join(dirname(dirname(currentDir)), \"mcp-server\", \"node_modules\", \".bin\", \"agent-browser\"),\n // Global installed platform package\n join(currentDir, \"..\", \"..\", \"..\", \"..\", \"mcp-server\", \"node_modules\", \".bin\", \"agent-browser\"),\n join(currentDir, \"..\", \"..\", \"node_modules\", \".bin\", \"agent-browser\")\n )\n }\n } catch {\n // import.meta.url not available or invalid, skip these paths\n }\n\n // 3. Use process.cwd() as fallback - essential for Next.js bundled code\n // When running as MCP server, cwd is typically the mcp-server directory\n const cwd = process.cwd()\n searchPaths.push(\n // Direct node_modules (when cwd is mcp-server/)\n join(cwd, \"node_modules\", \".bin\", \"agent-browser\"),\n // Parent's mcp-server (when cwd is package root)\n join(cwd, \"mcp-server\", \"node_modules\", \".bin\", \"agent-browser\"),\n // Sibling mcp-server (when cwd is somewhere else in the package)\n join(cwd, \"..\", \"mcp-server\", \"node_modules\", \".bin\", \"agent-browser\")\n )\n\n for (const searchPath of searchPaths) {\n if (existsSync(searchPath)) {\n return searchPath\n }\n }\n\n // Fallback to global command (may work if installed globally)\n return \"agent-browser\"\n}\n\nexport interface AgentBrowserOptions {\n /** Run in headed mode (visible browser window) */\n headed?: boolean\n /** Connect to existing browser via CDP port */\n cdpPort?: number\n /** Session name for isolation */\n session?: string\n /** Timeout in milliseconds */\n timeout?: number\n /** Path to persistent browser profile directory (stores cookies, localStorage, etc.) */\n profile?: string\n}\n\nexport interface SnapshotElement {\n ref: string\n role: string\n name?: string\n text?: string\n}\n\nexport interface SnapshotResult {\n elements: SnapshotElement[]\n raw: string\n}\n\nexport interface ScreenshotResult {\n success: boolean\n path?: string\n error?: string\n}\n\nexport interface ActionResult {\n success: boolean\n output?: string\n error?: string\n}\n\n/**\n * Build CLI args from options\n */\nfunction buildArgs(options: AgentBrowserOptions): string[] {\n const args: string[] = []\n\n if (options.headed) {\n args.push(\"--headed\")\n }\n\n if (options.cdpPort) {\n args.push(\"--cdp\", String(options.cdpPort))\n }\n\n if (options.session) {\n args.push(\"--session\", options.session)\n }\n\n // NOTE: --profile flag is not yet supported by agent-browser CLI\n // Keeping the option in the interface for future compatibility\n // if (options.profile) {\n // args.push(\"--profile\", options.profile)\n // }\n\n // Always use JSON output for parsing\n args.push(\"--json\")\n\n return args\n}\n\n/**\n * Execute an agent-browser command\n */\nasync function execAgentBrowser(command: string[], options: AgentBrowserOptions = {}): Promise<string> {\n const args = [...buildArgs(options), ...command]\n const timeout = options.timeout || 30000\n const agentBrowserPath = getAgentBrowserPath()\n\n return new Promise((resolve, reject) => {\n const proc = spawn(agentBrowserPath, args, {\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n timeout\n })\n\n let stdout = \"\"\n let stderr = \"\"\n\n proc.stdout?.on(\"data\", (data) => {\n stdout += data.toString()\n })\n\n proc.stderr?.on(\"data\", (data) => {\n stderr += data.toString()\n })\n\n proc.on(\"close\", (code) => {\n if (code === 0) {\n resolve(stdout)\n } else {\n reject(new Error(`agent-browser failed (code ${code}): ${stderr || stdout}`))\n }\n })\n\n proc.on(\"error\", (err) => {\n reject(new Error(`agent-browser spawn error: ${err.message}`))\n })\n })\n}\n\n/**\n * Open a URL in the browser\n */\nexport async function openUrl(url: string, options: AgentBrowserOptions = {}): Promise<ActionResult> {\n try {\n const output = await execAgentBrowser([\"open\", url], options)\n return { success: true, output }\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : String(error)\n }\n }\n}\n\n/**\n * Take a snapshot of the current page (accessibility tree with refs)\n */\nexport async function snapshot(\n options: AgentBrowserOptions & { interactive?: boolean; compact?: boolean } = {}\n): Promise<SnapshotResult> {\n const args = [\"snapshot\"]\n\n // -i for interactive elements only (reduces tokens)\n if (options.interactive !== false) {\n args.push(\"-i\")\n }\n\n // -c for compact output\n if (options.compact) {\n args.push(\"-c\")\n }\n\n const output = await execAgentBrowser(args, options)\n\n // Parse the JSON output to extract elements\n const elements: SnapshotElement[] = []\n\n try {\n const parsed = JSON.parse(output)\n if (parsed.success && parsed.data?.refs) {\n for (const [ref, info] of Object.entries(parsed.data.refs)) {\n const refInfo = info as { name?: string; role?: string; text?: string }\n elements.push({\n ref: `@${ref}`,\n role: refInfo.role || \"unknown\",\n name: refInfo.name,\n text: refInfo.text\n })\n }\n }\n return { elements, raw: parsed.data?.snapshot || output }\n } catch {\n // Fallback to text parsing if JSON fails\n const refPattern = /@(\\w+)\\s+(\\w+)(?:\\s+\"([^\"]*)\")?/g\n const matches = output.matchAll(refPattern)\n\n for (const match of matches) {\n elements.push({\n ref: `@${match[1]}`,\n role: match[2],\n name: match[3]\n })\n }\n\n return { elements, raw: output }\n }\n}\n\n/**\n * Click an element by ref or selector\n */\nexport async function click(target: string, options: AgentBrowserOptions = {}): Promise<ActionResult> {\n try {\n const output = await execAgentBrowser([\"click\", target], options)\n return { success: true, output }\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : String(error)\n }\n }\n}\n\n/**\n * Type text into the focused element\n */\nexport async function type(text: string, options: AgentBrowserOptions = {}): Promise<ActionResult> {\n try {\n const output = await execAgentBrowser([\"type\", text], options)\n return { success: true, output }\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : String(error)\n }\n }\n}\n\n/**\n * Fill an input field (by ref or selector)\n */\nexport async function fill(target: string, value: string, options: AgentBrowserOptions = {}): Promise<ActionResult> {\n try {\n const output = await execAgentBrowser([\"fill\", target, value], options)\n return { success: true, output }\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : String(error)\n }\n }\n}\n\n/**\n * Scroll the page\n */\nexport async function scroll(\n direction: \"up\" | \"down\" | \"left\" | \"right\",\n amount?: number,\n options: AgentBrowserOptions = {}\n): Promise<ActionResult> {\n try {\n const args = [\"scroll\", direction]\n if (amount) {\n args.push(String(amount))\n }\n const output = await execAgentBrowser(args, options)\n return { success: true, output }\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : String(error)\n }\n }\n}\n\n/**\n * Take a screenshot\n */\nexport async function screenshot(\n outputPath: string,\n options: AgentBrowserOptions & { fullPage?: boolean } = {}\n): Promise<ScreenshotResult> {\n try {\n // Ensure output directory exists\n const dir = dirname(outputPath)\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true })\n }\n\n const args = [\"screenshot\", outputPath]\n if (options.fullPage) {\n args.push(\"--full-page\")\n }\n\n await execAgentBrowser(args, options)\n return { success: true, path: outputPath }\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : String(error)\n }\n }\n}\n\n/**\n * Get console messages from the browser\n */\nexport async function getConsoleMessages(options: AgentBrowserOptions = {}): Promise<string[]> {\n try {\n const output = await execAgentBrowser([\"console\"], options)\n // Parse JSON output\n const parsed = JSON.parse(output)\n return Array.isArray(parsed) ? parsed : []\n } catch {\n return []\n }\n}\n\n/**\n * Get page errors\n */\nexport async function getErrors(options: AgentBrowserOptions = {}): Promise<string[]> {\n try {\n const output = await execAgentBrowser([\"errors\"], options)\n const parsed = JSON.parse(output)\n return Array.isArray(parsed) ? parsed : []\n } catch {\n return []\n }\n}\n\n/**\n * Navigate back\n */\nexport async function back(options: AgentBrowserOptions = {}): Promise<ActionResult> {\n try {\n const output = await execAgentBrowser([\"back\"], options)\n return { success: true, output }\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : String(error)\n }\n }\n}\n\n/**\n * Navigate forward\n */\nexport async function forward(options: AgentBrowserOptions = {}): Promise<ActionResult> {\n try {\n const output = await execAgentBrowser([\"forward\"], options)\n return { success: true, output }\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : String(error)\n }\n }\n}\n\n/**\n * Reload the page\n */\nexport async function reload(options: AgentBrowserOptions = {}): Promise<ActionResult> {\n try {\n const output = await execAgentBrowser([\"reload\"], options)\n return { success: true, output }\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : String(error)\n }\n }\n}\n\n/**\n * Close the browser\n */\nexport async function close(options: AgentBrowserOptions = {}): Promise<ActionResult> {\n try {\n const output = await execAgentBrowser([\"close\"], options)\n return { success: true, output }\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : String(error)\n }\n }\n}\n\n/**\n * Get the current URL\n */\nexport async function getCurrentUrl(options: AgentBrowserOptions = {}): Promise<string | null> {\n try {\n const output = await execAgentBrowser([\"url\"], options)\n return output.trim()\n } catch {\n return null\n }\n}\n\n/**\n * Get page title\n */\nexport async function getTitle(options: AgentBrowserOptions = {}): Promise<string | null> {\n try {\n const output = await execAgentBrowser([\"title\"], options)\n return output.trim()\n } catch {\n return null\n }\n}\n\n/**\n * Evaluate JavaScript in the browser\n */\nexport async function evaluate(expression: string, options: AgentBrowserOptions = {}): Promise<ActionResult> {\n try {\n const output = await execAgentBrowser([\"evaluate\", expression], options)\n return { success: true, output }\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : String(error)\n }\n }\n}\n\n/**\n * Wait for an element to appear\n */\nexport async function waitFor(\n selector: string,\n options: AgentBrowserOptions & { timeout?: number } = {}\n): Promise<ActionResult> {\n try {\n const args = [\"wait\", selector]\n if (options.timeout) {\n args.push(\"--timeout\", String(options.timeout))\n }\n const output = await execAgentBrowser(args, options)\n return { success: true, output }\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : String(error)\n }\n }\n}\n\n/**\n * Check if agent-browser is installed and accessible\n */\nexport function isAgentBrowserAvailable(): boolean {\n try {\n const agentBrowserPath = getAgentBrowserPath()\n // agent-browser doesn't have --version, just check if the binary exists and responds to --help\n execSync(`\"${agentBrowserPath}\" --help`, { stdio: \"pipe\" })\n return true\n } catch {\n return false\n }\n}\n\n/**\n * Get agent-browser path for debugging\n */\nexport function getAgentBrowserBinaryPath(): string {\n return getAgentBrowserPath()\n}\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ module.exports=[2502,e=>{"use strict";var t=e.i(54799),c=e.i(22734),s=e.i(46786),a=e.i(14747);function i(e=process.cwd()){let s=null,r=(0,a.join)(e,"package.json");if((0,c.existsSync)(r))try{let e=JSON.parse((0,c.readFileSync)(r,"utf8"));e.name&&(s=e.name)}catch{}if(!s){let t=(0,a.join)(e,"pyproject.toml");if((0,c.existsSync)(t))try{let e=(0,c.readFileSync)(t,"utf8").match(/^\s*name\s*=\s*["']([^"']+)["']/m);e?.[1]&&(s=e[1])}catch{}}if(!s){let t=(0,a.join)(e,"setup.py");if((0,c.existsSync)(t))try{let e=(0,c.readFileSync)(t,"utf8").match(/name\s*=\s*["']([^"']+)["']/m);e?.[1]&&(s=e[1])}catch{}}if(!s){let t=(0,a.join)(e,"config","application.rb");if((0,c.existsSync)(t))try{let e=(0,c.readFileSync)(t,"utf8").match(/^\s*module\s+(\w+)/m);e?.[1]&&(s=e[1])}catch{}}if(!s){let t=(0,a.basename)(e);if(["www","app","src","frontend","backend","client","server","web"].includes(t.toLowerCase())){let c=(0,a.basename)((0,a.dirname)(e));s=`${c}-${t}`}else s=t}let n=(0,t.createHash)("sha256").update(e).digest("hex").substring(0,6);return(s=`${s}-${n}`).toLowerCase().replace(/[^a-zA-Z0-9-_]/g,"-").replace(/-+/g,"-").replace(/^-|-$/g,"").substring(0,50)}function r(e=process.cwd()){return i(e).replace(/-[a-f0-9]{6}$/,"")}function n(e=process.cwd()){let t=i(e);return(0,a.join)((0,s.homedir)(),".d3k",t)}e.s(["getProjectDir",()=>n,"getProjectDisplayName",()=>r,"getProjectName",()=>i])}];
2
+
3
+ //# sourceMappingURL=src_utils_project-name_ts_1fab1dd5._.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../src/utils/project-name.ts"],"sourcesContent":["import { createHash } from \"crypto\"\nimport { existsSync, readFileSync } from \"fs\"\nimport { homedir } from \"os\"\nimport { basename, dirname, join } from \"path\"\n\n/**\n * Generate a unique project name based on various sources\n * Priority order:\n * 1. package.json name (Node.js)\n * 2. pyproject.toml name (Python)\n * 3. Rails app name from config/application.rb\n * 4. Directory name + partial path hash for uniqueness\n *\n * @param cwd Current working directory\n * @returns Sanitized unique project name\n */\nexport function getProjectName(cwd: string = process.cwd()): string {\n let projectName: string | null = null\n\n // Try Node.js package.json\n const packageJsonPath = join(cwd, \"package.json\")\n if (existsSync(packageJsonPath)) {\n try {\n const packageJson = JSON.parse(readFileSync(packageJsonPath, \"utf8\"))\n if (packageJson.name) {\n projectName = packageJson.name\n }\n } catch {\n // Ignore parse errors\n }\n }\n\n // Try Python pyproject.toml\n if (!projectName) {\n const pyprojectPath = join(cwd, \"pyproject.toml\")\n if (existsSync(pyprojectPath)) {\n try {\n const content = readFileSync(pyprojectPath, \"utf8\")\n // Simple regex to extract project name from pyproject.toml\n const match = content.match(/^\\s*name\\s*=\\s*[\"']([^\"']+)[\"']/m)\n if (match?.[1]) {\n projectName = match[1]\n }\n } catch {\n // Ignore read errors\n }\n }\n }\n\n // Try Python setup.py\n if (!projectName) {\n const setupPyPath = join(cwd, \"setup.py\")\n if (existsSync(setupPyPath)) {\n try {\n const content = readFileSync(setupPyPath, \"utf8\")\n // Look for name= in setup() call\n const match = content.match(/name\\s*=\\s*[\"']([^\"']+)[\"']/m)\n if (match?.[1]) {\n projectName = match[1]\n }\n } catch {\n // Ignore read errors\n }\n }\n }\n\n // Try Rails application name\n if (!projectName) {\n const railsAppPath = join(cwd, \"config\", \"application.rb\")\n if (existsSync(railsAppPath)) {\n try {\n const content = readFileSync(railsAppPath, \"utf8\")\n // Look for module declaration\n const match = content.match(/^\\s*module\\s+(\\w+)/m)\n if (match?.[1]) {\n projectName = match[1]\n }\n } catch {\n // Ignore read errors\n }\n }\n }\n\n // Fallback: use directory name with uniqueness suffix\n if (!projectName) {\n const dirName = basename(cwd)\n\n // If the directory name is too generic, add parent directory\n const genericNames = [\"www\", \"app\", \"src\", \"frontend\", \"backend\", \"client\", \"server\", \"web\"]\n if (genericNames.includes(dirName.toLowerCase())) {\n const parentDir = basename(dirname(cwd))\n projectName = `${parentDir}-${dirName}`\n } else {\n projectName = dirName\n }\n }\n\n // Always add a path hash to ensure uniqueness across different directories\n // that might have the same package.json name or directory name\n const pathHash = createHash(\"sha256\").update(cwd).digest(\"hex\").substring(0, 6)\n projectName = `${projectName}-${pathHash}`\n\n // Sanitize the project name (replace special chars, limit length)\n return projectName\n .toLowerCase()\n .replace(/[^a-zA-Z0-9-_]/g, \"-\") // Replace special chars with hyphens\n .replace(/-+/g, \"-\") // Collapse multiple hyphens\n .replace(/^-|-$/g, \"\") // Remove leading/trailing hyphens\n .substring(0, 50) // Limit length\n}\n\n/**\n * Get a display-friendly version of the project name\n * (without hash suffixes for better readability)\n */\nexport function getProjectDisplayName(cwd: string = process.cwd()): string {\n const fullName = getProjectName(cwd)\n // Remove hash suffix if present\n return fullName.replace(/-[a-f0-9]{6}$/, \"\")\n}\n\n/**\n * Get the d3k data directory for a project\n * All project-specific files are stored here: logs, chrome profile, skills, session info\n * Structure: ~/.d3k/{projectName}/\n */\nexport function getProjectDir(cwd: string = process.cwd()): string {\n const projectName = getProjectName(cwd)\n return join(homedir(), \".d3k\", projectName)\n}\n"],"names":[],"mappings":"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"}
@@ -1,3 +1,3 @@
1
- module.exports=[14747,(a,b,c)=>{b.exports=a.x("path",()=>require("path"))},18622,(a,b,c)=>{b.exports=a.x("next/dist/compiled/next-server/app-page-turbo.runtime.prod.js",()=>require("next/dist/compiled/next-server/app-page-turbo.runtime.prod.js"))},56704,(a,b,c)=>{b.exports=a.x("next/dist/server/app-render/work-async-storage.external.js",()=>require("next/dist/server/app-render/work-async-storage.external.js"))},32319,(a,b,c)=>{b.exports=a.x("next/dist/server/app-render/work-unit-async-storage.external.js",()=>require("next/dist/server/app-render/work-unit-async-storage.external.js"))},24725,(a,b,c)=>{b.exports=a.x("next/dist/server/app-render/after-task-async-storage.external.js",()=>require("next/dist/server/app-render/after-task-async-storage.external.js"))},20635,(a,b,c)=>{b.exports=a.x("next/dist/server/app-render/action-async-storage.external.js",()=>require("next/dist/server/app-render/action-async-storage.external.js"))},43285,(a,b,c)=>{b.exports=a.x("next/dist/server/app-render/dynamic-access-async-storage.external.js",()=>require("next/dist/server/app-render/dynamic-access-async-storage.external.js"))},24361,(a,b,c)=>{b.exports=a.x("util",()=>require("util"))},27694,(a,b,c)=>{"use strict";b.exports=a.r(35524).vendored["react-rsc"].ReactServerDOMTurbopackServer},35524,(a,b,c)=>{"use strict";b.exports=a.r(18622)},37709,(a,b,c)=>{"use strict";b.exports=a.r(35524).vendored["react-rsc"].ReactJsxRuntime},24650,(a,b,c)=>{"use strict";b.exports=a.r(35524).vendored["react-rsc"].React},71893,(a,b,c)=>{let{createClientModuleProxy:d}=a.r(27694);a.n(d("[project]/node_modules/.bun/next@16.1.0+32ae8776f2617d13/node_modules/next/dist/client/components/builtin/global-error.js <module evaluation>"))},68917,(a,b,c)=>{let{createClientModuleProxy:d}=a.r(27694);a.n(d("[project]/node_modules/.bun/next@16.1.0+32ae8776f2617d13/node_modules/next/dist/client/components/builtin/global-error.js"))},93007,a=>{"use strict";a.i(71893);var b=a.i(68917);a.n(b)}];
1
+ module.exports=[43285,(a,b,c)=>{b.exports=a.x("next/dist/server/app-render/dynamic-access-async-storage.external.js",()=>require("next/dist/server/app-render/dynamic-access-async-storage.external.js"))},18622,(a,b,c)=>{b.exports=a.x("next/dist/compiled/next-server/app-page-turbo.runtime.prod.js",()=>require("next/dist/compiled/next-server/app-page-turbo.runtime.prod.js"))},56704,(a,b,c)=>{b.exports=a.x("next/dist/server/app-render/work-async-storage.external.js",()=>require("next/dist/server/app-render/work-async-storage.external.js"))},32319,(a,b,c)=>{b.exports=a.x("next/dist/server/app-render/work-unit-async-storage.external.js",()=>require("next/dist/server/app-render/work-unit-async-storage.external.js"))},24725,(a,b,c)=>{b.exports=a.x("next/dist/server/app-render/after-task-async-storage.external.js",()=>require("next/dist/server/app-render/after-task-async-storage.external.js"))},20635,(a,b,c)=>{b.exports=a.x("next/dist/server/app-render/action-async-storage.external.js",()=>require("next/dist/server/app-render/action-async-storage.external.js"))},14747,(a,b,c)=>{b.exports=a.x("path",()=>require("path"))},24361,(a,b,c)=>{b.exports=a.x("util",()=>require("util"))},27694,(a,b,c)=>{"use strict";b.exports=a.r(35524).vendored["react-rsc"].ReactServerDOMTurbopackServer},35524,(a,b,c)=>{"use strict";b.exports=a.r(18622)},37709,(a,b,c)=>{"use strict";b.exports=a.r(35524).vendored["react-rsc"].ReactJsxRuntime},24650,(a,b,c)=>{"use strict";b.exports=a.r(35524).vendored["react-rsc"].React},71893,(a,b,c)=>{let{createClientModuleProxy:d}=a.r(27694);a.n(d("[project]/node_modules/.bun/next@16.1.0+32ae8776f2617d13/node_modules/next/dist/client/components/builtin/global-error.js <module evaluation>"))},68917,(a,b,c)=>{let{createClientModuleProxy:d}=a.r(27694);a.n(d("[project]/node_modules/.bun/next@16.1.0+32ae8776f2617d13/node_modules/next/dist/client/components/builtin/global-error.js"))},93007,a=>{"use strict";a.i(71893);var b=a.i(68917);a.n(b)}];
2
2
 
3
- //# sourceMappingURL=%5Broot-of-the-server%5D__f66148e5._.js.map
3
+ //# sourceMappingURL=%5Broot-of-the-server%5D__b17d4048._.js.map
@@ -1,3 +1,3 @@
1
- module.exports=[14747,(a,b,c)=>{b.exports=a.x("path",()=>require("path"))},18622,(a,b,c)=>{b.exports=a.x("next/dist/compiled/next-server/app-page-turbo.runtime.prod.js",()=>require("next/dist/compiled/next-server/app-page-turbo.runtime.prod.js"))},56704,(a,b,c)=>{b.exports=a.x("next/dist/server/app-render/work-async-storage.external.js",()=>require("next/dist/server/app-render/work-async-storage.external.js"))},32319,(a,b,c)=>{b.exports=a.x("next/dist/server/app-render/work-unit-async-storage.external.js",()=>require("next/dist/server/app-render/work-unit-async-storage.external.js"))},24725,(a,b,c)=>{b.exports=a.x("next/dist/server/app-render/after-task-async-storage.external.js",()=>require("next/dist/server/app-render/after-task-async-storage.external.js"))},20635,(a,b,c)=>{b.exports=a.x("next/dist/server/app-render/action-async-storage.external.js",()=>require("next/dist/server/app-render/action-async-storage.external.js"))},43285,(a,b,c)=>{b.exports=a.x("next/dist/server/app-render/dynamic-access-async-storage.external.js",()=>require("next/dist/server/app-render/dynamic-access-async-storage.external.js"))},24361,(a,b,c)=>{b.exports=a.x("util",()=>require("util"))},27694,(a,b,c)=>{"use strict";b.exports=a.r(35524).vendored["react-rsc"].ReactServerDOMTurbopackServer},35524,(a,b,c)=>{"use strict";b.exports=a.r(18622)},37709,(a,b,c)=>{"use strict";b.exports=a.r(35524).vendored["react-rsc"].ReactJsxRuntime},24650,(a,b,c)=>{"use strict";b.exports=a.r(35524).vendored["react-rsc"].React}];
1
+ module.exports=[43285,(a,b,c)=>{b.exports=a.x("next/dist/server/app-render/dynamic-access-async-storage.external.js",()=>require("next/dist/server/app-render/dynamic-access-async-storage.external.js"))},18622,(a,b,c)=>{b.exports=a.x("next/dist/compiled/next-server/app-page-turbo.runtime.prod.js",()=>require("next/dist/compiled/next-server/app-page-turbo.runtime.prod.js"))},56704,(a,b,c)=>{b.exports=a.x("next/dist/server/app-render/work-async-storage.external.js",()=>require("next/dist/server/app-render/work-async-storage.external.js"))},32319,(a,b,c)=>{b.exports=a.x("next/dist/server/app-render/work-unit-async-storage.external.js",()=>require("next/dist/server/app-render/work-unit-async-storage.external.js"))},24725,(a,b,c)=>{b.exports=a.x("next/dist/server/app-render/after-task-async-storage.external.js",()=>require("next/dist/server/app-render/after-task-async-storage.external.js"))},20635,(a,b,c)=>{b.exports=a.x("next/dist/server/app-render/action-async-storage.external.js",()=>require("next/dist/server/app-render/action-async-storage.external.js"))},14747,(a,b,c)=>{b.exports=a.x("path",()=>require("path"))},24361,(a,b,c)=>{b.exports=a.x("util",()=>require("util"))},27694,(a,b,c)=>{"use strict";b.exports=a.r(35524).vendored["react-rsc"].ReactServerDOMTurbopackServer},35524,(a,b,c)=>{"use strict";b.exports=a.r(18622)},37709,(a,b,c)=>{"use strict";b.exports=a.r(35524).vendored["react-rsc"].ReactJsxRuntime},24650,(a,b,c)=>{"use strict";b.exports=a.r(35524).vendored["react-rsc"].React}];
2
2
 
3
- //# sourceMappingURL=%5Broot-of-the-server%5D__50eb2eba._.js.map
3
+ //# sourceMappingURL=%5Broot-of-the-server%5D__dcf84f77._.js.map
@@ -1,3 +1,3 @@
1
- module.exports=[35543,a=>{"use strict";var b=a.i(37425),c=a.i(14177),d=a.i(87896);function e({className:a}){let d=(0,c.useId)(),e=(0,c.useId)(),f=(0,c.useId)(),g=(0,c.useId)(),h=(0,c.useId)(),i=(0,c.useId)();return(0,b.jsxs)(b.Fragment,{children:[(0,b.jsxs)("svg",{"aria-label":"Next.js logomark",className:`${a} block dark:hidden`,height:"16",role:"img",viewBox:"0 0 180 180",width:"16",children:[(0,b.jsx)("mask",{height:"180",id:d,maskUnits:"userSpaceOnUse",width:"180",x:"0",y:"0",style:{maskType:"alpha"},children:(0,b.jsx)("circle",{cx:"90",cy:"90",fill:"black",r:"90"})}),(0,b.jsxs)("g",{mask:`url(#${d})`,children:[(0,b.jsx)("circle",{cx:"90",cy:"90",fill:"black",r:"90"}),(0,b.jsx)("path",{d:"M149.508 157.52L69.142 54H54V125.97H66.1136V69.3836L139.999 164.845C143.333 162.614 146.509 160.165 149.508 157.52Z",fill:`url(#${e})`}),(0,b.jsx)("rect",{fill:`url(#${f})`,height:"72",width:"12",x:"115",y:"54"})]}),(0,b.jsxs)("defs",{children:[(0,b.jsxs)("linearGradient",{gradientUnits:"userSpaceOnUse",id:e,x1:"109",x2:"144.5",y1:"116.5",y2:"160.5",children:[(0,b.jsx)("stop",{stopColor:"white"}),(0,b.jsx)("stop",{offset:"1",stopColor:"white",stopOpacity:"0"})]}),(0,b.jsxs)("linearGradient",{gradientUnits:"userSpaceOnUse",id:f,x1:"121",x2:"120.799",y1:"54",y2:"106.875",children:[(0,b.jsx)("stop",{stopColor:"white"}),(0,b.jsx)("stop",{offset:"1",stopColor:"white",stopOpacity:"0"})]})]})]}),(0,b.jsxs)("svg",{"aria-label":"Next.js logomark",className:`${a} hidden dark:block`,height:"16",role:"img",viewBox:"0 0 180 180",width:"16",children:[(0,b.jsx)("mask",{height:"180",id:g,maskUnits:"userSpaceOnUse",width:"180",x:"0",y:"0",style:{maskType:"alpha"},children:(0,b.jsx)("circle",{cx:"90",cy:"90",fill:"black",r:"90"})}),(0,b.jsxs)("g",{mask:`url(#${g})`,children:[(0,b.jsx)("circle",{cx:"90",cy:"90",fill:"white",r:"90"}),(0,b.jsx)("path",{d:"M149.508 157.52L69.142 54H54V125.97H66.1136V69.3836L139.999 164.845C143.333 162.614 146.509 160.165 149.508 157.52Z",fill:`url(#${h})`}),(0,b.jsx)("rect",{fill:`url(#${i})`,height:"72",width:"12",x:"115",y:"54"})]}),(0,b.jsxs)("defs",{children:[(0,b.jsxs)("linearGradient",{gradientUnits:"userSpaceOnUse",id:h,x1:"109",x2:"144.5",y1:"116.5",y2:"160.5",children:[(0,b.jsx)("stop",{stopColor:"black"}),(0,b.jsx)("stop",{offset:"1",stopColor:"black",stopOpacity:"0"})]}),(0,b.jsxs)("linearGradient",{gradientUnits:"userSpaceOnUse",id:i,x1:"121",x2:"120.799",y1:"54",y2:"106.875",children:[(0,b.jsx)("stop",{stopColor:"black"}),(0,b.jsx)("stop",{offset:"1",stopColor:"black",stopOpacity:"0"})]})]})]})]})}function f({className:a}){let d=(0,c.useId)(),e=(0,c.useId)(),f=(0,c.useId)();return(0,b.jsxs)("svg",{className:a,viewBox:"0 0 48 48",height:"16",width:"16",xmlns:"http://www.w3.org/2000/svg",children:[(0,b.jsxs)("defs",{children:[(0,b.jsxs)("linearGradient",{id:d,x1:"3.2173",y1:"15",x2:"44.7812",y2:"15",gradientUnits:"userSpaceOnUse",children:[(0,b.jsx)("stop",{offset:"0",stopColor:"#d93025"}),(0,b.jsx)("stop",{offset:"1",stopColor:"#ea4335"})]}),(0,b.jsxs)("linearGradient",{id:e,x1:"20.7219",y1:"47.6791",x2:"41.5039",y2:"11.6837",gradientUnits:"userSpaceOnUse",children:[(0,b.jsx)("stop",{offset:"0",stopColor:"#fcc934"}),(0,b.jsx)("stop",{offset:"1",stopColor:"#fbbc04"})]}),(0,b.jsxs)("linearGradient",{id:f,x1:"26.5981",y1:"46.5015",x2:"5.8161",y2:"10.506",gradientUnits:"userSpaceOnUse",children:[(0,b.jsx)("stop",{offset:"0",stopColor:"#1e8e3e"}),(0,b.jsx)("stop",{offset:"1",stopColor:"#34a853"})]})]}),(0,b.jsx)("circle",{cx:"24",cy:"23.9947",r:"12",style:{fill:"#fff"}}),(0,b.jsx)("path",{d:"M3.2154,36A24,24,0,1,0,12,3.2154,24,24,0,0,0,3.2154,36ZM34.3923,18A12,12,0,1,1,18,13.6077,12,12,0,0,1,34.3923,18Z",style:{fill:"none"}}),(0,b.jsx)("path",{d:"M24,12H44.7812a23.9939,23.9939,0,0,0-41.5639.0029L13.6079,30l.0093-.0024A11.9852,11.9852,0,0,1,24,12Z",style:{fill:`url(#${d})`}}),(0,b.jsx)("circle",{cx:"24",cy:"24",r:"9.5",style:{fill:"#1a73e8"}}),(0,b.jsx)("path",{d:"M34.3913,30.0029,24.0007,48A23.994,23.994,0,0,0,44.78,12.0031H23.9989l-.0025.0093A11.985,11.985,0,0,1,34.3913,30.0029Z",style:{fill:`url(#${e})`}}),(0,b.jsx)("path",{d:"M13.6086,30.0031,3.218,12.006A23.994,23.994,0,0,0,24.0025,48L34.3931,30.0029l-.0067-.0068a11.9852,11.9852,0,0,1-20.7778.007Z",style:{fill:`url(#${f})`}})]})}var g=a.i(60019),h=a.i(18749);function i({className:a,...c}){return(0,b.jsx)("div",{"data-slot":"card",className:(0,h.cn)("bg-card text-card-foreground flex flex-col gap-6 rounded-xl border py-6 shadow-sm",a),...c})}function j({className:a,...c}){return(0,b.jsx)("div",{"data-slot":"card-header",className:(0,h.cn)("@container/card-header grid auto-rows-min grid-rows-[auto_auto] items-start gap-2 px-6 has-data-[slot=card-action]:grid-cols-[1fr_auto] [.border-b]:pb-6",a),...c})}function k({className:a,...c}){return(0,b.jsx)("div",{"data-slot":"card-title",className:(0,h.cn)("leading-none font-semibold",a),...c})}function l({className:a,...c}){return(0,b.jsx)("div",{"data-slot":"card-content",className:(0,h.cn)("px-6",a),...c})}function m({className:a,...c}){return(0,b.jsx)("div",{"data-slot":"skeleton",className:(0,h.cn)("bg-accent animate-pulse rounded-md",a),...c})}var n=a.i(37825);function o(){let[a,h]=(0,c.useState)(null),[o,p]=(0,c.useState)(null),[q,r]=(0,c.useState)(!0),[s,t]=(0,n.useDarkMode)();return(0,c.useEffect)(()=>{Promise.all([fetch("/api/tools"),fetch("/api/orchestrator")]).then(([a,b])=>Promise.all([a.json(),b.json()])).then(([a,b])=>{h(a),p(b),r(!1)}).catch(()=>{r(!1)})},[]),(0,b.jsxs)("div",{className:"min-h-screen bg-background text-foreground",children:[(0,b.jsx)("header",{className:"bg-muted/30 border-b border-border",children:(0,b.jsx)("div",{className:"max-w-7xl mx-auto px-6 py-8",children:(0,b.jsxs)("div",{className:"flex items-center justify-between",children:[(0,b.jsx)("div",{children:(0,b.jsxs)("div",{className:"flex items-center gap-4 mb-3",children:[(0,b.jsx)("div",{className:"w-12 h-12 bg-foreground rounded flex items-center justify-center",children:(0,b.jsx)("span",{className:"text-background font-mono font-bold",children:"d3k"})}),(0,b.jsxs)("div",{children:[(0,b.jsx)("h1",{className:"text-3xl font-bold",children:"dev3000 MCP Server"}),(0,b.jsxs)("div",{className:"flex items-center gap-3 mt-2",children:[(0,b.jsxs)("span",{className:"inline-flex items-center gap-2 text-sm text-green-600 font-medium",children:[(0,b.jsx)("span",{className:"w-2 h-2 bg-green-500 rounded-full"}),"Server Running"]}),(0,b.jsx)("span",{className:"text-muted-foreground",children:"•"}),(0,b.jsxs)("span",{className:"text-sm text-muted-foreground",children:["Port ",process.env.PORT||"3684"]})]})]})]})}),(0,b.jsxs)("div",{className:"flex items-center gap-4",children:[(0,b.jsx)(g.Button,{variant:"outline",asChild:!0,children:(0,b.jsx)("a",{href:"https://github.com/vercel-labs/dev3000#setup",target:"_blank",rel:"noopener noreferrer",children:"📖 Setup Guide"})}),(0,b.jsx)(d.DarkModeToggle,{darkMode:s,setDarkMode:t})]})]})})}),(0,b.jsxs)("main",{className:"max-w-7xl mx-auto px-6 py-8",children:[(0,b.jsx)("section",{className:"mb-16",children:(0,b.jsxs)(i,{className:"bg-accent/10 border-accent/20",children:[(0,b.jsx)(j,{children:(0,b.jsx)(k,{children:"🔌 MCP Connections"})}),(0,b.jsx)(l,{children:q?(0,b.jsxs)("div",{className:"h-[120px] space-y-4",children:[(0,b.jsx)(m,{className:"h-4 w-3/4"}),(0,b.jsx)(m,{className:"h-12 w-1/2"})]}):o?(0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)("p",{className:"text-sm text-muted-foreground mb-4",children:o.message}),o.totalConnections>0?(0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)("div",{className:"flex flex-wrap gap-3 mb-4",children:o.mcpDetails.map(a=>{let c="chrome-devtools"===a.name?f:"nextjs-dev"===a.name?e:null;return(0,b.jsxs)("div",{className:"inline-flex items-center gap-2 bg-background/50 border border-border rounded px-3 py-2",children:[c&&(0,b.jsx)(c,{className:"shrink-0"}),(0,b.jsx)("span",{className:"font-semibold font-mono text-sm",children:a.name}),(0,b.jsx)("span",{className:"w-2 h-2 bg-green-500 rounded-full"})]},a.name)})}),o.totalProjects>0&&(0,b.jsxs)("div",{className:"text-sm text-muted-foreground",children:[(0,b.jsx)("span",{className:"font-medium",children:"Active projects:"})," ",o.projects.map((a,c)=>(0,b.jsxs)("span",{children:[(0,b.jsx)("code",{className:"text-foreground bg-background/50 px-1.5 py-0.5 rounded",children:a}),c<o.projects.length-1&&", "]},a))]})]}):(0,b.jsxs)("div",{className:"text-sm text-muted-foreground bg-background/50 border border-border rounded p-4",children:[(0,b.jsx)("p",{className:"mb-2",children:"⏳ Waiting for downstream MCPs to become available..."}),(0,b.jsxs)("p",{className:"text-xs",children:["dev3000 will automatically connect to ",(0,b.jsx)("code",{className:"text-foreground",children:"chrome-devtools"})," ","and ",(0,b.jsx)("code",{className:"text-foreground",children:"nextjs-dev"})," MCPs when Chrome and your dev server start."]})]})]}):null})]})}),(0,b.jsxs)(i,{className:"bg-accent/10 border-accent/20",children:[(0,b.jsx)(j,{children:(0,b.jsx)(k,{children:"🛠️ dev3000 Tools"})}),(0,b.jsx)(l,{children:q?(0,b.jsx)("div",{className:"grid gap-6 lg:grid-cols-2",children:[1,2].map(a=>(0,b.jsxs)("div",{className:"bg-background/50 border border-border rounded-lg p-6 h-[600px]",children:[(0,b.jsx)(m,{className:"h-6 w-3/4 mb-4"}),(0,b.jsxs)("div",{className:"space-y-2",children:[(0,b.jsx)(m,{className:"h-4 w-full"}),(0,b.jsx)(m,{className:"h-4 w-5/6"}),(0,b.jsx)(m,{className:"h-4 w-4/6"})]})]},a))}):a?(0,b.jsx)("div",{className:"grid gap-6 lg:grid-cols-2",children:a.tools.map(a=>{var c;let d,e,f,g;return(0,b.jsxs)("div",{id:a.name,className:"bg-background/50 border border-border rounded-lg p-6 hover:border-muted-foreground/50 transition-colors",children:[(0,b.jsxs)("div",{className:"mb-4",children:[(0,b.jsx)("h4",{className:"text-xl font-semibold font-mono mb-3",children:a.name}),(0,b.jsx)("div",{className:"text-muted-foreground space-y-3",children:(c=a.description,d=a=>a.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/(^-|-$)/g,""),e=c.split("\n\n").filter(a=>a.trim()),f=new Map,g=a=>{let b=f.get(a)??0;return f.set(a,b+1),0===b?a:`${a}-${b}`},e.map((a,c)=>{let e=g(d(a)||"section"),f=a;if((f=(f=f.replace(/\*\*/g,"").trim()).replace(/(\u{1F300}-\u{1F9FF}|\u{2600}-\u{26FF}|\u{1F900}-\u{1F9FF})+/gu,a=>a.charAt(0))).includes(":")){let[a,...c]=f.split(":"),h=a.trim(),i=c.join(":").trim();if(i.includes("•")){let a=i.split("•").filter(a=>a.trim()),c=`${e}-bullets`;return(0,b.jsxs)("div",{children:[(0,b.jsx)("h5",{className:"font-semibold mb-2",children:h}),(0,b.jsx)("ul",{className:"space-y-1 ml-4",children:a.map(a=>{let e=g(`${c}-item-${d(a).slice(0,40)||"bullet"}`);return(0,b.jsxs)("li",{className:"flex items-start",children:[(0,b.jsx)("span",{className:"text-muted-foreground mr-2",children:"•"}),(0,b.jsx)("span",{className:"text-muted-foreground text-sm",children:a.trim()})]},e)})})]},c)}return(0,b.jsxs)("div",{children:[(0,b.jsx)("h5",{className:"font-semibold mb-1",children:h}),(0,b.jsx)("p",{className:"text-muted-foreground text-sm ml-4",children:i})]},`${e}-content`)}if(f.match(/^\d+[\ud83c-\ud83e][\udc00-\udfff]|^\d+\./m)){let a=f.split(/\n/).filter(a=>a.trim());return(0,b.jsx)("ol",{className:"space-y-1 ml-4",children:a.map((a,c)=>{let f=a.replace(/^\d+[\ud83c-\ud83e][\udc00-\udfff]\s*/,"").replace(/^\d+\.\s*/,"").trim();return(0,b.jsxs)("li",{className:"text-muted-foreground text-sm",children:[c+1,". ",f]},g(`${e}-step-${d(f).slice(0,40)||"step"}`))})},`${e}-steps`)}return(0,b.jsx)("p",{className:"text-muted-foreground text-sm leading-relaxed",children:f},`${e}-paragraph`)}))})]}),a.parameters.length>0&&(0,b.jsxs)("div",{children:[(0,b.jsx)("h5",{className:"text-sm font-semibold mb-3",children:"Parameters:"}),(0,b.jsx)("div",{className:"space-y-2",children:a.parameters.map(a=>(0,b.jsxs)("div",{className:"text-sm",children:[(0,b.jsxs)("div",{className:"flex items-start gap-2",children:[(0,b.jsx)("span",{className:"font-mono text-primary font-medium",children:a.name}),(0,b.jsx)("span",{className:"text-muted-foreground text-xs",children:a.optional?"(optional)":"(required)"}),(0,b.jsxs)("span",{className:"text-muted-foreground/70 text-xs",children:["- ",a.type]})]}),a.description&&(0,b.jsx)("div",{className:"text-muted-foreground ml-1 mt-1 text-sm",children:a.description})]},a.name))})]})]},a.name)})}):(0,b.jsxs)("div",{className:"text-center py-16",children:[(0,b.jsx)("p",{className:"text-destructive mb-6",children:"Failed to load tool documentation"}),(0,b.jsx)(g.Button,{onClick:()=>window.location.reload(),children:"Retry"})]})})]}),(0,b.jsxs)(i,{className:"mt-20 bg-gradient-to-r from-primary/10 to-secondary/10",children:[(0,b.jsx)(j,{children:(0,b.jsx)(k,{className:"text-2xl",children:"🪄 The Magic Workflow"})}),(0,b.jsx)(l,{children:(0,b.jsxs)("div",{className:"grid md:grid-cols-3 gap-8",children:[(0,b.jsxs)("div",{className:"text-center",children:[(0,b.jsx)("div",{className:"w-16 h-16 bg-primary/20 rounded-full flex items-center justify-center mx-auto mb-4 shadow-md",children:(0,b.jsx)("span",{className:"text-primary font-bold text-2xl",children:"1"})}),(0,b.jsx)("h3",{className:"font-semibold mb-3 text-lg",children:"AI Finds Issues"}),(0,b.jsx)("p",{className:"text-muted-foreground leading-relaxed",children:"fix_my_app automatically detects all types of errors and problems in your app"})]}),(0,b.jsxs)("div",{className:"text-center",children:[(0,b.jsx)("div",{className:"w-16 h-16 bg-accent/20 rounded-full flex items-center justify-center mx-auto mb-4 shadow-md",children:(0,b.jsx)("span",{className:"text-accent-foreground font-bold text-2xl",children:"2"})}),(0,b.jsx)("h3",{className:"font-semibold mb-3 text-lg",children:"AI Fixes Code"}),(0,b.jsx)("p",{className:"text-muted-foreground leading-relaxed",children:"AI analyzes errors and edits your code files to resolve issues"})]}),(0,b.jsxs)("div",{className:"text-center",children:[(0,b.jsx)("div",{className:"w-16 h-16 bg-green-500/20 rounded-full flex items-center justify-center mx-auto mb-4 shadow-md",children:(0,b.jsx)("span",{className:"text-green-600 dark:text-green-400 font-bold text-2xl",children:"3"})}),(0,b.jsx)("h3",{className:"font-semibold mb-3 text-lg",children:"AI Verifies Fixes"}),(0,b.jsx)("p",{className:"text-muted-foreground leading-relaxed",children:"execute_browser_action tests the fixes in real-time with screenshots"})]})]})})]})]}),(0,b.jsx)("footer",{className:"border-t border-border mt-20",children:(0,b.jsx)("div",{className:"max-w-7xl mx-auto px-6 py-8",children:(0,b.jsxs)("div",{className:"flex items-center justify-between text-sm text-muted-foreground",children:[(0,b.jsxs)("div",{children:[(0,b.jsx)("span",{className:"font-semibold",children:"dev3000 MCP Server"})," - AI-powered development monitoring"]}),(0,b.jsxs)("div",{className:"flex items-center gap-8",children:[(0,b.jsx)("a",{href:"https://github.com/vercel-labs/dev3000",target:"_blank",rel:"noopener noreferrer",className:"hover:text-foreground transition-colors",children:"GitHub"}),(0,b.jsx)("a",{href:"https://dev3000.ai",target:"_blank",rel:"noopener noreferrer",className:"hover:text-foreground transition-colors",children:"Homepage"})]})]})})})]})}a.s(["default",()=>o],35543)}];
1
+ module.exports=[35543,a=>{"use strict";var b=a.i(37425),c=a.i(14177),d=a.i(87896);function e({className:a}){let d=(0,c.useId)(),e=(0,c.useId)(),f=(0,c.useId)(),g=(0,c.useId)(),h=(0,c.useId)(),i=(0,c.useId)();return(0,b.jsxs)(b.Fragment,{children:[(0,b.jsxs)("svg",{"aria-label":"Next.js logomark",className:`${a} block dark:hidden`,height:"16",role:"img",viewBox:"0 0 180 180",width:"16",children:[(0,b.jsx)("mask",{height:"180",id:d,maskUnits:"userSpaceOnUse",width:"180",x:"0",y:"0",style:{maskType:"alpha"},children:(0,b.jsx)("circle",{cx:"90",cy:"90",fill:"black",r:"90"})}),(0,b.jsxs)("g",{mask:`url(#${d})`,children:[(0,b.jsx)("circle",{cx:"90",cy:"90",fill:"black",r:"90"}),(0,b.jsx)("path",{d:"M149.508 157.52L69.142 54H54V125.97H66.1136V69.3836L139.999 164.845C143.333 162.614 146.509 160.165 149.508 157.52Z",fill:`url(#${e})`}),(0,b.jsx)("rect",{fill:`url(#${f})`,height:"72",width:"12",x:"115",y:"54"})]}),(0,b.jsxs)("defs",{children:[(0,b.jsxs)("linearGradient",{gradientUnits:"userSpaceOnUse",id:e,x1:"109",x2:"144.5",y1:"116.5",y2:"160.5",children:[(0,b.jsx)("stop",{stopColor:"white"}),(0,b.jsx)("stop",{offset:"1",stopColor:"white",stopOpacity:"0"})]}),(0,b.jsxs)("linearGradient",{gradientUnits:"userSpaceOnUse",id:f,x1:"121",x2:"120.799",y1:"54",y2:"106.875",children:[(0,b.jsx)("stop",{stopColor:"white"}),(0,b.jsx)("stop",{offset:"1",stopColor:"white",stopOpacity:"0"})]})]})]}),(0,b.jsxs)("svg",{"aria-label":"Next.js logomark",className:`${a} hidden dark:block`,height:"16",role:"img",viewBox:"0 0 180 180",width:"16",children:[(0,b.jsx)("mask",{height:"180",id:g,maskUnits:"userSpaceOnUse",width:"180",x:"0",y:"0",style:{maskType:"alpha"},children:(0,b.jsx)("circle",{cx:"90",cy:"90",fill:"black",r:"90"})}),(0,b.jsxs)("g",{mask:`url(#${g})`,children:[(0,b.jsx)("circle",{cx:"90",cy:"90",fill:"white",r:"90"}),(0,b.jsx)("path",{d:"M149.508 157.52L69.142 54H54V125.97H66.1136V69.3836L139.999 164.845C143.333 162.614 146.509 160.165 149.508 157.52Z",fill:`url(#${h})`}),(0,b.jsx)("rect",{fill:`url(#${i})`,height:"72",width:"12",x:"115",y:"54"})]}),(0,b.jsxs)("defs",{children:[(0,b.jsxs)("linearGradient",{gradientUnits:"userSpaceOnUse",id:h,x1:"109",x2:"144.5",y1:"116.5",y2:"160.5",children:[(0,b.jsx)("stop",{stopColor:"black"}),(0,b.jsx)("stop",{offset:"1",stopColor:"black",stopOpacity:"0"})]}),(0,b.jsxs)("linearGradient",{gradientUnits:"userSpaceOnUse",id:i,x1:"121",x2:"120.799",y1:"54",y2:"106.875",children:[(0,b.jsx)("stop",{stopColor:"black"}),(0,b.jsx)("stop",{offset:"1",stopColor:"black",stopOpacity:"0"})]})]})]})]})}function f({className:a}){let d=(0,c.useId)(),e=(0,c.useId)(),f=(0,c.useId)();return(0,b.jsxs)("svg",{className:a,viewBox:"0 0 48 48",height:"16",width:"16",xmlns:"http://www.w3.org/2000/svg",children:[(0,b.jsxs)("defs",{children:[(0,b.jsxs)("linearGradient",{id:d,x1:"3.2173",y1:"15",x2:"44.7812",y2:"15",gradientUnits:"userSpaceOnUse",children:[(0,b.jsx)("stop",{offset:"0",stopColor:"#d93025"}),(0,b.jsx)("stop",{offset:"1",stopColor:"#ea4335"})]}),(0,b.jsxs)("linearGradient",{id:e,x1:"20.7219",y1:"47.6791",x2:"41.5039",y2:"11.6837",gradientUnits:"userSpaceOnUse",children:[(0,b.jsx)("stop",{offset:"0",stopColor:"#fcc934"}),(0,b.jsx)("stop",{offset:"1",stopColor:"#fbbc04"})]}),(0,b.jsxs)("linearGradient",{id:f,x1:"26.5981",y1:"46.5015",x2:"5.8161",y2:"10.506",gradientUnits:"userSpaceOnUse",children:[(0,b.jsx)("stop",{offset:"0",stopColor:"#1e8e3e"}),(0,b.jsx)("stop",{offset:"1",stopColor:"#34a853"})]})]}),(0,b.jsx)("circle",{cx:"24",cy:"23.9947",r:"12",style:{fill:"#fff"}}),(0,b.jsx)("path",{d:"M3.2154,36A24,24,0,1,0,12,3.2154,24,24,0,0,0,3.2154,36ZM34.3923,18A12,12,0,1,1,18,13.6077,12,12,0,0,1,34.3923,18Z",style:{fill:"none"}}),(0,b.jsx)("path",{d:"M24,12H44.7812a23.9939,23.9939,0,0,0-41.5639.0029L13.6079,30l.0093-.0024A11.9852,11.9852,0,0,1,24,12Z",style:{fill:`url(#${d})`}}),(0,b.jsx)("circle",{cx:"24",cy:"24",r:"9.5",style:{fill:"#1a73e8"}}),(0,b.jsx)("path",{d:"M34.3913,30.0029,24.0007,48A23.994,23.994,0,0,0,44.78,12.0031H23.9989l-.0025.0093A11.985,11.985,0,0,1,34.3913,30.0029Z",style:{fill:`url(#${e})`}}),(0,b.jsx)("path",{d:"M13.6086,30.0031,3.218,12.006A23.994,23.994,0,0,0,24.0025,48L34.3931,30.0029l-.0067-.0068a11.9852,11.9852,0,0,1-20.7778.007Z",style:{fill:`url(#${f})`}})]})}var g=a.i(60019),h=a.i(18749);function i({className:a,...c}){return(0,b.jsx)("div",{"data-slot":"card",className:(0,h.cn)("bg-card text-card-foreground flex flex-col gap-6 rounded-xl border py-6 shadow-sm",a),...c})}function j({className:a,...c}){return(0,b.jsx)("div",{"data-slot":"card-header",className:(0,h.cn)("@container/card-header grid auto-rows-min grid-rows-[auto_auto] items-start gap-2 px-6 has-data-[slot=card-action]:grid-cols-[1fr_auto] [.border-b]:pb-6",a),...c})}function k({className:a,...c}){return(0,b.jsx)("div",{"data-slot":"card-title",className:(0,h.cn)("leading-none font-semibold",a),...c})}function l({className:a,...c}){return(0,b.jsx)("div",{"data-slot":"card-content",className:(0,h.cn)("px-6",a),...c})}function m({className:a,...c}){return(0,b.jsx)("div",{"data-slot":"skeleton",className:(0,h.cn)("bg-accent animate-pulse rounded-md",a),...c})}var n=a.i(37825);function o(){let[a,h]=(0,c.useState)(null),[o,p]=(0,c.useState)(null),[q,r]=(0,c.useState)(!0),[s,t]=(0,n.useDarkMode)();return(0,c.useEffect)(()=>{Promise.all([fetch("/api/tools"),fetch("/api/orchestrator")]).then(([a,b])=>Promise.all([a.json(),b.json()])).then(([a,b])=>{h(a),p(b),r(!1)}).catch(()=>{r(!1)})},[]),(0,b.jsxs)("div",{className:"min-h-screen bg-background text-foreground",children:[(0,b.jsx)("header",{className:"bg-muted/30 border-b border-border",children:(0,b.jsx)("div",{className:"max-w-7xl mx-auto px-6 py-8",children:(0,b.jsxs)("div",{className:"flex items-center justify-between",children:[(0,b.jsx)("div",{children:(0,b.jsxs)("div",{className:"flex items-center gap-4 mb-3",children:[(0,b.jsx)("div",{className:"w-12 h-12 bg-foreground rounded flex items-center justify-center",children:(0,b.jsx)("span",{className:"text-background font-mono font-bold",children:"d3k"})}),(0,b.jsxs)("div",{children:[(0,b.jsx)("h1",{className:"text-3xl font-bold",children:"dev3000 MCP Server"}),(0,b.jsxs)("div",{className:"flex items-center gap-3 mt-2",children:[(0,b.jsxs)("span",{className:"inline-flex items-center gap-2 text-sm text-green-600 font-medium",children:[(0,b.jsx)("span",{className:"w-2 h-2 bg-green-500 rounded-full"}),"Server Running"]}),(0,b.jsx)("span",{className:"text-muted-foreground",children:"•"}),(0,b.jsxs)("span",{className:"text-sm text-muted-foreground",children:["Port ",process.env.PORT||"3684"]})]})]})]})}),(0,b.jsxs)("div",{className:"flex items-center gap-4",children:[(0,b.jsx)(g.Button,{variant:"outline",asChild:!0,children:(0,b.jsx)("a",{href:"https://github.com/vercel-labs/dev3000#setup",target:"_blank",rel:"noopener noreferrer",children:"📖 Setup Guide"})}),(0,b.jsx)(d.DarkModeToggle,{darkMode:s,setDarkMode:t})]})]})})}),(0,b.jsxs)("main",{className:"max-w-7xl mx-auto px-6 py-8",children:[(0,b.jsx)("section",{className:"mb-16",children:(0,b.jsxs)(i,{className:"bg-accent/10 border-accent/20",children:[(0,b.jsx)(j,{children:(0,b.jsx)(k,{children:"🔌 MCP Connections"})}),(0,b.jsx)(l,{children:q?(0,b.jsxs)("div",{className:"h-[120px] space-y-4",children:[(0,b.jsx)(m,{className:"h-4 w-3/4"}),(0,b.jsx)(m,{className:"h-12 w-1/2"})]}):o?(0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)("p",{className:"text-sm text-muted-foreground mb-4",children:o.message}),o.totalConnections>0?(0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)("div",{className:"flex flex-wrap gap-3 mb-4",children:o.mcpDetails.map(a=>{let c="chrome-devtools"===a.name?f:"nextjs-dev"===a.name?e:null;return(0,b.jsxs)("div",{className:"inline-flex items-center gap-2 bg-background/50 border border-border rounded px-3 py-2",children:[c&&(0,b.jsx)(c,{className:"shrink-0"}),(0,b.jsx)("span",{className:"font-semibold font-mono text-sm",children:a.name}),(0,b.jsx)("span",{className:"w-2 h-2 bg-green-500 rounded-full"})]},a.name)})}),o.totalProjects>0&&(0,b.jsxs)("div",{className:"text-sm text-muted-foreground",children:[(0,b.jsx)("span",{className:"font-medium",children:"Active projects:"})," ",o.projects.map((a,c)=>(0,b.jsxs)("span",{children:[(0,b.jsx)("code",{className:"text-foreground bg-background/50 px-1.5 py-0.5 rounded",children:a}),c<o.projects.length-1&&", "]},a))]})]}):(0,b.jsxs)("div",{className:"text-sm text-muted-foreground bg-background/50 border border-border rounded p-4",children:[(0,b.jsx)("p",{className:"mb-2",children:"⏳ Waiting for downstream MCPs to become available..."}),(0,b.jsxs)("p",{className:"text-xs",children:["dev3000 will automatically connect to ",(0,b.jsx)("code",{className:"text-foreground",children:"chrome-devtools"})," ","and ",(0,b.jsx)("code",{className:"text-foreground",children:"nextjs-dev"})," MCPs when Chrome and your dev server start."]})]})]}):null})]})}),(0,b.jsxs)(i,{className:"bg-accent/10 border-accent/20",children:[(0,b.jsx)(j,{children:(0,b.jsx)(k,{children:"🛠️ dev3000 Tools"})}),(0,b.jsx)(l,{children:q?(0,b.jsx)("div",{className:"grid gap-6 lg:grid-cols-2",children:[1,2].map(a=>(0,b.jsxs)("div",{className:"bg-background/50 border border-border rounded-lg p-6 h-[600px]",children:[(0,b.jsx)(m,{className:"h-6 w-3/4 mb-4"}),(0,b.jsxs)("div",{className:"space-y-2",children:[(0,b.jsx)(m,{className:"h-4 w-full"}),(0,b.jsx)(m,{className:"h-4 w-5/6"}),(0,b.jsx)(m,{className:"h-4 w-4/6"})]})]},a))}):a?(0,b.jsx)("div",{className:"grid gap-6 lg:grid-cols-2",children:a.tools.map(a=>{var c;let d,e,f,g;return(0,b.jsxs)("div",{id:a.name,className:"bg-background/50 border border-border rounded-lg p-6 hover:border-muted-foreground/50 transition-colors",children:[(0,b.jsxs)("div",{className:"mb-4",children:[(0,b.jsx)("h4",{className:"text-xl font-semibold font-mono mb-3",children:a.name}),(0,b.jsx)("div",{className:"text-muted-foreground space-y-3",children:(c=a.description,d=a=>a.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/(^-|-$)/g,""),e=c.split("\n\n").filter(a=>a.trim()),f=new Map,g=a=>{let b=f.get(a)??0;return f.set(a,b+1),0===b?a:`${a}-${b}`},e.map((a,c)=>{let e=g(d(a)||"section"),f=a;if((f=(f=f.replace(/\*\*/g,"").trim()).replace(/(\u{1F300}-\u{1F9FF}|\u{2600}-\u{26FF}|\u{1F900}-\u{1F9FF})+/gu,a=>a.charAt(0))).includes(":")){let[a,...c]=f.split(":"),h=a.trim(),i=c.join(":").trim();if(i.includes("•")){let a=i.split("•").filter(a=>a.trim()),c=`${e}-bullets`;return(0,b.jsxs)("div",{children:[(0,b.jsx)("h5",{className:"font-semibold mb-2",children:h}),(0,b.jsx)("ul",{className:"space-y-1 ml-4",children:a.map(a=>{let e=g(`${c}-item-${d(a).slice(0,40)||"bullet"}`);return(0,b.jsxs)("li",{className:"flex items-start",children:[(0,b.jsx)("span",{className:"text-muted-foreground mr-2",children:"•"}),(0,b.jsx)("span",{className:"text-muted-foreground text-sm",children:a.trim()})]},e)})})]},c)}return(0,b.jsxs)("div",{children:[(0,b.jsx)("h5",{className:"font-semibold mb-1",children:h}),(0,b.jsx)("p",{className:"text-muted-foreground text-sm ml-4",children:i})]},`${e}-content`)}if(f.match(/^\d+[\ud83c-\ud83e][\udc00-\udfff]|^\d+\./m)){let a=f.split(/\n/).filter(a=>a.trim());return(0,b.jsx)("ol",{className:"space-y-1 ml-4",children:a.map((a,c)=>{let f=a.replace(/^\d+[\ud83c-\ud83e][\udc00-\udfff]\s*/,"").replace(/^\d+\.\s*/,"").trim();return(0,b.jsxs)("li",{className:"text-muted-foreground text-sm",children:[c+1,". ",f]},g(`${e}-step-${d(f).slice(0,40)||"step"}`))})},`${e}-steps`)}return(0,b.jsx)("p",{className:"text-muted-foreground text-sm leading-relaxed",children:f},`${e}-paragraph`)}))})]}),a.parameters.length>0&&(0,b.jsxs)("div",{children:[(0,b.jsx)("h5",{className:"text-sm font-semibold mb-3",children:"Parameters:"}),(0,b.jsx)("div",{className:"space-y-2",children:a.parameters.map(a=>(0,b.jsxs)("div",{className:"text-sm",children:[(0,b.jsxs)("div",{className:"flex items-start gap-2",children:[(0,b.jsx)("span",{className:"font-mono text-primary font-medium",children:a.name}),(0,b.jsx)("span",{className:"text-muted-foreground text-xs",children:a.optional?"(optional)":"(required)"}),(0,b.jsxs)("span",{className:"text-muted-foreground/70 text-xs",children:["- ",a.type]})]}),a.description&&(0,b.jsx)("div",{className:"text-muted-foreground ml-1 mt-1 text-sm",children:a.description})]},a.name))})]})]},a.name)})}):(0,b.jsxs)("div",{className:"text-center py-16",children:[(0,b.jsx)("p",{className:"text-destructive mb-6",children:"Failed to load tool documentation"}),(0,b.jsx)(g.Button,{onClick:()=>window.location.reload(),children:"Retry"})]})})]}),(0,b.jsxs)(i,{className:"mt-20 bg-gradient-to-r from-primary/10 to-secondary/10",children:[(0,b.jsx)(j,{children:(0,b.jsx)(k,{className:"text-2xl",children:"🪄 The Magic Workflow"})}),(0,b.jsx)(l,{children:(0,b.jsxs)("div",{className:"grid md:grid-cols-3 gap-8",children:[(0,b.jsxs)("div",{className:"text-center",children:[(0,b.jsx)("div",{className:"w-16 h-16 bg-primary/20 rounded-full flex items-center justify-center mx-auto mb-4 shadow-md",children:(0,b.jsx)("span",{className:"text-primary font-bold text-2xl",children:"1"})}),(0,b.jsx)("h3",{className:"font-semibold mb-3 text-lg",children:"AI Finds Issues"}),(0,b.jsx)("p",{className:"text-muted-foreground leading-relaxed",children:"fix_my_app automatically detects all types of errors and problems in your app"})]}),(0,b.jsxs)("div",{className:"text-center",children:[(0,b.jsx)("div",{className:"w-16 h-16 bg-accent/20 rounded-full flex items-center justify-center mx-auto mb-4 shadow-md",children:(0,b.jsx)("span",{className:"text-accent-foreground font-bold text-2xl",children:"2"})}),(0,b.jsx)("h3",{className:"font-semibold mb-3 text-lg",children:"AI Fixes Code"}),(0,b.jsx)("p",{className:"text-muted-foreground leading-relaxed",children:"AI analyzes errors and edits your code files to resolve issues"})]}),(0,b.jsxs)("div",{className:"text-center",children:[(0,b.jsx)("div",{className:"w-16 h-16 bg-green-500/20 rounded-full flex items-center justify-center mx-auto mb-4 shadow-md",children:(0,b.jsx)("span",{className:"text-green-600 dark:text-green-400 font-bold text-2xl",children:"3"})}),(0,b.jsx)("h3",{className:"font-semibold mb-3 text-lg",children:"AI Verifies Fixes"}),(0,b.jsx)("p",{className:"text-muted-foreground leading-relaxed",children:"agent_browser_action tests the fixes in real-time with screenshots"})]})]})})]})]}),(0,b.jsx)("footer",{className:"border-t border-border mt-20",children:(0,b.jsx)("div",{className:"max-w-7xl mx-auto px-6 py-8",children:(0,b.jsxs)("div",{className:"flex items-center justify-between text-sm text-muted-foreground",children:[(0,b.jsxs)("div",{children:[(0,b.jsx)("span",{className:"font-semibold",children:"dev3000 MCP Server"})," - AI-powered development monitoring"]}),(0,b.jsxs)("div",{className:"flex items-center gap-8",children:[(0,b.jsx)("a",{href:"https://github.com/vercel-labs/dev3000",target:"_blank",rel:"noopener noreferrer",className:"hover:text-foreground transition-colors",children:"GitHub"}),(0,b.jsx)("a",{href:"https://dev3000.ai",target:"_blank",rel:"noopener noreferrer",className:"hover:text-foreground transition-colors",children:"Homepage"})]})]})})})]})}a.s(["default",()=>o],35543)}];
2
2
 
3
3
  //# sourceMappingURL=mcp-server_app_page_tsx_9fc46577._.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../mcp-server/app/page.tsx","../../../../../mcp-server/components/mcp-icons.tsx","../../../../../mcp-server/components/ui/card.tsx","../../../../../mcp-server/components/ui/skeleton.tsx"],"sourcesContent":["\"use client\"\n\nimport { useEffect, useState } from \"react\"\nimport { DarkModeToggle } from \"@/components/dark-mode-toggle\"\nimport { ChromeIcon, NextJsIcon } from \"@/components/mcp-icons\"\nimport { Button } from \"@/components/ui/button\"\nimport { Card, CardContent, CardHeader, CardTitle } from \"@/components/ui/card\"\nimport { Skeleton } from \"@/components/ui/skeleton\"\nimport { useDarkMode } from \"@/hooks/use-dark-mode\"\n\ninterface MCPTool {\n name: string\n description: string\n category: string\n parameters: Array<{\n name: string\n type: string\n optional?: boolean\n description: string\n }>\n}\n\ninterface ToolsResponse {\n tools: MCPTool[]\n endpoint: string\n totalTools: number\n categories: string[]\n}\n\ninterface OrchestratorResponse {\n orchestratorEnabled: boolean\n connectedMCPs: string[]\n totalConnections: number\n mcpDetails: Array<{\n name: string\n connected: boolean\n toolCount: number\n tools: string[]\n projects: string[]\n }>\n totalProjects: number\n projects: string[]\n message: string\n}\n\n// Format tool descriptions by parsing markdown-style sections\nfunction formatToolDescription(description: string) {\n const slugify = (value: string) =>\n value\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/(^-|-$)/g, \"\")\n\n // Split by double newline to get sections\n const sections = description.split(\"\\n\\n\").filter((section) => section.trim())\n const keyCounts = new Map<string, number>()\n\n const getUniqueKey = (base: string) => {\n const count = keyCounts.get(base) ?? 0\n keyCounts.set(base, count + 1)\n return count === 0 ? base : `${base}-${count}`\n }\n\n return sections.map((rawSection, _idx) => {\n const normalizedKey = getUniqueKey(slugify(rawSection) || \"section\")\n let section = rawSection\n\n // Remove markdown formatting\n section = section.replace(/\\*\\*/g, \"\").trim()\n\n // Remove excessive emojis\n section = section.replace(/(\\u{1F300}-\\u{1F9FF}|\\u{2600}-\\u{26FF}|\\u{1F900}-\\u{1F9FF})+/gu, (match) => {\n return match.charAt(0)\n })\n\n // Handle different section types\n if (section.includes(\":\")) {\n // This is a header with content\n const [header, ...contentParts] = section.split(\":\")\n const cleanHeader = header.trim()\n const content = contentParts.join(\":\").trim()\n\n // Check if content has bullet points\n if (content.includes(\"•\")) {\n const items = content.split(\"•\").filter((item) => item.trim())\n const sectionKey = `${normalizedKey}-bullets`\n return (\n <div key={sectionKey}>\n <h5 className=\"font-semibold mb-2\">{cleanHeader}</h5>\n <ul className=\"space-y-1 ml-4\">\n {items.map((item) => {\n const itemKey = getUniqueKey(`${sectionKey}-item-${slugify(item).slice(0, 40) || \"bullet\"}`)\n return (\n <li key={itemKey} className=\"flex items-start\">\n <span className=\"text-muted-foreground mr-2\">•</span>\n <span className=\"text-muted-foreground text-sm\">{item.trim()}</span>\n </li>\n )\n })}\n </ul>\n </div>\n )\n }\n\n return (\n <div key={`${normalizedKey}-content`}>\n <h5 className=\"font-semibold mb-1\">{cleanHeader}</h5>\n <p className=\"text-muted-foreground text-sm ml-4\">{content}</p>\n </div>\n )\n }\n\n // Handle numbered lists (like workflow steps)\n if (section.match(/^\\d+[\\ud83c-\\ud83e][\\udc00-\\udfff]|^\\d+\\./m)) {\n const items = section.split(/\\n/).filter((item) => item.trim())\n return (\n <ol className=\"space-y-1 ml-4\" key={`${normalizedKey}-steps`}>\n {items.map((item, itemIdx) => {\n const cleanItem = item\n .replace(/^\\d+[\\ud83c-\\ud83e][\\udc00-\\udfff]\\s*/, \"\")\n .replace(/^\\d+\\.\\s*/, \"\")\n .trim()\n return (\n <li\n key={getUniqueKey(`${normalizedKey}-step-${slugify(cleanItem).slice(0, 40) || \"step\"}`)}\n className=\"text-muted-foreground text-sm\"\n >\n {itemIdx + 1}. {cleanItem}\n </li>\n )\n })}\n </ol>\n )\n }\n\n // Default paragraph\n return (\n <p key={`${normalizedKey}-paragraph`} className=\"text-muted-foreground text-sm leading-relaxed\">\n {section}\n </p>\n )\n })\n}\n\nexport default function HomePage() {\n const [tools, setTools] = useState<ToolsResponse | null>(null)\n const [orchestrator, setOrchestrator] = useState<OrchestratorResponse | null>(null)\n const [loading, setLoading] = useState(true)\n const [darkMode, setDarkMode] = useDarkMode()\n\n useEffect(() => {\n // Fetch both tools and orchestrator status in parallel\n Promise.all([fetch(\"/api/tools\"), fetch(\"/api/orchestrator\")])\n .then(([toolsRes, orchRes]) => Promise.all([toolsRes.json(), orchRes.json()]))\n .then(([toolsData, orchData]) => {\n setTools(toolsData)\n setOrchestrator(orchData)\n setLoading(false)\n })\n .catch(() => {\n setLoading(false)\n })\n }, [])\n\n return (\n <div className=\"min-h-screen bg-background text-foreground\">\n {/* Header */}\n <header className=\"bg-muted/30 border-b border-border\">\n <div className=\"max-w-7xl mx-auto px-6 py-8\">\n <div className=\"flex items-center justify-between\">\n <div>\n <div className=\"flex items-center gap-4 mb-3\">\n <div className=\"w-12 h-12 bg-foreground rounded flex items-center justify-center\">\n <span className=\"text-background font-mono font-bold\">d3k</span>\n </div>\n <div>\n <h1 className=\"text-3xl font-bold\">dev3000 MCP Server</h1>\n <div className=\"flex items-center gap-3 mt-2\">\n <span className=\"inline-flex items-center gap-2 text-sm text-green-600 font-medium\">\n <span className=\"w-2 h-2 bg-green-500 rounded-full\"></span>\n Server Running\n </span>\n <span className=\"text-muted-foreground\">•</span>\n <span className=\"text-sm text-muted-foreground\">Port {process.env.PORT || \"3684\"}</span>\n </div>\n </div>\n </div>\n </div>\n <div className=\"flex items-center gap-4\">\n <Button variant=\"outline\" asChild>\n <a href=\"https://github.com/vercel-labs/dev3000#setup\" target=\"_blank\" rel=\"noopener noreferrer\">\n 📖 Setup Guide\n </a>\n </Button>\n <DarkModeToggle darkMode={darkMode} setDarkMode={setDarkMode} />\n </div>\n </div>\n </div>\n </header>\n\n {/* Main Content - no sidebar needed with only 2 tools */}\n <main className=\"max-w-7xl mx-auto px-6 py-8\">\n {/* MCP Connections Status */}\n <section className=\"mb-16\">\n <Card className=\"bg-accent/10 border-accent/20\">\n <CardHeader>\n <CardTitle>🔌 MCP Connections</CardTitle>\n </CardHeader>\n <CardContent>\n {loading ? (\n <div className=\"h-[120px] space-y-4\">\n <Skeleton className=\"h-4 w-3/4\" />\n <Skeleton className=\"h-12 w-1/2\" />\n </div>\n ) : orchestrator ? (\n <>\n <p className=\"text-sm text-muted-foreground mb-4\">{orchestrator.message}</p>\n\n {orchestrator.totalConnections > 0 ? (\n <>\n <div className=\"flex flex-wrap gap-3 mb-4\">\n {orchestrator.mcpDetails.map((mcp) => {\n const Icon =\n mcp.name === \"chrome-devtools\" ? ChromeIcon : mcp.name === \"nextjs-dev\" ? NextJsIcon : null\n return (\n <div\n key={mcp.name}\n className=\"inline-flex items-center gap-2 bg-background/50 border border-border rounded px-3 py-2\"\n >\n {Icon && <Icon className=\"shrink-0\" />}\n <span className=\"font-semibold font-mono text-sm\">{mcp.name}</span>\n <span className=\"w-2 h-2 bg-green-500 rounded-full\"></span>\n </div>\n )\n })}\n </div>\n {orchestrator.totalProjects > 0 && (\n <div className=\"text-sm text-muted-foreground\">\n <span className=\"font-medium\">Active projects:</span>{\" \"}\n {orchestrator.projects.map((project, idx) => (\n <span key={project}>\n <code className=\"text-foreground bg-background/50 px-1.5 py-0.5 rounded\">{project}</code>\n {idx < orchestrator.projects.length - 1 && \", \"}\n </span>\n ))}\n </div>\n )}\n </>\n ) : (\n <div className=\"text-sm text-muted-foreground bg-background/50 border border-border rounded p-4\">\n <p className=\"mb-2\">⏳ Waiting for downstream MCPs to become available...</p>\n <p className=\"text-xs\">\n dev3000 will automatically connect to <code className=\"text-foreground\">chrome-devtools</code>{\" \"}\n and <code className=\"text-foreground\">nextjs-dev</code> MCPs when Chrome and your dev server\n start.\n </p>\n </div>\n )}\n </>\n ) : null}\n </CardContent>\n </Card>\n </section>\n\n {/* Tools Documentation */}\n <Card className=\"bg-accent/10 border-accent/20\">\n <CardHeader>\n <CardTitle>🛠️ dev3000 Tools</CardTitle>\n </CardHeader>\n <CardContent>\n {loading ? (\n <div className=\"grid gap-6 lg:grid-cols-2\">\n {/* Skeleton loading states */}\n {[1, 2].map((i) => (\n <div key={i} className=\"bg-background/50 border border-border rounded-lg p-6 h-[600px]\">\n <Skeleton className=\"h-6 w-3/4 mb-4\" />\n <div className=\"space-y-2\">\n <Skeleton className=\"h-4 w-full\" />\n <Skeleton className=\"h-4 w-5/6\" />\n <Skeleton className=\"h-4 w-4/6\" />\n </div>\n </div>\n ))}\n </div>\n ) : tools ? (\n <div className=\"grid gap-6 lg:grid-cols-2\">\n {tools.tools.map((tool) => (\n <div\n key={tool.name}\n id={tool.name}\n className=\"bg-background/50 border border-border rounded-lg p-6 hover:border-muted-foreground/50 transition-colors\"\n >\n <div className=\"mb-4\">\n <h4 className=\"text-xl font-semibold font-mono mb-3\">{tool.name}</h4>\n <div className=\"text-muted-foreground space-y-3\">{formatToolDescription(tool.description)}</div>\n </div>\n {tool.parameters.length > 0 && (\n <div>\n <h5 className=\"text-sm font-semibold mb-3\">Parameters:</h5>\n <div className=\"space-y-2\">\n {tool.parameters.map((param) => (\n <div key={param.name} className=\"text-sm\">\n <div className=\"flex items-start gap-2\">\n <span className=\"font-mono text-primary font-medium\">{param.name}</span>\n <span className=\"text-muted-foreground text-xs\">\n {param.optional ? \"(optional)\" : \"(required)\"}\n </span>\n <span className=\"text-muted-foreground/70 text-xs\">- {param.type}</span>\n </div>\n {param.description && (\n <div className=\"text-muted-foreground ml-1 mt-1 text-sm\">{param.description}</div>\n )}\n </div>\n ))}\n </div>\n </div>\n )}\n </div>\n ))}\n </div>\n ) : (\n <div className=\"text-center py-16\">\n <p className=\"text-destructive mb-6\">Failed to load tool documentation</p>\n <Button onClick={() => window.location.reload()}>Retry</Button>\n </div>\n )}\n </CardContent>\n </Card>\n\n {/* Magic Workflow */}\n <Card className=\"mt-20 bg-gradient-to-r from-primary/10 to-secondary/10\">\n <CardHeader>\n <CardTitle className=\"text-2xl\">🪄 The Magic Workflow</CardTitle>\n </CardHeader>\n <CardContent>\n <div className=\"grid md:grid-cols-3 gap-8\">\n <div className=\"text-center\">\n <div className=\"w-16 h-16 bg-primary/20 rounded-full flex items-center justify-center mx-auto mb-4 shadow-md\">\n <span className=\"text-primary font-bold text-2xl\">1</span>\n </div>\n <h3 className=\"font-semibold mb-3 text-lg\">AI Finds Issues</h3>\n <p className=\"text-muted-foreground leading-relaxed\">\n fix_my_app automatically detects all types of errors and problems in your app\n </p>\n </div>\n <div className=\"text-center\">\n <div className=\"w-16 h-16 bg-accent/20 rounded-full flex items-center justify-center mx-auto mb-4 shadow-md\">\n <span className=\"text-accent-foreground font-bold text-2xl\">2</span>\n </div>\n <h3 className=\"font-semibold mb-3 text-lg\">AI Fixes Code</h3>\n <p className=\"text-muted-foreground leading-relaxed\">\n AI analyzes errors and edits your code files to resolve issues\n </p>\n </div>\n <div className=\"text-center\">\n <div className=\"w-16 h-16 bg-green-500/20 rounded-full flex items-center justify-center mx-auto mb-4 shadow-md\">\n <span className=\"text-green-600 dark:text-green-400 font-bold text-2xl\">3</span>\n </div>\n <h3 className=\"font-semibold mb-3 text-lg\">AI Verifies Fixes</h3>\n <p className=\"text-muted-foreground leading-relaxed\">\n execute_browser_action tests the fixes in real-time with screenshots\n </p>\n </div>\n </div>\n </CardContent>\n </Card>\n </main>\n\n {/* Footer */}\n <footer className=\"border-t border-border mt-20\">\n <div className=\"max-w-7xl mx-auto px-6 py-8\">\n <div className=\"flex items-center justify-between text-sm text-muted-foreground\">\n <div>\n <span className=\"font-semibold\">dev3000 MCP Server</span> - AI-powered development monitoring\n </div>\n <div className=\"flex items-center gap-8\">\n <a\n href=\"https://github.com/vercel-labs/dev3000\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"hover:text-foreground transition-colors\"\n >\n GitHub\n </a>\n <a\n href=\"https://dev3000.ai\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"hover:text-foreground transition-colors\"\n >\n Homepage\n </a>\n </div>\n </div>\n </div>\n </footer>\n </div>\n )\n}\n","import { useId } from \"react\"\n\nexport function NextJsIcon({ className }: { className?: string }) {\n const lightMaskId = useId()\n const lightPaint0Id = useId()\n const lightPaint1Id = useId()\n const darkMaskId = useId()\n const darkPaint0Id = useId()\n const darkPaint1Id = useId()\n\n return (\n <>\n {/* Light mode */}\n <svg\n aria-label=\"Next.js logomark\"\n className={`${className} block dark:hidden`}\n height=\"16\"\n role=\"img\"\n viewBox=\"0 0 180 180\"\n width=\"16\"\n >\n <mask\n height=\"180\"\n id={lightMaskId}\n maskUnits=\"userSpaceOnUse\"\n width=\"180\"\n x=\"0\"\n y=\"0\"\n style={{ maskType: \"alpha\" }}\n >\n <circle cx=\"90\" cy=\"90\" fill=\"black\" r=\"90\" />\n </mask>\n <g mask={`url(#${lightMaskId})`}>\n <circle cx=\"90\" cy=\"90\" fill=\"black\" r=\"90\" />\n <path\n d=\"M149.508 157.52L69.142 54H54V125.97H66.1136V69.3836L139.999 164.845C143.333 162.614 146.509 160.165 149.508 157.52Z\"\n fill={`url(#${lightPaint0Id})`}\n />\n <rect fill={`url(#${lightPaint1Id})`} height=\"72\" width=\"12\" x=\"115\" y=\"54\" />\n </g>\n <defs>\n <linearGradient gradientUnits=\"userSpaceOnUse\" id={lightPaint0Id} x1=\"109\" x2=\"144.5\" y1=\"116.5\" y2=\"160.5\">\n <stop stopColor=\"white\" />\n <stop offset=\"1\" stopColor=\"white\" stopOpacity=\"0\" />\n </linearGradient>\n <linearGradient gradientUnits=\"userSpaceOnUse\" id={lightPaint1Id} x1=\"121\" x2=\"120.799\" y1=\"54\" y2=\"106.875\">\n <stop stopColor=\"white\" />\n <stop offset=\"1\" stopColor=\"white\" stopOpacity=\"0\" />\n </linearGradient>\n </defs>\n </svg>\n\n {/* Dark mode */}\n <svg\n aria-label=\"Next.js logomark\"\n className={`${className} hidden dark:block`}\n height=\"16\"\n role=\"img\"\n viewBox=\"0 0 180 180\"\n width=\"16\"\n >\n <mask\n height=\"180\"\n id={darkMaskId}\n maskUnits=\"userSpaceOnUse\"\n width=\"180\"\n x=\"0\"\n y=\"0\"\n style={{ maskType: \"alpha\" }}\n >\n <circle cx=\"90\" cy=\"90\" fill=\"black\" r=\"90\" />\n </mask>\n <g mask={`url(#${darkMaskId})`}>\n <circle cx=\"90\" cy=\"90\" fill=\"white\" r=\"90\" />\n <path\n d=\"M149.508 157.52L69.142 54H54V125.97H66.1136V69.3836L139.999 164.845C143.333 162.614 146.509 160.165 149.508 157.52Z\"\n fill={`url(#${darkPaint0Id})`}\n />\n <rect fill={`url(#${darkPaint1Id})`} height=\"72\" width=\"12\" x=\"115\" y=\"54\" />\n </g>\n <defs>\n <linearGradient gradientUnits=\"userSpaceOnUse\" id={darkPaint0Id} x1=\"109\" x2=\"144.5\" y1=\"116.5\" y2=\"160.5\">\n <stop stopColor=\"black\" />\n <stop offset=\"1\" stopColor=\"black\" stopOpacity=\"0\" />\n </linearGradient>\n <linearGradient gradientUnits=\"userSpaceOnUse\" id={darkPaint1Id} x1=\"121\" x2=\"120.799\" y1=\"54\" y2=\"106.875\">\n <stop stopColor=\"black\" />\n <stop offset=\"1\" stopColor=\"black\" stopOpacity=\"0\" />\n </linearGradient>\n </defs>\n </svg>\n </>\n )\n}\n\nexport function ChromeIcon({ className }: { className?: string }) {\n const gradientAId = useId()\n const gradientBId = useId()\n const gradientCId = useId()\n\n return (\n <svg className={className} viewBox=\"0 0 48 48\" height=\"16\" width=\"16\" xmlns=\"http://www.w3.org/2000/svg\">\n <defs>\n <linearGradient id={gradientAId} x1=\"3.2173\" y1=\"15\" x2=\"44.7812\" y2=\"15\" gradientUnits=\"userSpaceOnUse\">\n <stop offset=\"0\" stopColor=\"#d93025\" />\n <stop offset=\"1\" stopColor=\"#ea4335\" />\n </linearGradient>\n <linearGradient\n id={gradientBId}\n x1=\"20.7219\"\n y1=\"47.6791\"\n x2=\"41.5039\"\n y2=\"11.6837\"\n gradientUnits=\"userSpaceOnUse\"\n >\n <stop offset=\"0\" stopColor=\"#fcc934\" />\n <stop offset=\"1\" stopColor=\"#fbbc04\" />\n </linearGradient>\n <linearGradient\n id={gradientCId}\n x1=\"26.5981\"\n y1=\"46.5015\"\n x2=\"5.8161\"\n y2=\"10.506\"\n gradientUnits=\"userSpaceOnUse\"\n >\n <stop offset=\"0\" stopColor=\"#1e8e3e\" />\n <stop offset=\"1\" stopColor=\"#34a853\" />\n </linearGradient>\n </defs>\n <circle cx=\"24\" cy=\"23.9947\" r=\"12\" style={{ fill: \"#fff\" }} />\n <path\n d=\"M3.2154,36A24,24,0,1,0,12,3.2154,24,24,0,0,0,3.2154,36ZM34.3923,18A12,12,0,1,1,18,13.6077,12,12,0,0,1,34.3923,18Z\"\n style={{ fill: \"none\" }}\n />\n <path\n d=\"M24,12H44.7812a23.9939,23.9939,0,0,0-41.5639.0029L13.6079,30l.0093-.0024A11.9852,11.9852,0,0,1,24,12Z\"\n style={{ fill: `url(#${gradientAId})` }}\n />\n <circle cx=\"24\" cy=\"24\" r=\"9.5\" style={{ fill: \"#1a73e8\" }} />\n <path\n d=\"M34.3913,30.0029,24.0007,48A23.994,23.994,0,0,0,44.78,12.0031H23.9989l-.0025.0093A11.985,11.985,0,0,1,34.3913,30.0029Z\"\n style={{ fill: `url(#${gradientBId})` }}\n />\n <path\n d=\"M13.6086,30.0031,3.218,12.006A23.994,23.994,0,0,0,24.0025,48L34.3931,30.0029l-.0067-.0068a11.9852,11.9852,0,0,1-20.7778.007Z\"\n style={{ fill: `url(#${gradientCId})` }}\n />\n </svg>\n )\n}\n","import type * as React from \"react\"\n\nimport { cn } from \"@/lib/utils\"\n\nfunction Card({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"card\"\n className={cn(\"bg-card text-card-foreground flex flex-col gap-6 rounded-xl border py-6 shadow-sm\", className)}\n {...props}\n />\n )\n}\n\nfunction CardHeader({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"card-header\"\n className={cn(\n \"@container/card-header grid auto-rows-min grid-rows-[auto_auto] items-start gap-2 px-6 has-data-[slot=card-action]:grid-cols-[1fr_auto] [.border-b]:pb-6\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction CardTitle({ className, ...props }: React.ComponentProps<\"div\">) {\n return <div data-slot=\"card-title\" className={cn(\"leading-none font-semibold\", className)} {...props} />\n}\n\nfunction CardDescription({ className, ...props }: React.ComponentProps<\"div\">) {\n return <div data-slot=\"card-description\" className={cn(\"text-muted-foreground text-sm\", className)} {...props} />\n}\n\nfunction CardAction({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"card-action\"\n className={cn(\"col-start-2 row-span-2 row-start-1 self-start justify-self-end\", className)}\n {...props}\n />\n )\n}\n\nfunction CardContent({ className, ...props }: React.ComponentProps<\"div\">) {\n return <div data-slot=\"card-content\" className={cn(\"px-6\", className)} {...props} />\n}\n\nfunction CardFooter({ className, ...props }: React.ComponentProps<\"div\">) {\n return <div data-slot=\"card-footer\" className={cn(\"flex items-center px-6 [.border-t]:pt-6\", className)} {...props} />\n}\n\nexport { Card, CardHeader, CardFooter, CardTitle, CardAction, CardDescription, CardContent }\n","import { cn } from \"@/lib/utils\"\n\nfunction Skeleton({ className, ...props }: React.ComponentProps<\"div\">) {\n return <div data-slot=\"skeleton\" className={cn(\"bg-accent animate-pulse rounded-md\", className)} {...props} />\n}\n\nexport { Skeleton }\n"],"names":[],"mappings":"wDAEA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,EAAA,CAAA,CAAA,OCDO,SAAS,EAAW,WAAE,CAAS,CAA0B,EAC9D,IAAM,EAAc,CAAA,EAAA,EAAA,KAAA,AAAK,IACnB,EAAgB,CAAA,EAAA,EAAA,KAAA,AAAK,IACrB,EAAgB,CAAA,EAAA,EAAA,KAAA,AAAK,IACrB,EAAa,CAAA,EAAA,EAAA,KAAA,AAAK,IAClB,EAAe,CAAA,EAAA,EAAA,KAAA,AAAK,IACpB,EAAe,CAAA,EAAA,EAAA,KAAA,AAAK,IAE1B,MACE,CAAA,EAAA,EAAA,IAAA,EAAA,EAAA,QAAA,CAAA,WAEE,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CACC,aAAW,mBACX,UAAW,CAAA,EAAG,EAAU,kBAAkB,CAAC,CAC3C,OAAO,KACP,KAAK,MACL,QAAQ,cACR,MAAM,eAEN,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CACC,OAAO,MACP,GAAI,EACJ,UAAU,iBACV,MAAM,MACN,EAAE,IACF,EAAE,IACF,MAAO,CAAE,SAAU,OAAQ,WAE3B,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CAAO,GAAG,KAAK,GAAG,KAAK,KAAK,QAAQ,EAAE,SAEzC,CAAA,EAAA,EAAA,IAAA,EAAC,IAAA,CAAE,KAAM,CAAC,KAAK,EAAE,EAAY,CAAC,CAAC,WAC7B,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CAAO,GAAG,KAAK,GAAG,KAAK,KAAK,QAAQ,EAAE,OACvC,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CACC,EAAE,sHACF,KAAM,CAAC,KAAK,EAAE,EAAc,CAAC,CAAC,GAEhC,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,KAAM,CAAC,KAAK,EAAE,EAAc,CAAC,CAAC,CAAE,OAAO,KAAK,MAAM,KAAK,EAAE,MAAM,EAAE,UAEzE,CAAA,EAAA,EAAA,IAAA,EAAC,OAAA,WACC,CAAA,EAAA,EAAA,IAAA,EAAC,iBAAA,CAAe,cAAc,iBAAiB,GAAI,EAAe,GAAG,MAAM,GAAG,QAAQ,GAAG,QAAQ,GAAG,kBAClG,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,UAAU,UAChB,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,OAAO,IAAI,UAAU,QAAQ,YAAY,SAEjD,CAAA,EAAA,EAAA,IAAA,EAAC,iBAAA,CAAe,cAAc,iBAAiB,GAAI,EAAe,GAAG,MAAM,GAAG,UAAU,GAAG,KAAK,GAAG,oBACjG,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,UAAU,UAChB,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,OAAO,IAAI,UAAU,QAAQ,YAAY,eAMrD,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CACC,aAAW,mBACX,UAAW,CAAA,EAAG,EAAU,kBAAkB,CAAC,CAC3C,OAAO,KACP,KAAK,MACL,QAAQ,cACR,MAAM,eAEN,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CACC,OAAO,MACP,GAAI,EACJ,UAAU,iBACV,MAAM,MACN,EAAE,IACF,EAAE,IACF,MAAO,CAAE,SAAU,OAAQ,WAE3B,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CAAO,GAAG,KAAK,GAAG,KAAK,KAAK,QAAQ,EAAE,SAEzC,CAAA,EAAA,EAAA,IAAA,EAAC,IAAA,CAAE,KAAM,CAAC,KAAK,EAAE,EAAW,CAAC,CAAC,WAC5B,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CAAO,GAAG,KAAK,GAAG,KAAK,KAAK,QAAQ,EAAE,OACvC,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CACC,EAAE,sHACF,KAAM,CAAC,KAAK,EAAE,EAAa,CAAC,CAAC,GAE/B,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,KAAM,CAAC,KAAK,EAAE,EAAa,CAAC,CAAC,CAAE,OAAO,KAAK,MAAM,KAAK,EAAE,MAAM,EAAE,UAExE,CAAA,EAAA,EAAA,IAAA,EAAC,OAAA,WACC,CAAA,EAAA,EAAA,IAAA,EAAC,iBAAA,CAAe,cAAc,iBAAiB,GAAI,EAAc,GAAG,MAAM,GAAG,QAAQ,GAAG,QAAQ,GAAG,kBACjG,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,UAAU,UAChB,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,OAAO,IAAI,UAAU,QAAQ,YAAY,SAEjD,CAAA,EAAA,EAAA,IAAA,EAAC,iBAAA,CAAe,cAAc,iBAAiB,GAAI,EAAc,GAAG,MAAM,GAAG,UAAU,GAAG,KAAK,GAAG,oBAChG,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,UAAU,UAChB,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,OAAO,IAAI,UAAU,QAAQ,YAAY,iBAM3D,CAEO,SAAS,EAAW,WAAE,CAAS,CAA0B,EAC9D,IAAM,EAAc,CAAA,EAAA,EAAA,KAAA,AAAK,IACnB,EAAc,CAAA,EAAA,EAAA,KAAK,AAAL,IACd,EAAc,CAAA,EAAA,EAAA,KAAA,AAAK,IAEzB,MACE,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAW,EAAW,QAAQ,YAAY,OAAO,KAAK,MAAM,KAAK,MAAM,uCAC1E,CAAA,EAAA,EAAA,IAAA,EAAC,OAAA,WACC,CAAA,EAAA,EAAA,IAAA,EAAC,iBAAA,CAAe,GAAI,EAAa,GAAG,SAAS,GAAG,KAAK,GAAG,UAAU,GAAG,KAAK,cAAc,2BACtF,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,OAAO,IAAI,UAAU,YAC3B,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,OAAO,IAAI,UAAU,eAE7B,CAAA,EAAA,EAAA,IAAA,EAAC,iBAAA,CACC,GAAI,EACJ,GAAG,UACH,GAAG,UACH,GAAG,UACH,GAAG,UACH,cAAc,2BAEd,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,OAAO,IAAI,UAAU,YAC3B,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,OAAO,IAAI,UAAU,eAE7B,CAAA,EAAA,EAAA,IAAA,EAAC,iBAAA,CACC,GAAI,EACJ,GAAG,UACH,GAAG,UACH,GAAG,SACH,GAAG,SACH,cAAc,2BAEd,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,OAAO,IAAI,UAAU,YAC3B,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,OAAO,IAAI,UAAU,kBAG/B,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CAAO,GAAG,KAAK,GAAG,UAAU,EAAE,KAAK,MAAO,CAAE,KAAM,MAAO,IAC1D,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CACC,EAAE,oHACF,MAAO,CAAE,KAAM,MAAO,IAExB,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CACC,EAAE,wGACF,MAAO,CAAE,KAAM,CAAC,KAAK,EAAE,EAAY,CAAC,CAAC,AAAC,IAExC,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CAAO,GAAG,KAAK,GAAG,KAAK,EAAE,MAAM,MAAO,CAAE,KAAM,SAAU,IACzD,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CACC,EAAE,yHACF,MAAO,CAAE,KAAM,CAAC,KAAK,EAAE,EAAY,CAAC,CAAC,AAAC,IAExC,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CACC,EAAE,+HACF,MAAO,CAAE,KAAM,CAAC,KAAK,EAAE,EAAY,CAAC,CAAC,AAAC,MAI9C,CDjJA,IAAA,EAAA,EAAA,CAAA,CAAA,OEHA,EAAA,EAAA,CAAA,CAAA,OAEA,SAAS,EAAK,WAAE,CAAS,CAAE,GAAG,EAAoC,EAChE,MACE,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CACC,YAAU,OACV,UAAW,CAAA,EAAA,EAAA,EAAA,AAAE,EAAC,oFAAqF,GAClG,GAAG,CAAK,EAGf,CAEA,SAAS,EAAW,WAAE,CAAS,CAAE,GAAG,EAAoC,EACtE,MACE,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CACC,YAAU,cACV,UAAW,CAAA,EAAA,EAAA,EAAE,AAAF,EACT,2JACA,GAED,GAAG,CAAK,EAGf,CAEA,SAAS,EAAU,WAAE,CAAS,CAAE,GAAG,EAAoC,EACrE,MAAO,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,YAAU,aAAa,UAAW,CAAA,EAAA,EAAA,EAAA,AAAE,EAAC,6BAA8B,GAAa,GAAG,CAAK,EACtG,CAgBA,SAAS,EAAY,WAAE,CAAS,CAAE,GAAG,EAAoC,EACvE,MAAO,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,YAAU,eAAe,UAAW,CAAA,EAAA,EAAA,EAAA,AAAE,EAAC,OAAQ,GAAa,GAAG,CAAK,EAClF,CC7CA,SAAS,EAAS,WAAE,CAAS,CAAE,GAAG,EAAoC,EACpE,MAAO,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,YAAU,WAAW,UAAW,CAAA,EAAA,EAAA,EAAE,AAAF,EAAG,qCAAsC,GAAa,GAAG,CAAK,EAC5G,CHIA,IAAA,EAAA,EAAA,CAAA,CAAA,OAwIe,SAAS,IACtB,GAAM,CAAC,EAAO,EAAS,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,EAAuB,MACnD,CAAC,EAAc,EAAgB,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,EAA8B,MACxE,CAAC,EAAS,EAAW,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,GAAC,GACjC,CAAC,EAAU,EAAY,CAAG,CAAA,EAAA,EAAA,WAAA,AAAW,IAgB3C,MAdA,CAAA,EAAA,EAAA,SAAA,AAAS,EAAC,KAER,QAAQ,GAAG,CAAC,CAAC,MAAM,cAAe,MAAM,qBAAqB,EAC1D,IAAI,CAAC,CAAC,CAAC,EAAU,EAAQ,GAAK,QAAQ,GAAG,CAAC,CAAC,EAAS,IAAI,GAAI,EAAQ,IAAI,GAAG,GAC3E,IAAI,CAAC,CAAC,CAAC,EAAW,EAAS,IAC1B,EAAS,GACT,EAAgB,GAChB,GAAW,EACb,GACC,KAAK,CAAC,KACL,GAAW,EACb,EACJ,EAAG,EAAE,EAGH,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,uDAEb,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CAAO,UAAU,8CAChB,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,uCACb,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,8CACb,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,UACC,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,yCACb,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,4EACb,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,UAAU,+CAAsC,UAExD,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,WACC,CAAA,EAAA,EAAA,GAAA,EAAC,KAAA,CAAG,UAAU,8BAAqB,uBACnC,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,yCACb,CAAA,EAAA,EAAA,IAAA,EAAC,OAAA,CAAK,UAAU,8EACd,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,UAAU,sCAA2C,oBAG7D,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,UAAU,iCAAwB,MACxC,CAAA,EAAA,EAAA,IAAA,EAAC,OAAA,CAAK,UAAU,0CAAgC,QAAM,QAAQ,GAAG,CAAC,IAAI,EAAI,qBAKlF,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,oCACb,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,MAAM,CAAA,CAAC,QAAQ,UAAU,OAAO,CAAA,CAAA,WAC/B,CAAA,EAAA,EAAA,GAAA,EAAC,IAAA,CAAE,KAAK,+CAA+C,OAAO,SAAS,IAAI,+BAAsB,qBAInG,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,cAAc,CAAA,CAAC,SAAU,EAAU,YAAa,cAOzD,CAAA,EAAA,EAAA,IAAA,EAAC,OAAA,CAAK,UAAU,wCAEd,CAAA,EAAA,EAAA,GAAA,EAAC,UAAA,CAAQ,UAAU,iBACjB,CAAA,EAAA,EAAA,IAAA,EAAC,EAAA,CAAK,UAAU,0CACd,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,UACC,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,UAAU,yBAEb,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,UACE,EACC,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,gCACb,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,CAAS,UAAU,cACpB,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,CAAS,UAAU,kBAEpB,EACF,CAAA,EAAA,EAAA,IAAA,EAAA,EAAA,QAAA,CAAA,WACE,CAAA,EAAA,EAAA,GAAA,EAAC,IAAA,CAAE,UAAU,8CAAsC,EAAa,OAAO,GAEtE,EAAa,gBAAgB,CAAG,EAC/B,CAAA,EAAA,EAAA,IAAA,EAAA,EAAA,QAAA,CAAA,WACE,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,qCACZ,EAAa,UAAU,CAAC,GAAG,CAAC,AAAC,IAC5B,IAAM,EACJ,AAAa,sBAAT,IAAI,CAAyB,EAA0B,eAAb,EAAI,IAAI,CAAoB,EAAa,KACzF,MACE,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAEC,UAAU,mGAET,GAAQ,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,CAAK,UAAU,aACzB,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,UAAU,2CAAmC,EAAI,IAAI,GAC3D,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,UAAU,wCALX,EAAI,IAAI,CAQnB,KAED,EAAa,aAAa,CAAG,GAC5B,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,0CACb,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,UAAU,uBAAc,qBAAwB,IACrD,EAAa,QAAQ,CAAC,GAAG,CAAC,CAAC,EAAS,IACnC,CAAA,EAAA,EAAA,IAAA,EAAC,OAAA,WACC,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,UAAU,kEAA0D,IACzE,EAAM,EAAa,QAAQ,CAAC,MAAM,CAAG,GAAK,OAFlC,UASnB,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,4FACb,CAAA,EAAA,EAAA,GAAA,EAAC,IAAA,CAAE,UAAU,gBAAO,yDACpB,CAAA,EAAA,EAAA,IAAA,EAAC,IAAA,CAAE,UAAU,oBAAU,yCACiB,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,UAAU,2BAAkB,oBAAuB,IAAI,OAC/F,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,UAAU,2BAAkB,eAAiB,wDAM7D,YAMV,CAAA,EAAA,EAAA,IAAA,EAAC,EAAA,CAAK,UAAU,0CACd,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,UACC,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,UAAU,wBAEb,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,UACE,EACC,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,qCAEZ,CAAC,EAAG,EAAE,CAAC,GAAG,CAAC,AAAC,GACX,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAY,UAAU,2EACrB,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,CAAS,UAAU,mBACpB,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,sBACb,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,CAAS,UAAU,eACpB,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,CAAS,UAAU,cACpB,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,CAAS,UAAU,mBALd,MAUZ,EACF,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,qCACZ,EAAM,KAAK,CAAC,GAAG,CAAC,AAAC,QAhPH,MACvB,EAOA,EACA,CAT0C,CAW1C,QAsOU,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAEC,GAAI,EAAK,IAAI,CACb,UAAU,oHAEV,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,iBACb,CAAA,EAAA,EAAA,GAAA,EAAC,KAAA,CAAG,UAAU,gDAAwC,EAAK,IAAI,GAC/D,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,4CAAmC,EAAsB,EAAK,WAAW,GAvP5F,AAAC,GACf,EACG,WAAW,GACX,OAAO,CAAC,cAAe,KACvB,OAAO,CAAC,WAAY,MAGR,EAAY,KAAK,CAAC,QAAQ,MAAM,CAAC,AAAC,GAAY,EAAQ,IAAI,MACzD,IAAI,MAED,AAAC,IACpB,IAAM,EAAQ,EAAU,GAAG,CAAC,IAAS,EAErC,OADA,EAAU,GAAG,CAAC,EAAM,EAAQ,GACX,IAAV,EAAc,EAAO,CAAA,EAAG,EAAK,CAAC,EAAE,EAAA,CAAO,AAChD,EAEO,EAAS,GAAG,CAAC,CAAC,EAAY,KAC/B,IAAM,EAAgB,EAAa,EAAQ,IAAe,WACtD,EAAU,EAWd,GAAI,CALJ,EAAU,CAHV,EAAU,EAAQ,OAAO,CAAC,QAAS,IAAI,IAAI,EAAA,EAGzB,OAAO,CAAC,iEAAkE,AAAC,GACpF,EAAM,MAAM,CAAC,GACtB,EAGY,QAAQ,CAAC,KAAM,CAEzB,GAAM,CAAC,EAAQ,GAAG,EAAa,CAAG,EAAQ,KAAK,CAAC,KAC1C,EAAc,EAAO,IAAI,GACzB,EAAU,EAAa,IAAI,CAAC,KAAK,IAAI,GAG3C,GAAI,EAAQ,QAAQ,CAAC,KAAM,CACzB,IAAM,EAAQ,EAAQ,KAAK,CAAC,KAAK,MAAM,CAAE,AAAD,GAAU,EAAK,IAAI,IACrD,EAAa,CAAA,EAAG,EAAc,QAAQ,CAAC,CAC7C,MACE,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,WACC,CAAA,EAAA,EAAA,GAAA,EAAC,KAAA,CAAG,UAAU,8BAAsB,IACpC,CAAA,EAAA,EAAA,GAAA,EAAC,KAAA,CAAG,UAAU,0BACX,EAAM,GAAG,CAAC,AAAC,IACV,IAAM,EAAU,EAAa,CAAA,EAAG,EAAW,MAAM,EAAE,EAAQ,GAAM,KAAK,CAAC,EAAG,KAAO,SAAA,CAAU,EAC3F,MACE,CAAA,EAAA,EAAA,IAAA,EAAC,KAAA,CAAiB,UAAU,6BAC1B,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,UAAU,sCAA6B,MAC7C,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,UAAU,yCAAiC,EAAK,IAAI,OAFnD,EAKb,OAXM,EAed,CAEA,MACE,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,WACC,CAAA,EAAA,EAAA,GAAA,EAAC,KAAA,CAAG,UAAU,8BAAsB,IACpC,CAAA,EAAA,EAAA,GAAA,EAAC,IAAA,CAAE,UAAU,8CAAsC,MAF3C,CAAA,EAAG,EAAc,QAAQ,CAAC,CAKxC,CAGA,GAAI,EAAQ,KAAK,CAAC,8CAA+C,CAC/D,IAAM,EAAQ,EAAQ,KAAK,CAAC,MAAM,MAAM,CAAC,AAAC,GAAS,EAAK,IAAI,IAC5D,MACE,CAAA,EAAA,EAAA,GAAA,EAAC,KAAA,CAAG,UAAU,0BACX,EAAM,GAAG,CAAC,CAAC,EAAM,KAChB,IAAM,EAAY,EACf,OAAO,CAAC,wCAAyC,IACjD,OAAO,CAAC,YAAa,IACrB,IAAI,GACP,MACE,CAAA,EAAA,EAAA,IAAA,EAAC,KAAA,CAEC,UAAU,0CAET,EAAU,EAAE,KAAG,IAHX,EAAa,CAAA,EAAG,EAAc,MAAM,EAAE,EAAQ,GAAW,KAAK,CAAC,EAAG,KAAO,OAAA,CAAQ,EAM5F,IAdkC,CAAA,EAAG,EAAc,MAAM,CAAC,CAiBhE,CAGA,MACE,CAAA,EAAA,EAAA,GAAA,EAAC,IAAA,CAAqC,UAAU,yDAC7C,GADK,CAAA,EAAG,EAAc,UAAU,CAAC,CAIxC,SA2JmB,EAAK,UAAU,CAAC,MAAM,CAAG,GACxB,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,WACC,CAAA,EAAA,EAAA,GAAA,EAAC,KAAA,CAAG,UAAU,sCAA6B,gBAC3C,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,qBACZ,EAAK,UAAU,CAAC,GAAG,CAAC,AAAC,GACpB,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAqB,UAAU,oBAC9B,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,mCACb,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,UAAU,8CAAsC,EAAM,IAAI,GAChE,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,UAAU,yCACb,EAAM,QAAQ,CAAG,aAAe,eAEnC,CAAA,EAAA,EAAA,IAAA,EAAC,OAAA,CAAK,UAAU,6CAAmC,KAAG,EAAM,IAAI,OAEjE,EAAM,WAAW,EAChB,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,mDAA2C,EAAM,WAAW,KATrE,EAAM,IAAI,UAbvB,EAAK,IAAI,MAiCpB,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,8BACb,CAAA,EAAA,EAAA,GAAA,EAAC,IAAA,CAAE,UAAU,iCAAwB,sCACrC,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,MAAM,CAAA,CAAC,QAAS,IAAM,OAAO,QAAQ,CAAC,MAAM,YAAI,kBAOzD,CAAA,EAAA,EAAA,IAAA,EAAC,EAAA,CAAK,UAAU,mEACd,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,UACC,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,CAAU,UAAU,oBAAW,4BAElC,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,UACC,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,sCACb,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,wBACb,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,wGACb,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,UAAU,2CAAkC,QAEpD,CAAA,EAAA,EAAA,GAAA,EAAC,KAAA,CAAG,UAAU,sCAA6B,oBAC3C,CAAA,EAAA,EAAA,GAAA,EAAC,IAAA,CAAE,UAAU,iDAAwC,qFAIvD,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,wBACb,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,uGACb,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,UAAU,qDAA4C,QAE9D,CAAA,EAAA,EAAA,GAAA,EAAC,KAAA,CAAG,UAAU,sCAA6B,kBAC3C,CAAA,EAAA,EAAA,GAAA,EAAC,IAAA,CAAE,UAAU,iDAAwC,sEAIvD,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,wBACb,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,0GACb,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,UAAU,iEAAwD,QAE1E,CAAA,EAAA,EAAA,GAAA,EAAC,KAAA,CAAG,UAAU,sCAA6B,sBAC3C,CAAA,EAAA,EAAA,GAAA,EAAC,IAAA,CAAE,UAAU,iDAAwC,uFAU/D,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CAAO,UAAU,wCAChB,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,uCACb,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,4EACb,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,WACC,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,UAAU,yBAAgB,uBAAyB,0CAE3D,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,oCACb,CAAA,EAAA,EAAA,GAAA,EAAC,IAAA,CACC,KAAK,yCACL,OAAO,SACP,IAAI,sBACJ,UAAU,mDACX,WAGD,CAAA,EAAA,EAAA,GAAA,EAAC,IAAA,CACC,KAAK,qBACL,OAAO,SACP,IAAI,sBACJ,UAAU,mDACX,yBASf"}
1
+ {"version":3,"sources":["../../../../../mcp-server/app/page.tsx","../../../../../mcp-server/components/mcp-icons.tsx","../../../../../mcp-server/components/ui/card.tsx","../../../../../mcp-server/components/ui/skeleton.tsx"],"sourcesContent":["\"use client\"\n\nimport { useEffect, useState } from \"react\"\nimport { DarkModeToggle } from \"@/components/dark-mode-toggle\"\nimport { ChromeIcon, NextJsIcon } from \"@/components/mcp-icons\"\nimport { Button } from \"@/components/ui/button\"\nimport { Card, CardContent, CardHeader, CardTitle } from \"@/components/ui/card\"\nimport { Skeleton } from \"@/components/ui/skeleton\"\nimport { useDarkMode } from \"@/hooks/use-dark-mode\"\n\ninterface MCPTool {\n name: string\n description: string\n category: string\n parameters: Array<{\n name: string\n type: string\n optional?: boolean\n description: string\n }>\n}\n\ninterface ToolsResponse {\n tools: MCPTool[]\n endpoint: string\n totalTools: number\n categories: string[]\n}\n\ninterface OrchestratorResponse {\n orchestratorEnabled: boolean\n connectedMCPs: string[]\n totalConnections: number\n mcpDetails: Array<{\n name: string\n connected: boolean\n toolCount: number\n tools: string[]\n projects: string[]\n }>\n totalProjects: number\n projects: string[]\n message: string\n}\n\n// Format tool descriptions by parsing markdown-style sections\nfunction formatToolDescription(description: string) {\n const slugify = (value: string) =>\n value\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/(^-|-$)/g, \"\")\n\n // Split by double newline to get sections\n const sections = description.split(\"\\n\\n\").filter((section) => section.trim())\n const keyCounts = new Map<string, number>()\n\n const getUniqueKey = (base: string) => {\n const count = keyCounts.get(base) ?? 0\n keyCounts.set(base, count + 1)\n return count === 0 ? base : `${base}-${count}`\n }\n\n return sections.map((rawSection, _idx) => {\n const normalizedKey = getUniqueKey(slugify(rawSection) || \"section\")\n let section = rawSection\n\n // Remove markdown formatting\n section = section.replace(/\\*\\*/g, \"\").trim()\n\n // Remove excessive emojis\n section = section.replace(/(\\u{1F300}-\\u{1F9FF}|\\u{2600}-\\u{26FF}|\\u{1F900}-\\u{1F9FF})+/gu, (match) => {\n return match.charAt(0)\n })\n\n // Handle different section types\n if (section.includes(\":\")) {\n // This is a header with content\n const [header, ...contentParts] = section.split(\":\")\n const cleanHeader = header.trim()\n const content = contentParts.join(\":\").trim()\n\n // Check if content has bullet points\n if (content.includes(\"•\")) {\n const items = content.split(\"•\").filter((item) => item.trim())\n const sectionKey = `${normalizedKey}-bullets`\n return (\n <div key={sectionKey}>\n <h5 className=\"font-semibold mb-2\">{cleanHeader}</h5>\n <ul className=\"space-y-1 ml-4\">\n {items.map((item) => {\n const itemKey = getUniqueKey(`${sectionKey}-item-${slugify(item).slice(0, 40) || \"bullet\"}`)\n return (\n <li key={itemKey} className=\"flex items-start\">\n <span className=\"text-muted-foreground mr-2\">•</span>\n <span className=\"text-muted-foreground text-sm\">{item.trim()}</span>\n </li>\n )\n })}\n </ul>\n </div>\n )\n }\n\n return (\n <div key={`${normalizedKey}-content`}>\n <h5 className=\"font-semibold mb-1\">{cleanHeader}</h5>\n <p className=\"text-muted-foreground text-sm ml-4\">{content}</p>\n </div>\n )\n }\n\n // Handle numbered lists (like workflow steps)\n if (section.match(/^\\d+[\\ud83c-\\ud83e][\\udc00-\\udfff]|^\\d+\\./m)) {\n const items = section.split(/\\n/).filter((item) => item.trim())\n return (\n <ol className=\"space-y-1 ml-4\" key={`${normalizedKey}-steps`}>\n {items.map((item, itemIdx) => {\n const cleanItem = item\n .replace(/^\\d+[\\ud83c-\\ud83e][\\udc00-\\udfff]\\s*/, \"\")\n .replace(/^\\d+\\.\\s*/, \"\")\n .trim()\n return (\n <li\n key={getUniqueKey(`${normalizedKey}-step-${slugify(cleanItem).slice(0, 40) || \"step\"}`)}\n className=\"text-muted-foreground text-sm\"\n >\n {itemIdx + 1}. {cleanItem}\n </li>\n )\n })}\n </ol>\n )\n }\n\n // Default paragraph\n return (\n <p key={`${normalizedKey}-paragraph`} className=\"text-muted-foreground text-sm leading-relaxed\">\n {section}\n </p>\n )\n })\n}\n\nexport default function HomePage() {\n const [tools, setTools] = useState<ToolsResponse | null>(null)\n const [orchestrator, setOrchestrator] = useState<OrchestratorResponse | null>(null)\n const [loading, setLoading] = useState(true)\n const [darkMode, setDarkMode] = useDarkMode()\n\n useEffect(() => {\n // Fetch both tools and orchestrator status in parallel\n Promise.all([fetch(\"/api/tools\"), fetch(\"/api/orchestrator\")])\n .then(([toolsRes, orchRes]) => Promise.all([toolsRes.json(), orchRes.json()]))\n .then(([toolsData, orchData]) => {\n setTools(toolsData)\n setOrchestrator(orchData)\n setLoading(false)\n })\n .catch(() => {\n setLoading(false)\n })\n }, [])\n\n return (\n <div className=\"min-h-screen bg-background text-foreground\">\n {/* Header */}\n <header className=\"bg-muted/30 border-b border-border\">\n <div className=\"max-w-7xl mx-auto px-6 py-8\">\n <div className=\"flex items-center justify-between\">\n <div>\n <div className=\"flex items-center gap-4 mb-3\">\n <div className=\"w-12 h-12 bg-foreground rounded flex items-center justify-center\">\n <span className=\"text-background font-mono font-bold\">d3k</span>\n </div>\n <div>\n <h1 className=\"text-3xl font-bold\">dev3000 MCP Server</h1>\n <div className=\"flex items-center gap-3 mt-2\">\n <span className=\"inline-flex items-center gap-2 text-sm text-green-600 font-medium\">\n <span className=\"w-2 h-2 bg-green-500 rounded-full\"></span>\n Server Running\n </span>\n <span className=\"text-muted-foreground\">•</span>\n <span className=\"text-sm text-muted-foreground\">Port {process.env.PORT || \"3684\"}</span>\n </div>\n </div>\n </div>\n </div>\n <div className=\"flex items-center gap-4\">\n <Button variant=\"outline\" asChild>\n <a href=\"https://github.com/vercel-labs/dev3000#setup\" target=\"_blank\" rel=\"noopener noreferrer\">\n 📖 Setup Guide\n </a>\n </Button>\n <DarkModeToggle darkMode={darkMode} setDarkMode={setDarkMode} />\n </div>\n </div>\n </div>\n </header>\n\n {/* Main Content - no sidebar needed with only 2 tools */}\n <main className=\"max-w-7xl mx-auto px-6 py-8\">\n {/* MCP Connections Status */}\n <section className=\"mb-16\">\n <Card className=\"bg-accent/10 border-accent/20\">\n <CardHeader>\n <CardTitle>🔌 MCP Connections</CardTitle>\n </CardHeader>\n <CardContent>\n {loading ? (\n <div className=\"h-[120px] space-y-4\">\n <Skeleton className=\"h-4 w-3/4\" />\n <Skeleton className=\"h-12 w-1/2\" />\n </div>\n ) : orchestrator ? (\n <>\n <p className=\"text-sm text-muted-foreground mb-4\">{orchestrator.message}</p>\n\n {orchestrator.totalConnections > 0 ? (\n <>\n <div className=\"flex flex-wrap gap-3 mb-4\">\n {orchestrator.mcpDetails.map((mcp) => {\n const Icon =\n mcp.name === \"chrome-devtools\" ? ChromeIcon : mcp.name === \"nextjs-dev\" ? NextJsIcon : null\n return (\n <div\n key={mcp.name}\n className=\"inline-flex items-center gap-2 bg-background/50 border border-border rounded px-3 py-2\"\n >\n {Icon && <Icon className=\"shrink-0\" />}\n <span className=\"font-semibold font-mono text-sm\">{mcp.name}</span>\n <span className=\"w-2 h-2 bg-green-500 rounded-full\"></span>\n </div>\n )\n })}\n </div>\n {orchestrator.totalProjects > 0 && (\n <div className=\"text-sm text-muted-foreground\">\n <span className=\"font-medium\">Active projects:</span>{\" \"}\n {orchestrator.projects.map((project, idx) => (\n <span key={project}>\n <code className=\"text-foreground bg-background/50 px-1.5 py-0.5 rounded\">{project}</code>\n {idx < orchestrator.projects.length - 1 && \", \"}\n </span>\n ))}\n </div>\n )}\n </>\n ) : (\n <div className=\"text-sm text-muted-foreground bg-background/50 border border-border rounded p-4\">\n <p className=\"mb-2\">⏳ Waiting for downstream MCPs to become available...</p>\n <p className=\"text-xs\">\n dev3000 will automatically connect to <code className=\"text-foreground\">chrome-devtools</code>{\" \"}\n and <code className=\"text-foreground\">nextjs-dev</code> MCPs when Chrome and your dev server\n start.\n </p>\n </div>\n )}\n </>\n ) : null}\n </CardContent>\n </Card>\n </section>\n\n {/* Tools Documentation */}\n <Card className=\"bg-accent/10 border-accent/20\">\n <CardHeader>\n <CardTitle>🛠️ dev3000 Tools</CardTitle>\n </CardHeader>\n <CardContent>\n {loading ? (\n <div className=\"grid gap-6 lg:grid-cols-2\">\n {/* Skeleton loading states */}\n {[1, 2].map((i) => (\n <div key={i} className=\"bg-background/50 border border-border rounded-lg p-6 h-[600px]\">\n <Skeleton className=\"h-6 w-3/4 mb-4\" />\n <div className=\"space-y-2\">\n <Skeleton className=\"h-4 w-full\" />\n <Skeleton className=\"h-4 w-5/6\" />\n <Skeleton className=\"h-4 w-4/6\" />\n </div>\n </div>\n ))}\n </div>\n ) : tools ? (\n <div className=\"grid gap-6 lg:grid-cols-2\">\n {tools.tools.map((tool) => (\n <div\n key={tool.name}\n id={tool.name}\n className=\"bg-background/50 border border-border rounded-lg p-6 hover:border-muted-foreground/50 transition-colors\"\n >\n <div className=\"mb-4\">\n <h4 className=\"text-xl font-semibold font-mono mb-3\">{tool.name}</h4>\n <div className=\"text-muted-foreground space-y-3\">{formatToolDescription(tool.description)}</div>\n </div>\n {tool.parameters.length > 0 && (\n <div>\n <h5 className=\"text-sm font-semibold mb-3\">Parameters:</h5>\n <div className=\"space-y-2\">\n {tool.parameters.map((param) => (\n <div key={param.name} className=\"text-sm\">\n <div className=\"flex items-start gap-2\">\n <span className=\"font-mono text-primary font-medium\">{param.name}</span>\n <span className=\"text-muted-foreground text-xs\">\n {param.optional ? \"(optional)\" : \"(required)\"}\n </span>\n <span className=\"text-muted-foreground/70 text-xs\">- {param.type}</span>\n </div>\n {param.description && (\n <div className=\"text-muted-foreground ml-1 mt-1 text-sm\">{param.description}</div>\n )}\n </div>\n ))}\n </div>\n </div>\n )}\n </div>\n ))}\n </div>\n ) : (\n <div className=\"text-center py-16\">\n <p className=\"text-destructive mb-6\">Failed to load tool documentation</p>\n <Button onClick={() => window.location.reload()}>Retry</Button>\n </div>\n )}\n </CardContent>\n </Card>\n\n {/* Magic Workflow */}\n <Card className=\"mt-20 bg-gradient-to-r from-primary/10 to-secondary/10\">\n <CardHeader>\n <CardTitle className=\"text-2xl\">🪄 The Magic Workflow</CardTitle>\n </CardHeader>\n <CardContent>\n <div className=\"grid md:grid-cols-3 gap-8\">\n <div className=\"text-center\">\n <div className=\"w-16 h-16 bg-primary/20 rounded-full flex items-center justify-center mx-auto mb-4 shadow-md\">\n <span className=\"text-primary font-bold text-2xl\">1</span>\n </div>\n <h3 className=\"font-semibold mb-3 text-lg\">AI Finds Issues</h3>\n <p className=\"text-muted-foreground leading-relaxed\">\n fix_my_app automatically detects all types of errors and problems in your app\n </p>\n </div>\n <div className=\"text-center\">\n <div className=\"w-16 h-16 bg-accent/20 rounded-full flex items-center justify-center mx-auto mb-4 shadow-md\">\n <span className=\"text-accent-foreground font-bold text-2xl\">2</span>\n </div>\n <h3 className=\"font-semibold mb-3 text-lg\">AI Fixes Code</h3>\n <p className=\"text-muted-foreground leading-relaxed\">\n AI analyzes errors and edits your code files to resolve issues\n </p>\n </div>\n <div className=\"text-center\">\n <div className=\"w-16 h-16 bg-green-500/20 rounded-full flex items-center justify-center mx-auto mb-4 shadow-md\">\n <span className=\"text-green-600 dark:text-green-400 font-bold text-2xl\">3</span>\n </div>\n <h3 className=\"font-semibold mb-3 text-lg\">AI Verifies Fixes</h3>\n <p className=\"text-muted-foreground leading-relaxed\">\n agent_browser_action tests the fixes in real-time with screenshots\n </p>\n </div>\n </div>\n </CardContent>\n </Card>\n </main>\n\n {/* Footer */}\n <footer className=\"border-t border-border mt-20\">\n <div className=\"max-w-7xl mx-auto px-6 py-8\">\n <div className=\"flex items-center justify-between text-sm text-muted-foreground\">\n <div>\n <span className=\"font-semibold\">dev3000 MCP Server</span> - AI-powered development monitoring\n </div>\n <div className=\"flex items-center gap-8\">\n <a\n href=\"https://github.com/vercel-labs/dev3000\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"hover:text-foreground transition-colors\"\n >\n GitHub\n </a>\n <a\n href=\"https://dev3000.ai\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"hover:text-foreground transition-colors\"\n >\n Homepage\n </a>\n </div>\n </div>\n </div>\n </footer>\n </div>\n )\n}\n","import { useId } from \"react\"\n\nexport function NextJsIcon({ className }: { className?: string }) {\n const lightMaskId = useId()\n const lightPaint0Id = useId()\n const lightPaint1Id = useId()\n const darkMaskId = useId()\n const darkPaint0Id = useId()\n const darkPaint1Id = useId()\n\n return (\n <>\n {/* Light mode */}\n <svg\n aria-label=\"Next.js logomark\"\n className={`${className} block dark:hidden`}\n height=\"16\"\n role=\"img\"\n viewBox=\"0 0 180 180\"\n width=\"16\"\n >\n <mask\n height=\"180\"\n id={lightMaskId}\n maskUnits=\"userSpaceOnUse\"\n width=\"180\"\n x=\"0\"\n y=\"0\"\n style={{ maskType: \"alpha\" }}\n >\n <circle cx=\"90\" cy=\"90\" fill=\"black\" r=\"90\" />\n </mask>\n <g mask={`url(#${lightMaskId})`}>\n <circle cx=\"90\" cy=\"90\" fill=\"black\" r=\"90\" />\n <path\n d=\"M149.508 157.52L69.142 54H54V125.97H66.1136V69.3836L139.999 164.845C143.333 162.614 146.509 160.165 149.508 157.52Z\"\n fill={`url(#${lightPaint0Id})`}\n />\n <rect fill={`url(#${lightPaint1Id})`} height=\"72\" width=\"12\" x=\"115\" y=\"54\" />\n </g>\n <defs>\n <linearGradient gradientUnits=\"userSpaceOnUse\" id={lightPaint0Id} x1=\"109\" x2=\"144.5\" y1=\"116.5\" y2=\"160.5\">\n <stop stopColor=\"white\" />\n <stop offset=\"1\" stopColor=\"white\" stopOpacity=\"0\" />\n </linearGradient>\n <linearGradient gradientUnits=\"userSpaceOnUse\" id={lightPaint1Id} x1=\"121\" x2=\"120.799\" y1=\"54\" y2=\"106.875\">\n <stop stopColor=\"white\" />\n <stop offset=\"1\" stopColor=\"white\" stopOpacity=\"0\" />\n </linearGradient>\n </defs>\n </svg>\n\n {/* Dark mode */}\n <svg\n aria-label=\"Next.js logomark\"\n className={`${className} hidden dark:block`}\n height=\"16\"\n role=\"img\"\n viewBox=\"0 0 180 180\"\n width=\"16\"\n >\n <mask\n height=\"180\"\n id={darkMaskId}\n maskUnits=\"userSpaceOnUse\"\n width=\"180\"\n x=\"0\"\n y=\"0\"\n style={{ maskType: \"alpha\" }}\n >\n <circle cx=\"90\" cy=\"90\" fill=\"black\" r=\"90\" />\n </mask>\n <g mask={`url(#${darkMaskId})`}>\n <circle cx=\"90\" cy=\"90\" fill=\"white\" r=\"90\" />\n <path\n d=\"M149.508 157.52L69.142 54H54V125.97H66.1136V69.3836L139.999 164.845C143.333 162.614 146.509 160.165 149.508 157.52Z\"\n fill={`url(#${darkPaint0Id})`}\n />\n <rect fill={`url(#${darkPaint1Id})`} height=\"72\" width=\"12\" x=\"115\" y=\"54\" />\n </g>\n <defs>\n <linearGradient gradientUnits=\"userSpaceOnUse\" id={darkPaint0Id} x1=\"109\" x2=\"144.5\" y1=\"116.5\" y2=\"160.5\">\n <stop stopColor=\"black\" />\n <stop offset=\"1\" stopColor=\"black\" stopOpacity=\"0\" />\n </linearGradient>\n <linearGradient gradientUnits=\"userSpaceOnUse\" id={darkPaint1Id} x1=\"121\" x2=\"120.799\" y1=\"54\" y2=\"106.875\">\n <stop stopColor=\"black\" />\n <stop offset=\"1\" stopColor=\"black\" stopOpacity=\"0\" />\n </linearGradient>\n </defs>\n </svg>\n </>\n )\n}\n\nexport function ChromeIcon({ className }: { className?: string }) {\n const gradientAId = useId()\n const gradientBId = useId()\n const gradientCId = useId()\n\n return (\n <svg className={className} viewBox=\"0 0 48 48\" height=\"16\" width=\"16\" xmlns=\"http://www.w3.org/2000/svg\">\n <defs>\n <linearGradient id={gradientAId} x1=\"3.2173\" y1=\"15\" x2=\"44.7812\" y2=\"15\" gradientUnits=\"userSpaceOnUse\">\n <stop offset=\"0\" stopColor=\"#d93025\" />\n <stop offset=\"1\" stopColor=\"#ea4335\" />\n </linearGradient>\n <linearGradient\n id={gradientBId}\n x1=\"20.7219\"\n y1=\"47.6791\"\n x2=\"41.5039\"\n y2=\"11.6837\"\n gradientUnits=\"userSpaceOnUse\"\n >\n <stop offset=\"0\" stopColor=\"#fcc934\" />\n <stop offset=\"1\" stopColor=\"#fbbc04\" />\n </linearGradient>\n <linearGradient\n id={gradientCId}\n x1=\"26.5981\"\n y1=\"46.5015\"\n x2=\"5.8161\"\n y2=\"10.506\"\n gradientUnits=\"userSpaceOnUse\"\n >\n <stop offset=\"0\" stopColor=\"#1e8e3e\" />\n <stop offset=\"1\" stopColor=\"#34a853\" />\n </linearGradient>\n </defs>\n <circle cx=\"24\" cy=\"23.9947\" r=\"12\" style={{ fill: \"#fff\" }} />\n <path\n d=\"M3.2154,36A24,24,0,1,0,12,3.2154,24,24,0,0,0,3.2154,36ZM34.3923,18A12,12,0,1,1,18,13.6077,12,12,0,0,1,34.3923,18Z\"\n style={{ fill: \"none\" }}\n />\n <path\n d=\"M24,12H44.7812a23.9939,23.9939,0,0,0-41.5639.0029L13.6079,30l.0093-.0024A11.9852,11.9852,0,0,1,24,12Z\"\n style={{ fill: `url(#${gradientAId})` }}\n />\n <circle cx=\"24\" cy=\"24\" r=\"9.5\" style={{ fill: \"#1a73e8\" }} />\n <path\n d=\"M34.3913,30.0029,24.0007,48A23.994,23.994,0,0,0,44.78,12.0031H23.9989l-.0025.0093A11.985,11.985,0,0,1,34.3913,30.0029Z\"\n style={{ fill: `url(#${gradientBId})` }}\n />\n <path\n d=\"M13.6086,30.0031,3.218,12.006A23.994,23.994,0,0,0,24.0025,48L34.3931,30.0029l-.0067-.0068a11.9852,11.9852,0,0,1-20.7778.007Z\"\n style={{ fill: `url(#${gradientCId})` }}\n />\n </svg>\n )\n}\n","import type * as React from \"react\"\n\nimport { cn } from \"@/lib/utils\"\n\nfunction Card({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"card\"\n className={cn(\"bg-card text-card-foreground flex flex-col gap-6 rounded-xl border py-6 shadow-sm\", className)}\n {...props}\n />\n )\n}\n\nfunction CardHeader({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"card-header\"\n className={cn(\n \"@container/card-header grid auto-rows-min grid-rows-[auto_auto] items-start gap-2 px-6 has-data-[slot=card-action]:grid-cols-[1fr_auto] [.border-b]:pb-6\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction CardTitle({ className, ...props }: React.ComponentProps<\"div\">) {\n return <div data-slot=\"card-title\" className={cn(\"leading-none font-semibold\", className)} {...props} />\n}\n\nfunction CardDescription({ className, ...props }: React.ComponentProps<\"div\">) {\n return <div data-slot=\"card-description\" className={cn(\"text-muted-foreground text-sm\", className)} {...props} />\n}\n\nfunction CardAction({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"card-action\"\n className={cn(\"col-start-2 row-span-2 row-start-1 self-start justify-self-end\", className)}\n {...props}\n />\n )\n}\n\nfunction CardContent({ className, ...props }: React.ComponentProps<\"div\">) {\n return <div data-slot=\"card-content\" className={cn(\"px-6\", className)} {...props} />\n}\n\nfunction CardFooter({ className, ...props }: React.ComponentProps<\"div\">) {\n return <div data-slot=\"card-footer\" className={cn(\"flex items-center px-6 [.border-t]:pt-6\", className)} {...props} />\n}\n\nexport { Card, CardHeader, CardFooter, CardTitle, CardAction, CardDescription, CardContent }\n","import { cn } from \"@/lib/utils\"\n\nfunction Skeleton({ className, ...props }: React.ComponentProps<\"div\">) {\n return <div data-slot=\"skeleton\" className={cn(\"bg-accent animate-pulse rounded-md\", className)} {...props} />\n}\n\nexport { Skeleton }\n"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- <!DOCTYPE html><!--Mseg7iY2pocGklcPCObqM--><html lang="en" class="h-full" vt-update="auto"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="stylesheet" href="/_next/static/chunks/59cdeaf92a780e96.css" data-precedence="next"/><link rel="preload" as="script" fetchPriority="low" href="/_next/static/chunks/39e9bdcc541cc428.js"/><script src="/_next/static/chunks/10099c90a1ca89ea.js" async=""></script><script src="/_next/static/chunks/13606014ef33124c.js" async=""></script><script src="/_next/static/chunks/4785978304fb9e19.js" async=""></script><script src="/_next/static/chunks/turbopack-b64e111cadf03885.js" async=""></script><script src="/_next/static/chunks/5df77c9395248155.js" async=""></script><script src="/_next/static/chunks/807aef58565dccb1.js" async=""></script><meta name="robots" content="noindex"/><title>dev3000</title><link rel="icon" href="/favicon.ico" type="image/x-icon"/><link rel="icon" href="/favicon.svg" type="image/svg+xml" sizes="32x32"/><link rel="icon" href="/favicon-16.svg" type="image/svg+xml" sizes="16x16"/><link rel="icon" href="/favicon-64.svg" type="image/svg+xml" sizes="64x64"/><link rel="apple-touch-icon" href="/favicon-180.png"/><link rel="shortcut icon" href="/favicon.svg"/><meta name="theme-color" content="#1f2937"/><title>404: This page could not be found.</title><script src="/_next/static/chunks/a6dad97d9634a72d.js" noModule=""></script></head><body class="h-full"><div hidden=""><!--$--><!--/$--></div><div style="font-family:system-ui,&quot;Segoe UI&quot;,Roboto,Helvetica,Arial,sans-serif,&quot;Apple Color Emoji&quot;,&quot;Segoe UI Emoji&quot;;height:100vh;text-align:center;display:flex;flex-direction:column;align-items:center;justify-content:center"><div><style>body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}</style><h1 class="next-error-h1" style="display:inline-block;margin:0 20px 0 0;padding:0 23px 0 0;font-size:24px;font-weight:500;vertical-align:top;line-height:49px">404</h1><div style="display:inline-block"><h2 style="font-size:14px;font-weight:400;line-height:49px;margin:0">This page could not be found.</h2></div></div></div><!--$--><!--/$--><script src="/_next/static/chunks/39e9bdcc541cc428.js" id="_R_" async=""></script><script>(self.__next_f=self.__next_f||[]).push([0])</script><script>self.__next_f.push([1,"1:\"$Sreact.fragment\"\n2:\"$Sreact.view_transition\"\n3:I[83414,[\"/_next/static/chunks/5df77c9395248155.js\",\"/_next/static/chunks/807aef58565dccb1.js\"],\"default\"]\n4:I[48876,[\"/_next/static/chunks/5df77c9395248155.js\",\"/_next/static/chunks/807aef58565dccb1.js\"],\"default\"]\n5:I[51263,[\"/_next/static/chunks/5df77c9395248155.js\",\"/_next/static/chunks/807aef58565dccb1.js\"],\"OutletBoundary\"]\n6:\"$Sreact.suspense\"\n8:I[51263,[\"/_next/static/chunks/5df77c9395248155.js\",\"/_next/static/chunks/807aef58565dccb1.js\"],\"ViewportBoundary\"]\na:I[51263,[\"/_next/static/chunks/5df77c9395248155.js\",\"/_next/static/chunks/807aef58565dccb1.js\"],\"MetadataBoundary\"]\nc:I[82165,[\"/_next/static/chunks/5df77c9395248155.js\",\"/_next/static/chunks/807aef58565dccb1.js\"],\"default\"]\n:HL[\"/_next/static/chunks/59cdeaf92a780e96.css\",\"style\"]\n"])</script><script>self.__next_f.push([1,"0:{\"P\":null,\"b\":\"Mseg7iY2pocGklcPCObqM\",\"c\":[\"\",\"_not-found\"],\"q\":\"\",\"i\":false,\"f\":[[[\"\",{\"children\":[\"/_not-found\",{\"children\":[\"__PAGE__\",{}]}]},\"$undefined\",\"$undefined\",true],[[\"$\",\"$1\",\"c\",{\"children\":[[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/chunks/59cdeaf92a780e96.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}],[\"$\",\"script\",\"script-0\",{\"src\":\"/_next/static/chunks/5df77c9395248155.js\",\"async\":true,\"nonce\":\"$undefined\"}],[\"$\",\"script\",\"script-1\",{\"src\":\"/_next/static/chunks/807aef58565dccb1.js\",\"async\":true,\"nonce\":\"$undefined\"}]],[\"$\",\"$2\",null,{\"children\":[\"$\",\"html\",null,{\"lang\":\"en\",\"className\":\"h-full\",\"children\":[[\"$\",\"head\",null,{\"children\":[[\"$\",\"title\",null,{\"children\":\"dev3000\"}],[\"$\",\"link\",null,{\"rel\":\"icon\",\"href\":\"/favicon.ico\",\"type\":\"image/x-icon\"}],[\"$\",\"link\",null,{\"rel\":\"icon\",\"href\":\"/favicon.svg\",\"type\":\"image/svg+xml\",\"sizes\":\"32x32\"}],[\"$\",\"link\",null,{\"rel\":\"icon\",\"href\":\"/favicon-16.svg\",\"type\":\"image/svg+xml\",\"sizes\":\"16x16\"}],[\"$\",\"link\",null,{\"rel\":\"icon\",\"href\":\"/favicon-64.svg\",\"type\":\"image/svg+xml\",\"sizes\":\"64x64\"}],[\"$\",\"link\",null,{\"rel\":\"apple-touch-icon\",\"href\":\"/favicon-180.png\"}],[\"$\",\"link\",null,{\"rel\":\"shortcut icon\",\"href\":\"/favicon.svg\"}],[\"$\",\"meta\",null,{\"name\":\"theme-color\",\"content\":\"#1f2937\"}]]}],[\"$\",\"body\",null,{\"className\":\"h-full\",\"children\":[\"$\",\"$L3\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L4\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":[[[\"$\",\"title\",null,{\"children\":\"404: This page could not be found.\"}],[\"$\",\"div\",null,{\"style\":{\"fontFamily\":\"system-ui,\\\"Segoe UI\\\",Roboto,Helvetica,Arial,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\"\",\"height\":\"100vh\",\"textAlign\":\"center\",\"display\":\"flex\",\"flexDirection\":\"column\",\"alignItems\":\"center\",\"justifyContent\":\"center\"},\"children\":[\"$\",\"div\",null,{\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":{\"display\":\"inline-block\",\"margin\":\"0 20px 0 0\",\"padding\":\"0 23px 0 0\",\"fontSize\":24,\"fontWeight\":500,\"verticalAlign\":\"top\",\"lineHeight\":\"49px\"},\"children\":404}],[\"$\",\"div\",null,{\"style\":{\"display\":\"inline-block\"},\"children\":[\"$\",\"h2\",null,{\"style\":{\"fontSize\":14,\"fontWeight\":400,\"lineHeight\":\"49px\",\"margin\":0},\"children\":\"This page could not be found.\"}]}]]}]}]],[]],\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]}]]}]}]]}],{\"children\":[[\"$\",\"$1\",\"c\",{\"children\":[null,[\"$\",\"$L3\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L4\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}],{\"children\":[[\"$\",\"$1\",\"c\",{\"children\":[[[\"$\",\"title\",null,{\"children\":\"404: This page could not be found.\"}],[\"$\",\"div\",null,{\"style\":\"$0:f:0:1:0:props:children:1:props:children:props:children:1:props:children:props:notFound:0:1:props:style\",\"children\":[\"$\",\"div\",null,{\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":\"$0:f:0:1:0:props:children:1:props:children:props:children:1:props:children:props:notFound:0:1:props:children:props:children:1:props:style\",\"children\":404}],[\"$\",\"div\",null,{\"style\":\"$0:f:0:1:0:props:children:1:props:children:props:children:1:props:children:props:notFound:0:1:props:children:props:children:2:props:style\",\"children\":[\"$\",\"h2\",null,{\"style\":\"$0:f:0:1:0:props:children:1:props:children:props:children:1:props:children:props:notFound:0:1:props:children:props:children:2:props:children:props:style\",\"children\":\"This page could not be found.\"}]}]]}]}]],null,[\"$\",\"$L5\",null,{\"children\":[\"$\",\"$6\",null,{\"name\":\"Next.MetadataOutlet\",\"children\":\"$@7\"}]}]]}],{},null,false,false]},null,false,false]},null,false,false],[\"$\",\"$1\",\"h\",{\"children\":[[\"$\",\"meta\",null,{\"name\":\"robots\",\"content\":\"noindex\"}],[\"$\",\"$L8\",null,{\"children\":\"$L9\"}],[\"$\",\"div\",null,{\"hidden\":true,\"children\":[\"$\",\"$La\",null,{\"children\":[\"$\",\"$6\",null,{\"name\":\"Next.Metadata\",\"children\":\"$Lb\"}]}]}],null]}],false]],\"m\":\"$undefined\",\"G\":[\"$c\",\"$undefined\"],\"S\":true}\n"])</script><script>self.__next_f.push([1,"9:[[\"$\",\"meta\",\"0\",{\"charSet\":\"utf-8\"}],[\"$\",\"meta\",\"1\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1\"}]]\n"])</script><script>self.__next_f.push([1,"7:null\nb:[]\n"])</script></body></html>
1
+ <!DOCTYPE html><!--MfA6U1EFS31sVuHA4xDF_--><html lang="en" class="h-full" vt-update="auto"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="stylesheet" href="/_next/static/chunks/59cdeaf92a780e96.css" data-precedence="next"/><link rel="preload" as="script" fetchPriority="low" href="/_next/static/chunks/39e9bdcc541cc428.js"/><script src="/_next/static/chunks/10099c90a1ca89ea.js" async=""></script><script src="/_next/static/chunks/13606014ef33124c.js" async=""></script><script src="/_next/static/chunks/4785978304fb9e19.js" async=""></script><script src="/_next/static/chunks/turbopack-b64e111cadf03885.js" async=""></script><script src="/_next/static/chunks/5df77c9395248155.js" async=""></script><script src="/_next/static/chunks/807aef58565dccb1.js" async=""></script><meta name="robots" content="noindex"/><title>dev3000</title><link rel="icon" href="/favicon.ico" type="image/x-icon"/><link rel="icon" href="/favicon.svg" type="image/svg+xml" sizes="32x32"/><link rel="icon" href="/favicon-16.svg" type="image/svg+xml" sizes="16x16"/><link rel="icon" href="/favicon-64.svg" type="image/svg+xml" sizes="64x64"/><link rel="apple-touch-icon" href="/favicon-180.png"/><link rel="shortcut icon" href="/favicon.svg"/><meta name="theme-color" content="#1f2937"/><title>404: This page could not be found.</title><script src="/_next/static/chunks/a6dad97d9634a72d.js" noModule=""></script></head><body class="h-full"><div hidden=""><!--$--><!--/$--></div><div style="font-family:system-ui,&quot;Segoe UI&quot;,Roboto,Helvetica,Arial,sans-serif,&quot;Apple Color Emoji&quot;,&quot;Segoe UI Emoji&quot;;height:100vh;text-align:center;display:flex;flex-direction:column;align-items:center;justify-content:center"><div><style>body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}</style><h1 class="next-error-h1" style="display:inline-block;margin:0 20px 0 0;padding:0 23px 0 0;font-size:24px;font-weight:500;vertical-align:top;line-height:49px">404</h1><div style="display:inline-block"><h2 style="font-size:14px;font-weight:400;line-height:49px;margin:0">This page could not be found.</h2></div></div></div><!--$--><!--/$--><script src="/_next/static/chunks/39e9bdcc541cc428.js" id="_R_" async=""></script><script>(self.__next_f=self.__next_f||[]).push([0])</script><script>self.__next_f.push([1,"1:\"$Sreact.fragment\"\n2:\"$Sreact.view_transition\"\n3:I[83414,[\"/_next/static/chunks/5df77c9395248155.js\",\"/_next/static/chunks/807aef58565dccb1.js\"],\"default\"]\n4:I[48876,[\"/_next/static/chunks/5df77c9395248155.js\",\"/_next/static/chunks/807aef58565dccb1.js\"],\"default\"]\n5:I[51263,[\"/_next/static/chunks/5df77c9395248155.js\",\"/_next/static/chunks/807aef58565dccb1.js\"],\"OutletBoundary\"]\n6:\"$Sreact.suspense\"\n8:I[51263,[\"/_next/static/chunks/5df77c9395248155.js\",\"/_next/static/chunks/807aef58565dccb1.js\"],\"ViewportBoundary\"]\na:I[51263,[\"/_next/static/chunks/5df77c9395248155.js\",\"/_next/static/chunks/807aef58565dccb1.js\"],\"MetadataBoundary\"]\nc:I[82165,[\"/_next/static/chunks/5df77c9395248155.js\",\"/_next/static/chunks/807aef58565dccb1.js\"],\"default\"]\n:HL[\"/_next/static/chunks/59cdeaf92a780e96.css\",\"style\"]\n"])</script><script>self.__next_f.push([1,"0:{\"P\":null,\"b\":\"MfA6U1EFS31sVuHA4xDF_\",\"c\":[\"\",\"_not-found\"],\"q\":\"\",\"i\":false,\"f\":[[[\"\",{\"children\":[\"/_not-found\",{\"children\":[\"__PAGE__\",{}]}]},\"$undefined\",\"$undefined\",true],[[\"$\",\"$1\",\"c\",{\"children\":[[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/chunks/59cdeaf92a780e96.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}],[\"$\",\"script\",\"script-0\",{\"src\":\"/_next/static/chunks/5df77c9395248155.js\",\"async\":true,\"nonce\":\"$undefined\"}],[\"$\",\"script\",\"script-1\",{\"src\":\"/_next/static/chunks/807aef58565dccb1.js\",\"async\":true,\"nonce\":\"$undefined\"}]],[\"$\",\"$2\",null,{\"children\":[\"$\",\"html\",null,{\"lang\":\"en\",\"className\":\"h-full\",\"children\":[[\"$\",\"head\",null,{\"children\":[[\"$\",\"title\",null,{\"children\":\"dev3000\"}],[\"$\",\"link\",null,{\"rel\":\"icon\",\"href\":\"/favicon.ico\",\"type\":\"image/x-icon\"}],[\"$\",\"link\",null,{\"rel\":\"icon\",\"href\":\"/favicon.svg\",\"type\":\"image/svg+xml\",\"sizes\":\"32x32\"}],[\"$\",\"link\",null,{\"rel\":\"icon\",\"href\":\"/favicon-16.svg\",\"type\":\"image/svg+xml\",\"sizes\":\"16x16\"}],[\"$\",\"link\",null,{\"rel\":\"icon\",\"href\":\"/favicon-64.svg\",\"type\":\"image/svg+xml\",\"sizes\":\"64x64\"}],[\"$\",\"link\",null,{\"rel\":\"apple-touch-icon\",\"href\":\"/favicon-180.png\"}],[\"$\",\"link\",null,{\"rel\":\"shortcut icon\",\"href\":\"/favicon.svg\"}],[\"$\",\"meta\",null,{\"name\":\"theme-color\",\"content\":\"#1f2937\"}]]}],[\"$\",\"body\",null,{\"className\":\"h-full\",\"children\":[\"$\",\"$L3\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L4\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":[[[\"$\",\"title\",null,{\"children\":\"404: This page could not be found.\"}],[\"$\",\"div\",null,{\"style\":{\"fontFamily\":\"system-ui,\\\"Segoe UI\\\",Roboto,Helvetica,Arial,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\"\",\"height\":\"100vh\",\"textAlign\":\"center\",\"display\":\"flex\",\"flexDirection\":\"column\",\"alignItems\":\"center\",\"justifyContent\":\"center\"},\"children\":[\"$\",\"div\",null,{\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":{\"display\":\"inline-block\",\"margin\":\"0 20px 0 0\",\"padding\":\"0 23px 0 0\",\"fontSize\":24,\"fontWeight\":500,\"verticalAlign\":\"top\",\"lineHeight\":\"49px\"},\"children\":404}],[\"$\",\"div\",null,{\"style\":{\"display\":\"inline-block\"},\"children\":[\"$\",\"h2\",null,{\"style\":{\"fontSize\":14,\"fontWeight\":400,\"lineHeight\":\"49px\",\"margin\":0},\"children\":\"This page could not be found.\"}]}]]}]}]],[]],\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]}]]}]}]]}],{\"children\":[[\"$\",\"$1\",\"c\",{\"children\":[null,[\"$\",\"$L3\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L4\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}],{\"children\":[[\"$\",\"$1\",\"c\",{\"children\":[[[\"$\",\"title\",null,{\"children\":\"404: This page could not be found.\"}],[\"$\",\"div\",null,{\"style\":\"$0:f:0:1:0:props:children:1:props:children:props:children:1:props:children:props:notFound:0:1:props:style\",\"children\":[\"$\",\"div\",null,{\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":\"$0:f:0:1:0:props:children:1:props:children:props:children:1:props:children:props:notFound:0:1:props:children:props:children:1:props:style\",\"children\":404}],[\"$\",\"div\",null,{\"style\":\"$0:f:0:1:0:props:children:1:props:children:props:children:1:props:children:props:notFound:0:1:props:children:props:children:2:props:style\",\"children\":[\"$\",\"h2\",null,{\"style\":\"$0:f:0:1:0:props:children:1:props:children:props:children:1:props:children:props:notFound:0:1:props:children:props:children:2:props:children:props:style\",\"children\":\"This page could not be found.\"}]}]]}]}]],null,[\"$\",\"$L5\",null,{\"children\":[\"$\",\"$6\",null,{\"name\":\"Next.MetadataOutlet\",\"children\":\"$@7\"}]}]]}],{},null,false,false]},null,false,false]},null,false,false],[\"$\",\"$1\",\"h\",{\"children\":[[\"$\",\"meta\",null,{\"name\":\"robots\",\"content\":\"noindex\"}],[\"$\",\"$L8\",null,{\"children\":\"$L9\"}],[\"$\",\"div\",null,{\"hidden\":true,\"children\":[\"$\",\"$La\",null,{\"children\":[\"$\",\"$6\",null,{\"name\":\"Next.Metadata\",\"children\":\"$Lb\"}]}]}],null]}],false]],\"m\":\"$undefined\",\"G\":[\"$c\",\"$undefined\"],\"S\":true}\n"])</script><script>self.__next_f.push([1,"9:[[\"$\",\"meta\",\"0\",{\"charSet\":\"utf-8\"}],[\"$\",\"meta\",\"1\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1\"}]]\n"])</script><script>self.__next_f.push([1,"7:null\nb:[]\n"])</script></body></html>