@shepai/cli 1.122.2 → 1.123.0-pr396.ac74a97

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 (248) hide show
  1. package/dist/packages/core/src/application/ports/output/services/git-pr-service.interface.d.ts +68 -5
  2. package/dist/packages/core/src/application/ports/output/services/git-pr-service.interface.d.ts.map +1 -1
  3. package/dist/packages/core/src/application/ports/output/services/git-pr-service.interface.js +6 -4
  4. package/dist/packages/core/src/application/use-cases/features/rebase-feature-on-main.use-case.d.ts +28 -0
  5. package/dist/packages/core/src/application/use-cases/features/rebase-feature-on-main.use-case.d.ts.map +1 -0
  6. package/dist/packages/core/src/application/use-cases/features/rebase-feature-on-main.use-case.js +81 -0
  7. package/dist/packages/core/src/application/use-cases/repositories/sync-repository-main.use-case.d.ts +16 -0
  8. package/dist/packages/core/src/application/use-cases/repositories/sync-repository-main.use-case.d.ts.map +1 -0
  9. package/dist/packages/core/src/application/use-cases/repositories/sync-repository-main.use-case.js +43 -0
  10. package/dist/packages/core/src/infrastructure/di/container.d.ts.map +1 -1
  11. package/dist/packages/core/src/infrastructure/di/container.js +15 -0
  12. package/dist/packages/core/src/infrastructure/services/agents/conflict-resolution/conflict-resolution.prompt.d.ts +35 -0
  13. package/dist/packages/core/src/infrastructure/services/agents/conflict-resolution/conflict-resolution.prompt.d.ts.map +1 -0
  14. package/dist/packages/core/src/infrastructure/services/agents/conflict-resolution/conflict-resolution.prompt.js +66 -0
  15. package/dist/packages/core/src/infrastructure/services/agents/conflict-resolution/conflict-resolution.service.d.ts +42 -0
  16. package/dist/packages/core/src/infrastructure/services/agents/conflict-resolution/conflict-resolution.service.d.ts.map +1 -0
  17. package/dist/packages/core/src/infrastructure/services/agents/conflict-resolution/conflict-resolution.service.js +169 -0
  18. package/dist/packages/core/src/infrastructure/services/git/git-pr.service.d.ts +6 -0
  19. package/dist/packages/core/src/infrastructure/services/git/git-pr.service.d.ts.map +1 -1
  20. package/dist/packages/core/src/infrastructure/services/git/git-pr.service.js +125 -0
  21. package/dist/src/presentation/web/app/(dashboard)/get-graph-data.d.ts +6 -0
  22. package/dist/src/presentation/web/app/(dashboard)/get-graph-data.d.ts.map +1 -1
  23. package/dist/src/presentation/web/app/(dashboard)/get-graph-data.js +60 -0
  24. package/dist/src/presentation/web/app/actions/get-feature-phase-timings.d.ts +2 -0
  25. package/dist/src/presentation/web/app/actions/get-feature-phase-timings.d.ts.map +1 -1
  26. package/dist/src/presentation/web/app/actions/get-feature-phase-timings.js +2 -0
  27. package/dist/src/presentation/web/app/build-graph-nodes.d.ts +7 -0
  28. package/dist/src/presentation/web/app/build-graph-nodes.d.ts.map +1 -1
  29. package/dist/src/presentation/web/app/build-graph-nodes.js +7 -0
  30. package/dist/src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.d.ts.map +1 -1
  31. package/dist/src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.js +20 -9
  32. package/dist/src/presentation/web/components/common/feature-drawer-tabs/activity-tab.d.ts.map +1 -1
  33. package/dist/src/presentation/web/components/common/feature-drawer-tabs/activity-tab.js +130 -31
  34. package/dist/src/presentation/web/components/common/feature-drawer-tabs/feature-drawer-tabs.d.ts.map +1 -1
  35. package/dist/src/presentation/web/components/common/feature-drawer-tabs/feature-drawer-tabs.js +13 -0
  36. package/dist/src/presentation/web/components/common/feature-drawer-tabs/use-tab-data-fetch.d.ts.map +1 -1
  37. package/dist/src/presentation/web/components/common/feature-drawer-tabs/use-tab-data-fetch.js +18 -9
  38. package/dist/src/presentation/web/components/common/repository-node/repository-node-config.d.ts +8 -0
  39. package/dist/src/presentation/web/components/common/repository-node/repository-node-config.d.ts.map +1 -1
  40. package/dist/src/presentation/web/components/common/repository-node/repository-node.d.ts.map +1 -1
  41. package/dist/src/presentation/web/components/common/repository-node/repository-node.js +6 -6
  42. package/dist/src/presentation/web/components/common/repository-node/repository-node.stories.d.ts +2 -0
  43. package/dist/src/presentation/web/components/common/repository-node/repository-node.stories.d.ts.map +1 -1
  44. package/dist/src/presentation/web/components/common/repository-node/repository-node.stories.js +107 -17
  45. package/dist/src/presentation/web/components/features/control-center/control-center-empty-state.d.ts.map +1 -1
  46. package/dist/src/presentation/web/components/features/control-center/control-center-empty-state.js +18 -18
  47. package/dist/src/presentation/web/components/features/control-center/control-center-inner.d.ts.map +1 -1
  48. package/dist/src/presentation/web/components/features/control-center/control-center-inner.js +31 -17
  49. package/dist/src/presentation/web/components/features/control-center/welcome-agent-setup.d.ts.map +1 -1
  50. package/dist/src/presentation/web/components/features/control-center/welcome-agent-setup.js +29 -22
  51. package/dist/src/presentation/web/components/features/features-canvas/features-canvas.js +1 -1
  52. package/dist/src/presentation/web/components/layouts/app-shell/app-shell.d.ts.map +1 -1
  53. package/dist/src/presentation/web/components/layouts/app-shell/app-shell.js +2 -2
  54. package/dist/src/presentation/web/hooks/sidebar-features-context.d.ts +2 -0
  55. package/dist/src/presentation/web/hooks/sidebar-features-context.d.ts.map +1 -1
  56. package/dist/src/presentation/web/hooks/sidebar-features-context.js +2 -1
  57. package/dist/src/presentation/web/lib/layout-with-dagre.js +1 -1
  58. package/dist/tsconfig.build.tsbuildinfo +1 -1
  59. package/package.json +1 -1
  60. package/web/.next/BUILD_ID +1 -1
  61. package/web/.next/build-manifest.json +2 -2
  62. package/web/.next/fallback-build-manifest.json +2 -2
  63. package/web/.next/prerender-manifest.json +3 -3
  64. package/web/.next/required-server-files.js +3 -3
  65. package/web/.next/required-server-files.json +3 -3
  66. package/web/.next/server/app/(dashboard)/@drawer/create/page/server-reference-manifest.json +22 -22
  67. package/web/.next/server/app/(dashboard)/@drawer/create/page.js +2 -2
  68. package/web/.next/server/app/(dashboard)/@drawer/create/page.js.nft.json +1 -1
  69. package/web/.next/server/app/(dashboard)/@drawer/create/page_client-reference-manifest.js +1 -1
  70. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page/server-reference-manifest.json +28 -28
  71. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page.js +3 -3
  72. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page.js.nft.json +1 -1
  73. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page_client-reference-manifest.js +1 -1
  74. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page/server-reference-manifest.json +28 -28
  75. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js +3 -3
  76. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js.nft.json +1 -1
  77. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page_client-reference-manifest.js +1 -1
  78. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page/server-reference-manifest.json +20 -20
  79. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js +2 -2
  80. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js.nft.json +1 -1
  81. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  82. package/web/.next/server/app/(dashboard)/create/page/server-reference-manifest.json +22 -22
  83. package/web/.next/server/app/(dashboard)/create/page.js +2 -2
  84. package/web/.next/server/app/(dashboard)/create/page.js.nft.json +1 -1
  85. package/web/.next/server/app/(dashboard)/create/page_client-reference-manifest.js +1 -1
  86. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page/server-reference-manifest.json +28 -28
  87. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page.js +3 -3
  88. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page.js.nft.json +1 -1
  89. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page_client-reference-manifest.js +1 -1
  90. package/web/.next/server/app/(dashboard)/feature/[featureId]/page/server-reference-manifest.json +28 -28
  91. package/web/.next/server/app/(dashboard)/feature/[featureId]/page.js +3 -3
  92. package/web/.next/server/app/(dashboard)/feature/[featureId]/page.js.nft.json +1 -1
  93. package/web/.next/server/app/(dashboard)/feature/[featureId]/page_client-reference-manifest.js +1 -1
  94. package/web/.next/server/app/(dashboard)/page/server-reference-manifest.json +20 -20
  95. package/web/.next/server/app/(dashboard)/page.js +2 -2
  96. package/web/.next/server/app/(dashboard)/page.js.nft.json +1 -1
  97. package/web/.next/server/app/(dashboard)/page_client-reference-manifest.js +1 -1
  98. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page/server-reference-manifest.json +20 -20
  99. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js +2 -2
  100. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js.nft.json +1 -1
  101. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  102. package/web/.next/server/app/_global-error.html +2 -2
  103. package/web/.next/server/app/_global-error.rsc +1 -1
  104. package/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  105. package/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  106. package/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  107. package/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  108. package/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  109. package/web/.next/server/app/_not-found/page/server-reference-manifest.json +1 -1
  110. package/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  111. package/web/.next/server/app/api/graph-data/route.js +1 -1
  112. package/web/.next/server/app/api/graph-data/route.js.nft.json +1 -1
  113. package/web/.next/server/app/settings/page/server-reference-manifest.json +6 -6
  114. package/web/.next/server/app/settings/page.js.nft.json +1 -1
  115. package/web/.next/server/app/settings/page_client-reference-manifest.js +1 -1
  116. package/web/.next/server/app/skills/page/server-reference-manifest.json +6 -6
  117. package/web/.next/server/app/skills/page_client-reference-manifest.js +1 -1
  118. package/web/.next/server/app/tools/page/server-reference-manifest.json +6 -6
  119. package/web/.next/server/app/tools/page.js.nft.json +1 -1
  120. package/web/.next/server/app/tools/page_client-reference-manifest.js +1 -1
  121. package/web/.next/server/app/version/page/server-reference-manifest.json +1 -1
  122. package/web/.next/server/app/version/page_client-reference-manifest.js +1 -1
  123. package/web/.next/server/chunks/403f9_next_dist_esm_build_templates_app-route_370c43b1.js +1 -1
  124. package/web/.next/server/chunks/403f9_next_dist_esm_build_templates_app-route_370c43b1.js.map +1 -1
  125. package/web/.next/server/chunks/[root-of-the-server]__a402b567._.js +1 -1
  126. package/web/.next/server/chunks/[root-of-the-server]__dcd4f847._.js +3 -0
  127. package/web/.next/server/chunks/{[root-of-the-server]__42b7ab55._.js.map → [root-of-the-server]__dcd4f847._.js.map} +1 -1
  128. package/web/.next/server/chunks/ssr/403f9_next_dist_31ea46d3._.js +1 -1
  129. package/web/.next/server/chunks/ssr/403f9_next_dist_c9d9b4d7._.js +1 -1
  130. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js +1 -1
  131. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js.map +1 -1
  132. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_f30d0343.js +1 -1
  133. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_f30d0343.js.map +1 -1
  134. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_9f1775bb.js +1 -1
  135. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_9f1775bb.js.map +1 -1
  136. package/web/.next/server/chunks/ssr/[root-of-the-server]__06fef644._.js +1 -1
  137. package/web/.next/server/chunks/ssr/{[root-of-the-server]__a022445f._.js → [root-of-the-server]__14664e9b._.js} +3 -3
  138. package/web/.next/server/chunks/ssr/{[root-of-the-server]__a022445f._.js.map → [root-of-the-server]__14664e9b._.js.map} +1 -1
  139. package/web/.next/server/chunks/ssr/[root-of-the-server]__4993a47c._.js +3 -0
  140. package/web/.next/server/chunks/ssr/[root-of-the-server]__4993a47c._.js.map +1 -0
  141. package/web/.next/server/chunks/ssr/[root-of-the-server]__545792ab._.js +1 -1
  142. package/web/.next/server/chunks/ssr/[root-of-the-server]__545792ab._.js.map +1 -1
  143. package/web/.next/server/chunks/ssr/[root-of-the-server]__6677a82c._.js +3 -0
  144. package/web/.next/server/chunks/ssr/{[root-of-the-server]__b724df9e._.js.map → [root-of-the-server]__6677a82c._.js.map} +1 -1
  145. package/web/.next/server/chunks/ssr/[root-of-the-server]__6b17a22d._.js +1 -1
  146. package/web/.next/server/chunks/ssr/[root-of-the-server]__6b17a22d._.js.map +1 -1
  147. package/web/.next/server/chunks/ssr/[root-of-the-server]__6bb00d90._.js +2 -2
  148. package/web/.next/server/chunks/ssr/[root-of-the-server]__6bb00d90._.js.map +1 -1
  149. package/web/.next/server/chunks/ssr/{[root-of-the-server]__8e3bf5d7._.js → [root-of-the-server]__7cbda1ea._.js} +2 -2
  150. package/web/.next/server/chunks/ssr/[root-of-the-server]__7cbda1ea._.js.map +1 -0
  151. package/web/.next/server/chunks/ssr/[root-of-the-server]__804c006d._.js +1 -1
  152. package/web/.next/server/chunks/ssr/[root-of-the-server]__804c006d._.js.map +1 -1
  153. package/web/.next/server/chunks/ssr/[root-of-the-server]__8c553503._.js +2 -2
  154. package/web/.next/server/chunks/ssr/{[root-of-the-server]__2698e9f4._.js → [root-of-the-server]__9e8b25ad._.js} +2 -2
  155. package/web/.next/server/chunks/ssr/[root-of-the-server]__9e8b25ad._.js.map +1 -0
  156. package/web/.next/server/chunks/ssr/[root-of-the-server]__a7de2711._.js +2 -2
  157. package/web/.next/server/chunks/ssr/{[root-of-the-server]__c07f9f79._.js → [root-of-the-server]__aed1d6f8._.js} +2 -2
  158. package/web/.next/server/chunks/ssr/[root-of-the-server]__aed1d6f8._.js.map +1 -0
  159. package/web/.next/server/chunks/ssr/{[root-of-the-server]__c605a375._.js → [root-of-the-server]__ce6057f6._.js} +2 -2
  160. package/web/.next/server/chunks/ssr/[root-of-the-server]__ce6057f6._.js.map +1 -0
  161. package/web/.next/server/chunks/ssr/_135edb9c._.js +1 -1
  162. package/web/.next/server/chunks/ssr/_135edb9c._.js.map +1 -1
  163. package/web/.next/server/chunks/ssr/{_42caff2c._.js → _2c12de0e._.js} +2 -2
  164. package/web/.next/server/chunks/ssr/_2c12de0e._.js.map +1 -0
  165. package/web/.next/server/chunks/ssr/_2f6f48b8._.js +1 -1
  166. package/web/.next/server/chunks/ssr/_2f6f48b8._.js.map +1 -1
  167. package/web/.next/server/chunks/ssr/_3a4c94e3._.js +1 -1
  168. package/web/.next/server/chunks/ssr/_453aab7f._.js +3 -0
  169. package/web/.next/server/chunks/ssr/_453aab7f._.js.map +1 -0
  170. package/web/.next/server/chunks/ssr/_b56e7571._.js +3 -0
  171. package/web/.next/server/chunks/ssr/_b56e7571._.js.map +1 -0
  172. package/web/.next/server/chunks/ssr/_cc77a143._.js +1 -1
  173. package/web/.next/server/chunks/ssr/_cc77a143._.js.map +1 -1
  174. package/web/.next/server/chunks/ssr/_e9703421._.js +3 -0
  175. package/web/.next/server/chunks/ssr/_e9703421._.js.map +1 -0
  176. package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_settings_settings-page-client_tsx_6ed9d5f8._.js +1 -1
  177. package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_settings_settings-page-client_tsx_6ed9d5f8._.js.map +1 -1
  178. package/web/.next/server/chunks/ssr/node_modules__pnpm_bc66dcc6._.js +3 -0
  179. package/web/.next/server/chunks/ssr/node_modules__pnpm_bc66dcc6._.js.map +1 -0
  180. package/web/.next/server/chunks/ssr/src_presentation_web_3bdae61e._.js +3 -0
  181. package/web/.next/server/chunks/ssr/src_presentation_web_3bdae61e._.js.map +1 -0
  182. package/web/.next/server/chunks/ssr/src_presentation_web_5f039db1._.js +2 -2
  183. package/web/.next/server/chunks/ssr/src_presentation_web_5f039db1._.js.map +1 -1
  184. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_2a52b697.js +1 -1
  185. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_2a52b697.js.map +1 -1
  186. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_skills_page_actions_1fa8042e.js +1 -1
  187. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_skills_page_actions_1fa8042e.js.map +1 -1
  188. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_tools_page_actions_24684200.js +1 -1
  189. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_tools_page_actions_24684200.js.map +1 -1
  190. package/web/.next/server/chunks/ssr/src_presentation_web_c4337169._.js +2 -2
  191. package/web/.next/server/chunks/ssr/src_presentation_web_c4337169._.js.map +1 -1
  192. package/web/.next/server/chunks/ssr/src_presentation_web_ca99d62d._.js +1 -1
  193. package/web/.next/server/chunks/ssr/src_presentation_web_ca99d62d._.js.map +1 -1
  194. package/web/.next/server/chunks/ssr/src_presentation_web_components_bf50c527._.js +1 -1
  195. package/web/.next/server/chunks/ssr/src_presentation_web_components_bf50c527._.js.map +1 -1
  196. package/web/.next/server/chunks/ssr/src_presentation_web_components_de814675._.js +1 -1
  197. package/web/.next/server/chunks/ssr/src_presentation_web_components_de814675._.js.map +1 -1
  198. package/web/.next/server/chunks/ssr/src_presentation_web_components_e599bb8c._.js +1 -1
  199. package/web/.next/server/chunks/ssr/src_presentation_web_components_e599bb8c._.js.map +1 -1
  200. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js +1 -1
  201. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js.map +1 -1
  202. package/web/.next/server/pages/500.html +2 -2
  203. package/web/.next/server/server-reference-manifest.js +1 -1
  204. package/web/.next/server/server-reference-manifest.json +34 -34
  205. package/web/.next/static/chunks/18d48be836aa52c7.js +1 -0
  206. package/web/.next/static/chunks/{0110425f3a60fc18.js → 1c8720120b410d97.js} +2 -2
  207. package/web/.next/static/chunks/2a7a88568c0b333c.js +1 -0
  208. package/web/.next/static/chunks/3925626b99dcd57a.css +1 -0
  209. package/web/.next/static/chunks/4443ee9c7733399b.js +1 -0
  210. package/web/.next/static/chunks/{ff81a9dd7b7bc56f.js → 71bbee1068681c20.js} +1 -1
  211. package/web/.next/static/chunks/{17d618a2fb4e9a11.js → 79130e383fd42bd3.js} +1 -1
  212. package/web/.next/static/chunks/{6339d1c357e7fea3.js → 81991ab1194e5add.js} +2 -2
  213. package/web/.next/static/chunks/ac7251026c1e2cdf.js +1 -0
  214. package/web/.next/static/chunks/be7f6f6f348b8a7b.js +1 -0
  215. package/web/.next/static/chunks/{f464a486bd88502d.js → cccafcc6f11a334d.js} +1 -1
  216. package/web/.next/static/chunks/dad42b7aec1260a8.js +1 -0
  217. package/web/.next/static/chunks/{96eeeb28e06de78c.js → dbbb446493f21874.js} +1 -1
  218. package/web/.next/static/chunks/de901251b6aedd83.js +1 -0
  219. package/web/.next/server/chunks/[root-of-the-server]__42b7ab55._.js +0 -3
  220. package/web/.next/server/chunks/ssr/[root-of-the-server]__2698e9f4._.js.map +0 -1
  221. package/web/.next/server/chunks/ssr/[root-of-the-server]__8e3bf5d7._.js.map +0 -1
  222. package/web/.next/server/chunks/ssr/[root-of-the-server]__9f155c0e._.js +0 -3
  223. package/web/.next/server/chunks/ssr/[root-of-the-server]__9f155c0e._.js.map +0 -1
  224. package/web/.next/server/chunks/ssr/[root-of-the-server]__b724df9e._.js +0 -3
  225. package/web/.next/server/chunks/ssr/[root-of-the-server]__c07f9f79._.js.map +0 -1
  226. package/web/.next/server/chunks/ssr/[root-of-the-server]__c605a375._.js.map +0 -1
  227. package/web/.next/server/chunks/ssr/_0dc2cfd3._.js +0 -3
  228. package/web/.next/server/chunks/ssr/_0dc2cfd3._.js.map +0 -1
  229. package/web/.next/server/chunks/ssr/_42caff2c._.js.map +0 -1
  230. package/web/.next/server/chunks/ssr/_75f4ccb3._.js +0 -3
  231. package/web/.next/server/chunks/ssr/_75f4ccb3._.js.map +0 -1
  232. package/web/.next/server/chunks/ssr/_9b7b1c2b._.js +0 -3
  233. package/web/.next/server/chunks/ssr/_9b7b1c2b._.js.map +0 -1
  234. package/web/.next/server/chunks/ssr/_ecfef26e._.js +0 -3
  235. package/web/.next/server/chunks/ssr/_ecfef26e._.js.map +0 -1
  236. package/web/.next/server/chunks/ssr/node_modules__pnpm_b59e4b16._.js +0 -3
  237. package/web/.next/server/chunks/ssr/node_modules__pnpm_b59e4b16._.js.map +0 -1
  238. package/web/.next/static/chunks/0d2af96e64960ef5.css +0 -1
  239. package/web/.next/static/chunks/12f3ae6b693c8baf.js +0 -1
  240. package/web/.next/static/chunks/4562ee849ea13c3a.js +0 -1
  241. package/web/.next/static/chunks/83fed73369b40eaf.js +0 -1
  242. package/web/.next/static/chunks/845d8e58a91014e6.js +0 -1
  243. package/web/.next/static/chunks/8e5bdf9fb945ae6a.js +0 -1
  244. package/web/.next/static/chunks/be0d245d0e672d44.js +0 -1
  245. package/web/.next/static/chunks/e6c0bf49bcd5d0fb.js +0 -1
  246. /package/web/.next/static/{DIjy_LTLHBNoz5RRTRhBy → qG2ZylwG6wDwdBv8fcdAw}/_buildManifest.js +0 -0
  247. /package/web/.next/static/{DIjy_LTLHBNoz5RRTRhBy → qG2ZylwG6wDwdBv8fcdAw}/_clientMiddlewareManifest.json +0 -0
  248. /package/web/.next/static/{DIjy_LTLHBNoz5RRTRhBy → qG2ZylwG6wDwdBv8fcdAw}/_ssgManifest.js +0 -0
