@shepai/cli 1.182.0 → 1.182.1-pr550.9abbae3

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 (524) hide show
  1. package/apis/json-schema/Application.yaml +7 -0
  2. package/dist/packages/core/src/application/ports/output/repositories/application-repository.interface.d.ts +1 -1
  3. package/dist/packages/core/src/application/ports/output/repositories/application-repository.interface.d.ts.map +1 -1
  4. package/dist/packages/core/src/application/ports/output/services/git-pr-service.interface.d.ts +8 -1
  5. package/dist/packages/core/src/application/ports/output/services/git-pr-service.interface.d.ts.map +1 -1
  6. package/dist/packages/core/src/application/use-cases/applications/create-application.use-case.d.ts +3 -3
  7. package/dist/packages/core/src/application/use-cases/applications/create-application.use-case.d.ts.map +1 -1
  8. package/dist/packages/core/src/application/use-cases/applications/create-application.use-case.js +13 -21
  9. package/dist/packages/core/src/application/use-cases/applications/list-applications.use-case.d.ts +19 -3
  10. package/dist/packages/core/src/application/use-cases/applications/list-applications.use-case.d.ts.map +1 -1
  11. package/dist/packages/core/src/application/use-cases/applications/list-applications.use-case.js +37 -4
  12. package/dist/packages/core/src/application/use-cases/applications/resume-application-workflow.use-case.d.ts +30 -0
  13. package/dist/packages/core/src/application/use-cases/applications/resume-application-workflow.use-case.d.ts.map +1 -0
  14. package/dist/packages/core/src/application/use-cases/applications/resume-application-workflow.use-case.js +122 -0
  15. package/dist/packages/core/src/application/use-cases/repositories/import-github-repository.use-case.d.ts +13 -1
  16. package/dist/packages/core/src/application/use-cases/repositories/import-github-repository.use-case.d.ts.map +1 -1
  17. package/dist/packages/core/src/application/use-cases/repositories/import-github-repository.use-case.js +44 -5
  18. package/dist/packages/core/src/domain/generated/output.d.ts +8 -0
  19. package/dist/packages/core/src/domain/generated/output.d.ts.map +1 -1
  20. package/dist/packages/core/src/infrastructure/di/container.d.ts.map +1 -1
  21. package/dist/packages/core/src/infrastructure/di/container.js +5 -0
  22. package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/application.mapper.d.ts +2 -0
  23. package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/application.mapper.d.ts.map +1 -1
  24. package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/application.mapper.js +4 -0
  25. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/058-add-setup-complete-to-applications.d.ts +5 -0
  26. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/058-add-setup-complete-to-applications.d.ts.map +1 -0
  27. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/058-add-setup-complete-to-applications.js +10 -0
  28. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/059-add-agent-session-id-to-applications.d.ts +5 -0
  29. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/059-add-agent-session-id-to-applications.d.ts.map +1 -0
  30. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/059-add-agent-session-id-to-applications.js +10 -0
  31. package/dist/packages/core/src/infrastructure/repositories/sqlite-application.repository.d.ts +1 -1
  32. package/dist/packages/core/src/infrastructure/repositories/sqlite-application.repository.d.ts.map +1 -1
  33. package/dist/packages/core/src/infrastructure/repositories/sqlite-application.repository.js +10 -2
  34. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/node-helpers.d.ts.map +1 -1
  35. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/node-helpers.js +4 -1
  36. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/prompts/fast-implement.prompt.d.ts.map +1 -1
  37. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/prompts/fast-implement.prompt.js +4 -1
  38. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/prompts/implement.prompt.d.ts.map +1 -1
  39. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/prompts/implement.prompt.js +4 -1
  40. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/prompts/merge-prompts.d.ts.map +1 -1
  41. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/prompts/merge-prompts.js +11 -6
  42. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/prompts/pr-branding.d.ts +2 -2
  43. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/prompts/pr-branding.d.ts.map +1 -1
  44. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/prompts/pr-branding.js +2 -2
  45. package/dist/packages/core/src/infrastructure/services/git/git-pr.service.d.ts +1 -0
  46. package/dist/packages/core/src/infrastructure/services/git/git-pr.service.d.ts.map +1 -1
  47. package/dist/packages/core/src/infrastructure/services/git/git-pr.service.js +18 -2
  48. package/dist/packages/core/src/infrastructure/services/git/pr-branding.d.ts +16 -5
  49. package/dist/packages/core/src/infrastructure/services/git/pr-branding.d.ts.map +1 -1
  50. package/dist/packages/core/src/infrastructure/services/git/pr-branding.js +38 -7
  51. package/dist/src/presentation/web/app/api/applications/[id]/resume/route.d.ts +20 -0
  52. package/dist/src/presentation/web/app/api/applications/[id]/resume/route.d.ts.map +1 -0
  53. package/dist/src/presentation/web/app/api/applications/[id]/resume/route.js +25 -0
  54. package/dist/src/presentation/web/app/api/applications/[id]/route.d.ts +19 -0
  55. package/dist/src/presentation/web/app/api/applications/[id]/route.d.ts.map +1 -0
  56. package/dist/src/presentation/web/app/api/applications/[id]/route.js +46 -0
  57. package/dist/src/presentation/web/app/api/applications/route.d.ts +9 -0
  58. package/dist/src/presentation/web/app/api/applications/route.d.ts.map +1 -0
  59. package/dist/src/presentation/web/app/api/applications/route.js +20 -0
  60. package/dist/src/presentation/web/app/application/[id]/page.d.ts +4 -4
  61. package/dist/src/presentation/web/app/application/[id]/page.d.ts.map +1 -1
  62. package/dist/src/presentation/web/app/application/[id]/page.js +2 -61
  63. package/dist/src/presentation/web/app/applications/page.d.ts +2 -0
  64. package/dist/src/presentation/web/app/applications/page.d.ts.map +1 -0
  65. package/dist/src/presentation/web/app/applications/page.js +5 -0
  66. package/dist/src/presentation/web/components/assistant-ui/thread.js +2 -2
  67. package/dist/src/presentation/web/components/common/application-node/application-node.d.ts.map +1 -1
  68. package/dist/src/presentation/web/components/common/application-node/application-node.js +3 -37
  69. package/dist/src/presentation/web/components/features/application-page/application-page-loader.d.ts +4 -0
  70. package/dist/src/presentation/web/components/features/application-page/application-page-loader.d.ts.map +1 -0
  71. package/dist/src/presentation/web/components/features/application-page/application-page-loader.js +47 -0
  72. package/dist/src/presentation/web/components/features/application-page/application-page.d.ts.map +1 -1
  73. package/dist/src/presentation/web/components/features/application-page/application-page.js +75 -54
  74. package/dist/src/presentation/web/components/features/application-page/application-page.stories.d.ts.map +1 -1
  75. package/dist/src/presentation/web/components/features/application-page/application-page.stories.js +1 -0
  76. package/dist/src/presentation/web/components/features/application-page/run-dev-button.d.ts +3 -1
  77. package/dist/src/presentation/web/components/features/application-page/run-dev-button.d.ts.map +1 -1
  78. package/dist/src/presentation/web/components/features/application-page/run-dev-button.js +6 -2
  79. package/dist/src/presentation/web/components/features/applications/application-card.d.ts +7 -0
  80. package/dist/src/presentation/web/components/features/applications/application-card.d.ts.map +1 -0
  81. package/dist/src/presentation/web/components/features/applications/application-card.js +82 -0
  82. package/dist/src/presentation/web/components/features/applications/application-card.stories.d.ts +13 -0
  83. package/dist/src/presentation/web/components/features/applications/application-card.stories.d.ts.map +1 -0
  84. package/dist/src/presentation/web/components/features/applications/application-card.stories.js +69 -0
  85. package/dist/src/presentation/web/components/features/applications/applications-page-client.d.ts +5 -0
  86. package/dist/src/presentation/web/components/features/applications/applications-page-client.d.ts.map +1 -0
  87. package/dist/src/presentation/web/components/features/applications/applications-page-client.js +28 -0
  88. package/dist/src/presentation/web/components/features/applications/applications-page-client.stories.d.ts +10 -0
  89. package/dist/src/presentation/web/components/features/applications/applications-page-client.stories.d.ts.map +1 -0
  90. package/dist/src/presentation/web/components/features/applications/applications-page-client.stories.js +93 -0
  91. package/dist/src/presentation/web/components/features/chat/ChatComposer.d.ts +3 -1
  92. package/dist/src/presentation/web/components/features/chat/ChatComposer.d.ts.map +1 -1
  93. package/dist/src/presentation/web/components/features/chat/ChatComposer.js +2 -2
  94. package/dist/src/presentation/web/components/features/chat/ChatTab.d.ts +3 -1
  95. package/dist/src/presentation/web/components/features/chat/ChatTab.d.ts.map +1 -1
  96. package/dist/src/presentation/web/components/features/chat/ChatTab.js +4 -3
  97. package/dist/src/presentation/web/components/features/chat/StepTracker.d.ts +6 -1
  98. package/dist/src/presentation/web/components/features/chat/StepTracker.d.ts.map +1 -1
  99. package/dist/src/presentation/web/components/features/chat/StepTracker.js +23 -20
  100. package/dist/src/presentation/web/components/features/control-center/control-center-inner.d.ts.map +1 -1
  101. package/dist/src/presentation/web/components/features/control-center/control-center-inner.js +3 -2
  102. package/dist/src/presentation/web/components/features/features-canvas/features-canvas.d.ts +3 -1
  103. package/dist/src/presentation/web/components/features/features-canvas/features-canvas.d.ts.map +1 -1
  104. package/dist/src/presentation/web/components/features/features-canvas/features-canvas.js +2 -2
  105. package/dist/src/presentation/web/components/features/settings/language-settings-section.d.ts.map +1 -1
  106. package/dist/src/presentation/web/components/features/settings/language-settings-section.js +1 -0
  107. package/dist/src/presentation/web/components/features/settings/language-settings-section.stories.d.ts +1 -0
  108. package/dist/src/presentation/web/components/features/settings/language-settings-section.stories.d.ts.map +1 -1
  109. package/dist/src/presentation/web/components/features/settings/language-settings-section.stories.js +5 -0
  110. package/dist/src/presentation/web/components/features/settings/settings-page-client.d.ts.map +1 -1
  111. package/dist/src/presentation/web/components/features/settings/settings-page-client.js +23 -3
  112. package/dist/src/presentation/web/components/layouts/app-sidebar/app-sidebar.d.ts.map +1 -1
  113. package/dist/src/presentation/web/components/layouts/app-sidebar/app-sidebar.js +2 -2
  114. package/dist/src/presentation/web/lib/derive-app-status.d.ts +23 -0
  115. package/dist/src/presentation/web/lib/derive-app-status.d.ts.map +1 -0
  116. package/dist/src/presentation/web/lib/derive-app-status.js +89 -0
  117. package/dist/src/presentation/web/lib/i18n.d.ts.map +1 -1
  118. package/dist/src/presentation/web/lib/i18n.js +3 -0
  119. package/dist/translations/ar/web.json +2 -1
  120. package/dist/translations/de/web.json +2 -1
  121. package/dist/translations/en/web.json +2 -1
  122. package/dist/translations/es/web.json +2 -1
  123. package/dist/translations/fr/web.json +2 -1
  124. package/dist/translations/he/web.json +2 -1
  125. package/dist/translations/pt/web.json +2 -1
  126. package/dist/translations/ru/web.json +2 -1
  127. package/dist/translations/uk/web.json +2 -1
  128. package/dist/tsconfig.build.tsbuildinfo +1 -1
  129. package/package.json +1 -1
  130. package/web/.next/BUILD_ID +1 -1
  131. package/web/.next/app-path-routes-manifest.json +4 -0
  132. package/web/.next/build-manifest.json +2 -2
  133. package/web/.next/fallback-build-manifest.json +2 -2
  134. package/web/.next/prerender-manifest.json +3 -3
  135. package/web/.next/required-server-files.js +3 -3
  136. package/web/.next/required-server-files.json +3 -3
  137. package/web/.next/routes-manifest.json +28 -0
  138. package/web/.next/server/app/(dashboard)/@drawer/adopt/page/server-reference-manifest.json +32 -32
  139. package/web/.next/server/app/(dashboard)/@drawer/adopt/page.js +5 -5
  140. package/web/.next/server/app/(dashboard)/@drawer/adopt/page.js.nft.json +1 -1
  141. package/web/.next/server/app/(dashboard)/@drawer/adopt/page_client-reference-manifest.js +1 -1
  142. package/web/.next/server/app/(dashboard)/@drawer/chat/page/server-reference-manifest.json +30 -30
  143. package/web/.next/server/app/(dashboard)/@drawer/chat/page.js +5 -5
  144. package/web/.next/server/app/(dashboard)/@drawer/chat/page.js.nft.json +1 -1
  145. package/web/.next/server/app/(dashboard)/@drawer/chat/page_client-reference-manifest.js +1 -1
  146. package/web/.next/server/app/(dashboard)/@drawer/create/page/server-reference-manifest.json +33 -33
  147. package/web/.next/server/app/(dashboard)/@drawer/create/page.js +5 -5
  148. package/web/.next/server/app/(dashboard)/@drawer/create/page.js.nft.json +1 -1
  149. package/web/.next/server/app/(dashboard)/@drawer/create/page_client-reference-manifest.js +1 -1
  150. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page/server-reference-manifest.json +41 -41
  151. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page.js +5 -5
  152. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page.js.nft.json +1 -1
  153. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page_client-reference-manifest.js +1 -1
  154. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page/server-reference-manifest.json +41 -41
  155. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js +5 -5
  156. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js.nft.json +1 -1
  157. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page_client-reference-manifest.js +1 -1
  158. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/[tab]/page/server-reference-manifest.json +31 -31
  159. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/[tab]/page.js +5 -5
  160. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/[tab]/page.js.nft.json +1 -1
  161. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/[tab]/page_client-reference-manifest.js +1 -1
  162. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page/server-reference-manifest.json +31 -31
  163. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js +5 -5
  164. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js.nft.json +1 -1
  165. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  166. package/web/.next/server/app/(dashboard)/chat/page/server-reference-manifest.json +30 -30
  167. package/web/.next/server/app/(dashboard)/chat/page.js +5 -5
  168. package/web/.next/server/app/(dashboard)/chat/page.js.nft.json +1 -1
  169. package/web/.next/server/app/(dashboard)/chat/page_client-reference-manifest.js +1 -1
  170. package/web/.next/server/app/(dashboard)/create/page/server-reference-manifest.json +33 -33
  171. package/web/.next/server/app/(dashboard)/create/page.js +5 -5
  172. package/web/.next/server/app/(dashboard)/create/page.js.nft.json +1 -1
  173. package/web/.next/server/app/(dashboard)/create/page_client-reference-manifest.js +1 -1
  174. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page/server-reference-manifest.json +41 -41
  175. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page.js +5 -5
  176. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page.js.nft.json +1 -1
  177. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page_client-reference-manifest.js +1 -1
  178. package/web/.next/server/app/(dashboard)/feature/[featureId]/page/server-reference-manifest.json +41 -41
  179. package/web/.next/server/app/(dashboard)/feature/[featureId]/page.js +5 -5
  180. package/web/.next/server/app/(dashboard)/feature/[featureId]/page.js.nft.json +1 -1
  181. package/web/.next/server/app/(dashboard)/feature/[featureId]/page_client-reference-manifest.js +1 -1
  182. package/web/.next/server/app/(dashboard)/page/server-reference-manifest.json +30 -30
  183. package/web/.next/server/app/(dashboard)/page.js +5 -5
  184. package/web/.next/server/app/(dashboard)/page.js.nft.json +1 -1
  185. package/web/.next/server/app/(dashboard)/page_client-reference-manifest.js +1 -1
  186. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/[tab]/page/server-reference-manifest.json +31 -31
  187. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/[tab]/page.js +5 -5
  188. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/[tab]/page.js.nft.json +1 -1
  189. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/[tab]/page_client-reference-manifest.js +1 -1
  190. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page/server-reference-manifest.json +31 -31
  191. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js +5 -5
  192. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js.nft.json +1 -1
  193. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  194. package/web/.next/server/app/_global-error/page.js +1 -1
  195. package/web/.next/server/app/_global-error/page.js.nft.json +1 -1
  196. package/web/.next/server/app/_global-error.html +2 -2
  197. package/web/.next/server/app/_global-error.rsc +1 -1
  198. package/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  199. package/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  200. package/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  201. package/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  202. package/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  203. package/web/.next/server/app/_not-found/page/server-reference-manifest.json +7 -7
  204. package/web/.next/server/app/_not-found/page.js +1 -1
  205. package/web/.next/server/app/_not-found/page.js.nft.json +1 -1
  206. package/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  207. package/web/.next/server/app/api/applications/[id]/resume/route/app-paths-manifest.json +3 -0
  208. package/web/.next/server/app/api/applications/[id]/resume/route/build-manifest.json +11 -0
  209. package/web/.next/server/app/api/applications/[id]/resume/route/server-reference-manifest.json +4 -0
  210. package/web/.next/server/app/api/applications/[id]/resume/route.js +7 -0
  211. package/web/.next/server/app/api/applications/[id]/resume/route.js.map +5 -0
  212. package/web/.next/server/app/api/applications/[id]/resume/route.js.nft.json +1 -0
  213. package/web/.next/server/app/api/applications/[id]/resume/route_client-reference-manifest.js +2 -0
  214. package/web/.next/server/app/api/applications/[id]/route/app-paths-manifest.json +3 -0
  215. package/web/.next/server/app/api/applications/[id]/route/build-manifest.json +11 -0
  216. package/web/.next/server/app/api/applications/[id]/route/server-reference-manifest.json +4 -0
  217. package/web/.next/server/app/api/applications/[id]/route.js +7 -0
  218. package/web/.next/server/app/api/applications/[id]/route.js.map +5 -0
  219. package/web/.next/server/app/api/applications/[id]/route.js.nft.json +1 -0
  220. package/web/.next/server/app/api/applications/[id]/route_client-reference-manifest.js +2 -0
  221. package/web/.next/server/app/api/applications/route/app-paths-manifest.json +3 -0
  222. package/web/.next/server/app/api/applications/route/build-manifest.json +11 -0
  223. package/web/.next/server/app/api/applications/route/server-reference-manifest.json +4 -0
  224. package/web/.next/server/app/api/applications/route.js +7 -0
  225. package/web/.next/server/app/api/applications/route.js.map +5 -0
  226. package/web/.next/server/app/api/applications/route.js.nft.json +1 -0
  227. package/web/.next/server/app/api/applications/route_client-reference-manifest.js +2 -0
  228. package/web/.next/server/app/api/attachments/preview/route.js.nft.json +1 -1
  229. package/web/.next/server/app/api/evidence/route.js.nft.json +1 -1
  230. package/web/.next/server/app/api/graph-data/route.js.nft.json +1 -1
  231. package/web/.next/server/app/api/interactive/chat/[featureId]/messages/route.js.nft.json +1 -1
  232. package/web/.next/server/app/application/[id]/page/server-reference-manifest.json +45 -30
  233. package/web/.next/server/app/application/[id]/page.js +3 -3
  234. package/web/.next/server/app/application/[id]/page.js.nft.json +1 -1
  235. package/web/.next/server/app/application/[id]/page_client-reference-manifest.js +1 -1
  236. package/web/.next/server/app/applications/page/app-paths-manifest.json +3 -0
  237. package/web/.next/server/app/applications/page/build-manifest.json +18 -0
  238. package/web/.next/server/app/applications/page/next-font-manifest.json +6 -0
  239. package/web/.next/server/app/applications/page/react-loadable-manifest.json +1 -0
  240. package/web/.next/server/app/applications/page/server-reference-manifest.json +230 -0
  241. package/web/.next/server/app/applications/page.js +19 -0
  242. package/web/.next/server/app/applications/page.js.map +5 -0
  243. package/web/.next/server/app/applications/page.js.nft.json +1 -0
  244. package/web/.next/server/app/applications/page_client-reference-manifest.js +2 -0
  245. package/web/.next/server/app/features/page/server-reference-manifest.json +7 -7
  246. package/web/.next/server/app/features/page.js +1 -1
  247. package/web/.next/server/app/features/page.js.nft.json +1 -1
  248. package/web/.next/server/app/features/page_client-reference-manifest.js +1 -1
  249. package/web/.next/server/app/settings/page/server-reference-manifest.json +10 -10
  250. package/web/.next/server/app/settings/page.js +1 -1
  251. package/web/.next/server/app/settings/page.js.nft.json +1 -1
  252. package/web/.next/server/app/settings/page_client-reference-manifest.js +1 -1
  253. package/web/.next/server/app/skills/page/server-reference-manifest.json +15 -15
  254. package/web/.next/server/app/skills/page.js +1 -1
  255. package/web/.next/server/app/skills/page.js.nft.json +1 -1
  256. package/web/.next/server/app/skills/page_client-reference-manifest.js +1 -1
  257. package/web/.next/server/app/tools/page/server-reference-manifest.json +13 -13
  258. package/web/.next/server/app/tools/page.js +1 -1
  259. package/web/.next/server/app/tools/page.js.nft.json +1 -1
  260. package/web/.next/server/app/tools/page_client-reference-manifest.js +1 -1
  261. package/web/.next/server/app/version/page/server-reference-manifest.json +7 -7
  262. package/web/.next/server/app/version/page.js +1 -1
  263. package/web/.next/server/app/version/page.js.nft.json +1 -1
  264. package/web/.next/server/app/version/page_client-reference-manifest.js +1 -1
  265. package/web/.next/server/app-paths-manifest.json +4 -0
  266. package/web/.next/server/chunks/744ca_web__next-internal_server_app_api_applications_[id]_route_actions_e31b426d.js +3 -0
  267. package/web/.next/server/chunks/744ca_web__next-internal_server_app_api_applications_[id]_route_actions_e31b426d.js.map +1 -0
  268. package/web/.next/server/chunks/744ca_web__next-internal_server_app_api_applications_route_actions_2b7d20d0.js +3 -0
  269. package/web/.next/server/chunks/744ca_web__next-internal_server_app_api_applications_route_actions_2b7d20d0.js.map +1 -0
  270. package/web/.next/server/chunks/[root-of-the-server]__3bb635e8._.js +3 -0
  271. package/web/.next/server/chunks/[root-of-the-server]__3bb635e8._.js.map +1 -0
  272. package/web/.next/server/chunks/[root-of-the-server]__a402b567._.js +1 -1
  273. package/web/.next/server/chunks/[root-of-the-server]__ac0027b4._.js +3 -0
  274. package/web/.next/server/chunks/[root-of-the-server]__ac0027b4._.js.map +1 -0
  275. package/web/.next/server/chunks/[root-of-the-server]__b2a4bfcc._.js.map +1 -1
  276. package/web/.next/server/chunks/[root-of-the-server]__cd67a84c._.js.map +1 -1
  277. package/web/.next/server/chunks/[root-of-the-server]__ce82df38._.js +3 -0
  278. package/web/.next/server/chunks/[root-of-the-server]__ce82df38._.js.map +1 -0
  279. package/web/.next/server/chunks/f3a1f__next-internal_server_app_api_applications_[id]_resume_route_actions_3a66d646.js +3 -0
  280. package/web/.next/server/chunks/f3a1f__next-internal_server_app_api_applications_[id]_resume_route_actions_3a66d646.js.map +1 -0
  281. package/web/.next/server/chunks/ssr/744ca_web__next-internal_server_app_(dashboard)_@drawer_adopt_page_actions_4f9eef62.js +3 -0
  282. package/web/.next/server/chunks/ssr/744ca_web__next-internal_server_app_(dashboard)_@drawer_adopt_page_actions_4f9eef62.js.map +1 -0
  283. package/web/.next/server/chunks/ssr/744ca_web__next-internal_server_app_(dashboard)_@drawer_chat_page_actions_ffa16a22.js +3 -0
  284. package/web/.next/server/chunks/ssr/744ca_web__next-internal_server_app_(dashboard)_@drawer_chat_page_actions_ffa16a22.js.map +1 -0
  285. package/web/.next/server/chunks/ssr/744ca_web__next-internal_server_app_(dashboard)_chat_page_actions_a1a998f9.js +3 -0
  286. package/web/.next/server/chunks/ssr/744ca_web__next-internal_server_app_(dashboard)_chat_page_actions_a1a998f9.js.map +1 -0
  287. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js +1 -1
  288. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js.map +1 -1
  289. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_feature-drawer-client_tsx_e9755fc8._.js +2 -2
  290. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_feature-drawer-client_tsx_e9755fc8._.js.map +1 -1
  291. package/web/.next/server/chunks/ssr/744ca_web_components_features_applications_applications-page-client_tsx_d0db9938._.js +3 -0
  292. package/web/.next/server/chunks/ssr/744ca_web_components_features_applications_applications-page-client_tsx_d0db9938._.js.map +1 -0
  293. package/web/.next/server/chunks/ssr/[root-of-the-server]__04f4895b._.js +3 -0
  294. package/web/.next/server/chunks/ssr/[root-of-the-server]__04f4895b._.js.map +1 -0
  295. package/web/.next/server/chunks/ssr/[root-of-the-server]__17dadd08._.js +1 -1
  296. package/web/.next/server/chunks/ssr/[root-of-the-server]__17dadd08._.js.map +1 -1
  297. package/web/.next/server/chunks/ssr/[root-of-the-server]__1925bef0._.js +1 -1
  298. package/web/.next/server/chunks/ssr/[root-of-the-server]__1a9687c4._.js +1 -1
  299. package/web/.next/server/chunks/ssr/[root-of-the-server]__1a9687c4._.js.map +1 -1
  300. package/web/.next/server/chunks/ssr/[root-of-the-server]__347fd0f6._.js +3 -0
  301. package/web/.next/server/chunks/ssr/[root-of-the-server]__347fd0f6._.js.map +1 -0
  302. package/web/.next/server/chunks/ssr/[root-of-the-server]__46dd2baf._.js +3 -0
  303. package/web/.next/server/chunks/ssr/[root-of-the-server]__46dd2baf._.js.map +1 -0
  304. package/web/.next/server/chunks/ssr/[root-of-the-server]__4ee8be85._.js +1 -1
  305. package/web/.next/server/chunks/ssr/[root-of-the-server]__73cb4ff6._.js +3 -0
  306. package/web/.next/server/chunks/ssr/[root-of-the-server]__73cb4ff6._.js.map +1 -0
  307. package/web/.next/server/chunks/ssr/{[root-of-the-server]__87bc4dac._.js → [root-of-the-server]__86ff0bc5._.js} +3 -3
  308. package/web/.next/server/chunks/ssr/[root-of-the-server]__86ff0bc5._.js.map +1 -0
  309. package/web/.next/server/chunks/ssr/[root-of-the-server]__91c50abe._.js +3 -0
  310. package/web/.next/server/chunks/ssr/[root-of-the-server]__91c50abe._.js.map +1 -0
  311. package/web/.next/server/chunks/ssr/[root-of-the-server]__a48af49f._.js +3 -0
  312. package/web/.next/server/chunks/ssr/[root-of-the-server]__a48af49f._.js.map +1 -0
  313. package/web/.next/server/chunks/ssr/[root-of-the-server]__bb391c45._.js +1 -1
  314. package/web/.next/server/chunks/ssr/[root-of-the-server]__bb391c45._.js.map +1 -1
  315. package/web/.next/server/chunks/ssr/[root-of-the-server]__d5e22d1a._.js +3 -0
  316. package/web/.next/server/chunks/ssr/{[root-of-the-server]__7aa484f5._.js.map → [root-of-the-server]__d5e22d1a._.js.map} +1 -1
  317. package/web/.next/server/chunks/ssr/[root-of-the-server]__dd3e834e._.js +1 -1
  318. package/web/.next/server/chunks/ssr/[root-of-the-server]__dd3e834e._.js.map +1 -1
  319. package/web/.next/server/chunks/ssr/[root-of-the-server]__e0aa2bcb._.js +3 -0
  320. package/web/.next/server/chunks/ssr/[root-of-the-server]__e0aa2bcb._.js.map +1 -0
  321. package/web/.next/server/chunks/ssr/[root-of-the-server]__e265da61._.js +1 -1
  322. package/web/.next/server/chunks/ssr/[root-of-the-server]__ef0b8905._.js +12 -0
  323. package/web/.next/server/chunks/ssr/[root-of-the-server]__ef0b8905._.js.map +1 -0
  324. package/web/.next/server/chunks/ssr/[root-of-the-server]__f5614810._.js +3 -0
  325. package/web/.next/server/chunks/ssr/{[root-of-the-server]__090f24cb._.js.map → [root-of-the-server]__f5614810._.js.map} +1 -1
  326. package/web/.next/server/chunks/ssr/[root-of-the-server]__fe5db6b2._.js +3 -0
  327. package/web/.next/server/chunks/ssr/[root-of-the-server]__fe5db6b2._.js.map +1 -0
  328. package/web/.next/server/chunks/ssr/_0f9d0acd._.js +3 -0
  329. package/web/.next/server/chunks/ssr/_0f9d0acd._.js.map +1 -0
  330. package/web/.next/server/chunks/ssr/{_177d29c6._.js → _17af2817._.js} +2 -2
  331. package/web/.next/server/chunks/ssr/{_177d29c6._.js.map → _17af2817._.js.map} +1 -1
  332. package/web/.next/server/chunks/ssr/_1879404a._.js +1 -1
  333. package/web/.next/server/chunks/ssr/_1879404a._.js.map +1 -1
  334. package/web/.next/server/chunks/ssr/_295fffde._.js.map +1 -1
  335. package/web/.next/server/chunks/ssr/_29b8ed64._.js +3 -0
  336. package/web/.next/server/chunks/ssr/_29b8ed64._.js.map +1 -0
  337. package/web/.next/server/chunks/ssr/_2bc302d1._.js +3 -0
  338. package/web/.next/server/chunks/ssr/_2bc302d1._.js.map +1 -0
  339. package/web/.next/server/chunks/ssr/_3683083e._.js +3 -0
  340. package/web/.next/server/chunks/ssr/_3683083e._.js.map +1 -0
  341. package/web/.next/server/chunks/ssr/_45496654._.js.map +1 -1
  342. package/web/.next/server/chunks/ssr/_4b57bcc3._.js +9 -0
  343. package/web/.next/server/chunks/ssr/_4b57bcc3._.js.map +1 -0
  344. package/web/.next/server/chunks/ssr/_519d77a9._.js +3 -0
  345. package/web/.next/server/chunks/ssr/_519d77a9._.js.map +1 -0
  346. package/web/.next/server/chunks/ssr/_56b9d60f._.js +1 -1
  347. package/web/.next/server/chunks/ssr/_56b9d60f._.js.map +1 -1
  348. package/web/.next/server/chunks/ssr/{_503102fc._.js → _58b8982b._.js} +2 -2
  349. package/web/.next/server/chunks/ssr/_58b8982b._.js.map +1 -0
  350. package/web/.next/server/chunks/ssr/_7e5e3270._.js +3 -0
  351. package/web/.next/server/chunks/ssr/_7e5e3270._.js.map +1 -0
  352. package/web/.next/server/chunks/ssr/_8c3086bf._.js +3 -0
  353. package/web/.next/server/chunks/ssr/_8c3086bf._.js.map +1 -0
  354. package/web/.next/server/chunks/ssr/_9173e475._.js +21 -0
  355. package/web/.next/server/chunks/ssr/_9173e475._.js.map +1 -0
  356. package/web/.next/server/chunks/ssr/_946a7fc6._.js +1 -1
  357. package/web/.next/server/chunks/ssr/_946a7fc6._.js.map +1 -1
  358. package/web/.next/server/chunks/ssr/_b4cc51d4._.js +3 -0
  359. package/web/.next/server/chunks/ssr/_b4cc51d4._.js.map +1 -0
  360. package/web/.next/server/chunks/ssr/_b5093a26._.js +3 -0
  361. package/web/.next/server/chunks/ssr/_b5093a26._.js.map +1 -0
  362. package/web/.next/server/chunks/ssr/_bc03ac82._.js +4 -0
  363. package/web/.next/server/chunks/ssr/_bc03ac82._.js.map +1 -0
  364. package/web/.next/server/chunks/ssr/_e65abbd1._.js +3 -0
  365. package/web/.next/server/chunks/ssr/_e65abbd1._.js.map +1 -0
  366. package/web/.next/server/chunks/ssr/_f20557ff._.js +3 -0
  367. package/web/.next/server/chunks/ssr/_f20557ff._.js.map +1 -0
  368. package/web/.next/server/chunks/ssr/_f86fc1bf._.js +1 -1
  369. package/web/.next/server/chunks/ssr/_f86fc1bf._.js.map +1 -1
  370. package/web/.next/server/chunks/ssr/_f8c55130._.js +1 -1
  371. package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_settings_settings-page-client_tsx_6ed9d5f8._.js +1 -1
  372. package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_settings_settings-page-client_tsx_6ed9d5f8._.js.map +1 -1
  373. package/web/.next/server/chunks/ssr/f3a1f_components_common_control-center-drawer_repository-drawer-client_tsx_39a00c03._.js +1 -1
  374. package/web/.next/server/chunks/ssr/node_modules__pnpm_28a53b5d._.js +3 -0
  375. package/web/.next/server/chunks/ssr/node_modules__pnpm_28a53b5d._.js.map +1 -0
  376. package/web/.next/server/chunks/ssr/src_presentation_web_47181610._.js +3 -0
  377. package/web/.next/server/chunks/ssr/src_presentation_web_47181610._.js.map +1 -0
  378. package/web/.next/server/chunks/ssr/src_presentation_web_5d3f4199._.js +3 -0
  379. package/web/.next/server/chunks/ssr/src_presentation_web_5d3f4199._.js.map +1 -0
  380. package/web/.next/server/chunks/ssr/src_presentation_web_6159fef8._.js +1 -1
  381. package/web/.next/server/chunks/ssr/src_presentation_web_6159fef8._.js.map +1 -1
  382. package/web/.next/server/chunks/ssr/src_presentation_web_61d96ba8._.js +3 -0
  383. package/web/.next/server/chunks/ssr/src_presentation_web_61d96ba8._.js.map +1 -0
  384. package/web/.next/server/chunks/ssr/src_presentation_web_6994959a._.js +3 -0
  385. package/web/.next/server/chunks/ssr/src_presentation_web_6994959a._.js.map +1 -0
  386. package/web/.next/server/chunks/ssr/src_presentation_web_77dadf68._.js +32 -0
  387. package/web/.next/server/chunks/ssr/src_presentation_web_77dadf68._.js.map +1 -0
  388. package/web/.next/server/chunks/ssr/src_presentation_web_9a543843._.js +3 -0
  389. package/web/.next/server/chunks/ssr/src_presentation_web_9a543843._.js.map +1 -0
  390. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_c3f6f57e.js +3 -0
  391. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_c3f6f57e.js.map +1 -0
  392. package/web/.next/server/chunks/ssr/src_presentation_web_ad42cc73._.js +1 -1
  393. package/web/.next/server/chunks/ssr/src_presentation_web_ad42cc73._.js.map +1 -1
  394. package/web/.next/server/chunks/ssr/src_presentation_web_app_actions_8514dfcd._.js +32 -0
  395. package/web/.next/server/chunks/ssr/src_presentation_web_app_actions_8514dfcd._.js.map +1 -0
  396. package/web/.next/server/chunks/ssr/src_presentation_web_b95ed206._.js +3 -0
  397. package/web/.next/server/chunks/ssr/src_presentation_web_b95ed206._.js.map +1 -0
  398. package/web/.next/server/chunks/ssr/src_presentation_web_bade80bd._.js +3 -0
  399. package/web/.next/server/chunks/ssr/src_presentation_web_bade80bd._.js.map +1 -0
  400. package/web/.next/server/chunks/ssr/src_presentation_web_c543cf3e._.js +3 -0
  401. package/web/.next/server/chunks/ssr/src_presentation_web_c543cf3e._.js.map +1 -0
  402. package/web/.next/server/chunks/ssr/src_presentation_web_components_895e5bfa._.js +1 -1
  403. package/web/.next/server/chunks/ssr/src_presentation_web_components_895e5bfa._.js.map +1 -1
  404. package/web/.next/server/chunks/ssr/src_presentation_web_components_common_base-drawer_base-drawer_tsx_97dfbbc8._.js +1 -1
  405. package/web/.next/server/chunks/ssr/src_presentation_web_components_common_base-drawer_base-drawer_tsx_97dfbbc8._.js.map +1 -1
  406. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_skills_8a174cac._.js +1 -1
  407. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_skills_8a174cac._.js.map +1 -1
  408. package/web/.next/server/chunks/ssr/src_presentation_web_components_ui_dropdown-menu_tsx_229332e3._.js +3 -0
  409. package/web/.next/server/chunks/ssr/src_presentation_web_components_ui_dropdown-menu_tsx_229332e3._.js.map +1 -0
  410. package/web/.next/server/chunks/ssr/translations_1562ae1a._.js +3 -0
  411. package/web/.next/server/chunks/ssr/translations_1562ae1a._.js.map +1 -0
  412. package/web/.next/server/pages/500.html +2 -2
  413. package/web/.next/server/server-reference-manifest.js +1 -1
  414. package/web/.next/server/server-reference-manifest.json +184 -72
  415. package/web/.next/static/chunks/{b4aa3a83f2451e07.js → 05becd66afb22d37.js} +1 -1
  416. package/web/.next/static/chunks/1bd2a325f95d3211.js +2 -0
  417. package/web/.next/static/chunks/2cbe80f8e84d59a8.js +1 -0
  418. package/web/.next/static/chunks/37e434e579ecfa02.js +1 -0
  419. package/web/.next/static/chunks/3aaae7ceefe72828.js +7 -0
  420. package/web/.next/static/chunks/3d1543ff12dfaff1.js +1 -0
  421. package/web/.next/static/chunks/{ac22076c64634ac1.js → 4b8bedfda131650a.js} +1 -1
  422. package/web/.next/static/chunks/{83fc7ea32e18c9a5.js → 4ea617a22e21fb04.js} +1 -1
  423. package/web/.next/static/chunks/53f12c1844f881af.js +1 -0
  424. package/web/.next/static/chunks/5795b9f399523c9e.js +1 -0
  425. package/web/.next/static/chunks/{2fe20598e1b4793a.js → 6b2859ea368e7df3.js} +3 -3
  426. package/web/.next/static/chunks/71c7fe96accaab17.js +19 -0
  427. package/web/.next/static/chunks/792fffaa4af33248.js +1 -0
  428. package/web/.next/static/chunks/{87a0df5389e06641.js → 7b6c91400184cb4d.js} +1 -1
  429. package/web/.next/static/chunks/83ba6946af31cdc4.js +3 -0
  430. package/web/.next/static/chunks/897771202f55ecfe.js +1 -0
  431. package/web/.next/static/chunks/9d9bf7403612ae86.js +1 -0
  432. package/web/.next/static/chunks/{be2e80436bc15812.js → a9d2a436d682fded.js} +3 -3
  433. package/web/.next/static/chunks/adf16efe8bac05e9.css +1 -0
  434. package/web/.next/static/chunks/{ceff12f8a2e5bc08.js → ae2fcb50ea0d8652.js} +1 -1
  435. package/web/.next/static/chunks/b0474319e5a50043.js +1 -0
  436. package/web/.next/static/chunks/b85532fb1545927c.js +5 -0
  437. package/web/.next/static/chunks/{33dc7a1041f4ab64.js → b8acda37576199f1.js} +1 -1
  438. package/web/.next/static/chunks/c788a245f6898401.js +1 -0
  439. package/web/.next/static/chunks/d0bcde99ca2878d1.js +1 -0
  440. package/web/.next/static/chunks/{de7de1db2a8788dd.js → ed714d3a13ff6c16.js} +1 -1
  441. package/web/.next/server/chunks/ssr/[root-of-the-server]__013a0318._.js +0 -3
  442. package/web/.next/server/chunks/ssr/[root-of-the-server]__013a0318._.js.map +0 -1
  443. package/web/.next/server/chunks/ssr/[root-of-the-server]__090f24cb._.js +0 -3
  444. package/web/.next/server/chunks/ssr/[root-of-the-server]__24756fa9._.js +0 -12
  445. package/web/.next/server/chunks/ssr/[root-of-the-server]__24756fa9._.js.map +0 -1
  446. package/web/.next/server/chunks/ssr/[root-of-the-server]__70986695._.js +0 -3
  447. package/web/.next/server/chunks/ssr/[root-of-the-server]__70986695._.js.map +0 -1
  448. package/web/.next/server/chunks/ssr/[root-of-the-server]__7aa484f5._.js +0 -3
  449. package/web/.next/server/chunks/ssr/[root-of-the-server]__87bc4dac._.js.map +0 -1
  450. package/web/.next/server/chunks/ssr/[root-of-the-server]__a3a4ddef._.js +0 -3
  451. package/web/.next/server/chunks/ssr/[root-of-the-server]__a3a4ddef._.js.map +0 -1
  452. package/web/.next/server/chunks/ssr/[root-of-the-server]__a4222b95._.js +0 -3
  453. package/web/.next/server/chunks/ssr/[root-of-the-server]__a4222b95._.js.map +0 -1
  454. package/web/.next/server/chunks/ssr/[root-of-the-server]__a5ea76a6._.js +0 -3
  455. package/web/.next/server/chunks/ssr/[root-of-the-server]__a5ea76a6._.js.map +0 -1
  456. package/web/.next/server/chunks/ssr/[root-of-the-server]__a6f2b763._.js +0 -3
  457. package/web/.next/server/chunks/ssr/[root-of-the-server]__a6f2b763._.js.map +0 -1
  458. package/web/.next/server/chunks/ssr/[root-of-the-server]__f3ca7bea._.js +0 -3
  459. package/web/.next/server/chunks/ssr/[root-of-the-server]__f3ca7bea._.js.map +0 -1
  460. package/web/.next/server/chunks/ssr/_0277d3b5._.js +0 -21
  461. package/web/.next/server/chunks/ssr/_0277d3b5._.js.map +0 -1
  462. package/web/.next/server/chunks/ssr/_21cc662b._.js +0 -3
  463. package/web/.next/server/chunks/ssr/_21cc662b._.js.map +0 -1
  464. package/web/.next/server/chunks/ssr/_44531b76._.js +0 -9
  465. package/web/.next/server/chunks/ssr/_44531b76._.js.map +0 -1
  466. package/web/.next/server/chunks/ssr/_503102fc._.js.map +0 -1
  467. package/web/.next/server/chunks/ssr/_575fe3ee._.js +0 -3
  468. package/web/.next/server/chunks/ssr/_575fe3ee._.js.map +0 -1
  469. package/web/.next/server/chunks/ssr/_869a3a15._.js +0 -3
  470. package/web/.next/server/chunks/ssr/_869a3a15._.js.map +0 -1
  471. package/web/.next/server/chunks/ssr/_a7184dfa._.js +0 -3
  472. package/web/.next/server/chunks/ssr/_a7184dfa._.js.map +0 -1
  473. package/web/.next/server/chunks/ssr/_b227ff50._.js +0 -3
  474. package/web/.next/server/chunks/ssr/_b227ff50._.js.map +0 -1
  475. package/web/.next/server/chunks/ssr/_e071ba48._.js +0 -3
  476. package/web/.next/server/chunks/ssr/_e071ba48._.js.map +0 -1
  477. package/web/.next/server/chunks/ssr/_eff1b518._.js +0 -3
  478. package/web/.next/server/chunks/ssr/_eff1b518._.js.map +0 -1
  479. package/web/.next/server/chunks/ssr/_f227429a._.js +0 -3
  480. package/web/.next/server/chunks/ssr/_f227429a._.js.map +0 -1
  481. package/web/.next/server/chunks/ssr/src_presentation_web_36f2bc45._.js +0 -3
  482. package/web/.next/server/chunks/ssr/src_presentation_web_36f2bc45._.js.map +0 -1
  483. package/web/.next/server/chunks/ssr/src_presentation_web_486908de._.js +0 -3
  484. package/web/.next/server/chunks/ssr/src_presentation_web_486908de._.js.map +0 -1
  485. package/web/.next/server/chunks/ssr/src_presentation_web_5c3596bc._.js +0 -3
  486. package/web/.next/server/chunks/ssr/src_presentation_web_5c3596bc._.js.map +0 -1
  487. package/web/.next/server/chunks/ssr/src_presentation_web_6326f81e._.js +0 -3
  488. package/web/.next/server/chunks/ssr/src_presentation_web_6326f81e._.js.map +0 -1
  489. package/web/.next/server/chunks/ssr/src_presentation_web_6b2fdcd8._.js +0 -3
  490. package/web/.next/server/chunks/ssr/src_presentation_web_6b2fdcd8._.js.map +0 -1
  491. package/web/.next/server/chunks/ssr/src_presentation_web_74703c9f._.js +0 -3
  492. package/web/.next/server/chunks/ssr/src_presentation_web_74703c9f._.js.map +0 -1
  493. package/web/.next/server/chunks/ssr/src_presentation_web_a8056dac._.js +0 -3
  494. package/web/.next/server/chunks/ssr/src_presentation_web_a8056dac._.js.map +0 -1
  495. package/web/.next/server/chunks/ssr/src_presentation_web_app_actions_open-ide_ts_baaca5d5._.js +0 -32
  496. package/web/.next/server/chunks/ssr/src_presentation_web_app_actions_open-ide_ts_baaca5d5._.js.map +0 -1
  497. package/web/.next/server/chunks/ssr/src_presentation_web_b00bfb08._.js +0 -3
  498. package/web/.next/server/chunks/ssr/src_presentation_web_b00bfb08._.js.map +0 -1
  499. package/web/.next/server/chunks/ssr/src_presentation_web_ca99d62d._.js +0 -3
  500. package/web/.next/server/chunks/ssr/src_presentation_web_ca99d62d._.js.map +0 -1
  501. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js +0 -3
  502. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js.map +0 -1
  503. package/web/.next/server/chunks/ssr/src_presentation_web_f1edcf5e._.js +0 -3
  504. package/web/.next/server/chunks/ssr/src_presentation_web_f1edcf5e._.js.map +0 -1
  505. package/web/.next/server/chunks/ssr/src_presentation_web_f9436804._.js +0 -3
  506. package/web/.next/server/chunks/ssr/src_presentation_web_f9436804._.js.map +0 -1
  507. package/web/.next/server/chunks/ssr/translations_23dd5e7e._.js +0 -3
  508. package/web/.next/server/chunks/ssr/translations_23dd5e7e._.js.map +0 -1
  509. package/web/.next/static/chunks/06b9d6dbf635c370.css +0 -1
  510. package/web/.next/static/chunks/1ae0cf5be30ef398.js +0 -1
  511. package/web/.next/static/chunks/2424ab50273fe1d9.js +0 -7
  512. package/web/.next/static/chunks/6afd16b2fe544054.js +0 -2
  513. package/web/.next/static/chunks/7604027076448f2b.js +0 -19
  514. package/web/.next/static/chunks/8c9016ab8c1f6204.js +0 -1
  515. package/web/.next/static/chunks/927442d2628f6e22.js +0 -1
  516. package/web/.next/static/chunks/94e8559ae19a16e1.js +0 -1
  517. package/web/.next/static/chunks/a0cfca1e5fd467e9.js +0 -1
  518. package/web/.next/static/chunks/a2531137c7d36d54.js +0 -7
  519. package/web/.next/static/chunks/b87904ecdddde972.js +0 -1
  520. package/web/.next/static/chunks/b99506a6f7bc2fa8.js +0 -1
  521. package/web/.next/static/chunks/e4f0ca20b62bd66f.js +0 -1
  522. /package/web/.next/static/{EVCmRtpgNX9ebXGb-bV1G → tAvYhk4e_F_yStLz4wtDg}/_buildManifest.js +0 -0
  523. /package/web/.next/static/{EVCmRtpgNX9ebXGb-bV1G → tAvYhk4e_F_yStLz4wtDg}/_clientMiddlewareManifest.json +0 -0
  524. /package/web/.next/static/{EVCmRtpgNX9ebXGb-bV1G → tAvYhk4e_F_yStLz4wtDg}/_ssgManifest.js +0 -0
