@shepai/cli 1.202.1-pr606.60460ac → 1.202.2

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 (372) hide show
  1. package/package.json +1 -1
  2. package/web/.next/BUILD_ID +1 -1
  3. package/web/.next/build-manifest.json +2 -2
  4. package/web/.next/fallback-build-manifest.json +2 -2
  5. package/web/.next/prerender-manifest.json +3 -3
  6. package/web/.next/required-server-files.js +2 -2
  7. package/web/.next/required-server-files.json +2 -2
  8. package/web/.next/server/app/(dashboard)/@drawer/adopt/page/react-loadable-manifest.json +4 -4
  9. package/web/.next/server/app/(dashboard)/@drawer/adopt/page/server-reference-manifest.json +37 -37
  10. package/web/.next/server/app/(dashboard)/@drawer/adopt/page.js.nft.json +1 -1
  11. package/web/.next/server/app/(dashboard)/@drawer/adopt/page_client-reference-manifest.js +1 -1
  12. package/web/.next/server/app/(dashboard)/@drawer/chat/page/react-loadable-manifest.json +4 -4
  13. package/web/.next/server/app/(dashboard)/@drawer/chat/page/server-reference-manifest.json +35 -35
  14. package/web/.next/server/app/(dashboard)/@drawer/chat/page.js.nft.json +1 -1
  15. package/web/.next/server/app/(dashboard)/@drawer/chat/page_client-reference-manifest.js +1 -1
  16. package/web/.next/server/app/(dashboard)/@drawer/create/page/react-loadable-manifest.json +4 -4
  17. package/web/.next/server/app/(dashboard)/@drawer/create/page/server-reference-manifest.json +38 -38
  18. package/web/.next/server/app/(dashboard)/@drawer/create/page.js.nft.json +1 -1
  19. package/web/.next/server/app/(dashboard)/@drawer/create/page_client-reference-manifest.js +1 -1
  20. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page/react-loadable-manifest.json +4 -4
  21. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page/server-reference-manifest.json +47 -47
  22. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page.js.nft.json +1 -1
  23. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page_client-reference-manifest.js +1 -1
  24. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page/react-loadable-manifest.json +4 -4
  25. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page/server-reference-manifest.json +47 -47
  26. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js.nft.json +1 -1
  27. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page_client-reference-manifest.js +1 -1
  28. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/[tab]/page/react-loadable-manifest.json +4 -4
  29. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/[tab]/page/server-reference-manifest.json +36 -36
  30. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/[tab]/page.js.nft.json +1 -1
  31. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/[tab]/page_client-reference-manifest.js +1 -1
  32. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page/react-loadable-manifest.json +4 -4
  33. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page/server-reference-manifest.json +36 -36
  34. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js.nft.json +1 -1
  35. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  36. package/web/.next/server/app/(dashboard)/chat/page/react-loadable-manifest.json +4 -4
  37. package/web/.next/server/app/(dashboard)/chat/page/server-reference-manifest.json +35 -35
  38. package/web/.next/server/app/(dashboard)/chat/page.js.nft.json +1 -1
  39. package/web/.next/server/app/(dashboard)/chat/page_client-reference-manifest.js +1 -1
  40. package/web/.next/server/app/(dashboard)/control-center/page/react-loadable-manifest.json +4 -4
  41. package/web/.next/server/app/(dashboard)/control-center/page/server-reference-manifest.json +35 -35
  42. package/web/.next/server/app/(dashboard)/control-center/page.js.nft.json +1 -1
  43. package/web/.next/server/app/(dashboard)/control-center/page_client-reference-manifest.js +1 -1
  44. package/web/.next/server/app/(dashboard)/create/page/react-loadable-manifest.json +4 -4
  45. package/web/.next/server/app/(dashboard)/create/page/server-reference-manifest.json +38 -38
  46. package/web/.next/server/app/(dashboard)/create/page.js.nft.json +1 -1
  47. package/web/.next/server/app/(dashboard)/create/page_client-reference-manifest.js +1 -1
  48. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page/react-loadable-manifest.json +4 -4
  49. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page/server-reference-manifest.json +47 -47
  50. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page.js.nft.json +1 -1
  51. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page_client-reference-manifest.js +1 -1
  52. package/web/.next/server/app/(dashboard)/feature/[featureId]/page/react-loadable-manifest.json +4 -4
  53. package/web/.next/server/app/(dashboard)/feature/[featureId]/page/server-reference-manifest.json +47 -47
  54. package/web/.next/server/app/(dashboard)/feature/[featureId]/page.js.nft.json +1 -1
  55. package/web/.next/server/app/(dashboard)/feature/[featureId]/page_client-reference-manifest.js +1 -1
  56. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/[tab]/page/react-loadable-manifest.json +4 -4
  57. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/[tab]/page/server-reference-manifest.json +36 -36
  58. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/[tab]/page.js.nft.json +1 -1
  59. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/[tab]/page_client-reference-manifest.js +1 -1
  60. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page/react-loadable-manifest.json +4 -4
  61. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page/server-reference-manifest.json +36 -36
  62. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js.nft.json +1 -1
  63. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  64. package/web/.next/server/app/_global-error.html +2 -2
  65. package/web/.next/server/app/_global-error.rsc +1 -1
  66. package/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  67. package/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  68. package/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  69. package/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  70. package/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  71. package/web/.next/server/app/_not-found/page/react-loadable-manifest.json +4 -4
  72. package/web/.next/server/app/_not-found/page/server-reference-manifest.json +9 -9
  73. package/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  74. package/web/.next/server/app/agent-questions/page/react-loadable-manifest.json +4 -4
  75. package/web/.next/server/app/agent-questions/page/server-reference-manifest.json +11 -11
  76. package/web/.next/server/app/agent-questions/page_client-reference-manifest.js +1 -1
  77. package/web/.next/server/app/agents/[agentType]/page/react-loadable-manifest.json +4 -4
  78. package/web/.next/server/app/agents/[agentType]/page/server-reference-manifest.json +13 -13
  79. package/web/.next/server/app/agents/[agentType]/page_client-reference-manifest.js +1 -1
  80. package/web/.next/server/app/agents/page/react-loadable-manifest.json +4 -4
  81. package/web/.next/server/app/agents/page/server-reference-manifest.json +10 -10
  82. package/web/.next/server/app/agents/page_client-reference-manifest.js +1 -1
  83. package/web/.next/server/app/application/[id]/page/react-loadable-manifest.json +4 -4
  84. package/web/.next/server/app/application/[id]/page/server-reference-manifest.json +18 -18
  85. package/web/.next/server/app/application/[id]/page.js.nft.json +1 -1
  86. package/web/.next/server/app/application/[id]/page_client-reference-manifest.js +1 -1
  87. package/web/.next/server/app/application/[id]/supervisor/page/react-loadable-manifest.json +4 -4
  88. package/web/.next/server/app/application/[id]/supervisor/page/server-reference-manifest.json +10 -10
  89. package/web/.next/server/app/application/[id]/supervisor/page_client-reference-manifest.js +1 -1
  90. package/web/.next/server/app/applications/page/react-loadable-manifest.json +4 -4
  91. package/web/.next/server/app/applications/page/server-reference-manifest.json +20 -20
  92. package/web/.next/server/app/applications/page.js.nft.json +1 -1
  93. package/web/.next/server/app/applications/page_client-reference-manifest.js +1 -1
  94. package/web/.next/server/app/features/page/react-loadable-manifest.json +4 -4
  95. package/web/.next/server/app/features/page/server-reference-manifest.json +31 -31
  96. package/web/.next/server/app/features/page.js.nft.json +1 -1
  97. package/web/.next/server/app/features/page_client-reference-manifest.js +1 -1
  98. package/web/.next/server/app/onboarding/page/react-loadable-manifest.json +4 -4
  99. package/web/.next/server/app/onboarding/page/server-reference-manifest.json +9 -9
  100. package/web/.next/server/app/onboarding/page_client-reference-manifest.js +1 -1
  101. package/web/.next/server/app/page/react-loadable-manifest.json +4 -4
  102. package/web/.next/server/app/page/server-reference-manifest.json +9 -9
  103. package/web/.next/server/app/page_client-reference-manifest.js +1 -1
  104. package/web/.next/server/app/projects/[slug]/items/[itemId]/page/react-loadable-manifest.json +4 -4
  105. package/web/.next/server/app/projects/[slug]/items/[itemId]/page/server-reference-manifest.json +16 -16
  106. package/web/.next/server/app/projects/[slug]/items/[itemId]/page_client-reference-manifest.js +1 -1
  107. package/web/.next/server/app/projects/[slug]/page/react-loadable-manifest.json +4 -4
  108. package/web/.next/server/app/projects/[slug]/page/server-reference-manifest.json +28 -28
  109. package/web/.next/server/app/projects/[slug]/page_client-reference-manifest.js +1 -1
  110. package/web/.next/server/app/projects/[slug]/pages/page/react-loadable-manifest.json +4 -4
  111. package/web/.next/server/app/projects/[slug]/pages/page/server-reference-manifest.json +12 -12
  112. package/web/.next/server/app/projects/[slug]/pages/page_client-reference-manifest.js +1 -1
  113. package/web/.next/server/app/projects/[slug]/settings/page/react-loadable-manifest.json +4 -4
  114. package/web/.next/server/app/projects/[slug]/settings/page/server-reference-manifest.json +18 -18
  115. package/web/.next/server/app/projects/[slug]/settings/page_client-reference-manifest.js +1 -1
  116. package/web/.next/server/app/projects/page/react-loadable-manifest.json +4 -4
  117. package/web/.next/server/app/projects/page/server-reference-manifest.json +10 -10
  118. package/web/.next/server/app/projects/page_client-reference-manifest.js +1 -1
  119. package/web/.next/server/app/settings/page/react-loadable-manifest.json +4 -4
  120. package/web/.next/server/app/settings/page/server-reference-manifest.json +15 -15
  121. package/web/.next/server/app/settings/page_client-reference-manifest.js +1 -1
  122. package/web/.next/server/app/skills/page/react-loadable-manifest.json +4 -4
  123. package/web/.next/server/app/skills/page/server-reference-manifest.json +17 -17
  124. package/web/.next/server/app/skills/page_client-reference-manifest.js +1 -1
  125. package/web/.next/server/app/supervisor/feature/[featureId]/page/react-loadable-manifest.json +4 -4
  126. package/web/.next/server/app/supervisor/feature/[featureId]/page/server-reference-manifest.json +10 -10
  127. package/web/.next/server/app/supervisor/feature/[featureId]/page_client-reference-manifest.js +1 -1
  128. package/web/.next/server/app/supervisor/page/react-loadable-manifest.json +4 -4
  129. package/web/.next/server/app/supervisor/page/server-reference-manifest.json +10 -10
  130. package/web/.next/server/app/supervisor/page_client-reference-manifest.js +1 -1
  131. package/web/.next/server/app/supervisor/repo/[repositoryId]/page/react-loadable-manifest.json +4 -4
  132. package/web/.next/server/app/supervisor/repo/[repositoryId]/page/server-reference-manifest.json +10 -10
  133. package/web/.next/server/app/supervisor/repo/[repositoryId]/page_client-reference-manifest.js +1 -1
  134. package/web/.next/server/app/tools/page/react-loadable-manifest.json +4 -4
  135. package/web/.next/server/app/tools/page/server-reference-manifest.json +15 -15
  136. package/web/.next/server/app/tools/page_client-reference-manifest.js +1 -1
  137. package/web/.next/server/app/version/page/react-loadable-manifest.json +4 -4
  138. package/web/.next/server/app/version/page/server-reference-manifest.json +9 -9
  139. package/web/.next/server/app/version/page_client-reference-manifest.js +1 -1
  140. package/web/.next/server/chunks/[root-of-the-server]__10e976f3._.js +1 -1
  141. package/web/.next/server/chunks/ssr/744ca_web__next-internal_server_app_agent-questions_page_actions_4b694f8d.js +1 -1
  142. package/web/.next/server/chunks/ssr/744ca_web__next-internal_server_app_agent-questions_page_actions_4b694f8d.js.map +1 -1
  143. package/web/.next/server/chunks/ssr/744ca_web__next-internal_server_app_agents_[agentType]_page_actions_103679a6.js +1 -1
  144. package/web/.next/server/chunks/ssr/744ca_web__next-internal_server_app_agents_[agentType]_page_actions_103679a6.js.map +1 -1
  145. package/web/.next/server/chunks/ssr/744ca_web__next-internal_server_app_projects_[slug]_pages_page_actions_19d50f6c.js +1 -1
  146. package/web/.next/server/chunks/ssr/744ca_web__next-internal_server_app_projects_[slug]_pages_page_actions_19d50f6c.js.map +1 -1
  147. package/web/.next/server/chunks/ssr/744ca_web_app_projects_[slug]_items_[itemId]_work-item-detail-client_tsx_d2e02407._.js +1 -1
  148. package/web/.next/server/chunks/ssr/744ca_web_app_projects_[slug]_items_[itemId]_work-item-detail-client_tsx_d2e02407._.js.map +1 -1
  149. package/web/.next/server/chunks/ssr/744ca_web_app_projects_[slug]_settings_project-settings-client_tsx_e8b85ddc._.js +1 -1
  150. package/web/.next/server/chunks/ssr/744ca_web_app_projects_[slug]_settings_project-settings-client_tsx_e8b85ddc._.js.map +1 -1
  151. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_feature-drawer-client_tsx_e9755fc8._.js +2 -2
  152. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_feature-drawer-client_tsx_e9755fc8._.js.map +1 -1
  153. package/web/.next/server/chunks/ssr/744ca_web_components_features_applications_applications-page-client_tsx_d0db9938._.js +1 -1
  154. package/web/.next/server/chunks/ssr/744ca_web_components_features_applications_applications-page-client_tsx_d0db9938._.js.map +1 -1
  155. package/web/.next/server/chunks/ssr/[root-of-the-server]__0af8610a._.js +3 -3
  156. package/web/.next/server/chunks/ssr/[root-of-the-server]__0af8610a._.js.map +1 -1
  157. package/web/.next/server/chunks/ssr/[root-of-the-server]__0b652a2f._.js +1 -1
  158. package/web/.next/server/chunks/ssr/{[root-of-the-server]__8b73253b._.js → [root-of-the-server]__2e388ba3._.js} +2 -2
  159. package/web/.next/server/chunks/ssr/{[root-of-the-server]__8b73253b._.js.map → [root-of-the-server]__2e388ba3._.js.map} +1 -1
  160. package/web/.next/server/chunks/ssr/[root-of-the-server]__56cf47e7._.js +1 -1
  161. package/web/.next/server/chunks/ssr/[root-of-the-server]__56cf47e7._.js.map +1 -1
  162. package/web/.next/server/chunks/ssr/[root-of-the-server]__648730d4._.js +1 -1
  163. package/web/.next/server/chunks/ssr/[root-of-the-server]__68df6415._.js +1 -1
  164. package/web/.next/server/chunks/ssr/[root-of-the-server]__68df6415._.js.map +1 -1
  165. package/web/.next/server/chunks/ssr/[root-of-the-server]__6bc6bf96._.js +1 -1
  166. package/web/.next/server/chunks/ssr/[root-of-the-server]__6bc6bf96._.js.map +1 -1
  167. package/web/.next/server/chunks/ssr/[root-of-the-server]__9852cb08._.js +2 -2
  168. package/web/.next/server/chunks/ssr/[root-of-the-server]__9852cb08._.js.map +1 -1
  169. package/web/.next/server/chunks/ssr/[root-of-the-server]__a1167cec._.js +1 -1
  170. package/web/.next/server/chunks/ssr/[root-of-the-server]__a1167cec._.js.map +1 -1
  171. package/web/.next/server/chunks/ssr/[root-of-the-server]__a12d0ad7._.js +3 -0
  172. package/web/.next/server/chunks/ssr/{[root-of-the-server]__52ca7f88._.js.map → [root-of-the-server]__a12d0ad7._.js.map} +1 -1
  173. package/web/.next/server/chunks/ssr/[root-of-the-server]__ba699bec._.js +1 -1
  174. package/web/.next/server/chunks/ssr/[root-of-the-server]__ba699bec._.js.map +1 -1
  175. package/web/.next/server/chunks/ssr/[root-of-the-server]__e0741ee1._.js +1 -1
  176. package/web/.next/server/chunks/ssr/[root-of-the-server]__e0fa59e6._.js +1 -1
  177. package/web/.next/server/chunks/ssr/[root-of-the-server]__e0fa59e6._.js.map +1 -1
  178. package/web/.next/server/chunks/ssr/[root-of-the-server]__ea26ff90._.js +3 -3
  179. package/web/.next/server/chunks/ssr/[root-of-the-server]__ff0095e3._.js +1 -1
  180. package/web/.next/server/chunks/ssr/_07036593._.js +1 -1
  181. package/web/.next/server/chunks/ssr/_07036593._.js.map +1 -1
  182. package/web/.next/server/chunks/ssr/_0d2a7595._.js +1 -1
  183. package/web/.next/server/chunks/ssr/_0d2a7595._.js.map +1 -1
  184. package/web/.next/server/chunks/ssr/_101de7c3._.js +1 -1
  185. package/web/.next/server/chunks/ssr/_101de7c3._.js.map +1 -1
  186. package/web/.next/server/chunks/ssr/{_db111d21._.js → _10f54ace._.js} +2 -2
  187. package/web/.next/server/chunks/ssr/{_db111d21._.js.map → _10f54ace._.js.map} +1 -1
  188. package/web/.next/server/chunks/ssr/_24fca3cf._.js +1 -1
  189. package/web/.next/server/chunks/ssr/_24fca3cf._.js.map +1 -1
  190. package/web/.next/server/chunks/ssr/{_6ff832ad._.js → _2759af76._.js} +2 -2
  191. package/web/.next/server/chunks/ssr/{_6ff832ad._.js.map → _2759af76._.js.map} +1 -1
  192. package/web/.next/server/chunks/ssr/_2bc48f3d._.js +1 -1
  193. package/web/.next/server/chunks/ssr/_2bc48f3d._.js.map +1 -1
  194. package/web/.next/server/chunks/ssr/{_fb539286._.js → _2bef1982._.js} +2 -2
  195. package/web/.next/server/chunks/ssr/{_fb539286._.js.map → _2bef1982._.js.map} +1 -1
  196. package/web/.next/server/chunks/ssr/_32f66845._.js +1 -1
  197. package/web/.next/server/chunks/ssr/_408848e6._.js +1 -1
  198. package/web/.next/server/chunks/ssr/_408848e6._.js.map +1 -1
  199. package/web/.next/server/chunks/ssr/_40e02782._.js +1 -1
  200. package/web/.next/server/chunks/ssr/_40e02782._.js.map +1 -1
  201. package/web/.next/server/chunks/ssr/_486d45d6._.js +1 -1
  202. package/web/.next/server/chunks/ssr/_486d45d6._.js.map +1 -1
  203. package/web/.next/server/chunks/ssr/{_824d5772._.js → _498cba11._.js} +2 -2
  204. package/web/.next/server/chunks/ssr/{_824d5772._.js.map → _498cba11._.js.map} +1 -1
  205. package/web/.next/server/chunks/ssr/_56b9d60f._.js +1 -1
  206. package/web/.next/server/chunks/ssr/_56b9d60f._.js.map +1 -1
  207. package/web/.next/server/chunks/ssr/_5cbb0e22._.js +1 -1
  208. package/web/.next/server/chunks/ssr/_5cbb0e22._.js.map +1 -1
  209. package/web/.next/server/chunks/ssr/{_5a3edc88._.js → _673be4f1._.js} +2 -2
  210. package/web/.next/server/chunks/ssr/{_5a3edc88._.js.map → _673be4f1._.js.map} +1 -1
  211. package/web/.next/server/chunks/ssr/_7ba67729._.js +1 -1
  212. package/web/.next/server/chunks/ssr/_7ba67729._.js.map +1 -1
  213. package/web/.next/server/chunks/ssr/_805ae1aa._.js +1 -1
  214. package/web/.next/server/chunks/ssr/_805ae1aa._.js.map +1 -1
  215. package/web/.next/server/chunks/ssr/_87cf18c3._.js +1 -1
  216. package/web/.next/server/chunks/ssr/_87cf18c3._.js.map +1 -1
  217. package/web/.next/server/chunks/ssr/_8a700ff4._.js +1 -1
  218. package/web/.next/server/chunks/ssr/_8a700ff4._.js.map +1 -1
  219. package/web/.next/server/chunks/ssr/_95b97274._.js +1 -1
  220. package/web/.next/server/chunks/ssr/_95b97274._.js.map +1 -1
  221. package/web/.next/server/chunks/ssr/{_fbcfaf3a._.js → _9d18d1b1._.js} +2 -2
  222. package/web/.next/server/chunks/ssr/{_fbcfaf3a._.js.map → _9d18d1b1._.js.map} +1 -1
  223. package/web/.next/server/chunks/ssr/{_70ff64a1._.js → _a93687e6._.js} +2 -2
  224. package/web/.next/server/chunks/ssr/{_70ff64a1._.js.map → _a93687e6._.js.map} +1 -1
  225. package/web/.next/server/chunks/ssr/_c2e196ee._.js +1 -1
  226. package/web/.next/server/chunks/ssr/_c2e196ee._.js.map +1 -1
  227. package/web/.next/server/chunks/ssr/_ca3b7bf7._.js +1 -1
  228. package/web/.next/server/chunks/ssr/_ca3b7bf7._.js.map +1 -1
  229. package/web/.next/server/chunks/ssr/_d53224a9._.js +1 -1
  230. package/web/.next/server/chunks/ssr/_d53224a9._.js.map +1 -1
  231. package/web/.next/server/chunks/ssr/_d573dcc2._.js +1 -1
  232. package/web/.next/server/chunks/ssr/_e2671e14._.js +1 -1
  233. package/web/.next/server/chunks/ssr/_e2671e14._.js.map +1 -1
  234. package/web/.next/server/chunks/ssr/_ecd45b17._.js +1 -1
  235. package/web/.next/server/chunks/ssr/_ecd45b17._.js.map +1 -1
  236. package/web/.next/server/chunks/ssr/{_f0d45e47._.js → _f46d2018._.js} +2 -2
  237. package/web/.next/server/chunks/ssr/{_f0d45e47._.js.map → _f46d2018._.js.map} +1 -1
  238. package/web/.next/server/chunks/ssr/_f602cc9f._.js +1 -1
  239. package/web/.next/server/chunks/ssr/_f602cc9f._.js.map +1 -1
  240. package/web/.next/server/chunks/ssr/{_20a56008._.js → _f71954a5._.js} +2 -2
  241. package/web/.next/server/chunks/ssr/{_20a56008._.js.map → _f71954a5._.js.map} +1 -1
  242. package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_settings_settings-page-client_tsx_6ed9d5f8._.js +1 -1
  243. package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_settings_settings-page-client_tsx_6ed9d5f8._.js.map +1 -1
  244. package/web/.next/server/chunks/ssr/f3a1f_components_common_control-center-drawer_repository-drawer-client_tsx_39a00c03._.js +1 -1
  245. package/web/.next/server/chunks/ssr/src_presentation_web_0e291f0b._.js +1 -1
  246. package/web/.next/server/chunks/ssr/src_presentation_web_0e291f0b._.js.map +1 -1
  247. package/web/.next/server/chunks/ssr/{src_presentation_web_40673f0c._.js → src_presentation_web_16c83ab4._.js} +2 -2
  248. package/web/.next/server/chunks/ssr/{src_presentation_web_40673f0c._.js.map → src_presentation_web_16c83ab4._.js.map} +1 -1
  249. package/web/.next/server/chunks/ssr/src_presentation_web_1d8d177f._.js +1 -1
  250. package/web/.next/server/chunks/ssr/src_presentation_web_1d8d177f._.js.map +1 -1
  251. package/web/.next/server/chunks/ssr/src_presentation_web_450b58fc._.js +1 -1
  252. package/web/.next/server/chunks/ssr/src_presentation_web_450b58fc._.js.map +1 -1
  253. package/web/.next/server/chunks/ssr/src_presentation_web_47727150._.js +1 -1
  254. package/web/.next/server/chunks/ssr/src_presentation_web_47727150._.js.map +1 -1
  255. package/web/.next/server/chunks/ssr/src_presentation_web_64fcfc84._.js +1 -1
  256. package/web/.next/server/chunks/ssr/src_presentation_web_64fcfc84._.js.map +1 -1
  257. package/web/.next/server/chunks/ssr/src_presentation_web_74b7bdb2._.js +1 -1
  258. package/web/.next/server/chunks/ssr/src_presentation_web_74b7bdb2._.js.map +1 -1
  259. package/web/.next/server/chunks/ssr/src_presentation_web_82aeca34._.js +1 -1
  260. package/web/.next/server/chunks/ssr/src_presentation_web_82aeca34._.js.map +1 -1
  261. package/web/.next/server/chunks/ssr/src_presentation_web_8a564d47._.js +1 -1
  262. package/web/.next/server/chunks/ssr/src_presentation_web_8a564d47._.js.map +1 -1
  263. package/web/.next/server/chunks/ssr/src_presentation_web_9a543843._.js +1 -1
  264. package/web/.next/server/chunks/ssr/src_presentation_web_9a543843._.js.map +1 -1
  265. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app__not-found_page_actions_f4f3fad9.js +1 -1
  266. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app__not-found_page_actions_f4f3fad9.js.map +1 -1
  267. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_agents_page_actions_d4bd4711.js +1 -1
  268. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_agents_page_actions_d4bd4711.js.map +1 -1
  269. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_onboarding_page_actions_bb695e8d.js +1 -1
  270. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_onboarding_page_actions_bb695e8d.js.map +1 -1
  271. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_page_actions_ac47e420.js +1 -1
  272. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_page_actions_ac47e420.js.map +1 -1
  273. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_projects_page_actions_c91a23a8.js +1 -1
  274. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_projects_page_actions_c91a23a8.js.map +1 -1
  275. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_version_page_actions_63c2d912.js +1 -1
  276. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_version_page_actions_63c2d912.js.map +1 -1
  277. package/web/.next/server/chunks/ssr/src_presentation_web_a53a3da6._.js +1 -1
  278. package/web/.next/server/chunks/ssr/src_presentation_web_a53a3da6._.js.map +1 -1
  279. package/web/.next/server/chunks/ssr/src_presentation_web_app_actions_246617fe._.js +3 -3
  280. package/web/.next/server/chunks/ssr/src_presentation_web_app_actions_adopt-local-directory_ts_75f1f28c._.js +1 -1
  281. package/web/.next/server/chunks/ssr/src_presentation_web_app_actions_adopt-local-directory_ts_75f1f28c._.js.map +1 -1
  282. package/web/.next/server/chunks/ssr/src_presentation_web_app_actions_approve-feature_ts_9453ce8b._.js +1 -1
  283. package/web/.next/server/chunks/ssr/src_presentation_web_app_actions_open-directory_ts_1209d917._.js +1 -1
  284. package/web/.next/server/chunks/ssr/src_presentation_web_app_actions_open-directory_ts_1209d917._.js.map +1 -1
  285. package/web/.next/server/chunks/ssr/src_presentation_web_app_features_feature-tree-page-client_tsx_34c5cbbf._.js +1 -1
  286. package/web/.next/server/chunks/ssr/src_presentation_web_b1b3c26c._.js +1 -1
  287. package/web/.next/server/chunks/ssr/src_presentation_web_b1b3c26c._.js.map +1 -1
  288. package/web/.next/server/chunks/ssr/src_presentation_web_b98a4353._.js +1 -1
  289. package/web/.next/server/chunks/ssr/src_presentation_web_b98a4353._.js.map +1 -1
  290. package/web/.next/server/chunks/ssr/src_presentation_web_c96ca051._.js +1 -1
  291. package/web/.next/server/chunks/ssr/src_presentation_web_c96ca051._.js.map +1 -1
  292. package/web/.next/server/chunks/ssr/{src_presentation_web_e812a69b._.js → src_presentation_web_cb0d2c28._.js} +2 -2
  293. package/web/.next/server/chunks/ssr/{src_presentation_web_e812a69b._.js.map → src_presentation_web_cb0d2c28._.js.map} +1 -1
  294. package/web/.next/server/chunks/ssr/src_presentation_web_components_66643378._.js +1 -1
  295. package/web/.next/server/chunks/ssr/src_presentation_web_components_66643378._.js.map +1 -1
  296. package/web/.next/server/chunks/ssr/src_presentation_web_components_agent-editor_agent-editor-tabs_tsx_d5a954b4._.js +1 -1
  297. package/web/.next/server/chunks/ssr/src_presentation_web_components_agent-editor_agent-editor-tabs_tsx_d5a954b4._.js.map +1 -1
  298. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_skills_8a174cac._.js +1 -1
  299. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_skills_8a174cac._.js.map +1 -1
  300. package/web/.next/server/chunks/ssr/src_presentation_web_d3858f16._.js +1 -1
  301. package/web/.next/server/chunks/ssr/src_presentation_web_d3858f16._.js.map +1 -1
  302. package/web/.next/server/chunks/ssr/src_presentation_web_d7f8130c._.js +1 -1
  303. package/web/.next/server/chunks/ssr/src_presentation_web_d7f8130c._.js.map +1 -1
  304. package/web/.next/server/chunks/ssr/src_presentation_web_dddd8ccd._.js +1 -1
  305. package/web/.next/server/chunks/ssr/src_presentation_web_dddd8ccd._.js.map +1 -1
  306. package/web/.next/server/chunks/ssr/src_presentation_web_e13d58b0._.js +1 -1
  307. package/web/.next/server/chunks/ssr/src_presentation_web_e13d58b0._.js.map +1 -1
  308. package/web/.next/server/chunks/ssr/src_presentation_web_ee94a9aa._.js +1 -1
  309. package/web/.next/server/chunks/ssr/src_presentation_web_ee94a9aa._.js.map +1 -1
  310. package/web/.next/server/chunks/ssr/src_presentation_web_f0fcfdff._.js +1 -1
  311. package/web/.next/server/chunks/ssr/src_presentation_web_f0fcfdff._.js.map +1 -1
  312. package/web/.next/server/chunks/ssr/src_presentation_web_f17e8516._.js +1 -1
  313. package/web/.next/server/chunks/ssr/src_presentation_web_f17e8516._.js.map +1 -1
  314. package/web/.next/server/chunks/ssr/src_presentation_web_f7180fec._.js +1 -1
  315. package/web/.next/server/chunks/ssr/src_presentation_web_f7180fec._.js.map +1 -1
  316. package/web/.next/server/pages/500.html +2 -2
  317. package/web/.next/server/server-reference-manifest.js +1 -1
  318. package/web/.next/server/server-reference-manifest.json +111 -111
  319. package/web/.next/static/chunks/{5faa828877b1e669.js → 03dda23205877d8b.js} +1 -1
  320. package/web/.next/static/chunks/{4bf4f333302e24a4.js → 054e3a5f5ff4db71.js} +1 -1
  321. package/web/.next/static/chunks/{a868014dbe1b4e42.js → 06e58041911c290b.js} +1 -1
  322. package/web/.next/static/chunks/{b5ff852fee23795d.js → 089ef5b749d79ebd.js} +1 -1
  323. package/web/.next/static/chunks/{1a093b13a9d6952e.js → 0d106010c498c198.js} +2 -2
  324. package/web/.next/static/chunks/193e5a0540757f5e.js +1 -0
  325. package/web/.next/static/chunks/{9abc3e68af98e636.js → 25111a2f2597f500.js} +1 -1
  326. package/web/.next/static/chunks/285e724d07901ef6.js +1 -0
  327. package/web/.next/static/chunks/{3c396f63ebefe875.js → 2b2bfc0465b18a7d.js} +1 -1
  328. package/web/.next/static/chunks/{6af99a08ccacdbce.js → 2b436562e69d2827.js} +1 -1
  329. package/web/.next/static/chunks/{8c96a835b3b0dc44.js → 2e3844d0ac487ac7.js} +1 -1
  330. package/web/.next/static/chunks/325859b8a9482427.js +1 -0
  331. package/web/.next/static/chunks/{2773e7b2587bc9cc.js → 44ab458ceb89d85d.js} +1 -1
  332. package/web/.next/static/chunks/4fdf36904f5421a6.js +1 -0
  333. package/web/.next/static/chunks/59004c65d552581c.js +1 -0
  334. package/web/.next/static/chunks/{0edcdc8a2dd06b7a.js → 5c4837e88a3431b8.js} +1 -1
  335. package/web/.next/static/chunks/{a131f868af7f1f7c.js → 74cdd562eb663f72.js} +1 -1
  336. package/web/.next/static/chunks/{0315591c972888a6.js → 7670d76d4ee743e6.js} +1 -1
  337. package/web/.next/static/chunks/{02d88da9fd656fcd.js → 83fc784ce05a701e.js} +1 -1
  338. package/web/.next/static/chunks/{460cedaa85c821e7.js → 8dd4fdd20b103a66.js} +1 -1
  339. package/web/.next/static/chunks/9336bdc7fc319282.js +1 -0
  340. package/web/.next/static/chunks/9d285565922b2de7.js +1 -0
  341. package/web/.next/static/chunks/{45eeca36eabbed23.js → 9f7f2a11937d87eb.js} +1 -1
  342. package/web/.next/static/chunks/{c3931fdbae836be6.js → a7c7bcfb6f7696a3.js} +1 -1
  343. package/web/.next/static/chunks/{9f7985e2a73929a2.js → a8f57d2a12849f32.js} +1 -1
  344. package/web/.next/static/chunks/{0e1c933065a1100a.js → abe98954ccdf29db.js} +1 -1
  345. package/web/.next/static/chunks/{4378715fa2b5e7de.js → b05808da85e8b34c.js} +1 -1
  346. package/web/.next/static/chunks/{b5dc7979d66caa38.js → b5f83e5e1dad23d5.js} +1 -1
  347. package/web/.next/static/chunks/{6d2074fa3453d333.js → b8293a56f257e5a2.js} +1 -1
  348. package/web/.next/static/chunks/{bc5b87e4068ba11d.js → c61c5e97c76dc733.js} +1 -1
  349. package/web/.next/static/chunks/c6b411bf31744ca7.js +1 -0
  350. package/web/.next/static/chunks/{bdaa907bf3d1d932.js → c732d6cc4c5e4343.js} +1 -1
  351. package/web/.next/static/chunks/{25a200f055ae5cba.js → d214d6a670f48d79.js} +1 -1
  352. package/web/.next/static/chunks/{6901861cb53ab483.js → d7b17a93a26e97c8.js} +1 -1
  353. package/web/.next/static/chunks/{a0325f77bbccc63d.js → d8f14fac959a6bd0.js} +1 -1
  354. package/web/.next/static/chunks/{24ea54516dc249c0.js → d98912f5b6cf4938.js} +1 -1
  355. package/web/.next/static/chunks/{21500b3fe3754296.js → df79667c16344317.js} +1 -1
  356. package/web/.next/static/chunks/{05e8df10619fb980.js → ec8f19328ad1ecd4.js} +1 -1
  357. package/web/.next/static/chunks/{e6e6ba783b2e4d14.js → f0157331838ac962.js} +1 -1
  358. package/web/.next/static/chunks/{c687ed21b9518d73.js → f757d865fae71faf.js} +1 -1
  359. package/web/.next/static/chunks/fb3cbb7f575a7128.js +1 -0
  360. package/web/.next/server/chunks/ssr/[root-of-the-server]__52ca7f88._.js +0 -3
  361. package/web/.next/static/chunks/03d7b81c2554d52f.js +0 -1
  362. package/web/.next/static/chunks/15acdaaea57bb459.js +0 -1
  363. package/web/.next/static/chunks/39fe1c1397d5483b.js +0 -1
  364. package/web/.next/static/chunks/495883829026f13f.js +0 -1
  365. package/web/.next/static/chunks/4b3a4f416a6eb1ac.js +0 -1
  366. package/web/.next/static/chunks/4b4160f36cf2a3d6.js +0 -1
  367. package/web/.next/static/chunks/7269537b2188650d.js +0 -1
  368. package/web/.next/static/chunks/b1534b2f3d814fef.js +0 -1
  369. package/web/.next/static/chunks/f6dc1ba364203bb2.js +0 -1
  370. /package/web/.next/static/{My4IQDygZ4BFTXkkKanja → 9zd-B2rWybTaAgE74IKiK}/_buildManifest.js +0 -0
  371. /package/web/.next/static/{My4IQDygZ4BFTXkkKanja → 9zd-B2rWybTaAgE74IKiK}/_clientMiddlewareManifest.json +0 -0
  372. /package/web/.next/static/{My4IQDygZ4BFTXkkKanja → 9zd-B2rWybTaAgE74IKiK}/_ssgManifest.js +0 -0