@@ -1,7 +1,7 @@
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 { useState, useEffect, useRef } from 'react';
4
- import { Loader2, AlertCircle, Clock, Zap, DollarSign } from 'lucide-react';
4
+ import { Loader2, AlertCircle, Clock, Zap, DollarSign, Play, RotateCcw, CheckCircle2, XCircle, Square, Ban, MessageSquare, Timer, ArrowDownToLine, ArrowUpFromLine, } from 'lucide-react';
5
5
  import { InlineAttachments } from '../../common/inline-attachments/index.js';
6
6
  import { formatDuration } from '../../../lib/format-duration.js';
7
7
  /**
@@ -51,6 +51,13 @@ function formatTokens(count) {
51
51
  return `${(count / 1_000).toFixed(1)}K`;
52
52
  return String(count);
53
53
  }
54
+ /** Format a timestamp to a short local time string (e.g. "10:05:30 AM"). */
55
+ function formatTimestamp(value) {
56
+ const d = value instanceof Date ? value : new Date(String(value));
57
+ if (Number.isNaN(d.getTime()))
58
+ return '';
59
+ return d.toLocaleTimeString([], { hour: '2-digit', minute: '2-digit', second: '2-digit' });
60
+ }
54
61
  /** Format a USD cost with appropriate precision. */
