@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
@@ -0,0 +1,93 @@
1
+ import { ApplicationsPageClient } from './applications-page-client.js';
2
+ import { ApplicationStatus } from '../../../../../../packages/core/src/domain/generated/output.js';
3
+ const now = new Date().toISOString();
4
+ const mockApps = [
5
+ {
6
+ id: '1',
7
+ name: 'Weather Dashboard',
8
+ slug: 'weather-dashboard',
9
+ description: 'Real-time weather forecasts with interactive maps and alerts',
10
+ repositoryPath: '/home/user/projects/weather-dashboard',
11
+ additionalPaths: [],
12
+ status: ApplicationStatus.Idle,
13
+ setupComplete: true,
14
+ effectiveStatus: 'ready',
15
+ createdAt: now,
16
+ updatedAt: now,
17
+ },
18
+ {
19
+ id: '2',
20
+ name: 'Task Manager',
21
+ slug: 'task-manager',
22
+ description: 'Kanban-style task management with team collaboration features',
23
+ repositoryPath: '/home/user/projects/task-manager',
24
+ additionalPaths: ['/home/user/projects/shared-ui'],
25
+ status: ApplicationStatus.Active,
26
+ setupComplete: false,
27
+ effectiveStatus: 'building',
28
+ createdAt: now,
29
+ updatedAt: now,
30
+ },
31
+ {
32
+ id: '3',
33
+ name: 'E-Commerce Store',
34
+ slug: 'ecommerce-store',
35
+ description: 'Full-featured online store with payments, inventory, and admin panel',
36
+ repositoryPath: '/home/user/projects/ecommerce',
37
+ additionalPaths: [],
38
+ status: ApplicationStatus.Error,
39
+ setupComplete: false,
40
+ effectiveStatus: 'failed',
41
+ createdAt: now,
42
+ updatedAt: now,
43
+ },
44
+ {
45
+ id: '4',
46
+ name: 'Portfolio Site',
47
+ slug: 'portfolio-site',
48
+ description: 'Personal portfolio with blog and project showcase',
49
+ repositoryPath: '/home/user/projects/portfolio',
50
+ additionalPaths: [],
51
+ status: ApplicationStatus.Idle,
52
+ setupComplete: false,
53
+ effectiveStatus: 'interrupted',
54
+ createdAt: now,
55
+ updatedAt: now,
56
+ },
57
+ {
58
+ id: '5',
59
+ name: 'Chat Application',
60
+ slug: 'chat-app',
61
+ description: 'Real-time messaging app with channels and direct messages',
62
+ repositoryPath: '/home/user/projects/chat-app',
63
+ additionalPaths: ['/home/user/projects/chat-api', '/home/user/projects/shared-types'],
64
+ status: ApplicationStatus.Idle,
65
+ setupComplete: true,
66
+ effectiveStatus: 'ready',
67
+ createdAt: now,
68
+ updatedAt: now,
69
+ },
70
+ ];
71
+ const meta = {
72
+ title: 'Features/ApplicationsPageClient',
73
+ component: ApplicationsPageClient,
74
+ parameters: {
75
+ layout: 'padded',
76
+ },
77
+ tags: ['autodocs'],
78
+ };
79
+ export default meta;
80
+ export const Default = {
81
+ args: { applications: mockApps },
82
+ };
83
+ export const Empty = {
84
+ args: { applications: [] },
85
+ };
86
+ export const SingleApp = {
87
+ args: { applications: [mockApps[0]] },
88
+ };
89
+ export const AllActive = {
90
+ args: {
91
+ applications: mockApps.map((app) => ({ ...app, status: ApplicationStatus.Active })),
92
+ },
93
+ };
@@ -13,6 +13,8 @@ export interface ChatComposerProps {
13
13
  onPickFiles: () => void;
14
14
  /** Agent/model picker rendered in the controls row. */
15
15
  agentPicker?: React.ReactNode;
16
+ /** When true, the composer is visually disabled and input is blocked. */
17
+ disabled?: boolean;
16
18
  }
17
- export declare function ChatComposer({ attachments, isDragOver, uploadError, onDragEnter, onDragLeave, onDragOver, onDrop, onPaste, onRemoveAttachment, onNotesChange, onPickFiles, agentPicker, }: ChatComposerProps): import("react/jsx-runtime").JSX.Element;
19
+ export declare function ChatComposer({ attachments, isDragOver, uploadError, onDragEnter, onDragLeave, onDragOver, onDrop, onPaste, onRemoveAttachment, onNotesChange, onPickFiles, agentPicker, disabled, }: ChatComposerProps): import("react/jsx-runtime").JSX.Element;
18
20
  //# sourceMappingURL=ChatComposer.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ChatComposer.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/features/chat/ChatComposer.tsx"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAE9D,MAAM,WAAW,iBAAiB;IAChC,WAAW,EAAE,cAAc,EAAE,CAAC;IAC9B,UAAU,EAAE,OAAO,CAAC;IACpB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,WAAW,EAAE,CAAC,CAAC,EAAE,KAAK,CAAC,SAAS,KAAK,IAAI,CAAC;IAC1C,WAAW,EAAE,CAAC,CAAC,EAAE,KAAK,CAAC,SAAS,KAAK,IAAI,CAAC;IAC1C,UAAU,EAAE,CAAC,CAAC,EAAE,KAAK,CAAC,SAAS,KAAK,IAAI,CAAC;IACzC,MAAM,EAAE,CAAC,CAAC,EAAE,KAAK,CAAC,SAAS,KAAK,IAAI,CAAC;IACrC,OAAO,EAAE,CAAC,CAAC,EAAE,KAAK,CAAC,cAAc,KAAK,IAAI,CAAC;IAC3C,kBAAkB,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IACzC,aAAa,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACnD,WAAW,EAAE,MAAM,IAAI,CAAC;IACxB,uDAAuD;IACvD,WAAW,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;CAC/B;AAED,wBAAgB,YAAY,CAAC,EAC3B,WAAW,EACX,UAAU,EACV,WAAW,EACX,WAAW,EACX,WAAW,EACX,UAAU,EACV,MAAM,EACN,OAAO,EACP,kBAAkB,EAClB,aAAa,EACb,WAAW,EACX,WAAW,GACZ,EAAE,iBAAiB,2CAqFnB"}
