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.
Files changed (197) hide show
  1. package/dist/cli.js +32 -2
  2. package/dist/cli.js.map +1 -1
  3. package/dist/dev-environment.d.ts.map +1 -1
  4. package/dist/dev-environment.js +25 -4
  5. package/dist/dev-environment.js.map +1 -1
  6. package/dist/src/tui-interface-impl.tsx +175 -127
  7. package/dist/tui-interface-impl.d.ts.map +1 -1
  8. package/dist/tui-interface-impl.js +113 -74
  9. package/dist/tui-interface-impl.js.map +1 -1
  10. package/mcp-server/.next/BUILD_ID +1 -1
  11. package/mcp-server/.next/build-manifest.json +2 -2
  12. package/mcp-server/.next/fallback-build-manifest.json +2 -2
  13. package/mcp-server/.next/next-minimal-server.js.nft.json +1 -1
  14. package/mcp-server/.next/next-server.js.nft.json +1 -1
  15. package/mcp-server/.next/prerender-manifest.json +3 -3
  16. package/mcp-server/.next/required-server-files.json +4 -4
  17. package/mcp-server/.next/server/app/.well-known/workflow/v1/flow/route.js +2 -2
  18. package/mcp-server/.next/server/app/.well-known/workflow/v1/flow/route.js.nft.json +1 -1
  19. package/mcp-server/.next/server/app/.well-known/workflow/v1/step/route.js +2 -2
  20. package/mcp-server/.next/server/app/.well-known/workflow/v1/step/route.js.nft.json +1 -1
  21. package/mcp-server/.next/server/app/.well-known/workflow/v1/webhook/[token]/route.js +2 -2
  22. package/mcp-server/.next/server/app/.well-known/workflow/v1/webhook/[token]/route.js.nft.json +1 -1
  23. package/mcp-server/.next/server/app/_global-error/page.js.nft.json +1 -1
  24. package/mcp-server/.next/server/app/_global-error.html +2 -2
  25. package/mcp-server/.next/server/app/_global-error.rsc +1 -1
  26. package/mcp-server/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  27. package/mcp-server/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  28. package/mcp-server/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  29. package/mcp-server/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  30. package/mcp-server/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  31. package/mcp-server/.next/server/app/_not-found/page.js.nft.json +1 -1
  32. package/mcp-server/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  33. package/mcp-server/.next/server/app/_not-found.html +1 -1
  34. package/mcp-server/.next/server/app/_not-found.rsc +2 -2
  35. package/mcp-server/.next/server/app/_not-found.segments/_full.segment.rsc +2 -2
  36. package/mcp-server/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  37. package/mcp-server/.next/server/app/_not-found.segments/_index.segment.rsc +2 -2
  38. package/mcp-server/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  39. package/mcp-server/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  40. package/mcp-server/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
  41. package/mcp-server/.next/server/app/api/auth/authorize/route.js.nft.json +1 -1
  42. package/mcp-server/.next/server/app/api/auth/callback/route.js.nft.json +1 -1
  43. package/mcp-server/.next/server/app/api/auth/signout/route.js.nft.json +1 -1
  44. package/mcp-server/.next/server/app/api/auth/token/route.js.nft.json +1 -1
  45. package/mcp-server/.next/server/app/api/cloud/check-pr/route.js +2 -2
  46. package/mcp-server/.next/server/app/api/cloud/check-pr/route.js.nft.json +1 -1
  47. package/mcp-server/.next/server/app/api/cloud/fix-workflow/health/route.js.nft.json +1 -1
  48. package/mcp-server/.next/server/app/api/cloud/fix-workflow/route.js +2 -2
  49. package/mcp-server/.next/server/app/api/cloud/fix-workflow/route.js.nft.json +1 -1
  50. package/mcp-server/.next/server/app/api/cloud/start-fix/route.js +2 -2
  51. package/mcp-server/.next/server/app/api/cloud/start-fix/route.js.nft.json +1 -1
  52. package/mcp-server/.next/server/app/api/integration/webhook/route.js.nft.json +1 -1
  53. package/mcp-server/.next/server/app/api/jank/[session]/route.js.nft.json +1 -1
  54. package/mcp-server/.next/server/app/api/logs/append/route.js.nft.json +1 -1
  55. package/mcp-server/.next/server/app/api/logs/head/route.js.nft.json +1 -1
  56. package/mcp-server/.next/server/app/api/logs/list/route.js.nft.json +1 -1
  57. package/mcp-server/.next/server/app/api/logs/rotate/route.js.nft.json +1 -1
  58. package/mcp-server/.next/server/app/api/logs/stream/route.js.nft.json +1 -1
  59. package/mcp-server/.next/server/app/api/logs/tail/route.js.nft.json +1 -1
  60. package/mcp-server/.next/server/app/api/orchestrator/route.js.nft.json +1 -1
  61. package/mcp-server/.next/server/app/api/projects/[projectId]/bypass-token/route.js.nft.json +1 -1
  62. package/mcp-server/.next/server/app/api/projects/branches/route.js.nft.json +1 -1
  63. package/mcp-server/.next/server/app/api/projects/check-protection/route.js.nft.json +1 -1
  64. package/mcp-server/.next/server/app/api/projects/route.js.nft.json +1 -1
  65. package/mcp-server/.next/server/app/api/screenshots/[filename]/route.js.nft.json +1 -1
  66. package/mcp-server/.next/server/app/api/screenshots/list/route.js.nft.json +1 -1
  67. package/mcp-server/.next/server/app/api/teams/route.js.nft.json +1 -1
  68. package/mcp-server/.next/server/app/api/tools/route.js.nft.json +1 -1
  69. package/mcp-server/.next/server/app/api/workflows/route.js.nft.json +1 -1
  70. package/mcp-server/.next/server/app/auth/error/page.js.nft.json +1 -1
  71. package/mcp-server/.next/server/app/auth/error/page_client-reference-manifest.js +1 -1
  72. package/mcp-server/.next/server/app/auth/error.html +1 -1
  73. package/mcp-server/.next/server/app/auth/error.rsc +2 -2
  74. package/mcp-server/.next/server/app/auth/error.segments/_full.segment.rsc +2 -2
  75. package/mcp-server/.next/server/app/auth/error.segments/_head.segment.rsc +1 -1
  76. package/mcp-server/.next/server/app/auth/error.segments/_index.segment.rsc +2 -2
  77. package/mcp-server/.next/server/app/auth/error.segments/_tree.segment.rsc +2 -2
  78. package/mcp-server/.next/server/app/auth/error.segments/auth/error/__PAGE__.segment.rsc +1 -1
  79. package/mcp-server/.next/server/app/auth/error.segments/auth/error.segment.rsc +1 -1
  80. package/mcp-server/.next/server/app/auth/error.segments/auth.segment.rsc +1 -1
  81. package/mcp-server/.next/server/app/index.html +1 -1
  82. package/mcp-server/.next/server/app/index.rsc +3 -3
  83. package/mcp-server/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
  84. package/mcp-server/.next/server/app/index.segments/_full.segment.rsc +3 -3
  85. package/mcp-server/.next/server/app/index.segments/_head.segment.rsc +1 -1
  86. package/mcp-server/.next/server/app/index.segments/_index.segment.rsc +2 -2
  87. package/mcp-server/.next/server/app/index.segments/_tree.segment.rsc +2 -2
  88. package/mcp-server/.next/server/app/logs/page.js.nft.json +1 -1
  89. package/mcp-server/.next/server/app/logs/page_client-reference-manifest.js +1 -1
  90. package/mcp-server/.next/server/app/mcp/route.js.nft.json +1 -1
  91. package/mcp-server/.next/server/app/page.js.nft.json +1 -1
  92. package/mcp-server/.next/server/app/page_client-reference-manifest.js +1 -1
  93. package/mcp-server/.next/server/app/signin/page.js.nft.json +1 -1
  94. package/mcp-server/.next/server/app/signin/page_client-reference-manifest.js +1 -1
  95. package/mcp-server/.next/server/app/video/[session]/page.js.nft.json +1 -1
  96. package/mcp-server/.next/server/app/video/[session]/page_client-reference-manifest.js +1 -1
  97. package/mcp-server/.next/server/app/workflows/[id]/report/page.js.nft.json +1 -1
  98. package/mcp-server/.next/server/app/workflows/[id]/report/page_client-reference-manifest.js +1 -1
  99. package/mcp-server/.next/server/app/workflows/new/page.js.nft.json +1 -1
  100. package/mcp-server/.next/server/app/workflows/new/page_client-reference-manifest.js +1 -1
  101. package/mcp-server/.next/server/app/workflows/page.js.nft.json +1 -1
  102. package/mcp-server/.next/server/app/workflows/page_client-reference-manifest.js +1 -1
  103. package/mcp-server/.next/server/chunks/[root-of-the-server]__157de66b._.js +101 -36
  104. package/mcp-server/.next/server/chunks/[root-of-the-server]__157de66b._.js.map +1 -1
  105. package/mcp-server/.next/server/chunks/{[root-of-the-server]__f99bd75f._.js → [root-of-the-server]__2920484d._.js} +2 -2
  106. package/mcp-server/.next/server/chunks/{[root-of-the-server]__f99bd75f._.js.map → [root-of-the-server]__2920484d._.js.map} +1 -1
  107. package/mcp-server/.next/server/chunks/{[root-of-the-server]__d6a224bc._.js → [root-of-the-server]__71b44a42._.js} +14 -14
  108. package/mcp-server/.next/server/chunks/[root-of-the-server]__71b44a42._.js.map +1 -0
  109. package/mcp-server/.next/server/chunks/[root-of-the-server]__730a8fd0._.js +1 -1
  110. package/mcp-server/.next/server/chunks/[root-of-the-server]__730a8fd0._.js.map +1 -1
  111. package/mcp-server/.next/server/chunks/{[root-of-the-server]__c86876f8._.js → [root-of-the-server]__76031cfc._.js} +2 -2
  112. package/mcp-server/.next/server/chunks/{[root-of-the-server]__c86876f8._.js.map → [root-of-the-server]__76031cfc._.js.map} +1 -1
  113. package/mcp-server/.next/server/chunks/{[root-of-the-server]__c5e6aa23._.js → [root-of-the-server]__832ec618._.js} +2 -2
  114. package/mcp-server/.next/server/chunks/{[root-of-the-server]__c5e6aa23._.js.map → [root-of-the-server]__832ec618._.js.map} +1 -1
  115. package/mcp-server/.next/server/chunks/{[root-of-the-server]__41aa7b20._.js → [root-of-the-server]__b194d4eb._.js} +13 -13
  116. package/mcp-server/.next/server/chunks/[root-of-the-server]__b194d4eb._.js.map +1 -0
  117. package/mcp-server/.next/server/chunks/[root-of-the-server]__c1681338._.js +3 -0
  118. package/mcp-server/.next/server/chunks/[root-of-the-server]__c1681338._.js.map +1 -0
  119. package/mcp-server/.next/server/chunks/{[root-of-the-server]__d37c38d3._.js → [root-of-the-server]__e6808c21._.js} +2 -2
  120. package/mcp-server/.next/server/chunks/{[root-of-the-server]__d37c38d3._.js.map → [root-of-the-server]__e6808c21._.js.map} +1 -1
  121. package/mcp-server/.next/server/chunks/{[root-of-the-server]__446f0436._.js → [root-of-the-server]__ec6a1335._.js} +2 -2
  122. package/mcp-server/.next/server/chunks/[root-of-the-server]__ec6a1335._.js.map +1 -0
  123. package/mcp-server/.next/server/chunks/bee4f_next_dist_esm_build_templates_app-route_1ece9366.js +5 -5
  124. package/mcp-server/.next/server/chunks/bee4f_next_dist_esm_build_templates_app-route_1ece9366.js.map +1 -1
  125. package/mcp-server/.next/server/chunks/mcp-server_app_api_cloud_fix-workflow_steps_ts_b65f3271._.js +30 -16
  126. package/mcp-server/.next/server/chunks/mcp-server_app_api_cloud_fix-workflow_steps_ts_b65f3271._.js.map +1 -1
  127. package/mcp-server/.next/server/chunks/node_modules__pnpm_85ddbe9c._.js +2 -2
  128. package/mcp-server/.next/server/chunks/node_modules__pnpm_85ddbe9c._.js.map +1 -1
  129. package/mcp-server/.next/server/chunks/ssr/[root-of-the-server]__2e44f0db._.js +3 -0
  130. package/mcp-server/.next/server/chunks/ssr/[root-of-the-server]__2e44f0db._.js.map +1 -0
  131. package/mcp-server/.next/server/chunks/ssr/[root-of-the-server]__3585c949._.js +3 -0
  132. package/mcp-server/.next/server/chunks/ssr/[root-of-the-server]__3585c949._.js.map +1 -0
  133. package/mcp-server/.next/server/chunks/ssr/[root-of-the-server]__477c3bbb._.js +3 -0
  134. package/mcp-server/.next/server/chunks/ssr/[root-of-the-server]__477c3bbb._.js.map +1 -0
  135. package/mcp-server/.next/server/chunks/ssr/{[root-of-the-server]__570677dc._.js → [root-of-the-server]__880839a0._.js} +2 -2
  136. package/mcp-server/.next/server/chunks/ssr/[root-of-the-server]__880839a0._.js.map +1 -0
  137. package/mcp-server/.next/server/chunks/ssr/_41b8f993._.js +3 -0
  138. package/mcp-server/.next/server/chunks/ssr/_41b8f993._.js.map +1 -0
  139. package/mcp-server/.next/server/chunks/ssr/_9ba0ef29._.js +3 -0
  140. package/mcp-server/.next/server/chunks/ssr/_9ba0ef29._.js.map +1 -0
  141. package/mcp-server/.next/server/chunks/ssr/_cd4dc25e._.js.map +1 -1
  142. package/mcp-server/.next/server/chunks/ssr/mcp-server_app_workflows_new_new-workflow-client_tsx_1312c046._.js +2 -2
  143. package/mcp-server/.next/server/chunks/ssr/mcp-server_app_workflows_new_new-workflow-client_tsx_1312c046._.js.map +1 -1
  144. package/mcp-server/.next/server/chunks/ssr/mcp-server_app_workflows_workflows-client_tsx_268cfd4a._.js +7 -0
  145. package/mcp-server/.next/server/chunks/ssr/mcp-server_app_workflows_workflows-client_tsx_268cfd4a._.js.map +1 -0
  146. package/mcp-server/.next/server/chunks/ssr/node_modules__pnpm_961f21c4._.js +3 -0
  147. package/mcp-server/.next/server/chunks/ssr/node_modules__pnpm_961f21c4._.js.map +1 -0
  148. package/mcp-server/.next/server/chunks/ssr/node_modules__pnpm_a82244bf._.js +3 -0
  149. package/mcp-server/.next/server/chunks/ssr/node_modules__pnpm_a82244bf._.js.map +1 -0
  150. package/mcp-server/.next/server/chunks/ssr/{node_modules__pnpm_07527699._.js → node_modules__pnpm_eb98e511._.js} +2 -2
  151. package/mcp-server/.next/server/chunks/ssr/node_modules__pnpm_eb98e511._.js.map +1 -0
  152. package/mcp-server/.next/server/middleware.js.nft.json +1 -1
  153. package/mcp-server/.next/server/server-reference-manifest.js +1 -1
  154. package/mcp-server/.next/server/server-reference-manifest.json +1 -1
  155. package/mcp-server/.next/static/chunks/000849a6a897f531.css +1 -0
  156. package/mcp-server/.next/static/chunks/048cee2510ddb1a0.js +1 -0
  157. package/mcp-server/.next/static/chunks/0622bd0e093adee7.js +3 -0
  158. package/mcp-server/.next/static/chunks/{46f60efee5f19794.js → 16359f64918a93f3.js} +1 -1
  159. package/mcp-server/.next/static/chunks/1851a3e70d7efc10.js +1 -0
  160. package/mcp-server/.next/static/chunks/{cc6addc4bb10fa11.js → 2ad16eeb719786f1.js} +1 -1
  161. package/mcp-server/.next/static/chunks/57feca7a4e06545e.js +7 -0
  162. package/mcp-server/.next/static/chunks/93db5737a327ab0c.js +6 -0
  163. package/mcp-server/.next/static/chunks/9fd3c715ecfb4d05.js +1 -0
  164. package/mcp-server/.next/static/chunks/b4b1ec6435790587.js +1 -0
  165. package/mcp-server/.next/static/chunks/cfe150cb2048b7e8.js +1 -0
  166. package/mcp-server/app/api/cloud/fix-workflow/steps.ts +267 -28
  167. package/mcp-server/app/api/cloud/fix-workflow/workflow.ts +16 -8
  168. package/mcp-server/app/api/cloud/start-fix/route.ts +2 -2
  169. package/mcp-server/app/api/workflows/route.ts +45 -1
  170. package/mcp-server/app/workflows/workflows-client.tsx +259 -100
  171. package/mcp-server/package.json +1 -1
  172. package/package.json +3 -3
  173. package/src/tui-interface-impl.tsx +175 -127
  174. package/mcp-server/.next/server/chunks/[root-of-the-server]__41aa7b20._.js.map +0 -1
  175. package/mcp-server/.next/server/chunks/[root-of-the-server]__446f0436._.js.map +0 -1
  176. package/mcp-server/.next/server/chunks/[root-of-the-server]__c508da18._.js +0 -3
  177. package/mcp-server/.next/server/chunks/[root-of-the-server]__c508da18._.js.map +0 -1
  178. package/mcp-server/.next/server/chunks/[root-of-the-server]__d6a224bc._.js.map +0 -1
  179. package/mcp-server/.next/server/chunks/ssr/[root-of-the-server]__0ff05d72._.js +0 -3
  180. package/mcp-server/.next/server/chunks/ssr/[root-of-the-server]__0ff05d72._.js.map +0 -1
  181. package/mcp-server/.next/server/chunks/ssr/[root-of-the-server]__27cc5956._.js +0 -3
  182. package/mcp-server/.next/server/chunks/ssr/[root-of-the-server]__27cc5956._.js.map +0 -1
  183. package/mcp-server/.next/server/chunks/ssr/[root-of-the-server]__570677dc._.js.map +0 -1
  184. package/mcp-server/.next/server/chunks/ssr/[root-of-the-server]__ef510343._.js +0 -3
  185. package/mcp-server/.next/server/chunks/ssr/[root-of-the-server]__ef510343._.js.map +0 -1
  186. package/mcp-server/.next/server/chunks/ssr/node_modules__pnpm_07527699._.js.map +0 -1
  187. package/mcp-server/.next/server/chunks/ssr/node_modules__pnpm_7cc36047._.js +0 -3
  188. package/mcp-server/.next/server/chunks/ssr/node_modules__pnpm_7cc36047._.js.map +0 -1
  189. package/mcp-server/.next/static/chunks/07848f6bd2a7e5f6.js +0 -3
  190. package/mcp-server/.next/static/chunks/637a66565f27572f.js +0 -6
  191. package/mcp-server/.next/static/chunks/aed4fb5252a4bc95.js +0 -3
  192. package/mcp-server/.next/static/chunks/e8d521464b0c96ca.css +0 -1
  193. package/mcp-server/.next/static/chunks/ff53279afa939907.js +0 -1
  194. package/mcp-server/.next/static/chunks/ffa2ecb6845be49c.js +0 -1
  195. /package/mcp-server/.next/static/{UcmWUkU-l9iLeWRnSUybj → 5zfTZk2QSS7WLdL1K8Q5I}/_buildManifest.js +0 -0
  196. /package/mcp-server/.next/static/{UcmWUkU-l9iLeWRnSUybj → 5zfTZk2QSS7WLdL1K8Q5I}/_clientMiddlewareManifest.json +0 -0
  197. /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
- return { logAnalysis: JSON.stringify(clsData, null, 2), beforeScreenshotUrl: null }
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 screenshot
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: "success",
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 success: ${runId}`)
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
+ }