@shepai/cli 1.72.9 → 1.73.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 (440) hide show
  1. package/dist/packages/core/src/application/use-cases/features/create/create-feature.use-case.d.ts +20 -1
  2. package/dist/packages/core/src/application/use-cases/features/create/create-feature.use-case.d.ts.map +1 -1
  3. package/dist/packages/core/src/application/use-cases/features/create/create-feature.use-case.js +68 -41
  4. package/dist/packages/core/src/application/use-cases/features/create/types.d.ts +10 -0
  5. package/dist/packages/core/src/application/use-cases/features/create/types.d.ts.map +1 -1
  6. package/dist/packages/core/src/infrastructure/services/notifications/notification.service.d.ts.map +1 -1
  7. package/dist/packages/core/src/infrastructure/services/notifications/notification.service.js +2 -4
  8. package/dist/src/presentation/web/app/actions/create-feature.d.ts.map +1 -1
  9. package/dist/src/presentation/web/app/actions/create-feature.js +20 -2
  10. package/dist/src/presentation/web/app/actions/get-feature-metadata.d.ts +10 -0
  11. package/dist/src/presentation/web/app/actions/get-feature-metadata.d.ts.map +1 -0
  12. package/dist/src/presentation/web/app/actions/get-feature-metadata.js +14 -0
  13. package/dist/src/presentation/web/app/api/agent-events/route.d.ts.map +1 -1
  14. package/dist/src/presentation/web/app/api/agent-events/route.js +15 -0
  15. package/dist/src/presentation/web/app/build-feature-node-data.d.ts.map +1 -1
  16. package/dist/src/presentation/web/app/build-feature-node-data.js +2 -26
  17. package/dist/src/presentation/web/app/build-graph-nodes.d.ts.map +1 -1
  18. package/dist/src/presentation/web/app/build-graph-nodes.js +2 -26
  19. package/dist/src/presentation/web/app/layout.js +1 -1
  20. package/dist/src/presentation/web/components/common/add-repository-button/add-repository-button.d.ts.map +1 -0
  21. package/dist/src/presentation/web/components/common/add-repository-button/index.d.ts +2 -0
  22. package/dist/src/presentation/web/components/common/add-repository-button/index.d.ts.map +1 -0
  23. package/dist/src/presentation/web/components/common/{add-repository-node → add-repository-button}/index.js +0 -1
  24. package/dist/src/presentation/web/components/common/add-repository-button/pick-folder.d.ts.map +1 -0
  25. package/dist/src/presentation/web/components/common/control-center-drawer/create-drawer-client.d.ts.map +1 -1
  26. package/dist/src/presentation/web/components/common/control-center-drawer/create-drawer-client.js +13 -18
  27. package/dist/src/presentation/web/components/common/control-center-drawer/drawer-view.d.ts +2 -0
  28. package/dist/src/presentation/web/components/common/control-center-drawer/drawer-view.d.ts.map +1 -1
  29. package/dist/src/presentation/web/components/common/control-center-drawer/drawer-view.js +11 -11
  30. package/dist/src/presentation/web/components/common/control-center-drawer/feature-drawer-client.d.ts.map +1 -1
  31. package/dist/src/presentation/web/components/common/control-center-drawer/feature-drawer-client.js +74 -144
  32. package/dist/src/presentation/web/components/common/control-center-drawer/index.d.ts +0 -1
  33. package/dist/src/presentation/web/components/common/control-center-drawer/index.d.ts.map +1 -1
  34. package/dist/src/presentation/web/components/common/control-center-drawer/index.js +0 -1
  35. package/dist/src/presentation/web/components/common/control-center-drawer/use-artifact-fetch.d.ts +13 -0
  36. package/dist/src/presentation/web/components/common/control-center-drawer/use-artifact-fetch.d.ts.map +1 -0
  37. package/dist/src/presentation/web/components/common/control-center-drawer/use-artifact-fetch.js +46 -0
  38. package/dist/src/presentation/web/components/common/feature-drawer/use-feature-actions.d.ts.map +1 -1
  39. package/dist/src/presentation/web/components/common/feature-drawer/use-feature-actions.js +7 -10
  40. package/dist/src/presentation/web/components/common/feature-node/derive-feature-state.d.ts +25 -0
  41. package/dist/src/presentation/web/components/common/feature-node/derive-feature-state.d.ts.map +1 -1
  42. package/dist/src/presentation/web/components/common/feature-node/derive-feature-state.js +45 -2
  43. package/dist/src/presentation/web/components/common/index.d.ts +2 -3
  44. package/dist/src/presentation/web/components/common/index.d.ts.map +1 -1
  45. package/dist/src/presentation/web/components/common/index.js +2 -3
  46. package/dist/src/presentation/web/components/common/repository-node/repository-node.js +1 -1
  47. package/dist/src/presentation/web/components/common/repository-node/use-repository-actions.d.ts.map +1 -1
  48. package/dist/src/presentation/web/components/common/repository-node/use-repository-actions.js +14 -39
  49. package/dist/src/presentation/web/components/common/sidebar-section-header/sidebar-section-header.d.ts +1 -3
  50. package/dist/src/presentation/web/components/common/sidebar-section-header/sidebar-section-header.d.ts.map +1 -1
  51. package/dist/src/presentation/web/components/common/sidebar-section-header/sidebar-section-header.js +3 -7
  52. package/dist/src/presentation/web/components/common/sidebar-section-header/sidebar-section-header.stories.d.ts +0 -1
  53. package/dist/src/presentation/web/components/common/sidebar-section-header/sidebar-section-header.stories.d.ts.map +1 -1
  54. package/dist/src/presentation/web/components/common/sidebar-section-header/sidebar-section-header.stories.js +0 -11
  55. package/dist/src/presentation/web/components/features/control-center/control-center-empty-state.js +1 -1
  56. package/dist/src/presentation/web/components/features/control-center/control-center-inner.d.ts.map +1 -1
  57. package/dist/src/presentation/web/components/features/control-center/control-center-inner.js +31 -14
  58. package/dist/src/presentation/web/components/features/control-center/control-center.stories.d.ts +0 -11
  59. package/dist/src/presentation/web/components/features/control-center/control-center.stories.d.ts.map +1 -1
  60. package/dist/src/presentation/web/components/features/control-center/control-center.stories.js +2 -37
  61. package/dist/src/presentation/web/components/features/control-center/use-control-center-state.d.ts +8 -0
  62. package/dist/src/presentation/web/components/features/control-center/use-control-center-state.d.ts.map +1 -1
  63. package/dist/src/presentation/web/components/features/control-center/use-control-center-state.js +160 -354
  64. package/dist/src/presentation/web/components/features/features-canvas/features-canvas.d.ts +2 -10
  65. package/dist/src/presentation/web/components/features/features-canvas/features-canvas.d.ts.map +1 -1
  66. package/dist/src/presentation/web/components/features/features-canvas/features-canvas.js +11 -54
  67. package/dist/src/presentation/web/components/features/features-canvas/features-canvas.stories.d.ts.map +1 -1
  68. package/dist/src/presentation/web/components/features/features-canvas/features-canvas.stories.js +0 -46
  69. package/dist/src/presentation/web/components/layouts/app-shell/app-shell.js +1 -1
  70. package/dist/src/presentation/web/components/layouts/app-sidebar/app-sidebar.d.ts +1 -3
  71. package/dist/src/presentation/web/components/layouts/app-sidebar/app-sidebar.d.ts.map +1 -1
  72. package/dist/src/presentation/web/components/layouts/app-sidebar/app-sidebar.js +2 -2
  73. package/dist/src/presentation/web/components/ui/alert-dialog.d.ts.map +1 -1
  74. package/dist/src/presentation/web/components/ui/alert-dialog.js +2 -2
  75. package/dist/src/presentation/web/components/ui/dialog.d.ts.map +1 -1
  76. package/dist/src/presentation/web/components/ui/dialog.js +2 -2
  77. package/dist/src/presentation/web/components/ui/scroll-area.js +1 -1
  78. package/dist/src/presentation/web/hooks/agent-events-provider.d.ts.map +1 -1
  79. package/dist/src/presentation/web/hooks/agent-events-provider.js +3 -2
  80. package/dist/src/presentation/web/hooks/use-agent-events.d.ts.map +1 -1
  81. package/dist/src/presentation/web/hooks/use-agent-events.js +18 -5
  82. package/dist/src/presentation/web/hooks/use-deploy-action.d.ts.map +1 -1
  83. package/dist/src/presentation/web/hooks/use-deploy-action.js +8 -3
  84. package/dist/src/presentation/web/hooks/use-graph-state.d.ts +42 -0
  85. package/dist/src/presentation/web/hooks/use-graph-state.d.ts.map +1 -0
  86. package/dist/src/presentation/web/hooks/use-graph-state.js +257 -0
  87. package/dist/src/presentation/web/hooks/use-notifications.d.ts +1 -5
  88. package/dist/src/presentation/web/hooks/use-notifications.d.ts.map +1 -1
  89. package/dist/src/presentation/web/hooks/use-notifications.js +1 -26
  90. package/dist/src/presentation/web/hooks/use-notifications.stories.d.ts.map +1 -1
  91. package/dist/src/presentation/web/hooks/use-notifications.stories.js +28 -38
  92. package/dist/src/presentation/web/lib/derive-graph.d.ts +52 -0
  93. package/dist/src/presentation/web/lib/derive-graph.d.ts.map +1 -0
  94. package/dist/src/presentation/web/lib/derive-graph.js +126 -0
  95. package/dist/src/presentation/web/lib/layout-with-dagre.d.ts.map +1 -1
  96. package/dist/src/presentation/web/lib/layout-with-dagre.js +1 -2
  97. package/dist/src/presentation/web/lib/logger.d.ts +7 -0
  98. package/dist/src/presentation/web/lib/logger.d.ts.map +1 -0
  99. package/dist/src/presentation/web/lib/logger.js +11 -0
  100. package/dist/tsconfig.build.tsbuildinfo +1 -1
  101. package/package.json +1 -1
  102. package/web/.next/BUILD_ID +1 -1
  103. package/web/.next/build-manifest.json +2 -2
  104. package/web/.next/cache/.previewinfo +1 -1
  105. package/web/.next/cache/.rscinfo +1 -1
  106. package/web/.next/cache/.tsbuildinfo +1 -1
  107. package/web/.next/cache/config.json +3 -3
  108. package/web/.next/fallback-build-manifest.json +2 -2
  109. package/web/.next/prerender-manifest.json +3 -3
  110. package/web/.next/required-server-files.js +1 -1
  111. package/web/.next/required-server-files.json +1 -1
  112. package/web/.next/server/app/(dashboard)/@drawer/create/page/server-reference-manifest.json +34 -34
  113. package/web/.next/server/app/(dashboard)/@drawer/create/page.js +3 -3
  114. package/web/.next/server/app/(dashboard)/@drawer/create/page.js.nft.json +1 -1
  115. package/web/.next/server/app/(dashboard)/@drawer/create/page_client-reference-manifest.js +1 -1
  116. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page/server-reference-manifest.json +40 -40
  117. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js +3 -3
  118. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js.nft.json +1 -1
  119. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page_client-reference-manifest.js +1 -1
  120. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page/server-reference-manifest.json +30 -30
  121. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js +3 -3
  122. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js.nft.json +1 -1
  123. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  124. package/web/.next/server/app/(dashboard)/create/page/server-reference-manifest.json +34 -34
  125. package/web/.next/server/app/(dashboard)/create/page.js +3 -3
  126. package/web/.next/server/app/(dashboard)/create/page.js.nft.json +1 -1
  127. package/web/.next/server/app/(dashboard)/create/page_client-reference-manifest.js +1 -1
  128. package/web/.next/server/app/(dashboard)/feature/[featureId]/page/server-reference-manifest.json +40 -40
  129. package/web/.next/server/app/(dashboard)/feature/[featureId]/page.js +3 -3
  130. package/web/.next/server/app/(dashboard)/feature/[featureId]/page.js.nft.json +1 -1
  131. package/web/.next/server/app/(dashboard)/feature/[featureId]/page_client-reference-manifest.js +1 -1
  132. package/web/.next/server/app/(dashboard)/page/server-reference-manifest.json +30 -30
  133. package/web/.next/server/app/(dashboard)/page.js +3 -3
  134. package/web/.next/server/app/(dashboard)/page.js.nft.json +1 -1
  135. package/web/.next/server/app/(dashboard)/page_client-reference-manifest.js +1 -1
  136. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page/server-reference-manifest.json +30 -30
  137. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js +3 -3
  138. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js.nft.json +1 -1
  139. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  140. package/web/.next/server/app/_global-error.html +2 -2
  141. package/web/.next/server/app/_global-error.rsc +1 -1
  142. package/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  143. package/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  144. package/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  145. package/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  146. package/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  147. package/web/.next/server/app/_not-found/page/server-reference-manifest.json +1 -1
  148. package/web/.next/server/app/_not-found/page.js.nft.json +1 -1
  149. package/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  150. package/web/.next/server/app/skills/page/server-reference-manifest.json +6 -6
  151. package/web/.next/server/app/skills/page.js.nft.json +1 -1
  152. package/web/.next/server/app/skills/page_client-reference-manifest.js +1 -1
  153. package/web/.next/server/app/tools/page/server-reference-manifest.json +6 -6
  154. package/web/.next/server/app/tools/page.js.nft.json +1 -1
  155. package/web/.next/server/app/tools/page_client-reference-manifest.js +1 -1
  156. package/web/.next/server/app/version/page/server-reference-manifest.json +1 -1
  157. package/web/.next/server/app/version/page.js.nft.json +1 -1
  158. package/web/.next/server/app/version/page_client-reference-manifest.js +1 -1
  159. package/web/.next/server/chunks/403f9_next_dist_esm_build_templates_app-route_4d623b8e.js +2 -2
  160. package/web/.next/server/chunks/403f9_next_dist_esm_build_templates_app-route_4d623b8e.js.map +1 -1
  161. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js +1 -1
  162. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js.map +1 -1
  163. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_816618e2.js +3 -0
  164. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_816618e2.js.map +1 -0
  165. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_ba2e050f.js +3 -0
  166. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_ba2e050f.js.map +1 -0
  167. package/web/.next/server/chunks/ssr/[root-of-the-server]__17a611f0._.js +2 -2
  168. package/web/.next/server/chunks/ssr/[root-of-the-server]__17a611f0._.js.map +1 -1
  169. package/web/.next/server/chunks/ssr/[root-of-the-server]__2018e25f._.js +1 -1
  170. package/web/.next/server/chunks/ssr/[root-of-the-server]__2018e25f._.js.map +1 -1
  171. package/web/.next/server/chunks/ssr/[root-of-the-server]__249c74f6._.js +1 -1
  172. package/web/.next/server/chunks/ssr/[root-of-the-server]__45dbf93d._.js +2 -2
  173. package/web/.next/server/chunks/ssr/[root-of-the-server]__45dbf93d._.js.map +1 -1
  174. package/web/.next/server/chunks/ssr/{[root-of-the-server]__cbae9863._.js → [root-of-the-server]__6258349c._.js} +2 -2
  175. package/web/.next/server/chunks/ssr/[root-of-the-server]__6258349c._.js.map +1 -0
  176. package/web/.next/server/chunks/ssr/[root-of-the-server]__6b17a22d._.js +1 -1
  177. package/web/.next/server/chunks/ssr/[root-of-the-server]__6b17a22d._.js.map +1 -1
  178. package/web/.next/server/chunks/ssr/[root-of-the-server]__6cbc1149._.js +2 -2
  179. package/web/.next/server/chunks/ssr/[root-of-the-server]__6cbc1149._.js.map +1 -1
  180. package/web/.next/server/chunks/ssr/[root-of-the-server]__804c006d._.js +1 -1
  181. package/web/.next/server/chunks/ssr/[root-of-the-server]__804c006d._.js.map +1 -1
  182. package/web/.next/server/chunks/ssr/{[root-of-the-server]__e5e09f72._.js → [root-of-the-server]__94a6d275._.js} +2 -2
  183. package/web/.next/server/chunks/ssr/[root-of-the-server]__94a6d275._.js.map +1 -0
  184. package/web/.next/server/chunks/ssr/[root-of-the-server]__aad040c0._.js +1 -1
  185. package/web/.next/server/chunks/ssr/[root-of-the-server]__aad040c0._.js.map +1 -1
  186. package/web/.next/server/chunks/ssr/_07c2a32a._.js +1 -1
  187. package/web/.next/server/chunks/ssr/_07c2a32a._.js.map +1 -1
  188. package/web/.next/server/chunks/ssr/_0e9d6bf7._.js +1 -1
  189. package/web/.next/server/chunks/ssr/_0e9d6bf7._.js.map +1 -1
  190. package/web/.next/server/chunks/ssr/_250a63ae._.js +3 -0
  191. package/web/.next/server/chunks/ssr/_250a63ae._.js.map +1 -0
  192. package/web/.next/server/chunks/ssr/_61351ed3._.js +1 -1
  193. package/web/.next/server/chunks/ssr/_61351ed3._.js.map +1 -1
  194. package/web/.next/server/chunks/ssr/_8400c8bb._.js +1 -1
  195. package/web/.next/server/chunks/ssr/_8400c8bb._.js.map +1 -1
  196. package/web/.next/server/chunks/ssr/_9f940437._.js +1 -1
  197. package/web/.next/server/chunks/ssr/_9f940437._.js.map +1 -1
  198. package/web/.next/server/chunks/ssr/_dee726e3._.js +6 -0
  199. package/web/.next/server/chunks/ssr/_dee726e3._.js.map +1 -0
  200. package/web/.next/{standalone/src/presentation/web/.next/server/chunks/ssr/src_presentation_web_5ea689db._.js → server/chunks/ssr/src_presentation_web_2b91e4ec._.js} +2 -2
  201. package/web/.next/server/chunks/ssr/{src_presentation_web_7188a290._.js.map → src_presentation_web_2b91e4ec._.js.map} +1 -1
  202. package/web/.next/server/chunks/ssr/{src_presentation_web_5ea689db._.js → src_presentation_web_5bcc1537._.js} +2 -2
  203. package/web/.next/server/chunks/ssr/{src_presentation_web_5ea689db._.js.map → src_presentation_web_5bcc1537._.js.map} +1 -1
  204. package/web/.next/server/chunks/ssr/src_presentation_web_67178b88._.js +1 -1
  205. package/web/.next/server/chunks/ssr/src_presentation_web_67178b88._.js.map +1 -1
  206. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_5955c012.js +3 -0
  207. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_5955c012.js.map +1 -0
  208. package/web/.next/server/chunks/ssr/src_presentation_web_ca99d62d._.js +3 -0
  209. package/web/.next/server/chunks/ssr/src_presentation_web_ca99d62d._.js.map +1 -0
  210. package/web/.next/server/chunks/ssr/src_presentation_web_components_e599bb8c._.js +1 -1
  211. package/web/.next/server/chunks/ssr/src_presentation_web_components_e599bb8c._.js.map +1 -1
  212. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js +1 -1
  213. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js.map +1 -1
  214. package/web/.next/server/chunks/ssr/src_presentation_web_d5b0cb86._.js +8 -0
  215. package/web/.next/server/chunks/ssr/src_presentation_web_d5b0cb86._.js.map +1 -0
  216. package/web/.next/server/chunks/ssr/src_presentation_web_e626b63c._.js +8 -0
  217. package/web/.next/server/chunks/ssr/src_presentation_web_e626b63c._.js.map +1 -0
  218. package/web/.next/server/pages/500.html +2 -2
  219. package/web/.next/server/server-reference-manifest.js +1 -1
  220. package/web/.next/server/server-reference-manifest.json +142 -142
  221. package/web/.next/standalone/src/presentation/web/.next/BUILD_ID +1 -1
  222. package/web/.next/standalone/src/presentation/web/.next/build-manifest.json +2 -2
  223. package/web/.next/standalone/src/presentation/web/.next/prerender-manifest.json +3 -3
  224. package/web/.next/standalone/src/presentation/web/.next/required-server-files.json +1 -1
  225. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/@drawer/create/page/server-reference-manifest.json +34 -34
  226. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/@drawer/create/page.js +3 -3
  227. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/@drawer/create/page.js.nft.json +1 -1
  228. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/@drawer/create/page_client-reference-manifest.js +1 -1
  229. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page/server-reference-manifest.json +40 -40
  230. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js +3 -3
  231. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js.nft.json +1 -1
  232. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page_client-reference-manifest.js +1 -1
  233. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page/server-reference-manifest.json +30 -30
  234. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js +3 -3
  235. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js.nft.json +1 -1
  236. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  237. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/create/page/server-reference-manifest.json +34 -34
  238. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/create/page.js +3 -3
  239. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/create/page.js.nft.json +1 -1
  240. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/create/page_client-reference-manifest.js +1 -1
  241. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/feature/[featureId]/page/server-reference-manifest.json +40 -40
  242. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/feature/[featureId]/page.js +3 -3
  243. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/feature/[featureId]/page.js.nft.json +1 -1
  244. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/feature/[featureId]/page_client-reference-manifest.js +1 -1
  245. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/page/server-reference-manifest.json +30 -30
  246. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/page.js +3 -3
  247. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/page.js.nft.json +1 -1
  248. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/page_client-reference-manifest.js +1 -1
  249. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/repository/[repositoryId]/page/server-reference-manifest.json +30 -30
  250. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js +3 -3
  251. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js.nft.json +1 -1
  252. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  253. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.html +2 -2
  254. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.rsc +1 -1
  255. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  256. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  257. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  258. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  259. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  260. package/web/.next/standalone/src/presentation/web/.next/server/app/_not-found/page/server-reference-manifest.json +1 -1
  261. package/web/.next/standalone/src/presentation/web/.next/server/app/_not-found/page.js.nft.json +1 -1
  262. package/web/.next/standalone/src/presentation/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  263. package/web/.next/standalone/src/presentation/web/.next/server/app/skills/page/server-reference-manifest.json +6 -6
  264. package/web/.next/standalone/src/presentation/web/.next/server/app/skills/page.js.nft.json +1 -1
  265. package/web/.next/standalone/src/presentation/web/.next/server/app/skills/page_client-reference-manifest.js +1 -1
  266. package/web/.next/standalone/src/presentation/web/.next/server/app/tools/page/server-reference-manifest.json +6 -6
  267. package/web/.next/standalone/src/presentation/web/.next/server/app/tools/page.js.nft.json +1 -1
  268. package/web/.next/standalone/src/presentation/web/.next/server/app/tools/page_client-reference-manifest.js +1 -1
  269. package/web/.next/standalone/src/presentation/web/.next/server/app/version/page/server-reference-manifest.json +1 -1
  270. package/web/.next/standalone/src/presentation/web/.next/server/app/version/page.js.nft.json +1 -1
  271. package/web/.next/standalone/src/presentation/web/.next/server/app/version/page_client-reference-manifest.js +1 -1
  272. package/web/.next/standalone/src/presentation/web/.next/server/chunks/403f9_next_dist_esm_build_templates_app-route_4d623b8e.js +2 -2
  273. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js +1 -1
  274. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_816618e2.js +3 -0
  275. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_ba2e050f.js +3 -0
  276. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__17a611f0._.js +2 -2
  277. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__2018e25f._.js +1 -1
  278. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__249c74f6._.js +1 -1
  279. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__45dbf93d._.js +2 -2
  280. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/{[root-of-the-server]__cbae9863._.js → [root-of-the-server]__6258349c._.js} +2 -2
  281. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__6b17a22d._.js +1 -1
  282. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__6cbc1149._.js +2 -2
  283. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__804c006d._.js +1 -1
  284. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/{[root-of-the-server]__e5e09f72._.js → [root-of-the-server]__94a6d275._.js} +2 -2
  285. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__aad040c0._.js +1 -1
  286. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_07c2a32a._.js +1 -1
  287. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_0e9d6bf7._.js +1 -1
  288. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_250a63ae._.js +3 -0
  289. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_61351ed3._.js +1 -1
  290. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_8400c8bb._.js +1 -1
  291. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_9f940437._.js +1 -1
  292. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_dee726e3._.js +6 -0
  293. package/web/.next/{server/chunks/ssr/src_presentation_web_7188a290._.js → standalone/src/presentation/web/.next/server/chunks/ssr/src_presentation_web_2b91e4ec._.js} +2 -2
  294. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/{src_presentation_web_7188a290._.js → src_presentation_web_5bcc1537._.js} +2 -2
  295. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/src_presentation_web_67178b88._.js +1 -1
  296. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_5955c012.js +3 -0
  297. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/src_presentation_web_ca99d62d._.js +3 -0
  298. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/src_presentation_web_components_e599bb8c._.js +1 -1
  299. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js +1 -1
  300. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/src_presentation_web_d5b0cb86._.js +8 -0
  301. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/src_presentation_web_e626b63c._.js +8 -0
  302. package/web/.next/standalone/src/presentation/web/.next/server/pages/500.html +2 -2
  303. package/web/.next/standalone/src/presentation/web/.next/server/server-reference-manifest.js +1 -1
  304. package/web/.next/standalone/src/presentation/web/.next/server/server-reference-manifest.json +142 -142
  305. package/web/.next/standalone/src/presentation/web/CLAUDE.md +77 -33
  306. package/web/.next/standalone/src/presentation/web/app/actions/create-feature.ts +27 -2
  307. package/web/.next/standalone/src/presentation/web/app/actions/get-feature-metadata.ts +18 -0
  308. package/web/.next/standalone/src/presentation/web/app/api/agent-events/route.ts +17 -0
  309. package/web/.next/standalone/src/presentation/web/app/build-feature-node-data.ts +3 -30
  310. package/web/.next/standalone/src/presentation/web/app/build-graph-nodes.ts +3 -30
  311. package/web/.next/standalone/src/presentation/web/app/layout.tsx +1 -1
  312. package/web/.next/standalone/src/presentation/web/components/common/add-repository-button/index.ts +1 -0
  313. package/web/.next/standalone/src/presentation/web/components/common/control-center-drawer/create-drawer-client.tsx +15 -21
  314. package/web/.next/standalone/src/presentation/web/components/common/control-center-drawer/drawer-view.ts +12 -13
  315. package/web/.next/standalone/src/presentation/web/components/common/control-center-drawer/feature-drawer-client.tsx +105 -141
  316. package/web/.next/standalone/src/presentation/web/components/common/control-center-drawer/index.ts +0 -1
  317. package/web/.next/standalone/src/presentation/web/components/common/control-center-drawer/use-artifact-fetch.ts +56 -0
  318. package/web/.next/standalone/src/presentation/web/components/common/feature-drawer/use-feature-actions.ts +6 -7
  319. package/web/.next/standalone/src/presentation/web/components/common/feature-node/derive-feature-state.ts +63 -2
  320. package/web/.next/standalone/src/presentation/web/components/common/index.ts +2 -12
  321. package/web/.next/standalone/src/presentation/web/components/common/repository-node/repository-node.tsx +2 -2
  322. package/web/.next/standalone/src/presentation/web/components/common/repository-node/use-repository-actions.ts +29 -54
  323. package/web/.next/standalone/src/presentation/web/components/common/sidebar-section-header/sidebar-section-header.stories.tsx +0 -13
  324. package/web/.next/standalone/src/presentation/web/components/common/sidebar-section-header/sidebar-section-header.tsx +1 -45
  325. package/web/.next/standalone/src/presentation/web/components/features/control-center/control-center-empty-state.tsx +1 -1
  326. package/web/.next/standalone/src/presentation/web/components/features/control-center/control-center-inner.tsx +43 -36
  327. package/web/.next/standalone/src/presentation/web/components/features/control-center/control-center.stories.tsx +2 -41
  328. package/web/.next/standalone/src/presentation/web/components/features/control-center/use-control-center-state.ts +203 -440
  329. package/web/.next/standalone/src/presentation/web/components/features/features-canvas/features-canvas.stories.tsx +0 -48
  330. package/web/.next/standalone/src/presentation/web/components/features/features-canvas/features-canvas.tsx +13 -76
  331. package/web/.next/standalone/src/presentation/web/components/layouts/app-shell/app-shell.tsx +1 -1
  332. package/web/.next/standalone/src/presentation/web/components/layouts/app-sidebar/app-sidebar.tsx +2 -14
  333. package/web/.next/standalone/src/presentation/web/components/ui/alert-dialog.tsx +2 -5
  334. package/web/.next/standalone/src/presentation/web/components/ui/dialog.tsx +2 -5
  335. package/web/.next/standalone/src/presentation/web/components/ui/scroll-area.tsx +1 -1
  336. package/web/.next/standalone/src/presentation/web/hooks/agent-events-provider.tsx +7 -2
  337. package/web/.next/standalone/src/presentation/web/hooks/use-agent-events.ts +19 -5
  338. package/web/.next/standalone/src/presentation/web/hooks/use-deploy-action.ts +11 -3
  339. package/web/.next/standalone/src/presentation/web/hooks/use-graph-state.ts +376 -0
  340. package/web/.next/standalone/src/presentation/web/hooks/use-notifications.stories.tsx +2 -30
  341. package/web/.next/standalone/src/presentation/web/hooks/use-notifications.ts +2 -36
  342. package/web/.next/standalone/src/presentation/web/lib/derive-graph.ts +178 -0
  343. package/web/.next/standalone/src/presentation/web/lib/layout-with-dagre.ts +1 -2
  344. package/web/.next/standalone/src/presentation/web/lib/logger.ts +12 -0
  345. package/web/.next/standalone/src/presentation/web/server.js +1 -1
  346. package/web/.next/static/chunks/0ffccd7be73305c8.css +2 -0
  347. package/web/.next/static/chunks/15ceb197ec725da2.js +1 -0
  348. package/web/.next/static/chunks/3f205fd6adbfd20a.js +7 -0
  349. package/web/.next/static/chunks/{d4492cd12fdf0891.js → 6691ad02dc1efd1f.js} +1 -1
  350. package/web/.next/static/chunks/{64850cf4081a2950.js → 7bff5fbcbf157df5.js} +1 -1
  351. package/web/.next/static/chunks/8959112899679e25.js +1 -0
  352. package/web/.next/static/chunks/{c83897e9213881bf.js → 8f508ef906cbf0fa.js} +1 -1
  353. package/web/.next/static/chunks/9cbb42a6bd516d3b.js +1 -0
  354. package/web/.next/static/chunks/c5603ed8a95d460d.js +1 -0
  355. package/web/.next/static/chunks/cb41849bcfaa304e.js +1 -0
  356. package/web/.next/static/chunks/d7e0cd32364a8d76.js +1 -0
  357. package/web/.next/static/chunks/e69d79bd3f19dec8.js +4 -0
  358. package/web/.next/trace +1 -1
  359. package/web/.next/trace-build +1 -1
  360. package/dist/src/presentation/web/components/common/add-repository-node/add-repository-button.d.ts.map +0 -1
  361. package/dist/src/presentation/web/components/common/add-repository-node/add-repository-node-config.d.ts +0 -7
  362. package/dist/src/presentation/web/components/common/add-repository-node/add-repository-node-config.d.ts.map +0 -1
  363. package/dist/src/presentation/web/components/common/add-repository-node/add-repository-node-config.js +0 -1
  364. package/dist/src/presentation/web/components/common/add-repository-node/add-repository-node.d.ts +0 -6
  365. package/dist/src/presentation/web/components/common/add-repository-node/add-repository-node.d.ts.map +0 -1
  366. package/dist/src/presentation/web/components/common/add-repository-node/add-repository-node.js +0 -23
  367. package/dist/src/presentation/web/components/common/add-repository-node/add-repository-node.stories.d.ts +0 -10
  368. package/dist/src/presentation/web/components/common/add-repository-node/add-repository-node.stories.d.ts.map +0 -1
  369. package/dist/src/presentation/web/components/common/add-repository-node/add-repository-node.stories.js +0 -33
  370. package/dist/src/presentation/web/components/common/add-repository-node/index.d.ts +0 -4
  371. package/dist/src/presentation/web/components/common/add-repository-node/index.d.ts.map +0 -1
  372. package/dist/src/presentation/web/components/common/add-repository-node/pick-folder.d.ts.map +0 -1
  373. package/dist/src/presentation/web/components/common/control-center-drawer/control-center-drawer.d.ts +0 -12
  374. package/dist/src/presentation/web/components/common/control-center-drawer/control-center-drawer.d.ts.map +0 -1
  375. package/dist/src/presentation/web/components/common/control-center-drawer/control-center-drawer.js +0 -337
  376. package/dist/src/presentation/web/components/common/control-center-drawer/control-center-drawer.stories.d.ts +0 -33
  377. package/dist/src/presentation/web/components/common/control-center-drawer/control-center-drawer.stories.d.ts.map +0 -1
  378. package/dist/src/presentation/web/components/common/control-center-drawer/control-center-drawer.stories.js +0 -214
  379. package/dist/src/presentation/web/components/common/notification-permission-banner/index.d.ts +0 -2
  380. package/dist/src/presentation/web/components/common/notification-permission-banner/index.d.ts.map +0 -1
  381. package/dist/src/presentation/web/components/common/notification-permission-banner/index.js +0 -1
  382. package/dist/src/presentation/web/components/common/notification-permission-banner/notification-permission-banner.d.ts +0 -2
  383. package/dist/src/presentation/web/components/common/notification-permission-banner/notification-permission-banner.d.ts.map +0 -1
  384. package/dist/src/presentation/web/components/common/notification-permission-banner/notification-permission-banner.js +0 -33
  385. package/dist/src/presentation/web/components/common/notification-permission-banner/notification-permission-banner.stories.d.ts +0 -6
  386. package/dist/src/presentation/web/components/common/notification-permission-banner/notification-permission-banner.stories.d.ts.map +0 -1
  387. package/dist/src/presentation/web/components/common/notification-permission-banner/notification-permission-banner.stories.js +0 -24
  388. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_3a02d8a5.js +0 -3
  389. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_3a02d8a5.js.map +0 -1
  390. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_a3044852.js +0 -3
  391. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_a3044852.js.map +0 -1
  392. package/web/.next/server/chunks/ssr/[root-of-the-server]__cbae9863._.js.map +0 -1
  393. package/web/.next/server/chunks/ssr/[root-of-the-server]__e5e09f72._.js.map +0 -1
  394. package/web/.next/server/chunks/ssr/_38d24563._.js +0 -6
  395. package/web/.next/server/chunks/ssr/_38d24563._.js.map +0 -1
  396. package/web/.next/server/chunks/ssr/_6e08ce21._.js +0 -3
  397. package/web/.next/server/chunks/ssr/_6e08ce21._.js.map +0 -1
  398. package/web/.next/server/chunks/ssr/src_presentation_web_0a49d9ee._.js +0 -8
  399. package/web/.next/server/chunks/ssr/src_presentation_web_0a49d9ee._.js.map +0 -1
  400. package/web/.next/server/chunks/ssr/src_presentation_web_79b0305a._.js +0 -8
  401. package/web/.next/server/chunks/ssr/src_presentation_web_79b0305a._.js.map +0 -1
  402. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_cc16bd01.js +0 -3
  403. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_cc16bd01.js.map +0 -1
  404. package/web/.next/server/chunks/ssr/src_presentation_web_app_(dashboard)_get-graph-data_ts_b018483e._.js +0 -3
  405. package/web/.next/server/chunks/ssr/src_presentation_web_app_(dashboard)_get-graph-data_ts_b018483e._.js.map +0 -1
  406. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_3a02d8a5.js +0 -3
  407. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_a3044852.js +0 -3
  408. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_38d24563._.js +0 -6
  409. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_6e08ce21._.js +0 -3
  410. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/src_presentation_web_0a49d9ee._.js +0 -8
  411. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/src_presentation_web_79b0305a._.js +0 -8
  412. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_cc16bd01.js +0 -3
  413. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/src_presentation_web_app_(dashboard)_get-graph-data_ts_b018483e._.js +0 -3
  414. package/web/.next/standalone/src/presentation/web/components/common/add-repository-node/add-repository-node-config.ts +0 -8
  415. package/web/.next/standalone/src/presentation/web/components/common/add-repository-node/add-repository-node.stories.tsx +0 -70
  416. package/web/.next/standalone/src/presentation/web/components/common/add-repository-node/add-repository-node.tsx +0 -49
  417. package/web/.next/standalone/src/presentation/web/components/common/add-repository-node/index.ts +0 -3
  418. package/web/.next/standalone/src/presentation/web/components/common/control-center-drawer/control-center-drawer.stories.tsx +0 -293
  419. package/web/.next/standalone/src/presentation/web/components/common/control-center-drawer/control-center-drawer.tsx +0 -745
  420. package/web/.next/standalone/src/presentation/web/components/common/notification-permission-banner/index.ts +0 -1
  421. package/web/.next/standalone/src/presentation/web/components/common/notification-permission-banner/notification-permission-banner.stories.tsx +0 -52
  422. package/web/.next/standalone/src/presentation/web/components/common/notification-permission-banner/notification-permission-banner.tsx +0 -55
  423. package/web/.next/static/chunks/0c54314c8c9c9739.js +0 -7
  424. package/web/.next/static/chunks/10cd08dae8c210ff.js +0 -1
  425. package/web/.next/static/chunks/15bf7ee1da91eb46.js +0 -4
  426. package/web/.next/static/chunks/3c79bca4d3f18f66.js +0 -1
  427. package/web/.next/static/chunks/67f2a7a5e8dc358a.css +0 -2
  428. package/web/.next/static/chunks/6cc840197626843b.js +0 -1
  429. package/web/.next/static/chunks/e3239b6c18cf8b96.js +0 -1
  430. package/web/.next/static/chunks/e9cc53ce8a7bdea6.js +0 -1
  431. package/web/.next/static/chunks/ef916db8c537211a.js +0 -1
  432. /package/dist/src/presentation/web/components/common/{add-repository-node → add-repository-button}/add-repository-button.d.ts +0 -0
  433. /package/dist/src/presentation/web/components/common/{add-repository-node → add-repository-button}/add-repository-button.js +0 -0
  434. /package/dist/src/presentation/web/components/common/{add-repository-node → add-repository-button}/pick-folder.d.ts +0 -0
  435. /package/dist/src/presentation/web/components/common/{add-repository-node → add-repository-button}/pick-folder.js +0 -0
  436. /package/web/.next/standalone/src/presentation/web/components/common/{add-repository-node → add-repository-button}/add-repository-button.tsx +0 -0
  437. /package/web/.next/standalone/src/presentation/web/components/common/{add-repository-node → add-repository-button}/pick-folder.ts +0 -0
  438. /package/web/.next/static/{Atrl1oUfRQej2kgJ972uS → 1AvkeBASQdtzZt9cm9UYg}/_buildManifest.js +0 -0
  439. /package/web/.next/static/{Atrl1oUfRQej2kgJ972uS → 1AvkeBASQdtzZt9cm9UYg}/_clientMiddlewareManifest.json +0 -0
  440. /package/web/.next/static/{Atrl1oUfRQej2kgJ972uS → 1AvkeBASQdtzZt9cm9UYg}/_ssgManifest.js +0 -0
