@shepai/cli 1.124.0-pr401.74b2155 → 1.124.0-pr402.06ada70

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 (254) hide show
  1. package/dist/packages/core/src/application/ports/output/services/deployment-service.interface.d.ts +13 -2
  2. package/dist/packages/core/src/application/ports/output/services/deployment-service.interface.d.ts.map +1 -1
  3. package/dist/packages/core/src/infrastructure/di/container.d.ts.map +1 -1
  4. package/dist/packages/core/src/infrastructure/di/container.js +2 -0
  5. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/040-create-dev-servers-table.d.ts +21 -0
  6. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/040-create-dev-servers-table.d.ts.map +1 -0
  7. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/040-create-dev-servers-table.js +32 -0
  8. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/merge/ci-watch-fix-loop.d.ts.map +1 -1
  9. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/merge/ci-watch-fix-loop.js +9 -0
  10. package/dist/packages/core/src/infrastructure/services/deployment/deployment.service.d.ts +24 -14
  11. package/dist/packages/core/src/infrastructure/services/deployment/deployment.service.d.ts.map +1 -1
  12. package/dist/packages/core/src/infrastructure/services/deployment/deployment.service.js +203 -31
  13. package/dist/packages/core/src/infrastructure/services/deployment/parse-port.d.ts +0 -6
  14. package/dist/packages/core/src/infrastructure/services/deployment/parse-port.d.ts.map +1 -1
  15. package/dist/packages/core/src/infrastructure/services/deployment/parse-port.js +6 -1
  16. package/dist/packages/core/src/infrastructure/services/git/git-pr.service.d.ts.map +1 -1
  17. package/dist/packages/core/src/infrastructure/services/git/git-pr.service.js +7 -2
  18. package/dist/src/presentation/web/app/actions/deploy-feature.js +1 -1
  19. package/dist/src/presentation/web/app/actions/deploy-repository.js +1 -1
  20. package/dist/src/presentation/web/components/common/control-center-drawer/repository-drawer-client.d.ts.map +1 -1
  21. package/dist/src/presentation/web/components/common/control-center-drawer/repository-drawer-client.js +3 -20
  22. package/dist/src/presentation/web/components/common/repository-node/repository-drawer.d.ts.map +1 -1
  23. package/dist/src/presentation/web/components/common/repository-node/repository-drawer.js +2 -19
  24. package/dist/src/presentation/web/components/common/repository-node/repository-drawer.stories.d.ts +0 -5
  25. package/dist/src/presentation/web/components/common/repository-node/repository-drawer.stories.d.ts.map +1 -1
  26. package/dist/src/presentation/web/components/common/repository-node/repository-drawer.stories.js +9 -38
  27. package/dist/src/presentation/web/components/common/repository-node/repository-node.d.ts.map +1 -1
  28. package/dist/src/presentation/web/components/common/repository-node/repository-node.js +7 -4
  29. package/dist/src/presentation/web/components/features/control-center/use-control-center-state.d.ts.map +1 -1
  30. package/dist/src/presentation/web/components/features/control-center/use-control-center-state.js +12 -3
  31. package/dist/src/presentation/web/components/features/settings/notification-settings-section.d.ts.map +1 -1
  32. package/dist/src/presentation/web/components/features/settings/notification-settings-section.js +4 -8
  33. package/dist/src/presentation/web/components/features/settings/notification-settings-section.stories.js +3 -3
  34. package/dist/src/presentation/web/components/features/settings/settings-page-client.d.ts.map +1 -1
  35. package/dist/src/presentation/web/components/features/settings/settings-page-client.js +12 -37
  36. package/dist/src/presentation/web/components/features/settings/settings-page-client.stories.d.ts.map +1 -1
  37. package/dist/src/presentation/web/components/features/settings/settings-page-client.stories.js +2 -3
  38. package/dist/src/presentation/web/hooks/use-deploy-action.d.ts.map +1 -1
  39. package/dist/src/presentation/web/hooks/use-deploy-action.js +69 -10
  40. package/dist/src/presentation/web/lib/layout-with-dagre.js +3 -3
  41. package/dist/tsconfig.build.tsbuildinfo +1 -1
  42. package/package.json +1 -1
  43. package/web/.next/BUILD_ID +1 -1
  44. package/web/.next/build-manifest.json +2 -2
  45. package/web/.next/fallback-build-manifest.json +2 -2
  46. package/web/.next/prerender-manifest.json +3 -3
  47. package/web/.next/required-server-files.js +1 -1
  48. package/web/.next/required-server-files.json +1 -1
  49. package/web/.next/server/app/(dashboard)/@drawer/create/page/server-reference-manifest.json +57 -57
  50. package/web/.next/server/app/(dashboard)/@drawer/create/page.js +2 -2
  51. package/web/.next/server/app/(dashboard)/@drawer/create/page.js.nft.json +1 -1
  52. package/web/.next/server/app/(dashboard)/@drawer/create/page_client-reference-manifest.js +1 -1
  53. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page/server-reference-manifest.json +69 -69
  54. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page.js +2 -2
  55. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page.js.nft.json +1 -1
  56. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page_client-reference-manifest.js +1 -1
  57. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page/server-reference-manifest.json +69 -69
  58. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js +2 -2
  59. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js.nft.json +1 -1
  60. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page_client-reference-manifest.js +1 -1
  61. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page/server-reference-manifest.json +53 -53
  62. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js +2 -2
  63. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js.nft.json +1 -1
  64. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  65. package/web/.next/server/app/(dashboard)/create/page/server-reference-manifest.json +57 -57
  66. package/web/.next/server/app/(dashboard)/create/page.js +2 -2
  67. package/web/.next/server/app/(dashboard)/create/page.js.nft.json +1 -1
  68. package/web/.next/server/app/(dashboard)/create/page_client-reference-manifest.js +1 -1
  69. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page/server-reference-manifest.json +69 -69
  70. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page.js +2 -2
  71. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page.js.nft.json +1 -1
  72. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page_client-reference-manifest.js +1 -1
  73. package/web/.next/server/app/(dashboard)/feature/[featureId]/page/server-reference-manifest.json +69 -69
  74. package/web/.next/server/app/(dashboard)/feature/[featureId]/page.js +2 -2
  75. package/web/.next/server/app/(dashboard)/feature/[featureId]/page.js.nft.json +1 -1
  76. package/web/.next/server/app/(dashboard)/feature/[featureId]/page_client-reference-manifest.js +1 -1
  77. package/web/.next/server/app/(dashboard)/page/server-reference-manifest.json +53 -53
  78. package/web/.next/server/app/(dashboard)/page.js +2 -2
  79. package/web/.next/server/app/(dashboard)/page.js.nft.json +1 -1
  80. package/web/.next/server/app/(dashboard)/page_client-reference-manifest.js +1 -1
  81. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page/server-reference-manifest.json +53 -53
  82. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js +2 -2
  83. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js.nft.json +1 -1
  84. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  85. package/web/.next/server/app/_global-error.html +2 -2
  86. package/web/.next/server/app/_global-error.rsc +1 -1
  87. package/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  88. package/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  89. package/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  90. package/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  91. package/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  92. package/web/.next/server/app/_not-found/page/server-reference-manifest.json +1 -1
  93. package/web/.next/server/app/_not-found/page.js.nft.json +1 -1
  94. package/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  95. package/web/.next/server/app/settings/page/server-reference-manifest.json +6 -6
  96. package/web/.next/server/app/settings/page.js.nft.json +1 -1
  97. package/web/.next/server/app/settings/page_client-reference-manifest.js +1 -1
  98. package/web/.next/server/app/skills/page/server-reference-manifest.json +6 -6
  99. package/web/.next/server/app/skills/page.js +1 -2
  100. package/web/.next/server/app/skills/page.js.nft.json +1 -1
  101. package/web/.next/server/app/skills/page_client-reference-manifest.js +1 -1
  102. package/web/.next/server/app/tools/page/server-reference-manifest.json +6 -6
  103. package/web/.next/server/app/tools/page.js +1 -2
  104. package/web/.next/server/app/tools/page.js.nft.json +1 -1
  105. package/web/.next/server/app/tools/page_client-reference-manifest.js +1 -1
  106. package/web/.next/server/app/version/page/server-reference-manifest.json +1 -1
  107. package/web/.next/server/app/version/page.js.nft.json +1 -1
  108. package/web/.next/server/app/version/page_client-reference-manifest.js +1 -1
  109. package/web/.next/server/chunks/403f9_next_dist_esm_build_templates_app-route_370c43b1.js +1 -1
  110. package/web/.next/server/chunks/403f9_next_dist_esm_build_templates_app-route_370c43b1.js.map +1 -1
  111. package/web/.next/server/chunks/[root-of-the-server]__a402b567._.js +1 -1
  112. package/web/.next/server/chunks/ssr/{node_modules__pnpm_f9ac7604._.js → 403f9_next_d6c8d28d._.js} +2 -2
  113. package/web/.next/server/chunks/ssr/403f9_next_d6c8d28d._.js.map +1 -0
  114. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js +1 -1
  115. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js.map +1 -1
  116. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_fdfbf5cc.js +3 -0
  117. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_fdfbf5cc.js.map +1 -0
  118. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_d8fa0b5f.js +3 -0
  119. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_d8fa0b5f.js.map +1 -0
  120. package/web/.next/server/chunks/ssr/[root-of-the-server]__06fef644._.js +1 -1
  121. package/web/.next/server/chunks/ssr/{[root-of-the-server]__9e8b25ad._.js → [root-of-the-server]__248b9fc3._.js} +2 -2
  122. package/web/.next/server/chunks/ssr/{[root-of-the-server]__9e8b25ad._.js.map → [root-of-the-server]__248b9fc3._.js.map} +1 -1
  123. package/web/.next/server/chunks/ssr/[root-of-the-server]__357de47c._.js +4 -0
  124. package/web/.next/server/chunks/ssr/[root-of-the-server]__357de47c._.js.map +1 -0
  125. package/web/.next/server/chunks/ssr/[root-of-the-server]__56ecbe40._.js +3 -0
  126. package/web/.next/server/chunks/ssr/[root-of-the-server]__56ecbe40._.js.map +1 -0
  127. package/web/.next/server/chunks/ssr/[root-of-the-server]__67fe07fe._.js +4 -0
  128. package/web/.next/server/chunks/ssr/[root-of-the-server]__67fe07fe._.js.map +1 -0
  129. package/web/.next/server/chunks/ssr/[root-of-the-server]__68c2d48e._.js +3 -0
  130. package/web/.next/server/chunks/ssr/[root-of-the-server]__68c2d48e._.js.map +1 -0
  131. package/web/.next/server/chunks/ssr/[root-of-the-server]__6b17a22d._.js +1 -1
  132. package/web/.next/server/chunks/ssr/[root-of-the-server]__6b17a22d._.js.map +1 -1
  133. package/web/.next/server/chunks/ssr/[root-of-the-server]__6bb00d90._.js +2 -2
  134. package/web/.next/server/chunks/ssr/[root-of-the-server]__6bb00d90._.js.map +1 -1
  135. package/web/.next/server/chunks/ssr/[root-of-the-server]__804c006d._.js +1 -1
  136. package/web/.next/server/chunks/ssr/[root-of-the-server]__804c006d._.js.map +1 -1
  137. package/web/.next/server/chunks/ssr/[root-of-the-server]__8c553503._.js +2 -2
  138. package/web/.next/server/chunks/ssr/[root-of-the-server]__a50a7e39._.js +4 -0
  139. package/web/.next/server/chunks/ssr/[root-of-the-server]__a50a7e39._.js.map +1 -0
  140. package/web/.next/server/chunks/ssr/{[root-of-the-server]__ce6057f6._.js → [root-of-the-server]__dfc367f2._.js} +2 -2
  141. package/web/.next/server/chunks/ssr/{[root-of-the-server]__ce6057f6._.js.map → [root-of-the-server]__dfc367f2._.js.map} +1 -1
  142. package/web/.next/server/chunks/ssr/{[root-of-the-server]__7cbda1ea._.js → [root-of-the-server]__e7f61cc6._.js} +2 -2
  143. package/web/.next/server/chunks/ssr/{[root-of-the-server]__7cbda1ea._.js.map → [root-of-the-server]__e7f61cc6._.js.map} +1 -1
  144. package/web/.next/server/chunks/ssr/{[root-of-the-server]__aed1d6f8._.js → [root-of-the-server]__fe48d2dc._.js} +2 -2
  145. package/web/.next/server/chunks/ssr/{[root-of-the-server]__aed1d6f8._.js.map → [root-of-the-server]__fe48d2dc._.js.map} +1 -1
  146. package/web/.next/server/chunks/ssr/_2f6f48b8._.js +1 -1
  147. package/web/.next/server/chunks/ssr/_2f6f48b8._.js.map +1 -1
  148. package/web/.next/server/chunks/ssr/_7dca1882._.js +3 -0
  149. package/web/.next/server/chunks/ssr/_7dca1882._.js.map +1 -0
  150. package/web/.next/server/chunks/ssr/{_0e506641._.js → _918887c5._.js} +2 -2
  151. package/web/.next/server/chunks/ssr/_918887c5._.js.map +1 -0
  152. package/web/.next/server/chunks/ssr/_a2eff93a._.js +3 -0
  153. package/web/.next/server/chunks/ssr/_a2eff93a._.js.map +1 -0
  154. package/web/.next/server/chunks/ssr/{_1bb131c4._.js → _d4b20e29._.js} +2 -2
  155. package/web/.next/server/chunks/ssr/_d4b20e29._.js.map +1 -0
  156. package/web/.next/server/chunks/ssr/{_b86eec90._.js → _d7f927ec._.js} +2 -2
  157. package/web/.next/server/chunks/ssr/_d7f927ec._.js.map +1 -0
  158. package/web/.next/server/chunks/ssr/_e9703421._.js +3 -0
  159. package/web/.next/server/chunks/ssr/_e9703421._.js.map +1 -0
  160. package/web/.next/server/chunks/ssr/{_f605354c._.js → _f1a649e3._.js} +3 -3
  161. package/web/.next/server/chunks/ssr/_f1a649e3._.js.map +1 -0
  162. package/web/.next/server/chunks/ssr/_f39a1adb._.js +3 -0
  163. package/web/.next/server/chunks/ssr/{_135edb9c._.js.map → _f39a1adb._.js.map} +1 -1
  164. package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_settings_settings-page-client_tsx_6ed9d5f8._.js +1 -1
  165. package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_settings_settings-page-client_tsx_6ed9d5f8._.js.map +1 -1
  166. package/web/.next/server/chunks/ssr/f3a1f_components_common_control-center-drawer_repository-drawer-client_tsx_39a00c03._.js +1 -1
  167. package/web/.next/server/chunks/ssr/f3a1f_components_common_control-center-drawer_repository-drawer-client_tsx_39a00c03._.js.map +1 -1
  168. package/web/.next/server/chunks/ssr/node_modules__pnpm_bc66dcc6._.js +3 -0
  169. package/web/.next/server/chunks/ssr/node_modules__pnpm_bc66dcc6._.js.map +1 -0
  170. package/web/.next/server/chunks/ssr/src_presentation_web_073917db._.js +3 -0
  171. package/web/.next/server/chunks/ssr/src_presentation_web_073917db._.js.map +1 -0
  172. package/web/.next/server/chunks/ssr/src_presentation_web_9db47db7._.js +5 -0
  173. package/web/.next/server/chunks/ssr/{src_presentation_web_5f039db1._.js.map → src_presentation_web_9db47db7._.js.map} +1 -1
  174. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_f66cd328.js +3 -0
  175. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_f66cd328.js.map +1 -0
  176. package/web/.next/server/chunks/ssr/src_presentation_web_ca99d62d._.js +1 -1
  177. package/web/.next/server/chunks/ssr/src_presentation_web_ca99d62d._.js.map +1 -1
  178. package/web/.next/server/chunks/ssr/src_presentation_web_components_bf50c527._.js +1 -1
  179. package/web/.next/server/chunks/ssr/src_presentation_web_components_bf50c527._.js.map +1 -1
  180. package/web/.next/server/chunks/ssr/src_presentation_web_components_de814675._.js +1 -1
  181. package/web/.next/server/chunks/ssr/src_presentation_web_components_de814675._.js.map +1 -1
  182. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js +1 -1
  183. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js.map +1 -1
  184. package/web/.next/server/chunks/ssr/src_presentation_web_ede4a227._.js +5 -0
  185. package/web/.next/server/chunks/ssr/{src_presentation_web_c4337169._.js.map → src_presentation_web_ede4a227._.js.map} +1 -1
  186. package/web/.next/server/pages/500.html +2 -2
  187. package/web/.next/server/server-reference-manifest.js +1 -1
  188. package/web/.next/server/server-reference-manifest.json +325 -325
  189. package/web/.next/static/chunks/01ba448cf76c6014.js +1 -0
  190. package/web/.next/static/chunks/{fb8b8be474a3e2b5.js → 04f47be1504521fc.js} +1 -1
  191. package/web/.next/static/chunks/{a7231c3b616020d8.js → 0a514695ca5fabc3.js} +2 -2
  192. package/web/.next/static/chunks/1be7ac7a24009333.css +1 -0
  193. package/web/.next/static/chunks/28f1dddebda55af2.js +1 -0
  194. package/web/.next/static/chunks/2ee4a1a94f6001ea.js +1 -0
  195. package/web/.next/static/chunks/{683f1449a7acbe69.js → 33d7958650742d27.js} +2 -2
  196. package/web/.next/static/chunks/37ada233462bcaec.js +11 -0
  197. package/web/.next/static/chunks/{ffcc006639ba2fd8.js → 4443ee9c7733399b.js} +1 -1
  198. package/web/.next/static/chunks/469f49ae02e8a1f6.js +1 -0
  199. package/web/.next/static/chunks/54481c140fd8761a.js +1 -0
  200. package/web/.next/static/chunks/b609272225ffb749.js +1 -0
  201. package/web/.next/static/chunks/b70dd4985a814b27.js +1 -0
  202. package/web/.next/static/chunks/e651e1ec05e5a806.js +1 -0
  203. package/web/.next/static/chunks/eb9841ec4d80af01.js +1 -0
  204. package/web/.next/static/chunks/f2c96db74a878fa1.js +1 -0
  205. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_f30d0343.js +0 -3
  206. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_f30d0343.js.map +0 -1
  207. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_9f1775bb.js +0 -3
  208. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_9f1775bb.js.map +0 -1
  209. package/web/.next/server/chunks/ssr/[root-of-the-server]__14664e9b._.js +0 -4
  210. package/web/.next/server/chunks/ssr/[root-of-the-server]__14664e9b._.js.map +0 -1
  211. package/web/.next/server/chunks/ssr/[root-of-the-server]__4993a47c._.js +0 -3
  212. package/web/.next/server/chunks/ssr/[root-of-the-server]__4993a47c._.js.map +0 -1
  213. package/web/.next/server/chunks/ssr/[root-of-the-server]__545792ab._.js +0 -3
  214. package/web/.next/server/chunks/ssr/[root-of-the-server]__545792ab._.js.map +0 -1
  215. package/web/.next/server/chunks/ssr/[root-of-the-server]__a7de2711._.js +0 -4
  216. package/web/.next/server/chunks/ssr/[root-of-the-server]__a7de2711._.js.map +0 -1
  217. package/web/.next/server/chunks/ssr/_0e506641._.js.map +0 -1
  218. package/web/.next/server/chunks/ssr/_109ee019._.js +0 -3
  219. package/web/.next/server/chunks/ssr/_109ee019._.js.map +0 -1
  220. package/web/.next/server/chunks/ssr/_135edb9c._.js +0 -3
  221. package/web/.next/server/chunks/ssr/_1bb131c4._.js.map +0 -1
  222. package/web/.next/server/chunks/ssr/_5d43c3db._.js +0 -3
  223. package/web/.next/server/chunks/ssr/_5d43c3db._.js.map +0 -1
  224. package/web/.next/server/chunks/ssr/_a161be0a._.js +0 -3
  225. package/web/.next/server/chunks/ssr/_a161be0a._.js.map +0 -1
  226. package/web/.next/server/chunks/ssr/_b86eec90._.js.map +0 -1
  227. package/web/.next/server/chunks/ssr/_cc77a143._.js +0 -3
  228. package/web/.next/server/chunks/ssr/_cc77a143._.js.map +0 -1
  229. package/web/.next/server/chunks/ssr/_f605354c._.js.map +0 -1
  230. package/web/.next/server/chunks/ssr/node_modules__pnpm_70f6d54e._.js +0 -3
  231. package/web/.next/server/chunks/ssr/node_modules__pnpm_70f6d54e._.js.map +0 -1
  232. package/web/.next/server/chunks/ssr/node_modules__pnpm_f9ac7604._.js.map +0 -1
  233. package/web/.next/server/chunks/ssr/src_presentation_web_5f039db1._.js +0 -5
  234. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_2a52b697.js +0 -3
  235. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_2a52b697.js.map +0 -1
  236. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_skills_page_actions_1fa8042e.js +0 -3
  237. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_skills_page_actions_1fa8042e.js.map +0 -1
  238. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_tools_page_actions_24684200.js +0 -3
  239. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_tools_page_actions_24684200.js.map +0 -1
  240. package/web/.next/server/chunks/ssr/src_presentation_web_c4337169._.js +0 -5
  241. package/web/.next/static/chunks/15e868c5ed24e68d.js +0 -1
  242. package/web/.next/static/chunks/1dd878b6feb55d2e.js +0 -1
  243. package/web/.next/static/chunks/44f74b62f897f41c.css +0 -1
  244. package/web/.next/static/chunks/8f09849a5cb49bc8.js +0 -1
  245. package/web/.next/static/chunks/94861aa7270facbd.js +0 -1
  246. package/web/.next/static/chunks/a09c0c629f88ee12.js +0 -1
  247. package/web/.next/static/chunks/ac7251026c1e2cdf.js +0 -1
  248. package/web/.next/static/chunks/c4e46fbe479ebd88.js +0 -11
  249. package/web/.next/static/chunks/e2ef95d904c360f3.js +0 -1
  250. package/web/.next/static/chunks/e39cee9f73d1fda2.js +0 -1
  251. package/web/.next/static/chunks/efb06f2eab920f11.js +0 -1
  252. /package/web/.next/static/{FEBom5Y7caLa2hXBqPiA- → FXJ9jqgleHlSoq4JKo32G}/_buildManifest.js +0 -0
  253. /package/web/.next/static/{FEBom5Y7caLa2hXBqPiA- → FXJ9jqgleHlSoq4JKo32G}/_clientMiddlewareManifest.json +0 -0
  254. /package/web/.next/static/{FEBom5Y7caLa2hXBqPiA- → FXJ9jqgleHlSoq4JKo32G}/_ssgManifest.js +0 -0
