@shepai/cli 1.72.6 → 1.72.7-pr187.86f6440

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 (462) hide show
  1. package/dist/packages/core/src/application/use-cases/features/delete-feature.use-case.d.ts +4 -0
  2. package/dist/packages/core/src/application/use-cases/features/delete-feature.use-case.d.ts.map +1 -1
  3. package/dist/packages/core/src/application/use-cases/features/delete-feature.use-case.js +20 -12
  4. package/dist/packages/core/src/application/use-cases/repositories/delete-repository.use-case.d.ts +8 -3
  5. package/dist/packages/core/src/application/use-cases/repositories/delete-repository.use-case.d.ts.map +1 -1
  6. package/dist/packages/core/src/application/use-cases/repositories/delete-repository.use-case.js +17 -4
  7. package/dist/packages/core/src/infrastructure/repositories/sqlite-feature.repository.js +1 -1
  8. package/dist/packages/core/src/infrastructure/services/tool-installer/tool-installer.service.d.ts.map +1 -1
  9. package/dist/packages/core/src/infrastructure/services/tool-installer/tool-installer.service.js +9 -1
  10. package/dist/packages/core/src/infrastructure/services/tool-installer/tool-metadata.d.ts.map +1 -1
  11. package/dist/packages/core/src/infrastructure/services/tool-installer/tool-metadata.js +5 -0
  12. package/dist/packages/core/src/infrastructure/services/tool-installer/tools/alacritty.json +2 -2
  13. package/dist/packages/core/src/infrastructure/services/tool-installer/tools/kitty.json +2 -2
  14. package/dist/packages/core/src/infrastructure/services/tool-installer/tools/tmux.json +1 -1
  15. package/dist/packages/core/src/infrastructure/services/tool-installer/tools/vscode.json +1 -1
  16. package/dist/packages/core/src/infrastructure/services/tool-installer/tools/windsurf.json +1 -1
  17. package/dist/src/presentation/web/app/(dashboard)/get-graph-data.d.ts.map +1 -1
  18. package/dist/src/presentation/web/app/(dashboard)/get-graph-data.js +2 -6
  19. package/dist/src/presentation/web/app/api/tools/[id]/install/route.d.ts.map +1 -1
  20. package/dist/src/presentation/web/app/api/tools/[id]/install/route.js +9 -4
  21. package/dist/src/presentation/web/app/api/tools/[id]/install/stream/route.d.ts +7 -0
  22. package/dist/src/presentation/web/app/api/tools/[id]/install/stream/route.d.ts.map +1 -0
  23. package/dist/src/presentation/web/app/api/tools/[id]/install/stream/route.js +32 -0
  24. package/dist/src/presentation/web/app/build-graph-nodes.js +11 -1
  25. package/dist/src/presentation/web/components/common/base-drawer/base-drawer.d.ts +3 -1
  26. package/dist/src/presentation/web/components/common/base-drawer/base-drawer.d.ts.map +1 -1
  27. package/dist/src/presentation/web/components/common/base-drawer/base-drawer.js +8 -4
  28. package/dist/src/presentation/web/components/common/control-center-drawer/create-drawer-client.d.ts.map +1 -1
  29. package/dist/src/presentation/web/components/common/control-center-drawer/create-drawer-client.js +12 -3
  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 +6 -2
  32. package/dist/src/presentation/web/components/common/drawer-action-bar/drawer-action-bar.d.ts.map +1 -1
  33. package/dist/src/presentation/web/components/common/drawer-action-bar/drawer-action-bar.js +1 -1
  34. package/dist/src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.d.ts.map +1 -1
  35. package/dist/src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.js +1 -1
  36. package/dist/src/presentation/web/components/common/feature-node/feature-node.d.ts.map +1 -1
  37. package/dist/src/presentation/web/components/common/feature-node/feature-node.js +7 -2
  38. package/dist/src/presentation/web/components/common/repository-node/repository-node.d.ts.map +1 -1
  39. package/dist/src/presentation/web/components/common/repository-node/repository-node.js +6 -2
  40. package/dist/src/presentation/web/components/features/control-center/control-center-inner.d.ts.map +1 -1
  41. package/dist/src/presentation/web/components/features/control-center/control-center-inner.js +14 -2
  42. package/dist/src/presentation/web/components/features/control-center/use-control-center-state.d.ts +3 -5
  43. package/dist/src/presentation/web/components/features/control-center/use-control-center-state.d.ts.map +1 -1
  44. package/dist/src/presentation/web/components/features/control-center/use-control-center-state.js +131 -196
  45. package/dist/src/presentation/web/components/features/index.d.ts +1 -1
  46. package/dist/src/presentation/web/components/features/index.d.ts.map +1 -1
  47. package/dist/src/presentation/web/components/features/index.js +1 -1
  48. package/dist/src/presentation/web/components/features/tools/index.d.ts +1 -1
  49. package/dist/src/presentation/web/components/features/tools/index.d.ts.map +1 -1
  50. package/dist/src/presentation/web/components/features/tools/index.js +1 -1
  51. package/dist/src/presentation/web/components/features/tools/tool-card.d.ts.map +1 -1
  52. package/dist/src/presentation/web/components/features/tools/tool-card.js +11 -12
  53. package/dist/src/presentation/web/components/features/tools/tool-detail-drawer.d.ts +10 -0
  54. package/dist/src/presentation/web/components/features/tools/tool-detail-drawer.d.ts.map +1 -0
  55. package/dist/src/presentation/web/components/features/tools/tool-detail-drawer.js +88 -0
  56. package/dist/src/presentation/web/components/features/tools/tool-detail-drawer.stories.d.ts +12 -0
  57. package/dist/src/presentation/web/components/features/tools/tool-detail-drawer.stories.d.ts.map +1 -0
  58. package/dist/src/presentation/web/components/features/tools/tool-detail-drawer.stories.js +116 -0
  59. package/dist/src/presentation/web/components/ui/alert-dialog.d.ts +1 -1
  60. package/dist/src/presentation/web/components/ui/alert-dialog.d.ts.map +1 -1
  61. package/dist/src/presentation/web/components/ui/alert-dialog.js +7 -2
  62. package/dist/src/presentation/web/components/ui/dialog.d.ts.map +1 -1
  63. package/dist/src/presentation/web/components/ui/dialog.js +6 -1
  64. package/dist/src/presentation/web/hooks/use-tool-install-stream.d.ts +10 -0
  65. package/dist/src/presentation/web/hooks/use-tool-install-stream.d.ts.map +1 -0
  66. package/dist/src/presentation/web/hooks/use-tool-install-stream.js +38 -0
  67. package/dist/src/presentation/web/lib/layout-with-dagre.d.ts +2 -0
  68. package/dist/src/presentation/web/lib/layout-with-dagre.d.ts.map +1 -1
  69. package/dist/src/presentation/web/lib/layout-with-dagre.js +86 -4
  70. package/dist/tsconfig.build.tsbuildinfo +1 -1
  71. package/package.json +1 -1
  72. package/web/.next/BUILD_ID +1 -1
  73. package/web/.next/app-path-routes-manifest.json +1 -0
  74. package/web/.next/build-manifest.json +7 -7
  75. package/web/.next/cache/.previewinfo +1 -1
  76. package/web/.next/cache/.rscinfo +1 -1
  77. package/web/.next/cache/.tsbuildinfo +1 -1
  78. package/web/.next/cache/config.json +3 -3
  79. package/web/.next/fallback-build-manifest.json +2 -2
  80. package/web/.next/prerender-manifest.json +3 -3
  81. package/web/.next/required-server-files.js +1 -1
  82. package/web/.next/required-server-files.json +1 -1
  83. package/web/.next/routes-manifest.json +8 -0
  84. package/web/.next/server/app/(dashboard)/@drawer/create/page/build-manifest.json +5 -5
  85. package/web/.next/server/app/(dashboard)/@drawer/create/page/server-reference-manifest.json +14 -14
  86. package/web/.next/server/app/(dashboard)/@drawer/create/page.js +1 -1
  87. package/web/.next/server/app/(dashboard)/@drawer/create/page.js.nft.json +1 -1
  88. package/web/.next/server/app/(dashboard)/@drawer/create/page_client-reference-manifest.js +1 -1
  89. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page/build-manifest.json +5 -5
  90. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page/server-reference-manifest.json +17 -17
  91. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js +1 -1
  92. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js.nft.json +1 -1
  93. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page_client-reference-manifest.js +1 -1
  94. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page/build-manifest.json +5 -5
  95. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page/server-reference-manifest.json +12 -12
  96. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js +1 -1
  97. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js.nft.json +1 -1
  98. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  99. package/web/.next/server/app/(dashboard)/create/page/build-manifest.json +5 -5
  100. package/web/.next/server/app/(dashboard)/create/page/server-reference-manifest.json +14 -14
  101. package/web/.next/server/app/(dashboard)/create/page.js +1 -1
  102. package/web/.next/server/app/(dashboard)/create/page.js.nft.json +1 -1
  103. package/web/.next/server/app/(dashboard)/create/page_client-reference-manifest.js +1 -1
  104. package/web/.next/server/app/(dashboard)/feature/[featureId]/page/build-manifest.json +5 -5
  105. package/web/.next/server/app/(dashboard)/feature/[featureId]/page/server-reference-manifest.json +17 -17
  106. package/web/.next/server/app/(dashboard)/feature/[featureId]/page.js +1 -1
  107. package/web/.next/server/app/(dashboard)/feature/[featureId]/page.js.nft.json +1 -1
  108. package/web/.next/server/app/(dashboard)/feature/[featureId]/page_client-reference-manifest.js +1 -1
  109. package/web/.next/server/app/(dashboard)/page/build-manifest.json +5 -5
  110. package/web/.next/server/app/(dashboard)/page/server-reference-manifest.json +12 -12
  111. package/web/.next/server/app/(dashboard)/page.js +1 -1
  112. package/web/.next/server/app/(dashboard)/page.js.nft.json +1 -1
  113. package/web/.next/server/app/(dashboard)/page_client-reference-manifest.js +1 -1
  114. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page/build-manifest.json +5 -5
  115. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page/server-reference-manifest.json +12 -12
  116. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js +1 -1
  117. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js.nft.json +1 -1
  118. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  119. package/web/.next/server/app/_global-error/page/build-manifest.json +5 -5
  120. package/web/.next/server/app/_global-error.html +2 -2
  121. package/web/.next/server/app/_global-error.rsc +1 -1
  122. package/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  123. package/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  124. package/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  125. package/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  126. package/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  127. package/web/.next/server/app/_not-found/page/build-manifest.json +5 -5
  128. package/web/.next/server/app/_not-found/page/server-reference-manifest.json +1 -1
  129. package/web/.next/server/app/_not-found/page.js.nft.json +1 -1
  130. package/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  131. package/web/.next/server/app/api/tools/[id]/install/route.js +1 -1
  132. package/web/.next/server/app/api/tools/[id]/install/route.js.nft.json +1 -1
  133. package/web/.next/server/app/api/tools/[id]/install/stream/route/app-paths-manifest.json +3 -0
  134. package/web/.next/server/app/api/tools/[id]/install/stream/route/build-manifest.json +11 -0
  135. package/web/.next/server/app/api/tools/[id]/install/stream/route/server-reference-manifest.json +4 -0
  136. package/web/.next/server/app/api/tools/[id]/install/stream/route.js +6 -0
  137. package/web/.next/server/app/api/tools/[id]/install/stream/route.js.map +5 -0
  138. package/web/.next/server/app/api/tools/[id]/install/stream/route.js.nft.json +1 -0
  139. package/web/.next/server/app/api/tools/[id]/install/stream/route_client-reference-manifest.js +2 -0
  140. package/web/.next/server/app/skills/page/build-manifest.json +5 -5
  141. package/web/.next/server/app/skills/page/server-reference-manifest.json +6 -6
  142. package/web/.next/server/app/skills/page.js +1 -1
  143. package/web/.next/server/app/skills/page.js.nft.json +1 -1
  144. package/web/.next/server/app/skills/page_client-reference-manifest.js +1 -1
  145. package/web/.next/server/app/tools/page/build-manifest.json +5 -5
  146. package/web/.next/server/app/tools/page/server-reference-manifest.json +77 -2
  147. package/web/.next/server/app/tools/page.js +2 -2
  148. package/web/.next/server/app/tools/page.js.nft.json +1 -1
  149. package/web/.next/server/app/tools/page_client-reference-manifest.js +1 -1
  150. package/web/.next/server/app/version/page/build-manifest.json +5 -5
  151. package/web/.next/server/app/version/page/server-reference-manifest.json +1 -1
  152. package/web/.next/server/app/version/page.js.nft.json +1 -1
  153. package/web/.next/server/app/version/page_client-reference-manifest.js +1 -1
  154. package/web/.next/server/app-paths-manifest.json +1 -0
  155. package/web/.next/server/chunks/[root-of-the-server]__0866d2b5._.js +3 -0
  156. package/web/.next/server/chunks/[root-of-the-server]__0866d2b5._.js.map +1 -0
  157. package/web/.next/server/chunks/[root-of-the-server]__e247a485._.js +11 -0
  158. package/web/.next/server/chunks/[root-of-the-server]__e247a485._.js.map +1 -0
  159. package/web/.next/server/chunks/f3a1f__next-internal_server_app_api_tools_[id]_install_stream_route_actions_1fe5bd5d.js +3 -0
  160. package/web/.next/server/chunks/f3a1f__next-internal_server_app_api_tools_[id]_install_stream_route_actions_1fe5bd5d.js.map +1 -0
  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_2b7834f6.js +1 -1
  164. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_2b7834f6.js.map +1 -1
  165. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_6923c575.js +1 -1
  166. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_6923c575.js.map +1 -1
  167. package/web/.next/server/chunks/ssr/[root-of-the-server]__17a611f0._.js +4 -0
  168. package/web/.next/server/chunks/ssr/[root-of-the-server]__17a611f0._.js.map +1 -0
  169. package/web/.next/server/chunks/ssr/[root-of-the-server]__249c74f6._.js +1 -1
  170. package/web/.next/{standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__07385073._.js → server/chunks/ssr/[root-of-the-server]__45dbf93d._.js} +3 -3
  171. package/web/.next/server/chunks/ssr/{[root-of-the-server]__07385073._.js.map → [root-of-the-server]__45dbf93d._.js.map} +1 -1
  172. package/web/.next/server/chunks/ssr/[root-of-the-server]__6b17a22d._.js +1 -1
  173. package/web/.next/server/chunks/ssr/[root-of-the-server]__6b17a22d._.js.map +1 -1
  174. package/web/.next/{standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__8fcb9132._.js → server/chunks/ssr/[root-of-the-server]__6cbc1149._.js} +3 -3
  175. package/web/.next/server/chunks/ssr/[root-of-the-server]__6cbc1149._.js.map +1 -0
  176. package/web/.next/server/chunks/ssr/[root-of-the-server]__804c006d._.js +1 -1
  177. package/web/.next/server/chunks/ssr/[root-of-the-server]__804c006d._.js.map +1 -1
  178. package/web/.next/server/chunks/ssr/[root-of-the-server]__aad040c0._.js +3 -0
  179. package/web/.next/server/chunks/ssr/[root-of-the-server]__aad040c0._.js.map +1 -0
  180. package/web/.next/server/chunks/ssr/[root-of-the-server]__aef6b3cd._.js +3 -0
  181. package/web/.next/server/chunks/ssr/{[root-of-the-server]__8c1a3d66._.js.map → [root-of-the-server]__aef6b3cd._.js.map} +1 -1
  182. package/web/.next/server/chunks/ssr/[root-of-the-server]__c04c8ff2._.js +3 -0
  183. package/web/.next/server/chunks/ssr/[root-of-the-server]__c04c8ff2._.js.map +1 -0
  184. package/web/.next/server/chunks/ssr/[root-of-the-server]__c134fc13._.js +3 -0
  185. package/web/.next/server/chunks/ssr/[root-of-the-server]__c134fc13._.js.map +1 -0
  186. package/web/.next/server/chunks/ssr/[root-of-the-server]__c18f84a4._.js +3 -0
  187. package/web/.next/server/chunks/ssr/[root-of-the-server]__c18f84a4._.js.map +1 -0
  188. package/web/.next/server/chunks/ssr/_07c2a32a._.js +1 -1
  189. package/web/.next/server/chunks/ssr/_07c2a32a._.js.map +1 -1
  190. package/web/.next/server/chunks/ssr/_0e9d6bf7._.js +3 -0
  191. package/web/.next/server/chunks/ssr/_0e9d6bf7._.js.map +1 -0
  192. package/web/.next/server/chunks/ssr/_3197d5cb._.js +3 -0
  193. package/web/.next/server/chunks/ssr/_3197d5cb._.js.map +1 -0
  194. package/web/.next/server/chunks/ssr/_4e5db14b._.js +7 -0
  195. package/web/.next/server/chunks/ssr/_4e5db14b._.js.map +1 -0
  196. package/web/.next/server/chunks/ssr/_61351ed3._.js +3 -0
  197. package/web/.next/server/chunks/ssr/_61351ed3._.js.map +1 -0
  198. package/web/.next/server/chunks/ssr/_797dbf60._.js +3 -0
  199. package/web/.next/server/chunks/ssr/_797dbf60._.js.map +1 -0
  200. package/web/.next/server/chunks/ssr/_8400c8bb._.js +3 -0
  201. package/web/.next/server/chunks/ssr/_8400c8bb._.js.map +1 -0
  202. package/web/.next/server/chunks/ssr/_a29296f0._.js +3 -0
  203. package/web/.next/server/chunks/ssr/_a29296f0._.js.map +1 -0
  204. package/web/.next/{standalone/src/presentation/web/.next/server/chunks/ssr/_e50484ec._.js → server/chunks/ssr/_a2a86eed._.js} +2 -2
  205. package/web/.next/server/chunks/ssr/{_e50484ec._.js.map → _a2a86eed._.js.map} +1 -1
  206. package/web/.next/server/chunks/ssr/_dd1c549f._.js +3 -0
  207. package/web/.next/server/chunks/ssr/_dd1c549f._.js.map +1 -0
  208. package/web/.next/server/chunks/ssr/src_presentation_web_1a32dbcb._.js +2 -2
  209. package/web/.next/server/chunks/ssr/src_presentation_web_1a32dbcb._.js.map +1 -1
  210. package/web/.next/server/chunks/ssr/src_presentation_web_398553b0._.js +1 -1
  211. package/web/.next/server/chunks/ssr/src_presentation_web_398553b0._.js.map +1 -1
  212. package/web/.next/server/chunks/ssr/src_presentation_web_5c87e8e4._.js +1 -1
  213. package/web/.next/server/chunks/ssr/src_presentation_web_5c87e8e4._.js.map +1 -1
  214. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_f4952172.js +1 -1
  215. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_f4952172.js.map +1 -1
  216. package/web/.next/server/chunks/ssr/src_presentation_web_c1bc6240._.js +2 -2
  217. package/web/.next/server/chunks/ssr/src_presentation_web_c1bc6240._.js.map +1 -1
  218. package/web/.next/server/chunks/ssr/src_presentation_web_ca99d62d._.js +1 -1
  219. package/web/.next/server/chunks/ssr/src_presentation_web_ca99d62d._.js.map +1 -1
  220. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js +1 -1
  221. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js.map +1 -1
  222. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_tools_tools-page-client_tsx_3d0aa70c._.js +3 -0
  223. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_tools_tools-page-client_tsx_3d0aa70c._.js.map +1 -0
  224. package/web/.next/server/middleware-build-manifest.js +5 -5
  225. package/web/.next/server/pages/500.html +2 -2
  226. package/web/.next/server/server-reference-manifest.js +1 -1
  227. package/web/.next/server/server-reference-manifest.json +61 -26
  228. package/web/.next/standalone/src/presentation/web/.next/BUILD_ID +1 -1
  229. package/web/.next/standalone/src/presentation/web/.next/app-path-routes-manifest.json +1 -0
  230. package/web/.next/standalone/src/presentation/web/.next/build-manifest.json +7 -7
  231. package/web/.next/standalone/src/presentation/web/.next/prerender-manifest.json +3 -3
  232. package/web/.next/standalone/src/presentation/web/.next/required-server-files.json +1 -1
  233. package/web/.next/standalone/src/presentation/web/.next/routes-manifest.json +8 -0
  234. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/@drawer/create/page/build-manifest.json +5 -5
  235. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/@drawer/create/page/server-reference-manifest.json +14 -14
  236. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/@drawer/create/page.js +1 -1
  237. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/@drawer/create/page.js.nft.json +1 -1
  238. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/@drawer/create/page_client-reference-manifest.js +1 -1
  239. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page/build-manifest.json +5 -5
  240. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page/server-reference-manifest.json +17 -17
  241. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js +1 -1
  242. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js.nft.json +1 -1
  243. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page_client-reference-manifest.js +1 -1
  244. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page/build-manifest.json +5 -5
  245. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page/server-reference-manifest.json +12 -12
  246. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js +1 -1
  247. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js.nft.json +1 -1
  248. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  249. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/create/page/build-manifest.json +5 -5
  250. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/create/page/server-reference-manifest.json +14 -14
  251. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/create/page.js +1 -1
  252. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/create/page.js.nft.json +1 -1
  253. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/create/page_client-reference-manifest.js +1 -1
  254. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/feature/[featureId]/page/build-manifest.json +5 -5
  255. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/feature/[featureId]/page/server-reference-manifest.json +17 -17
  256. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/feature/[featureId]/page.js +1 -1
  257. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/feature/[featureId]/page.js.nft.json +1 -1
  258. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/feature/[featureId]/page_client-reference-manifest.js +1 -1
  259. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/page/build-manifest.json +5 -5
  260. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/page/server-reference-manifest.json +12 -12
  261. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/page.js +1 -1
  262. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/page.js.nft.json +1 -1
  263. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/page_client-reference-manifest.js +1 -1
  264. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/repository/[repositoryId]/page/build-manifest.json +5 -5
  265. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/repository/[repositoryId]/page/server-reference-manifest.json +12 -12
  266. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js +1 -1
  267. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js.nft.json +1 -1
  268. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  269. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error/page/build-manifest.json +5 -5
  270. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.html +2 -2
  271. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.rsc +1 -1
  272. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  273. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  274. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  275. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  276. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  277. package/web/.next/standalone/src/presentation/web/.next/server/app/_not-found/page/build-manifest.json +5 -5
  278. package/web/.next/standalone/src/presentation/web/.next/server/app/_not-found/page/server-reference-manifest.json +1 -1
  279. package/web/.next/standalone/src/presentation/web/.next/server/app/_not-found/page.js.nft.json +1 -1
  280. package/web/.next/standalone/src/presentation/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  281. package/web/.next/standalone/src/presentation/web/.next/server/app/api/tools/[id]/install/route.js +1 -1
  282. package/web/.next/standalone/src/presentation/web/.next/server/app/api/tools/[id]/install/route.js.nft.json +1 -1
  283. package/web/.next/standalone/src/presentation/web/.next/server/app/api/tools/[id]/install/stream/route/app-paths-manifest.json +3 -0
  284. package/web/.next/standalone/src/presentation/web/.next/server/app/api/tools/[id]/install/stream/route/build-manifest.json +11 -0
  285. package/web/.next/standalone/src/presentation/web/.next/server/app/api/tools/[id]/install/stream/route/server-reference-manifest.json +4 -0
  286. package/web/.next/standalone/src/presentation/web/.next/server/app/api/tools/[id]/install/stream/route.js +6 -0
  287. package/web/.next/standalone/src/presentation/web/.next/server/app/api/tools/[id]/install/stream/route.js.map +5 -0
  288. package/web/.next/standalone/src/presentation/web/.next/server/app/api/tools/[id]/install/stream/route.js.nft.json +1 -0
  289. package/web/.next/standalone/src/presentation/web/.next/server/app/api/tools/[id]/install/stream/route_client-reference-manifest.js +2 -0
  290. package/web/.next/standalone/src/presentation/web/.next/server/app/skills/page/build-manifest.json +5 -5
  291. package/web/.next/standalone/src/presentation/web/.next/server/app/skills/page/server-reference-manifest.json +6 -6
  292. package/web/.next/standalone/src/presentation/web/.next/server/app/skills/page.js +1 -1
  293. package/web/.next/standalone/src/presentation/web/.next/server/app/skills/page.js.nft.json +1 -1
  294. package/web/.next/standalone/src/presentation/web/.next/server/app/skills/page_client-reference-manifest.js +1 -1
  295. package/web/.next/standalone/src/presentation/web/.next/server/app/tools/page/build-manifest.json +5 -5
  296. package/web/.next/standalone/src/presentation/web/.next/server/app/tools/page/server-reference-manifest.json +77 -2
  297. package/web/.next/standalone/src/presentation/web/.next/server/app/tools/page.js +2 -2
  298. package/web/.next/standalone/src/presentation/web/.next/server/app/tools/page.js.nft.json +1 -1
  299. package/web/.next/standalone/src/presentation/web/.next/server/app/tools/page_client-reference-manifest.js +1 -1
  300. package/web/.next/standalone/src/presentation/web/.next/server/app/version/page/build-manifest.json +5 -5
  301. package/web/.next/standalone/src/presentation/web/.next/server/app/version/page/server-reference-manifest.json +1 -1
  302. package/web/.next/standalone/src/presentation/web/.next/server/app/version/page.js.nft.json +1 -1
  303. package/web/.next/standalone/src/presentation/web/.next/server/app/version/page_client-reference-manifest.js +1 -1
  304. package/web/.next/standalone/src/presentation/web/.next/server/app-paths-manifest.json +1 -0
  305. package/web/.next/standalone/src/presentation/web/.next/server/chunks/[root-of-the-server]__0866d2b5._.js +3 -0
  306. package/web/.next/standalone/src/presentation/web/.next/server/chunks/[root-of-the-server]__e247a485._.js +11 -0
  307. package/web/.next/standalone/src/presentation/web/.next/server/chunks/f3a1f__next-internal_server_app_api_tools_[id]_install_stream_route_actions_1fe5bd5d.js +3 -0
  308. 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
  309. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_2b7834f6.js +1 -1
  310. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_6923c575.js +1 -1
  311. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__17a611f0._.js +4 -0
  312. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__249c74f6._.js +1 -1
  313. package/web/.next/{server/chunks/ssr/[root-of-the-server]__07385073._.js → standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__45dbf93d._.js} +3 -3
  314. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__6b17a22d._.js +1 -1
  315. package/web/.next/{server/chunks/ssr/[root-of-the-server]__8fcb9132._.js → standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__6cbc1149._.js} +3 -3
  316. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__804c006d._.js +1 -1
  317. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__aad040c0._.js +3 -0
  318. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__aef6b3cd._.js +3 -0
  319. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__c04c8ff2._.js +3 -0
  320. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__c134fc13._.js +3 -0
  321. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__c18f84a4._.js +3 -0
  322. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_07c2a32a._.js +1 -1
  323. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_0e9d6bf7._.js +3 -0
  324. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_3197d5cb._.js +3 -0
  325. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_4e5db14b._.js +7 -0
  326. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_61351ed3._.js +3 -0
  327. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_797dbf60._.js +3 -0
  328. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_8400c8bb._.js +3 -0
  329. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_a29296f0._.js +3 -0
  330. package/web/.next/{server/chunks/ssr/_e50484ec._.js → standalone/src/presentation/web/.next/server/chunks/ssr/_a2a86eed._.js} +2 -2
  331. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_dd1c549f._.js +3 -0
  332. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/src_presentation_web_1a32dbcb._.js +2 -2
  333. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/src_presentation_web_398553b0._.js +1 -1
  334. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/src_presentation_web_5c87e8e4._.js +1 -1
  335. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_f4952172.js +1 -1
  336. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/src_presentation_web_c1bc6240._.js +2 -2
  337. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/src_presentation_web_ca99d62d._.js +1 -1
  338. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js +1 -1
  339. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/src_presentation_web_components_features_tools_tools-page-client_tsx_3d0aa70c._.js +3 -0
  340. package/web/.next/standalone/src/presentation/web/.next/server/middleware-build-manifest.js +5 -5
  341. package/web/.next/standalone/src/presentation/web/.next/server/pages/500.html +2 -2
  342. package/web/.next/standalone/src/presentation/web/.next/server/server-reference-manifest.js +1 -1
  343. package/web/.next/standalone/src/presentation/web/.next/server/server-reference-manifest.json +61 -26
  344. package/web/.next/standalone/src/presentation/web/app/(dashboard)/get-graph-data.ts +2 -6
  345. package/web/.next/standalone/src/presentation/web/app/api/tools/[id]/install/route.ts +14 -6
  346. package/web/.next/standalone/src/presentation/web/app/api/tools/[id]/install/stream/route.ts +42 -0
  347. package/web/.next/standalone/src/presentation/web/app/build-graph-nodes.ts +14 -1
  348. package/web/.next/standalone/src/presentation/web/components/common/base-drawer/base-drawer.tsx +10 -8
  349. package/web/.next/standalone/src/presentation/web/components/common/control-center-drawer/create-drawer-client.tsx +13 -3
  350. package/web/.next/standalone/src/presentation/web/components/common/control-center-drawer/feature-drawer-client.tsx +6 -2
  351. package/web/.next/standalone/src/presentation/web/components/common/drawer-action-bar/drawer-action-bar.tsx +2 -0
  352. package/web/.next/standalone/src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.tsx +8 -5
  353. package/web/.next/standalone/src/presentation/web/components/common/feature-node/feature-node.tsx +30 -24
  354. package/web/.next/standalone/src/presentation/web/components/common/repository-node/repository-node.tsx +33 -25
  355. package/web/.next/standalone/src/presentation/web/components/features/control-center/control-center-inner.tsx +25 -3
  356. package/web/.next/standalone/src/presentation/web/components/features/control-center/use-control-center-state.ts +184 -230
  357. package/web/.next/standalone/src/presentation/web/components/features/index.ts +1 -1
  358. package/web/.next/standalone/src/presentation/web/components/features/tools/index.ts +1 -1
  359. package/web/.next/standalone/src/presentation/web/components/features/tools/tool-card.tsx +52 -56
  360. package/web/.next/standalone/src/presentation/web/components/features/tools/tool-detail-drawer.stories.tsx +129 -0
  361. package/web/.next/standalone/src/presentation/web/components/features/tools/tool-detail-drawer.tsx +277 -0
  362. package/web/.next/standalone/src/presentation/web/components/ui/alert-dialog.tsx +7 -0
  363. package/web/.next/standalone/src/presentation/web/components/ui/dialog.tsx +7 -1
  364. package/web/.next/standalone/src/presentation/web/hooks/use-tool-install-stream.ts +58 -0
  365. package/web/.next/standalone/src/presentation/web/lib/layout-with-dagre.ts +93 -4
  366. package/web/.next/standalone/src/presentation/web/server.js +1 -1
  367. package/web/.next/static/chunks/0c54314c8c9c9739.js +7 -0
  368. package/web/.next/static/chunks/3969f00d871743f5.js +1 -0
  369. package/web/.next/static/chunks/5d0a6417c4e4e545.js +1 -0
  370. package/web/.next/static/chunks/603dfc7302d69eea.js +1 -0
  371. package/web/.next/static/chunks/6059a88955f582cc.js +1 -0
  372. package/web/.next/static/chunks/6a97d80f8c80abea.js +5 -0
  373. package/web/.next/static/chunks/84a181ff3270fd9f.js +1 -0
  374. package/web/.next/static/chunks/b1ac668fe8c3cfe7.css +2 -0
  375. package/web/.next/static/chunks/bc08901495944d5d.js +1 -0
  376. package/web/.next/static/chunks/bfa8014b2e37a6e3.js +1 -0
  377. package/web/.next/static/chunks/{d4ecce2ac7795bd9.js → c81a2c46730b4afb.js} +1 -1
  378. package/web/.next/static/chunks/{8b36e07129a1471f.js → ccdb4b72cf686304.js} +1 -1
  379. package/web/.next/static/chunks/edbd674102e897b4.js +1 -0
  380. package/web/.next/static/chunks/{412a3ac70c529c5b.js → f089dd8f35a6d79c.js} +1 -1
  381. package/web/.next/static/chunks/f5a543a8ccb7e8b9.js +1 -0
  382. package/web/.next/static/chunks/{fc07834e422b1caa.js → fe2a7112664de6d7.js} +1 -1
  383. package/web/.next/static/chunks/{turbopack-3a8fe0e18e69b0ab.js → turbopack-05820f781f3ffc22.js} +1 -1
  384. package/web/.next/trace +1 -1
  385. package/web/.next/trace-build +1 -1
  386. package/web/.next/types/link.d.ts +1 -0
  387. package/web/.next/types/routes.d.ts +2 -1
  388. package/web/.next/types/validator.ts +9 -0
  389. package/dist/src/presentation/web/components/features/tools/install-instructions.d.ts +0 -9
  390. package/dist/src/presentation/web/components/features/tools/install-instructions.d.ts.map +0 -1
  391. package/dist/src/presentation/web/components/features/tools/install-instructions.js +0 -19
  392. package/dist/src/presentation/web/components/features/tools/install-instructions.stories.d.ts +0 -12
  393. package/dist/src/presentation/web/components/features/tools/install-instructions.stories.d.ts.map +0 -1
  394. package/dist/src/presentation/web/components/features/tools/install-instructions.stories.js +0 -77
  395. package/web/.next/server/chunks/[root-of-the-server]__b1f03347._.js +0 -3
  396. package/web/.next/server/chunks/[root-of-the-server]__b1f03347._.js.map +0 -1
  397. package/web/.next/server/chunks/ssr/[root-of-the-server]__08ba9bd3._.js +0 -4
  398. package/web/.next/server/chunks/ssr/[root-of-the-server]__08ba9bd3._.js.map +0 -1
  399. package/web/.next/server/chunks/ssr/[root-of-the-server]__6bb00d90._.js +0 -3
  400. package/web/.next/server/chunks/ssr/[root-of-the-server]__6bb00d90._.js.map +0 -1
  401. package/web/.next/server/chunks/ssr/[root-of-the-server]__6db85a66._.js +0 -4
  402. package/web/.next/server/chunks/ssr/[root-of-the-server]__6db85a66._.js.map +0 -1
  403. package/web/.next/server/chunks/ssr/[root-of-the-server]__8c1a3d66._.js +0 -3
  404. package/web/.next/server/chunks/ssr/[root-of-the-server]__8fcb9132._.js.map +0 -1
  405. package/web/.next/server/chunks/ssr/[root-of-the-server]__9d14479b._.js +0 -3
  406. package/web/.next/server/chunks/ssr/[root-of-the-server]__9d14479b._.js.map +0 -1
  407. package/web/.next/server/chunks/ssr/[root-of-the-server]__d4e51258._.js +0 -3
  408. package/web/.next/server/chunks/ssr/[root-of-the-server]__d4e51258._.js.map +0 -1
  409. package/web/.next/server/chunks/ssr/[root-of-the-server]__fe2a7deb._.js +0 -3
  410. package/web/.next/server/chunks/ssr/[root-of-the-server]__fe2a7deb._.js.map +0 -1
  411. package/web/.next/server/chunks/ssr/_00e6c698._.js +0 -3
  412. package/web/.next/server/chunks/ssr/_00e6c698._.js.map +0 -1
  413. package/web/.next/server/chunks/ssr/_13566ff3._.js +0 -3
  414. package/web/.next/server/chunks/ssr/_13566ff3._.js.map +0 -1
  415. package/web/.next/server/chunks/ssr/_26129e04._.js +0 -3
  416. package/web/.next/server/chunks/ssr/_26129e04._.js.map +0 -1
  417. package/web/.next/server/chunks/ssr/_34a58db8._.js +0 -3
  418. package/web/.next/server/chunks/ssr/_34a58db8._.js.map +0 -1
  419. package/web/.next/server/chunks/ssr/_37259405._.js +0 -3
  420. package/web/.next/server/chunks/ssr/_37259405._.js.map +0 -1
  421. package/web/.next/server/chunks/ssr/_85d0351b._.js +0 -3
  422. package/web/.next/server/chunks/ssr/_85d0351b._.js.map +0 -1
  423. package/web/.next/server/chunks/ssr/_cb5b3951._.js +0 -3
  424. package/web/.next/server/chunks/ssr/_cb5b3951._.js.map +0 -1
  425. package/web/.next/server/chunks/ssr/_fc3a6895._.js +0 -3
  426. package/web/.next/server/chunks/ssr/_fc3a6895._.js.map +0 -1
  427. package/web/.next/server/chunks/ssr/node_modules__pnpm_3288606c._.js +0 -7
  428. package/web/.next/server/chunks/ssr/node_modules__pnpm_3288606c._.js.map +0 -1
  429. package/web/.next/standalone/src/presentation/web/.next/server/chunks/[root-of-the-server]__b1f03347._.js +0 -3
  430. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__08ba9bd3._.js +0 -4
  431. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__6bb00d90._.js +0 -3
  432. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__6db85a66._.js +0 -4
  433. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__8c1a3d66._.js +0 -3
  434. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__9d14479b._.js +0 -3
  435. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__d4e51258._.js +0 -3
  436. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__fe2a7deb._.js +0 -3
  437. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_00e6c698._.js +0 -3
  438. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_13566ff3._.js +0 -3
  439. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_26129e04._.js +0 -3
  440. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_34a58db8._.js +0 -3
  441. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_37259405._.js +0 -3
  442. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_85d0351b._.js +0 -3
  443. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_cb5b3951._.js +0 -3
  444. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_fc3a6895._.js +0 -3
  445. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/node_modules__pnpm_3288606c._.js +0 -7
  446. package/web/.next/standalone/src/presentation/web/components/features/tools/install-instructions.stories.tsx +0 -89
  447. package/web/.next/standalone/src/presentation/web/components/features/tools/install-instructions.tsx +0 -109
  448. package/web/.next/static/chunks/06b6b02bab76aee7.js +0 -1
  449. package/web/.next/static/chunks/06dfd668334ffb4e.js +0 -7
  450. package/web/.next/static/chunks/07fcc6d17357e905.js +0 -1
  451. package/web/.next/static/chunks/224ed5f5dbd33154.css +0 -2
  452. package/web/.next/static/chunks/32957ff277daec59.js +0 -1
  453. package/web/.next/static/chunks/3e1227e02ef8bcc6.js +0 -5
  454. package/web/.next/static/chunks/550bf3cb8220cbf0.js +0 -1
  455. package/web/.next/static/chunks/5f5c607ffae8b918.js +0 -1
  456. package/web/.next/static/chunks/64d73952a0291431.js +0 -1
  457. package/web/.next/static/chunks/c7e793951b20a67f.js +0 -1
  458. package/web/.next/static/chunks/e44849eb58a3335f.js +0 -1
  459. package/web/.next/static/chunks/ecb2130572a7fbe7.js +0 -1
  460. /package/web/.next/static/{7K6dTYQIJ7__PLUYLLfZV → 5-_wERRI1P-m4Tl0xR0UI}/_buildManifest.js +0 -0
  461. /package/web/.next/static/{7K6dTYQIJ7__PLUYLLfZV → 5-_wERRI1P-m4Tl0xR0UI}/_clientMiddlewareManifest.json +0 -0
  462. /package/web/.next/static/{7K6dTYQIJ7__PLUYLLfZV → 5-_wERRI1P-m4Tl0xR0UI}/_ssgManifest.js +0 -0
