dev3000 0.0.113 → 0.0.115
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.
- package/dist/cli.js +32 -2
- package/dist/cli.js.map +1 -1
- package/dist/dev-environment.d.ts.map +1 -1
- package/dist/dev-environment.js +25 -4
- package/dist/dev-environment.js.map +1 -1
- package/dist/src/tui-interface-impl.tsx +175 -127
- package/dist/tui-interface-impl.d.ts.map +1 -1
- package/dist/tui-interface-impl.js +113 -74
- package/dist/tui-interface-impl.js.map +1 -1
- package/mcp-server/.next/BUILD_ID +1 -1
- package/mcp-server/.next/build-manifest.json +2 -2
- package/mcp-server/.next/fallback-build-manifest.json +2 -2
- package/mcp-server/.next/next-minimal-server.js.nft.json +1 -1
- package/mcp-server/.next/next-server.js.nft.json +1 -1
- package/mcp-server/.next/prerender-manifest.json +3 -3
- package/mcp-server/.next/required-server-files.json +4 -4
- package/mcp-server/.next/server/app/.well-known/workflow/v1/flow/route.js +2 -2
- package/mcp-server/.next/server/app/.well-known/workflow/v1/flow/route.js.nft.json +1 -1
- package/mcp-server/.next/server/app/.well-known/workflow/v1/step/route.js +2 -2
- package/mcp-server/.next/server/app/.well-known/workflow/v1/step/route.js.nft.json +1 -1
- package/mcp-server/.next/server/app/.well-known/workflow/v1/webhook/[token]/route.js +2 -2
- package/mcp-server/.next/server/app/.well-known/workflow/v1/webhook/[token]/route.js.nft.json +1 -1
- package/mcp-server/.next/server/app/_global-error/page.js.nft.json +1 -1
- package/mcp-server/.next/server/app/_global-error.html +2 -2
- package/mcp-server/.next/server/app/_global-error.rsc +1 -1
- package/mcp-server/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
- package/mcp-server/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/mcp-server/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/mcp-server/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/mcp-server/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/mcp-server/.next/server/app/_not-found/page.js.nft.json +1 -1
- package/mcp-server/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/mcp-server/.next/server/app/_not-found.html +1 -1
- package/mcp-server/.next/server/app/_not-found.rsc +2 -2
- package/mcp-server/.next/server/app/_not-found.segments/_full.segment.rsc +2 -2
- package/mcp-server/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
- package/mcp-server/.next/server/app/_not-found.segments/_index.segment.rsc +2 -2
- package/mcp-server/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
- package/mcp-server/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
- package/mcp-server/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
- package/mcp-server/.next/server/app/api/auth/authorize/route.js.nft.json +1 -1
- package/mcp-server/.next/server/app/api/auth/callback/route.js.nft.json +1 -1
- package/mcp-server/.next/server/app/api/auth/signout/route.js.nft.json +1 -1
- package/mcp-server/.next/server/app/api/auth/token/route.js.nft.json +1 -1
- package/mcp-server/.next/server/app/api/cloud/check-pr/route.js +2 -2
- package/mcp-server/.next/server/app/api/cloud/check-pr/route.js.nft.json +1 -1
- package/mcp-server/.next/server/app/api/cloud/fix-workflow/health/route.js.nft.json +1 -1
- package/mcp-server/.next/server/app/api/cloud/fix-workflow/route.js +2 -2
- package/mcp-server/.next/server/app/api/cloud/fix-workflow/route.js.nft.json +1 -1
- package/mcp-server/.next/server/app/api/cloud/start-fix/route.js +2 -2
- package/mcp-server/.next/server/app/api/cloud/start-fix/route.js.nft.json +1 -1
- package/mcp-server/.next/server/app/api/integration/webhook/route.js.nft.json +1 -1
- package/mcp-server/.next/server/app/api/jank/[session]/route.js.nft.json +1 -1
- package/mcp-server/.next/server/app/api/logs/append/route.js.nft.json +1 -1
- package/mcp-server/.next/server/app/api/logs/head/route.js.nft.json +1 -1
- package/mcp-server/.next/server/app/api/logs/list/route.js.nft.json +1 -1
- package/mcp-server/.next/server/app/api/logs/rotate/route.js.nft.json +1 -1
- package/mcp-server/.next/server/app/api/logs/stream/route.js.nft.json +1 -1
- package/mcp-server/.next/server/app/api/logs/tail/route.js.nft.json +1 -1
- package/mcp-server/.next/server/app/api/orchestrator/route.js.nft.json +1 -1
- package/mcp-server/.next/server/app/api/projects/[projectId]/bypass-token/route.js.nft.json +1 -1
- package/mcp-server/.next/server/app/api/projects/branches/route.js.nft.json +1 -1
- package/mcp-server/.next/server/app/api/projects/check-protection/route.js.nft.json +1 -1
- package/mcp-server/.next/server/app/api/projects/route.js.nft.json +1 -1
- package/mcp-server/.next/server/app/api/screenshots/[filename]/route.js.nft.json +1 -1
- package/mcp-server/.next/server/app/api/screenshots/list/route.js.nft.json +1 -1
- package/mcp-server/.next/server/app/api/teams/route.js.nft.json +1 -1
- package/mcp-server/.next/server/app/api/tools/route.js.nft.json +1 -1
- package/mcp-server/.next/server/app/api/workflows/route.js.nft.json +1 -1
- package/mcp-server/.next/server/app/auth/error/page.js.nft.json +1 -1
- package/mcp-server/.next/server/app/auth/error/page_client-reference-manifest.js +1 -1
- package/mcp-server/.next/server/app/auth/error.html +1 -1
- package/mcp-server/.next/server/app/auth/error.rsc +2 -2
- package/mcp-server/.next/server/app/auth/error.segments/_full.segment.rsc +2 -2
- package/mcp-server/.next/server/app/auth/error.segments/_head.segment.rsc +1 -1
- package/mcp-server/.next/server/app/auth/error.segments/_index.segment.rsc +2 -2
- package/mcp-server/.next/server/app/auth/error.segments/_tree.segment.rsc +2 -2
- package/mcp-server/.next/server/app/auth/error.segments/auth/error/__PAGE__.segment.rsc +1 -1
- package/mcp-server/.next/server/app/auth/error.segments/auth/error.segment.rsc +1 -1
- package/mcp-server/.next/server/app/auth/error.segments/auth.segment.rsc +1 -1
- package/mcp-server/.next/server/app/index.html +1 -1
- package/mcp-server/.next/server/app/index.rsc +3 -3
- package/mcp-server/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
- package/mcp-server/.next/server/app/index.segments/_full.segment.rsc +3 -3
- package/mcp-server/.next/server/app/index.segments/_head.segment.rsc +1 -1
- package/mcp-server/.next/server/app/index.segments/_index.segment.rsc +2 -2
- package/mcp-server/.next/server/app/index.segments/_tree.segment.rsc +2 -2
- package/mcp-server/.next/server/app/logs/page.js.nft.json +1 -1
- package/mcp-server/.next/server/app/logs/page_client-reference-manifest.js +1 -1
- package/mcp-server/.next/server/app/mcp/route.js.nft.json +1 -1
- package/mcp-server/.next/server/app/page.js.nft.json +1 -1
- package/mcp-server/.next/server/app/page_client-reference-manifest.js +1 -1
- package/mcp-server/.next/server/app/signin/page.js.nft.json +1 -1
- package/mcp-server/.next/server/app/signin/page_client-reference-manifest.js +1 -1
- package/mcp-server/.next/server/app/video/[session]/page.js.nft.json +1 -1
- package/mcp-server/.next/server/app/video/[session]/page_client-reference-manifest.js +1 -1
- package/mcp-server/.next/server/app/workflows/[id]/report/page.js.nft.json +1 -1
- package/mcp-server/.next/server/app/workflows/[id]/report/page_client-reference-manifest.js +1 -1
- package/mcp-server/.next/server/app/workflows/new/page.js.nft.json +1 -1
- package/mcp-server/.next/server/app/workflows/new/page_client-reference-manifest.js +1 -1
- package/mcp-server/.next/server/app/workflows/page.js.nft.json +1 -1
- package/mcp-server/.next/server/app/workflows/page_client-reference-manifest.js +1 -1
- package/mcp-server/.next/server/chunks/[root-of-the-server]__157de66b._.js +101 -36
- package/mcp-server/.next/server/chunks/[root-of-the-server]__157de66b._.js.map +1 -1
- package/mcp-server/.next/server/chunks/{[root-of-the-server]__f99bd75f._.js → [root-of-the-server]__2920484d._.js} +2 -2
- package/mcp-server/.next/server/chunks/{[root-of-the-server]__f99bd75f._.js.map → [root-of-the-server]__2920484d._.js.map} +1 -1
- package/mcp-server/.next/server/chunks/{[root-of-the-server]__d6a224bc._.js → [root-of-the-server]__71b44a42._.js} +14 -14
- package/mcp-server/.next/server/chunks/[root-of-the-server]__71b44a42._.js.map +1 -0
- package/mcp-server/.next/server/chunks/[root-of-the-server]__730a8fd0._.js +1 -1
- package/mcp-server/.next/server/chunks/[root-of-the-server]__730a8fd0._.js.map +1 -1
- package/mcp-server/.next/server/chunks/{[root-of-the-server]__c86876f8._.js → [root-of-the-server]__76031cfc._.js} +2 -2
- package/mcp-server/.next/server/chunks/{[root-of-the-server]__c86876f8._.js.map → [root-of-the-server]__76031cfc._.js.map} +1 -1
- package/mcp-server/.next/server/chunks/{[root-of-the-server]__c5e6aa23._.js → [root-of-the-server]__832ec618._.js} +2 -2
- package/mcp-server/.next/server/chunks/{[root-of-the-server]__c5e6aa23._.js.map → [root-of-the-server]__832ec618._.js.map} +1 -1
- package/mcp-server/.next/server/chunks/{[root-of-the-server]__41aa7b20._.js → [root-of-the-server]__b194d4eb._.js} +13 -13
- package/mcp-server/.next/server/chunks/[root-of-the-server]__b194d4eb._.js.map +1 -0
- package/mcp-server/.next/server/chunks/[root-of-the-server]__c1681338._.js +3 -0
- package/mcp-server/.next/server/chunks/[root-of-the-server]__c1681338._.js.map +1 -0
- package/mcp-server/.next/server/chunks/{[root-of-the-server]__d37c38d3._.js → [root-of-the-server]__e6808c21._.js} +2 -2
- package/mcp-server/.next/server/chunks/{[root-of-the-server]__d37c38d3._.js.map → [root-of-the-server]__e6808c21._.js.map} +1 -1
- package/mcp-server/.next/server/chunks/{[root-of-the-server]__446f0436._.js → [root-of-the-server]__ec6a1335._.js} +2 -2
- package/mcp-server/.next/server/chunks/[root-of-the-server]__ec6a1335._.js.map +1 -0
- package/mcp-server/.next/server/chunks/bee4f_next_dist_esm_build_templates_app-route_1ece9366.js +5 -5
- package/mcp-server/.next/server/chunks/bee4f_next_dist_esm_build_templates_app-route_1ece9366.js.map +1 -1
- package/mcp-server/.next/server/chunks/mcp-server_app_api_cloud_fix-workflow_steps_ts_b65f3271._.js +30 -16
- package/mcp-server/.next/server/chunks/mcp-server_app_api_cloud_fix-workflow_steps_ts_b65f3271._.js.map +1 -1
- package/mcp-server/.next/server/chunks/node_modules__pnpm_85ddbe9c._.js +2 -2
- package/mcp-server/.next/server/chunks/node_modules__pnpm_85ddbe9c._.js.map +1 -1
- package/mcp-server/.next/server/chunks/ssr/[root-of-the-server]__2e44f0db._.js +3 -0
- package/mcp-server/.next/server/chunks/ssr/[root-of-the-server]__2e44f0db._.js.map +1 -0
- package/mcp-server/.next/server/chunks/ssr/[root-of-the-server]__3585c949._.js +3 -0
- package/mcp-server/.next/server/chunks/ssr/[root-of-the-server]__3585c949._.js.map +1 -0
- package/mcp-server/.next/server/chunks/ssr/[root-of-the-server]__477c3bbb._.js +3 -0
- package/mcp-server/.next/server/chunks/ssr/[root-of-the-server]__477c3bbb._.js.map +1 -0
- package/mcp-server/.next/server/chunks/ssr/{[root-of-the-server]__570677dc._.js → [root-of-the-server]__880839a0._.js} +2 -2
- package/mcp-server/.next/server/chunks/ssr/[root-of-the-server]__880839a0._.js.map +1 -0
- package/mcp-server/.next/server/chunks/ssr/_41b8f993._.js +3 -0
- package/mcp-server/.next/server/chunks/ssr/_41b8f993._.js.map +1 -0
- package/mcp-server/.next/server/chunks/ssr/_9ba0ef29._.js +3 -0
- package/mcp-server/.next/server/chunks/ssr/_9ba0ef29._.js.map +1 -0
- package/mcp-server/.next/server/chunks/ssr/_cd4dc25e._.js.map +1 -1
- package/mcp-server/.next/server/chunks/ssr/mcp-server_app_workflows_new_new-workflow-client_tsx_1312c046._.js +2 -2
- package/mcp-server/.next/server/chunks/ssr/mcp-server_app_workflows_new_new-workflow-client_tsx_1312c046._.js.map +1 -1
- package/mcp-server/.next/server/chunks/ssr/mcp-server_app_workflows_workflows-client_tsx_268cfd4a._.js +7 -0
- package/mcp-server/.next/server/chunks/ssr/mcp-server_app_workflows_workflows-client_tsx_268cfd4a._.js.map +1 -0
- package/mcp-server/.next/server/chunks/ssr/node_modules__pnpm_961f21c4._.js +3 -0
- package/mcp-server/.next/server/chunks/ssr/node_modules__pnpm_961f21c4._.js.map +1 -0
- package/mcp-server/.next/server/chunks/ssr/node_modules__pnpm_a82244bf._.js +3 -0
- package/mcp-server/.next/server/chunks/ssr/node_modules__pnpm_a82244bf._.js.map +1 -0
- package/mcp-server/.next/server/chunks/ssr/{node_modules__pnpm_07527699._.js → node_modules__pnpm_eb98e511._.js} +2 -2
- package/mcp-server/.next/server/chunks/ssr/node_modules__pnpm_eb98e511._.js.map +1 -0
- package/mcp-server/.next/server/middleware.js.nft.json +1 -1
- package/mcp-server/.next/server/server-reference-manifest.js +1 -1
- package/mcp-server/.next/server/server-reference-manifest.json +1 -1
- package/mcp-server/.next/static/chunks/000849a6a897f531.css +1 -0
- package/mcp-server/.next/static/chunks/048cee2510ddb1a0.js +1 -0
- package/mcp-server/.next/static/chunks/0622bd0e093adee7.js +3 -0
- package/mcp-server/.next/static/chunks/{46f60efee5f19794.js → 16359f64918a93f3.js} +1 -1
- package/mcp-server/.next/static/chunks/1851a3e70d7efc10.js +1 -0
- package/mcp-server/.next/static/chunks/{cc6addc4bb10fa11.js → 2ad16eeb719786f1.js} +1 -1
- package/mcp-server/.next/static/chunks/57feca7a4e06545e.js +7 -0
- package/mcp-server/.next/static/chunks/93db5737a327ab0c.js +6 -0
- package/mcp-server/.next/static/chunks/9fd3c715ecfb4d05.js +1 -0
- package/mcp-server/.next/static/chunks/b4b1ec6435790587.js +1 -0
- package/mcp-server/.next/static/chunks/cfe150cb2048b7e8.js +1 -0
- package/mcp-server/app/api/cloud/fix-workflow/steps.ts +267 -28
- package/mcp-server/app/api/cloud/fix-workflow/workflow.ts +16 -8
- package/mcp-server/app/api/cloud/start-fix/route.ts +2 -2
- package/mcp-server/app/api/workflows/route.ts +45 -1
- package/mcp-server/app/workflows/workflows-client.tsx +259 -100
- package/mcp-server/package.json +1 -1
- package/package.json +3 -3
- package/src/tui-interface-impl.tsx +175 -127
- package/mcp-server/.next/server/chunks/[root-of-the-server]__41aa7b20._.js.map +0 -1
- package/mcp-server/.next/server/chunks/[root-of-the-server]__446f0436._.js.map +0 -1
- package/mcp-server/.next/server/chunks/[root-of-the-server]__c508da18._.js +0 -3
- package/mcp-server/.next/server/chunks/[root-of-the-server]__c508da18._.js.map +0 -1
- package/mcp-server/.next/server/chunks/[root-of-the-server]__d6a224bc._.js.map +0 -1
- package/mcp-server/.next/server/chunks/ssr/[root-of-the-server]__0ff05d72._.js +0 -3
- package/mcp-server/.next/server/chunks/ssr/[root-of-the-server]__0ff05d72._.js.map +0 -1
- package/mcp-server/.next/server/chunks/ssr/[root-of-the-server]__27cc5956._.js +0 -3
- package/mcp-server/.next/server/chunks/ssr/[root-of-the-server]__27cc5956._.js.map +0 -1
- package/mcp-server/.next/server/chunks/ssr/[root-of-the-server]__570677dc._.js.map +0 -1
- package/mcp-server/.next/server/chunks/ssr/[root-of-the-server]__ef510343._.js +0 -3
- package/mcp-server/.next/server/chunks/ssr/[root-of-the-server]__ef510343._.js.map +0 -1
- package/mcp-server/.next/server/chunks/ssr/node_modules__pnpm_07527699._.js.map +0 -1
- package/mcp-server/.next/server/chunks/ssr/node_modules__pnpm_7cc36047._.js +0 -3
- package/mcp-server/.next/server/chunks/ssr/node_modules__pnpm_7cc36047._.js.map +0 -1
- package/mcp-server/.next/static/chunks/07848f6bd2a7e5f6.js +0 -3
- package/mcp-server/.next/static/chunks/637a66565f27572f.js +0 -6
- package/mcp-server/.next/static/chunks/aed4fb5252a4bc95.js +0 -3
- package/mcp-server/.next/static/chunks/e8d521464b0c96ca.css +0 -1
- package/mcp-server/.next/static/chunks/ff53279afa939907.js +0 -1
- package/mcp-server/.next/static/chunks/ffa2ecb6845be49c.js +0 -1
- /package/mcp-server/.next/static/{UcmWUkU-l9iLeWRnSUybj → 5zfTZk2QSS7WLdL1K8Q5I}/_buildManifest.js +0 -0
- /package/mcp-server/.next/static/{UcmWUkU-l9iLeWRnSUybj → 5zfTZk2QSS7WLdL1K8Q5I}/_clientMiddlewareManifest.json +0 -0
- /package/mcp-server/.next/static/{UcmWUkU-l9iLeWRnSUybj → 5zfTZk2QSS7WLdL1K8Q5I}/_ssgManifest.js +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
(globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,77607,e=>{"use strict";var r=e.i(44869);let t=e=>{let r=e.replace(/^([A-Z])|[\s-_]+(\w)/g,(e,r,t)=>t?t.toUpperCase():r.toLowerCase());return r.charAt(0).toUpperCase()+r.slice(1)},o=(...e)=>e.filter((e,r,t)=>!!e&&""!==e.trim()&&t.indexOf(e)===r).join(" ").trim();var n={xmlns:"http://www.w3.org/2000/svg",width:24,height:24,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:2,strokeLinecap:"round",strokeLinejoin:"round"};let l=(0,r.forwardRef)(({color:e="currentColor",size:t=24,strokeWidth:l=2,absoluteStrokeWidth:s,className:i="",children:a,iconNode:d,...c},p)=>(0,r.createElement)("svg",{ref:p,...n,width:t,height:t,stroke:e,strokeWidth:s?24*Number(l)/Number(t):l,className:o("lucide",i),...!a&&!(e=>{for(let r in e)if(r.startsWith("aria-")||"role"===r||"title"===r)return!0})(c)&&{"aria-hidden":"true"},...c},[...d.map(([e,t])=>(0,r.createElement)(e,t)),...Array.isArray(a)?a:[a]])),s=(e,n)=>{let s=(0,r.forwardRef)(({className:s,...i},a)=>(0,r.createElement)(l,{ref:a,iconNode:n,className:o(`lucide-${t(e).replace(/([a-z0-9])([A-Z])/g,"$1-$2").toLowerCase()}`,`lucide-${e}`,s),...i}));return s.displayName=t(e),s};e.s(["default",()=>s],77607)},94237,70508,e=>{"use strict";function r(){for(var e,r,t=0,o="",n=arguments.length;t<n;t++)(e=arguments[t])&&(r=function e(r){var t,o,n="";if("string"==typeof r||"number"==typeof r)n+=r;else if("object"==typeof r)if(Array.isArray(r)){var l=r.length;for(t=0;t<l;t++)r[t]&&(o=e(r[t]))&&(n&&(n+=" "),n+=o)}else for(o in r)r[o]&&(n&&(n+=" "),n+=o);return n}(e))&&(o&&(o+=" "),o+=r);return o}let t=e=>"boolean"==typeof e?`${e}`:0===e?"0":e;e.s(["cva",0,(e,o)=>n=>{var l;if((null==o?void 0:o.variants)==null)return r(e,null==n?void 0:n.class,null==n?void 0:n.className);let{variants:s,defaultVariants:i}=o,a=Object.keys(s).map(e=>{let r=null==n?void 0:n[e],o=null==i?void 0:i[e];if(null===r)return null;let l=t(r)||t(o);return s[e][l]}),d=n&&Object.entries(n).reduce((e,r)=>{let[t,o]=r;return void 0===o||(e[t]=o),e},{});return r(e,a,null==o||null==(l=o.compoundVariants)?void 0:l.reduce((e,r)=>{let{class:t,className:o,...n}=r;return Object.entries(n).every(e=>{let[r,t]=e;return Array.isArray(t)?t.includes({...i,...d}[r]):({...i,...d})[r]===t})?[...e,t,o]:e},[]),null==n?void 0:n.class,null==n?void 0:n.className)}],94237);let o=(e,r)=>{if(0===e.length)return r.classGroupId;let t=e[0],n=r.nextPart.get(t),l=n?o(e.slice(1),n):void 0;if(l)return l;if(0===r.validators.length)return;let s=e.join("-");return r.validators.find(({validator:e})=>e(s))?.classGroupId},n=/^\[(.+)\]$/,l=(e,r,t,o)=>{e.forEach(e=>{if("string"==typeof e){(""===e?r:s(r,e)).classGroupId=t;return}"function"==typeof e?i(e)?l(e(o),r,t,o):r.validators.push({validator:e,classGroupId:t}):Object.entries(e).forEach(([e,n])=>{l(n,s(r,e),t,o)})})},s=(e,r)=>{let t=e;return r.split("-").forEach(e=>{t.nextPart.has(e)||t.nextPart.set(e,{nextPart:new Map,validators:[]}),t=t.nextPart.get(e)}),t},i=e=>e.isThemeGetter,a=(e,r)=>r?e.map(([e,t])=>[e,t.map(e=>"string"==typeof e?r+e:"object"==typeof e?Object.fromEntries(Object.entries(e).map(([e,t])=>[r+e,t])):e)]):e,d=e=>{if(e.length<=1)return e;let r=[],t=[];return e.forEach(e=>{"["===e[0]?(r.push(...t.sort(),e),t=[]):t.push(e)}),r.push(...t.sort()),r},c=/\s+/;function p(){let e,r,t=0,o="";for(;t<arguments.length;)(e=arguments[t++])&&(r=u(e))&&(o&&(o+=" "),o+=r);return o}let u=e=>{let r;if("string"==typeof e)return e;let t="";for(let o=0;o<e.length;o++)e[o]&&(r=u(e[o]))&&(t&&(t+=" "),t+=r);return t},b=e=>{let r=r=>r[e]||[];return r.isThemeGetter=!0,r},f=/^\[(?:([a-z-]+):)?(.+)\]$/i,m=/^\d+\/\d+$/,g=new Set(["px","full","screen"]),h=/^(\d+(\.\d+)?)?(xs|sm|md|lg|xl)$/,y=/\d+(%|px|r?em|[sdl]?v([hwib]|min|max)|pt|pc|in|cm|mm|cap|ch|ex|r?lh|cq(w|h|i|b|min|max))|\b(calc|min|max|clamp)\(.+\)|^0$/,v=/^(rgba?|hsla?|hwb|(ok)?(lab|lch))\(.+\)$/,x=/^(inset_)?-?((\d+)?\.?(\d+)[a-z]+|0)_-?((\d+)?\.?(\d+)[a-z]+|0)/,w=/^(url|image|image-set|cross-fade|element|(repeating-)?(linear|radial|conic)-gradient)\(.+\)$/,k=e=>j(e)||g.has(e)||m.test(e),z=e=>I(e,"length",M),j=e=>!!e&&!Number.isNaN(Number(e)),C=e=>I(e,"number",j),S=e=>!!e&&Number.isInteger(Number(e)),N=e=>e.endsWith("%")&&j(e.slice(0,-1)),$=e=>f.test(e),R=e=>h.test(e),E=new Set(["length","size","percentage"]),O=e=>I(e,E,T),P=e=>I(e,"position",T),A=new Set(["image","url"]),G=e=>I(e,A,B),W=e=>I(e,"",V),_=()=>!0,I=(e,r,t)=>{let o=f.exec(e);return!!o&&(o[1]?"string"==typeof r?o[1]===r:r.has(o[1]):t(o[2]))},M=e=>y.test(e)&&!v.test(e),T=()=>!1,V=e=>x.test(e),B=e=>w.test(e),L=function(e,...r){let t,s,i,u=function(d){let c;return s=(t={cache:(e=>{if(e<1)return{get:()=>void 0,set:()=>{}};let r=0,t=new Map,o=new Map,n=(n,l)=>{t.set(n,l),++r>e&&(r=0,o=t,t=new Map)};return{get(e){let r=t.get(e);return void 0!==r?r:void 0!==(r=o.get(e))?(n(e,r),r):void 0},set(e,r){t.has(e)?t.set(e,r):n(e,r)}}})((c=r.reduce((e,r)=>r(e),e())).cacheSize),parseClassName:(e=>{let{separator:r,experimentalParseClassName:t}=e,o=1===r.length,n=r[0],l=r.length,s=e=>{let t,s=[],i=0,a=0;for(let d=0;d<e.length;d++){let c=e[d];if(0===i){if(c===n&&(o||e.slice(d,d+l)===r)){s.push(e.slice(a,d)),a=d+l;continue}if("/"===c){t=d;continue}}"["===c?i++:"]"===c&&i--}let d=0===s.length?e:e.substring(a),c=d.startsWith("!"),p=c?d.substring(1):d;return{modifiers:s,hasImportantModifier:c,baseClassName:p,maybePostfixModifierPosition:t&&t>a?t-a:void 0}};return t?e=>t({className:e,parseClassName:s}):s})(c),...(e=>{let r=(e=>{let{theme:r,prefix:t}=e,o={nextPart:new Map,validators:[]};return a(Object.entries(e.classGroups),t).forEach(([e,t])=>{l(t,o,e,r)}),o})(e),{conflictingClassGroups:t,conflictingClassGroupModifiers:s}=e;return{getClassGroupId:e=>{let t=e.split("-");return""===t[0]&&1!==t.length&&t.shift(),o(t,r)||(e=>{if(n.test(e)){let r=n.exec(e)[1],t=r?.substring(0,r.indexOf(":"));if(t)return"arbitrary.."+t}})(e)},getConflictingClassGroupIds:(e,r)=>{let o=t[e]||[];return r&&s[e]?[...o,...s[e]]:o}}})(c)}).cache.get,i=t.cache.set,u=b,b(d)};function b(e){let r=s(e);if(r)return r;let o=((e,r)=>{let{parseClassName:t,getClassGroupId:o,getConflictingClassGroupIds:n}=r,l=[],s=e.trim().split(c),i="";for(let e=s.length-1;e>=0;e-=1){let r=s[e],{modifiers:a,hasImportantModifier:c,baseClassName:p,maybePostfixModifierPosition:u}=t(r),b=!!u,f=o(b?p.substring(0,u):p);if(!f){if(!b||!(f=o(p))){i=r+(i.length>0?" "+i:i);continue}b=!1}let m=d(a).join(":"),g=c?m+"!":m,h=g+f;if(l.includes(h))continue;l.push(h);let y=n(f,b);for(let e=0;e<y.length;++e){let r=y[e];l.push(g+r)}i=r+(i.length>0?" "+i:i)}return i})(e,t);return i(e,o),o}return function(){return u(p.apply(null,arguments))}}(()=>{let e=b("colors"),r=b("spacing"),t=b("blur"),o=b("brightness"),n=b("borderColor"),l=b("borderRadius"),s=b("borderSpacing"),i=b("borderWidth"),a=b("contrast"),d=b("grayscale"),c=b("hueRotate"),p=b("invert"),u=b("gap"),f=b("gradientColorStops"),m=b("gradientColorStopPositions"),g=b("inset"),h=b("margin"),y=b("opacity"),v=b("padding"),x=b("saturate"),w=b("scale"),E=b("sepia"),A=b("skew"),I=b("space"),M=b("translate"),T=()=>["auto","contain","none"],V=()=>["auto","hidden","clip","visible","scroll"],B=()=>["auto",$,r],L=()=>[$,r],U=()=>["",k,z],Z=()=>["auto",j,$],q=()=>["bottom","center","left","left-bottom","left-top","right","right-bottom","right-top","top"],D=()=>["solid","dashed","dotted","double","none"],K=()=>["normal","multiply","screen","overlay","darken","lighten","color-dodge","color-burn","hard-light","soft-light","difference","exclusion","hue","saturation","color","luminosity"],F=()=>["start","end","center","between","around","evenly","stretch"],H=()=>["","0",$],J=()=>["auto","avoid","all","avoid-page","page","left","right","column"],Q=()=>[j,$];return{cacheSize:500,separator:":",theme:{colors:[_],spacing:[k,z],blur:["none","",R,$],brightness:Q(),borderColor:[e],borderRadius:["none","","full",R,$],borderSpacing:L(),borderWidth:U(),contrast:Q(),grayscale:H(),hueRotate:Q(),invert:H(),gap:L(),gradientColorStops:[e],gradientColorStopPositions:[N,z],inset:B(),margin:B(),opacity:Q(),padding:L(),saturate:Q(),scale:Q(),sepia:H(),skew:Q(),space:L(),translate:L()},classGroups:{aspect:[{aspect:["auto","square","video",$]}],container:["container"],columns:[{columns:[R]}],"break-after":[{"break-after":J()}],"break-before":[{"break-before":J()}],"break-inside":[{"break-inside":["auto","avoid","avoid-page","avoid-column"]}],"box-decoration":[{"box-decoration":["slice","clone"]}],box:[{box:["border","content"]}],display:["block","inline-block","inline","flex","inline-flex","table","inline-table","table-caption","table-cell","table-column","table-column-group","table-footer-group","table-header-group","table-row-group","table-row","flow-root","grid","inline-grid","contents","list-item","hidden"],float:[{float:["right","left","none","start","end"]}],clear:[{clear:["left","right","both","none","start","end"]}],isolation:["isolate","isolation-auto"],"object-fit":[{object:["contain","cover","fill","none","scale-down"]}],"object-position":[{object:[...q(),$]}],overflow:[{overflow:V()}],"overflow-x":[{"overflow-x":V()}],"overflow-y":[{"overflow-y":V()}],overscroll:[{overscroll:T()}],"overscroll-x":[{"overscroll-x":T()}],"overscroll-y":[{"overscroll-y":T()}],position:["static","fixed","absolute","relative","sticky"],inset:[{inset:[g]}],"inset-x":[{"inset-x":[g]}],"inset-y":[{"inset-y":[g]}],start:[{start:[g]}],end:[{end:[g]}],top:[{top:[g]}],right:[{right:[g]}],bottom:[{bottom:[g]}],left:[{left:[g]}],visibility:["visible","invisible","collapse"],z:[{z:["auto",S,$]}],basis:[{basis:B()}],"flex-direction":[{flex:["row","row-reverse","col","col-reverse"]}],"flex-wrap":[{flex:["wrap","wrap-reverse","nowrap"]}],flex:[{flex:["1","auto","initial","none",$]}],grow:[{grow:H()}],shrink:[{shrink:H()}],order:[{order:["first","last","none",S,$]}],"grid-cols":[{"grid-cols":[_]}],"col-start-end":[{col:["auto",{span:["full",S,$]},$]}],"col-start":[{"col-start":Z()}],"col-end":[{"col-end":Z()}],"grid-rows":[{"grid-rows":[_]}],"row-start-end":[{row:["auto",{span:[S,$]},$]}],"row-start":[{"row-start":Z()}],"row-end":[{"row-end":Z()}],"grid-flow":[{"grid-flow":["row","col","dense","row-dense","col-dense"]}],"auto-cols":[{"auto-cols":["auto","min","max","fr",$]}],"auto-rows":[{"auto-rows":["auto","min","max","fr",$]}],gap:[{gap:[u]}],"gap-x":[{"gap-x":[u]}],"gap-y":[{"gap-y":[u]}],"justify-content":[{justify:["normal",...F()]}],"justify-items":[{"justify-items":["start","end","center","stretch"]}],"justify-self":[{"justify-self":["auto","start","end","center","stretch"]}],"align-content":[{content:["normal",...F(),"baseline"]}],"align-items":[{items:["start","end","center","baseline","stretch"]}],"align-self":[{self:["auto","start","end","center","stretch","baseline"]}],"place-content":[{"place-content":[...F(),"baseline"]}],"place-items":[{"place-items":["start","end","center","baseline","stretch"]}],"place-self":[{"place-self":["auto","start","end","center","stretch"]}],p:[{p:[v]}],px:[{px:[v]}],py:[{py:[v]}],ps:[{ps:[v]}],pe:[{pe:[v]}],pt:[{pt:[v]}],pr:[{pr:[v]}],pb:[{pb:[v]}],pl:[{pl:[v]}],m:[{m:[h]}],mx:[{mx:[h]}],my:[{my:[h]}],ms:[{ms:[h]}],me:[{me:[h]}],mt:[{mt:[h]}],mr:[{mr:[h]}],mb:[{mb:[h]}],ml:[{ml:[h]}],"space-x":[{"space-x":[I]}],"space-x-reverse":["space-x-reverse"],"space-y":[{"space-y":[I]}],"space-y-reverse":["space-y-reverse"],w:[{w:["auto","min","max","fit","svw","lvw","dvw",$,r]}],"min-w":[{"min-w":[$,r,"min","max","fit"]}],"max-w":[{"max-w":[$,r,"none","full","min","max","fit","prose",{screen:[R]},R]}],h:[{h:[$,r,"auto","min","max","fit","svh","lvh","dvh"]}],"min-h":[{"min-h":[$,r,"min","max","fit","svh","lvh","dvh"]}],"max-h":[{"max-h":[$,r,"min","max","fit","svh","lvh","dvh"]}],size:[{size:[$,r,"auto","min","max","fit"]}],"font-size":[{text:["base",R,z]}],"font-smoothing":["antialiased","subpixel-antialiased"],"font-style":["italic","not-italic"],"font-weight":[{font:["thin","extralight","light","normal","medium","semibold","bold","extrabold","black",C]}],"font-family":[{font:[_]}],"fvn-normal":["normal-nums"],"fvn-ordinal":["ordinal"],"fvn-slashed-zero":["slashed-zero"],"fvn-figure":["lining-nums","oldstyle-nums"],"fvn-spacing":["proportional-nums","tabular-nums"],"fvn-fraction":["diagonal-fractions","stacked-fractions"],tracking:[{tracking:["tighter","tight","normal","wide","wider","widest",$]}],"line-clamp":[{"line-clamp":["none",j,C]}],leading:[{leading:["none","tight","snug","normal","relaxed","loose",k,$]}],"list-image":[{"list-image":["none",$]}],"list-style-type":[{list:["none","disc","decimal",$]}],"list-style-position":[{list:["inside","outside"]}],"placeholder-color":[{placeholder:[e]}],"placeholder-opacity":[{"placeholder-opacity":[y]}],"text-alignment":[{text:["left","center","right","justify","start","end"]}],"text-color":[{text:[e]}],"text-opacity":[{"text-opacity":[y]}],"text-decoration":["underline","overline","line-through","no-underline"],"text-decoration-style":[{decoration:[...D(),"wavy"]}],"text-decoration-thickness":[{decoration:["auto","from-font",k,z]}],"underline-offset":[{"underline-offset":["auto",k,$]}],"text-decoration-color":[{decoration:[e]}],"text-transform":["uppercase","lowercase","capitalize","normal-case"],"text-overflow":["truncate","text-ellipsis","text-clip"],"text-wrap":[{text:["wrap","nowrap","balance","pretty"]}],indent:[{indent:L()}],"vertical-align":[{align:["baseline","top","middle","bottom","text-top","text-bottom","sub","super",$]}],whitespace:[{whitespace:["normal","nowrap","pre","pre-line","pre-wrap","break-spaces"]}],break:[{break:["normal","words","all","keep"]}],hyphens:[{hyphens:["none","manual","auto"]}],content:[{content:["none",$]}],"bg-attachment":[{bg:["fixed","local","scroll"]}],"bg-clip":[{"bg-clip":["border","padding","content","text"]}],"bg-opacity":[{"bg-opacity":[y]}],"bg-origin":[{"bg-origin":["border","padding","content"]}],"bg-position":[{bg:[...q(),P]}],"bg-repeat":[{bg:["no-repeat",{repeat:["","x","y","round","space"]}]}],"bg-size":[{bg:["auto","cover","contain",O]}],"bg-image":[{bg:["none",{"gradient-to":["t","tr","r","br","b","bl","l","tl"]},G]}],"bg-color":[{bg:[e]}],"gradient-from-pos":[{from:[m]}],"gradient-via-pos":[{via:[m]}],"gradient-to-pos":[{to:[m]}],"gradient-from":[{from:[f]}],"gradient-via":[{via:[f]}],"gradient-to":[{to:[f]}],rounded:[{rounded:[l]}],"rounded-s":[{"rounded-s":[l]}],"rounded-e":[{"rounded-e":[l]}],"rounded-t":[{"rounded-t":[l]}],"rounded-r":[{"rounded-r":[l]}],"rounded-b":[{"rounded-b":[l]}],"rounded-l":[{"rounded-l":[l]}],"rounded-ss":[{"rounded-ss":[l]}],"rounded-se":[{"rounded-se":[l]}],"rounded-ee":[{"rounded-ee":[l]}],"rounded-es":[{"rounded-es":[l]}],"rounded-tl":[{"rounded-tl":[l]}],"rounded-tr":[{"rounded-tr":[l]}],"rounded-br":[{"rounded-br":[l]}],"rounded-bl":[{"rounded-bl":[l]}],"border-w":[{border:[i]}],"border-w-x":[{"border-x":[i]}],"border-w-y":[{"border-y":[i]}],"border-w-s":[{"border-s":[i]}],"border-w-e":[{"border-e":[i]}],"border-w-t":[{"border-t":[i]}],"border-w-r":[{"border-r":[i]}],"border-w-b":[{"border-b":[i]}],"border-w-l":[{"border-l":[i]}],"border-opacity":[{"border-opacity":[y]}],"border-style":[{border:[...D(),"hidden"]}],"divide-x":[{"divide-x":[i]}],"divide-x-reverse":["divide-x-reverse"],"divide-y":[{"divide-y":[i]}],"divide-y-reverse":["divide-y-reverse"],"divide-opacity":[{"divide-opacity":[y]}],"divide-style":[{divide:D()}],"border-color":[{border:[n]}],"border-color-x":[{"border-x":[n]}],"border-color-y":[{"border-y":[n]}],"border-color-s":[{"border-s":[n]}],"border-color-e":[{"border-e":[n]}],"border-color-t":[{"border-t":[n]}],"border-color-r":[{"border-r":[n]}],"border-color-b":[{"border-b":[n]}],"border-color-l":[{"border-l":[n]}],"divide-color":[{divide:[n]}],"outline-style":[{outline:["",...D()]}],"outline-offset":[{"outline-offset":[k,$]}],"outline-w":[{outline:[k,z]}],"outline-color":[{outline:[e]}],"ring-w":[{ring:U()}],"ring-w-inset":["ring-inset"],"ring-color":[{ring:[e]}],"ring-opacity":[{"ring-opacity":[y]}],"ring-offset-w":[{"ring-offset":[k,z]}],"ring-offset-color":[{"ring-offset":[e]}],shadow:[{shadow:["","inner","none",R,W]}],"shadow-color":[{shadow:[_]}],opacity:[{opacity:[y]}],"mix-blend":[{"mix-blend":[...K(),"plus-lighter","plus-darker"]}],"bg-blend":[{"bg-blend":K()}],filter:[{filter:["","none"]}],blur:[{blur:[t]}],brightness:[{brightness:[o]}],contrast:[{contrast:[a]}],"drop-shadow":[{"drop-shadow":["","none",R,$]}],grayscale:[{grayscale:[d]}],"hue-rotate":[{"hue-rotate":[c]}],invert:[{invert:[p]}],saturate:[{saturate:[x]}],sepia:[{sepia:[E]}],"backdrop-filter":[{"backdrop-filter":["","none"]}],"backdrop-blur":[{"backdrop-blur":[t]}],"backdrop-brightness":[{"backdrop-brightness":[o]}],"backdrop-contrast":[{"backdrop-contrast":[a]}],"backdrop-grayscale":[{"backdrop-grayscale":[d]}],"backdrop-hue-rotate":[{"backdrop-hue-rotate":[c]}],"backdrop-invert":[{"backdrop-invert":[p]}],"backdrop-opacity":[{"backdrop-opacity":[y]}],"backdrop-saturate":[{"backdrop-saturate":[x]}],"backdrop-sepia":[{"backdrop-sepia":[E]}],"border-collapse":[{border:["collapse","separate"]}],"border-spacing":[{"border-spacing":[s]}],"border-spacing-x":[{"border-spacing-x":[s]}],"border-spacing-y":[{"border-spacing-y":[s]}],"table-layout":[{table:["auto","fixed"]}],caption:[{caption:["top","bottom"]}],transition:[{transition:["none","all","","colors","opacity","shadow","transform",$]}],duration:[{duration:Q()}],ease:[{ease:["linear","in","out","in-out",$]}],delay:[{delay:Q()}],animate:[{animate:["none","spin","ping","pulse","bounce",$]}],transform:[{transform:["","gpu","none"]}],scale:[{scale:[w]}],"scale-x":[{"scale-x":[w]}],"scale-y":[{"scale-y":[w]}],rotate:[{rotate:[S,$]}],"translate-x":[{"translate-x":[M]}],"translate-y":[{"translate-y":[M]}],"skew-x":[{"skew-x":[A]}],"skew-y":[{"skew-y":[A]}],"transform-origin":[{origin:["center","top","top-right","right","bottom-right","bottom","bottom-left","left","top-left",$]}],accent:[{accent:["auto",e]}],appearance:[{appearance:["none","auto"]}],cursor:[{cursor:["auto","default","pointer","wait","text","move","help","not-allowed","none","context-menu","progress","cell","crosshair","vertical-text","alias","copy","no-drop","grab","grabbing","all-scroll","col-resize","row-resize","n-resize","e-resize","s-resize","w-resize","ne-resize","nw-resize","se-resize","sw-resize","ew-resize","ns-resize","nesw-resize","nwse-resize","zoom-in","zoom-out",$]}],"caret-color":[{caret:[e]}],"pointer-events":[{"pointer-events":["none","auto"]}],resize:[{resize:["none","y","x",""]}],"scroll-behavior":[{scroll:["auto","smooth"]}],"scroll-m":[{"scroll-m":L()}],"scroll-mx":[{"scroll-mx":L()}],"scroll-my":[{"scroll-my":L()}],"scroll-ms":[{"scroll-ms":L()}],"scroll-me":[{"scroll-me":L()}],"scroll-mt":[{"scroll-mt":L()}],"scroll-mr":[{"scroll-mr":L()}],"scroll-mb":[{"scroll-mb":L()}],"scroll-ml":[{"scroll-ml":L()}],"scroll-p":[{"scroll-p":L()}],"scroll-px":[{"scroll-px":L()}],"scroll-py":[{"scroll-py":L()}],"scroll-ps":[{"scroll-ps":L()}],"scroll-pe":[{"scroll-pe":L()}],"scroll-pt":[{"scroll-pt":L()}],"scroll-pr":[{"scroll-pr":L()}],"scroll-pb":[{"scroll-pb":L()}],"scroll-pl":[{"scroll-pl":L()}],"snap-align":[{snap:["start","end","center","align-none"]}],"snap-stop":[{snap:["normal","always"]}],"snap-type":[{snap:["none","x","y","both"]}],"snap-strictness":[{snap:["mandatory","proximity"]}],touch:[{touch:["auto","none","manipulation"]}],"touch-x":[{"touch-pan":["x","left","right"]}],"touch-y":[{"touch-pan":["y","up","down"]}],"touch-pz":["touch-pinch-zoom"],select:[{select:["none","text","all","auto"]}],"will-change":[{"will-change":["auto","scroll","contents","transform",$]}],fill:[{fill:[e,"none"]}],"stroke-w":[{stroke:[k,z,C]}],stroke:[{stroke:[e,"none"]}],sr:["sr-only","not-sr-only"],"forced-color-adjust":[{"forced-color-adjust":["auto","none"]}]},conflictingClassGroups:{overflow:["overflow-x","overflow-y"],overscroll:["overscroll-x","overscroll-y"],inset:["inset-x","inset-y","start","end","top","right","bottom","left"],"inset-x":["right","left"],"inset-y":["top","bottom"],flex:["basis","grow","shrink"],gap:["gap-x","gap-y"],p:["px","py","ps","pe","pt","pr","pb","pl"],px:["pr","pl"],py:["pt","pb"],m:["mx","my","ms","me","mt","mr","mb","ml"],mx:["mr","ml"],my:["mt","mb"],size:["w","h"],"font-size":["leading"],"fvn-normal":["fvn-ordinal","fvn-slashed-zero","fvn-figure","fvn-spacing","fvn-fraction"],"fvn-ordinal":["fvn-normal"],"fvn-slashed-zero":["fvn-normal"],"fvn-figure":["fvn-normal"],"fvn-spacing":["fvn-normal"],"fvn-fraction":["fvn-normal"],"line-clamp":["display","overflow"],rounded:["rounded-s","rounded-e","rounded-t","rounded-r","rounded-b","rounded-l","rounded-ss","rounded-se","rounded-ee","rounded-es","rounded-tl","rounded-tr","rounded-br","rounded-bl"],"rounded-s":["rounded-ss","rounded-es"],"rounded-e":["rounded-se","rounded-ee"],"rounded-t":["rounded-tl","rounded-tr"],"rounded-r":["rounded-tr","rounded-br"],"rounded-b":["rounded-br","rounded-bl"],"rounded-l":["rounded-tl","rounded-bl"],"border-spacing":["border-spacing-x","border-spacing-y"],"border-w":["border-w-s","border-w-e","border-w-t","border-w-r","border-w-b","border-w-l"],"border-w-x":["border-w-r","border-w-l"],"border-w-y":["border-w-t","border-w-b"],"border-color":["border-color-s","border-color-e","border-color-t","border-color-r","border-color-b","border-color-l"],"border-color-x":["border-color-r","border-color-l"],"border-color-y":["border-color-t","border-color-b"],"scroll-m":["scroll-mx","scroll-my","scroll-ms","scroll-me","scroll-mt","scroll-mr","scroll-mb","scroll-ml"],"scroll-mx":["scroll-mr","scroll-ml"],"scroll-my":["scroll-mt","scroll-mb"],"scroll-p":["scroll-px","scroll-py","scroll-ps","scroll-pe","scroll-pt","scroll-pr","scroll-pb","scroll-pl"],"scroll-px":["scroll-pr","scroll-pl"],"scroll-py":["scroll-pt","scroll-pb"],touch:["touch-x","touch-y","touch-pz"],"touch-x":["touch"],"touch-y":["touch"],"touch-pz":["touch"]},conflictingClassGroupModifiers:{"font-size":["leading"]}}});function U(...e){return L(r(e))}e.s(["cn",()=>U],70508)},499,43495,e=>{"use strict";var r=e.i(44869);function t(e,r){if("function"==typeof e)return e(r);null!=e&&(e.current=r)}function o(...e){return r=>{let o=!1,n=e.map(e=>{let n=t(e,r);return o||"function"!=typeof n||(o=!0),n});if(o)return()=>{for(let r=0;r<n.length;r++){let o=n[r];"function"==typeof o?o():t(e[r],null)}}}}function n(...e){return r.useCallback(o(...e),e)}e.s(["composeRefs",()=>o,"useComposedRefs",()=>n],43495);var l=e.i(78016),s=Symbol.for("react.lazy"),i=r[" use ".trim().toString()];function a(e){var r;return null!=e&&"object"==typeof e&&"$$typeof"in e&&e.$$typeof===s&&"_payload"in e&&"object"==typeof(r=e._payload)&&null!==r&&"then"in r}function d(e){var t;let n,s=(t=e,(n=r.forwardRef((e,t)=>{let{children:n,...l}=e;if(a(n)&&"function"==typeof i&&(n=i(n._payload)),r.isValidElement(n)){var s;let e,i,a=(s=n,(i=(e=Object.getOwnPropertyDescriptor(s.props,"ref")?.get)&&"isReactWarning"in e&&e.isReactWarning)?s.ref:(i=(e=Object.getOwnPropertyDescriptor(s,"ref")?.get)&&"isReactWarning"in e&&e.isReactWarning)?s.props.ref:s.props.ref||s.ref),d=function(e,r){let t={...r};for(let o in r){let n=e[o],l=r[o];/^on[A-Z]/.test(o)?n&&l?t[o]=(...e)=>{let r=l(...e);return n(...e),r}:n&&(t[o]=n):"style"===o?t[o]={...n,...l}:"className"===o&&(t[o]=[n,l].filter(Boolean).join(" "))}return{...e,...t}}(l,n.props);return n.type!==r.Fragment&&(d.ref=t?o(t,a):a),r.cloneElement(n,d)}return r.Children.count(n)>1?r.Children.only(null):null})).displayName=`${t}.SlotClone`,n),d=r.forwardRef((e,t)=>{let{children:o,...n}=e;a(o)&&"function"==typeof i&&(o=i(o._payload));let d=r.Children.toArray(o),c=d.find(u);if(c){let e=c.props.children,o=d.map(t=>t!==c?t:r.Children.count(e)>1?r.Children.only(null):r.isValidElement(e)?e.props.children:null);return(0,l.jsx)(s,{...n,ref:t,children:r.isValidElement(e)?r.cloneElement(e,void 0,o):null})}return(0,l.jsx)(s,{...n,ref:t,children:o})});return d.displayName=`${e}.Slot`,d}var c=d("Slot"),p=Symbol("radix.slottable");function u(e){return r.isValidElement(e)&&"function"==typeof e.type&&"__radixId"in e.type&&e.type.__radixId===p}e.s(["Slot",()=>c,"createSlot",()=>d],499)}]);
|
|
@@ -4,11 +4,184 @@
|
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
6
|
import { put } from "@vercel/blob"
|
|
7
|
+
import type { Sandbox } from "@vercel/sandbox"
|
|
7
8
|
import { createGateway, generateText } from "ai"
|
|
8
9
|
import { createD3kSandbox as createD3kSandboxUtil } from "@/lib/cloud/d3k-sandbox"
|
|
9
10
|
|
|
11
|
+
/**
|
|
12
|
+
* Helper function to properly consume sandbox command output
|
|
13
|
+
* The Vercel Sandbox SDK returns a result object with an async logs() iterator
|
|
14
|
+
*/
|
|
15
|
+
async function runSandboxCommand(
|
|
16
|
+
sandbox: Sandbox,
|
|
17
|
+
cmd: string,
|
|
18
|
+
args: string[]
|
|
19
|
+
): Promise<{ exitCode: number; stdout: string; stderr: string }> {
|
|
20
|
+
const result = await sandbox.runCommand({ cmd, args })
|
|
21
|
+
let stdout = ""
|
|
22
|
+
let stderr = ""
|
|
23
|
+
for await (const log of result.logs()) {
|
|
24
|
+
if (log.stream === "stdout") {
|
|
25
|
+
stdout += log.data
|
|
26
|
+
} else {
|
|
27
|
+
stderr += log.data
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
await result.wait()
|
|
31
|
+
return { exitCode: result.exitCode, stdout, stderr }
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* Capture a screenshot using puppeteer-core inside the sandbox
|
|
36
|
+
* Returns the base64 encoded PNG image data and logs the page title
|
|
37
|
+
*/
|
|
38
|
+
async function captureScreenshotInSandbox(
|
|
39
|
+
sandbox: Sandbox,
|
|
40
|
+
appUrl: string,
|
|
41
|
+
chromiumPath: string,
|
|
42
|
+
label: string,
|
|
43
|
+
sandboxCwd = "/vercel/sandbox"
|
|
44
|
+
): Promise<string | null> {
|
|
45
|
+
console.log(`[Screenshot] Capturing ${label} screenshot of ${appUrl}...`)
|
|
46
|
+
|
|
47
|
+
// Create a Node.js script to capture screenshot with puppeteer-core
|
|
48
|
+
// The script is placed in the sandbox cwd so it can find puppeteer-core from node_modules
|
|
49
|
+
// Output format: JSON with { title, screenshot } on first line, then base64 data
|
|
50
|
+
const screenshotScript = `
|
|
51
|
+
const puppeteer = require('puppeteer-core');
|
|
52
|
+
|
|
53
|
+
(async () => {
|
|
54
|
+
let browser;
|
|
55
|
+
try {
|
|
56
|
+
browser = await puppeteer.launch({
|
|
57
|
+
executablePath: '${chromiumPath}',
|
|
58
|
+
headless: true,
|
|
59
|
+
args: [
|
|
60
|
+
'--no-sandbox',
|
|
61
|
+
'--disable-setuid-sandbox',
|
|
62
|
+
'--disable-dev-shm-usage',
|
|
63
|
+
'--disable-gpu',
|
|
64
|
+
'--single-process'
|
|
65
|
+
]
|
|
66
|
+
});
|
|
67
|
+
|
|
68
|
+
const page = await browser.newPage();
|
|
69
|
+
await page.setViewport({ width: 1280, height: 720 });
|
|
70
|
+
|
|
71
|
+
// Navigate with a reasonable timeout
|
|
72
|
+
await page.goto('${appUrl}', {
|
|
73
|
+
waitUntil: 'networkidle2',
|
|
74
|
+
timeout: 30000
|
|
75
|
+
});
|
|
76
|
+
|
|
77
|
+
// Get the page title for verification
|
|
78
|
+
const title = await page.title();
|
|
79
|
+
console.error('PAGE_TITLE:' + title);
|
|
80
|
+
|
|
81
|
+
// Wait a bit for any animations/layout shifts
|
|
82
|
+
await new Promise(r => setTimeout(r, 2000));
|
|
83
|
+
|
|
84
|
+
// Take screenshot as base64
|
|
85
|
+
const screenshot = await page.screenshot({
|
|
86
|
+
encoding: 'base64',
|
|
87
|
+
fullPage: false
|
|
88
|
+
});
|
|
89
|
+
|
|
90
|
+
console.log(screenshot);
|
|
91
|
+
|
|
92
|
+
await browser.close();
|
|
93
|
+
} catch (error) {
|
|
94
|
+
console.error('Screenshot error:', error.message);
|
|
95
|
+
if (browser) await browser.close();
|
|
96
|
+
process.exit(1);
|
|
97
|
+
}
|
|
98
|
+
})();
|
|
99
|
+
`
|
|
100
|
+
|
|
101
|
+
try {
|
|
102
|
+
// Write the script to the sandbox cwd so it can find puppeteer-core from node_modules
|
|
103
|
+
const scriptPath = `${sandboxCwd}/_screenshot.js`
|
|
104
|
+
const writeResult = await runSandboxCommand(sandbox, "sh", [
|
|
105
|
+
"-c",
|
|
106
|
+
`cat > ${scriptPath} << 'SCRIPT_EOF'
|
|
107
|
+
${screenshotScript}
|
|
108
|
+
SCRIPT_EOF`
|
|
109
|
+
])
|
|
110
|
+
|
|
111
|
+
if (writeResult.exitCode !== 0) {
|
|
112
|
+
console.log(`[Screenshot] Failed to write script: ${writeResult.stderr}`)
|
|
113
|
+
return null
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
// Run the script from the sandbox directory so node can find puppeteer-core in node_modules
|
|
117
|
+
const screenshotResult = await sandbox.runCommand({
|
|
118
|
+
cmd: "node",
|
|
119
|
+
args: [scriptPath],
|
|
120
|
+
cwd: sandboxCwd
|
|
121
|
+
})
|
|
122
|
+
|
|
123
|
+
let stdout = ""
|
|
124
|
+
let stderr = ""
|
|
125
|
+
for await (const log of screenshotResult.logs()) {
|
|
126
|
+
if (log.stream === "stdout") {
|
|
127
|
+
stdout += log.data
|
|
128
|
+
} else {
|
|
129
|
+
stderr += log.data
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
await screenshotResult.wait()
|
|
133
|
+
|
|
134
|
+
// Extract page title from stderr (format: PAGE_TITLE:xxx)
|
|
135
|
+
const titleMatch = stderr.match(/PAGE_TITLE:(.*)/)
|
|
136
|
+
if (titleMatch) {
|
|
137
|
+
console.log(`[Screenshot] Page title: "${titleMatch[1]}"`)
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
if (screenshotResult.exitCode !== 0) {
|
|
141
|
+
console.log(`[Screenshot] Failed to capture: ${stderr}`)
|
|
142
|
+
return null
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
// The stdout should be the base64 image
|
|
146
|
+
const base64Data = stdout.trim()
|
|
147
|
+
if (base64Data && base64Data.length > 100) {
|
|
148
|
+
console.log(`[Screenshot] Captured ${label} screenshot (${base64Data.length} bytes base64)`)
|
|
149
|
+
return base64Data
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
console.log(`[Screenshot] No valid screenshot data returned`)
|
|
153
|
+
return null
|
|
154
|
+
} catch (error) {
|
|
155
|
+
console.log(`[Screenshot] Error: ${error instanceof Error ? error.message : String(error)}`)
|
|
156
|
+
return null
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
/**
|
|
161
|
+
* Upload a base64 screenshot to Vercel Blob
|
|
162
|
+
*/
|
|
163
|
+
async function uploadScreenshot(base64Data: string, label: string, projectName: string): Promise<string | null> {
|
|
164
|
+
try {
|
|
165
|
+
const imageBuffer = Buffer.from(base64Data, "base64")
|
|
166
|
+
const timestamp = new Date().toISOString().replace(/[:.]/g, "-")
|
|
167
|
+
const filename = `screenshot-${label}-${projectName}-${timestamp}.png`
|
|
168
|
+
|
|
169
|
+
const blob = await put(filename, imageBuffer, {
|
|
170
|
+
access: "public",
|
|
171
|
+
contentType: "image/png"
|
|
172
|
+
})
|
|
173
|
+
|
|
174
|
+
console.log(`[Screenshot] Uploaded ${label} screenshot: ${blob.url}`)
|
|
175
|
+
return blob.url
|
|
176
|
+
} catch (error) {
|
|
177
|
+
console.log(`[Screenshot] Upload failed: ${error instanceof Error ? error.message : String(error)}`)
|
|
178
|
+
return null
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
|
|
10
182
|
/**
|
|
11
183
|
* Step 0: Create d3k sandbox with MCP tools pre-configured
|
|
184
|
+
* Also captures a "before" screenshot of the app
|
|
12
185
|
*/
|
|
13
186
|
export async function createD3kSandbox(
|
|
14
187
|
repoUrl: string,
|
|
@@ -48,34 +221,45 @@ export async function createD3kSandbox(
|
|
|
48
221
|
console.log(`[Step 0] Dev URL: ${sandboxResult.devUrl}`)
|
|
49
222
|
console.log(`[Step 0] MCP URL: ${sandboxResult.mcpUrl}`)
|
|
50
223
|
|
|
224
|
+
// Get the chromium path for screenshots
|
|
225
|
+
console.log(`[Step 0] Getting Chromium path for screenshots...`)
|
|
226
|
+
let chromiumPath = "/tmp/chromium"
|
|
227
|
+
try {
|
|
228
|
+
const chromiumResult = await runSandboxCommand(sandboxResult.sandbox, "node", [
|
|
229
|
+
"-e",
|
|
230
|
+
"require('@sparticuz/chromium').executablePath().then(p => console.log(p))"
|
|
231
|
+
])
|
|
232
|
+
if (chromiumResult.exitCode === 0 && chromiumResult.stdout.trim()) {
|
|
233
|
+
chromiumPath = chromiumResult.stdout.trim()
|
|
234
|
+
console.log(`[Step 0] Chromium path: ${chromiumPath}`)
|
|
235
|
+
}
|
|
236
|
+
} catch {
|
|
237
|
+
console.log(`[Step 0] Could not get chromium path, using default: ${chromiumPath}`)
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
// Capture "BEFORE" screenshot - this shows the app before any fixes
|
|
241
|
+
console.log(`[Step 0] Capturing BEFORE screenshot...`)
|
|
242
|
+
let beforeScreenshotUrl: string | null = null
|
|
243
|
+
try {
|
|
244
|
+
const beforeBase64 = await captureScreenshotInSandbox(
|
|
245
|
+
sandboxResult.sandbox,
|
|
246
|
+
"http://localhost:3000",
|
|
247
|
+
chromiumPath,
|
|
248
|
+
"before"
|
|
249
|
+
)
|
|
250
|
+
if (beforeBase64) {
|
|
251
|
+
beforeScreenshotUrl = await uploadScreenshot(beforeBase64, "before", projectName)
|
|
252
|
+
}
|
|
253
|
+
} catch (error) {
|
|
254
|
+
console.log(`[Step 0] Before screenshot failed: ${error instanceof Error ? error.message : String(error)}`)
|
|
255
|
+
}
|
|
256
|
+
|
|
51
257
|
// Now capture CLS and errors using MCP from INSIDE the sandbox
|
|
52
|
-
// We must do this in Step 0 while we have the sandbox object
|
|
53
258
|
console.log(`[Step 0] Capturing CLS metrics from inside sandbox...`)
|
|
54
259
|
|
|
55
260
|
let clsData: unknown = null
|
|
56
261
|
let mcpError: string | null = null
|
|
57
262
|
|
|
58
|
-
// Helper function to properly consume sandbox command output
|
|
59
|
-
// The Vercel Sandbox SDK returns a result object with an async logs() iterator
|
|
60
|
-
async function runSandboxCommand(
|
|
61
|
-
sandbox: typeof sandboxResult.sandbox,
|
|
62
|
-
cmd: string,
|
|
63
|
-
args: string[]
|
|
64
|
-
): Promise<{ exitCode: number; stdout: string; stderr: string }> {
|
|
65
|
-
const result = await sandbox.runCommand({ cmd, args })
|
|
66
|
-
let stdout = ""
|
|
67
|
-
let stderr = ""
|
|
68
|
-
for await (const log of result.logs()) {
|
|
69
|
-
if (log.stream === "stdout") {
|
|
70
|
-
stdout += log.data
|
|
71
|
-
} else {
|
|
72
|
-
stderr += log.data
|
|
73
|
-
}
|
|
74
|
-
}
|
|
75
|
-
await result.wait()
|
|
76
|
-
return { exitCode: result.exitCode, stdout, stderr }
|
|
77
|
-
}
|
|
78
|
-
|
|
79
263
|
try {
|
|
80
264
|
// Call fix_my_app MCP tool via curl from inside the sandbox
|
|
81
265
|
// This avoids network isolation issues - we're calling localhost:3684 from within the sandbox
|
|
@@ -156,6 +340,27 @@ export async function createD3kSandbox(
|
|
|
156
340
|
}
|
|
157
341
|
console.log(`[Step 0] === End sandbox log dump ===`)
|
|
158
342
|
|
|
343
|
+
// Capture git diff from sandbox - this shows any changes made by d3k
|
|
344
|
+
console.log(`[Step 0] Capturing git diff from sandbox...`)
|
|
345
|
+
let gitDiff: string | null = null
|
|
346
|
+
try {
|
|
347
|
+
const diffResult = await runSandboxCommand(sandboxResult.sandbox, "sh", [
|
|
348
|
+
"-c",
|
|
349
|
+
"cd /vercel/sandbox && git diff --no-color 2>/dev/null || echo 'No git diff available'"
|
|
350
|
+
])
|
|
351
|
+
if (diffResult.exitCode === 0 && diffResult.stdout.trim() && diffResult.stdout.trim() !== "No git diff available") {
|
|
352
|
+
gitDiff = diffResult.stdout.trim()
|
|
353
|
+
console.log(`[Step 0] Git diff captured (${gitDiff.length} chars)`)
|
|
354
|
+
console.log(`[Step 0] Git diff preview:\n${gitDiff.substring(0, 500)}...`)
|
|
355
|
+
} else {
|
|
356
|
+
console.log(`[Step 0] No git changes detected in sandbox`)
|
|
357
|
+
}
|
|
358
|
+
} catch (diffError) {
|
|
359
|
+
console.log(
|
|
360
|
+
`[Step 0] Failed to capture git diff: ${diffError instanceof Error ? diffError.message : String(diffError)}`
|
|
361
|
+
)
|
|
362
|
+
}
|
|
363
|
+
|
|
159
364
|
// Note: We cannot return the cleanup function or sandbox object as they're not serializable
|
|
160
365
|
// Sandbox cleanup will happen automatically when the sandbox times out
|
|
161
366
|
return {
|
|
@@ -163,7 +368,10 @@ export async function createD3kSandbox(
|
|
|
163
368
|
devUrl: sandboxResult.devUrl,
|
|
164
369
|
bypassToken: sandboxResult.bypassToken,
|
|
165
370
|
clsData,
|
|
166
|
-
mcpError
|
|
371
|
+
mcpError,
|
|
372
|
+
beforeScreenshotUrl,
|
|
373
|
+
chromiumPath,
|
|
374
|
+
gitDiff
|
|
167
375
|
}
|
|
168
376
|
}
|
|
169
377
|
|
|
@@ -176,14 +384,18 @@ export async function fetchRealLogs(
|
|
|
176
384
|
bypassToken?: string,
|
|
177
385
|
sandboxDevUrl?: string,
|
|
178
386
|
clsData?: unknown,
|
|
179
|
-
mcpError?: string | null
|
|
387
|
+
mcpError?: string | null,
|
|
388
|
+
beforeScreenshotUrlFromStep0?: string | null
|
|
180
389
|
) {
|
|
181
390
|
"use step"
|
|
182
391
|
|
|
183
|
-
// If we already have CLS data from Step 0, use it
|
|
392
|
+
// If we already have CLS data from Step 0, use it along with the screenshot
|
|
184
393
|
if (clsData) {
|
|
185
394
|
console.log("[Step 1] Using CLS data captured in Step 0")
|
|
186
|
-
|
|
395
|
+
if (beforeScreenshotUrlFromStep0) {
|
|
396
|
+
console.log(`[Step 1] Before screenshot from Step 0: ${beforeScreenshotUrlFromStep0}`)
|
|
397
|
+
}
|
|
398
|
+
return { logAnalysis: JSON.stringify(clsData, null, 2), beforeScreenshotUrl: beforeScreenshotUrlFromStep0 || null }
|
|
187
399
|
}
|
|
188
400
|
|
|
189
401
|
// If there was an MCP error in Step 0, log it
|
|
@@ -573,7 +785,13 @@ Format your response as a clear, structured report that helps identify what's br
|
|
|
573
785
|
const response = await fetch(urlWithBypass, { method: "GET", headers })
|
|
574
786
|
const body = await response.text()
|
|
575
787
|
|
|
788
|
+
// Extract and log page title from HTML
|
|
789
|
+
const titleMatch = body.match(/<title[^>]*>([^<]*)<\/title>/i)
|
|
790
|
+
const pageTitle = titleMatch ? titleMatch[1].trim() : "(no title found)"
|
|
791
|
+
console.log(`[Step 1] HTTP fallback - Page title: "${pageTitle}"`)
|
|
792
|
+
|
|
576
793
|
let logAnalysis = `Dev Server URL: ${devUrl}\n`
|
|
794
|
+
logAnalysis += `Page Title: ${pageTitle}\n`
|
|
577
795
|
logAnalysis += `HTTP Status: ${response.status} ${response.statusText}\n\n`
|
|
578
796
|
logAnalysis += `Note: Browser automation failed, using fallback HTTP fetch.\n\n`
|
|
579
797
|
|
|
@@ -685,7 +903,8 @@ export async function uploadToBlob(
|
|
|
685
903
|
projectName: string,
|
|
686
904
|
logAnalysis: string,
|
|
687
905
|
devUrl: string,
|
|
688
|
-
beforeScreenshotUrl?: string | null
|
|
906
|
+
beforeScreenshotUrl?: string | null,
|
|
907
|
+
gitDiff?: string | null
|
|
689
908
|
) {
|
|
690
909
|
"use step"
|
|
691
910
|
|
|
@@ -693,6 +912,9 @@ export async function uploadToBlob(
|
|
|
693
912
|
if (beforeScreenshotUrl) {
|
|
694
913
|
console.log(`[Step 3] Including before screenshot: ${beforeScreenshotUrl}`)
|
|
695
914
|
}
|
|
915
|
+
if (gitDiff) {
|
|
916
|
+
console.log(`[Step 3] Including git diff (${gitDiff.length} chars)`)
|
|
917
|
+
}
|
|
696
918
|
|
|
697
919
|
// Create screenshot section if we have a screenshot
|
|
698
920
|
const screenshotSection = beforeScreenshotUrl
|
|
@@ -704,6 +926,21 @@ This screenshot was captured when the sandbox dev server first loaded, proving t
|
|
|
704
926
|
|
|
705
927
|
---
|
|
706
928
|
|
|
929
|
+
`
|
|
930
|
+
: ""
|
|
931
|
+
|
|
932
|
+
// Create git diff section if we have a diff from the sandbox
|
|
933
|
+
const gitDiffSection = gitDiff
|
|
934
|
+
? `## Actual Git Diff from Sandbox
|
|
935
|
+
|
|
936
|
+
The following diff shows the actual changes made by d3k in the sandbox environment:
|
|
937
|
+
|
|
938
|
+
\`\`\`diff
|
|
939
|
+
${gitDiff}
|
|
940
|
+
\`\`\`
|
|
941
|
+
|
|
942
|
+
---
|
|
943
|
+
|
|
707
944
|
`
|
|
708
945
|
: ""
|
|
709
946
|
|
|
@@ -712,12 +949,14 @@ This screenshot was captured when the sandbox dev server first loaded, proving t
|
|
|
712
949
|
const enhancedMarkdown = `# Fix Proposal for ${projectName}
|
|
713
950
|
|
|
714
951
|
**Generated**: ${timestamp}
|
|
952
|
+
|
|
715
953
|
**Powered by**: [dev3000](https://github.com/vercel-labs/dev3000) with Claude Code
|
|
954
|
+
|
|
716
955
|
**Dev Server**: ${devUrl}
|
|
717
956
|
|
|
718
957
|
---
|
|
719
958
|
|
|
720
|
-
${screenshotSection}## Original Log Analysis
|
|
959
|
+
${screenshotSection}${gitDiffSection}## Original Log Analysis
|
|
721
960
|
|
|
722
961
|
\`\`\`
|
|
723
962
|
${logAnalysis}
|
|
@@ -57,13 +57,16 @@ export async function cloudFixWorkflow(params: {
|
|
|
57
57
|
console.log(`[Workflow] VERCEL_OIDC_TOKEN available: ${!!vercelOidcToken}`)
|
|
58
58
|
|
|
59
59
|
// Step 0: Create d3k sandbox if repoUrl provided
|
|
60
|
-
// This step also captures CLS data from inside the sandbox
|
|
60
|
+
// This step also captures CLS data, "before" screenshot, and git diff from inside the sandbox
|
|
61
61
|
let sandboxInfo: {
|
|
62
62
|
mcpUrl: string
|
|
63
63
|
devUrl: string
|
|
64
64
|
bypassToken?: string
|
|
65
65
|
clsData?: unknown
|
|
66
66
|
mcpError?: string | null
|
|
67
|
+
beforeScreenshotUrl?: string | null
|
|
68
|
+
chromiumPath?: string
|
|
69
|
+
gitDiff?: string | null
|
|
67
70
|
} | null = null
|
|
68
71
|
if (repoUrl) {
|
|
69
72
|
sandboxInfo = await createD3kSandbox(repoUrl, repoBranch || "main", projectName, vercelToken, vercelOidcToken)
|
|
@@ -72,26 +75,29 @@ export async function cloudFixWorkflow(params: {
|
|
|
72
75
|
// Step 1: Fetch real logs (using sandbox MCP if available, otherwise devUrl directly)
|
|
73
76
|
// If we got CLS data from Step 0, pass it to Step 1 to avoid re-fetching
|
|
74
77
|
// Use bypass token from sandbox if available, otherwise use provided one
|
|
78
|
+
// Also pass the beforeScreenshotUrl from Step 0 if available
|
|
75
79
|
const effectiveBypassToken = sandboxInfo?.bypassToken || bypassToken
|
|
76
80
|
const step1Result = await fetchRealLogs(
|
|
77
81
|
sandboxInfo?.mcpUrl || devUrl,
|
|
78
82
|
effectiveBypassToken,
|
|
79
83
|
sandboxInfo?.devUrl,
|
|
80
84
|
sandboxInfo?.clsData,
|
|
81
|
-
sandboxInfo?.mcpError
|
|
85
|
+
sandboxInfo?.mcpError,
|
|
86
|
+
sandboxInfo?.beforeScreenshotUrl
|
|
82
87
|
)
|
|
83
88
|
const { logAnalysis, beforeScreenshotUrl } = step1Result
|
|
84
89
|
|
|
85
90
|
// Step 2: Invoke AI agent to analyze logs and create fix
|
|
86
91
|
const fixProposal = await analyzeLogsWithAgent(logAnalysis, sandboxInfo?.devUrl || devUrl)
|
|
87
92
|
|
|
88
|
-
// Step 3: Upload to blob storage with full context and
|
|
93
|
+
// Step 3: Upload to blob storage with full context, screenshot, and git diff
|
|
89
94
|
const blobResult = await uploadToBlob(
|
|
90
95
|
fixProposal,
|
|
91
96
|
projectName,
|
|
92
97
|
logAnalysis,
|
|
93
98
|
sandboxInfo?.devUrl || devUrl,
|
|
94
|
-
beforeScreenshotUrl
|
|
99
|
+
beforeScreenshotUrl,
|
|
100
|
+
sandboxInfo?.gitDiff
|
|
95
101
|
)
|
|
96
102
|
|
|
97
103
|
// Step 4: Create GitHub PR if repo info provided AND there are actual fixes to apply
|
|
@@ -130,11 +136,12 @@ async function fetchRealLogs(
|
|
|
130
136
|
bypassToken?: string,
|
|
131
137
|
sandboxDevUrl?: string,
|
|
132
138
|
clsData?: unknown,
|
|
133
|
-
mcpError?: string | null
|
|
139
|
+
mcpError?: string | null,
|
|
140
|
+
beforeScreenshotUrlFromStep0?: string | null
|
|
134
141
|
): Promise<{ logAnalysis: string; beforeScreenshotUrl: string | null }> {
|
|
135
142
|
"use step"
|
|
136
143
|
const { fetchRealLogs } = await import("./steps")
|
|
137
|
-
return fetchRealLogs(mcpUrlOrDevUrl, bypassToken, sandboxDevUrl, clsData, mcpError)
|
|
144
|
+
return fetchRealLogs(mcpUrlOrDevUrl, bypassToken, sandboxDevUrl, clsData, mcpError, beforeScreenshotUrlFromStep0)
|
|
138
145
|
}
|
|
139
146
|
|
|
140
147
|
async function analyzeLogsWithAgent(logAnalysis: string, devUrl: string) {
|
|
@@ -148,11 +155,12 @@ async function uploadToBlob(
|
|
|
148
155
|
projectName: string,
|
|
149
156
|
logAnalysis: string,
|
|
150
157
|
devUrl: string,
|
|
151
|
-
beforeScreenshotUrl?: string | null
|
|
158
|
+
beforeScreenshotUrl?: string | null,
|
|
159
|
+
gitDiff?: string | null
|
|
152
160
|
) {
|
|
153
161
|
"use step"
|
|
154
162
|
const { uploadToBlob } = await import("./steps")
|
|
155
|
-
return uploadToBlob(fixProposal, projectName, logAnalysis, devUrl, beforeScreenshotUrl)
|
|
163
|
+
return uploadToBlob(fixProposal, projectName, logAnalysis, devUrl, beforeScreenshotUrl, gitDiff)
|
|
156
164
|
}
|
|
157
165
|
|
|
158
166
|
async function createGitHubPR(
|
|
@@ -132,12 +132,12 @@ export async function POST(request: Request) {
|
|
|
132
132
|
userId,
|
|
133
133
|
projectName,
|
|
134
134
|
timestamp: new Date().toISOString(),
|
|
135
|
-
status: "
|
|
135
|
+
status: "done",
|
|
136
136
|
reportBlobUrl: result.blobUrl,
|
|
137
137
|
prUrl: result.pr?.prUrl,
|
|
138
138
|
beforeScreenshotUrl: result.beforeScreenshotUrl || undefined
|
|
139
139
|
})
|
|
140
|
-
console.log(`[Start Fix] Updated workflow run metadata to
|
|
140
|
+
console.log(`[Start Fix] Updated workflow run metadata to done: ${runId}`)
|
|
141
141
|
}
|
|
142
142
|
|
|
143
143
|
return Response.json(
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { listWorkflowRuns } from "@/lib/workflow-storage"
|
|
1
|
+
import { deleteWorkflowRuns, listWorkflowRuns } from "@/lib/workflow-storage"
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
4
|
* GET /api/workflows
|
|
@@ -37,3 +37,47 @@ export async function GET(request: Request) {
|
|
|
37
37
|
)
|
|
38
38
|
}
|
|
39
39
|
}
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* DELETE /api/workflows
|
|
43
|
+
* Deletes workflow runs and their associated blobs
|
|
44
|
+
*
|
|
45
|
+
* Body:
|
|
46
|
+
* - userId: Required. The user ID
|
|
47
|
+
* - runIds: Required. Array of run IDs to delete
|
|
48
|
+
*/
|
|
49
|
+
export async function DELETE(request: Request) {
|
|
50
|
+
try {
|
|
51
|
+
const body = await request.json()
|
|
52
|
+
const { userId, runIds } = body
|
|
53
|
+
|
|
54
|
+
if (!userId) {
|
|
55
|
+
return Response.json({ error: "userId is required" }, { status: 400 })
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
if (!runIds || !Array.isArray(runIds) || runIds.length === 0) {
|
|
59
|
+
return Response.json({ error: "runIds array is required" }, { status: 400 })
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
console.log(`[Workflows API] Deleting ${runIds.length} runs for user: ${userId}`)
|
|
63
|
+
|
|
64
|
+
const result = await deleteWorkflowRuns(userId, runIds)
|
|
65
|
+
|
|
66
|
+
console.log(`[Workflows API] Deleted ${result.deleted} runs, ${result.errors.length} errors`)
|
|
67
|
+
|
|
68
|
+
return Response.json({
|
|
69
|
+
success: true,
|
|
70
|
+
deleted: result.deleted,
|
|
71
|
+
errors: result.errors
|
|
72
|
+
})
|
|
73
|
+
} catch (error) {
|
|
74
|
+
console.error("[Workflows API] Error deleting workflow runs:", error)
|
|
75
|
+
return Response.json(
|
|
76
|
+
{
|
|
77
|
+
success: false,
|
|
78
|
+
error: error instanceof Error ? error.message : String(error)
|
|
79
|
+
},
|
|
80
|
+
{ status: 500 }
|
|
81
|
+
)
|
|
82
|
+
}
|
|
83
|
+
}
|