@@ -38,12 +38,17 @@ const PORT_PATTERNS = [
38
38
  * @param line - A single line of process output
39
39
  * @returns The detected URL string, or null if no URL/port was found
40
40
  */
41
+ // Strip ANSI escape codes (colors, cursor movement, etc.)
42
+ // eslint-disable-next-line no-control-regex
43
+ const ANSI_REGEX = /\x1b\[[0-9;]*[a-zA-Z]/g;
41
44
  export function parsePort(line) {
42
45
  if (!line?.trim()) {
43
46
  return null;
44
47
  }
48
+ // Strip ANSI escape codes before matching — dev servers often emit colored output
49
+ const clean = line.replace(ANSI_REGEX, '');
45
50
  for (const { regex, extract } of PORT_PATTERNS) {
46
- const match = line.match(regex);
51
+ const match = clean.match(regex);
47
52
  if (match) {
48
53
  return extract(match);
49
54
  }
@@ -1 +1 @@
1
- {"version":3,"file":"git-pr.service.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/src/infrastructure/services/git/git-pr.service.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"git-pr.service.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/src/infrastructure/services/git/git-pr.service.ts"],"names":[],"mappings":"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"}
@@ -308,15 +308,19 @@ let GitPrService = class GitPrService {
308
308
  }
309
309
  }
310
310
  async watchCi(cwd, branch, timeoutMs, intervalSeconds) {
311
+ // Resolve the latest run for the branch BEFORE the try/catch so the
312
+ // runUrl is available in both success and failure return paths.
313
+ let runUrl;
311
314
  try {
312
315
  // gh run watch requires a run ID — it does not support --branch.
313
316
  // First, resolve the latest run ID for the branch via gh run list.
314
- const { stdout: listOut } = await this.execFile('gh', ['run', 'list', '--branch', branch, '--json', 'databaseId', '--limit', '1'], { cwd });
317
+ const { stdout: listOut } = await this.execFile('gh', ['run', 'list', '--branch', branch, '--json', 'databaseId,url', '--limit', '1'], { cwd });
315
318
  const runs = JSON.parse(listOut);
316
319
  if (runs.length === 0 || !runs[0].databaseId) {
317
320
  return { status: 'pending' };
318
321
  }
319
322
  const runId = String(runs[0].databaseId);
323
+ runUrl = runs[0].url;
320
324
  const interval = intervalSeconds ?? 30;
321
325
  const args = [
322
326
  'run',
@@ -335,6 +339,7 @@ let GitPrService = class GitPrService {
335
339
  // If we reach here (no exception), CI passed — no need for fragile stdout parsing.
336
340
  return {
337
341
  status: 'success',
342
+ runUrl,
338
343
  logExcerpt: stdout.trim(),
339
344
  };
340
345
  }
@@ -356,7 +361,7 @@ let GitPrService = class GitPrService {
356
361
  // Build a useful log excerpt from stdout/stderr if available
357
362
  const errObj = error;
358
363
  const parts = [errObj.stdout, errObj.stderr, message].filter(Boolean);
359
- return { status: 'failure', logExcerpt: parts.join('\n').trim() };
364
+ return { status: 'failure', runUrl, logExcerpt: parts.join('\n').trim() };
360
365
  }
361
366
  throw new GitPrError(message, GitPrErrorCode.GIT_ERROR, cause);
362
367
  }
@@ -27,7 +27,7 @@ export async function deployFeature(featureId) {
27
27
  }
28
28
  log.info('worktree path exists, calling deploymentService.start()');
29
29
  const deploymentService = resolve('IDeploymentService');
30
- deploymentService.start(featureId, worktreePath);
30
+ deploymentService.start(featureId, worktreePath, 'feature');
31
31
  log.info('start() returned successfully — state=Booting');
32
32
  return { success: true, state: DeploymentState.Booting };
33
33
  }
@@ -18,7 +18,7 @@ export async function deployRepository(repositoryPath) {
18
18
  }
19
19
  log.info('directory exists, calling deploymentService.start()');
20
20
  const deploymentService = resolve('IDeploymentService');
21
- deploymentService.start(repositoryPath, repositoryPath);
21
+ deploymentService.start(repositoryPath, repositoryPath, 'repository');
22
22
  log.info('start() returned successfully — state=Booting');
23
23
  return { success: true, state: DeploymentState.Booting };
24
24
  }
@@ -1 +1 @@
1
- {"version":3,"file":"repository-drawer-client.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/control-center-drawer/repository-drawer-client.tsx"],"names":[],"mappings":"AAqBA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,qCAAqC,CAAC;AAE9E,MAAM,WAAW,2BAA2B;IAC1C,IAAI,EAAE,kBAAkB,CAAC;CAC1B;AAcD,wBAAgB,sBAAsB,CAAC,EAAE,IAAI,EAAE,EAAE,2BAA2B,2CAoL3E"}
1
+ {"version":3,"file":"repository-drawer-client.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/control-center-drawer/repository-drawer-client.tsx"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,qCAAqC,CAAC;AAE9E,MAAM,WAAW,2BAA2B;IAC1C,IAAI,EAAE,kBAAkB,CAAC;CAC1B;AAED,wBAAgB,sBAAsB,CAAC,EAAE,IAAI,EAAE,EAAE,2BAA2B,2CAmF3E"}
@@ -1,30 +1,14 @@
1
1
  'use client';
2
- import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
3
  import { useCallback } from 'react';
4
4
  import { useRouter, usePathname } from 'next/navigation';
5
- import { Code2, Terminal, FolderOpen, GitBranch, GitCommitHorizontal, User, ArrowDown, Clock, } from 'lucide-react';
5
+ import { Code2, Terminal, FolderOpen } from 'lucide-react';
6
6
  import { BaseDrawer } from '../../common/base-drawer/index.js';
7
7
  import { ActionButton } from '../../common/action-button/index.js';
8
8
  import { DrawerTitle, DrawerDescription } from '../../ui/drawer.js';
9
9
  import { Separator } from '../../ui/separator.js';
10
- import { Badge } from '../../ui/badge.js';
11
10
  import { useRepositoryActions } from '../../common/repository-node/use-repository-actions.js';
12
11
  import { useFeatureFlags } from '../../../hooks/feature-flags-context.js';
13
- function formatRelativeTime(epochMs) {
14
- const diff = Date.now() - epochMs;
15
- const days = Math.floor(diff / (1000 * 60 * 60 * 24));
16
- if (days === 0)
17
- return 'Today';
18
- if (days === 1)
19
- return 'Yesterday';
20
- if (days < 30)
21
- return `${days} days ago`;
22
- const months = Math.floor(days / 30);
23
- if (months < 12)
24
- return `${months} month${months > 1 ? 's' : ''} ago`;
25
- const years = Math.floor(months / 12);
26
- return `${years} year${years > 1 ? 's' : ''} ago`;
27
- }
28
12
  export function RepositoryDrawerClient({ data }) {
29
13
  const featureFlags = useFeatureFlags();
30
14
  const router = useRouter();
@@ -42,6 +26,5 @@ export function RepositoryDrawerClient({ data }) {
42
26
  }
43
27
  : undefined;
44
28
  const header = (_jsxs("div", { "data-testid": "repository-drawer-header", children: [_jsx(DrawerTitle, { children: data.name }), data.repositoryPath ? (_jsx(DrawerDescription, { className: "truncate font-mono text-xs", children: data.repositoryPath })) : null] }));
45
- const hasGitInfo = !!(data.branch ?? data.commitMessage);
46
- return (_jsx(BaseDrawer, { open: isOpen, onClose: onClose, size: "md", modal: false, header: header, deployTarget: featureFlags.envDeploy ? repoDeployTarget : undefined, "data-testid": "repository-drawer", children: _jsxs("div", { className: "flex flex-1 flex-col overflow-y-auto", children: [hasGitInfo ? (_jsxs(_Fragment, { children: [_jsx(Separator, {}), _jsxs("div", { className: "flex flex-col gap-3 p-4", "data-testid": "repository-drawer-git-section", children: [_jsx("div", { className: "text-muted-foreground text-xs font-semibold tracking-wider", children: "GIT STATUS" }), _jsxs("div", { className: "flex flex-col gap-2", children: [data.branch ? (_jsxs("div", { className: "flex items-center justify-between gap-2", "data-testid": "repository-drawer-branch-row", children: [_jsxs("div", { className: "text-muted-foreground flex items-center gap-2 text-sm", children: [_jsx(GitBranch, { className: "h-4 w-4 shrink-0" }), _jsx("span", { className: "text-foreground font-medium", children: "Branch" })] }), _jsxs("div", { className: "flex items-center gap-2", children: [_jsx(Badge, { variant: "secondary", className: "font-mono text-xs", "data-testid": "repository-drawer-branch", children: data.branch }), data.behindCount != null && data.behindCount > 0 ? (_jsxs(Badge, { variant: "outline", className: "border-amber-500/40 bg-amber-50 text-xs text-amber-600 dark:bg-amber-900/20 dark:text-amber-400", "data-testid": "repository-drawer-behind", children: [_jsx(ArrowDown, { className: "mr-1 h-3 w-3" }), data.behindCount, " behind"] })) : null] })] })) : null, data.commitMessage ? (_jsx("div", { className: "bg-muted/50 rounded-lg p-3", "data-testid": "repository-drawer-commit-section", children: _jsxs("div", { className: "flex items-start gap-2", children: [_jsx(GitCommitHorizontal, { className: "text-muted-foreground mt-0.5 h-4 w-4 shrink-0" }), _jsxs("div", { className: "min-w-0 flex-1", children: [_jsx("p", { className: "text-foreground text-sm leading-snug font-medium", "data-testid": "repository-drawer-commit-message", children: data.commitMessage }), data.committer ? (_jsxs("div", { className: "text-muted-foreground mt-1 flex items-center gap-1 text-xs", children: [_jsx(User, { className: "h-3 w-3 shrink-0" }), _jsx("span", { "data-testid": "repository-drawer-committer", children: data.committer })] })) : null] })] }) })) : null] })] })] })) : null, data.repositoryPath ? (_jsxs(_Fragment, { children: [_jsx(Separator, {}), _jsxs("div", { className: "flex flex-col gap-3 p-4", children: [_jsx("div", { className: "text-muted-foreground text-xs font-semibold tracking-wider", children: "OPEN WITH" }), _jsxs("div", { className: "flex flex-col gap-2", children: [_jsx(ActionButton, { label: "Open in IDE", onClick: repoActions.openInIde, loading: repoActions.ideLoading, error: !!repoActions.ideError, icon: Code2, variant: "outline", size: "sm" }), _jsx(ActionButton, { label: "Open in Shell", onClick: repoActions.openInShell, loading: repoActions.shellLoading, error: !!repoActions.shellError, icon: Terminal, variant: "outline", size: "sm" }), _jsx(ActionButton, { label: "Open Folder", onClick: repoActions.openFolder, loading: repoActions.folderLoading, error: !!repoActions.folderError, icon: FolderOpen, variant: "outline", size: "sm" })] })] })] })) : null, data.createdAt ? (_jsxs(_Fragment, { children: [_jsx(Separator, {}), _jsxs("div", { className: "flex flex-col gap-3 p-4", "data-testid": "repository-drawer-metadata", children: [_jsx("div", { className: "text-muted-foreground text-xs font-semibold tracking-wider", children: "INFO" }), _jsxs("div", { className: "flex items-center justify-between text-sm", children: [_jsxs("div", { className: "text-muted-foreground flex items-center gap-2", children: [_jsx(Clock, { className: "h-4 w-4 shrink-0" }), _jsx("span", { children: "Added" })] }), _jsx("span", { className: "text-foreground text-xs", title: new Date(data.createdAt).toLocaleString(), "data-testid": "repository-drawer-created-at", children: formatRelativeTime(data.createdAt) })] })] })] })) : null] }) }));
29
+ return (_jsx(BaseDrawer, { open: isOpen, onClose: onClose, size: "md", modal: false, header: header, deployTarget: featureFlags.envDeploy ? repoDeployTarget : undefined, "data-testid": "repository-drawer", children: data.repositoryPath ? (_jsxs("div", { className: "flex-1 overflow-y-auto", children: [_jsx(Separator, {}), _jsxs("div", { className: "flex flex-col gap-3 p-4", children: [_jsx("div", { className: "text-muted-foreground text-xs font-semibold tracking-wider", children: "OPEN WITH" }), _jsxs("div", { className: "flex flex-col gap-2", children: [_jsx(ActionButton, { label: "Open in IDE", onClick: repoActions.openInIde, loading: repoActions.ideLoading, error: !!repoActions.ideError, icon: Code2, variant: "outline", size: "sm" }), _jsx(ActionButton, { label: "Open in Shell", onClick: repoActions.openInShell, loading: repoActions.shellLoading, error: !!repoActions.shellError, icon: Terminal, variant: "outline", size: "sm" }), _jsx(ActionButton, { label: "Open Folder", onClick: repoActions.openFolder, loading: repoActions.folderLoading, error: !!repoActions.folderError, icon: FolderOpen, variant: "outline", size: "sm" })] })] })] })) : null }));
47
30
  }
@@ -1 +1 @@
1
- {"version":3,"file":"repository-drawer.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/repository-node/repository-drawer.tsx"],"names":[],"mappings":"AAkBA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAGnE,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,kBAAkB,GAAG,IAAI,CAAC;IAChC,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB;AAcD,wBAAgB,gBAAgB,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,qBAAqB,2CAsLxE"}
1
+ {"version":3,"file":"repository-drawer.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/repository-node/repository-drawer.tsx"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAGnE,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,kBAAkB,GAAG,IAAI,CAAC;IAChC,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB;AAED,wBAAgB,gBAAgB,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,qBAAqB,2CA+ExE"}
@@ -1,39 +1,22 @@
1
1
  'use client';
2
2
  import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
3
3
  import { useCallback } from 'react';
4
- import { Code2, Terminal, FolderOpen, GitBranch, GitCommitHorizontal, User, ArrowDown, Clock, } from 'lucide-react';
4
+ import { Code2, Terminal, FolderOpen } from 'lucide-react';
5
5
  import { BaseDrawer } from '../../common/base-drawer/index.js';
6
6
  import { DrawerTitle, DrawerDescription } from '../../ui/drawer.js';
7
7
  import { Separator } from '../../ui/separator.js';
8
- import { Badge } from '../../ui/badge.js';
9
8
  import { ActionButton } from '../../common/action-button/index.js';
10
9
  import { useRepositoryActions } from './use-repository-actions.js';
11
- function formatRelativeTime(epochMs) {
12
- const diff = Date.now() - epochMs;
13
- const days = Math.floor(diff / (1000 * 60 * 60 * 24));
14
- if (days === 0)
15
- return 'Today';
16
- if (days === 1)
17
- return 'Yesterday';
18
- if (days < 30)
19
- return `${days} days ago`;
20
- const months = Math.floor(days / 30);
21
- if (months < 12)
22
- return `${months} month${months > 1 ? 's' : ''} ago`;
23
- const years = Math.floor(months / 12);
24
- return `${years} year${years > 1 ? 's' : ''} ago`;
25
- }
26
10
  export function RepositoryDrawer({ data, onClose }) {
27
11
  const handleClose = useCallback(() => {
28
12
  onClose();
29
13
  }, [onClose]);
30
14
  const actions = useRepositoryActions(data?.repositoryPath ? { repositoryPath: data.repositoryPath } : null);
31
- const hasGitInfo = !!(data?.branch ?? data?.commitMessage);
32
15
  return (_jsx(BaseDrawer, { open: data !== null, onClose: handleClose, size: "md", modal: false, "data-testid": "repository-drawer", deployTarget: data?.repositoryPath
33
16
  ? {
34
17
  targetId: data.repositoryPath,
35
18
  targetType: 'repository',
36
19
  repositoryPath: data.repositoryPath,
37
20
  }
38
- : undefined, header: data ? (_jsxs("div", { "data-testid": "repository-drawer-header", children: [_jsx(DrawerTitle, { children: data.name }), data.repositoryPath ? (_jsx(DrawerDescription, { className: "truncate font-mono text-xs", children: data.repositoryPath })) : null] })) : undefined, children: data ? (_jsxs("div", { className: "flex flex-1 flex-col overflow-y-auto", children: [hasGitInfo ? (_jsxs(_Fragment, { children: [_jsx(Separator, {}), _jsxs("div", { className: "flex flex-col gap-3 p-4", "data-testid": "repository-drawer-git-section", children: [_jsx("div", { className: "text-muted-foreground text-xs font-semibold tracking-wider", children: "GIT STATUS" }), _jsxs("div", { className: "flex flex-col gap-2", children: [data.branch ? (_jsxs("div", { className: "flex items-center justify-between gap-2", "data-testid": "repository-drawer-branch-row", children: [_jsxs("div", { className: "text-muted-foreground flex items-center gap-2 text-sm", children: [_jsx(GitBranch, { className: "h-4 w-4 shrink-0" }), _jsx("span", { className: "text-foreground font-medium", children: "Branch" })] }), _jsxs("div", { className: "flex items-center gap-2", children: [_jsx(Badge, { variant: "secondary", className: "font-mono text-xs", "data-testid": "repository-drawer-branch", children: data.branch }), data.behindCount != null && data.behindCount > 0 ? (_jsxs(Badge, { variant: "outline", className: "border-amber-500/40 bg-amber-50 text-xs text-amber-600 dark:bg-amber-900/20 dark:text-amber-400", "data-testid": "repository-drawer-behind", children: [_jsx(ArrowDown, { className: "mr-1 h-3 w-3" }), data.behindCount, " behind"] })) : null] })] })) : null, data.commitMessage ? (_jsx("div", { className: "bg-muted/50 rounded-lg p-3", "data-testid": "repository-drawer-commit-section", children: _jsxs("div", { className: "flex items-start gap-2", children: [_jsx(GitCommitHorizontal, { className: "text-muted-foreground mt-0.5 h-4 w-4 shrink-0" }), _jsxs("div", { className: "min-w-0 flex-1", children: [_jsx("p", { className: "text-foreground text-sm leading-snug font-medium", "data-testid": "repository-drawer-commit-message", children: data.commitMessage }), data.committer ? (_jsxs("div", { className: "text-muted-foreground mt-1 flex items-center gap-1 text-xs", children: [_jsx(User, { className: "h-3 w-3 shrink-0" }), _jsx("span", { "data-testid": "repository-drawer-committer", children: data.committer })] })) : null] })] }) })) : null] })] })] })) : null, data.repositoryPath ? (_jsxs(_Fragment, { children: [_jsx(Separator, {}), _jsxs("div", { className: "flex flex-col gap-3 p-4", children: [_jsx("div", { className: "text-muted-foreground text-xs font-semibold tracking-wider", children: "OPEN WITH" }), _jsxs("div", { className: "flex flex-col gap-2", children: [_jsx(ActionButton, { label: "Open in IDE", onClick: actions.openInIde, loading: actions.ideLoading, error: !!actions.ideError, icon: Code2, variant: "outline", size: "sm" }), _jsx(ActionButton, { label: "Open in Shell", onClick: actions.openInShell, loading: actions.shellLoading, error: !!actions.shellError, icon: Terminal, variant: "outline", size: "sm" }), _jsx(ActionButton, { label: "Open Folder", onClick: actions.openFolder, loading: actions.folderLoading, error: !!actions.folderError, icon: FolderOpen, variant: "outline", size: "sm" })] })] })] })) : null, data.createdAt ? (_jsxs(_Fragment, { children: [_jsx(Separator, {}), _jsxs("div", { className: "flex flex-col gap-3 p-4", "data-testid": "repository-drawer-metadata", children: [_jsx("div", { className: "text-muted-foreground text-xs font-semibold tracking-wider", children: "INFO" }), _jsxs("div", { className: "flex items-center justify-between text-sm", children: [_jsxs("div", { className: "text-muted-foreground flex items-center gap-2", children: [_jsx(Clock, { className: "h-4 w-4 shrink-0" }), _jsx("span", { children: "Added" })] }), _jsx("span", { className: "text-foreground text-xs", title: new Date(data.createdAt).toLocaleString(), "data-testid": "repository-drawer-created-at", children: formatRelativeTime(data.createdAt) })] })] })] })) : null] })) : null }));
21
+ : undefined, header: data ? (_jsxs("div", { "data-testid": "repository-drawer-header", children: [_jsx(DrawerTitle, { children: data.name }), data.repositoryPath ? (_jsx(DrawerDescription, { className: "truncate font-mono text-xs", children: data.repositoryPath })) : null] })) : undefined, children: data?.repositoryPath ? (_jsxs(_Fragment, { children: [_jsx(Separator, {}), _jsxs("div", { className: "flex flex-col gap-3 p-4", children: [_jsx("div", { className: "text-muted-foreground text-xs font-semibold tracking-wider", children: "OPEN WITH" }), _jsxs("div", { className: "flex flex-col gap-2", children: [_jsx(ActionButton, { label: "Open in IDE", onClick: actions.openInIde, loading: actions.ideLoading, error: !!actions.ideError, icon: Code2, variant: "outline", size: "sm" }), _jsx(ActionButton, { label: "Open in Shell", onClick: actions.openInShell, loading: actions.shellLoading, error: !!actions.shellError, icon: Terminal, variant: "outline", size: "sm" }), _jsx(ActionButton, { label: "Open Folder", onClick: actions.openFolder, loading: actions.folderLoading, error: !!actions.folderError, icon: FolderOpen, variant: "outline", size: "sm" })] })] })] })) : null }));
39
22
  }
@@ -3,12 +3,7 @@ import { RepositoryDrawer } from './repository-drawer.js';
3
3
  declare const meta: Meta<typeof RepositoryDrawer>;
4
4
  export default meta;
5
5
  type Story = StoryObj<typeof RepositoryDrawer>;
6
- /** Basic drawer — no git info, just path and actions. */
7
6
  export declare const Default: Story;
8
- /** Full enriched drawer — branch, commit, committer, behind count, metadata. */
9
- export declare const WithGitInfo: Story;
10
- /** On default branch — no behind count shown. */
11
- export declare const OnDefaultBranch: Story;
12
7
  export declare const LongPath: Story;
13
8
  export declare const WithoutPath: Story;
14
9
  /** Repository drawer rendered inside a full-page context — starts open. */
@@ -1 +1 @@
1
- {"version":3,"file":"repository-drawer.stories.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/repository-node/repository-drawer.stories.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAEvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAGvD,QAAA,MAAM,IAAI,EAAE,IAAI,CAAC,OAAO,gBAAgB,CAOvC,CAAC;AAEF,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAgE/C,yDAAyD;AACzD,eAAO,MAAM,OAAO,EAAE,KAErB,CAAC;AAEF,gFAAgF;AAChF,eAAO,MAAM,WAAW,EAAE,KAEzB,CAAC;AAEF,iDAAiD;AACjD,eAAO,MAAM,eAAe,EAAE,KAE7B,CAAC;AAEF,eAAO,MAAM,QAAQ,EAAE,KAUtB,CAAC;AAEF,eAAO,MAAM,WAAW,EAAE,KAIzB,CAAC;AAEF,2EAA2E;AAC3E,eAAO,MAAM,QAAQ,EAAE,KAEtB,CAAC"}
1
+ {"version":3,"file":"repository-drawer.stories.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/repository-node/repository-drawer.stories.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAEvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAGvD,QAAA,MAAM,IAAI,EAAE,IAAI,CAAC,OAAO,gBAAgB,CAOvC,CAAC;AAEF,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAqB/C,eAAO,MAAM,OAAO,EAAE,KAErB,CAAC;AAEF,eAAO,MAAM,QAAQ,EAAE,KAUtB,CAAC;AAEF,eAAO,MAAM,WAAW,EAAE,KAIzB,CAAC;AAuBF,2EAA2E;AAC3E,eAAO,MAAM,QAAQ,EAAE,KAEtB,CAAC"}
@@ -16,59 +16,30 @@ const repoData = {
16
16
  name: 'shep-ai/cli',
17
17
  repositoryPath: '/home/user/shep-ai/cli',
18
18
  };
19
- const enrichedRepoData = {
20
- id: 'repo-2',
21
- name: 'shep-ai/cli',
22
- repositoryPath: '/home/user/shep-ai/cli',
23
- branch: 'feat/repo-tab-redesign',
24
- commitMessage: 'feat(web): redesign repository drawer with git info',
25
- committer: 'Jane Doe',
26
- behindCount: 3,
27
- createdAt: Date.now() - 1000 * 60 * 60 * 24 * 5, // 5 days ago
28
- };
29
- const onDefaultBranchData = {
30
- id: 'repo-3',
31
- name: 'my-org/my-project',
32
- repositoryPath: '/home/user/my-org/my-project',
33
- branch: 'main',
34
- commitMessage: 'chore: bump dependencies to latest versions',
35
- committer: 'John Smith',
36
- behindCount: null,
37
- createdAt: Date.now() - 1000 * 60 * 60 * 24 * 30, // 1 month ago
38
- };
39
19
  function DrawerTrigger({ data, label }) {
40
20
  const [selected, setSelected] = useState(null);
41
21
  return (_jsxs("div", { className: "flex h-screen items-start p-4", children: [_jsx(Button, { variant: "outline", onClick: () => setSelected(data), children: label }), _jsx(RepositoryDrawer, { data: selected, onClose: () => setSelected(null) })] }));
42
22
  }
43
- /* ---------------------------------------------------------------------------
44
- * Shell template — full page context, starts open (matches ReviewDrawerShell pattern)
45
- * ------------------------------------------------------------------------- */
46
- function RepositoryDrawerShellTemplate({ data }) {
47
- const [selected, setSelected] = useState(data);
48
- return (_jsxs("div", { style: { height: '100vh', background: '#f8fafc', padding: '2rem' }, children: [_jsx("button", { type: "button", onClick: () => setSelected(data), style: { padding: '8px 16px', border: '1px solid #ccc', borderRadius: '6px' }, children: "Open Drawer" }), _jsx(RepositoryDrawer, { data: selected, onClose: () => setSelected(null) })] }));
49
- }
50
- /** Basic drawer — no git info, just path and actions. */
51
23
  export const Default = {
52
24
  render: () => _jsx(RepositoryDrawerShellTemplate, { data: repoData }),
53
25
  };
54
- /** Full enriched drawer — branch, commit, committer, behind count, metadata. */
55
- export const WithGitInfo = {
56
- render: () => _jsx(RepositoryDrawerShellTemplate, { data: enrichedRepoData }),
57
- };
58
- /** On default branch — no behind count shown. */
59
- export const OnDefaultBranch = {
60
- render: () => _jsx(RepositoryDrawerShellTemplate, { data: onDefaultBranchData }),
61
- };
62
26
  export const LongPath = {
63
27
  render: () => (_jsx(DrawerTrigger, { data: {
64
- ...enrichedRepoData,
28
+ ...repoData,
65
29
  repositoryPath: '/home/user/projects/company/some-very-long-path/shep-ai/cli',
66
30
  }, label: "Open Long Path" })),
67
31
  };
68
32
  export const WithoutPath = {
69
33
  render: () => (_jsx(DrawerTrigger, { data: { ...repoData, repositoryPath: undefined }, label: "Open Without Path" })),
70
34
  };
35
+ /* ---------------------------------------------------------------------------
36
+ * Shell template — full page context, starts open (matches ReviewDrawerShell pattern)
37
+ * ------------------------------------------------------------------------- */
38
+ function RepositoryDrawerShellTemplate({ data }) {
39
+ const [selected, setSelected] = useState(data);
40
+ return (_jsxs("div", { style: { height: '100vh', background: '#f8fafc', padding: '2rem' }, children: [_jsx("button", { type: "button", onClick: () => setSelected(data), style: { padding: '8px 16px', border: '1px solid #ccc', borderRadius: '6px' }, children: "Open Drawer" }), _jsx(RepositoryDrawer, { data: selected, onClose: () => setSelected(null) })] }));
41
+ }
71
42
  /** Repository drawer rendered inside a full-page context — starts open. */
72
43
  export const InDrawer = {
73
- render: () => _jsx(RepositoryDrawerShellTemplate, { data: enrichedRepoData }),
44
+ render: () => _jsx(RepositoryDrawerShellTemplate, { data: repoData }),
74
45
  };
@@ -1 +1 @@
1
- {"version":3,"file":"repository-node.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/repository-node/repository-node.tsx"],"names":[],"mappings":"AAmCA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAOnE,wBAAgB,cAAc,CAAC,EAAE,IAAI,EAAE,EAAE;IAAE,IAAI,EAAE,kBAAkB,CAAC;IAAC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;CAAE,2CA+U5F"}
1
+ {"version":3,"file":"repository-node.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/repository-node/repository-node.tsx"],"names":[],"mappings":"AAmCA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAOnE,wBAAgB,cAAc,CAAC,EAAE,IAAI,EAAE,EAAE;IAAE,IAAI,EAAE,kBAAkB,CAAC;IAAC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;CAAE,2CAkX5F"}
@@ -3,13 +3,12 @@ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-run
3
3
  import { useState, useCallback } from 'react';