@@ -1,27 +1,19 @@
1
1
  import type { Connection, Edge, NodeChange } from '@xyflow/react';
2
2
  import type { FeatureNodeType } from '../../common/feature-node/index.js';
3
3
  import type { RepositoryNodeType } from '../../common/repository-node/index.js';
4
- import type { AddRepositoryNodeType } from '../../common/add-repository-node/index.js';
5
- export type CanvasNodeType = FeatureNodeType | RepositoryNodeType | AddRepositoryNodeType;
4
+ export type CanvasNodeType = FeatureNodeType | RepositoryNodeType;
6
5
  export interface FeaturesCanvasProps {
7
6
  nodes: CanvasNodeType[];
8
7
  edges: Edge[];
9
8
  selectedFeatureId?: string | null;
10
9
  onNodesChange?: (changes: NodeChange<CanvasNodeType>[]) => void;
11
10
  onAddFeature?: () => void;
12
- onNodeAction?: (nodeId: string) => void;
13
- onNodeSettings?: (nodeId: string) => void;
14
11
  onNodeClick?: (event: React.MouseEvent, node: CanvasNodeType) => void;
15
12
  onPaneClick?: (event: React.MouseEvent) => void;
16
- onRepositoryAdd?: (repoNodeId: string) => void;
17
- onRepositoryClick?: (nodeId: string) => void;
18
- onRepositoryDelete?: (repositoryId: string) => void;
19
- onFeatureDelete?: (featureId: string) => void;
20
13
  onConnect?: (connection: Connection) => void;
21
- onRepositorySelect?: (path: string) => void;
22
14
  onCanvasDrag?: () => void;
23
15
  toolbar?: React.ReactNode;
24
16
  emptyState?: React.ReactNode;
25
17
  }