@@ -1,13 +1,15 @@
1
1
  'use client';
2
2
  import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
3
3
  import { useCallback, useEffect, useRef, useState } from 'react';
4
- import { useRouter } from 'next/navigation';
5
4
  import { useQuery } from '@tanstack/react-query';
6
5
  import { toast } from 'sonner';
7
- import { ArrowLeft, LayoutGrid, GitBranch, Copy, FolderOpen, ClipboardList, Cpu, FilePlus, FilePen, } from 'lucide-react';
6
+ import { LayoutGrid, GitBranch, Copy, FolderOpen, ClipboardList, Cpu, FilePlus, FilePen, Trash2, } from 'lucide-react';
7
+ import { useRouter } from 'next/navigation';
8
8
  import { DeploymentState } from '../../../../../../packages/core/src/domain/generated/output.js';
9
9
  import { cn } from '../../../lib/utils.js';
10
10
  import { Button } from '../../ui/button.js';
11
+ import { Dialog, DialogClose, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, } from '../../ui/dialog.js';
12
+ import { deleteApplication } from '../../../app/actions/delete-application.js';
11
13
  import { ChatTab } from '../../features/chat/ChatTab.js';
12
14
  import { APPLICATION_CREATION_PLACEHOLDER_STEPS } from '../../features/chat/workflow-placeholder.js';