1
+ {"version":3,"file":"ChatComposer.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/features/chat/ChatComposer.tsx"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAE9D,MAAM,WAAW,iBAAiB;IAChC,WAAW,EAAE,cAAc,EAAE,CAAC;IAC9B,UAAU,EAAE,OAAO,CAAC;IACpB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,WAAW,EAAE,CAAC,CAAC,EAAE,KAAK,CAAC,SAAS,KAAK,IAAI,CAAC;IAC1C,WAAW,EAAE,CAAC,CAAC,EAAE,KAAK,CAAC,SAAS,KAAK,IAAI,CAAC;IAC1C,UAAU,EAAE,CAAC,CAAC,EAAE,KAAK,CAAC,SAAS,KAAK,IAAI,CAAC;IACzC,MAAM,EAAE,CAAC,CAAC,EAAE,KAAK,CAAC,SAAS,KAAK,IAAI,CAAC;IACrC,OAAO,EAAE,CAAC,CAAC,EAAE,KAAK,CAAC,cAAc,KAAK,IAAI,CAAC;IAC3C,kBAAkB,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IACzC,aAAa,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACnD,WAAW,EAAE,MAAM,IAAI,CAAC;IACxB,uDAAuD;IACvD,WAAW,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC9B,yEAAyE;IACzE,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,wBAAgB,YAAY,CAAC,EAC3B,WAAW,EACX,UAAU,EACV,WAAW,EACX,WAAW,EACX,WAAW,EACX,UAAU,EACV,MAAM,EACN,OAAO,EACP,kBAAkB,EAClB,aAAa,EACb,WAAW,EACX,WAAW,EACX,QAAQ,GACT,EAAE,iBAAiB,2CAuFnB"}
@@ -7,11 +7,11 @@ import { SendHorizontal, CircleStop, Paperclip } from 'lucide-react';
7
7
  import { cn } from '../../../lib/utils.js';
8
8
  import { Tooltip, TooltipContent, TooltipTrigger } from '../../ui/tooltip.js';
9
9
  import { AttachmentChip } from '../../common/attachment-chip/index.js';
10
- export function ChatComposer({ attachments, isDragOver, uploadError, onDragEnter, onDragLeave, onDragOver, onDrop, onPaste, onRemoveAttachment, onNotesChange, onPickFiles, agentPicker, }) {
10
+ export function ChatComposer({ attachments, isDragOver, uploadError, onDragEnter, onDragLeave, onDragOver, onDrop, onPaste, onRemoveAttachment, onNotesChange, onPickFiles, agentPicker, disabled, }) {
11
11
  const { t } = useTranslation('web');
12
12
  const [isFocused, setIsFocused] = useState(false);
13
13
  const containerRef = useRef(null);
14
- return (_jsx(ComposerPrimitive.Root, { className: "shrink-0 border-t p-3", children: _jsx("div", { onDragEnter: onDragEnter, onDragLeave: onDragLeave, onDragOver: onDragOver, onDrop: onDrop, className: cn('flex flex-col gap-1.5 rounded-md border-2 border-transparent p-1 transition-colors', isDragOver && 'border-primary/50 bg-primary/5'), children: _jsxs("div", { ref: containerRef, onFocus: () => setIsFocused(true), onBlur: () => setIsFocused(false), className: cn('border-input flex flex-col overflow-hidden rounded-md border shadow-xs transition-[color,box-shadow]', isFocused && 'ring-ring/50 border-ring ring-[3px]'), children: [_jsx(ComposerPrimitive.Input, { rows: 1, autoFocus: true, placeholder: t('chat.writeMessage'), onPaste: onPaste, className: "max-h-[4.5rem] min-h-0 resize-none rounded-none border-0 px-3 py-2.5 text-sm shadow-none focus:outline-none focus-visible:ring-0" }), attachments.length > 0 ? (_jsx("div", { className: "flex flex-wrap items-center gap-1.5 px-3 py-2", children: attachments.map((file) => (_jsx(AttachmentChip, { name: file.name, size: file.size, mimeType: file.mimeType, path: file.path, onRemove: () => onRemoveAttachment(file.id), loading: file.loading, notes: file.notes, onNotesChange: (notes) => onNotesChange(file.id, notes) }, file.id))) })) : null, uploadError ? _jsx("p", { className: "text-destructive px-3 pb-2 text-xs", children: uploadError }) : null, _jsxs("div", { className: "border-input flex items-center gap-3 border-t px-3 py-1.5", children: [agentPicker, _jsx("div", { className: "flex-1" }), _jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx("button", { type: "button", onClick: onPickFiles, "aria-label": t('chat.attachFiles'), className: "text-muted-foreground hover:text-foreground cursor-pointer rounded p-1 transition-colors", children: _jsx(Paperclip, { className: "h-4 w-4" }) }) }), _jsx(TooltipContent, { side: "top", children: t('chat.attachFiles') })] }), _jsx(ChatComposerAction, {})] })] }) }) }));
14
+ return (_jsx(ComposerPrimitive.Root, { className: cn('shrink-0 border-t p-3', disabled && 'pointer-events-none opacity-50'), children: _jsx("div", { onDragEnter: onDragEnter, onDragLeave: onDragLeave, onDragOver: onDragOver, onDrop: onDrop, className: cn('flex flex-col gap-1.5 rounded-md border-2 border-transparent p-1 transition-colors', isDragOver && 'border-primary/50 bg-primary/5'), children: _jsxs("div", { ref: containerRef, onFocus: () => setIsFocused(true), onBlur: () => setIsFocused(false), className: cn('border-input flex flex-col overflow-hidden rounded-md border shadow-xs transition-[color,box-shadow]', isFocused && 'ring-ring/50 border-ring ring-[3px]'), children: [_jsx(ComposerPrimitive.Input, { rows: 1, autoFocus: true, placeholder: t('chat.writeMessage'), onPaste: onPaste, className: "max-h-[4.5rem] min-h-0 resize-none rounded-none border-0 px-3 py-2.5 text-sm shadow-none focus:outline-none focus-visible:ring-0" }), attachments.length > 0 ? (_jsx("div", { className: "flex flex-wrap items-center gap-1.5 px-3 py-2", children: attachments.map((file) => (_jsx(AttachmentChip, { name: file.name, size: file.size, mimeType: file.mimeType, path: file.path, onRemove: () => onRemoveAttachment(file.id), loading: file.loading, notes: file.notes, onNotesChange: (notes) => onNotesChange(file.id, notes) }, file.id))) })) : null, uploadError ? _jsx("p", { className: "text-destructive px-3 pb-2 text-xs", children: uploadError }) : null, _jsxs("div", { className: "border-input flex items-center gap-3 border-t px-3 py-1.5", children: [agentPicker, _jsx("div", { className: "flex-1" }), _jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx("button", { type: "button", onClick: onPickFiles, "aria-label": t('chat.attachFiles'), className: "text-muted-foreground hover:text-foreground cursor-pointer rounded p-1 transition-colors", children: _jsx(Paperclip, { className: "h-4 w-4" }) }) }), _jsx(TooltipContent, { side: "top", children: t('chat.attachFiles') })] }), _jsx(ChatComposerAction, {})] })] }) }) }));
15
15
  }