4
4
  import { Handle, Position } from '@xyflow/react';
5
5
  import { useRouter } from 'next/navigation';
6
- import { Github, Plus, Code2, Terminal, FolderOpen, Trash2, Play, Square, GitBranch, GitCommitHorizontal, ArrowDown, User, } from 'lucide-react';
6
+ import { Github, Plus, Code2, Terminal, FolderOpen, Trash2, Play, Square, GitBranch, GitCommitHorizontal, ArrowDown, User, RotateCcw, } from 'lucide-react';
7
7
  import { cn } from '../../../lib/utils.js';
8
8
  import { ActionButton } from '../../common/action-button/index.js';
9
9
  import { Dialog, DialogClose, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, } from '../../ui/dialog.js';
10
10
  import { Button } from '../../ui/button.js';
11
11
  import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from '../../ui/tooltip.js';
12
- import { DeploymentStatusBadge } from '../../common/deployment-status-badge/index.js';
13
12
  import { useDeployAction } from '../../../hooks/use-deploy-action.js';
14
13
  import { useFeatureFlags } from '../../../hooks/feature-flags-context.js';
15
14
  import { useRepositoryActions } from './use-repository-actions.js';
@@ -72,9 +71,13 @@ export function RepositoryNode({ data }) {
72
71
  e.stopPropagation();
73
72
  data.onClick?.();
74
73
  }