@@ -2,12 +2,14 @@
2
2
  * Delete Feature Use Case
3
3
  *
4
4
  * Orchestrates feature deletion including:
5
+ * - Cascade deleting all sub-features (children, grandchildren, etc.)
5
6
  * - Cancelling any running/pending agent runs
6
7
  * - Removing the git worktree
7
8
  * - Deleting the feature record
8
9
  *
9
10
  * Business Rules:
10
11
  * - Throws if the feature does not exist
12
+ * - Cascade deletes all sub-features before deleting the parent
11
13
  * - Cancels running/pending agent runs before deletion
12
14
  * - Gracefully handles worktree removal failures
13
15
  */
@@ -23,5 +25,7 @@ export declare class DeleteFeatureUseCase {
23
25
  private readonly runRepo;
24
26
  constructor(featureRepo: IFeatureRepository, worktreeService: IWorktreeService, processService: IFeatureAgentProcessService, runRepo: IAgentRunRepository);
25
27
  execute(featureId: string): Promise<Feature>;
28
+ private cascadeDeleteChildren;
29
+ private deleteSingleFeature;
26
30
  }
27
31
  //# sourceMappingURL=delete-feature.use-case.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"delete-feature.use-case.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/src/application/use-cases/features/delete-feature.use-case.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAGH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qCAAqC,CAAC;AAEnE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,iEAAiE,CAAC;AAC1G,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,2DAA2D,CAAC;AAClG,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,8DAA8D,CAAC;AAChH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,6DAA6D,CAAC;AAEvG,qBACa,oBAAoB;IAEC,OAAO,CAAC,QAAQ,CAAC,WAAW;IAC9B,OAAO,CAAC,QAAQ,CAAC,eAAe;IAE5D,OAAO,CAAC,QAAQ,CAAC,cAAc;IACA,OAAO,CAAC,QAAQ,CAAC,OAAO;gBAJR,WAAW,EAAE,kBAAkB,EACjC,eAAe,EAAE,gBAAgB,EAE7D,cAAc,EAAE,2BAA2B,EACZ,OAAO,EAAE,mBAAmB;IAGxE,OAAO,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;CAqDnD"}