16
16
  function ChatComposerAction() {
17
17
  return (_jsxs(_Fragment, { children: [_jsx(ThreadPrimitive.If, { running: false, children: _jsx(ComposerPrimitive.Send, { className: cn('bg-primary text-primary-foreground inline-flex h-8 w-8 shrink-0 items-center justify-center rounded-md', 'hover:bg-primary/90 disabled:pointer-events-none disabled:opacity-30', 'transition-colors'), children: _jsx(SendHorizontal, { className: "size-3.5" }) }) }), _jsx(ThreadPrimitive.If, { running: true, children: _jsx(ComposerPrimitive.Cancel, { className: cn('bg-destructive/10 text-destructive inline-flex h-8 w-8 shrink-0 items-center justify-center rounded-md', 'hover:bg-destructive/20', 'transition-colors'), children: _jsx(CircleStop, { className: "size-3.5" }) }) })] }));
@@ -38,6 +38,8 @@ export interface ChatTabProps {
38
38
  * later.
39
39
  */
40
40
  workflowPlaceholder?: PlaceholderStep[];
41
+ /** Called when the user clicks Continue on an interrupted workflow step. */
42
+ onResumeWorkflow?: () => void;
41
43
  }
42
- export declare function ChatTab({ featureId, worktreePath, initialAgent, initialModel, initialChatState, hideHeader, onAllStepsComplete, workflowPlaceholder, }: ChatTabProps): import("react/jsx-runtime").JSX.Element;
44
+ export declare function ChatTab({ featureId, worktreePath, initialAgent, initialModel, initialChatState, hideHeader, onAllStepsComplete, workflowPlaceholder, onResumeWorkflow, }: ChatTabProps): import("react/jsx-runtime").JSX.Element;
43
45
  //# sourceMappingURL=ChatTab.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ChatTab.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/features/chat/ChatTab.tsx"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,sFAAsF,CAAC;AAUtH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAG9D,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,qEAAqE;IACrE,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,yEAAyE;IACzE,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB;;;OAGG;IACH,gBAAgB,CAAC,EAAE,SAAS,CAAC;IAC7B;;;;;OAKG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB;;;;;OAKG;IACH,kBAAkB,CAAC,EAAE,MAAM,IAAI,CAAC;IAChC;;;;;;;;;;OAUG;IACH,mBAAmB,CAAC,EAAE,eAAe,EAAE,CAAC;CACzC;AAID,wBAAgB,OAAO,CAAC,EACtB,SAAS,EACT,YAAY,EACZ,YAAY,EACZ,YAAY,EACZ,gBAAgB,EAChB,UAAU,EACV,kBAAkB,EAClB,mBAAmB,GACpB,EAAE,YAAY,2CAiLd"}
1
+ {"version":3,"file":"ChatTab.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/features/chat/ChatTab.tsx"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,sFAAsF,CAAC;AAUtH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAG9D,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,qEAAqE;IACrE,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,yEAAyE;IACzE,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB;;;OAGG;IACH,gBAAgB,CAAC,EAAE,SAAS,CAAC;IAC7B;;;;;OAKG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB;;;;;OAKG;IACH,kBAAkB,CAAC,EAAE,MAAM,IAAI,CAAC;IAChC;;;;;;;;;;OAUG;IACH,mBAAmB,CAAC,EAAE,eAAe,EAAE,CAAC;IACxC,4EAA4E;IAC5E,gBAAgB,CAAC,EAAE,MAAM,IAAI,CAAC;CAC/B;AAID,wBAAgB,OAAO,CAAC,EACtB,SAAS,EACT,YAAY,EACZ,YAAY,EACZ,YAAY,EACZ,gBAAgB,EAChB,UAAU,EACV,kBAAkB,EAClB,mBAAmB,EACnB,gBAAgB,GACjB,EAAE,YAAY,2CAoLd"}
@@ -14,7 +14,7 @@ import { ChatComposer } from './ChatComposer.js';
14
14
  import { InteractionBubble } from './InteractionBubble.js';
15
15
  import { StepTracker } from './StepTracker.js';
16
16
  const IS_DEV = process.env.NODE_ENV === 'development';
17
- export function ChatTab({ featureId, worktreePath, initialAgent, initialModel, initialChatState, hideHeader, onAllStepsComplete, workflowPlaceholder, }) {
17
+ export function ChatTab({ featureId, worktreePath, initialAgent, initialModel, initialChatState, hideHeader, onAllStepsComplete, workflowPlaceholder, onResumeWorkflow, }) {
18
18
  const [overrideAgent, setOverrideAgent] = useState(initialAgent);
19
19
  const [overrideModel, setOverrideModel] = useState(initialModel);
20
20
  const [debugMode, setDebugMode] = useState(false);
@@ -85,11 +85,12 @@ export function ChatTab({ featureId, worktreePath, initialAgent, initialModel, i
85
85
  toolMessages: [],
86
86
  }));
87
87
  const showTracker = trackerSteps.length > 0;
88
- const composer = (_jsx(ChatComposer, { attachments: att.attachments, isDragOver: att.isDragOver, uploadError: att.uploadError, onDragEnter: att.handleDragEnter, onDragLeave: att.handleDragLeave, onDragOver: att.handleDragOver, onDrop: att.handleDrop, onPaste: att.handlePaste, onRemoveAttachment: att.removeAttachment, onNotesChange: att.updateNotes, onPickFiles: handlePickFiles, agentPicker: _jsx(AgentModelPicker, { initialAgentType: overrideAgent ?? 'claude-code', initialModel: overrideModel ?? 'claude-sonnet-4-6', mode: "override", onAgentModelChange: (agent, model) => {
88
+ const workflowInFlight = stepProgress.hasPlan === true && stepProgress.allDone !== true;
89
+ const composer = (_jsx(ChatComposer, { disabled: workflowInFlight, attachments: att.attachments, isDragOver: att.isDragOver, uploadError: att.uploadError, onDragEnter: att.handleDragEnter, onDragLeave: att.handleDragLeave, onDragOver: att.handleDragOver, onDrop: att.handleDrop, onPaste: att.handlePaste, onRemoveAttachment: att.removeAttachment, onNotesChange: att.updateNotes, onPickFiles: handlePickFiles, agentPicker: _jsx(AgentModelPicker, { initialAgentType: overrideAgent ?? 'claude-code', initialModel: overrideModel ?? 'claude-sonnet-4-6', mode: "override", onAgentModelChange: (agent, model) => {
89
90
  setOverrideAgent(agent);
90
91
  setOverrideModel(model);
91
92
  }, className: "w-55" }) }));
92
- return (_jsxs("div", { className: "flex h-full min-h-0 flex-col", children: [hideHeader ? null : (_jsx(ChatHeader, { sessionInfo: sessionInfo, isAgentActive: status.isRunning, onClear: clearChat, debugMode: debugMode, onDebugToggle: IS_DEV ? setDebugMode : undefined })), _jsx("div", { className: "flex min-h-0 flex-1 flex-col", children: isChatLoading ? (_jsx(ChatSkeleton, {})) : (_jsx(AssistantRuntimeProvider, { runtime: runtime, children: _jsx(Thread, { composer: composer, hideEmpty: showTracker, beforeMessages: showTracker ? (_jsxs(_Fragment, { children: [initialRequestMessage ? (_jsx(InitialRequestBubble, { text: initialRequestMessage.content })) : null, _jsx(StepTracker, { steps: trackerSteps, collapsedSummary: stepProgress.hasPlan === true && stepProgress.allDone === true, activeStepId: stepProgress.activeStepId, liveStatus: stepProgress.liveStatus })] })) : undefined, afterMessages: pendingInteraction ? (_jsx(InteractionBubble, { interaction: pendingInteraction, onSubmit: respondToInteraction })) : undefined }) })) })] }));
93
+ return (_jsxs("div", { className: "flex h-full min-h-0 flex-col", children: [hideHeader ? null : (_jsx(ChatHeader, { sessionInfo: sessionInfo, isAgentActive: status.isRunning, onClear: clearChat, debugMode: debugMode, onDebugToggle: IS_DEV ? setDebugMode : undefined })), _jsx("div", { className: "flex min-h-0 flex-1 flex-col dark:bg-neutral-900/40", children: isChatLoading ? (_jsx(ChatSkeleton, {})) : (_jsx(AssistantRuntimeProvider, { runtime: runtime, children: _jsx(Thread, { composer: composer, hideEmpty: showTracker, beforeMessages: showTracker ? (_jsxs(_Fragment, { children: [initialRequestMessage ? (_jsx(InitialRequestBubble, { text: initialRequestMessage.content })) : null, _jsx(StepTracker, { steps: trackerSteps, collapsedSummary: stepProgress.hasPlan === true && stepProgress.allDone === true, activeStepId: stepProgress.activeStepId, liveStatus: stepProgress.liveStatus, onRetry: onResumeWorkflow })] })) : undefined, afterMessages: pendingInteraction ? (_jsx(InteractionBubble, { interaction: pendingInteraction, onSubmit: respondToInteraction })) : undefined }) })) })] }));
93
94
  }
94
95
  // ── Initial request bubble ──────────────────────────────────────────────────
95
96
  //
@@ -23,6 +23,11 @@ export interface StepTrackerProps {
23
23
  * the running step card.
24
24
  */
25
25
  liveStatus?: string | null;
26
+ /**
27
+ * Called when the user clicks "Continue" on an interrupted step.
28
+ * Sends a message to the agent to resume from where it left off.
29
+ */
30
+ onRetry?: () => void;
26
31
  }
27
32
  /**
28
33
  * Vertical list of workflow step cards with a status indicator,
@@ -32,5 +37,5 @@ export interface StepTrackerProps {
32
37
  * while this step was active — the same bubble component the
33
38
  * regular thread would have used, just grouped by step.
34
39
  */
35
- export declare function StepTracker({ steps, className, collapsedSummary, activeStepId, liveStatus, }: StepTrackerProps): import("react/jsx-runtime").JSX.Element | null;
40
+ export declare function StepTracker({ steps, className, collapsedSummary, activeStepId, liveStatus, onRetry, }: StepTrackerProps): import("react/jsx-runtime").JSX.Element | null;
36
41
  //# sourceMappingURL=StepTracker.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"StepTracker.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/features/chat/StepTracker.tsx"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAiC1D,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,iBAAiB,EAAE,CAAC;IAC3B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;;;;OAMG;IACH,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B;;;;;OAKG;IACH,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B;;;;OAIG;IACH,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B;AAED;;;;;;;GAOG;AACH,wBAAgB,WAAW,CAAC,EAC1B,KAAK,EACL,SAAS,EACT,gBAAgB,EAChB,YAAY,EACZ,UAAU,GACX,EAAE,gBAAgB,kDAwDlB"}
1
+ {"version":3,"file":"StepTracker.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/features/chat/StepTracker.tsx"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAiC1D,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,iBAAiB,EAAE,CAAC;IAC3B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;;;;OAMG;IACH,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B;;;;;OAKG;IACH,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B;;;;OAIG;IACH,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B;;;OAGG;IACH,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;CACtB;AAED;;;;;;;GAOG;AACH,wBAAgB,WAAW,CAAC,EAC1B,KAAK,EACL,SAAS,EACT,gBAAgB,EAChB,YAAY,EACZ,UAAU,EACV,OAAO,GACR,EAAE,gBAAgB,kDAyDlB"}
@@ -1,6 +1,6 @@
1
1
  'use client';
2
2
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
- import { useState } from 'react';
3
+ import { useEffect, useState } from 'react';
4
4
  import { Collapsible } from 'radix-ui';
5
5
  import { Check, ChevronDown, ChevronRight, Circle, AlertTriangle } from 'lucide-react';
6
6
  import Markdown from 'react-markdown';
@@ -29,20 +29,20 @@ const markdownComponents = {
29
29
  * while this step was active — the same bubble component the
30
30
  * regular thread would have used, just grouped by step.
31
31
  */
32
- export function StepTracker({ steps, className, collapsedSummary, activeStepId, liveStatus, }) {
32
+ export function StepTracker({ steps, className, collapsedSummary, activeStepId, liveStatus, onRetry, }) {
33
33
  const [expandedOverride, setExpandedOverride] = useState(false);
34
34
  if (steps.length === 0)
35
35
  return null;
36
36
  if (collapsedSummary && !expandedOverride) {
37
37
  const doneCount = steps.filter((s) => s.status === 'done').length;
38
- return (_jsx("div", { className: cn('p-4', className), children: _jsxs("button", { type: "button", onClick: () => setExpandedOverride(true), className: "hover:bg-muted/40 border-border bg-background flex w-full items-center gap-3 rounded-lg border px-3 py-2.5 text-left transition-colors", children: [_jsx("div", { className: "flex h-6 w-6 shrink-0 items-center justify-center rounded-full bg-emerald-500 text-white", children: _jsx(Check, { className: "h-4 w-4", strokeWidth: 3 }) }), _jsxs("div", { className: "min-w-0 flex-1", children: [_jsx("div", { className: "text-sm font-medium", children: "Initial setup complete" }), _jsxs("div", { className: "text-muted-foreground text-xs", children: [doneCount, " of ", steps.length, " steps finished \u2014 click to review"] })] }), _jsx(ChevronRight, { className: "text-muted-foreground h-4 w-4 shrink-0" })] }) }));
38
+ return (_jsx("div", { className: cn('p-4', className), children: _jsxs("button", { type: "button", onClick: () => setExpandedOverride(true), className: "hover:bg-muted/40 border-border bg-background flex w-full items-center gap-3 rounded-lg border px-3 py-2.5 text-left transition-colors dark:bg-neutral-800/50", children: [_jsx("div", { className: "flex h-6 w-6 shrink-0 items-center justify-center rounded-full bg-emerald-500 text-white", children: _jsx(Check, { className: "h-4 w-4", strokeWidth: 3 }) }), _jsxs("div", { className: "min-w-0 flex-1", children: [_jsx("div", { className: "text-sm font-medium", children: "Initial setup complete" }), _jsxs("div", { className: "text-muted-foreground text-xs", children: [doneCount, " of ", steps.length, " steps finished \u2014 click to review"] })] }), _jsx(ChevronRight, { className: "text-muted-foreground h-4 w-4 shrink-0" })] }) }));
39
39
  }
40
40
  return (_jsxs("ol", { className: cn('flex flex-col gap-2 p-4', className), children: [collapsedSummary ? (_jsx("li", { children: _jsxs("button", { type: "button", onClick: () => setExpandedOverride(false), className: "text-muted-foreground hover:text-foreground mb-1 inline-flex items-center gap-1 text-[10px] tracking-wide uppercase", children: [_jsx(ChevronDown, { className: "h-3 w-3" }), "Collapse setup"] }) })) : null, steps.map((step, idx) => (
41
41
  // Each card fades + slides in on mount, briefly staggered so
42
42
  // the tracker assembles itself instead of popping in all at
43
43
  // once. Capped at 6 indexes so very long step lists don't
44
44
  // turn into a long cascade.
45
- _jsx(StepCard, { step: step, liveStatus: step.definition.id === activeStepId ? (liveStatus ?? null) : null, mountIndex: idx }, step.definition.id)))] }));
45
+ _jsx(StepCard, { step: step, liveStatus: step.definition.id === activeStepId ? (liveStatus ?? null) : null, mountIndex: idx, onRetry: step.status === 'interrupted' ? onRetry : undefined }, step.definition.id)))] }));
46
46
  }
47
47
  function classifyMessages(messages) {
48
48
  const items = [];
@@ -59,9 +59,16 @@ function classifyMessages(messages) {
59
59
  }
60
60
  return items;
61
61
  }
62
- function StepCard({ step, liveStatus, mountIndex }) {
63
- const [expanded, setExpanded] = useState(false);
64
- const { status, definition, metadata, toolMessages } = step;
62
+ function StepCard({ step, liveStatus, mountIndex, onRetry }) {
63
+ const [optimisticRunning, setOptimisticRunning] = useState(false);
64
+ // Clear optimistic override once the real status catches up
65
+ useEffect(() => {
66
+ if (step.status !== 'interrupted')
67
+ setOptimisticRunning(false);
68
+ }, [step.status]);
69
+ const status = optimisticRunning ? 'running' : step.status;
70
+ const [expanded, setExpanded] = useState(step.status === 'interrupted' || step.status === 'failed');
71
+ const { definition, metadata, toolMessages } = step;
65
72
  const details = readStringArray(metadata, 'details');
66
73
  const error = readString(metadata, 'error');
67
74
  const items = classifyMessages(toolMessages);
@@ -70,7 +77,7 @@ function StepCard({ step, liveStatus, mountIndex }) {
70
77
  // it is always a duplicate of the card header and is intentionally
71
78
  // NOT rendered — otherwise the expanded body would open with a copy
72
79
  // of the title right above the real content.
73
- const hasBody = items.length > 0 || details.length > 0 || !!error;
80
+ const hasBody = items.length > 0 || details.length > 0 || !!error || status === 'interrupted';
74
81
  return (_jsx(Collapsible.Root, { asChild: true, open: expanded, onOpenChange: setExpanded, children: _jsxs("li", { className: cn(
75
82
  // `transition-colors` glides the border + background tint
76
83
  // when the status changes (pending → running → done) so the
@@ -84,23 +91,19 @@ function StepCard({ step, liveStatus, mountIndex }) {
84
91
  // finished cleanly" signal). The running card uses Shep's
85
92
  // indigo/violet brand accent so the in-progress step is
86
93
  // visually distinct from anything that has already completed.
87
- status === 'running' && 'border-violet-500/40 bg-violet-500/5', status === 'done' && 'border-border bg-background', status === 'pending' && 'border-border/40 bg-muted/20', status === 'failed' && 'border-red-500/40 bg-red-500/5', status === 'interrupted' && 'border-amber-500/40 bg-amber-500/5'), style: { animationDelay: `${Math.min(mountIndex, 6) * 40}ms`, animationDuration: '300ms' }, children: [_jsx(Collapsible.Trigger, { asChild: true, children: _jsxs("button", { type: "button", disabled: !hasBody, className: cn('flex w-full items-center gap-3 px-3 py-1.5 text-left transition-colors duration-200', hasBody && 'hover:bg-muted/40 cursor-pointer', !hasBody && 'cursor-default'), children: [_jsx(StatusIcon, { status: status }), _jsxs("div", { className: "flex min-w-0 flex-1 items-baseline gap-2", children: [_jsx("span", { className: cn('shrink-0 truncate text-sm font-medium transition-colors duration-300', status === 'pending' && 'text-muted-foreground/60'), children: definition.title }), liveStatus && status === 'running' ? (
88
- // While the step is running, the live status preempts
89
- // the static description — same slot, more useful
90
- // information. The only place agent in-flight activity
91
- // surfaces while the workflow is active. Color matches
92
- // the card accent (violet) so green stays exclusive to
93
- // "done". `key={liveStatus}` retriggers the fade-in
94
- // every time the status text rotates, so consecutive
95
- // tool calls feel like they tick instead of swap.
96
- _jsxs("span", { className: "flex min-w-0 items-baseline gap-1.5 text-xs text-violet-700 dark:text-violet-300", children: [_jsx("span", { className: "inline-flex h-1 w-1 shrink-0 translate-y-[-1px] animate-pulse rounded-full bg-violet-500" }), _jsx("span", { className: "animate-in fade-in-0 slide-in-from-left-1 truncate duration-300", children: liveStatus }, liveStatus)] })) : definition.description ? (_jsx("span", { className: cn('min-w-0 truncate text-xs font-normal', status === 'pending' ? 'text-muted-foreground/40' : 'text-muted-foreground/70'), children: definition.description })) : null] }), items.length > 0 ? (_jsx("span", { className: "text-muted-foreground/60 animate-in fade-in-0 zoom-in-95 mr-1 shrink-0 text-[10px] tabular-nums duration-200", children: items.length }, items.length)) : null, hasBody ? (_jsx(ChevronRight, { className: cn('text-muted-foreground h-4 w-4 shrink-0 transition-transform duration-200 ease-out', expanded && 'rotate-90') })) : null] }) }), _jsx(Collapsible.Content, { className: cn('overflow-hidden',
94
+ status === 'running' && 'border-violet-500/40 bg-violet-500/5 dark:bg-violet-500/10', status === 'done' && 'border-border bg-background dark:bg-neutral-800/50', status === 'pending' && 'border-border/40 bg-muted/20 dark:bg-neutral-800/30', status === 'failed' && 'border-red-500/40 bg-red-500/5 dark:bg-red-500/10', status === 'interrupted' && 'border-amber-500/40 bg-amber-500/5 dark:bg-amber-500/10'), style: { animationDelay: `${Math.min(mountIndex, 6) * 40}ms`, animationDuration: '300ms' }, children: [_jsx(Collapsible.Trigger, { asChild: true, children: _jsxs("button", { type: "button", disabled: !hasBody, className: cn('flex w-full items-center gap-3 px-3 py-1.5 text-left transition-colors duration-200', hasBody && 'hover:bg-muted/40 cursor-pointer', !hasBody && 'cursor-default'), children: [_jsx(StatusIcon, { status: status }), _jsxs("div", { className: "flex min-w-0 flex-1 items-baseline gap-2", children: [_jsx("span", { className: cn('shrink-0 truncate text-sm font-medium transition-colors duration-300', status === 'pending' && 'text-muted-foreground/60'), children: definition.title }), status === 'interrupted' ? (_jsx("span", { className: "min-w-0 truncate text-xs font-medium text-amber-600 dark:text-amber-400", children: "Interrupted" })) : liveStatus && status === 'running' ? (_jsxs("span", { className: "flex min-w-0 items-baseline gap-1.5 text-xs text-violet-700 dark:text-violet-300", children: [_jsx("span", { className: "inline-flex h-1 w-1 shrink-0 translate-y-[-1px] animate-pulse rounded-full bg-violet-500" }), _jsx("span", { className: "animate-in fade-in-0 slide-in-from-left-1 truncate duration-300", children: liveStatus }, liveStatus)] })) : definition.description ? (_jsx("span", { className: cn('min-w-0 truncate text-xs font-normal', status === 'pending' ? 'text-muted-foreground/40' : 'text-muted-foreground/70'), children: definition.description })) : null] }), items.length > 0 ? (_jsx("span", { className: "text-muted-foreground/60 animate-in fade-in-0 zoom-in-95 mr-1 shrink-0 text-[10px] tabular-nums duration-200", children: items.length }, items.length)) : null, hasBody ? (_jsx(ChevronRight, { className: cn('text-muted-foreground h-4 w-4 shrink-0 transition-transform duration-200 ease-out', expanded && 'rotate-90') })) : null] }) }), _jsx(Collapsible.Content, { className: cn('overflow-hidden',
97
95
  // The keyframes (defined in globals.css) animate from
98
96
  // height: 0 ↔ var(--radix-collapsible-content-height) so
99
97
  // the body smoothly slides open and back. Both directions
100
98
  // get matching cubic-bezier curves — one ease-out for
101
99
  // open, one ease-in for close — so the motion never feels
102
100
  // lopsided.
103
- 'data-[state=open]:animate-collapsible-down data-[state=closed]:animate-collapsible-up'), children: _jsxs("div", { className: "border-border/40 space-y-2 border-t px-3 py-2.5 text-xs", children: [error ? (_jsx("p", { className: "rounded bg-red-500/10 p-2 text-red-600 dark:text-red-400", children: error })) : null, details.length > 0 ? (_jsx("ul", { className: "text-muted-foreground list-disc space-y-0.5 ps-4", children: details.map((d) => (_jsx("li", { children: d }, d))) })) : null, items.length > 0 ? (_jsx("div", { className: "-mx-1 flex flex-col gap-1", children: items.map((item, idx) => item.kind === 'tool' ? (_jsx("div", { className: "animate-in fade-in-0 slide-in-from-top-1 duration-200", style: { animationDelay: `${Math.min(idx, 6) * 30}ms` }, children: _jsx(ToolBubble, { text: item.message.content }) }, item.message.id)) : (_jsx("div", { className: "text-foreground animate-in fade-in-0 slide-in-from-top-1 px-1 text-xs leading-relaxed duration-200", style: { animationDelay: `${Math.min(idx, 6) * 30}ms` }, children: _jsx(Markdown, { components: markdownComponents, children: item.message.content }) }, item.message.id))) })) : null] }) })] }) }));
101
+ 'data-[state=open]:animate-collapsible-down data-[state=closed]:animate-collapsible-up'), children: _jsxs("div", { className: "border-border/40 space-y-2 border-t px-3 py-2.5 text-xs", children: [status === 'interrupted' && !error ? (_jsxs("div", { className: "flex items-center justify-between rounded bg-amber-500/10 p-2", children: [_jsx("span", { className: "text-amber-700 dark:text-amber-400", children: "This step was interrupted before it could finish." }), onRetry ? (_jsx("button", { type: "button", onClick: (e) => {
102
+ e.stopPropagation();
103
+ setOptimisticRunning(true);
104
+ setExpanded(false);
105
+ onRetry();
106
+ }, className: "ms-3 shrink-0 cursor-pointer rounded-md border border-amber-500/40 bg-amber-500/10 px-3 py-1 text-[11px] font-medium text-amber-700 transition-colors hover:bg-amber-500/20 dark:text-amber-400", children: "Continue" })) : null] })) : null, error ? (_jsx("p", { className: "rounded bg-red-500/10 p-2 text-red-600 dark:text-red-400", children: error })) : null, details.length > 0 ? (_jsx("ul", { className: "text-muted-foreground list-disc space-y-0.5 ps-4", children: details.map((d) => (_jsx("li", { children: d }, d))) })) : null, items.length > 0 ? (_jsx("div", { className: "-mx-1 flex flex-col gap-1", children: items.map((item, idx) => item.kind === 'tool' ? (_jsx("div", { className: "animate-in fade-in-0 slide-in-from-top-1 duration-200", style: { animationDelay: `${Math.min(idx, 6) * 30}ms` }, children: _jsx(ToolBubble, { text: item.message.content }) }, item.message.id)) : (_jsx("div", { className: "text-foreground animate-in fade-in-0 slide-in-from-top-1 px-1 text-xs leading-relaxed duration-200", style: { animationDelay: `${Math.min(idx, 6) * 30}ms` }, children: _jsx(Markdown, { components: markdownComponents, children: item.message.content }) }, item.message.id))) })) : null] }) })] }) }));
104
107
  }
105
108
  function StatusIcon({ status }) {
106
109
  if (status === 'running') {
@@ -113,7 +116,7 @@ function StatusIcon({ status }) {
113
116
  return (_jsx("div", { className: "flex h-4 w-4 shrink-0 items-center justify-center rounded-full bg-red-500 text-white", children: _jsx(AlertTriangle, { className: "h-2.5 w-2.5", strokeWidth: 3 }) }));
114
117
  }
115
118
  if (status === 'interrupted') {
116
- return _jsx(AlertTriangle, { className: "h-4 w-4 shrink-0 text-amber-500" });
119
+ return (_jsx("div", { className: "flex h-4 w-4 shrink-0 items-center justify-center rounded-full bg-amber-500 text-white", children: _jsx(AlertTriangle, { className: "h-2.5 w-2.5", strokeWidth: 3 }) }));
117
120
  }
118
121
  return _jsx(Circle, { className: "text-muted-foreground/30 h-4 w-4 shrink-0" });
119
122
  }
@@ -1 +1 @@
1
- {"version":3,"file":"control-center-inner.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/features/control-center/control-center-inner.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,IAAI,EAAY,MAAM,eAAe,CAAC;AAoBpD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uCAAuC,CAAC;AAoC5E,UAAU,uBAAuB;IAC/B,YAAY,EAAE,cAAc,EAAE,CAAC;IAC/B,YAAY,EAAE,IAAI,EAAE,CAAC;CACtB;AAED,wBAAgB,kBAAkB,CAAC,EAAE,YAAY,EAAE,YAAY,EAAE,EAAE,uBAAuB,2CAulBzF"}
1
+ {"version":3,"file":"control-center-inner.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/features/control-center/control-center-inner.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,IAAI,EAAY,MAAM,eAAe,CAAC;AAoBpD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uCAAuC,CAAC;AAoC5E,UAAU,uBAAuB;IAC/B,YAAY,EAAE,cAAc,EAAE,CAAC;IAC/B,YAAY,EAAE,IAAI,EAAE,CAAC;CACtB;AAED,wBAAgB,kBAAkB,CAAC,EAAE,YAAY,EAAE,YAAY,EAAE,EAAE,uBAAuB,2CAylBzF"}
@@ -381,7 +381,7 @@ export function ControlCenterInner({ initialNodes, initialEdges }) {
381
381
  setPendingDeleteWorkspaceId(id);
382
382
  setDeleteWorkspaceOpen(true);
383
383
  }, onManage: () => setManageWorkspaceOpen(true) }) }));
