@shepai/cli 1.72.7 → 1.72.8-pr216.5a2ec32

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 (493) hide show
  1. package/dist/packages/core/src/application/ports/output/agents/feature-agent-process.interface.d.ts +2 -1
  2. package/dist/packages/core/src/application/ports/output/agents/feature-agent-process.interface.d.ts.map +1 -1
  3. package/dist/packages/core/src/application/use-cases/agents/approve-agent-run.use-case.d.ts.map +1 -1
  4. package/dist/packages/core/src/application/use-cases/agents/approve-agent-run.use-case.js +1 -0
  5. package/dist/packages/core/src/application/use-cases/features/resume-feature.use-case.d.ts.map +1 -1
  6. package/dist/packages/core/src/application/use-cases/features/resume-feature.use-case.js +1 -0
  7. package/dist/packages/core/src/application/use-cases/tools/list-tools.use-case.d.ts +3 -0
  8. package/dist/packages/core/src/application/use-cases/tools/list-tools.use-case.d.ts.map +1 -1
  9. package/dist/packages/core/src/application/use-cases/tools/list-tools.use-case.js +3 -0
  10. package/dist/packages/core/src/domain/factories/settings-defaults.factory.js +1 -1
  11. package/dist/packages/core/src/infrastructure/services/agents/common/executors/dev-executor.service.d.ts.map +1 -1
  12. package/dist/packages/core/src/infrastructure/services/agents/common/executors/dev-executor.service.js +88 -13
  13. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/feature-agent-graph.d.ts +1 -1
  14. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/feature-agent-process.service.d.ts +2 -1
  15. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/feature-agent-process.service.d.ts.map +1 -1
  16. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/feature-agent-process.service.js +3 -0
  17. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/feature-agent-worker.d.ts +2 -0
  18. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/feature-agent-worker.d.ts.map +1 -1
  19. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/feature-agent-worker.js +16 -3
  20. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/merge/merge.node.d.ts.map +1 -1
  21. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/merge/merge.node.js +5 -1
  22. package/dist/packages/core/src/infrastructure/services/tool-installer/tool-installer.service.d.ts.map +1 -1
  23. package/dist/packages/core/src/infrastructure/services/tool-installer/tool-installer.service.js +9 -1
  24. package/dist/packages/core/src/infrastructure/services/tool-installer/tool-metadata.d.ts +6 -0
  25. package/dist/packages/core/src/infrastructure/services/tool-installer/tool-metadata.d.ts.map +1 -1
  26. package/dist/packages/core/src/infrastructure/services/tool-installer/tool-metadata.js +5 -0
  27. package/dist/packages/core/src/infrastructure/services/tool-installer/tools/alacritty.json +5 -2
  28. package/dist/packages/core/src/infrastructure/services/tool-installer/tools/antigravity.json +3 -0
  29. package/dist/packages/core/src/infrastructure/services/tool-installer/tools/claude-code.json +4 -1
  30. package/dist/packages/core/src/infrastructure/services/tool-installer/tools/cursor-cli.json +3 -0
  31. package/dist/packages/core/src/infrastructure/services/tool-installer/tools/cursor.json +3 -0
  32. package/dist/packages/core/src/infrastructure/services/tool-installer/tools/gemini-cli.json +3 -0
  33. package/dist/packages/core/src/infrastructure/services/tool-installer/tools/gh.json +3 -0
  34. package/dist/packages/core/src/infrastructure/services/tool-installer/tools/git.json +3 -0
  35. package/dist/packages/core/src/infrastructure/services/tool-installer/tools/iterm2.json +3 -0
  36. package/dist/packages/core/src/infrastructure/services/tool-installer/tools/kitty.json +5 -2
  37. package/dist/packages/core/src/infrastructure/services/tool-installer/tools/tmux.json +4 -1
  38. package/dist/packages/core/src/infrastructure/services/tool-installer/tools/vscode.json +4 -1
  39. package/dist/packages/core/src/infrastructure/services/tool-installer/tools/warp.json +3 -0
  40. package/dist/packages/core/src/infrastructure/services/tool-installer/tools/windsurf.json +4 -1
  41. package/dist/packages/core/src/infrastructure/services/tool-installer/tools/zed.json +3 -0
  42. package/dist/src/presentation/web/app/actions/get-graph-data.d.ts +10 -0
  43. package/dist/src/presentation/web/app/actions/get-graph-data.d.ts.map +1 -0
  44. package/dist/src/presentation/web/app/actions/get-graph-data.js +10 -0
  45. package/dist/src/presentation/web/app/api/agent-events/route.d.ts.map +1 -1
  46. package/dist/src/presentation/web/app/api/agent-events/route.js +3 -0
  47. package/dist/src/presentation/web/app/api/tools/[id]/install/route.d.ts.map +1 -1
  48. package/dist/src/presentation/web/app/api/tools/[id]/install/route.js +9 -4
  49. package/dist/src/presentation/web/app/api/tools/[id]/install/stream/route.d.ts +7 -0
  50. package/dist/src/presentation/web/app/api/tools/[id]/install/stream/route.d.ts.map +1 -0
  51. package/dist/src/presentation/web/app/api/tools/[id]/install/stream/route.js +32 -0
  52. package/dist/src/presentation/web/components/common/base-drawer/base-drawer.d.ts +2 -1
  53. package/dist/src/presentation/web/components/common/base-drawer/base-drawer.d.ts.map +1 -1
  54. package/dist/src/presentation/web/components/common/base-drawer/base-drawer.js +3 -3
  55. package/dist/src/presentation/web/components/common/feature-node/derive-feature-state.d.ts.map +1 -1
  56. package/dist/src/presentation/web/components/common/feature-node/derive-feature-state.js +2 -0
  57. package/dist/src/presentation/web/components/features/control-center/use-control-center-state.d.ts.map +1 -1
  58. package/dist/src/presentation/web/components/features/control-center/use-control-center-state.js +72 -1
  59. package/dist/src/presentation/web/components/features/features-canvas/features-canvas.d.ts.map +1 -1
  60. package/dist/src/presentation/web/components/features/features-canvas/features-canvas.js +2 -2
  61. package/dist/src/presentation/web/components/features/index.d.ts +1 -1
  62. package/dist/src/presentation/web/components/features/index.d.ts.map +1 -1
  63. package/dist/src/presentation/web/components/features/index.js +1 -1
  64. package/dist/src/presentation/web/components/features/tools/index.d.ts +1 -1
  65. package/dist/src/presentation/web/components/features/tools/index.d.ts.map +1 -1
  66. package/dist/src/presentation/web/components/features/tools/index.js +1 -1
  67. package/dist/src/presentation/web/components/features/tools/tool-card.d.ts.map +1 -1
  68. package/dist/src/presentation/web/components/features/tools/tool-card.js +18 -14
  69. package/dist/src/presentation/web/components/features/tools/tool-card.stories.d.ts.map +1 -1
  70. package/dist/src/presentation/web/components/features/tools/tool-card.stories.js +18 -0
  71. package/dist/src/presentation/web/components/features/tools/tool-detail-drawer.d.ts +10 -0
  72. package/dist/src/presentation/web/components/features/tools/tool-detail-drawer.d.ts.map +1 -0
  73. package/dist/src/presentation/web/components/features/tools/tool-detail-drawer.js +95 -0
  74. package/dist/src/presentation/web/components/features/tools/tool-detail-drawer.stories.d.ts +12 -0
  75. package/dist/src/presentation/web/components/features/tools/tool-detail-drawer.stories.d.ts.map +1 -0
  76. package/dist/src/presentation/web/components/features/tools/tool-detail-drawer.stories.js +119 -0
  77. package/dist/src/presentation/web/components/features/tools/tools-page-client.js +3 -3
  78. package/dist/src/presentation/web/components/features/tools/tools-page-client.stories.d.ts.map +1 -1
  79. package/dist/src/presentation/web/components/features/tools/tools-page-client.stories.js +15 -0
  80. package/dist/src/presentation/web/hooks/use-tool-install-stream.d.ts +10 -0
  81. package/dist/src/presentation/web/hooks/use-tool-install-stream.d.ts.map +1 -0
  82. package/dist/src/presentation/web/hooks/use-tool-install-stream.js +38 -0
  83. package/dist/tsconfig.build.tsbuildinfo +1 -1
  84. package/package.json +1 -1
  85. package/web/.next/BUILD_ID +1 -1
  86. package/web/.next/app-path-routes-manifest.json +1 -0
  87. package/web/.next/build-manifest.json +7 -7
  88. package/web/.next/cache/.previewinfo +1 -1
  89. package/web/.next/cache/.rscinfo +1 -1
  90. package/web/.next/cache/.tsbuildinfo +1 -1
  91. package/web/.next/cache/config.json +3 -3
  92. package/web/.next/fallback-build-manifest.json +2 -2
  93. package/web/.next/prerender-manifest.json +3 -3
  94. package/web/.next/required-server-files.js +1 -1
  95. package/web/.next/required-server-files.json +1 -1
  96. package/web/.next/routes-manifest.json +8 -0
  97. package/web/.next/server/app/(dashboard)/@drawer/create/page/build-manifest.json +5 -5
  98. package/web/.next/server/app/(dashboard)/@drawer/create/page/server-reference-manifest.json +43 -28
  99. package/web/.next/server/app/(dashboard)/@drawer/create/page.js +4 -4
  100. package/web/.next/server/app/(dashboard)/@drawer/create/page.js.nft.json +1 -1
  101. package/web/.next/server/app/(dashboard)/@drawer/create/page_client-reference-manifest.js +1 -1
  102. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page/build-manifest.json +5 -5
  103. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page/server-reference-manifest.json +49 -34
  104. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js +4 -4
  105. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js.nft.json +1 -1
  106. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page_client-reference-manifest.js +1 -1
  107. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page/build-manifest.json +5 -5
  108. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page/server-reference-manifest.json +39 -24
  109. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js +4 -4
  110. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js.nft.json +1 -1
  111. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  112. package/web/.next/server/app/(dashboard)/create/page/build-manifest.json +5 -5
  113. package/web/.next/server/app/(dashboard)/create/page/server-reference-manifest.json +43 -28
  114. package/web/.next/server/app/(dashboard)/create/page.js +4 -4
  115. package/web/.next/server/app/(dashboard)/create/page.js.nft.json +1 -1
  116. package/web/.next/server/app/(dashboard)/create/page_client-reference-manifest.js +1 -1
  117. package/web/.next/server/app/(dashboard)/feature/[featureId]/page/build-manifest.json +5 -5
  118. package/web/.next/server/app/(dashboard)/feature/[featureId]/page/server-reference-manifest.json +49 -34
  119. package/web/.next/server/app/(dashboard)/feature/[featureId]/page.js +4 -4
  120. package/web/.next/server/app/(dashboard)/feature/[featureId]/page.js.nft.json +1 -1
  121. package/web/.next/server/app/(dashboard)/feature/[featureId]/page_client-reference-manifest.js +1 -1
  122. package/web/.next/server/app/(dashboard)/page/build-manifest.json +5 -5
  123. package/web/.next/server/app/(dashboard)/page/server-reference-manifest.json +39 -24
  124. package/web/.next/server/app/(dashboard)/page.js +4 -4
  125. package/web/.next/server/app/(dashboard)/page.js.nft.json +1 -1
  126. package/web/.next/server/app/(dashboard)/page_client-reference-manifest.js +1 -1
  127. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page/build-manifest.json +5 -5
  128. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page/server-reference-manifest.json +39 -24
  129. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js +4 -4
  130. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js.nft.json +1 -1
  131. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  132. package/web/.next/server/app/_global-error/page/build-manifest.json +5 -5
  133. package/web/.next/server/app/_global-error.html +2 -2
  134. package/web/.next/server/app/_global-error.rsc +1 -1
  135. package/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  136. package/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  137. package/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  138. package/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  139. package/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  140. package/web/.next/server/app/_not-found/page/build-manifest.json +5 -5
  141. package/web/.next/server/app/_not-found/page/server-reference-manifest.json +1 -1
  142. package/web/.next/server/app/_not-found/page.js.nft.json +1 -1
  143. package/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  144. package/web/.next/server/app/api/tools/[id]/install/route.js +1 -1
  145. package/web/.next/server/app/api/tools/[id]/install/route.js.nft.json +1 -1
  146. package/web/.next/server/app/api/tools/[id]/install/stream/route/app-paths-manifest.json +3 -0
  147. package/web/.next/server/app/api/tools/[id]/install/stream/route/build-manifest.json +11 -0
  148. package/web/.next/server/app/api/tools/[id]/install/stream/route/server-reference-manifest.json +4 -0
  149. package/web/.next/server/app/api/tools/[id]/install/stream/route.js +6 -0
  150. package/web/.next/server/app/api/tools/[id]/install/stream/route.js.map +5 -0
  151. package/web/.next/server/app/api/tools/[id]/install/stream/route.js.nft.json +1 -0
  152. package/web/.next/server/app/api/tools/[id]/install/stream/route_client-reference-manifest.js +2 -0
  153. package/web/.next/server/app/skills/page/build-manifest.json +5 -5
  154. package/web/.next/server/app/skills/page/server-reference-manifest.json +6 -6
  155. package/web/.next/server/app/skills/page.js +1 -1
  156. package/web/.next/server/app/skills/page.js.nft.json +1 -1
  157. package/web/.next/server/app/skills/page_client-reference-manifest.js +1 -1
  158. package/web/.next/server/app/tools/page/build-manifest.json +5 -5
  159. package/web/.next/server/app/tools/page/server-reference-manifest.json +77 -2
  160. package/web/.next/server/app/tools/page.js +2 -2
  161. package/web/.next/server/app/tools/page.js.nft.json +1 -1
  162. package/web/.next/server/app/tools/page_client-reference-manifest.js +1 -1
  163. package/web/.next/server/app/version/page/build-manifest.json +5 -5
  164. package/web/.next/server/app/version/page/server-reference-manifest.json +1 -1
  165. package/web/.next/server/app/version/page.js.nft.json +1 -1
  166. package/web/.next/server/app/version/page_client-reference-manifest.js +1 -1
  167. package/web/.next/server/app-paths-manifest.json +1 -0
  168. package/web/.next/server/chunks/403f9_next_dist_esm_build_templates_app-route_4d623b8e.js +2 -2
  169. package/web/.next/server/chunks/403f9_next_dist_esm_build_templates_app-route_4d623b8e.js.map +1 -1
  170. package/web/.next/server/chunks/[root-of-the-server]__0866d2b5._.js +3 -0
  171. package/web/.next/server/chunks/[root-of-the-server]__0866d2b5._.js.map +1 -0
  172. package/web/.next/server/chunks/[root-of-the-server]__e247a485._.js +11 -0
  173. package/web/.next/server/chunks/[root-of-the-server]__e247a485._.js.map +1 -0
  174. package/web/.next/server/chunks/f3a1f__next-internal_server_app_api_tools_[id]_install_stream_route_actions_1fe5bd5d.js +3 -0
  175. package/web/.next/server/chunks/f3a1f__next-internal_server_app_api_tools_[id]_install_stream_route_actions_1fe5bd5d.js.map +1 -0
  176. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js +1 -1
  177. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js.map +1 -1
  178. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_3a02d8a5.js +3 -0
  179. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_3a02d8a5.js.map +1 -0
  180. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_a3044852.js +3 -0
  181. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_a3044852.js.map +1 -0
  182. package/web/.next/server/chunks/ssr/[root-of-the-server]__17a611f0._.js +4 -0
  183. package/web/.next/server/chunks/ssr/[root-of-the-server]__17a611f0._.js.map +1 -0
  184. package/web/.next/server/chunks/ssr/[root-of-the-server]__249c74f6._.js +1 -1
  185. 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
  186. package/web/.next/server/chunks/ssr/{[root-of-the-server]__07385073._.js.map → [root-of-the-server]__45dbf93d._.js.map} +1 -1
  187. package/web/.next/server/chunks/ssr/[root-of-the-server]__6b17a22d._.js +1 -1
  188. package/web/.next/server/chunks/ssr/[root-of-the-server]__6b17a22d._.js.map +1 -1
  189. package/web/.next/server/chunks/ssr/[root-of-the-server]__6cbc1149._.js +4 -0
  190. package/web/.next/server/chunks/ssr/[root-of-the-server]__6cbc1149._.js.map +1 -0
  191. package/web/.next/server/chunks/ssr/[root-of-the-server]__804c006d._.js +1 -1
  192. package/web/.next/server/chunks/ssr/[root-of-the-server]__804c006d._.js.map +1 -1
  193. package/web/.next/server/chunks/ssr/[root-of-the-server]__aad040c0._.js +3 -0
  194. package/web/.next/server/chunks/ssr/[root-of-the-server]__aad040c0._.js.map +1 -0
  195. package/web/.next/server/chunks/ssr/[root-of-the-server]__c18f84a4._.js +3 -0
  196. package/web/.next/server/chunks/ssr/[root-of-the-server]__c18f84a4._.js.map +1 -0
  197. package/web/.next/server/chunks/ssr/[root-of-the-server]__cbae9863._.js +3 -0
  198. package/web/.next/server/chunks/ssr/[root-of-the-server]__cbae9863._.js.map +1 -0
  199. package/web/.next/server/chunks/ssr/[root-of-the-server]__e062a6de._.js +3 -0
  200. package/web/.next/server/chunks/ssr/[root-of-the-server]__e062a6de._.js.map +1 -0
  201. package/web/.next/server/chunks/ssr/[root-of-the-server]__e5e09f72._.js +3 -0
  202. package/web/.next/server/chunks/ssr/[root-of-the-server]__e5e09f72._.js.map +1 -0
  203. package/web/.next/server/chunks/ssr/_0e9d6bf7._.js +3 -0
  204. package/web/.next/server/chunks/ssr/_0e9d6bf7._.js.map +1 -0
  205. package/web/.next/server/chunks/ssr/_1978f325._.js +7 -0
  206. package/web/.next/server/chunks/ssr/_1978f325._.js.map +1 -0
  207. package/web/.next/server/chunks/ssr/_3197d5cb._.js +3 -0
  208. package/web/.next/server/chunks/ssr/_3197d5cb._.js.map +1 -0
  209. package/web/.next/server/chunks/ssr/_61351ed3._.js +3 -0
  210. package/web/.next/server/chunks/ssr/_61351ed3._.js.map +1 -0
  211. package/web/.next/server/chunks/ssr/_6e08ce21._.js +3 -0
  212. package/web/.next/server/chunks/ssr/_6e08ce21._.js.map +1 -0
  213. package/web/.next/server/chunks/ssr/_8400c8bb._.js +3 -0
  214. package/web/.next/server/chunks/ssr/_8400c8bb._.js.map +1 -0
  215. package/web/.next/{standalone/src/presentation/web/.next/server/chunks/ssr/_7215bb0f._.js → server/chunks/ssr/_8fa33b4c._.js} +2 -2
  216. package/web/.next/server/chunks/ssr/{_7215bb0f._.js.map → _8fa33b4c._.js.map} +1 -1
  217. package/web/.next/server/chunks/ssr/_9f940437._.js +3 -0
  218. package/web/.next/server/chunks/ssr/_9f940437._.js.map +1 -0
  219. package/web/.next/server/chunks/ssr/_a29296f0._.js +3 -0
  220. package/web/.next/server/chunks/ssr/_a29296f0._.js.map +1 -0
  221. package/web/.next/server/chunks/ssr/_e806976d._.js +3 -0
  222. package/web/.next/server/chunks/ssr/_e806976d._.js.map +1 -0
  223. package/web/.next/server/chunks/ssr/{src_presentation_web_1a32dbcb._.js → src_presentation_web_0a49d9ee._.js} +3 -3
  224. package/web/.next/server/chunks/ssr/{src_presentation_web_1a32dbcb._.js.map → src_presentation_web_0a49d9ee._.js.map} +1 -1
  225. package/web/.next/server/chunks/ssr/{src_presentation_web_398553b0._.js → src_presentation_web_5ea689db._.js} +2 -2
  226. package/web/.next/server/chunks/ssr/{src_presentation_web_398553b0._.js.map → src_presentation_web_5ea689db._.js.map} +1 -1
  227. package/web/.next/{standalone/src/presentation/web/.next/server/chunks/ssr/src_presentation_web_398553b0._.js → server/chunks/ssr/src_presentation_web_7188a290._.js} +2 -2
  228. package/web/.next/server/chunks/ssr/{src_presentation_web_5c87e8e4._.js.map → src_presentation_web_7188a290._.js.map} +1 -1
  229. package/web/.next/server/chunks/ssr/{src_presentation_web_c1bc6240._.js → src_presentation_web_79b0305a._.js} +3 -3
  230. package/web/.next/server/chunks/ssr/{src_presentation_web_c1bc6240._.js.map → src_presentation_web_79b0305a._.js.map} +1 -1
  231. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_cc16bd01.js +3 -0
  232. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_cc16bd01.js.map +1 -0
  233. package/web/.next/server/chunks/ssr/src_presentation_web_app_(dashboard)_get-graph-data_ts_b018483e._.js +3 -0
  234. package/web/.next/server/chunks/ssr/src_presentation_web_app_(dashboard)_get-graph-data_ts_b018483e._.js.map +1 -0
  235. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js +1 -1
  236. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js.map +1 -1
  237. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_tools_tools-page-client_tsx_3d0aa70c._.js +3 -0
  238. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_tools_tools-page-client_tsx_3d0aa70c._.js.map +1 -0
  239. package/web/.next/server/middleware-build-manifest.js +5 -5
  240. package/web/.next/server/pages/500.html +2 -2
  241. package/web/.next/server/server-reference-manifest.js +1 -1
  242. package/web/.next/server/server-reference-manifest.json +216 -124
  243. package/web/.next/standalone/src/presentation/web/.next/BUILD_ID +1 -1
  244. package/web/.next/standalone/src/presentation/web/.next/app-path-routes-manifest.json +1 -0
  245. package/web/.next/standalone/src/presentation/web/.next/build-manifest.json +7 -7
  246. package/web/.next/standalone/src/presentation/web/.next/prerender-manifest.json +3 -3
  247. package/web/.next/standalone/src/presentation/web/.next/required-server-files.json +1 -1
  248. package/web/.next/standalone/src/presentation/web/.next/routes-manifest.json +8 -0
  249. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/@drawer/create/page/build-manifest.json +5 -5
  250. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/@drawer/create/page/server-reference-manifest.json +43 -28
  251. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/@drawer/create/page.js +4 -4
  252. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/@drawer/create/page.js.nft.json +1 -1
  253. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/@drawer/create/page_client-reference-manifest.js +1 -1
  254. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page/build-manifest.json +5 -5
  255. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page/server-reference-manifest.json +49 -34
  256. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js +4 -4
  257. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js.nft.json +1 -1
  258. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page_client-reference-manifest.js +1 -1
  259. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page/build-manifest.json +5 -5
  260. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page/server-reference-manifest.json +39 -24
  261. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js +4 -4
  262. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js.nft.json +1 -1
  263. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  264. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/create/page/build-manifest.json +5 -5
  265. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/create/page/server-reference-manifest.json +43 -28
  266. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/create/page.js +4 -4
  267. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/create/page.js.nft.json +1 -1
  268. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/create/page_client-reference-manifest.js +1 -1
  269. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/feature/[featureId]/page/build-manifest.json +5 -5
  270. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/feature/[featureId]/page/server-reference-manifest.json +49 -34
  271. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/feature/[featureId]/page.js +4 -4
  272. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/feature/[featureId]/page.js.nft.json +1 -1
  273. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/feature/[featureId]/page_client-reference-manifest.js +1 -1
  274. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/page/build-manifest.json +5 -5
  275. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/page/server-reference-manifest.json +39 -24
  276. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/page.js +4 -4
  277. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/page.js.nft.json +1 -1
  278. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/page_client-reference-manifest.js +1 -1
  279. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/repository/[repositoryId]/page/build-manifest.json +5 -5
  280. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/repository/[repositoryId]/page/server-reference-manifest.json +39 -24
  281. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js +4 -4
  282. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js.nft.json +1 -1
  283. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  284. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error/page/build-manifest.json +5 -5
  285. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.html +2 -2
  286. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.rsc +1 -1
  287. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  288. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  289. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  290. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  291. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  292. package/web/.next/standalone/src/presentation/web/.next/server/app/_not-found/page/build-manifest.json +5 -5
  293. package/web/.next/standalone/src/presentation/web/.next/server/app/_not-found/page/server-reference-manifest.json +1 -1
  294. package/web/.next/standalone/src/presentation/web/.next/server/app/_not-found/page.js.nft.json +1 -1
  295. package/web/.next/standalone/src/presentation/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  296. package/web/.next/standalone/src/presentation/web/.next/server/app/api/tools/[id]/install/route.js +1 -1
  297. package/web/.next/standalone/src/presentation/web/.next/server/app/api/tools/[id]/install/route.js.nft.json +1 -1
  298. package/web/.next/standalone/src/presentation/web/.next/server/app/api/tools/[id]/install/stream/route/app-paths-manifest.json +3 -0
  299. package/web/.next/standalone/src/presentation/web/.next/server/app/api/tools/[id]/install/stream/route/build-manifest.json +11 -0
  300. package/web/.next/standalone/src/presentation/web/.next/server/app/api/tools/[id]/install/stream/route/server-reference-manifest.json +4 -0
  301. package/web/.next/standalone/src/presentation/web/.next/server/app/api/tools/[id]/install/stream/route.js +6 -0
  302. package/web/.next/standalone/src/presentation/web/.next/server/app/api/tools/[id]/install/stream/route.js.map +5 -0
  303. package/web/.next/standalone/src/presentation/web/.next/server/app/api/tools/[id]/install/stream/route.js.nft.json +1 -0
  304. package/web/.next/standalone/src/presentation/web/.next/server/app/api/tools/[id]/install/stream/route_client-reference-manifest.js +2 -0
  305. package/web/.next/standalone/src/presentation/web/.next/server/app/skills/page/build-manifest.json +5 -5
  306. package/web/.next/standalone/src/presentation/web/.next/server/app/skills/page/server-reference-manifest.json +6 -6
  307. package/web/.next/standalone/src/presentation/web/.next/server/app/skills/page.js +1 -1
  308. package/web/.next/standalone/src/presentation/web/.next/server/app/skills/page.js.nft.json +1 -1
  309. package/web/.next/standalone/src/presentation/web/.next/server/app/skills/page_client-reference-manifest.js +1 -1
  310. package/web/.next/standalone/src/presentation/web/.next/server/app/tools/page/build-manifest.json +5 -5
  311. package/web/.next/standalone/src/presentation/web/.next/server/app/tools/page/server-reference-manifest.json +77 -2
  312. package/web/.next/standalone/src/presentation/web/.next/server/app/tools/page.js +2 -2
  313. package/web/.next/standalone/src/presentation/web/.next/server/app/tools/page.js.nft.json +1 -1
  314. package/web/.next/standalone/src/presentation/web/.next/server/app/tools/page_client-reference-manifest.js +1 -1
  315. package/web/.next/standalone/src/presentation/web/.next/server/app/version/page/build-manifest.json +5 -5
  316. package/web/.next/standalone/src/presentation/web/.next/server/app/version/page/server-reference-manifest.json +1 -1
  317. package/web/.next/standalone/src/presentation/web/.next/server/app/version/page.js.nft.json +1 -1
  318. package/web/.next/standalone/src/presentation/web/.next/server/app/version/page_client-reference-manifest.js +1 -1
  319. package/web/.next/standalone/src/presentation/web/.next/server/app-paths-manifest.json +1 -0
  320. package/web/.next/standalone/src/presentation/web/.next/server/chunks/403f9_next_dist_esm_build_templates_app-route_4d623b8e.js +2 -2
  321. package/web/.next/standalone/src/presentation/web/.next/server/chunks/[root-of-the-server]__0866d2b5._.js +3 -0
  322. package/web/.next/standalone/src/presentation/web/.next/server/chunks/[root-of-the-server]__e247a485._.js +11 -0
  323. 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
  324. 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
  325. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_3a02d8a5.js +3 -0
  326. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_a3044852.js +3 -0
  327. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__17a611f0._.js +4 -0
  328. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__249c74f6._.js +1 -1
  329. 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
  330. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__6b17a22d._.js +1 -1
  331. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__6cbc1149._.js +4 -0
  332. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__804c006d._.js +1 -1
  333. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__aad040c0._.js +3 -0
  334. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__c18f84a4._.js +3 -0
  335. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__cbae9863._.js +3 -0
  336. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__e062a6de._.js +3 -0
  337. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__e5e09f72._.js +3 -0
  338. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_0e9d6bf7._.js +3 -0
  339. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_1978f325._.js +7 -0
  340. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_3197d5cb._.js +3 -0
  341. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_61351ed3._.js +3 -0
  342. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_6e08ce21._.js +3 -0
  343. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_8400c8bb._.js +3 -0
  344. package/web/.next/{server/chunks/ssr/_7215bb0f._.js → standalone/src/presentation/web/.next/server/chunks/ssr/_8fa33b4c._.js} +2 -2
  345. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_9f940437._.js +3 -0
  346. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_a29296f0._.js +3 -0
  347. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_e806976d._.js +3 -0
  348. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/{src_presentation_web_1a32dbcb._.js → src_presentation_web_0a49d9ee._.js} +3 -3
  349. package/web/.next/{server/chunks/ssr/src_presentation_web_5c87e8e4._.js → standalone/src/presentation/web/.next/server/chunks/ssr/src_presentation_web_5ea689db._.js} +2 -2
  350. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/{src_presentation_web_5c87e8e4._.js → src_presentation_web_7188a290._.js} +2 -2
  351. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/{src_presentation_web_c1bc6240._.js → src_presentation_web_79b0305a._.js} +3 -3
  352. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_cc16bd01.js +3 -0
  353. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/src_presentation_web_app_(dashboard)_get-graph-data_ts_b018483e._.js +3 -0
  354. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js +1 -1
  355. 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
  356. package/web/.next/standalone/src/presentation/web/.next/server/middleware-build-manifest.js +5 -5
  357. package/web/.next/standalone/src/presentation/web/.next/server/pages/500.html +2 -2
  358. package/web/.next/standalone/src/presentation/web/.next/server/server-reference-manifest.js +1 -1
  359. package/web/.next/standalone/src/presentation/web/.next/server/server-reference-manifest.json +216 -124
  360. package/web/.next/standalone/src/presentation/web/CLAUDE.md +128 -0
  361. package/web/.next/standalone/src/presentation/web/app/actions/get-graph-data.ts +12 -0
  362. package/web/.next/standalone/src/presentation/web/app/api/agent-events/route.ts +4 -1
  363. package/web/.next/standalone/src/presentation/web/app/api/tools/[id]/install/route.ts +14 -6
  364. package/web/.next/standalone/src/presentation/web/app/api/tools/[id]/install/stream/route.ts +42 -0
  365. package/web/.next/standalone/src/presentation/web/components/common/base-drawer/base-drawer.tsx +13 -1
  366. package/web/.next/standalone/src/presentation/web/components/common/feature-node/derive-feature-state.ts +2 -0
  367. package/web/.next/standalone/src/presentation/web/components/features/control-center/use-control-center-state.ts +82 -1
  368. package/web/.next/standalone/src/presentation/web/components/features/features-canvas/features-canvas.tsx +21 -23
  369. package/web/.next/standalone/src/presentation/web/components/features/index.ts +1 -1
  370. package/web/.next/standalone/src/presentation/web/components/features/tools/index.ts +1 -1
  371. package/web/.next/standalone/src/presentation/web/components/features/tools/tool-card.stories.tsx +18 -0
  372. package/web/.next/standalone/src/presentation/web/components/features/tools/tool-card.tsx +75 -67
  373. package/web/.next/standalone/src/presentation/web/components/features/tools/tool-detail-drawer.stories.tsx +132 -0
  374. package/web/.next/standalone/src/presentation/web/components/features/tools/tool-detail-drawer.tsx +313 -0
  375. package/web/.next/standalone/src/presentation/web/components/features/tools/tools-page-client.stories.tsx +15 -0
  376. package/web/.next/standalone/src/presentation/web/components/features/tools/tools-page-client.tsx +3 -3
  377. package/web/.next/standalone/src/presentation/web/hooks/use-tool-install-stream.ts +58 -0
  378. package/web/.next/standalone/src/presentation/web/server.js +1 -1
  379. package/web/.next/static/chunks/3cab1e09dfb7bd2f.js +1 -0
  380. package/web/.next/static/chunks/4a3b3cfcc85e7254.js +1 -0
  381. package/web/.next/static/chunks/5d0a6417c4e4e545.js +1 -0
  382. package/web/.next/static/chunks/67f2a7a5e8dc358a.css +2 -0
  383. package/web/.next/static/chunks/73304a30a2bc5060.js +1 -0
  384. package/web/.next/static/chunks/778b64d00834e733.js +1 -0
  385. package/web/.next/static/chunks/84a181ff3270fd9f.js +1 -0
  386. package/web/.next/static/chunks/{b45344579a43cbb8.js → 86a1874bad52ce9c.js} +1 -1
  387. package/web/.next/static/chunks/9215b6fb973482c5.js +1 -0
  388. package/web/.next/static/chunks/{585ae19c520e8b72.js → ac1ebc041544949d.js} +1 -1
  389. package/web/.next/static/chunks/b2594f43fcecee16.js +1 -0
  390. package/web/.next/static/chunks/c92e1360ada8ca94.js +5 -0
  391. package/web/.next/static/chunks/{fe83a799663fd3cc.js → de9e34a45eebec78.js} +1 -1
  392. package/web/.next/static/chunks/eb3b1975428d04a8.js +1 -0
  393. package/web/.next/static/chunks/edbd674102e897b4.js +1 -0
  394. package/web/.next/static/chunks/f0a17d065f1aa75f.js +1 -0
  395. package/web/.next/static/chunks/{turbopack-3a8fe0e18e69b0ab.js → turbopack-05820f781f3ffc22.js} +1 -1
  396. package/web/.next/trace +1 -1
  397. package/web/.next/trace-build +1 -1
  398. package/web/.next/types/link.d.ts +1 -0
  399. package/web/.next/types/routes.d.ts +2 -1
  400. package/web/.next/types/validator.ts +9 -0
  401. package/dist/src/presentation/web/components/features/tools/install-instructions.d.ts +0 -9
  402. package/dist/src/presentation/web/components/features/tools/install-instructions.d.ts.map +0 -1
  403. package/dist/src/presentation/web/components/features/tools/install-instructions.js +0 -19
  404. package/dist/src/presentation/web/components/features/tools/install-instructions.stories.d.ts +0 -12
  405. package/dist/src/presentation/web/components/features/tools/install-instructions.stories.d.ts.map +0 -1
  406. package/dist/src/presentation/web/components/features/tools/install-instructions.stories.js +0 -77
  407. package/web/.next/server/chunks/[root-of-the-server]__b1f03347._.js +0 -3
  408. package/web/.next/server/chunks/[root-of-the-server]__b1f03347._.js.map +0 -1
  409. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_2b7834f6.js +0 -3
  410. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_2b7834f6.js.map +0 -1
  411. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_6923c575.js +0 -3
  412. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_6923c575.js.map +0 -1
  413. package/web/.next/server/chunks/ssr/[root-of-the-server]__08ba9bd3._.js +0 -4
  414. package/web/.next/server/chunks/ssr/[root-of-the-server]__08ba9bd3._.js.map +0 -1
  415. package/web/.next/server/chunks/ssr/[root-of-the-server]__6bb00d90._.js +0 -3
  416. package/web/.next/server/chunks/ssr/[root-of-the-server]__6bb00d90._.js.map +0 -1
  417. package/web/.next/server/chunks/ssr/[root-of-the-server]__6db85a66._.js +0 -4
  418. package/web/.next/server/chunks/ssr/[root-of-the-server]__6db85a66._.js.map +0 -1
  419. package/web/.next/server/chunks/ssr/[root-of-the-server]__8c1a3d66._.js +0 -3
  420. package/web/.next/server/chunks/ssr/[root-of-the-server]__8c1a3d66._.js.map +0 -1
  421. package/web/.next/server/chunks/ssr/[root-of-the-server]__8fcb9132._.js +0 -4
  422. package/web/.next/server/chunks/ssr/[root-of-the-server]__8fcb9132._.js.map +0 -1
  423. package/web/.next/server/chunks/ssr/[root-of-the-server]__9d14479b._.js +0 -3
  424. package/web/.next/server/chunks/ssr/[root-of-the-server]__9d14479b._.js.map +0 -1
  425. package/web/.next/server/chunks/ssr/[root-of-the-server]__d4e51258._.js +0 -3
  426. package/web/.next/server/chunks/ssr/[root-of-the-server]__d4e51258._.js.map +0 -1
  427. package/web/.next/server/chunks/ssr/[root-of-the-server]__fe2a7deb._.js +0 -3
  428. package/web/.next/server/chunks/ssr/[root-of-the-server]__fe2a7deb._.js.map +0 -1
  429. package/web/.next/server/chunks/ssr/_00e6c698._.js +0 -3
  430. package/web/.next/server/chunks/ssr/_00e6c698._.js.map +0 -1
  431. package/web/.next/server/chunks/ssr/_13566ff3._.js +0 -3
  432. package/web/.next/server/chunks/ssr/_13566ff3._.js.map +0 -1
  433. package/web/.next/server/chunks/ssr/_250a63ae._.js +0 -3
  434. package/web/.next/server/chunks/ssr/_250a63ae._.js.map +0 -1
  435. package/web/.next/server/chunks/ssr/_26129e04._.js +0 -3
  436. package/web/.next/server/chunks/ssr/_26129e04._.js.map +0 -1
  437. package/web/.next/server/chunks/ssr/_34a58db8._.js +0 -3
  438. package/web/.next/server/chunks/ssr/_34a58db8._.js.map +0 -1
  439. package/web/.next/server/chunks/ssr/_37259405._.js +0 -3
  440. package/web/.next/server/chunks/ssr/_37259405._.js.map +0 -1
  441. package/web/.next/server/chunks/ssr/_63bfa7dd._.js +0 -3
  442. package/web/.next/server/chunks/ssr/_63bfa7dd._.js.map +0 -1
  443. package/web/.next/server/chunks/ssr/_cb5b3951._.js +0 -3
  444. package/web/.next/server/chunks/ssr/_cb5b3951._.js.map +0 -1
  445. package/web/.next/server/chunks/ssr/_fc3a6895._.js +0 -3
  446. package/web/.next/server/chunks/ssr/_fc3a6895._.js.map +0 -1
  447. package/web/.next/server/chunks/ssr/node_modules__pnpm_3288606c._.js +0 -7
  448. package/web/.next/server/chunks/ssr/node_modules__pnpm_3288606c._.js.map +0 -1
  449. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_f4952172.js +0 -3
  450. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_f4952172.js.map +0 -1
  451. package/web/.next/server/chunks/ssr/src_presentation_web_ca99d62d._.js +0 -3
  452. package/web/.next/server/chunks/ssr/src_presentation_web_ca99d62d._.js.map +0 -1
  453. package/web/.next/standalone/src/presentation/web/.next/server/chunks/[root-of-the-server]__b1f03347._.js +0 -3
  454. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_2b7834f6.js +0 -3
  455. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_6923c575.js +0 -3
  456. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__08ba9bd3._.js +0 -4
  457. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__6bb00d90._.js +0 -3
  458. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__6db85a66._.js +0 -4
  459. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__8c1a3d66._.js +0 -3
  460. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__8fcb9132._.js +0 -4
  461. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__9d14479b._.js +0 -3
  462. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__d4e51258._.js +0 -3
  463. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__fe2a7deb._.js +0 -3
  464. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_00e6c698._.js +0 -3
  465. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_13566ff3._.js +0 -3
  466. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_250a63ae._.js +0 -3
  467. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_26129e04._.js +0 -3
  468. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_34a58db8._.js +0 -3
  469. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_37259405._.js +0 -3
  470. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_63bfa7dd._.js +0 -3
  471. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_cb5b3951._.js +0 -3
  472. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_fc3a6895._.js +0 -3
  473. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/node_modules__pnpm_3288606c._.js +0 -7
  474. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_f4952172.js +0 -3
  475. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/src_presentation_web_ca99d62d._.js +0 -3
  476. package/web/.next/standalone/src/presentation/web/components/features/tools/install-instructions.stories.tsx +0 -89
  477. package/web/.next/standalone/src/presentation/web/components/features/tools/install-instructions.tsx +0 -109
  478. package/web/.next/static/chunks/07fcc6d17357e905.js +0 -1
  479. package/web/.next/static/chunks/304c8593d0a6525d.js +0 -1
  480. package/web/.next/static/chunks/3e1227e02ef8bcc6.js +0 -5
  481. package/web/.next/static/chunks/4558d1663c6f4d2c.js +0 -1
  482. package/web/.next/static/chunks/4df07e765b233622.js +0 -1
  483. package/web/.next/static/chunks/64d73952a0291431.js +0 -1
  484. package/web/.next/static/chunks/6e14d8bd5c005e6e.js +0 -1
  485. package/web/.next/static/chunks/8a1eb93510e54db0.js +0 -1
  486. package/web/.next/static/chunks/938c21b0cefb2b1d.js +0 -1
  487. package/web/.next/static/chunks/b143c7d78a6888e9.js +0 -1
  488. package/web/.next/static/chunks/c7e793951b20a67f.js +0 -1
  489. package/web/.next/static/chunks/dec13bccb136ef7c.css +0 -2
  490. package/web/.next/static/chunks/e4522f7d3134eefe.js +0 -1
  491. /package/web/.next/static/{9bO_bJBssG0NRxEG03iM5 → rLo0X398WFLTarx1augqu}/_buildManifest.js +0 -0
  492. /package/web/.next/static/{9bO_bJBssG0NRxEG03iM5 → rLo0X398WFLTarx1augqu}/_clientMiddlewareManifest.json +0 -0
  493. /package/web/.next/static/{9bO_bJBssG0NRxEG03iM5 → rLo0X398WFLTarx1augqu}/_ssgManifest.js +0 -0