26
- export declare function FeaturesCanvas({ nodes, edges, selectedFeatureId, onNodesChange, onAddFeature, onNodeAction, onNodeSettings, onConnect, onNodeClick, onPaneClick, onRepositoryAdd, onRepositoryClick, onRepositoryDelete, onFeatureDelete, onRepositorySelect, onCanvasDrag, toolbar, emptyState, }: FeaturesCanvasProps): import("react/jsx-runtime").JSX.Element;
18
+ export declare function FeaturesCanvas({ nodes, edges, selectedFeatureId, onNodesChange, onAddFeature, onConnect, onNodeClick, onPaneClick, onCanvasDrag, toolbar, emptyState, }: FeaturesCanvasProps): import("react/jsx-runtime").JSX.Element;
27
19
  //# sourceMappingURL=features-canvas.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"features-canvas.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/features/features-canvas/features-canvas.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAKlE,OAAO,KAAK,EAAE,eAAe,EAAmB,MAAM,kCAAkC,CAAC;AAEzF,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,qCAAqC,CAAC;AAE9E,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,yCAAyC,CAAC;AAGrF,MAAM,MAAM,cAAc,GAAG,eAAe,GAAG,kBAAkB,GAAG,qBAAqB,CAAC;AAE1F,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,cAAc,EAAE,CAAC;IACxB,KAAK,EAAE,IAAI,EAAE,CAAC;IACd,iBAAiB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,aAAa,CAAC,EAAE,CAAC,OAAO,EAAE,UAAU,CAAC,cAAc,CAAC,EAAE,KAAK,IAAI,CAAC;IAChE,YAAY,CAAC,EAAE,MAAM,IAAI,CAAC;IAC1B,YAAY,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC,cAAc,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IAC1C,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,UAAU,EAAE,IAAI,EAAE,cAAc,KAAK,IAAI,CAAC;IACtE,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,UAAU,KAAK,IAAI,CAAC;IAChD,eAAe,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,IAAI,CAAC;IAC/C,iBAAiB,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IAC7C,kBAAkB,CAAC,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,IAAI,CAAC;IACpD,eAAe,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IAC9C,SAAS,CAAC,EAAE,CAAC,UAAU,EAAE,UAAU,KAAK,IAAI,CAAC;IAC7C,kBAAkB,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAC5C,YAAY,CAAC,EAAE,MAAM,IAAI,CAAC;IAC1B,OAAO,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,UAAU,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;CAC9B;AAED,wBAAgB,cAAc,CAAC,EAC7B,KAAK,EACL,KAAK,EACL,iBAAiB,EACjB,aAAa,EACb,YAAY,EACZ,YAAY,EACZ,cAAc,EACd,SAAS,EACT,WAAW,EACX,WAAW,EACX,eAAe,EACf,iBAAiB,EACjB,kBAAkB,EAClB,eAAe,EACf,kBAAkB,EAClB,YAAY,EACZ,OAAO,EACP,UAAU,GACX,EAAE,mBAAmB,2CAiIrB"}
