@shepai/cli 1.102.0 → 1.103.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (206) hide show
  1. package/README.md +5 -4
  2. package/dist/packages/core/src/application/ports/output/services/git-pr-service.interface.d.ts +2 -1
  3. package/dist/packages/core/src/application/ports/output/services/git-pr-service.interface.d.ts.map +1 -1
  4. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/merge/ci-watch-fix-loop.js +1 -1
  5. package/dist/packages/core/src/infrastructure/services/git/git-pr.service.d.ts +1 -1
  6. package/dist/packages/core/src/infrastructure/services/git/git-pr.service.d.ts.map +1 -1
  7. package/dist/packages/core/src/infrastructure/services/git/git-pr.service.js +2 -2
  8. package/dist/src/presentation/web/app/actions/check-agent-auth.d.ts +19 -0
  9. package/dist/src/presentation/web/app/actions/check-agent-auth.d.ts.map +1 -0
  10. package/dist/src/presentation/web/app/actions/check-agent-auth.js +178 -0
  11. package/dist/src/presentation/web/components/common/feature-node/feature-node.js +1 -1
  12. package/dist/src/presentation/web/components/features/control-center/control-center-empty-state.d.ts +1 -1
  13. package/dist/src/presentation/web/components/features/control-center/control-center-empty-state.d.ts.map +1 -1
  14. package/dist/src/presentation/web/components/features/control-center/control-center-empty-state.js +46 -8
  15. package/dist/src/presentation/web/components/features/control-center/control-center-inner.d.ts.map +1 -1
  16. package/dist/src/presentation/web/components/features/control-center/control-center-inner.js +28 -5
  17. package/dist/src/presentation/web/components/features/control-center/use-control-center-state.d.ts.map +1 -1
  18. package/dist/src/presentation/web/components/features/control-center/use-control-center-state.js +0 -2
  19. package/dist/src/presentation/web/components/features/control-center/welcome-agent-setup.d.ts.map +1 -1
  20. package/dist/src/presentation/web/components/features/control-center/welcome-agent-setup.js +26 -148
  21. package/dist/src/presentation/web/components/features/features-canvas/features-canvas.d.ts.map +1 -1
  22. package/dist/src/presentation/web/components/features/features-canvas/features-canvas.js +29 -8
  23. package/dist/src/presentation/web/components/ui/dialog.d.ts.map +1 -1
  24. package/dist/src/presentation/web/components/ui/dialog.js +2 -2
  25. package/dist/src/presentation/web/hooks/use-graph-state.d.ts.map +1 -1
  26. package/dist/src/presentation/web/hooks/use-graph-state.js +26 -6
  27. package/dist/tsconfig.build.tsbuildinfo +1 -1
  28. package/package.json +2 -2
  29. package/web/.next/BUILD_ID +1 -1
  30. package/web/.next/build-manifest.json +2 -2
  31. package/web/.next/fallback-build-manifest.json +2 -2
  32. package/web/.next/prerender-manifest.json +3 -3
  33. package/web/.next/required-server-files.js +2 -2
  34. package/web/.next/required-server-files.json +2 -2
  35. package/web/.next/server/app/(dashboard)/@drawer/create/page/server-reference-manifest.json +48 -48
  36. package/web/.next/server/app/(dashboard)/@drawer/create/page.js +1 -1
  37. package/web/.next/server/app/(dashboard)/@drawer/create/page.js.nft.json +1 -1
  38. package/web/.next/server/app/(dashboard)/@drawer/create/page_client-reference-manifest.js +1 -1
  39. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page/server-reference-manifest.json +58 -58
  40. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page.js +1 -1
  41. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page.js.nft.json +1 -1
  42. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page_client-reference-manifest.js +1 -1
  43. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page/server-reference-manifest.json +58 -58
  44. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js +1 -1
  45. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js.nft.json +1 -1
  46. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page_client-reference-manifest.js +1 -1
  47. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page/server-reference-manifest.json +44 -44
  48. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js +1 -1
  49. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js.nft.json +1 -1
  50. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  51. package/web/.next/server/app/(dashboard)/create/page/server-reference-manifest.json +48 -48
  52. package/web/.next/server/app/(dashboard)/create/page.js +1 -1
  53. package/web/.next/server/app/(dashboard)/create/page.js.nft.json +1 -1
  54. package/web/.next/server/app/(dashboard)/create/page_client-reference-manifest.js +1 -1
  55. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page/server-reference-manifest.json +58 -58
  56. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page.js +1 -1
  57. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page.js.nft.json +1 -1
  58. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page_client-reference-manifest.js +1 -1
  59. package/web/.next/server/app/(dashboard)/feature/[featureId]/page/server-reference-manifest.json +58 -58
  60. package/web/.next/server/app/(dashboard)/feature/[featureId]/page.js +1 -1
  61. package/web/.next/server/app/(dashboard)/feature/[featureId]/page.js.nft.json +1 -1
  62. package/web/.next/server/app/(dashboard)/feature/[featureId]/page_client-reference-manifest.js +1 -1
  63. package/web/.next/server/app/(dashboard)/page/server-reference-manifest.json +44 -44
  64. package/web/.next/server/app/(dashboard)/page.js +1 -1
  65. package/web/.next/server/app/(dashboard)/page.js.nft.json +1 -1
  66. package/web/.next/server/app/(dashboard)/page_client-reference-manifest.js +1 -1
  67. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page/server-reference-manifest.json +44 -44
  68. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js +1 -1
  69. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js.nft.json +1 -1
  70. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  71. package/web/.next/server/app/_global-error.html +2 -2
  72. package/web/.next/server/app/_global-error.rsc +1 -1
  73. package/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  74. package/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  75. package/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  76. package/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  77. package/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  78. package/web/.next/server/app/_not-found/page/server-reference-manifest.json +1 -1
  79. package/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  80. package/web/.next/server/app/api/attachments/preview/route.js.nft.json +1 -1
  81. package/web/.next/server/app/api/evidence/route.js.nft.json +1 -1
  82. package/web/.next/server/app/settings/page/server-reference-manifest.json +5 -5
  83. package/web/.next/server/app/settings/page.js.nft.json +1 -1
  84. package/web/.next/server/app/settings/page_client-reference-manifest.js +1 -1
  85. package/web/.next/server/app/skills/page/server-reference-manifest.json +6 -6
  86. package/web/.next/server/app/skills/page.js.nft.json +1 -1
  87. package/web/.next/server/app/skills/page_client-reference-manifest.js +1 -1
  88. package/web/.next/server/app/tools/page/server-reference-manifest.json +6 -6
  89. package/web/.next/server/app/tools/page.js.nft.json +1 -1
  90. package/web/.next/server/app/tools/page_client-reference-manifest.js +1 -1
  91. package/web/.next/server/app/version/page/server-reference-manifest.json +1 -1
  92. package/web/.next/server/app/version/page_client-reference-manifest.js +1 -1
  93. package/web/.next/server/chunks/[root-of-the-server]__f47bb8a5._.js +1 -1
  94. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js +1 -1
  95. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js.map +1 -1
  96. package/web/.next/server/chunks/ssr/7f428_lucide-react_dist_esm_icons_d0119342._.js +3 -0
  97. package/web/.next/server/chunks/ssr/7f428_lucide-react_dist_esm_icons_d0119342._.js.map +1 -0
  98. package/web/.next/server/chunks/ssr/7f428_lucide-react_dist_esm_icons_rocket_1575cd4d.js +3 -0
  99. package/web/.next/server/chunks/ssr/7f428_lucide-react_dist_esm_icons_rocket_1575cd4d.js.map +1 -0
  100. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_0a7546ed.js +3 -0
  101. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_0a7546ed.js.map +1 -0
  102. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_978cbb4c.js +3 -0
  103. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_978cbb4c.js.map +1 -0
  104. package/web/.next/server/chunks/ssr/[root-of-the-server]__11033878._.js +1 -1
  105. package/web/.next/server/chunks/ssr/[root-of-the-server]__11033878._.js.map +1 -1
  106. package/web/.next/server/chunks/ssr/[root-of-the-server]__24dd0927._.js +2 -2
  107. package/web/.next/server/chunks/ssr/[root-of-the-server]__24dd0927._.js.map +1 -1
  108. package/web/.next/server/chunks/ssr/[root-of-the-server]__357d99f9._.js +1 -1
  109. package/web/.next/server/chunks/ssr/{[root-of-the-server]__ec9a1550._.js → [root-of-the-server]__51fc98b0._.js} +2 -2
  110. package/web/.next/server/chunks/ssr/{[root-of-the-server]__0b6bb4ae._.js.map → [root-of-the-server]__51fc98b0._.js.map} +1 -1
  111. package/web/.next/server/chunks/ssr/{[root-of-the-server]__f8932d55._.js → [root-of-the-server]__57f37786._.js} +2 -2
  112. package/web/.next/server/chunks/ssr/{[root-of-the-server]__ec9a1550._.js.map → [root-of-the-server]__57f37786._.js.map} +1 -1
  113. package/web/.next/server/chunks/ssr/[root-of-the-server]__5d87af2e._.js +1 -1
  114. package/web/.next/server/chunks/ssr/{[root-of-the-server]__0b6bb4ae._.js → [root-of-the-server]__708dcad1._.js} +2 -2
  115. package/web/.next/server/chunks/ssr/{[root-of-the-server]__f8932d55._.js.map → [root-of-the-server]__708dcad1._.js.map} +1 -1
  116. package/web/.next/server/chunks/ssr/[root-of-the-server]__845a9d2a._.js +1 -1
  117. package/web/.next/server/chunks/ssr/[root-of-the-server]__845a9d2a._.js.map +1 -1
  118. package/web/.next/server/chunks/ssr/[root-of-the-server]__89e8a5cc._.js +2 -2
  119. package/web/.next/server/chunks/ssr/{[root-of-the-server]__6a82177d._.js → [root-of-the-server]__8e002910._.js} +2 -2
  120. package/web/.next/server/chunks/ssr/{[root-of-the-server]__6a82177d._.js.map → [root-of-the-server]__8e002910._.js.map} +1 -1
  121. package/web/.next/server/chunks/ssr/[root-of-the-server]__aad040c0._.js +2 -2
  122. package/web/.next/server/chunks/ssr/[root-of-the-server]__aad040c0._.js.map +1 -1
  123. package/web/.next/server/chunks/ssr/[root-of-the-server]__d91fdd51._.js +3 -0
  124. package/web/.next/server/chunks/ssr/[root-of-the-server]__d91fdd51._.js.map +1 -0
  125. package/web/.next/server/chunks/ssr/[root-of-the-server]__fdc75809._.js +1 -1
  126. package/web/.next/server/chunks/ssr/[root-of-the-server]__fdc75809._.js.map +1 -1
  127. package/web/.next/server/chunks/ssr/_135edb9c._.js +1 -1
  128. package/web/.next/server/chunks/ssr/_135edb9c._.js.map +1 -1
  129. package/web/.next/server/chunks/ssr/_273d4632._.js +3 -0
  130. package/web/.next/server/chunks/ssr/_273d4632._.js.map +1 -0
  131. package/web/.next/server/chunks/ssr/{_d2a282c5._.js → _43bc1b22._.js} +2 -2
  132. package/web/.next/server/chunks/ssr/{_d2a282c5._.js.map → _43bc1b22._.js.map} +1 -1
  133. package/web/.next/server/chunks/ssr/_6225647a._.js +3 -0
  134. package/web/.next/server/chunks/ssr/_6225647a._.js.map +1 -0
  135. package/web/.next/server/chunks/ssr/{_9d0908a8._.js → _798dcca3._.js} +2 -2
  136. package/web/.next/server/chunks/ssr/{_9d0908a8._.js.map → _798dcca3._.js.map} +1 -1
  137. package/web/.next/server/chunks/ssr/_8dacd1e7._.js +1 -1
  138. package/web/.next/server/chunks/ssr/_8dacd1e7._.js.map +1 -1
  139. package/web/.next/server/chunks/ssr/_cc77a143._.js +1 -1
  140. package/web/.next/server/chunks/ssr/_cc77a143._.js.map +1 -1
  141. package/web/.next/server/chunks/ssr/_f5316e67._.js +3 -0
  142. package/web/.next/server/chunks/ssr/_f5316e67._.js.map +1 -0
  143. package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_settings_settings-page-client_tsx_6ed9d5f8._.js +1 -1
  144. package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_settings_settings-page-client_tsx_6ed9d5f8._.js.map +1 -1
  145. package/web/.next/server/chunks/ssr/{src_presentation_web_3c53a23d._.js → src_presentation_web_7275ce5d._.js} +3 -3
  146. package/web/.next/server/chunks/ssr/{src_presentation_web_3c53a23d._.js.map → src_presentation_web_7275ce5d._.js.map} +1 -1
  147. package/web/.next/server/chunks/ssr/{src_presentation_web_ec8c7a4f._.js → src_presentation_web_758dfa10._.js} +3 -3
  148. package/web/.next/server/chunks/ssr/{src_presentation_web_ec8c7a4f._.js.map → src_presentation_web_758dfa10._.js.map} +1 -1
  149. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_84803221.js +3 -0
  150. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_84803221.js.map +1 -0
  151. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_skills_page_actions_1fa8042e.js +1 -1
  152. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_skills_page_actions_1fa8042e.js.map +1 -1
  153. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_tools_page_actions_24684200.js +1 -1
  154. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_tools_page_actions_24684200.js.map +1 -1
  155. package/web/.next/server/chunks/ssr/src_presentation_web_components_bf50c527._.js +1 -1
  156. package/web/.next/server/chunks/ssr/src_presentation_web_components_bf50c527._.js.map +1 -1
  157. package/web/.next/server/chunks/ssr/src_presentation_web_components_de814675._.js +1 -1
  158. package/web/.next/server/chunks/ssr/src_presentation_web_components_de814675._.js.map +1 -1
  159. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js +1 -1
  160. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js.map +1 -1
  161. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_tools_tools-page-client_tsx_3d0aa70c._.js +1 -1
  162. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_tools_tools-page-client_tsx_3d0aa70c._.js.map +1 -1
  163. package/web/.next/server/pages/500.html +2 -2
  164. package/web/.next/server/server-reference-manifest.js +1 -1
  165. package/web/.next/server/server-reference-manifest.json +273 -273
  166. package/web/.next/static/chunks/07b853e29af1e5f2.js +1 -0
  167. package/web/.next/static/chunks/12f2e950ef2c1a25.js +1 -0
  168. package/web/.next/static/chunks/{d3c337aa9acbfd96.js → 27b176706ec35488.js} +2 -2
  169. package/web/.next/static/chunks/28aa6c032562c065.js +1 -0
  170. package/web/.next/static/chunks/3a806cf059241bc9.js +1 -0
  171. package/web/.next/static/chunks/3ff4c5790bf84403.js +1 -0
  172. package/web/.next/static/chunks/{d994924b9107401b.js → 5981cd90d8cbdad7.js} +1 -1
  173. package/web/.next/static/chunks/790f576eb41aedc6.js +1 -0
  174. package/web/.next/static/chunks/{0ecdad7af8d93397.js → 87ce4933c46c0c18.js} +1 -1
  175. package/web/.next/static/chunks/{bfee4f72255f4654.js → 8f9956f5871a8cdb.js} +2 -2
  176. package/web/.next/static/chunks/93058c22968e2fef.css +1 -0
  177. package/web/.next/static/chunks/a39402a05bf12912.js +1 -0
  178. package/web/.next/static/chunks/f37993a7b6f87fcb.js +1 -0
  179. package/web/.next/server/chunks/ssr/7f428_lucide-react_dist_esm_icons_6ba7eb21._.js +0 -3
  180. package/web/.next/server/chunks/ssr/7f428_lucide-react_dist_esm_icons_6ba7eb21._.js.map +0 -1
  181. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_c757eb00.js +0 -3
  182. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_c757eb00.js.map +0 -1
  183. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_7eb49631.js +0 -3
  184. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_7eb49631.js.map +0 -1
  185. package/web/.next/server/chunks/ssr/[root-of-the-server]__7b49fcb3._.js +0 -3
  186. package/web/.next/server/chunks/ssr/[root-of-the-server]__7b49fcb3._.js.map +0 -1
  187. package/web/.next/server/chunks/ssr/_60e203af._.js +0 -3
  188. package/web/.next/server/chunks/ssr/_60e203af._.js.map +0 -1
  189. package/web/.next/server/chunks/ssr/_6a83bd29._.js +0 -3
  190. package/web/.next/server/chunks/ssr/_6a83bd29._.js.map +0 -1
  191. package/web/.next/server/chunks/ssr/_7d954884._.js +0 -3
  192. package/web/.next/server/chunks/ssr/_7d954884._.js.map +0 -1
  193. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_befd865a.js +0 -3
  194. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_befd865a.js.map +0 -1
  195. package/web/.next/static/chunks/0a370e5d6fd1bb24.js +0 -1
  196. package/web/.next/static/chunks/2d3dc372f05429dd.css +0 -1
  197. package/web/.next/static/chunks/3092c9611e2dc032.js +0 -1
  198. package/web/.next/static/chunks/30dc64780817371a.js +0 -1
  199. package/web/.next/static/chunks/ac12b8d2bd59675e.js +0 -1
  200. package/web/.next/static/chunks/b272ac93b52dceeb.js +0 -1
  201. package/web/.next/static/chunks/d61cbdfc00003e44.js +0 -1
  202. package/web/.next/static/chunks/e248c85913405af4.js +0 -1
  203. package/web/.next/static/chunks/e24a024affc634d9.js +0 -1
  204. /package/web/.next/static/{_-n7Ii9h0sTnlzE_aFMQI → YTwpzFRHYkkE5cDxaRlDQ}/_buildManifest.js +0 -0
  205. /package/web/.next/static/{_-n7Ii9h0sTnlzE_aFMQI → YTwpzFRHYkkE5cDxaRlDQ}/_clientMiddlewareManifest.json +0 -0
  206. /package/web/.next/static/{_-n7Ii9h0sTnlzE_aFMQI → YTwpzFRHYkkE5cDxaRlDQ}/_ssgManifest.js +0 -0