13
15
  import { TerminalTab } from '../../features/application-page/terminal-tab.js';
@@ -16,6 +18,7 @@ import { RunDevButton } from '../../features/application-page/run-dev-button.js'
16
18
  import { WebPreviewTab } from '../../features/application-page/web-preview-tab.js';
17
19
  import { useDeployAction } from '../../../hooks/use-deploy-action.js';
18
20
  import { useTurnStatus } from '../../../hooks/turn-statuses-provider.js';
21
+ import { deriveAppLiveStatus } from '../../../lib/derive-app-status.js';
19
22
  import { chatQueryKey, fetchChatState } from '../../features/chat/chat-state-query.js';
20
23
  import { openFolder } from '../../../app/actions/open-folder.js';
21
24
  import { getApplicationDebugPrompt } from '../../../app/actions/get-application-debug-prompt.js';
@@ -35,35 +38,8 @@ const VIEW_LABELS = {
35
38
  terminal: 'Terminal',
36
39
  web: 'Web',
37
40
  };
38
- /**
39
- * Derive a single effective status label + dot color. "Idle" is
40
- * never shown. MUST match the priority order in
41
- * `components/common/application-node/application-node.tsx` so the
42
- * canvas card and the application page agree on every parameter.
43
- *
44
- * Priority (highest wins):
45
- *
46
- * - `processing` → "In Progress" (agent actively running a turn)
47
- * - `awaiting_input` → "Warning" (agent blocked on user question)
48
- * - deployReady → "Live" (dev server running at a real URL)
49
- * - persisted Error → "Error"
50
- * - otherwise → "Ready" (agent finished, preview not running)
51
- */
52
- function deriveLiveStatusPill(persistedStatus, turnStatus, deployReady) {
53
- if (turnStatus === 'processing') {
54
- return { label: 'In Progress', dotClass: 'bg-violet-500', pulse: true };
55
- }
56
- if (turnStatus === 'awaiting_input') {
57
- return { label: 'Warning', dotClass: 'bg-amber-500', pulse: true };
58
- }
59
- if (deployReady) {
60
- return { label: 'Live', dotClass: 'bg-emerald-500', pulse: true };
61
- }
62
- if (persistedStatus === 'Error') {
63
- return { label: 'Error', dotClass: 'bg-red-500', pulse: false };
64
- }
65
- return { label: 'Ready', dotClass: 'bg-sky-500', pulse: false };
66
- }
41
+ /* Status derivation is shared with canvas nodes and application cards
42
+ * via `lib/derive-app-status.ts` single source of truth. */
67
43
  /* ------------------------------------------------------------------ */