@@ -1,3 +1,3 @@
1
- module.exports=[549596,a=>{"use strict";var b=a.i(556365),c=a.i(944592),d=a.i(91109),e=a.i(917985),f=a.i(403195),g=a.i(323784),h=a.i(882014),i=a.i(488064),j=a.i(867837),k=a.i(925603),l=a.i(385536),m=a.i(966691),n=a.i(857411),o=a.i(591498),p=a.i(241994),q=a.i(771238);let r=(0,a.i(225700).default)("folder-git-2",[["path",{d:"M18 19a5 5 0 0 1-5-5v8",key:"sz5oeg"}],["path",{d:"M9 20H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h3.9a2 2 0 0 1 1.69.9l.81 1.2a2 2 0 0 0 1.67.9H20a2 2 0 0 1 2 2v5",key:"1w6njk"}],["circle",{cx:"13",cy:"12",r:"2",key:"1j92g6"}],["circle",{cx:"20",cy:"19",r:"2",key:"1obnsp"}]]);var s=a.i(884494),t=a.i(806130),u=a.i(450490),v=a.i(428002),w=a.i(216605),x=a.i(793193),y=a.i(103942),z=a.i(480535),A=a.i(952313),B=a.i(118948),C=a.i(645670),D=a.i(675192),E=a.i(670268),F=a.i(261189),G=a.i(533419),H=a.i(118662),I=a.i(746847),J=a.i(887973),K=a.i(748957);let L="rgba(255,255,255,0.13)",M="rgba(255,255,255,0.07)",N="rgba(255,255,255,0.04)",O=[function(){return(0,b.jsxs)("svg",{viewBox:"0 0 320 160",className:"h-full w-full","aria-hidden":"true",children:[Array.from({length:8},(a,c)=>Array.from({length:16},(a,d)=>(0,b.jsx)("circle",{cx:10+20*d,cy:10+20*c,r:"1.5",fill:M},`${c}-${d}`))),(0,b.jsx)("circle",{cx:"240",cy:"56",r:"52",fill:"none",stroke:N,strokeWidth:"1"}),(0,b.jsx)("circle",{cx:"240",cy:"56",r:"32",fill:"none",stroke:L,strokeWidth:"0.8"}),(0,b.jsx)("circle",{cx:"60",cy:"112",r:"14",fill:"none",stroke:M,strokeWidth:"1"}),(0,b.jsx)("circle",{cx:"60",cy:"112",r:"6",fill:N})]})},function(){return(0,b.jsxs)("svg",{viewBox:"0 0 320 160",className:"h-full w-full","aria-hidden":"true",children:[[24,48,72,96,120].map((a,c)=>(0,b.jsx)("path",{d:`M0,${a} C64,${a-18+4*c} 128,${a+18-3*c} 192,${a-12+2*c} S288,${a+14} 320,${a}`,fill:"none",stroke:2===c?L:M,strokeWidth:2===c?1.5:1},`wave-${a}`)),(0,b.jsx)("path",{d:"M0,72 C64,54 128,90 192,60 S288,86 320,72 L320,160 L0,160 Z",fill:N}),(0,b.jsx)("circle",{cx:"290",cy:"30",r:"18",fill:"none",stroke:M,strokeWidth:"1"})]})},function(){return(0,b.jsxs)("svg",{viewBox:"0 0 320 160",className:"h-full w-full","aria-hidden":"true",children:[(0,b.jsx)("circle",{cx:"160",cy:"160",r:"120",fill:"none",stroke:N,strokeWidth:"40"}),(0,b.jsx)("circle",{cx:"100",cy:"60",r:"70",fill:"none",stroke:M,strokeWidth:"1"}),(0,b.jsx)("circle",{cx:"220",cy:"80",r:"55",fill:"none",stroke:L,strokeWidth:"1"}),(0,b.jsx)("polygon",{points:"160,18 196,60 160,102 124,60",fill:"none",stroke:M,strokeWidth:"1"}),(0,b.jsx)("circle",{cx:"20",cy:"20",r:"2",fill:L}),(0,b.jsx)("circle",{cx:"300",cy:"20",r:"2",fill:L}),(0,b.jsx)("circle",{cx:"20",cy:"140",r:"2",fill:L}),(0,b.jsx)("circle",{cx:"300",cy:"140",r:"2",fill:L})]})},function(){let a=[];for(let c=32;c<320;c+=32)a.push((0,b.jsx)("line",{x1:c,y1:"0",x2:c,y2:"160",stroke:N,strokeWidth:"1"},`v${c}`));for(let c=32;c<160;c+=32)a.push((0,b.jsx)("line",{x1:"0",y1:c,x2:"320",y2:c,stroke:N,strokeWidth:"1"},`h${c}`));return(0,b.jsxs)("svg",{viewBox:"0 0 320 160",className:"h-full w-full","aria-hidden":"true",children:[a,[20,40,64,90].map(a=>(0,b.jsx)("circle",{cx:"160",cy:"80",r:a,fill:"none",stroke:40===a?L:M,strokeWidth:"1"},a)),(0,b.jsx)("circle",{cx:"160",cy:"80",r:"4",fill:L})]})}];function P({name:a}){let c=O[function(a){let b=0x811c9dc5;for(let c=0;c<a.length;c++)b^=a.charCodeAt(c),b=Math.imul(b,0x1000193)>>>0;return b}(a)%O.length];return(0,b.jsx)(c,{})}function Q({application:e,className:f}){let g=(0,d.useRouter)(),h=(0,z.useQueryClient)(),[j,k]=(0,c.useState)(!1),m=(0,G.useTurnStatus)((0,J.featureIdForApplication)(e.id)),n=(0,H.useDeployAction)({targetId:e.id,targetType:"application",repositoryPath:e.repositoryPath}),L=n.url,M=(0,F.deriveAppLiveStatus)(e.status,m,!!L,e.effectiveStatus),N=e.cloudDeploymentUrl??null,O=e.cloudDeploymentProvider??null,Q=O?K.CLOUD_PROVIDER_ICONS[O]:null,R=O?K.CLOUD_PROVIDER_BRAND_HEX[O]:void 0,S=e.cloudDeploymentStatus===I.CloudDeploymentStatus.Deployed&&!!N,T=e.cloudDeploymentStatus===I.CloudDeploymentStatus.Uploading,U=e.cloudDeploymentStatus===I.CloudDeploymentStatus.Failed,V="building"===e.effectiveStatus,W="interrupted"===e.effectiveStatus,X="failed"===e.effectiveStatus,Y=n.status===I.DeploymentState.Booting||n.deployLoading,Z=n.status===I.DeploymentState.Ready&&!!L,$=Z?L:S?N:null,_=!!$,aa=()=>g.push(`/application/${e.id}`),ab=e.repositoryPath.split(/[/\\]/).pop()??e.repositoryPath;return(0,b.jsxs)(b.Fragment,{children:[(0,b.jsxs)("article",{"data-testid":"application-card",onClick:aa,className:(0,l.cn)("group relative flex cursor-pointer flex-col overflow-hidden rounded-sm","bg-card dark:bg-neutral-900","border-border/60 border shadow-sm dark:border-white/10","hover:border-border transition-all duration-200 hover:shadow-lg dark:hover:border-white/20 dark:hover:shadow-black/40","min-h-[280px]",f),children:[(0,b.jsxs)("div",{className:"relative overflow-hidden",style:{height:160},children:[_?(0,b.jsxs)("div",{className:"absolute inset-0 bg-white dark:bg-neutral-900",children:[(0,b.jsx)("iframe",{src:$,title:`${e.name} preview`,className:"pointer-events-none absolute top-0 left-0 origin-top-left border-0",style:{width:"250%",height:"250%",transform:"scale(0.4)"},sandbox:"allow-same-origin allow-scripts",loading:"lazy"}),(0,b.jsxs)("div",{className:"absolute inset-0 flex items-center justify-center gap-2 bg-black/60 opacity-0 transition-opacity group-hover:opacity-100",onClick:a=>a.stopPropagation(),children:[Z?(0,b.jsxs)("button",{type:"button",onClick:()=>void n.stop(),disabled:n.stopLoading,className:"inline-flex h-7 cursor-pointer items-center gap-1 rounded-full bg-white/90 px-3 text-[11px] font-semibold text-neutral-900 hover:bg-red-50 hover:text-red-600",children:[n.stopLoading?(0,b.jsx)(i.Loader2,{className:"h-3 w-3 animate-spin"}):(0,b.jsx)(v.RefreshCw,{className:"h-3 w-3"}),"Stop"]}):null,(0,b.jsxs)("button",{type:"button",onClick:()=>window.open($,"_blank","noopener,noreferrer"),className:"inline-flex h-7 cursor-pointer items-center gap-1 rounded-full bg-white/90 px-3 text-[11px] font-semibold text-neutral-900 hover:bg-white",children:[(0,b.jsx)(q.ExternalLink,{className:"h-3 w-3"}),"Open"]})]})]}):Y?(0,b.jsx)("div",{className:"absolute inset-0 bg-white dark:bg-neutral-900",children:(0,b.jsxs)("div",{className:"flex h-full flex-col items-center justify-center gap-2",children:[(0,b.jsx)(i.Loader2,{className:"h-6 w-6 animate-spin text-amber-500"}),(0,b.jsx)("span",{className:"text-[11px] font-medium text-amber-600 dark:text-amber-400",children:"Starting…"})]})}):(0,b.jsx)("div",{className:"absolute inset-0 overflow-hidden bg-[#111827] dark:bg-neutral-800",children:(0,b.jsx)(P,{name:e.name})}),(0,b.jsx)("div",{className:"absolute top-2.5 left-2.5",onClick:a=>a.stopPropagation(),children:S?(0,b.jsxs)("span",{className:"flex items-center gap-1 rounded-full bg-black/30 px-2 py-0.5 text-[9px] font-bold tracking-wider text-white uppercase backdrop-blur-sm",children:[Q?(0,b.jsx)(Q,{className:"h-3 w-3",style:{color:R??"#fff"}}):(0,b.jsx)("span",{className:"h-1.5 w-1.5 animate-pulse rounded-full bg-emerald-400"}),"Live"]}):T?(0,b.jsxs)("span",{className:"flex items-center gap-1 rounded-full bg-black/30 px-2 py-0.5 text-[9px] font-bold tracking-wider text-white/80 uppercase backdrop-blur-sm",children:[(0,b.jsx)(i.Loader2,{className:"h-2.5 w-2.5 animate-spin"}),"Deploying"]}):V?(0,b.jsxs)("span",{className:"flex items-center gap-1 rounded-full bg-black/30 px-2 py-0.5 text-[9px] font-bold tracking-wider text-white/80 uppercase backdrop-blur-sm",children:[(0,b.jsx)(y.Zap,{className:"h-2.5 w-2.5"}),"Building"]}):M.pulse?(0,b.jsxs)("span",{className:"relative flex h-2 w-2",children:[(0,b.jsx)("span",{className:(0,l.cn)("absolute inline-flex h-full w-full animate-ping rounded-full opacity-75",M.dotClass)}),(0,b.jsx)("span",{className:(0,l.cn)("relative inline-flex h-2 w-2 rounded-full",M.dotClass)})]}):null}),(0,b.jsx)("div",{className:"absolute top-2.5 right-2.5",onClick:a=>a.stopPropagation(),children:(0,b.jsxs)(D.DropdownMenu,{children:[(0,b.jsx)(D.DropdownMenuTrigger,{asChild:!0,children:(0,b.jsx)("button",{type:"button",className:"flex h-6 w-6 cursor-pointer items-center justify-center rounded-full bg-black/30 text-white/80 opacity-0 backdrop-blur-sm transition-opacity group-hover:opacity-100 hover:bg-black/50",children:(0,b.jsx)(t.MoreHorizontal,{className:"h-3.5 w-3.5"})})}),(0,b.jsx)(D.DropdownMenuContent,{align:"end",sideOffset:4,children:(0,b.jsxs)(D.DropdownMenuItem,{className:"text-destructive focus:text-destructive cursor-pointer",onClick:()=>k(!0),children:[(0,b.jsx)(w.Trash2,{className:"mr-2 h-3.5 w-3.5"}),"Delete"]})})]})})]}),(0,b.jsxs)("div",{className:"flex flex-1 flex-col gap-1.5 px-3.5 pt-3 pb-0",children:[(0,b.jsxs)("div",{children:[(0,b.jsx)("h3",{className:"text-foreground line-clamp-1 text-[14px] leading-tight font-semibold",children:e.name}),e.description?(0,b.jsx)("p",{className:"text-muted-foreground mt-0.5 line-clamp-1 text-[11px] leading-relaxed",children:e.description}):null]}),T?(0,b.jsxs)("div",{className:"flex items-center gap-1.5 py-0.5",children:[(0,b.jsx)(i.Loader2,{className:"text-muted-foreground h-3 w-3 shrink-0 animate-spin"}),(0,b.jsxs)("span",{className:"text-muted-foreground text-[11px]",children:["Deploying to ",O??"cloud","…"]})]}):U?(0,b.jsxs)("div",{className:"flex items-center gap-1.5 py-0.5",children:[(0,b.jsx)(o.AlertTriangle,{className:"text-destructive/70 h-3 w-3 shrink-0"}),(0,b.jsx)("span",{className:"text-destructive/80 text-[11px]",children:"Deployment failed"})]}):V?(0,b.jsxs)("div",{className:"flex items-center gap-1.5 py-0.5",children:[(0,b.jsx)(y.Zap,{className:"text-muted-foreground h-3 w-3 shrink-0"}),(0,b.jsx)("span",{className:"text-muted-foreground text-[11px]",children:"Building with AI…"}),(0,b.jsx)("div",{className:"ml-auto flex gap-0.5",children:[0,1,2].map(a=>(0,b.jsx)("span",{className:"bg-muted-foreground/40 h-1 w-1 animate-bounce rounded-full",style:{animationDelay:`${120*a}ms`}},a))})]}):W?(0,b.jsxs)("div",{className:"flex items-center gap-1.5 py-0.5",children:[(0,b.jsx)(o.AlertTriangle,{className:"h-3 w-3 shrink-0 text-amber-500/70"}),(0,b.jsx)("span",{className:"text-muted-foreground text-[11px]",children:"Build interrupted"})]}):X?(0,b.jsxs)("div",{className:"flex items-center gap-1.5 py-0.5",children:[(0,b.jsx)(x.TriangleAlert,{className:"text-destructive/70 h-3 w-3 shrink-0"}),(0,b.jsx)("span",{className:"text-muted-foreground text-[11px]",children:"Build failed"})]}):S?null:(0,b.jsxs)("div",{className:"flex items-center gap-1.5 py-0.5",children:[(0,b.jsx)(s.Globe,{className:"text-muted-foreground/40 h-3 w-3 shrink-0"}),(0,b.jsx)("span",{className:"text-muted-foreground/60 text-[11px]",children:"Not deployed yet"})]})]}),(0,b.jsxs)("div",{className:"flex items-center gap-2 px-3.5 pt-2 pb-3",onClick:a=>a.stopPropagation(),children:[(0,b.jsxs)("div",{className:"flex min-w-0 flex-1 items-center gap-2",children:[(0,b.jsxs)("button",{type:"button",title:e.repositoryPath,onClick:async b=>{b.stopPropagation();let{openDirectory:c}=await a.A(795071);await c(e.repositoryPath)},className:"text-muted-foreground/70 hover:text-foreground inline-flex shrink-0 items-center gap-1 text-[10px] transition-colors",children:[(0,b.jsx)(r,{className:"h-3 w-3 shrink-0"}),(0,b.jsx)("span",{className:"max-w-[80px] truncate",children:ab})]}),N?(0,b.jsxs)("a",{href:N,target:"_blank",rel:"noopener noreferrer",title:N,className:"text-muted-foreground/70 hover:text-foreground inline-flex min-w-0 items-center gap-1 text-[10px] transition-colors",children:[Q?(0,b.jsx)(Q,{className:"h-3 w-3 shrink-0",style:{color:R}}):(0,b.jsx)(s.Globe,{className:"h-3 w-3 shrink-0"}),(0,b.jsx)("span",{className:"font-mono",children:function(a,b=22){let c=a.replace(/^https?:\/\//,"").replace(/\/$/,"");if(c.length<=b)return c;let d=c.slice(-(b-6));return`${c.slice(0,5)}…${d}`}(N)})]}):null]}),V||T?(0,b.jsxs)("span",{className:"text-muted-foreground inline-flex shrink-0 items-center gap-1.5 text-[11px]",children:[(0,b.jsx)(i.Loader2,{className:"h-3 w-3 animate-spin"}),V?"Building…":"Deploying…"]}):N&&S?(0,b.jsxs)("a",{href:N,target:"_blank",rel:"noopener noreferrer",className:"bg-foreground text-background inline-flex h-7 shrink-0 cursor-pointer items-center gap-1.5 rounded-full px-3 text-[11px] font-semibold transition-opacity hover:opacity-80",children:[(0,b.jsx)(q.ExternalLink,{className:"h-3 w-3"}),"Open live"]}):W?(0,b.jsxs)("button",{type:"button",onClick:aa,className:"inline-flex h-7 shrink-0 cursor-pointer items-center gap-1.5 rounded-full bg-amber-500 px-3 text-[11px] font-semibold text-white transition-opacity hover:opacity-80",children:[(0,b.jsx)(u.Play,{className:"h-3 w-3 fill-current"}),"Continue"]}):X?(0,b.jsxs)("button",{type:"button",onClick:aa,className:"bg-destructive inline-flex h-7 shrink-0 cursor-pointer items-center gap-1.5 rounded-full px-3 text-[11px] font-semibold text-white transition-opacity hover:opacity-80",children:[(0,b.jsx)(p.ArrowRight,{className:"h-3 w-3"}),"View error"]}):(0,b.jsxs)("button",{type:"button",onClick:aa,className:"bg-foreground text-background inline-flex h-7 shrink-0 cursor-pointer items-center gap-1.5 rounded-full px-3 text-[11px] font-semibold transition-opacity hover:opacity-80",children:[(0,b.jsx)(p.ArrowRight,{className:"h-3 w-3"}),"Open"]})]})]}),(0,b.jsx)(C.Dialog,{open:j,onOpenChange:k,children:(0,b.jsxs)(C.DialogContent,{className:"max-w-xs",children:[(0,b.jsxs)(C.DialogHeader,{children:[(0,b.jsx)(C.DialogTitle,{children:"Delete application?"}),(0,b.jsxs)(C.DialogDescription,{children:["This will permanently remove ",(0,b.jsx)("strong",{children:e.name}),"."]})]}),(0,b.jsxs)(C.DialogFooter,{className:"grid grid-cols-2 gap-2 sm:flex-none",children:[(0,b.jsx)(C.DialogClose,{asChild:!0,children:(0,b.jsx)(B.Button,{variant:"outline",children:"Cancel"})}),(0,b.jsx)(B.Button,{variant:"destructive",onClick:async()=>{k(!1);let a=await (0,E.deleteApplication)(e.id);a.error?A.toast.error("Failed to delete",{description:a.error}):(A.toast.success("Application deleted"),h.invalidateQueries({queryKey:["applications"]}))},children:"Delete"})]})]})})]})}var R=a.i(289111);let S=(0,R.createServerReference)("00ad19b30c66b798476855eee8c99ef61a175cd38a",R.callServer,void 0,R.findSourceMapURL,"listDeployments");function T({className:f}){let g=(0,d.useRouter)(),[j,k]=(0,c.useState)(!1),{data:o=[],isLoading:p}=(0,e.useQuery)({queryKey:["applications"],queryFn:async()=>{let a=await fetch("/api/applications");if(!a.ok)throw Error("Failed to fetch applications");return a.json()},staleTime:3e4}),{data:q=[]}=(0,e.useQuery)({queryKey:["deployments","all"],queryFn:()=>S(),staleTime:0,refetchInterval:3e3}),r=(0,c.useMemo)(()=>[...o].sort((a,b)=>new Date(b.createdAt).getTime()-new Date(a.createdAt).getTime()),[o]);return(0,b.jsx)(m.DeploymentStatusProvider,{initialDeployments:q,children:(0,b.jsxs)("div",{"data-testid":"applications-page-client",className:(0,l.cn)("relative flex min-h-full flex-col",f),children:[(0,b.jsxs)("div",{className:"flex flex-1 flex-col gap-4 p-6",children:[(0,b.jsxs)("div",{className:"flex items-center gap-2",children:[(0,b.jsx)(h.LayoutGrid,{className:"text-muted-foreground h-4 w-4"}),(0,b.jsx)("h1",{className:"text-sm font-bold tracking-tight",children:"Applications"}),p?null:(0,b.jsxs)("span",{className:"text-muted-foreground text-[10px]",children:[o.length," ",1===o.length?"app":"apps"]})]}),p?(0,b.jsx)("div",{className:"flex items-center justify-center py-12",children:(0,b.jsx)(i.Loader2,{className:"text-muted-foreground h-5 w-5 animate-spin"})}):0===r.length?(0,b.jsx)("div",{className:"flex flex-1 items-center justify-center",children:(0,b.jsx)(n.ControlCenterEmptyState,{onApplicationCreated:a=>{g.push(`/application/${a}`)}})}):(0,b.jsxs)("div",{"data-testid":"applications-page-grid",className:"grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4",children:[(0,b.jsx)(U,{onDescribe:()=>k(!0),onOpenLocalDirectory:async()=>{let{pickFolder:b}=await a.A(845515),c=await b();if(!c)return;let{adoptLocalDirectory:d}=await a.A(88378),e=await d({repositoryPath:c});e.applicationId&&g.push(`/application/${e.applicationId}`)},onImportGitHub:()=>window.dispatchEvent(new CustomEvent("shep:open-github-import"))}),r.map(a=>(0,b.jsx)(Q,{application:a},a.id))]})]}),j?(0,b.jsx)("div",{className:"absolute inset-0 z-40",children:(0,b.jsx)(n.ControlCenterEmptyState,{onApplicationCreated:a=>{g.push(`/application/${a}`)},onClose:()=>k(!1),className:"bg-background"})}):null]})})}function U({onDescribe:a,onOpenLocalDirectory:c,onImportGitHub:d}){let e=[{icon:(0,b.jsx)(k.Sparkles,{className:"h-4 w-4"}),label:"Describe with AI",description:"Tell Shep what to build — it scaffolds + ships",onClick:a,accent:"text-indigo-500 bg-indigo-100 dark:bg-indigo-900/60"},...c?[{icon:(0,b.jsx)(f.FolderOpen,{className:"h-4 w-4"}),label:"Open local project",description:"Pick an existing folder and continue from there",onClick:c,accent:"text-amber-600 bg-amber-100 dark:bg-amber-900/40"}]:[],...d?[{icon:(0,b.jsx)(g.Github,{className:"h-4 w-4"}),label:"Import from GitHub",description:"Connect an existing repo to manage here",onClick:d,accent:"text-foreground bg-muted"}]:[]];return(0,b.jsxs)("div",{className:(0,l.cn)("group relative flex cursor-pointer flex-col overflow-hidden rounded-sm border-2","border-dashed border-indigo-200 bg-transparent transition-all duration-200","hover:border-indigo-400 hover:bg-indigo-500/[0.03]","dark:border-indigo-900 dark:hover:border-indigo-700","min-h-[280px]"),onClick:a,children:[(0,b.jsxs)("div",{className:(0,l.cn)("absolute inset-0 flex flex-col items-center justify-center gap-3","transition-opacity duration-200 group-hover:opacity-0","pointer-events-none"),children:[(0,b.jsx)("div",{className:"flex h-11 w-11 items-center justify-center rounded-full bg-indigo-100 text-indigo-500 dark:bg-indigo-900/60 dark:text-indigo-400",children:(0,b.jsx)(j.Plus,{className:"h-5 w-5 stroke-[2]"})}),(0,b.jsxs)("div",{className:"text-center",children:[(0,b.jsx)("p",{className:"text-foreground text-sm font-semibold",children:"New application"}),(0,b.jsx)("p",{className:"text-muted-foreground mt-0.5 text-[11px]",children:"Click to get started"})]})]}),(0,b.jsxs)("div",{className:(0,l.cn)("absolute inset-0 flex flex-col justify-center gap-1.5 px-4","translate-y-3 opacity-0 transition-all duration-200","group-hover:translate-y-0 group-hover:opacity-100"),children:[(0,b.jsx)("p",{className:"text-muted-foreground mb-1 px-1 text-[10px] font-medium tracking-wide uppercase",children:"How would you like to start?"}),e.map(a=>(0,b.jsxs)("button",{type:"button",onClick:b=>{b.stopPropagation(),a.onClick()},className:(0,l.cn)("flex w-full cursor-pointer items-center gap-3 rounded-lg px-3 py-2.5 text-left","border-border/60 bg-background/80 border transition-all duration-150","hover:border-indigo-300 hover:bg-indigo-50 dark:hover:border-indigo-700 dark:hover:bg-indigo-950/40"),children:[(0,b.jsx)("span",{className:(0,l.cn)("flex h-7 w-7 shrink-0 items-center justify-center rounded-md",a.accent),children:a.icon}),(0,b.jsxs)("div",{className:"min-w-0",children:[(0,b.jsx)("div",{className:"text-foreground text-[12px] font-semibold",children:a.label}),(0,b.jsx)("div",{className:"text-muted-foreground truncate text-[10px]",children:a.description})]})]},a.label))]})]})}a.s(["ApplicationsPageClient",()=>T],549596)}];
1
+ module.exports=[549596,a=>{"use strict";var b=a.i(556365),c=a.i(944592),d=a.i(91109),e=a.i(917985),f=a.i(403195),g=a.i(323784),h=a.i(882014),i=a.i(488064),j=a.i(867837),k=a.i(925603),l=a.i(385536),m=a.i(966691),n=a.i(857411),o=a.i(591498),p=a.i(241994),q=a.i(771238);let r=(0,a.i(225700).default)("folder-git-2",[["path",{d:"M18 19a5 5 0 0 1-5-5v8",key:"sz5oeg"}],["path",{d:"M9 20H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h3.9a2 2 0 0 1 1.69.9l.81 1.2a2 2 0 0 0 1.67.9H20a2 2 0 0 1 2 2v5",key:"1w6njk"}],["circle",{cx:"13",cy:"12",r:"2",key:"1j92g6"}],["circle",{cx:"20",cy:"19",r:"2",key:"1obnsp"}]]);var s=a.i(884494),t=a.i(806130),u=a.i(450490),v=a.i(428002),w=a.i(216605),x=a.i(793193),y=a.i(103942),z=a.i(480535),A=a.i(952313),B=a.i(118948),C=a.i(645670),D=a.i(675192),E=a.i(36709),F=a.i(261189),G=a.i(533419),H=a.i(118662),I=a.i(746847),J=a.i(887973),K=a.i(748957);let L="rgba(255,255,255,0.13)",M="rgba(255,255,255,0.07)",N="rgba(255,255,255,0.04)",O=[function(){return(0,b.jsxs)("svg",{viewBox:"0 0 320 160",className:"h-full w-full","aria-hidden":"true",children:[Array.from({length:8},(a,c)=>Array.from({length:16},(a,d)=>(0,b.jsx)("circle",{cx:10+20*d,cy:10+20*c,r:"1.5",fill:M},`${c}-${d}`))),(0,b.jsx)("circle",{cx:"240",cy:"56",r:"52",fill:"none",stroke:N,strokeWidth:"1"}),(0,b.jsx)("circle",{cx:"240",cy:"56",r:"32",fill:"none",stroke:L,strokeWidth:"0.8"}),(0,b.jsx)("circle",{cx:"60",cy:"112",r:"14",fill:"none",stroke:M,strokeWidth:"1"}),(0,b.jsx)("circle",{cx:"60",cy:"112",r:"6",fill:N})]})},function(){return(0,b.jsxs)("svg",{viewBox:"0 0 320 160",className:"h-full w-full","aria-hidden":"true",children:[[24,48,72,96,120].map((a,c)=>(0,b.jsx)("path",{d:`M0,${a} C64,${a-18+4*c} 128,${a+18-3*c} 192,${a-12+2*c} S288,${a+14} 320,${a}`,fill:"none",stroke:2===c?L:M,strokeWidth:2===c?1.5:1},`wave-${a}`)),(0,b.jsx)("path",{d:"M0,72 C64,54 128,90 192,60 S288,86 320,72 L320,160 L0,160 Z",fill:N}),(0,b.jsx)("circle",{cx:"290",cy:"30",r:"18",fill:"none",stroke:M,strokeWidth:"1"})]})},function(){return(0,b.jsxs)("svg",{viewBox:"0 0 320 160",className:"h-full w-full","aria-hidden":"true",children:[(0,b.jsx)("circle",{cx:"160",cy:"160",r:"120",fill:"none",stroke:N,strokeWidth:"40"}),(0,b.jsx)("circle",{cx:"100",cy:"60",r:"70",fill:"none",stroke:M,strokeWidth:"1"}),(0,b.jsx)("circle",{cx:"220",cy:"80",r:"55",fill:"none",stroke:L,strokeWidth:"1"}),(0,b.jsx)("polygon",{points:"160,18 196,60 160,102 124,60",fill:"none",stroke:M,strokeWidth:"1"}),(0,b.jsx)("circle",{cx:"20",cy:"20",r:"2",fill:L}),(0,b.jsx)("circle",{cx:"300",cy:"20",r:"2",fill:L}),(0,b.jsx)("circle",{cx:"20",cy:"140",r:"2",fill:L}),(0,b.jsx)("circle",{cx:"300",cy:"140",r:"2",fill:L})]})},function(){let a=[];for(let c=32;c<320;c+=32)a.push((0,b.jsx)("line",{x1:c,y1:"0",x2:c,y2:"160",stroke:N,strokeWidth:"1"},`v${c}`));for(let c=32;c<160;c+=32)a.push((0,b.jsx)("line",{x1:"0",y1:c,x2:"320",y2:c,stroke:N,strokeWidth:"1"},`h${c}`));return(0,b.jsxs)("svg",{viewBox:"0 0 320 160",className:"h-full w-full","aria-hidden":"true",children:[a,[20,40,64,90].map(a=>(0,b.jsx)("circle",{cx:"160",cy:"80",r:a,fill:"none",stroke:40===a?L:M,strokeWidth:"1"},a)),(0,b.jsx)("circle",{cx:"160",cy:"80",r:"4",fill:L})]})}];function P({name:a}){let c=O[function(a){let b=0x811c9dc5;for(let c=0;c<a.length;c++)b^=a.charCodeAt(c),b=Math.imul(b,0x1000193)>>>0;return b}(a)%O.length];return(0,b.jsx)(c,{})}function Q({application:e,className:f}){let g=(0,d.useRouter)(),h=(0,z.useQueryClient)(),[j,k]=(0,c.useState)(!1),m=(0,G.useTurnStatus)((0,J.featureIdForApplication)(e.id)),n=(0,H.useDeployAction)({targetId:e.id,targetType:"application",repositoryPath:e.repositoryPath}),L=n.url,M=(0,F.deriveAppLiveStatus)(e.status,m,!!L,e.effectiveStatus),N=e.cloudDeploymentUrl??null,O=e.cloudDeploymentProvider??null,Q=O?K.CLOUD_PROVIDER_ICONS[O]:null,R=O?K.CLOUD_PROVIDER_BRAND_HEX[O]:void 0,S=e.cloudDeploymentStatus===I.CloudDeploymentStatus.Deployed&&!!N,T=e.cloudDeploymentStatus===I.CloudDeploymentStatus.Uploading,U=e.cloudDeploymentStatus===I.CloudDeploymentStatus.Failed,V="building"===e.effectiveStatus,W="interrupted"===e.effectiveStatus,X="failed"===e.effectiveStatus,Y=n.status===I.DeploymentState.Booting||n.deployLoading,Z=n.status===I.DeploymentState.Ready&&!!L,$=Z?L:S?N:null,_=!!$,aa=()=>g.push(`/application/${e.id}`),ab=e.repositoryPath.split(/[/\\]/).pop()??e.repositoryPath;return(0,b.jsxs)(b.Fragment,{children:[(0,b.jsxs)("article",{"data-testid":"application-card",onClick:aa,className:(0,l.cn)("group relative flex cursor-pointer flex-col overflow-hidden rounded-sm","bg-card dark:bg-neutral-900","border-border/60 border shadow-sm dark:border-white/10","hover:border-border transition-all duration-200 hover:shadow-lg dark:hover:border-white/20 dark:hover:shadow-black/40","min-h-[280px]",f),children:[(0,b.jsxs)("div",{className:"relative overflow-hidden",style:{height:160},children:[_?(0,b.jsxs)("div",{className:"absolute inset-0 bg-white dark:bg-neutral-900",children:[(0,b.jsx)("iframe",{src:$,title:`${e.name} preview`,className:"pointer-events-none absolute top-0 left-0 origin-top-left border-0",style:{width:"250%",height:"250%",transform:"scale(0.4)"},sandbox:"allow-same-origin allow-scripts",loading:"lazy"}),(0,b.jsxs)("div",{className:"absolute inset-0 flex items-center justify-center gap-2 bg-black/60 opacity-0 transition-opacity group-hover:opacity-100",onClick:a=>a.stopPropagation(),children:[Z?(0,b.jsxs)("button",{type:"button",onClick:()=>void n.stop(),disabled:n.stopLoading,className:"inline-flex h-7 cursor-pointer items-center gap-1 rounded-full bg-white/90 px-3 text-[11px] font-semibold text-neutral-900 hover:bg-red-50 hover:text-red-600",children:[n.stopLoading?(0,b.jsx)(i.Loader2,{className:"h-3 w-3 animate-spin"}):(0,b.jsx)(v.RefreshCw,{className:"h-3 w-3"}),"Stop"]}):null,(0,b.jsxs)("button",{type:"button",onClick:()=>window.open($,"_blank","noopener,noreferrer"),className:"inline-flex h-7 cursor-pointer items-center gap-1 rounded-full bg-white/90 px-3 text-[11px] font-semibold text-neutral-900 hover:bg-white",children:[(0,b.jsx)(q.ExternalLink,{className:"h-3 w-3"}),"Open"]})]})]}):Y?(0,b.jsx)("div",{className:"absolute inset-0 bg-white dark:bg-neutral-900",children:(0,b.jsxs)("div",{className:"flex h-full flex-col items-center justify-center gap-2",children:[(0,b.jsx)(i.Loader2,{className:"h-6 w-6 animate-spin text-amber-500"}),(0,b.jsx)("span",{className:"text-[11px] font-medium text-amber-600 dark:text-amber-400",children:"Starting…"})]})}):(0,b.jsx)("div",{className:"absolute inset-0 overflow-hidden bg-[#111827] dark:bg-neutral-800",children:(0,b.jsx)(P,{name:e.name})}),(0,b.jsx)("div",{className:"absolute top-2.5 left-2.5",onClick:a=>a.stopPropagation(),children:S?(0,b.jsxs)("span",{className:"flex items-center gap-1 rounded-full bg-black/30 px-2 py-0.5 text-[9px] font-bold tracking-wider text-white uppercase backdrop-blur-sm",children:[Q?(0,b.jsx)(Q,{className:"h-3 w-3",style:{color:R??"#fff"}}):(0,b.jsx)("span",{className:"h-1.5 w-1.5 animate-pulse rounded-full bg-emerald-400"}),"Live"]}):T?(0,b.jsxs)("span",{className:"flex items-center gap-1 rounded-full bg-black/30 px-2 py-0.5 text-[9px] font-bold tracking-wider text-white/80 uppercase backdrop-blur-sm",children:[(0,b.jsx)(i.Loader2,{className:"h-2.5 w-2.5 animate-spin"}),"Deploying"]}):V?(0,b.jsxs)("span",{className:"flex items-center gap-1 rounded-full bg-black/30 px-2 py-0.5 text-[9px] font-bold tracking-wider text-white/80 uppercase backdrop-blur-sm",children:[(0,b.jsx)(y.Zap,{className:"h-2.5 w-2.5"}),"Building"]}):M.pulse?(0,b.jsxs)("span",{className:"relative flex h-2 w-2",children:[(0,b.jsx)("span",{className:(0,l.cn)("absolute inline-flex h-full w-full animate-ping rounded-full opacity-75",M.dotClass)}),(0,b.jsx)("span",{className:(0,l.cn)("relative inline-flex h-2 w-2 rounded-full",M.dotClass)})]}):null}),(0,b.jsx)("div",{className:"absolute top-2.5 right-2.5",onClick:a=>a.stopPropagation(),children:(0,b.jsxs)(D.DropdownMenu,{children:[(0,b.jsx)(D.DropdownMenuTrigger,{asChild:!0,children:(0,b.jsx)("button",{type:"button",className:"flex h-6 w-6 cursor-pointer items-center justify-center rounded-full bg-black/30 text-white/80 opacity-0 backdrop-blur-sm transition-opacity group-hover:opacity-100 hover:bg-black/50",children:(0,b.jsx)(t.MoreHorizontal,{className:"h-3.5 w-3.5"})})}),(0,b.jsx)(D.DropdownMenuContent,{align:"end",sideOffset:4,children:(0,b.jsxs)(D.DropdownMenuItem,{className:"text-destructive focus:text-destructive cursor-pointer",onClick:()=>k(!0),children:[(0,b.jsx)(w.Trash2,{className:"mr-2 h-3.5 w-3.5"}),"Delete"]})})]})})]}),(0,b.jsxs)("div",{className:"flex flex-1 flex-col gap-1.5 px-3.5 pt-3 pb-0",children:[(0,b.jsxs)("div",{children:[(0,b.jsx)("h3",{className:"text-foreground line-clamp-1 text-[14px] leading-tight font-semibold",children:e.name}),e.description?(0,b.jsx)("p",{className:"text-muted-foreground mt-0.5 line-clamp-1 text-[11px] leading-relaxed",children:e.description}):null]}),T?(0,b.jsxs)("div",{className:"flex items-center gap-1.5 py-0.5",children:[(0,b.jsx)(i.Loader2,{className:"text-muted-foreground h-3 w-3 shrink-0 animate-spin"}),(0,b.jsxs)("span",{className:"text-muted-foreground text-[11px]",children:["Deploying to ",O??"cloud","…"]})]}):U?(0,b.jsxs)("div",{className:"flex items-center gap-1.5 py-0.5",children:[(0,b.jsx)(o.AlertTriangle,{className:"text-destructive/70 h-3 w-3 shrink-0"}),(0,b.jsx)("span",{className:"text-destructive/80 text-[11px]",children:"Deployment failed"})]}):V?(0,b.jsxs)("div",{className:"flex items-center gap-1.5 py-0.5",children:[(0,b.jsx)(y.Zap,{className:"text-muted-foreground h-3 w-3 shrink-0"}),(0,b.jsx)("span",{className:"text-muted-foreground text-[11px]",children:"Building with AI…"}),(0,b.jsx)("div",{className:"ml-auto flex gap-0.5",children:[0,1,2].map(a=>(0,b.jsx)("span",{className:"bg-muted-foreground/40 h-1 w-1 animate-bounce rounded-full",style:{animationDelay:`${120*a}ms`}},a))})]}):W?(0,b.jsxs)("div",{className:"flex items-center gap-1.5 py-0.5",children:[(0,b.jsx)(o.AlertTriangle,{className:"h-3 w-3 shrink-0 text-amber-500/70"}),(0,b.jsx)("span",{className:"text-muted-foreground text-[11px]",children:"Build interrupted"})]}):X?(0,b.jsxs)("div",{className:"flex items-center gap-1.5 py-0.5",children:[(0,b.jsx)(x.TriangleAlert,{className:"text-destructive/70 h-3 w-3 shrink-0"}),(0,b.jsx)("span",{className:"text-muted-foreground text-[11px]",children:"Build failed"})]}):S?null:(0,b.jsxs)("div",{className:"flex items-center gap-1.5 py-0.5",children:[(0,b.jsx)(s.Globe,{className:"text-muted-foreground/40 h-3 w-3 shrink-0"}),(0,b.jsx)("span",{className:"text-muted-foreground/60 text-[11px]",children:"Not deployed yet"})]})]}),(0,b.jsxs)("div",{className:"flex items-center gap-2 px-3.5 pt-2 pb-3",onClick:a=>a.stopPropagation(),children:[(0,b.jsxs)("div",{className:"flex min-w-0 flex-1 items-center gap-2",children:[(0,b.jsxs)("button",{type:"button",title:e.repositoryPath,onClick:async b=>{b.stopPropagation();let{openDirectory:c}=await a.A(795071);await c(e.repositoryPath)},className:"text-muted-foreground/70 hover:text-foreground inline-flex shrink-0 items-center gap-1 text-[10px] transition-colors",children:[(0,b.jsx)(r,{className:"h-3 w-3 shrink-0"}),(0,b.jsx)("span",{className:"max-w-[80px] truncate",children:ab})]}),N?(0,b.jsxs)("a",{href:N,target:"_blank",rel:"noopener noreferrer",title:N,className:"text-muted-foreground/70 hover:text-foreground inline-flex min-w-0 items-center gap-1 text-[10px] transition-colors",children:[Q?(0,b.jsx)(Q,{className:"h-3 w-3 shrink-0",style:{color:R}}):(0,b.jsx)(s.Globe,{className:"h-3 w-3 shrink-0"}),(0,b.jsx)("span",{className:"font-mono",children:function(a,b=22){let c=a.replace(/^https?:\/\//,"").replace(/\/$/,"");if(c.length<=b)return c;let d=c.slice(-(b-6));return`${c.slice(0,5)}…${d}`}(N)})]}):null]}),V||T?(0,b.jsxs)("span",{className:"text-muted-foreground inline-flex shrink-0 items-center gap-1.5 text-[11px]",children:[(0,b.jsx)(i.Loader2,{className:"h-3 w-3 animate-spin"}),V?"Building…":"Deploying…"]}):N&&S?(0,b.jsxs)("a",{href:N,target:"_blank",rel:"noopener noreferrer",className:"bg-foreground text-background inline-flex h-7 shrink-0 cursor-pointer items-center gap-1.5 rounded-full px-3 text-[11px] font-semibold transition-opacity hover:opacity-80",children:[(0,b.jsx)(q.ExternalLink,{className:"h-3 w-3"}),"Open live"]}):W?(0,b.jsxs)("button",{type:"button",onClick:aa,className:"inline-flex h-7 shrink-0 cursor-pointer items-center gap-1.5 rounded-full bg-amber-500 px-3 text-[11px] font-semibold text-white transition-opacity hover:opacity-80",children:[(0,b.jsx)(u.Play,{className:"h-3 w-3 fill-current"}),"Continue"]}):X?(0,b.jsxs)("button",{type:"button",onClick:aa,className:"bg-destructive inline-flex h-7 shrink-0 cursor-pointer items-center gap-1.5 rounded-full px-3 text-[11px] font-semibold text-white transition-opacity hover:opacity-80",children:[(0,b.jsx)(p.ArrowRight,{className:"h-3 w-3"}),"View error"]}):(0,b.jsxs)("button",{type:"button",onClick:aa,className:"bg-foreground text-background inline-flex h-7 shrink-0 cursor-pointer items-center gap-1.5 rounded-full px-3 text-[11px] font-semibold transition-opacity hover:opacity-80",children:[(0,b.jsx)(p.ArrowRight,{className:"h-3 w-3"}),"Open"]})]})]}),(0,b.jsx)(C.Dialog,{open:j,onOpenChange:k,children:(0,b.jsxs)(C.DialogContent,{className:"max-w-xs",children:[(0,b.jsxs)(C.DialogHeader,{children:[(0,b.jsx)(C.DialogTitle,{children:"Delete application?"}),(0,b.jsxs)(C.DialogDescription,{children:["This will permanently remove ",(0,b.jsx)("strong",{children:e.name}),"."]})]}),(0,b.jsxs)(C.DialogFooter,{className:"grid grid-cols-2 gap-2 sm:flex-none",children:[(0,b.jsx)(C.DialogClose,{asChild:!0,children:(0,b.jsx)(B.Button,{variant:"outline",children:"Cancel"})}),(0,b.jsx)(B.Button,{variant:"destructive",onClick:async()=>{k(!1);let a=await (0,E.deleteApplication)(e.id);a.error?A.toast.error("Failed to delete",{description:a.error}):(A.toast.success("Application deleted"),h.invalidateQueries({queryKey:["applications"]}))},children:"Delete"})]})]})})]})}var R=a.i(289111);let S=(0,R.createServerReference)("00a3d928a39e0706a7d619dcbbcaa2254aba5ae1ea",R.callServer,void 0,R.findSourceMapURL,"listDeployments");function T({className:f}){let g=(0,d.useRouter)(),[j,k]=(0,c.useState)(!1),{data:o=[],isLoading:p}=(0,e.useQuery)({queryKey:["applications"],queryFn:async()=>{let a=await fetch("/api/applications");if(!a.ok)throw Error("Failed to fetch applications");return a.json()},staleTime:3e4}),{data:q=[]}=(0,e.useQuery)({queryKey:["deployments","all"],queryFn:()=>S(),staleTime:0,refetchInterval:3e3}),r=(0,c.useMemo)(()=>[...o].sort((a,b)=>new Date(b.createdAt).getTime()-new Date(a.createdAt).getTime()),[o]);return(0,b.jsx)(m.DeploymentStatusProvider,{initialDeployments:q,children:(0,b.jsxs)("div",{"data-testid":"applications-page-client",className:(0,l.cn)("relative flex min-h-full flex-col",f),children:[(0,b.jsxs)("div",{className:"flex flex-1 flex-col gap-4 p-6",children:[(0,b.jsxs)("div",{className:"flex items-center gap-2",children:[(0,b.jsx)(h.LayoutGrid,{className:"text-muted-foreground h-4 w-4"}),(0,b.jsx)("h1",{className:"text-sm font-bold tracking-tight",children:"Applications"}),p?null:(0,b.jsxs)("span",{className:"text-muted-foreground text-[10px]",children:[o.length," ",1===o.length?"app":"apps"]})]}),p?(0,b.jsx)("div",{className:"flex items-center justify-center py-12",children:(0,b.jsx)(i.Loader2,{className:"text-muted-foreground h-5 w-5 animate-spin"})}):0===r.length?(0,b.jsx)("div",{className:"flex flex-1 items-center justify-center",children:(0,b.jsx)(n.ControlCenterEmptyState,{onApplicationCreated:a=>{g.push(`/application/${a}`)}})}):(0,b.jsxs)("div",{"data-testid":"applications-page-grid",className:"grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4",children:[(0,b.jsx)(U,{onDescribe:()=>k(!0),onOpenLocalDirectory:async()=>{let{pickFolder:b}=await a.A(845515),c=await b();if(!c)return;let{adoptLocalDirectory:d}=await a.A(88378),e=await d({repositoryPath:c});e.applicationId&&g.push(`/application/${e.applicationId}`)},onImportGitHub:()=>window.dispatchEvent(new CustomEvent("shep:open-github-import"))}),r.map(a=>(0,b.jsx)(Q,{application:a},a.id))]})]}),j?(0,b.jsx)("div",{className:"absolute inset-0 z-40",children:(0,b.jsx)(n.ControlCenterEmptyState,{onApplicationCreated:a=>{g.push(`/application/${a}`)},onClose:()=>k(!1),className:"bg-background"})}):null]})})}function U({onDescribe:a,onOpenLocalDirectory:c,onImportGitHub:d}){let e=[{icon:(0,b.jsx)(k.Sparkles,{className:"h-4 w-4"}),label:"Describe with AI",description:"Tell Shep what to build — it scaffolds + ships",onClick:a,accent:"text-indigo-500 bg-indigo-100 dark:bg-indigo-900/60"},...c?[{icon:(0,b.jsx)(f.FolderOpen,{className:"h-4 w-4"}),label:"Open local project",description:"Pick an existing folder and continue from there",onClick:c,accent:"text-amber-600 bg-amber-100 dark:bg-amber-900/40"}]:[],...d?[{icon:(0,b.jsx)(g.Github,{className:"h-4 w-4"}),label:"Import from GitHub",description:"Connect an existing repo to manage here",onClick:d,accent:"text-foreground bg-muted"}]:[]];return(0,b.jsxs)("div",{className:(0,l.cn)("group relative flex cursor-pointer flex-col overflow-hidden rounded-sm border-2","border-dashed border-indigo-200 bg-transparent transition-all duration-200","hover:border-indigo-400 hover:bg-indigo-500/[0.03]","dark:border-indigo-900 dark:hover:border-indigo-700","min-h-[280px]"),onClick:a,children:[(0,b.jsxs)("div",{className:(0,l.cn)("absolute inset-0 flex flex-col items-center justify-center gap-3","transition-opacity duration-200 group-hover:opacity-0","pointer-events-none"),children:[(0,b.jsx)("div",{className:"flex h-11 w-11 items-center justify-center rounded-full bg-indigo-100 text-indigo-500 dark:bg-indigo-900/60 dark:text-indigo-400",children:(0,b.jsx)(j.Plus,{className:"h-5 w-5 stroke-[2]"})}),(0,b.jsxs)("div",{className:"text-center",children:[(0,b.jsx)("p",{className:"text-foreground text-sm font-semibold",children:"New application"}),(0,b.jsx)("p",{className:"text-muted-foreground mt-0.5 text-[11px]",children:"Click to get started"})]})]}),(0,b.jsxs)("div",{className:(0,l.cn)("absolute inset-0 flex flex-col justify-center gap-1.5 px-4","translate-y-3 opacity-0 transition-all duration-200","group-hover:translate-y-0 group-hover:opacity-100"),children:[(0,b.jsx)("p",{className:"text-muted-foreground mb-1 px-1 text-[10px] font-medium tracking-wide uppercase",children:"How would you like to start?"}),e.map(a=>(0,b.jsxs)("button",{type:"button",onClick:b=>{b.stopPropagation(),a.onClick()},className:(0,l.cn)("flex w-full cursor-pointer items-center gap-3 rounded-lg px-3 py-2.5 text-left","border-border/60 bg-background/80 border transition-all duration-150","hover:border-indigo-300 hover:bg-indigo-50 dark:hover:border-indigo-700 dark:hover:bg-indigo-950/40"),children:[(0,b.jsx)("span",{className:(0,l.cn)("flex h-7 w-7 shrink-0 items-center justify-center rounded-md",a.accent),children:a.icon}),(0,b.jsxs)("div",{className:"min-w-0",children:[(0,b.jsx)("div",{className:"text-foreground text-[12px] font-semibold",children:a.label}),(0,b.jsx)("div",{className:"text-muted-foreground truncate text-[10px]",children:a.description})]})]},a.label))]})]})}a.s(["ApplicationsPageClient",()=>T],549596)}];
2
2
 
3
3
  //# sourceMappingURL=744ca_web_components_features_applications_applications-page-client_tsx_d0db9938._.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../../../src/presentation/web/components/features/applications/applications-page-client.tsx","../../../../../../../src/presentation/web/components/features/applications/application-card.tsx","../../../../../../../src/presentation/web/app/actions/data%3Ad1bbef%20%3Ctext/javascript%3E","../../../../../../../node_modules/.pnpm/lucide-react%400.563.0_react%4019.2.4/node_modules/lucide-react/src/icons/folder-git-2.ts"],"sourcesContent":["'use client';\n\nimport { useMemo, useState } from 'react';\nimport { useRouter } from 'next/navigation';\nimport { useQuery } from '@tanstack/react-query';\nimport { FolderOpen, Github, LayoutGrid, Loader2, Plus, Sparkles } from 'lucide-react';\nimport { cn } from '@/lib/utils';\nimport { DeploymentStatusProvider } from '@/hooks/deployment-status-provider';\nimport { ControlCenterEmptyState } from '@/components/features/control-center/control-center-empty-state';\nimport { ApplicationCard } from './application-card';\nimport { listDeployments } from '@/app/actions/list-deployments';\nimport type { ApplicationWithStatus } from '@shepai/core/application/use-cases/applications/list-applications.use-case';\nimport type { DeploymentStatusEntry } from '@shepai/core/application/ports/output/services/deployment-service.interface';\n\nexport interface ApplicationsPageClientProps {\n className?: string;\n}\n\ninterface NewApplicationCardProps {\n onDescribe(): void;\n onOpenLocalDirectory?: () => void;\n onImportGitHub?: () => void;\n}\n\nexport function ApplicationsPageClient({ className }: ApplicationsPageClientProps) {\n const router = useRouter();\n const [showCreatePrompt, setShowCreatePrompt] = useState(false);\n\n const { data: applications = [], isLoading } = useQuery<ApplicationWithStatus[]>({\n queryKey: ['applications'],\n queryFn: async () => {\n const res = await fetch('/api/applications');\n if (!res.ok) throw new Error('Failed to fetch applications');\n return res.json();\n },\n staleTime: 30_000,\n });\n\n // Live dev-server deployments — seeds the DeploymentStatusProvider so the\n // app cards reflect previews started on /application/[id] (or another tab)\n // instead of resetting every time this page mounts. Without this seed the\n // provider's `fullyHydrated` flag (set by the empty SSR hydrate) blocks\n // each card's `ensureHydrated` from fetching, leaving previews invisible.\n const { data: deployments = [] } = useQuery<DeploymentStatusEntry[]>({\n queryKey: ['deployments', 'all'],\n queryFn: () => listDeployments(),\n staleTime: 0,\n refetchInterval: 3_000,\n });\n\n const sorted = useMemo(\n () =>\n [...applications].sort(\n (a, b) => new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime()\n ),\n [applications]\n );\n\n return (\n <DeploymentStatusProvider initialDeployments={deployments}>\n <div\n data-testid=\"applications-page-client\"\n className={cn('relative flex min-h-full flex-col', className)}\n >\n {/* Content sits inside padding; the create-prompt overlay sits\n OUTSIDE this inner padded div so it can cover edge-to-edge. */}\n <div className=\"flex flex-1 flex-col gap-4 p-6\">\n {/* Compact header */}\n <div className=\"flex items-center gap-2\">\n <LayoutGrid className=\"text-muted-foreground h-4 w-4\" />\n <h1 className=\"text-sm font-bold tracking-tight\">Applications</h1>\n {!isLoading ? (\n <span className=\"text-muted-foreground text-[10px]\">\n {applications.length} {applications.length === 1 ? 'app' : 'apps'}\n </span>\n ) : null}\n </div>\n\n {isLoading ? (\n <div className=\"flex items-center justify-center py-12\">\n <Loader2 className=\"text-muted-foreground h-5 w-5 animate-spin\" />\n </div>\n ) : sorted.length === 0 ? (\n <div className=\"flex flex-1 items-center justify-center\">\n <ControlCenterEmptyState\n onApplicationCreated={(appId) => {\n router.push(`/application/${appId}`);\n }}\n />\n </div>\n ) : (\n <div\n data-testid=\"applications-page-grid\"\n className=\"grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4\"\n >\n {/* New application placeholder card — always FIRST so the\n user can click immediately without scanning past their apps. */}\n <NewApplicationCard\n onDescribe={() => setShowCreatePrompt(true)}\n onOpenLocalDirectory={async () => {\n const { pickFolder } = await import(\n '@/components/common/add-repository-button/pick-folder'\n );\n const path = await pickFolder();\n if (!path) return;\n const { adoptLocalDirectory } = await import(\n '@/app/actions/adopt-local-directory'\n );\n const result = await adoptLocalDirectory({ repositoryPath: path });\n if (result.applicationId) {\n router.push(`/application/${result.applicationId}`);\n }\n }}\n onImportGitHub={() =>\n window.dispatchEvent(new CustomEvent('shep:open-github-import'))\n }\n />\n\n {sorted.map((app) => (\n <ApplicationCard key={app.id} application={app} />\n ))}\n </div>\n )}\n </div>\n\n {/* Edge-to-edge create-prompt overlay. `absolute` (not `fixed`)\n so it stays contained within the page's relative root and\n never covers the AppsOnlyShell top bar. Sibling of the padded\n content div so it ignores the list's `p-6`. */}\n {showCreatePrompt ? (\n <div className=\"absolute inset-0 z-40\">\n <ControlCenterEmptyState\n onApplicationCreated={(appId) => {\n router.push(`/application/${appId}`);\n }}\n onClose={() => setShowCreatePrompt(false)}\n className=\"bg-background\"\n />\n </div>\n ) : null}\n </div>\n </DeploymentStatusProvider>\n );\n}\n\n/**\n * NewApplicationCard — a placeholder card that lives at the end of the\n * applications grid. At rest it shows a subtle dashed border with a\n * centered + icon and label. On hover the + fades out and a vertical\n * list of creation options slides in so the user can pick a path\n * without the card feeling cluttered at a glance.\n */\nfunction NewApplicationCard({\n onDescribe,\n onOpenLocalDirectory,\n onImportGitHub,\n}: NewApplicationCardProps) {\n const options: {\n icon: React.ReactNode;\n label: string;\n description: string;\n onClick(): void;\n accent: string;\n }[] = [\n {\n icon: <Sparkles className=\"h-4 w-4\" />,\n label: 'Describe with AI',\n description: 'Tell Shep what to build — it scaffolds + ships',\n onClick: onDescribe,\n accent: 'text-indigo-500 bg-indigo-100 dark:bg-indigo-900/60',\n },\n ...(onOpenLocalDirectory\n ? [\n {\n icon: <FolderOpen className=\"h-4 w-4\" />,\n label: 'Open local project',\n description: 'Pick an existing folder and continue from there',\n onClick: onOpenLocalDirectory,\n accent: 'text-amber-600 bg-amber-100 dark:bg-amber-900/40',\n },\n ]\n : []),\n ...(onImportGitHub\n ? [\n {\n icon: <Github className=\"h-4 w-4\" />,\n label: 'Import from GitHub',\n description: 'Connect an existing repo to manage here',\n onClick: onImportGitHub,\n accent: 'text-foreground bg-muted',\n },\n ]\n : []),\n ];\n\n return (\n <div\n className={cn(\n 'group relative flex cursor-pointer flex-col overflow-hidden rounded-sm border-2',\n 'border-dashed border-indigo-200 bg-transparent transition-all duration-200',\n 'hover:border-indigo-400 hover:bg-indigo-500/[0.03]',\n 'dark:border-indigo-900 dark:hover:border-indigo-700',\n 'min-h-[280px]'\n )}\n onClick={onDescribe}\n >\n {/* Rest state — centered + icon. Fades out on hover. */}\n <div\n className={cn(\n 'absolute inset-0 flex flex-col items-center justify-center gap-3',\n 'transition-opacity duration-200 group-hover:opacity-0',\n 'pointer-events-none'\n )}\n >\n <div className=\"flex h-11 w-11 items-center justify-center rounded-full bg-indigo-100 text-indigo-500 dark:bg-indigo-900/60 dark:text-indigo-400\">\n <Plus className=\"h-5 w-5 stroke-[2]\" />\n </div>\n <div className=\"text-center\">\n <p className=\"text-foreground text-sm font-semibold\">New application</p>\n <p className=\"text-muted-foreground mt-0.5 text-[11px]\">Click to get started</p>\n </div>\n </div>\n\n {/* Hover state — vertical option list slides up from invisible. */}\n <div\n className={cn(\n 'absolute inset-0 flex flex-col justify-center gap-1.5 px-4',\n 'translate-y-3 opacity-0 transition-all duration-200',\n 'group-hover:translate-y-0 group-hover:opacity-100'\n )}\n >\n <p className=\"text-muted-foreground mb-1 px-1 text-[10px] font-medium tracking-wide uppercase\">\n How would you like to start?\n </p>\n {options.map((opt) => (\n <button\n key={opt.label}\n type=\"button\"\n onClick={(e) => {\n e.stopPropagation();\n opt.onClick();\n }}\n className={cn(\n 'flex w-full cursor-pointer items-center gap-3 rounded-lg px-3 py-2.5 text-left',\n 'border-border/60 bg-background/80 border transition-all duration-150',\n 'hover:border-indigo-300 hover:bg-indigo-50 dark:hover:border-indigo-700 dark:hover:bg-indigo-950/40'\n )}\n >\n <span\n className={cn(\n 'flex h-7 w-7 shrink-0 items-center justify-center rounded-md',\n opt.accent\n )}\n >\n {opt.icon}\n </span>\n <div className=\"min-w-0\">\n <div className=\"text-foreground text-[12px] font-semibold\">{opt.label}</div>\n <div className=\"text-muted-foreground truncate text-[10px]\">{opt.description}</div>\n </div>\n </button>\n ))}\n </div>\n </div>\n );\n}\n","'use client';\n\nimport { useRouter } from 'next/navigation';\nimport { useState } from 'react';\nimport {\n AlertTriangle,\n ArrowRight,\n ExternalLink,\n FolderGit2,\n Globe,\n Loader2,\n MoreHorizontal,\n Play,\n RefreshCw,\n Trash2,\n TriangleAlert,\n Zap,\n} from 'lucide-react';\nimport { useQueryClient } from '@tanstack/react-query';\nimport { toast } from 'sonner';\nimport { cn } from '@/lib/utils';\nimport { Button } from '@/components/ui/button';\nimport {\n Dialog,\n DialogClose,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n} from '@/components/ui/dialog';\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuTrigger,\n} from '@/components/ui/dropdown-menu';\nimport { deleteApplication } from '@/app/actions/delete-application';\nimport { deriveAppLiveStatus } from '@/lib/derive-app-status';\nimport { useTurnStatus } from '@/hooks/turn-statuses-provider';\nimport { useDeployAction } from '@/hooks/use-deploy-action';\nimport { CloudDeploymentStatus, DeploymentState } from '@shepai/core/domain/generated/output';\nimport type { ApplicationWithStatus } from '@shepai/core/application/use-cases/applications/list-applications.use-case';\nimport { featureIdForApplication } from '@shepai/core/domain/shared/feature-id';\nimport {\n CLOUD_PROVIDER_BRAND_HEX,\n CLOUD_PROVIDER_ICONS,\n} from '@/components/features/application-page/cloud-provider-icons';\n\nexport interface ApplicationCardProps {\n application: ApplicationWithStatus;\n className?: string;\n}\n\n// ── URL truncation ───────────────────────────────────────────────────\n// Show the END of the URL (the recognisable domain/TLD) rather than the\n// start, because the start is usually a hash prefix like \"4f5a0a51.\".\n// e.g. \"4f5a0a51.landing-page-hero-pricing-60c94f.pages.dev\"\n// → \"4f5a0…pages.dev\"\nfunction truncateUrl(raw: string, max = 22): string {\n const url = raw.replace(/^https?:\\/\\//, '').replace(/\\/$/, '');\n if (url.length <= max) return url;\n // Keep up to 5 chars from start + ellipsis + last (max-8) chars\n const tail = url.slice(-(max - 6));\n return `${url.slice(0, 5)}…${tail}`;\n}\n\n// ── Abstract dark preview patterns ───────────────────────────────────\n// Four minimal, abstract SVG backgrounds rendered on a near-black card.\n// Elements are white at very low opacity — ambient texture, not UI mockups.\n\nfunction hashName(name: string): number {\n let h = 0x811c9dc5;\n for (let i = 0; i < name.length; i++) {\n h ^= name.charCodeAt(i);\n h = (Math.imul(h, 0x01000193) | 0) >>> 0;\n }\n return h;\n}\n\nconst D = 'rgba(255,255,255,0.13)'; // primary strokes\nconst DM = 'rgba(255,255,255,0.07)'; // mid\nconst DL = 'rgba(255,255,255,0.04)'; // faint fill\n\n/** Dot grid — evenly spaced field of tiny circles */\nfunction DotsSvg() {\n const cols = 16,\n rows = 8;\n return (\n <svg viewBox=\"0 0 320 160\" className=\"h-full w-full\" aria-hidden=\"true\">\n {Array.from({ length: rows }, (_, r) =>\n Array.from({ length: cols }, (_, c) => (\n <circle key={`${r}-${c}`} cx={10 + c * 20} cy={10 + r * 20} r=\"1.5\" fill={DM} />\n ))\n )}\n {/* large ghost circle — off-center accent */}\n <circle cx=\"240\" cy=\"56\" r=\"52\" fill=\"none\" stroke={DL} strokeWidth=\"1\" />\n <circle cx=\"240\" cy=\"56\" r=\"32\" fill=\"none\" stroke={D} strokeWidth=\"0.8\" />\n {/* small accent cluster */}\n <circle cx=\"60\" cy=\"112\" r=\"14\" fill=\"none\" stroke={DM} strokeWidth=\"1\" />\n <circle cx=\"60\" cy=\"112\" r=\"6\" fill={DL} />\n </svg>\n );\n}\n\n/** Flow lines — soft undulating horizontals */\nfunction WavesSvg() {\n return (\n <svg viewBox=\"0 0 320 160\" className=\"h-full w-full\" aria-hidden=\"true\">\n {[24, 48, 72, 96, 120].map((y, i) => (\n <path\n key={`wave-${y}`}\n d={`M0,${y} C64,${y - 18 + i * 4} 128,${y + 18 - i * 3} 192,${y - 12 + i * 2} S288,${y + 14} 320,${y}`}\n fill=\"none\"\n stroke={i === 2 ? D : DM}\n strokeWidth={i === 2 ? 1.5 : 1}\n />\n ))}\n {/* filled area under the brightest wave */}\n <path d=\"M0,72 C64,54 128,90 192,60 S288,86 320,72 L320,160 L0,160 Z\" fill={DL} />\n {/* small accent circle top-right */}\n <circle cx=\"290\" cy=\"30\" r=\"18\" fill=\"none\" stroke={DM} strokeWidth=\"1\" />\n </svg>\n );\n}\n\n/** Geometry — overlapping large arcs + a diamond */\nfunction GeoSvg() {\n return (\n <svg viewBox=\"0 0 320 160\" className=\"h-full w-full\" aria-hidden=\"true\">\n {/* large background arc */}\n <circle cx=\"160\" cy=\"160\" r=\"120\" fill=\"none\" stroke={DL} strokeWidth=\"40\" />\n {/* two overlapping rings */}\n <circle cx=\"100\" cy=\"60\" r=\"70\" fill=\"none\" stroke={DM} strokeWidth=\"1\" />\n <circle cx=\"220\" cy=\"80\" r=\"55\" fill=\"none\" stroke={D} strokeWidth=\"1\" />\n {/* diamond */}\n <polygon points=\"160,18 196,60 160,102 124,60\" fill=\"none\" stroke={DM} strokeWidth=\"1\" />\n {/* corner dots */}\n <circle cx=\"20\" cy=\"20\" r=\"2\" fill={D} />\n <circle cx=\"300\" cy=\"20\" r=\"2\" fill={D} />\n <circle cx=\"20\" cy=\"140\" r=\"2\" fill={D} />\n <circle cx=\"300\" cy=\"140\" r=\"2\" fill={D} />\n </svg>\n );\n}\n\n/** Grid + pulse — subtle square grid with a central radial burst */\nfunction GridSvg() {\n const step = 32;\n const lines = [];\n for (let x = step; x < 320; x += step)\n lines.push(<line key={`v${x}`} x1={x} y1=\"0\" x2={x} y2=\"160\" stroke={DL} strokeWidth=\"1\" />);\n for (let y = step; y < 160; y += step)\n lines.push(<line key={`h${y}`} x1=\"0\" y1={y} x2=\"320\" y2={y} stroke={DL} strokeWidth=\"1\" />);\n return (\n <svg viewBox=\"0 0 320 160\" className=\"h-full w-full\" aria-hidden=\"true\">\n {lines}\n {/* concentric radial rings from centre */}\n {[20, 40, 64, 90].map((r) => (\n <circle\n key={r}\n cx=\"160\"\n cy=\"80\"\n r={r}\n fill=\"none\"\n stroke={r === 40 ? D : DM}\n strokeWidth=\"1\"\n />\n ))}\n <circle cx=\"160\" cy=\"80\" r=\"4\" fill={D} />\n </svg>\n );\n}\n\nconst WIREFRAMES = [DotsSvg, WavesSvg, GeoSvg, GridSvg];\n\nfunction MockPreview({ name }: { name: string }) {\n const Svg = WIREFRAMES[hashName(name) % WIREFRAMES.length]!;\n return <Svg />;\n}\n\n// ── Main card ────────────────────────────────────────────────────────\n\nexport function ApplicationCard({ application, className }: ApplicationCardProps) {\n const router = useRouter();\n const queryClient = useQueryClient();\n const [confirmOpen, setConfirmOpen] = useState(false);\n const turnStatus = useTurnStatus(featureIdForApplication(application.id));\n\n const deploy = useDeployAction({\n targetId: application.id,\n targetType: 'application',\n repositoryPath: application.repositoryPath,\n });\n\n const effectiveDeploymentUrl = deploy.url;\n const live = deriveAppLiveStatus(\n application.status,\n turnStatus,\n !!effectiveDeploymentUrl,\n application.effectiveStatus\n );\n\n const cloudUrl = application.cloudDeploymentUrl ?? null;\n const cloudProvider = application.cloudDeploymentProvider ?? null;\n const CloudBrandIcon = cloudProvider ? CLOUD_PROVIDER_ICONS[cloudProvider] : null;\n const cloudBrandHex = cloudProvider ? CLOUD_PROVIDER_BRAND_HEX[cloudProvider] : undefined;\n const isCloudLive =\n application.cloudDeploymentStatus === CloudDeploymentStatus.Deployed && Boolean(cloudUrl);\n const isCloudUploading = application.cloudDeploymentStatus === CloudDeploymentStatus.Uploading;\n const isCloudFailed = application.cloudDeploymentStatus === CloudDeploymentStatus.Failed;\n\n const isBuilding = application.effectiveStatus === 'building';\n const isInterrupted = application.effectiveStatus === 'interrupted';\n const isFailed = application.effectiveStatus === 'failed';\n const isBooting = deploy.status === DeploymentState.Booting || deploy.deployLoading;\n const isLocalRunning = deploy.status === DeploymentState.Ready && Boolean(effectiveDeploymentUrl);\n\n // Resolve the URL to show in the header iframe. Prefer the local\n // dev server when it's running (it reflects uncommitted in-progress\n // changes), else fall back to the cloud deploy URL so a deployed\n // app shows its actual live site instead of an abstract placeholder.\n const previewUrl = isLocalRunning ? effectiveDeploymentUrl : isCloudLive ? cloudUrl : null;\n const hasLivePreview = Boolean(previewUrl);\n\n const navigate = () => router.push(`/application/${application.id}`);\n\n // Repository display name from path\n const repoName = application.repositoryPath.split(/[/\\\\]/).pop() ?? application.repositoryPath;\n\n return (\n <>\n <article\n data-testid=\"application-card\"\n onClick={navigate}\n className={cn(\n // In dark mode `--color-card` resolves to `#0a0a0a`, which is the\n // same value as `--color-background` — so a plain `bg-card` card\n // has no contrast against the page. Lift the dark-mode surface\n // one step (`neutral-900` = `#171717`) and soften the border so\n // the card reads as an elevated tile instead of a hole in the\n // page. Light mode is unchanged. Corners are deliberately sharp\n // (`rounded-sm`) per the dashboard tile family — the placeholder\n // and new-application tiles both match.\n 'group relative flex cursor-pointer flex-col overflow-hidden rounded-sm',\n 'bg-card dark:bg-neutral-900',\n 'border-border/60 border shadow-sm dark:border-white/10',\n 'hover:border-border transition-all duration-200 hover:shadow-lg dark:hover:border-white/20 dark:hover:shadow-black/40',\n // min-h keeps all cards in a row visually aligned; flex-1 on\n // the context zone pushes the footer to the bottom.\n 'min-h-[280px]',\n className\n )}\n >\n {/* ── Header visual ──────────────────────────────────── */}\n {/* Preference order:\n 1. Live iframe preview (local dev server OR cloud deploy URL)\n 2. Booting spinner while a local deploy is coming up\n 3. Abstract dark SVG wireframe (ambient placeholder) */}\n <div className=\"relative overflow-hidden\" style={{ height: 160 }}>\n {hasLivePreview ? (\n <div className=\"absolute inset-0 bg-white dark:bg-neutral-900\">\n <iframe\n src={previewUrl!}\n title={`${application.name} preview`}\n className=\"pointer-events-none absolute top-0 left-0 origin-top-left border-0\"\n style={{ width: '250%', height: '250%', transform: 'scale(0.4)' }}\n sandbox=\"allow-same-origin allow-scripts\"\n loading=\"lazy\"\n />\n {/* hover overlay — stop/open for LOCAL running; open-only for cloud */}\n <div\n className=\"absolute inset-0 flex items-center justify-center gap-2 bg-black/60 opacity-0 transition-opacity group-hover:opacity-100\"\n onClick={(e) => e.stopPropagation()}\n >\n {isLocalRunning ? (\n <button\n type=\"button\"\n onClick={() => void deploy.stop()}\n disabled={deploy.stopLoading}\n className=\"inline-flex h-7 cursor-pointer items-center gap-1 rounded-full bg-white/90 px-3 text-[11px] font-semibold text-neutral-900 hover:bg-red-50 hover:text-red-600\"\n >\n {deploy.stopLoading ? (\n <Loader2 className=\"h-3 w-3 animate-spin\" />\n ) : (\n <RefreshCw className=\"h-3 w-3\" />\n )}\n Stop\n </button>\n ) : null}\n <button\n type=\"button\"\n onClick={() => window.open(previewUrl!, '_blank', 'noopener,noreferrer')}\n className=\"inline-flex h-7 cursor-pointer items-center gap-1 rounded-full bg-white/90 px-3 text-[11px] font-semibold text-neutral-900 hover:bg-white\"\n >\n <ExternalLink className=\"h-3 w-3\" />\n Open\n </button>\n </div>\n </div>\n ) : isBooting ? (\n <div className=\"absolute inset-0 bg-white dark:bg-neutral-900\">\n <div className=\"flex h-full flex-col items-center justify-center gap-2\">\n <Loader2 className=\"h-6 w-6 animate-spin text-amber-500\" />\n <span className=\"text-[11px] font-medium text-amber-600 dark:text-amber-400\">\n Starting…\n </span>\n </div>\n </div>\n ) : (\n // Ambient placeholder — no title overlay; name/description\n // always render in the body below so they stay consistent\n // across every card state. Stays dark in BOTH modes because\n // the MockPreview SVG strokes are white-at-low-opacity and\n // would be invisible on a light background. In dark mode we\n // lift it to `neutral-800` (one notch above the card body's\n // `neutral-900`), giving the header a distinct elevation tier.\n <div className=\"absolute inset-0 overflow-hidden bg-[#111827] dark:bg-neutral-800\">\n <MockPreview name={application.name} />\n </div>\n )}\n\n {/* Status chip — top-left */}\n <div className=\"absolute top-2.5 left-2.5\" onClick={(e) => e.stopPropagation()}>\n {isCloudLive ? (\n <span className=\"flex items-center gap-1 rounded-full bg-black/30 px-2 py-0.5 text-[9px] font-bold tracking-wider text-white uppercase backdrop-blur-sm\">\n {CloudBrandIcon ? (\n <CloudBrandIcon className=\"h-3 w-3\" style={{ color: cloudBrandHex ?? '#fff' }} />\n ) : (\n <span className=\"h-1.5 w-1.5 animate-pulse rounded-full bg-emerald-400\" />\n )}\n Live\n </span>\n ) : isCloudUploading ? (\n <span className=\"flex items-center gap-1 rounded-full bg-black/30 px-2 py-0.5 text-[9px] font-bold tracking-wider text-white/80 uppercase backdrop-blur-sm\">\n <Loader2 className=\"h-2.5 w-2.5 animate-spin\" />\n Deploying\n </span>\n ) : isBuilding ? (\n <span className=\"flex items-center gap-1 rounded-full bg-black/30 px-2 py-0.5 text-[9px] font-bold tracking-wider text-white/80 uppercase backdrop-blur-sm\">\n <Zap className=\"h-2.5 w-2.5\" />\n Building\n </span>\n ) : live.pulse ? (\n <span className=\"relative flex h-2 w-2\">\n <span\n className={cn(\n 'absolute inline-flex h-full w-full animate-ping rounded-full opacity-75',\n live.dotClass\n )}\n />\n <span className={cn('relative inline-flex h-2 w-2 rounded-full', live.dotClass)} />\n </span>\n ) : null}\n </div>\n\n {/* ⋯ overflow menu — top-right */}\n <div className=\"absolute top-2.5 right-2.5\" onClick={(e) => e.stopPropagation()}>\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <button\n type=\"button\"\n className=\"flex h-6 w-6 cursor-pointer items-center justify-center rounded-full bg-black/30 text-white/80 opacity-0 backdrop-blur-sm transition-opacity group-hover:opacity-100 hover:bg-black/50\"\n >\n <MoreHorizontal className=\"h-3.5 w-3.5\" />\n </button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\" sideOffset={4}>\n <DropdownMenuItem\n className=\"text-destructive focus:text-destructive cursor-pointer\"\n onClick={() => setConfirmOpen(true)}\n >\n <Trash2 className=\"mr-2 h-3.5 w-3.5\" />\n Delete\n </DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n </div>\n </div>\n\n {/* ── Context zone ───────────────────────────────────── */}\n {/* Name + description always rendered in the body so they stay\n consistent regardless of what the header is showing (live\n iframe, booting spinner, or ambient SVG placeholder). */}\n <div className=\"flex flex-1 flex-col gap-1.5 px-3.5 pt-3 pb-0\">\n <div>\n <h3 className=\"text-foreground line-clamp-1 text-[14px] leading-tight font-semibold\">\n {application.name}\n </h3>\n {application.description ? (\n <p className=\"text-muted-foreground mt-0.5 line-clamp-1 text-[11px] leading-relaxed\">\n {application.description}\n </p>\n ) : null}\n </div>\n\n {/* State-specific context — the live URL now lives in the\n footer so we skip rendering it here to avoid duplication. */}\n {isCloudUploading ? (\n <div className=\"flex items-center gap-1.5 py-0.5\">\n <Loader2 className=\"text-muted-foreground h-3 w-3 shrink-0 animate-spin\" />\n <span className=\"text-muted-foreground text-[11px]\">\n Deploying to {cloudProvider ?? 'cloud'}…\n </span>\n </div>\n ) : isCloudFailed ? (\n <div className=\"flex items-center gap-1.5 py-0.5\">\n <AlertTriangle className=\"text-destructive/70 h-3 w-3 shrink-0\" />\n <span className=\"text-destructive/80 text-[11px]\">Deployment failed</span>\n </div>\n ) : isBuilding ? (\n <div className=\"flex items-center gap-1.5 py-0.5\">\n <Zap className=\"text-muted-foreground h-3 w-3 shrink-0\" />\n <span className=\"text-muted-foreground text-[11px]\">Building with AI…</span>\n <div className=\"ml-auto flex gap-0.5\">\n {[0, 1, 2].map((i) => (\n <span\n key={i}\n className=\"bg-muted-foreground/40 h-1 w-1 animate-bounce rounded-full\"\n style={{ animationDelay: `${i * 120}ms` }}\n />\n ))}\n </div>\n </div>\n ) : isInterrupted ? (\n <div className=\"flex items-center gap-1.5 py-0.5\">\n <AlertTriangle className=\"h-3 w-3 shrink-0 text-amber-500/70\" />\n <span className=\"text-muted-foreground text-[11px]\">Build interrupted</span>\n </div>\n ) : isFailed ? (\n <div className=\"flex items-center gap-1.5 py-0.5\">\n <TriangleAlert className=\"text-destructive/70 h-3 w-3 shrink-0\" />\n <span className=\"text-muted-foreground text-[11px]\">Build failed</span>\n </div>\n ) : isCloudLive ? null : (\n <div className=\"flex items-center gap-1.5 py-0.5\">\n <Globe className=\"text-muted-foreground/40 h-3 w-3 shrink-0\" />\n <span className=\"text-muted-foreground/60 text-[11px]\">Not deployed yet</span>\n </div>\n )}\n </div>\n\n {/* ── Footer ─────────────────────────────────────────── */}\n <div\n className=\"flex items-center gap-2 px-3.5 pt-2 pb-3\"\n onClick={(e) => e.stopPropagation()}\n >\n {/* Left cluster: repo dir + cloud URL — both compact, inline */}\n <div className=\"flex min-w-0 flex-1 items-center gap-2\">\n {/* Repo folder — clickable, opens local dir */}\n <button\n type=\"button\"\n title={application.repositoryPath}\n onClick={async (e) => {\n e.stopPropagation();\n const { openDirectory } = await import('@/app/actions/open-directory');\n await openDirectory(application.repositoryPath);\n }}\n className=\"text-muted-foreground/70 hover:text-foreground inline-flex shrink-0 items-center gap-1 text-[10px] transition-colors\"\n >\n <FolderGit2 className=\"h-3 w-3 shrink-0\" />\n <span className=\"max-w-[80px] truncate\">{repoName}</span>\n </button>\n\n {/* Cloud URL — only when deployed */}\n {cloudUrl ? (\n <a\n href={cloudUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n title={cloudUrl}\n className=\"text-muted-foreground/70 hover:text-foreground inline-flex min-w-0 items-center gap-1 text-[10px] transition-colors\"\n >\n {CloudBrandIcon ? (\n <CloudBrandIcon className=\"h-3 w-3 shrink-0\" style={{ color: cloudBrandHex }} />\n ) : (\n <Globe className=\"h-3 w-3 shrink-0\" />\n )}\n <span className=\"font-mono\">{truncateUrl(cloudUrl)}</span>\n </a>\n ) : null}\n </div>\n\n {/* Right: primary CTA */}\n {isBuilding || isCloudUploading ? (\n <span className=\"text-muted-foreground inline-flex shrink-0 items-center gap-1.5 text-[11px]\">\n <Loader2 className=\"h-3 w-3 animate-spin\" />\n {isBuilding ? 'Building…' : 'Deploying…'}\n </span>\n ) : cloudUrl && isCloudLive ? (\n <a\n href={cloudUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"bg-foreground text-background inline-flex h-7 shrink-0 cursor-pointer items-center gap-1.5 rounded-full px-3 text-[11px] font-semibold transition-opacity hover:opacity-80\"\n >\n <ExternalLink className=\"h-3 w-3\" />\n Open live\n </a>\n ) : isInterrupted ? (\n <button\n type=\"button\"\n onClick={navigate}\n className=\"inline-flex h-7 shrink-0 cursor-pointer items-center gap-1.5 rounded-full bg-amber-500 px-3 text-[11px] font-semibold text-white transition-opacity hover:opacity-80\"\n >\n <Play className=\"h-3 w-3 fill-current\" />\n Continue\n </button>\n ) : isFailed ? (\n <button\n type=\"button\"\n onClick={navigate}\n className=\"bg-destructive inline-flex h-7 shrink-0 cursor-pointer items-center gap-1.5 rounded-full px-3 text-[11px] font-semibold text-white transition-opacity hover:opacity-80\"\n >\n <ArrowRight className=\"h-3 w-3\" />\n View error\n </button>\n ) : (\n <button\n type=\"button\"\n onClick={navigate}\n className=\"bg-foreground text-background inline-flex h-7 shrink-0 cursor-pointer items-center gap-1.5 rounded-full px-3 text-[11px] font-semibold transition-opacity hover:opacity-80\"\n >\n <ArrowRight className=\"h-3 w-3\" />\n Open\n </button>\n )}\n </div>\n </article>\n\n <Dialog open={confirmOpen} onOpenChange={setConfirmOpen}>\n <DialogContent className=\"max-w-xs\">\n <DialogHeader>\n <DialogTitle>Delete application?</DialogTitle>\n <DialogDescription>\n This will permanently remove <strong>{application.name}</strong>.\n </DialogDescription>\n </DialogHeader>\n <DialogFooter className=\"grid grid-cols-2 gap-2 sm:flex-none\">\n <DialogClose asChild>\n <Button variant=\"outline\">Cancel</Button>\n </DialogClose>\n <Button\n variant=\"destructive\"\n onClick={async () => {\n setConfirmOpen(false);\n const result = await deleteApplication(application.id);\n if (result.error) {\n toast.error('Failed to delete', { description: result.error });\n } else {\n toast.success('Application deleted');\n void queryClient.invalidateQueries({ queryKey: ['applications'] });\n }\n }}\n >\n Delete\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n </>\n );\n}\n","/* __next_internal_action_entry_do_not_use__ [{\"00ad19b30c66b798476855eee8c99ef61a175cd38a\":\"listDeployments\"},\"src/presentation/web/app/actions/list-deployments.ts\",\"\"] */\"use turbopack no side effects\";import{createServerReference,callServer,findSourceMapURL}from\"private-next-rsc-action-client-wrapper\";const $$RSC_SERVER_ACTION_0=/*#__PURE__*/createServerReference(\"00ad19b30c66b798476855eee8c99ef61a175cd38a\",callServer,void 0,findSourceMapURL,\"listDeployments\");export{$$RSC_SERVER_ACTION_0 as listDeployments};","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['path', { d: 'M18 19a5 5 0 0 1-5-5v8', key: 'sz5oeg' }],\n [\n 'path',\n {\n d: 'M9 20H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h3.9a2 2 0 0 1 1.69.9l.81 1.2a2 2 0 0 0 1.67.9H20a2 2 0 0 1 2 2v5',\n key: '1w6njk',\n },\n ],\n ['circle', { cx: '13', cy: '12', r: '2', key: '1j92g6' }],\n ['circle', { cx: '20', cy: '19', r: '2', key: '1obnsp' }],\n];\n\n/**\n * @component @name FolderGit2\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMTggMTlhNSA1IDAgMCAxLTUtNXY4IiAvPgogIDxwYXRoIGQ9Ik05IDIwSDRhMiAyIDAgMCAxLTItMlY1YTIgMiAwIDAgMSAyLTJoMy45YTIgMiAwIDAgMSAxLjY5LjlsLjgxIDEuMmEyIDIgMCAwIDAgMS42Ny45SDIwYTIgMiAwIDAgMSAyIDJ2NSIgLz4KICA8Y2lyY2xlIGN4PSIxMyIgY3k9IjEyIiByPSIyIiAvPgogIDxjaXJjbGUgY3g9IjIwIiBjeT0iMTkiIHI9IjIiIC8+Cjwvc3ZnPgo=) - https://lucide.dev/icons/folder-git-2\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst FolderGit2 = createLucideIcon('folder-git-2', __iconNode);\n\nexport default FolderGit2;\n"],"names":[],"mappings":"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","ignoreList":[3]}
1
+ {"version":3,"sources":["../../../../../../../src/presentation/web/components/features/applications/applications-page-client.tsx","../../../../../../../src/presentation/web/components/features/applications/application-card.tsx","../../../../../../../src/presentation/web/app/actions/data%3A0f6ebe%20%3Ctext/javascript%3E","../../../../../../../node_modules/.pnpm/lucide-react%400.563.0_react%4019.2.4/node_modules/lucide-react/src/icons/folder-git-2.ts"],"sourcesContent":["'use client';\n\nimport { useMemo, useState } from 'react';\nimport { useRouter } from 'next/navigation';\nimport { useQuery } from '@tanstack/react-query';\nimport { FolderOpen, Github, LayoutGrid, Loader2, Plus, Sparkles } from 'lucide-react';\nimport { cn } from '@/lib/utils';\nimport { DeploymentStatusProvider } from '@/hooks/deployment-status-provider';\nimport { ControlCenterEmptyState } from '@/components/features/control-center/control-center-empty-state';\nimport { ApplicationCard } from './application-card';\nimport { listDeployments } from '@/app/actions/list-deployments';\nimport type { ApplicationWithStatus } from '@shepai/core/application/use-cases/applications/list-applications.use-case';\nimport type { DeploymentStatusEntry } from '@shepai/core/application/ports/output/services/deployment-service.interface';\n\nexport interface ApplicationsPageClientProps {\n className?: string;\n}\n\ninterface NewApplicationCardProps {\n onDescribe(): void;\n onOpenLocalDirectory?: () => void;\n onImportGitHub?: () => void;\n}\n\nexport function ApplicationsPageClient({ className }: ApplicationsPageClientProps) {\n const router = useRouter();\n const [showCreatePrompt, setShowCreatePrompt] = useState(false);\n\n const { data: applications = [], isLoading } = useQuery<ApplicationWithStatus[]>({\n queryKey: ['applications'],\n queryFn: async () => {\n const res = await fetch('/api/applications');\n if (!res.ok) throw new Error('Failed to fetch applications');\n return res.json();\n },\n staleTime: 30_000,\n });\n\n // Live dev-server deployments — seeds the DeploymentStatusProvider so the\n // app cards reflect previews started on /application/[id] (or another tab)\n // instead of resetting every time this page mounts. Without this seed the\n // provider's `fullyHydrated` flag (set by the empty SSR hydrate) blocks\n // each card's `ensureHydrated` from fetching, leaving previews invisible.\n const { data: deployments = [] } = useQuery<DeploymentStatusEntry[]>({\n queryKey: ['deployments', 'all'],\n queryFn: () => listDeployments(),\n staleTime: 0,\n refetchInterval: 3_000,\n });\n\n const sorted = useMemo(\n () =>\n [...applications].sort(\n (a, b) => new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime()\n ),\n [applications]\n );\n\n return (\n <DeploymentStatusProvider initialDeployments={deployments}>\n <div\n data-testid=\"applications-page-client\"\n className={cn('relative flex min-h-full flex-col', className)}\n >\n {/* Content sits inside padding; the create-prompt overlay sits\n OUTSIDE this inner padded div so it can cover edge-to-edge. */}\n <div className=\"flex flex-1 flex-col gap-4 p-6\">\n {/* Compact header */}\n <div className=\"flex items-center gap-2\">\n <LayoutGrid className=\"text-muted-foreground h-4 w-4\" />\n <h1 className=\"text-sm font-bold tracking-tight\">Applications</h1>\n {!isLoading ? (\n <span className=\"text-muted-foreground text-[10px]\">\n {applications.length} {applications.length === 1 ? 'app' : 'apps'}\n </span>\n ) : null}\n </div>\n\n {isLoading ? (\n <div className=\"flex items-center justify-center py-12\">\n <Loader2 className=\"text-muted-foreground h-5 w-5 animate-spin\" />\n </div>\n ) : sorted.length === 0 ? (\n <div className=\"flex flex-1 items-center justify-center\">\n <ControlCenterEmptyState\n onApplicationCreated={(appId) => {\n router.push(`/application/${appId}`);\n }}\n />\n </div>\n ) : (\n <div\n data-testid=\"applications-page-grid\"\n className=\"grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4\"\n >\n {/* New application placeholder card — always FIRST so the\n user can click immediately without scanning past their apps. */}\n <NewApplicationCard\n onDescribe={() => setShowCreatePrompt(true)}\n onOpenLocalDirectory={async () => {\n const { pickFolder } = await import(\n '@/components/common/add-repository-button/pick-folder'\n );\n const path = await pickFolder();\n if (!path) return;\n const { adoptLocalDirectory } = await import(\n '@/app/actions/adopt-local-directory'\n );\n const result = await adoptLocalDirectory({ repositoryPath: path });\n if (result.applicationId) {\n router.push(`/application/${result.applicationId}`);\n }\n }}\n onImportGitHub={() =>\n window.dispatchEvent(new CustomEvent('shep:open-github-import'))\n }\n />\n\n {sorted.map((app) => (\n <ApplicationCard key={app.id} application={app} />\n ))}\n </div>\n )}\n </div>\n\n {/* Edge-to-edge create-prompt overlay. `absolute` (not `fixed`)\n so it stays contained within the page's relative root and\n never covers the AppsOnlyShell top bar. Sibling of the padded\n content div so it ignores the list's `p-6`. */}\n {showCreatePrompt ? (\n <div className=\"absolute inset-0 z-40\">\n <ControlCenterEmptyState\n onApplicationCreated={(appId) => {\n router.push(`/application/${appId}`);\n }}\n onClose={() => setShowCreatePrompt(false)}\n className=\"bg-background\"\n />\n </div>\n ) : null}\n </div>\n </DeploymentStatusProvider>\n );\n}\n\n/**\n * NewApplicationCard — a placeholder card that lives at the end of the\n * applications grid. At rest it shows a subtle dashed border with a\n * centered + icon and label. On hover the + fades out and a vertical\n * list of creation options slides in so the user can pick a path\n * without the card feeling cluttered at a glance.\n */\nfunction NewApplicationCard({\n onDescribe,\n onOpenLocalDirectory,\n onImportGitHub,\n}: NewApplicationCardProps) {\n const options: {\n icon: React.ReactNode;\n label: string;\n description: string;\n onClick(): void;\n accent: string;\n }[] = [\n {\n icon: <Sparkles className=\"h-4 w-4\" />,\n label: 'Describe with AI',\n description: 'Tell Shep what to build — it scaffolds + ships',\n onClick: onDescribe,\n accent: 'text-indigo-500 bg-indigo-100 dark:bg-indigo-900/60',\n },\n ...(onOpenLocalDirectory\n ? [\n {\n icon: <FolderOpen className=\"h-4 w-4\" />,\n label: 'Open local project',\n description: 'Pick an existing folder and continue from there',\n onClick: onOpenLocalDirectory,\n accent: 'text-amber-600 bg-amber-100 dark:bg-amber-900/40',\n },\n ]\n : []),\n ...(onImportGitHub\n ? [\n {\n icon: <Github className=\"h-4 w-4\" />,\n label: 'Import from GitHub',\n description: 'Connect an existing repo to manage here',\n onClick: onImportGitHub,\n accent: 'text-foreground bg-muted',\n },\n ]\n : []),\n ];\n\n return (\n <div\n className={cn(\n 'group relative flex cursor-pointer flex-col overflow-hidden rounded-sm border-2',\n 'border-dashed border-indigo-200 bg-transparent transition-all duration-200',\n 'hover:border-indigo-400 hover:bg-indigo-500/[0.03]',\n 'dark:border-indigo-900 dark:hover:border-indigo-700',\n 'min-h-[280px]'\n )}\n onClick={onDescribe}\n >\n {/* Rest state — centered + icon. Fades out on hover. */}\n <div\n className={cn(\n 'absolute inset-0 flex flex-col items-center justify-center gap-3',\n 'transition-opacity duration-200 group-hover:opacity-0',\n 'pointer-events-none'\n )}\n >\n <div className=\"flex h-11 w-11 items-center justify-center rounded-full bg-indigo-100 text-indigo-500 dark:bg-indigo-900/60 dark:text-indigo-400\">\n <Plus className=\"h-5 w-5 stroke-[2]\" />\n </div>\n <div className=\"text-center\">\n <p className=\"text-foreground text-sm font-semibold\">New application</p>\n <p className=\"text-muted-foreground mt-0.5 text-[11px]\">Click to get started</p>\n </div>\n </div>\n\n {/* Hover state — vertical option list slides up from invisible. */}\n <div\n className={cn(\n 'absolute inset-0 flex flex-col justify-center gap-1.5 px-4',\n 'translate-y-3 opacity-0 transition-all duration-200',\n 'group-hover:translate-y-0 group-hover:opacity-100'\n )}\n >\n <p className=\"text-muted-foreground mb-1 px-1 text-[10px] font-medium tracking-wide uppercase\">\n How would you like to start?\n </p>\n {options.map((opt) => (\n <button\n key={opt.label}\n type=\"button\"\n onClick={(e) => {\n e.stopPropagation();\n opt.onClick();\n }}\n className={cn(\n 'flex w-full cursor-pointer items-center gap-3 rounded-lg px-3 py-2.5 text-left',\n 'border-border/60 bg-background/80 border transition-all duration-150',\n 'hover:border-indigo-300 hover:bg-indigo-50 dark:hover:border-indigo-700 dark:hover:bg-indigo-950/40'\n )}\n >\n <span\n className={cn(\n 'flex h-7 w-7 shrink-0 items-center justify-center rounded-md',\n opt.accent\n )}\n >\n {opt.icon}\n </span>\n <div className=\"min-w-0\">\n <div className=\"text-foreground text-[12px] font-semibold\">{opt.label}</div>\n <div className=\"text-muted-foreground truncate text-[10px]\">{opt.description}</div>\n </div>\n </button>\n ))}\n </div>\n </div>\n );\n}\n","'use client';\n\nimport { useRouter } from 'next/navigation';\nimport { useState } from 'react';\nimport {\n AlertTriangle,\n ArrowRight,\n ExternalLink,\n FolderGit2,\n Globe,\n Loader2,\n MoreHorizontal,\n Play,\n RefreshCw,\n Trash2,\n TriangleAlert,\n Zap,\n} from 'lucide-react';\nimport { useQueryClient } from '@tanstack/react-query';\nimport { toast } from 'sonner';\nimport { cn } from '@/lib/utils';\nimport { Button } from '@/components/ui/button';\nimport {\n Dialog,\n DialogClose,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n} from '@/components/ui/dialog';\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuTrigger,\n} from '@/components/ui/dropdown-menu';\nimport { deleteApplication } from '@/app/actions/delete-application';\nimport { deriveAppLiveStatus } from '@/lib/derive-app-status';\nimport { useTurnStatus } from '@/hooks/turn-statuses-provider';\nimport { useDeployAction } from '@/hooks/use-deploy-action';\nimport { CloudDeploymentStatus, DeploymentState } from '@shepai/core/domain/generated/output';\nimport type { ApplicationWithStatus } from '@shepai/core/application/use-cases/applications/list-applications.use-case';\nimport { featureIdForApplication } from '@shepai/core/domain/shared/feature-id';\nimport {\n CLOUD_PROVIDER_BRAND_HEX,\n CLOUD_PROVIDER_ICONS,\n} from '@/components/features/application-page/cloud-provider-icons';\n\nexport interface ApplicationCardProps {\n application: ApplicationWithStatus;\n className?: string;\n}\n\n// ── URL truncation ───────────────────────────────────────────────────\n// Show the END of the URL (the recognisable domain/TLD) rather than the\n// start, because the start is usually a hash prefix like \"4f5a0a51.\".\n// e.g. \"4f5a0a51.landing-page-hero-pricing-60c94f.pages.dev\"\n// → \"4f5a0…pages.dev\"\nfunction truncateUrl(raw: string, max = 22): string {\n const url = raw.replace(/^https?:\\/\\//, '').replace(/\\/$/, '');\n if (url.length <= max) return url;\n // Keep up to 5 chars from start + ellipsis + last (max-8) chars\n const tail = url.slice(-(max - 6));\n return `${url.slice(0, 5)}…${tail}`;\n}\n\n// ── Abstract dark preview patterns ───────────────────────────────────\n// Four minimal, abstract SVG backgrounds rendered on a near-black card.\n// Elements are white at very low opacity — ambient texture, not UI mockups.\n\nfunction hashName(name: string): number {\n let h = 0x811c9dc5;\n for (let i = 0; i < name.length; i++) {\n h ^= name.charCodeAt(i);\n h = (Math.imul(h, 0x01000193) | 0) >>> 0;\n }\n return h;\n}\n\nconst D = 'rgba(255,255,255,0.13)'; // primary strokes\nconst DM = 'rgba(255,255,255,0.07)'; // mid\nconst DL = 'rgba(255,255,255,0.04)'; // faint fill\n\n/** Dot grid — evenly spaced field of tiny circles */\nfunction DotsSvg() {\n const cols = 16,\n rows = 8;\n return (\n <svg viewBox=\"0 0 320 160\" className=\"h-full w-full\" aria-hidden=\"true\">\n {Array.from({ length: rows }, (_, r) =>\n Array.from({ length: cols }, (_, c) => (\n <circle key={`${r}-${c}`} cx={10 + c * 20} cy={10 + r * 20} r=\"1.5\" fill={DM} />\n ))\n )}\n {/* large ghost circle — off-center accent */}\n <circle cx=\"240\" cy=\"56\" r=\"52\" fill=\"none\" stroke={DL} strokeWidth=\"1\" />\n <circle cx=\"240\" cy=\"56\" r=\"32\" fill=\"none\" stroke={D} strokeWidth=\"0.8\" />\n {/* small accent cluster */}\n <circle cx=\"60\" cy=\"112\" r=\"14\" fill=\"none\" stroke={DM} strokeWidth=\"1\" />\n <circle cx=\"60\" cy=\"112\" r=\"6\" fill={DL} />\n </svg>\n );\n}\n\n/** Flow lines — soft undulating horizontals */\nfunction WavesSvg() {\n return (\n <svg viewBox=\"0 0 320 160\" className=\"h-full w-full\" aria-hidden=\"true\">\n {[24, 48, 72, 96, 120].map((y, i) => (\n <path\n key={`wave-${y}`}\n d={`M0,${y} C64,${y - 18 + i * 4} 128,${y + 18 - i * 3} 192,${y - 12 + i * 2} S288,${y + 14} 320,${y}`}\n fill=\"none\"\n stroke={i === 2 ? D : DM}\n strokeWidth={i === 2 ? 1.5 : 1}\n />\n ))}\n {/* filled area under the brightest wave */}\n <path d=\"M0,72 C64,54 128,90 192,60 S288,86 320,72 L320,160 L0,160 Z\" fill={DL} />\n {/* small accent circle top-right */}\n <circle cx=\"290\" cy=\"30\" r=\"18\" fill=\"none\" stroke={DM} strokeWidth=\"1\" />\n </svg>\n );\n}\n\n/** Geometry — overlapping large arcs + a diamond */\nfunction GeoSvg() {\n return (\n <svg viewBox=\"0 0 320 160\" className=\"h-full w-full\" aria-hidden=\"true\">\n {/* large background arc */}\n <circle cx=\"160\" cy=\"160\" r=\"120\" fill=\"none\" stroke={DL} strokeWidth=\"40\" />\n {/* two overlapping rings */}\n <circle cx=\"100\" cy=\"60\" r=\"70\" fill=\"none\" stroke={DM} strokeWidth=\"1\" />\n <circle cx=\"220\" cy=\"80\" r=\"55\" fill=\"none\" stroke={D} strokeWidth=\"1\" />\n {/* diamond */}\n <polygon points=\"160,18 196,60 160,102 124,60\" fill=\"none\" stroke={DM} strokeWidth=\"1\" />\n {/* corner dots */}\n <circle cx=\"20\" cy=\"20\" r=\"2\" fill={D} />\n <circle cx=\"300\" cy=\"20\" r=\"2\" fill={D} />\n <circle cx=\"20\" cy=\"140\" r=\"2\" fill={D} />\n <circle cx=\"300\" cy=\"140\" r=\"2\" fill={D} />\n </svg>\n );\n}\n\n/** Grid + pulse — subtle square grid with a central radial burst */\nfunction GridSvg() {\n const step = 32;\n const lines = [];\n for (let x = step; x < 320; x += step)\n lines.push(<line key={`v${x}`} x1={x} y1=\"0\" x2={x} y2=\"160\" stroke={DL} strokeWidth=\"1\" />);\n for (let y = step; y < 160; y += step)\n lines.push(<line key={`h${y}`} x1=\"0\" y1={y} x2=\"320\" y2={y} stroke={DL} strokeWidth=\"1\" />);\n return (\n <svg viewBox=\"0 0 320 160\" className=\"h-full w-full\" aria-hidden=\"true\">\n {lines}\n {/* concentric radial rings from centre */}\n {[20, 40, 64, 90].map((r) => (\n <circle\n key={r}\n cx=\"160\"\n cy=\"80\"\n r={r}\n fill=\"none\"\n stroke={r === 40 ? D : DM}\n strokeWidth=\"1\"\n />\n ))}\n <circle cx=\"160\" cy=\"80\" r=\"4\" fill={D} />\n </svg>\n );\n}\n\nconst WIREFRAMES = [DotsSvg, WavesSvg, GeoSvg, GridSvg];\n\nfunction MockPreview({ name }: { name: string }) {\n const Svg = WIREFRAMES[hashName(name) % WIREFRAMES.length]!;\n return <Svg />;\n}\n\n// ── Main card ────────────────────────────────────────────────────────\n\nexport function ApplicationCard({ application, className }: ApplicationCardProps) {\n const router = useRouter();\n const queryClient = useQueryClient();\n const [confirmOpen, setConfirmOpen] = useState(false);\n const turnStatus = useTurnStatus(featureIdForApplication(application.id));\n\n const deploy = useDeployAction({\n targetId: application.id,\n targetType: 'application',\n repositoryPath: application.repositoryPath,\n });\n\n const effectiveDeploymentUrl = deploy.url;\n const live = deriveAppLiveStatus(\n application.status,\n turnStatus,\n !!effectiveDeploymentUrl,\n application.effectiveStatus\n );\n\n const cloudUrl = application.cloudDeploymentUrl ?? null;\n const cloudProvider = application.cloudDeploymentProvider ?? null;\n const CloudBrandIcon = cloudProvider ? CLOUD_PROVIDER_ICONS[cloudProvider] : null;\n const cloudBrandHex = cloudProvider ? CLOUD_PROVIDER_BRAND_HEX[cloudProvider] : undefined;\n const isCloudLive =\n application.cloudDeploymentStatus === CloudDeploymentStatus.Deployed && Boolean(cloudUrl);\n const isCloudUploading = application.cloudDeploymentStatus === CloudDeploymentStatus.Uploading;\n const isCloudFailed = application.cloudDeploymentStatus === CloudDeploymentStatus.Failed;\n\n const isBuilding = application.effectiveStatus === 'building';\n const isInterrupted = application.effectiveStatus === 'interrupted';\n const isFailed = application.effectiveStatus === 'failed';\n const isBooting = deploy.status === DeploymentState.Booting || deploy.deployLoading;\n const isLocalRunning = deploy.status === DeploymentState.Ready && Boolean(effectiveDeploymentUrl);\n\n // Resolve the URL to show in the header iframe. Prefer the local\n // dev server when it's running (it reflects uncommitted in-progress\n // changes), else fall back to the cloud deploy URL so a deployed\n // app shows its actual live site instead of an abstract placeholder.\n const previewUrl = isLocalRunning ? effectiveDeploymentUrl : isCloudLive ? cloudUrl : null;\n const hasLivePreview = Boolean(previewUrl);\n\n const navigate = () => router.push(`/application/${application.id}`);\n\n // Repository display name from path\n const repoName = application.repositoryPath.split(/[/\\\\]/).pop() ?? application.repositoryPath;\n\n return (\n <>\n <article\n data-testid=\"application-card\"\n onClick={navigate}\n className={cn(\n // In dark mode `--color-card` resolves to `#0a0a0a`, which is the\n // same value as `--color-background` — so a plain `bg-card` card\n // has no contrast against the page. Lift the dark-mode surface\n // one step (`neutral-900` = `#171717`) and soften the border so\n // the card reads as an elevated tile instead of a hole in the\n // page. Light mode is unchanged. Corners are deliberately sharp\n // (`rounded-sm`) per the dashboard tile family — the placeholder\n // and new-application tiles both match.\n 'group relative flex cursor-pointer flex-col overflow-hidden rounded-sm',\n 'bg-card dark:bg-neutral-900',\n 'border-border/60 border shadow-sm dark:border-white/10',\n 'hover:border-border transition-all duration-200 hover:shadow-lg dark:hover:border-white/20 dark:hover:shadow-black/40',\n // min-h keeps all cards in a row visually aligned; flex-1 on\n // the context zone pushes the footer to the bottom.\n 'min-h-[280px]',\n className\n )}\n >\n {/* ── Header visual ──────────────────────────────────── */}\n {/* Preference order:\n 1. Live iframe preview (local dev server OR cloud deploy URL)\n 2. Booting spinner while a local deploy is coming up\n 3. Abstract dark SVG wireframe (ambient placeholder) */}\n <div className=\"relative overflow-hidden\" style={{ height: 160 }}>\n {hasLivePreview ? (\n <div className=\"absolute inset-0 bg-white dark:bg-neutral-900\">\n <iframe\n src={previewUrl!}\n title={`${application.name} preview`}\n className=\"pointer-events-none absolute top-0 left-0 origin-top-left border-0\"\n style={{ width: '250%', height: '250%', transform: 'scale(0.4)' }}\n sandbox=\"allow-same-origin allow-scripts\"\n loading=\"lazy\"\n />\n {/* hover overlay — stop/open for LOCAL running; open-only for cloud */}\n <div\n className=\"absolute inset-0 flex items-center justify-center gap-2 bg-black/60 opacity-0 transition-opacity group-hover:opacity-100\"\n onClick={(e) => e.stopPropagation()}\n >\n {isLocalRunning ? (\n <button\n type=\"button\"\n onClick={() => void deploy.stop()}\n disabled={deploy.stopLoading}\n className=\"inline-flex h-7 cursor-pointer items-center gap-1 rounded-full bg-white/90 px-3 text-[11px] font-semibold text-neutral-900 hover:bg-red-50 hover:text-red-600\"\n >\n {deploy.stopLoading ? (\n <Loader2 className=\"h-3 w-3 animate-spin\" />\n ) : (\n <RefreshCw className=\"h-3 w-3\" />\n )}\n Stop\n </button>\n ) : null}\n <button\n type=\"button\"\n onClick={() => window.open(previewUrl!, '_blank', 'noopener,noreferrer')}\n className=\"inline-flex h-7 cursor-pointer items-center gap-1 rounded-full bg-white/90 px-3 text-[11px] font-semibold text-neutral-900 hover:bg-white\"\n >\n <ExternalLink className=\"h-3 w-3\" />\n Open\n </button>\n </div>\n </div>\n ) : isBooting ? (\n <div className=\"absolute inset-0 bg-white dark:bg-neutral-900\">\n <div className=\"flex h-full flex-col items-center justify-center gap-2\">\n <Loader2 className=\"h-6 w-6 animate-spin text-amber-500\" />\n <span className=\"text-[11px] font-medium text-amber-600 dark:text-amber-400\">\n Starting…\n </span>\n </div>\n </div>\n ) : (\n // Ambient placeholder — no title overlay; name/description\n // always render in the body below so they stay consistent\n // across every card state. Stays dark in BOTH modes because\n // the MockPreview SVG strokes are white-at-low-opacity and\n // would be invisible on a light background. In dark mode we\n // lift it to `neutral-800` (one notch above the card body's\n // `neutral-900`), giving the header a distinct elevation tier.\n <div className=\"absolute inset-0 overflow-hidden bg-[#111827] dark:bg-neutral-800\">\n <MockPreview name={application.name} />\n </div>\n )}\n\n {/* Status chip — top-left */}\n <div className=\"absolute top-2.5 left-2.5\" onClick={(e) => e.stopPropagation()}>\n {isCloudLive ? (\n <span className=\"flex items-center gap-1 rounded-full bg-black/30 px-2 py-0.5 text-[9px] font-bold tracking-wider text-white uppercase backdrop-blur-sm\">\n {CloudBrandIcon ? (\n <CloudBrandIcon className=\"h-3 w-3\" style={{ color: cloudBrandHex ?? '#fff' }} />\n ) : (\n <span className=\"h-1.5 w-1.5 animate-pulse rounded-full bg-emerald-400\" />\n )}\n Live\n </span>\n ) : isCloudUploading ? (\n <span className=\"flex items-center gap-1 rounded-full bg-black/30 px-2 py-0.5 text-[9px] font-bold tracking-wider text-white/80 uppercase backdrop-blur-sm\">\n <Loader2 className=\"h-2.5 w-2.5 animate-spin\" />\n Deploying\n </span>\n ) : isBuilding ? (\n <span className=\"flex items-center gap-1 rounded-full bg-black/30 px-2 py-0.5 text-[9px] font-bold tracking-wider text-white/80 uppercase backdrop-blur-sm\">\n <Zap className=\"h-2.5 w-2.5\" />\n Building\n </span>\n ) : live.pulse ? (\n <span className=\"relative flex h-2 w-2\">\n <span\n className={cn(\n 'absolute inline-flex h-full w-full animate-ping rounded-full opacity-75',\n live.dotClass\n )}\n />\n <span className={cn('relative inline-flex h-2 w-2 rounded-full', live.dotClass)} />\n </span>\n ) : null}\n </div>\n\n {/* ⋯ overflow menu — top-right */}\n <div className=\"absolute top-2.5 right-2.5\" onClick={(e) => e.stopPropagation()}>\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <button\n type=\"button\"\n className=\"flex h-6 w-6 cursor-pointer items-center justify-center rounded-full bg-black/30 text-white/80 opacity-0 backdrop-blur-sm transition-opacity group-hover:opacity-100 hover:bg-black/50\"\n >\n <MoreHorizontal className=\"h-3.5 w-3.5\" />\n </button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\" sideOffset={4}>\n <DropdownMenuItem\n className=\"text-destructive focus:text-destructive cursor-pointer\"\n onClick={() => setConfirmOpen(true)}\n >\n <Trash2 className=\"mr-2 h-3.5 w-3.5\" />\n Delete\n </DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n </div>\n </div>\n\n {/* ── Context zone ───────────────────────────────────── */}\n {/* Name + description always rendered in the body so they stay\n consistent regardless of what the header is showing (live\n iframe, booting spinner, or ambient SVG placeholder). */}\n <div className=\"flex flex-1 flex-col gap-1.5 px-3.5 pt-3 pb-0\">\n <div>\n <h3 className=\"text-foreground line-clamp-1 text-[14px] leading-tight font-semibold\">\n {application.name}\n </h3>\n {application.description ? (\n <p className=\"text-muted-foreground mt-0.5 line-clamp-1 text-[11px] leading-relaxed\">\n {application.description}\n </p>\n ) : null}\n </div>\n\n {/* State-specific context — the live URL now lives in the\n footer so we skip rendering it here to avoid duplication. */}\n {isCloudUploading ? (\n <div className=\"flex items-center gap-1.5 py-0.5\">\n <Loader2 className=\"text-muted-foreground h-3 w-3 shrink-0 animate-spin\" />\n <span className=\"text-muted-foreground text-[11px]\">\n Deploying to {cloudProvider ?? 'cloud'}…\n </span>\n </div>\n ) : isCloudFailed ? (\n <div className=\"flex items-center gap-1.5 py-0.5\">\n <AlertTriangle className=\"text-destructive/70 h-3 w-3 shrink-0\" />\n <span className=\"text-destructive/80 text-[11px]\">Deployment failed</span>\n </div>\n ) : isBuilding ? (\n <div className=\"flex items-center gap-1.5 py-0.5\">\n <Zap className=\"text-muted-foreground h-3 w-3 shrink-0\" />\n <span className=\"text-muted-foreground text-[11px]\">Building with AI…</span>\n <div className=\"ml-auto flex gap-0.5\">\n {[0, 1, 2].map((i) => (\n <span\n key={i}\n className=\"bg-muted-foreground/40 h-1 w-1 animate-bounce rounded-full\"\n style={{ animationDelay: `${i * 120}ms` }}\n />\n ))}\n </div>\n </div>\n ) : isInterrupted ? (\n <div className=\"flex items-center gap-1.5 py-0.5\">\n <AlertTriangle className=\"h-3 w-3 shrink-0 text-amber-500/70\" />\n <span className=\"text-muted-foreground text-[11px]\">Build interrupted</span>\n </div>\n ) : isFailed ? (\n <div className=\"flex items-center gap-1.5 py-0.5\">\n <TriangleAlert className=\"text-destructive/70 h-3 w-3 shrink-0\" />\n <span className=\"text-muted-foreground text-[11px]\">Build failed</span>\n </div>\n ) : isCloudLive ? null : (\n <div className=\"flex items-center gap-1.5 py-0.5\">\n <Globe className=\"text-muted-foreground/40 h-3 w-3 shrink-0\" />\n <span className=\"text-muted-foreground/60 text-[11px]\">Not deployed yet</span>\n </div>\n )}\n </div>\n\n {/* ── Footer ─────────────────────────────────────────── */}\n <div\n className=\"flex items-center gap-2 px-3.5 pt-2 pb-3\"\n onClick={(e) => e.stopPropagation()}\n >\n {/* Left cluster: repo dir + cloud URL — both compact, inline */}\n <div className=\"flex min-w-0 flex-1 items-center gap-2\">\n {/* Repo folder — clickable, opens local dir */}\n <button\n type=\"button\"\n title={application.repositoryPath}\n onClick={async (e) => {\n e.stopPropagation();\n const { openDirectory } = await import('@/app/actions/open-directory');\n await openDirectory(application.repositoryPath);\n }}\n className=\"text-muted-foreground/70 hover:text-foreground inline-flex shrink-0 items-center gap-1 text-[10px] transition-colors\"\n >\n <FolderGit2 className=\"h-3 w-3 shrink-0\" />\n <span className=\"max-w-[80px] truncate\">{repoName}</span>\n </button>\n\n {/* Cloud URL — only when deployed */}\n {cloudUrl ? (\n <a\n href={cloudUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n title={cloudUrl}\n className=\"text-muted-foreground/70 hover:text-foreground inline-flex min-w-0 items-center gap-1 text-[10px] transition-colors\"\n >\n {CloudBrandIcon ? (\n <CloudBrandIcon className=\"h-3 w-3 shrink-0\" style={{ color: cloudBrandHex }} />\n ) : (\n <Globe className=\"h-3 w-3 shrink-0\" />\n )}\n <span className=\"font-mono\">{truncateUrl(cloudUrl)}</span>\n </a>\n ) : null}\n </div>\n\n {/* Right: primary CTA */}\n {isBuilding || isCloudUploading ? (\n <span className=\"text-muted-foreground inline-flex shrink-0 items-center gap-1.5 text-[11px]\">\n <Loader2 className=\"h-3 w-3 animate-spin\" />\n {isBuilding ? 'Building…' : 'Deploying…'}\n </span>\n ) : cloudUrl && isCloudLive ? (\n <a\n href={cloudUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"bg-foreground text-background inline-flex h-7 shrink-0 cursor-pointer items-center gap-1.5 rounded-full px-3 text-[11px] font-semibold transition-opacity hover:opacity-80\"\n >\n <ExternalLink className=\"h-3 w-3\" />\n Open live\n </a>\n ) : isInterrupted ? (\n <button\n type=\"button\"\n onClick={navigate}\n className=\"inline-flex h-7 shrink-0 cursor-pointer items-center gap-1.5 rounded-full bg-amber-500 px-3 text-[11px] font-semibold text-white transition-opacity hover:opacity-80\"\n >\n <Play className=\"h-3 w-3 fill-current\" />\n Continue\n </button>\n ) : isFailed ? (\n <button\n type=\"button\"\n onClick={navigate}\n className=\"bg-destructive inline-flex h-7 shrink-0 cursor-pointer items-center gap-1.5 rounded-full px-3 text-[11px] font-semibold text-white transition-opacity hover:opacity-80\"\n >\n <ArrowRight className=\"h-3 w-3\" />\n View error\n </button>\n ) : (\n <button\n type=\"button\"\n onClick={navigate}\n className=\"bg-foreground text-background inline-flex h-7 shrink-0 cursor-pointer items-center gap-1.5 rounded-full px-3 text-[11px] font-semibold transition-opacity hover:opacity-80\"\n >\n <ArrowRight className=\"h-3 w-3\" />\n Open\n </button>\n )}\n </div>\n </article>\n\n <Dialog open={confirmOpen} onOpenChange={setConfirmOpen}>\n <DialogContent className=\"max-w-xs\">\n <DialogHeader>\n <DialogTitle>Delete application?</DialogTitle>\n <DialogDescription>\n This will permanently remove <strong>{application.name}</strong>.\n </DialogDescription>\n </DialogHeader>\n <DialogFooter className=\"grid grid-cols-2 gap-2 sm:flex-none\">\n <DialogClose asChild>\n <Button variant=\"outline\">Cancel</Button>\n </DialogClose>\n <Button\n variant=\"destructive\"\n onClick={async () => {\n setConfirmOpen(false);\n const result = await deleteApplication(application.id);\n if (result.error) {\n toast.error('Failed to delete', { description: result.error });\n } else {\n toast.success('Application deleted');\n void queryClient.invalidateQueries({ queryKey: ['applications'] });\n }\n }}\n >\n Delete\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n </>\n );\n}\n","/* __next_internal_action_entry_do_not_use__ [{\"00a3d928a39e0706a7d619dcbbcaa2254aba5ae1ea\":\"listDeployments\"},\"src/presentation/web/app/actions/list-deployments.ts\",\"\"] */\"use turbopack no side effects\";import{createServerReference,callServer,findSourceMapURL}from\"private-next-rsc-action-client-wrapper\";const $$RSC_SERVER_ACTION_0=/*#__PURE__*/createServerReference(\"00a3d928a39e0706a7d619dcbbcaa2254aba5ae1ea\",callServer,void 0,findSourceMapURL,\"listDeployments\");export{$$RSC_SERVER_ACTION_0 as listDeployments};","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['path', { d: 'M18 19a5 5 0 0 1-5-5v8', key: 'sz5oeg' }],\n [\n 'path',\n {\n d: 'M9 20H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h3.9a2 2 0 0 1 1.69.9l.81 1.2a2 2 0 0 0 1.67.9H20a2 2 0 0 1 2 2v5',\n key: '1w6njk',\n },\n ],\n ['circle', { cx: '13', cy: '12', r: '2', key: '1j92g6' }],\n ['circle', { cx: '20', cy: '19', r: '2', key: '1obnsp' }],\n];\n\n/**\n * @component @name FolderGit2\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMTggMTlhNSA1IDAgMCAxLTUtNXY4IiAvPgogIDxwYXRoIGQ9Ik05IDIwSDRhMiAyIDAgMCAxLTItMlY1YTIgMiAwIDAgMSAyLTJoMy45YTIgMiAwIDAgMSAxLjY5LjlsLjgxIDEuMmEyIDIgMCAwIDAgMS42Ny45SDIwYTIgMiAwIDAgMSAyIDJ2NSIgLz4KICA8Y2lyY2xlIGN4PSIxMyIgY3k9IjEyIiByPSIyIiAvPgogIDxjaXJjbGUgY3g9IjIwIiBjeT0iMTkiIHI9IjIiIC8+Cjwvc3ZnPgo=) - https://lucide.dev/icons/folder-git-2\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst FolderGit2 = createLucideIcon('folder-git-2', __iconNode);\n\nexport default FolderGit2;\n"],"names":[],"mappings":"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","ignoreList":[3]}
@@ -1,6 +1,6 @@
1
- module.exports=[495072,a=>{"use strict";var b=a.i(237705),c=a.i(996380);async function d(a){if(!a?.trim())return{error:"Application ID is required"};try{let b=(0,c.resolve)("DeleteApplicationUseCase");return await b.execute(a),{}}catch(a){return{error:a instanceof Error?a.message:"Failed to delete application"}}}(0,a.i(701904).ensureServerEntryExports)([d]),(0,b.registerServerReference)(d,"40af1b8d14947496efa0de09d2e46341cfadd226ac",null),a.s(["deleteApplication",()=>d])},750227,(a,b,c)=>{b.exports=a.x("node:path",()=>require("node:path"))},902157,(a,b,c)=>{b.exports=a.x("node:fs",()=>require("node:fs"))},666680,(a,b,c)=>{b.exports=a.x("node:crypto",()=>require("node:crypto"))},433841,46646,868378,268670,685321,a=>{"use strict";var b=a.i(237705),c=a.i(996380);let d=()=>void 0;function e(a){let b=!!process.env.DEBUG;return{info:b?(...b)=>console.info(a,...b):d,debug:b?(...b)=>console.debug(a,...b):d,warn:(...b)=>console.warn(a,...b),error:(...b)=>console.error(a,...b)}}var f=a.i(701904);let g=e("[deployFeature]");async function h(a){g.info(`called — featureId="${a}"`);try{let b=(0,c.resolve)("StartFeatureDeploymentUseCase"),d=await b.execute(a);return g.info(`start succeeded — state=${d.state}`),{success:!0,state:d.state}}catch(b){let a=b instanceof Error?b.message:"Failed to deploy feature";return g.error(`error: ${a}`,b),{success:!1,error:a}}}(0,f.ensureServerEntryExports)([h]),(0,b.registerServerReference)(h,"401846920f6fb739e32233d9d6a6df7945b8621c00",null),a.s(["deployFeature",()=>h],433841);let i=e("[deployRepository]");async function j(a){i.info(`called — repositoryPath="${a}"`);try{let b=(0,c.resolve)("StartRepositoryDeploymentUseCase"),d=await b.execute(a);return i.info(`start succeeded — state=${d.state}`),{success:!0,state:d.state}}catch(b){let a=b instanceof Error?b.message:"Failed to deploy repository";return i.error(`error: ${a}`,b),{success:!1,error:a}}}(0,f.ensureServerEntryExports)([j]),(0,b.registerServerReference)(j,"408a28f520d819792447d4b47d9b73a5ddf7296469",null),a.s(["deployRepository",()=>j],46646);class k extends Error{applicationId;code;constructor(a){super(`Application ${a} not found`),this.applicationId=a,this.code="APPLICATION_NOT_FOUND",this.name="ApplicationNotFoundError",Object.setPrototypeOf(this,new.target.prototype)}}class l extends Error{applicationId;repositoryPath;code;constructor(a,b){super(`Repository path does not exist: ${b}`),this.applicationId=a,this.repositoryPath=b,this.code="APPLICATION_REPOSITORY_NOT_ON_DISK",this.name="ApplicationRepositoryNotOnDiskError",Object.setPrototypeOf(this,new.target.prototype)}}class m extends Error{repositoryPath;code;constructor(a){super("Cannot start a dev server for the repository Shep is running from"),this.repositoryPath=a,this.code="CANNOT_DEPLOY_SELF",this.name="CannotDeploySelfError",Object.setPrototypeOf(this,new.target.prototype)}}async function n(a){if(!a?.trim())return{success:!1,error:"applicationId is required"};try{let b=(0,c.resolve)("StartApplicationDeploymentUseCase"),d=await b.execute({applicationId:a});return{success:!0,state:d.state}}catch(b){if(b instanceof k)return{success:!1,error:`Application not found: ${a}`};if(b instanceof l)return{success:!1,error:`Repository path does not exist: ${b.repositoryPath}`};if(b instanceof m)return{success:!1,error:"Cannot start a dev server for the repository Shep is running from"};return{success:!1,error:b instanceof Error?b.message:"Failed to deploy application"}}}async function o(a){try{let b=(0,c.resolve)("StopDeploymentUseCase");return await b.execute(a),{success:!0}}catch(a){return{success:!1,error:a instanceof Error?a.message:"Failed to stop deployment"}}}async function p(a){return(0,c.resolve)("GetDeploymentStatusUseCase").execute(a)}(0,f.ensureServerEntryExports)([n]),(0,b.registerServerReference)(n,"4005923232df16201d86b35c46dbbe719725cbcd26",null),a.s(["deployApplication",()=>n],868378),(0,f.ensureServerEntryExports)([o]),(0,b.registerServerReference)(o,"409ab95b1ec58ad7dd578b018e11d5bd766839f8bc",null),a.s(["stopDeployment",()=>o],268670),(0,f.ensureServerEntryExports)([p]),(0,b.registerServerReference)(p,"40ed3ea24841c9c4280513ab004dcdbce3d545bcdb",null),a.s(["getDeploymentStatus",()=>p],685321)},477710,977605,145395,a=>{"use strict";var b=a.i(237705),c=a.i(996380),d=a.i(701904);async function e(a){let{description:b,repositoryPath:d,attachments:e,sessionId:f,approvalGates:g,push:h,openPr:i,parentId:j,fast:k,pending:l,forkAndPr:m,commitSpecs:n,ciWatchEnabled:o,enableEvidence:p,commitEvidence:q,agentType:r,model:s,rebaseBeforeBranch:t,injectSkills:u,applicationId:v}=a;if(!b?.trim())return{error:"description is required"};if(!d?.trim())return{error:"repositoryPath is required"};let w=function(a,b){if(!b||0===b.length)return a;let c=b.map(a=>a.notes?.trim()?`@${a.path} [Note: ${a.notes.trim()}]`:`@${a.path}`).join(" ");return`${a}
1
+ module.exports=[495072,a=>{"use strict";var b=a.i(237705),c=a.i(996380);async function d(a){if(!a?.trim())return{error:"Application ID is required"};try{let b=(0,c.resolve)("DeleteApplicationUseCase");return await b.execute(a),{}}catch(a){return{error:a instanceof Error?a.message:"Failed to delete application"}}}(0,a.i(701904).ensureServerEntryExports)([d]),(0,b.registerServerReference)(d,"400601cc704fc3a542db95c4219b7261168cbe675d",null),a.s(["deleteApplication",()=>d])},750227,(a,b,c)=>{b.exports=a.x("node:path",()=>require("node:path"))},902157,(a,b,c)=>{b.exports=a.x("node:fs",()=>require("node:fs"))},666680,(a,b,c)=>{b.exports=a.x("node:crypto",()=>require("node:crypto"))},433841,46646,868378,268670,685321,a=>{"use strict";var b=a.i(237705),c=a.i(996380);let d=()=>void 0;function e(a){let b=!!process.env.DEBUG;return{info:b?(...b)=>console.info(a,...b):d,debug:b?(...b)=>console.debug(a,...b):d,warn:(...b)=>console.warn(a,...b),error:(...b)=>console.error(a,...b)}}var f=a.i(701904);let g=e("[deployFeature]");async function h(a){g.info(`called — featureId="${a}"`);try{let b=(0,c.resolve)("StartFeatureDeploymentUseCase"),d=await b.execute(a);return g.info(`start succeeded — state=${d.state}`),{success:!0,state:d.state}}catch(b){let a=b instanceof Error?b.message:"Failed to deploy feature";return g.error(`error: ${a}`,b),{success:!1,error:a}}}(0,f.ensureServerEntryExports)([h]),(0,b.registerServerReference)(h,"40aa1efa0fed8941c16c9537ba0c5d988cf13fecaf",null),a.s(["deployFeature",()=>h],433841);let i=e("[deployRepository]");async function j(a){i.info(`called — repositoryPath="${a}"`);try{let b=(0,c.resolve)("StartRepositoryDeploymentUseCase"),d=await b.execute(a);return i.info(`start succeeded — state=${d.state}`),{success:!0,state:d.state}}catch(b){let a=b instanceof Error?b.message:"Failed to deploy repository";return i.error(`error: ${a}`,b),{success:!1,error:a}}}(0,f.ensureServerEntryExports)([j]),(0,b.registerServerReference)(j,"403a844cbb36e5d50051fe552f050ed35a8b88f317",null),a.s(["deployRepository",()=>j],46646);class k extends Error{applicationId;code;constructor(a){super(`Application ${a} not found`),this.applicationId=a,this.code="APPLICATION_NOT_FOUND",this.name="ApplicationNotFoundError",Object.setPrototypeOf(this,new.target.prototype)}}class l extends Error{applicationId;repositoryPath;code;constructor(a,b){super(`Repository path does not exist: ${b}`),this.applicationId=a,this.repositoryPath=b,this.code="APPLICATION_REPOSITORY_NOT_ON_DISK",this.name="ApplicationRepositoryNotOnDiskError",Object.setPrototypeOf(this,new.target.prototype)}}class m extends Error{repositoryPath;code;constructor(a){super("Cannot start a dev server for the repository Shep is running from"),this.repositoryPath=a,this.code="CANNOT_DEPLOY_SELF",this.name="CannotDeploySelfError",Object.setPrototypeOf(this,new.target.prototype)}}async function n(a){if(!a?.trim())return{success:!1,error:"applicationId is required"};try{let b=(0,c.resolve)("StartApplicationDeploymentUseCase"),d=await b.execute({applicationId:a});return{success:!0,state:d.state}}catch(b){if(b instanceof k)return{success:!1,error:`Application not found: ${a}`};if(b instanceof l)return{success:!1,error:`Repository path does not exist: ${b.repositoryPath}`};if(b instanceof m)return{success:!1,error:"Cannot start a dev server for the repository Shep is running from"};return{success:!1,error:b instanceof Error?b.message:"Failed to deploy application"}}}async function o(a){try{let b=(0,c.resolve)("StopDeploymentUseCase");return await b.execute(a),{success:!0}}catch(a){return{success:!1,error:a instanceof Error?a.message:"Failed to stop deployment"}}}async function p(a){return(0,c.resolve)("GetDeploymentStatusUseCase").execute(a)}(0,f.ensureServerEntryExports)([n]),(0,b.registerServerReference)(n,"40559cc32878be443a5d902e563fa65ac29566c575",null),a.s(["deployApplication",()=>n],868378),(0,f.ensureServerEntryExports)([o]),(0,b.registerServerReference)(o,"403c93928208c54fe25784ff60dcb073f25d1055c1",null),a.s(["stopDeployment",()=>o],268670),(0,f.ensureServerEntryExports)([p]),(0,b.registerServerReference)(p,"402a545f24583952d99d18566abf474dd10d07741b",null),a.s(["getDeploymentStatus",()=>p],685321)},477710,977605,145395,a=>{"use strict";var b=a.i(237705),c=a.i(996380),d=a.i(701904);async function e(a){let{description:b,repositoryPath:d,attachments:e,sessionId:f,approvalGates:g,push:h,openPr:i,parentId:j,fast:k,pending:l,forkAndPr:m,commitSpecs:n,ciWatchEnabled:o,enableEvidence:p,commitEvidence:q,agentType:r,model:s,rebaseBeforeBranch:t,injectSkills:u,applicationId:v}=a;if(!b?.trim())return{error:"description is required"};if(!d?.trim())return{error:"repositoryPath is required"};let w=function(a,b){if(!b||0===b.length)return a;let c=b.map(a=>a.notes?.trim()?`@${a.path} [Note: ${a.notes.trim()}]`:`@${a.path}`).join(" ");return`${a}
2
2
 
3
- ${c}`}(b,e),x={allowPrd:g?.allowPrd??!1,allowPlan:g?.allowPlan??!1,allowMerge:g?.allowMerge??!1};try{let a=(0,c.resolve)("CreateFeatureUseCase"),{feature:e,shouldSpawn:g}=await a.createRecord({userInput:w,repositoryPath:d,approvalGates:x,push:h??!1,openPr:i??!1,...j?{parentId:j}:{},description:b,...k?{fast:k}:{},...l?{pending:l}:{},...null!=m?{forkAndPr:m}:{},...null!=n?{commitSpecs:n}:{},...null!=o?{ciWatchEnabled:o}:{},...null!=p?{enableEvidence:p}:{},...null!=q?{commitEvidence:q}:{},...r?{agentType:r}:{},...s?{model:s}:{},...null!=t?{rebaseBeforeBranch:t}:{},...null!=u?{injectSkills:u}:{},...v?{applicationId:v}:{}});return a.initializeAndSpawn(e,{userInput:w,repositoryPath:d,approvalGates:x,push:h??!1,openPr:i??!1,...j?{parentId:j}:{},...k?{fast:k}:{},...l?{pending:l}:{},...null!=m?{forkAndPr:m}:{},...null!=n?{commitSpecs:n}:{},...null!=o?{ciWatchEnabled:o}:{},...null!=p?{enableEvidence:p}:{},...null!=q?{commitEvidence:q}:{},...r?{agentType:r}:{},...s?{model:s}:{},...f?{sessionId:f}:{},...null!=t?{rebaseBeforeBranch:t}:{},...null!=u?{injectSkills:u}:{},...v?{applicationId:v}:{}},g).catch(a=>{console.error("[createFeature] initializeAndSpawn failed:",a)}),{feature:e}}catch(a){return{error:a instanceof Error?a.message:"Failed to create feature"}}}(0,d.ensureServerEntryExports)([e]),(0,b.registerServerReference)(e,"4023e0e62ab6873f251d393a3ac53fce2a7d1e363d",null),a.s(["createFeature",()=>e],977605);let f=`\
3
+ ${c}`}(b,e),x={allowPrd:g?.allowPrd??!1,allowPlan:g?.allowPlan??!1,allowMerge:g?.allowMerge??!1};try{let a=(0,c.resolve)("CreateFeatureUseCase"),{feature:e,shouldSpawn:g}=await a.createRecord({userInput:w,repositoryPath:d,approvalGates:x,push:h??!1,openPr:i??!1,...j?{parentId:j}:{},description:b,...k?{fast:k}:{},...l?{pending:l}:{},...null!=m?{forkAndPr:m}:{},...null!=n?{commitSpecs:n}:{},...null!=o?{ciWatchEnabled:o}:{},...null!=p?{enableEvidence:p}:{},...null!=q?{commitEvidence:q}:{},...r?{agentType:r}:{},...s?{model:s}:{},...null!=t?{rebaseBeforeBranch:t}:{},...null!=u?{injectSkills:u}:{},...v?{applicationId:v}:{}});return a.initializeAndSpawn(e,{userInput:w,repositoryPath:d,approvalGates:x,push:h??!1,openPr:i??!1,...j?{parentId:j}:{},...k?{fast:k}:{},...l?{pending:l}:{},...null!=m?{forkAndPr:m}:{},...null!=n?{commitSpecs:n}:{},...null!=o?{ciWatchEnabled:o}:{},...null!=p?{enableEvidence:p}:{},...null!=q?{commitEvidence:q}:{},...r?{agentType:r}:{},...s?{model:s}:{},...f?{sessionId:f}:{},...null!=t?{rebaseBeforeBranch:t}:{},...null!=u?{injectSkills:u}:{},...v?{applicationId:v}:{}},g).catch(a=>{console.error("[createFeature] initializeAndSpawn failed:",a)}),{feature:e}}catch(a){return{error:a instanceof Error?a.message:"Failed to create feature"}}}(0,d.ensureServerEntryExports)([e]),(0,b.registerServerReference)(e,"403977b65265c2fd34e4541180b371a5c974c91cf4",null),a.s(["createFeature",()=>e],977605);let f=`\
4
4
  ## Project Requirements
5
5
 
6
6
  Build this as a **React application** using Vite as the build tool.
@@ -27,6 +27,6 @@ Build this as a **React application** using Vite as the build tool.
27
27
  ---
28
28
 
29
29
  ## What to Build
30
- `;async function g(a){let{description:b,attachments:d,agentType:g,model:h}=a;if(!b?.trim())return{error:"Description is required"};try{let i=(0,c.resolve)("CreateProjectUseCase"),j=await i.execute({name:b.trim().split(/\s+/).slice(0,6).join(" ")});if(!j.ok)return{error:j.error};let k=j.path,l=(0,c.resolve)("AddRepositoryUseCase"),m=await l.execute({path:k}),n=f+b.trim(),o=await e({description:n,repositoryPath:k,attachments:d,agentType:g,model:h,fast:a.fast});if(o.error)return{error:o.error};return{feature:o.feature,repository:m,repositoryPath:k}}catch(a){return{error:a instanceof Error?a.message:"Failed to create project"}}}async function h(a){if(!a.description?.trim())return{error:"Description is required"};try{let b=(0,c.resolve)("CreateApplicationUseCase"),d=await b.execute({description:a.description.trim(),agentType:a.agentType,modelOverride:a.modelOverride,initialPrompt:a.initialPrompt});return{application:d.application,repositoryPath:d.repositoryPath}}catch(a){return{error:a instanceof Error?a.message:"Failed to create application"}}}(0,d.ensureServerEntryExports)([g]),(0,b.registerServerReference)(g,"40ba17f62f174f4f88aa0ea4a373db347247ae1171",null),a.s(["createProjectAndFeature",()=>g],477710),(0,d.ensureServerEntryExports)([h]),(0,b.registerServerReference)(h,"40f744f8f8785a86cc8dc9487da8d64ca353d264af",null),a.s(["createApplication",()=>h],145395)},538037,a=>{"use strict";var b=a.i(912513),c=a.i(889253),d=a.i(723504),e=a.i(408115),f=a.i(827900),g=a.i(673350),h=a.i(673101),i=a.i(654775),j=a.i(265324),k=a.i(433841),l=a.i(46646),m=a.i(868378),n=a.i(268670),o=a.i(685321),p=a.i(477710),q=a.i(145395),r=a.i(495072),s=a.i(237705),t=a.i(874533),u=a.i(902157),v=a.i(701904);async function w(a){if(!a)return{error:"No path provided"};let b=a.replace(/\\/g,"/");if(!(0,u.existsSync)(b))return{error:`Directory not found: ${b}`};let c=["xdg-open",b];return(0,t.spawn)(c[0],c.slice(1),{detached:!0,stdio:"ignore",windowsHide:!0}).unref(),{}}(0,v.ensureServerEntryExports)([w]),(0,s.registerServerReference)(w,"40ecacce01b9461b3e7e0325069bc19126fe980841",null);var x=a.i(996380);async function y(){return(0,x.resolve)("ListDeploymentsUseCase").execute()}(0,v.ensureServerEntryExports)([y]),(0,s.registerServerReference)(y,"00ad19b30c66b798476855eee8c99ef61a175cd38a",null);var z=a.i(666680),A=a.i(750227),B=a.i(881719);async function C(a){let b=a.repositoryPath.replace(/\\/g,"/"),c=A.default.basename(b);if(!c)return{error:"Could not determine folder name from path"};try{let a=(0,x.resolve)("IApplicationRepository"),d=new Date,e=(0,z.randomUUID)();return await a.create({id:e,name:c.replace(/[-_]+/g," ").replace(/\b\w/g,a=>a.toUpperCase()),slug:c,description:`Local project at ${b}`,repositoryPath:b,additionalPaths:[],status:B.ApplicationStatus.Idle,setupComplete:!0,createdAt:d,updatedAt:d}),{applicationId:e}}catch(a){return{error:a instanceof Error?a.message:"Failed to adopt directory"}}}(0,v.ensureServerEntryExports)([C]),(0,s.registerServerReference)(C,"40da8d2a61971df4b48469f401ac402d2d14c32d89",null),a.s([],300249),a.i(300249),a.s(["0015f0a240c29915a74257d5ff2d7d15b32c6a778d",()=>b.pickFolder,"00613a83ba2b2619c9ef46303abae5aded26339bc3",()=>i.listGitHubOrganizations,"006ff5a74754817b8a495d7ba26e66c354851f6c99",()=>c.getDefaultAgentAndModel,"00ad19b30c66b798476855eee8c99ef61a175cd38a",()=>y,"00d2c30c2b08e36b014924412d0cd61610cd91c78e",()=>e.checkAllAgentsStatus,"00d43390ab8112b0e6ec134ef3485ab210e36f7842",()=>d.getAllAgentModels,"4005923232df16201d86b35c46dbbe719725cbcd26",()=>m.deployApplication,"401846920f6fb739e32233d9d6a6df7945b8621c00",()=>k.deployFeature,"403ab98df2cf8db571b47142cd90ab7c7f297fa90f",()=>h.listGitHubRepositories,"408a28f520d819792447d4b47d9b73a5ddf7296469",()=>l.deployRepository,"409ab95b1ec58ad7dd578b018e11d5bd766839f8bc",()=>n.stopDeployment,"40af1b8d14947496efa0de09d2e46341cfadd226ac",()=>r.deleteApplication,"40ba17f62f174f4f88aa0ea4a373db347247ae1171",()=>p.createProjectAndFeature,"40da8d2a61971df4b48469f401ac402d2d14c32d89",()=>C,"40e011f8f2f54f36460ff5310dd49178590a992d44",()=>j.importGitHubRepository,"40ecacce01b9461b3e7e0325069bc19126fe980841",()=>w,"40ed3ea24841c9c4280513ab004dcdbce3d545bcdb",()=>o.getDeploymentStatus,"40f744f8f8785a86cc8dc9487da8d64ca353d264af",()=>q.createApplication,"40fcb38a7daafc835826043ee30ef771eae2a2f635",()=>g.globalSearch,"60036293085b1751ff35875b7762b2353bb09757b5",()=>f.updateAgentAndModel],538037)}];
30
+ `;async function g(a){let{description:b,attachments:d,agentType:g,model:h}=a;if(!b?.trim())return{error:"Description is required"};try{let i=(0,c.resolve)("CreateProjectUseCase"),j=await i.execute({name:b.trim().split(/\s+/).slice(0,6).join(" ")});if(!j.ok)return{error:j.error};let k=j.path,l=(0,c.resolve)("AddRepositoryUseCase"),m=await l.execute({path:k}),n=f+b.trim(),o=await e({description:n,repositoryPath:k,attachments:d,agentType:g,model:h,fast:a.fast});if(o.error)return{error:o.error};return{feature:o.feature,repository:m,repositoryPath:k}}catch(a){return{error:a instanceof Error?a.message:"Failed to create project"}}}async function h(a){if(!a.description?.trim())return{error:"Description is required"};try{let b=(0,c.resolve)("CreateApplicationUseCase"),d=await b.execute({description:a.description.trim(),agentType:a.agentType,modelOverride:a.modelOverride,initialPrompt:a.initialPrompt});return{application:d.application,repositoryPath:d.repositoryPath}}catch(a){return{error:a instanceof Error?a.message:"Failed to create application"}}}(0,d.ensureServerEntryExports)([g]),(0,b.registerServerReference)(g,"402a7da73158b6bd6c8fb8ab5b0344dc0e0f08e228",null),a.s(["createProjectAndFeature",()=>g],477710),(0,d.ensureServerEntryExports)([h]),(0,b.registerServerReference)(h,"402b7881a750d5c7c7125153b65fdd64c555ddcdc2",null),a.s(["createApplication",()=>h],145395)},538037,a=>{"use strict";var b=a.i(912513),c=a.i(889253),d=a.i(723504),e=a.i(408115),f=a.i(827900),g=a.i(673350),h=a.i(673101),i=a.i(654775),j=a.i(265324),k=a.i(433841),l=a.i(46646),m=a.i(868378),n=a.i(268670),o=a.i(685321),p=a.i(477710),q=a.i(145395),r=a.i(495072),s=a.i(237705),t=a.i(874533),u=a.i(902157),v=a.i(701904);async function w(a){if(!a)return{error:"No path provided"};let b=a.replace(/\\/g,"/");if(!(0,u.existsSync)(b))return{error:`Directory not found: ${b}`};let c=["xdg-open",b];return(0,t.spawn)(c[0],c.slice(1),{detached:!0,stdio:"ignore",windowsHide:!0}).unref(),{}}(0,v.ensureServerEntryExports)([w]),(0,s.registerServerReference)(w,"40daedbc150207939e88e0091c8c17df149b81ee9b",null);var x=a.i(996380);async function y(){return(0,x.resolve)("ListDeploymentsUseCase").execute()}(0,v.ensureServerEntryExports)([y]),(0,s.registerServerReference)(y,"00a3d928a39e0706a7d619dcbbcaa2254aba5ae1ea",null);var z=a.i(666680),A=a.i(750227),B=a.i(881719);async function C(a){let b=a.repositoryPath.replace(/\\/g,"/"),c=A.default.basename(b);if(!c)return{error:"Could not determine folder name from path"};try{let a=(0,x.resolve)("IApplicationRepository"),d=new Date,e=(0,z.randomUUID)();return await a.create({id:e,name:c.replace(/[-_]+/g," ").replace(/\b\w/g,a=>a.toUpperCase()),slug:c,description:`Local project at ${b}`,repositoryPath:b,additionalPaths:[],status:B.ApplicationStatus.Idle,setupComplete:!0,createdAt:d,updatedAt:d}),{applicationId:e}}catch(a){return{error:a instanceof Error?a.message:"Failed to adopt directory"}}}(0,v.ensureServerEntryExports)([C]),(0,s.registerServerReference)(C,"40f5758fe7616d4922831f3068cfee45b9b3a8ba68",null),a.s([],300249),a.i(300249),a.s(["00a3d928a39e0706a7d619dcbbcaa2254aba5ae1ea",()=>y,"00c270c7a6f9c21fabe7b7271a4bf75d5cef02d22a",()=>c.getDefaultAgentAndModel,"00c38b234d35460bb11ea6a1b0fff1c22e01c08873",()=>e.checkAllAgentsStatus,"00c4af7e37cefa35ac7db65fa9b45995caf677a597",()=>i.listGitHubOrganizations,"00c6d708f17ef9dc5f3443dc4d3b3f3756c20b1392",()=>d.getAllAgentModels,"00e58a33ab1b838c8207f1b7dbe831d7a7b8cd3330",()=>b.pickFolder,"400601cc704fc3a542db95c4219b7261168cbe675d",()=>r.deleteApplication,"4015ea81e1b2a02fe57f374a012b37e2cd322146f1",()=>g.globalSearch,"402a545f24583952d99d18566abf474dd10d07741b",()=>o.getDeploymentStatus,"402a7da73158b6bd6c8fb8ab5b0344dc0e0f08e228",()=>p.createProjectAndFeature,"402b7881a750d5c7c7125153b65fdd64c555ddcdc2",()=>q.createApplication,"403a844cbb36e5d50051fe552f050ed35a8b88f317",()=>l.deployRepository,"403c93928208c54fe25784ff60dcb073f25d1055c1",()=>n.stopDeployment,"40559cc32878be443a5d902e563fa65ac29566c575",()=>m.deployApplication,"405f5f5259eaed6742d1a59f416d4319ea63f3bb3d",()=>j.importGitHubRepository,"40aa1efa0fed8941c16c9537ba0c5d988cf13fecaf",()=>k.deployFeature,"40d1082c73e97a2c5f99ef11d815cefe59a26e8998",()=>h.listGitHubRepositories,"40daedbc150207939e88e0091c8c17df149b81ee9b",()=>w,"40f5758fe7616d4922831f3068cfee45b9b3a8ba68",()=>C,"60afd0d4fa2a6638646f7d23dc6c8673fd27a69207",()=>f.updateAgentAndModel],538037)}];
31
31
 
32
32
  //# sourceMappingURL=%5Broot-of-the-server%5D__0af8610a._.js.map