package/README.md CHANGED
@@ -30,13 +30,14 @@ _Describe a feature in plain English — Shep researches, plans, codes, tests, a
30
30
  ## Quick Start
31
31
 
32
32
  ```bash
33
- # 1. Install
34
- npm i -g @shepai/cli
33
+ # Try it instantly — no install needed
34
+ npx @shepai/cli
35
35
 
36
- # 2. Run Shep — completes setup on first run, then opens the web UI
36
+ # Or install globally
37
+ npm i -g @shepai/cli
37
38
  shep
38
39
 
39
- # 3. Browser opens at http://localhost:4050 — you're in
40
+ # Browser opens at http://localhost:4050 — you're in
40
41
  ```
41
42
 
42
43
  ---
@@ -284,12 +284,13 @@ export interface IGitPrService {
284
284
  * Output is truncated to the first `logMaxChars` characters (head truncation).
285
285
  * A notice is appended when truncation occurs.
286
286
  *
287
+ * @param cwd - Working directory (must be inside a git repo so gh can resolve the remote)
287
288
  * @param runId - GitHub Actions run ID (numeric string)
288
289
  * @param branch - Branch name (informational, used in truncation notice)
289
290
  * @param logMaxChars - Maximum characters to return (default 50_000)
290
291
  * @returns Truncated failure log output
291
292
  * @throws GitPrError with GH_NOT_FOUND or GIT_ERROR code on failure
292
293
  */
293
- getFailureLogs(runId: string, branch: string, logMaxChars?: number): Promise<string>;
294
+ getFailureLogs(cwd: string, runId: string, branch: string, logMaxChars?: number): Promise<string>;
294
295
  }