75
- }, className: "nodrag bg-card flex w-[26rem] cursor-pointer flex-col overflow-hidden rounded-xl border shadow-sm", children: [_jsxs("div", { className: "flex items-center gap-3 px-4 py-3", children: [_jsx(Github, { className: "text-muted-foreground h-5 w-5 shrink-0" }), _jsx("span", { "data-testid": "repository-node-name", className: "min-w-0 truncate text-sm font-medium", children: data.name }), _jsxs("div", { className: cn('flex shrink-0 items-center gap-2', (data.repositoryPath ?? data.onAdd) && 'ml-auto'), onClick: (e) => e.stopPropagation(), children: [data.repositoryPath ? (_jsxs(_Fragment, { children: [_jsx(TooltipProvider, { children: _jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx("span", { className: "flex items-center", children: _jsx(ActionButton, { label: "Open in IDE", onClick: actions.openInIde, loading: actions.ideLoading, error: !!actions.ideError, icon: Code2, iconOnly: true, variant: "ghost", size: "icon-xs" }) }) }), _jsx(TooltipContent, { children: "Open in IDE" })] }) }), _jsx(TooltipProvider, { children: _jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx("span", { className: "flex items-center", children: _jsx(ActionButton, { label: "Open in Shell", onClick: actions.openInShell, loading: actions.shellLoading, error: !!actions.shellError, icon: Terminal, iconOnly: true, variant: "ghost", size: "icon-xs" }) }) }), _jsx(TooltipContent, { children: "Open in Shell" })] }) }), _jsx(TooltipProvider, { children: _jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx("span", { className: "flex items-center", children: _jsx(ActionButton, { label: "Open Folder", onClick: actions.openFolder, loading: actions.folderLoading, error: !!actions.folderError, icon: FolderOpen, iconOnly: true, variant: "ghost", size: "icon-xs" }) }) }), _jsx(TooltipContent, { children: "Open Folder" })] }) }), _jsx(FeatureSessionsDropdown, { repositoryPath: data.repositoryPath, onCreateFromSession: handleCreateFromSession }), featureFlags.envDeploy ? (_jsxs(_Fragment, { children: [_jsx(TooltipProvider, { children: _jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx("span", { className: "flex items-center", children: _jsx(ActionButton, { label: isDeploymentActive ? 'Stop Dev Server' : 'Start Dev Server', onClick: isDeploymentActive ? deployAction.stop : deployAction.deploy, loading: deployAction.deployLoading || deployAction.stopLoading, error: !!deployAction.deployError, icon: isDeploymentActive ? Square : Play, iconOnly: true, variant: "ghost", size: "icon-xs" }) }) }), _jsx(TooltipContent, { children: isDeploymentActive ? 'Stop Dev Server' : 'Start Dev Server' })] }) }), isDeploymentActive ? (_jsx(DeploymentStatusBadge, { status: deployAction.status, url: deployAction.url, targetId: data.repositoryPath })) : null] })) : null] })) : null, data.onAdd ? (_jsx(TooltipProvider, { children: _jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx("button", { "aria-label": "Add feature", "data-testid": "repository-node-add-button", onClick: (e) => {
74
+ }, className: "nodrag bg-card flex w-[26rem] cursor-pointer flex-col overflow-hidden rounded-xl border shadow-sm", children: [_jsxs("div", { className: "flex items-center gap-3 px-4 py-3", children: [_jsx(Github, { className: "text-muted-foreground h-5 w-5 shrink-0" }), _jsx("span", { "data-testid": "repository-node-name", className: "min-w-0 truncate text-sm font-medium", children: data.name }), _jsxs("div", { className: cn('flex shrink-0 items-center gap-2', (data.repositoryPath ?? data.onAdd) && 'ml-auto'), onClick: (e) => e.stopPropagation(), children: [data.repositoryPath ? (_jsxs(_Fragment, { children: [_jsx(TooltipProvider, { children: _jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx("span", { className: "flex items-center", children: _jsx(ActionButton, { label: "Open in IDE", onClick: actions.openInIde, loading: actions.ideLoading, error: !!actions.ideError, icon: Code2, iconOnly: true, variant: "ghost", size: "icon-xs" }) }) }), _jsx(TooltipContent, { children: "Open in IDE" })] }) }), _jsx(TooltipProvider, { children: _jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx("span", { className: "flex items-center", children: _jsx(ActionButton, { label: "Open in Shell", onClick: actions.openInShell, loading: actions.shellLoading, error: !!actions.shellError, icon: Terminal, iconOnly: true, variant: "ghost", size: "icon-xs" }) }) }), _jsx(TooltipContent, { children: "Open in Shell" })] }) }), _jsx(TooltipProvider, { children: _jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx("span", { className: "flex items-center", children: _jsx(ActionButton, { label: "Open Folder", onClick: actions.openFolder, loading: actions.folderLoading, error: !!actions.folderError, icon: FolderOpen, iconOnly: true, variant: "ghost", size: "icon-xs" }) }) }), _jsx(TooltipContent, { children: "Open Folder" })] }) }), _jsx(FeatureSessionsDropdown, { repositoryPath: data.repositoryPath, onCreateFromSession: handleCreateFromSession })] })) : null, data.onAdd ? (_jsx(TooltipProvider, { children: _jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx("button", { "aria-label": "Add feature", "data-testid": "repository-node-add-button", onClick: (e) => {
76
75
  e.stopPropagation();
77
76
  data.onAdd?.();
78
77
  }, className: cn('text-muted-foreground hover:bg-accent dark:hover:bg-accent/50 flex h-6 w-6 shrink-0 cursor-pointer items-center justify-center rounded-full transition-colors hover:text-blue-500', data.pulseAdd &&
79
- 'animate-pulse-cta bg-blue-100 text-blue-500 dark:bg-blue-900/40'), children: _jsx(Plus, { className: "h-3.5 w-3.5" }) }) }), _jsx(TooltipContent, { children: "Add feature" })] }) })) : null] })] }), data.branch ? (_jsx("div", { "data-testid": "repository-node-git-info", className: "text-muted-foreground border-t px-4 py-2", children: _jsxs("div", { className: "flex items-center gap-3 text-xs", children: [_jsxs("span", { className: "flex items-center gap-1 truncate", "data-testid": "repository-node-branch", children: [_jsx(GitBranch, { className: "h-3 w-3 shrink-0" }), _jsx("span", { className: "truncate", children: data.branch })] }), data.behindCount != null && data.behindCount > 0 ? (_jsxs("span", { className: "flex shrink-0 items-center gap-1 whitespace-nowrap text-amber-500", "data-testid": "repository-node-behind", children: [_jsx(ArrowDown, { className: "h-3 w-3 shrink-0" }), data.behindCount, " behind"] })) : null] }) })) : null, data.commitMessage ? (_jsx("div", { "data-testid": "repository-node-commit-info", className: "text-muted-foreground border-t px-4 py-2", children: _jsxs("div", { className: "flex items-center gap-2 text-xs", children: [_jsx(GitCommitHorizontal, { className: "h-3 w-3 shrink-0" }), _jsx("span", { className: "min-w-0 truncate", "data-testid": "repository-node-commit-message", children: data.commitMessage }), data.committer ? (_jsxs("span", { className: "text-muted-foreground/70 ml-auto flex shrink-0 items-center gap-1", "data-testid": "repository-node-committer", children: [_jsx(User, { className: "h-3 w-3 shrink-0" }), _jsx("span", { children: data.committer })] })) : null] }) })) : null] }), data.onAdd || data.showHandles ? (_jsx(Handle, { type: "source", position: Position.Right, isConnectable: !data.showHandles, className: "opacity-0!" })) : null] }));
78
+ 'animate-pulse-cta bg-blue-100 text-blue-500 dark:bg-blue-900/40'), children: _jsx(Plus, { className: "h-3.5 w-3.5" }) }) }), _jsx(TooltipContent, { children: "Add feature" })] }) })) : null] })] }), data.branch ? (_jsx("div", { "data-testid": "repository-node-git-info", className: "text-muted-foreground border-t px-4 py-2", children: _jsxs("div", { className: "flex items-center gap-3 text-xs", children: [_jsxs("span", { className: "flex items-center gap-1 truncate", "data-testid": "repository-node-branch", children: [_jsx(GitBranch, { className: "h-3 w-3 shrink-0" }), _jsx("span", { className: "truncate", children: data.branch })] }), data.behindCount != null && data.behindCount > 0 ? (_jsxs("span", { className: "flex shrink-0 items-center gap-1 whitespace-nowrap text-amber-500", "data-testid": "repository-node-behind", children: [_jsx(ArrowDown, { className: "h-3 w-3 shrink-0" }), data.behindCount, " behind"] })) : null] }) })) : null, data.commitMessage ? (_jsx("div", { "data-testid": "repository-node-commit-info", className: "text-muted-foreground border-t px-4 py-2", children: _jsxs("div", { className: "flex items-center gap-2 text-xs", children: [_jsx(GitCommitHorizontal, { className: "h-3 w-3 shrink-0" }), _jsx("span", { className: "min-w-0 truncate", "data-testid": "repository-node-commit-message", children: data.commitMessage }), data.committer ? (_jsxs("span", { className: "text-muted-foreground/70 ml-auto flex shrink-0 items-center gap-1", "data-testid": "repository-node-committer", children: [_jsx(User, { className: "h-3 w-3 shrink-0" }), _jsx("span", { children: data.committer })] })) : null] }) })) : null, featureFlags.envDeploy && data.repositoryPath ? (_jsx("div", { "data-testid": "repository-node-dev-preview", className: "border-t px-4 py-2", onClick: (e) => e.stopPropagation(), children: _jsxs("div", { className: "flex items-center gap-2 text-xs", children: [deployAction.deployError ? (_jsx("span", { className: "truncate text-xs text-red-500", children: deployAction.deployError })) : isDeploymentActive ? (_jsxs(_Fragment, { children: [_jsx("span", { className: "mr-0.5 inline-block h-2 w-2 shrink-0 rounded-full bg-green-500" }), deployAction.url ? (_jsx("a", { href: deployAction.url, target: "_blank", rel: "noopener noreferrer", className: "truncate text-green-700 hover:underline dark:text-green-400", children: deployAction.url })) : (_jsx("span", { className: "text-muted-foreground", children: "Starting..." }))] })) : (_jsxs("span", { className: "text-muted-foreground", children: ["Run", _jsx("span", { className: "text-muted-foreground/50 ml-2 text-[10px]", children: "start local environment" })] })), _jsx(TooltipProvider, { children: _jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx("span", { className: "ml-auto flex items-center", children: _jsx(ActionButton, { label: deployAction.deployError
79
+ ? 'Retry'
80
+ : isDeploymentActive
81
+ ? 'Stop Dev Server'
82
+ : 'Start Dev Server', onClick: isDeploymentActive ? deployAction.stop : deployAction.deploy, loading: deployAction.deployLoading || deployAction.stopLoading, error: false, icon: deployAction.deployError ? RotateCcw : isDeploymentActive ? Square : Play, iconOnly: true, variant: "ghost", size: "icon-xs" }) }) }), _jsx(TooltipContent, { children: isDeploymentActive ? 'Stop Dev Server' : 'Start Dev Server' })] }) })] }) })) : null] }), data.onAdd || data.showHandles ? (_jsx(Handle, { type: "source", position: Position.Right, isConnectable: !data.showHandles, className: "opacity-0!" })) : null] }));
80
83
  }