384
- return (_jsxs(_Fragment, { children: [_jsx(FeaturesCanvas, { nodes: showCanvas ? displayNodes : [], edges: showCanvas ? workspaceFilteredEdges : [], selectedFeatureId: selectedFeatureId, selectedRepository: selectedRepository, defaultViewport: defaultViewport, onNodesChange: onNodesChange, onConnect: handleConnect, onAddFeature: handleAddFeature, onNodeClick: handleNodeClick, onPaneClick: handleClearDrawers, onMoveEnd: handleMoveEnd, toolbar: canvasToolbar, emptyState: emptyStateNode }), showCanvas ? _jsx(CreateFab, { actions: fabActions }) : null, _jsx(NewProjectDialog, { open: workspaceNewProjectOpen, onOpenChange: setWorkspaceNewProjectOpen, onCreated: (path) => addRepoAndFocus(path) }), _jsx(ManageWorkspaceDialog, { open: manageWorkspaceOpen, onOpenChange: setManageWorkspaceOpen, workspace: activeWorkspace, allNodes: nodes, onSave: (members) => setWorkspaceMembers(activeWorkspace.id, members) }), _jsx(WorkspaceNameDialog, { open: createWorkspaceOpen, onOpenChange: setCreateWorkspaceOpen, title: "New workspace", description: "Create a workspace to filter the canvas to a specific set of repositories and features.", confirmLabel: "Create", onConfirm: (name) => {
384
+ return (_jsxs(_Fragment, { children: [_jsx(FeaturesCanvas, { nodes: showCanvas ? displayNodes : [], edges: showCanvas ? workspaceFilteredEdges : [], selectedFeatureId: selectedFeatureId, selectedRepository: selectedRepository, defaultViewport: defaultViewport, onNodesChange: onNodesChange, onConnect: handleConnect, onAddFeature: handleAddFeature, onNodeClick: handleNodeClick, onPaneClick: handleClearDrawers, onMoveEnd: handleMoveEnd, toolbar: canvasToolbar, showToolbarOnEmpty: workspaceFilteredEmpty, emptyState: emptyStateNode }), showCanvas ? _jsx(CreateFab, { actions: fabActions }) : null, _jsx(NewProjectDialog, { open: workspaceNewProjectOpen, onOpenChange: setWorkspaceNewProjectOpen, onCreated: (path) => addRepoAndFocus(path) }), _jsx(ManageWorkspaceDialog, { open: manageWorkspaceOpen, onOpenChange: setManageWorkspaceOpen, workspace: activeWorkspace, allNodes: nodes, onSave: (members) => setWorkspaceMembers(activeWorkspace.id, members) }), _jsx(WorkspaceNameDialog, { open: createWorkspaceOpen, onOpenChange: setCreateWorkspaceOpen, title: "New workspace", description: "Create a workspace to filter the canvas to a specific set of repositories and features.", confirmLabel: "Create", onConfirm: (name) => {
385
385
  createWorkspace(name);
386
386
  setManageWorkspaceOpen(true);
387
387
  } }), _jsx(WorkspaceNameDialog, { open: renameWorkspaceOpen, onOpenChange: setRenameWorkspaceOpen, title: "Rename workspace", initialValue: activeWorkspace.name, confirmLabel: "Rename", onConfirm: (name) => renameWorkspace(activeWorkspace.id, name) }), _jsx(AlertDialog, { open: deleteWorkspaceOpen, onOpenChange: (open) => {
@@ -398,7 +398,8 @@ export function ControlCenterInner({ initialNodes, initialEdges }) {
398
398
  setShowCreatePrompt(false);
399
399
  addRepoAndFocus(path);
400
400
  }, onApplicationCreated: (appId) => {
401
- setShowCreatePrompt(false);
401
+ // Navigate first — keep overlay mounted to avoid canvas flash.
402
+ // The overlay unmounts when the route changes.
402
403
  router.push(`/application/${appId}`);
403
404
  }, onClose: () => setShowCreatePrompt(false), className: "bg-background" }) })) : null] }));
404
405
  }
@@ -20,7 +20,9 @@ export interface FeaturesCanvasProps {
20
20
  onCanvasDrag?: () => void;
21
21
  onMoveEnd?: OnMoveEnd;
22
22
  toolbar?: React.ReactNode;
23
+ /** Show the toolbar even when the canvas is empty (e.g. empty workspace). Defaults to true. */
24
+ showToolbarOnEmpty?: boolean;
23
25
  emptyState?: React.ReactNode;
24
26
  }
25
- export declare function FeaturesCanvas({ nodes, edges, selectedFeatureId, selectedRepository, defaultViewport, onNodesChange, onAddFeature, onConnect, onNodeClick, onPaneClick, onCanvasDrag, onMoveEnd, toolbar, emptyState, }: FeaturesCanvasProps): import("react/jsx-runtime").JSX.Element;
27
+ export declare function FeaturesCanvas({ nodes, edges, selectedFeatureId, selectedRepository, defaultViewport, onNodesChange, onAddFeature, onConnect, onNodeClick, onPaneClick, onCanvasDrag, onMoveEnd, toolbar, showToolbarOnEmpty, emptyState, }: FeaturesCanvasProps): import("react/jsx-runtime").JSX.Element;
26
28
  //# sourceMappingURL=features-canvas.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"features-canvas.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/features/features-canvas/features-canvas.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,UAAU,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAOvF,OAAO,KAAK,EAAE,eAAe,EAAmB,MAAM,kCAAkC,CAAC;AAEzF,OAAO,KAAK,EAAE,kBAAkB,EAAsB,MAAM,qCAAqC,CAAC;AAElG,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,8DAA8D,CAAC;AAGxG,MAAM,MAAM,cAAc,GAAG,eAAe,GAAG,kBAAkB,GAAG,mBAAmB,CAAC;AAExF,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,cAAc,EAAE,CAAC;IACxB,KAAK,EAAE,IAAI,EAAE,CAAC;IACd,iBAAiB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,kBAAkB,CAAC,EAAE;QAAE,EAAE,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CAAC;IAChE,eAAe,CAAC,EAAE,QAAQ,CAAC;IAC3B,aAAa,CAAC,EAAE,CAAC,OAAO,EAAE,UAAU,CAAC,cAAc,CAAC,EAAE,KAAK,IAAI,CAAC;IAChE,YAAY,CAAC,EAAE,MAAM,IAAI,CAAC;IAC1B,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,UAAU,EAAE,IAAI,EAAE,cAAc,KAAK,IAAI,CAAC;IACtE,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,UAAU,KAAK,IAAI,CAAC;IAChD,SAAS,CAAC,EAAE,CAAC,UAAU,EAAE,UAAU,KAAK,IAAI,CAAC;IAC7C,YAAY,CAAC,EAAE,MAAM,IAAI,CAAC;IAC1B,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,OAAO,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,UAAU,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;CAC9B;AAID,wBAAgB,cAAc,CAAC,EAC7B,KAAK,EACL,KAAK,EACL,iBAAiB,EACjB,kBAAkB,EAClB,eAAe,EACf,aAAa,EACb,YAAY,EACZ,SAAS,EACT,WAAW,EACX,WAAW,EACX,YAAY,EACZ,SAAS,EACT,OAAO,EACP,UAAU,GACX,EAAE,mBAAmB,2CAgJrB"}
1
+ {"version":3,"file":"features-canvas.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/features/features-canvas/features-canvas.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,UAAU,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAOvF,OAAO,KAAK,EAAE,eAAe,EAAmB,MAAM,kCAAkC,CAAC;AAEzF,OAAO,KAAK,EAAE,kBAAkB,EAAsB,MAAM,qCAAqC,CAAC;AAElG,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,8DAA8D,CAAC;AAGxG,MAAM,MAAM,cAAc,GAAG,eAAe,GAAG,kBAAkB,GAAG,mBAAmB,CAAC;AAExF,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,cAAc,EAAE,CAAC;IACxB,KAAK,EAAE,IAAI,EAAE,CAAC;IACd,iBAAiB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,kBAAkB,CAAC,EAAE;QAAE,EAAE,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CAAC;IAChE,eAAe,CAAC,EAAE,QAAQ,CAAC;IAC3B,aAAa,CAAC,EAAE,CAAC,OAAO,EAAE,UAAU,CAAC,cAAc,CAAC,EAAE,KAAK,IAAI,CAAC;IAChE,YAAY,CAAC,EAAE,MAAM,IAAI,CAAC;IAC1B,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,UAAU,EAAE,IAAI,EAAE,cAAc,KAAK,IAAI,CAAC;IACtE,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,UAAU,KAAK,IAAI,CAAC;IAChD,SAAS,CAAC,EAAE,CAAC,UAAU,EAAE,UAAU,KAAK,IAAI,CAAC;IAC7C,YAAY,CAAC,EAAE,MAAM,IAAI,CAAC;IAC1B,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,OAAO,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,+FAA+F;IAC/F,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,UAAU,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;CAC9B;AAID,wBAAgB,cAAc,CAAC,EAC7B,KAAK,EACL,KAAK,EACL,iBAAiB,EACjB,kBAAkB,EAClB,eAAe,EACf,aAAa,EACb,YAAY,EACZ,SAAS,EACT,WAAW,EACX,WAAW,EACX,YAAY,EACZ,SAAS,EACT,OAAO,EACP,kBAAyB,EACzB,UAAU,GACX,EAAE,mBAAmB,2CAiJrB"}
@@ -12,7 +12,7 @@ import { RepositoryNode } from '../../common/repository-node/index.js';
12
12
  import { ApplicationNode } from '../../common/application-node/application-node.js';
13
13
  import { DependencyEdge } from './dependency-edge.js';
14
14
  const FALLBACK_VIEWPORT = { x: 30, y: 30, zoom: 0.85 };
15
- export function FeaturesCanvas({ nodes, edges, selectedFeatureId, selectedRepository, defaultViewport, onNodesChange, onAddFeature, onConnect, onNodeClick, onPaneClick, onCanvasDrag, onMoveEnd, toolbar, emptyState, }) {
15
+ export function FeaturesCanvas({ nodes, edges, selectedFeatureId, selectedRepository, defaultViewport, onNodesChange, onAddFeature, onConnect, onNodeClick, onPaneClick, onCanvasDrag, onMoveEnd, toolbar, showToolbarOnEmpty = true, emptyState, }) {
16
16
  const { t } = useTranslation('web');
17
17
  const nodeTypes = useMemo(() => ({
18
18
  featureNode: FeatureNode,
@@ -73,5 +73,5 @@ export function FeaturesCanvas({ nodes, edges, selectedFeatureId, selectedReposi
73
73
  }, [isEmpty]);
74
74
  const fallbackEmptyState = isEmpty && !emptyState ? (_jsx(EmptyState, { title: t('canvas.noFeatures'), description: t('canvas.noFeaturesDescription'), action: _jsxs(Button, { onClick: onAddFeature, children: [_jsx(Plus, { className: "me-2 h-4 w-4" }), t('canvas.newFeature')] }) })) : null;
75
75
  const overlayContent = emptyState ?? fallbackEmptyState;
76
- return (_jsxs("div", { "data-testid": isEmpty ? 'features-canvas-empty' : 'features-canvas', "data-no-drawer-close": true, className: "dark:bg-background pointer-events-auto relative h-full w-full bg-[#f6f7f8]", children: [_jsxs(ReactFlow, { nodes: enrichedNodes, edges: edges, nodeTypes: nodeTypes, edgeTypes: edgeTypes, onConnect: onConnect, onNodesChange: onNodesChange, onNodeClick: onNodeClick, onPaneClick: onPaneClick, onMoveStart: onCanvasDrag, onMoveEnd: onMoveEnd, defaultViewport: defaultViewport ?? FALLBACK_VIEWPORT, nodesDraggable: false, nodesConnectable: false, elementsSelectable: false, proOptions: { hideAttribution: true }, className: "[&_.react-flow__pane]:!cursor-default", children: [_jsx(Background, { variant: BackgroundVariant.Dots, gap: 24, size: 1, color: "#b8bcc4", className: "dark:[&_circle]:!fill-white/[0.1]" }), toolbar && !isEmpty ? (_jsx(Panel, { position: "top-right", className: "!me-3 !mt-3", children: toolbar })) : null] }), showOverlay && overlayContent ? (_jsx("div", { className: cn('pointer-events-none absolute inset-0 z-10 flex items-center justify-center transition-opacity duration-300', overlayExiting ? 'opacity-0' : 'animate-in fade-in opacity-100 duration-200'), children: _jsx("div", { className: "pointer-events-auto h-full w-full", children: overlayContent }) })) : null, toolbar && isEmpty ? (_jsx("div", { className: "pointer-events-auto absolute end-3 top-3 z-20", children: toolbar })) : null] }));
76
+ return (_jsxs("div", { "data-testid": isEmpty ? 'features-canvas-empty' : 'features-canvas', "data-no-drawer-close": true, className: "dark:bg-background pointer-events-auto relative h-full w-full bg-[#f6f7f8]", children: [_jsxs(ReactFlow, { nodes: enrichedNodes, edges: edges, nodeTypes: nodeTypes, edgeTypes: edgeTypes, onConnect: onConnect, onNodesChange: onNodesChange, onNodeClick: onNodeClick, onPaneClick: onPaneClick, onMoveStart: onCanvasDrag, onMoveEnd: onMoveEnd, defaultViewport: defaultViewport ?? FALLBACK_VIEWPORT, nodesDraggable: false, nodesConnectable: false, elementsSelectable: false, proOptions: { hideAttribution: true }, className: "[&_.react-flow__pane]:!cursor-default", children: [_jsx(Background, { variant: BackgroundVariant.Dots, gap: 24, size: 1, color: "#b8bcc4", className: "dark:[&_circle]:!fill-white/[0.1]" }), toolbar && !isEmpty ? (_jsx(Panel, { position: "top-right", className: "!me-3 !mt-3", children: toolbar })) : null] }), showOverlay && overlayContent ? (_jsx("div", { className: cn('pointer-events-none absolute inset-0 z-10 flex items-center justify-center transition-opacity duration-300', overlayExiting ? 'opacity-0' : 'animate-in fade-in opacity-100 duration-200'), children: _jsx("div", { className: "pointer-events-auto h-full w-full", children: overlayContent }) })) : null, toolbar && isEmpty && showToolbarOnEmpty ? (_jsx("div", { className: "pointer-events-auto absolute end-3 top-3 z-20", children: toolbar })) : null] }));
77
77
  }
@@ -1 +1 @@
1
- {"version":3,"file":"language-settings-section.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/features/settings/language-settings-section.tsx"],"names":[],"mappings":"AA6BA,MAAM,WAAW,4BAA4B;IAC3C,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,wBAAgB,uBAAuB,CAAC,EACtC,QAAQ,EAAE,eAAe,GAC1B,EAAE,4BAA4B,2CA4E9B"}
1
+ {"version":3,"file":"language-settings-section.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/features/settings/language-settings-section.tsx"],"names":[],"mappings":"AA8BA,MAAM,WAAW,4BAA4B;IAC3C,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,wBAAgB,uBAAuB,CAAC,EACtC,QAAQ,EAAE,eAAe,GAC1B,EAAE,4BAA4B,2CA4E9B"}
@@ -11,6 +11,7 @@ import { updateSettingsAction } from '../../../app/actions/update-settings.js';
11
11
  import { Language } from '../../../../../../packages/core/src/domain/generated/output.js';
12
12
  const LANGUAGE_OPTIONS = [
13
13
  { value: Language.English, label: 'English', nativeName: 'English' },
14
+ { value: Language.Ukrainian, label: 'Українська', nativeName: 'Українська' },
14
15
  { value: Language.Russian, label: 'Русский', nativeName: 'Русский' },
15
16
  { value: Language.Portuguese, label: 'Português', nativeName: 'Português' },
16
17
  { value: Language.Spanish, label: 'Español', nativeName: 'Español' },
@@ -11,6 +11,7 @@ declare const meta: {
11
11
  export default meta;
12
12
  type Story = StoryObj<typeof meta>;
13
13
  export declare const Default: Story;
14
+ export declare const Ukrainian: Story;
14
15
  export declare const Russian: Story;
15
16
  export declare const Arabic: Story;
16
17
  export declare const Hebrew: Story;
@@ -1 +1 @@
1
- {"version":3,"file":"language-settings-section.stories.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/features/settings/language-settings-section.stories.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAQ,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,uBAAuB,EAAE,MAAM,6BAA6B,CAAC;AAGtE,QAAA,MAAM,IAAI;;;;;;;CAOsC,CAAC;AAEjD,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,IAAI,CAAC,CAAC;AAEnC,eAAO,MAAM,OAAO,EAAE,KAIrB,CAAC;AAEF,eAAO,MAAM,OAAO,EAAE,KAIrB,CAAC;AAEF,eAAO,MAAM,MAAM,EAAE,KAIpB,CAAC;AAEF,eAAO,MAAM,MAAM,EAAE,KAIpB,CAAC;AAEF,eAAO,MAAM,MAAM,EAAE,KAIpB,CAAC"}
1
+ {"version":3,"file":"language-settings-section.stories.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/features/settings/language-settings-section.stories.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAQ,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,uBAAuB,EAAE,MAAM,6BAA6B,CAAC;AAGtE,QAAA,MAAM,IAAI;;;;;;;CAOsC,CAAC;AAEjD,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,IAAI,CAAC,CAAC;AAEnC,eAAO,MAAM,OAAO,EAAE,KAIrB,CAAC;AAEF,eAAO,MAAM,SAAS,EAAE,KAIvB,CAAC;AAEF,eAAO,MAAM,OAAO,EAAE,KAIrB,CAAC;AAEF,eAAO,MAAM,MAAM,EAAE,KAIpB,CAAC;AAEF,eAAO,MAAM,MAAM,EAAE,KAIpB,CAAC;AAEF,eAAO,MAAM,MAAM,EAAE,KAIpB,CAAC"}
@@ -14,6 +14,11 @@ export const Default = {
14
14
  language: Language.English,
15
15
  },
16
16
  };
17
+ export const Ukrainian = {
18
+ args: {
19
+ language: Language.Ukrainian,
20
+ },
21
+ };
17
22
  export const Russian = {
18
23
  args: {
19
24
  language: Language.Russian,
@@ -1 +1 @@
1
- {"version":3,"file":"settings-page-client.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/features/settings/settings-page-client.tsx"],"names":[],"mappings":"AA4CA,OAAO,KAAK,EACV,QAAQ,EAKT,MAAM,sCAAsC,CAAC;AAC9C,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,uCAAuC,CAAC;AA8B/E,MAAM,WAAW,uBAAuB;IACtC,QAAQ,EAAE,QAAQ,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,kBAAkB,CAAC,EAAE,iBAAiB,EAAE,CAAC;CAC1C;AA+QD,wBAAgB,kBAAkB,CAAC,EACjC,QAAQ,EACR,QAAQ,EACR,UAAU,EACV,kBAAkB,GACnB,EAAE,uBAAuB,2CAw5CzB"}
1
+ {"version":3,"file":"settings-page-client.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/features/settings/settings-page-client.tsx"],"names":[],"mappings":"AAsDA,OAAO,KAAK,EACV,QAAQ,EAKT,MAAM,sCAAsC,CAAC;AAC9C,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,uCAAuC,CAAC;AA8B/E,MAAM,WAAW,uBAAuB;IACtC,QAAQ,EAAE,QAAQ,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,kBAAkB,CAAC,EAAE,iBAAiB,EAAE,CAAC;CAC1C;AA+QD,wBAAgB,kBAAkB,CAAC,EACjC,QAAQ,EACR,QAAQ,EACR,UAAU,EACV,kBAAkB,GACnB,EAAE,uBAAuB,2CAs7CzB"}
@@ -12,7 +12,17 @@ import { updateSettingsAction } from '../../../app/actions/update-settings.js';
12
12
  import { EditorType, Language, TerminalType, } from '../../../../../../packages/core/src/domain/generated/output.js';
13
13
  import { getEditorTypeIcon } from '../../common/editor-type-icons.js';
14
14
  import { AgentModelPicker } from '../../features/settings/AgentModelPicker/index.js';
15
- import { LanguageSettingsSection } from '../../features/settings/language-settings-section.js';
15
+ const LANGUAGE_OPTIONS = [
16
+ { value: Language.English, nativeName: 'English' },
17
+ { value: Language.Ukrainian, nativeName: 'Українська' },
18
+ { value: Language.Russian, nativeName: 'Русский' },
19
+ { value: Language.Portuguese, nativeName: 'Português' },
20
+ { value: Language.Spanish, nativeName: 'Español' },
21
+ { value: Language.Arabic, nativeName: 'العربية' },
22
+ { value: Language.Hebrew, nativeName: 'עברית' },
23
+ { value: Language.French, nativeName: 'Français' },
24
+ { value: Language.German, nativeName: 'Deutsch' },
25
+ ];
16
26
  import { TimeoutSlider } from '../../features/settings/timeout-slider.js';
17
27
  const EDITOR_OPTIONS = [
18
28
  { value: EditorType.VsCode, label: 'VS Code' },
@@ -121,7 +131,7 @@ function SectionHint({ children, links, }) {
121
131
  }
122
132
  /* ── Main component ── */
123
133
  export function SettingsPageClient({ settings, shepHome, dbFileSize, availableTerminals, }) {
124
- const { t } = useTranslation('web');
134
+ const { t, i18n: i18nInstance } = useTranslation('web');
125
135
  const { showSaving, showSaved, save } = useSaveIndicator();
126
136
  const featureFlags = settings.featureFlags ?? {
127
137
  skills: false,
@@ -133,6 +143,16 @@ export function SettingsPageClient({ settings, shepHome, dbFileSize, availableTe
133
143
  reactFileManager: false,
134
144
  inventory: false,
135
145
  };
146
+ // Language state
147
+ const [language, setLanguage] = useState(settings.user?.preferredLanguage ?? Language.English);
148
+ function handleLanguageChange(value) {
149
+ setLanguage(value);
150
+ i18nInstance.changeLanguage(value);
151
+ const dir = value === 'ar' || value === 'he' ? 'rtl' : 'ltr';
152
+ document.documentElement.lang = value;
153
+ document.documentElement.dir = dir;
154
+ save({ user: { preferredLanguage: value } });
155
+ }
136
156
  // Agent state
137
157
  const [agentType, setAgentType] = useState(settings.agent.type);
138
158
  // Environment state
@@ -332,7 +352,7 @@ export function SettingsPageClient({ settings, shepHome, dbFileSize, availableTe
332
352
  return (_jsxs("button", { type: "button", onClick: () => scrollToSection(s.id), className: cn('flex cursor-pointer items-center gap-1 rounded-md px-1.5 py-1 text-[11px] transition-all', isActive
333
353
  ? 'bg-accent text-foreground font-medium'
334
354
  : 'text-muted-foreground/60 hover:text-foreground hover:bg-accent/50'), children: [_jsx(SectionIcon, { className: "h-3 w-3" }), _jsx("span", { className: "hidden sm:inline", children: t(s.labelKey) })] }, s.id));
335
- }) })] }) }), _jsxs("div", { className: "flex flex-col gap-3", children: [_jsx("div", { id: "section-language", className: "grid scroll-mt-18 grid-cols-1 gap-x-5 rounded-lg lg:grid-cols-[1fr_280px]", children: _jsx(LanguageSettingsSection, { language: settings.user?.preferredLanguage ?? Language.English }) }), _jsxs("div", { id: "section-agent", className: "grid scroll-mt-18 grid-cols-1 gap-x-5 rounded-lg lg:grid-cols-[1fr_280px]", children: [_jsx(SettingsSection, { icon: Bot, title: t('settings.agent.sectionTitle'), description: t('settings.agent.sectionDescription'), testId: "agent-settings-section", children: _jsx(SettingsRow, { label: t('settings.agent.agentAndModel'), description: t('settings.agent.agentAndModelDescription'), htmlFor: "agent-model-picker", children: _jsx(AgentModelPicker, { initialAgentType: agentType, initialModel: settings.models.default, mode: "settings", onAgentModelChange: (newAgent) => setAgentType(newAgent), className: "w-55" }) }) }), _jsx(SectionHint, { links: [
355
+ }) })] }) }), _jsxs("div", { className: "flex flex-col gap-3", children: [_jsx("div", { id: "section-language", className: "grid scroll-mt-18 grid-cols-1 gap-x-5 rounded-lg lg:grid-cols-[1fr_280px]", children: _jsx(SettingsSection, { icon: Globe, title: t('settings.language.title'), description: t('settings.language.description'), testId: "language-settings-section", children: _jsx(SettingsRow, { label: t('settings.language.label'), htmlFor: "display-language", children: _jsxs(Select, { value: language, onValueChange: handleLanguageChange, children: [_jsx(SelectTrigger, { id: "display-language", "data-testid": "language-select", className: "w-44", children: _jsx(SelectValue, { placeholder: t('settings.language.placeholder') }) }), _jsx(SelectContent, { children: LANGUAGE_OPTIONS.map((opt) => (_jsx(SelectItem, { value: opt.value, children: opt.nativeName }, opt.value))) })] }) }) }) }), _jsxs("div", { id: "section-agent", className: "grid scroll-mt-18 grid-cols-1 gap-x-5 rounded-lg lg:grid-cols-[1fr_280px]", children: [_jsx(SettingsSection, { icon: Bot, title: t('settings.agent.sectionTitle'), description: t('settings.agent.sectionDescription'), testId: "agent-settings-section", children: _jsx(SettingsRow, { label: t('settings.agent.agentAndModel'), description: t('settings.agent.agentAndModelDescription'), htmlFor: "agent-model-picker", children: _jsx(AgentModelPicker, { initialAgentType: agentType, initialModel: settings.models.default, mode: "settings", onAgentModelChange: (newAgent) => setAgentType(newAgent), className: "w-55" }) }) }), _jsx(SectionHint, { links: [
336
356
  {
337
357
  label: t('settings.agent.links.agentSystem'),
338
358
  href: 'https://github.com/shep-ai/shep/blob/main/docs/architecture/agent-system.md',
@@ -1 +1 @@
1
- {"version":3,"file":"app-sidebar.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/layouts/app-sidebar/app-sidebar.tsx"],"names":[],"mappings":"AA4CA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,2CAA2C,CAAC;AAI/E,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAE7D,MAAM,WAAW,WAAW;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,aAAa,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,cAAc,EAAE,MAAM,CAAC;IACvB,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,WAAW,EAAE,CAAC;IACxB,YAAY,EAAE,iBAAiB,CAAC;IAEhC,cAAc,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IAC7C,mFAAmF;IACnF,YAAY,CAAC,EAAE,CAAC,cAAc,EAAE,MAAM,KAAK,IAAI,CAAC;CACjD;AAED,wBAAgB,UAAU,CAAC,EACzB,QAAQ,EACR,YAAY,EAEZ,cAAc,EACd,YAAY,GACb,EAAE,eAAe,2CAkRjB"}
1
+ {"version":3,"file":"app-sidebar.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/layouts/app-sidebar/app-sidebar.tsx"],"names":[],"mappings":"AA6CA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,2CAA2C,CAAC;AAI/E,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAE7D,MAAM,WAAW,WAAW;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,aAAa,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,cAAc,EAAE,MAAM,CAAC;IACvB,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,WAAW,EAAE,CAAC;IACxB,YAAY,EAAE,iBAAiB,CAAC;IAEhC,cAAc,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IAC7C,mFAAmF;IACnF,YAAY,CAAC,EAAE,CAAC,cAAc,EAAE,MAAM,KAAK,IAAI,CAAC;CACjD;AAED,wBAAgB,UAAU,CAAC,EACzB,QAAQ,EACR,YAAY,EAEZ,cAAc,EACd,YAAY,GACb,EAAE,eAAe,2CAwRjB"}
@@ -2,7 +2,7 @@
2
2
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
3
  import { useMemo } from 'react';
4
4
  import { usePathname } from 'next/navigation';
5
- import { Home, Moon, Sun, Volume2, VolumeOff, Zap, ZapOff, Wrench, Puzzle, Settings, TableProperties, } from 'lucide-react';
5
+ import { Home, LayoutGrid, Moon, Sun, Volume2, VolumeOff, Zap, ZapOff, Wrench, Puzzle, Settings, TableProperties, } from 'lucide-react';
6
6
  import { useTranslation } from 'react-i18next';
7
7
  import { Sidebar, SidebarHeader, SidebarContent, SidebarFooter, SidebarMenu, SidebarMenuItem, SidebarMenuButton, SidebarRail, useSidebar, } from '../../ui/sidebar.js';
8
8
  import { ScrollArea } from '../../ui/scroll-area.js';
@@ -64,7 +64,7 @@ export function AppSidebar({ features, featureFlags, onFeatureClick, onAddFeatur
64
64
  'flex min-w-0 flex-1 items-center gap-2 overflow-hidden px-2',
65
65
  'transition-opacity duration-200 ease-out',
66
66
  expandedVisible ? 'opacity-100' : 'opacity-0',
67
- ].join(' '), "aria-hidden": !expandedVisible, children: [_jsx(ShepLogo, { className: "shrink-0", size: 20, variant: versionData.isDev ? 'dev' : 'default' }), _jsx("span", { className: "truncate text-sm font-semibold tracking-tight", children: "Shep" }), _jsx(VersionBadge, { version: versionData.version, branch: versionData.branch || undefined, commitHash: versionData.commitHash || undefined, isDev: versionData.isDev, packageName: versionData.packageName, description: versionData.description, instancePath: versionData.instancePath || undefined })] })) : null, _jsx(SidebarCollapseToggle, { className: "shrink-0 transition-all duration-200" })] }) }), _jsx(SidebarNavItem, { icon: Home, label: t('navigation.controlCenter'), href: "/", active: pathname === '/' }), featureFlags.inventory ? (_jsx(SidebarNavItem, { icon: TableProperties, label: t('navigation.inventory'), href: "/features", active: pathname === '/features' })) : null, _jsx(SidebarNavItem, { icon: Wrench, label: t('navigation.tools'), href: "/tools", active: pathname === '/tools' }), featureFlags.skills ? (_jsx(SidebarNavItem, { icon: Puzzle, label: t('navigation.skills'), href: "/skills", active: pathname === '/skills' })) : null, _jsx(SidebarNavItem, { icon: Settings, label: t('navigation.settings'), href: "/settings", active: pathname === '/settings' })] }) }), _jsx(SidebarContent, { children: showExpanded ? (_jsxs("div", { className: [
67
+ ].join(' '), "aria-hidden": !expandedVisible, children: [_jsx(ShepLogo, { className: "shrink-0", size: 20, variant: versionData.isDev ? 'dev' : 'default' }), _jsx("span", { className: "truncate text-sm font-semibold tracking-tight", children: "Shep" }), _jsx(VersionBadge, { version: versionData.version, branch: versionData.branch || undefined, commitHash: versionData.commitHash || undefined, isDev: versionData.isDev, packageName: versionData.packageName, description: versionData.description, instancePath: versionData.instancePath || undefined })] })) : null, _jsx(SidebarCollapseToggle, { className: "shrink-0 transition-all duration-200" })] }) }), _jsx(SidebarNavItem, { icon: Home, label: t('navigation.controlCenter'), href: "/", active: pathname === '/' }), featureFlags.inventory ? (_jsx(SidebarNavItem, { icon: TableProperties, label: t('navigation.inventory'), href: "/features", active: pathname === '/features' })) : null, _jsx(SidebarNavItem, { icon: LayoutGrid, label: t('navigation.applications'), href: "/applications", active: pathname === '/applications' }), _jsx(SidebarNavItem, { icon: Wrench, label: t('navigation.tools'), href: "/tools", active: pathname === '/tools' }), featureFlags.skills ? (_jsx(SidebarNavItem, { icon: Puzzle, label: t('navigation.skills'), href: "/skills", active: pathname === '/skills' })) : null, _jsx(SidebarNavItem, { icon: Settings, label: t('navigation.settings'), href: "/settings", active: pathname === '/settings' })] }) }), _jsx(SidebarContent, { children: showExpanded ? (_jsxs("div", { className: [
68
68
  'flex min-h-0 flex-1 flex-col overflow-hidden transition-opacity duration-200 ease-out',
69
69
  '[&_[data-sidebar=group-label]]:!mt-0 [&_[data-sidebar=group-label]]:!opacity-100 [&_[data-sidebar=group-label]]:!transition-none',
70
70
  expandedVisible ? 'opacity-100' : 'opacity-0',
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Shared status derivation for application cards, canvas nodes, and
3
+ * the application page status pill.
4
+ *
5
+ * Priority (highest wins):
6
+ *
7
+ * - `processing` → "In Progress" (agent actively running a turn)
8
+ * - `awaiting_input` → "Action Required" (agent blocked on user input)
9
+ * - effectiveStatus → from use case (interrupted/failed/running)
10
+ * - deployment live → "Live" (dev server running)
11
+ * - persisted Error → "Error"
12
+ * - otherwise → "Ready" (idle, no issues)
13
+ */
14
+ export interface AppLiveStatus {
15
+ label: string;
16
+ dotClass: string;
17
+ borderClass: string;
18
+ pulse: boolean;
19
+ /** Whether the preview/deploy action should be disabled in this state. */
20
+ previewDisabled: boolean;
21
+ }
22
+ export declare function deriveAppLiveStatus(persistedStatus: string, turnStatus: string, hasDeployment: boolean, effectiveStatus?: string): AppLiveStatus;
23
+ //# sourceMappingURL=derive-app-status.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"derive-app-status.d.ts","sourceRoot":"","sources":["../../../../../src/presentation/web/lib/derive-app-status.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,OAAO,CAAC;IACf,0EAA0E;IAC1E,eAAe,EAAE,OAAO,CAAC;CAC1B;AAED,wBAAgB,mBAAmB,CACjC,eAAe,EAAE,MAAM,EACvB,UAAU,EAAE,MAAM,EAClB,aAAa,EAAE,OAAO,EACtB,eAAe,CAAC,EAAE,MAAM,GACvB,aAAa,CA+Ef"}