295
296
  //# sourceMappingURL=git-pr-service.interface.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"git-pr-service.interface.d.ts","sourceRoot":"","sources":["../../../../../../../../packages/core/src/application/ports/output/services/git-pr-service.interface.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"git-pr-service.interface.d.ts","sourceRoot":"","sources":["../../../../../../../../packages/core/src/application/ports/output/services/git-pr-service.interface.ts"],"names":[],"mappings":"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"}
@@ -85,7 +85,7 @@ export async function runCiWatchFixLoop(deps, params) {
85
85
  }
86
86
  // Fetch failure logs
87
87
  const runId = extractRunId(runUrl) ?? '';
88
- const failureLogs = await gitPrService.getFailureLogs(runId, branch, logMaxChars);
88
+ const failureLogs = await gitPrService.getFailureLogs(cwd, runId, branch, logMaxChars);
89
89
  const startedAt = new Date().toISOString();
90
90
  log.info(`CI fix attempt ${ciFixAttempts + 1}/${maxAttempts} for run ${runId}`);
91
91
  // Invoke fix executor
@@ -34,7 +34,7 @@ export declare class GitPrService implements IGitPrService {
34
34
  * tracking branch if the local ref has been deleted.
35
35
  */
36
36
  private resolveRef;
37
- getFailureLogs(runId: string, _branch: string, logMaxChars?: number): Promise<string>;
37
+ getFailureLogs(cwd: string, runId: string, _branch: string, logMaxChars?: number): Promise<string>;
38
38
  private truncateLog;
39
39
  private parseMergeable;
40
40
  private normalizeGhState;
@@ -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":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,wEAAwE,CAAC;AAC5G,OAAO,KAAK,EACV,cAAc,EAGd,WAAW,EACX,QAAQ,EACR,aAAa,EACb,cAAc,EACd,YAAY,EACb,MAAM,wEAAwE,CAAC;AAQhF,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAE1D,qBACa,YAAa,YAAW,aAAa;IACZ,OAAO,CAAC,QAAQ,CAAC,QAAQ;gBAAR,QAAQ,EAAE,YAAY;IAErE,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAKxC,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAgBjD,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAgF9C,qBAAqB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAKpD,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAWxD,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAYvE,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;IAuClE,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,GAAE,aAAwB,GAAG,OAAO,CAAC,IAAI,CAAC;IAUzF,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAUnF,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;IAsBjE,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;IAmDjF,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAWhF,gBAAgB,CAAC,GAAG,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IAevE,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC;IAaxE,OAAO,CAAC,gBAAgB;IAexB,OAAO,CAAC,aAAa;IAmFf,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IAoCpD,kBAAkB,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,GAAG,SAAS,CAAC;IAc/E,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IA6B3F;;;OAGG;YACW,UAAU;IAmBlB,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,WAAW,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC;IAW3F,OAAO,CAAC,WAAW;IAQnB,OAAO,CAAC,cAAc;IAMtB,OAAO,CAAC,gBAAgB;IAKxB,OAAO,CAAC,aAAa;IAcrB,OAAO,CAAC,YAAY;IAepB,OAAO,CAAC,oBAAoB;IAK5B,OAAO,CAAC,aAAa;CAiBtB"}
1
+ {"version":3,"file":"git-pr.service.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/src/infrastructure/services/git/git-pr.service.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,wEAAwE,CAAC;AAC5G,OAAO,KAAK,EACV,cAAc,EAGd,WAAW,EACX,QAAQ,EACR,aAAa,EACb,cAAc,EACd,YAAY,EACb,MAAM,wEAAwE,CAAC;AAQhF,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAE1D,qBACa,YAAa,YAAW,aAAa;IACZ,OAAO,CAAC,QAAQ,CAAC,QAAQ;gBAAR,QAAQ,EAAE,YAAY;IAErE,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAKxC,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAgBjD,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAgF9C,qBAAqB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAKpD,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAWxD,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAYvE,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;IAuClE,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,GAAE,aAAwB,GAAG,OAAO,CAAC,IAAI,CAAC;IAUzF,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAUnF,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;IAsBjE,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;IAmDjF,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAWhF,gBAAgB,CAAC,GAAG,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IAevE,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC;IAaxE,OAAO,CAAC,gBAAgB;IAexB,OAAO,CAAC,aAAa;IAmFf,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IAoCpD,kBAAkB,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,GAAG,SAAS,CAAC;IAc/E,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IA6B3F;;;OAGG;YACW,UAAU;IAmBlB,cAAc,CAClB,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,EACf,WAAW,SAAS,GACnB,OAAO,CAAC,MAAM,CAAC;IAWlB,OAAO,CAAC,WAAW;IAQnB,OAAO,CAAC,cAAc;IAMtB,OAAO,CAAC,gBAAgB;IAKxB,OAAO,CAAC,aAAa;IAcrB,OAAO,CAAC,YAAY;IAepB,OAAO,CAAC,oBAAoB;IAK5B,OAAO,CAAC,aAAa;CAiBtB"}
@@ -465,10 +465,10 @@ let GitPrService = class GitPrService {
465
465
  return null;
466
466
  }