1
+ {"version":3,"file":"delete-feature.use-case.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/src/application/use-cases/features/delete-feature.use-case.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAGH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qCAAqC,CAAC;AAEnE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,iEAAiE,CAAC;AAC1G,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,2DAA2D,CAAC;AAClG,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,8DAA8D,CAAC;AAChH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,6DAA6D,CAAC;AAEvG,qBACa,oBAAoB;IAEC,OAAO,CAAC,QAAQ,CAAC,WAAW;IAC9B,OAAO,CAAC,QAAQ,CAAC,eAAe;IAE5D,OAAO,CAAC,QAAQ,CAAC,cAAc;IACA,OAAO,CAAC,QAAQ,CAAC,OAAO;gBAJR,WAAW,EAAE,kBAAkB,EACjC,eAAe,EAAE,gBAAgB,EAE7D,cAAc,EAAE,2BAA2B,EACZ,OAAO,EAAE,mBAAmB;IAGxE,OAAO,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;YAkBpC,qBAAqB;YASrB,mBAAmB;CA8BlC"}
@@ -2,12 +2,14 @@
2
2
  * Delete Feature Use Case
3
3
  *
4
4
  * Orchestrates feature deletion including:
5
+ * - Cascade deleting all sub-features (children, grandchildren, etc.)
5
6
  * - Cancelling any running/pending agent runs