1
+ {"version":3,"file":"features-canvas.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/features/features-canvas/features-canvas.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAKlE,OAAO,KAAK,EAAE,eAAe,EAAmB,MAAM,kCAAkC,CAAC;AAEzF,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,qCAAqC,CAAC;AAG9E,MAAM,MAAM,cAAc,GAAG,eAAe,GAAG,kBAAkB,CAAC;AAElE,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,cAAc,EAAE,CAAC;IACxB,KAAK,EAAE,IAAI,EAAE,CAAC;IACd,iBAAiB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,aAAa,CAAC,EAAE,CAAC,OAAO,EAAE,UAAU,CAAC,cAAc,CAAC,EAAE,KAAK,IAAI,CAAC;IAChE,YAAY,CAAC,EAAE,MAAM,IAAI,CAAC;IAC1B,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,UAAU,EAAE,IAAI,EAAE,cAAc,KAAK,IAAI,CAAC;IACtE,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,UAAU,KAAK,IAAI,CAAC;IAChD,SAAS,CAAC,EAAE,CAAC,UAAU,EAAE,UAAU,KAAK,IAAI,CAAC;IAC7C,YAAY,CAAC,EAAE,MAAM,IAAI,CAAC;IAC1B,OAAO,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,UAAU,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;CAC9B;AAED,wBAAgB,cAAc,CAAC,EAC7B,KAAK,EACL,KAAK,EACL,iBAAiB,EACjB,aAAa,EACb,YAAY,EACZ,SAAS,EACT,WAAW,EACX,WAAW,EACX,YAAY,EACZ,OAAO,EACP,UAAU,GACX,EAAE,mBAAmB,2CAkFrB"}
@@ -1,77 +1,34 @@
1
1
  'use client';
2
2
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
- import { useCallback, useMemo } from 'react';
3
+ import { useMemo } from 'react';
4
4
  import { ReactFlow, Background, Controls } from '@xyflow/react';
5
5
  import { Plus } from 'lucide-react';
6
6
  import { Button } from '../../ui/button.js';
7
7
  import { EmptyState } from '../../common/empty-state/index.js';
8
8
  import { FeatureNode } from '../../common/feature-node/index.js';
9
9
  import { RepositoryNode } from '../../common/repository-node/index.js';
10
- import { AddRepositoryNode } from '../../common/add-repository-node/index.js';
11
10
  import { DependencyEdge } from './dependency-edge.js';