467
467
  }
468
- async getFailureLogs(runId, _branch, logMaxChars = 50_000) {
468
+ async getFailureLogs(cwd, runId, _branch, logMaxChars = 50_000) {
469
469
  try {
470
470
  const { stdout } = await this.execFile('gh', ['run', 'view', runId, '--log-failed'], {
471
- cwd: undefined,
471
+ cwd,
472
472
  });
473
473
  return this.truncateLog(stdout, logMaxChars, runId);
474
474
  }
@@ -0,0 +1,19 @@
1
+ export interface AgentAuthStatus {
2
+ agentType: string;
3
+ /** Whether the CLI tool binary is installed */
4
+ installed: boolean;
5
+ /** Whether credentials / auth appear valid */
6
+ authenticated: boolean;
7
+ /** Human-readable label for the agent */
8
+ label: string;
9
+ /** CLI binary name (e.g. "claude", "gemini") */
10
+ binaryName: string | null;
11
+ /** Instructions to authenticate if not authenticated */
12
+ authCommand: string | null;
13
+ }
14
+ /**
15
+ * Check agent tool installation + auth status.
16
+ * Uses two-tier detection: instant file/env check, then optional subprocess verify.
17
+ */
18
+ export declare function checkAgentAuth(): Promise<AgentAuthStatus>;
19
+ //# sourceMappingURL=check-agent-auth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"check-agent-auth.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/web/app/actions/check-agent-auth.ts"],"names":[],"mappings":"AAUA,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,+CAA+C;IAC/C,SAAS,EAAE,OAAO,CAAC;IACnB,8CAA8C;IAC9C,aAAa,EAAE,OAAO,CAAC;IACvB,yCAAyC;IACzC,KAAK,EAAE,MAAM,CAAC;IACd,gDAAgD;IAChD,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,wDAAwD;IACxD,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B;AA4FD;;;GAGG;AACH,wBAAsB,cAAc,IAAI,OAAO,CAAC,eAAe,CAAC,CAiF/D"}
@@ -0,0 +1,178 @@
1
+ 'use server';
2
+ import { existsSync } from 'node:fs';
3
+ import { join } from 'node:path';
4
+ import { homedir } from 'node:os';
5
+ import { execFile } from 'node:child_process';
6
+ import { getSettings } from '../../../../../packages/core/src/infrastructure/services/settings.service.js';
7
+ import { resolve } from '../../lib/server-container.js';
8
+ const AGENT_LABELS = {
9
+ 'claude-code': 'Claude Code',
10
+ cursor: 'Cursor Agent',
11
+ 'gemini-cli': 'Gemini CLI',
12
+ aider: 'Aider',
13
+ continue: 'Continue',
14
+ dev: 'Demo',
15
+ };
16
+ const AGENT_TOOL_MAP = {
17
+ 'claude-code': 'claude-code',
18
+ cursor: 'cursor-cli',
19
+ 'gemini-cli': 'gemini-cli',
20
+ };
21
+ const AGENT_BINARY_MAP = {
22
+ 'claude-code': 'claude',
23
+ cursor: 'agent',
24
+ 'gemini-cli': 'gemini',
25
+ };
26
+ /**
27
+ * Tier 1: Instant credential/env check (~5ms, no subprocess).
28
+ * Returns true if credentials likely exist.
29
+ */
30
+ function tier1AuthCheck(agentType) {
31
+ const home = homedir();
32
+ switch (agentType) {
33
+ case 'claude-code': {
34
+ if (process.env['ANTHROPIC_API_KEY'])
35
+ return true;
36
+ if (process.env['CLAUDE_CODE_USE_BEDROCK'])
37
+ return true;
38
+ if (process.env['CLAUDE_CODE_USE_VERTEX'])
39
+ return true;
40
+ if (process.env['CLAUDE_CODE_OAUTH_TOKEN'])
41
+ return true;
42
+ const credPath = join(home, '.claude', '.credentials.json');
43
+ return existsSync(credPath);
44
+ }
45
+ case 'cursor': {
46
+ if (process.env['CURSOR_API_KEY'])
47
+ return true;
48
+ // Cursor Agent stores creds after `agent login` — check common locations
49
+ const cursorDir = join(home, '.cursor');
50
+ return existsSync(cursorDir);
51
+ }
52
+ case 'gemini-cli': {
53
+ if (process.env['GEMINI_API_KEY'])
54
+ return true;
55
+ if (process.env['GOOGLE_API_KEY'])
56
+ return true;
57
+ if (process.env['GOOGLE_APPLICATION_CREDENTIALS'])
58
+ return true;
59
+ const accountsPath = join(home, '.gemini', 'google_accounts.json');
60
+ return existsSync(accountsPath);
61
+ }
62
+ default:
63
+ // dev, aider, continue — assume no auth needed
64
+ return true;
65
+ }
66
+ }
67
+ /**
68
+ * Tier 2: Subprocess verification (~200ms).
69
+ * Only called if tier 1 passes, to confirm tokens aren't expired.
70
+ */
71
+ function tier2AuthVerify(agentType, binaryName) {
72
+ return new Promise((resolve) => {
73
+ let cmd;
74
+ let args;
75
+ switch (agentType) {
76
+ case 'claude-code':
77
+ cmd = binaryName;
78
+ args = ['auth', 'status'];
79
+ break;
80
+ case 'cursor':
81
+ cmd = binaryName;
82
+ args = ['status'];
83
+ break;
84
+ default:
85
+ // No tier 2 command available — trust tier 1
86
+ resolve(true);
87
+ return;
88
+ }
89
+ try {
90
+ execFile(cmd, args, { timeout: 5000 }, (error) => {
91
+ resolve(!error);
92
+ });
93
+ }
94
+ catch {
95
+ resolve(false);
96
+ }
97
+ });
98
+ }
99
+ /**
100
+ * Check agent tool installation + auth status.
101
+ * Uses two-tier detection: instant file/env check, then optional subprocess verify.
102
+ */
103
+ export async function checkAgentAuth() {
104
+ let agentType;
105
+ try {
106
+ agentType = getSettings().agent.type;
107
+ }
108
+ catch {
109
+ return {
110
+ agentType: 'unknown',
111
+ installed: false,
112
+ authenticated: false,
113
+ label: 'Unknown',
114
+ binaryName: null,
115
+ authCommand: null,
116
+ };
117
+ }
118
+ const label = AGENT_LABELS[agentType] ?? agentType;
119
+ const toolId = AGENT_TOOL_MAP[agentType] ?? null;
120
+ const binaryName = AGENT_BINARY_MAP[agentType] ?? null;
121
+ // Dev/demo agents — always good
122
+ if (!toolId) {
123
+ return {
124
+ agentType,
125
+ installed: true,
126
+ authenticated: true,
127
+ label,
128
+ binaryName: null,
129
+ authCommand: null,
130
+ };
131
+ }
132
+ // Check if tool is installed
133
+ let installed = false;
134
+ try {
135
+ const useCase = resolve('ListToolsUseCase');
136
+ const tools = await useCase.execute();
137
+ const tool = tools.find((t) => t.id === toolId);
138
+ installed = tool?.status.status === 'available';
139
+ }
140
+ catch {
141
+ installed = false;
142
+ }
143
+ if (!installed) {
144
+ return {
145
+ agentType,
146
+ installed: false,
147
+ authenticated: false,
148
+ label,
149
+ binaryName,
150
+ authCommand: binaryName ? `Install ${label} first` : null,
151
+ };
152
+ }
153
+ // Tier 1: instant file/env check
154
+ const tier1 = tier1AuthCheck(agentType);
155
+ if (!tier1) {
156
+ return {
157
+ agentType,
158
+ installed: true,
159
+ authenticated: false,
160
+ label,
161
+ binaryName,
162
+ authCommand: binaryName,
163
+ };
164
+ }
165
+ // Tier 2: subprocess verify (best effort, ~200ms)
166
+ let authenticated = true;
167
+ if (binaryName) {
168
+ authenticated = await tier2AuthVerify(agentType, binaryName);
169
+ }
170
+ return {
171
+ agentType,
172
+ installed: true,
173
+ authenticated,
174
+ label,
175
+ binaryName,
176
+ authCommand: authenticated ? null : binaryName,
177
+ };
178
+ }
@@ -67,7 +67,7 @@ export function FeatureNode({ data, selected, }) {
67
67
  const config = featureNodeStateConfig[data.state];
68
68
  const Icon = config.icon;
69
69
  const [confirmOpen, setConfirmOpen] = useState(false);
70
- return (_jsxs("div", { className: "group relative", children: [data.showHandles ? (_jsx(Handle, { type: "target", position: Position.Left, isConnectable: false, className: "opacity-0!" })) : null, data.onDelete && data.featureId && data.state !== 'deleting' ? (_jsxs(_Fragment, { children: [_jsx("div", { className: "absolute top-1/2 -left-10 -translate-y-1/2 opacity-0 transition-opacity group-hover:opacity-100", onPointerDown: (e) => e.stopPropagation(), children: _jsx(TooltipProvider, { children: _jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx("button", { "aria-label": "Delete feature", "data-testid": "feature-node-delete-button", onClick: (e) => {
70
+ return (_jsxs("div", { className: "animate-in fade-in group relative duration-300", children: [data.showHandles ? (_jsx(Handle, { type: "target", position: Position.Left, isConnectable: false, className: "opacity-0!" })) : null, data.onDelete && data.featureId && data.state !== 'deleting' ? (_jsxs(_Fragment, { children: [_jsx("div", { className: "absolute top-1/2 -left-10 -translate-y-1/2 opacity-0 transition-opacity group-hover:opacity-100", onPointerDown: (e) => e.stopPropagation(), children: _jsx(TooltipProvider, { children: _jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx("button", { "aria-label": "Delete feature", "data-testid": "feature-node-delete-button", onClick: (e) => {
71
71
  e.stopPropagation();
72
72
  setConfirmOpen(true);
73
73
  }, className: "bg-card text-muted-foreground hover:border-destructive hover:text-destructive flex h-7 w-7 cursor-pointer items-center justify-center rounded-full border shadow-sm transition-colors", children: _jsx(Trash2, { className: "h-3.5 w-3.5" }) }) }), _jsx(TooltipContent, { children: "Delete feature" })] }) }) }), _jsx(DeleteFeatureDialog, { open: confirmOpen, onOpenChange: setConfirmOpen, onConfirm: (cleanup) => {
@@ -2,5 +2,5 @@ export interface ControlCenterEmptyStateProps {
2
2
  onRepositorySelect?: (path: string) => void;
3
3
  className?: string;
4
4
  }
5
- export declare function ControlCenterEmptyState({ onRepositorySelect, className, }: ControlCenterEmptyStateProps): import("react/jsx-runtime").JSX.Element;
5
+ export declare function ControlCenterEmptyState({ onRepositorySelect, className, }: ControlCenterEmptyStateProps): import("react/jsx-runtime").JSX.Element | null;
6
6
  //# sourceMappingURL=control-center-empty-state.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"control-center-empty-state.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/features/control-center/control-center-empty-state.tsx"],"names":[],"mappings":"AASA,MAAM,WAAW,4BAA4B;IAC3C,kBAAkB,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAC5C,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAID,wBAAgB,uBAAuB,CAAC,EACtC,kBAAkB,EAClB,SAAS,GACV,EAAE,4BAA4B,2CAiI9B"}
1
+ {"version":3,"file":"control-center-empty-state.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/features/control-center/control-center-empty-state.tsx"],"names":[],"mappings":"AAqBA,MAAM,WAAW,4BAA4B;IAC3C,kBAAkB,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAC5C,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAID,wBAAgB,uBAAuB,CAAC,EACtC,kBAAkB,EAClB,SAAS,GACV,EAAE,4BAA4B,kDA+I9B"}
@@ -1,22 +1,29 @@
1
1
  'use client';
2
2
  import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
3
3
  import { useState, useCallback, useEffect } from 'react';
4
- import { Github, Plus, TerminalSquare, Copy, Check, Loader2 } from 'lucide-react';
4
+ import { Github, Plus, TerminalSquare, Copy, Check, Loader2, CheckCircle2, AlertCircle, Terminal, } from 'lucide-react';
5
5
  import { cn } from '../../../lib/utils.js';
6
6
  import { pickFolder } from '../../common/add-repository-button/pick-folder.js';
7
7
  import { isAgentSetupComplete } from '../../../app/actions/agent-setup-flag.js';
8
+ import { checkAgentAuth } from '../../../app/actions/check-agent-auth.js';
8
9
  import { WelcomeAgentSetup } from './welcome-agent-setup.js';
9
10
  const commands = ['cd ~/my-repo', 'shep feat new "sleek dashboard"'];
10
11
  export function ControlCenterEmptyState({ onRepositorySelect, className, }) {
11
12
  const [copied, setCopied] = useState(false);
12
13
  const [loading, setLoading] = useState(false);
13
- const [agentReady, setAgentReady] = useState(false);
14
+ const [agentReady, setAgentReady] = useState(null);
15
+ const [authStatus, setAuthStatus] = useState(null);
14
16
  useEffect(() => {
15
17
  isAgentSetupComplete().then((done) => {
16
- if (done)
17
- setAgentReady(true);
18
+ setAgentReady(done);
18
19
  });
19
20
  }, []);
21
+ // Background auth check — runs after agent setup is complete
22
+ useEffect(() => {
23
+ if (!agentReady)
24
+ return;
25
+ checkAgentAuth().then(setAuthStatus);
26
+ }, [agentReady]);
20
27
  async function handlePickerClick() {
21
28
  if (loading)
22
29
  return;
@@ -39,9 +46,40 @@ export function ControlCenterEmptyState({ onRepositorySelect, className, }) {
39
46
  const handleAgentSetupComplete = useCallback(() => {
40
47
  setAgentReady(true);
41
48
  }, []);
42
- return (_jsxs("div", { "data-testid": "control-center-empty-state", className: cn('relative h-full w-full', className), children: [_jsx("div", { className: "absolute inset-0 [background-image:radial-gradient(circle,_var(--color-border)_1px,_transparent_1px)] [background-size:24px_24px]" }), _jsxs("div", { className: "absolute top-8 left-8 z-10", children: [_jsx("h1", { className: "text-4xl font-bold tracking-tight", children: "Features" }), _jsx("p", { className: "text-muted-foreground text-3xl font-light", children: "Control Center" })] }), _jsx("div", { className: "relative z-10 flex h-full items-center justify-center", children: _jsx("div", { className: "flex w-72 flex-col items-center gap-4", children: !agentReady ? (
49
+ const handleRetryAuth = useCallback(() => {
50
+ setAuthStatus(null);
51
+ checkAgentAuth().then(setAuthStatus);
52
+ }, []);
53
+ if (agentReady === null)
54
+ return null;
55
+ return (_jsx("div", { "data-testid": "control-center-empty-state", className: cn('flex flex-col items-center justify-center', className), children: _jsx("div", { className: "animate-in fade-in slide-in-from-bottom-2 w-96 rounded-2xl border border-white/30 bg-white/50 px-8 py-8 shadow-lg backdrop-blur-xl duration-300 dark:border-white/10 dark:bg-white/5", children: _jsxs("div", { className: "flex flex-col items-center gap-4", children: [_jsxs("div", { className: "mb-2 text-center", children: [_jsx("h1", { className: "text-xl font-bold tracking-tight", children: "Features" }), _jsx("p", { className: "text-muted-foreground text-sm font-light", children: "Control Center" })] }), !agentReady ? (
43
56
  /* Step 1: Agent setup */
44
- _jsx(WelcomeAgentSetup, { onComplete: handleAgentSetupComplete })) : (
45
- /* Step 2: Add repository (shown after agent is configured) */
46
- _jsxs(_Fragment, { children: [_jsxs("div", { className: "text-muted-foreground flex items-center gap-2", children: [_jsx(Github, { className: "h-3.5 w-3.5" }), _jsx("span", { className: "text-[10px] font-semibold tracking-widest uppercase", children: "Repositories" })] }), _jsxs("button", { type: "button", "data-testid": "empty-state-add-repository", onClick: handlePickerClick, disabled: loading, className: "border-border hover:border-foreground/40 flex w-full cursor-pointer items-center gap-2.5 rounded-md border border-dashed px-4 py-2.5 transition-colors disabled:cursor-wait disabled:opacity-50", children: [loading ? (_jsx(Loader2, { className: "text-muted-foreground h-4 w-4 animate-spin" })) : (_jsx(Plus, { className: "text-muted-foreground h-4 w-4" })), _jsx("span", { className: "text-xs font-medium", children: loading ? 'Opening…' : 'Add Repository' })] }), _jsxs("div", { className: "text-muted-foreground flex items-center gap-2", children: [_jsx("div", { className: "bg-border h-px w-10" }), _jsxs("div", { className: "flex items-center gap-1", children: [_jsx(TerminalSquare, { className: "h-3 w-3" }), _jsx("span", { className: "text-[10px] font-semibold tracking-widest uppercase", children: "Or via CLI" })] }), _jsx("div", { className: "bg-border h-px w-10" })] }), _jsxs("div", { "data-testid": "cli-code-block", className: "relative w-full rounded-md bg-zinc-900 px-3 py-2 font-mono text-[11px] text-zinc-300", children: [_jsx("button", { type: "button", "data-testid": "cli-code-block-copy", onClick: handleCopy, className: "absolute top-2 right-2 cursor-pointer rounded p-1 text-zinc-500 transition-colors hover:bg-zinc-800 hover:text-zinc-300", "aria-label": "Copy commands", children: copied ? _jsx(Check, { className: "h-3 w-3" }) : _jsx(Copy, { className: "h-3 w-3" }) }), _jsx("div", { className: "space-y-0.5", children: commands.map((cmd) => (_jsxs("div", { className: "whitespace-nowrap", children: [_jsx("span", { className: "text-zinc-500 select-none", children: "$ " }), _jsx("span", { children: cmd })] }, cmd))) })] }), _jsx("p", { className: "text-muted-foreground text-[10px]", children: "Feature will appear on canvas once created" })] })) }) })] }));
57
+ _jsx(WelcomeAgentSetup, { onComplete: handleAgentSetupComplete, className: "w-full" })) : (
58
+ /* Step 2: Add repository (shown immediately after agent is configured) */
59
+ _jsxs(_Fragment, { children: [_jsx(AgentAuthBanner, { status: authStatus, onRetry: handleRetryAuth }), _jsxs("div", { className: "text-muted-foreground flex items-center gap-2", children: [_jsx(Github, { className: "h-3.5 w-3.5" }), _jsx("span", { className: "text-[10px] font-semibold tracking-widest uppercase", children: "Repositories" })] }), _jsxs("button", { type: "button", "data-testid": "empty-state-add-repository", onClick: handlePickerClick, disabled: loading, className: "border-border hover:border-foreground/40 flex w-full cursor-pointer items-center gap-2.5 rounded-md border border-dashed px-4 py-2.5 transition-colors disabled:cursor-wait disabled:opacity-50", children: [loading ? (_jsx(Loader2, { className: "text-muted-foreground h-4 w-4 animate-spin" })) : (_jsx(Plus, { className: "text-muted-foreground h-4 w-4" })), _jsx("span", { className: "text-xs font-medium", children: loading ? 'Opening…' : 'Add Repository' })] }), _jsxs("div", { className: "text-muted-foreground flex items-center gap-2", children: [_jsx("div", { className: "bg-border h-px w-10" }), _jsxs("div", { className: "flex items-center gap-1", children: [_jsx(TerminalSquare, { className: "h-3 w-3" }), _jsx("span", { className: "text-[10px] font-semibold tracking-widest uppercase", children: "Or via CLI" })] }), _jsx("div", { className: "bg-border h-px w-10" })] }), _jsxs("div", { "data-testid": "cli-code-block", className: "relative w-full rounded-md bg-zinc-900 px-3 py-2 font-mono text-[11px] text-zinc-300", children: [_jsx("button", { type: "button", "data-testid": "cli-code-block-copy", onClick: handleCopy, className: "absolute top-2 right-2 cursor-pointer rounded p-1 text-zinc-500 transition-colors hover:bg-zinc-800 hover:text-zinc-300", "aria-label": "Copy commands", children: copied ? _jsx(Check, { className: "h-3 w-3" }) : _jsx(Copy, { className: "h-3 w-3" }) }), _jsx("div", { className: "space-y-0.5", children: commands.map((cmd) => (_jsxs("div", { className: "whitespace-nowrap", children: [_jsx("span", { className: "text-zinc-500 select-none", children: "$ " }), _jsx("span", { children: cmd })] }, cmd))) })] }), _jsx("p", { className: "text-muted-foreground text-[10px]", children: "Feature will appear on canvas once created" })] }))] }) }) }));
60
+ }
61
+ /** Compact auth status banner — shows checking/success/error states */
62
+ function AgentAuthBanner({ status, onRetry, }) {
63
+ // Still checking — show subtle spinner
64
+ if (!status) {
65
+ return (_jsxs("div", { className: "bg-muted/50 flex w-full items-center gap-2 rounded-md px-3 py-1.5", children: [_jsx(Loader2, { className: "text-muted-foreground h-3 w-3 animate-spin" }), _jsx("span", { className: "text-muted-foreground text-[10px]", children: "Checking agent setup\u2026" })] }));
66
+ }
67
+ // All good — compact success, auto-fades
68
+ if (status.installed && status.authenticated) {
69
+ return (_jsxs("div", { className: "animate-in fade-in flex w-full items-center gap-2 rounded-md bg-emerald-500/10 px-3 py-1.5", children: [_jsx(CheckCircle2, { className: "h-3 w-3 text-emerald-600 dark:text-emerald-400" }), _jsxs("span", { className: "text-[10px] text-emerald-700 dark:text-emerald-300", children: [status.label, " ready"] })] }));
70
+ }
71
+ // Not installed
72
+ if (!status.installed) {
73
+ return (_jsxs("div", { className: "flex w-full flex-col gap-2 rounded-md bg-amber-500/10 px-3 py-2", children: [_jsxs("div", { className: "flex items-center gap-2", children: [_jsx(AlertCircle, { className: "h-3 w-3 text-amber-600 dark:text-amber-400" }), _jsxs("span", { className: "text-[10px] font-medium text-amber-700 dark:text-amber-300", children: [status.label, " not installed"] })] }), status.binaryName ? (_jsxs("div", { className: "rounded bg-zinc-900 px-2 py-1 font-mono text-[10px] text-zinc-300", children: [_jsx("span", { className: "text-zinc-500 select-none", children: "$ " }), "npm install -g ", status.binaryName] })) : null, _jsx("button", { type: "button", onClick: onRetry, className: "self-start text-[10px] font-medium text-amber-700 underline underline-offset-2 hover:text-amber-900 dark:text-amber-300 dark:hover:text-amber-100", children: "Re-check" })] }));
74
+ }
75
+ // Installed but not authenticated
76
+ return (_jsxs("div", { className: "flex w-full flex-col gap-2 rounded-md bg-amber-500/10 px-3 py-2", children: [_jsxs("div", { className: "flex items-center gap-2", children: [_jsx(AlertCircle, { className: "h-3 w-3 text-amber-600 dark:text-amber-400" }), _jsxs("span", { className: "text-[10px] font-medium text-amber-700 dark:text-amber-300", children: [status.label, " needs authentication"] })] }), status.authCommand ? (_jsxs("div", { className: "rounded bg-zinc-900 px-2 py-1 font-mono text-[10px] text-zinc-300", children: [_jsx("span", { className: "text-zinc-500 select-none", children: "$ " }), status.authCommand] })) : null, _jsxs("div", { className: "flex items-center gap-2", children: [status.binaryName ? (_jsxs("button", { type: "button", "data-testid": "auth-banner-open-terminal", onClick: async () => {
77
+ try {
78
+ const toolId = status.agentType === 'claude-code' ? 'claude-code' : status.agentType;
79
+ await fetch(`/api/tools/${toolId}/launch`, { method: 'POST' });
80
+ }
81
+ catch {
82
+ // best effort
83
+ }
84
+ }, className: "flex items-center gap-1 rounded border border-amber-600/30 px-2 py-0.5 text-[10px] font-medium text-amber-700 transition-colors hover:bg-amber-500/10 dark:text-amber-300", children: [_jsx(Terminal, { className: "h-2.5 w-2.5" }), "Open ", status.label] })) : null, _jsx("button", { type: "button", onClick: onRetry, className: "text-[10px] font-medium text-amber-700 underline underline-offset-2 hover:text-amber-900 dark:text-amber-300 dark:hover:text-amber-100", children: "Re-check" })] })] }));
47
85
  }
@@ -1 +1 @@
1
- {"version":3,"file":"control-center-inner.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/features/control-center/control-center-inner.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,IAAI,EAAY,MAAM,eAAe,CAAC;AAGpD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uCAAuC,CAAC;AAsB5E,UAAU,uBAAuB;IAC/B,YAAY,EAAE,cAAc,EAAE,CAAC;IAC/B,YAAY,EAAE,IAAI,EAAE,CAAC;CACtB;AAED,wBAAgB,kBAAkB,CAAC,EAAE,YAAY,EAAE,YAAY,EAAE,EAAE,uBAAuB,2CA8RzF"}
1
+ {"version":3,"file":"control-center-inner.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/features/control-center/control-center-inner.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,IAAI,EAAY,MAAM,eAAe,CAAC;AAGpD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uCAAuC,CAAC;AAsB5E,UAAU,uBAAuB;IAC/B,YAAY,EAAE,cAAc,EAAE,CAAC;IAC/B,YAAY,EAAE,IAAI,EAAE,CAAC;CACtB;AAED,wBAAgB,kBAAkB,CAAC,EAAE,YAAY,EAAE,YAAY,EAAE,EAAE,uBAAuB,2CAoTzF"}
@@ -1,6 +1,6 @@
1
1
  'use client';
2
2
  import { jsx as _jsx } from "react/jsx-runtime";
3
- import { useCallback, useEffect, useMemo, useRef } from 'react';
3
+ import { useCallback, useEffect, useMemo, useRef, useState } from 'react';
4
4
  import { useRouter, usePathname } from 'next/navigation';
5
5
  import { useReactFlow } from '@xyflow/react';
6
6
  import { FeaturesCanvas } from '../../features/features-canvas/index.js';
@@ -195,6 +195,32 @@ export function ControlCenterInner({ initialNodes, initialEdges }) {
195
195
  handleViewportChange(viewport);
196
196
  }, [handleViewportChange]);
197
197
  const hasRepositories = nodes.some((n) => n.type === 'repositoryNode');
198
+ // Debounced latch: prevent empty-state flicker during brief reconcile gaps
199
+ // (e.g. stale poll momentarily drops repos), but allow the empty state to
200
+ // return after a real delete once repos stay gone past the debounce window.
201
+ const [showCanvas, setShowCanvas] = useState(hasRepositories);
202
+ const latchTimerRef = useRef(null);
203
+ useEffect(() => {
204
+ if (hasRepositories) {
205
+ // Repos exist — show canvas immediately, cancel any pending unlatch
206
+ if (latchTimerRef.current) {
207
+ clearTimeout(latchTimerRef.current);
208
+ latchTimerRef.current = null;
209
+ }
210
+ setShowCanvas(true);
211
+ }
212
+ else if (showCanvas) {
213
+ // Repos gone — wait before showing empty state (debounce stale polls)
214
+ latchTimerRef.current = setTimeout(() => {
215
+ setShowCanvas(false);
216
+ latchTimerRef.current = null;
217
+ }, 500);
218
+ }
219
+ return () => {
220
+ if (latchTimerRef.current)
221
+ clearTimeout(latchTimerRef.current);
222
+ };
223
+ }, [hasRepositories, showCanvas]);
198
224
  // Pulse the "+" button when there's a single repo with no features and the
199
225
  // create-feature drawer is not open — draws attention to the next action.
200
226
  const isCreateDrawerOpen = pathname.startsWith('/create');
@@ -206,8 +232,5 @@ export function ControlCenterInner({ initialNodes, initialEdges }) {
206
232
  return nodes;
207
233
  return nodes.map((n) => n.type === 'repositoryNode' ? { ...n, data: { ...n.data, pulseAdd: true } } : n);
208
234
  }, [nodes, isCreateDrawerOpen]);
209
- if (!hasRepositories) {
210
- return _jsx(ControlCenterEmptyState, { onRepositorySelect: handleAddRepository });
211
- }
212
- return (_jsx(FeaturesCanvas, { nodes: displayNodes, edges: edges, selectedFeatureId: selectedFeatureId, defaultViewport: defaultViewport, onNodesChange: onNodesChange, onConnect: handleConnect, onAddFeature: handleAddFeature, onNodeClick: handleNodeClick, onPaneClick: handleClearDrawers, onMoveEnd: handleMoveEnd, onResetViewport: resetViewport, emptyState: _jsx(ControlCenterEmptyState, { onRepositorySelect: handleAddRepository }) }));
235
+ return (_jsx(FeaturesCanvas, { nodes: showCanvas ? displayNodes : [], edges: showCanvas ? edges : [], selectedFeatureId: selectedFeatureId, defaultViewport: defaultViewport, onNodesChange: onNodesChange, onConnect: handleConnect, onAddFeature: handleAddFeature, onNodeClick: handleNodeClick, onPaneClick: handleClearDrawers, onMoveEnd: handleMoveEnd, onResetViewport: resetViewport, emptyState: _jsx(ControlCenterEmptyState, { onRepositorySelect: handleAddRepository }) }));
213
236
  }
@@ -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;AAcjC,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,KAAK,IAAI,CAAC;IACpE,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,CAmapB"}
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;AAcjC,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,KAAK,IAAI,CAAC;IACpE,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,CAiapB"}
@@ -225,7 +225,6 @@ export function useControlCenterState(initialNodes, initialEdges) {
225
225
  updateFeature(childId, { state: 'deleting' });
226
226
  }
227
227
  deleteSound.play();
228
- toast.success('Deleting feature…');
229
228
  router.push('/');
230
229
  deleteFeature(featureId, cleanup)
231
230
  .then((result) => {
@@ -288,7 +287,6 @@ export function useControlCenterState(initialNodes, initialEdges) {
288
287
  return;
289
288
  }
290
289
  deleteSound.play();
291
- toast.success('Repository removed');
292
290
  }
293
291
  catch {
294
292
  toast.error('Failed to remove repository');
@@ -1 +1 @@
1
- {"version":3,"file":"welcome-agent-setup.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/features/control-center/welcome-agent-setup.tsx"],"names":[],"mappings":"AA0BA,MAAM,WAAW,sBAAsB;IACrC,UAAU,EAAE,MAAM,IAAI,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AASD,wBAAgB,iBAAiB,CAAC,EAAE,UAAU,EAAE,SAAS,EAAE,EAAE,sBAAsB,2CAoTlF"}
1
+ {"version":3,"file":"welcome-agent-setup.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/features/control-center/welcome-agent-setup.tsx"],"names":[],"mappings":"AAWA,MAAM,WAAW,sBAAsB;IACrC,UAAU,EAAE,MAAM,IAAI,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AASD,wBAAgB,iBAAiB,CAAC,EAAE,UAAU,EAAE,SAAS,EAAE,EAAE,sBAAsB,2CAuNlF"}