55
62
  function formatCost(usd) {
56
63
  if (usd >= 1)
@@ -68,13 +75,48 @@ const NODE_TO_PHASE = {
68
75
  merge: 'Merging',
69
76
  };
70
77
  const LIFECYCLE_EVENTS = {
71
- 'run:started': { label: 'started', colorClass: 'text-blue-600' },
72
- 'run:resumed': { label: 'resumed', colorClass: 'text-blue-600' },
73
- 'run:completed': { label: 'completed', colorClass: 'text-emerald-600' },
74
- 'run:failed': { label: 'failed', colorClass: 'text-red-600' },
75
- 'run:stopped': { label: 'stopped', colorClass: 'text-amber-600' },
76
- 'run:crashed': { label: 'crashed', colorClass: 'text-red-600' },
77
- 'run:rejected': { label: 'rejected', colorClass: 'text-orange-600' },
78
+ 'run:started': {
79
+ label: 'started',
80
+ colorClass: 'text-blue-600',
81
+ bgClass: 'bg-blue-50 dark:bg-blue-950/30',
82
+ icon: Play,
83
+ },
84
+ 'run:resumed': {
85
+ label: 'resumed',
86
+ colorClass: 'text-blue-600',
87
+ bgClass: 'bg-blue-50 dark:bg-blue-950/30',
88
+ icon: RotateCcw,
89
+ },
90
+ 'run:completed': {
91
+ label: 'completed',
92
+ colorClass: 'text-emerald-600',
93
+ bgClass: 'bg-emerald-50 dark:bg-emerald-950/30',
94
+ icon: CheckCircle2,
95
+ },
96
+ 'run:failed': {
97
+ label: 'failed',
98
+ colorClass: 'text-red-600',
99
+ bgClass: 'bg-red-50 dark:bg-red-950/30',
100
+ icon: XCircle,
101
+ },
102
+ 'run:stopped': {
103
+ label: 'stopped',
104
+ colorClass: 'text-amber-600',
105
+ bgClass: 'bg-amber-50 dark:bg-amber-950/30',
106
+ icon: Square,
107
+ },
108
+ 'run:crashed': {
109
+ label: 'crashed',
110
+ colorClass: 'text-red-600',
111
+ bgClass: 'bg-red-50 dark:bg-red-950/30',
112
+ icon: XCircle,
113
+ },
114
+ 'run:rejected': {
115
+ label: 'rejected',
116
+ colorClass: 'text-orange-600',
117
+ bgClass: 'bg-orange-50 dark:bg-orange-950/30',
118
+ icon: Ban,
119
+ },
78
120
  };
79
121
  function isLifecycleEvent(phase) {
80
122
  return phase.startsWith('run:');
@@ -146,6 +188,26 @@ export function buildLifecycleTimeline(timings, feedback) {
146
188
  }
147
189
  return iterations;
148
190
  }
191
+ /** Determine the outcome status of an iteration */
192
+ function getIterationOutcome(iteration) {
193
+ const lastLifecycle = [...iteration.timings].reverse().find((t) => isLifecycleEvent(t.phase));
194
+ if (!lastLifecycle)
195
+ return null;
196
+ switch (lastLifecycle.phase) {
197
+ case 'run:rejected':
198
+ return { label: 'Rejected', colorClass: 'text-orange-600', dotClass: 'bg-orange-500' };
199
+ case 'run:completed':
200
+ return { label: 'Completed', colorClass: 'text-emerald-600', dotClass: 'bg-emerald-500' };
201
+ case 'run:failed':
202
+ return { label: 'Failed', colorClass: 'text-red-600', dotClass: 'bg-red-500' };
203
+ case 'run:crashed':
204
+ return { label: 'Crashed', colorClass: 'text-red-600', dotClass: 'bg-red-500' };
205
+ case 'run:stopped':
206
+ return { label: 'Stopped', colorClass: 'text-amber-600', dotClass: 'bg-amber-500' };
207
+ default:
208
+ return null;
209
+ }
210
+ }
149
211
  /* ---------------------------------------------------------------------------
150
212
  * Component
151
213
  * ------------------------------------------------------------------------- */
@@ -155,10 +217,10 @@ export function ActivityTab({ timings, loading, error, rejectionFeedback }) {
155
217
  return (_jsx("div", { "data-testid": "activity-tab-loading", className: "flex items-center justify-center p-8", children: _jsx(Loader2, { className: "text-muted-foreground h-6 w-6 animate-spin" }) }));
156
218
  }
157
219
  if (error) {
158
- return (_jsxs("div", { className: "flex items-center gap-2 p-4 text-sm text-red-600", children: [_jsx(AlertCircle, { className: "h-4 w-4 shrink-0" }), _jsx("span", { children: error })] }));
220
+ return (_jsxs("div", { className: "flex items-center gap-2 p-4 text-base text-red-600", children: [_jsx(AlertCircle, { className: "h-4 w-4 shrink-0" }), _jsx("span", { children: error })] }));
159
221
  }
160
222
  if (!timings || timings.length === 0) {
161
- return (_jsxs("div", { className: "flex flex-col items-center justify-center gap-2 p-8", children: [_jsx(Clock, { className: "text-muted-foreground h-8 w-8" }), _jsx("p", { className: "text-muted-foreground text-sm", children: "No activity recorded yet" })] }));
223
+ return (_jsxs("div", { className: "flex flex-col items-center justify-center gap-2 p-8", children: [_jsx(Clock, { className: "text-muted-foreground h-8 w-8" }), _jsx("p", { className: "text-muted-foreground text-base", children: "No activity recorded yet" })] }));
162
224
  }
163
225
  const nodeTimings = timings.filter((t) => !isLifecycleEvent(t.phase));
164
226
  const maxDurationMs = Math.max(...nodeTimings.map((t) => getEffectiveDuration(t, now)), ...nodeTimings.map((t) => t.approvalWaitMs ?? 0), 0);
@@ -169,44 +231,70 @@ export function ActivityTab({ timings, loading, error, rejectionFeedback }) {
169
231
  const totalInputTokens = nodeTimings.reduce((sum, t) => sum + (t.inputTokens ?? 0), 0);
170
232
  const totalOutputTokens = nodeTimings.reduce((sum, t) => sum + (t.outputTokens ?? 0), 0);
171
233
  const totalCostUsd = nodeTimings.reduce((sum, t) => sum + (t.costUsd ?? 0), 0);
172
- return (_jsxs("div", { className: "flex flex-col gap-4 p-4", children: [_jsx("div", { "data-testid": "activity-timings", className: "flex flex-col gap-3", children: iterations.map((iteration) => (_jsx(IterationGroup, { iteration: iteration, showHeader: hasMultipleIterations, maxDurationMs: maxDurationMs, now: now }, iteration.number))) }), totalExecMs > 0 ? (_jsx(SummaryTotals, { totalExecMs: totalExecMs, totalWaitMs: totalWaitMs, totalInputTokens: totalInputTokens, totalOutputTokens: totalOutputTokens, totalCostUsd: totalCostUsd })) : null] }));
234
+ return (_jsxs("div", { className: "flex flex-col gap-3 p-4", children: [_jsx("div", { "data-testid": "activity-timings", className: "flex flex-col gap-3", children: iterations.map((iteration) => (_jsx(IterationGroup, { iteration: iteration, showHeader: hasMultipleIterations, maxDurationMs: maxDurationMs, now: now }, iteration.number))) }), totalExecMs > 0 ? (_jsx(SummaryTotals, { totalExecMs: totalExecMs, totalWaitMs: totalWaitMs, totalInputTokens: totalInputTokens, totalOutputTokens: totalOutputTokens, totalCostUsd: totalCostUsd })) : null] }));
173
235
  }
174
236
  /* ---------------------------------------------------------------------------
175
237
  * Iteration group — one cycle of work
176
238
  * ------------------------------------------------------------------------- */
177
239
  function IterationGroup({ iteration, showHeader, maxDurationMs, now, }) {
178
- return (_jsxs("div", { "data-testid": `iteration-${iteration.number}`, className: "flex flex-col gap-1.5", children: [showHeader ? (_jsxs("div", { className: "text-muted-foreground text-xs font-medium", children: ["Iteration ", iteration.number] })) : null, iteration.timings.map((t) => {
179
- if (isLifecycleEvent(t.phase)) {
180
- // For run:rejected, the message comes from the iteration, not a separate map
181
- const isRejection = t.phase === 'run:rejected';
182
- return (_jsx(LifecycleEventRow, { timing: t, message: isRejection ? iteration.rejectionMessage : undefined, attachments: isRejection ? iteration.rejectionAttachments : undefined }, `${t.agentRunId}-${t.phase}-${t.startedAt}`));
183
- }
184
- return (_jsx(NodeTimingRow, { timing: t, maxDurationMs: maxDurationMs, now: now }, `${t.agentRunId}-${t.phase}-${t.startedAt}`));
185
- })] }));
240
+ const outcome = getIterationOutcome(iteration);
241
+ return (_jsxs("div", { "data-testid": `iteration-${iteration.number}`, className: "border-border/50 bg-card/50 flex flex-col overflow-hidden rounded-lg border", children: [showHeader ? (_jsxs("div", { className: "bg-muted/30 border-border/50 flex items-center justify-between border-b px-3 py-1.5", children: [_jsxs("span", { className: "text-muted-foreground text-sm font-semibold tracking-wide", children: ["Iteration ", iteration.number] }), outcome ? (_jsxs("span", { className: `flex items-center gap-1 text-xs font-medium ${outcome.colorClass}`, children: [_jsx("span", { className: `inline-block h-1.5 w-1.5 rounded-full ${outcome.dotClass}` }), outcome.label] })) : null] })) : null, _jsxs("div", { className: "relative flex flex-col", children: [_jsx("div", { className: "bg-border/60 absolute top-4 bottom-4 left-[21.5px] w-px" }), iteration.timings.map((t, idx) => {
242
+ if (isLifecycleEvent(t.phase)) {
243
+ const isRejection = t.phase === 'run:rejected';
244
+ const isFailure = t.phase === 'run:failed' || t.phase === 'run:crashed' || t.phase === 'run:stopped';
245
+ // For failures, find the last phase with an error message in this iteration
246
+ let message;
247
+ if (isRejection) {
248
+ message = iteration.rejectionMessage;
249
+ }
250
+ else if (isFailure) {
251
+ const lastErrorPhase = [...iteration.timings]
252
+ .reverse()
253
+ .find((p) => !isLifecycleEvent(p.phase) && p.errorMessage);
254
+ message = lastErrorPhase?.errorMessage ?? t.errorMessage;
255
+ }
256
+ return (_jsx(LifecycleEventRow, { timing: t, message: message, attachments: isRejection ? iteration.rejectionAttachments : undefined, isFirst: idx === 0, isLast: idx === iteration.timings.length - 1 }, `${t.agentRunId}-${t.phase}-${t.startedAt}`));
257
+ }
258
+ return (_jsx(NodeTimingRow, { timing: t, maxDurationMs: maxDurationMs, now: now }, `${t.agentRunId}-${t.phase}-${t.startedAt}`));
259
+ })] })] }));
186
260
  }
187
261
  /* ---------------------------------------------------------------------------
188
262
  * Row components
189
263
  * ------------------------------------------------------------------------- */
190
- function LifecycleEventRow({ timing, message, attachments, }) {
264
+ function LifecycleEventRow({ timing, message, attachments, isFirst, isLast, }) {
191
265
  const event = LIFECYCLE_EVENTS[timing.phase];
192
266
  if (!event)
193
267
  return null;
194
268
  const hasAttachments = attachments && attachments.length > 0;
195
- return (_jsxs("div", { className: `text-xs ${event.colorClass}`, children: [_jsx("span", { children: event.label }), message ? (_jsxs("span", { "data-testid": "rejection-feedback-text", className: "text-muted-foreground ml-2 font-normal italic", children: ["\u2014 ", message] })) : null, hasAttachments ? (_jsx("div", { "data-testid": "rejection-feedback-attachments", className: "mt-1.5 ml-2", children: _jsx(InlineAttachments, { text: "", attachmentPaths: attachments }) })) : null] }));
269
+ const Icon = event.icon;
270
+ return (_jsxs("div", { className: `relative flex flex-col gap-1 px-3 ${isFirst ? 'pt-2' : 'pt-1'} ${isLast ? 'pb-2' : 'pb-1'}`, children: [_jsxs("div", { className: "flex items-center gap-2", children: [_jsx("div", { className: `relative z-10 flex h-5 w-5 shrink-0 items-center justify-center rounded-full ${event.bgClass}`, children: _jsx(Icon, { className: `h-3 w-3 ${event.colorClass}` }) }), _jsx("span", { className: `text-sm font-medium ${event.colorClass}`, children: event.label }), timing.startedAt &&
271
+ !(typeof timing.startedAt === 'string' && timing.startedAt.startsWith('synthetic')) ? (_jsx("span", { className: "text-muted-foreground/60 ml-auto text-xs tabular-nums", children: formatTimestamp(String(timing.startedAt)) })) : null] }), message
272
+ ? (() => {
273
+ const isError = timing.phase === 'run:failed' ||
274
+ timing.phase === 'run:crashed' ||
275
+ timing.phase === 'run:stopped';
276
+ return (_jsxs("div", { className: `ml-[26px] flex items-start gap-1.5 rounded-md px-2 py-1.5 ${isError
277
+ ? 'bg-red-50/50 dark:bg-red-950/20'
278
+ : 'bg-orange-50/50 dark:bg-orange-950/20'}`, children: [isError ? (_jsx(AlertCircle, { className: "mt-0.5 h-3.5 w-3.5 shrink-0 text-red-400" })) : (_jsx(MessageSquare, { className: "mt-0.5 h-3.5 w-3.5 shrink-0 text-orange-400" })), _jsxs("span", { "data-testid": isError ? 'error-message-text' : 'rejection-feedback-text', className: "text-muted-foreground text-xs leading-relaxed italic", children: ["\u2014 ", message] })] }));
279
+ })()
280
+ : null, hasAttachments ? (_jsx("div", { "data-testid": "rejection-feedback-attachments", className: "ml-[26px]", children: _jsx(InlineAttachments, { text: "", attachmentPaths: attachments }) })) : null] }));
196
281
  }
197
282
  function NodeTimingRow({ timing, maxDurationMs, now, }) {
283
+ const base = timing.phase.includes(':') ? timing.phase.split(':')[0] : timing.phase;
198
284
  const suffix = timing.phase.includes(':') ? timing.phase.split(':')[1] : null;
199
285
  const isSubPhase = suffix !== null;
200
- // Distinguish implementation sub-phases (phase-1, phase-2) from rejection retries (2, 3)
201
286
  const isImplPhase = suffix?.startsWith('phase-') ?? false;
287
+ const baseName = NODE_TO_PHASE[base] ?? base;
202
288
  const label = isImplPhase
203
289
  ? `Phase ${suffix.replace('phase-', '')}`
204
290
  : suffix !== null
205
- ? `retry #${suffix}`
206
- : (NODE_TO_PHASE[timing.phase] ?? timing.phase);
291
+ ? `${baseName} #${suffix}`
292
+ : baseName;
207
293
  const durationMs = getEffectiveDuration(timing, now);
208
- const barPercent = maxDurationMs > 0 ? Math.max(2, (durationMs / maxDurationMs) * 100) : 2;
209
294
  const isRunning = !timing.completedAt && !!timing.startedAt;
295
+ // Running phases get a minimum 15% bar so they're always visually prominent
296
+ const minPercent = isRunning ? 15 : 2;
297
+ const barPercent = maxDurationMs > 0 ? Math.max(minPercent, (durationMs / maxDurationMs) * 100) : minPercent;
210
298
  const barColorClass = timing.completedAt
211
299
  ? isImplPhase
212
300
  ? 'bg-emerald-400'
@@ -217,17 +305,28 @@ function NodeTimingRow({ timing, maxDurationMs, now, }) {
217
305
  const totalTokens = timing.inputTokens != null || timing.outputTokens != null
218
306
  ? (timing.inputTokens ?? 0) + (timing.outputTokens ?? 0)
219
307
  : null;
220
- return (_jsxs("div", { className: isSubPhase ? 'flex flex-col gap-1 pl-6' : 'flex flex-col gap-1', children: [_jsxs("div", { "data-testid": `timing-bar-${timing.phase}`, className: "flex items-center gap-2", children: [_jsx("span", { className: `text-muted-foreground shrink-0 text-xs ${isSubPhase ? 'w-18' : 'w-24'}`, children: label }), _jsx("div", { className: `bg-muted min-w-0 flex-1 overflow-hidden rounded-full ${isSubPhase ? 'h-2.5' : 'h-3'}`, children: _jsx("div", { className: `h-full rounded-full ${barColorClass}${isRunning ? 'animate-pulse' : ''}`, style: { width: `${Math.min(barPercent, 100)}%` } }) }), _jsx("span", { className: "text-muted-foreground w-10 shrink-0 text-right text-xs tabular-nums", children: formatDuration(durationMs) }), _jsx("span", { className: "text-muted-foreground w-12 shrink-0 text-right text-[10px] tabular-nums", children: totalTokens != null && totalTokens > 0 ? (_jsxs("span", { className: "inline-flex items-center gap-0.5", children: [_jsx(Zap, { className: "h-2 w-2 opacity-50" }), formatTokens(totalTokens)] })) : null }), _jsx("span", { className: "text-muted-foreground w-14 shrink-0 text-right text-[10px] tabular-nums", children: timing.costUsd != null && timing.costUsd > 0 ? (_jsxs("span", { className: "inline-flex items-center gap-0.5", children: [_jsx(DollarSign, { className: "h-2 w-2 opacity-50" }), formatCost(timing.costUsd)] })) : null })] }), timing.approvalWaitMs != null && timing.approvalWaitMs > 0 ? (_jsx(ApprovalWaitRow, { timing: timing, maxDurationMs: maxDurationMs })) : null] }));
308
+ return (_jsxs("div", { className: `relative flex flex-col gap-0.5 px-3 py-1.5 ${isSubPhase ? 'ml-4' : ''}`, children: [_jsxs("div", { "data-testid": `timing-bar-${timing.phase}`, className: "flex items-center gap-2", children: [_jsx("div", { className: "relative z-10 flex h-5 w-5 shrink-0 items-center justify-center", children: _jsx("div", { className: `rounded-full ${isRunning ? 'h-3 w-3 animate-pulse' : 'h-2.5 w-2.5'} ${isRunning
309
+ ? 'bg-blue-500'
310
+ : timing.completedAt
311
+ ? 'bg-emerald-500'
312
+ : 'bg-muted-foreground/30'}` }) }), _jsx("span", { className: `w-28 shrink-0 truncate text-sm font-medium ${isSubPhase ? 'text-muted-foreground' : 'text-foreground/80'}`, children: label }), _jsx("div", { className: `bg-muted relative min-w-0 flex-1 overflow-hidden rounded-full ${isSubPhase ? 'h-1.5' : 'h-2'}`, children: isRunning ? (_jsx("div", { className: "absolute inset-0 rounded-full bg-blue-500/30", style: {
313
+ backgroundImage: 'linear-gradient(90deg, transparent 0%, rgb(59 130 246) 50%, transparent 100%)',
314
+ backgroundSize: '200% 100%',
315
+ animation: 'shimmer 1.5s ease-in-out infinite',
316
+ } })) : (_jsx("div", { className: `h-full rounded-full transition-all duration-300 ${barColorClass}`, style: { width: `${Math.min(barPercent, 100)}%` } })) }), _jsx("span", { className: "text-muted-foreground w-14 shrink-0 text-right text-sm font-medium tabular-nums", children: formatDuration(durationMs) })] }), _jsxs("div", { className: "ml-[28px] flex items-center gap-3 text-xs", children: [timing.startedAt ? (_jsx("span", { className: "text-muted-foreground/60 tabular-nums", children: formatTimestamp(timing.startedAt) })) : null, totalTokens != null && totalTokens > 0 ? (_jsxs("span", { className: "text-muted-foreground/70 inline-flex items-center gap-0.5", children: [_jsx(Zap, { className: "h-3 w-3 opacity-50" }), formatTokens(totalTokens)] })) : null, timing.costUsd != null && timing.costUsd > 0 ? (_jsxs("span", { className: "text-muted-foreground/70 inline-flex items-center gap-0.5", children: [_jsx(DollarSign, { className: "h-3 w-3 opacity-50" }), formatCost(timing.costUsd)] })) : null] }), timing.approvalWaitMs != null && timing.approvalWaitMs > 0 ? (_jsx(ApprovalWaitRow, { timing: timing, maxDurationMs: maxDurationMs })) : null] }));
221
317
  }
222
318
  function ApprovalWaitRow({ timing, maxDurationMs, }) {
223
319
  const waitMs = timing.approvalWaitMs ?? 0;
224
320
  const barPercent = maxDurationMs > 0 ? Math.max(2, (waitMs / maxDurationMs) * 100) : 2;
225
- return (_jsxs("div", { "data-testid": `approval-wait-${timing.phase}`, className: "flex items-center gap-2 pl-4", children: [_jsx("span", { className: "text-muted-foreground w-20 shrink-0 text-xs", children: "approval" }), _jsx("div", { className: "bg-muted h-2.5 min-w-0 flex-1 overflow-hidden rounded-full", children: _jsx("div", { className: "h-full rounded-full bg-amber-500", style: { width: `${Math.min(barPercent, 100)}%` } }) }), _jsx("span", { className: "text-muted-foreground w-10 shrink-0 text-right text-xs tabular-nums", children: formatDuration(waitMs) }), _jsx("span", { className: "w-12 shrink-0" }), _jsx("span", { className: "w-14 shrink-0" })] }));
321
+ return (_jsxs("div", { "data-testid": `approval-wait-${timing.phase}`, className: "ml-[26px] flex items-center gap-2 rounded-md bg-amber-50/50 px-1.5 py-1 dark:bg-amber-950/20", children: [_jsx(Timer, { className: "h-3.5 w-3.5 shrink-0 text-amber-500" }), _jsx("span", { className: "text-muted-foreground w-16 shrink-0 text-xs", children: "approval" }), _jsx("div", { className: "bg-muted h-1.5 min-w-0 flex-1 overflow-hidden rounded-full", children: _jsx("div", { className: "h-full rounded-full bg-amber-500", style: { width: `${Math.min(barPercent, 100)}%` } }) }), _jsx("span", { className: "text-muted-foreground w-14 shrink-0 text-right text-xs tabular-nums", children: formatDuration(waitMs) })] }));
226
322
  }
227
323
  function SummaryTotals({ totalExecMs, totalWaitMs, totalInputTokens, totalOutputTokens, totalCostUsd, }) {
228
324
  const totalTokens = totalInputTokens + totalOutputTokens;
229
- return (_jsxs("div", { "data-testid": "activity-summary", className: "border-border flex flex-col gap-1.5 border-t pt-3", children: [_jsx(SummaryRow, { label: "Total execution", value: formatDuration(totalExecMs) }), totalWaitMs > 0 ? (_jsxs(_Fragment, { children: [_jsx(SummaryRow, { label: "Total wait", value: formatDuration(totalWaitMs) }), _jsx(SummaryRow, { label: "Total wall-clock", value: formatDuration(totalExecMs + totalWaitMs) })] })) : null, totalTokens > 0 ? (_jsx(SummaryRow, { label: "Total tokens", value: `${formatTokens(totalTokens)} (${formatTokens(totalInputTokens)} in · ${formatTokens(totalOutputTokens)} out)` })) : null, totalCostUsd > 0 ? _jsx(SummaryRow, { label: "Total cost", value: formatCost(totalCostUsd) }) : null] }));
325
+ return (_jsxs("div", { "data-testid": "activity-summary", className: "border-border bg-card/30 flex flex-col gap-2 rounded-lg border p-3", children: [_jsx("div", { className: "text-muted-foreground mb-1 text-xs font-semibold tracking-wider uppercase", children: "Summary" }), _jsxs("div", { className: "grid grid-cols-2 gap-x-4 gap-y-3", children: [_jsx(SummaryCell, { icon: Clock, label: "Execution", value: formatDuration(totalExecMs) }), _jsx(SummaryCell, { icon: Timer, label: "Wait", value: totalWaitMs > 0 ? formatDuration(totalWaitMs) : 'n/a' }), _jsx(SummaryCell, { icon: Clock, label: "Wall-clock", value: totalWaitMs > 0
326
+ ? formatDuration(totalExecMs + totalWaitMs)
327
+ : formatDuration(totalExecMs) }), _jsx(SummaryCell, { icon: DollarSign, label: "Cost", value: totalCostUsd > 0 ? formatCost(totalCostUsd) : 'n/a' }), _jsxs("div", { className: "col-span-2 flex flex-col gap-0.5", children: [_jsxs("span", { className: "text-muted-foreground flex items-center gap-1 text-xs", children: [_jsx(Zap, { className: "h-3 w-3 opacity-40" }), "Tokens"] }), totalTokens > 0 ? (_jsxs("span", { className: "flex items-center gap-2.5 text-sm tabular-nums", children: [_jsx("span", { children: formatTokens(totalTokens) }), _jsxs("span", { className: "text-muted-foreground flex items-center gap-3 text-xs", title: "Input tokens / Output tokens", children: [_jsxs("span", { className: "flex items-center gap-0.5", children: [_jsx(ArrowDownToLine, { className: "h-3 w-3 text-blue-500 opacity-60" }), formatTokens(totalInputTokens)] }), _jsxs("span", { className: "flex items-center gap-0.5", children: [_jsx(ArrowUpFromLine, { className: "h-3 w-3 text-emerald-500 opacity-60" }), formatTokens(totalOutputTokens)] })] })] })) : (_jsx("span", { className: "text-muted-foreground/40 text-sm italic tabular-nums", children: "n/a" }))] })] })] }));
230
328
  }
231
- function SummaryRow({ label, value }) {
232
- return (_jsxs("div", { className: "flex items-center justify-between", children: [_jsx("span", { className: "text-muted-foreground text-xs font-medium", children: label }), _jsx("span", { className: "text-xs font-medium", children: value })] }));
329
+ function SummaryCell({ icon: Icon, label, value, className = '', }) {
330
+ const isNA = value === 'n/a';
331
+ return (_jsxs("div", { className: `flex flex-col gap-0.5 ${className}`, children: [_jsxs("span", { className: "text-muted-foreground flex items-center gap-1 text-xs", children: [_jsx(Icon, { className: "h-3 w-3 opacity-40" }), label] }), _jsx("span", { className: `text-sm tabular-nums ${isNA ? 'text-muted-foreground/40 italic' : ''}`, children: value })] }));
233
332
  }
@@ -1 +1 @@
1
- {"version":3,"file":"feature-drawer-tabs.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/feature-drawer-tabs/feature-drawer-tabs.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,sCAAsC,CAAC;AAS9E,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AACxE,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,uCAAuC,CAAC;AAClF,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,2CAA2C,CAAC;AACzF,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,+CAA+C,CAAC;AACjG,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AAMxE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uCAAuC,CAAC;AAQ9E,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uDAAuD,CAAC;AA8C3F,MAAM,WAAW,sBAAsB;IACrC,WAAW,EAAE,eAAe,CAAC;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,aAAa,CAAC;IAC3B,gFAAgF;IAChF,MAAM,CAAC,EAAE,aAAa,CAAC;IACvB,mFAAmF;IACnF,SAAS,CAAC,EAAE,SAAS,iBAAiB,EAAE,CAAC;IAGzC,OAAO,CAAC,EAAE,oBAAoB,GAAG,IAAI,CAAC;IACtC,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACvC,WAAW,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;IAC7D,YAAY,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;IAC1C,WAAW,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,gBAAgB,EAAE,KAAK,IAAI,CAAC;IAC1E,YAAY,CAAC,EAAE,OAAO,CAAC;IAGvB,QAAQ,CAAC,EAAE,uBAAuB,GAAG,IAAI,CAAC;IAC1C,aAAa,CAAC,EAAE,MAAM,IAAI,CAAC;IAC3B,YAAY,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,gBAAgB,EAAE,KAAK,IAAI,CAAC;IAC3E,aAAa,CAAC,EAAE,OAAO,CAAC;IAGxB,WAAW,CAAC,EAAE,2BAA2B,GAAG,IAAI,CAAC;IAGjD,SAAS,CAAC,EAAE,eAAe,GAAG,IAAI,CAAC;IACnC,cAAc,CAAC,EAAE,MAAM,IAAI,CAAC;IAC5B,aAAa,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,gBAAgB,EAAE,KAAK,IAAI,CAAC;IAC5E,cAAc,CAAC,EAAE,OAAO,CAAC;IAGzB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,iBAAiB,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;CAC7C;AAwBD,wBAAgB,iBAAiB,CAAC,EAChC,WAAW,EACX,SAAS,EACT,UAAU,EACV,MAAM,EACN,OAAO,EACP,aAAa,EACb,WAAW,EACX,YAAY,EACZ,WAAW,EACX,YAAY,EACZ,QAAQ,EACR,aAAa,EACb,YAAY,EACZ,aAAa,EACb,WAAW,EACX,SAAS,EACT,cAAc,EACd,aAAa,EACb,cAAc,EACd,WAAW,EACX,SAAS,EACT,iBAAiB,EACjB,SAAS,GACV,EAAE,sBAAsB,2CAiUxB"}
1
+ {"version":3,"file":"feature-drawer-tabs.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/feature-drawer-tabs/feature-drawer-tabs.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,sCAAsC,CAAC;AAS9E,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AACxE,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,uCAAuC,CAAC;AAClF,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,2CAA2C,CAAC;AACzF,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,+CAA+C,CAAC;AACjG,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AAMxE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uCAAuC,CAAC;AAQ9E,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uDAAuD,CAAC;AA8C3F,MAAM,WAAW,sBAAsB;IACrC,WAAW,EAAE,eAAe,CAAC;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,aAAa,CAAC;IAC3B,gFAAgF;IAChF,MAAM,CAAC,EAAE,aAAa,CAAC;IACvB,mFAAmF;IACnF,SAAS,CAAC,EAAE,SAAS,iBAAiB,EAAE,CAAC;IAGzC,OAAO,CAAC,EAAE,oBAAoB,GAAG,IAAI,CAAC;IACtC,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACvC,WAAW,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;IAC7D,YAAY,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;IAC1C,WAAW,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,gBAAgB,EAAE,KAAK,IAAI,CAAC;IAC1E,YAAY,CAAC,EAAE,OAAO,CAAC;IAGvB,QAAQ,CAAC,EAAE,uBAAuB,GAAG,IAAI,CAAC;IAC1C,aAAa,CAAC,EAAE,MAAM,IAAI,CAAC;IAC3B,YAAY,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,gBAAgB,EAAE,KAAK,IAAI,CAAC;IAC3E,aAAa,CAAC,EAAE,OAAO,CAAC;IAGxB,WAAW,CAAC,EAAE,2BAA2B,GAAG,IAAI,CAAC;IAGjD,SAAS,CAAC,EAAE,eAAe,GAAG,IAAI,CAAC;IACnC,cAAc,CAAC,EAAE,MAAM,IAAI,CAAC;IAC5B,aAAa,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,gBAAgB,EAAE,KAAK,IAAI,CAAC;IAC5E,cAAc,CAAC,EAAE,OAAO,CAAC;IAGzB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,iBAAiB,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;CAC7C;AAwBD,wBAAgB,iBAAiB,CAAC,EAChC,WAAW,EACX,SAAS,EACT,UAAU,EACV,MAAM,EACN,OAAO,EACP,aAAa,EACb,WAAW,EACX,YAAY,EACZ,WAAW,EACX,YAAY,EACZ,QAAQ,EACR,aAAa,EACb,YAAY,EACZ,aAAa,EACb,WAAW,EACX,SAAS,EACT,cAAc,EACd,aAAa,EACb,cAAc,EACd,WAAW,EACX,SAAS,EACT,iBAAiB,EACjB,SAAS,GACV,EAAE,sBAAsB,2CA8UxB"}
@@ -220,6 +220,19 @@ export function FeatureDrawerTabs({ featureNode, featureId, initialTab, urlTab,
220
220
  refreshTab(current);
221
221
  }
222
222
  }, [sseEvents, featureId, refreshTab]);
223
+ // Poll activity data while the feature is actively running.
224
+ // SSE events only fire on state transitions (phase completed, lifecycle changed),
225
+ // so during a long-running phase there are no events and the data goes stale.
226
+ // Poll every 5s when the feature is in a working state to keep data fresh.
227
+ const isFeatureActive = featureNode.state === 'running' || featureNode.state === 'creating';
228
+ useEffect(() => {
229
+ if (!isFeatureActive)
230
+ return;
231
+ const interval = setInterval(() => {
232
+ refreshTab('activity');
233
+ }, 5000);
234
+ return () => clearInterval(interval);
235
+ }, [isFeatureActive, refreshTab]);
223
236
  const handleTabChange = useCallback((value) => {
224
237
  const tab = value;
225
238
  isUserInteraction.current = true;
@@ -1 +1 @@
1
- {"version":3,"file":"use-tab-data-fetch.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/feature-drawer-tabs/use-tab-data-fetch.ts"],"names":[],"mappings":"AAIA,yDAAyD;AACzD,MAAM,WAAW,QAAQ,CAAC,CAAC,GAAG,OAAO;IACnC,IAAI,EAAE,CAAC,GAAG,IAAI,CAAC;IACf,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CACtB;AAED,iEAAiE;AACjE,MAAM,MAAM,UAAU,CAAC,CAAC,GAAG,OAAO,IAAI,CAAC,SAAS,EAAE,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC;AAExE,kDAAkD;AAClD,MAAM,MAAM,WAAW,CAAC,CAAC,SAAS,MAAM,IAAI,MAAM,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC;AAElE,+CAA+C;AAC/C,MAAM,WAAW,qBAAqB,CAAC,CAAC,SAAS,MAAM;IACrD,4CAA4C;IAC5C,IAAI,EAAE,MAAM,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;IAC1B,2DAA2D;IAC3D,QAAQ,EAAE,CAAC,GAAG,EAAE,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACpC,iDAAiD;IACjD,UAAU,EAAE,CAAC,GAAG,EAAE,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACvC;AAMD;;;;;;;;GAQG;AACH,wBAAgB,eAAe,CAAC,CAAC,SAAS,MAAM,EAC9C,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,WAAW,CAAC,CAAC,CAAC,GACvB,qBAAqB,CAAC,CAAC,CAAC,CAmG1B"}
1
+ {"version":3,"file":"use-tab-data-fetch.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/feature-drawer-tabs/use-tab-data-fetch.ts"],"names":[],"mappings":"AAIA,yDAAyD;AACzD,MAAM,WAAW,QAAQ,CAAC,CAAC,GAAG,OAAO;IACnC,IAAI,EAAE,CAAC,GAAG,IAAI,CAAC;IACf,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CACtB;AAED,iEAAiE;AACjE,MAAM,MAAM,UAAU,CAAC,CAAC,GAAG,OAAO,IAAI,CAAC,SAAS,EAAE,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC;AAExE,kDAAkD;AAClD,MAAM,MAAM,WAAW,CAAC,CAAC,SAAS,MAAM,IAAI,MAAM,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC;AAElE,+CAA+C;AAC/C,MAAM,WAAW,qBAAqB,CAAC,CAAC,SAAS,MAAM;IACrD,4CAA4C;IAC5C,IAAI,EAAE,MAAM,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;IAC1B,2DAA2D;IAC3D,QAAQ,EAAE,CAAC,GAAG,EAAE,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACpC,iDAAiD;IACjD,UAAU,EAAE,CAAC,GAAG,EAAE,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACvC;AAMD;;;;;;;;GAQG;AACH,wBAAgB,eAAe,CAAC,CAAC,SAAS,MAAM,EAC9C,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,WAAW,CAAC,CAAC,CAAC,GACvB,qBAAqB,CAAC,CAAC,CAAC,CA2G1B"}
@@ -54,11 +54,16 @@ export function useTabDataFetch(featureId, fetchers) {
54
54
  const currentFeatureId = featureIdRef.current;
55
55
  if (!fetcher)
56
56
  return;
57
+ // Only show loading spinner when there's no existing data.
58
+ // On refresh (data already present), keep showing stale data while fetching
59
+ // to avoid flickering the entire tab on every poll cycle.
57
60
  if (mountedRef.current) {
58
- setTabStates((prev) => ({
59
- ...prev,
60
- [tab]: { ...prev[tab], loading: true, error: null },
61
- }));
61
+ setTabStates((prev) => {
62
+ const hasData = prev[tab]?.data !== null;
63
+ if (hasData)
64
+ return prev; // Keep stale data visible — no loading flash
65
+ return { ...prev, [tab]: { ...prev[tab], loading: true, error: null } };
66
+ });
62
67
  }
63
68
  try {
64
69
  const data = await fetcher(currentFeatureId);
@@ -71,11 +76,15 @@ export function useTabDataFetch(featureId, fetchers) {
71
76
  }
72
77
  catch (error) {
73
78
  if (mountedRef.current) {
74
- const message = error instanceof Error ? error.message : 'Failed to fetch tab data';
75
- setTabStates((prev) => ({
76
- ...prev,
77
- [tab]: { data: null, loading: false, error: message },
78
- }));
79
+ setTabStates((prev) => {
80
+ const message = error instanceof Error ? error.message : 'Failed to fetch tab data';
81
+ // On refresh failure, keep existing data instead of clearing it
82
+ const existingData = prev[tab]?.data ?? null;
83
+ return {
84
+ ...prev,
85
+ [tab]: { data: existingData, loading: false, error: existingData ? null : message },
86
+ };
87
+ });
79
88
  }
80
89
  }
81
90
  }, []);
@@ -9,6 +9,14 @@ export interface RepositoryNodeData {
9
9
  repositoryPath?: string;
10
10
  /** Creation timestamp (epoch ms) — used for stable vertical ordering. */
11
11
  createdAt?: number;
12
+ /** Current git branch name (e.g. "main", "feat/my-feature") */
13
+ branch?: string;
14
+ /** Commit message of the branch HEAD (first line only) */
15
+ commitMessage?: string;
16
+ /** Name of the person who made the latest commit */
17
+ committer?: string;
18
+ /** Number of commits the current branch is behind the default branch. null if on default branch or unknown. */
19
+ behindCount?: number | null;
12
20
  onClick?: () => void;
13
21
  onAdd?: () => void;
14
22
  onDelete?: (repositoryId: string) => void;
@@ -1 +1 @@
1
- {"version":3,"file":"repository-node-config.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/repository-node/repository-node-config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAE1C,MAAM,WAAW,kBAAkB;IACjC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;IACvB,qEAAqE;IACrE,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,0CAA0C;IAC1C,IAAI,EAAE,MAAM,CAAC;IACb,uEAAuE;IACvE,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,yEAAyE;IACzE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,IAAI,CAAC;IACnB,QAAQ,CAAC,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,IAAI,CAAC;IAC1C,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,+EAA+E;IAC/E,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,MAAM,kBAAkB,GAAG,IAAI,CAAC,kBAAkB,EAAE,gBAAgB,CAAC,CAAC"}
1
+ {"version":3,"file":"repository-node-config.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/repository-node/repository-node-config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAE1C,MAAM,WAAW,kBAAkB;IACjC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;IACvB,qEAAqE;IACrE,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,0CAA0C;IAC1C,IAAI,EAAE,MAAM,CAAC;IACb,uEAAuE;IACvE,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,yEAAyE;IACzE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,+DAA+D;IAC/D,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,0DAA0D;IAC1D,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,oDAAoD;IACpD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,+GAA+G;IAC/G,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,IAAI,CAAC;IACnB,QAAQ,CAAC,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,IAAI,CAAC;IAC1C,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,+EAA+E;IAC/E,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,MAAM,kBAAkB,GAAG,IAAI,CAAC,kBAAkB,EAAE,gBAAgB,CAAC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"repository-node.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/repository-node/repository-node.tsx"],"names":[],"mappings":"AAsBA,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,2CAyR5F"}
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"}
@@ -3,7 +3,7 @@ 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 } from 'lucide-react';
6
+ import { Github, Plus, Code2, Terminal, FolderOpen, Trash2, Play, Square, GitBranch, GitCommitHorizontal, ArrowDown, User, } 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';
@@ -72,9 +72,9 @@ export function RepositoryNode({ data }) {
72
72
  e.stopPropagation();
73
73
  data.onClick?.();
74
74
  }
75
- }, className: "nodrag bg-card flex min-w-[18rem] cursor-pointer items-center gap-3 rounded-full border px-4 py-3 shadow-sm", 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) => {
76
- e.stopPropagation();
77
- data.onAdd?.();
78
- }, 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.onAdd || data.showHandles ? (_jsx(Handle, { type: "source", position: Position.Right, isConnectable: !data.showHandles, className: "opacity-0!" })) : null] }));
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) => {
76
+ e.stopPropagation();
77
+ data.onAdd?.();
78
+ }, 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] }));
80
80
  }