6
7
  * - Removing the git worktree
7
8
  * - Deleting the feature record
8
9
  *
9
10
  * Business Rules:
10
11
  * - Throws if the feature does not exist
12
+ * - Cascade deletes all sub-features before deleting the parent
11
13
  * - Cancels running/pending agent runs before deletion
12
14
  * - Gracefully handles worktree removal failures
13
15
  */
@@ -24,7 +26,7 @@ var __param = (this && this.__param) || function (paramIndex, decorator) {
24
26
  return function (target, key) { decorator(target, key, paramIndex); }
25
27
  };
26
28
  import { injectable, inject } from 'tsyringe';
27
- import { AgentRunStatus, SdlcLifecycle } from '../../../domain/generated/output.js';
29
+ import { AgentRunStatus } from '../../../domain/generated/output.js';
28
30
  let DeleteFeatureUseCase = class DeleteFeatureUseCase {
29
31
  featureRepo;
30
32
  worktreeService;
@@ -43,18 +45,25 @@ let DeleteFeatureUseCase = class DeleteFeatureUseCase {
43
45
  if (!feature) {
44
46
  throw new Error(`Feature not found: "${featureId}"`);
45
47
  }
46
- // 2. Guard: reject deletion if blocked children exist (FR-29)
47
- const blockedChildren = (await this.featureRepo.findByParentId(feature.id)).filter((child) => child.lifecycle === SdlcLifecycle.Blocked);
48
- if (blockedChildren.length > 0) {
49
- const list = blockedChildren.map((c) => `${c.id} (${c.name})`).join(', ');
50
- throw new Error(`Cannot delete feature "${feature.name}" because it has blocked children: ${list}. ` +
51
- `Remove or re-parent the blocked children before deleting this feature.`);
48
+ // 2. Cascade delete all sub-features (depth-first)
49
+ await this.cascadeDeleteChildren(feature.id);
50
+ // 3. Delete the feature itself
51
+ await this.deleteSingleFeature(feature);
52
+ return feature;
53
+ }
54
+ async cascadeDeleteChildren(parentId) {
55
+ const children = await this.featureRepo.findByParentId(parentId);
56
+ for (const child of children) {
57
+ // Recurse into grandchildren first (depth-first)
58
+ await this.cascadeDeleteChildren(child.id);
59
+ await this.deleteSingleFeature(child);
52
60
  }
53
- // 3. Cancel running/pending agent run if present
61
+ }
62
+ async deleteSingleFeature(feature) {
63
+ // Cancel running/pending agent run if present
54
64
  if (feature.agentRunId) {
55
65
  const run = await this.runRepo.findById(feature.agentRunId);
56
66
  if (run && (run.status === AgentRunStatus.running || run.status === AgentRunStatus.pending)) {
57
- // Kill the OS process if still alive
58
67
  if (run.pid && this.processService.isAlive(run.pid)) {
59
68
  try {
60
69
  process.kill(run.pid);
@@ -66,7 +75,7 @@ let DeleteFeatureUseCase = class DeleteFeatureUseCase {
66
75
  await this.runRepo.updateStatus(run.id, AgentRunStatus.cancelled);
67
76
  }
68
77
  }
69
- // 4. Remove worktree (ignore errors if already removed)
78
+ // Remove worktree (ignore errors if already removed)
70
79
  const worktreePath = this.worktreeService.getWorktreePath(feature.repositoryPath, feature.branch);
71
80
  try {
72
81
  await this.worktreeService.remove(worktreePath);
@@ -74,9 +83,8 @@ let DeleteFeatureUseCase = class DeleteFeatureUseCase {
74
83
  catch {
75
84
  // Worktree might already be removed - that's fine
76
85
  }
77
- // 5. Delete feature record
86
+ // Delete feature record
78
87
  await this.featureRepo.delete(feature.id);
79
- return feature;
80
88
  }
81
89
  };
82
90
  DeleteFeatureUseCase = __decorate([
@@ -1,13 +1,18 @@
1
1
  /**
2
2
  * Delete Repository Use Case
3
3
  *
4
- * Soft-deletes a Repository by setting its deletedAt timestamp.
5
- * The repository data remains in the database for potential recovery.
4
+ * Deletes a Repository and all its child features.
5
+ * Each feature is properly cleaned up (agent runs cancelled, worktrees removed)
6
+ * via DeleteFeatureUseCase before the repository is soft-deleted.
6
7
  */
7
8
  import type { IRepositoryRepository } from '../../ports/output/repositories/repository-repository.interface.js';
9
+ import type { IFeatureRepository } from '../../ports/output/repositories/feature-repository.interface.js';
10
+ import { DeleteFeatureUseCase } from '../features/delete-feature.use-case.js';
8
11
  export declare class DeleteRepositoryUseCase {
9
12
  private readonly repositoryRepo;
10
- constructor(repositoryRepo: IRepositoryRepository);
13
+ private readonly featureRepo;
14
+ private readonly deleteFeature;
15
+ constructor(repositoryRepo: IRepositoryRepository, featureRepo: IFeatureRepository, deleteFeature: DeleteFeatureUseCase);
11
16
  execute(id: string): Promise<void>;
12
17
  }
13
18
  //# sourceMappingURL=delete-repository.use-case.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"delete-repository.use-case.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/src/application/use-cases/repositories/delete-repository.use-case.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,oEAAoE,CAAC;AAEhH,qBACa,uBAAuB;IAGhC,OAAO,CAAC,QAAQ,CAAC,cAAc;gBAAd,cAAc,EAAE,qBAAqB;IAGlD,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAQzC"}
1
+ {"version":3,"file":"delete-repository.use-case.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/src/application/use-cases/repositories/delete-repository.use-case.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,oEAAoE,CAAC;AAChH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,iEAAiE,CAAC;AAC1G,OAAO,EAAE,oBAAoB,EAAE,MAAM,wCAAwC,CAAC;AAE9E,qBACa,uBAAuB;IAGhC,OAAO,CAAC,QAAQ,CAAC,cAAc;IAE/B,OAAO,CAAC,QAAQ,CAAC,WAAW;IAE5B,OAAO,CAAC,QAAQ,CAAC,aAAa;gBAJb,cAAc,EAAE,qBAAqB,EAErC,WAAW,EAAE,kBAAkB,EAE/B,aAAa,EAAE,oBAAoB;IAGhD,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAczC"}
@@ -1,8 +1,9 @@
1
1
  /**
2
2
  * Delete Repository Use Case
3
3
  *
4
- * Soft-deletes a Repository by setting its deletedAt timestamp.
5
- * The repository data remains in the database for potential recovery.
4
+ * Deletes a Repository and all its child features.
5
+ * Each feature is properly cleaned up (agent runs cancelled, worktrees removed)
6
+ * via DeleteFeatureUseCase before the repository is soft-deleted.
6
7
  */
7
8
  var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
8
9
  var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
@@ -17,22 +18,34 @@ var __param = (this && this.__param) || function (paramIndex, decorator) {
17
18
  return function (target, key) { decorator(target, key, paramIndex); }
18
19
  };
19
20
  import { injectable, inject } from 'tsyringe';
21
+ import { DeleteFeatureUseCase } from '../features/delete-feature.use-case.js';
20
22
  let DeleteRepositoryUseCase = class DeleteRepositoryUseCase {
21
23
  repositoryRepo;
22
- constructor(repositoryRepo) {
24
+ featureRepo;
25
+ deleteFeature;
26
+ constructor(repositoryRepo, featureRepo, deleteFeature) {
23
27
  this.repositoryRepo = repositoryRepo;
28
+ this.featureRepo = featureRepo;
29
+ this.deleteFeature = deleteFeature;
24
30
  }
25
31
  async execute(id) {
26
32
  const repository = await this.repositoryRepo.findById(id);
27
33
  if (!repository) {
28
34
  throw new Error(`Repository not found: "${id}"`);
29
35
  }
36
+ // Delete all child features (cancels agent runs, removes worktrees)
37
+ const features = await this.featureRepo.list({ repositoryPath: repository.path });
38
+ for (const feature of features) {
39
+ await this.deleteFeature.execute(feature.id);
40
+ }
30
41
  await this.repositoryRepo.softDelete(id);
31
42
  }
32
43
  };
33
44
  DeleteRepositoryUseCase = __decorate([
34
45
  injectable(),
35
46
  __param(0, inject('IRepositoryRepository')),
36
- __metadata("design:paramtypes", [Object])
47
+ __param(1, inject('IFeatureRepository')),
48
+ __param(2, inject(DeleteFeatureUseCase)),
49
+ __metadata("design:paramtypes", [Object, Object, DeleteFeatureUseCase])
37
50
  ], DeleteRepositoryUseCase);
38
51
  export { DeleteRepositoryUseCase };
@@ -87,7 +87,7 @@ let SQLiteFeatureRepository = class SQLiteFeatureRepository {
87
87
  params.push(filters.lifecycle);
88
88
  }
89
89
  const where = conditions.length > 0 ? ` WHERE ${conditions.join(' AND ')}` : '';
90
- const stmt = this.db.prepare(`SELECT * FROM features${where}`);
90
+ const stmt = this.db.prepare(`SELECT * FROM features${where} ORDER BY created_at ASC`);
91
91
  const rows = stmt.all(...params);
92
92
  return rows.map(fromDatabase);
93
93
  }
@@ -1 +1 @@
1
- {"version":3,"file":"tool-installer.service.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/src/infrastructure/services/tool-installer/tool-installer.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAKH,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,sEAAsE,CAAC;AAClH,OAAO,KAAK,EACV,sBAAsB,EACtB,kBAAkB,EAEnB,MAAM,qCAAqC,CAAC;AAsD7C,qBACa,wBAAyB,YAAW,qBAAqB;IACpE;;;OAGG;IACG,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,sBAAsB,CAAC;IAoC1E;;;OAGG;IACH,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,kBAAkB,GAAG,IAAI;IAqB9D;;;OAGG;IACG,cAAc,CAClB,QAAQ,EAAE,MAAM,EAChB,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,GAChC,OAAO,CAAC,sBAAsB,CAAC;IAuElC;;OAEG;IACH,OAAO,CAAC,6BAA6B;CA4BtC"}
1
+ {"version":3,"file":"tool-installer.service.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/src/infrastructure/services/tool-installer/tool-installer.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAKH,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,sEAAsE,CAAC;AAClH,OAAO,KAAK,EACV,sBAAsB,EACtB,kBAAkB,EAEnB,MAAM,qCAAqC,CAAC;AAsD7C,qBACa,wBAAyB,YAAW,qBAAqB;IACpE;;;OAGG;IACG,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,sBAAsB,CAAC;IAoC1E;;;OAGG;IACH,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,kBAAkB,GAAG,IAAI;IAqB9D;;;OAGG;IACG,cAAc,CAClB,QAAQ,EAAE,MAAM,EAChB,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,GAChC,OAAO,CAAC,sBAAsB,CAAC;IAgFlC;;OAEG;IACH,OAAO,CAAC,6BAA6B;CA4BtC"}
@@ -132,8 +132,16 @@ let ToolInstallerServiceImpl = class ToolInstallerServiceImpl {
132
132
  let output = '';
133
133
  const child = spawn('sh', ['-c', installCommand.command], {
134
134
  shell: false,
135
- stdio: ['ignore', 'pipe', 'pipe'],
135
+ stdio: ['pipe', 'pipe', 'pipe'],
136
+ env: {
137
+ ...process.env,
138
+ DEBIAN_FRONTEND: 'noninteractive',
139
+ GIT_TERMINAL_PROMPT: '0',
140
+ GPG_TTY: '',
141
+ },
136
142
  });
143
+ // Close stdin immediately to prevent interactive prompts
144
+ child.stdin?.end();
137
145
  // Stream output from stdout and stderr
138
146
  const pipeOutput = (stream) => {
139
147
  if (!stream)
@@ -1 +1 @@
1
- {"version":3,"file":"tool-metadata.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/src/infrastructure/services/tool-installer/tool-metadata.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAMH,MAAM,WAAW,YAAY;IAC3B,kCAAkC;IAClC,IAAI,EAAE,MAAM,CAAC;IAEb,6BAA6B;IAC7B,OAAO,EAAE,MAAM,CAAC;IAEhB,2BAA2B;IAC3B,WAAW,EAAE,MAAM,CAAC;IAEpB,oFAAoF;IACpF,IAAI,EAAE,CAAC,KAAK,GAAG,WAAW,GAAG,KAAK,GAAG,UAAU,CAAC,EAAE,CAAC;IAEnD,wCAAwC;IACxC,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB,6EAA6E;IAC7E,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAExC,6CAA6C;IAC7C,cAAc,EAAE,MAAM,CAAC;IAEvB,wFAAwF;IACxF,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAEjC,2CAA2C;IAC3C,OAAO,EAAE,MAAM,CAAC;IAEhB,iCAAiC;IACjC,gBAAgB,EAAE,MAAM,CAAC;IAEzB,8DAA8D;IAC9D,aAAa,EAAE,MAAM,CAAC;IAEtB,uEAAuE;IACvE,WAAW,CAAC,EAAE,OAAO,CAAC;IAEtB,kFAAkF;IAClF,QAAQ,CAAC,EAAE,OAAO,CAAC;IAEnB;;yGAEqG;IACrG,aAAa,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAEhD;;iGAE6F;IAC7F,YAAY,CAAC,EAAE;QACb,KAAK,CAAC,EAAE,OAAO,CAAC;QAChB,KAAK,CAAC,EAAE,QAAQ,GAAG,SAAS,GAAG,MAAM,CAAC;QACtC,QAAQ,CAAC,EAAE,OAAO,CAAC;KACpB,CAAC;IAEF;;;;wEAIoE;IACpE,eAAe,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACnD;AA8CD,eAAO,MAAM,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAAsB,CAAC;AAE9E;;;;GAIG;AACH,wBAAgB,aAAa,IAAI,CAAC,MAAM,EAAE,YAAY,CAAC,EAAE,CAExD"}
1
+ {"version":3,"file":"tool-metadata.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/src/infrastructure/services/tool-installer/tool-metadata.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAMH,MAAM,WAAW,YAAY;IAC3B,kCAAkC;IAClC,IAAI,EAAE,MAAM,CAAC;IAEb,6BAA6B;IAC7B,OAAO,EAAE,MAAM,CAAC;IAEhB,2BAA2B;IAC3B,WAAW,EAAE,MAAM,CAAC;IAEpB,oFAAoF;IACpF,IAAI,EAAE,CAAC,KAAK,GAAG,WAAW,GAAG,KAAK,GAAG,UAAU,CAAC,EAAE,CAAC;IAEnD,wCAAwC;IACxC,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB,6EAA6E;IAC7E,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAExC,6CAA6C;IAC7C,cAAc,EAAE,MAAM,CAAC;IAEvB,wFAAwF;IACxF,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAEjC,2CAA2C;IAC3C,OAAO,EAAE,MAAM,CAAC;IAEhB,iCAAiC;IACjC,gBAAgB,EAAE,MAAM,CAAC;IAEzB,8DAA8D;IAC9D,aAAa,EAAE,MAAM,CAAC;IAEtB,uEAAuE;IACvE,WAAW,CAAC,EAAE,OAAO,CAAC;IAEtB,kFAAkF;IAClF,QAAQ,CAAC,EAAE,OAAO,CAAC;IAEnB;;yGAEqG;IACrG,aAAa,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAEhD;;iGAE6F;IAC7F,YAAY,CAAC,EAAE;QACb,KAAK,CAAC,EAAE,OAAO,CAAC;QAChB,KAAK,CAAC,EAAE,QAAQ,GAAG,SAAS,GAAG,MAAM,CAAC;QACtC,QAAQ,CAAC,EAAE,OAAO,CAAC;KACpB,CAAC;IAEF;;;;wEAIoE;IACpE,eAAe,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACnD;AAmDD,eAAO,MAAM,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAAsB,CAAC;AAE9E;;;;GAIG;AACH,wBAAgB,aAAa,IAAI,CAAC,MAAM,EAAE,YAAY,CAAC,EAAE,CAExD"}
@@ -23,6 +23,11 @@ const REQUIRED_FIELDS = [
23
23
  'verifyCommand',
24
24
  ];
25
25
  function loadToolMetadata() {
26
+ // NOTE: This module uses import.meta.url to resolve the tools/ directory.
27
+ // It works correctly when loaded in the Node.js CLI bootstrap context but
28
+ // breaks when bundled by Turbopack (import.meta.url points to the chunk
29
+ // location where tools/ doesn't exist). API routes should access tool
30
+ // metadata via the DI container, not by importing this module directly.
26
31
  const toolsDir = join(fileURLToPath(import.meta.url), '..', 'tools');
27
32
  const metadata = {};
28
33
  let files;
@@ -8,11 +8,11 @@
8
8
  "packageManager": "brew",
9
9
  "commands": {
10
10
  "darwin": "brew install --cask alacritty",
11
- "linux": "apt install -y alacritty"
11
+ "linux": "sudo apt-get update && sudo apt-get install -y alacritty"
12
12
  },
13
13
  "timeout": 300000,
14
14
  "documentationUrl": "https://alacritty.org/",
15
15
  "verifyCommand": "alacritty --version",
16
- "autoInstall": false,
16
+ "autoInstall": true,
17
17
  "openDirectory": "alacritty --working-directory {dir}"
18
18
  }
@@ -8,11 +8,11 @@
8
8
  "packageManager": "brew",
9
9
  "commands": {
10
10
  "darwin": "brew install --cask kitty",
11
- "linux": "apt install -y kitty"
11
+ "linux": "sudo apt-get update && sudo apt-get install -y kitty"
12
12
  },
13
13
  "timeout": 300000,
14
14
  "documentationUrl": "https://sw.kovidgoyal.net/kitty/",
15
15
  "verifyCommand": "kitty --version",
16
- "autoInstall": false,
16
+ "autoInstall": true,
17
17
  "openDirectory": "kitty --working-directory {dir}"
18
18
  }
@@ -8,7 +8,7 @@
8
8
  "packageManager": "brew",
9
9
  "commands": {
10
10
  "darwin": "brew install tmux",
11
- "linux": "apt install -y tmux"
11
+ "linux": "sudo apt-get update && sudo apt-get install -y tmux"
12
12
  },
13
13
  "timeout": 300000,
14
14
  "documentationUrl": "https://github.com/tmux/tmux/wiki",
@@ -7,7 +7,7 @@
7
7
  "binary": "code",
8
8
  "packageManager": "apt",
9
9
  "commands": {
10
- "linux": "curl -fsSL https://packages.microsoft.com/keys/microsoft.asc | sudo gpg --dearmor -o /usr/share/keyrings/packages.microsoft.gpg && echo \"deb [arch=amd64 signed-by=/usr/share/keyrings/packages.microsoft.gpg] https://packages.microsoft.com/repos/code stable main\" | sudo tee /etc/apt/sources.list.d/vscode.list > /dev/null && sudo apt-get update && sudo apt-get install -y code",
10
+ "linux": "curl -fsSL https://packages.microsoft.com/keys/microsoft.asc | sudo gpg --yes --dearmor -o /usr/share/keyrings/packages.microsoft.gpg && echo \"deb [arch=amd64 signed-by=/usr/share/keyrings/packages.microsoft.gpg] https://packages.microsoft.com/repos/code stable main\" | sudo tee /etc/apt/sources.list.d/vscode.list > /dev/null && sudo apt-get update && sudo apt-get install -y code",
11
11
  "darwin": "brew install visual-studio-code"
12
12
  },
13
13
  "timeout": 300000,
@@ -7,7 +7,7 @@
7
7
  "binary": "windsurf",
8
8
  "packageManager": "apt",
9
9
  "commands": {
10
- "linux": "curl -fsSL \"https://windsurf-stable.codeiumdata.com/wVxQEIWkwPUEAGf3/windsurf.gpg\" | sudo gpg --dearmor -o /usr/share/keyrings/windsurf-stable-archive-keyring.gpg && echo \"deb [signed-by=/usr/share/keyrings/windsurf-stable-archive-keyring.gpg arch=amd64] https://windsurf-stable.codeiumdata.com/wVxQEIWkwPUEAGf3/apt stable main\" | sudo tee /etc/apt/sources.list.d/windsurf.list > /dev/null && sudo apt-get update && sudo apt-get install -y windsurf",
10
+ "linux": "curl -fsSL \"https://windsurf-stable.codeiumdata.com/wVxQEIWkwPUEAGf3/windsurf.gpg\" | sudo gpg --yes --dearmor -o /usr/share/keyrings/windsurf-stable-archive-keyring.gpg && echo \"deb [signed-by=/usr/share/keyrings/windsurf-stable-archive-keyring.gpg arch=amd64] https://windsurf-stable.codeiumdata.com/wVxQEIWkwPUEAGf3/apt stable main\" | sudo tee /etc/apt/sources.list.d/windsurf.list > /dev/null && sudo apt-get update && sudo apt-get install -y windsurf",
11
11
  "darwin": "brew install --cask windsurf"
12
12
  },
13
13
  "timeout": 300000,
@@ -1 +1 @@
1
- {"version":3,"file":"get-graph-data.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/web/app/(dashboard)/get-graph-data.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uCAAuC,CAAC;AAC5E,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAE1C,wBAAsB,YAAY,IAAI,OAAO,CAAC;IAAE,KAAK,EAAE,cAAc,EAAE,CAAC;IAAC,KAAK,EAAE,IAAI,EAAE,CAAA;CAAE,CAAC,CAqBxF"}
1
+ {"version":3,"file":"get-graph-data.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/web/app/(dashboard)/get-graph-data.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uCAAuC,CAAC;AAC5E,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAE1C,wBAAsB,YAAY,IAAI,OAAO,CAAC;IAAE,KAAK,EAAE,cAAc,EAAE,CAAC;IAAC,KAAK,EAAE,IAAI,EAAE,CAAA;CAAE,CAAC,CAiBxF"}
@@ -1,5 +1,5 @@
1
1
  import { resolve } from '../../lib/server-container.js';
2
- import { layoutWithDagre } from '../../lib/layout-with-dagre.js';
2
+ import { layoutWithDagre, CANVAS_LAYOUT_DEFAULTS } from '../../lib/layout-with-dagre.js';
3
3
  import { buildGraphNodes } from '../build-graph-nodes.js';
4
4
  export async function getGraphData() {
5
5
  const listFeatures = resolve('ListFeaturesUseCase');
@@ -11,9 +11,5 @@ export async function getGraphData() {
11
11
  return { feature, run };
12
12
  }));
13
13
  const { nodes, edges } = buildGraphNodes(repositories, featuresWithRuns);
14
- return layoutWithDagre(nodes, edges, {
15
- direction: 'LR',
16
- ranksep: 200,
17
- nodesep: 15,
18
- });
14
+ return layoutWithDagre(nodes, edges, CANVAS_LAYOUT_DEFAULTS);
19
15
  }
@@ -1 +1 @@
1
- {"version":3,"file":"route.d.ts","sourceRoot":"","sources":["../../../../../../../../../src/presentation/web/app/api/tools/[id]/install/route.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAK3C,wBAAsB,IAAI,CACxB,QAAQ,EAAE,OAAO,EACjB,EAAE,MAAM,EAAE,EAAE;IAAE,MAAM,EAAE,OAAO,CAAC;QAAE,EAAE,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CAAE,GAC9C,OAAO,CAAC,YAAY,CAAC,CAevB"}
1
+ {"version":3,"file":"route.d.ts","sourceRoot":"","sources":["../../../../../../../../../src/presentation/web/app/api/tools/[id]/install/route.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAY3C,wBAAsB,IAAI,CACxB,QAAQ,EAAE,OAAO,EACjB,EAAE,MAAM,EAAE,EAAE;IAAE,MAAM,EAAE,OAAO,CAAC;QAAE,EAAE,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CAAE,GAC9C,OAAO,CAAC,YAAY,CAAC,CAgBvB"}
@@ -1,14 +1,19 @@
1
1
  import { NextResponse } from 'next/server';
2
2
  import { resolve } from '../../../../../lib/server-container.js';
3
- import { TOOL_METADATA } from '../../../../../../../../packages/core/src/infrastructure/services/tool-installer/tool-metadata.js';
3
+ // NOTE: Do NOT import TOOL_METADATA directly in API routes.
4
+ // The module uses import.meta.url + fs.readdirSync to load JSON files,
5
+ // which breaks when Turbopack bundles it (import.meta.url resolves to
6
+ // the bundled chunk location where the tools/ directory doesn't exist).
7
+ // Tool validation is delegated to the use case via the DI container,
8
+ // where the module loads correctly in the Node.js CLI bootstrap context.
4
9
  export async function POST(_request, { params }) {
5
10
  const { id } = await params;
6
- if (!TOOL_METADATA[id]) {
7
- return NextResponse.json({ error: 'Tool not found' }, { status: 404 });
8
- }
9
11
  try {
10
12
  const useCase = resolve('InstallToolUseCase');
11
13
  const status = await useCase.execute(id);
14
+ if (status.status === 'error') {
15
+ return NextResponse.json({ error: status.errorMessage }, { status: 500 });
16
+ }
12
17
  return NextResponse.json({ status });
13
18
  }
14
19
  catch (error) {
@@ -0,0 +1,7 @@
1
+ export declare const dynamic = "force-dynamic";
2
+ export declare function GET(_request: Request, { params }: {
3
+ params: Promise<{
4
+ id: string;
5
+ }>;
6
+ }): Promise<Response>;
7
+ //# sourceMappingURL=route.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"route.d.ts","sourceRoot":"","sources":["../../../../../../../../../../src/presentation/web/app/api/tools/[id]/install/stream/route.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,OAAO,kBAAkB,CAAC;AAEvC,wBAAsB,GAAG,CACvB,QAAQ,EAAE,OAAO,EACjB,EAAE,MAAM,EAAE,EAAE;IAAE,MAAM,EAAE,OAAO,CAAC;QAAE,EAAE,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CAAE,GAC9C,OAAO,CAAC,QAAQ,CAAC,CAgCnB"}
@@ -0,0 +1,32 @@
1
+ import { resolve } from '../../../../../../lib/server-container.js';
2
+ // Force dynamic — SSE streams must never be statically optimized or cached
3
+ export const dynamic = 'force-dynamic';
4
+ export async function GET(_request, { params }) {
5
+ const { id } = await params;
6
+ const useCase = resolve('InstallToolUseCase');
7
+ const encoder = new TextEncoder();
8
+ const stream = new ReadableStream({
9
+ async start(controller) {
10
+ try {
11
+ const status = await useCase.execute(id, (chunk) => {
12
+ controller.enqueue(encoder.encode(`data: ${chunk.replace(/\n/g, '\ndata: ')}\n\n`));
13
+ });
14
+ controller.enqueue(encoder.encode(`event: done\ndata: ${JSON.stringify(status)}\n\n`));
15
+ }
16
+ catch (error) {
17
+ const message = error instanceof Error ? error.message : 'Installation failed';
18
+ controller.enqueue(encoder.encode(`event: done\ndata: ${JSON.stringify({ status: 'error', toolName: id, errorMessage: message })}\n\n`));
19
+ }
20
+ finally {
21
+ controller.close();
22
+ }
23
+ },
24
+ });
25
+ return new Response(stream, {
26
+ headers: {
27
+ 'Content-Type': 'text/event-stream',
28
+ 'Cache-Control': 'no-cache',
29
+ Connection: 'keep-alive',
30
+ },
31
+ });
32
+ }
@@ -84,7 +84,17 @@ export function buildGraphNodes(repositories, featuresWithRuns) {
84
84
  return { nodes, edges };
85
85
  }
86
86
  function appendFeatureNodes(repoFeatures, repoNodeId, allFeaturesWithRuns, nodes, edges) {
87
- repoFeatures.forEach(({ feature, run }) => {
87
+ // Sort by createdAt so newest features appear last (bottom) in the layout
88
+ const sorted = [...repoFeatures].sort((a, b) => {
89
+ const aTime = a.feature.createdAt instanceof Date
90
+ ? a.feature.createdAt.getTime()
91
+ : Number(a.feature.createdAt);
92
+ const bTime = b.feature.createdAt instanceof Date
93
+ ? b.feature.createdAt.getTime()
94
+ : Number(b.feature.createdAt);
95
+ return aTime - bTime;
96
+ });
97
+ sorted.forEach(({ feature, run }) => {
88
98
  const agentNode = run?.result?.startsWith('node:') ? run.result.slice(5) : undefined;
89
99
  const lifecycle = run?.status === 'completed'
90
100
  ? 'maintain'
@@ -7,6 +7,8 @@ export interface BaseDrawerProps extends VariantProps<typeof drawerVariants> {
7
7
  open: boolean;
8
8
  onClose: () => void;
9
9
  modal?: boolean;
10
+ /** When true, clicking anywhere outside the drawer closes it, ignoring `data-no-drawer-close` guards. */
11
+ dismissOnOutsideClick?: boolean;
10
12
  header?: React.ReactNode;
11
13
  children: React.ReactNode;
12
14
  footer?: React.ReactNode;
@@ -14,6 +16,6 @@ export interface BaseDrawerProps extends VariantProps<typeof drawerVariants> {
14
16
  'data-testid'?: string;
15
17
  deployTarget?: DeployActionInput;
16
18
  }
17
- export declare function BaseDrawer({ open, onClose, modal, size, header, children, footer, className, 'data-testid': testId, deployTarget, }: BaseDrawerProps): import("react/jsx-runtime").JSX.Element;
19
+ export declare function BaseDrawer({ open, onClose, modal, dismissOnOutsideClick, size, header, children, footer, className, 'data-testid': testId, deployTarget, }: BaseDrawerProps): import("react/jsx-runtime").JSX.Element;
18
20
  export {};
19
21
  //# sourceMappingURL=base-drawer.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"base-drawer.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/base-drawer/base-drawer.tsx"],"names":[],"mappings":"AAIA,OAAO,EAAO,KAAK,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAalE,OAAO,EAAmB,KAAK,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAGpF,QAAA,MAAM,cAAc;;8EAUlB,CAAC;AAEH,MAAM,WAAW,eAAgB,SAAQ,YAAY,CAAC,OAAO,cAAc,CAAC;IAC1E,IAAI,EAAE,OAAO,CAAC;IACd,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,MAAM,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACzB,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,MAAM,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,YAAY,CAAC,EAAE,iBAAiB,CAAC;CAClC;AAED,wBAAgB,UAAU,CAAC,EACzB,IAAI,EACJ,OAAO,EACP,KAAa,EACb,IAAI,EACJ,MAAM,EACN,QAAQ,EACR,MAAM,EACN,SAAS,EACT,aAAa,EAAE,MAAM,EACrB,YAAY,GACb,EAAE,eAAe,2CA8EjB"}
1
+ {"version":3,"file":"base-drawer.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/base-drawer/base-drawer.tsx"],"names":[],"mappings":"AAIA,OAAO,EAAO,KAAK,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAalE,OAAO,EAAmB,KAAK,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAGpF,QAAA,MAAM,cAAc;;8EAUlB,CAAC;AAEH,MAAM,WAAW,eAAgB,SAAQ,YAAY,CAAC,OAAO,cAAc,CAAC;IAC1E,IAAI,EAAE,OAAO,CAAC;IACd,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,yGAAyG;IACzG,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAChC,MAAM,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACzB,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,MAAM,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,YAAY,CAAC,EAAE,iBAAiB,CAAC;CAClC;AAED,wBAAgB,UAAU,CAAC,EACzB,IAAI,EACJ,OAAO,EACP,KAAa,EACb,qBAA6B,EAC7B,IAAI,EACJ,MAAM,EACN,QAAQ,EACR,MAAM,EACN,SAAS,EACT,aAAa,EAAE,MAAM,EACrB,YAAY,GACb,EAAE,eAAe,2CA6EjB"}
@@ -22,7 +22,7 @@ const drawerVariants = cva('', {
22
22
  size: 'sm',
23
23
  },
24
24
  });
25
- export function BaseDrawer({ open, onClose, modal = false, size, header, children, footer, className, 'data-testid': testId, deployTarget, }) {
25
+ export function BaseDrawer({ open, onClose, modal = false, dismissOnOutsideClick = false, size, header, children, footer, className, 'data-testid': testId, deployTarget, }) {
26
26
  const contentRef = useRef(null);
27
27
  // Close when clicking outside the drawer panel (no overlay needed — canvas stays draggable).
28
28
  // Uses `click` (not `pointerdown`) so canvas drags don't trigger this.
@@ -38,14 +38,18 @@ export function BaseDrawer({ open, onClose, modal = false, size, header, childre
38
38
  return;
39
39
  if (contentRef.current?.contains(target))
40
40
  return;
41
- // Don't close when clicking inside the canvas or other Radix overlays
42
- if (target.closest('[data-no-drawer-close], [role="alertdialog"], [role="menu"], [role="listbox"], [data-radix-popper-content-wrapper]'))
41
+ // Don't close when clicking inside Radix overlays.
42
+ // When dismissOnOutsideClick is false (default), also respect data-no-drawer-close guards.
43
+ const ignoreSelector = dismissOnOutsideClick
44
+ ? '[role="alertdialog"], [role="dialog"], [role="menu"], [role="listbox"], [data-radix-popper-content-wrapper]'
45
+ : '[data-no-drawer-close], [role="alertdialog"], [role="dialog"], [role="menu"], [role="listbox"], [data-radix-popper-content-wrapper]';
46
+ if (target.closest(ignoreSelector))
43
47
  return;
44
48
  onClose();
45
49
  };
46
50
  document.addEventListener('click', handleClick);
47
51
  return () => document.removeEventListener('click', handleClick);
48
- }, [open, modal, onClose]);
52
+ }, [open, modal, onClose, dismissOnOutsideClick]);
49
53
  return (_jsxs(Drawer, { direction: "right", modal: modal, handleOnly: true, open: open, onOpenChange: (isOpen) => {
50
54
  if (!isOpen)
51
55
  onClose();
@@ -1 +1 @@
1
- {"version":3,"file":"create-drawer-client.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/control-center-drawer/create-drawer-client.tsx"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,iEAAiE,CAAC;AAC3G,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,qCAAqC,CAAC;AAG5E,MAAM,WAAW,uBAAuB;IACtC,cAAc,EAAE,MAAM,CAAC;IACvB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,EAAE,mBAAmB,EAAE,CAAC;IAChC,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;CACrC;AAED,wBAAgB,kBAAkB,CAAC,EACjC,cAAc,EACd,eAAe,EACf,QAAQ,EACR,gBAAgB,GACjB,EAAE,uBAAuB,2CAqEzB"}
1
+ {"version":3,"file":"create-drawer-client.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/control-center-drawer/create-drawer-client.tsx"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,iEAAiE,CAAC;AAC3G,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,qCAAqC,CAAC;AAG5E,MAAM,WAAW,uBAAuB;IACtC,cAAc,EAAE,MAAM,CAAC;IACvB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,EAAE,mBAAmB,EAAE,CAAC;IAChC,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;CACrC;AAED,wBAAgB,kBAAkB,CAAC,EACjC,cAAc,EACd,eAAe,EACf,QAAQ,EACR,gBAAgB,GACjB,EAAE,uBAAuB,2CA+EzB"}
@@ -1,6 +1,6 @@
1
1
  'use client';
2
2
  import { jsx as _jsx } from "react/jsx-runtime";
3
- import { useState, useCallback } from 'react';
3
+ import { useState, useCallback, useEffect } from 'react';
4
4
  import { useRouter, usePathname } from 'next/navigation';
5
5
  import { toast } from 'sonner';
6
6
  import { createFeature } from '../../../app/actions/create-feature.js';
@@ -14,8 +14,17 @@ export function CreateDrawerClient({ repositoryPath, initialParentId, features,
14
14
  // content during soft navigation, so this component is NOT unmounted when
15
15
  // navigating to `/`. We watch the pathname and let Vaul handle the close
16
16
  // animation when the path no longer matches the create route.
17
+ // When submitting, force the drawer closed immediately — router.push('/')
18
+ // is async and the pathname may not update before the next render.
17
19
  const pathname = usePathname();
18
- const isOpen = pathname.startsWith('/create');
20
+ const isOpen = !isSubmitting && pathname.startsWith('/create');
21
+ // Safety net: if the drawer is closed (e.g. via form submit + isSubmitting)
22
+ // but router.push('/') hasn't taken effect yet, force-clear the route.
23
+ useEffect(() => {
24
+ if (!isOpen && pathname.startsWith('/create')) {
25
+ router.replace('/');
26
+ }
27
+ }, [isOpen, pathname, router]);
19
28
  const onClose = useCallback(() => {
20
29
  router.push('/');
21
30
  }, [router]);
@@ -27,6 +36,7 @@ export function CreateDrawerClient({ repositoryPath, initialParentId, features,
27
36
  name: data.name,
28
37
  description: data.description,
29
38
  repositoryPath: data.repositoryPath,
39
+ parentId: data.parentId,
30
40
  },
31
41
  }));
32
42
  // Close the drawer immediately for responsive UI
@@ -41,7 +51,6 @@ export function CreateDrawerClient({ repositoryPath, initialParentId, features,
41
51
  return;
42
52
  }
43
53
  createSound.play();
44
- router.refresh();
45
54
  })
46
55
  .catch(() => {
47
56
  toast.error('Failed to create feature');
@@ -1 +1 @@
1
- {"version":3,"file":"feature-drawer-client.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/control-center-drawer/feature-drawer-client.tsx"],"names":[],"mappings":"AA2DA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAEhD,MAAM,WAAW,wBAAwB;IACvC,IAAI,EAAE,UAAU,CAAC;CAClB;AAED,wBAAgB,mBAAmB,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,EAAE,wBAAwB,2CA6lBlF"}
1
+ {"version":3,"file":"feature-drawer-client.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/control-center-drawer/feature-drawer-client.tsx"],"names":[],"mappings":"AA2DA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAEhD,MAAM,WAAW,wBAAwB;IACvC,IAAI,EAAE,UAAU,CAAC;CAClB;AAED,wBAAgB,mBAAmB,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,EAAE,wBAAwB,2CAimBlF"}
@@ -65,8 +65,9 @@ export function FeatureDrawerClient({ view: initialView }) {
65
65
  const newState = mapEventTypeToState(event.eventType);
66
66
  const newLifecycle = mapPhaseNameToLifecycle(event.phaseName);
67
67
  // Trigger a server refresh to get the latest drawer view,
68
- // but skip when the user has unsaved changes to avoid losing form state.
69
- if (!isDirtyRef.current)
68
+ // but skip when the user has unsaved changes or a rejection is in-flight
69
+ // to avoid the refresh interfering with the reject handler's navigation.
70
+ if (!isDirtyRef.current && !isRejectingRef.current)
70
71
  router.refresh();
71
72
  // Optimistically update the node data for immediate UI feedback
72
73
  setView((prev) => {
@@ -115,6 +116,7 @@ export function FeatureDrawerClient({ view: initialView }) {
115
116
  const [isDeleting, setIsDeleting] = useState(false);
116
117
  // ── Shared reject state ────────────────────────────────────────────────
117
118
  const [isRejecting, setIsRejecting] = useState(false);
119
+ const isRejectingRef = useRef(false);
118
120
  // Reset chat input whenever the view type changes
119
121
  const viewType = view.type;
120
122
  useEffect(() => {
@@ -267,6 +269,7 @@ export function FeatureDrawerClient({ view: initialView }) {
267
269
  const handleReject = useCallback(async (feedback, label, onDone) => {
268
270
  if (!reviewNode?.featureId)
269
271
  return;
272
+ isRejectingRef.current = true;
270
273
  setIsRejecting(true);
271
274
  try {
272
275
  const result = await rejectFeature(reviewNode.featureId, feedback);
@@ -284,6 +287,7 @@ export function FeatureDrawerClient({ view: initialView }) {
284
287
  onDone?.();
285
288
  }
286
289
  finally {
290
+ isRejectingRef.current = false;
287
291
  setIsRejecting(false);
288
292
  }
289
293
  }, [reviewNode, onClose, rejectSound]);
@@ -1 +1 @@
1
- {"version":3,"file":"drawer-action-bar.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/drawer-action-bar/drawer-action-bar.tsx"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAC;AAEvE,wBAAgB,eAAe,CAAC,EAC9B,QAAQ,EACR,SAAS,EACT,YAAY,EACZ,WAAW,EACX,mBAAmB,EACnB,YAAoB,EACpB,WAAmB,EACnB,QAAQ,EACR,SAAS,EAAE,mBAAmB,EAC9B,iBAAiB,GAClB,EAAE,oBAAoB,2CAoEtB"}
1
+ {"version":3,"file":"drawer-action-bar.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/drawer-action-bar/drawer-action-bar.tsx"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAC;AAEvE,wBAAgB,eAAe,CAAC,EAC9B,QAAQ,EACR,SAAS,EACT,YAAY,EACZ,WAAW,EACX,mBAAmB,EACnB,YAAoB,EACpB,WAAmB,EACnB,QAAQ,EACR,SAAS,EAAE,mBAAmB,EAC9B,iBAAiB,GAClB,EAAE,oBAAoB,2CAsEtB"}
@@ -19,7 +19,7 @@ export function DrawerActionBar({ onReject, onApprove, approveLabel, approveIcon
19
19
  onReject(text);
20
20
  setChatInput('');
21
21
  }
22
- return (_jsxs("div", { className: "border-border shrink-0 border-t", children: [children, onReject ? (_jsxs("form", { onSubmit: handleRevisionSubmit, className: "flex items-center gap-2 p-4", children: [_jsx(Input, { type: "text", placeholder: revisionPlaceholder ?? 'Ask AI to revise...', "aria-label": revisionPlaceholder ?? 'Ask AI to revise...', disabled: disabled, value: chatInput, onChange: (e) => setChatInput(e.target.value), className: "flex-1" }), _jsx(Button, { type: "submit", variant: "secondary", size: "icon", "aria-label": "Send", disabled: disabled, children: _jsx(Send, {}) }), _jsxs(Button, { type: "button", disabled: disabled, onClick: () => {
22
+ return (_jsxs("div", { className: "border-border shrink-0 border-t", children: [children, onReject ? (_jsxs("form", { onSubmit: handleRevisionSubmit, className: "flex items-center gap-2 p-4", children: [_jsx(Input, { type: "text", placeholder: revisionPlaceholder ?? 'Ask AI to revise...', "aria-label": revisionPlaceholder ?? 'Ask AI to revise...', disabled: disabled, value: chatInput, onChange: (e) => setChatInput(e.target.value), className: "flex-1", "data-testid": "drawer-chat-input" }), _jsx(Button, { type: "submit", variant: "secondary", size: "icon", "aria-label": "Send", disabled: disabled, "data-testid": "drawer-chat-send", children: _jsx(Send, {}) }), _jsxs(Button, { type: "button", disabled: disabled, onClick: () => {
23
23
  approveSound.play();
24
24
  onApprove();
25
25
  }, children: [approveIcon, approveLabel] })] })) : (_jsx("div", { className: "flex items-center gap-2 px-4 pb-4", children: _jsxs(Button, { type: "button", className: "flex-1", disabled: disabled, onClick: () => {
@@ -1 +1 @@
1
- {"version":3,"file":"feature-create-drawer.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.tsx"],"names":[],"mappings":"AA2BA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,0DAA0D,CAAC;AAC/F,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,qCAAqC,CAAC;AAG5E,YAAY,EAAE,cAAc,EAAE,MAAM,0DAA0D,CAAC;AAE/F,0DAA0D;AAC1D,MAAM,WAAW,mBAAmB;IAClC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,cAAc,EAAE,CAAC;IAC9B,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa,EAAE;QACb,QAAQ,EAAE,OAAO,CAAC;QAClB,SAAS,EAAE,OAAO,CAAC;QACnB,UAAU,EAAE,OAAO,CAAC;KACrB,CAAC;IACF,IAAI,EAAE,OAAO,CAAC;IACd,MAAM,EAAE,OAAO,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAcD,MAAM,WAAW,wBAAwB;IACvC,IAAI,EAAE,OAAO,CAAC;IACd,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,QAAQ,EAAE,CAAC,IAAI,EAAE,oBAAoB,KAAK,IAAI,CAAC;IAC/C,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;IACpC,qEAAqE;IACrE,QAAQ,CAAC,EAAE,mBAAmB,EAAE,CAAC;IACjC,kGAAkG;IAClG,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,wBAAgB,mBAAmB,CAAC,EAClC,IAAI,EACJ,OAAO,EACP,QAAQ,EACR,cAAc,EACd,YAAoB,EACpB,gBAAgB,EAChB,QAAQ,EACR,eAAe,GAChB,EAAE,wBAAwB,2CA2Q1B"}
1
+ {"version":3,"file":"feature-create-drawer.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.tsx"],"names":[],"mappings":"AA2BA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,0DAA0D,CAAC;AAC/F,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,qCAAqC,CAAC;AAG5E,YAAY,EAAE,cAAc,EAAE,MAAM,0DAA0D,CAAC;AAE/F,0DAA0D;AAC1D,MAAM,WAAW,mBAAmB;IAClC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,cAAc,EAAE,CAAC;IAC9B,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa,EAAE;QACb,QAAQ,EAAE,OAAO,CAAC;QAClB,SAAS,EAAE,OAAO,CAAC;QACnB,UAAU,EAAE,OAAO,CAAC;KACrB,CAAC;IACF,IAAI,EAAE,OAAO,CAAC;IACd,MAAM,EAAE,OAAO,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAcD,MAAM,WAAW,wBAAwB;IACvC,IAAI,EAAE,OAAO,CAAC;IACd,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,QAAQ,EAAE,CAAC,IAAI,EAAE,oBAAoB,KAAK,IAAI,CAAC;IAC/C,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;IACpC,qEAAqE;IACrE,QAAQ,CAAC,EAAE,mBAAmB,EAAE,CAAC;IACjC,kGAAkG;IAClG,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,wBAAgB,mBAAmB,CAAC,EAClC,IAAI,EACJ,OAAO,EACP,QAAQ,EACR,cAAc,EACd,YAAoB,EACpB,gBAAgB,EAChB,QAAQ,EACR,eAAe,GAChB,EAAE,wBAAwB,2CA8Q1B"}