12
- export function FeaturesCanvas({ nodes, edges, selectedFeatureId, onNodesChange, onAddFeature, onNodeAction, onNodeSettings, onConnect, onNodeClick, onPaneClick, onRepositoryAdd, onRepositoryClick, onRepositoryDelete, onFeatureDelete, onRepositorySelect, onCanvasDrag, toolbar, emptyState, }) {
11
+ export function FeaturesCanvas({ nodes, edges, selectedFeatureId, onNodesChange, onAddFeature, onConnect, onNodeClick, onPaneClick, onCanvasDrag, toolbar, emptyState, }) {
13
12
  const nodeTypes = useMemo(() => ({
14
13
  featureNode: FeatureNode,
15
14
  repositoryNode: RepositoryNode,
16
- addRepositoryNode: AddRepositoryNode,
17
15
  }), []);
18
16
  const edgeTypes = useMemo(() => ({
19
17
  dependencyEdge: DependencyEdge,
20
18
  }), []);
21
- // Prevent a feature from having more than one source repository
22
- const isValidConnection = useCallback((connection) => {
23
- const sourceNode = nodes.find((n) => n.id === connection.source);
24
- if (sourceNode?.type !== 'repositoryNode')
25
- return true;
26
- const targetAlreadyHasRepo = edges.some((e) => {
27
- const edgeSourceNode = nodes.find((n) => n.id === e.source);
28
- return edgeSourceNode?.type === 'repositoryNode' && e.target === connection.target;
29
- });
30
- return !targetAlreadyHasRepo;
31
- }, [nodes, edges]);
32
- const enrichedNodes = useMemo(() => nodes.map((node) => ({
33
- ...node,
34
- // React Flow passes `selected` as a prop to the node component
35
- ...(node.type === 'featureNode' && {
36
- selected: selectedFeatureId != null &&
37
- node.data.featureId === selectedFeatureId,
38
- }),
39
- data: {
40
- ...node.data,
41
- showHandles: edges.length > 0,
42
- ...(node.type === 'featureNode' && node.data.state !== 'creating'
43
- ? {
44
- onAction: onNodeAction ? () => onNodeAction(node.id) : undefined,
45
- onSettings: onNodeSettings ? () => onNodeSettings(node.id) : undefined,
46
- onDelete: onFeatureDelete,
47
- }
48
- : {}),
49
- ...(node.type === 'repositoryNode' && {
50
- onAdd: onRepositoryAdd ? () => onRepositoryAdd(node.id) : undefined,
51
- onClick: onRepositoryClick ? () => onRepositoryClick(node.id) : undefined,
52
- onDelete: onRepositoryDelete,
53
- }),
54
- ...(node.type === 'addRepositoryNode' && {
55
- onSelect: onRepositorySelect ? (path) => onRepositorySelect(path) : undefined,
56
- }),
57
- },
58
- })), [
59
- nodes,
60
- edges.length,
61
- selectedFeatureId,
62
- onNodeAction,
63
- onNodeSettings,
64
- onFeatureDelete,
65
- onRepositoryAdd,
66
- onRepositoryClick,
67
- onRepositoryDelete,
68
- onRepositorySelect,
69
- ]);
19
+ // Callbacks and showHandles are already injected into node.data by deriveGraph.
20
+ // Only selectedFeatureId highlighting needs to be applied here.
21
+ const enrichedNodes = useMemo(() => selectedFeatureId == null
22
+ ? nodes
23
+ : nodes.map((node) => node.type === 'featureNode' &&
24
+ node.data.featureId === selectedFeatureId
25
+ ? { ...node, selected: true }
26
+ : node), [nodes, selectedFeatureId]);
70
27
  if (nodes.length === 0) {
71
28
  if (emptyState) {
72
29
  return (_jsx("div", { "data-testid": "features-canvas-empty", className: "h-full w-full", children: emptyState }));
73
30
  }
74
31
  return (_jsx("div", { "data-testid": "features-canvas-empty", children: _jsx(EmptyState, { title: "No features yet", description: "Get started by creating your first feature.", action: _jsxs(Button, { onClick: onAddFeature, children: [_jsx(Plus, { className: "mr-2 h-4 w-4" }), "New Feature"] }) }) }));
75
32
  }
76
- return (_jsx("div", { "data-testid": "features-canvas", "data-no-drawer-close": true, className: "pointer-events-auto h-full w-full", children: _jsxs(ReactFlow, { nodes: enrichedNodes, edges: edges, nodeTypes: nodeTypes, edgeTypes: edgeTypes, isValidConnection: isValidConnection, onConnect: onConnect, onNodesChange: onNodesChange, onNodeClick: onNodeClick, onPaneClick: onPaneClick, onMoveStart: onCanvasDrag, defaultViewport: { x: 30, y: 30, zoom: 0.85 }, nodesDraggable: false, nodesConnectable: false, elementsSelectable: false, children: [_jsx(Background, {}), _jsx(Controls, {}), toolbar] }) }));
33
+ return (_jsx("div", { "data-testid": "features-canvas", "data-no-drawer-close": true, className: "pointer-events-auto h-full w-full", children: _jsxs(ReactFlow, { nodes: enrichedNodes, edges: edges, nodeTypes: nodeTypes, edgeTypes: edgeTypes, onConnect: onConnect, onNodesChange: onNodesChange, onNodeClick: onNodeClick, onPaneClick: onPaneClick, onMoveStart: onCanvasDrag, defaultViewport: { x: 30, y: 30, zoom: 0.85 }, nodesDraggable: false, nodesConnectable: false, elementsSelectable: false, children: [_jsx(Background, {}), _jsx(Controls, {}), toolbar] }) }));
77
34
  }
@@ -1 +1 @@
1
- {"version":3,"file":"features-canvas.stories.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/features/features-canvas/features-canvas.stories.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAEvD,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAOnD,QAAA,MAAM,IAAI,EAAE,IAAI,CAAC,OAAO,cAAc,CAcrC,CAAC;AAEF,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,IAAI,CAAC,CAAC;AAwKnC,eAAO,MAAM,KAAK,EAAE,KAMnB,CAAC;AAEF,eAAO,MAAM,UAAU,EAAE,KAKxB,CAAC;AAEF,eAAO,MAAM,aAAa,EAAE,KAK3B,CAAC;AAEF,eAAO,MAAM,cAAc,EAAE,KAK5B,CAAC;AAEF,eAAO,MAAM,WAAW,EAAE,KAWzB,CAAC;AA4DF,eAAO,MAAM,mCAAmC,EAAE,KAOjD,CAAC;AAkCF,eAAO,MAAM,gCAAgC,EAAE,KAS9C,CAAC;AAgEF,eAAO,MAAM,gCAAgC,EAAE,KAW9C,CAAC;AAuDF,eAAO,MAAM,oBAAoB,EAAE,KAUlC,CAAC;AA2GF,eAAO,MAAM,oCAAoC,EAAE,KAOlD,CAAC;AAEF,eAAO,MAAM,yBAAyB,EAAE,KASvC,CAAC"}
1
+ {"version":3,"file":"features-canvas.stories.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/features/features-canvas/features-canvas.stories.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAEvD,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAMnD,QAAA,MAAM,IAAI,EAAE,IAAI,CAAC,OAAO,cAAc,CAcrC,CAAC;AAEF,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,IAAI,CAAC,CAAC;AAwKnC,eAAO,MAAM,KAAK,EAAE,KAMnB,CAAC;AAEF,eAAO,MAAM,UAAU,EAAE,KAKxB,CAAC;AAEF,eAAO,MAAM,aAAa,EAAE,KAK3B,CAAC;AAEF,eAAO,MAAM,cAAc,EAAE,KAK5B,CAAC;AAEF,eAAO,MAAM,WAAW,EAAE,KASzB,CAAC;AAoDF,eAAO,MAAM,mCAAmC,EAAE,KAKjD,CAAC;AA4BF,eAAO,MAAM,gCAAgC,EAAE,KAO9C,CAAC;AA0DF,eAAO,MAAM,gCAAgC,EAAE,KAS9C,CAAC;AAiDF,eAAO,MAAM,oBAAoB,EAAE,KAQlC,CAAC;AAqGF,eAAO,MAAM,oCAAoC,EAAE,KAKlD,CAAC;AAEF,eAAO,MAAM,yBAAyB,EAAE,KAMvC,CAAC"}
@@ -208,8 +208,6 @@ export const Interactive = {
208
208
  { id: 'e3-4', source: 'node-3', target: 'node-4' },
209
209
  ],
210
210
  onAddFeature: () => undefined,
211
- onNodeAction: () => undefined,
212
- onNodeSettings: () => undefined,
213
211
  },
214
212
  };
215
213
  const repoNode = {
@@ -220,15 +218,8 @@ const repoNode = {
220
218
  name: 'shep-ai/cli',
221
219
  },
222
220
  };
223
- const addRepoNode = {
224
- id: 'add-repo',
225
- type: 'addRepositoryNode',
226
- position: { x: 50, y: 302 },
227
- data: {},
228
- };
229
221
  const repoFeatureNodes = [
230
222
  repoNode,
231
- addRepoNode,
232
223
  {
233
224
  id: 'feat-1',
234
225
  type: 'featureNode',
@@ -269,8 +260,6 @@ export const ConnectedRepositoryMultipleFeatures = {
269
260
  args: {
270
261
  nodes: repoFeatureNodes,
271
262
  edges: repoFeatureEdges,
272
- onNodeAction: () => undefined,
273
- onNodeSettings: () => undefined,
274
263
  },
275
264
  };
276
265
  // --- Story 1: Single repository connected to a single feature ---
@@ -281,12 +270,6 @@ const singleRepoSingleFeatureNodes = [
281
270
  position: { x: 50, y: 127 },
282
271
  data: { name: 'shep-ai/cli' },
283
272
  },
284
- {
285
- id: 'add-repo',
286
- type: 'addRepositoryNode',
287
- position: { x: 50, y: 267 },
288
- data: {},
289
- },
290
273
  {
291
274
  id: 'feat-1',
292
275
  type: 'featureNode',
@@ -309,8 +292,6 @@ export const ConnectedRepositorySingleFeature = {
309
292
  edges: [
310
293
  { id: 'e-repo-f1', source: 'repo-1', target: 'feat-1', type: 'straight', ...dashedEdge },
311
294
  ],
312
- onNodeAction: () => undefined,
313
- onNodeSettings: () => undefined,
314
295
  },
315
296
  };
316
297
  // --- Story 2: Single repository connected to multiple features (one-to-many) ---
@@ -321,12 +302,6 @@ const singleRepoMultiFeatNodes = [
321
302
  position: { x: 50, y: 162 },
322
303
  data: { name: 'shep-ai/cli' },
323
304
  },
324
- {
325
- id: 'add-repo',
326
- type: 'addRepositoryNode',
327
- position: { x: 50, y: 450 },
328
- data: {},
329
- },
330
305
  {
331
306
  id: 'feat-1',
332
307
  type: 'featureNode',
@@ -381,8 +356,6 @@ export const SingleRepositoryMultipleFeatures = {
381
356
  { id: 'e-r1-f2', source: 'repo-1', target: 'feat-2', ...dashedEdge },
382
357
  { id: 'e-r1-f3', source: 'repo-1', target: 'feat-3', ...dashedEdge },
383
358
  ],
384
- onNodeAction: () => undefined,
385
- onNodeSettings: () => undefined,
386
359
  },
387
360
  };
388
361
  // --- Story 3: Multiple repositories each with their own features ---
@@ -399,12 +372,6 @@ const multiRepoNodes = [
399
372
  position: { x: 50, y: 270 },
400
373
  data: { name: 'shep-ai/web' },
401
374
  },
402
- {
403
- id: 'add-repo',
404
- type: 'addRepositoryNode',
405
- position: { x: 50, y: 470 },
406
- data: {},
407
- },
408
375
  {
409
376
  id: 'feat-1',
410
377
  type: 'featureNode',
@@ -443,8 +410,6 @@ export const MultipleRepositories = {
443
410
  { id: 'e-r1-f1', source: 'repo-1', target: 'feat-1', ...dashedEdge },
444
411
  { id: 'e-r2-f2', source: 'repo-2', target: 'feat-2', ...dashedEdge },
445
412
  ],
446
- onNodeAction: () => undefined,
447
- onNodeSettings: () => undefined,
448
413
  },
449
414
  };
450
415
  // --- Story 4: Multiple repositories with mixed feature connections (dagre layout) ---
@@ -467,12 +432,6 @@ const mixedRepoFeatureNodesRaw = [
467
432
  position: { x: 0, y: 0 },
468
433
  data: { name: 'shep-ai/api' },
469
434
  },