@@ -0,0 +1,128 @@
1
+ # Web UI Development Notes
2
+
3
+ ## Running the UI
4
+
5
+ There are two distinct ways to run the web UI. **Always test in BOTH modes.**
6
+
7
+ ### 1. Dev Mode (local development)
8
+
9
+ ```bash
10
+ pnpm dev:web
11
+ ```
12
+
13
+ - Uses `dev-server.ts` which initializes the DI container and starts Next.js in dev mode
14
+ - Turbopack HMR enabled
15
+ - Runs on port 3000 by default
16
+
17
+ ### 2. Production Mode (how users run it)
18
+
19
+ ```bash
20
+ shep ui
21
+ # or
22
+ pnpm dev:cli ui
23
+ ```
24
+
25
+ - The CLI bootstraps the DI container (`src/presentation/cli/index.ts`), then starts Next.js via `WebServerService`
26
+ - Runs on port 4050 by default
27
+ - This is how real users experience the UI
28
+ - **IMPORTANT**: Always test real-time features in this mode, not just dev mode
29
+
30
+ ### Key Differences Between Modes
31
+
32
+ | Aspect | Dev Mode (`pnpm dev:web`) | Production Mode (`shep ui`) |
33
+ | ------------------ | ------------------------------------------------------- | ------------------------------------------------------- |
34
+ | Entry point | `dev-server.ts` | `cli/index.ts` -> `ui.command.ts` -> `WebServerService` |
35
+ | Port | 3000 | 4050 |
36
+ | DI container | Set on `globalThis.__shepContainer` in dev-server.ts:73 | Set in cli/index.ts:76 |
37
+ | WebSocket upgrades | Forwarded (HMR works) | NOT forwarded in `WebServerService` |
38
+ | Next.js mode | Always dev | dev when run from source, prod when installed |
39
+
40
+ ## SSE / Real-Time Update Architecture
41
+
42
+ ```
43
+ DB polling (500ms) -> /api/agent-events (SSE route)
44
+ -> Service Worker (public/agent-events-sw.js, single connection)
45
+ -> postMessage to all browser tabs
46
+ -> useAgentEvents hook (hooks/use-agent-events.ts)
47
+ -> AgentEventsProvider context (hooks/agent-events-provider.tsx)
48
+ -> useControlCenterState (optimistic node updates via setNodes)
49
+ -> React state updates -> sidebar + React Flow canvas
50
+ ```
51
+
52
+ ### SSE Key Files
53
+
54
+ | File | Purpose |
55
+ | ---------------------------------------------------------------- | ------------------------------------------------------ |
56
+ | `app/api/agent-events/route.ts` | SSE endpoint, polls DB every 500ms, emits delta events |
57
+ | `app/api/agent-events/health/route.ts` | Health check: `/api/agent-events/health` |
58
+ | `public/agent-events-sw.js` | Service Worker: multiplexes single SSE to all tabs |
59
+ | `hooks/use-agent-events.ts` | Client hook: registers with SW, receives events |
60
+ | `hooks/agent-events-provider.tsx` | React context wrapping `useAgentEvents` |
61
+ | `components/features/control-center/use-control-center-state.ts` | Processes SSE events into React Flow node updates |
62
+ | `components/common/feature-node/derive-feature-state.ts` | Maps event types/phases to UI state/lifecycle |
63
+
64
+ ### SSE Event Flow Details
65
+
66
+ 1. **SSE route** seeds a per-connection cache on first poll (no events emitted for initial state)
67
+ 2. Subsequent polls compare DB state against cache, emit only deltas
68
+ 3. **Service Worker** connects to `/api/agent-events` via EventSource on first subscriber
69
+ 4. SW broadcasts `{ type: 'notification', data }` to all tabs via `clients.matchAll()`
70
+ 5. **useControlCenterState** effect processes new events, calls `setNodes()` to update node state/lifecycle
71
+ 6. **Polling fallback** (5s interval) fetches via `fetchGraphData()` server action for active features
72
+
73
+ ### SSE Lifecycle Mappings
74
+
75
+ The SSE route maps `SdlcLifecycle` enum -> agent graph node names -> client `FeatureLifecyclePhase`:
76
+
77
+ ```
78
+ SdlcLifecycle.Started -> 'requirements' -> 'requirements'
79
+ SdlcLifecycle.Analyze -> 'analyze' -> 'requirements'
80
+ SdlcLifecycle.Requirements-> 'requirements' -> 'requirements'
81
+ SdlcLifecycle.Research -> 'research' -> 'research'
82
+ SdlcLifecycle.Planning -> 'plan' -> 'implementation'
83
+ SdlcLifecycle.Implementation -> 'implement' -> 'implementation'
84
+ SdlcLifecycle.Review -> 'merge' -> 'review'
85
+ SdlcLifecycle.Maintain -> 'maintain' -> 'maintain'
86
+ SdlcLifecycle.Blocked -> 'blocked' -> 'requirements'
87
+ ```
88
+
89
+ ## React Flow Rendering (CRITICAL)
90
+
91
+ React Flow v12 (`@xyflow/react` ^12.10.0) has specific behaviors that affect real-time updates:
92
+
93
+ - **Controlled mode**: `<ReactFlow nodes={nodes}>` passes nodes as props
94
+ - **Internal Zustand store**: React Flow syncs props to an internal `nodeLookup` Map via `StoreUpdater`
95
+ - **Memoized NodeWrapper**: Each node is wrapped in `memo(NodeWrapper)` which subscribes to store via `useStore(selector, shallow)`
96
+ - **NodeWrapper gets node from store**, NOT from props directly. It does `s.nodeLookup.get(id)` with `shallow` comparison
97
+ - **Single ReactFlowProvider**: There must be exactly ONE `ReactFlowProvider` ancestor. Multiple nested providers create separate stores, causing the outer one's `StoreUpdater` to sync nodes to a store that the inner components don't read from
98
+
99
+ ### Circular Update Loop (FIXED — do not reintroduce)
100
+
101
+ In controlled mode, `enrichedNodes` (useMemo in FeaturesCanvas) creates new node objects every render
102
+ (adding callbacks to `data`). StoreUpdater sees different references and emits `replace` changes via
103
+ `onNodesChange`. If `onNodesChange` applies these 'replace' changes back to state via `applyNodeChanges`,
104
+ it overwrites SSE-driven state updates with stale data from the previous render, AND triggers another
105
+ `enrichedNodes` recalculation → infinite loop (110+ renders on page load).
106
+
107
+ **Fix**: `onNodesChange` in `use-control-center-state.ts` filters out `replace` changes. Only `dimensions`,
108
+ `position`, `select`, etc. are applied. StoreUpdater still syncs props to its internal store regardless —
109
+ our state remains the source of truth.
110
+
111
+ **NEVER** remove the `c.type !== 'replace'` filter from `onNodesChange`.
112
+
113
+ ## Testing Real-Time Updates
114
+
115
+ 1. Start the UI in the mode you want to test
116
+ 2. Check SSE health: `curl http://localhost:<port>/api/agent-events/health`
117
+ 3. Check SW status in browser: `navigator.serviceWorker.controller?.state` should be "activated"
118
+ 4. Trigger state changes: `pnpm dev:cli feat approve <id>` or start a new feature run
119
+ 5. Watch both **sidebar** and **canvas nodes** - they should both update
120
+ 6. Check browser console for errors
121
+ 7. Check server logs for `[SSE] emit:` messages confirming events are sent
122
+
123
+ ## Common Pitfalls
124
+
125
+ - **No events when nothing changes**: SSE only emits deltas. If no feature state changes, no events are sent. This is correct behavior.
126
+ - **Polling fallback dependency**: The 5s polling `useEffect` depends on a derived `hasActiveFeature` boolean (not `nodes` directly). Using `[nodes]` as a dependency would reset the interval on every node change, potentially preventing it from ever firing.
127
+ - **Storybook mocks**: New server actions need mocks in `.storybook/mocks/app/actions/` or Storybook build breaks.
128
+ - **`output: 'standalone'`** in next.config.ts: Production builds use standalone mode. Route handlers are bundled differently.
@@ -0,0 +1,12 @@
1
+ 'use server';
2
+
3
+ import { getGraphData } from '@/app/(dashboard)/get-graph-data';
4
+
5
+ /**
6
+ * Server action that fetches fresh graph nodes and edges.
7
+ * Used as a lightweight polling fallback for active features,
8
+ * avoiding full router.refresh() page re-renders.
9
+ */
10
+ export async function fetchGraphData() {
11
+ return getGraphData();
12
+ }
@@ -44,13 +44,16 @@ interface CachedFeatureState {
44
44
  * Maps SdlcLifecycle values to agent graph node names so the client
45
45
  * can derive the correct FeatureLifecyclePhase via mapPhaseNameToLifecycle().
46
46
  */
47
- const LIFECYCLE_TO_NODE: Partial<Record<SdlcLifecycle, string>> = {
47
+ const LIFECYCLE_TO_NODE: Record<SdlcLifecycle, string> = {
48
+ [SdlcLifecycle.Started]: 'requirements',
48
49
  [SdlcLifecycle.Analyze]: 'analyze',
49
50
  [SdlcLifecycle.Requirements]: 'requirements',
50
51
  [SdlcLifecycle.Research]: 'research',
51
52
  [SdlcLifecycle.Planning]: 'plan',
52
53
  [SdlcLifecycle.Implementation]: 'implement',
53
54
  [SdlcLifecycle.Review]: 'merge',
55
+ [SdlcLifecycle.Maintain]: 'maintain',
56
+ [SdlcLifecycle.Blocked]: 'blocked',
54
57
  };
55
58
 
56
59
  const STATUS_TO_EVENT: Partial<
@@ -1,7 +1,14 @@
1
1
  import { NextResponse } from 'next/server';
2
2
  import { resolve } from '@/lib/server-container';
3
3
  import type { InstallToolUseCase } from '@shepai/core/application/use-cases/tools/install-tool.use-case';
4
- import { TOOL_METADATA } from '@shepai/core/infrastructure/services/tool-installer/tool-metadata';
4
+ import type { ToolInstallationStatus } from '@shepai/core/domain/generated/output';
5
+
6
+ // NOTE: Do NOT import TOOL_METADATA directly in API routes.
7
+ // The module uses import.meta.url + fs.readdirSync to load JSON files,
8
+ // which breaks when Turbopack bundles it (import.meta.url resolves to
9
+ // the bundled chunk location where the tools/ directory doesn't exist).
10
+ // Tool validation is delegated to the use case via the DI container,
11
+ // where the module loads correctly in the Node.js CLI bootstrap context.
5
12
 
6
13
  export async function POST(
7
14
  _request: Request,
@@ -9,13 +16,14 @@ export async function POST(
9
16
  ): Promise<NextResponse> {
10
17
  const { id } = await params;
11
18
 
12
- if (!TOOL_METADATA[id]) {
13
- return NextResponse.json({ error: 'Tool not found' }, { status: 404 });
14
- }
15
-
16
19
  try {
17
20
  const useCase = resolve<InstallToolUseCase>('InstallToolUseCase');
18
- const status = await useCase.execute(id);
21
+ const status: ToolInstallationStatus = await useCase.execute(id);
22
+
23
+ if (status.status === 'error') {
24
+ return NextResponse.json({ error: status.errorMessage }, { status: 500 });
25
+ }
26
+
19
27
  return NextResponse.json({ status });
20
28
  } catch (error: unknown) {
21
29
  const message = error instanceof Error ? error.message : 'Failed to install tool';
@@ -0,0 +1,42 @@
1
+ import { resolve } from '@/lib/server-container';
2
+ import type { InstallToolUseCase } from '@shepai/core/application/use-cases/tools/install-tool.use-case';
3
+
4
+ // Force dynamic — SSE streams must never be statically optimized or cached
5
+ export const dynamic = 'force-dynamic';
6
+
7
+ export async function GET(
8
+ _request: Request,
9
+ { params }: { params: Promise<{ id: string }> }
10
+ ): Promise<Response> {
11
+ const { id } = await params;
12
+ const useCase = resolve<InstallToolUseCase>('InstallToolUseCase');
13
+
14
+ const encoder = new TextEncoder();
15
+ const stream = new ReadableStream({
16
+ async start(controller) {
17
+ try {
18
+ const status = await useCase.execute(id, (chunk: string) => {
19
+ controller.enqueue(encoder.encode(`data: ${chunk.replace(/\n/g, '\ndata: ')}\n\n`));
20
+ });
21
+ controller.enqueue(encoder.encode(`event: done\ndata: ${JSON.stringify(status)}\n\n`));
22
+ } catch (error) {
23
+ const message = error instanceof Error ? error.message : 'Installation failed';
24
+ controller.enqueue(
25
+ encoder.encode(
26
+ `event: done\ndata: ${JSON.stringify({ status: 'error', toolName: id, errorMessage: message })}\n\n`
27
+ )
28
+ );
29
+ } finally {
30
+ controller.close();
31
+ }
32
+ },
33
+ });
34
+
35
+ return new Response(stream, {
36
+ headers: {
37
+ 'Content-Type': 'text/event-stream',
38
+ 'Cache-Control': 'no-cache',
39
+ Connection: 'keep-alive',
40
+ },
41
+ });
42
+ }
@@ -12,6 +12,8 @@ import {
12
12
  DrawerHeader,
13
13
  DrawerFooter,
14
14
  DrawerOverlay,
15
+ DrawerTitle,
16
+ DrawerDescription,
15
17
  } from '@/components/ui/drawer';
16
18
  import { Separator } from '@/components/ui/separator';
17
19
  import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from '@/components/ui/tooltip';
@@ -36,6 +38,7 @@ export interface BaseDrawerProps extends VariantProps<typeof drawerVariants> {
36
38
  modal?: boolean;
37
39
  /** When true, clicking anywhere outside the drawer closes it, ignoring `data-no-drawer-close` guards. */
38
40
  dismissOnOutsideClick?: boolean;
41
+ title?: string;
39
42
  header?: React.ReactNode;
40
43
  children: React.ReactNode;
41
44
  footer?: React.ReactNode;
@@ -49,6 +52,7 @@ export function BaseDrawer({
49
52
  onClose,
50
53
  modal = false,
51
54
  dismissOnOutsideClick = false,
55
+ title = 'Drawer',
52
56
  size,
53
57
  header,
54
58
  children,
@@ -101,8 +105,16 @@ export function BaseDrawer({
101
105
  showCloseButton={false}
102
106
  className={cn(drawerVariants({ size }), className)}
103
107
  data-testid={testId}
104
- onInteractOutside={(e) => e.preventDefault()}
108
+ onInteractOutside={modal ? undefined : (e) => e.preventDefault()}
105
109
  >
110
+ {/* Visually hidden title & description required by Radix Dialog for accessibility */}
111
+ <DrawerTitle asChild>
112
+ <span className="sr-only">{title}</span>
113
+ </DrawerTitle>
114
+ <DrawerDescription asChild>
115
+ <span className="sr-only">{title}</span>
116
+ </DrawerDescription>
117
+
106
118
  {/* Close button */}
107
119
  <button
108
120
  type="button"
@@ -120,6 +120,8 @@ const phaseNameToLifecycle: Record<string, FeatureLifecyclePhase> = {
120
120
  plan: 'implementation',
121
121
  implement: 'implementation',
122
122
  merge: 'review',
123
+ maintain: 'maintain',
124
+ blocked: 'requirements',
123
125
  };
124
126
 
125
127
  export function mapPhaseNameToLifecycle(
@@ -15,6 +15,7 @@ import {
15
15
  import { deleteFeature } from '@/app/actions/delete-feature';
16
16
  import { addRepository } from '@/app/actions/add-repository';
17
17
  import { deleteRepository } from '@/app/actions/delete-repository';
18
+ import { fetchGraphData } from '@/app/actions/get-graph-data';
18
19
  import { useAgentEventsContext } from '@/hooks/agent-events-provider';
19
20
  import { useSoundAction } from '@/hooks/use-sound-action';
20
21
  import {
@@ -206,6 +207,7 @@ export function useControlCenterState(
206
207
  if (node.type !== 'featureNode') return node;
207
208
  const data = node.data as FeatureNodeData;
208
209
  if (data.featureId !== event.featureId) return node;
210
+
209
211
  return {
210
212
  ...node,
211
213
  data: {
@@ -219,8 +221,87 @@ export function useControlCenterState(
219
221
  }
220
222
  }, [events]);
221
223
 
224
+ // Lightweight server-action polling fallback: fetches fresh graph data every 5s
225
+ // when any feature is in an active state. This avoids full router.refresh() while
226
+ // ensuring the UI stays in sync even if SSE events are missed.
227
+ //
228
+ // We derive a stable boolean so the interval isn't torn down on every node change.
229
+ const hasActiveFeature = nodes.some((n) => {
230
+ if (n.type !== 'featureNode') return false;
231
+ const data = n.data as FeatureNodeData;
232
+ return (
233
+ data.state === 'running' || data.state === 'action-required' || data.state === 'creating'
234
+ );
235
+ });
236
+
237
+ useEffect(() => {
238
+ if (!hasActiveFeature) return;
239
+
240
+ const interval = setInterval(async () => {
241
+ try {
242
+ const { nodes: serverNodes } = await fetchGraphData();
243
+ setNodes((currentNodes) => {
244
+ const serverById = new Map(serverNodes.map((n) => [n.id, n]));
245
+ let changed = false;
246
+
247
+ const merged = currentNodes.map((node) => {
248
+ const serverNode = serverById.get(node.id);
249
+ if (!serverNode || node.type !== 'featureNode') return node;
250
+ const currentData = node.data as FeatureNodeData;
251
+ const serverData = serverNode.data as FeatureNodeData;
252
+
253
+ // Only update if server data has different state or lifecycle
254
+ if (
255
+ currentData.state === serverData.state &&
256
+ currentData.lifecycle === serverData.lifecycle
257
+ ) {
258
+ return node;
259
+ }
260
+
261
+ changed = true;
262
+ return {
263
+ ...node,
264
+ data: {
265
+ ...currentData,
266
+ state: serverData.state,
267
+ lifecycle: serverData.lifecycle,
268
+ progress: serverData.progress,
269
+ ...(serverData.errorMessage && { errorMessage: serverData.errorMessage }),
270
+ ...(serverData.runtime && { runtime: serverData.runtime }),
271
+ ...(serverData.agentType && { agentType: serverData.agentType }),
272
+ ...(serverData.pr && { pr: serverData.pr }),
273
+ ...(serverData.blockedBy && { blockedBy: serverData.blockedBy }),
274
+ },
275
+ };
276
+ });
277
+
278
+ // Add any new server nodes that don't exist on client
279
+ const clientIds = new Set(currentNodes.map((n) => n.id));
280
+ const newNodes = serverNodes.filter((n) => !clientIds.has(n.id));
281
+ if (newNodes.length > 0) {
282
+ changed = true;
283
+ }
284
+
285
+ return changed || newNodes.length > 0 ? [...merged, ...newNodes] : currentNodes;
286
+ });
287
+ } catch {
288
+ // Silently ignore polling errors — SSE is the primary mechanism
289
+ }
290
+ }, 5_000);
291
+
292
+ return () => clearInterval(interval);
293
+ }, [hasActiveFeature]);
294
+
222
295
  const onNodesChange = useCallback((changes: NodeChange<CanvasNodeType>[]) => {
223
- setNodes((ns) => applyNodeChanges(changes, ns));
296
+ // Filter out 'replace' changes — in controlled mode these come from
297
+ // React Flow's StoreUpdater syncing the nodes prop back into state.
298
+ // Applying them creates a circular update loop (nodes → enrichedNodes →
299
+ // StoreUpdater → onNodesChange → setNodes → nodes → …) that both causes
300
+ // excessive re-renders and overwrites SSE-driven state changes with stale data.
301
+ const applicable = changes.filter((c) => c.type !== 'replace');
302
+ if (applicable.length > 0) {
303
+ setNodes((ns) => applyNodeChanges(applicable, ns));
304
+ }
224
305
  }, []);
225
306
 
226
307
  const handleConnect = useCallback(
@@ -1,7 +1,7 @@
1
1
  'use client';
2
2
 
3
3
  import { useCallback, useMemo } from 'react';
4
- import { ReactFlow, Background, Controls, ReactFlowProvider } from '@xyflow/react';
4
+ import { ReactFlow, Background, Controls } from '@xyflow/react';
5
5
  import type { Connection, Edge, NodeChange } from '@xyflow/react';
6
6
  import { Plus } from 'lucide-react';
7
7
  import { Button } from '@/components/ui/button';
@@ -163,28 +163,26 @@ export function FeaturesCanvas({
163
163
  data-no-drawer-close
164
164
  className="pointer-events-auto h-full w-full"
165
165
  >
166
- <ReactFlowProvider>
167
- <ReactFlow
168
- nodes={enrichedNodes}
169
- edges={edges}
170
- nodeTypes={nodeTypes}
171
- edgeTypes={edgeTypes}
172
- isValidConnection={isValidConnection}
173
- onConnect={onConnect}
174
- onNodesChange={onNodesChange}
175
- onNodeClick={onNodeClick}
176
- onPaneClick={onPaneClick}
177
- onMoveStart={onCanvasDrag}
178
- defaultViewport={{ x: 30, y: 30, zoom: 0.85 }}
179
- nodesDraggable={false}
180
- nodesConnectable={false}
181
- elementsSelectable={false}
182
- >
183
- <Background />
184
- <Controls />
185
- {toolbar}
186
- </ReactFlow>
187
- </ReactFlowProvider>
166
+ <ReactFlow
167
+ nodes={enrichedNodes}
168
+ edges={edges}
169
+ nodeTypes={nodeTypes}
170
+ edgeTypes={edgeTypes}
171
+ isValidConnection={isValidConnection}
172
+ onConnect={onConnect}
173
+ onNodesChange={onNodesChange}
174
+ onNodeClick={onNodeClick}
175
+ onPaneClick={onPaneClick}
176
+ onMoveStart={onCanvasDrag}
177
+ defaultViewport={{ x: 30, y: 30, zoom: 0.85 }}
178
+ nodesDraggable={false}
179
+ nodesConnectable={false}
180
+ elementsSelectable={false}
181
+ >
182
+ <Background />
183
+ <Controls />
184
+ {toolbar}
185
+ </ReactFlow>
188
186
  </div>
189
187
  );
190
188
  }
@@ -1,4 +1,4 @@
1
1
  export { FeaturesCanvas, type FeaturesCanvasProps } from './features-canvas';
2
2
  export { ToolsPageClient, type ToolsPageClientProps } from './tools';
3
3
  export { ToolCard, type ToolCardProps } from './tools';
4
- export { InstallInstructions, type InstallInstructionsProps } from './tools';
4
+ export { ToolDetailDrawer, type ToolDetailDrawerProps } from './tools';
@@ -1,3 +1,3 @@
1
1
  export { ToolsPageClient, type ToolsPageClientProps } from './tools-page-client';
2
2
  export { ToolCard, type ToolCardProps } from './tool-card';
3
- export { InstallInstructions, type InstallInstructionsProps } from './install-instructions';
3
+ export { ToolDetailDrawer, type ToolDetailDrawerProps } from './tool-detail-drawer';
@@ -16,6 +16,9 @@ const installedIdeTool: ToolItem = {
16
16
  documentationUrl: 'https://cursor.sh',
17
17
  installCommand: 'brew install --cask cursor',
18
18
  status: { status: 'available', toolName: 'cursor' },
19
+ author: 'Anysphere',
20
+ website: 'https://cursor.com',
21
+ platforms: ['linux', 'darwin', 'win32'],
19
22
  };
20
23
 
21
24
  const installedNoLaunchTool: ToolItem = {
@@ -32,6 +35,9 @@ const installedNoLaunchTool: ToolItem = {
32
35
  documentationUrl: 'https://claude.ai',
33
36
  installCommand: 'npm install -g @anthropic-ai/claude-code',
34
37
  status: { status: 'available', toolName: 'claude-code' },
38
+ author: 'Anthropic',
39
+ website: 'https://claude.ai/code',
40
+ platforms: ['linux', 'darwin'],
35
41
  };
36
42
 
37
43
  const missingAutoInstallTool: ToolItem = {
@@ -48,6 +54,9 @@ const missingAutoInstallTool: ToolItem = {
48
54
  documentationUrl: 'https://aider.chat',
49
55
  installCommand: 'pip install aider-chat',
50
56
  status: { status: 'missing', toolName: 'aider' },
57
+ author: 'Paul Gauthier',
58
+ website: 'https://aider.chat',
59
+ platforms: ['linux', 'darwin', 'win32'],
51
60
  };
52
61
 
53
62
  const missingManualTool: ToolItem = {
@@ -64,6 +73,9 @@ const missingManualTool: ToolItem = {
64
73
  documentationUrl: 'https://code.visualstudio.com',
65
74
  installCommand: 'brew install --cask visual-studio-code',
66
75
  status: { status: 'missing', toolName: 'vscode' },
76
+ author: 'Microsoft',
77
+ website: 'https://code.visualstudio.com',
78
+ platforms: ['linux', 'darwin', 'win32'],
67
79
  };
68
80
 
69
81
  const cliAgentTool: ToolItem = {
@@ -80,6 +92,9 @@ const cliAgentTool: ToolItem = {
80
92
  documentationUrl: 'https://cursor.sh',
81
93
  installCommand: 'curl https://cursor.com/install -fsS | bash',
82
94
  status: { status: 'available', toolName: 'cursor-cli' },
95
+ author: 'Anysphere',
96
+ website: 'https://cursor.com',
97
+ platforms: ['linux', 'darwin', 'win32'],
83
98
  };
84
99
 
85
100
  const vcsTool: ToolItem = {
@@ -96,6 +111,9 @@ const vcsTool: ToolItem = {
96
111
  documentationUrl: 'https://cli.github.com/manual/',
97
112
  installCommand: 'brew install gh',
98
113
  status: { status: 'available', toolName: 'gh' },
114
+ author: 'GitHub',
115
+ website: 'https://cli.github.com',
116
+ platforms: ['linux', 'darwin', 'win32'],
99
117
  };
100
118
 
101
119
  const meta: Meta<typeof ToolCard> = {