@@ -1 +1 @@
1
- {"version":3,"file":"use-control-center-state.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/features/control-center/use-control-center-state.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAClE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AACxE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,qCAAqC,CAAC;AAC9E,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uCAAuC,CAAC;AAC5E,OAAO,EAGL,KAAK,eAAe,EACrB,MAAM,yBAAyB,CAAC;AAgBjC,OAAO,EAAiB,KAAK,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAM7E,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,cAAc,EAAE,CAAC;IACxB,KAAK,EAAE,IAAI,EAAE,CAAC;IACd,aAAa,EAAE,CAAC,OAAO,EAAE,UAAU,CAAC,cAAc,CAAC,EAAE,KAAK,IAAI,CAAC;IAC/D,aAAa,EAAE,CAAC,UAAU,EAAE,UAAU,KAAK,IAAI,CAAC;IAChD,mBAAmB,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK;QAAE,QAAQ,EAAE,OAAO,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC;IAC/E,YAAY,EAAE,CAAC,SAAS,EAAE,eAAe,KAAK,IAAI,CAAC;IACnD,mBAAmB,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,EAAE,aAAa,CAAC,EAAE,OAAO,KAAK,IAAI,CAAC;IAC7F,kBAAkB,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IAChD,kBAAkB,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IAChD,iBAAiB,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IAC/C,sBAAsB,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAChE,iBAAiB,EAAE,CACjB,YAAY,EAAE,MAAM,GAAG,IAAI,EAC3B,YAAY,CAAC,EAAE,OAAO,CAAC,eAAe,CAAC,EACvC,QAAQ,CAAC,EAAE,MAAM,KACd,MAAM,CAAC;IACZ,wDAAwD;IACxD,wBAAwB,EAAE,CAAC,aAAa,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,CAAC;IACxE,gDAAgD;IAChD,iBAAiB,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,kBAAkB,GAAG,SAAS,CAAC;IACtE,0EAA0E;IAC1E,YAAY,EAAE,CAAC,SAAS,EAAE,cAAc,KAAK,IAAI,CAAC;CACnD;AAQD,wBAAgB,qBAAqB,CACnC,YAAY,EAAE,cAAc,EAAE,EAC9B,YAAY,EAAE,IAAI,EAAE,GACnB,kBAAkB,CA6gBpB"}
1
+ {"version":3,"file":"use-control-center-state.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/features/control-center/use-control-center-state.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAClE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AACxE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,qCAAqC,CAAC;AAC9E,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uCAAuC,CAAC;AAC5E,OAAO,EAGL,KAAK,eAAe,EACrB,MAAM,yBAAyB,CAAC;AAgBjC,OAAO,EAAiB,KAAK,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAM7E,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,cAAc,EAAE,CAAC;IACxB,KAAK,EAAE,IAAI,EAAE,CAAC;IACd,aAAa,EAAE,CAAC,OAAO,EAAE,UAAU,CAAC,cAAc,CAAC,EAAE,KAAK,IAAI,CAAC;IAC/D,aAAa,EAAE,CAAC,UAAU,EAAE,UAAU,KAAK,IAAI,CAAC;IAChD,mBAAmB,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK;QAAE,QAAQ,EAAE,OAAO,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC;IAC/E,YAAY,EAAE,CAAC,SAAS,EAAE,eAAe,KAAK,IAAI,CAAC;IACnD,mBAAmB,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,EAAE,aAAa,CAAC,EAAE,OAAO,KAAK,IAAI,CAAC;IAC7F,kBAAkB,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IAChD,kBAAkB,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IAChD,iBAAiB,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IAC/C,sBAAsB,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAChE,iBAAiB,EAAE,CACjB,YAAY,EAAE,MAAM,GAAG,IAAI,EAC3B,YAAY,CAAC,EAAE,OAAO,CAAC,eAAe,CAAC,EACvC,QAAQ,CAAC,EAAE,MAAM,KACd,MAAM,CAAC;IACZ,wDAAwD;IACxD,wBAAwB,EAAE,CAAC,aAAa,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,CAAC;IACxE,gDAAgD;IAChD,iBAAiB,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,kBAAkB,GAAG,SAAS,CAAC;IACtE,0EAA0E;IAC1E,YAAY,EAAE,CAAC,SAAS,EAAE,cAAc,KAAK,IAAI,CAAC;CACnD;AAQD,wBAAgB,qBAAqB,CACnC,YAAY,EAAE,cAAc,EAAE,EAC9B,YAAY,EAAE,IAAI,EAAE,GACnB,kBAAkB,CAuhBpB"}
@@ -102,11 +102,20 @@ export function useControlCenterState(initialNodes, initialEdges) {
102
102
  for (const { featureId, state, lifecycle } of resolveSseEventUpdates(newEvents)) {
103
103
  if (state !== undefined || lifecycle !== undefined) {
104
104
  const nodeId = `feat-${featureId}`;
105
+ const existingNode = nodesRef.current.find((n) => n.id === nodeId);
106
+ const existingState = existingNode
107
+ ? existingNode.data.state
108
+ : undefined;
105
109
  // Skip SSE updates for features in 'deleting' state — the optimistic
106
110
  // delete state must not be overwritten by stale SSE events (e.g. agent
107
111
  // cancellation emitting AgentFailed during the soft-delete window).
108
- const existingNode = nodesRef.current.find((n) => n.id === nodeId);
109
- if (existingNode && existingNode.data.state === 'deleting')
112
+ if (existingState === 'deleting')
113
+ continue;
114
+ // Skip SSE error events during mutation cooldown — after approve/reject
115
+ // the agent may still report AgentFailed from the previous run before
116
+ // the resume kicks in. The optimistic 'running' state must not be
117
+ // overwritten by stale error events during this transition window.
118
+ if (state === 'error' && isMutating() && existingState === 'running')
110
119
  continue;
111
120
  updateFeature(nodeId, {
112
121
  ...(state !== undefined && { state }),
@@ -114,7 +123,7 @@ export function useControlCenterState(initialNodes, initialEdges) {
114
123
  });
115
124
  }
116
125
  }
117
- }, [events, updateFeature]);
126
+ }, [events, updateFeature, isMutating]);
118
127
  // Listen for optimistic approval/rejection events from the drawer (fires before SSE arrives).