470
- {
471
- id: 'add-repo',
472
- type: 'addRepositoryNode',
473
- position: { x: 0, y: 0 },
474
- data: {},
475
- },
476
435
  {
477
436
  id: 'feat-1',
478
437
  type: 'featureNode',
@@ -548,8 +507,6 @@ export const MultipleRepositoriesMixedConnections = {
548
507
  args: {
549
508
  nodes: mixedLayoutedNodes,
550
509
  edges: mixedLayoutedEdges,
551
- onNodeAction: () => undefined,
552
- onNodeSettings: () => undefined,
553
510
  },
554
511
  };
555
512
  export const InteractiveWithRepository = {
@@ -557,8 +514,5 @@ export const InteractiveWithRepository = {
557
514
  nodes: repoFeatureNodes,
558
515
  edges: repoFeatureEdges,
559
516
  onAddFeature: () => undefined,
560
- onNodeAction: () => undefined,
561
- onNodeSettings: () => undefined,
562
- onRepositoryAdd: () => undefined,
563
517
  },
564
518
  };
@@ -4,7 +4,7 @@ import { useCallback } from 'react';
4
4
  import { useRouter } from 'next/navigation';
5
5
  import { SidebarProvider, SidebarInset } from '../../ui/sidebar.js';
6
6
  import { AppSidebar } from '../../layouts/app-sidebar/index.js';
7
- import { AddRepositoryButton } from '../../common/add-repository-node/index.js';
7
+ import { AddRepositoryButton } from '../../common/add-repository-button/index.js';
8
8
  import { ThemeToggle } from '../../common/theme-toggle/index.js';
9
9
  import { SoundToggle } from '../../common/sound-toggle/index.js';
10
10
  import { AgentEventsProvider } from '../../../hooks/agent-events-provider.js';
@@ -10,8 +10,6 @@ export interface AppSidebarProps {
10
10
  features: FeatureItem[];
11
11
  onNewFeature?: () => void;
12
12
  onFeatureClick?: (featureId: string) => void;
13
- onFeaturesFolderClick?: () => void;
14
- onFeaturesMenuClick?: () => void;
15
13
  }
16
- export declare function AppSidebar({ features, onNewFeature, onFeatureClick, onFeaturesFolderClick, onFeaturesMenuClick, }: AppSidebarProps): import("react/jsx-runtime").JSX.Element;
14
+ export declare function AppSidebar({ features, onNewFeature, onFeatureClick }: AppSidebarProps): import("react/jsx-runtime").JSX.Element;
17
15
  //# sourceMappingURL=app-sidebar.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"app-sidebar.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/layouts/app-sidebar/app-sidebar.tsx"],"names":[],"mappings":"AAuBA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,2CAA2C,CAAC;AAI/E,MAAM,WAAW,WAAW;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,aAAa,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,WAAW,EAAE,CAAC;IACxB,YAAY,CAAC,EAAE,MAAM,IAAI,CAAC;IAC1B,cAAc,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IAC7C,qBAAqB,CAAC,EAAE,MAAM,IAAI,CAAC;IACnC,mBAAmB,CAAC,EAAE,MAAM,IAAI,CAAC;CAClC;AAED,wBAAgB,UAAU,CAAC,EACzB,QAAQ,EACR,YAAY,EACZ,cAAc,EACd,qBAAqB,EACrB,mBAAmB,GACpB,EAAE,eAAe,2CAyGjB"}
1
+ {"version":3,"file":"app-sidebar.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/layouts/app-sidebar/app-sidebar.tsx"],"names":[],"mappings":"AAuBA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,2CAA2C,CAAC;AAI/E,MAAM,WAAW,WAAW;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,aAAa,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,WAAW,EAAE,CAAC;IACxB,YAAY,CAAC,EAAE,MAAM,IAAI,CAAC;IAC1B,cAAc,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;CAC9C;AAED,wBAAgB,UAAU,CAAC,EAAE,QAAQ,EAAE,YAAY,EAAE,cAAc,EAAE,EAAE,eAAe,2CAqGrF"}
@@ -13,7 +13,7 @@ import { SidebarSectionHeader } from '../../common/sidebar-section-header/index.
13
13
  import { featureStatusConfig, featureStatusOrder } from '../../common/feature-status-config.js';
14
14
  import { useDeferredMount } from '../../../hooks/use-deferred-mount.js';
15
15
  import { featureFlags } from '../../../lib/feature-flags.js';
16
- export function AppSidebar({ features, onNewFeature, onFeatureClick, onFeaturesFolderClick, onFeaturesMenuClick, }) {
16
+ export function AppSidebar({ features, onNewFeature, onFeatureClick }) {
17
17
  const pathname = usePathname();
18
18
  const { state } = useSidebar();
19
19
  const collapsed = state === 'collapsed';
@@ -31,5 +31,5 @@ export function AppSidebar({ features, onNewFeature, onFeatureClick, onFeaturesF
31
31
  'min-w-0 overflow-hidden transition-opacity duration-200 ease-out',
32
32
  '[&_[data-sidebar=group-label]]:!mt-0 [&_[data-sidebar=group-label]]:!opacity-100 [&_[data-sidebar=group-label]]:!transition-none',
33
33
  expandedVisible ? 'opacity-100' : 'opacity-0',
34
- ].join(' '), children: [_jsx(SidebarSectionHeader, { label: "Features", onFolderClick: onFeaturesFolderClick, onMenuClick: onFeaturesMenuClick }), _jsx(ScrollArea, { children: grouped.map(({ key, label, items }) => items.length > 0 ? (_jsx(FeatureStatusGroup, { label: label, count: items.length, children: items.map((feature) => (_jsx(FeatureListItem, { name: feature.name, status: feature.status, startedAt: feature.startedAt, duration: feature.duration, onClick: onFeatureClick ? () => onFeatureClick(feature.featureId) : undefined }, feature.featureId))) }, key)) : null) })] })) : null }), _jsx(SidebarFooter, { children: _jsx(SidebarMenu, { children: _jsx(SidebarMenuItem, { children: _jsxs(SidebarMenuButton, { onClick: onNewFeature, tooltip: "New feature", children: [_jsx(Plus, {}), _jsx("span", { children: "New feature" })] }) }) }) }), _jsx(SidebarRail, {})] }));
34
+ ].join(' '), children: [_jsx(SidebarSectionHeader, { label: "Features" }), _jsx(ScrollArea, { children: grouped.map(({ key, label, items }) => items.length > 0 ? (_jsx(FeatureStatusGroup, { label: label, count: items.length, children: items.map((feature) => (_jsx(FeatureListItem, { name: feature.name, status: feature.status, startedAt: feature.startedAt, duration: feature.duration, onClick: onFeatureClick ? () => onFeatureClick(feature.featureId) : undefined }, feature.featureId))) }, key)) : null) })] })) : null }), _jsx(SidebarFooter, { children: _jsx(SidebarMenu, { children: _jsx(SidebarMenuItem, { children: _jsxs(SidebarMenuButton, { onClick: onNewFeature, tooltip: "New feature", children: [_jsx(Plus, {}), _jsx("span", { children: "New feature" })] }) }) }) }), _jsx(SidebarRail, {})] }));
35
35
  }
@@ -1 +1 @@
1
- {"version":3,"file":"alert-dialog.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/web/components/ui/alert-dialog.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAAE,WAAW,IAAI,oBAAoB,EAAE,MAAM,UAAU,CAAC;AAG/D,OAAO,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAEhD,iBAAS,WAAW,CAAC,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,oBAAoB,CAAC,IAAI,CAAC,2CAExF;AAED,iBAAS,kBAAkB,CAAC,EAC1B,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,oBAAoB,CAAC,OAAO,CAAC,2CAE3D;AAED,iBAAS,iBAAiB,CAAC,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,oBAAoB,CAAC,MAAM,CAAC,2CAEhG;AAED,iBAAS,kBAAkB,CAAC,EAC1B,SAAS,EACT,OAAO,EACP,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,oBAAoB,CAAC,OAAO,CAAC,2CAiB3D;AAED,iBAAS,kBAAkB,CAAC,EAC1B,SAAS,EACT,IAAgB,EAChB,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,oBAAoB,CAAC,OAAO,CAAC,GAAG;IAC7D,IAAI,CAAC,EAAE,SAAS,GAAG,IAAI,CAAC;CACzB,2CAeA;AAED,iBAAS,iBAAiB,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,2CAW9E;AAED,iBAAS,iBAAiB,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,2CAW9E;AAED,iBAAS,gBAAgB,CAAC,EACxB,SAAS,EACT,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,oBAAoB,CAAC,KAAK,CAAC,2CAWzD;AAED,iBAAS,sBAAsB,CAAC,EAC9B,SAAS,EACT,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,oBAAoB,CAAC,WAAW,CAAC,2CAQ/D;AAED,iBAAS,gBAAgB,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,2CAW7E;AAED,iBAAS,iBAAiB,CAAC,EACzB,SAAS,EACT,OAAmB,EACnB,IAAgB,EAChB,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,oBAAoB,CAAC,MAAM,CAAC,GACzD,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,OAAO,MAAM,CAAC,EAAE,SAAS,GAAG,MAAM,CAAC,2CAU9D;AAED,iBAAS,iBAAiB,CAAC,EACzB,SAAS,EACT,OAAmB,EACnB,IAAgB,EAChB,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,oBAAoB,CAAC,MAAM,CAAC,GACzD,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,OAAO,MAAM,CAAC,EAAE,SAAS,GAAG,MAAM,CAAC,2CAU9D;AAED,OAAO,EACL,WAAW,EACX,iBAAiB,EACjB,iBAAiB,EACjB,kBAAkB,EAClB,sBAAsB,EACtB,iBAAiB,EACjB,iBAAiB,EACjB,gBAAgB,EAChB,kBAAkB,EAClB,iBAAiB,EACjB,gBAAgB,EAChB,kBAAkB,GACnB,CAAC"}
1
+ {"version":3,"file":"alert-dialog.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/web/components/ui/alert-dialog.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAAE,WAAW,IAAI,oBAAoB,EAAE,MAAM,UAAU,CAAC;AAG/D,OAAO,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAEhD,iBAAS,WAAW,CAAC,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,oBAAoB,CAAC,IAAI,CAAC,2CAExF;AAED,iBAAS,kBAAkB,CAAC,EAC1B,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,oBAAoB,CAAC,OAAO,CAAC,2CAE3D;AAED,iBAAS,iBAAiB,CAAC,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,oBAAoB,CAAC,MAAM,CAAC,2CAEhG;AAED,iBAAS,kBAAkB,CAAC,EAC1B,SAAS,EACT,OAAO,EACP,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,oBAAoB,CAAC,OAAO,CAAC,2CAc3D;AAED,iBAAS,kBAAkB,CAAC,EAC1B,SAAS,EACT,IAAgB,EAChB,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,oBAAoB,CAAC,OAAO,CAAC,GAAG;IAC7D,IAAI,CAAC,EAAE,SAAS,GAAG,IAAI,CAAC;CACzB,2CAeA;AAED,iBAAS,iBAAiB,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,2CAW9E;AAED,iBAAS,iBAAiB,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,2CAW9E;AAED,iBAAS,gBAAgB,CAAC,EACxB,SAAS,EACT,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,oBAAoB,CAAC,KAAK,CAAC,2CAWzD;AAED,iBAAS,sBAAsB,CAAC,EAC9B,SAAS,EACT,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,oBAAoB,CAAC,WAAW,CAAC,2CAQ/D;AAED,iBAAS,gBAAgB,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,2CAW7E;AAED,iBAAS,iBAAiB,CAAC,EACzB,SAAS,EACT,OAAmB,EACnB,IAAgB,EAChB,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,oBAAoB,CAAC,MAAM,CAAC,GACzD,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,OAAO,MAAM,CAAC,EAAE,SAAS,GAAG,MAAM,CAAC,2CAU9D;AAED,iBAAS,iBAAiB,CAAC,EACzB,SAAS,EACT,OAAmB,EACnB,IAAgB,EAChB,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,oBAAoB,CAAC,MAAM,CAAC,GACzD,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,OAAO,MAAM,CAAC,EAAE,SAAS,GAAG,MAAM,CAAC,2CAU9D;AAED,OAAO,EACL,WAAW,EACX,iBAAiB,EACjB,iBAAiB,EACjB,kBAAkB,EAClB,sBAAsB,EACtB,iBAAiB,EACjB,iBAAiB,EACjB,gBAAgB,EAChB,kBAAkB,EAClB,iBAAiB,EACjB,gBAAgB,EAChB,kBAAkB,GACnB,CAAC"}
@@ -13,7 +13,7 @@ function AlertDialogPortal({ ...props }) {
13
13
  return _jsx(AlertDialogPrimitive.Portal, { "data-slot": "alert-dialog-portal", ...props });
14
14
  }
