@shepai/cli 1.182.1 → 1.183.0

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 (519) 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/use-cases/applications/create-application.use-case.d.ts +3 -3
  5. package/dist/packages/core/src/application/use-cases/applications/create-application.use-case.d.ts.map +1 -1
  6. package/dist/packages/core/src/application/use-cases/applications/create-application.use-case.js +13 -21
  7. package/dist/packages/core/src/application/use-cases/applications/list-applications.use-case.d.ts +19 -3
  8. package/dist/packages/core/src/application/use-cases/applications/list-applications.use-case.d.ts.map +1 -1
  9. package/dist/packages/core/src/application/use-cases/applications/list-applications.use-case.js +37 -4
  10. package/dist/packages/core/src/application/use-cases/applications/resume-application-workflow.use-case.d.ts +30 -0
  11. package/dist/packages/core/src/application/use-cases/applications/resume-application-workflow.use-case.d.ts.map +1 -0
  12. package/dist/packages/core/src/application/use-cases/applications/resume-application-workflow.use-case.js +122 -0
  13. package/dist/packages/core/src/domain/generated/output.d.ts +8 -0
  14. package/dist/packages/core/src/domain/generated/output.d.ts.map +1 -1
  15. package/dist/packages/core/src/infrastructure/di/container.d.ts.map +1 -1
  16. package/dist/packages/core/src/infrastructure/di/container.js +5 -0
  17. package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/application.mapper.d.ts +2 -0
  18. package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/application.mapper.d.ts.map +1 -1
  19. package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/application.mapper.js +4 -0
  20. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/058-add-setup-complete-to-applications.d.ts +5 -0
  21. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/058-add-setup-complete-to-applications.d.ts.map +1 -0
  22. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/058-add-setup-complete-to-applications.js +10 -0
  23. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/059-add-agent-session-id-to-applications.d.ts +5 -0
  24. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/059-add-agent-session-id-to-applications.d.ts.map +1 -0
  25. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/059-add-agent-session-id-to-applications.js +10 -0
  26. package/dist/packages/core/src/infrastructure/repositories/sqlite-application.repository.d.ts +1 -1
  27. package/dist/packages/core/src/infrastructure/repositories/sqlite-application.repository.d.ts.map +1 -1
  28. package/dist/packages/core/src/infrastructure/repositories/sqlite-application.repository.js +10 -2
  29. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/node-helpers.d.ts.map +1 -1
  30. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/node-helpers.js +4 -1
  31. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/prompts/fast-implement.prompt.d.ts.map +1 -1
  32. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/prompts/fast-implement.prompt.js +4 -1
  33. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/prompts/implement.prompt.d.ts.map +1 -1
  34. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/prompts/implement.prompt.js +4 -1
  35. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/prompts/merge-prompts.d.ts.map +1 -1
  36. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/prompts/merge-prompts.js +11 -6
  37. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/prompts/pr-branding.d.ts +2 -2
  38. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/prompts/pr-branding.d.ts.map +1 -1
  39. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/prompts/pr-branding.js +2 -2
  40. package/dist/packages/core/src/infrastructure/services/git/git-pr.service.d.ts.map +1 -1
  41. package/dist/packages/core/src/infrastructure/services/git/git-pr.service.js +3 -2
  42. package/dist/packages/core/src/infrastructure/services/git/pr-branding.d.ts +16 -5
  43. package/dist/packages/core/src/infrastructure/services/git/pr-branding.d.ts.map +1 -1
  44. package/dist/packages/core/src/infrastructure/services/git/pr-branding.js +38 -7
  45. package/dist/src/presentation/web/app/api/applications/[id]/resume/route.d.ts +20 -0
  46. package/dist/src/presentation/web/app/api/applications/[id]/resume/route.d.ts.map +1 -0
  47. package/dist/src/presentation/web/app/api/applications/[id]/resume/route.js +25 -0
  48. package/dist/src/presentation/web/app/api/applications/[id]/route.d.ts +19 -0
  49. package/dist/src/presentation/web/app/api/applications/[id]/route.d.ts.map +1 -0
  50. package/dist/src/presentation/web/app/api/applications/[id]/route.js +46 -0
  51. package/dist/src/presentation/web/app/api/applications/route.d.ts +9 -0
  52. package/dist/src/presentation/web/app/api/applications/route.d.ts.map +1 -0
  53. package/dist/src/presentation/web/app/api/applications/route.js +20 -0
  54. package/dist/src/presentation/web/app/application/[id]/page.d.ts +4 -4
  55. package/dist/src/presentation/web/app/application/[id]/page.d.ts.map +1 -1
  56. package/dist/src/presentation/web/app/application/[id]/page.js +2 -61
  57. package/dist/src/presentation/web/app/applications/page.d.ts +2 -0
  58. package/dist/src/presentation/web/app/applications/page.d.ts.map +1 -0
  59. package/dist/src/presentation/web/app/applications/page.js +5 -0
  60. package/dist/src/presentation/web/components/assistant-ui/thread.js +2 -2
  61. package/dist/src/presentation/web/components/common/application-node/application-node.d.ts.map +1 -1
  62. package/dist/src/presentation/web/components/common/application-node/application-node.js +3 -37
  63. package/dist/src/presentation/web/components/features/application-page/application-page-loader.d.ts +4 -0
  64. package/dist/src/presentation/web/components/features/application-page/application-page-loader.d.ts.map +1 -0
  65. package/dist/src/presentation/web/components/features/application-page/application-page-loader.js +47 -0
  66. package/dist/src/presentation/web/components/features/application-page/application-page.d.ts.map +1 -1
  67. package/dist/src/presentation/web/components/features/application-page/application-page.js +75 -54
  68. package/dist/src/presentation/web/components/features/application-page/application-page.stories.d.ts.map +1 -1
  69. package/dist/src/presentation/web/components/features/application-page/application-page.stories.js +1 -0
  70. package/dist/src/presentation/web/components/features/application-page/run-dev-button.d.ts +3 -1
  71. package/dist/src/presentation/web/components/features/application-page/run-dev-button.d.ts.map +1 -1
  72. package/dist/src/presentation/web/components/features/application-page/run-dev-button.js +6 -2
  73. package/dist/src/presentation/web/components/features/applications/application-card.d.ts +7 -0
  74. package/dist/src/presentation/web/components/features/applications/application-card.d.ts.map +1 -0
  75. package/dist/src/presentation/web/components/features/applications/application-card.js +82 -0
  76. package/dist/src/presentation/web/components/features/applications/application-card.stories.d.ts +13 -0
  77. package/dist/src/presentation/web/components/features/applications/application-card.stories.d.ts.map +1 -0
  78. package/dist/src/presentation/web/components/features/applications/application-card.stories.js +69 -0
  79. package/dist/src/presentation/web/components/features/applications/applications-page-client.d.ts +5 -0
  80. package/dist/src/presentation/web/components/features/applications/applications-page-client.d.ts.map +1 -0
  81. package/dist/src/presentation/web/components/features/applications/applications-page-client.js +28 -0
  82. package/dist/src/presentation/web/components/features/applications/applications-page-client.stories.d.ts +10 -0
  83. package/dist/src/presentation/web/components/features/applications/applications-page-client.stories.d.ts.map +1 -0
  84. package/dist/src/presentation/web/components/features/applications/applications-page-client.stories.js +93 -0
  85. package/dist/src/presentation/web/components/features/chat/ChatComposer.d.ts +3 -1
  86. package/dist/src/presentation/web/components/features/chat/ChatComposer.d.ts.map +1 -1
  87. package/dist/src/presentation/web/components/features/chat/ChatComposer.js +2 -2
  88. package/dist/src/presentation/web/components/features/chat/ChatTab.d.ts +3 -1
  89. package/dist/src/presentation/web/components/features/chat/ChatTab.d.ts.map +1 -1
  90. package/dist/src/presentation/web/components/features/chat/ChatTab.js +4 -3
  91. package/dist/src/presentation/web/components/features/chat/StepTracker.d.ts +6 -1
  92. package/dist/src/presentation/web/components/features/chat/StepTracker.d.ts.map +1 -1
  93. package/dist/src/presentation/web/components/features/chat/StepTracker.js +23 -20
  94. package/dist/src/presentation/web/components/features/control-center/control-center-inner.d.ts.map +1 -1
  95. package/dist/src/presentation/web/components/features/control-center/control-center-inner.js +3 -2
  96. package/dist/src/presentation/web/components/features/features-canvas/features-canvas.d.ts +3 -1
  97. package/dist/src/presentation/web/components/features/features-canvas/features-canvas.d.ts.map +1 -1
  98. package/dist/src/presentation/web/components/features/features-canvas/features-canvas.js +2 -2
  99. package/dist/src/presentation/web/components/features/settings/language-settings-section.d.ts.map +1 -1
  100. package/dist/src/presentation/web/components/features/settings/language-settings-section.js +1 -0
  101. package/dist/src/presentation/web/components/features/settings/language-settings-section.stories.d.ts +1 -0
  102. package/dist/src/presentation/web/components/features/settings/language-settings-section.stories.d.ts.map +1 -1
  103. package/dist/src/presentation/web/components/features/settings/language-settings-section.stories.js +5 -0
  104. package/dist/src/presentation/web/components/features/settings/settings-page-client.d.ts.map +1 -1
  105. package/dist/src/presentation/web/components/features/settings/settings-page-client.js +23 -3
  106. package/dist/src/presentation/web/components/layouts/app-sidebar/app-sidebar.d.ts.map +1 -1
  107. package/dist/src/presentation/web/components/layouts/app-sidebar/app-sidebar.js +2 -2
  108. package/dist/src/presentation/web/lib/derive-app-status.d.ts +23 -0
  109. package/dist/src/presentation/web/lib/derive-app-status.d.ts.map +1 -0
  110. package/dist/src/presentation/web/lib/derive-app-status.js +89 -0
  111. package/dist/src/presentation/web/lib/i18n.d.ts.map +1 -1
  112. package/dist/src/presentation/web/lib/i18n.js +3 -0
  113. package/dist/translations/ar/web.json +2 -1
  114. package/dist/translations/de/web.json +2 -1
  115. package/dist/translations/en/web.json +2 -1
  116. package/dist/translations/es/web.json +2 -1
  117. package/dist/translations/fr/web.json +2 -1
  118. package/dist/translations/he/web.json +2 -1
  119. package/dist/translations/pt/web.json +2 -1
  120. package/dist/translations/ru/web.json +2 -1
  121. package/dist/translations/uk/web.json +2 -1
  122. package/dist/tsconfig.build.tsbuildinfo +1 -1
  123. package/package.json +1 -1
  124. package/web/.next/BUILD_ID +1 -1
  125. package/web/.next/app-path-routes-manifest.json +4 -0
  126. package/web/.next/build-manifest.json +2 -2
  127. package/web/.next/fallback-build-manifest.json +2 -2
  128. package/web/.next/prerender-manifest.json +3 -3
  129. package/web/.next/required-server-files.js +2 -2
  130. package/web/.next/required-server-files.json +2 -2
  131. package/web/.next/routes-manifest.json +28 -0
  132. package/web/.next/server/app/(dashboard)/@drawer/adopt/page/server-reference-manifest.json +32 -32
  133. package/web/.next/server/app/(dashboard)/@drawer/adopt/page.js +5 -5
  134. package/web/.next/server/app/(dashboard)/@drawer/adopt/page.js.nft.json +1 -1
  135. package/web/.next/server/app/(dashboard)/@drawer/adopt/page_client-reference-manifest.js +1 -1
  136. package/web/.next/server/app/(dashboard)/@drawer/chat/page/server-reference-manifest.json +30 -30
  137. package/web/.next/server/app/(dashboard)/@drawer/chat/page.js +5 -5
  138. package/web/.next/server/app/(dashboard)/@drawer/chat/page.js.nft.json +1 -1
  139. package/web/.next/server/app/(dashboard)/@drawer/chat/page_client-reference-manifest.js +1 -1
  140. package/web/.next/server/app/(dashboard)/@drawer/create/page/server-reference-manifest.json +33 -33
  141. package/web/.next/server/app/(dashboard)/@drawer/create/page.js +5 -5
  142. package/web/.next/server/app/(dashboard)/@drawer/create/page.js.nft.json +1 -1
  143. package/web/.next/server/app/(dashboard)/@drawer/create/page_client-reference-manifest.js +1 -1
  144. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page/server-reference-manifest.json +41 -41
  145. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page.js +5 -5
  146. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page.js.nft.json +1 -1
  147. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page_client-reference-manifest.js +1 -1
  148. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page/server-reference-manifest.json +41 -41
  149. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js +5 -5
  150. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js.nft.json +1 -1
  151. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page_client-reference-manifest.js +1 -1
  152. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/[tab]/page/server-reference-manifest.json +31 -31
  153. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/[tab]/page.js +5 -5
  154. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/[tab]/page.js.nft.json +1 -1
  155. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/[tab]/page_client-reference-manifest.js +1 -1
  156. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page/server-reference-manifest.json +31 -31
  157. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js +5 -5
  158. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js.nft.json +1 -1
  159. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  160. package/web/.next/server/app/(dashboard)/chat/page/server-reference-manifest.json +30 -30
  161. package/web/.next/server/app/(dashboard)/chat/page.js +5 -5
  162. package/web/.next/server/app/(dashboard)/chat/page.js.nft.json +1 -1
  163. package/web/.next/server/app/(dashboard)/chat/page_client-reference-manifest.js +1 -1
  164. package/web/.next/server/app/(dashboard)/create/page/server-reference-manifest.json +33 -33
  165. package/web/.next/server/app/(dashboard)/create/page.js +5 -5
  166. package/web/.next/server/app/(dashboard)/create/page.js.nft.json +1 -1
  167. package/web/.next/server/app/(dashboard)/create/page_client-reference-manifest.js +1 -1
  168. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page/server-reference-manifest.json +41 -41
  169. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page.js +5 -5
  170. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page.js.nft.json +1 -1
  171. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page_client-reference-manifest.js +1 -1
  172. package/web/.next/server/app/(dashboard)/feature/[featureId]/page/server-reference-manifest.json +41 -41
  173. package/web/.next/server/app/(dashboard)/feature/[featureId]/page.js +5 -5
  174. package/web/.next/server/app/(dashboard)/feature/[featureId]/page.js.nft.json +1 -1
  175. package/web/.next/server/app/(dashboard)/feature/[featureId]/page_client-reference-manifest.js +1 -1
  176. package/web/.next/server/app/(dashboard)/page/server-reference-manifest.json +30 -30
  177. package/web/.next/server/app/(dashboard)/page.js +5 -5
  178. package/web/.next/server/app/(dashboard)/page.js.nft.json +1 -1
  179. package/web/.next/server/app/(dashboard)/page_client-reference-manifest.js +1 -1
  180. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/[tab]/page/server-reference-manifest.json +31 -31
  181. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/[tab]/page.js +5 -5
  182. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/[tab]/page.js.nft.json +1 -1
  183. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/[tab]/page_client-reference-manifest.js +1 -1
  184. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page/server-reference-manifest.json +31 -31
  185. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js +5 -5
  186. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js.nft.json +1 -1
  187. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  188. package/web/.next/server/app/_global-error/page.js +1 -1
  189. package/web/.next/server/app/_global-error/page.js.nft.json +1 -1
  190. package/web/.next/server/app/_global-error.html +2 -2
  191. package/web/.next/server/app/_global-error.rsc +1 -1
  192. package/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  193. package/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  194. package/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  195. package/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  196. package/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  197. package/web/.next/server/app/_not-found/page/server-reference-manifest.json +7 -7
  198. package/web/.next/server/app/_not-found/page.js +1 -1
  199. package/web/.next/server/app/_not-found/page.js.nft.json +1 -1
  200. package/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  201. package/web/.next/server/app/api/applications/[id]/resume/route/app-paths-manifest.json +3 -0
  202. package/web/.next/server/app/api/applications/[id]/resume/route/build-manifest.json +11 -0
  203. package/web/.next/server/app/api/applications/[id]/resume/route/server-reference-manifest.json +4 -0
  204. package/web/.next/server/app/api/applications/[id]/resume/route.js +7 -0
  205. package/web/.next/server/app/api/applications/[id]/resume/route.js.map +5 -0
  206. package/web/.next/server/app/api/applications/[id]/resume/route.js.nft.json +1 -0
  207. package/web/.next/server/app/api/applications/[id]/resume/route_client-reference-manifest.js +2 -0
  208. package/web/.next/server/app/api/applications/[id]/route/app-paths-manifest.json +3 -0
  209. package/web/.next/server/app/api/applications/[id]/route/build-manifest.json +11 -0
  210. package/web/.next/server/app/api/applications/[id]/route/server-reference-manifest.json +4 -0
  211. package/web/.next/server/app/api/applications/[id]/route.js +7 -0
  212. package/web/.next/server/app/api/applications/[id]/route.js.map +5 -0
  213. package/web/.next/server/app/api/applications/[id]/route.js.nft.json +1 -0
  214. package/web/.next/server/app/api/applications/[id]/route_client-reference-manifest.js +2 -0
  215. package/web/.next/server/app/api/applications/route/app-paths-manifest.json +3 -0
  216. package/web/.next/server/app/api/applications/route/build-manifest.json +11 -0
  217. package/web/.next/server/app/api/applications/route/server-reference-manifest.json +4 -0
  218. package/web/.next/server/app/api/applications/route.js +7 -0
  219. package/web/.next/server/app/api/applications/route.js.map +5 -0
  220. package/web/.next/server/app/api/applications/route.js.nft.json +1 -0
  221. package/web/.next/server/app/api/applications/route_client-reference-manifest.js +2 -0
  222. package/web/.next/server/app/api/attachments/preview/route.js.nft.json +1 -1
  223. package/web/.next/server/app/api/evidence/route.js.nft.json +1 -1
  224. package/web/.next/server/app/api/graph-data/route.js.nft.json +1 -1
  225. package/web/.next/server/app/api/interactive/chat/[featureId]/messages/route.js.nft.json +1 -1
  226. package/web/.next/server/app/application/[id]/page/server-reference-manifest.json +45 -30
  227. package/web/.next/server/app/application/[id]/page.js +3 -3
  228. package/web/.next/server/app/application/[id]/page.js.nft.json +1 -1
  229. package/web/.next/server/app/application/[id]/page_client-reference-manifest.js +1 -1
  230. package/web/.next/server/app/applications/page/app-paths-manifest.json +3 -0
  231. package/web/.next/server/app/applications/page/build-manifest.json +18 -0
  232. package/web/.next/server/app/applications/page/next-font-manifest.json +6 -0
  233. package/web/.next/server/app/applications/page/react-loadable-manifest.json +1 -0
  234. package/web/.next/server/app/applications/page/server-reference-manifest.json +230 -0
  235. package/web/.next/server/app/applications/page.js +19 -0
  236. package/web/.next/server/app/applications/page.js.map +5 -0
  237. package/web/.next/server/app/applications/page.js.nft.json +1 -0
  238. package/web/.next/server/app/applications/page_client-reference-manifest.js +2 -0
  239. package/web/.next/server/app/features/page/server-reference-manifest.json +7 -7
  240. package/web/.next/server/app/features/page.js +1 -1
  241. package/web/.next/server/app/features/page.js.nft.json +1 -1
  242. package/web/.next/server/app/features/page_client-reference-manifest.js +1 -1
  243. package/web/.next/server/app/settings/page/server-reference-manifest.json +10 -10
  244. package/web/.next/server/app/settings/page.js +1 -1
  245. package/web/.next/server/app/settings/page.js.nft.json +1 -1
  246. package/web/.next/server/app/settings/page_client-reference-manifest.js +1 -1
  247. package/web/.next/server/app/skills/page/server-reference-manifest.json +15 -15
  248. package/web/.next/server/app/skills/page.js +1 -1
  249. package/web/.next/server/app/skills/page.js.nft.json +1 -1
  250. package/web/.next/server/app/skills/page_client-reference-manifest.js +1 -1
  251. package/web/.next/server/app/tools/page/server-reference-manifest.json +13 -13
  252. package/web/.next/server/app/tools/page.js +1 -1
  253. package/web/.next/server/app/tools/page.js.nft.json +1 -1
  254. package/web/.next/server/app/tools/page_client-reference-manifest.js +1 -1
  255. package/web/.next/server/app/version/page/server-reference-manifest.json +7 -7
  256. package/web/.next/server/app/version/page.js +1 -1
  257. package/web/.next/server/app/version/page.js.nft.json +1 -1
  258. package/web/.next/server/app/version/page_client-reference-manifest.js +1 -1
  259. package/web/.next/server/app-paths-manifest.json +4 -0
  260. package/web/.next/server/chunks/744ca_web__next-internal_server_app_api_applications_[id]_route_actions_e31b426d.js +3 -0
  261. package/web/.next/server/chunks/744ca_web__next-internal_server_app_api_applications_[id]_route_actions_e31b426d.js.map +1 -0
  262. package/web/.next/server/chunks/744ca_web__next-internal_server_app_api_applications_route_actions_2b7d20d0.js +3 -0
  263. package/web/.next/server/chunks/744ca_web__next-internal_server_app_api_applications_route_actions_2b7d20d0.js.map +1 -0
  264. package/web/.next/server/chunks/[root-of-the-server]__3bb635e8._.js +3 -0
  265. package/web/.next/server/chunks/[root-of-the-server]__3bb635e8._.js.map +1 -0
  266. package/web/.next/server/chunks/[root-of-the-server]__a402b567._.js +1 -1
  267. package/web/.next/server/chunks/[root-of-the-server]__ac0027b4._.js +3 -0
  268. package/web/.next/server/chunks/[root-of-the-server]__ac0027b4._.js.map +1 -0
  269. package/web/.next/server/chunks/[root-of-the-server]__b2a4bfcc._.js.map +1 -1
  270. package/web/.next/server/chunks/[root-of-the-server]__c8f90b29._.js +1 -1
  271. package/web/.next/server/chunks/[root-of-the-server]__cd67a84c._.js.map +1 -1
  272. package/web/.next/server/chunks/[root-of-the-server]__ce82df38._.js +3 -0
  273. package/web/.next/server/chunks/[root-of-the-server]__ce82df38._.js.map +1 -0
  274. package/web/.next/server/chunks/f3a1f__next-internal_server_app_api_applications_[id]_resume_route_actions_3a66d646.js +3 -0
  275. package/web/.next/server/chunks/f3a1f__next-internal_server_app_api_applications_[id]_resume_route_actions_3a66d646.js.map +1 -0
  276. package/web/.next/server/chunks/ssr/744ca_web__next-internal_server_app_(dashboard)_@drawer_adopt_page_actions_4f9eef62.js +3 -0
  277. package/web/.next/server/chunks/ssr/744ca_web__next-internal_server_app_(dashboard)_@drawer_adopt_page_actions_4f9eef62.js.map +1 -0
  278. package/web/.next/server/chunks/ssr/744ca_web__next-internal_server_app_(dashboard)_@drawer_chat_page_actions_ffa16a22.js +3 -0
  279. package/web/.next/server/chunks/ssr/744ca_web__next-internal_server_app_(dashboard)_@drawer_chat_page_actions_ffa16a22.js.map +1 -0
  280. package/web/.next/server/chunks/ssr/744ca_web__next-internal_server_app_(dashboard)_chat_page_actions_a1a998f9.js +3 -0
  281. package/web/.next/server/chunks/ssr/744ca_web__next-internal_server_app_(dashboard)_chat_page_actions_a1a998f9.js.map +1 -0
  282. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js +1 -1
  283. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js.map +1 -1
  284. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_feature-drawer-client_tsx_e9755fc8._.js +2 -2
  285. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_feature-drawer-client_tsx_e9755fc8._.js.map +1 -1
  286. package/web/.next/server/chunks/ssr/744ca_web_components_features_applications_applications-page-client_tsx_d0db9938._.js +3 -0
  287. package/web/.next/server/chunks/ssr/744ca_web_components_features_applications_applications-page-client_tsx_d0db9938._.js.map +1 -0
  288. package/web/.next/server/chunks/ssr/[root-of-the-server]__04f4895b._.js +3 -0
  289. package/web/.next/server/chunks/ssr/[root-of-the-server]__04f4895b._.js.map +1 -0
  290. package/web/.next/server/chunks/ssr/[root-of-the-server]__17dadd08._.js +1 -1
  291. package/web/.next/server/chunks/ssr/[root-of-the-server]__17dadd08._.js.map +1 -1
  292. package/web/.next/server/chunks/ssr/[root-of-the-server]__1925bef0._.js +1 -1
  293. package/web/.next/server/chunks/ssr/[root-of-the-server]__1a9687c4._.js +1 -1
  294. package/web/.next/server/chunks/ssr/[root-of-the-server]__1a9687c4._.js.map +1 -1
  295. package/web/.next/server/chunks/ssr/[root-of-the-server]__347fd0f6._.js +3 -0
  296. package/web/.next/server/chunks/ssr/[root-of-the-server]__347fd0f6._.js.map +1 -0
  297. package/web/.next/server/chunks/ssr/[root-of-the-server]__46dd2baf._.js +3 -0
  298. package/web/.next/server/chunks/ssr/[root-of-the-server]__46dd2baf._.js.map +1 -0
  299. package/web/.next/server/chunks/ssr/[root-of-the-server]__4ee8be85._.js +1 -1
  300. package/web/.next/server/chunks/ssr/[root-of-the-server]__73cb4ff6._.js +3 -0
  301. package/web/.next/server/chunks/ssr/[root-of-the-server]__73cb4ff6._.js.map +1 -0
  302. package/web/.next/server/chunks/ssr/{[root-of-the-server]__87bc4dac._.js → [root-of-the-server]__86ff0bc5._.js} +3 -3
  303. package/web/.next/server/chunks/ssr/[root-of-the-server]__86ff0bc5._.js.map +1 -0
  304. package/web/.next/server/chunks/ssr/[root-of-the-server]__91c50abe._.js +3 -0
  305. package/web/.next/server/chunks/ssr/[root-of-the-server]__91c50abe._.js.map +1 -0
  306. package/web/.next/server/chunks/ssr/[root-of-the-server]__a48af49f._.js +3 -0
  307. package/web/.next/server/chunks/ssr/[root-of-the-server]__a48af49f._.js.map +1 -0
  308. package/web/.next/server/chunks/ssr/[root-of-the-server]__bb391c45._.js +1 -1
  309. package/web/.next/server/chunks/ssr/[root-of-the-server]__bb391c45._.js.map +1 -1
  310. package/web/.next/server/chunks/ssr/[root-of-the-server]__d5e22d1a._.js +3 -0
  311. package/web/.next/server/chunks/ssr/{[root-of-the-server]__7aa484f5._.js.map → [root-of-the-server]__d5e22d1a._.js.map} +1 -1
  312. package/web/.next/server/chunks/ssr/[root-of-the-server]__dd3e834e._.js +1 -1
  313. package/web/.next/server/chunks/ssr/[root-of-the-server]__dd3e834e._.js.map +1 -1
  314. package/web/.next/server/chunks/ssr/[root-of-the-server]__e0aa2bcb._.js +3 -0
  315. package/web/.next/server/chunks/ssr/[root-of-the-server]__e0aa2bcb._.js.map +1 -0
  316. package/web/.next/server/chunks/ssr/[root-of-the-server]__e265da61._.js +1 -1
  317. package/web/.next/server/chunks/ssr/[root-of-the-server]__ef0b8905._.js +12 -0
  318. package/web/.next/server/chunks/ssr/[root-of-the-server]__ef0b8905._.js.map +1 -0
  319. package/web/.next/server/chunks/ssr/[root-of-the-server]__f5614810._.js +3 -0
  320. package/web/.next/server/chunks/ssr/{[root-of-the-server]__090f24cb._.js.map → [root-of-the-server]__f5614810._.js.map} +1 -1
  321. package/web/.next/server/chunks/ssr/[root-of-the-server]__fe5db6b2._.js +3 -0
  322. package/web/.next/server/chunks/ssr/[root-of-the-server]__fe5db6b2._.js.map +1 -0
  323. package/web/.next/server/chunks/ssr/_037e85c7._.js +3 -0
  324. package/web/.next/server/chunks/ssr/_037e85c7._.js.map +1 -0
  325. package/web/.next/server/chunks/ssr/{_774cbf7d._.js → _133ae3de._.js} +2 -2
  326. package/web/.next/server/chunks/ssr/{_774cbf7d._.js.map → _133ae3de._.js.map} +1 -1
  327. package/web/.next/server/chunks/ssr/_1879404a._.js +1 -1
  328. package/web/.next/server/chunks/ssr/_1879404a._.js.map +1 -1
  329. package/web/.next/server/chunks/ssr/_295fffde._.js.map +1 -1
  330. package/web/.next/server/chunks/ssr/_29b8ed64._.js +3 -0
  331. package/web/.next/server/chunks/ssr/_29b8ed64._.js.map +1 -0
  332. package/web/.next/server/chunks/ssr/_2bc302d1._.js +3 -0
  333. package/web/.next/server/chunks/ssr/_2bc302d1._.js.map +1 -0
  334. package/web/.next/server/chunks/ssr/_35294e79._.js +3 -0
  335. package/web/.next/server/chunks/ssr/_35294e79._.js.map +1 -0
  336. package/web/.next/server/chunks/ssr/_3683083e._.js +3 -0
  337. package/web/.next/server/chunks/ssr/_3683083e._.js.map +1 -0
  338. package/web/.next/server/chunks/ssr/_45496654._.js.map +1 -1
  339. package/web/.next/server/chunks/ssr/_4b57bcc3._.js +9 -0
  340. package/web/.next/server/chunks/ssr/_4b57bcc3._.js.map +1 -0
  341. package/web/.next/server/chunks/ssr/_519d77a9._.js +3 -0
  342. package/web/.next/server/chunks/ssr/_519d77a9._.js.map +1 -0
  343. package/web/.next/server/chunks/ssr/_56b9d60f._.js +1 -1
  344. package/web/.next/server/chunks/ssr/_56b9d60f._.js.map +1 -1
  345. package/web/.next/server/chunks/ssr/_82db03fd._.js +3 -0
  346. package/web/.next/server/chunks/ssr/_82db03fd._.js.map +1 -0
  347. package/web/.next/server/chunks/ssr/_8c3086bf._.js +3 -0
  348. package/web/.next/server/chunks/ssr/_8c3086bf._.js.map +1 -0
  349. package/web/.next/server/chunks/ssr/_9173e475._.js +21 -0
  350. package/web/.next/server/chunks/ssr/_9173e475._.js.map +1 -0
  351. package/web/.next/server/chunks/ssr/_946a7fc6._.js +1 -1
  352. package/web/.next/server/chunks/ssr/_946a7fc6._.js.map +1 -1
  353. package/web/.next/server/chunks/ssr/{_81e7a131._.js → _a08047ef._.js} +2 -2
  354. package/web/.next/server/chunks/ssr/_a08047ef._.js.map +1 -0
  355. package/web/.next/server/chunks/ssr/_bc03ac82._.js +4 -0
  356. package/web/.next/server/chunks/ssr/_bc03ac82._.js.map +1 -0
  357. package/web/.next/server/chunks/ssr/_d4c0792b._.js +3 -0
  358. package/web/.next/server/chunks/ssr/_d4c0792b._.js.map +1 -0
  359. package/web/.next/server/chunks/ssr/_e61d032d._.js +3 -0
  360. package/web/.next/server/chunks/ssr/_e61d032d._.js.map +1 -0
  361. package/web/.next/server/chunks/ssr/_e65abbd1._.js +3 -0
  362. package/web/.next/server/chunks/ssr/_e65abbd1._.js.map +1 -0
  363. package/web/.next/server/chunks/ssr/_f86fc1bf._.js +1 -1
  364. package/web/.next/server/chunks/ssr/_f86fc1bf._.js.map +1 -1
  365. package/web/.next/server/chunks/ssr/_f8c55130._.js +1 -1
  366. package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_settings_settings-page-client_tsx_6ed9d5f8._.js +1 -1
  367. package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_settings_settings-page-client_tsx_6ed9d5f8._.js.map +1 -1
  368. package/web/.next/server/chunks/ssr/f3a1f_components_common_control-center-drawer_repository-drawer-client_tsx_39a00c03._.js +1 -1
  369. package/web/.next/server/chunks/ssr/node_modules__pnpm_28a53b5d._.js +3 -0
  370. package/web/.next/server/chunks/ssr/node_modules__pnpm_28a53b5d._.js.map +1 -0
  371. package/web/.next/server/chunks/ssr/src_presentation_web_47181610._.js +3 -0
  372. package/web/.next/server/chunks/ssr/src_presentation_web_47181610._.js.map +1 -0
  373. package/web/.next/server/chunks/ssr/src_presentation_web_5d3f4199._.js +3 -0
  374. package/web/.next/server/chunks/ssr/src_presentation_web_5d3f4199._.js.map +1 -0
  375. package/web/.next/server/chunks/ssr/src_presentation_web_6159fef8._.js +1 -1
  376. package/web/.next/server/chunks/ssr/src_presentation_web_6159fef8._.js.map +1 -1
  377. package/web/.next/server/chunks/ssr/src_presentation_web_61d96ba8._.js +3 -0
  378. package/web/.next/server/chunks/ssr/src_presentation_web_61d96ba8._.js.map +1 -0
  379. package/web/.next/server/chunks/ssr/src_presentation_web_6994959a._.js +3 -0
  380. package/web/.next/server/chunks/ssr/src_presentation_web_6994959a._.js.map +1 -0
  381. package/web/.next/server/chunks/ssr/src_presentation_web_77dadf68._.js +32 -0
  382. package/web/.next/server/chunks/ssr/src_presentation_web_77dadf68._.js.map +1 -0
  383. package/web/.next/server/chunks/ssr/src_presentation_web_9a543843._.js +3 -0
  384. package/web/.next/server/chunks/ssr/src_presentation_web_9a543843._.js.map +1 -0
  385. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_c3f6f57e.js +3 -0
  386. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_c3f6f57e.js.map +1 -0
  387. package/web/.next/server/chunks/ssr/src_presentation_web_ad42cc73._.js +1 -1
  388. package/web/.next/server/chunks/ssr/src_presentation_web_ad42cc73._.js.map +1 -1
  389. package/web/.next/server/chunks/ssr/src_presentation_web_app_actions_8514dfcd._.js +32 -0
  390. package/web/.next/server/chunks/ssr/src_presentation_web_app_actions_8514dfcd._.js.map +1 -0
  391. package/web/.next/server/chunks/ssr/src_presentation_web_b95ed206._.js +3 -0
  392. package/web/.next/server/chunks/ssr/src_presentation_web_b95ed206._.js.map +1 -0
  393. package/web/.next/server/chunks/ssr/src_presentation_web_bade80bd._.js +3 -0
  394. package/web/.next/server/chunks/ssr/src_presentation_web_bade80bd._.js.map +1 -0
  395. package/web/.next/server/chunks/ssr/src_presentation_web_c543cf3e._.js +3 -0
  396. package/web/.next/server/chunks/ssr/src_presentation_web_c543cf3e._.js.map +1 -0
  397. package/web/.next/server/chunks/ssr/src_presentation_web_components_895e5bfa._.js +1 -1
  398. package/web/.next/server/chunks/ssr/src_presentation_web_components_895e5bfa._.js.map +1 -1
  399. package/web/.next/server/chunks/ssr/src_presentation_web_components_common_base-drawer_base-drawer_tsx_97dfbbc8._.js +1 -1
  400. package/web/.next/server/chunks/ssr/src_presentation_web_components_common_base-drawer_base-drawer_tsx_97dfbbc8._.js.map +1 -1
  401. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_skills_8a174cac._.js +1 -1
  402. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_skills_8a174cac._.js.map +1 -1
  403. package/web/.next/server/chunks/ssr/src_presentation_web_components_ui_dropdown-menu_tsx_229332e3._.js +3 -0
  404. package/web/.next/server/chunks/ssr/src_presentation_web_components_ui_dropdown-menu_tsx_229332e3._.js.map +1 -0
  405. package/web/.next/server/chunks/ssr/translations_1562ae1a._.js +3 -0
  406. package/web/.next/server/chunks/ssr/translations_1562ae1a._.js.map +1 -0
  407. package/web/.next/server/pages/500.html +2 -2
  408. package/web/.next/server/server-reference-manifest.js +1 -1
  409. package/web/.next/server/server-reference-manifest.json +184 -72
  410. package/web/.next/static/chunks/019e71634c720ede.js +1 -0
  411. package/web/.next/static/chunks/040c5ff84a8ae1a3.js +7 -0
  412. package/web/.next/static/chunks/092ac28f5a4422a0.js +19 -0
  413. package/web/.next/static/chunks/0bd78b0cf1c1421f.js +1 -0
  414. package/web/.next/static/chunks/{996e4ea45364bf3c.js → 18c21c4f9f58b69a.js} +3 -3
  415. package/web/.next/static/chunks/2b5aea3575387b3a.js +1 -0
  416. package/web/.next/static/chunks/2cbe80f8e84d59a8.js +1 -0
  417. package/web/.next/static/chunks/{503d2e86f83285f9.js → 3219b06f6a34e573.js} +1 -1
  418. package/web/.next/static/chunks/37e434e579ecfa02.js +1 -0
  419. package/web/.next/static/chunks/4a7cf3b09e0495a4.js +1 -0
  420. package/web/.next/static/chunks/{83fc7ea32e18c9a5.js → 4ea617a22e21fb04.js} +1 -1
  421. package/web/.next/static/chunks/54d1d5a646a12d76.js +1 -0
  422. package/web/.next/static/chunks/{9e9b60f127270dfd.js → 553be530f22710a7.js} +1 -1
  423. package/web/.next/static/chunks/5795b9f399523c9e.js +1 -0
  424. package/web/.next/static/chunks/{d488e6b5cbbc6833.js → 6a88df64eaeb6322.js} +1 -1
  425. package/web/.next/static/chunks/{2fe20598e1b4793a.js → 6b2859ea368e7df3.js} +3 -3
  426. package/web/.next/static/chunks/6d8cae68371a845d.js +1 -0
  427. package/web/.next/static/chunks/{a2601dbbcb657c7d.js → 78607d521d916531.js} +1 -1
  428. package/web/.next/static/chunks/{7bf6ed16395220c4.js → 7d5a7551d452463d.js} +2 -2
  429. package/web/.next/static/chunks/80e778136b2f4c92.js +1 -0
  430. package/web/.next/static/chunks/a62fb058d660bea3.js +3 -0
  431. package/web/.next/static/chunks/adf16efe8bac05e9.css +1 -0
  432. package/web/.next/static/chunks/b0474319e5a50043.js +1 -0
  433. package/web/.next/static/chunks/b85532fb1545927c.js +5 -0
  434. package/web/.next/static/chunks/e0ae4dbd97b7af4c.js +1 -0
  435. package/web/.next/static/chunks/{2af89379fde6831d.js → f70998ac93012aef.js} +1 -1
  436. package/web/.next/server/chunks/ssr/[root-of-the-server]__013a0318._.js +0 -3
  437. package/web/.next/server/chunks/ssr/[root-of-the-server]__013a0318._.js.map +0 -1
  438. package/web/.next/server/chunks/ssr/[root-of-the-server]__090f24cb._.js +0 -3
  439. package/web/.next/server/chunks/ssr/[root-of-the-server]__24756fa9._.js +0 -12
  440. package/web/.next/server/chunks/ssr/[root-of-the-server]__24756fa9._.js.map +0 -1
  441. package/web/.next/server/chunks/ssr/[root-of-the-server]__70986695._.js +0 -3
  442. package/web/.next/server/chunks/ssr/[root-of-the-server]__70986695._.js.map +0 -1
  443. package/web/.next/server/chunks/ssr/[root-of-the-server]__7aa484f5._.js +0 -3
  444. package/web/.next/server/chunks/ssr/[root-of-the-server]__87bc4dac._.js.map +0 -1
  445. package/web/.next/server/chunks/ssr/[root-of-the-server]__a3a4ddef._.js +0 -3
  446. package/web/.next/server/chunks/ssr/[root-of-the-server]__a3a4ddef._.js.map +0 -1
  447. package/web/.next/server/chunks/ssr/[root-of-the-server]__a4222b95._.js +0 -3
  448. package/web/.next/server/chunks/ssr/[root-of-the-server]__a4222b95._.js.map +0 -1
  449. package/web/.next/server/chunks/ssr/[root-of-the-server]__a5ea76a6._.js +0 -3
  450. package/web/.next/server/chunks/ssr/[root-of-the-server]__a5ea76a6._.js.map +0 -1
  451. package/web/.next/server/chunks/ssr/[root-of-the-server]__a6f2b763._.js +0 -3
  452. package/web/.next/server/chunks/ssr/[root-of-the-server]__a6f2b763._.js.map +0 -1
  453. package/web/.next/server/chunks/ssr/[root-of-the-server]__f3ca7bea._.js +0 -3
  454. package/web/.next/server/chunks/ssr/[root-of-the-server]__f3ca7bea._.js.map +0 -1
  455. package/web/.next/server/chunks/ssr/_0277d3b5._.js +0 -21
  456. package/web/.next/server/chunks/ssr/_0277d3b5._.js.map +0 -1
  457. package/web/.next/server/chunks/ssr/_44531b76._.js +0 -9
  458. package/web/.next/server/chunks/ssr/_44531b76._.js.map +0 -1
  459. package/web/.next/server/chunks/ssr/_5dec4047._.js +0 -3
  460. package/web/.next/server/chunks/ssr/_5dec4047._.js.map +0 -1
  461. package/web/.next/server/chunks/ssr/_73aa3b20._.js +0 -3
  462. package/web/.next/server/chunks/ssr/_73aa3b20._.js.map +0 -1
  463. package/web/.next/server/chunks/ssr/_81e7a131._.js.map +0 -1
  464. package/web/.next/server/chunks/ssr/_869a3a15._.js +0 -3
  465. package/web/.next/server/chunks/ssr/_869a3a15._.js.map +0 -1
  466. package/web/.next/server/chunks/ssr/_b227ff50._.js +0 -3
  467. package/web/.next/server/chunks/ssr/_b227ff50._.js.map +0 -1
  468. package/web/.next/server/chunks/ssr/_d75dcb43._.js +0 -3
  469. package/web/.next/server/chunks/ssr/_d75dcb43._.js.map +0 -1
  470. package/web/.next/server/chunks/ssr/_e071ba48._.js +0 -3
  471. package/web/.next/server/chunks/ssr/_e071ba48._.js.map +0 -1
  472. package/web/.next/server/chunks/ssr/_eff1b518._.js +0 -3
  473. package/web/.next/server/chunks/ssr/_eff1b518._.js.map +0 -1
  474. package/web/.next/server/chunks/ssr/_f227429a._.js +0 -3
  475. package/web/.next/server/chunks/ssr/_f227429a._.js.map +0 -1
  476. package/web/.next/server/chunks/ssr/src_presentation_web_36f2bc45._.js +0 -3
  477. package/web/.next/server/chunks/ssr/src_presentation_web_36f2bc45._.js.map +0 -1
  478. package/web/.next/server/chunks/ssr/src_presentation_web_486908de._.js +0 -3
  479. package/web/.next/server/chunks/ssr/src_presentation_web_486908de._.js.map +0 -1
  480. package/web/.next/server/chunks/ssr/src_presentation_web_5c3596bc._.js +0 -3
  481. package/web/.next/server/chunks/ssr/src_presentation_web_5c3596bc._.js.map +0 -1
  482. package/web/.next/server/chunks/ssr/src_presentation_web_6326f81e._.js +0 -3
  483. package/web/.next/server/chunks/ssr/src_presentation_web_6326f81e._.js.map +0 -1
  484. package/web/.next/server/chunks/ssr/src_presentation_web_6b2fdcd8._.js +0 -3
  485. package/web/.next/server/chunks/ssr/src_presentation_web_6b2fdcd8._.js.map +0 -1
  486. package/web/.next/server/chunks/ssr/src_presentation_web_74703c9f._.js +0 -3
  487. package/web/.next/server/chunks/ssr/src_presentation_web_74703c9f._.js.map +0 -1
  488. package/web/.next/server/chunks/ssr/src_presentation_web_a8056dac._.js +0 -3
  489. package/web/.next/server/chunks/ssr/src_presentation_web_a8056dac._.js.map +0 -1
  490. package/web/.next/server/chunks/ssr/src_presentation_web_app_actions_open-ide_ts_baaca5d5._.js +0 -32
  491. package/web/.next/server/chunks/ssr/src_presentation_web_app_actions_open-ide_ts_baaca5d5._.js.map +0 -1
  492. package/web/.next/server/chunks/ssr/src_presentation_web_b00bfb08._.js +0 -3
  493. package/web/.next/server/chunks/ssr/src_presentation_web_b00bfb08._.js.map +0 -1
  494. package/web/.next/server/chunks/ssr/src_presentation_web_ca99d62d._.js +0 -3
  495. package/web/.next/server/chunks/ssr/src_presentation_web_ca99d62d._.js.map +0 -1
  496. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js +0 -3
  497. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js.map +0 -1
  498. package/web/.next/server/chunks/ssr/src_presentation_web_f1edcf5e._.js +0 -3
  499. package/web/.next/server/chunks/ssr/src_presentation_web_f1edcf5e._.js.map +0 -1
  500. package/web/.next/server/chunks/ssr/src_presentation_web_f9436804._.js +0 -3
  501. package/web/.next/server/chunks/ssr/src_presentation_web_f9436804._.js.map +0 -1
  502. package/web/.next/server/chunks/ssr/translations_23dd5e7e._.js +0 -3
  503. package/web/.next/server/chunks/ssr/translations_23dd5e7e._.js.map +0 -1
  504. package/web/.next/static/chunks/06b9d6dbf635c370.css +0 -1
  505. package/web/.next/static/chunks/1ae0cf5be30ef398.js +0 -1
  506. package/web/.next/static/chunks/3a71cab38909921e.js +0 -1
  507. package/web/.next/static/chunks/4e53adb5d07b7e3d.js +0 -1
  508. package/web/.next/static/chunks/5e7ac3508bef115f.js +0 -1
  509. package/web/.next/static/chunks/761a7c542b358739.js +0 -1
  510. package/web/.next/static/chunks/927442d2628f6e22.js +0 -1
  511. package/web/.next/static/chunks/a31f2264cedb23e9.js +0 -1
  512. package/web/.next/static/chunks/abf7d1b66555b758.js +0 -7
  513. package/web/.next/static/chunks/b99506a6f7bc2fa8.js +0 -1
  514. package/web/.next/static/chunks/d984d1d8d506291c.js +0 -7
  515. package/web/.next/static/chunks/e843a0d8e8c645c4.js +0 -1
  516. package/web/.next/static/chunks/f5ed0232d50b1ec8.js +0 -19
  517. /package/web/.next/static/{6GBQ7MHEYpZbJzqULwvXh → t-O8eMjJCUhhtd6CgtTXI}/_buildManifest.js +0 -0
  518. /package/web/.next/static/{6GBQ7MHEYpZbJzqULwvXh → t-O8eMjJCUhhtd6CgtTXI}/_clientMiddlewareManifest.json +0 -0
  519. /package/web/.next/static/{6GBQ7MHEYpZbJzqULwvXh → t-O8eMjJCUhhtd6CgtTXI}/_ssgManifest.js +0 -0
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../../../../../src/presentation/web/hooks/use-graph-state.ts","../../../../../../../node_modules/.pnpm/%40dagrejs%2Bdagre%402.0.4/node_modules/%40dagrejs/dagre/dist/dagre.esm.js","../../../../../../../src/presentation/web/components/features/control-center/use-control-center-state.ts","../../../../../../../src/presentation/web/app/actions/data%3A8c826d%20%3Ctext/javascript%3E","../../../../../../../src/presentation/web/app/actions/data%3A2a14db%20%3Ctext/javascript%3E","../../../../../../../src/presentation/web/app/actions/data%3Aa726d1%20%3Ctext/javascript%3E","../../../../../../../src/presentation/web/app/actions/data%3A7d0a8f%20%3Ctext/javascript%3E","../../../../../../../src/presentation/web/app/actions/data%3A7704dc%20%3Ctext/javascript%3E","../../../../../../../src/presentation/web/app/actions/data%3A8c9ac8%20%3Ctext/javascript%3E","../../../../../../../src/presentation/web/lib/layout-with-dagre.ts","../../../../../../../src/presentation/web/lib/derive-graph.ts","../../../../../../../src/presentation/web/components/common/repository-node/repository-node.tsx","../../../../../../../src/presentation/web/components/common/repository-node/repository-drawer.tsx","../../../../../../../src/presentation/web/components/common/application-node/application-node.tsx","../../../../../../../src/presentation/web/components/features/features-canvas/dependency-edge.tsx","../../../../../../../src/presentation/web/components/features/features-canvas/features-canvas.tsx","../../../../../../../src/presentation/web/components/features/features-canvas/canvas-toolbar.tsx","../../../../../../../src/presentation/web/hooks/use-workspaces.ts","../../../../../../../src/presentation/web/components/features/features-canvas/workspace-selector.tsx","../../../../../../../src/presentation/web/components/features/features-canvas/manage-workspace-dialog.tsx","../../../../../../../src/presentation/web/components/features/features-canvas/workspace-name-dialog.tsx","../../../../../../../src/presentation/web/components/common/floating-action-button/floating-action-button.tsx","../../../../../../../src/presentation/web/hooks/use-selected-feature-id.ts","../../../../../../../src/presentation/web/hooks/use-selected-repository.ts","../../../../../../../src/presentation/web/hooks/use-viewport-persistence.ts","../../../../../../../src/presentation/web/app/actions/data%3A98708e%20%3Ctext/javascript%3E","../../../../../../../src/presentation/web/components/features/control-center/control-center.tsx","../../../../../../../src/presentation/web/app/actions/data%3A0f7766%20%3Ctext/javascript%3E","../../../../../../../src/presentation/web/components/features/control-center/control-center-inner.tsx","../../../../../../../src/presentation/web/components/features/control-center/control-center-empty-state.tsx","../../../../../../../src/presentation/web/app/actions/data%3A972ca5%20%3Ctext/javascript%3E","../../../../../../../src/presentation/web/components/features/control-center/new-project-dialog.tsx","../../../../../../../node_modules/.pnpm/lucide-react%400.563.0_react%4019.2.4/node_modules/lucide-react/src/icons/github.ts","../../../../../../../node_modules/.pnpm/lucide-react%400.563.0_react%4019.2.4/node_modules/lucide-react/src/icons/maximize.ts","../../../../../../../node_modules/.pnpm/lucide-react%400.563.0_react%4019.2.4/node_modules/lucide-react/src/icons/zoom-out.ts","../../../../../../../node_modules/.pnpm/lucide-react%400.563.0_react%4019.2.4/node_modules/lucide-react/src/icons/zoom-in.ts","../../../../../../../node_modules/.pnpm/lucide-react%400.563.0_react%4019.2.4/node_modules/lucide-react/src/icons/eye-off.ts","../../../../../../../src/presentation/web/components/features/control-center/use-workspace-fit-view.ts","../../../../../../../src/presentation/web/components/features/control-center/use-fab-actions.tsx","../../../../../../../src/presentation/web/components/features/control-center/use-canvas-event-listeners.ts"],"sourcesContent":["'use client';\n\nimport { useState, useMemo, useCallback, useRef, useEffect } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport type { Edge, Position } from '@xyflow/react';\nimport type { CanvasNodeType } from '@/components/features/features-canvas';\nimport type { FeatureNodeData } from '@/components/common/feature-node';\nimport type { RepositoryNodeData } from '@/components/common/repository-node';\nimport type { ApplicationNodeData } from '@/components/common/application-node/application-node-config';\nimport {\n deriveGraph,\n type FeatureEntry,\n type RepoEntry,\n type ApplicationEntry,\n type GraphCallbacks,\n} from '@/lib/derive-graph';\nimport { layoutWithDagre, getCanvasLayoutDefaults } from '@/lib/layout-with-dagre';\n\nexport type { GraphCallbacks } from '@/lib/derive-graph';\n\nexport interface UseGraphStateReturn {\n /** Derived React Flow nodes (from domain Maps). */\n nodes: CanvasNodeType[];\n /** Derived React Flow edges (from domain Maps). */\n edges: Edge[];\n /**\n * Reconcile domain Maps with fresh server data (new initialNodes/initialEdges).\n * Preserves pending (creating) nodes unless a matching real feature appears.\n * No-ops when a mutation is in-flight (see beginMutation/endMutation).\n */\n reconcile: (newNodes: CanvasNodeType[], newEdges: Edge[]) => void;\n /** Update a feature's state/lifecycle/name (e.g., from SSE events). */\n updateFeature: (featureNodeId: string, updates: FeatureDataUpdates) => void;\n /** Add a pending (optimistic) feature node (state='creating'). */\n addPendingFeature: (nodeId: string, data: FeatureNodeData, parentNodeId?: string) => void;\n /** Remove a pending feature node (e.g., on rollback). */\n removePendingFeature: (nodeId: string) => void;\n /** Remove a real feature node from the domain Map. */\n removeFeature: (nodeId: string) => void;\n /** Restore a previously removed feature (rollback). */\n restoreFeature: (nodeId: string, entry: FeatureEntry) => void;\n /** Add a repository node (may use a temp ID initially). */\n addRepository: (nodeId: string, data: RepositoryNodeData) => void;\n /** Remove a repository node. */\n removeRepository: (nodeId: string) => void;\n /** Replace a temp repo ID with the real one (atomic). */\n replaceRepository: (tempId: string, realId: string, data: RepositoryNodeData) => void;\n /** Stable lookup: get the repositoryPath for a feature node. */\n getFeatureRepositoryPath: (featureNodeId: string) => string | undefined;\n /** Stable lookup: get repository node data by nodeId. */\n getRepositoryData: (nodeId: string) => RepositoryNodeData | undefined;\n /** Stable lookup: get the current number of repositories in the domain Map. */\n getRepoMapSize: () => number;\n /** Add an application node. */\n addApplication: (nodeId: string, data: ApplicationNodeData) => void;\n /** Remove an application node. */\n removeApplication: (nodeId: string) => void;\n /** Update callbacks injected into node data (does NOT trigger re-render). */\n setCallbacks: (callbacks: GraphCallbacks) => void;\n /**\n * Signal that an optimistic mutation has started. While any mutation is\n * in-flight, `reconcile` becomes a no-op so stale poll data cannot\n * overwrite optimistic state. Calls are ref-counted — nest freely.\n */\n beginMutation: () => void;\n /**\n * Signal that an optimistic mutation has resolved. Adds a one-poll-interval\n * cooldown (default 3 s) so the next poll fetches post-mutation data.\n */\n endMutation: (cooldownMs?: number) => void;\n /** Whether a mutation is currently in-flight (for polling skip logic). */\n isMutating: () => boolean;\n}\n\n/** Parse initialNodes + initialEdges into domain Maps. */\nfunction parseMaps(\n initialNodes: CanvasNodeType[],\n initialEdges: Edge[]\n): {\n featureMap: Map<string, FeatureEntry>;\n repoMap: Map<string, RepoEntry>;\n applicationMap: Map<string, ApplicationEntry>;\n} {\n // Build parentNodeId map from dependency edges\n const parentByChild = new Map<string, string>();\n for (const edge of initialEdges) {\n if (edge.type === 'dependencyEdge') {\n parentByChild.set(edge.target, edge.source);\n }\n }\n\n const featureMap = new Map<string, FeatureEntry>();\n const repoMap = new Map<string, RepoEntry>();\n const applicationMap = new Map<string, ApplicationEntry>();\n\n for (const node of initialNodes) {\n if (node.type === 'featureNode') {\n featureMap.set(node.id, {\n nodeId: node.id,\n data: node.data as FeatureNodeData,\n parentNodeId: parentByChild.get(node.id),\n });\n } else if (node.type === 'repositoryNode') {\n repoMap.set(node.id, {\n nodeId: node.id,\n data: node.data as RepositoryNodeData,\n });\n } else if (node.type === 'applicationNode') {\n applicationMap.set(node.id, {\n nodeId: node.id,\n data: node.data as ApplicationNodeData,\n });\n }\n }\n\n return { featureMap, repoMap, applicationMap };\n}\n\ntype FeatureDataUpdates = Partial<\n Pick<FeatureNodeData, 'state' | 'lifecycle' | 'name' | 'description'>\n>;\n\nfunction isFeatureDataUnchanged(data: FeatureNodeData, updates: FeatureDataUpdates): boolean {\n return (\n (updates.state === undefined || updates.state === data.state) &&\n (updates.lifecycle === undefined || updates.lifecycle === data.lifecycle) &&\n (updates.name === undefined || updates.name === data.name) &&\n (updates.description === undefined || updates.description === data.description)\n );\n}\n\n/**\n * Shallow-compare two Maps by key set and entry data (JSON equality).\n * Returns true if they are structurally identical, avoiding unnecessary re-renders.\n */\nfunction mapsEqual<T extends { data: unknown; parentNodeId?: string }>(\n a: Map<string, T>,\n b: Map<string, T>\n): boolean {\n if (a.size !== b.size) return false;\n for (const [key, aEntry] of a) {\n const bEntry = b.get(key);\n if (!bEntry) return false;\n if (aEntry.parentNodeId !== bEntry.parentNodeId) return false;\n if (aEntry.data === bEntry.data) continue;\n if (JSON.stringify(aEntry.data) !== JSON.stringify(bEntry.data)) return false;\n }\n return true;\n}\n\nexport function useGraphState(\n initialNodes: CanvasNodeType[],\n initialEdges: Edge[],\n showArchived = false\n): UseGraphStateReturn {\n const { i18n } = useTranslation();\n const layoutDefaults = useMemo(() => getCanvasLayoutDefaults(i18n.dir()), [i18n]);\n // eslint-disable-next-line react-hooks/exhaustive-deps -- intentional: parse only on mount (like useState initializer)\n const init = useMemo(() => parseMaps(initialNodes, initialEdges), []);\n\n const [featureMap, setFeatureMap] = useState<Map<string, FeatureEntry>>(init.featureMap);\n const [repoMap, setRepoMap] = useState<Map<string, RepoEntry>>(init.repoMap);\n const [applicationMap, setApplicationMap] = useState<Map<string, ApplicationEntry>>(\n init.applicationMap\n );\n const [pendingMap, setPendingMap] = useState<Map<string, FeatureEntry>>(\n new Map<string, FeatureEntry>()\n );\n\n // Buffer for SSE updates that arrive before their feature is in featureMap.\n // When reconcile adds new features, buffered updates are applied automatically.\n const pendingUpdatesRef = useRef<\n Map<string, Partial<Pick<FeatureNodeData, 'state' | 'lifecycle' | 'name' | 'description'>>>\n >(new Map());\n\n // Protect recently-added/replaced repos from stale-poll reconcile.\n // After addRepository or replaceRepository, the repo ID is marked as protected.\n // Once reconcile sees the repo in server data, the protection is cleared.\n // This prevents a stale poll (that fetched data before the server action completed)\n // from wiping a repo that the client has already added.\n const protectedRepoIdsRef = useRef<Set<string>>(new Set());\n\n // Mutation guard: ref-counted counter. While > 0, reconcile is a no-op\n // so stale poll data cannot overwrite optimistic state.\n const mutationCountRef = useRef(0);\n const mutationTimersRef = useRef<Set<ReturnType<typeof setTimeout>>>(new Set());\n\n // Track 'deleting' features that the server no longer returns.\n // Retained for one extra reconcile cycle so the user sees the deleting state\n // before the node disappears from the canvas.\n const deletingRetainedRef = useRef<Set<string>>(new Set());\n\n // Track deleted repo IDs so reconcile doesn't resurrect them from stale server data.\n // Cleared once reconcile sees the repo is gone from server data.\n const deletedRepoIdsRef = useRef<Set<string>>(new Set());\n\n // Callbacks stored in a ref so changing them doesn't trigger re-render.\n // The stable wrapper object reads from the ref so node closures always use latest callbacks.\n const callbacksRef = useRef<GraphCallbacks>({});\n const stableCallbacks = useMemo<GraphCallbacks>(\n () => ({\n onNodeAction: (nodeId) => callbacksRef.current.onNodeAction?.(nodeId),\n onNodeSettings: (nodeId) => callbacksRef.current.onNodeSettings?.(nodeId),\n onFeatureDelete: (featureId, cleanup, cascadeDelete, closePr) =>\n callbacksRef.current.onFeatureDelete?.(featureId, cleanup, cascadeDelete, closePr),\n onRepositoryAdd: (nodeId) => callbacksRef.current.onRepositoryAdd?.(nodeId),\n onRepositoryClick: (nodeId) => callbacksRef.current.onRepositoryClick?.(nodeId),\n onRepositoryDelete: (repositoryId) => callbacksRef.current.onRepositoryDelete?.(repositoryId),\n onRetryFeature: (featureId) => callbacksRef.current.onRetryFeature?.(featureId),\n onStartFeature: (featureId) => callbacksRef.current.onStartFeature?.(featureId),\n onArchiveFeature: (featureId) => callbacksRef.current.onArchiveFeature?.(featureId),\n onUnarchiveFeature: (featureId) => callbacksRef.current.onUnarchiveFeature?.(featureId),\n onApplicationClick: (applicationId) =>\n callbacksRef.current.onApplicationClick?.(applicationId),\n onApplicationDelete: (applicationId) =>\n callbacksRef.current.onApplicationDelete?.(applicationId),\n }),\n []\n );\n\n // Stable refs for domain Maps (for use in callbacks without depending on state)\n const featureMapRef = useRef(featureMap);\n featureMapRef.current = featureMap;\n const repoMapRef = useRef(repoMap);\n repoMapRef.current = repoMap;\n\n // Filter archived features from the Map when the toggle is off.\n // This gives instant toggle response (no server round-trip) per NFR-3.\n const visibleFeatureMap = useMemo(() => {\n if (showArchived) return featureMap;\n const filtered = new Map<string, FeatureEntry>();\n for (const [id, entry] of featureMap) {\n if ((entry.data.state as string) !== 'archived') {\n filtered.set(id, entry);\n }\n }\n return filtered.size === featureMap.size ? featureMap : filtered;\n }, [featureMap, showArchived]);\n\n // Derive graph from domain Maps (runs on every Map change, but dagre only on topology change)\n const derived = useMemo(\n () => deriveGraph(visibleFeatureMap, repoMap, pendingMap, stableCallbacks, applicationMap),\n [visibleFeatureMap, repoMap, pendingMap, stableCallbacks, applicationMap]\n );\n\n // Cache dagre layout positions — only re-run when node set or edge connections change\n const layoutCacheRef = useRef<{\n key: string;\n positions: Map<\n string,\n { position: { x: number; y: number }; targetPosition: Position; sourcePosition: Position }\n >;\n }>({ key: '', positions: new Map() });\n\n const { nodes, edges } = useMemo(() => {\n const nodeIds = derived.nodes\n .map((n) => n.id)\n .sort()\n .join(',');\n const edgeKeys = derived.edges\n .map((e) => `${e.source}-${e.target}`)\n .sort()\n .join(',');\n const topologyKey = `${nodeIds}|${edgeKeys}|${layoutDefaults.direction}`;\n\n if (topologyKey !== layoutCacheRef.current.key) {\n // Topology changed — re-run dagre\n const result = layoutWithDagre(derived.nodes, derived.edges, layoutDefaults);\n const positions = new Map<\n string,\n { position: { x: number; y: number }; targetPosition: Position; sourcePosition: Position }\n >();\n for (const node of result.nodes) {\n positions.set(node.id, {\n position: node.position,\n targetPosition: (node as Record<string, unknown>).targetPosition as Position,\n sourcePosition: (node as Record<string, unknown>).sourcePosition as Position,\n });\n }\n\n // Anchor new layout to previous positions so the graph doesn't drift.\n // Find the first surviving node (exists in both old and new layouts) and\n // shift the entire new layout by the delta between its old and new position.\n const prevPositions = layoutCacheRef.current.positions;\n if (prevPositions.size > 0) {\n let dx = 0;\n let dy = 0;\n for (const [id, newPos] of positions) {\n const oldPos = prevPositions.get(id);\n if (oldPos) {\n dx = oldPos.position.x - newPos.position.x;\n dy = oldPos.position.y - newPos.position.y;\n break;\n }\n }\n if (dx !== 0 || dy !== 0) {\n for (const pos of positions.values()) {\n pos.position = { x: pos.position.x + dx, y: pos.position.y + dy };\n }\n for (const node of result.nodes) {\n node.position = { x: node.position.x + dx, y: node.position.y + dy };\n }\n }\n }\n\n layoutCacheRef.current = { key: topologyKey, positions };\n return result;\n }\n\n // Data-only change — apply cached positions without re-running dagre\n const { positions } = layoutCacheRef.current;\n const nodes = derived.nodes.map((node) => {\n const cached = positions.get(node.id);\n return cached ? { ...node, ...cached } : node;\n });\n return { nodes, edges: derived.edges };\n }, [derived, layoutDefaults]);\n\n // --- Mutations ---\n\n const reconcile = useCallback((newNodes: CanvasNodeType[], newEdges: Edge[]) => {\n // Skip reconciliation while an optimistic mutation is in-flight.\n // Stale poll data fetched before the mutation completed would overwrite\n // the optimistic state, causing flicker (nodes disappearing/reappearing).\n if (mutationCountRef.current > 0) return;\n\n const { featureMap: newFeatureMap, repoMap: newRepoMap } = parseMaps(newNodes, newEdges);\n\n // Precompute match keys so we don't scan newFeatureMap.values() per pending entry\n const realFeatureKeys = new Set(\n [...newFeatureMap.values()].map((e) => `${e.data.name}\\0${e.data.repositoryPath}`)\n );\n\n setFeatureMap((currentFeatureMap) => {\n // Preserve pending (creating) nodes unless matched by name+repositoryPath from newFeatureMap\n const pendingEntries = [...currentFeatureMap.entries()].filter(\n ([, e]) => e.data.state === 'creating'\n );\n\n const merged = new Map(newFeatureMap);\n\n // Keep pending nodes that don't have a real counterpart in new data\n for (const [tempId, pendingEntry] of pendingEntries) {\n const key = `${pendingEntry.data.name}\\0${pendingEntry.data.repositoryPath}`;\n if (!realFeatureKeys.has(key)) {\n merged.set(tempId, pendingEntry);\n }\n }\n\n // Preserve 'deleting' state for features being deleted.\n // If the server still returns the feature, override its state to 'deleting'.\n // If the server no longer returns it (soft-deleted), retain it for one\n // extra reconcile cycle so the user sees the deleting animation.\n const nextRetained = new Set<string>();\n for (const [id, entry] of currentFeatureMap) {\n if (entry.data.state === 'deleting') {\n if (merged.has(id)) {\n // Server still has it — override state to keep showing 'deleting'\n merged.set(id, {\n ...merged.get(id)!,\n data: { ...merged.get(id)!.data, state: 'deleting' },\n });\n } else if (!deletingRetainedRef.current.has(id)) {\n // First reconcile after server removal — retain with deleting state\n merged.set(id, entry);\n nextRetained.add(id);\n }\n // else: already retained once — let it disappear\n }\n }\n deletingRetainedRef.current = nextRetained;\n\n // Apply any buffered SSE updates to features that now exist in the map\n for (const [nodeId, updates] of pendingUpdatesRef.current) {\n const entry = merged.get(nodeId);\n if (entry) {\n merged.set(nodeId, { ...entry, data: { ...entry.data, ...updates } });\n pendingUpdatesRef.current.delete(nodeId);\n }\n }\n\n // Avoid re-render when polling returns identical data\n if (mapsEqual(currentFeatureMap, merged)) return currentFeatureMap;\n return merged;\n });\n\n // Clean pendingMap entries that now have a real counterpart in server data\n setPendingMap((currentPendingMap) => {\n if (currentPendingMap.size === 0) return currentPendingMap;\n let changed = false;\n const next = new Map(currentPendingMap);\n for (const [tempId, pendingEntry] of currentPendingMap) {\n const key = `${pendingEntry.data.name}\\0${pendingEntry.data.repositoryPath}`;\n if (realFeatureKeys.has(key)) {\n next.delete(tempId);\n changed = true;\n }\n }\n return changed ? next : currentPendingMap;\n });\n\n // Merge repoMap: preserve optimistic (temp) repos AND recently-added/replaced\n // repos that the server doesn't know about yet. Without this, a polling\n // reconcile that fires before the server action returns (or uses stale data\n // from an in-flight fetch) would wipe the repo, causing a canvas→empty flicker.\n setRepoMap((currentRepoMap) => {\n // Start with everything the server returned\n const merged = new Map(newRepoMap);\n\n // Remove repos that were deleted client-side but the server still returns\n // (stale data). Once the server stops returning the repo, clear the tombstone.\n for (const deletedId of deletedRepoIdsRef.current) {\n if (merged.has(deletedId)) {\n merged.delete(deletedId);\n } else {\n // Server confirmed deletion — no longer need the tombstone\n deletedRepoIdsRef.current.delete(deletedId);\n }\n }\n\n // Build a set of repositoryPaths present in server data for dedup\n const serverPaths = new Set([...newRepoMap.values()].map((e) => e.data.repositoryPath));\n\n for (const [id, entry] of currentRepoMap) {\n if (merged.has(id)) {\n // Server confirmed this repo — no longer needs protection\n protectedRepoIdsRef.current.delete(id);\n continue;\n }\n if (serverPaths.has(entry.data.repositoryPath)) {\n // Server has a repo with same path — clear protection\n protectedRepoIdsRef.current.delete(id);\n continue;\n }\n // Keep temp repos or protected (recently added/replaced) repos\n if (id.startsWith('repo-temp-') || protectedRepoIdsRef.current.has(id)) {\n merged.set(id, entry);\n }\n }\n\n // Avoid re-render when polling returns identical data\n if (mapsEqual(currentRepoMap, merged)) return currentRepoMap;\n return merged;\n });\n\n // Reconcile applicationMap\n const { applicationMap: newApplicationMap } = parseMaps(newNodes, newEdges);\n setApplicationMap((currentAppMap) => {\n if (mapsEqual(currentAppMap, newApplicationMap)) return currentAppMap;\n return newApplicationMap;\n });\n }, []);\n\n const updateFeature = useCallback((featureNodeId: string, updates: FeatureDataUpdates) => {\n setFeatureMap((prev) => {\n const entry = prev.get(featureNodeId);\n if (!entry) {\n // Feature not yet in map — buffer update for when reconcile adds it\n pendingUpdatesRef.current.set(featureNodeId, {\n ...pendingUpdatesRef.current.get(featureNodeId),\n ...updates,\n });\n return prev;\n }\n // Clear any buffered update for this feature since it's now in the map\n pendingUpdatesRef.current.delete(featureNodeId);\n if (isFeatureDataUnchanged(entry.data, updates)) return prev;\n const next = new Map(prev);\n next.set(featureNodeId, { ...entry, data: { ...entry.data, ...updates } });\n return next;\n });\n\n // Also check pendingMap\n setPendingMap((prev) => {\n const entry = prev.get(featureNodeId);\n if (!entry) return prev;\n if (isFeatureDataUnchanged(entry.data, updates)) return prev;\n const next = new Map(prev);\n next.set(featureNodeId, { ...entry, data: { ...entry.data, ...updates } });\n return next;\n });\n }, []);\n\n const addPendingFeature = useCallback(\n (nodeId: string, data: FeatureNodeData, parentNodeId?: string) => {\n setPendingMap((prev) => {\n const next = new Map(prev);\n next.set(nodeId, { nodeId, data, parentNodeId });\n return next;\n });\n },\n []\n );\n\n const removePendingFeature = useCallback((nodeId: string) => {\n setPendingMap((prev) => {\n if (!prev.has(nodeId)) return prev;\n const next = new Map(prev);\n next.delete(nodeId);\n return next;\n });\n }, []);\n\n const removeFeature = useCallback((nodeId: string) => {\n setFeatureMap((prev) => {\n if (!prev.has(nodeId)) return prev;\n const next = new Map(prev);\n next.delete(nodeId);\n return next;\n });\n }, []);\n\n const restoreFeature = useCallback((nodeId: string, entry: FeatureEntry) => {\n setFeatureMap((prev) => {\n const next = new Map(prev);\n next.set(nodeId, entry);\n return next;\n });\n }, []);\n\n const addRepository = useCallback((nodeId: string, data: RepositoryNodeData) => {\n protectedRepoIdsRef.current.add(nodeId);\n deletedRepoIdsRef.current.delete(nodeId);\n setRepoMap((prev) => {\n const next = new Map(prev);\n next.set(nodeId, { nodeId, data });\n return next;\n });\n }, []);\n\n const removeRepository = useCallback((nodeId: string) => {\n protectedRepoIdsRef.current.delete(nodeId);\n deletedRepoIdsRef.current.add(nodeId);\n setRepoMap((prev) => {\n if (!prev.has(nodeId)) return prev;\n const next = new Map(prev);\n next.delete(nodeId);\n return next;\n });\n }, []);\n\n const replaceRepository = useCallback(\n (tempId: string, realId: string, data: RepositoryNodeData) => {\n protectedRepoIdsRef.current.delete(tempId);\n protectedRepoIdsRef.current.add(realId);\n setRepoMap((prev) => {\n if (!prev.has(tempId)) return prev;\n const next = new Map(prev);\n next.delete(tempId);\n next.set(realId, { nodeId: realId, data });\n return next;\n });\n },\n []\n );\n\n const addApplication = useCallback((nodeId: string, data: ApplicationNodeData) => {\n setApplicationMap((prev) => {\n const next = new Map(prev);\n next.set(nodeId, { nodeId, data });\n return next;\n });\n }, []);\n\n const removeApplication = useCallback((nodeId: string) => {\n setApplicationMap((prev) => {\n if (!prev.has(nodeId)) return prev;\n const next = new Map(prev);\n next.delete(nodeId);\n return next;\n });\n }, []);\n\n const getFeatureRepositoryPath = useCallback((featureNodeId: string): string | undefined => {\n return featureMapRef.current.get(featureNodeId)?.data.repositoryPath;\n }, []);\n\n const getRepositoryData = useCallback((nodeId: string): RepositoryNodeData | undefined => {\n return repoMapRef.current.get(nodeId)?.data;\n }, []);\n\n const getRepoMapSize = useCallback((): number => {\n return repoMapRef.current.size;\n }, []);\n\n const setCallbacks = useCallback((callbacks: GraphCallbacks) => {\n callbacksRef.current = callbacks;\n }, []);\n\n const beginMutation = useCallback(() => {\n mutationCountRef.current++;\n }, []);\n\n const endMutation = useCallback((cooldownMs = 3_000) => {\n // Delay decrement by one poll interval so the next fetch after the\n // mutation returns post-mutation data, not a stale in-flight response.\n const timer = setTimeout(() => {\n mutationCountRef.current = Math.max(0, mutationCountRef.current - 1);\n mutationTimersRef.current.delete(timer);\n }, cooldownMs);\n mutationTimersRef.current.add(timer);\n }, []);\n\n const isMutating = useCallback(() => mutationCountRef.current > 0, []);\n\n // Cleanup cooldown timers on unmount\n useEffect(() => {\n const timers = mutationTimersRef.current;\n return () => {\n for (const timer of timers) clearTimeout(timer);\n timers.clear();\n };\n }, []);\n\n return {\n nodes,\n edges,\n reconcile,\n updateFeature,\n addPendingFeature,\n removePendingFeature,\n removeFeature,\n restoreFeature,\n addRepository,\n removeRepository,\n replaceRepository,\n getFeatureRepositoryPath,\n getRepositoryData,\n getRepoMapSize,\n addApplication,\n removeApplication,\n setCallbacks,\n beginMutation,\n endMutation,\n isMutating,\n };\n}\n","var v=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports);var y=v((Fi,ee)=>{var Vt=Object.defineProperty,At=(e,t,r)=>t in e?Vt(e,t,{enumerable:!0,configurable:!0,writable:!0,value:r}):e[t]=r,E=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports),k=(e,t,r)=>At(e,typeof t!=\"symbol\"?t+\"\":t,r),R=E((e,t)=>{\"use strict\";var r=\"\\0\",n=\"\\0\",i=\"\u0001\",o=class{constructor(d){k(this,\"_isDirected\",!0),k(this,\"_isMultigraph\",!1),k(this,\"_isCompound\",!1),k(this,\"_label\"),k(this,\"_defaultNodeLabelFn\",()=>{}),k(this,\"_defaultEdgeLabelFn\",()=>{}),k(this,\"_nodes\",{}),k(this,\"_in\",{}),k(this,\"_preds\",{}),k(this,\"_out\",{}),k(this,\"_sucs\",{}),k(this,\"_edgeObjs\",{}),k(this,\"_edgeLabels\",{}),k(this,\"_nodeCount\",0),k(this,\"_edgeCount\",0),k(this,\"_parent\"),k(this,\"_children\"),d&&(this._isDirected=Object.hasOwn(d,\"directed\")?d.directed:!0,this._isMultigraph=Object.hasOwn(d,\"multigraph\")?d.multigraph:!1,this._isCompound=Object.hasOwn(d,\"compound\")?d.compound:!1),this._isCompound&&(this._parent={},this._children={},this._children[n]={})}isDirected(){return this._isDirected}isMultigraph(){return this._isMultigraph}isCompound(){return this._isCompound}setGraph(d){return this._label=d,this}graph(){return this._label}setDefaultNodeLabel(d){return this._defaultNodeLabelFn=d,typeof d!=\"function\"&&(this._defaultNodeLabelFn=()=>d),this}nodeCount(){return this._nodeCount}nodes(){return Object.keys(this._nodes)}sources(){var d=this;return this.nodes().filter(h=>Object.keys(d._in[h]).length===0)}sinks(){var d=this;return this.nodes().filter(h=>Object.keys(d._out[h]).length===0)}setNodes(d,h){var f=arguments,m=this;return d.forEach(function(p){f.length>1?m.setNode(p,h):m.setNode(p)}),this}setNode(d,h){return Object.hasOwn(this._nodes,d)?(arguments.length>1&&(this._nodes[d]=h),this):(this._nodes[d]=arguments.length>1?h:this._defaultNodeLabelFn(d),this._isCompound&&(this._parent[d]=n,this._children[d]={},this._children[n][d]=!0),this._in[d]={},this._preds[d]={},this._out[d]={},this._sucs[d]={},++this._nodeCount,this)}node(d){return this._nodes[d]}hasNode(d){return Object.hasOwn(this._nodes,d)}removeNode(d){var h=this;if(Object.hasOwn(this._nodes,d)){var f=m=>h.removeEdge(h._edgeObjs[m]);delete this._nodes[d],this._isCompound&&(this._removeFromParentsChildList(d),delete this._parent[d],this.children(d).forEach(function(m){h.setParent(m)}),delete this._children[d]),Object.keys(this._in[d]).forEach(f),delete this._in[d],delete this._preds[d],Object.keys(this._out[d]).forEach(f),delete this._out[d],delete this._sucs[d],--this._nodeCount}return this}setParent(d,h){if(!this._isCompound)throw new Error(\"Cannot set parent in a non-compound graph\");if(h===void 0)h=n;else{h+=\"\";for(var f=h;f!==void 0;f=this.parent(f))if(f===d)throw new Error(\"Setting \"+h+\" as parent of \"+d+\" would create a cycle\");this.setNode(h)}return this.setNode(d),this._removeFromParentsChildList(d),this._parent[d]=h,this._children[h][d]=!0,this}_removeFromParentsChildList(d){delete this._children[this._parent[d]][d]}parent(d){if(this._isCompound){var h=this._parent[d];if(h!==n)return h}}children(d=n){if(this._isCompound){var h=this._children[d];if(h)return Object.keys(h)}else{if(d===n)return this.nodes();if(this.hasNode(d))return[]}}predecessors(d){var h=this._preds[d];if(h)return Object.keys(h)}successors(d){var h=this._sucs[d];if(h)return Object.keys(h)}neighbors(d){var h=this.predecessors(d);if(h){let m=new Set(h);for(var f of this.successors(d))m.add(f);return Array.from(m.values())}}isLeaf(d){var h;return this.isDirected()?h=this.successors(d):h=this.neighbors(d),h.length===0}filterNodes(d){var h=new this.constructor({directed:this._isDirected,multigraph:this._isMultigraph,compound:this._isCompound});h.setGraph(this.graph());var f=this;Object.entries(this._nodes).forEach(function([w,b]){d(w)&&h.setNode(w,b)}),Object.values(this._edgeObjs).forEach(function(w){h.hasNode(w.v)&&h.hasNode(w.w)&&h.setEdge(w,f.edge(w))});var m={};function p(w){var b=f.parent(w);return b===void 0||h.hasNode(b)?(m[w]=b,b):b in m?m[b]:p(b)}return this._isCompound&&h.nodes().forEach(w=>h.setParent(w,p(w))),h}setDefaultEdgeLabel(d){return this._defaultEdgeLabelFn=d,typeof d!=\"function\"&&(this._defaultEdgeLabelFn=()=>d),this}edgeCount(){return this._edgeCount}edges(){return Object.values(this._edgeObjs)}setPath(d,h){var f=this,m=arguments;return d.reduce(function(p,w){return m.length>1?f.setEdge(p,w,h):f.setEdge(p,w),w}),this}setEdge(){var d,h,f,m,p=!1,w=arguments[0];typeof w==\"object\"&&w!==null&&\"v\"in w?(d=w.v,h=w.w,f=w.name,arguments.length===2&&(m=arguments[1],p=!0)):(d=w,h=arguments[1],f=arguments[3],arguments.length>2&&(m=arguments[2],p=!0)),d=\"\"+d,h=\"\"+h,f!==void 0&&(f=\"\"+f);var b=l(this._isDirected,d,h,f);if(Object.hasOwn(this._edgeLabels,b))return p&&(this._edgeLabels[b]=m),this;if(f!==void 0&&!this._isMultigraph)throw new Error(\"Cannot set a named edge when isMultigraph = false\");this.setNode(d),this.setNode(h),this._edgeLabels[b]=p?m:this._defaultEdgeLabelFn(d,h,f);var g=u(this._isDirected,d,h,f);return d=g.v,h=g.w,Object.freeze(g),this._edgeObjs[b]=g,s(this._preds[h],d),s(this._sucs[d],h),this._in[h][b]=g,this._out[d][b]=g,this._edgeCount++,this}edge(d,h,f){var m=arguments.length===1?c(this._isDirected,arguments[0]):l(this._isDirected,d,h,f);return this._edgeLabels[m]}edgeAsObj(){let d=this.edge(...arguments);return typeof d!=\"object\"?{label:d}:d}hasEdge(d,h,f){var m=arguments.length===1?c(this._isDirected,arguments[0]):l(this._isDirected,d,h,f);return Object.hasOwn(this._edgeLabels,m)}removeEdge(d,h,f){var m=arguments.length===1?c(this._isDirected,arguments[0]):l(this._isDirected,d,h,f),p=this._edgeObjs[m];return p&&(d=p.v,h=p.w,delete this._edgeLabels[m],delete this._edgeObjs[m],a(this._preds[h],d),a(this._sucs[d],h),delete this._in[h][m],delete this._out[d][m],this._edgeCount--),this}inEdges(d,h){return this.isDirected()?this.filterEdges(this._in[d],d,h):this.nodeEdges(d,h)}outEdges(d,h){return this.isDirected()?this.filterEdges(this._out[d],d,h):this.nodeEdges(d,h)}nodeEdges(d,h){if(d in this._nodes)return this.filterEdges({...this._in[d],...this._out[d]},d,h)}filterEdges(d,h,f){if(d){var m=Object.values(d);return f?m.filter(function(p){return p.v===h&&p.w===f||p.v===f&&p.w===h}):m}}};function s(d,h){d[h]?d[h]++:d[h]=1}function a(d,h){--d[h]||delete d[h]}function l(d,h,f,m){var p=\"\"+h,w=\"\"+f;if(!d&&p>w){var b=p;p=w,w=b}return p+i+w+i+(m===void 0?r:m)}function u(d,h,f,m){var p=\"\"+h,w=\"\"+f;if(!d&&p>w){var b=p;p=w,w=b}var g={v:p,w};return m&&(g.name=m),g}function c(d,h){return l(d,h.v,h.w,h.name)}t.exports=o}),Yt=E((e,t)=>{t.exports=\"3.0.2\"}),Bt=E((e,t)=>{t.exports={Graph:R(),version:Yt()}}),Wt=E((e,t)=>{var r=R();t.exports={write:n,read:s};function n(a){var l={options:{directed:a.isDirected(),multigraph:a.isMultigraph(),compound:a.isCompound()},nodes:i(a),edges:o(a)};return a.graph()!==void 0&&(l.value=structuredClone(a.graph())),l}function i(a){return a.nodes().map(function(l){var u=a.node(l),c=a.parent(l),d={v:l};return u!==void 0&&(d.value=u),c!==void 0&&(d.parent=c),d})}function o(a){return a.edges().map(function(l){var u=a.edge(l),c={v:l.v,w:l.w};return l.name!==void 0&&(c.name=l.name),u!==void 0&&(c.value=u),c})}function s(a){var l=new r(a.options).setGraph(a.value);return a.nodes.forEach(function(u){l.setNode(u.v,u.value),u.parent&&l.setParent(u.v,u.parent)}),a.edges.forEach(function(u){l.setEdge({v:u.v,w:u.w,name:u.name},u.value)}),l}}),U=E((e,t)=>{t.exports=n;var r=()=>1;function n(o,s,a,l){return i(o,String(s),a||r,l||function(u){return o.outEdges(u)})}function i(o,s,a,l){var u={},c=!0,d=0,h=o.nodes(),f=function(b){var g=a(b);u[b.v].distance+g<u[b.w].distance&&(u[b.w]={distance:u[b.v].distance+g,predecessor:b.v},c=!0)},m=function(){h.forEach(function(b){l(b).forEach(function(g){var I=g.v===b?g.v:g.w,Gt=I===g.v?g.w:g.v;f({v:I,w:Gt})})})};h.forEach(function(b){var g=b===s?0:Number.POSITIVE_INFINITY;u[b]={distance:g}});for(var p=h.length,w=1;w<p&&(c=!1,d++,m(),!!c);w++);if(d===p-1&&(c=!1,m(),c))throw new Error(\"The graph contains a negative weight cycle\");return u}}),zt=E((e,t)=>{t.exports=r;function r(n){var i={},o=[],s;function a(l){Object.hasOwn(i,l)||(i[l]=!0,s.push(l),n.successors(l).forEach(a),n.predecessors(l).forEach(a))}return n.nodes().forEach(function(l){s=[],a(l),s.length&&o.push(s)}),o}}),K=E((e,t)=>{var r=class{constructor(){k(this,\"_arr\",[]),k(this,\"_keyIndices\",{})}size(){return this._arr.length}keys(){return this._arr.map(function(n){return n.key})}has(n){return Object.hasOwn(this._keyIndices,n)}priority(n){var i=this._keyIndices[n];if(i!==void 0)return this._arr[i].priority}min(){if(this.size()===0)throw new Error(\"Queue underflow\");return this._arr[0].key}add(n,i){var o=this._keyIndices;if(n=String(n),!Object.hasOwn(o,n)){var s=this._arr,a=s.length;return o[n]=a,s.push({key:n,priority:i}),this._decrease(a),!0}return!1}removeMin(){this._swap(0,this._arr.length-1);var n=this._arr.pop();return delete this._keyIndices[n.key],this._heapify(0),n.key}decrease(n,i){var o=this._keyIndices[n];if(i>this._arr[o].priority)throw new Error(\"New priority is greater than current priority. Key: \"+n+\" Old: \"+this._arr[o].priority+\" New: \"+i);this._arr[o].priority=i,this._decrease(o)}_heapify(n){var i=this._arr,o=2*n,s=o+1,a=n;o<i.length&&(a=i[o].priority<i[a].priority?o:a,s<i.length&&(a=i[s].priority<i[a].priority?s:a),a!==n&&(this._swap(n,a),this._heapify(a)))}_decrease(n){for(var i=this._arr,o=i[n].priority,s;n!==0&&(s=n>>1,!(i[s].priority<o));)this._swap(n,s),n=s}_swap(n,i){var o=this._arr,s=this._keyIndices,a=o[n],l=o[i];o[n]=l,o[i]=a,s[l.key]=n,s[a.key]=i}};t.exports=r}),T=E((e,t)=>{var r=K();t.exports=i;var n=()=>1;function i(s,a,l,u){var c=function(d){return s.outEdges(d)};return o(s,String(a),l||n,u||c)}function o(s,a,l,u){var c={},d=new r,h,f,m=function(p){var w=p.v!==h?p.v:p.w,b=c[w],g=l(p),I=f.distance+g;if(g<0)throw new Error(\"dijkstra does not allow negative edge weights. Bad edge: \"+p+\" Weight: \"+g);I<b.distance&&(b.distance=I,b.predecessor=h,d.decrease(w,I))};for(s.nodes().forEach(function(p){var w=p===a?0:Number.POSITIVE_INFINITY;c[p]={distance:w},d.add(p,w)});d.size()>0&&(h=d.removeMin(),f=c[h],f.distance!==Number.POSITIVE_INFINITY);)u(h).forEach(m);return c}}),Xt=E((e,t)=>{var r=T();t.exports=n;function n(i,o,s){return i.nodes().reduce(function(a,l){return a[l]=r(i,l,o,s),a},{})}}),Ht=E((e,t)=>{t.exports=r;function r(i,o,s){if(i[o].predecessor!==void 0)throw new Error(\"Invalid source vertex\");if(i[s].predecessor===void 0&&s!==o)throw new Error(\"Invalid destination vertex\");return{weight:i[s].distance,path:n(i,o,s)}}function n(i,o,s){for(var a=[],l=s;l!==o;)a.push(l),l=i[l].predecessor;return a.push(o),a.reverse()}}),Q=E((e,t)=>{t.exports=r;function r(n){var i=0,o=[],s={},a=[];function l(u){var c=s[u]={onStack:!0,lowlink:i,index:i++};if(o.push(u),n.successors(u).forEach(function(f){Object.hasOwn(s,f)?s[f].onStack&&(c.lowlink=Math.min(c.lowlink,s[f].index)):(l(f),c.lowlink=Math.min(c.lowlink,s[f].lowlink))}),c.lowlink===c.index){var d=[],h;do h=o.pop(),s[h].onStack=!1,d.push(h);while(u!==h);a.push(d)}}return n.nodes().forEach(function(u){Object.hasOwn(s,u)||l(u)}),a}}),Ut=E((e,t)=>{var r=Q();t.exports=n;function n(i){return r(i).filter(function(o){return o.length>1||o.length===1&&i.hasEdge(o[0],o[0])})}}),Kt=E((e,t)=>{t.exports=n;var r=()=>1;function n(o,s,a){return i(o,s||r,a||function(l){return o.outEdges(l)})}function i(o,s,a){var l={},u=o.nodes();return u.forEach(function(c){l[c]={},l[c][c]={distance:0},u.forEach(function(d){c!==d&&(l[c][d]={distance:Number.POSITIVE_INFINITY})}),a(c).forEach(function(d){var h=d.v===c?d.w:d.v,f=s(d);l[c][h]={distance:f,predecessor:c}})}),u.forEach(function(c){var d=l[c];u.forEach(function(h){var f=l[h];u.forEach(function(m){var p=f[c],w=d[m],b=f[m],g=p.distance+w.distance;g<b.distance&&(b.distance=g,b.predecessor=w.predecessor)})})}),l}}),J=E((e,t)=>{function r(i){var o={},s={},a=[];function l(u){if(Object.hasOwn(s,u))throw new n;Object.hasOwn(o,u)||(s[u]=!0,o[u]=!0,i.predecessors(u).forEach(l),delete s[u],a.push(u))}if(i.sinks().forEach(l),Object.keys(o).length!==i.nodeCount())throw new n;return a}var n=class extends Error{constructor(){super(...arguments)}};t.exports=r,r.CycleException=n}),Qt=E((e,t)=>{var r=J();t.exports=n;function n(i){try{r(i)}catch(o){if(o instanceof r.CycleException)return!1;throw o}return!0}}),Z=E((e,t)=>{t.exports=r;function r(i,o,s,a,l){Array.isArray(o)||(o=[o]);var u=(i.isDirected()?i.successors:i.neighbors).bind(i),c={};return o.forEach(function(d){if(!i.hasNode(d))throw new Error(\"Graph does not have node: \"+d);l=n(i,d,s===\"post\",c,u,a,l)}),l}function n(i,o,s,a,l,u,c){return Object.hasOwn(a,o)||(a[o]=!0,s||(c=u(c,o)),l(o).forEach(function(d){c=n(i,d,s,a,l,u,c)}),s&&(c=u(c,o))),c}}),$=E((e,t)=>{var r=Z();t.exports=n;function n(i,o,s){return r(i,o,s,function(a,l){return a.push(l),a},[])}}),Jt=E((e,t)=>{var r=$();t.exports=n;function n(i,o){return r(i,o,\"post\")}}),Zt=E((e,t)=>{var r=$();t.exports=n;function n(i,o){return r(i,o,\"pre\")}}),$t=E((e,t)=>{var r=R(),n=K();t.exports=i;function i(o,s){var a=new r,l={},u=new n,c;function d(f){var m=f.v===c?f.w:f.v,p=u.priority(m);if(p!==void 0){var w=s(f);w<p&&(l[m]=c,u.decrease(m,w))}}if(o.nodeCount()===0)return a;o.nodes().forEach(function(f){u.add(f,Number.POSITIVE_INFINITY),a.setNode(f)}),u.decrease(o.nodes()[0],0);for(var h=!1;u.size()>0;){if(c=u.removeMin(),Object.hasOwn(l,c))a.setEdge(c,l[c]);else{if(h)throw new Error(\"Input graph is not connected: \"+o);h=!0}o.nodeEdges(c).forEach(d)}return a}}),er=E((e,t)=>{var r=T(),n=U();t.exports=i;function i(s,a,l,u){return o(s,a,l,u||function(c){return s.outEdges(c)})}function o(s,a,l,u){if(l===void 0)return r(s,a,l,u);for(var c=!1,d=s.nodes(),h=0;h<d.length;h++){for(var f=u(d[h]),m=0;m<f.length;m++){var p=f[m],w=p.v===d[h]?p.v:p.w,b=w===p.v?p.w:p.v;l({v:w,w:b})<0&&(c=!0)}if(c)return n(s,a,l,u)}return r(s,a,l,u)}}),tr=E((e,t)=>{t.exports={bellmanFord:U(),components:zt(),dijkstra:T(),dijkstraAll:Xt(),extractPath:Ht(),findCycles:Ut(),floydWarshall:Kt(),isAcyclic:Qt(),postorder:Jt(),preorder:Zt(),prim:$t(),shortestPaths:er(),reduce:Z(),tarjan:Q(),topsort:J()}}),H=Bt();ee.exports={Graph:H.Graph,json:Wt(),alg:tr(),version:H.version}});var ne=v((Ai,re)=>{var S=class{constructor(){let t={};t._next=t._prev=t,this._sentinel=t}dequeue(){let t=this._sentinel,r=t._prev;if(r!==t)return te(r),r}enqueue(t){let r=this._sentinel;t._prev&&t._next&&te(t),t._next=r._next,r._next._prev=t,r._next=t,t._prev=r}toString(){let t=[],r=this._sentinel,n=r._prev;for(;n!==r;)t.push(JSON.stringify(n,rr)),n=n._prev;return\"[\"+t.join(\", \")+\"]\"}};function te(e){e._prev._next=e._next,e._next._prev=e._prev,delete e._next,delete e._prev}function rr(e,t){if(e!==\"_next\"&&e!==\"_prev\")return t}re.exports=S});var oe=v((Yi,ie)=>{var nr=y().Graph,ir=ne();ie.exports=sr;var or=()=>1;function sr(e,t){if(e.nodeCount()<=1)return[];let r=dr(e,t||or);return ar(r.graph,r.buckets,r.zeroIdx).flatMap(i=>e.outEdges(i.v,i.w))}function ar(e,t,r){let n=[],i=t[t.length-1],o=t[0],s;for(;e.nodeCount();){for(;s=o.dequeue();)P(e,t,r,s);for(;s=i.dequeue();)P(e,t,r,s);if(e.nodeCount()){for(let a=t.length-2;a>0;--a)if(s=t[a].dequeue(),s){n=n.concat(P(e,t,r,s,!0));break}}}return n}function P(e,t,r,n,i){let o=i?[]:void 0;return e.inEdges(n.v).forEach(s=>{let a=e.edge(s),l=e.node(s.v);i&&o.push({v:s.v,w:s.w}),l.out-=a,F(t,r,l)}),e.outEdges(n.v).forEach(s=>{let a=e.edge(s),l=s.w,u=e.node(l);u.in-=a,F(t,r,u)}),e.removeNode(n.v),o}function dr(e,t){let r=new nr,n=0,i=0;e.nodes().forEach(a=>{r.setNode(a,{v:a,in:0,out:0})}),e.edges().forEach(a=>{let l=r.edge(a.v,a.w)||0,u=t(a),c=l+u;r.setEdge(a.v,a.w,c),i=Math.max(i,r.node(a.v).out+=u),n=Math.max(n,r.node(a.w).in+=u)});let o=lr(i+n+3).map(()=>new ir),s=n+1;return r.nodes().forEach(a=>{F(o,s,r.node(a))}),{graph:r,buckets:o,zeroIdx:s}}function F(e,t,r){r.out?r.in?e[r.out-r.in+t].enqueue(r):e[e.length-1].enqueue(r):e[0].enqueue(r)}function lr(e){let t=[];for(let r=0;r<e;r++)t.push(r);return t}});var _=v((Bi,ce)=>{\"use strict\";var se=y().Graph;ce.exports={addBorderNode:vr,addDummyNode:ae,applyWithChunking:C,asNonCompoundGraph:hr,buildLayerMatrix:mr,intersectRect:pr,mapValues:Or,maxRank:le,normalizeRanks:wr,notime:kr,partition:Er,pick:xr,predecessorWeights:fr,range:he,removeEmptyRanks:br,simplify:ur,successorWeights:cr,time:_r,uniqueId:ue,zipObject:D};function ae(e,t,r,n){for(var i=n;e.hasNode(i);)i=ue(n);return r.dummy=t,e.setNode(i,r),i}function ur(e){let t=new se().setGraph(e.graph());return e.nodes().forEach(r=>t.setNode(r,e.node(r))),e.edges().forEach(r=>{let n=t.edge(r.v,r.w)||{weight:0,minlen:1},i=e.edge(r);t.setEdge(r.v,r.w,{weight:n.weight+i.weight,minlen:Math.max(n.minlen,i.minlen)})}),t}function hr(e){let t=new se({multigraph:e.isMultigraph()}).setGraph(e.graph());return e.nodes().forEach(r=>{e.children(r).length||t.setNode(r,e.node(r))}),e.edges().forEach(r=>{t.setEdge(r,e.edge(r))}),t}function cr(e){let t=e.nodes().map(r=>{let n={};return e.outEdges(r).forEach(i=>{n[i.w]=(n[i.w]||0)+e.edge(i).weight}),n});return D(e.nodes(),t)}function fr(e){let t=e.nodes().map(r=>{let n={};return e.inEdges(r).forEach(i=>{n[i.v]=(n[i.v]||0)+e.edge(i).weight}),n});return D(e.nodes(),t)}function pr(e,t){let r=e.x,n=e.y,i=t.x-r,o=t.y-n,s=e.width/2,a=e.height/2;if(!i&&!o)throw new Error(\"Not possible to find intersection inside of the rectangle\");let l,u;return Math.abs(o)*s>Math.abs(i)*a?(o<0&&(a=-a),l=a*i/o,u=a):(i<0&&(s=-s),l=s,u=s*o/i),{x:r+l,y:n+u}}function mr(e){let t=he(le(e)+1).map(()=>[]);return e.nodes().forEach(r=>{let n=e.node(r),i=n.rank;i!==void 0&&(t[i][n.order]=r)}),t}function wr(e){let t=e.nodes().map(n=>{let i=e.node(n).rank;return i===void 0?Number.MAX_VALUE:i}),r=C(Math.min,t);e.nodes().forEach(n=>{let i=e.node(n);Object.hasOwn(i,\"rank\")&&(i.rank-=r)})}function br(e){let t=e.nodes().map(s=>e.node(s).rank).filter(s=>s!==void 0),r=C(Math.min,t),n=[];e.nodes().forEach(s=>{let a=e.node(s).rank-r;n[a]||(n[a]=[]),n[a].push(s)});let i=0,o=e.graph().nodeRankFactor;Array.from(n).forEach((s,a)=>{s===void 0&&a%o!==0?--i:s!==void 0&&i&&s.forEach(l=>e.node(l).rank+=i)})}function vr(e,t,r,n){let i={width:0,height:0};return arguments.length>=4&&(i.rank=r,i.order=n),ae(e,\"border\",i,t)}function gr(e,t=de){let r=[];for(let n=0;n<e.length;n+=t){let i=e.slice(n,n+t);r.push(i)}return r}var de=65535;function C(e,t){if(t.length>de){let r=gr(t);return e.apply(null,r.map(n=>e.apply(null,n)))}else return e.apply(null,t)}function le(e){let r=e.nodes().map(n=>{let i=e.node(n).rank;return i===void 0?Number.MIN_VALUE:i});return C(Math.max,r)}function Er(e,t){let r={lhs:[],rhs:[]};return e.forEach(n=>{t(n)?r.lhs.push(n):r.rhs.push(n)}),r}function _r(e,t){let r=Date.now();try{return t()}finally{console.log(e+\" time: \"+(Date.now()-r)+\"ms\")}}function kr(e,t){return t()}var yr=0;function ue(e){var t=++yr;return e+(\"\"+t)}function he(e,t,r=1){t==null&&(t=e,e=0);let n=o=>o<t;r<0&&(n=o=>t<o);let i=[];for(let o=e;n(o);o+=r)i.push(o);return i}function xr(e,t){let r={};for(let n of t)e[n]!==void 0&&(r[n]=e[n]);return r}function Or(e,t){let r=t;return typeof t==\"string\"&&(r=n=>n[t]),Object.entries(e).reduce((n,[i,o])=>(n[i]=r(o,i),n),{})}function D(e,t){return e.reduce((r,n,i)=>(r[n]=t[i],r),{})}});var pe=v((Wi,fe)=>{\"use strict\";var Nr=oe(),Ir=_().uniqueId;fe.exports={run:jr,undo:Lr};function jr(e){(e.graph().acyclicer===\"greedy\"?Nr(e,r(e)):Cr(e)).forEach(n=>{let i=e.edge(n);e.removeEdge(n),i.forwardName=n.name,i.reversed=!0,e.setEdge(n.w,n.v,i,Ir(\"rev\"))});function r(n){return i=>n.edge(i).weight}}function Cr(e){let t=[],r={},n={};function i(o){Object.hasOwn(n,o)||(n[o]=!0,r[o]=!0,e.outEdges(o).forEach(s=>{Object.hasOwn(r,s.w)?t.push(s):i(s.w)}),delete r[o])}return e.nodes().forEach(i),t}function Lr(e){e.edges().forEach(t=>{let r=e.edge(t);if(r.reversed){e.removeEdge(t);let n=r.forwardName;delete r.reversed,delete r.forwardName,e.setEdge(t.w,t.v,r,n)}})}});var we=v((zi,me)=>{\"use strict\";var qr=_();me.exports={run:Mr,undo:Tr};function Mr(e){e.graph().dummyChains=[],e.edges().forEach(t=>Rr(e,t))}function Rr(e,t){let r=t.v,n=e.node(r).rank,i=t.w,o=e.node(i).rank,s=t.name,a=e.edge(t),l=a.labelRank;if(o===n+1)return;e.removeEdge(t);let u,c,d;for(d=0,++n;n<o;++d,++n)a.points=[],c={width:0,height:0,edgeLabel:a,edgeObj:t,rank:n},u=qr.addDummyNode(e,\"edge\",c,\"_d\"),n===l&&(c.width=a.width,c.height=a.height,c.dummy=\"edge-label\",c.labelpos=a.labelpos),e.setEdge(r,u,{weight:a.weight},s),d===0&&e.graph().dummyChains.push(u),r=u;e.setEdge(r,i,{weight:a.weight},s)}function Tr(e){e.graph().dummyChains.forEach(t=>{let r=e.node(t),n=r.edgeLabel,i;for(e.setEdge(r.edgeObj,n);r.dummy;)i=e.successors(t)[0],e.removeNode(t),n.points.push({x:r.x,y:r.y}),r.dummy===\"edge-label\"&&(n.x=r.x,n.y=r.y,n.width=r.width,n.height=r.height),t=i,r=e.node(t)})}});var j=v((Xi,be)=>{\"use strict\";var{applyWithChunking:Sr}=_();be.exports={longestPath:Pr,slack:Fr};function Pr(e){var t={};function r(n){var i=e.node(n);if(Object.hasOwn(t,n))return i.rank;t[n]=!0;let o=e.outEdges(n).map(a=>a==null?Number.POSITIVE_INFINITY:r(a.w)-e.edge(a).minlen);var s=Sr(Math.min,o);return s===Number.POSITIVE_INFINITY&&(s=0),i.rank=s}e.sources().forEach(r)}function Fr(e,t){return e.node(t.w).rank-e.node(t.v).rank-e.edge(t).minlen}});var G=v((Hi,ve)=>{\"use strict\";var Dr=y().Graph,L=j().slack;ve.exports=Gr;function Gr(e){var t=new Dr({directed:!1}),r=e.nodes()[0],n=e.nodeCount();t.setNode(r,{});for(var i,o;Vr(t,e)<n;)i=Ar(t,e),o=t.hasNode(i.v)?L(e,i):-L(e,i),Yr(t,e,o);return t}function Vr(e,t){function r(n){t.nodeEdges(n).forEach(i=>{var o=i.v,s=n===o?i.w:o;!e.hasNode(s)&&!L(t,i)&&(e.setNode(s,{}),e.setEdge(n,s,{}),r(s))})}return e.nodes().forEach(r),e.nodeCount()}function Ar(e,t){return t.edges().reduce((n,i)=>{let o=Number.POSITIVE_INFINITY;return e.hasNode(i.v)!==e.hasNode(i.w)&&(o=L(t,i)),o<n[0]?[o,i]:n},[Number.POSITIVE_INFINITY,null])[1]}function Yr(e,t,r){e.nodes().forEach(n=>t.node(n).rank+=r)}});var Ie=v((Ui,Ne)=>{\"use strict\";var Br=G(),ge=j().slack,Wr=j().longestPath,zr=y().alg.preorder,Xr=y().alg.postorder,Hr=_().simplify;Ne.exports=N;N.initLowLimValues=A;N.initCutValues=V;N.calcCutValue=_e;N.leaveEdge=ye;N.enterEdge=xe;N.exchangeEdges=Oe;function N(e){e=Hr(e),Wr(e);var t=Br(e);A(t),V(t,e);for(var r,n;r=ye(t);)n=xe(t,e,r),Oe(t,e,r,n)}function V(e,t){var r=Xr(e,e.nodes());r=r.slice(0,r.length-1),r.forEach(n=>Ur(e,t,n))}function Ur(e,t,r){var n=e.node(r),i=n.parent;e.edge(r,i).cutvalue=_e(e,t,r)}function _e(e,t,r){var n=e.node(r),i=n.parent,o=!0,s=t.edge(r,i),a=0;return s||(o=!1,s=t.edge(i,r)),a=s.weight,t.nodeEdges(r).forEach(l=>{var u=l.v===r,c=u?l.w:l.v;if(c!==i){var d=u===o,h=t.edge(l).weight;if(a+=d?h:-h,Qr(e,r,c)){var f=e.edge(r,c).cutvalue;a+=d?-f:f}}}),a}function A(e,t){arguments.length<2&&(t=e.nodes()[0]),ke(e,{},1,t)}function ke(e,t,r,n,i){var o=r,s=e.node(n);return t[n]=!0,e.neighbors(n).forEach(a=>{Object.hasOwn(t,a)||(r=ke(e,t,r,a,n))}),s.low=o,s.lim=r++,i?s.parent=i:delete s.parent,r}function ye(e){return e.edges().find(t=>e.edge(t).cutvalue<0)}function xe(e,t,r){var n=r.v,i=r.w;t.hasEdge(n,i)||(n=r.w,i=r.v);var o=e.node(n),s=e.node(i),a=o,l=!1;o.lim>s.lim&&(a=s,l=!0);var u=t.edges().filter(c=>l===Ee(e,e.node(c.v),a)&&l!==Ee(e,e.node(c.w),a));return u.reduce((c,d)=>ge(t,d)<ge(t,c)?d:c)}function Oe(e,t,r,n){var i=r.v,o=r.w;e.removeEdge(i,o),e.setEdge(n.v,n.w,{}),A(e),V(e,t),Kr(e,t)}function Kr(e,t){var r=e.nodes().find(i=>!t.node(i).parent),n=zr(e,r);n=n.slice(1),n.forEach(i=>{var o=e.node(i).parent,s=t.edge(i,o),a=!1;s||(s=t.edge(o,i),a=!0),t.node(i).rank=t.node(o).rank+(a?s.minlen:-s.minlen)})}function Qr(e,t,r){return e.hasEdge(t,r)}function Ee(e,t,r){return r.low<=t.lim&&t.lim<=r.lim}});var qe=v((Ki,Le)=>{\"use strict\";var Jr=j(),Ce=Jr.longestPath,Zr=G(),$r=Ie();Le.exports=en;function en(e){var t=e.graph().ranker;if(t instanceof Function)return t(e);switch(e.graph().ranker){case\"network-simplex\":je(e);break;case\"tight-tree\":rn(e);break;case\"longest-path\":tn(e);break;case\"none\":break;default:je(e)}}var tn=Ce;function rn(e){Ce(e),Zr(e)}function je(e){$r(e)}});var Re=v((Qi,Me)=>{Me.exports=nn;function nn(e){let t=sn(e);e.graph().dummyChains.forEach(r=>{let n=e.node(r),i=n.edgeObj,o=on(e,t,i.v,i.w),s=o.path,a=o.lca,l=0,u=s[l],c=!0;for(;r!==i.w;){if(n=e.node(r),c){for(;(u=s[l])!==a&&e.node(u).maxRank<n.rank;)l++;u===a&&(c=!1)}if(!c){for(;l<s.length-1&&e.node(u=s[l+1]).minRank<=n.rank;)l++;u=s[l]}e.setParent(r,u),r=e.successors(r)[0]}})}function on(e,t,r,n){let i=[],o=[],s=Math.min(t[r].low,t[n].low),a=Math.max(t[r].lim,t[n].lim),l,u;l=r;do l=e.parent(l),i.push(l);while(l&&(t[l].low>s||a>t[l].lim));for(u=l,l=n;(l=e.parent(l))!==u;)o.push(l);return{path:i.concat(o.reverse()),lca:u}}function sn(e){let t={},r=0;function n(i){let o=r;e.children(i).forEach(n),t[i]={low:o,lim:r++}}return e.children().forEach(n),t}});var Pe=v((Ji,Se)=>{var q=_();Se.exports={run:an,cleanup:un};function an(e){let t=q.addDummyNode(e,\"root\",{},\"_root\"),r=dn(e),n=Object.values(r),i=q.applyWithChunking(Math.max,n)-1,o=2*i+1;e.graph().nestingRoot=t,e.edges().forEach(a=>e.edge(a).minlen*=o);let s=ln(e)+1;e.children().forEach(a=>Te(e,t,o,s,i,r,a)),e.graph().nodeRankFactor=o}function Te(e,t,r,n,i,o,s){let a=e.children(s);if(!a.length){s!==t&&e.setEdge(t,s,{weight:0,minlen:r});return}let l=q.addBorderNode(e,\"_bt\"),u=q.addBorderNode(e,\"_bb\"),c=e.node(s);e.setParent(l,s),c.borderTop=l,e.setParent(u,s),c.borderBottom=u,a.forEach(d=>{Te(e,t,r,n,i,o,d);let h=e.node(d),f=h.borderTop?h.borderTop:d,m=h.borderBottom?h.borderBottom:d,p=h.borderTop?n:2*n,w=f!==m?1:i-o[s]+1;e.setEdge(l,f,{weight:p,minlen:w,nestingEdge:!0}),e.setEdge(m,u,{weight:p,minlen:w,nestingEdge:!0})}),e.parent(s)||e.setEdge(t,l,{weight:0,minlen:i+o[s]})}function dn(e){var t={};function r(n,i){var o=e.children(n);o&&o.length&&o.forEach(s=>r(s,i+1)),t[n]=i}return e.children().forEach(n=>r(n,1)),t}function ln(e){return e.edges().reduce((t,r)=>t+e.edge(r).weight,0)}function un(e){var t=e.graph();e.removeNode(t.nestingRoot),delete t.nestingRoot,e.edges().forEach(r=>{var n=e.edge(r);n.nestingEdge&&e.removeEdge(r)})}});var Ge=v((Zi,De)=>{var hn=_();De.exports=cn;function cn(e){function t(r){let n=e.children(r),i=e.node(r);if(n.length&&n.forEach(t),Object.hasOwn(i,\"minRank\")){i.borderLeft=[],i.borderRight=[];for(let o=i.minRank,s=i.maxRank+1;o<s;++o)Fe(e,\"borderLeft\",\"_bl\",r,i,o),Fe(e,\"borderRight\",\"_br\",r,i,o)}}e.children().forEach(t)}function Fe(e,t,r,n,i,o){let s={width:0,height:0,rank:o,borderType:t},a=i[t][o-1],l=hn.addDummyNode(e,\"border\",s,r);i[t][o]=l,e.setParent(l,n),a&&e.setEdge(a,l,{weight:1})}});var Be=v(($i,Ye)=>{\"use strict\";Ye.exports={adjust:fn,undo:pn};function fn(e){let t=e.graph().rankdir.toLowerCase();(t===\"lr\"||t===\"rl\")&&Ae(e)}function pn(e){let t=e.graph().rankdir.toLowerCase();(t===\"bt\"||t===\"rl\")&&mn(e),(t===\"lr\"||t===\"rl\")&&(wn(e),Ae(e))}function Ae(e){e.nodes().forEach(t=>Ve(e.node(t))),e.edges().forEach(t=>Ve(e.edge(t)))}function Ve(e){let t=e.width;e.width=e.height,e.height=t}function mn(e){e.nodes().forEach(t=>Y(e.node(t))),e.edges().forEach(t=>{let r=e.edge(t);r.points.forEach(Y),Object.hasOwn(r,\"y\")&&Y(r)})}function Y(e){e.y=-e.y}function wn(e){e.nodes().forEach(t=>B(e.node(t))),e.edges().forEach(t=>{let r=e.edge(t);r.points.forEach(B),Object.hasOwn(r,\"x\")&&B(r)})}function B(e){let t=e.x;e.x=e.y,e.y=t}});var Xe=v((eo,ze)=>{\"use strict\";var We=_();ze.exports=bn;function bn(e){let t={},r=e.nodes().filter(l=>!e.children(l).length),n=r.map(l=>e.node(l).rank),i=We.applyWithChunking(Math.max,n),o=We.range(i+1).map(()=>[]);function s(l){if(t[l])return;t[l]=!0;let u=e.node(l);o[u.rank].push(l),e.successors(l).forEach(s)}return r.sort((l,u)=>e.node(l).rank-e.node(u).rank).forEach(s),o}});var Ue=v((to,He)=>{\"use strict\";var vn=_().zipObject;He.exports=gn;function gn(e,t){let r=0;for(let n=1;n<t.length;++n)r+=En(e,t[n-1],t[n]);return r}function En(e,t,r){let n=vn(r,r.map((u,c)=>c)),i=t.flatMap(u=>e.outEdges(u).map(c=>({pos:n[c.w],weight:e.edge(c).weight})).sort((c,d)=>c.pos-d.pos)),o=1;for(;o<r.length;)o<<=1;let s=2*o-1;o-=1;let a=new Array(s).fill(0),l=0;return i.forEach(u=>{let c=u.pos+o;a[c]+=u.weight;let d=0;for(;c>0;)c%2&&(d+=a[c+1]),c=c-1>>1,a[c]+=u.weight;l+=u.weight*d}),l}});var Qe=v((ro,Ke)=>{Ke.exports=_n;function _n(e,t=[]){return t.map(r=>{let n=e.inEdges(r);if(n.length){let i=n.reduce((o,s)=>{let a=e.edge(s),l=e.node(s.v);return{sum:o.sum+a.weight*l.order,weight:o.weight+a.weight}},{sum:0,weight:0});return{v:r,barycenter:i.sum/i.weight,weight:i.weight}}else return{v:r}})}});var Ze=v((no,Je)=>{\"use strict\";var kn=_();Je.exports=yn;function yn(e,t){let r={};e.forEach((i,o)=>{let s=r[i.v]={indegree:0,in:[],out:[],vs:[i.v],i:o};i.barycenter!==void 0&&(s.barycenter=i.barycenter,s.weight=i.weight)}),t.edges().forEach(i=>{let o=r[i.v],s=r[i.w];o!==void 0&&s!==void 0&&(s.indegree++,o.out.push(r[i.w]))});let n=Object.values(r).filter(i=>!i.indegree);return xn(n)}function xn(e){let t=[];function r(i){return o=>{o.merged||(o.barycenter===void 0||i.barycenter===void 0||o.barycenter>=i.barycenter)&&On(i,o)}}function n(i){return o=>{o.in.push(i),--o.indegree===0&&e.push(o)}}for(;e.length;){let i=e.pop();t.push(i),i.in.reverse().forEach(r(i)),i.out.forEach(n(i))}return t.filter(i=>!i.merged).map(i=>kn.pick(i,[\"vs\",\"i\",\"barycenter\",\"weight\"]))}function On(e,t){let r=0,n=0;e.weight&&(r+=e.barycenter*e.weight,n+=e.weight),t.weight&&(r+=t.barycenter*t.weight,n+=t.weight),e.vs=t.vs.concat(e.vs),e.barycenter=r/n,e.weight=n,e.i=Math.min(t.i,e.i),t.merged=!0}});var tt=v((io,et)=>{var Nn=_();et.exports=In;function In(e,t){let r=Nn.partition(e,c=>Object.hasOwn(c,\"barycenter\")),n=r.lhs,i=r.rhs.sort((c,d)=>d.i-c.i),o=[],s=0,a=0,l=0;n.sort(jn(!!t)),l=$e(o,i,l),n.forEach(c=>{l+=c.vs.length,o.push(c.vs),s+=c.barycenter*c.weight,a+=c.weight,l=$e(o,i,l)});let u={vs:o.flat(!0)};return a&&(u.barycenter=s/a,u.weight=a),u}function $e(e,t,r){let n;for(;t.length&&(n=t[t.length-1]).i<=r;)t.pop(),e.push(n.vs),r++;return r}function jn(e){return(t,r)=>t.barycenter<r.barycenter?-1:t.barycenter>r.barycenter?1:e?r.i-t.i:t.i-r.i}});var it=v((oo,nt)=>{var Cn=Qe(),Ln=Ze(),qn=tt();nt.exports=rt;function rt(e,t,r,n){let i=e.children(t),o=e.node(t),s=o?o.borderLeft:void 0,a=o?o.borderRight:void 0,l={};s&&(i=i.filter(h=>h!==s&&h!==a));let u=Cn(e,i);u.forEach(h=>{if(e.children(h.v).length){let f=rt(e,h.v,r,n);l[h.v]=f,Object.hasOwn(f,\"barycenter\")&&Rn(h,f)}});let c=Ln(u,r);Mn(c,l);let d=qn(c,n);if(s&&(d.vs=[s,d.vs,a].flat(!0),e.predecessors(s).length)){let h=e.node(e.predecessors(s)[0]),f=e.node(e.predecessors(a)[0]);Object.hasOwn(d,\"barycenter\")||(d.barycenter=0,d.weight=0),d.barycenter=(d.barycenter*d.weight+h.order+f.order)/(d.weight+2),d.weight+=2}return d}function Mn(e,t){e.forEach(r=>{r.vs=r.vs.flatMap(n=>t[n]?t[n].vs:n)})}function Rn(e,t){e.barycenter!==void 0?(e.barycenter=(e.barycenter*e.weight+t.barycenter*t.weight)/(e.weight+t.weight),e.weight+=t.weight):(e.barycenter=t.barycenter,e.weight=t.weight)}});var st=v((so,ot)=>{var Tn=y().Graph,Sn=_();ot.exports=Pn;function Pn(e,t,r,n){n||(n=e.nodes());let i=Fn(e),o=new Tn({compound:!0}).setGraph({root:i}).setDefaultNodeLabel(s=>e.node(s));return n.forEach(s=>{let a=e.node(s),l=e.parent(s);(a.rank===t||a.minRank<=t&&t<=a.maxRank)&&(o.setNode(s),o.setParent(s,l||i),e[r](s).forEach(u=>{let c=u.v===s?u.w:u.v,d=o.edge(c,s),h=d!==void 0?d.weight:0;o.setEdge(c,s,{weight:e.edge(u).weight+h})}),Object.hasOwn(a,\"minRank\")&&o.setNode(s,{borderLeft:a.borderLeft[t],borderRight:a.borderRight[t]}))}),o}function Fn(e){for(var t;e.hasNode(t=Sn.uniqueId(\"_root\")););return t}});var dt=v((ao,at)=>{at.exports=Dn;function Dn(e,t,r){let n={},i;r.forEach(o=>{let s=e.parent(o),a,l;for(;s;){if(a=e.parent(s),a?(l=n[a],n[a]=s):(l=i,i=s),l&&l!==s){t.setEdge(l,s);return}s=a}})}});var ft=v((lo,ct)=>{\"use strict\";var Gn=Xe(),Vn=Ue(),An=it(),Yn=st(),Bn=dt(),Wn=y().Graph,M=_();ct.exports=ht;function ht(e,t={}){if(typeof t.customOrder==\"function\"){t.customOrder(e,ht);return}let r=M.maxRank(e),n=lt(e,M.range(1,r+1),\"inEdges\"),i=lt(e,M.range(r-1,-1,-1),\"outEdges\"),o=Gn(e);if(ut(e,o),t.disableOptimalOrderHeuristic)return;let s=Number.POSITIVE_INFINITY,a,l=t.constraints||[];for(let u=0,c=0;c<4;++u,++c){zn(u%2?n:i,u%4>=2,l),o=M.buildLayerMatrix(e);let d=Vn(e,o);d<s?(c=0,a=Object.assign({},o),s=d):d===s&&(a=structuredClone(o))}ut(e,a)}function lt(e,t,r){let n=new Map,i=(o,s)=>{n.has(o)||n.set(o,[]),n.get(o).push(s)};for(let o of e.nodes()){let s=e.node(o);if(typeof s.rank==\"number\"&&i(s.rank,o),typeof s.minRank==\"number\"&&typeof s.maxRank==\"number\")for(let a=s.minRank;a<=s.maxRank;a++)a!==s.rank&&i(a,o)}return t.map(function(o){return Yn(e,o,r,n.get(o)||[])})}function zn(e,t,r){let n=new Wn;e.forEach(function(i){r.forEach(a=>n.setEdge(a.left,a.right));let o=i.graph().root,s=An(i,o,n,t);s.vs.forEach((a,l)=>i.node(a).order=l),Bn(i,n,s.vs)})}function ut(e,t){Object.values(t).forEach(r=>r.forEach((n,i)=>e.node(n).order=i))}});var yt=v((uo,kt)=>{\"use strict\";var Xn=y().Graph,O=_();kt.exports={positionX:Kn,findType1Conflicts:pt,findType2Conflicts:mt,addConflict:W,hasConflict:wt,verticalAlignment:bt,horizontalCompaction:vt,alignCoordinates:Et,findSmallestWidthAlignment:gt,balance:_t};function pt(e,t){let r={};function n(i,o){let s=0,a=0,l=i.length,u=o[o.length-1];return o.forEach((c,d)=>{let h=Hn(e,c),f=h?e.node(h).order:l;(h||c===u)&&(o.slice(a,d+1).forEach(m=>{e.predecessors(m).forEach(p=>{let w=e.node(p),b=w.order;(b<s||f<b)&&!(w.dummy&&e.node(m).dummy)&&W(r,p,m)})}),a=d+1,s=f)}),o}return t.length&&t.reduce(n),r}function mt(e,t){let r={};function n(o,s,a,l,u){let c;O.range(s,a).forEach(d=>{c=o[d],e.node(c).dummy&&e.predecessors(c).forEach(h=>{let f=e.node(h);f.dummy&&(f.order<l||f.order>u)&&W(r,h,c)})})}function i(o,s){let a=-1,l,u=0;return s.forEach((c,d)=>{if(e.node(c).dummy===\"border\"){let h=e.predecessors(c);h.length&&(l=e.node(h[0]).order,n(s,u,d,a,l),u=d,a=l)}n(s,u,s.length,l,o.length)}),s}return t.length&&t.reduce(i),r}function Hn(e,t){if(e.node(t).dummy)return e.predecessors(t).find(r=>e.node(r).dummy)}function W(e,t,r){if(t>r){let i=t;t=r,r=i}let n=e[t];n||(e[t]=n={}),n[r]=!0}function wt(e,t,r){if(t>r){let n=t;t=r,r=n}return!!e[t]&&Object.hasOwn(e[t],r)}function bt(e,t,r,n){let i={},o={},s={};return t.forEach(a=>{a.forEach((l,u)=>{i[l]=l,o[l]=l,s[l]=u})}),t.forEach(a=>{let l=-1;a.forEach(u=>{let c=n(u);if(c.length){c=c.sort((h,f)=>s[h]-s[f]);let d=(c.length-1)/2;for(let h=Math.floor(d),f=Math.ceil(d);h<=f;++h){let m=c[h];o[u]===u&&l<s[m]&&!wt(r,u,m)&&(o[m]=u,o[u]=i[u]=i[m],l=s[m])}}})}),{root:i,align:o}}function vt(e,t,r,n,i){let o={},s=Un(e,t,r,i),a=i?\"borderLeft\":\"borderRight\";function l(d,h){let f=s.nodes().slice(),m={},p=f.pop();for(;p;){if(m[p])d(p);else{m[p]=!0,f.push(p);for(let w of h(p))f.push(w)}p=f.pop()}}function u(d){o[d]=s.inEdges(d).reduce((h,f)=>Math.max(h,o[f.v]+s.edge(f)),0)}function c(d){let h=s.outEdges(d).reduce((m,p)=>Math.min(m,o[p.w]-s.edge(p)),Number.POSITIVE_INFINITY),f=e.node(d);h!==Number.POSITIVE_INFINITY&&f.borderType!==a&&(o[d]=Math.max(o[d],h))}return l(u,s.predecessors.bind(s)),l(c,s.successors.bind(s)),Object.keys(n).forEach(d=>o[d]=o[r[d]]),o}function Un(e,t,r,n){let i=new Xn,o=e.graph(),s=Qn(o.nodesep,o.edgesep,n);return t.forEach(a=>{let l;a.forEach(u=>{let c=r[u];if(i.setNode(c),l){var d=r[l],h=i.edge(d,c);i.setEdge(d,c,Math.max(s(e,u,l),h||0))}l=u})}),i}function gt(e,t){return Object.values(t).reduce((r,n)=>{let i=Number.NEGATIVE_INFINITY,o=Number.POSITIVE_INFINITY;Object.entries(n).forEach(([a,l])=>{let u=Jn(e,a)/2;i=Math.max(l+u,i),o=Math.min(l-u,o)});let s=i-o;return s<r[0]&&(r=[s,n]),r},[Number.POSITIVE_INFINITY,null])[1]}function Et(e,t){let r=Object.values(t),n=O.applyWithChunking(Math.min,r),i=O.applyWithChunking(Math.max,r);[\"u\",\"d\"].forEach(o=>{[\"l\",\"r\"].forEach(s=>{let a=o+s,l=e[a];if(l===t)return;let u=Object.values(l),c=n-O.applyWithChunking(Math.min,u);s!==\"l\"&&(c=i-O.applyWithChunking(Math.max,u)),c&&(e[a]=O.mapValues(l,d=>d+c))})})}function _t(e,t){return O.mapValues(e.ul,(r,n)=>{if(t)return e[t.toLowerCase()][n];{let i=Object.values(e).map(o=>o[n]).sort((o,s)=>o-s);return(i[1]+i[2])/2}})}function Kn(e){let t=O.buildLayerMatrix(e),r=Object.assign(pt(e,t),mt(e,t)),n={},i;[\"u\",\"d\"].forEach(s=>{i=s===\"u\"?t:Object.values(t).reverse(),[\"l\",\"r\"].forEach(a=>{a===\"r\"&&(i=i.map(d=>Object.values(d).reverse()));let l=(s===\"u\"?e.predecessors:e.successors).bind(e),u=bt(e,i,r,l),c=vt(e,i,u.root,u.align,a===\"r\");a===\"r\"&&(c=O.mapValues(c,d=>-d)),n[s+a]=c})});let o=gt(e,n);return Et(n,o),_t(n,e.graph().align)}function Qn(e,t,r){return(n,i,o)=>{let s=n.node(i),a=n.node(o),l=0,u;if(l+=s.width/2,Object.hasOwn(s,\"labelpos\"))switch(s.labelpos.toLowerCase()){case\"l\":u=-s.width/2;break;case\"r\":u=s.width/2;break}if(u&&(l+=r?u:-u),u=0,l+=(s.dummy?t:e)/2,l+=(a.dummy?t:e)/2,l+=a.width/2,Object.hasOwn(a,\"labelpos\"))switch(a.labelpos.toLowerCase()){case\"l\":u=a.width/2;break;case\"r\":u=-a.width/2;break}return u&&(l+=r?u:-u),u=0,l}}function Jn(e,t){return e.node(t).width}});var Nt=v((ho,Ot)=>{\"use strict\";var xt=_(),Zn=yt().positionX;Ot.exports=$n;function $n(e){e=xt.asNonCompoundGraph(e),ei(e),Object.entries(Zn(e)).forEach(([t,r])=>e.node(t).x=r)}function ei(e){let t=xt.buildLayerMatrix(e),r=e.graph().ranksep,n=e.graph().rankalign,i=0;t.forEach(o=>{let s=o.reduce((a,l)=>{let u=e.node(l).height;return a>u?a:u},0);o.forEach(a=>{let l=e.node(a);n===\"top\"?l.y=i+l.height/2:n===\"bottom\"?l.y=i+s-l.height/2:l.y=i+s/2}),i+=s+r})}});var Rt=v((co,Mt)=>{\"use strict\";var It=pe(),jt=we(),ti=qe(),ri=_().normalizeRanks,ni=Re(),ii=_().removeEmptyRanks,Ct=Pe(),oi=Ge(),Lt=Be(),si=ft(),ai=Nt(),x=_(),di=y().Graph;Mt.exports=li;function li(e,t={}){let r=t.debugTiming?x.time:x.notime;return r(\"layout\",()=>{let n=r(\" buildLayoutGraph\",()=>gi(e));return r(\" runLayout\",()=>ui(n,r,t)),r(\" updateInputGraph\",()=>hi(e,n)),n})}function ui(e,t,r){t(\" makeSpaceForEdgeLabels\",()=>Ei(e)),t(\" removeSelfEdges\",()=>Ci(e)),t(\" acyclic\",()=>It.run(e)),t(\" nestingGraph.run\",()=>Ct.run(e)),t(\" rank\",()=>ti(x.asNonCompoundGraph(e))),t(\" injectEdgeLabelProxies\",()=>_i(e)),t(\" removeEmptyRanks\",()=>ii(e)),t(\" nestingGraph.cleanup\",()=>Ct.cleanup(e)),t(\" normalizeRanks\",()=>ri(e)),t(\" assignRankMinMax\",()=>ki(e)),t(\" removeEdgeLabelProxies\",()=>yi(e)),t(\" normalize.run\",()=>jt.run(e)),t(\" parentDummyChains\",()=>ni(e)),t(\" addBorderSegments\",()=>oi(e)),t(\" order\",()=>si(e,r)),t(\" insertSelfEdges\",()=>Li(e)),t(\" adjustCoordinateSystem\",()=>Lt.adjust(e)),t(\" position\",()=>ai(e)),t(\" positionSelfEdges\",()=>qi(e)),t(\" removeBorderNodes\",()=>ji(e)),t(\" normalize.undo\",()=>jt.undo(e)),t(\" fixupEdgeLabelCoords\",()=>Ni(e)),t(\" undoCoordinateSystem\",()=>Lt.undo(e)),t(\" translateGraph\",()=>xi(e)),t(\" assignNodeIntersects\",()=>Oi(e)),t(\" reversePoints\",()=>Ii(e)),t(\" acyclic.undo\",()=>It.undo(e))}function hi(e,t){e.nodes().forEach(r=>{let n=e.node(r),i=t.node(r);n&&(n.x=i.x,n.y=i.y,n.order=i.order,n.rank=i.rank,t.children(r).length&&(n.width=i.width,n.height=i.height))}),e.edges().forEach(r=>{let n=e.edge(r),i=t.edge(r);n.points=i.points,Object.hasOwn(i,\"x\")&&(n.x=i.x,n.y=i.y)}),e.graph().width=t.graph().width,e.graph().height=t.graph().height}var ci=[\"nodesep\",\"edgesep\",\"ranksep\",\"marginx\",\"marginy\"],fi={ranksep:50,edgesep:20,nodesep:50,rankdir:\"tb\",rankalign:\"center\"},pi=[\"acyclicer\",\"ranker\",\"rankdir\",\"align\",\"rankalign\"],mi=[\"width\",\"height\",\"rank\"],qt={width:0,height:0},wi=[\"minlen\",\"weight\",\"width\",\"height\",\"labeloffset\"],bi={minlen:1,weight:1,width:0,height:0,labeloffset:10,labelpos:\"r\"},vi=[\"labelpos\"];function gi(e){let t=new di({multigraph:!0,compound:!0}),r=X(e.graph());return t.setGraph(Object.assign({},fi,z(r,ci),x.pick(r,pi))),e.nodes().forEach(n=>{let i=X(e.node(n)),o=z(i,mi);Object.keys(qt).forEach(s=>{o[s]===void 0&&(o[s]=qt[s])}),t.setNode(n,o),t.setParent(n,e.parent(n))}),e.edges().forEach(n=>{let i=X(e.edge(n));t.setEdge(n,Object.assign({},bi,z(i,wi),x.pick(i,vi)))}),t}function Ei(e){let t=e.graph();t.ranksep/=2,e.edges().forEach(r=>{let n=e.edge(r);n.minlen*=2,n.labelpos.toLowerCase()!==\"c\"&&(t.rankdir===\"TB\"||t.rankdir===\"BT\"?n.width+=n.labeloffset:n.height+=n.labeloffset)})}function _i(e){e.edges().forEach(t=>{let r=e.edge(t);if(r.width&&r.height){let n=e.node(t.v),o={rank:(e.node(t.w).rank-n.rank)/2+n.rank,e:t};x.addDummyNode(e,\"edge-proxy\",o,\"_ep\")}})}function ki(e){let t=0;e.nodes().forEach(r=>{let n=e.node(r);n.borderTop&&(n.minRank=e.node(n.borderTop).rank,n.maxRank=e.node(n.borderBottom).rank,t=Math.max(t,n.maxRank))}),e.graph().maxRank=t}function yi(e){e.nodes().forEach(t=>{let r=e.node(t);r.dummy===\"edge-proxy\"&&(e.edge(r.e).labelRank=r.rank,e.removeNode(t))})}function xi(e){let t=Number.POSITIVE_INFINITY,r=0,n=Number.POSITIVE_INFINITY,i=0,o=e.graph(),s=o.marginx||0,a=o.marginy||0;function l(u){let c=u.x,d=u.y,h=u.width,f=u.height;t=Math.min(t,c-h/2),r=Math.max(r,c+h/2),n=Math.min(n,d-f/2),i=Math.max(i,d+f/2)}e.nodes().forEach(u=>l(e.node(u))),e.edges().forEach(u=>{let c=e.edge(u);Object.hasOwn(c,\"x\")&&l(c)}),t-=s,n-=a,e.nodes().forEach(u=>{let c=e.node(u);c.x-=t,c.y-=n}),e.edges().forEach(u=>{let c=e.edge(u);c.points.forEach(d=>{d.x-=t,d.y-=n}),Object.hasOwn(c,\"x\")&&(c.x-=t),Object.hasOwn(c,\"y\")&&(c.y-=n)}),o.width=r-t+s,o.height=i-n+a}function Oi(e){e.edges().forEach(t=>{let r=e.edge(t),n=e.node(t.v),i=e.node(t.w),o,s;r.points?(o=r.points[0],s=r.points[r.points.length-1]):(r.points=[],o=i,s=n),r.points.unshift(x.intersectRect(n,o)),r.points.push(x.intersectRect(i,s))})}function Ni(e){e.edges().forEach(t=>{let r=e.edge(t);if(Object.hasOwn(r,\"x\"))switch((r.labelpos===\"l\"||r.labelpos===\"r\")&&(r.width-=r.labeloffset),r.labelpos){case\"l\":r.x-=r.width/2+r.labeloffset;break;case\"r\":r.x+=r.width/2+r.labeloffset;break}})}function Ii(e){e.edges().forEach(t=>{let r=e.edge(t);r.reversed&&r.points.reverse()})}function ji(e){e.nodes().forEach(t=>{if(e.children(t).length){let r=e.node(t),n=e.node(r.borderTop),i=e.node(r.borderBottom),o=e.node(r.borderLeft[r.borderLeft.length-1]),s=e.node(r.borderRight[r.borderRight.length-1]);r.width=Math.abs(s.x-o.x),r.height=Math.abs(i.y-n.y),r.x=o.x+r.width/2,r.y=n.y+r.height/2}}),e.nodes().forEach(t=>{e.node(t).dummy===\"border\"&&e.removeNode(t)})}function Ci(e){e.edges().forEach(t=>{if(t.v===t.w){var r=e.node(t.v);r.selfEdges||(r.selfEdges=[]),r.selfEdges.push({e:t,label:e.edge(t)}),e.removeEdge(t)}})}function Li(e){var t=x.buildLayerMatrix(e);t.forEach(r=>{var n=0;r.forEach((i,o)=>{var s=e.node(i);s.order=o+n,(s.selfEdges||[]).forEach(a=>{x.addDummyNode(e,\"selfedge\",{width:a.label.width,height:a.label.height,rank:s.rank,order:o+ ++n,e:a.e,label:a.label},\"_se\")}),delete s.selfEdges})})}function qi(e){e.nodes().forEach(t=>{var r=e.node(t);if(r.dummy===\"selfedge\"){var n=e.node(r.e.v),i=n.x+n.width/2,o=n.y,s=r.x-i,a=n.height/2;e.setEdge(r.e,r.label),e.removeNode(t),r.label.points=[{x:i+2*s/3,y:o-a},{x:i+5*s/6,y:o-a},{x:i+s,y:o},{x:i+5*s/6,y:o+a},{x:i+2*s/3,y:o+a}],r.label.x=r.x,r.label.y=r.y}})}function z(e,t){return x.mapValues(x.pick(e,t),Number)}function X(e){var t={};return e&&Object.entries(e).forEach(([r,n])=>{typeof r==\"string\"&&(r=r.toLowerCase()),t[r]=n}),t}});var St=v((fo,Tt)=>{var Mi=_(),Ri=y().Graph;Tt.exports={debugOrdering:Ti};function Ti(e){let t=Mi.buildLayerMatrix(e),r=new Ri({compound:!0,multigraph:!0}).setGraph({});return e.nodes().forEach(n=>{r.setNode(n,{label:n}),r.setParent(n,\"layer\"+e.node(n).rank)}),e.edges().forEach(n=>r.setEdge(n.v,n.w,{},n.name)),t.forEach((n,i)=>{let o=\"layer\"+i;r.setNode(o,{rank:\"same\"}),n.reduce((s,a)=>(r.setEdge(s,a,{style:\"invis\"}),a))}),r}});var Ft=v((po,Pt)=>{Pt.exports=\"2.0.4\"});var Si=v((mo,Dt)=>{Dt.exports={graphlib:y(),layout:Rt(),debug:St(),util:{time:_().time,notime:_().notime},version:Ft()}});export default Si();\n/*! For license information please see dagre.esm.js.LEGAL.txt */\n//# sourceMappingURL=dagre.esm.js.map\n","'use client';\n\nimport { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport { useRouter } from 'next/navigation';\nimport { toast } from 'sonner';\nimport type { Connection, Edge, NodeChange } from '@xyflow/react';\nimport type { FeatureNodeData } from '@/components/common/feature-node';\nimport type { RepositoryNodeData } from '@/components/common/repository-node';\nimport type { CanvasNodeType } from '@/components/features/features-canvas';\nimport {\n layoutWithDagre,\n getCanvasLayoutDefaults,\n type LayoutDirection,\n} from '@/lib/layout-with-dagre';\nimport type { ApplicationNodeData } from '@/components/common/application-node/application-node-config';\nimport { archiveFeature } from '@/app/actions/archive-feature';\nimport { deleteFeature } from '@/app/actions/delete-feature';\nimport { resumeFeature } from '@/app/actions/resume-feature';\nimport { startFeature } from '@/app/actions/start-feature';\nimport { stopFeature } from '@/app/actions/stop-feature';\nimport { unarchiveFeature } from '@/app/actions/unarchive-feature';\nimport { addRepository } from '@/app/actions/add-repository';\nimport { deleteRepository } from '@/app/actions/delete-repository';\nimport { deleteApplication } from '@/app/actions/delete-application';\nimport { getFeatureMetadata } from '@/app/actions/get-feature-metadata';\nimport { useAgentEventsContext } from '@/hooks/agent-events-provider';\nimport { useDeploymentStatusContext } from '@/hooks/deployment-status-provider';\nimport { useSoundAction } from '@/hooks/use-sound-action';\nimport { createLogger } from '@/lib/logger';\n\nimport {\n mapEventTypeToState,\n resolveSseEventUpdates,\n} from '@/components/common/feature-node/derive-feature-state';\nimport { useGraphState, type GraphCallbacks } from '@/hooks/use-graph-state';\nimport type { FeatureEntry } from '@/lib/derive-graph';\n\nconst log = createLogger('[Polling]');\nconst POLL_INTERVAL_MS = 15_000;\n\nexport interface ControlCenterState {\n nodes: CanvasNodeType[];\n edges: Edge[];\n onNodesChange: (changes: NodeChange<CanvasNodeType>[]) => void;\n handleConnect: (connection: Connection) => void;\n handleAddRepository: (path: string) => {\n wasEmpty: boolean;\n repoPath: string;\n tempNodeId: string;\n };\n handleLayout: (direction: LayoutDirection) => void;\n handleArchiveFeature: (featureId: string) => void;\n handleDeleteFeature: (\n featureId: string,\n cleanup?: boolean,\n cascadeDelete?: boolean,\n closePr?: boolean\n ) => void;\n handleRetryFeature: (featureId: string) => void;\n handleStartFeature: (featureId: string) => void;\n handleStopFeature: (featureId: string) => void;\n handleUnarchiveFeature: (featureId: string) => void;\n handleDeleteRepository: (\n repositoryId: string,\n options?: { deleteFromDisk?: boolean }\n ) => Promise<void>;\n handleDeleteApplication: (applicationId: string) => Promise<void>;\n createFeatureNode: (\n sourceNodeId: string | null,\n dataOverride?: Partial<FeatureNodeData>,\n edgeType?: string\n ) => string;\n /** Add an application node to the canvas optimistically. */\n addApplication: (nodeId: string, data: ApplicationNodeData) => void;\n /** Whether archived features are shown on the canvas. */\n showArchived: boolean;\n /** Toggle archived feature visibility. */\n setShowArchived: (show: boolean) => void;\n /** Stable lookup: repositoryPath for a feature node. */\n getFeatureRepositoryPath: (featureNodeId: string) => string | undefined;\n /** Stable lookup: repository data by nodeId. */\n getRepositoryData: (nodeId: string) => RepositoryNodeData | undefined;\n /** Sync callbacks into derived node data (does not trigger re-render). */\n setCallbacks: (callbacks: GraphCallbacks) => void;\n}\n\n/** Must match the message string emitted by the SSE route in agent-events/route.ts */\nconst METADATA_UPDATED_MESSAGE = 'Feature metadata updated';\n\nlet nextFeatureId = 0;\nlet nextRepoTempId = 0;\n\nexport function useControlCenterState(\n initialNodes: CanvasNodeType[],\n initialEdges: Edge[]\n): ControlCenterState {\n const router = useRouter();\n const deleteSound = useSoundAction('delete');\n const createSound = useSoundAction('create');\n\n // Archive toggle: persists during session, resets on page reload (FR-10)\n const [showArchived, setShowArchived] = useState(false);\n\n const {\n nodes,\n edges,\n reconcile,\n updateFeature,\n addPendingFeature,\n removeFeature,\n restoreFeature,\n addRepository: addRepositoryToMap,\n removeRepository,\n replaceRepository,\n getFeatureRepositoryPath,\n getRepositoryData,\n getRepoMapSize,\n addApplication: addApplicationToMap,\n removeApplication,\n setCallbacks,\n beginMutation,\n endMutation,\n isMutating,\n } = useGraphState(initialNodes, initialEdges, showArchived);\n\n // Refs for stable access to latest nodes/edges without callback recreation\n const nodesRef = useRef(nodes);\n const edgesRef = useRef(edges);\n useEffect(() => {\n nodesRef.current = nodes;\n edgesRef.current = edges;\n }, [nodes, edges]);\n\n // Sync server props into domain Maps when initialNodes/initialEdges change.\n // Keyed by a stable string so we don't re-reconcile on every render.\n const initialNodeKey = useMemo(\n () =>\n initialNodes\n .map((n) => n.id)\n .sort()\n .join(','),\n [initialNodes]\n );\n const initialDataKey = useMemo(\n () =>\n initialNodes\n .filter((n) => n.type === 'featureNode')\n .map((n) => {\n const d = n.data as FeatureNodeData;\n return `${n.id}:${d.state}:${d.lifecycle}`;\n })\n .sort()\n .join(','),\n [initialNodes]\n );\n\n const prevReconcileKey = useRef('');\n\n useEffect(() => {\n const key = `${initialNodeKey}|${initialDataKey}`;\n if (key !== prevReconcileKey.current) {\n prevReconcileKey.current = key;\n reconcile(initialNodes, initialEdges);\n }\n }, [initialNodeKey, initialDataKey, initialNodes, initialEdges, reconcile]);\n\n // Track previous feature states for fallback notifications\n const prevFeatureStatesRef = useRef<Map<string, FeatureNodeData['state']>>(new Map());\n\n const { events } = useAgentEventsContext();\n const { store: deploymentStore } = useDeploymentStatusContext();\n\n useEffect(() => {\n const prevStates = prevFeatureStatesRef.current;\n for (const node of initialNodes) {\n if (node.type !== 'featureNode') continue;\n const data = node.data as FeatureNodeData;\n const prev = prevStates.get(node.id);\n if (prev !== undefined && prev !== data.state) {\n const sseAlreadyCovered = events.some(\n (e) => e.featureId === data.featureId && mapEventTypeToState(e.eventType) === data.state\n );\n if (!sseAlreadyCovered) {\n if (data.state === 'done') {\n toast.success(data.name, { description: 'Feature completed!' });\n } else if (data.state === 'action-required') {\n toast.warning(data.name, {\n description: 'Waiting for your approval',\n action: {\n label: 'Review',\n onClick: () => router.push(`/feature/${data.featureId}`),\n },\n });\n } else if (data.state === 'error') {\n toast.error(data.name, { description: data.errorMessage ?? 'Agent failed' });\n }\n }\n }\n prevStates.set(node.id, data.state);\n }\n }, [initialDataKey, initialNodes, events, router]);\n\n // SSE effect: only state + lifecycle updates\n const processedEventCountRef = useRef(0);\n\n useEffect(() => {\n // Clamp cursor if events were pruned\n if (processedEventCountRef.current > events.length) {\n processedEventCountRef.current = 0;\n }\n if (events.length <= processedEventCountRef.current) return;\n const newEvents = events.slice(processedEventCountRef.current);\n processedEventCountRef.current = events.length;\n\n for (const { featureId, state, lifecycle } of resolveSseEventUpdates(newEvents)) {\n if (state !== undefined || lifecycle !== undefined) {\n const nodeId = `feat-${featureId}`;\n const existingNode = nodesRef.current.find((n) => n.id === nodeId);\n const existingState = existingNode\n ? (existingNode.data as FeatureNodeData).state\n : undefined;\n\n // Skip SSE updates for features in 'deleting' state — the optimistic\n // delete state must not be overwritten by stale SSE events (e.g. agent\n // cancellation emitting AgentFailed during the soft-delete window).\n if (existingState === 'deleting') continue;\n\n // Skip SSE error events during mutation cooldown — after approve/reject\n // the agent may still report AgentFailed from the previous run before\n // the resume kicks in. The optimistic 'running' state must not be\n // overwritten by stale error events during this transition window.\n if (state === 'error' && isMutating() && existingState === 'running') continue;\n\n updateFeature(nodeId, {\n ...(state !== undefined && { state }),\n ...(lifecycle !== undefined && { lifecycle }),\n });\n }\n }\n }, [events, updateFeature, isMutating]);\n\n // Listen for optimistic approval/rejection events from the drawer (fires before SSE arrives).\n // Uses beginMutation + endMutation to prevent stale poll/reconcile data from overwriting\n // the optimistic 'running' state during the transition window (avoids brief \"Something went wrong\" flash).\n useEffect(() => {\n const handler = (e: Event) => {\n const { featureId } = (e as CustomEvent<{ featureId: string }>).detail;\n beginMutation();\n updateFeature(`feat-${featureId}`, { state: 'running' });\n endMutation();\n };\n window.addEventListener('shep:feature-approved', handler);\n return () => window.removeEventListener('shep:feature-approved', handler);\n }, [updateFeature, beginMutation, endMutation]);\n\n // Separate effect: fetch metadata (name + description) when SSE reports it changed\n const metadataFetchedRef = useRef<Set<string>>(new Set());\n const processedMetadataCountRef = useRef(0);\n\n useEffect(() => {\n // Clamp cursor if events were pruned\n if (processedMetadataCountRef.current > events.length) {\n processedMetadataCountRef.current = 0;\n }\n if (events.length <= processedMetadataCountRef.current) return;\n const newEvents = events.slice(processedMetadataCountRef.current);\n processedMetadataCountRef.current = events.length;\n\n for (const event of newEvents) {\n if (event.message !== METADATA_UPDATED_MESSAGE) continue;\n if (metadataFetchedRef.current.has(event.featureId)) continue;\n metadataFetchedRef.current.add(event.featureId);\n\n const nodeId = `feat-${event.featureId}`;\n getFeatureMetadata(event.featureId)\n .then((meta) => {\n if (meta) {\n updateFeature(nodeId, { name: meta.name, description: meta.description });\n }\n })\n .catch(() => {\n // Silent: metadata fetch failure is non-critical\n });\n }\n }, [events, updateFeature]);\n\n // --- Polling fallback: catch any SSE events that were missed ---\n useEffect(() => {\n log.debug(`polling enabled (${POLL_INTERVAL_MS}ms interval)`);\n\n const timer = setInterval(async () => {\n // Skip when tab is hidden — no point polling for a user who isn't looking.\n if (document.hidden) return;\n // Skip fetch entirely while a mutation is in-flight — the response\n // would contain pre-mutation data that reconcile would discard anyway.\n if (isMutating()) return;\n\n try {\n // Use a plain fetch instead of a server action so the poll\n // doesn't trigger the Next.js \"Rendering…\" indicator.\n const res = await fetch('/api/graph-data');\n if (!res.ok) throw new Error(`status ${res.status}`);\n const {\n nodes: freshNodes,\n edges: freshEdges,\n deployments: freshDeployments,\n } = await res.json();\n reconcile(freshNodes, freshEdges);\n if (Array.isArray(freshDeployments)) {\n deploymentStore.hydrate(freshDeployments);\n }\n } catch {\n log.warn('poll fetch failed — will retry next interval');\n }\n }, POLL_INTERVAL_MS);\n\n return () => {\n log.debug('polling disabled');\n clearInterval(timer);\n };\n }, [reconcile, isMutating, deploymentStore]);\n\n // onNodesChange is a no-op: nodes are derived from domain Maps.\n // Since nodesDraggable=false and elementsSelectable=false, only React Flow's\n // internal replace/dimensions changes come through — we ignore them all.\n const onNodesChange = useCallback((_changes: NodeChange<CanvasNodeType>[]) => {\n // Intentional no-op: domain Maps are the source of truth.\n }, []);\n\n const handleConnect = useCallback((_connection: Connection) => {\n // Connections are managed via domain operations, not direct edge manipulation.\n }, []);\n\n const createFeatureNode = useCallback(\n (\n sourceNodeId: string | null,\n dataOverride?: Partial<FeatureNodeData>,\n edgeType?: string\n ): string => {\n // Use real feature ID when available (from server), otherwise temp ID\n const id = dataOverride?.featureId\n ? `feat-${dataOverride.featureId}`\n : `feature-${Date.now()}-${nextFeatureId++}`;\n const newFeatureData: FeatureNodeData = {\n name: dataOverride?.name ?? 'New Feature',\n description: dataOverride?.description ?? 'Describe what this feature does',\n featureId: dataOverride?.featureId ?? `#${id.slice(-4)}`,\n lifecycle: 'requirements',\n state: dataOverride?.state ?? 'running',\n progress: 0,\n repositoryPath: dataOverride?.repositoryPath ?? '',\n branch: dataOverride?.branch ?? '',\n };\n\n const parentNodeId = edgeType === 'dependencyEdge' && sourceNodeId ? sourceNodeId : undefined;\n\n addPendingFeature(id, newFeatureData, parentNodeId);\n\n return id;\n },\n [addPendingFeature]\n );\n\n const handleRetryFeature = useCallback(\n (featureId: string) => {\n const nodeId = `feat-${featureId}`;\n // Optimistic: switch to running state\n beginMutation();\n updateFeature(nodeId, { state: 'running' });\n\n resumeFeature(featureId)\n .then((result) => {\n if (result.error) {\n updateFeature(nodeId, { state: 'error' });\n toast.error(result.error);\n } else {\n toast.success('Feature resumed');\n }\n })\n .catch(() => {\n updateFeature(nodeId, { state: 'error' });\n toast.error('Failed to resume feature');\n })\n .finally(() => endMutation());\n },\n [updateFeature, beginMutation, endMutation]\n );\n\n const handleStartFeature = useCallback(\n (featureId: string) => {\n const nodeId = `feat-${featureId}`;\n // Optimistic: switch to running state\n beginMutation();\n updateFeature(nodeId, { state: 'running' });\n\n startFeature(featureId)\n .then((result) => {\n if (result.error) {\n updateFeature(nodeId, { state: 'pending' });\n toast.error(result.error);\n } else {\n toast.success('Feature started');\n }\n })\n .catch(() => {\n updateFeature(nodeId, { state: 'pending' });\n toast.error('Failed to start feature');\n })\n .finally(() => endMutation());\n },\n [updateFeature, beginMutation, endMutation]\n );\n\n const handleStopFeature = useCallback(\n (featureId: string) => {\n beginMutation();\n\n stopFeature(featureId)\n .then((result) => {\n if (result.error) {\n toast.error(result.error);\n } else {\n toast.success('Agent stopped');\n }\n })\n .catch(() => {\n toast.error('Failed to stop agent');\n })\n .finally(() => endMutation());\n },\n [beginMutation, endMutation]\n );\n\n const handleArchiveFeature = useCallback(\n (featureId: string) => {\n const nodeId = `feat-${featureId}`;\n beginMutation();\n updateFeature(nodeId, { state: 'archived' });\n\n archiveFeature(featureId)\n .then((result) => {\n if (result.error) {\n updateFeature(nodeId, { state: 'done' });\n toast.error(result.error);\n } else {\n toast.success('Feature archived');\n }\n })\n .catch(() => {\n updateFeature(nodeId, { state: 'done' });\n toast.error('Failed to archive feature');\n })\n .finally(() => endMutation());\n },\n [updateFeature, beginMutation, endMutation]\n );\n\n const handleUnarchiveFeature = useCallback(\n (featureId: string) => {\n const nodeId = `feat-${featureId}`;\n beginMutation();\n updateFeature(nodeId, { state: 'done' });\n\n unarchiveFeature(featureId)\n .then((result) => {\n if (result.error) {\n updateFeature(nodeId, { state: 'archived' });\n toast.error(result.error);\n } else {\n toast.success('Feature unarchived');\n }\n })\n .catch(() => {\n updateFeature(nodeId, { state: 'archived' });\n toast.error('Failed to unarchive feature');\n })\n .finally(() => endMutation());\n },\n [updateFeature, beginMutation, endMutation]\n );\n\n const handleDeleteFeature = useCallback(\n (featureId: string, cleanup?: boolean, cascadeDelete?: boolean, closePr?: boolean) => {\n const nodeId = `feat-${featureId}`;\n const shouldCascade = cascadeDelete === true;\n\n // Collect all descendant feature node IDs (children, grandchildren, etc.)\n const descendants: string[] = [];\n if (shouldCascade) {\n const queue = [nodeId];\n while (queue.length > 0) {\n const current = queue.shift()!;\n for (const edge of edgesRef.current) {\n if (edge.type === 'dependencyEdge' && edge.source === current) {\n descendants.push(edge.target);\n queue.push(edge.target);\n }\n }\n }\n }\n\n // Snapshot current states for rollback (parent + descendants)\n const prevStates = new Map<string, FeatureNodeData['state']>();\n for (const nid of [nodeId, ...descendants]) {\n const node = nodesRef.current.find((n) => n.id === nid);\n if (node) {\n prevStates.set(nid, (node.data as FeatureNodeData).state);\n }\n }\n\n // Optimistic: show \"deleting\" state on parent (and descendants if cascading)\n beginMutation();\n updateFeature(nodeId, { state: 'deleting' });\n for (const childId of descendants) {\n updateFeature(childId, { state: 'deleting' });\n }\n deleteSound.play();\n router.push('/');\n\n deleteFeature(featureId, cleanup, cascadeDelete, closePr)\n .then((result) => {\n if (result.error) {\n // Rollback all to previous states\n for (const [nid, prevState] of prevStates) {\n if (prevState) updateFeature(nid, { state: prevState });\n }\n toast.error(result.error);\n } else {\n // Delete succeeded — remove features from the canvas. The polling\n // reconcile would eventually clean them up, but we remove them\n // explicitly so the user sees them disappear promptly.\n removeFeature(nodeId);\n for (const childId of descendants) {\n removeFeature(childId);\n }\n }\n })\n .catch(() => {\n for (const [nid, prevState] of prevStates) {\n if (prevState) updateFeature(nid, { state: prevState });\n }\n toast.error('Failed to delete feature');\n })\n .finally(() => endMutation());\n },\n [router, deleteSound, updateFeature, removeFeature, beginMutation, endMutation]\n );\n\n const handleDeleteRepository = useCallback(\n async (repositoryId: string, options?: { deleteFromDisk?: boolean }) => {\n const repoNodeId = `repo-${repositoryId}`;\n\n // Find children of this repo via edges\n const childFeatureIds = new Set(\n edgesRef.current.filter((e) => e.source === repoNodeId).map((e) => e.target)\n );\n\n // Snapshot for rollback\n const prevRepoData = getRepositoryData(repoNodeId);\n const childSnapshots = new Map<string, FeatureEntry>();\n for (const childId of childFeatureIds) {\n const childNode = nodesRef.current.find((n) => n.id === childId);\n if (childNode) {\n childSnapshots.set(childId, { nodeId: childId, data: childNode.data as FeatureNodeData });\n }\n }\n\n const rollback = () => {\n if (prevRepoData) addRepositoryToMap(repoNodeId, prevRepoData);\n for (const [childId, entry] of childSnapshots) {\n restoreFeature(childId, entry);\n }\n };\n\n // Optimistic: remove repo + children\n beginMutation();\n removeRepository(repoNodeId);\n for (const childId of childFeatureIds) {\n removeFeature(childId);\n }\n\n try {\n const result = await deleteRepository(repositoryId, {\n deleteFromDisk: options?.deleteFromDisk === true,\n });\n if (!result.success) {\n toast.error(result.error ?? 'Failed to remove repository');\n rollback();\n return;\n }\n deleteSound.play();\n } catch {\n toast.error('Failed to remove repository');\n rollback();\n } finally {\n endMutation();\n }\n },\n [\n deleteSound,\n removeRepository,\n removeFeature,\n addRepositoryToMap,\n restoreFeature,\n getRepositoryData,\n beginMutation,\n endMutation,\n ]\n );\n\n const handleDeleteApplication = useCallback(\n async (applicationId: string) => {\n const appNodeId = `app-${applicationId}`;\n\n // Optimistic: remove application node\n beginMutation();\n removeApplication(appNodeId);\n deleteSound.play();\n\n try {\n const result = await deleteApplication(applicationId);\n if (result.error) {\n toast.error(result.error);\n // Rollback would require storing the previous data; for now we let\n // the next polling reconcile restore it if the delete actually failed.\n }\n } catch {\n toast.error('Failed to delete application');\n } finally {\n endMutation();\n }\n },\n [deleteSound, removeApplication, beginMutation, endMutation]\n );\n\n const handleLayout = useCallback(\n (direction: LayoutDirection) => {\n // Layout is applied via reconcile on next server prop update.\n // For immediate re-layout, we apply dagre and trigger a reconcile-like update.\n const result = layoutWithDagre(nodesRef.current, edgesRef.current, {\n ...getCanvasLayoutDefaults(),\n direction,\n });\n reconcile(result.nodes, result.edges);\n },\n [reconcile]\n );\n\n const handleAddRepository = useCallback(\n (path: string): { wasEmpty: boolean; repoPath: string; tempNodeId: string } => {\n const wasEmpty = getRepoMapSize() === 0;\n const tempId = `repo-temp-${++nextRepoTempId}`;\n const repoName =\n path\n .replace(/[\\\\/]+$/, '')\n .split(/[\\\\/]/)\n .pop() ?? path;\n\n beginMutation();\n addRepositoryToMap(tempId, {\n name: repoName,\n repositoryPath: path,\n id: tempId,\n createdAt: Date.now(),\n gitInfoStatus: 'loading',\n });\n\n addRepository({ path, name: repoName })\n .then((result) => {\n if (result.error) {\n removeRepository(tempId);\n toast.error(result.error);\n return;\n }\n const repo = result.repository!;\n const realId = `repo-${repo.id}`;\n replaceRepository(tempId, realId, {\n name: repo.name,\n repositoryPath: repo.path,\n id: repo.id,\n createdAt:\n repo.createdAt instanceof Date ? repo.createdAt.getTime() : Number(repo.createdAt),\n });\n createSound.play();\n })\n .catch(() => {\n removeRepository(tempId);\n toast.error('Failed to add repository');\n })\n .finally(() => endMutation());\n\n return { wasEmpty, repoPath: path, tempNodeId: tempId };\n },\n [\n addRepositoryToMap,\n removeRepository,\n replaceRepository,\n createSound,\n getRepoMapSize,\n beginMutation,\n endMutation,\n ]\n );\n\n return {\n nodes,\n edges,\n onNodesChange,\n handleConnect,\n handleAddRepository,\n handleArchiveFeature,\n handleLayout,\n handleDeleteFeature,\n handleRetryFeature,\n handleStartFeature,\n handleStopFeature,\n handleUnarchiveFeature,\n handleDeleteRepository,\n handleDeleteApplication,\n createFeatureNode,\n addApplication: addApplicationToMap,\n showArchived,\n setShowArchived,\n getFeatureRepositoryPath,\n getRepositoryData,\n setCallbacks,\n };\n}\n","/* __next_internal_action_entry_do_not_use__ [{\"406260b7003b9bf0cb14ef656aafd980487280c22c\":\"archiveFeature\"},\"src/presentation/web/app/actions/archive-feature.ts\",\"\"] */\"use turbopack no side effects\";import{createServerReference,callServer,findSourceMapURL}from\"private-next-rsc-action-client-wrapper\";const $$RSC_SERVER_ACTION_0=/*#__PURE__*/createServerReference(\"406260b7003b9bf0cb14ef656aafd980487280c22c\",callServer,void 0,findSourceMapURL,\"archiveFeature\");export{$$RSC_SERVER_ACTION_0 as archiveFeature};","/* __next_internal_action_entry_do_not_use__ [{\"7812c1aa0763b4d79f2e787daf598094ad499c8a1a\":\"deleteFeature\"},\"src/presentation/web/app/actions/delete-feature.ts\",\"\"] */\"use turbopack no side effects\";import{createServerReference,callServer,findSourceMapURL}from\"private-next-rsc-action-client-wrapper\";const $$RSC_SERVER_ACTION_0=/*#__PURE__*/createServerReference(\"7812c1aa0763b4d79f2e787daf598094ad499c8a1a\",callServer,void 0,findSourceMapURL,\"deleteFeature\");export{$$RSC_SERVER_ACTION_0 as deleteFeature};","/* __next_internal_action_entry_do_not_use__ [{\"40023dc327570cea6ff2a1177e996854851a51c089\":\"unarchiveFeature\"},\"src/presentation/web/app/actions/unarchive-feature.ts\",\"\"] */\"use turbopack no side effects\";import{createServerReference,callServer,findSourceMapURL}from\"private-next-rsc-action-client-wrapper\";const $$RSC_SERVER_ACTION_0=/*#__PURE__*/createServerReference(\"40023dc327570cea6ff2a1177e996854851a51c089\",callServer,void 0,findSourceMapURL,\"unarchiveFeature\");export{$$RSC_SERVER_ACTION_0 as unarchiveFeature};","/* __next_internal_action_entry_do_not_use__ [{\"6036bd2e834ebd0c4acfa043c83e1a1f595d949be9\":\"deleteRepository\"},\"src/presentation/web/app/actions/delete-repository.ts\",\"\"] */\"use turbopack no side effects\";import{createServerReference,callServer,findSourceMapURL}from\"private-next-rsc-action-client-wrapper\";const $$RSC_SERVER_ACTION_0=/*#__PURE__*/createServerReference(\"6036bd2e834ebd0c4acfa043c83e1a1f595d949be9\",callServer,void 0,findSourceMapURL,\"deleteRepository\");export{$$RSC_SERVER_ACTION_0 as deleteRepository};","/* __next_internal_action_entry_do_not_use__ [{\"40ee07562b07beaa415ee4ea443c25c60934686a33\":\"deleteApplication\"},\"src/presentation/web/app/actions/delete-application.ts\",\"\"] */\"use turbopack no side effects\";import{createServerReference,callServer,findSourceMapURL}from\"private-next-rsc-action-client-wrapper\";const $$RSC_SERVER_ACTION_0=/*#__PURE__*/createServerReference(\"40ee07562b07beaa415ee4ea443c25c60934686a33\",callServer,void 0,findSourceMapURL,\"deleteApplication\");export{$$RSC_SERVER_ACTION_0 as deleteApplication};","/* __next_internal_action_entry_do_not_use__ [{\"40af4871c7609c265aa4f2438b045c7abe38fe6e69\":\"getFeatureMetadata\"},\"src/presentation/web/app/actions/get-feature-metadata.ts\",\"\"] */\"use turbopack no side effects\";import{createServerReference,callServer,findSourceMapURL}from\"private-next-rsc-action-client-wrapper\";const $$RSC_SERVER_ACTION_0=/*#__PURE__*/createServerReference(\"40af4871c7609c265aa4f2438b045c7abe38fe6e69\",callServer,void 0,findSourceMapURL,\"getFeatureMetadata\");export{$$RSC_SERVER_ACTION_0 as getFeatureMetadata};","import dagre from '@dagrejs/dagre';\nimport type { Edge, Node } from '@xyflow/react';\n\nexport type LayoutDirection = 'TB' | 'LR' | 'BT' | 'RL';\n\nexport interface LayoutOptions {\n /** Graph direction: top-bottom, left-right, etc. Default \"TB\" */\n direction?: LayoutDirection;\n /** Default node size when per-node size is unavailable */\n nodeSize?: { width: number; height: number };\n /** Vertical separation between ranks (default 80) */\n ranksep?: number;\n /** Horizontal separation between nodes in the same rank (default 30) */\n nodesep?: number;\n}\n\n/**\n * Canonical layout defaults for the control-center canvas.\n *\n * `nodesep` is the gap between nodes in the SAME rank (vertical\n * gap in the LR layout we use). Bumped from 30 → 48 so the taller\n * application cards (~300px) get obvious breathing room when\n * stacked — 30px looked cramped enough that cards felt touching.\n */\nexport const CANVAS_LAYOUT_DEFAULTS: LayoutOptions = {\n direction: 'LR',\n ranksep: 200,\n nodesep: 48,\n};\n\n/** Returns canvas layout defaults with direction adjusted for text direction. */\nexport function getCanvasLayoutDefaults(dir: 'ltr' | 'rtl' = 'ltr'): LayoutOptions {\n return { ...CANVAS_LAYOUT_DEFAULTS, direction: dir === 'rtl' ? 'RL' : 'LR' };\n}\n\n/**\n * Known node-type dimensions for the canvas node types.\n *\n * `applicationNode` dimensions MUST track the real rendered card\n * height — dagre uses them to compute rank/node spacing, and if\n * they're understated the cards overlap on screen. Current card:\n * - header py-4 (16+16) + 32px content ≈ 64px\n * - preview py-4 top + 180px slot + pb-4 bottom ≈ 196px\n * - footer pb-4 + 16px text ≈ 32px\n * - border 2px\n * ─────────────────────────────────────────────────────────────\n * Total ≈ 294px\n *\n * Rounded up to 300 with a bit of headroom for shadow and selected\n * border animation. Bump this alongside PREVIEW_HEIGHT_PX in\n * `application-node.tsx` whenever the card changes size.\n */\nconst NODE_DIMENSIONS: Record<string, { width: number; height: number }> = {\n featureNode: { width: 388, height: 140 },\n repositoryNode: { width: 400, height: 140 },\n applicationNode: { width: 416, height: 300 },\n};\n\nfunction getNodeSize(\n node: Node,\n defaultSize: { width: number; height: number }\n): { width: number; height: number } {\n // Prefer per-node size from data, then type-based lookup, then default\n const data = node.data as Record<string, unknown> | undefined;\n if (data && typeof data.width === 'number' && typeof data.height === 'number') {\n return { width: data.width, height: data.height };\n }\n return NODE_DIMENSIONS[node.type ?? ''] ?? defaultSize;\n}\n\nfunction getHandlePositions(direction: LayoutDirection) {\n switch (direction) {\n case 'LR':\n return { targetPosition: 'left' as const, sourcePosition: 'right' as const };\n case 'RL':\n return { targetPosition: 'right' as const, sourcePosition: 'left' as const };\n case 'BT':\n return { targetPosition: 'bottom' as const, sourcePosition: 'top' as const };\n case 'TB':\n default:\n return { targetPosition: 'top' as const, sourcePosition: 'bottom' as const };\n }\n}\n\n/**\n * Compute an automatic hierarchical layout for React Flow nodes and edges\n * using Dagre. Returns new node/edge arrays — never mutates the originals.\n *\n * Disconnected nodes (no edges) are interleaved with connected root trees\n * in their original input order, preserving the caller's sort (e.g. createdAt).\n */\nexport function layoutWithDagre<N extends Node>(\n nodes: N[],\n edges: Edge[],\n opts: LayoutOptions = {}\n): { nodes: N[]; edges: Edge[] } {\n const {\n direction = 'TB',\n nodeSize = { width: 172, height: 36 },\n ranksep = 80,\n nodesep = 30,\n } = opts;\n\n if (nodes.length === 0) {\n return { nodes: [], edges: [] };\n }\n\n const g = new dagre.graphlib.Graph({ multigraph: true });\n g.setDefaultEdgeLabel(() => ({}));\n g.setGraph({ rankdir: direction, ranksep, nodesep });\n\n // Separate connected from disconnected nodes\n const connectedIds = new Set<string>();\n for (const edge of edges) {\n connectedIds.add(edge.source);\n connectedIds.add(edge.target);\n }\n\n const graphNodes = nodes.filter((n) => connectedIds.has(n.id));\n const disconnectedNodes = nodes.filter((n) => !connectedIds.has(n.id));\n\n // Add nodes to the dagre graph\n for (const node of graphNodes) {\n const size = getNodeSize(node, nodeSize);\n g.setNode(node.id, { width: size.width, height: size.height });\n }\n\n // Add edges — use edge.id as key to support multigraph (duplicate source→target)\n for (const edge of edges) {\n if (!g.hasNode(edge.source) || !g.hasNode(edge.target)) continue;\n g.setEdge(edge.source, edge.target, {}, edge.id);\n }\n\n dagre.layout(g);\n\n const { targetPosition, sourcePosition } = getHandlePositions(direction);\n const isHorizontal = direction === 'LR' || direction === 'RL';\n\n // Collect dagre center positions keyed by node id\n const centerMap = new Map<string, { cx: number; cy: number; w: number; h: number }>();\n for (const node of graphNodes) {\n const dagreNode = g.node(node.id);\n const size = getNodeSize(node, nodeSize);\n centerMap.set(node.id, { cx: dagreNode.x, cy: dagreNode.y, w: size.width, h: size.height });\n }\n\n // Add disconnected nodes to centerMap so they participate in root positioning.\n // Use the same primary-axis position as connected roots (rank 0) so they align\n // visually with repos that have features attached.\n let rootPrimaryAxis = 0;\n for (const c of centerMap.values()) {\n rootPrimaryAxis = isHorizontal ? c.cx : c.cy;\n break; // Use the first connected node's primary position\n }\n for (const node of disconnectedNodes) {\n const size = getNodeSize(node, nodeSize);\n centerMap.set(node.id, {\n cx: isHorizontal ? rootPrimaryAxis : 0,\n cy: isHorizontal ? 0 : rootPrimaryAxis,\n w: size.width,\n h: size.height,\n });\n }\n\n // ── Proper tree layout for the secondary axis ──\n // Dagre gives us correct primary-axis (rank/X) positions but its secondary-\n // axis (Y) positioning doesn't respect our tree structure well. Replace it\n // with a bottom-up tree layout:\n // 1. Compute subtree heights (leaves → roots)\n // 2. Position children centered on parent (roots → leaves)\n // This guarantees: no overlaps, parents centered on children, and straight\n // lines for 1-to-1 connections at every depth.\n\n // Build parent→children map from edges\n const childrenOf = new Map<string, string[]>();\n for (const edge of edges) {\n if (!centerMap.has(edge.source) || !centerMap.has(edge.target)) continue;\n if (!childrenOf.has(edge.source)) childrenOf.set(edge.source, []);\n childrenOf.get(edge.source)!.push(edge.target);\n }\n\n // Sort children by input order (preserves caller's ordering, e.g. createdAt)\n const inputIndex = new Map<string, number>();\n for (let i = 0; i < nodes.length; i++) {\n inputIndex.set(nodes[i].id, i);\n }\n for (const [, kids] of childrenOf) {\n kids.sort((a, b) => (inputIndex.get(a) ?? 0) - (inputIndex.get(b) ?? 0));\n }\n\n // Find tree roots: connected nodes that are not children of another node\n const childSet = new Set<string>();\n for (const ids of childrenOf.values()) {\n for (const id of ids) childSet.add(id);\n }\n const connectedRoots = [...connectedIds].filter((id) => centerMap.has(id) && !childSet.has(id));\n // Merge connected roots and disconnected nodes, sorted by input order\n // so repos maintain their original creation-time ordering regardless of\n // whether they have features attached.\n const allRoots = [...connectedRoots, ...disconnectedNodes.map((n) => n.id)];\n allRoots.sort((a, b) => (inputIndex.get(a) ?? 0) - (inputIndex.get(b) ?? 0));\n\n // Bottom-up: compute the total secondary-axis span each subtree needs\n const subtreeSpan = new Map<string, number>();\n function computeSpan(nodeId: string): number {\n if (subtreeSpan.has(nodeId)) return subtreeSpan.get(nodeId)!;\n const c = centerMap.get(nodeId)!;\n const nodeSpan = isHorizontal ? c.h : c.w;\n const kids = childrenOf.get(nodeId);\n if (!kids || kids.length === 0) {\n subtreeSpan.set(nodeId, nodeSpan);\n return nodeSpan;\n }\n let childrenTotalSpan = 0;\n for (const kid of kids) {\n childrenTotalSpan += computeSpan(kid);\n }\n childrenTotalSpan += (kids.length - 1) * nodesep;\n const span = Math.max(nodeSpan, childrenTotalSpan);\n subtreeSpan.set(nodeId, span);\n return span;\n }\n\n for (const root of allRoots) computeSpan(root);\n\n // Top-down: position each node on the secondary axis, centering parent\n // on its children block. For 1-to-1 edges the child gets the same\n // secondary-axis value as its parent (straight line).\n function positionTree(nodeId: string, centerPos: number): void {\n const c = centerMap.get(nodeId)!;\n if (isHorizontal) {\n c.cy = centerPos;\n } else {\n c.cx = centerPos;\n }\n const kids = childrenOf.get(nodeId);\n if (!kids || kids.length === 0) return;\n\n // Total span occupied by children\n let childrenTotalSpan = 0;\n for (const kid of kids) {\n childrenTotalSpan += subtreeSpan.get(kid) ?? 0;\n }\n childrenTotalSpan += (kids.length - 1) * nodesep;\n\n // Start from the top of the centered children block\n let cursor = centerPos - childrenTotalSpan / 2;\n for (const kid of kids) {\n const kidSpan = subtreeSpan.get(kid) ?? 0;\n positionTree(kid, cursor + kidSpan / 2);\n cursor += kidSpan + nodesep;\n }\n }\n\n // Position all root trees (connected and disconnected) in input order.\n let rootCursor = 0;\n for (const root of allRoots) {\n const span = subtreeSpan.get(root) ?? 0;\n positionTree(root, rootCursor + span / 2);\n rootCursor += span + nodesep;\n }\n\n // Build result array converting center-coords to React Flow top-left\n const result: N[] = [];\n for (const node of nodes) {\n const c = centerMap.get(node.id);\n if (!c) continue;\n result.push({\n ...node,\n targetPosition,\n sourcePosition,\n position: { x: c.cx - c.w / 2, y: c.cy - c.h / 2 },\n } as N);\n }\n\n return { nodes: result, edges: [...edges] };\n}\n","/**\n * derive-graph.ts\n *\n * Pure client-side derivation: domain Maps → React Flow nodes + edges.\n * All edges are derived from domain relationships (repositoryPath matching,\n * parentNodeId) — never stored independently.\n */\n\nimport type { Edge } from '@xyflow/react';\nimport type { CanvasNodeType } from '@/components/features/features-canvas';\nimport type { FeatureNodeData } from '@/components/common/feature-node';\nimport type { RepositoryNodeData } from '@/components/common/repository-node';\nimport type { ApplicationNodeData } from '@/components/common/application-node/application-node-config';\n/** A feature node entry stored in the domain Map. */\nexport interface FeatureEntry {\n nodeId: string;\n data: FeatureNodeData;\n /** If set, this feature connects to a parent feature via a dependency edge (no repo→feature edge). */\n parentNodeId?: string;\n}\n\n/** A repository node entry stored in the domain Map. */\nexport interface RepoEntry {\n nodeId: string;\n data: RepositoryNodeData;\n}\n\n/** An application node entry stored in the domain Map. */\nexport interface ApplicationEntry {\n nodeId: string;\n data: ApplicationNodeData;\n}\n\n/** Stable callbacks passed by the consumer, injected into derived node data. */\nexport interface GraphCallbacks {\n /** Called when the user triggers an action on a feature node (e.g., adds a sub-feature). */\n onNodeAction?: (nodeId: string) => void;\n /** Called when the user opens settings/details on a feature node. */\n onNodeSettings?: (nodeId: string) => void;\n /** Called when the user deletes a feature. */\n onFeatureDelete?: (\n featureId: string,\n cleanup?: boolean,\n cascadeDelete?: boolean,\n closePr?: boolean\n ) => void;\n /** Called when the user clicks the \"+\" add-feature button on a repo node. */\n onRepositoryAdd?: (repoNodeId: string) => void;\n /** Called when the user clicks a repo node to navigate to its detail page. */\n onRepositoryClick?: (repoNodeId: string) => void;\n /** Called when the user deletes a repository. */\n onRepositoryDelete?: (repositoryId: string, options?: { deleteFromDisk?: boolean }) => void;\n /** Called when the user retries a failed feature. */\n onRetryFeature?: (featureId: string) => void;\n /** Called when the user starts a pending feature. */\n onStartFeature?: (featureId: string) => void;\n /** Called when the user stops a running feature. */\n onStopFeature?: (featureId: string) => void;\n /** Called when the user archives a feature. */\n onArchiveFeature?: (featureId: string) => void;\n /** Called when the user unarchives a feature. */\n onUnarchiveFeature?: (featureId: string) => void;\n /** Called when the user clicks an application node to navigate to its detail page. */\n onApplicationClick?: (applicationId: string) => void;\n /** Called when the user deletes an application. */\n onApplicationDelete?: (applicationId: string) => void;\n}\n\n/**\n * Derives React Flow nodes and edges from domain Maps.\n *\n * - Feature nodes without a parentNodeId → repo→feature edge (matched by repositoryPath)\n * - Feature nodes without a parentNodeId but with no matching repo → virtual repo node\n * - Feature nodes with a parentNodeId → dependency edge (parentNodeId→nodeId)\n * - Pending feature nodes (creating state) from pendingMap → same rules, no action callbacks\n * - Callbacks are injected into node data via closures\n */\nexport function deriveGraph(\n featureMap: Map<string, FeatureEntry>,\n repoMap: Map<string, RepoEntry>,\n pendingMap: Map<string, FeatureEntry>,\n callbacks?: GraphCallbacks,\n applicationMap?: Map<string, ApplicationEntry>\n): { nodes: CanvasNodeType[]; edges: Edge[] } {\n const nodes: CanvasNodeType[] = [];\n const edges: Edge[] = [];\n\n // Normalize path separators so Windows backslash paths match forward-slash paths\n const normalizePath = (p: string) => p.replace(/\\\\/g, '/');\n\n // Build a lookup: repositoryPath → repoNodeId\n const repoByPath = new Map<string, string>();\n for (const [nodeId, entry] of repoMap) {\n if (entry.data.repositoryPath) {\n repoByPath.set(normalizePath(entry.data.repositoryPath), nodeId);\n }\n }\n\n // Virtual repo nodes created for orphaned features (not in repoMap)\n const virtualRepos = new Map<string, string>(); // path → virtualNodeId\n\n function getOrCreateVirtualRepo(repositoryPath: string): string {\n if (virtualRepos.has(repositoryPath)) {\n return virtualRepos.get(repositoryPath)!;\n }\n const virtualId = `virtual-repo-${repositoryPath}`;\n const repoName = repositoryPath.split('/').filter(Boolean).at(-1) ?? repositoryPath;\n nodes.push({\n id: virtualId,\n type: 'repositoryNode',\n position: { x: 0, y: 0 },\n data: { name: repoName, repositoryPath } satisfies RepositoryNodeData,\n } as CanvasNodeType);\n virtualRepos.set(repositoryPath, virtualId);\n return virtualId;\n }\n\n // Add repo nodes (real ones) — sorted by createdAt for stable vertical order.\n // The server-side layoutWithDagre may reorder the node array (connected vs\n // disconnected split), so we cannot rely on Map insertion order alone.\n // Use Infinity fallback so repos without createdAt sort last (appear at bottom).\n const sortedRepoEntries = [...repoMap.entries()].sort((a, b) => {\n const aRaw = a[1].data.createdAt;\n const bRaw = b[1].data.createdAt;\n const aTime = typeof aRaw === 'number' && !Number.isNaN(aRaw) ? aRaw : Infinity;\n const bTime = typeof bRaw === 'number' && !Number.isNaN(bRaw) ? bRaw : Infinity;\n return aTime - bTime;\n });\n for (const [nodeId, entry] of sortedRepoEntries) {\n const data: RepositoryNodeData = {\n ...entry.data,\n ...(callbacks?.onRepositoryAdd && {\n onAdd: () => callbacks.onRepositoryAdd!(nodeId),\n }),\n ...(callbacks?.onRepositoryClick && {\n onClick: () => callbacks.onRepositoryClick!(nodeId),\n }),\n ...(callbacks?.onRepositoryDelete && {\n onDelete: callbacks.onRepositoryDelete,\n }),\n };\n nodes.push({\n id: nodeId,\n type: 'repositoryNode',\n position: { x: 0, y: 0 },\n data,\n } as CanvasNodeType);\n }\n\n // Process feature entries (both real and pending).\n // Skip pendingMap entries that already exist in featureMap (reconcile may not\n // have cleaned them up yet if the AI-generated name differs from the original).\n const allFeatureEntries: [string, FeatureEntry, boolean][] = [\n ...[...featureMap.entries()].map(\n ([id, e]) => [id, e, false] as [string, FeatureEntry, boolean]\n ),\n ...[...pendingMap.entries()]\n .filter(([id]) => !featureMap.has(id))\n .map(([id, e]) => [id, e, true] as [string, FeatureEntry, boolean]),\n ];\n\n for (const [nodeId, entry, isPending] of allFeatureEntries) {\n const isCreating = entry.data.state === 'creating' || isPending;\n\n const data: FeatureNodeData = {\n ...entry.data,\n // Callbacks only for non-creating nodes\n ...(!isCreating &&\n callbacks?.onNodeAction && {\n onAction: () => callbacks.onNodeAction!(nodeId),\n }),\n ...(!isCreating &&\n callbacks?.onNodeSettings && {\n onSettings: () => callbacks.onNodeSettings!(nodeId),\n }),\n ...(!isCreating &&\n callbacks?.onFeatureDelete && {\n onDelete: callbacks.onFeatureDelete,\n }),\n ...(!isCreating &&\n entry.data.state === 'error' &&\n callbacks?.onRetryFeature && {\n onRetry: callbacks.onRetryFeature,\n }),\n ...(!isCreating &&\n entry.data.state === 'pending' &&\n callbacks?.onStartFeature && {\n onStart: callbacks.onStartFeature,\n }),\n ...(!isCreating &&\n (entry.data.state === 'running' || entry.data.state === 'action-required') &&\n callbacks?.onStopFeature && {\n onStop: callbacks.onStopFeature,\n }),\n ...(!isCreating &&\n entry.data.state !== 'archived' &&\n entry.data.state !== 'deleting' &&\n callbacks?.onArchiveFeature && {\n onArchive: callbacks.onArchiveFeature,\n }),\n ...(!isCreating &&\n entry.data.state === 'archived' &&\n callbacks?.onUnarchiveFeature && {\n onUnarchive: callbacks.onUnarchiveFeature,\n }),\n };\n\n nodes.push({\n id: nodeId,\n type: 'featureNode',\n position: { x: 0, y: 0 },\n data,\n } as CanvasNodeType);\n\n // Edge derivation\n // If parentNodeId references a feature that's not visible (e.g. archived/filtered),\n // fall through to repo→feature edge so the child reconnects to the repository.\n if (\n entry.parentNodeId &&\n (featureMap.has(entry.parentNodeId) || pendingMap.has(entry.parentNodeId))\n ) {\n // Dependency edge (parent→child feature)\n edges.push({\n id: `dep-${entry.parentNodeId}-${nodeId}`,\n source: entry.parentNodeId,\n target: nodeId,\n type: 'dependencyEdge',\n });\n } else {\n // Repo→feature edge (matched by repositoryPath)\n const repositoryPath = normalizePath(entry.data.repositoryPath);\n const repoNodeId = repoByPath.get(repositoryPath) ?? getOrCreateVirtualRepo(repositoryPath);\n edges.push({\n id: `edge-${repoNodeId}-${nodeId}`,\n source: repoNodeId,\n target: nodeId,\n style: { strokeDasharray: '5 5' },\n });\n }\n }\n\n // Add application nodes and derive repo→app edges (matched by repositoryPath).\n if (applicationMap) {\n for (const [nodeId, entry] of applicationMap) {\n const appNodeId = nodeId;\n const data: ApplicationNodeData = {\n ...entry.data,\n ...(callbacks?.onApplicationClick && {\n onClick: () => callbacks.onApplicationClick!(entry.data.id),\n }),\n ...(callbacks?.onApplicationDelete && {\n onDelete: callbacks.onApplicationDelete,\n }),\n };\n nodes.push({\n id: appNodeId,\n type: 'applicationNode',\n position: { x: 0, y: 0 },\n data,\n } as CanvasNodeType);\n\n // Derive app→repo edge (application on LEFT, repo on RIGHT)\n if (entry.data.repositoryPath) {\n const repoPath = entry.data.repositoryPath.replace(/\\\\/g, '/');\n const repoNodeId = repoByPath.get(repoPath);\n if (repoNodeId) {\n edges.push({\n id: `edge-${appNodeId}-${repoNodeId}`,\n source: appNodeId,\n target: repoNodeId,\n style: { strokeDasharray: '5 5' },\n });\n }\n }\n }\n }\n\n // Build set of feature node IDs that have children (are dependency edge sources)\n const parentNodeIds = new Set<string>();\n for (const edge of edges) {\n if (edge.type === 'dependencyEdge') {\n parentNodeIds.add(edge.source);\n }\n }\n\n // Inject showHandles and hasChildren based on edges\n const hasEdges = edges.length > 0;\n for (const node of nodes) {\n const data = node.data as Record<string, unknown>;\n data.showHandles = hasEdges;\n if (node.type === 'featureNode') {\n data.hasChildren = parentNodeIds.has(node.id);\n }\n }\n\n return { nodes, edges };\n}\n","'use client';\n\nimport { useState, useCallback, useEffect } from 'react';\nimport { Handle, Position } from '@xyflow/react';\nimport { useRouter } from 'next/navigation';\nimport {\n Github,\n Plus,\n Code2,\n Terminal,\n FolderOpen,\n Trash2,\n Play,\n Square,\n GitBranch,\n GitCommitHorizontal,\n ArrowDown,\n User,\n RotateCcw,\n MessageSquare,\n} from 'lucide-react';\nimport { Trans, useTranslation } from 'react-i18next';\nimport { cn } from '@/lib/utils';\nimport { ActionButton } from '@/components/common/action-button';\nimport {\n Dialog,\n DialogClose,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n} from '@/components/ui/dialog';\nimport { Button } from '@/components/ui/button';\nimport { Checkbox } from '@/components/ui/checkbox';\nimport { Label } from '@/components/ui/label';\nimport { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from '@/components/ui/tooltip';\nimport { useDeployAction } from '@/hooks/use-deploy-action';\nimport { useFeatureFlags } from '@/hooks/feature-flags-context';\nimport type { RepositoryNodeData } from './repository-node-config';\nimport { useRepositoryActions } from './use-repository-actions';\nimport { ChatDotIndicator } from '@/components/features/chat/ChatDotIndicator';\nimport { useTurnStatus } from '@/hooks/turn-statuses-provider';\nimport {\n FeatureSessionsDropdown,\n type SessionSummary,\n} from '@/components/common/feature-node/feature-sessions-dropdown';\n\nexport function RepositoryNode({\n data,\n selected,\n}: {\n data: RepositoryNodeData;\n selected?: boolean;\n [key: string]: unknown;\n}) {\n const { t, i18n } = useTranslation('web');\n const router = useRouter();\n const isRtl = i18n.dir() === 'rtl';\n const targetHandlePos = isRtl ? Position.Right : Position.Left;\n const sourceHandlePos = isRtl ? Position.Left : Position.Right;\n const featureFlags = useFeatureFlags();\n const [confirmOpen, setConfirmOpen] = useState(false);\n const [deleteFromDisk, setDeleteFromDisk] = useState(false);\n useEffect(() => {\n if (confirmOpen) setDeleteFromDisk(false);\n }, [confirmOpen]);\n const repoScopeId = data.id ? `repo-${data.id}` : `repo-${data.name}`;\n const chatTurnStatus = useTurnStatus(repoScopeId);\n const actions = useRepositoryActions(\n data.repositoryPath ? { repositoryId: data.id, repositoryPath: data.repositoryPath } : null\n );\n const deployAction = useDeployAction(\n data.repositoryPath\n ? {\n targetId: data.repositoryPath,\n targetType: 'repository',\n repositoryPath: data.repositoryPath,\n }\n : null\n );\n const isDeploymentActive = deployAction.status === 'Booting' || deployAction.status === 'Ready';\n\n const handleCreateFromSession = useCallback(\n (session: SessionSummary, sessionFilePath: string) => {\n if (!data.repositoryPath) return;\n const preview = session.preview ? session.preview.slice(0, 200) : 'Unknown conversation';\n const prompt = [\n `Continue work from a previous agent session.`,\n ``,\n `## Session Context`,\n `- Session ID: ${session.id}`,\n `- Messages: ${session.messageCount}`,\n session.lastMessageAt ? `- Last active: ${session.lastMessageAt}` : '',\n `- Conversation file: ${sessionFilePath}`,\n ``,\n `## Session Preview`,\n `> ${preview}`,\n ``,\n `## Instructions`,\n `1. Read the full conversation history from the file above`,\n `2. Analyze the current state of the repository — what was done, what remains`,\n `3. Create or update spec files to accurately reflect the current state and remaining work`,\n `4. Continue implementing any unfinished work from the conversation`,\n ]\n .filter(Boolean)\n .join('\\n');\n\n const params = new URLSearchParams({\n repo: data.repositoryPath,\n prompt,\n });\n router.push(`/create?${params.toString()}`);\n },\n [data.repositoryPath, router]\n );\n\n return (\n <div\n className={cn('group relative', data.onDelete && data.id && 'ps-10')}\n style={{ direction: isRtl ? 'rtl' : 'ltr' }}\n >\n {data.showHandles ? (\n <Handle\n type=\"target\"\n position={targetHandlePos}\n isConnectable={false}\n className=\"opacity-0!\"\n style={{ top: 70 }}\n />\n ) : null}\n\n {/* Delete button — visible on hover, positioned to the left */}\n {data.onDelete && data.id ? (\n <>\n <div className=\"absolute -start-3 top-1/2 -translate-y-1/2 opacity-0 transition-opacity group-hover:opacity-100\">\n <TooltipProvider>\n <Tooltip>\n <TooltipTrigger asChild>\n <button\n aria-label={t('repositoryNode.removeRepository')}\n data-testid=\"repository-node-delete-button\"\n onClick={(e) => {\n e.stopPropagation();\n setConfirmOpen(true);\n }}\n className=\"bg-card text-muted-foreground hover:border-destructive hover:text-destructive flex h-7 w-7 cursor-pointer items-center justify-center rounded-full border shadow-sm transition-colors\"\n >\n <Trash2 className=\"h-3.5 w-3.5\" />\n </button>\n </TooltipTrigger>\n <TooltipContent>{t('repositoryNode.removeRepository')}</TooltipContent>\n </Tooltip>\n </TooltipProvider>\n </div>\n\n <Dialog open={confirmOpen} onOpenChange={setConfirmOpen}>\n <DialogContent className=\"max-w-sm\">\n <DialogHeader>\n <DialogTitle>{t('repositoryNode.removeConfirmTitle')}</DialogTitle>\n <DialogDescription>\n <Trans\n t={t}\n i18nKey=\"repositoryNode.removeConfirmDescription\"\n values={{ name: data.name }}\n components={{ strong: <strong /> }}\n />{' '}\n {deleteFromDisk\n ? t('repositoryNode.removeConfirmDescriptionDeleteFiles')\n : t('repositoryNode.removeConfirmDescriptionKeepFiles')}\n </DialogDescription>\n </DialogHeader>\n <div className=\"flex items-center gap-2\">\n <Checkbox\n id=\"repository-delete-from-disk\"\n checked={deleteFromDisk}\n onCheckedChange={(checked) => setDeleteFromDisk(checked === true)}\n data-testid=\"repository-node-delete-from-disk-checkbox\"\n aria-label={t('repositoryNode.deleteFromDiskLabel')}\n />\n <Label\n htmlFor=\"repository-delete-from-disk\"\n className=\"cursor-pointer text-sm font-normal\"\n >\n {t('repositoryNode.deleteFromDiskLabel')}\n </Label>\n </div>\n <DialogFooter className=\"grid grid-cols-2 gap-2 sm:flex-none\">\n <DialogClose asChild>\n <Button variant=\"outline\">{t('repositoryNode.cancel')}</Button>\n </DialogClose>\n <Button\n variant=\"destructive\"\n data-testid=\"repository-node-delete-confirm-button\"\n onClick={() => {\n setConfirmOpen(false);\n data.onDelete?.(data.id!, { deleteFromDisk });\n }}\n >\n {t('repositoryNode.remove')}\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n </>\n ) : null}\n\n <div\n role=\"button\"\n tabIndex={0}\n data-testid=\"repository-node-card\"\n data-repo-name={data.name}\n onClick={(e) => {\n e.stopPropagation();\n data.onClick?.();\n }}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n e.stopPropagation();\n data.onClick?.();\n }\n }}\n className={cn(\n 'nodrag bg-card flex w-[26rem] cursor-pointer flex-col overflow-hidden rounded-xl border shadow-sm transition-[border-color,box-shadow] duration-200 dark:bg-neutral-800/80',\n selected && 'border-blue-400 dark:border-amber-500/60'\n )}\n >\n {/* Row 1: Repository name + action buttons */}\n <div className=\"flex items-center gap-3 px-4 py-3\">\n <Github className=\"text-muted-foreground h-5 w-5 shrink-0\" />\n <span data-testid=\"repository-node-name\" className=\"min-w-0 truncate text-sm font-medium\">\n {data.name}\n </span>\n\n <div\n className={cn(\n 'flex shrink-0 items-center gap-2',\n (data.repositoryPath ?? data.onAdd) && 'ms-auto'\n )}\n onClick={(e) => e.stopPropagation()}\n >\n {data.repositoryPath ? (\n <>\n <TooltipProvider>\n <Tooltip>\n <TooltipTrigger asChild>\n <span className=\"flex items-center\">\n <ActionButton\n label={t('repositoryNode.openInIde')}\n onClick={actions.openInIde}\n loading={actions.ideLoading}\n error={!!actions.ideError}\n icon={Code2}\n iconOnly\n variant=\"ghost\"\n size=\"icon-xs\"\n />\n </span>\n </TooltipTrigger>\n <TooltipContent>{t('repositoryNode.openInIde')}</TooltipContent>\n </Tooltip>\n </TooltipProvider>\n <TooltipProvider>\n <Tooltip>\n <TooltipTrigger asChild>\n <span className=\"flex items-center\">\n <ActionButton\n label={t('repositoryNode.openInShell')}\n onClick={actions.openInShell}\n loading={actions.shellLoading}\n error={!!actions.shellError}\n icon={Terminal}\n iconOnly\n variant=\"ghost\"\n size=\"icon-xs\"\n />\n </span>\n </TooltipTrigger>\n <TooltipContent>{t('repositoryNode.openInShell')}</TooltipContent>\n </Tooltip>\n </TooltipProvider>\n <TooltipProvider>\n <Tooltip>\n <TooltipTrigger asChild>\n <span className=\"flex items-center\">\n <ActionButton\n label={t('repositoryNode.openFolder')}\n onClick={actions.openFolder}\n loading={actions.folderLoading}\n error={!!actions.folderError}\n icon={FolderOpen}\n iconOnly\n variant=\"ghost\"\n size=\"icon-xs\"\n />\n </span>\n </TooltipTrigger>\n <TooltipContent>{t('repositoryNode.openFolder')}</TooltipContent>\n </Tooltip>\n </TooltipProvider>\n <TooltipProvider>\n <Tooltip>\n <TooltipTrigger asChild>\n <Button\n variant=\"ghost\"\n size=\"icon-xs\"\n aria-label={t('repositoryNode.chatWithAgent')}\n onClick={(e) => {\n e.stopPropagation();\n if (data.id)\n router.push(\n `/repository/${data.id}/chat` as Parameters<typeof router.push>[0]\n );\n }}\n className=\"nodrag relative cursor-pointer text-violet-500 hover:text-violet-600 dark:text-violet-400 dark:hover:text-violet-300\"\n >\n <MessageSquare className=\"h-3 w-3\" />\n <ChatDotIndicator status={chatTurnStatus} />\n </Button>\n </TooltipTrigger>\n <TooltipContent>{t('repositoryNode.chatWithAgent')}</TooltipContent>\n </Tooltip>\n </TooltipProvider>\n <FeatureSessionsDropdown\n repositoryPath={data.repositoryPath}\n includeWorktrees\n onCreateFromSession={handleCreateFromSession}\n />\n </>\n ) : null}\n\n {data.onAdd ? <div className=\"ms-1.5\" /> : null}\n {data.onAdd ? (\n <TooltipProvider>\n <Tooltip>\n <TooltipTrigger asChild>\n <button\n aria-label={t('repositoryNode.newFeature')}\n data-testid=\"repository-node-add-button\"\n onClick={(e) => {\n e.stopPropagation();\n data.onAdd?.();\n }}\n className={cn(\n 'flex h-6 shrink-0 cursor-pointer items-center gap-0.5 rounded bg-blue-500 px-1.5 text-[11px] font-bold text-white transition-colors hover:bg-blue-600 dark:bg-amber-500 dark:hover:bg-amber-400',\n data.pulseAdd && 'animate-pulse-cta'\n )}\n >\n <Plus className=\"h-3 w-3\" />\n <span className=\"translate-y-px\">{t('repositoryNode.new')}</span>\n </button>\n </TooltipTrigger>\n <TooltipContent side=\"top\">{t('repositoryNode.newFeature')}</TooltipContent>\n </Tooltip>\n </TooltipProvider>\n ) : null}\n </div>\n </div>\n\n {/* Row 2 & 3: Git info or placeholder */}\n {data.branch ? (\n <>\n {/* Row 2: Branch + behind status */}\n <div\n data-testid=\"repository-node-git-info\"\n className=\"text-muted-foreground border-border/50 border-t px-4 py-2\"\n >\n <div className=\"flex items-center gap-3 text-xs\">\n <span\n className=\"flex items-center gap-1 truncate\"\n data-testid=\"repository-node-branch\"\n >\n <GitBranch className=\"h-3 w-3 shrink-0\" />\n <span className=\"truncate\">{data.branch}</span>\n </span>\n {data.behindCount != null && data.behindCount > 0 ? (\n <span\n className=\"flex shrink-0 items-center gap-1 whitespace-nowrap text-amber-500\"\n data-testid=\"repository-node-behind\"\n >\n <ArrowDown className=\"h-3 w-3 shrink-0\" />\n {t('repositoryNode.behind', { count: data.behindCount })}\n </span>\n ) : null}\n </div>\n </div>\n {/* Row 3: Latest commit */}\n {data.commitMessage ? (\n <div\n data-testid=\"repository-node-commit-info\"\n className=\"text-muted-foreground border-border/50 border-t px-4 py-2\"\n >\n <div className=\"flex items-center gap-2 text-xs\">\n <GitCommitHorizontal className=\"h-3 w-3 shrink-0\" />\n <span className=\"min-w-0 truncate\" data-testid=\"repository-node-commit-message\">\n {data.commitMessage}\n </span>\n {data.committer ? (\n <span\n className=\"text-muted-foreground/70 ms-auto flex shrink-0 items-center gap-1\"\n data-testid=\"repository-node-committer\"\n >\n <User className=\"h-3 w-3 shrink-0\" />\n <span>{data.committer}</span>\n </span>\n ) : null}\n </div>\n </div>\n ) : null}\n </>\n ) : data.gitInfoStatus === 'not-a-repo' ? (\n /* Not a git repo — two rows for consistency with loading/ready states */\n <>\n <div\n data-testid=\"repository-node-not-repo\"\n className=\"text-muted-foreground border-border/50 border-t px-4 py-2\"\n >\n <div className=\"flex items-center gap-2 text-xs\">\n <FolderOpen className=\"h-3 w-3 shrink-0\" />\n <span className=\"min-w-0 truncate opacity-60\">\n {data.repositoryPath ?? 'Unknown path'}\n </span>\n </div>\n </div>\n <div className=\"text-muted-foreground border-border/50 border-t px-4 py-2\">\n <div className=\"flex items-center gap-2 text-xs opacity-40\">\n <GitBranch className=\"h-3 w-3 shrink-0\" />\n <span>{t('repositoryNode.notAGitRepository')}</span>\n </div>\n </div>\n </>\n ) : data.gitInfoStatus !== 'ready' ? (\n /* Loading — show skeleton placeholders for both rows */\n <>\n <div\n data-testid=\"repository-node-git-loading\"\n className=\"border-border/50 border-t px-4 py-2\"\n >\n <div className=\"flex h-4 items-center gap-2 text-xs\">\n <GitBranch className=\"text-muted-foreground h-3 w-3 shrink-0\" />\n <span className=\"bg-muted h-3 w-20 animate-pulse rounded\" />\n </div>\n </div>\n <div className=\"border-border/50 border-t px-4 py-2\">\n <div className=\"flex h-4 items-center gap-2 text-xs\">\n <GitCommitHorizontal className=\"text-muted-foreground h-3 w-3 shrink-0\" />\n <span className=\"bg-muted h-3 w-36 animate-pulse rounded\" />\n </div>\n </div>\n </>\n ) : null}\n\n {/* Row 4: Local dev server — always visible when envDeploy flag is on */}\n {featureFlags.envDeploy && data.repositoryPath ? (\n <div\n data-testid=\"repository-node-dev-preview\"\n className=\"border-border/50 border-t px-4 py-2\"\n onClick={(e) => e.stopPropagation()}\n >\n <div className=\"flex items-center gap-2 text-xs\">\n {deployAction.deployError ? (\n <span className=\"truncate text-xs text-red-500\">{deployAction.deployError}</span>\n ) : isDeploymentActive ? (\n <>\n <span className=\"me-0.5 inline-block h-2 w-2 shrink-0 rounded-full bg-green-500\" />\n {deployAction.url ? (\n <a\n href={deployAction.url}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"truncate text-green-700 hover:underline dark:text-green-400\"\n >\n {deployAction.url}\n </a>\n ) : (\n <span className=\"text-muted-foreground\">{t('repositoryNode.starting')}</span>\n )}\n </>\n ) : (\n <span className=\"text-muted-foreground inline-flex items-baseline gap-2\">\n <span>{t('repositoryNode.run')}</span>\n <span className=\"text-muted-foreground/50 text-[10px]\">\n {t('repositoryNode.startLocalEnvironment')}\n </span>\n </span>\n )}\n <TooltipProvider>\n <Tooltip>\n <TooltipTrigger asChild>\n <span\n className={cn(\n 'ms-auto flex items-center',\n !isDeploymentActive &&\n !deployAction.deployError &&\n '[&_button]:text-green-600 [&_button]:hover:text-green-700 dark:[&_button]:text-green-400 dark:[&_button]:hover:text-green-300'\n )}\n >\n <ActionButton\n label={\n deployAction.deployError\n ? t('repositoryNode.retry')\n : isDeploymentActive\n ? t('repositoryNode.stopDevServer')\n : t('repositoryNode.startDevServer')\n }\n onClick={isDeploymentActive ? deployAction.stop : deployAction.deploy}\n loading={deployAction.deployLoading || deployAction.stopLoading}\n error={false}\n icon={\n deployAction.deployError ? RotateCcw : isDeploymentActive ? Square : Play\n }\n iconOnly\n variant=\"ghost\"\n size=\"icon-xs\"\n />\n </span>\n </TooltipTrigger>\n <TooltipContent>\n {isDeploymentActive\n ? t('repositoryNode.stopDevServer')\n : t('repositoryNode.startDevServer')}\n </TooltipContent>\n </Tooltip>\n </TooltipProvider>\n </div>\n </div>\n ) : null}\n </div>\n\n {/* Source handle — invisible, for edge connections */}\n {data.onAdd || data.showHandles ? (\n <Handle\n type=\"source\"\n position={sourceHandlePos}\n isConnectable={!data.showHandles}\n className=\"opacity-0!\"\n style={{ top: 70 }}\n />\n ) : null}\n </div>\n );\n}\n","'use client';\n\nimport { useCallback } from 'react';\nimport { Code2, Terminal, FolderOpen, RefreshCw } from 'lucide-react';\nimport { BaseDrawer } from '@/components/common/base-drawer';\nimport { DrawerTitle, DrawerDescription } from '@/components/ui/drawer';\nimport { Separator } from '@/components/ui/separator';\nimport { ActionButton } from '@/components/common/action-button';\nimport { useFeatureFlags } from '@/hooks/feature-flags-context';\nimport type { RepositoryNodeData } from './repository-node-config';\nimport { useRepositoryActions } from './use-repository-actions';\n\nexport interface RepositoryDrawerProps {\n data: RepositoryNodeData | null;\n onClose: () => void;\n}\n\nexport function RepositoryDrawer({ data, onClose }: RepositoryDrawerProps) {\n const featureFlags = useFeatureFlags();\n const handleClose = useCallback(() => {\n onClose();\n }, [onClose]);\n\n const actions = useRepositoryActions(\n data?.repositoryPath ? { repositoryId: data.id, repositoryPath: data.repositoryPath } : null\n );\n\n return (\n <BaseDrawer\n open={data !== null}\n onClose={handleClose}\n size=\"md\"\n modal={false}\n data-testid=\"repository-drawer\"\n deployTarget={\n data?.repositoryPath\n ? {\n targetId: data.repositoryPath,\n targetType: 'repository',\n repositoryPath: data.repositoryPath,\n }\n : undefined\n }\n header={\n data ? (\n <div data-testid=\"repository-drawer-header\">\n <DrawerTitle>{data.name}</DrawerTitle>\n {data.repositoryPath ? (\n <DrawerDescription className=\"truncate font-mono text-xs\">\n {data.repositoryPath}\n </DrawerDescription>\n ) : null}\n </div>\n ) : undefined\n }\n >\n {data?.repositoryPath ? (\n <>\n <Separator />\n <div className=\"flex flex-col gap-3 p-4\">\n <div className=\"text-muted-foreground text-xs font-semibold tracking-wider\">\n OPEN WITH\n </div>\n <div className=\"flex flex-col gap-2\">\n <ActionButton\n label=\"Open in IDE\"\n onClick={actions.openInIde}\n loading={actions.ideLoading}\n error={!!actions.ideError}\n icon={Code2}\n variant=\"outline\"\n size=\"sm\"\n />\n <ActionButton\n label=\"Open in Shell\"\n onClick={actions.openInShell}\n loading={actions.shellLoading}\n error={!!actions.shellError}\n icon={Terminal}\n variant=\"outline\"\n size=\"sm\"\n />\n <ActionButton\n label=\"Open Folder\"\n onClick={actions.openFolder}\n loading={actions.folderLoading}\n error={!!actions.folderError}\n icon={FolderOpen}\n variant=\"outline\"\n size=\"sm\"\n />\n </div>\n </div>\n {data.id && featureFlags.gitRebaseSync ? (\n <>\n <Separator />\n <div className=\"flex flex-col gap-3 p-4\">\n <div className=\"text-muted-foreground text-xs font-semibold tracking-wider\">\n GIT OPERATIONS\n </div>\n <div className=\"flex flex-col gap-2\">\n <ActionButton\n label=\"Sync Main\"\n onClick={actions.syncMain}\n loading={actions.syncLoading}\n error={!!actions.syncError}\n icon={RefreshCw}\n variant=\"outline\"\n size=\"sm\"\n />\n {actions.syncError ? (\n <p className=\"text-destructive text-xs\">{actions.syncError}</p>\n ) : null}\n </div>\n </div>\n </>\n ) : null}\n </>\n ) : null}\n </BaseDrawer>\n );\n}\n","'use client';\n\nimport { useCallback, useState } from 'react';\nimport { Handle, Position } from '@xyflow/react';\nimport {\n ExternalLink,\n LayoutGrid,\n Loader2,\n Play,\n Square,\n Trash2,\n TriangleAlert,\n} from 'lucide-react';\nimport { useTranslation } from 'react-i18next';\nimport { cn } from '@/lib/utils';\nimport {\n Dialog,\n DialogClose,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n} from '@/components/ui/dialog';\nimport { Button } from '@/components/ui/button';\nimport { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from '@/components/ui/tooltip';\nimport { useTurnStatus } from '@/hooks/turn-statuses-provider';\nimport { useDeployAction } from '@/hooks/use-deploy-action';\nimport { DeploymentState } from '@shepai/core/domain/generated/output';\nimport type { ApplicationNodeData } from './application-node-config';\n\n/** Preview slot height. Roomier than the old 120px to give the live\n * iframe / start-preview CTA more presence on the canvas. */\nconst PREVIEW_HEIGHT_PX = 180;\n\n/**\n * Pick the effective status for the card's status pill. \"Idle\" is\n * never shown. The fallback when nothing is actively happening is\n * \"Ready\" (standby) — unless the dev server is running, in which\n * case \"Live\" takes over as the persistent resting state.\n *\n * Priority (highest wins):\n *\n * - `processing` → \"In Progress\" (agent actively running a turn)\n * - `awaiting_input` → \"Warning\" (agent blocked on user question)\n * - deploymentUrl set → \"Live\" (dev server running at a real URL)\n * - persisted Error → \"Error\"\n * - otherwise → \"Ready\" (agent finished, preview not running)\n *\n * Note the `unread` turn status intentionally collapses into the\n * default branch — when the agent just finished a turn but the user\n * hasn't scrolled back to read it, we still show Ready (or Live if\n * the dev server is up). The user is already looking at the card,\n * a \"you have unread output\" nag adds no information.\n */\nfunction deriveLiveStatus(\n persistedStatus: string,\n turnStatus: string,\n deploymentUrl: string | undefined\n): { label: string; dotClass: string; pulse: boolean } {\n if (turnStatus === 'processing') {\n return { label: 'In Progress', dotClass: 'bg-violet-500', pulse: true };\n }\n if (turnStatus === 'awaiting_input') {\n return { label: 'Warning', dotClass: 'bg-amber-500', pulse: true };\n }\n if (deploymentUrl) {\n return { label: 'Live', dotClass: 'bg-emerald-500', pulse: true };\n }\n if (persistedStatus === 'Error') {\n return { label: 'Error', dotClass: 'bg-red-500', pulse: false };\n }\n return { label: 'Ready', dotClass: 'bg-sky-500', pulse: false };\n}\n\nexport function ApplicationNode({\n data,\n selected,\n}: {\n data: ApplicationNodeData;\n selected?: boolean;\n [key: string]: unknown;\n}) {\n const { i18n } = useTranslation('web');\n const isRtl = i18n.dir() === 'rtl';\n const targetHandlePos = isRtl ? Position.Right : Position.Left;\n const sourceHandlePos = isRtl ? Position.Left : Position.Right;\n const [confirmOpen, setConfirmOpen] = useState(false);\n\n const totalRepoCount = 1 + data.additionalPathCount;\n const repoCountLabel = totalRepoCount === 1 ? '1 repository' : `${totalRepoCount} repositories`;\n\n // Live session turn status from the global SSE subscription. The\n // scope key is `app-<id>` — same key used everywhere else the\n // application's chat is referenced.\n const turnStatus = useTurnStatus(`app-${data.id}`);\n\n // Shared dev-server deploy state — one per card. Subscribes to the\n // `DeploymentStatusProvider` which is SSR-seeded in the dashboard\n // layout from `ListDeploymentsUseCase`, so running apps render as\n // \"Live\" on the first paint without a client round-trip.\n //\n // The card's Preview button drives this hook and the `live.label`\n // below is derived from the SAME state (via `deploy.url`), so the\n // status pill, the preview slot, and the button are always in\n // sync — hitting the button on one card can never leave the card\n // itself showing a stale \"Ready\" state.\n const deploy = useDeployAction({\n targetId: data.id,\n targetType: 'application',\n repositoryPath: data.repositoryPath,\n });\n\n // The hook is the single source of truth for the running URL.\n //\n // The shared `DeploymentStatusProvider` is seeded from SSR\n // (`get-graph-data` → `ListDeploymentsUseCase`) so the entry for\n // this application is already populated on the first client render,\n // and `ensureHydrated` catches anything the SSR seed missed. On\n // Stop the hook clears `deploy.url` to null which immediately\n // collapses the pill from \"Live\" back to \"Ready\" — there is\n // intentionally no secondary snapshot URL that could stay stale.\n const effectiveDeploymentUrl = deploy.url;\n\n const live = deriveLiveStatus(data.status, turnStatus, effectiveDeploymentUrl ?? undefined);\n\n // Clicking anything in the \"card controls\" zone (Preview button,\n // open-in-new-tab) must not trigger the card's navigation-to-app\n // click handler. A single stopPropagation wrapper keeps every\n // control inside the card safe without individually guarding each\n // one.\n const stopCardClick = useCallback((e: React.MouseEvent | React.PointerEvent) => {\n e.stopPropagation();\n }, []);\n\n const openPreviewInNewTab = useCallback(\n (e: React.MouseEvent) => {\n e.stopPropagation();\n if (effectiveDeploymentUrl) {\n window.open(effectiveDeploymentUrl, '_blank', 'noopener,noreferrer');\n }\n },\n [effectiveDeploymentUrl]\n );\n\n return (\n <div className=\"group relative\" style={{ direction: isRtl ? 'rtl' : 'ltr' }}>\n {/* Target handle (left in LTR) — always rendered for edge connections */}\n <Handle\n type=\"target\"\n position={targetHandlePos}\n isConnectable={false}\n className=\"opacity-0!\"\n style={{ top: 70 }}\n />\n\n {/* Delete button — visible on hover, positioned outside the card on the left */}\n {data.onDelete && data.id ? (\n <>\n <div\n className=\"absolute -start-14 top-0 bottom-0 flex items-center justify-center ps-4 pe-3 opacity-0 transition-opacity group-hover:opacity-100\"\n onPointerDown={(e) => e.stopPropagation()}\n >\n <TooltipProvider>\n <Tooltip>\n <TooltipTrigger asChild>\n <button\n aria-label=\"Remove application\"\n data-testid=\"application-node-delete-button\"\n onClick={(e) => {\n e.stopPropagation();\n setConfirmOpen(true);\n }}\n className=\"bg-card text-muted-foreground hover:border-destructive hover:text-destructive flex h-7 w-7 cursor-pointer items-center justify-center rounded-full border shadow-sm transition-colors\"\n >\n <Trash2 className=\"h-3.5 w-3.5\" />\n </button>\n </TooltipTrigger>\n <TooltipContent>Remove application</TooltipContent>\n </Tooltip>\n </TooltipProvider>\n </div>\n\n <Dialog open={confirmOpen} onOpenChange={setConfirmOpen}>\n <DialogContent className=\"max-w-xs\">\n <DialogHeader>\n <DialogTitle>Remove application?</DialogTitle>\n <DialogDescription>\n This will remove <strong>{data.name}</strong> from your workspace.\n </DialogDescription>\n </DialogHeader>\n <DialogFooter className=\"grid grid-cols-2 gap-2 sm:flex-none\">\n <DialogClose asChild>\n <Button variant=\"outline\">Cancel</Button>\n </DialogClose>\n <Button\n variant=\"destructive\"\n onClick={() => {\n setConfirmOpen(false);\n data.onDelete?.(data.id);\n }}\n >\n Remove\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n </>\n ) : null}\n\n <div\n role=\"button\"\n tabIndex={0}\n data-testid=\"application-node-card\"\n data-app-name={data.name}\n onClick={(e) => {\n e.stopPropagation();\n data.onClick?.();\n }}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n e.stopPropagation();\n data.onClick?.();\n }\n }}\n className={cn(\n 'nodrag bg-card flex w-[26rem] cursor-pointer flex-col overflow-hidden rounded-xl border shadow-sm transition-[border-color,box-shadow] duration-200 dark:bg-neutral-800/80',\n selected && 'border-blue-400 dark:border-amber-500/60'\n )}\n >\n {/* Row 1: Header — icon, name, status.\n Padding matches the preview slot below so the card has\n consistent vertical rhythm now that the preview is\n taller. */}\n <div className=\"flex items-center gap-3 px-4 py-4\">\n <div className=\"flex h-8 w-8 shrink-0 items-center justify-center rounded-lg bg-gradient-to-br from-indigo-500 to-violet-500\">\n <LayoutGrid className=\"h-4 w-4 text-white\" />\n </div>\n <span\n data-testid=\"application-node-name\"\n className=\"min-w-0 truncate text-sm font-medium\"\n >\n {data.name}\n </span>\n <span className=\"ms-auto flex shrink-0 items-center gap-1.5\">\n <span\n data-testid=\"application-node-status-dot\"\n className={cn(\n 'relative flex h-2 w-2 items-center justify-center rounded-full',\n live.dotClass\n )}\n >\n {live.pulse ? (\n <span\n className={cn(\n 'absolute inline-flex h-full w-full animate-ping rounded-full opacity-60',\n live.dotClass\n )}\n />\n ) : null}\n </span>\n <span\n data-testid=\"application-node-status-text\"\n className=\"text-muted-foreground text-xs\"\n >\n {live.label}\n </span>\n </span>\n </div>\n\n {/* Row 2: Preview slot — the control hub for the dev server.\n One rectangle carries every state:\n - Live: iframe + [stop][open-in-new-tab] pinned top-right\n - Booting: centered spinner + \"Starting…\"\n - Stopping: centered spinner + \"Stopping…\"\n - Error: centered triangle + error label\n - Idle: grayed wireframe (future: last screenshot),\n hover overlay with a big \"Start Preview\" CTA\n `pointer-events-none` on the iframe keeps the card\n draggable — the iframe swallows no clicks. */}\n <div className=\"px-4 pb-4\">\n <div\n className=\"bg-muted group/preview relative overflow-hidden rounded-lg\"\n style={{ height: PREVIEW_HEIGHT_PX }}\n >\n {/* ── Underlay: iframe when Live, else wireframe ───── */}\n {effectiveDeploymentUrl ? (\n <iframe\n src={effectiveDeploymentUrl}\n title={`${data.name} live preview`}\n // 2.5× inner size scaled to 0.4 = exactly 1.0\n // effective size. The iframe renders at a real\n // browser viewport (good enough for responsive\n // landing pages) and gets scaled into our slot.\n className=\"pointer-events-none absolute top-0 left-0 origin-top-left border-0 bg-white\"\n style={{\n width: '250%',\n height: '250%',\n transform: 'scale(0.4)',\n }}\n // Run the app in a sandbox with only what a static\n // Vite dev bundle needs: same-origin (for HMR\n // websockets on localhost) + script execution. No\n // form submission, no top-level navigation, no\n // modal dialogs.\n sandbox=\"allow-same-origin allow-scripts\"\n loading=\"lazy\"\n />\n ) : (\n // Offline underlay — grayed wireframe (placeholder for\n // a real captured screenshot, see TODO in the\n // components/config comment). Grayscale + low opacity\n // signals \"this is not a live image\".\n <div className=\"pointer-events-none absolute inset-0 opacity-50 grayscale\">\n <div\n className=\"flex h-6 items-center gap-2 px-2\"\n style={{ background: 'var(--muted)' }}\n >\n <div className=\"bg-muted-foreground/10 h-2 w-2 rounded-full\" />\n <div className=\"bg-muted-foreground/10 h-2 w-2 rounded-full\" />\n <div className=\"bg-muted-foreground/10 h-2 w-2 rounded-full\" />\n <div className=\"bg-muted-foreground/10 ms-2 h-2 w-16 rounded\" />\n </div>\n <div className=\"flex h-[calc(100%-1.5rem)]\">\n {/* Sidebar */}\n <div className=\"border-muted-foreground/5 flex w-[50px] flex-col gap-2 border-e p-2\">\n <div className=\"bg-muted-foreground/10 h-2 w-full rounded\" />\n <div className=\"bg-muted-foreground/10 h-2 w-3/4 rounded\" />\n <div className=\"bg-muted-foreground/10 h-2 w-full rounded\" />\n </div>\n {/* Main content */}\n <div className=\"flex flex-1 flex-col gap-2 p-3\">\n <div className=\"bg-muted-foreground/10 h-2.5 w-2/3 rounded\" />\n <div className=\"bg-muted-foreground/10 h-2 w-full rounded\" />\n <div className=\"bg-muted-foreground/10 h-2 w-5/6 rounded\" />\n <div className=\"bg-muted-foreground/10 h-2 w-3/4 rounded\" />\n <div className=\"bg-muted-foreground/10 h-2 w-2/3 rounded\" />\n </div>\n </div>\n </div>\n )}\n\n {/* ── Overlays, pinned by deploy state ─────────────── */}\n\n {/* Live — centered Stop + Open-in-new-tab cluster,\n revealed on hover with an opaque dark surface.\n NOTE: we deliberately do NOT use `backdrop-blur` on\n top of the iframe — the iframe is rendered with\n `transform: scale(0.4)` which rasterizes its edges\n at subpixel boundaries, and CSS backdrop-filter\n picks those up and produces ugly banding / bleed\n (e.g. a stray green smudge from the real page\n behind it). A plain opaque fill is cleaner. */}\n {deploy.status === DeploymentState.Ready && effectiveDeploymentUrl ? (\n <div\n className=\"pointer-events-none absolute inset-0 flex items-center justify-center gap-2 bg-neutral-900/75 opacity-0 transition-opacity duration-150 group-hover/preview:pointer-events-auto group-hover/preview:opacity-100 dark:bg-neutral-950/80\"\n onPointerDown={stopCardClick}\n onClick={stopCardClick}\n >\n {/* Solid backgrounds (no /90) — sitting on top of a\n transform-scaled iframe, any alpha-transparent\n surface rasterizes with fuzzy edges. Fully\n opaque white/neutral fills render cleanly. */}\n <button\n type=\"button\"\n onClick={(e) => {\n e.stopPropagation();\n void deploy.stop();\n }}\n disabled={deploy.stopLoading}\n aria-label=\"Stop dev server\"\n title=\"Stop dev server\"\n className=\"inline-flex h-9 cursor-pointer items-center gap-1.5 rounded-md border border-neutral-300 bg-white px-3 text-xs font-semibold text-neutral-900 shadow-md transition-colors hover:border-red-500 hover:bg-red-50 hover:text-red-600 dark:border-neutral-700 dark:bg-neutral-900 dark:text-neutral-100 dark:hover:border-red-500 dark:hover:bg-red-950 dark:hover:text-red-400\"\n >\n {deploy.stopLoading ? (\n <Loader2 className=\"h-3.5 w-3.5 animate-spin\" />\n ) : (\n <Square className=\"h-3.5 w-3.5 fill-current\" />\n )}\n <span>Stop</span>\n </button>\n <button\n type=\"button\"\n onClick={openPreviewInNewTab}\n aria-label={`Open ${data.name} in a new tab`}\n title={effectiveDeploymentUrl}\n className=\"inline-flex h-9 cursor-pointer items-center gap-1.5 rounded-md border border-neutral-300 bg-white px-3 text-xs font-semibold text-neutral-900 shadow-md transition-colors hover:bg-neutral-50 dark:border-neutral-700 dark:bg-neutral-900 dark:text-neutral-100 dark:hover:bg-neutral-800\"\n >\n <ExternalLink className=\"h-3.5 w-3.5\" />\n <span>Open</span>\n </button>\n </div>\n ) : null}\n\n {/* Booting — centered spinner, always visible (no hover\n gate). Amber matches the \"transient waiting\" palette\n used by the top-bar Preview button. Solid surface\n (no backdrop-blur) to avoid rasterization artifacts. */}\n {deploy.status === DeploymentState.Booting || deploy.deployLoading ? (\n <div className=\"absolute inset-0 flex flex-col items-center justify-center gap-2 bg-neutral-100 dark:bg-neutral-900\">\n <Loader2 className=\"h-8 w-8 animate-spin text-amber-500\" />\n <span className=\"text-foreground text-xs font-medium\">Starting…</span>\n </div>\n ) : null}\n\n {/* Stopping — centered spinner while the Stop request\n resolves. Separate from Booting so the label can be\n different; visually similar otherwise. */}\n {deploy.stopLoading && deploy.status === DeploymentState.Ready ? (\n <div className=\"absolute inset-0 flex flex-col items-center justify-center gap-2 bg-neutral-900/75 dark:bg-neutral-950/80\">\n <Loader2 className=\"h-8 w-8 animate-spin text-neutral-100\" />\n <span className=\"text-xs font-medium text-neutral-100\">Stopping…</span>\n </div>\n ) : null}\n\n {/* Error — centered triangle + clickable retry hint.\n Stays visible until the user retries, so a failed\n boot doesn't silently disappear. */}\n {!deploy.deployLoading &&\n !deploy.stopLoading &&\n deploy.status !== DeploymentState.Booting &&\n deploy.status !== DeploymentState.Ready &&\n deploy.deployError ? (\n <button\n type=\"button\"\n onClick={(e) => {\n e.stopPropagation();\n void deploy.deploy();\n }}\n onPointerDown={stopCardClick}\n className=\"absolute inset-0 flex flex-col items-center justify-center gap-2 bg-neutral-100 transition-colors hover:bg-neutral-200 dark:bg-neutral-900 dark:hover:bg-neutral-800\"\n >\n <TriangleAlert className=\"h-8 w-8 text-red-500\" />\n <span className=\"text-xs font-medium text-red-600 dark:text-red-400\">\n Failed — click to retry\n </span>\n </button>\n ) : null}\n\n {/* Idle — hover overlay with a big \"Start Preview\" CTA.\n Appears only on hover of the preview slot (not the\n whole card) so just hovering the card title doesn't\n flash it. Uses the Shep AI purple palette to match\n the page top-bar Preview button. Solid overlay so\n edges stay crisp against the wireframe underneath. */}\n {!effectiveDeploymentUrl &&\n !deploy.deployLoading &&\n deploy.status !== DeploymentState.Booting &&\n !deploy.deployError && (\n <div className=\"pointer-events-none absolute inset-0 flex items-center justify-center bg-neutral-900/75 opacity-0 transition-opacity duration-150 group-hover/preview:pointer-events-auto group-hover/preview:opacity-100 dark:bg-neutral-950/80\">\n <button\n type=\"button\"\n onClick={(e) => {\n e.stopPropagation();\n void deploy.deploy();\n }}\n onPointerDown={stopCardClick}\n className=\"inline-flex h-9 items-center gap-2 rounded-md border border-violet-400 bg-gradient-to-br from-indigo-500 to-violet-600 px-4 text-xs font-semibold text-white shadow-md transition-[filter] hover:brightness-110\"\n aria-label=\"Start dev server preview\"\n >\n <Play className=\"h-3.5 w-3.5 fill-current\" />\n <span>Start Preview</span>\n </button>\n </div>\n )}\n </div>\n </div>\n\n {/* Row 3: Bottom — just the repository count. All deploy\n controls (Start / Stop / Open) now live on the preview\n slot above so the footer stays quiet. */}\n <div className=\"px-4 pb-4\">\n <span data-testid=\"application-node-repo-count\" className=\"text-muted-foreground text-xs\">\n {repoCountLabel}\n </span>\n </div>\n </div>\n\n {/* Source handle (right in LTR) — always rendered for edge connections */}\n <Handle\n type=\"source\"\n position={sourceHandlePos}\n isConnectable={false}\n className=\"opacity-0!\"\n style={{ top: 70 }}\n />\n </div>\n );\n}\n","'use client';\n\nimport { BaseEdge, getBezierPath } from '@xyflow/react';\nimport type { EdgeProps } from '@xyflow/react';\n\n/**\n * Custom React Flow edge for parent→child feature dependencies.\n * Uses bezier curves and dashed style matching repo→feature edges.\n */\nexport function DependencyEdge(props: EdgeProps) {\n const [edgePath] = getBezierPath({\n sourceX: props.sourceX,\n sourceY: props.sourceY,\n targetX: props.targetX,\n targetY: props.targetY,\n sourcePosition: props.sourcePosition,\n targetPosition: props.targetPosition,\n });\n\n return (\n <BaseEdge\n id={props.id}\n path={edgePath}\n style={{\n strokeDasharray: '5 5',\n }}\n />\n );\n}\n","'use client';\n\nimport { useEffect, useMemo, useRef, useState } from 'react';\nimport { ReactFlow, Background, BackgroundVariant, Panel } from '@xyflow/react';\nimport type { Connection, Edge, NodeChange, OnMoveEnd, Viewport } from '@xyflow/react';\nimport { Plus } from 'lucide-react';\nimport { useTranslation } from 'react-i18next';\nimport { cn } from '@/lib/utils';\nimport { Button } from '@/components/ui/button';\nimport { EmptyState } from '@/components/common/empty-state';\nimport { FeatureNode } from '@/components/common/feature-node';\nimport type { FeatureNodeType, FeatureNodeData } from '@/components/common/feature-node';\nimport { RepositoryNode } from '@/components/common/repository-node';\nimport type { RepositoryNodeType, RepositoryNodeData } from '@/components/common/repository-node';\nimport { ApplicationNode } from '@/components/common/application-node/application-node';\nimport type { ApplicationNodeType } from '@/components/common/application-node/application-node-config';\nimport { DependencyEdge } from './dependency-edge';\n\nexport type CanvasNodeType = FeatureNodeType | RepositoryNodeType | ApplicationNodeType;\n\nexport interface FeaturesCanvasProps {\n nodes: CanvasNodeType[];\n edges: Edge[];\n selectedFeatureId?: string | null;\n selectedRepository?: { id: string | null; path: string | null };\n defaultViewport?: Viewport;\n onNodesChange?: (changes: NodeChange<CanvasNodeType>[]) => void;\n onAddFeature?: () => void;\n onNodeClick?: (event: React.MouseEvent, node: CanvasNodeType) => void;\n onPaneClick?: (event: React.MouseEvent) => void;\n onConnect?: (connection: Connection) => void;\n onCanvasDrag?: () => void;\n onMoveEnd?: OnMoveEnd;\n toolbar?: React.ReactNode;\n emptyState?: React.ReactNode;\n}\n\nconst FALLBACK_VIEWPORT: Viewport = { x: 30, y: 30, zoom: 0.85 };\n\nexport function FeaturesCanvas({\n nodes,\n edges,\n selectedFeatureId,\n selectedRepository,\n defaultViewport,\n onNodesChange,\n onAddFeature,\n onConnect,\n onNodeClick,\n onPaneClick,\n onCanvasDrag,\n onMoveEnd,\n toolbar,\n emptyState,\n}: FeaturesCanvasProps) {\n const { t } = useTranslation('web');\n const nodeTypes = useMemo(\n () => ({\n featureNode: FeatureNode,\n repositoryNode: RepositoryNode,\n applicationNode: ApplicationNode,\n }),\n []\n );\n\n const edgeTypes = useMemo(\n () => ({\n dependencyEdge: DependencyEdge,\n }),\n []\n );\n\n // Callbacks and showHandles are already injected into node.data by deriveGraph.\n // Apply selectedFeatureId and selectedRepository highlighting here.\n const enrichedNodes = useMemo(() => {\n const hasFeatureSel = selectedFeatureId != null;\n const hasRepoSel =\n selectedRepository != null &&\n (selectedRepository.id != null || selectedRepository.path != null);\n if (!hasFeatureSel && !hasRepoSel) return nodes;\n return nodes.map((node) => {\n if (\n hasFeatureSel &&\n node.type === 'featureNode' &&\n (node.data as FeatureNodeData).featureId === selectedFeatureId\n ) {\n return { ...node, selected: true };\n }\n if (hasRepoSel && node.type === 'repositoryNode') {\n const rd = node.data as RepositoryNodeData;\n const matchById =\n selectedRepository!.id != null &&\n (node.id === selectedRepository!.id || rd.id === selectedRepository!.id);\n const matchByPath =\n selectedRepository!.path != null && rd.repositoryPath === selectedRepository!.path;\n if (matchById || matchByPath) return { ...node, selected: true };\n }\n return node;\n }) as CanvasNodeType[];\n }, [nodes, selectedFeatureId, selectedRepository]);\n\n const isEmpty = nodes.length === 0;\n\n // Track empty→populated transition for exit animation.\n // When isEmpty flips from true to false, keep the overlay mounted\n // and fade it out before removing it from the DOM.\n const [showOverlay, setShowOverlay] = useState(isEmpty);\n const [overlayExiting, setOverlayExiting] = useState(false);\n const prevEmptyRef = useRef(isEmpty);\n\n useEffect(() => {\n if (prevEmptyRef.current && !isEmpty) {\n // Was empty, now populated — start exit animation\n setOverlayExiting(true);\n const timer = setTimeout(() => {\n setShowOverlay(false);\n setOverlayExiting(false);\n }, 300);\n prevEmptyRef.current = isEmpty;\n return () => clearTimeout(timer);\n }\n if (!prevEmptyRef.current && isEmpty) {\n // Was populated, now empty — show overlay immediately\n setShowOverlay(true);\n }\n prevEmptyRef.current = isEmpty;\n }, [isEmpty]);\n\n const fallbackEmptyState =\n isEmpty && !emptyState ? (\n <EmptyState\n title={t('canvas.noFeatures')}\n description={t('canvas.noFeaturesDescription')}\n action={\n <Button onClick={onAddFeature}>\n <Plus className=\"me-2 h-4 w-4\" />\n {t('canvas.newFeature')}\n </Button>\n }\n />\n ) : null;\n\n const overlayContent = emptyState ?? fallbackEmptyState;\n\n return (\n <div\n data-testid={isEmpty ? 'features-canvas-empty' : 'features-canvas'}\n data-no-drawer-close\n className=\"dark:bg-background pointer-events-auto relative h-full w-full bg-[#f6f7f8]\"\n >\n <ReactFlow\n nodes={enrichedNodes}\n edges={edges}\n nodeTypes={nodeTypes}\n edgeTypes={edgeTypes}\n onConnect={onConnect}\n onNodesChange={onNodesChange}\n onNodeClick={onNodeClick}\n onPaneClick={onPaneClick}\n onMoveStart={onCanvasDrag}\n onMoveEnd={onMoveEnd}\n defaultViewport={defaultViewport ?? FALLBACK_VIEWPORT}\n nodesDraggable={false}\n nodesConnectable={false}\n elementsSelectable={false}\n proOptions={{ hideAttribution: true }}\n className=\"[&_.react-flow__pane]:!cursor-default\"\n >\n <Background\n variant={BackgroundVariant.Dots}\n gap={24}\n size={1}\n color=\"#b8bcc4\"\n className=\"dark:[&_circle]:!fill-white/[0.1]\"\n />\n {toolbar && !isEmpty ? (\n <Panel position=\"top-right\" className=\"!me-3 !mt-3\">\n {toolbar}\n </Panel>\n ) : null}\n </ReactFlow>\n {showOverlay && overlayContent ? (\n <div\n className={cn(\n 'pointer-events-none absolute inset-0 z-10 flex items-center justify-center transition-opacity duration-300',\n overlayExiting ? 'opacity-0' : 'animate-in fade-in opacity-100 duration-200'\n )}\n >\n <div className=\"pointer-events-auto h-full w-full\">{overlayContent}</div>\n </div>\n ) : null}\n {/* Toolbar rendered above the empty-state overlay so the workspace\n selector remains usable while an empty workspace is shown. */}\n {toolbar && isEmpty ? (\n <div className=\"pointer-events-auto absolute end-3 top-3 z-20\">{toolbar}</div>\n ) : null}\n </div>\n );\n}\n","'use client';\n\nimport { useCallback } from 'react';\nimport { useReactFlow } from '@xyflow/react';\nimport type { Viewport } from '@xyflow/react';\nimport { Eye, EyeOff, ZoomIn, ZoomOut, Maximize, RotateCcw } from 'lucide-react';\nimport { useTranslation } from 'react-i18next';\nimport { cn } from '@/lib/utils';\n\nexport interface CanvasToolbarProps {\n showArchived: boolean;\n onToggleArchived: () => void;\n onResetViewport?: () => Viewport;\n /** Optional slot rendered at the start of the toolbar (e.g. workspace selector). */\n startSlot?: React.ReactNode;\n}\n\nexport function CanvasToolbar({\n showArchived,\n onToggleArchived,\n onResetViewport,\n startSlot,\n}: CanvasToolbarProps) {\n const { t } = useTranslation('web');\n const { zoomIn, zoomOut, fitView, setViewport } = useReactFlow();\n\n const handleZoomIn = useCallback(() => {\n zoomIn({ duration: 200 });\n }, [zoomIn]);\n\n const handleZoomOut = useCallback(() => {\n zoomOut({ duration: 200 });\n }, [zoomOut]);\n\n const handleFitView = useCallback(() => {\n fitView({ duration: 400, padding: 0.3 });\n }, [fitView]);\n\n const handleReset = useCallback(() => {\n if (onResetViewport) {\n const viewport = onResetViewport();\n setViewport(viewport, { duration: 400 });\n }\n }, [onResetViewport, setViewport]);\n\n return (\n <div className=\"bg-background flex items-center gap-1 rounded-xl border px-2 py-1.5 shadow-md dark:bg-neutral-900\">\n {startSlot ? (\n <>\n {startSlot}\n <div className=\"bg-border mx-1 h-5 w-px\" />\n </>\n ) : null}\n {/* View controls */}\n <ToolbarButton\n onClick={onToggleArchived}\n title={showArchived ? t('canvas.hideArchived') : t('canvas.showArchived')}\n active={showArchived}\n label={showArchived ? t('canvas.hideArchivedLabel') : t('canvas.showArchivedLabel')}\n >\n {showArchived ? <Eye className=\"h-4 w-4\" /> : <EyeOff className=\"h-4 w-4\" />}\n </ToolbarButton>\n\n <div className=\"bg-border mx-1 h-5 w-px\" />\n\n {/* Zoom controls */}\n <ToolbarButton onClick={handleZoomOut} title={t('canvas.zoomOut')}>\n <ZoomOut className=\"h-4 w-4\" />\n </ToolbarButton>\n <ToolbarButton onClick={handleZoomIn} title={t('canvas.zoomIn')}>\n <ZoomIn className=\"h-4 w-4\" />\n </ToolbarButton>\n <ToolbarButton onClick={handleFitView} title={t('canvas.fitView')}>\n <Maximize className=\"h-4 w-4\" />\n </ToolbarButton>\n {onResetViewport ? (\n <ToolbarButton onClick={handleReset} title={t('canvas.resetView')}>\n <RotateCcw className=\"h-4 w-4\" />\n </ToolbarButton>\n ) : null}\n </div>\n );\n}\n\n// ── Internal button ──────────────────────────────────────────────────────\n\nfunction ToolbarButton({\n children,\n onClick,\n title,\n label,\n active,\n}: {\n children: React.ReactNode;\n onClick: () => void;\n title: string;\n label?: string;\n active?: boolean;\n}) {\n return (\n <button\n type=\"button\"\n onClick={onClick}\n title={title}\n className={cn(\n 'inline-flex items-center gap-1.5 rounded-lg px-2 py-1.5 text-xs font-medium transition-colors',\n 'hover:bg-accent hover:text-accent-foreground',\n active ? 'text-primary bg-primary/10' : 'text-muted-foreground'\n )}\n >\n {children}\n {label ? <span>{label}</span> : null}\n </button>\n );\n}\n","'use client';\n\n/**\n * Playground prototype: client-side workspaces.\n *\n * ⚠️ PROTOTYPE BOUNDARY — DO NOT IMPORT FROM OUTSIDE THIS PROTOTYPE ⚠️\n *\n * A workspace is a named, explicit allowlist of repositories and features\n * that should appear on the canvas. The \"default\" workspace is special: it\n * always shows everything (its allowlists are ignored).\n *\n * Persistence: localStorage only. There is no backend, no domain model, no\n * use cases, and no infrastructure adapter. Mutation rules (\"default is\n * read-only\", \"default always exists\", rename validation) are enforced\n * inline rather than as domain invariants.\n *\n * This file deliberately violates Clean Architecture by holding domain\n * shape (`Workspace`), application logic (mutations + invariants), and\n * infrastructure concerns (localStorage persistence) inside a React hook.\n * It exists ONLY to validate the workspace UX on the playground branch.\n *\n * Before promoting workspaces to a real feature, replace this file with:\n * - tsp/Workspace.tsp — domain entity\n * - application/ports/output/repositories/\n * workspace.repository.interface.ts — output port\n * - application/use-cases/workspaces/\n * create-workspace.use-case.ts\n * rename-workspace.use-case.ts\n * delete-workspace.use-case.ts\n * set-workspace-members.use-case.ts\n * list-workspaces.use-case.ts\n * set-active-workspace.use-case.ts\n * - infrastructure/repositories/sqlite-workspace.repository.ts\n *\n * Then this hook becomes a thin client wrapper that calls server actions\n * backed by those use cases. Until that refactor lands, the `Workspace`\n * type defined here MUST NOT be imported from any non-prototype code.\n */\n\nimport { useCallback, useEffect, useState } from 'react';\n\nconst STORAGE_KEY = 'shep:workspaces:v1';\nexport const DEFAULT_WORKSPACE_ID = 'default';\nexport const DEFAULT_WORKSPACE_NAME = 'Default';\n\nexport interface Workspace {\n id: string;\n name: string;\n /** Repository node IDs (React Flow node ids, e.g. \"repo-...\"). */\n repoIds: string[];\n /** Feature node IDs (React Flow node ids, e.g. \"feat-...\"). */\n featureIds: string[];\n}\n\ninterface WorkspacesState {\n workspaces: Workspace[];\n activeWorkspaceId: string;\n}\n\nconst INITIAL_STATE: WorkspacesState = {\n workspaces: [\n {\n id: DEFAULT_WORKSPACE_ID,\n name: DEFAULT_WORKSPACE_NAME,\n repoIds: [],\n featureIds: [],\n },\n ],\n activeWorkspaceId: DEFAULT_WORKSPACE_ID,\n};\n\nfunction loadState(): WorkspacesState {\n if (typeof window === 'undefined') return INITIAL_STATE;\n try {\n const raw = window.localStorage.getItem(STORAGE_KEY);\n if (!raw) return INITIAL_STATE;\n const parsed = JSON.parse(raw) as Partial<WorkspacesState>;\n if (!parsed.workspaces || !Array.isArray(parsed.workspaces)) return INITIAL_STATE;\n // Make sure default workspace always exists\n const hasDefault = parsed.workspaces.some((w) => w.id === DEFAULT_WORKSPACE_ID);\n const workspaces = hasDefault\n ? parsed.workspaces\n : [INITIAL_STATE.workspaces[0]!, ...parsed.workspaces];\n return {\n workspaces,\n activeWorkspaceId: parsed.activeWorkspaceId ?? DEFAULT_WORKSPACE_ID,\n };\n } catch {\n return INITIAL_STATE;\n }\n}\n\nfunction saveState(state: WorkspacesState) {\n if (typeof window === 'undefined') return;\n try {\n window.localStorage.setItem(STORAGE_KEY, JSON.stringify(state));\n } catch {\n // localStorage may be unavailable (private mode); ignore.\n }\n}\n\nfunction generateId(): string {\n return `ws-${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 8)}`;\n}\n\nexport interface UseWorkspacesResult {\n workspaces: Workspace[];\n activeWorkspace: Workspace;\n activeWorkspaceId: string;\n isDefaultActive: boolean;\n setActiveWorkspace: (id: string) => void;\n createWorkspace: (name: string) => Workspace;\n renameWorkspace: (id: string, name: string) => void;\n deleteWorkspace: (id: string) => void;\n setWorkspaceMembers: (id: string, members: { repoIds: string[]; featureIds: string[] }) => void;\n toggleRepoInActive: (repoId: string) => void;\n toggleFeatureInActive: (featureId: string) => void;\n /**\n * Append node IDs to the active workspace's allowlists. No-op when the\n * default workspace is active (it shows everything anyway). Idempotent —\n * IDs already present are skipped.\n */\n addToActiveWorkspace: (members: { repoIds?: string[]; featureIds?: string[] }) => void;\n}\n\nexport function useWorkspaces(): UseWorkspacesResult {\n const [state, setState] = useState<WorkspacesState>(INITIAL_STATE);\n\n // Hydrate from localStorage on mount (client-only).\n useEffect(() => {\n setState(loadState());\n }, []);\n\n // Persist whenever state changes (after hydration).\n useEffect(() => {\n saveState(state);\n }, [state]);\n\n const setActiveWorkspace = useCallback((id: string) => {\n setState((prev) => {\n if (!prev.workspaces.some((w) => w.id === id)) return prev;\n return { ...prev, activeWorkspaceId: id };\n });\n }, []);\n\n const createWorkspace = useCallback((name: string): Workspace => {\n const trimmed = name.trim() || 'Untitled workspace';\n const next: Workspace = {\n id: generateId(),\n name: trimmed,\n repoIds: [],\n featureIds: [],\n };\n setState((prev) => ({\n workspaces: [...prev.workspaces, next],\n activeWorkspaceId: next.id,\n }));\n return next;\n }, []);\n\n const renameWorkspace = useCallback((id: string, name: string) => {\n if (id === DEFAULT_WORKSPACE_ID) return;\n const trimmed = name.trim();\n if (!trimmed) return;\n setState((prev) => ({\n ...prev,\n workspaces: prev.workspaces.map((w) => (w.id === id ? { ...w, name: trimmed } : w)),\n }));\n }, []);\n\n const deleteWorkspace = useCallback((id: string) => {\n if (id === DEFAULT_WORKSPACE_ID) return;\n setState((prev) => {\n const workspaces = prev.workspaces.filter((w) => w.id !== id);\n const activeWorkspaceId =\n prev.activeWorkspaceId === id ? DEFAULT_WORKSPACE_ID : prev.activeWorkspaceId;\n return { workspaces, activeWorkspaceId };\n });\n }, []);\n\n const setWorkspaceMembers = useCallback(\n (id: string, members: { repoIds: string[]; featureIds: string[] }) => {\n if (id === DEFAULT_WORKSPACE_ID) return;\n setState((prev) => ({\n ...prev,\n workspaces: prev.workspaces.map((w) =>\n w.id === id\n ? { ...w, repoIds: [...members.repoIds], featureIds: [...members.featureIds] }\n : w\n ),\n }));\n },\n []\n );\n\n const toggleMember = useCallback((kind: 'repo' | 'feature', nodeId: string) => {\n setState((prev) => {\n if (prev.activeWorkspaceId === DEFAULT_WORKSPACE_ID) return prev;\n return {\n ...prev,\n workspaces: prev.workspaces.map((w) => {\n if (w.id !== prev.activeWorkspaceId) return w;\n const list = kind === 'repo' ? w.repoIds : w.featureIds;\n const nextList = list.includes(nodeId)\n ? list.filter((x) => x !== nodeId)\n : [...list, nodeId];\n return kind === 'repo' ? { ...w, repoIds: nextList } : { ...w, featureIds: nextList };\n }),\n };\n });\n }, []);\n\n const toggleRepoInActive = useCallback(\n (repoId: string) => toggleMember('repo', repoId),\n [toggleMember]\n );\n const toggleFeatureInActive = useCallback(\n (featureId: string) => toggleMember('feature', featureId),\n [toggleMember]\n );\n\n const addToActiveWorkspace = useCallback(\n (members: { repoIds?: string[]; featureIds?: string[] }) => {\n const incomingRepos = members.repoIds ?? [];\n const incomingFeatures = members.featureIds ?? [];\n if (incomingRepos.length === 0 && incomingFeatures.length === 0) return;\n\n setState((prev) => {\n if (prev.activeWorkspaceId === DEFAULT_WORKSPACE_ID) return prev;\n return {\n ...prev,\n workspaces: prev.workspaces.map((w) => {\n if (w.id !== prev.activeWorkspaceId) return w;\n const repoSet = new Set(w.repoIds);\n for (const id of incomingRepos) repoSet.add(id);\n const featureSet = new Set(w.featureIds);\n for (const id of incomingFeatures) featureSet.add(id);\n // Bail out if nothing actually changed — keeps referential equality\n // so downstream effects don't re-fire.\n if (repoSet.size === w.repoIds.length && featureSet.size === w.featureIds.length) {\n return w;\n }\n return {\n ...w,\n repoIds: Array.from(repoSet),\n featureIds: Array.from(featureSet),\n };\n }),\n };\n });\n },\n []\n );\n\n const activeWorkspace =\n state.workspaces.find((w) => w.id === state.activeWorkspaceId) ?? state.workspaces[0]!;\n\n return {\n workspaces: state.workspaces,\n activeWorkspace,\n activeWorkspaceId: state.activeWorkspaceId,\n isDefaultActive: state.activeWorkspaceId === DEFAULT_WORKSPACE_ID,\n setActiveWorkspace,\n createWorkspace,\n renameWorkspace,\n deleteWorkspace,\n setWorkspaceMembers,\n toggleRepoInActive,\n toggleFeatureInActive,\n addToActiveWorkspace,\n };\n}\n","'use client';\n\nimport { useState } from 'react';\nimport { Layers, Check, Plus, Pencil, Trash2, SlidersHorizontal } from 'lucide-react';\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuLabel,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n} from '@/components/ui/dropdown-menu';\nimport { cn } from '@/lib/utils';\nimport {\n DEFAULT_WORKSPACE_ID,\n type UseWorkspacesResult,\n type Workspace,\n} from '@/hooks/use-workspaces';\n\nexport interface WorkspaceSelectorProps {\n workspaces: UseWorkspacesResult['workspaces'];\n activeWorkspace: Workspace;\n onSelect: (id: string) => void;\n onRequestCreate: () => void;\n onRequestRename: () => void;\n /** Request deletion of a specific workspace by id. */\n onRequestDelete: (id: string) => void;\n onManage: () => void;\n}\n\nexport function WorkspaceSelector({\n workspaces,\n activeWorkspace,\n onSelect,\n onRequestCreate,\n onRequestRename,\n onRequestDelete,\n onManage,\n}: WorkspaceSelectorProps) {\n const [open, setOpen] = useState(false);\n const isDefault = activeWorkspace.id === DEFAULT_WORKSPACE_ID;\n\n return (\n <DropdownMenu open={open} onOpenChange={setOpen}>\n <DropdownMenuTrigger asChild>\n <button\n type=\"button\"\n data-testid=\"workspace-selector-trigger\"\n className={cn(\n 'inline-flex items-center gap-1.5 rounded-lg px-2 py-1.5 text-xs font-medium transition-colors',\n 'hover:bg-accent hover:text-accent-foreground',\n isDefault ? 'text-muted-foreground' : 'text-primary bg-primary/10'\n )}\n title=\"Workspace\"\n >\n <Layers className=\"h-4 w-4\" />\n <span className=\"max-w-[120px] truncate\">{activeWorkspace.name}</span>\n </button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"start\" className=\"min-w-[220px]\">\n <DropdownMenuLabel>Workspaces</DropdownMenuLabel>\n <DropdownMenuSeparator />\n {workspaces.map((w) => {\n const active = w.id === activeWorkspace.id;\n const canDelete = w.id !== DEFAULT_WORKSPACE_ID;\n return (\n <DropdownMenuItem\n key={w.id}\n onSelect={() => onSelect(w.id)}\n className=\"group/ws-row flex items-center justify-between gap-2\"\n >\n <span className=\"truncate\">{w.name}</span>\n <span className=\"flex shrink-0 items-center gap-1\">\n {active ? <Check className=\"h-3.5 w-3.5\" /> : null}\n {canDelete ? (\n <button\n type=\"button\"\n aria-label={`Delete workspace ${w.name}`}\n title={`Delete workspace ${w.name}`}\n onClick={(event) => {\n event.preventDefault();\n event.stopPropagation();\n setOpen(false);\n onRequestDelete(w.id);\n }}\n className=\"text-muted-foreground hover:bg-destructive/10 hover:text-destructive rounded p-0.5 opacity-0 transition-opacity group-hover/ws-row:opacity-100 focus-visible:opacity-100\"\n >\n <Trash2 className=\"h-3.5 w-3.5\" />\n </button>\n ) : null}\n </span>\n </DropdownMenuItem>\n );\n })}\n <DropdownMenuSeparator />\n <DropdownMenuItem onSelect={onRequestCreate}>\n <Plus className=\"mr-2 h-3.5 w-3.5\" />\n New workspace…\n </DropdownMenuItem>\n <DropdownMenuItem onSelect={onManage} disabled={isDefault}>\n <SlidersHorizontal className=\"mr-2 h-3.5 w-3.5\" />\n Manage items…\n </DropdownMenuItem>\n <DropdownMenuItem onSelect={onRequestRename} disabled={isDefault}>\n <Pencil className=\"mr-2 h-3.5 w-3.5\" />\n Rename\n </DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n );\n}\n","'use client';\n\nimport { useEffect, useMemo, useState } from 'react';\nimport { GitBranch, Sparkles } from 'lucide-react';\nimport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n} from '@/components/ui/dialog';\nimport { Checkbox } from '@/components/ui/checkbox';\nimport { Button } from '@/components/ui/button';\nimport type { CanvasNodeType } from '@/components/features/features-canvas';\nimport type { RepositoryNodeData } from '@/components/common/repository-node';\nimport type { FeatureNodeData } from '@/components/common/feature-node';\nimport type { Workspace } from '@/hooks/use-workspaces';\n\nexport interface ManageWorkspaceDialogProps {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n workspace: Workspace;\n /** All nodes currently on the canvas (unfiltered). */\n allNodes: CanvasNodeType[];\n onSave: (members: { repoIds: string[]; featureIds: string[] }) => void;\n}\n\ninterface RepoEntry {\n nodeId: string;\n name: string;\n features: { nodeId: string; name: string }[];\n}\n\nexport function ManageWorkspaceDialog({\n open,\n onOpenChange,\n workspace,\n allNodes,\n onSave,\n}: ManageWorkspaceDialogProps) {\n const [selectedRepoIds, setSelectedRepoIds] = useState<Set<string>>(new Set());\n const [selectedFeatureIds, setSelectedFeatureIds] = useState<Set<string>>(new Set());\n\n // Reset selection state whenever the dialog opens for a (possibly different) workspace.\n useEffect(() => {\n if (open) {\n setSelectedRepoIds(new Set(workspace.repoIds));\n setSelectedFeatureIds(new Set(workspace.featureIds));\n }\n }, [open, workspace]);\n\n // Group features under their parent repo by repositoryPath.\n const repoEntries = useMemo<RepoEntry[]>(() => {\n const repos: RepoEntry[] = [];\n const byPath = new Map<string, RepoEntry>();\n\n for (const node of allNodes) {\n if (node.type !== 'repositoryNode') continue;\n const data = node.data as RepositoryNodeData;\n const path = data.repositoryPath ?? '';\n const entry: RepoEntry = {\n nodeId: node.id,\n name: data.name ?? path.split('/').filter(Boolean).pop() ?? path,\n features: [],\n };\n repos.push(entry);\n byPath.set(path, entry);\n }\n\n for (const node of allNodes) {\n if (node.type !== 'featureNode') continue;\n const data = node.data as FeatureNodeData;\n const repo = byPath.get(data.repositoryPath ?? '');\n if (repo) {\n repo.features.push({ nodeId: node.id, name: data.name });\n }\n }\n\n return repos;\n }, [allNodes]);\n\n const toggleRepo = (id: string) => {\n setSelectedRepoIds((prev) => {\n const next = new Set(prev);\n if (next.has(id)) next.delete(id);\n else next.add(id);\n return next;\n });\n };\n\n const toggleFeature = (id: string) => {\n setSelectedFeatureIds((prev) => {\n const next = new Set(prev);\n if (next.has(id)) next.delete(id);\n else next.add(id);\n return next;\n });\n };\n\n const handleSave = () => {\n onSave({\n repoIds: Array.from(selectedRepoIds),\n featureIds: Array.from(selectedFeatureIds),\n });\n onOpenChange(false);\n };\n\n return (\n <Dialog open={open} onOpenChange={onOpenChange}>\n <DialogContent className=\"max-h-[80vh] max-w-lg overflow-hidden\">\n <DialogHeader>\n <DialogTitle>Manage workspace: {workspace.name}</DialogTitle>\n <DialogDescription>\n Select the repositories and features that should appear on this workspace's canvas.\n </DialogDescription>\n </DialogHeader>\n\n <div className=\"-mx-6 max-h-[50vh] overflow-y-auto px-6\">\n {repoEntries.length === 0 ? (\n <p className=\"text-muted-foreground py-8 text-center text-sm\">\n No repositories on the canvas yet.\n </p>\n ) : (\n <ul className=\"space-y-3 py-2\">\n {repoEntries.map((repo) => (\n <li key={repo.nodeId}>\n <label className=\"hover:bg-accent/30 flex cursor-pointer items-center gap-2 rounded-md px-2 py-1.5\">\n <Checkbox\n checked={selectedRepoIds.has(repo.nodeId)}\n onCheckedChange={() => toggleRepo(repo.nodeId)}\n />\n <GitBranch className=\"text-muted-foreground h-4 w-4\" />\n <span className=\"text-sm font-medium\">{repo.name}</span>\n </label>\n {repo.features.length > 0 ? (\n <ul className=\"mt-1 ml-7 space-y-0.5\">\n {repo.features.map((feat) => (\n <li key={feat.nodeId}>\n <label className=\"hover:bg-accent/30 flex cursor-pointer items-center gap-2 rounded-md px-2 py-1\">\n <Checkbox\n checked={selectedFeatureIds.has(feat.nodeId)}\n onCheckedChange={() => toggleFeature(feat.nodeId)}\n />\n <Sparkles className=\"text-muted-foreground h-3.5 w-3.5\" />\n <span className=\"text-muted-foreground text-xs\">{feat.name}</span>\n </label>\n </li>\n ))}\n </ul>\n ) : null}\n </li>\n ))}\n </ul>\n )}\n </div>\n\n <DialogFooter>\n <Button variant=\"ghost\" onClick={() => onOpenChange(false)}>\n Cancel\n </Button>\n <Button onClick={handleSave}>Save</Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n );\n}\n","'use client';\n\nimport { useEffect, useState } from 'react';\nimport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n} from '@/components/ui/dialog';\nimport { Input } from '@/components/ui/input';\nimport { Button } from '@/components/ui/button';\n\nexport interface WorkspaceNameDialogProps {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n title: string;\n description?: string;\n initialValue?: string;\n confirmLabel: string;\n onConfirm: (name: string) => void;\n}\n\nexport function WorkspaceNameDialog({\n open,\n onOpenChange,\n title,\n description,\n initialValue = '',\n confirmLabel,\n onConfirm,\n}: WorkspaceNameDialogProps) {\n const [value, setValue] = useState(initialValue);\n\n useEffect(() => {\n if (open) setValue(initialValue);\n }, [open, initialValue]);\n\n const handleSubmit = (e: React.FormEvent<HTMLFormElement>) => {\n e.preventDefault();\n const trimmed = value.trim();\n if (!trimmed) return;\n onConfirm(trimmed);\n onOpenChange(false);\n };\n\n return (\n <Dialog open={open} onOpenChange={onOpenChange}>\n <DialogContent className=\"max-w-sm\">\n <form onSubmit={handleSubmit}>\n <DialogHeader>\n <DialogTitle>{title}</DialogTitle>\n {description ? <DialogDescription>{description}</DialogDescription> : null}\n </DialogHeader>\n <div className=\"py-4\">\n <Input\n autoFocus\n value={value}\n onChange={(e) => setValue(e.target.value)}\n placeholder=\"Workspace name\"\n data-testid=\"workspace-name-input\"\n />\n </div>\n <DialogFooter>\n <Button type=\"button\" variant=\"ghost\" onClick={() => onOpenChange(false)}>\n Cancel\n </Button>\n <Button type=\"submit\" disabled={!value.trim()}>\n {confirmLabel}\n </Button>\n </DialogFooter>\n </form>\n </DialogContent>\n </Dialog>\n );\n}\n","'use client';\n\nimport React, { useEffect, useState } from 'react';\nimport { Plus, Loader2, X } from 'lucide-react';\nimport { useTranslation } from 'react-i18next';\nimport { cn } from '@/lib/utils';\nimport { Button } from '@/components/ui/button';\n\nexport interface FloatingActionButtonAction {\n /** Unique key for the action. */\n id: string;\n /** Accessible label shown next to the icon. */\n label: string;\n /** Lucide icon component. */\n icon: React.ReactNode;\n /** Called when the action is clicked. */\n onClick: () => void;\n /** Whether the action is currently loading. */\n loading?: boolean;\n /** Whether the action is disabled. */\n disabled?: boolean;\n}\n\nexport interface FloatingActionButtonProps {\n /** Action items shown when the FAB is expanded. */\n actions: FloatingActionButtonAction[];\n /** Additional CSS classes for the wrapper. */\n className?: string;\n /** Inline styles for the wrapper (e.g. dynamic positioning). */\n style?: React.CSSProperties;\n}\n\n/** Stagger delay between each item animation in ms. */\nconst STAGGER_MS = 50;\n\n/** Total animation duration in ms. */\nconst DURATION_MS = 250;\n\n/**\n * (+) FAB with expandable action menu.\n * Renders inline — parent controls positioning.\n */\nexport function FloatingActionButton({ actions, className, style }: FloatingActionButtonProps) {\n const { t } = useTranslation('web');\n const [open, setOpen] = useState(false);\n\n // Close on Escape key\n useEffect(() => {\n if (!open) return;\n function handleKeyDown(e: KeyboardEvent) {\n if (e.key === 'Escape') {\n setOpen(false);\n }\n }\n document.addEventListener('keydown', handleKeyDown);\n return () => document.removeEventListener('keydown', handleKeyDown);\n }, [open]);\n\n return (\n <>\n {/* Invisible click-outside catcher */}\n {open ? (\n <div\n data-testid=\"fab-overlay\"\n className=\"fixed inset-0 z-40\"\n onClick={() => setOpen(false)}\n aria-hidden=\"true\"\n />\n ) : null}\n\n <div\n data-testid=\"floating-action-button\"\n className={cn('relative z-50', className)}\n style={style}\n >\n {/* Action chips — expand upward */}\n <div\n className={cn(\n 'absolute start-0 bottom-[calc(100%+24px)] flex flex-col items-start gap-2',\n !open && 'pointer-events-none'\n )}\n data-testid=\"fab-actions\"\n >\n {actions.map((action, i) => {\n const openDelay = (actions.length - 1 - i) * STAGGER_MS;\n\n return (\n <button\n key={action.id}\n data-testid={`fab-action-${action.id}`}\n aria-label={action.label}\n disabled={action.disabled ?? action.loading}\n className={cn(\n 'flex h-10 items-center gap-2.5 rounded-full px-4',\n 'bg-background text-foreground shadow-md',\n 'border-border border',\n 'hover:bg-accent hover:text-accent-foreground',\n 'disabled:pointer-events-none disabled:opacity-50',\n 'text-sm font-medium whitespace-nowrap',\n open ? 'translate-y-0 opacity-100' : 'pointer-events-none translate-y-0 opacity-0'\n )}\n style={{\n transition: `opacity ${open ? DURATION_MS : 120}ms ease-out ${open ? openDelay : 0}ms, transform ${open ? DURATION_MS : 120}ms ease-out ${open ? openDelay : 0}ms`,\n }}\n onClick={() => {\n action.onClick();\n setOpen(false);\n }}\n >\n <span className=\"flex h-5 w-5 shrink-0 items-center justify-center\">\n {action.loading ? <Loader2 className=\"h-4 w-4 animate-spin\" /> : action.icon}\n </span>\n <span>{action.label}</span>\n </button>\n );\n })}\n </div>\n\n {/* FAB trigger */}\n <Button\n size=\"icon\"\n data-testid=\"fab-trigger\"\n aria-label={open ? t('fab.closeActions') : t('fab.createNew')}\n className={cn(\n 'relative h-14 w-14 rounded-full shadow-lg',\n 'bg-indigo-500 text-white hover:bg-indigo-400 dark:bg-indigo-500 dark:hover:bg-indigo-400',\n 'transition-all duration-200 hover:scale-105 hover:shadow-xl active:scale-95'\n )}\n onClick={() => setOpen((prev) => !prev)}\n >\n <Plus\n className={cn(\n 'absolute h-7 w-7 stroke-[2.5] transition-all',\n open ? 'scale-0 rotate-90 opacity-0' : 'scale-100 rotate-0 opacity-100'\n )}\n style={{ transitionDuration: `${DURATION_MS}ms` }}\n />\n <X\n className={cn(\n 'absolute h-6 w-6 stroke-[2.5] transition-all',\n open ? 'scale-100 rotate-0 opacity-100' : 'scale-0 -rotate-90 opacity-0'\n )}\n style={{ transitionDuration: `${DURATION_MS}ms` }}\n />\n </Button>\n </div>\n </>\n );\n}\n","'use client';\n\nimport { usePathname } from 'next/navigation';\n\n/**\n * Extracts the selected feature ID from the current URL path.\n * Returns `null` when no feature drawer route is active.\n */\nexport function useSelectedFeatureId(): string | null {\n const pathname = usePathname();\n const match = pathname.match(/^\\/feature\\/([^/]+)/);\n return match?.[1] ?? null;\n}\n","'use client';\n\nimport { usePathname, useSearchParams } from 'next/navigation';\n\n/**\n * Extracts the selected repository context from the current URL.\n * Returns `{ id, path }` — either or both may be set depending on the route.\n *\n * Matches:\n * - `/repository/<id>` → id is set\n * - `/create?repo=<path>` → path is set\n */\nexport function useSelectedRepository(): { id: string | null; path: string | null } {\n const pathname = usePathname();\n const searchParams = useSearchParams();\n\n const repoIdMatch = pathname.match(/^\\/repository\\/([^/]+)/);\n const id = repoIdMatch?.[1] ?? null;\n\n const isCreate = pathname.startsWith('/create');\n const path = isCreate ? searchParams.get('repo') : null;\n\n return { id, path };\n}\n","'use client';\n\nimport { useCallback, useEffect, useRef } from 'react';\nimport type { Viewport } from '@xyflow/react';\n\nexport type { Viewport } from '@xyflow/react';\n\nexport const STORAGE_KEY = 'shep-canvas-viewport';\nexport const DEBOUNCE_MS = 500;\n\nexport const DEFAULT_VIEWPORT: Viewport = { x: 30, y: 30, zoom: 0.85 };\n\nexport interface UseViewportPersistenceResult {\n defaultViewport: Viewport;\n onMoveEnd: (viewport: Viewport) => void;\n resetViewport: () => Viewport;\n}\n\nfunction isValidViewport(value: unknown): value is Viewport {\n if (value == null || typeof value !== 'object' || Array.isArray(value)) {\n return false;\n }\n const v = value as Record<string, unknown>;\n return (\n typeof v.x === 'number' &&\n typeof v.y === 'number' &&\n typeof v.zoom === 'number' &&\n Number.isFinite(v.x) &&\n Number.isFinite(v.y) &&\n Number.isFinite(v.zoom) &&\n v.zoom > 0\n );\n}\n\nfunction readViewport(): Viewport {\n try {\n const raw = localStorage.getItem(STORAGE_KEY);\n if (raw == null) return DEFAULT_VIEWPORT;\n const parsed: unknown = JSON.parse(raw);\n return isValidViewport(parsed) ? parsed : DEFAULT_VIEWPORT;\n } catch {\n return DEFAULT_VIEWPORT;\n }\n}\n\nexport function useViewportPersistence(): UseViewportPersistenceResult {\n const defaultViewport = useRef<Viewport>(readViewport()).current;\n const timerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n useEffect(() => {\n return () => {\n if (timerRef.current != null) {\n clearTimeout(timerRef.current);\n }\n };\n }, []);\n\n const onMoveEnd = useCallback((viewport: Viewport) => {\n if (timerRef.current != null) {\n clearTimeout(timerRef.current);\n }\n timerRef.current = setTimeout(() => {\n try {\n localStorage.setItem(STORAGE_KEY, JSON.stringify(viewport));\n } catch {\n // Silently ignore localStorage errors (quota exceeded, private browsing, etc.)\n }\n }, DEBOUNCE_MS);\n }, []);\n\n const resetViewport = useCallback((): Viewport => {\n try {\n localStorage.removeItem(STORAGE_KEY);\n } catch {\n // Silently ignore localStorage errors\n }\n return DEFAULT_VIEWPORT;\n }, []);\n\n return { defaultViewport, onMoveEnd, resetViewport };\n}\n","/* __next_internal_action_entry_do_not_use__ [{\"403fbb28c13795acda94d00d80fca36290fbb3d9c4\":\"createProjectAndFeature\"},\"src/presentation/web/app/actions/create-project-and-feature.ts\",\"\"] */\"use turbopack no side effects\";import{createServerReference,callServer,findSourceMapURL}from\"private-next-rsc-action-client-wrapper\";const $$RSC_SERVER_ACTION_0=/*#__PURE__*/createServerReference(\"403fbb28c13795acda94d00d80fca36290fbb3d9c4\",callServer,void 0,findSourceMapURL,\"createProjectAndFeature\");export{$$RSC_SERVER_ACTION_0 as createProjectAndFeature};","'use client';\n\nimport type { ReactNode } from 'react';\nimport { ReactFlowProvider } from '@xyflow/react';\nimport type { Edge } from '@xyflow/react';\nimport type { CanvasNodeType } from '@/components/features/features-canvas';\nimport { SessionsProvider } from '@/hooks/sessions-provider';\nimport { ControlCenterInner } from './control-center-inner';\n\nexport interface ControlCenterProps {\n initialNodes: CanvasNodeType[];\n initialEdges: Edge[];\n /** Drawer content rendered by the @drawer parallel route slot. */\n drawer?: ReactNode;\n}\n\nexport function ControlCenter({ initialNodes, initialEdges, drawer }: ControlCenterProps) {\n return (\n <div data-testid=\"control-center\" className=\"h-full w-full\">\n <SessionsProvider>\n <ReactFlowProvider>\n <ControlCenterInner initialNodes={initialNodes} initialEdges={initialEdges} />\n </ReactFlowProvider>\n </SessionsProvider>\n <div key=\"drawer\">{drawer}</div>\n </div>\n );\n}\n","/* __next_internal_action_entry_do_not_use__ [{\"40b9d57439db23ee8fffe27f9307cddf7e203b1f95\":\"createApplication\"},\"src/presentation/web/app/actions/create-application.ts\",\"\"] */\"use turbopack no side effects\";import{createServerReference,callServer,findSourceMapURL}from\"private-next-rsc-action-client-wrapper\";const $$RSC_SERVER_ACTION_0=/*#__PURE__*/createServerReference(\"40b9d57439db23ee8fffe27f9307cddf7e203b1f95\",callServer,void 0,findSourceMapURL,\"createApplication\");export{$$RSC_SERVER_ACTION_0 as createApplication};","'use client';\n\nimport { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport { useRouter, usePathname } from 'next/navigation';\nimport { FolderPlus } from 'lucide-react';\nimport type { Edge, Viewport } from '@xyflow/react';\nimport { useReactFlow } from '@xyflow/react';\nimport { FeaturesCanvas } from '@/components/features/features-canvas';\nimport { CanvasToolbar } from '@/components/features/features-canvas/canvas-toolbar';\nimport { WorkspaceSelector } from '@/components/features/features-canvas/workspace-selector';\nimport { ManageWorkspaceDialog } from '@/components/features/features-canvas/manage-workspace-dialog';\nimport { WorkspaceNameDialog } from '@/components/features/features-canvas/workspace-name-dialog';\nimport {\n AlertDialog,\n AlertDialogAction,\n AlertDialogCancel,\n AlertDialogContent,\n AlertDialogDescription,\n AlertDialogFooter,\n AlertDialogHeader,\n AlertDialogTitle,\n} from '@/components/ui/alert-dialog';\nimport { useWorkspaces, DEFAULT_WORKSPACE_ID } from '@/hooks/use-workspaces';\nimport { Layers, Plus } from 'lucide-react';\nimport { Button } from '@/components/ui/button';\nimport type { CanvasNodeType } from '@/components/features/features-canvas';\nimport type { FeatureNodeData } from '@/components/common/feature-node';\nimport type { RepositoryNodeData } from '@/components/common/repository-node';\nimport {\n FloatingActionButton,\n type FloatingActionButtonAction,\n} from '@/components/common/floating-action-button';\nimport {\n useSidebarFeaturesContext,\n mapNodeStateToSidebarStatus,\n} from '@/hooks/sidebar-features-context';\nimport { useTranslation } from 'react-i18next';\nimport { useFeatureFlags } from '@/hooks/feature-flags-context';\n\nimport { useSelectedFeatureId } from '@/hooks/use-selected-feature-id';\nimport { useSelectedRepository } from '@/hooks/use-selected-repository';\nimport { useSoundAction } from '@/hooks/use-sound-action';\nimport { useDrawerCloseGuard } from '@/hooks/drawer-close-guard';\nimport { useViewportPersistence } from '@/hooks/use-viewport-persistence';\nimport { useSidebar } from '@/components/ui/sidebar';\nimport { useFabLayout } from '@/hooks/fab-layout-context';\nimport { ControlCenterEmptyState } from './control-center-empty-state';\nimport { NewProjectDialog } from './new-project-dialog';\nimport { useControlCenterState } from './use-control-center-state';\nimport { useCanvasEventListeners } from './use-canvas-event-listeners';\nimport { useWorkspaceFitView } from './use-workspace-fit-view';\nimport { useFabActions } from './use-fab-actions';\n\nconst AUTO_FOCUS_OPTIONS = {\n maxZoom: 1.0,\n padding: 0.5,\n duration: 500,\n} as const;\n\nconst AUTO_FOCUS_DRAWER_DELAY_MS = 600;\n\ninterface ControlCenterInnerProps {\n initialNodes: CanvasNodeType[];\n initialEdges: Edge[];\n}\n\nexport function ControlCenterInner({ initialNodes, initialEdges }: ControlCenterInnerProps) {\n const router = useRouter();\n const pathname = usePathname();\n const selectedFeatureId = useSelectedFeatureId();\n const selectedRepository = useSelectedRepository();\n const clickSound = useSoundAction('click');\n const { guardedNavigate } = useDrawerCloseGuard();\n const { fitView } = useReactFlow();\n const drawerTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n const {\n defaultViewport,\n onMoveEnd: handleViewportChange,\n resetViewport,\n } = useViewportPersistence();\n\n const {\n nodes,\n edges,\n onNodesChange,\n handleConnect,\n handleAddRepository,\n handleArchiveFeature,\n handleDeleteFeature,\n handleRetryFeature,\n handleStartFeature,\n handleStopFeature,\n handleUnarchiveFeature,\n handleDeleteRepository,\n handleDeleteApplication,\n createFeatureNode,\n showArchived,\n setShowArchived,\n setCallbacks,\n } = useControlCenterState(initialNodes, initialEdges);\n\n // ── Workspaces (client-only prototype) ────────────────────────────────\n const {\n workspaces,\n activeWorkspace,\n isDefaultActive,\n setActiveWorkspace,\n createWorkspace,\n renameWorkspace,\n deleteWorkspace,\n setWorkspaceMembers,\n addToActiveWorkspace,\n } = useWorkspaces();\n // Tracks the set of node ids we've already seen, so we can detect new\n // repo/feature nodes appearing on the canvas and auto-include them in the\n // active workspace (when it isn't the default).\n const knownNodeIdsRef = useRef<Set<string>>(new Set());\n const [manageWorkspaceOpen, setManageWorkspaceOpen] = useState(false);\n const [createWorkspaceOpen, setCreateWorkspaceOpen] = useState(false);\n const [renameWorkspaceOpen, setRenameWorkspaceOpen] = useState(false);\n const [deleteWorkspaceOpen, setDeleteWorkspaceOpen] = useState(false);\n // Target of the delete confirmation dialog. Allows deleting any workspace\n // (not just the active one) directly from the workspace dropdown.\n const [pendingDeleteWorkspaceId, setPendingDeleteWorkspaceId] = useState<string | null>(null);\n // Inline \"New Project\" dialog launched from the empty-workspace state.\n const [workspaceNewProjectOpen, setWorkspaceNewProjectOpen] = useState(false);\n\n // Publish sidebar features + repo state to context\n const { setFeatures: setSidebarFeatures, setHasRepositories: setSidebarHasRepos } =\n useSidebarFeaturesContext();\n\n const featureNodes = useMemo(() => nodes.filter((n) => n.type === 'featureNode'), [nodes]);\n\n const sidebarKey = useMemo(() => {\n return featureNodes\n .map((n) => {\n const d = n.data as FeatureNodeData;\n return `${d.featureId}:${d.state}:${d.name}:${d.repositoryPath}`;\n })\n .sort()\n .join(',');\n }, [featureNodes]);\n\n useEffect(() => {\n const sidebarItems = featureNodes\n .map((n) => {\n const d = n.data as FeatureNodeData;\n const status = mapNodeStateToSidebarStatus(d.state);\n if (!status) return null;\n const repoPath = d.repositoryPath ?? '';\n return {\n featureId: d.featureId,\n name: d.name,\n status,\n repositoryPath: repoPath,\n repositoryName: d.repositoryName ?? repoPath.split('/').filter(Boolean).pop() ?? repoPath,\n ...(d.startedAt != null && { startedAt: d.startedAt }),\n ...(d.runtime != null && { duration: d.runtime }),\n ...(d.agentType && { agentType: d.agentType }),\n ...(d.modelId && { modelId: d.modelId }),\n };\n })\n .filter(Boolean) as {\n featureId: string;\n name: string;\n status: 'action-needed' | 'in-progress' | 'done';\n repositoryPath: string;\n repositoryName: string;\n startedAt?: number;\n duration?: string;\n agentType?: string;\n modelId?: string;\n }[];\n\n setSidebarFeatures(sidebarItems);\n }, [sidebarKey, featureNodes, setSidebarFeatures]);\n\n // ── URL-based navigation handlers ────────────────────────────────────\n\n const handleApplicationClick = useCallback(\n (applicationId: string) => {\n guardedNavigate(() => router.push(`/application/${applicationId}`));\n },\n [router, guardedNavigate]\n );\n\n const handleNodeClick = useCallback(\n (event: React.MouseEvent, node: CanvasNodeType) => {\n if (node.type === 'featureNode') {\n const data = node.data as FeatureNodeData;\n if (data.state === 'creating' || data.state === 'deleting') return;\n // Only navigate when the click lands on the card itself, not on\n // overlay buttons (delete, add) or pointer events leaking from dialogs.\n const target = event.target as HTMLElement;\n if (!target.closest('[data-testid=\"feature-node-card\"]')) return;\n guardedNavigate(() => {\n clickSound.play();\n router.push(`/feature/${data.featureId}`);\n });\n }\n },\n [router, clickSound, guardedNavigate]\n );\n\n const handleAddFeature = useCallback(() => {\n clickSound.play();\n router.push('/create');\n }, [router, clickSound]);\n\n const handleAddFeatureToRepo = useCallback(\n (repoNodeId: string) => {\n clickSound.play();\n const node = nodes.find((n) => n.id === repoNodeId);\n const repoPath = (node?.data as { repositoryPath?: string } | undefined)?.repositoryPath;\n if (repoPath) {\n router.push(`/create?repo=${encodeURIComponent(repoPath)}`);\n } else {\n router.push('/create');\n }\n },\n [nodes, router, clickSound]\n );\n\n const handleAddFeatureToFeature = useCallback(\n (featureNodeId: string) => {\n const featureId = featureNodeId.startsWith('feat-') ? featureNodeId.slice(5) : featureNodeId;\n // Find the repo node that owns this feature\n const repoEdge = edges.find((e) => e.target === featureNodeId);\n const repoNode = repoEdge ? nodes.find((n) => n.id === repoEdge.source) : null;\n const repoPath = (repoNode?.data as { repositoryPath?: string } | undefined)?.repositoryPath;\n\n clickSound.play();\n const params = new URLSearchParams();\n if (repoPath) params.set('repo', repoPath);\n params.set('parent', featureId);\n router.push(`/create?${params.toString()}`);\n },\n [nodes, edges, router, clickSound]\n );\n\n const handleRepositoryClick = useCallback(\n (nodeId: string) => {\n const node = nodes.find((n) => n.id === nodeId);\n if (node?.type === 'repositoryNode') {\n const data = node.data as RepositoryNodeData;\n if (data.id) {\n guardedNavigate(() => router.push(`/repository/${data.id}`));\n }\n }\n },\n [nodes, router, guardedNavigate]\n );\n\n // Close all drawers — navigate back to root\n const handleClearDrawers = useCallback(() => {\n if (pathname !== '/') {\n guardedNavigate(() => router.push('/'));\n }\n }, [router, pathname, guardedNavigate]);\n\n // Shared: after adding first repo, center canvas and open create drawer\n const focusAndOpenDrawer = useCallback(\n (repoPath: string) => {\n // Wait for next render so the repo node exists in the DOM\n setTimeout(() => {\n fitView(AUTO_FOCUS_OPTIONS);\n\n // Open the create-feature drawer after the fitView animation completes\n drawerTimerRef.current = setTimeout(() => {\n guardedNavigate(() => router.push(`/create?repo=${encodeURIComponent(repoPath)}`));\n }, AUTO_FOCUS_DRAWER_DELAY_MS);\n }, 0);\n },\n [fitView, guardedNavigate, router]\n );\n\n // Smoothly pan/zoom to a specific node after it appears on canvas\n const focusOnNode = useCallback(\n (nodeId: string) => {\n // Wait for next render so the node exists in the DOM\n setTimeout(() => {\n fitView({\n nodes: [{ id: nodeId }],\n maxZoom: 1.0,\n padding: 0.4,\n duration: 600,\n });\n }, 0);\n },\n [fitView]\n );\n\n // Wrapper: add repo + auto-focus on the new node\n const addRepoAndFocus = useCallback(\n (path: string) => {\n const { wasEmpty, repoPath, tempNodeId } = handleAddRepository(path);\n if (wasEmpty) {\n focusAndOpenDrawer(repoPath);\n } else {\n focusOnNode(tempNodeId);\n }\n },\n [handleAddRepository, focusAndOpenDrawer, focusOnNode]\n );\n\n // All five window-level CustomEvent listeners (add-repository, feature-\n // created, delete/archive/unarchive requests) live in this hook so the\n // parent component stays focused on graph state + rendering.\n useCanvasEventListeners({\n addRepoAndFocus,\n createFeatureNode,\n nodes,\n handleDeleteFeature,\n handleArchiveFeature,\n handleUnarchiveFeature,\n });\n\n // Cleanup the drawer timer on unmount. Used to live inside the inlined\n // shep:add-repository listener; now standalone since the listener moved.\n useEffect(() => {\n return () => {\n if (drawerTimerRef.current != null) {\n clearTimeout(drawerTimerRef.current);\n }\n };\n }, []);\n\n // Wire callbacks into derived node data (via ref — no re-render).\n useEffect(() => {\n setCallbacks({\n onNodeAction: handleAddFeatureToFeature,\n onFeatureDelete: handleDeleteFeature,\n onRetryFeature: handleRetryFeature,\n onStartFeature: handleStartFeature,\n onStopFeature: handleStopFeature,\n onArchiveFeature: handleArchiveFeature,\n onUnarchiveFeature: handleUnarchiveFeature,\n onRepositoryAdd: handleAddFeatureToRepo,\n onRepositoryClick: handleRepositoryClick,\n onRepositoryDelete: handleDeleteRepository,\n onApplicationClick: handleApplicationClick,\n onApplicationDelete: handleDeleteApplication,\n });\n }, [\n setCallbacks,\n handleAddFeatureToFeature,\n handleArchiveFeature,\n handleDeleteFeature,\n handleRetryFeature,\n handleStartFeature,\n handleStopFeature,\n handleUnarchiveFeature,\n handleAddFeatureToRepo,\n handleRepositoryClick,\n handleDeleteRepository,\n handleApplicationClick,\n handleDeleteApplication,\n ]);\n\n const handleMoveEnd = useCallback(\n (_event: unknown, viewport: Viewport) => {\n handleViewportChange(viewport);\n },\n [handleViewportChange]\n );\n\n const hasRepositories = nodes.some((n) => n.type === 'repositoryNode');\n // The canvas is \"non-empty\" as soon as ANY repo OR application node is\n // present — applications are first-class top-level nodes, so creating\n // an application alone must be enough to keep the prompt empty state\n // from re-appearing on next visit.\n const hasCanvasContent = hasRepositories || nodes.some((n) => n.type === 'applicationNode');\n\n // Publish repo state to sidebar context so AppShell can hide FAB during onboarding\n useEffect(() => {\n setSidebarHasRepos(hasRepositories);\n }, [hasRepositories, setSidebarHasRepos]);\n\n // Debounced latch: prevent empty-state flicker during brief reconcile gaps\n // (e.g. stale poll momentarily drops nodes), but allow the empty state to\n // return after a real delete once content stays gone past the debounce window.\n const [showCanvas, setShowCanvas] = useState(hasCanvasContent);\n const latchTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n useEffect(() => {\n if (hasCanvasContent) {\n // Repos / apps exist — show canvas immediately, cancel any pending unlatch\n if (latchTimerRef.current) {\n clearTimeout(latchTimerRef.current);\n latchTimerRef.current = null;\n }\n setShowCanvas(true);\n } else if (showCanvas) {\n // All canvas content gone — clear saved viewport so next add starts\n // centered, then wait before showing empty state (debounce stale polls)\n resetViewport();\n latchTimerRef.current = setTimeout(() => {\n setShowCanvas(false);\n latchTimerRef.current = null;\n }, 500);\n }\n return () => {\n if (latchTimerRef.current) clearTimeout(latchTimerRef.current);\n };\n }, [hasCanvasContent, showCanvas, resetViewport]);\n\n // Auto-include any newly-appearing repo/feature nodes in the active\n // workspace (skipped when default is active — that workspace shows\n // everything anyway). We diff the current node id list against the set\n // we've already seen so we only add the deltas.\n useEffect(() => {\n const seen = knownNodeIdsRef.current;\n const newRepoIds: string[] = [];\n const newFeatureIds: string[] = [];\n for (const n of nodes) {\n if (seen.has(n.id)) continue;\n seen.add(n.id);\n if (n.type === 'repositoryNode') newRepoIds.push(n.id);\n else if (n.type === 'featureNode') newFeatureIds.push(n.id);\n }\n if (isDefaultActive) return;\n if (newRepoIds.length === 0 && newFeatureIds.length === 0) return;\n addToActiveWorkspace({ repoIds: newRepoIds, featureIds: newFeatureIds });\n }, [nodes, isDefaultActive, addToActiveWorkspace]);\n\n // Filter nodes by the active workspace (default workspace = no filter).\n // We always filter from the full `nodes` list so `displayNodes` already\n // reflects workspace membership before pulse-add decoration runs.\n const workspaceFilteredNodes = useMemo(() => {\n if (isDefaultActive) return nodes;\n const allowedRepos = new Set(activeWorkspace.repoIds);\n const allowedFeatures = new Set(activeWorkspace.featureIds);\n return nodes.filter((n) => {\n if (n.type === 'repositoryNode') return allowedRepos.has(n.id);\n if (n.type === 'featureNode') return allowedFeatures.has(n.id);\n return true;\n });\n }, [nodes, isDefaultActive, activeWorkspace]);\n\n // Drop edges whose endpoints were filtered out.\n const workspaceFilteredEdges = useMemo(() => {\n if (isDefaultActive) return edges;\n const visibleIds = new Set(workspaceFilteredNodes.map((n) => n.id));\n return edges.filter((e) => visibleIds.has(e.source) && visibleIds.has(e.target));\n }, [edges, isDefaultActive, workspaceFilteredNodes]);\n\n // Pulse the \"+\" button when there's a single repo with no features and the\n // create-feature drawer is not open — draws attention to the next action.\n const isCreateDrawerOpen = pathname.startsWith('/create');\n const displayNodes = useMemo(() => {\n const source = workspaceFilteredNodes;\n const repoNodes = source.filter((n) => n.type === 'repositoryNode');\n const hasFeatures = source.some((n) => n.type === 'featureNode');\n const shouldPulse = repoNodes.length === 1 && !hasFeatures && !isCreateDrawerOpen;\n\n if (!shouldPulse) return source;\n\n return source.map((n) =>\n n.type === 'repositoryNode' ? { ...n, data: { ...n.data, pulseAdd: true } } : n\n );\n }, [workspaceFilteredNodes, isCreateDrawerOpen]);\n\n const handlePickFolder = useCallback(() => {\n window.dispatchEvent(new CustomEvent('shep:pick-folder'));\n }, []);\n\n // Re-fit the viewport when the active workspace's visible node set changes.\n // See use-workspace-fit-view.ts for the scoping rules.\n useWorkspaceFitView({\n activeWorkspace,\n isDefaultActive,\n workspaceFilteredNodes,\n fitView,\n });\n\n // When the active (non-default) workspace has no members but real canvas\n // content (repos or applications) exists, show a workspace-aware empty\n // state instead of the welcome wizard. The wizard would imply \"no nodes\n // at all\", which is wrong here — and crucially, leaves the workspace\n // selector visible via the toolbar so users can switch back to default.\n const workspaceFilteredEmpty =\n hasCanvasContent && !isDefaultActive && workspaceFilteredNodes.length === 0;\n\n const emptyStateNode = workspaceFilteredEmpty ? (\n <div className=\"pointer-events-auto flex h-full w-full flex-col items-center justify-center px-8\">\n <div className=\"bg-primary/10 text-primary mb-5 flex h-12 w-12 items-center justify-center rounded-2xl\">\n <Layers className=\"h-6 w-6\" />\n </div>\n <h2 className=\"text-foreground/90 text-center text-2xl font-light tracking-tight\">\n This workspace is empty\n </h2>\n <p className=\"text-muted-foreground mt-2 max-w-sm text-center text-sm leading-relaxed\">\n Add repositories or features from the canvas, or switch back to the default workspace to see\n everything.\n </p>\n <div className=\"mt-6 flex items-center gap-2\">\n <Button\n size=\"sm\"\n onClick={() => setWorkspaceNewProjectOpen(true)}\n className=\"bg-blue-500 text-white hover:bg-blue-600\"\n >\n <FolderPlus className=\"me-1.5 h-3.5 w-3.5\" />\n New project\n </Button>\n <Button variant=\"outline\" size=\"sm\" onClick={() => setManageWorkspaceOpen(true)}>\n <Plus className=\"me-1.5 h-3.5 w-3.5\" />\n Manage items\n </Button>\n <Button variant=\"ghost\" size=\"sm\" onClick={() => setActiveWorkspace(DEFAULT_WORKSPACE_ID)}>\n Switch to Default\n </Button>\n </div>\n </div>\n ) : (\n <ControlCenterEmptyState\n onRepositorySelect={addRepoAndFocus}\n onApplicationCreated={(appId) => {\n router.push(`/application/${appId}`);\n }}\n />\n );\n\n // ── Full-screen create prompt overlay ────────────────────────────────\n const [showCreatePrompt, setShowCreatePrompt] = useState(false);\n\n const featureFlags = useFeatureFlags();\n\n // (+) FAB actions — only visible on control center. Action list lives in\n // its own hook so this component stays focused on graph state + rendering.\n const fabActions = useFabActions({\n router,\n clickSound,\n guardedNavigate,\n handlePickFolder,\n onNewProject: () => setWorkspaceNewProjectOpen(true),\n onNewApplication: () => setShowCreatePrompt(true),\n featureFlags,\n });\n\n const canvasToolbar = (\n <CanvasToolbar\n showArchived={showArchived}\n onToggleArchived={() => setShowArchived(!showArchived)}\n onResetViewport={resetViewport}\n startSlot={\n <WorkspaceSelector\n workspaces={workspaces}\n activeWorkspace={activeWorkspace}\n onSelect={setActiveWorkspace}\n onRequestCreate={() => setCreateWorkspaceOpen(true)}\n onRequestRename={() => setRenameWorkspaceOpen(true)}\n onRequestDelete={(id) => {\n setPendingDeleteWorkspaceId(id);\n setDeleteWorkspaceOpen(true);\n }}\n onManage={() => setManageWorkspaceOpen(true)}\n />\n }\n />\n );\n\n return (\n <>\n <FeaturesCanvas\n nodes={showCanvas ? displayNodes : []}\n edges={showCanvas ? workspaceFilteredEdges : []}\n selectedFeatureId={selectedFeatureId}\n selectedRepository={selectedRepository}\n defaultViewport={defaultViewport}\n onNodesChange={onNodesChange}\n onConnect={handleConnect}\n onAddFeature={handleAddFeature}\n onNodeClick={handleNodeClick}\n onPaneClick={handleClearDrawers}\n onMoveEnd={handleMoveEnd}\n toolbar={canvasToolbar}\n emptyState={emptyStateNode}\n />\n {/* (+) FAB — bottom-left, moves with sidebar */}\n {showCanvas ? <CreateFab actions={fabActions} /> : null}\n <NewProjectDialog\n open={workspaceNewProjectOpen}\n onOpenChange={setWorkspaceNewProjectOpen}\n onCreated={(path) => addRepoAndFocus(path)}\n />\n <ManageWorkspaceDialog\n open={manageWorkspaceOpen}\n onOpenChange={setManageWorkspaceOpen}\n workspace={activeWorkspace}\n allNodes={nodes}\n onSave={(members) => setWorkspaceMembers(activeWorkspace.id, members)}\n />\n <WorkspaceNameDialog\n open={createWorkspaceOpen}\n onOpenChange={setCreateWorkspaceOpen}\n title=\"New workspace\"\n description=\"Create a workspace to filter the canvas to a specific set of repositories and features.\"\n confirmLabel=\"Create\"\n onConfirm={(name) => {\n createWorkspace(name);\n setManageWorkspaceOpen(true);\n }}\n />\n <WorkspaceNameDialog\n open={renameWorkspaceOpen}\n onOpenChange={setRenameWorkspaceOpen}\n title=\"Rename workspace\"\n initialValue={activeWorkspace.name}\n confirmLabel=\"Rename\"\n onConfirm={(name) => renameWorkspace(activeWorkspace.id, name)}\n />\n <AlertDialog\n open={deleteWorkspaceOpen}\n onOpenChange={(open) => {\n setDeleteWorkspaceOpen(open);\n if (!open) setPendingDeleteWorkspaceId(null);\n }}\n >\n <AlertDialogContent>\n <AlertDialogHeader>\n <AlertDialogTitle>Delete workspace?</AlertDialogTitle>\n <AlertDialogDescription>\n This will permanently remove the workspace &ldquo;\n {workspaces.find((w) => w.id === pendingDeleteWorkspaceId)?.name ??\n activeWorkspace.name}\n &rdquo;. The repositories and features themselves are not affected.\n </AlertDialogDescription>\n </AlertDialogHeader>\n <AlertDialogFooter>\n <AlertDialogCancel>Cancel</AlertDialogCancel>\n <AlertDialogAction\n variant=\"destructive\"\n onClick={() => {\n if (pendingDeleteWorkspaceId) {\n deleteWorkspace(pendingDeleteWorkspaceId);\n setPendingDeleteWorkspaceId(null);\n }\n }}\n >\n Delete\n </AlertDialogAction>\n </AlertDialogFooter>\n </AlertDialogContent>\n </AlertDialog>\n\n {/* Full-screen create prompt overlay (replaces the old dialog) */}\n {showCreatePrompt ? (\n <div className=\"absolute inset-0 z-50\">\n <ControlCenterEmptyState\n onRepositorySelect={(path) => {\n setShowCreatePrompt(false);\n addRepoAndFocus(path);\n }}\n onApplicationCreated={(appId) => {\n setShowCreatePrompt(false);\n router.push(`/application/${appId}`);\n }}\n onClose={() => setShowCreatePrompt(false)}\n className=\"bg-background\"\n />\n </div>\n ) : null}\n </>\n );\n}\n\n/** (+) FAB that tracks sidebar width via CSS var + transition.\n * When fabLayout.swapPosition is true, moves to the end side (right in LTR). */\nfunction CreateFab({ actions }: { actions: FloatingActionButtonAction[] }) {\n const { state } = useSidebar();\n const { i18n } = useTranslation('web');\n const { swapPosition } = useFabLayout();\n const isRtl = i18n.dir() === 'rtl';\n\n // Default: start side (left in LTR), tracking sidebar width\n // Swapped: end side (right in LTR), fixed 32px from edge\n if (swapPosition) {\n const positionStyle: React.CSSProperties = isRtl\n ? {\n left: 'calc(var(--sidebar-width-icon) + 32px)',\n transition: 'left 200ms ease-in-out',\n }\n : { right: '32px', transition: 'right 200ms ease-in-out' };\n\n return (\n <FloatingActionButton actions={actions} className=\"!fixed bottom-6\" style={positionStyle} />\n );\n }\n\n // Sidebar expanded = var(--sidebar-width) = 16rem, collapsed = var(--sidebar-width-icon) = 3rem\n // Position just outside the sidebar edge with 16px gap\n const offset =\n state === 'expanded'\n ? 'calc(var(--sidebar-width) + 32px)'\n : 'calc(var(--sidebar-width-icon) + 32px)';\n\n const positionStyle: React.CSSProperties = isRtl\n ? { right: offset, transition: 'right 200ms ease-in-out' }\n : { left: offset, transition: 'left 200ms ease-in-out' };\n\n return (\n <FloatingActionButton actions={actions} className=\"!fixed bottom-6\" style={positionStyle} />\n );\n}\n","'use client';\n\nimport { useState, useCallback, useRef, useEffect } from 'react';\nimport {\n SendHorizontal,\n Paperclip,\n Loader2,\n LayoutGrid,\n Zap,\n ClipboardList,\n ChevronDown,\n Check,\n X,\n} from 'lucide-react';\nimport { useTranslation } from 'react-i18next';\nimport { cn } from '@/lib/utils';\nimport { createProjectAndFeature } from '@/app/actions/create-project-and-feature';\nimport { createApplication } from '@/app/actions/create-application';\nimport { AgentModelPicker } from '@/components/features/settings/AgentModelPicker';\nimport { AttachmentChip } from '@/components/common/attachment-chip';\nimport { ShepLogo } from '@/components/common/shep-logo';\nimport { Tooltip, TooltipContent, TooltipTrigger } from '@/components/ui/tooltip';\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuTrigger,\n} from '@/components/ui/dropdown-menu';\nimport { useAttachments } from '@/hooks/use-attachments';\n\ntype BuildMode = 'application' | 'fast' | 'spec';\n\nconst BUILD_MODES: BuildMode[] = ['application', 'fast', 'spec'];\n\nconst BUILD_MODE_CONFIG: Record<\n BuildMode,\n {\n icon: React.ElementType;\n label: string;\n placeholder: string;\n suggestions: string[];\n }\n> = {\n application: {\n icon: LayoutGrid,\n label: 'Application',\n placeholder: 'Build a modern e-commerce storefront with product catalog...',\n suggestions: [\n 'A landing page with hero, features, and pricing sections',\n 'Full-stack SaaS app with auth, billing, and dashboard',\n 'Mobile-first social media app with real-time chat',\n 'Personal portfolio with blog and project showcase',\n ],\n },\n fast: {\n icon: Zap,\n label: 'Fast',\n placeholder: 'Add a dark mode toggle to the settings page...',\n suggestions: [\n 'Add pagination to the users list endpoint',\n 'Fix the broken logout redirect',\n 'Add input validation to the signup form',\n 'Refactor the API error handling middleware',\n ],\n },\n spec: {\n icon: ClipboardList,\n label: 'Spec Driven',\n placeholder: 'Implement a role-based access control system with audit logging...',\n suggestions: [\n 'OAuth2 authentication with SSO and MFA support',\n 'Event-driven notification system with email and push',\n 'REST API with versioning, rate limiting, and OpenAPI docs',\n 'Data pipeline with ETL, validation, and monitoring',\n ],\n },\n};\n\nexport interface ControlCenterEmptyStateProps {\n onRepositorySelect?: (path: string) => void;\n onApplicationCreated?: (applicationId: string) => void;\n onClose?: () => void;\n className?: string;\n}\n\nexport function ControlCenterEmptyState({\n onRepositorySelect,\n onApplicationCreated,\n onClose,\n className,\n}: ControlCenterEmptyStateProps) {\n const { t } = useTranslation('web');\n const [description, setDescription] = useState('');\n const [overrideAgent, setOverrideAgent] = useState<string | undefined>(undefined);\n const [overrideModel, setOverrideModel] = useState<string | undefined>(undefined);\n const [buildMode, setBuildMode] = useState<BuildMode>('application');\n const [submitting, setSubmitting] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [isFocused, setIsFocused] = useState(false);\n const textareaRef = useRef<HTMLTextAreaElement>(null);\n const att = useAttachments();\n\n // Circular mode switching with Shift+Tab, close overlay with Escape\n const cycleBuildMode = useCallback(() => {\n setBuildMode((prev) => {\n const idx = BUILD_MODES.indexOf(prev);\n return BUILD_MODES[(idx + 1) % BUILD_MODES.length];\n });\n }, []);\n\n useEffect(() => {\n const handleGlobalKeyDown = (e: KeyboardEvent) => {\n if (e.key === 'Escape' && onClose) onClose();\n if (e.key === 'Tab' && e.shiftKey) {\n e.preventDefault();\n cycleBuildMode();\n }\n };\n window.addEventListener('keydown', handleGlobalKeyDown);\n return () => window.removeEventListener('keydown', handleGlobalKeyDown);\n }, [onClose, cycleBuildMode]);\n\n const handleSubmit = useCallback(async () => {\n if (!description.trim() || submitting) return;\n\n setSubmitting(true);\n setError(null);\n\n try {\n if (buildMode === 'application') {\n // The server action creates the app AND synchronously posts the\n // user's prompt as the first interactive chat message, so when we\n // navigate, /application/[id] SSR-loads chat state and the message\n // is visible on first paint. No prompt in the URL, no extra\n // round trip on the client.\n const result = await createApplication({\n description: description.trim(),\n agentType: overrideAgent,\n modelOverride: overrideModel,\n initialPrompt: description.trim(),\n });\n\n if (result.error) {\n setError(result.error);\n setSubmitting(false);\n return;\n }\n\n if (result.application) {\n onApplicationCreated?.(result.application.id);\n }\n } else {\n const result = await createProjectAndFeature({\n description: description.trim(),\n attachments: att.completedAttachments.map((a) => ({\n path: a.path,\n name: a.name,\n notes: a.notes,\n })),\n agentType: overrideAgent,\n model: overrideModel,\n fast: buildMode === 'fast',\n });\n\n if (result.error) {\n setError(result.error);\n setSubmitting(false);\n return;\n }\n\n if (result.repositoryPath) {\n onRepositorySelect?.(result.repositoryPath);\n }\n\n if (result.feature && result.repositoryPath) {\n window.dispatchEvent(\n new CustomEvent('shep:feature-created', {\n detail: {\n featureId: result.feature.id,\n name: result.feature.name,\n description: result.feature.description,\n repositoryPath: result.repositoryPath,\n },\n })\n );\n }\n }\n } catch {\n setError('Something went wrong. Please try again.');\n setSubmitting(false);\n }\n }, [\n description,\n submitting,\n buildMode,\n att.completedAttachments,\n overrideAgent,\n overrideModel,\n onRepositorySelect,\n onApplicationCreated,\n ]);\n\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent<HTMLTextAreaElement>) => {\n if (e.key === 'Enter' && (e.ctrlKey || e.metaKey)) {\n e.preventDefault();\n handleSubmit();\n }\n },\n [handleSubmit]\n );\n\n const handlePickFiles = useCallback(async () => {\n try {\n const res = await fetch('/api/dialog/pick-files');\n if (!res.ok) return;\n const data = (await res.json()) as { paths?: string[] };\n if (!data.paths?.length) return;\n for (const filePath of data.paths) {\n const uploadRes = await fetch('/api/attachments/upload-from-path', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ path: filePath, sessionId: 'onboarding' }),\n });\n if (!uploadRes.ok) continue;\n const uploaded = (await uploadRes.json()) as {\n id: string;\n name: string;\n size: number;\n mimeType: string;\n path: string;\n };\n att.addAttachment(uploaded);\n }\n } catch {\n // Native picker not available — ignore\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps -- att.addAttachment is stable\n }, [att.addAttachment]);\n\n const handleSuggestionClick = useCallback((suggestion: string) => {\n setDescription(suggestion);\n textareaRef.current?.focus();\n }, []);\n\n const modeConfig = BUILD_MODE_CONFIG[buildMode];\n const ModeIcon = modeConfig.icon;\n\n return (\n <div\n data-testid=\"control-center-empty-state\"\n className={cn(\n 'relative flex h-full w-full flex-col items-center justify-center overflow-hidden px-8',\n className\n )}\n >\n {/* Gradient background — covers canvas dots */}\n <div className=\"onboard-bg pointer-events-none absolute inset-0 animate-[onboard-fade-in_1.2s_ease-out_both]\" />\n\n {/* Close button — only shown when used as overlay */}\n {onClose ? (\n <button\n type=\"button\"\n onClick={onClose}\n aria-label=\"Close\"\n className=\"text-muted-foreground hover:text-foreground hover:bg-accent/50 absolute top-4 right-4 z-10 cursor-pointer rounded p-1.5 transition-colors\"\n >\n <X className=\"h-5 w-5\" />\n </button>\n ) : null}\n\n <div className=\"relative flex w-full max-w-2xl flex-col items-center\">\n {/* Shep Logo */}\n <div\n className=\"mb-6 animate-[onboard-logo_0.8s_cubic-bezier(0.16,1,0.3,1)_both]\"\n style={{ animationDelay: '0ms' }}\n >\n <ShepLogo size={72} className=\"text-foreground\" />\n </div>\n\n {/* Hero text */}\n <h1\n className=\"text-foreground animate-[onboard-fade-up_0.7s_cubic-bezier(0.16,1,0.3,1)_both] text-center text-5xl font-extralight tracking-tight\"\n style={{ animationDelay: '120ms' }}\n >\n What do you want to build?\n </h1>\n <p\n className=\"text-muted-foreground mt-3 animate-[onboard-fade-up_0.7s_cubic-bezier(0.16,1,0.3,1)_both] text-center text-lg leading-relaxed font-light\"\n style={{ animationDelay: '220ms' }}\n >\n Describe your idea and Shep creates the project for you.\n </p>\n\n {/* Prompt box */}\n <div\n className=\"mt-10 w-full animate-[onboard-fade-up_0.7s_cubic-bezier(0.16,1,0.3,1)_both]\"\n style={{ animationDelay: '350ms' }}\n >\n <div\n onFocus={() => setIsFocused(true)}\n onBlur={() => setIsFocused(false)}\n onDragEnter={att.handleDragEnter}\n onDragLeave={att.handleDragLeave}\n onDragOver={att.handleDragOver}\n onDrop={att.handleDrop}\n className={cn(\n 'flex flex-col rounded-xl border transition-all duration-200',\n 'border-border/60 bg-background shadow-sm dark:border-white/10 dark:bg-white/[0.04]',\n isFocused &&\n 'ring-ring/50 border-ring shadow-md ring-[3px] dark:border-orange-500/40 dark:ring-orange-500/25',\n att.isDragOver && 'border-primary/50 bg-primary/5',\n submitting && 'opacity-70'\n )}\n >\n {/* Textarea — supports paste for images */}\n <textarea\n ref={textareaRef}\n rows={2}\n autoFocus\n value={description}\n onChange={(e) => setDescription(e.target.value)}\n onKeyDown={handleKeyDown}\n onPaste={att.handlePaste}\n placeholder={modeConfig.placeholder}\n disabled={submitting}\n className=\"text-foreground placeholder:text-muted-foreground/60 max-h-[10rem] min-h-[4.5rem] w-full resize-none border-0 bg-transparent px-4 py-3.5 text-sm leading-relaxed focus:outline-none disabled:cursor-not-allowed\"\n />\n\n {/* Attachment chips */}\n {att.attachments.length > 0 ? (\n <div className=\"flex shrink-0 items-center gap-2.5 overflow-x-auto overflow-y-visible px-5 pt-2 pb-2\">\n {att.attachments.map((file) => (\n <AttachmentChip\n key={file.id}\n name={file.name}\n size={file.size}\n mimeType={file.mimeType}\n path={file.path}\n onRemove={() => att.removeAttachment(file.id)}\n loading={file.loading}\n notes={file.notes}\n onNotesChange={(notes) => att.updateNotes(file.id, notes)}\n />\n ))}\n </div>\n ) : null}\n\n {/* Upload error */}\n {att.uploadError ? (\n <p className=\"text-destructive px-4 pb-2 text-xs\">{att.uploadError}</p>\n ) : null}\n\n {/* Controls bar */}\n <div className=\"border-border/60 flex shrink-0 items-center gap-3 border-t px-3 py-2 dark:border-white/10\">\n <AgentModelPicker\n initialAgentType={overrideAgent ?? 'claude-code'}\n initialModel={overrideModel ?? 'claude-sonnet-4-6'}\n mode=\"override\"\n showInstallStatus\n onAgentModelChange={(agent, model) => {\n setOverrideAgent(agent);\n setOverrideModel(model);\n }}\n className=\"w-55\"\n />\n <div className=\"flex-1\" />\n\n {/* Build mode dropdown — Shift+Tab to cycle */}\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <button\n type=\"button\"\n data-testid=\"build-mode-selector\"\n className=\"text-muted-foreground hover:text-foreground hover:bg-accent/50 flex cursor-pointer items-center gap-1.5 rounded-md px-2 py-1 text-xs transition-colors\"\n >\n <span\n key={buildMode}\n className=\"flex animate-[onboard-fade-up_0.25s_ease-out_both] items-center gap-1.5\"\n >\n <ModeIcon className=\"h-3.5 w-3.5\" />\n {modeConfig.label}\n </span>\n <ChevronDown className=\"h-3 w-3 opacity-50\" />\n </button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\" className=\"min-w-[160px]\">\n {BUILD_MODES.map((mode) => {\n const cfg = BUILD_MODE_CONFIG[mode];\n const Icon = cfg.icon;\n const isActive = buildMode === mode;\n return (\n <DropdownMenuItem\n key={mode}\n onClick={() => setBuildMode(mode)}\n data-testid={`build-mode-${mode}`}\n className=\"flex items-center gap-2\"\n >\n <Icon className=\"h-3.5 w-3.5\" />\n <span className=\"flex-1\">{cfg.label}</span>\n {isActive ? <Check className=\"text-foreground h-3.5 w-3.5\" /> : null}\n </DropdownMenuItem>\n );\n })}\n </DropdownMenuContent>\n </DropdownMenu>\n\n <Tooltip>\n <TooltipTrigger asChild>\n <button\n type=\"button\"\n onClick={handlePickFiles}\n disabled={submitting}\n aria-label={t('chat.attachFiles')}\n className=\"text-muted-foreground hover:text-foreground cursor-pointer rounded p-1 transition-colors disabled:opacity-50\"\n >\n <Paperclip className=\"h-4 w-4\" />\n </button>\n </TooltipTrigger>\n <TooltipContent side=\"top\">{t('chat.attachFiles')}</TooltipContent>\n </Tooltip>\n\n <button\n type=\"button\"\n onClick={handleSubmit}\n disabled={!description.trim() || submitting}\n className={cn(\n 'bg-foreground text-background inline-flex h-8 w-8 shrink-0 cursor-pointer items-center justify-center rounded-lg',\n 'hover:bg-foreground/90 disabled:pointer-events-none disabled:opacity-30',\n 'transition-all duration-150'\n )}\n >\n {submitting ? (\n <Loader2 className=\"h-3.5 w-3.5 animate-spin\" />\n ) : (\n <SendHorizontal className=\"h-3.5 w-3.5\" />\n )}\n </button>\n </div>\n </div>\n\n {error ? <p className=\"text-destructive mt-2 text-center text-sm\">{error}</p> : null}\n </div>\n\n {/* Suggestion chips — re-animate on mode change */}\n <div\n key={buildMode}\n className=\"mt-6 flex animate-[onboard-fade-up_0.4s_ease-out_both] flex-wrap justify-center gap-2\"\n >\n {modeConfig.suggestions.map((suggestion) => (\n <button\n key={suggestion}\n type=\"button\"\n onClick={() => handleSuggestionClick(suggestion)}\n disabled={submitting}\n className=\"text-muted-foreground hover:text-foreground border-border/60 hover:border-border hover:bg-accent/50 cursor-pointer rounded-full border px-3.5 py-1.5 text-xs transition-all duration-150 disabled:opacity-50 dark:border-white/10 dark:hover:border-white/20 dark:hover:bg-white/[0.06]\"\n >\n {suggestion}\n </button>\n ))}\n </div>\n </div>\n </div>\n );\n}\n","/* __next_internal_action_entry_do_not_use__ [{\"40a6376439dd2da25ab983e84a2e327778f8f453f4\":\"createProjectFolder\"},\"src/presentation/web/app/actions/create-project-folder.ts\",\"\"] */\"use turbopack no side effects\";import{createServerReference,callServer,findSourceMapURL}from\"private-next-rsc-action-client-wrapper\";const $$RSC_SERVER_ACTION_0=/*#__PURE__*/createServerReference(\"40a6376439dd2da25ab983e84a2e327778f8f453f4\",callServer,void 0,findSourceMapURL,\"createProjectFolder\");export{$$RSC_SERVER_ACTION_0 as createProjectFolder};","'use client';\n\nimport { useEffect, useState } from 'react';\nimport { Loader2 } from 'lucide-react';\nimport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n} from '@/components/ui/dialog';\nimport { Input } from '@/components/ui/input';\nimport { Button } from '@/components/ui/button';\nimport { createProjectFolder } from '@/app/actions/create-project-folder';\n\nexport interface NewProjectDialogProps {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n /** Called with the absolute path of the newly-created project folder. */\n onCreated: (path: string) => void;\n}\n\nexport function NewProjectDialog({ open, onOpenChange, onCreated }: NewProjectDialogProps) {\n const [name, setName] = useState('');\n const [busy, setBusy] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n // Reset state every time the dialog opens.\n useEffect(() => {\n if (open) {\n setName('');\n setBusy(false);\n setError(null);\n }\n }, [open]);\n\n const handleSubmit = async (e: React.FormEvent<HTMLFormElement>) => {\n e.preventDefault();\n const trimmed = name.trim();\n if (!trimmed || busy) return;\n\n setBusy(true);\n setError(null);\n const result = await createProjectFolder(trimmed);\n if (!result.ok || !result.path) {\n setError(result.error ?? 'Failed to create project.');\n setBusy(false);\n return;\n }\n\n // Hand the new path off to the empty state's existing add-repo flow.\n onCreated(result.path);\n onOpenChange(false);\n };\n\n return (\n <Dialog open={open} onOpenChange={onOpenChange}>\n <DialogContent className=\"max-w-sm\">\n <form onSubmit={handleSubmit}>\n <DialogHeader>\n <DialogTitle>New project</DialogTitle>\n <DialogDescription>\n Create an empty project folder inside your Shep home directory. Git will be\n initialised automatically when the project is added.\n </DialogDescription>\n </DialogHeader>\n <div className=\"py-4\">\n <Input\n autoFocus\n value={name}\n onChange={(e) => {\n setName(e.target.value);\n if (error) setError(null);\n }}\n placeholder=\"my-prototype\"\n disabled={busy}\n data-testid=\"new-project-name-input\"\n />\n {error ? (\n <p className=\"text-destructive mt-2 text-xs\" role=\"alert\">\n {error}\n </p>\n ) : null}\n </div>\n <DialogFooter>\n <Button\n type=\"button\"\n variant=\"ghost\"\n onClick={() => onOpenChange(false)}\n disabled={busy}\n >\n Cancel\n </Button>\n <Button type=\"submit\" disabled={!name.trim() || busy}>\n {busy ? (\n <>\n <Loader2 className=\"mr-2 h-4 w-4 animate-spin\" />\n Creating…\n </>\n ) : (\n 'Create project'\n )}\n </Button>\n </DialogFooter>\n </form>\n </DialogContent>\n </Dialog>\n );\n}\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n [\n 'path',\n {\n d: 'M15 22v-4a4.8 4.8 0 0 0-1-3.5c3 0 6-2 6-5.5.08-1.25-.27-2.48-1-3.5.28-1.15.28-2.35 0-3.5 0 0-1 0-3 1.5-2.64-.5-5.36-.5-8 0C6 2 5 2 5 2c-.3 1.15-.3 2.35 0 3.5A5.403 5.403 0 0 0 4 9c0 3.5 3 5.5 6 5.5-.39.49-.68 1.05-.85 1.65-.17.6-.22 1.23-.15 1.85v4',\n key: 'tonef',\n },\n ],\n ['path', { d: 'M9 18c-4.51 2-5-2-7-2', key: '9comsn' }],\n];\n\n/**\n * @component @name Github\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMTUgMjJ2LTRhNC44IDQuOCAwIDAgMC0xLTMuNWMzIDAgNi0yIDYtNS41LjA4LTEuMjUtLjI3LTIuNDgtMS0zLjUuMjgtMS4xNS4yOC0yLjM1IDAtMy41IDAgMC0xIDAtMyAxLjUtMi42NC0uNS01LjM2LS41LTggMEM2IDIgNSAyIDUgMmMtLjMgMS4xNS0uMyAyLjM1IDAgMy41QTUuNDAzIDUuNDAzIDAgMCAwIDQgOWMwIDMuNSAzIDUuNSA2IDUuNS0uMzkuNDktLjY4IDEuMDUtLjg1IDEuNjUtLjE3LjYtLjIyIDEuMjMtLjE1IDEuODV2NCIgLz4KICA8cGF0aCBkPSJNOSAxOGMtNC41MSAyLTUtMi03LTIiIC8+Cjwvc3ZnPgo=) - https://lucide.dev/icons/github\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n * @deprecated Brand icons have been deprecated and are due to be removed, please refer to https://github.com/lucide-icons/lucide/issues/670. We recommend using https://simpleicons.org/?q=github instead. This icon will be removed in v1.0\n */\nconst Github = createLucideIcon('github', __iconNode);\n\nexport default Github;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['path', { d: 'M8 3H5a2 2 0 0 0-2 2v3', key: '1dcmit' }],\n ['path', { d: 'M21 8V5a2 2 0 0 0-2-2h-3', key: '1e4gt3' }],\n ['path', { d: 'M3 16v3a2 2 0 0 0 2 2h3', key: 'wsl5sc' }],\n ['path', { d: 'M16 21h3a2 2 0 0 0 2-2v-3', key: '18trek' }],\n];\n\n/**\n * @component @name Maximize\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNOCAzSDVhMiAyIDAgMCAwLTIgMnYzIiAvPgogIDxwYXRoIGQ9Ik0yMSA4VjVhMiAyIDAgMCAwLTItMmgtMyIgLz4KICA8cGF0aCBkPSJNMyAxNnYzYTIgMiAwIDAgMCAyIDJoMyIgLz4KICA8cGF0aCBkPSJNMTYgMjFoM2EyIDIgMCAwIDAgMi0ydi0zIiAvPgo8L3N2Zz4K) - https://lucide.dev/icons/maximize\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Maximize = createLucideIcon('maximize', __iconNode);\n\nexport default Maximize;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['circle', { cx: '11', cy: '11', r: '8', key: '4ej97u' }],\n ['line', { x1: '21', x2: '16.65', y1: '21', y2: '16.65', key: '13gj7c' }],\n ['line', { x1: '8', x2: '14', y1: '11', y2: '11', key: 'durymu' }],\n];\n\n/**\n * @component @name ZoomOut\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8Y2lyY2xlIGN4PSIxMSIgY3k9IjExIiByPSI4IiAvPgogIDxsaW5lIHgxPSIyMSIgeDI9IjE2LjY1IiB5MT0iMjEiIHkyPSIxNi42NSIgLz4KICA8bGluZSB4MT0iOCIgeDI9IjE0IiB5MT0iMTEiIHkyPSIxMSIgLz4KPC9zdmc+Cg==) - https://lucide.dev/icons/zoom-out\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst ZoomOut = createLucideIcon('zoom-out', __iconNode);\n\nexport default ZoomOut;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['circle', { cx: '11', cy: '11', r: '8', key: '4ej97u' }],\n ['line', { x1: '21', x2: '16.65', y1: '21', y2: '16.65', key: '13gj7c' }],\n ['line', { x1: '11', x2: '11', y1: '8', y2: '14', key: '1vmskp' }],\n ['line', { x1: '8', x2: '14', y1: '11', y2: '11', key: 'durymu' }],\n];\n\n/**\n * @component @name ZoomIn\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8Y2lyY2xlIGN4PSIxMSIgY3k9IjExIiByPSI4IiAvPgogIDxsaW5lIHgxPSIyMSIgeDI9IjE2LjY1IiB5MT0iMjEiIHkyPSIxNi42NSIgLz4KICA8bGluZSB4MT0iMTEiIHgyPSIxMSIgeTE9IjgiIHkyPSIxNCIgLz4KICA8bGluZSB4MT0iOCIgeDI9IjE0IiB5MT0iMTEiIHkyPSIxMSIgLz4KPC9zdmc+Cg==) - https://lucide.dev/icons/zoom-in\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst ZoomIn = createLucideIcon('zoom-in', __iconNode);\n\nexport default ZoomIn;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n [\n 'path',\n {\n d: 'M10.733 5.076a10.744 10.744 0 0 1 11.205 6.575 1 1 0 0 1 0 .696 10.747 10.747 0 0 1-1.444 2.49',\n key: 'ct8e1f',\n },\n ],\n ['path', { d: 'M14.084 14.158a3 3 0 0 1-4.242-4.242', key: '151rxh' }],\n [\n 'path',\n {\n d: 'M17.479 17.499a10.75 10.75 0 0 1-15.417-5.151 1 1 0 0 1 0-.696 10.75 10.75 0 0 1 4.446-5.143',\n key: '13bj9a',\n },\n ],\n ['path', { d: 'm2 2 20 20', key: '1ooewy' }],\n];\n\n/**\n * @component @name EyeOff\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMTAuNzMzIDUuMDc2YTEwLjc0NCAxMC43NDQgMCAwIDEgMTEuMjA1IDYuNTc1IDEgMSAwIDAgMSAwIC42OTYgMTAuNzQ3IDEwLjc0NyAwIDAgMS0xLjQ0NCAyLjQ5IiAvPgogIDxwYXRoIGQ9Ik0xNC4wODQgMTQuMTU4YTMgMyAwIDAgMS00LjI0Mi00LjI0MiIgLz4KICA8cGF0aCBkPSJNMTcuNDc5IDE3LjQ5OWExMC43NSAxMC43NSAwIDAgMS0xNS40MTctNS4xNTEgMSAxIDAgMCAxIDAtLjY5NiAxMC43NSAxMC43NSAwIDAgMSA0LjQ0Ni01LjE0MyIgLz4KICA8cGF0aCBkPSJtMiAyIDIwIDIwIiAvPgo8L3N2Zz4K) - https://lucide.dev/icons/eye-off\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst EyeOff = createLucideIcon('eye-off', __iconNode);\n\nexport default EyeOff;\n","/**\n * Re-fit the React Flow viewport when the active workspace's visible node\n * set changes (switching workspaces, or changing the active workspace's\n * membership via the Manage dialog).\n *\n * Intentionally scoped:\n * - Skips the first run so we don't override the persisted viewport on mount.\n * - Skips the default workspace, which shows everything and owns the\n * persisted viewport via useViewportPersistence.\n * - Skips empty workspaces — there's nothing to fit.\n * - Defers fitView to the next tick so React Flow has committed the new\n * node set before measuring.\n */\n\nimport { useEffect, useMemo, useRef } from 'react';\nimport type { useReactFlow } from '@xyflow/react';\n\nimport type { CanvasNodeType } from '@/components/features/features-canvas';\n\ntype FitViewFn = ReturnType<typeof useReactFlow>['fitView'];\n\ninterface ActiveWorkspaceLike {\n id: string;\n}\n\nconst AUTO_FOCUS_OPTIONS = {\n maxZoom: 1.0,\n padding: 0.5,\n duration: 500,\n} as const;\n\nexport function useWorkspaceFitView(params: {\n activeWorkspace: ActiveWorkspaceLike;\n isDefaultActive: boolean;\n workspaceFilteredNodes: CanvasNodeType[];\n fitView: FitViewFn;\n}): void {\n const { activeWorkspace, isDefaultActive, workspaceFilteredNodes, fitView } = params;\n\n const fingerprint = useMemo(() => {\n if (isDefaultActive) return 'default';\n const ids = workspaceFilteredNodes\n .map((n) => n.id)\n .sort()\n .join(',');\n return `${activeWorkspace.id}:${ids}`;\n }, [isDefaultActive, activeWorkspace.id, workspaceFilteredNodes]);\n\n const prevFingerprintRef = useRef<string | null>(null);\n\n useEffect(() => {\n const prev = prevFingerprintRef.current;\n prevFingerprintRef.current = fingerprint;\n if (prev === null) return;\n if (prev === fingerprint) return;\n if (isDefaultActive) return;\n if (workspaceFilteredNodes.length === 0) return;\n\n const t = setTimeout(() => {\n fitView(AUTO_FOCUS_OPTIONS);\n }, 0);\n return () => clearTimeout(t);\n }, [fingerprint, isDefaultActive, workspaceFilteredNodes.length, fitView]);\n}\n","/**\n * Build the action list for the (+) FloatingActionButton on the control\n * center. Extracted from control-center-inner.tsx so the parent component\n * stays focused on graph state + rendering.\n */\n\nimport { useMemo } from 'react';\nimport { FolderOpen, FolderPlus, GitBranch, Github, LayoutGrid, Sparkles } from 'lucide-react';\nimport type { useRouter } from 'next/navigation';\nimport { useTranslation } from 'react-i18next';\n\nimport type { FloatingActionButtonAction } from '@/components/common/floating-action-button';\nimport type { useFeatureFlags } from '@/hooks/feature-flags-context';\n\ntype RouterPushParam = Parameters<ReturnType<typeof useRouter>['push']>[0];\n\ninterface UseFabActionsParams {\n router: ReturnType<typeof useRouter>;\n clickSound: { play: () => void };\n guardedNavigate: (fn: () => void) => void;\n handlePickFolder: () => void;\n onNewProject: () => void;\n onNewApplication: () => void;\n featureFlags: ReturnType<typeof useFeatureFlags>;\n}\n\nexport function useFabActions({\n router,\n clickSound,\n guardedNavigate,\n handlePickFolder,\n onNewProject,\n onNewApplication,\n featureFlags,\n}: UseFabActionsParams): FloatingActionButtonAction[] {\n const { t } = useTranslation('web');\n\n return useMemo<FloatingActionButtonAction[]>(() => {\n const actions: FloatingActionButtonAction[] = [\n {\n id: 'new-project',\n label: 'New project',\n icon: <FolderPlus className=\"h-4 w-4\" />,\n onClick: () => {\n clickSound.play();\n onNewProject();\n },\n },\n {\n id: 'new-feature',\n label: t('fab.newFeature'),\n icon: <Sparkles className=\"h-4 w-4\" />,\n onClick: () => {\n clickSound.play();\n guardedNavigate(() => router.push('/create'));\n },\n },\n {\n id: 'add-local-repo',\n label: t('fab.localFolder'),\n icon: <FolderOpen className=\"h-4 w-4\" />,\n onClick: handlePickFolder,\n },\n {\n id: 'new-application',\n label: t('fab.newApplication'),\n icon: <LayoutGrid className=\"h-4 w-4\" />,\n onClick: onNewApplication,\n },\n ];\n if (featureFlags.adoptBranch) {\n actions.push({\n id: 'adopt-branch',\n label: t('fab.adoptBranch'),\n icon: <GitBranch className=\"h-4 w-4\" />,\n onClick: () => {\n guardedNavigate(() => router.push('/adopt' as RouterPushParam));\n },\n });\n }\n if (featureFlags.githubImport) {\n actions.push({\n id: 'add-github-repo',\n label: t('fab.fromGithub'),\n icon: <Github className=\"h-4 w-4\" />,\n onClick: () => {\n window.dispatchEvent(new CustomEvent('shep:open-github-import'));\n },\n });\n }\n return actions;\n }, [\n t,\n clickSound,\n guardedNavigate,\n router,\n handlePickFolder,\n onNewProject,\n onNewApplication,\n featureFlags.adoptBranch,\n featureFlags.githubImport,\n ]);\n}\n","/**\n * Wire global window events used by the control center canvas to the\n * appropriate handlers. The canvas listens for cross-component requests\n * dispatched as CustomEvents:\n *\n * - shep:add-repository → addRepoAndFocus(path)\n * - shep:feature-created → createFeatureNode(...)\n * - shep:feature-delete-requested → handleDeleteFeature(...)\n * - shep:feature-archive-requested → handleArchiveFeature(...)\n * - shep:feature-unarchive-requested → handleUnarchiveFeature(...)\n *\n * Extracted from control-center-inner.tsx so the parent component stays\n * focused on graph state + rendering, not event-bus plumbing.\n */\n\nimport { useEffect } from 'react';\n\nimport type { CanvasNodeType } from '@/components/features/features-canvas';\nimport type { FeatureNodeData } from '@/components/common/feature-node';\n\nexport type CreateFeatureNodeFn = (\n sourceNodeId: string | null,\n dataOverride?: Partial<FeatureNodeData>,\n edgeType?: string\n) => string;\n\nexport interface CanvasEventListenerHandlers {\n addRepoAndFocus: (path: string) => void;\n createFeatureNode: CreateFeatureNodeFn;\n nodes: CanvasNodeType[];\n handleDeleteFeature: (\n featureId: string,\n cleanup?: boolean,\n cascadeDelete?: boolean,\n closePr?: boolean\n ) => void;\n handleArchiveFeature: (featureId: string) => void;\n handleUnarchiveFeature: (featureId: string) => void;\n}\n\nexport function useCanvasEventListeners(handlers: CanvasEventListenerHandlers): void {\n const {\n addRepoAndFocus,\n createFeatureNode,\n nodes,\n handleDeleteFeature,\n handleArchiveFeature,\n handleUnarchiveFeature,\n } = handlers;\n\n // shep:add-repository — top-bar \"add folder\" button\n useEffect(() => {\n const handler = (e: Event) => {\n const path = (e as CustomEvent<{ path: string }>).detail.path;\n addRepoAndFocus(path);\n };\n window.addEventListener('shep:add-repository', handler);\n return () => window.removeEventListener('shep:add-repository', handler);\n }, [addRepoAndFocus]);\n\n // shep:feature-created — fired by the create drawer with the real server feature ID\n useEffect(() => {\n const handler = (e: Event) => {\n const detail = (\n e as CustomEvent<{\n featureId: string;\n name: string;\n description?: string;\n repositoryPath: string;\n parentId?: string;\n }>\n ).detail;\n\n // When parentId is provided, attach to the parent feature node via a\n // dependency edge instead of the repo node.\n if (detail.parentId) {\n const parentNodeId = `feat-${detail.parentId}`;\n createFeatureNode(\n parentNodeId,\n {\n state: 'creating',\n featureId: detail.featureId,\n name: detail.name,\n description: detail.description,\n repositoryPath: detail.repositoryPath,\n },\n 'dependencyEdge'\n );\n return;\n }\n\n const repoNode = nodes.find(\n (n) =>\n n.type === 'repositoryNode' &&\n (n.data as { repositoryPath?: string }).repositoryPath === detail.repositoryPath\n );\n\n createFeatureNode(repoNode?.id ?? null, {\n state: 'running',\n featureId: detail.featureId,\n name: detail.name,\n description: detail.description,\n repositoryPath: detail.repositoryPath,\n });\n };\n window.addEventListener('shep:feature-created', handler);\n return () => window.removeEventListener('shep:feature-created', handler);\n }, [nodes, createFeatureNode]);\n\n // shep:feature-delete-requested — fired from the feature drawer\n useEffect(() => {\n const handler = (e: Event) => {\n const { featureId, cleanup, cascadeDelete, closePr } = (\n e as CustomEvent<{\n featureId: string;\n cleanup?: boolean;\n cascadeDelete?: boolean;\n closePr?: boolean;\n }>\n ).detail;\n handleDeleteFeature(featureId, cleanup, cascadeDelete, closePr);\n };\n window.addEventListener('shep:feature-delete-requested', handler);\n return () => window.removeEventListener('shep:feature-delete-requested', handler);\n }, [handleDeleteFeature]);\n\n // shep:feature-archive-requested — fired from the feature drawer\n useEffect(() => {\n const handler = (e: Event) => {\n const { featureId } = (e as CustomEvent<{ featureId: string }>).detail;\n handleArchiveFeature(featureId);\n };\n window.addEventListener('shep:feature-archive-requested', handler);\n return () => window.removeEventListener('shep:feature-archive-requested', handler);\n }, [handleArchiveFeature]);\n\n // shep:feature-unarchive-requested — fired from the feature drawer\n useEffect(() => {\n const handler = (e: Event) => {\n const { featureId } = (e as CustomEvent<{ featureId: string }>).detail;\n handleUnarchiveFeature(featureId);\n };\n window.addEventListener('shep:feature-unarchive-requested', handler);\n return () => window.removeEventListener('shep:feature-unarchive-requested', handler);\n }, [handleUnarchiveFeature]);\n}\n"],"names":[],"mappings":"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","ignoreList":[1,32,33,34,35,36]}