119
128
  // Uses beginMutation + endMutation to prevent stale poll/reconcile data from overwriting
120
129
  // the optimistic 'running' state during the transition window (avoids brief "Something went wrong" flash).
@@ -1 +1 @@
1
- {"version":3,"file":"notification-settings-section.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/features/settings/notification-settings-section.tsx"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,sCAAsC,CAAC;AAmBpF,MAAM,WAAW,gCAAgC;IAC/C,aAAa,EAAE,uBAAuB,CAAC;CACxC;AAED,wBAAgB,2BAA2B,CAAC,EAAE,aAAa,EAAE,EAAE,gCAAgC,2CAkJ9F"}
1
+ {"version":3,"file":"notification-settings-section.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/features/settings/notification-settings-section.tsx"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,sCAAsC,CAAC;AAmBpF,MAAM,WAAW,gCAAgC;IAC/C,aAAa,EAAE,uBAAuB,CAAC;CACxC;AAED,wBAAgB,2BAA2B,CAAC,EAAE,aAAa,EAAE,EAAE,gCAAgC,2CAsH9F"}
@@ -25,8 +25,6 @@ const PR_EVENT_TOGGLES = [
25
25
  ];
26
26
  export function NotificationSettingsSection({ notifications }) {
27
27
  const [inApp, setInApp] = useState(notifications.inApp.enabled);
28
- const [browser, setBrowser] = useState(notifications.browser.enabled);
29
- const [desktop, setDesktop] = useState(notifications.desktop.enabled);
30
28
  const [events, setEvents] = useState({ ...notifications.events });
31
29
  const [isPending, startTransition] = useTransition();
32
30
  const [showSaved, setShowSaved] = useState(false);
@@ -51,20 +49,18 @@ export function NotificationSettingsSection({ notifications }) {
51
49
  return {
52
50
  notifications: {
53
51
  inApp: { enabled: overrides.inApp ?? inApp },
54
- browser: { enabled: overrides.browser ?? browser },
55
- desktop: { enabled: overrides.desktop ?? desktop },
56
52
  events: overrides.events ?? events,
57
53
  },
58
54
  };
59
55
  }
60
- function handleChannelChange(channel, setter, value) {
61
- setter(value);
62
- save(buildFullPayload({ [channel]: value }));
56
+ function handleInAppChange(value) {
57
+ setInApp(value);
58
+ save(buildFullPayload({ inApp: value }));
63
59
  }
64
60
  function handleEventChange(key, value) {
65
61
  const newEvents = { ...events, [key]: value };
66
62
  setEvents(newEvents);
67
63
  save(buildFullPayload({ events: newEvents }));
68
64
  }
69
- return (_jsxs(Card, { id: "notifications", className: "scroll-mt-6", "data-testid": "notification-settings-section", children: [_jsxs(CardHeader, { children: [_jsxs("div", { className: "flex items-center justify-between", children: [_jsxs("div", { className: "flex items-center gap-2", children: [_jsx(Bell, { className: "text-muted-foreground h-4 w-4" }), _jsx(CardTitle, { children: "Notifications" })] }), isPending ? _jsx("span", { className: "text-muted-foreground text-xs", children: "Saving..." }) : null, showSaved && !isPending ? (_jsxs("span", { className: "flex items-center gap-1 text-xs text-green-600", children: [_jsx(Check, { className: "h-3 w-3" }), "Saved"] })) : null] }), _jsx(CardDescription, { children: "Configure notification channels and event preferences" })] }), _jsxs(CardContent, { className: "space-y-4", children: [_jsxs("div", { className: "space-y-3", children: [_jsx("h3", { className: "text-sm font-semibold", children: "Channels" }), _jsxs("div", { className: "flex items-center justify-between", children: [_jsx(Label, { htmlFor: "notif-in-app", children: "In-App" }), _jsx(Switch, { id: "notif-in-app", "data-testid": "switch-in-app", checked: inApp, onCheckedChange: (v) => handleChannelChange('inApp', setInApp, v) })] }), _jsxs("div", { className: "flex items-center justify-between", children: [_jsx(Label, { htmlFor: "notif-browser", children: "Browser" }), _jsx(Switch, { id: "notif-browser", "data-testid": "switch-browser", checked: browser, onCheckedChange: (v) => handleChannelChange('browser', setBrowser, v) })] }), _jsxs("div", { className: "flex items-center justify-between", children: [_jsx(Label, { htmlFor: "notif-desktop", children: "Desktop" }), _jsx(Switch, { id: "notif-desktop", "data-testid": "switch-desktop", checked: desktop, onCheckedChange: (v) => handleChannelChange('desktop', setDesktop, v) })] })] }), _jsx(Separator, {}), _jsxs("div", { className: "space-y-3", children: [_jsx("h3", { className: "text-sm font-semibold", children: "Agent Events" }), AGENT_EVENT_TOGGLES.map(({ key, label }) => (_jsxs("div", { className: "flex items-center justify-between", children: [_jsx(Label, { htmlFor: `notif-event-${key}`, children: label }), _jsx(Switch, { id: `notif-event-${key}`, "data-testid": `switch-event-${key}`, checked: events[key], onCheckedChange: (v) => handleEventChange(key, v) })] }, key)))] }), _jsx(Separator, {}), _jsxs("div", { className: "space-y-3", children: [_jsx("h3", { className: "text-sm font-semibold", children: "PR Events" }), PR_EVENT_TOGGLES.map(({ key, label }) => (_jsxs("div", { className: "flex items-center justify-between", children: [_jsx(Label, { htmlFor: `notif-event-${key}`, children: label }), _jsx(Switch, { id: `notif-event-${key}`, "data-testid": `switch-event-${key}`, checked: events[key], onCheckedChange: (v) => handleEventChange(key, v) })] }, key)))] })] })] }));
65
+ return (_jsxs(Card, { id: "notifications", className: "scroll-mt-6", "data-testid": "notification-settings-section", children: [_jsxs(CardHeader, { children: [_jsxs("div", { className: "flex items-center justify-between", children: [_jsxs("div", { className: "flex items-center gap-2", children: [_jsx(Bell, { className: "text-muted-foreground h-4 w-4" }), _jsx(CardTitle, { children: "Notifications" })] }), isPending ? _jsx("span", { className: "text-muted-foreground text-xs", children: "Saving..." }) : null, showSaved && !isPending ? (_jsxs("span", { className: "flex items-center gap-1 text-xs text-green-600", children: [_jsx(Check, { className: "h-3 w-3" }), "Saved"] })) : null] }), _jsx(CardDescription, { children: "Configure notification channels and event preferences" })] }), _jsxs(CardContent, { className: "space-y-4", children: [_jsxs("div", { className: "space-y-3", children: [_jsx("h3", { className: "text-sm font-semibold", children: "Channels" }), _jsxs("div", { className: "flex items-center justify-between", children: [_jsx(Label, { htmlFor: "notif-in-app", children: "In-App" }), _jsx(Switch, { id: "notif-in-app", "data-testid": "switch-in-app", checked: inApp, onCheckedChange: handleInAppChange })] })] }), _jsx(Separator, {}), _jsxs("div", { className: "space-y-3", children: [_jsx("h3", { className: "text-sm font-semibold", children: "Agent Events" }), AGENT_EVENT_TOGGLES.map(({ key, label }) => (_jsxs("div", { className: "flex items-center justify-between", children: [_jsx(Label, { htmlFor: `notif-event-${key}`, children: label }), _jsx(Switch, { id: `notif-event-${key}`, "data-testid": `switch-event-${key}`, checked: events[key], onCheckedChange: (v) => handleEventChange(key, v) })] }, key)))] }), _jsx(Separator, {}), _jsxs("div", { className: "space-y-3", children: [_jsx("h3", { className: "text-sm font-semibold", children: "PR Events" }), PR_EVENT_TOGGLES.map(({ key, label }) => (_jsxs("div", { className: "flex items-center justify-between", children: [_jsx(Label, { htmlFor: `notif-event-${key}`, children: label }), _jsx(Switch, { id: `notif-event-${key}`, "data-testid": `switch-event-${key}`, checked: events[key], onCheckedChange: (v) => handleEventChange(key, v) })] }, key)))] })] })] }));
70
66
  }
@@ -38,7 +38,7 @@ export const Default = {
38
38
  args: {
39
39
  notifications: {
40
40
  inApp: { enabled: true },
41
- browser: { enabled: true },
41
+ browser: { enabled: false },
42
42
  desktop: { enabled: false },
43
43
  events: allEvents,
44
44
  },
@@ -48,8 +48,8 @@ export const AllEnabled = {
48
48
  args: {
49
49
  notifications: {
50
50
  inApp: { enabled: true },
51
- browser: { enabled: true },
52
- desktop: { enabled: true },
51
+ browser: { enabled: false },
52
+ desktop: { enabled: false },
53
53
  events: allEvents,
54
54
  },
55
55
  },
@@ -1 +1 @@
1
- {"version":3,"file":"settings-page-client.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/features/settings/settings-page-client.tsx"],"names":[],"mappings":"AA4CA,OAAO,KAAK,EACV,QAAQ,EAGT,MAAM,sCAAsC,CAAC;AAC9C,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,uCAAuC,CAAC;AAgC/E,MAAM,WAAW,uBAAuB;IACtC,QAAQ,EAAE,QAAQ,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,kBAAkB,CAAC,EAAE,iBAAiB,EAAE,CAAC;CAC1C;AA6QD,wBAAgB,kBAAkB,CAAC,EACjC,QAAQ,EACR,QAAQ,EACR,UAAU,EACV,kBAAkB,GACnB,EAAE,uBAAuB,2CAyqCzB"}
1
+ {"version":3,"file":"settings-page-client.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/features/settings/settings-page-client.tsx"],"names":[],"mappings":"AAkCA,OAAO,KAAK,EACV,QAAQ,EAGT,MAAM,sCAAsC,CAAC;AAC9C,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,uCAAuC,CAAC;AA2B/E,MAAM,WAAW,uBAAuB;IACtC,QAAQ,EAAE,QAAQ,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,kBAAkB,CAAC,EAAE,iBAAiB,EAAE,CAAC;CAC1C;AA6QD,wBAAgB,kBAAkB,CAAC,EACjC,QAAQ,EACR,QAAQ,EACR,UAAU,EACV,kBAAkB,GACnB,EAAE,uBAAuB,2CAulCzB"}