68
44
  /* Short path helper */
69
45
  /* ------------------------------------------------------------------ */
@@ -73,8 +49,8 @@ function shortPath(path) {
73
49
  const idx = normalized.lastIndexOf('/');
74
50
  return idx === -1 ? normalized : normalized.slice(idx + 1);
75
51
  }
76
- function AppTopBar({ application, activeView, onViewChange, onBack, initialChatState, deploy, }) {
77
- return (_jsxs("header", { className: cn('bg-background/95 supports-[backdrop-filter]:bg-background/70 sticky top-0 z-20 flex shrink-0 items-center gap-2 border-b px-3 backdrop-blur', TOP_BAR_HEIGHT_CLASS), children: [_jsx(Button, { variant: "ghost", size: "icon", "aria-label": "Back to canvas", onClick: onBack, className: "h-7 w-7", children: _jsx(ArrowLeft, { className: "h-3.5 w-3.5" }) }), _jsx("div", { className: "flex h-6 w-6 shrink-0 items-center justify-center rounded-md bg-gradient-to-br from-indigo-500 to-violet-500", children: _jsx(LayoutGrid, { className: "h-3 w-3 text-white" }) }), _jsx("h1", { className: "min-w-0 truncate text-sm font-semibold", children: application.name }), _jsx(StatusPill, { applicationId: application.id, persistedStatus: application.status, deployReady: deploy.status === DeploymentState.Ready }), _jsx(Divider, {}), _jsx(PathCluster, { repositoryPath: application.repositoryPath }), _jsx("div", { className: "flex-1" }), _jsx(SessionChip, { featureId: `app-${application.id}`, initialChatState: initialChatState }), _jsx(CopyPromptButton, { applicationId: application.id }), _jsx(RunDevButton, { deploy: deploy }), _jsx(ViewSwitcher, { active: activeView, onChange: onViewChange })] }));
52
+ function AppTopBar({ application, activeView, onViewChange, agentRunning, initialChatState, deploy, }) {
53
+ return (_jsxs("header", { className: cn('bg-background/95 supports-[backdrop-filter]:bg-background/70 sticky top-0 z-20 flex shrink-0 items-center gap-2 border-b px-3 backdrop-blur', TOP_BAR_HEIGHT_CLASS), children: [_jsx("div", { className: "flex h-6 w-6 shrink-0 items-center justify-center rounded-md bg-gradient-to-br from-indigo-500 to-violet-500", children: _jsx(LayoutGrid, { className: "h-3 w-3 text-white" }) }), _jsx("h1", { className: "min-w-0 truncate text-sm font-semibold", children: application.name }), _jsx(StatusPill, { applicationId: application.id, persistedStatus: application.status, deployReady: deploy.status === DeploymentState.Ready }), _jsx(Divider, {}), _jsx(PathCluster, { repositoryPath: application.repositoryPath }), _jsx("div", { className: "flex-1" }), _jsx(SessionChip, { featureId: `app-${application.id}`, initialChatState: initialChatState, persistedSessionId: application.agentSessionId }), _jsx(CopyPromptButton, { applicationId: application.id }), _jsx(DeleteButton, { applicationId: application.id, applicationName: application.name }), _jsx(RunDevButton, { deploy: deploy, disabled: agentRunning }), _jsx(ViewSwitcher, { active: activeView, onChange: onViewChange, disabledTabs: agentRunning ? ['web'] : [] })] }));
78
54
  }
79
55
  /* ------------------------------------------------------------------ */
80
56
  /* Path cluster — short path + copy + open-in-file-manager */
@@ -135,12 +111,7 @@ function GitStatusCluster({ repositoryPath }) {
135
111
  /* ------------------------------------------------------------------ */
136
112
  /* Session chip — model + short session id, live via shared query */
137
113
  /* ------------------------------------------------------------------ */
138
- function SessionChip({ featureId, initialChatState, }) {
139
- // Reads from the SAME TanStack Query cache entry the chat tab uses.
140
- // The `message`/`session_status`/`turn_status` SSE events inside
141
- // ChatTab's useChatRuntime mutate this cache directly, so the chip
142
- // updates live as the session transitions booting → ready and the
143
- // SDK reports back its assigned session id.
114
+ function SessionChip({ featureId, initialChatState, persistedSessionId, }) {
144
115
  const { data: chatState } = useQuery({
145
116
  queryKey: chatQueryKey(featureId),
146
117
  queryFn: () => fetchChatState(featureId),
@@ -150,7 +121,9 @@ function SessionChip({ featureId, initialChatState, }) {
150
121
  refetchOnReconnect: false,
151
122
  });
152
123
  const sessionInfo = chatState?.sessionInfo;
153
- const sessionId = sessionInfo?.sessionId ?? null;
124
+ // Prefer the persisted ID from the Application entity (always available),
125
+ // fall back to the live session info (only available while session is active).
126
+ const sessionId = persistedSessionId ?? sessionInfo?.sessionId ?? null;
154
127
  const model = sessionInfo?.model ?? null;
155
128
  const shortId = sessionId ? sessionId.slice(0, 8) : null;
156
129
  const handleCopy = useCallback(async () => {
@@ -201,6 +174,21 @@ function CopyPromptButton({ applicationId }) {
201
174
  }, [applicationId, busy]);
202
175
  return (_jsx(Button, { variant: "ghost", size: "icon", onClick: handleClick, disabled: busy, className: "text-muted-foreground hover:text-foreground h-7 w-7", "aria-label": "Copy full generated prompt (debug)", title: "Copy full generated prompt (debug) \u2014 system + user message", children: _jsx(ClipboardList, { className: "h-3.5 w-3.5" }) }));
203
176
  }
177
+ function DeleteButton({ applicationId, applicationName, }) {
178
+ const router = useRouter();
179
+ const [confirmOpen, setConfirmOpen] = useState(false);
180
+ return (_jsxs(_Fragment, { children: [_jsx(Button, { variant: "ghost", size: "icon", onClick: () => setConfirmOpen(true), className: "text-muted-foreground hover:text-destructive h-7 w-7", "aria-label": "Delete application", title: "Delete application", children: _jsx(Trash2, { className: "h-3.5 w-3.5" }) }), _jsx(Dialog, { open: confirmOpen, onOpenChange: setConfirmOpen, children: _jsxs(DialogContent, { className: "max-w-xs", children: [_jsxs(DialogHeader, { children: [_jsx(DialogTitle, { children: "Delete application?" }), _jsxs(DialogDescription, { children: ["This will permanently remove ", _jsx("strong", { children: applicationName }), "."] })] }), _jsxs(DialogFooter, { className: "grid grid-cols-2 gap-2 sm:flex-none", children: [_jsx(DialogClose, { asChild: true, children: _jsx(Button, { variant: "outline", children: "Cancel" }) }), _jsx(Button, { variant: "destructive", onClick: async () => {
181
+ setConfirmOpen(false);
182
+ const result = await deleteApplication(applicationId);
183
+ if (result.error) {
184
+ toast.error('Failed to delete', { description: result.error });
185
+ }
186
+ else {
187
+ toast.success('Application deleted');
188
+ router.push('/applications');
189
+ }
190
+ }, children: "Delete" })] })] }) })] }));
191
+ }
204
192
  function StatusPill({ applicationId, persistedStatus, deployReady, }) {
205
193
  // Read live turn status from the global SSE subscription and fold
206
194
  // it PLUS the dev-server deploy state onto the persisted status so
@@ -208,18 +196,19 @@ function StatusPill({ applicationId, persistedStatus, deployReady, }) {
208
196
  // "Unread" / "Live") instead of being stuck at the coarse DB
209
197
  // snapshot which almost always reads "Idle".
210
198
  const turnStatus = useTurnStatus(`app-${applicationId}`);
211
- const live = deriveLiveStatusPill(persistedStatus, turnStatus, deployReady);
199
+ const live = deriveAppLiveStatus(persistedStatus, turnStatus, deployReady);
212
200
  return (_jsxs("span", { className: "border-border/60 inline-flex h-5 shrink-0 items-center gap-1 rounded-full border px-2 text-[10px] font-medium tracking-wide uppercase", children: [_jsx("span", { className: cn('relative flex h-1.5 w-1.5 items-center justify-center rounded-full', live.dotClass), children: live.pulse ? (_jsx("span", { className: cn('absolute inline-flex h-full w-full animate-ping rounded-full opacity-60', live.dotClass) })) : null }), live.label] }));
213
201
  }
214
202
  function Divider() {
215
203
  return _jsx("span", { className: "bg-border/60 mx-1 h-4 w-px shrink-0" });
216
204
  }
217
- function ViewSwitcher({ active, onChange, }) {
205
+ function ViewSwitcher({ active, onChange, disabledTabs = [], }) {
218
206
  return (_jsx("div", { role: "tablist", "aria-label": "Right pane view", className: "bg-muted/60 flex items-center rounded-md p-0.5", children: VIEW_TABS.map((v) => {
219
207
  const selected = v === active;
220
- return (_jsx("button", { type: "button", role: "tab", "aria-selected": selected, onClick: () => onChange(v), className: cn('h-6 cursor-pointer rounded-sm px-2.5 text-[11px] font-medium transition-colors', selected
208
+ const disabled = disabledTabs.includes(v);
209
+ return (_jsx("button", { type: "button", role: "tab", "aria-selected": selected, "aria-disabled": disabled, disabled: disabled, onClick: () => onChange(v), className: cn('h-6 rounded-sm px-2.5 text-[11px] font-medium transition-colors', disabled ? 'text-muted-foreground/40 cursor-not-allowed' : 'cursor-pointer', !disabled && selected
221
210
  ? 'bg-background text-foreground shadow-sm'
222
- : 'text-muted-foreground hover:text-foreground'), children: VIEW_LABELS[v] }, v));
211
+ : !disabled && 'text-muted-foreground hover:text-foreground'), children: VIEW_LABELS[v] }, v));
223
212
  }) }));
224
213
  }
225
214
  /* ------------------------------------------------------------------ */
@@ -271,7 +260,6 @@ function ViewBody({ activeView, applicationId, terminalCwd, deploy, }) {
271
260
  return (_jsxs("div", { className: "relative flex min-h-0 flex-1", children: [_jsx("div", { className: cn('absolute inset-0 flex min-h-0 flex-col', activeView === 'terminal' ? 'visible' : 'pointer-events-none invisible'), "aria-hidden": activeView !== 'terminal', children: _jsx(TerminalTab, { cwd: terminalCwd }) }), _jsx("div", { className: cn('absolute inset-0 flex min-h-0 flex-col', activeView === 'ide' ? 'visible' : 'pointer-events-none invisible'), "aria-hidden": activeView !== 'ide', children: _jsx(IdeTab, { applicationId: applicationId }) }), hasWebContent ? (_jsx("div", { className: cn('absolute inset-0 flex min-h-0 flex-col', activeView === 'web' ? 'visible' : 'pointer-events-none invisible'), "aria-hidden": activeView !== 'web', children: _jsx(WebPreviewTab, { deploy: deploy }) })) : (activeView === 'web' && _jsx(WebPreviewTab, { deploy: deploy }))] }));
272
261
  }
273
262
  export function ApplicationPage({ application, initialChatState }) {
274
- const router = useRouter();
275
263
  const [activeView, setActiveView] = useState('ide');
276
264
  // Hoisted dev-server state — subscribes to the shared
277
265
  // DeploymentStatusProvider scoped to this application's id. The server
@@ -285,6 +273,39 @@ export function ApplicationPage({ application, initialChatState }) {
285
273
  targetType: 'application',
286
274
  repositoryPath: application.repositoryPath,
287
275
  });
276
+ // ── Agent-running detection ────────────────────────────────
277
+ // While the agent is processing, the dev server is likely being
278
+ // modified — disable preview and auto-restart when done.
279
+ const turnStatus = useTurnStatus(`app-${application.id}`);
280
+ const agentRunning = turnStatus === 'processing';
281
+ const prevAgentRunningRef = useRef(false);
282
+ // Track whether the dev server was running before the agent started,
283
+ // so we only restart it (not cold-start) after the agent finishes.
284
+ const wasRunningBeforeAgentRef = useRef(false);
285
+ useEffect(() => {
286
+ const wasRunning = prevAgentRunningRef.current;
287
+ prevAgentRunningRef.current = agentRunning;
288
+ if (agentRunning && !wasRunning) {
289
+ // Agent just started — stop the dev server if running, remember
290
+ // that it was running so we can restart after.
291
+ if (deploy.status === DeploymentState.Ready || deploy.status === DeploymentState.Booting) {
292
+ wasRunningBeforeAgentRef.current = true;
293
+ void deploy.stop();
294
+ }
295
+ // Switch away from web tab while agent works
296
+ if (activeView === 'web') {
297
+ setActiveView('ide');
298
+ }
299
+ }
300
+ if (!agentRunning && wasRunning) {
301
+ // Agent just finished — restart the dev server if it was
302
+ // previously running.
303
+ if (wasRunningBeforeAgentRef.current) {
304
+ wasRunningBeforeAgentRef.current = false;
305
+ void deploy.deploy();
306
+ }
307
+ }
308
+ }, [agentRunning, deploy, activeView]);
288
309
  // When the dev server transitions to Ready, auto-switch the right
289
310
  // pane to the Web tab the first time it happens so the user
290
311
  // immediately sees their app without an extra click. Only triggers
@@ -299,15 +320,15 @@ export function ApplicationPage({ application, initialChatState }) {
299
320
  hasAutoSwitchedRef.current = false;
300
321
  }
301
322
  }, [deploy.status, deploy.url]);
302
- // Back control center. We navigate AND refresh so the dashboard layout
303
- // re-runs `getGraphData()` server-side. Without `router.refresh()` the
304
- // App Router serves the cached RSC from when the user was last on `/`,
305
- // which does NOT include the application they just created.
306
- const handleBack = useCallback(() => {
307
- router.push('/');
308
- router.refresh();
309
- }, [router]);
310
- return (_jsxs("div", { className: "bg-background flex h-dvh flex-col", children: [_jsx(AppTopBar, { application: application, activeView: activeView, onViewChange: setActiveView, onBack: handleBack, initialChatState: initialChatState, deploy: deploy }), _jsx(ResizableSplit, { left: _jsx(ChatTab, { featureId: `app-${application.id}`, worktreePath: application.repositoryPath, initialAgent: application.agentType, initialModel: application.modelOverride, initialChatState: initialChatState, hideHeader: true, workflowPlaceholder: APPLICATION_CREATION_PLACEHOLDER_STEPS, onAllStepsComplete: () => {
323
+ // Prevent switching to web tab while agent is running
324
+ const handleViewChange = useCallback((view) => {
325
+ if (view === 'web' && agentRunning)
326
+ return;
327
+ setActiveView(view);
328
+ }, [agentRunning]);
329
+ return (_jsxs("div", { className: "bg-background flex h-dvh flex-col", children: [_jsx(AppTopBar, { application: application, activeView: activeView, onViewChange: handleViewChange, agentRunning: agentRunning, initialChatState: initialChatState, deploy: deploy }), _jsx(ResizableSplit, { left: _jsx(ChatTab, { featureId: `app-${application.id}`, worktreePath: application.repositoryPath, initialAgent: application.agentType, initialModel: application.modelOverride, initialChatState: initialChatState, hideHeader: true, workflowPlaceholder: APPLICATION_CREATION_PLACEHOLDER_STEPS, onResumeWorkflow: () => {
330
+ void fetch(`/api/applications/${application.id}/resume`, { method: 'POST' });
331
+ }, onAllStepsComplete: () => {
311
332
  // Kick off the dev server as soon as the agent has
312
333
  // finished the scaffold workflow. The Idle→Ready
313
334
  // transition in the deploy hook then auto-switches
@@ -1 +1 @@
1
- {"version":3,"file":"application-page.stories.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/features/application-page/application-page.stories.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAgBrD,QAAA,MAAM,IAAI,EAAE,IAAI,CAAC,OAAO,eAAe,CAOtC,CAAC;AAEF,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,IAAI,CAAC,CAAC;AAEnC,eAAO,MAAM,OAAO,EAAE,KAIrB,CAAC;AAEF,eAAO,MAAM,MAAM,EAAE,KAWpB,CAAC;AAEF,eAAO,MAAM,UAAU,EAAE,KAWxB,CAAC"}
1
+ {"version":3,"file":"application-page.stories.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/features/application-page/application-page.stories.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAiBrD,QAAA,MAAM,IAAI,EAAE,IAAI,CAAC,OAAO,eAAe,CAOtC,CAAC;AAEF,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,IAAI,CAAC,CAAC;AAEnC,eAAO,MAAM,OAAO,EAAE,KAIrB,CAAC;AAEF,eAAO,MAAM,MAAM,EAAE,KAWpB,CAAC;AAEF,eAAO,MAAM,UAAU,EAAE,KAWxB,CAAC"}
@@ -8,6 +8,7 @@ const baseApp = {
8
8
  repositoryPath: '/home/user/projects/my-todo-app',
9
9
  additionalPaths: [],
10
10
  status: ApplicationStatus.Idle,
11
+ setupComplete: false,
11
12
  createdAt: new Date().toISOString(),
12
13
  updatedAt: new Date().toISOString(),
13
14
  };
@@ -2,6 +2,8 @@ import type { DeployActionState } from '../../../hooks/use-deploy-action.js';
2
2
  export interface RunDevButtonProps {
3
3
  deploy: DeployActionState;
4
4
  className?: string;
5
+ /** When true the button is grayed out and non-interactive (e.g. agent is running). */
6
+ disabled?: boolean;
5
7
  /**
6
8
  * Visual density of the Ready state.
7
9
  *
@@ -15,5 +17,5 @@ export interface RunDevButtonProps {
15
17
  */
16
18
  variant?: 'full' | 'compact';
17
19
  }
18
- export declare function RunDevButton({ deploy, className, variant }: RunDevButtonProps): import("react/jsx-runtime").JSX.Element;
20
+ export declare function RunDevButton({ deploy, className, disabled, variant }: RunDevButtonProps): import("react/jsx-runtime").JSX.Element;
19
21
  //# sourceMappingURL=run-dev-button.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"run-dev-button.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/features/application-page/run-dev-button.tsx"],"names":[],"mappings":"AAoCA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAEnE,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,iBAAiB,CAAC;IAC1B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;;;;;;;;OAUG;IACH,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAC9B;AAED,wBAAgB,YAAY,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,OAAgB,EAAE,EAAE,iBAAiB,2CAuJtF"}
1
+ {"version":3,"file":"run-dev-button.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/features/application-page/run-dev-button.tsx"],"names":[],"mappings":"AAoCA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAEnE,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,iBAAiB,CAAC;IAC1B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,sFAAsF;IACtF,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB;;;;;;;;;;OAUG;IACH,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAC9B;AAED,wBAAgB,YAAY,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,OAAgB,EAAE,EAAE,iBAAiB,2CA+JhG"}
@@ -33,7 +33,7 @@ import { useCallback } from 'react';
33
33
  import { Play, Square, Loader2, TriangleAlert, ExternalLink } from 'lucide-react';
34
34
  import { DeploymentState } from '../../../../../../packages/core/src/domain/generated/output.js';
35
35
  import { cn } from '../../../lib/utils.js';
36
- export function RunDevButton({ deploy, className, variant = 'full' }) {
36
+ export function RunDevButton({ deploy, className, disabled, variant = 'full' }) {
37
37
  const openUrl = useCallback(() => {
38
38
  if (deploy.url)
39
39
  window.open(deploy.url, '_blank', 'noopener,noreferrer');
@@ -76,5 +76,9 @@ export function RunDevButton({ deploy, className, variant = 'full' }) {
76
76
  // ────────────────────────────────────────────────────────────
77
77
  // Idle — default "Preview" button (Shep AI purple)
78
78
  // ────────────────────────────────────────────────────────────
79
- return (_jsxs("button", { type: "button", onClick: deploy.deploy, className: cn('inline-flex h-7 shrink-0 items-center gap-1.5 rounded-md border border-violet-500/50 bg-gradient-to-br from-indigo-500/15 to-violet-500/20 px-2.5 text-[11px] font-medium text-violet-700 transition-colors hover:from-indigo-500/25 hover:to-violet-500/30 dark:text-violet-300', className), title: "Install dependencies and preview the app", "aria-label": "Preview app", children: [_jsx(Play, { className: "h-3 w-3 fill-current" }), _jsx("span", { children: "Preview" })] }));
79
+ return (_jsxs("button", { type: "button", onClick: deploy.deploy, disabled: disabled, className: cn('inline-flex h-7 shrink-0 items-center gap-1.5 rounded-md border px-2.5 text-[11px] font-medium transition-colors', disabled
80
+ ? 'border-border bg-muted text-muted-foreground/40 cursor-not-allowed'
81
+ : 'border-violet-500/50 bg-gradient-to-br from-indigo-500/15 to-violet-500/20 text-violet-700 hover:from-indigo-500/25 hover:to-violet-500/30 dark:text-violet-300', className), title: disabled
82
+ ? 'Preview disabled while agent is running'
83
+ : 'Install dependencies and preview the app', "aria-label": "Preview app", children: [_jsx(Play, { className: "h-3 w-3 fill-current" }), _jsx("span", { children: "Preview" })] }));
80
84
  }
@@ -0,0 +1,7 @@
1
+ import type { ApplicationWithStatus } from '../../../../../../packages/core/src/application/use-cases/applications/list-applications.use-case.js';
2
+ export interface ApplicationCardProps {
3
+ application: ApplicationWithStatus;
4
+ className?: string;
5
+ }
6
+ export declare function ApplicationCard({ application, className }: ApplicationCardProps): import("react/jsx-runtime").JSX.Element;
7
+ //# sourceMappingURL=application-card.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"application-card.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/features/applications/application-card.tsx"],"names":[],"mappings":"AAkCA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,4EAA4E,CAAC;AAExH,MAAM,WAAW,oBAAoB;IACnC,WAAW,EAAE,qBAAqB,CAAC;IACnC,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAID,wBAAgB,eAAe,CAAC,EAAE,WAAW,EAAE,SAAS,EAAE,EAAE,oBAAoB,2CA0O/E"}
@@ -0,0 +1,82 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
3
+ import { useRouter } from 'next/navigation';
4
+ import { useState } from 'react';
5
+ import { AlertTriangle, ExternalLink, FolderGit2, Globe, LayoutGrid, Loader2, Play, Square, Trash2, TriangleAlert, } from 'lucide-react';
6
+ import { useQueryClient } from '@tanstack/react-query';
7
+ import { toast } from 'sonner';
8
+ import { cn } from '../../../lib/utils.js';
9
+ import { Button } from '../../ui/button.js';
10
+ import { Dialog, DialogClose, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, } from '../../ui/dialog.js';
11
+ import { deleteApplication } from '../../../app/actions/delete-application.js';
12
+ import { deriveAppLiveStatus } from '../../../lib/derive-app-status.js';
13
+ import { useTurnStatus } from '../../../hooks/turn-statuses-provider.js';
14
+ import { useDeployAction } from '../../../hooks/use-deploy-action.js';
15
+ import { DeploymentState } from '../../../../../../packages/core/src/domain/generated/output.js';
16
+ const PREVIEW_HEIGHT_PX = 140;
17
+ export function ApplicationCard({ application, className }) {
18
+ const router = useRouter();
19
+ const queryClient = useQueryClient();
20
+ const [confirmOpen, setConfirmOpen] = useState(false);
21
+ const turnStatus = useTurnStatus(`app-${application.id}`);
22
+ const deploy = useDeployAction({
23
+ targetId: application.id,
24
+ targetType: 'application',
25
+ repositoryPath: application.repositoryPath,
26
+ });
27
+ const effectiveDeploymentUrl = deploy.url;
28
+ const live = deriveAppLiveStatus(application.status, turnStatus, !!effectiveDeploymentUrl, application.effectiveStatus);
29
+ const repoCount = 1 + (application.additionalPaths?.length ?? 0);
30
+ const repoName = application.repositoryPath.split('/').pop() ?? application.repositoryPath;
31
+ return (_jsxs(_Fragment, { children: [_jsxs("div", { "data-testid": "application-card", onClick: () => router.push(`/application/${application.id}`), className: cn('bg-card group relative cursor-pointer overflow-hidden rounded-xl border shadow-sm transition-[border-color,box-shadow] duration-200 hover:shadow-lg dark:bg-neutral-800/80', live.borderClass, className), children: [_jsxs("div", { className: "flex items-center gap-3 px-4 pt-4 pb-3", children: [_jsx("div", { className: "flex h-8 w-8 shrink-0 items-center justify-center rounded-lg bg-gradient-to-br from-indigo-500 to-violet-500", children: _jsx(LayoutGrid, { className: "h-4 w-4 text-white" }) }), _jsxs("div", { className: "min-w-0 flex-1", children: [_jsx("h3", { "data-testid": "application-card-name", className: "truncate text-sm font-medium", children: application.name }), _jsx("p", { className: "text-muted-foreground mt-0.5 truncate text-[11px]", children: application.description })] }), _jsxs("span", { className: "flex shrink-0 items-center gap-1.5", children: [_jsx("span", { className: cn('relative flex h-2 w-2 items-center justify-center rounded-full', live.dotClass), children: live.pulse ? (_jsx("span", { className: cn('absolute inline-flex h-full w-full animate-ping rounded-full opacity-60', live.dotClass) })) : null }), _jsx("span", { className: "text-muted-foreground text-[10px]", children: live.label })] })] }), _jsx("div", { className: "px-4", children: _jsxs("div", { className: "bg-muted group/preview relative overflow-hidden rounded-lg", style: { height: PREVIEW_HEIGHT_PX }, children: [effectiveDeploymentUrl ? (_jsx("iframe", { src: effectiveDeploymentUrl, title: `${application.name} live preview`, className: "pointer-events-none absolute top-0 left-0 origin-top-left border-0 bg-white", style: { width: '250%', height: '250%', transform: 'scale(0.4)' }, sandbox: "allow-same-origin allow-scripts", loading: "lazy" })) : (_jsx(PreviewPlaceholder, { effectiveStatus: application.effectiveStatus })), deploy.status === DeploymentState.Ready && effectiveDeploymentUrl ? (_jsxs("div", { className: "pointer-events-none absolute inset-0 flex items-center justify-center gap-2 bg-neutral-900/75 opacity-0 transition-opacity duration-150 group-hover/preview:pointer-events-auto group-hover/preview:opacity-100 dark:bg-neutral-950/80", onClick: (e) => e.stopPropagation(), children: [_jsxs("button", { type: "button", onClick: (e) => {
32
+ e.stopPropagation();
33
+ void deploy.stop();
34
+ }, disabled: deploy.stopLoading, className: "inline-flex h-8 cursor-pointer items-center gap-1.5 rounded-md border border-neutral-300 bg-white px-3 text-[11px] font-semibold text-neutral-900 shadow-md transition-colors hover:border-red-500 hover:bg-red-50 hover:text-red-600 dark:border-neutral-700 dark:bg-neutral-900 dark:text-neutral-100 dark:hover:border-red-500 dark:hover:bg-red-950 dark:hover:text-red-400", children: [deploy.stopLoading ? (_jsx(Loader2, { className: "h-3 w-3 animate-spin" })) : (_jsx(Square, { className: "h-3 w-3 fill-current" })), "Stop"] }), _jsxs("button", { type: "button", onClick: (e) => {
35
+ e.stopPropagation();
36
+ if (effectiveDeploymentUrl) {
37
+ window.open(effectiveDeploymentUrl, '_blank', 'noopener,noreferrer');
38
+ }
39
+ }, className: "inline-flex h-8 cursor-pointer items-center gap-1.5 rounded-md border border-neutral-300 bg-white px-3 text-[11px] font-semibold text-neutral-900 shadow-md transition-colors hover:bg-neutral-50 dark:border-neutral-700 dark:bg-neutral-900 dark:text-neutral-100 dark:hover:bg-neutral-800", children: [_jsx(ExternalLink, { className: "h-3 w-3" }), "Open"] })] })) : null, deploy.status === DeploymentState.Booting || deploy.deployLoading ? (_jsxs("div", { className: "absolute inset-0 flex flex-col items-center justify-center gap-2 bg-neutral-100 dark:bg-neutral-900", children: [_jsx(Loader2, { className: "h-6 w-6 animate-spin text-amber-500" }), _jsx("span", { className: "text-foreground text-[11px] font-medium", children: "Starting\u2026" })] })) : null, !live.previewDisabled &&
40
+ !effectiveDeploymentUrl &&
41
+ !deploy.deployLoading &&
42
+ deploy.status !== DeploymentState.Booting &&
43
+ !deploy.deployError && (_jsx("div", { className: "pointer-events-none absolute inset-0 flex items-center justify-center gap-2 bg-neutral-900/75 opacity-0 transition-opacity duration-150 group-hover/preview:pointer-events-auto group-hover/preview:opacity-100 dark:bg-neutral-950/80", children: _jsxs("button", { type: "button", onClick: (e) => {
44
+ e.stopPropagation();
45
+ void deploy.deploy();
46
+ }, className: "inline-flex h-8 cursor-pointer items-center gap-2 rounded-md border border-violet-400 bg-gradient-to-br from-indigo-500 to-violet-600 px-4 text-[11px] font-semibold text-white shadow-md transition-[filter] hover:brightness-110", children: [_jsx(Play, { className: "h-3 w-3 fill-current" }), "Start Preview"] }) })), application.effectiveStatus === 'interrupted' && (_jsx("div", { className: "pointer-events-none absolute inset-0 flex items-center justify-center bg-amber-950/60 opacity-0 transition-opacity duration-150 group-hover/preview:pointer-events-auto group-hover/preview:opacity-100", children: _jsxs("button", { type: "button", onClick: (e) => {
47
+ e.stopPropagation();
48
+ void fetch(`/api/applications/${application.id}/resume`, { method: 'POST' });
49
+ }, className: "inline-flex h-8 cursor-pointer items-center gap-2 rounded-md border border-amber-400 bg-gradient-to-br from-amber-500 to-orange-500 px-4 text-[11px] font-semibold text-white shadow-md transition-[filter] hover:brightness-110", children: [_jsx(Play, { className: "h-3 w-3 fill-current" }), "Continue Build"] }) })), _jsx("button", { type: "button", onClick: (e) => {
50
+ e.stopPropagation();
51
+ setConfirmOpen(true);
52
+ }, className: "absolute top-1.5 right-1.5 z-20 flex h-6 w-6 cursor-pointer items-center justify-center rounded-md bg-white/80 text-neutral-500 opacity-0 shadow-sm backdrop-blur-sm transition-all group-hover:opacity-100 hover:!bg-red-500 hover:!text-white dark:bg-neutral-800/80 dark:text-neutral-400", "aria-label": `Delete ${application.name}`, title: "Delete application", children: _jsx(Trash2, { className: "h-3 w-3" }) })] }) }), _jsxs("div", { className: "flex items-center justify-between px-4 pt-3 pb-4", children: [_jsxs("span", { className: "text-muted-foreground flex items-center gap-1.5 text-[11px]", children: [_jsx(FolderGit2, { className: "h-3 w-3" }), repoName, repoCount > 1 && _jsxs("span", { className: "text-muted-foreground/60", children: ["+", repoCount - 1] })] }), _jsx("span", { className: "text-muted-foreground/60 text-[10px]", children: new Date(application.createdAt).toLocaleDateString(undefined, {
53
+ month: 'short',
54
+ day: 'numeric',
55
+ }) })] })] }), _jsx(Dialog, { open: confirmOpen, onOpenChange: setConfirmOpen, children: _jsxs(DialogContent, { className: "max-w-xs", children: [_jsxs(DialogHeader, { children: [_jsx(DialogTitle, { children: "Delete application?" }), _jsxs(DialogDescription, { children: ["This will permanently remove ", _jsx("strong", { children: application.name }), "."] })] }), _jsxs(DialogFooter, { className: "grid grid-cols-2 gap-2 sm:flex-none", children: [_jsx(DialogClose, { asChild: true, children: _jsx(Button, { variant: "outline", children: "Cancel" }) }), _jsx(Button, { variant: "destructive", onClick: async () => {
56
+ setConfirmOpen(false);
57
+ const result = await deleteApplication(application.id);
58
+ if (result.error) {
59
+ toast.error('Failed to delete', { description: result.error });
60
+ }
61
+ else {
62
+ toast.success('Application deleted');
63
+ void queryClient.invalidateQueries({ queryKey: ['applications'] });
64
+ }
65
+ }, children: "Delete" })] })] }) })] }));
66
+ }
67
+ /* ------------------------------------------------------------------ */
68
+ /* Preview placeholders per state */
69
+ /* ------------------------------------------------------------------ */
70
+ function PreviewPlaceholder({ effectiveStatus }) {
71
+ if (effectiveStatus === 'failed') {
72
+ return (_jsxs("div", { className: "pointer-events-none absolute inset-0 flex flex-col items-center justify-center gap-2 bg-red-50 dark:bg-red-950/30", children: [_jsx("div", { className: "flex h-10 w-10 items-center justify-center rounded-full bg-red-100 dark:bg-red-900/50", children: _jsx(TriangleAlert, { className: "h-5 w-5 text-red-500" }) }), _jsx("span", { className: "text-[11px] font-medium text-red-600 dark:text-red-400", children: "Build failed" }), _jsx("span", { className: "text-muted-foreground/60 text-[10px]", children: "Open app to retry" })] }));
73
+ }
74
+ if (effectiveStatus === 'interrupted') {
75
+ return (_jsxs("div", { className: "pointer-events-none absolute inset-0 flex flex-col items-center justify-center gap-2 bg-amber-50 dark:bg-amber-950/20", children: [_jsx("div", { className: "flex h-10 w-10 items-center justify-center rounded-full bg-amber-100 dark:bg-amber-900/40", children: _jsx(AlertTriangle, { className: "h-5 w-5 text-amber-500" }) }), _jsx("span", { className: "text-[11px] font-medium text-amber-600 dark:text-amber-400", children: "Build interrupted" }), _jsx("span", { className: "text-muted-foreground/60 text-[10px]", children: "Open app to continue" })] }));
76
+ }
77
+ if (effectiveStatus === 'building') {
78
+ return (_jsxs("div", { className: "pointer-events-none absolute inset-0 flex flex-col items-center justify-center gap-2", children: [_jsx(Loader2, { className: "h-6 w-6 animate-spin text-violet-500" }), _jsx("span", { className: "text-[11px] font-medium text-violet-600 dark:text-violet-400", children: "Building\u2026" })] }));
79
+ }
80
+ // Ready / offline — clean wireframe with globe icon
81
+ return (_jsxs("div", { className: "pointer-events-none absolute inset-0 flex flex-col items-center justify-center gap-2", children: [_jsx("div", { className: "flex h-10 w-10 items-center justify-center rounded-full bg-gradient-to-br from-indigo-500/10 to-violet-500/10", children: _jsx(Globe, { className: "text-muted-foreground/30 h-5 w-5" }) }), _jsxs("div", { className: "absolute inset-0 opacity-30", children: [_jsxs("div", { className: "flex h-5 items-center gap-1.5 px-2", style: { background: 'var(--muted)' }, children: [_jsx("div", { className: "bg-muted-foreground/10 h-1.5 w-1.5 rounded-full" }), _jsx("div", { className: "bg-muted-foreground/10 h-1.5 w-1.5 rounded-full" }), _jsx("div", { className: "bg-muted-foreground/10 h-1.5 w-1.5 rounded-full" }), _jsx("div", { className: "bg-muted-foreground/10 ms-1.5 h-1.5 w-12 rounded" })] }), _jsxs("div", { className: "flex h-[calc(100%-1.25rem)]", children: [_jsxs("div", { className: "border-muted-foreground/5 flex w-[40px] flex-col gap-1.5 border-e p-1.5", children: [_jsx("div", { className: "bg-muted-foreground/8 h-1.5 w-full rounded" }), _jsx("div", { className: "bg-muted-foreground/8 h-1.5 w-3/4 rounded" }), _jsx("div", { className: "bg-muted-foreground/8 h-1.5 w-full rounded" })] }), _jsxs("div", { className: "flex flex-1 flex-col gap-1.5 p-2.5", children: [_jsx("div", { className: "bg-muted-foreground/8 h-2 w-2/3 rounded" }), _jsx("div", { className: "bg-muted-foreground/8 h-1.5 w-full rounded" }), _jsx("div", { className: "bg-muted-foreground/8 h-1.5 w-5/6 rounded" }), _jsx("div", { className: "bg-muted-foreground/8 h-1.5 w-3/4 rounded" })] })] })] })] }));
82
+ }
@@ -0,0 +1,13 @@
1
+ import type { Meta, StoryObj } from '@storybook/react';
2
+ import { ApplicationCard } from './application-card.js';
3
+ declare const meta: Meta<typeof ApplicationCard>;
4
+ export default meta;
5
+ type Story = StoryObj<typeof meta>;
6
+ export declare const Idle: Story;
7
+ export declare const Active: Story;
8
+ export declare const ErrorState: Story;
9
+ export declare const LongDescription: Story;
10
+ export declare const MultipleRepos: Story;
11
+ export declare const Interrupted: Story;
12
+ export declare const Failed: Story;
13
+ //# sourceMappingURL=application-card.stories.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"application-card.stories.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/features/applications/application-card.stories.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAkBrD,QAAA,MAAM,IAAI,EAAE,IAAI,CAAC,OAAO,eAAe,CAetC,CAAC;AAEF,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,IAAI,CAAC,CAAC;AAEnC,eAAO,MAAM,IAAI,EAAE,KAElB,CAAC;AAEF,eAAO,MAAM,MAAM,EAAE,KAIpB,CAAC;AAEF,eAAO,MAAM,UAAU,EAAE,KAIxB,CAAC;AAEF,eAAO,MAAM,eAAe,EAAE,KAS7B,CAAC;AAEF,eAAO,MAAM,aAAa,EAAE,KAO3B,CAAC;AAEF,eAAO,MAAM,WAAW,EAAE,KAIzB,CAAC;AAEF,eAAO,MAAM,MAAM,EAAE,KAIpB,CAAC"}
@@ -0,0 +1,69 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { ApplicationCard } from './application-card.js';
3
+ import { ApplicationStatus } from '../../../../../../packages/core/src/domain/generated/output.js';
4
+ const baseApp = {
5
+ id: '550e8400-e29b-41d4-a716-446655440000',
6
+ name: 'My Weather App',
7
+ slug: 'my-weather-app',
8
+ description: 'A weather dashboard that shows real-time forecasts with interactive maps',
9
+ repositoryPath: '/home/user/projects/weather-app',
10
+ additionalPaths: [],
11
+ status: ApplicationStatus.Idle,
12
+ setupComplete: true,
13
+ effectiveStatus: 'ready',
14
+ createdAt: new Date().toISOString(),
15
+ updatedAt: new Date().toISOString(),
16
+ };
17
+ const meta = {
18
+ title: 'Features/ApplicationCard',
19
+ component: ApplicationCard,
20
+ parameters: {
21
+ layout: 'padded',
22
+ backgrounds: { default: 'canvas' },
23
+ },
24
+ decorators: [
25
+ (Story) => (_jsx("div", { style: { maxWidth: 360 }, children: _jsx(Story, {}) })),
26
+ ],
27
+ tags: ['autodocs'],
28
+ };
29
+ export default meta;
30
+ export const Idle = {
31
+ args: { application: baseApp },
32
+ };
33
+ export const Active = {
34
+ args: {
35
+ application: { ...baseApp, status: ApplicationStatus.Active, name: 'Running App' },
36
+ },
37
+ };
38
+ export const ErrorState = {
39
+ args: {
40
+ application: { ...baseApp, status: ApplicationStatus.Error, name: 'Broken App' },
41
+ },
42
+ };
43
+ export const LongDescription = {
44
+ args: {
45
+ application: {
46
+ ...baseApp,
47
+ name: 'Enterprise Resource Planning Dashboard',
48
+ description: 'A comprehensive enterprise resource planning system with inventory management, order tracking, customer relationship management, and financial reporting modules.',
49
+ },
50
+ },
51
+ };
52
+ export const MultipleRepos = {
53
+ args: {
54
+ application: {
55
+ ...baseApp,
56
+ additionalPaths: ['/home/user/projects/shared-lib', '/home/user/projects/api'],
57
+ },
58
+ },
59
+ };
60
+ export const Interrupted = {
61
+ args: {
62
+ application: { ...baseApp, effectiveStatus: 'interrupted', name: 'Interrupted App' },
63
+ },
64
+ };
65
+ export const Failed = {
66
+ args: {
67
+ application: { ...baseApp, effectiveStatus: 'failed', name: 'Failed App' },
68
+ },
69
+ };
@@ -0,0 +1,5 @@
1
+ export interface ApplicationsPageClientProps {
2
+ className?: string;
3
+ }
4
+ export declare function ApplicationsPageClient({ className }: ApplicationsPageClientProps): import("react/jsx-runtime").JSX.Element;
5
+ //# sourceMappingURL=applications-page-client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"applications-page-client.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/features/applications/applications-page-client.tsx"],"names":[],"mappings":"AAYA,MAAM,WAAW,2BAA2B;IAC1C,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,sBAAsB,CAAC,EAAE,SAAS,EAAE,EAAE,2BAA2B,2CA6FhF"}
@@ -0,0 +1,28 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { useMemo, useState } from 'react';
4
+ import { useRouter } from 'next/navigation';
5
+ import { useQuery } from '@tanstack/react-query';
6
+ import { LayoutGrid, Loader2, Plus } from 'lucide-react';
7
+ import { cn } from '../../../lib/utils.js';
8
+ import { DeploymentStatusProvider } from '../../../hooks/deployment-status-provider.js';
9
+ import { ControlCenterEmptyState } from '../../features/control-center/control-center-empty-state.js';
10
+ import { ApplicationCard } from './application-card.js';
11
+ export function ApplicationsPageClient({ className }) {
12
+ const router = useRouter();
13
+ const [showCreatePrompt, setShowCreatePrompt] = useState(false);
14
+ const { data: applications = [], isLoading } = useQuery({
15
+ queryKey: ['applications'],
16
+ queryFn: async () => {
17
+ const res = await fetch('/api/applications');
18
+ if (!res.ok)
19
+ throw new Error('Failed to fetch applications');
20
+ return res.json();
21
+ },
22
+ staleTime: 30_000,
23
+ });
24
+ const sorted = useMemo(() => [...applications].sort((a, b) => new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime()), [applications]);
25
+ return (_jsx(DeploymentStatusProvider, { initialDeployments: [], children: _jsxs("div", { "data-testid": "applications-page-client", className: cn('relative space-y-4', className), children: [_jsxs("div", { className: "flex items-center gap-2", children: [_jsx(LayoutGrid, { className: "text-muted-foreground h-4 w-4" }), _jsx("h1", { className: "text-sm font-bold tracking-tight", children: "Applications" }), !isLoading ? (_jsxs("span", { className: "text-muted-foreground text-[10px]", children: [applications.length, " ", applications.length === 1 ? 'app' : 'apps'] })) : null] }), isLoading ? (_jsx("div", { className: "flex items-center justify-center py-12", children: _jsx(Loader2, { className: "text-muted-foreground h-5 w-5 animate-spin" }) })) : applications.length === 0 ? (_jsxs("div", { "data-testid": "applications-page-empty", className: "text-muted-foreground flex flex-col items-center justify-center py-12 text-center", children: [_jsx(LayoutGrid, { className: "mb-2 h-6 w-6 opacity-20" }), _jsx("p", { className: "text-xs", children: "No applications yet." }), _jsxs("button", { type: "button", onClick: () => setShowCreatePrompt(true), className: "mt-3 inline-flex items-center gap-1.5 rounded-md bg-indigo-500 px-3 py-1.5 text-[11px] font-semibold text-white shadow-sm transition-colors hover:bg-indigo-400", children: [_jsx(Plus, { className: "h-3 w-3" }), "New application"] })] })) : (_jsx("div", { "data-testid": "applications-page-grid", className: "grid grid-cols-1 gap-3 sm:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4", children: sorted.map((app) => (_jsx(ApplicationCard, { application: app }, app.id))) })), _jsx("button", { type: "button", "data-testid": "applications-fab-new", "aria-label": "New application", onClick: () => setShowCreatePrompt(true), className: "fixed right-6 bottom-6 z-40 flex h-14 w-14 cursor-pointer items-center justify-center rounded-full bg-indigo-500 text-white shadow-lg transition-all duration-200 hover:scale-105 hover:bg-indigo-400 hover:shadow-xl active:scale-95", children: _jsx(Plus, { className: "h-7 w-7 stroke-[2.5]" }) }), showCreatePrompt ? (_jsx("div", { className: "fixed inset-0 z-50", children: _jsx(ControlCenterEmptyState, { onApplicationCreated: (appId) => {
26
+ router.push(`/application/${appId}`);
27
+ }, onClose: () => setShowCreatePrompt(false), className: "bg-background" }) })) : null] }) }));
28
+ }
@@ -0,0 +1,10 @@
1
+ import type { Meta, StoryObj } from '@storybook/react';
2
+ import { ApplicationsPageClient } from './applications-page-client.js';
3
+ declare const meta: Meta<typeof ApplicationsPageClient>;
4
+ export default meta;
5
+ type Story = StoryObj<typeof meta>;
6
+ export declare const Default: Story;
7
+ export declare const Empty: Story;
8
+ export declare const SingleApp: Story;
9
+ export declare const AllActive: Story;
10
+ //# sourceMappingURL=applications-page-client.stories.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"applications-page-client.stories.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/features/applications/applications-page-client.stories.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,sBAAsB,EAAE,MAAM,4BAA4B,CAAC;AA0EpE,QAAA,MAAM,IAAI,EAAE,IAAI,CAAC,OAAO,sBAAsB,CAO7C,CAAC;AAEF,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,IAAI,CAAC,CAAC;AAEnC,eAAO,MAAM,OAAO,EAAE,KAErB,CAAC;AAEF,eAAO,MAAM,KAAK,EAAE,KAEnB,CAAC;AAEF,eAAO,MAAM,SAAS,EAAE,KAEvB,CAAC;AAEF,eAAO,MAAM,SAAS,EAAE,KAIvB,CAAC"}