15
15
  function AlertDialogOverlay({ className, onClick, ...props }) {
16
- return (_jsx(AlertDialogPrimitive.Overlay, { "data-slot": "alert-dialog-overlay", className: cn('data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 fixed inset-0 z-50 bg-black/50', className), onClick: (e) => {
16
+ return (_jsx(AlertDialogPrimitive.Overlay, { "data-slot": "alert-dialog-overlay", className: cn('fixed inset-0 z-50 bg-black/50', className), onClick: (e) => {
17
17
  // Prevent overlay clicks from propagating to document-level handlers
18
18
  // (e.g. BaseDrawer outside-click) — only the dialog should dismiss.
19
19
  e.stopPropagation();
@@ -21,7 +21,7 @@ function AlertDialogOverlay({ className, onClick, ...props }) {
21
21
  }, ...props }));
22
22
  }
23
23
  function AlertDialogContent({ className, size = 'default', ...props }) {
24
- return (_jsxs(AlertDialogPortal, { children: [_jsx(AlertDialogOverlay, {}), _jsx(AlertDialogPrimitive.Content, { "data-slot": "alert-dialog-content", "data-size": size, className: cn('bg-background data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 group/alert-dialog-content fixed top-[50%] left-[50%] z-50 grid w-full max-w-[calc(100%-2rem)] translate-x-[-50%] translate-y-[-50%] gap-4 rounded-lg border p-6 shadow-lg duration-200 data-[size=sm]:max-w-xs data-[size=default]:sm:max-w-lg', className), ...props })] }));
24
+ return (_jsxs(AlertDialogPortal, { children: [_jsx(AlertDialogOverlay, {}), _jsx(AlertDialogPrimitive.Content, { "data-slot": "alert-dialog-content", "data-size": size, className: cn('bg-background group/alert-dialog-content fixed top-[50%] left-[50%] z-50 grid w-full max-w-[calc(100%-2rem)] translate-x-[-50%] translate-y-[-50%] gap-4 rounded-lg border p-6 shadow-lg data-[size=sm]:max-w-xs data-[size=default]:sm:max-w-lg', className), ...props })] }));
25
25
  }
26
26
  function AlertDialogHeader({ className, ...props }) {
27
27
  return (_jsx("div", { "data-slot": "alert-dialog-header", className: cn('grid grid-rows-[auto_1fr] place-items-center gap-1.5 text-center has-data-[slot=alert-dialog-media]:grid-rows-[auto_auto_1fr] has-data-[slot=alert-dialog-media]:gap-x-6 sm:group-data-[size=default]/alert-dialog-content:place-items-start sm:group-data-[size=default]/alert-dialog-content:text-left sm:group-data-[size=default]/alert-dialog-content:has-data-[slot=alert-dialog-media]:grid-rows-[auto_1fr]', className), ...props }));
@@ -1 +1 @@
1
- {"version":3,"file":"dialog.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/web/components/ui/dialog.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAAE,MAAM,IAAI,eAAe,EAAE,MAAM,UAAU,CAAC;AAKrD,QAAA,MAAM,MAAM,uCAAuB,CAAC;AAEpC,QAAA,MAAM,aAAa,8GAA0B,CAAC;AAE9C,QAAA,MAAM,YAAY,6CAAyB,CAAC;AAE5C,QAAA,MAAM,WAAW,4GAAwB,CAAC;AAE1C,QAAA,MAAM,aAAa,8JAkBjB,CAAC;AAGH,QAAA,MAAM,aAAa,8JAqBjB,CAAC;AAGH,QAAA,MAAM,YAAY;8BAA6B,KAAK,CAAC,cAAc,CAAC,cAAc,CAAC;;CAElF,CAAC;AAGF,QAAA,MAAM,YAAY;8BAA6B,KAAK,CAAC,cAAc,CAAC,cAAc,CAAC;;CAKlF,CAAC;AAGF,QAAA,MAAM,WAAW,oKASf,CAAC;AAGH,QAAA,MAAM,iBAAiB,8KASrB,CAAC;AAGH,OAAO,EACL,MAAM,EACN,YAAY,EACZ,aAAa,EACb,aAAa,EACb,WAAW,EACX,aAAa,EACb,YAAY,EACZ,YAAY,EACZ,WAAW,EACX,iBAAiB,GAClB,CAAC"}
1
+ {"version":3,"file":"dialog.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/web/components/ui/dialog.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAAE,MAAM,IAAI,eAAe,EAAE,MAAM,UAAU,CAAC;AAKrD,QAAA,MAAM,MAAM,uCAAuB,CAAC;AAEpC,QAAA,MAAM,aAAa,8GAA0B,CAAC;AAE9C,QAAA,MAAM,YAAY,6CAAyB,CAAC;AAE5C,QAAA,MAAM,WAAW,4GAAwB,CAAC;AAE1C,QAAA,MAAM,aAAa,8JAejB,CAAC;AAGH,QAAA,MAAM,aAAa,8JAqBjB,CAAC;AAGH,QAAA,MAAM,YAAY;8BAA6B,KAAK,CAAC,cAAc,CAAC,cAAc,CAAC;;CAElF,CAAC;AAGF,QAAA,MAAM,YAAY;8BAA6B,KAAK,CAAC,cAAc,CAAC,cAAc,CAAC;;CAKlF,CAAC;AAGF,QAAA,MAAM,WAAW,oKASf,CAAC;AAGH,QAAA,MAAM,iBAAiB,8KASrB,CAAC;AAGH,OAAO,EACL,MAAM,EACN,YAAY,EACZ,aAAa,EACb,aAAa,EACb,WAAW,EACX,aAAa,EACb,YAAY,EACZ,YAAY,EACZ,WAAW,EACX,iBAAiB,GAClB,CAAC"}
@@ -8,14 +8,14 @@ const Dialog = DialogPrimitive.Root;
8
8
  const DialogTrigger = DialogPrimitive.Trigger;
9
9
  const DialogPortal = DialogPrimitive.Portal;
10
10
  const DialogClose = DialogPrimitive.Close;
11
- const DialogOverlay = React.forwardRef(({ className, onClick, ...props }, ref) => (_jsx(DialogPrimitive.Overlay, { ref: ref, className: cn('data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 fixed inset-0 z-50 bg-black/80', className), onClick: (e) => {
11
+ const DialogOverlay = React.forwardRef(({ className, onClick, ...props }, ref) => (_jsx(DialogPrimitive.Overlay, { ref: ref, className: cn('fixed inset-0 z-50 bg-black/80', className), onClick: (e) => {
12
12
  // Prevent overlay clicks from propagating to document-level handlers
13
13
  // (e.g. BaseDrawer outside-click) — only the dialog should dismiss.
14
14
  e.stopPropagation();
15
15
  onClick?.(e);
16
16
  }, ...props })));
17
17
  DialogOverlay.displayName = DialogPrimitive.Overlay.displayName;
18
- const DialogContent = React.forwardRef(({ className, children, ...props }, ref) => (_jsxs(DialogPortal, { children: [_jsx(DialogOverlay, {}), _jsxs(DialogPrimitive.Content, { ref: ref, className: cn('bg-background data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[state=closed]:slide-out-to-left-1/2 data-[state=closed]:slide-out-to-top-[48%] data-[state=open]:slide-in-from-left-1/2 data-[state=open]:slide-in-from-top-[48%] fixed top-[50%] left-[50%] z-50 grid w-full max-w-lg translate-x-[-50%] translate-y-[-50%] gap-4 border p-6 shadow-lg duration-200 sm:rounded-lg', className), ...props, children: [children, _jsxs(DialogPrimitive.Close, { className: "ring-offset-background focus:ring-ring data-[state=open]:bg-accent data-[state=open]:text-muted-foreground absolute top-4 right-4 rounded-sm opacity-70 transition-opacity hover:opacity-100 focus:ring-2 focus:ring-offset-2 focus:outline-none disabled:pointer-events-none", children: [_jsx(X, { className: "h-4 w-4" }), _jsx("span", { className: "sr-only", children: "Close" })] })] })] })));
18
+ const DialogContent = React.forwardRef(({ className, children, ...props }, ref) => (_jsxs(DialogPortal, { children: [_jsx(DialogOverlay, {}), _jsxs(DialogPrimitive.Content, { ref: ref, className: cn('bg-background fixed top-[50%] left-[50%] z-50 grid w-full max-w-lg translate-x-[-50%] translate-y-[-50%] gap-4 border p-6 shadow-lg sm:rounded-lg', className), ...props, children: [children, _jsxs(DialogPrimitive.Close, { className: "ring-offset-background focus:ring-ring data-[state=open]:bg-accent data-[state=open]:text-muted-foreground absolute top-4 right-4 rounded-sm opacity-70 transition-opacity hover:opacity-100 focus:ring-2 focus:ring-offset-2 focus:outline-none disabled:pointer-events-none", children: [_jsx(X, { className: "h-4 w-4" }), _jsx("span", { className: "sr-only", children: "Close" })] })] })] })));
19
19
  DialogContent.displayName = DialogPrimitive.Content.displayName;
20
20
  const DialogHeader = ({ className, ...props }) => (_jsx("div", { className: cn('flex flex-col space-y-1.5 text-center sm:text-left', className), ...props }));
21
21
  DialogHeader.displayName = 'DialogHeader';
@@ -3,7 +3,7 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
3
  import { ScrollArea as ScrollAreaPrimitive } from 'radix-ui';
4
4
  import { cn } from '../../lib/utils.js';
5
5
  function ScrollArea({ className, children, ...props }) {
6
- return (_jsxs(ScrollAreaPrimitive.Root, { "data-slot": "scroll-area", className: cn('relative', className), ...props, children: [_jsx(ScrollAreaPrimitive.Viewport, { "data-slot": "scroll-area-viewport", className: "focus-visible:ring-ring/50 size-full rounded-[inherit] transition-[color,box-shadow] outline-none focus-visible:ring-[3px] focus-visible:outline-1", children: children }), _jsx(ScrollBar, {}), _jsx(ScrollAreaPrimitive.Corner, {})] }));
6
+ return (_jsxs(ScrollAreaPrimitive.Root, { "data-slot": "scroll-area", className: cn('relative', className), ...props, children: [_jsx(ScrollAreaPrimitive.Viewport, { "data-slot": "scroll-area-viewport", className: "focus-visible:ring-ring/50 size-full rounded-[inherit] transition-[color,box-shadow] outline-none focus-visible:ring-[3px] focus-visible:outline-1 [&>div]:block!", children: children }), _jsx(ScrollBar, {}), _jsx(ScrollAreaPrimitive.Corner, {})] }));
7
7
  }
8
8
  function ScrollBar({ className, orientation = 'vertical', ...props }) {
9
9
  return (_jsx(ScrollAreaPrimitive.ScrollAreaScrollbar, { "data-slot": "scroll-area-scrollbar", orientation: orientation, className: cn('flex touch-none p-px transition-colors select-none', orientation === 'vertical' && 'h-full w-2.5 border-l border-l-transparent', orientation === 'horizontal' && 'h-2.5 flex-col border-t border-t-transparent', className), ...props, children: _jsx(ScrollAreaPrimitive.ScrollAreaThumb, { "data-slot": "scroll-area-thumb", className: "bg-border relative flex-1 rounded-full" }) }));
@@ -1 +1 @@
1
- {"version":3,"file":"agent-events-provider.d.ts","sourceRoot":"","sources":["../../../../../src/presentation/web/hooks/agent-events-provider.tsx"],"names":[],"mappings":"AAEA,OAAO,EAA6B,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAClE,OAAO,EAEL,KAAK,qBAAqB,EAC1B,KAAK,oBAAoB,EAC1B,MAAM,oBAAoB,CAAC;AAI5B,UAAU,wBAAyB,SAAQ,qBAAqB;IAC9D,QAAQ,EAAE,SAAS,CAAC;CACrB;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,EAAE,wBAAwB,2CAIhF;AAED,wBAAgB,qBAAqB,IAAI,oBAAoB,CAM5D"}
1
+ {"version":3,"file":"agent-events-provider.d.ts","sourceRoot":"","sources":["../../../../../src/presentation/web/hooks/agent-events-provider.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAsC,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAC3E,OAAO,EAEL,KAAK,qBAAqB,EAC1B,KAAK,oBAAoB,EAC1B,MAAM,oBAAoB,CAAC;AAI5B,UAAU,wBAAyB,SAAQ,qBAAqB;IAC9D,QAAQ,EAAE,SAAS,CAAC;CACrB;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,EAAE,wBAAwB,2CAShF;AAED,wBAAgB,qBAAqB,IAAI,oBAAoB,CAM5D"}
@@ -1,6 +1,6 @@
1
1
  'use client';
2
2
  import { jsx as _jsx } from "react/jsx-runtime";
3
- import { createContext, useContext } from 'react';
3
+ import { createContext, useContext, useMemo } from 'react';
4
4
  import { useAgentEvents, } from './use-agent-events.js';
5
5
  const AgentEventsContext = createContext(null);
6
6
  /**
@@ -8,7 +8,8 @@ const AgentEventsContext = createContext(null);
8
8
  * Wrap the app once; use `useAgentEventsContext()` to read.
9
9
  */
10
10
  export function AgentEventsProvider({ children, runId }) {
11
- const value = useAgentEvents({ runId });
11
+ const { events, lastEvent, connectionStatus } = useAgentEvents({ runId });
12
+ const value = useMemo(() => ({ events, lastEvent, connectionStatus }), [events, lastEvent, connectionStatus]);
12
13
  return _jsx(AgentEventsContext.Provider, { value: value, children: children });
13
14
  }
14
15
  export function useAgentEventsContext() {
@@ -1 +1 @@
1
- {"version":3,"file":"use-agent-events.d.ts","sourceRoot":"","sources":["../../../../../src/presentation/web/hooks/use-agent-events.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,sCAAsC,CAAC;AAE9E,MAAM,MAAM,gBAAgB,GAAG,WAAW,GAAG,YAAY,GAAG,cAAc,CAAC;AAE3E,MAAM,WAAW,qBAAqB;IACpC,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,oBAAoB;IACnC,MAAM,EAAE,iBAAiB,EAAE,CAAC;IAC5B,SAAS,EAAE,iBAAiB,GAAG,IAAI,CAAC;IACpC,gBAAgB,EAAE,gBAAgB,CAAC;CACpC;AAID;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,OAAO,CAAC,EAAE,qBAAqB,GAAG,oBAAoB,CA2GpF"}
1
+ {"version":3,"file":"use-agent-events.d.ts","sourceRoot":"","sources":["../../../../../src/presentation/web/hooks/use-agent-events.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,sCAAsC,CAAC;AAE9E,MAAM,MAAM,gBAAgB,GAAG,WAAW,GAAG,YAAY,GAAG,cAAc,CAAC;AAE3E,MAAM,WAAW,qBAAqB;IACpC,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,oBAAoB;IACnC,MAAM,EAAE,iBAAiB,EAAE,CAAC;IAC5B,SAAS,EAAE,iBAAiB,GAAG,IAAI,CAAC;IACpC,gBAAgB,EAAE,gBAAgB,CAAC;CACpC;AAMD;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,OAAO,CAAC,EAAE,qBAAqB,GAAG,oBAAoB,CAoHpF"}
@@ -1,6 +1,8 @@
1
1
  'use client';
2
2
  import { useCallback, useEffect, useRef, useState } from 'react';
3
3
  const SW_PATH = '/agent-events-sw.js';
4
+ const MAX_EVENTS = 500;
5
+ const PRUNE_KEEP = 250;
4
6
  /**
5
7
  * Hook that receives real-time agent notification events via a Service Worker.
6
8
  *
@@ -20,7 +22,12 @@ export function useAgentEvents(options) {
20
22
  return;
21
23
  if (msg.type === 'notification') {
22
24
  const parsed = msg.data;
23
- setEvents((prev) => [...prev, parsed]);
25
+ // eslint-disable-next-line no-console
26
+ console.log('[SSE] event received:', parsed.eventType, parsed);
27
+ setEvents((prev) => {
28
+ const next = [...prev, parsed];
29
+ return next.length > MAX_EVENTS ? next.slice(-PRUNE_KEEP) : next;
30
+ });
24
31
  setLastEvent(parsed);
25
32
  }
26
33
  else if (msg.type === 'status') {
@@ -75,10 +82,13 @@ export function useAgentEvents(options) {
75
82
  subscribeToWorker(sw);
76
83
  }
77
84
  else {
78
- sw.addEventListener('statechange', () => {
79
- if (sw.state === 'activated')
85
+ const onStateChange = () => {
86
+ if (sw.state === 'activated') {
87
+ sw.removeEventListener('statechange', onStateChange);
80
88
  subscribeToWorker(sw);
81
- });
89
+ }
90
+ };
91
+ sw.addEventListener('statechange', onStateChange);
82
92
  }
83
93
  })
84
94
  .catch(() => {
@@ -143,7 +153,10 @@ function connectDirectEventSource(runId, setEvents, setLastEvent, setConnectionS
143
153
  };
144
154
  es.addEventListener('notification', ((event) => {
145
155
  const parsed = JSON.parse(event.data);
146
- setEvents((prev) => [...prev, parsed]);
156
+ setEvents((prev) => {
157
+ const next = [...prev, parsed];
158
+ return next.length > MAX_EVENTS ? next.slice(-PRUNE_KEEP) : next;
159
+ });
147
160
  setLastEvent(parsed);
148
161
  }));
149
162
  }
@@ -1 +1 @@
1
- {"version":3,"file":"use-deploy-action.d.ts","sourceRoot":"","sources":["../../../../../src/presentation/web/hooks/use-deploy-action.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sCAAsC,CAAC;AAM5E,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,SAAS,GAAG,YAAY,CAAC;IACrC,cAAc,EAAE,MAAM,CAAC;IACvB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5B,IAAI,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1B,aAAa,EAAE,OAAO,CAAC;IACvB,WAAW,EAAE,OAAO,CAAC;IACrB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,MAAM,EAAE,eAAe,GAAG,IAAI,CAAC;IAC/B,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;CACpB;AAeD,wBAAgB,eAAe,CAAC,KAAK,EAAE,iBAAiB,GAAG,IAAI,GAAG,iBAAiB,CAgKlF"}
1
+ {"version":3,"file":"use-deploy-action.d.ts","sourceRoot":"","sources":["../../../../../src/presentation/web/hooks/use-deploy-action.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sCAAsC,CAAC;AAM5E,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,SAAS,GAAG,YAAY,CAAC;IACrC,cAAc,EAAE,MAAM,CAAC;IACvB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5B,IAAI,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1B,aAAa,EAAE,OAAO,CAAC;IACvB,WAAW,EAAE,OAAO,CAAC;IACrB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,MAAM,EAAE,eAAe,GAAG,IAAI,CAAC;IAC/B,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;CACpB;AAeD,wBAAgB,eAAe,CAAC,KAAK,EAAE,iBAAiB,GAAG,IAAI,GAAG,iBAAiB,CAwKlF"}
@@ -25,6 +25,11 @@ export function useDeployAction(input) {
25
25
  const errorTimerRef = useRef(null);
26
26
  const pollIntervalRef = useRef(null);
27
27
  const mountedRef = useRef(true);
28
+ const statusRef = useRef(status);
29
+ // Keep statusRef in sync with latest status
30
+ useEffect(() => {
31
+ statusRef.current = status;
32
+ }, [status]);
28
33
  // Track mounted state
29
34
  useEffect(() => {
30
35
  mountedRef.current = true;
@@ -66,14 +71,14 @@ export function useDeployAction(input) {
66
71
  stopPolling();
67
72
  }
68
73
  else {
69
- if (result.state !== status) {
70
- log.info(`poll state changed: ${status} → ${result.state}, url=${result.url}`);
74
+ if (result.state !== statusRef.current) {
75
+ log.info(`poll state changed: ${statusRef.current} → ${result.state}, url=${result.url}`);
71
76
  }
72
77
  setStatus(result.state);
73
78
  setUrl(result.url);
74
79
  }
75
80
  }, POLL_INTERVAL);
76
- }, [stopPolling, status]);
81
+ }, [stopPolling]);
77
82
  const handleDeploy = useCallback(async () => {
78
83
  if (!input) {
79
84
  log.warn('deploy() called but input is null — no-op');
@@ -0,0 +1,42 @@
1
+ import type { Edge } from '@xyflow/react';
2
+ import type { CanvasNodeType } from '../components/features/features-canvas/index.js';
3
+ import type { FeatureNodeData } from '../components/common/feature-node/index.js';
4
+ import type { RepositoryNodeData } from '../components/common/repository-node/index.js';
5
+ import { type FeatureEntry, type GraphCallbacks } from '../lib/derive-graph.js';
6
+ export type { GraphCallbacks } from '../lib/derive-graph.js';
7
+ export interface UseGraphStateReturn {
8
+ /** Derived React Flow nodes (from domain Maps). */
9
+ nodes: CanvasNodeType[];
10
+ /** Derived React Flow edges (from domain Maps). */
11
+ edges: Edge[];
12
+ /**
13
+ * Reconcile domain Maps with fresh server data (new initialNodes/initialEdges).
14
+ * Preserves pending (creating) nodes unless a matching real feature appears.
15
+ */
16
+ reconcile: (newNodes: CanvasNodeType[], newEdges: Edge[]) => void;
17
+ /** Update a feature's state/lifecycle/name (e.g., from SSE events). */
18
+ updateFeature: (featureNodeId: string, updates: FeatureDataUpdates) => void;
19
+ /** Add a pending (optimistic) feature node (state='creating'). */
20
+ addPendingFeature: (nodeId: string, data: FeatureNodeData, parentNodeId?: string) => void;
21
+ /** Remove a pending feature node (e.g., on rollback). */
22
+ removePendingFeature: (nodeId: string) => void;
23
+ /** Remove a real feature node from the domain Map. */
24
+ removeFeature: (nodeId: string) => void;
25
+ /** Restore a previously removed feature (rollback). */
26
+ restoreFeature: (nodeId: string, entry: FeatureEntry) => void;
27
+ /** Add a repository node (may use a temp ID initially). */
28
+ addRepository: (nodeId: string, data: RepositoryNodeData) => void;
29
+ /** Remove a repository node. */
30
+ removeRepository: (nodeId: string) => void;
31
+ /** Replace a temp repo ID with the real one (atomic). */
32
+ replaceRepository: (tempId: string, realId: string, data: RepositoryNodeData) => void;
33
+ /** Stable lookup: get the repositoryPath for a feature node. */
34
+ getFeatureRepositoryPath: (featureNodeId: string) => string | undefined;
35
+ /** Stable lookup: get repository node data by nodeId. */
36
+ getRepositoryData: (nodeId: string) => RepositoryNodeData | undefined;
37
+ /** Update callbacks injected into node data (does NOT trigger re-render). */
38
+ setCallbacks: (callbacks: GraphCallbacks) => void;
39
+ }
40
+ type FeatureDataUpdates = Partial<Pick<FeatureNodeData, 'state' | 'lifecycle' | 'name' | 'description'>>;
41
+ export declare function useGraphState(initialNodes: CanvasNodeType[], initialEdges: Edge[]): UseGraphStateReturn;
42
+ //# sourceMappingURL=use-graph-state.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-graph-state.d.ts","sourceRoot":"","sources":["../../../../../src/presentation/web/hooks/use-graph-state.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,IAAI,EAAY,MAAM,eAAe,CAAC;AACpD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uCAAuC,CAAC;AAC5E,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AACxE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,qCAAqC,CAAC;AAC9E,OAAO,EAEL,KAAK,YAAY,EAEjB,KAAK,cAAc,EACpB,MAAM,oBAAoB,CAAC;AAG5B,YAAY,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAEzD,MAAM,WAAW,mBAAmB;IAClC,mDAAmD;IACnD,KAAK,EAAE,cAAc,EAAE,CAAC;IACxB,mDAAmD;IACnD,KAAK,EAAE,IAAI,EAAE,CAAC;IACd;;;OAGG;IACH,SAAS,EAAE,CAAC,QAAQ,EAAE,cAAc,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,IAAI,CAAC;IAClE,uEAAuE;IACvE,aAAa,EAAE,CAAC,aAAa,EAAE,MAAM,EAAE,OAAO,EAAE,kBAAkB,KAAK,IAAI,CAAC;IAC5E,kEAAkE;IAClE,iBAAiB,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,eAAe,EAAE,YAAY,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IAC1F,yDAAyD;IACzD,oBAAoB,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IAC/C,sDAAsD;IACtD,aAAa,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC,uDAAuD;IACvD,cAAc,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,YAAY,KAAK,IAAI,CAAC;IAC9D,2DAA2D;IAC3D,aAAa,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,kBAAkB,KAAK,IAAI,CAAC;IAClE,gCAAgC;IAChC,gBAAgB,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IAC3C,yDAAyD;IACzD,iBAAiB,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,kBAAkB,KAAK,IAAI,CAAC;IACtF,gEAAgE;IAChE,wBAAwB,EAAE,CAAC,aAAa,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,CAAC;IACxE,yDAAyD;IACzD,iBAAiB,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,kBAAkB,GAAG,SAAS,CAAC;IACtE,6EAA6E;IAC7E,YAAY,EAAE,CAAC,SAAS,EAAE,cAAc,KAAK,IAAI,CAAC;CACnD;AAuCD,KAAK,kBAAkB,GAAG,OAAO,CAC/B,IAAI,CAAC,eAAe,EAAE,OAAO,GAAG,WAAW,GAAG,MAAM,GAAG,aAAa,CAAC,CACtE,CAAC;AAWF,wBAAgB,aAAa,CAC3B,YAAY,EAAE,cAAc,EAAE,EAC9B,YAAY,EAAE,IAAI,EAAE,GACnB,mBAAmB,CA+QrB"}