@@ -14,4 +14,6 @@ export declare const WithActions: Story;
14
14
  export declare const WithActionsAndAddButton: Story;
15
15
  export declare const WithDeleteButton: Story;
16
16
  export declare const MultipleWithActions: Story;
17
+ export declare const WithGitInfo: Story;
18
+ export declare const WithGitInfoBehind: Story;
17
19
  //# sourceMappingURL=repository-node.stories.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"repository-node.stories.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/repository-node/repository-node.stories.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAGvD,OAAO,KAAK,EAAE,kBAAkB,EAAsB,MAAM,0BAA0B,CAAC;AAgCvF,QAAA,MAAM,IAAI,EAAE,IAAI,CAAC,kBAAkB,CASlC,CAAC;AAEF,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,kBAAkB,CAAC,CAAC;AAE1C,eAAO,MAAM,OAAO,EAAE,KAErB,CAAC;AAEF,eAAO,MAAM,aAAa,EAAE,KAK3B,CAAC;AAEF,eAAO,MAAM,WAAW,EAAE,KAKzB,CAAC;AAEF,eAAO,MAAM,QAAQ,EAAE,KAKtB,CAAC;AAWF,eAAO,MAAM,QAAQ,EAAE,KAwBtB,CAAC;AASF,eAAO,MAAM,kBAAkB,EAAE,KAwBhC,CAAC;AAEF,eAAO,MAAM,YAAY,EAAE,KAS1B,CAAC;AAEF,eAAO,MAAM,WAAW,EAAE,KAKzB,CAAC;AAEF,eAAO,MAAM,uBAAuB,EAAE,KAQrC,CAAC;AAIF,eAAO,MAAM,gBAAgB,EAAE,KAS9B,CAAC;AA2BF,eAAO,MAAM,mBAAmB,EAAE,KAwBjC,CAAC"}
1
+ {"version":3,"file":"repository-node.stories.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/repository-node/repository-node.stories.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAGvD,OAAO,KAAK,EAAE,kBAAkB,EAAsB,MAAM,0BAA0B,CAAC;AAgCvF,QAAA,MAAM,IAAI,EAAE,IAAI,CAAC,kBAAkB,CAYlC,CAAC;AAEF,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,kBAAkB,CAAC,CAAC;AAE1C,eAAO,MAAM,OAAO,EAAE,KAErB,CAAC;AAEF,eAAO,MAAM,aAAa,EAAE,KAK3B,CAAC;AAEF,eAAO,MAAM,WAAW,EAAE,KAKzB,CAAC;AAEF,eAAO,MAAM,QAAQ,EAAE,KAKtB,CAAC;AAiCF,eAAO,MAAM,QAAQ,EAAE,KAwBtB,CAAC;AAkCF,eAAO,MAAM,kBAAkB,EAAE,KAwBhC,CAAC;AAEF,eAAO,MAAM,YAAY,EAAE,KAS1B,CAAC;AAEF,eAAO,MAAM,WAAW,EAAE,KAKzB,CAAC;AAEF,eAAO,MAAM,uBAAuB,EAAE,KAQrC,CAAC;AAIF,eAAO,MAAM,gBAAgB,EAAE,KAS9B,CAAC;AA+CF,eAAO,MAAM,mBAAmB,EAAE,KAwBjC,CAAC;AAEF,eAAO,MAAM,WAAW,EAAE,KASzB,CAAC;AAEF,eAAO,MAAM,iBAAiB,EAAE,KAS/B,CAAC"}