@shepai/cli 1.152.0 → 1.153.0-pr477.9c7fcd0

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 (266) hide show
  1. package/dist/packages/core/src/application/ports/output/repositories/interactive-session-repository.interface.d.ts +5 -0
  2. package/dist/packages/core/src/application/ports/output/repositories/interactive-session-repository.interface.d.ts.map +1 -1
  3. package/dist/packages/core/src/application/ports/output/services/git-pr-service.interface.d.ts +37 -0
  4. package/dist/packages/core/src/application/ports/output/services/git-pr-service.interface.d.ts.map +1 -1
  5. package/dist/packages/core/src/application/ports/output/services/interactive-session-service.interface.d.ts +5 -0
  6. package/dist/packages/core/src/application/ports/output/services/interactive-session-service.interface.d.ts.map +1 -1
  7. package/dist/packages/core/src/application/use-cases/repositories/get-repository-commits.use-case.d.ts +18 -0
  8. package/dist/packages/core/src/application/use-cases/repositories/get-repository-commits.use-case.d.ts.map +1 -0
  9. package/dist/packages/core/src/application/use-cases/repositories/get-repository-commits.use-case.js +40 -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 +5 -0
  12. package/dist/packages/core/src/infrastructure/repositories/sqlite-interactive-session.repository.d.ts +1 -0
  13. package/dist/packages/core/src/infrastructure/repositories/sqlite-interactive-session.repository.d.ts.map +1 -1
  14. package/dist/packages/core/src/infrastructure/repositories/sqlite-interactive-session.repository.js +15 -0
  15. package/dist/packages/core/src/infrastructure/services/agents/common/executors/claude-code-interactive-executor.service.d.ts.map +1 -1
  16. package/dist/packages/core/src/infrastructure/services/agents/common/executors/claude-code-interactive-executor.service.js +8 -0
  17. package/dist/packages/core/src/infrastructure/services/git/git-pr.service.d.ts +3 -1
  18. package/dist/packages/core/src/infrastructure/services/git/git-pr.service.d.ts.map +1 -1
  19. package/dist/packages/core/src/infrastructure/services/git/git-pr.service.js +40 -0
  20. package/dist/packages/core/src/infrastructure/services/interactive/interactive-session.service.d.ts +1 -0
  21. package/dist/packages/core/src/infrastructure/services/interactive/interactive-session.service.d.ts.map +1 -1
  22. package/dist/packages/core/src/infrastructure/services/interactive/interactive-session.service.js +51 -5
  23. package/dist/src/presentation/web/app/actions/get-repository-commits.d.ts +13 -0
  24. package/dist/src/presentation/web/app/actions/get-repository-commits.d.ts.map +1 -0
  25. package/dist/src/presentation/web/app/actions/get-repository-commits.js +16 -0
  26. package/dist/src/presentation/web/app/api/interactive/chat/turn-statuses/route.d.ts +4 -5
  27. package/dist/src/presentation/web/app/api/interactive/chat/turn-statuses/route.d.ts.map +1 -1
  28. package/dist/src/presentation/web/app/api/interactive/chat/turn-statuses/route.js +5 -13
  29. package/dist/src/presentation/web/components/common/commit-history-tree/commit-history-tree.d.ts +14 -0
  30. package/dist/src/presentation/web/components/common/commit-history-tree/commit-history-tree.d.ts.map +1 -0
  31. package/dist/src/presentation/web/components/common/commit-history-tree/commit-history-tree.js +120 -0
  32. package/dist/src/presentation/web/components/common/commit-history-tree/commit-history-tree.stories.d.ts +12 -0
  33. package/dist/src/presentation/web/components/common/commit-history-tree/commit-history-tree.stories.d.ts.map +1 -0
  34. package/dist/src/presentation/web/components/common/commit-history-tree/commit-history-tree.stories.js +140 -0
  35. package/dist/src/presentation/web/components/common/commit-history-tree/use-commit-history.d.ts +16 -0
  36. package/dist/src/presentation/web/components/common/commit-history-tree/use-commit-history.d.ts.map +1 -0
  37. package/dist/src/presentation/web/components/common/commit-history-tree/use-commit-history.js +33 -0
  38. package/dist/src/presentation/web/components/common/control-center-drawer/repository-drawer-client.d.ts +1 -1
  39. package/dist/src/presentation/web/components/common/control-center-drawer/repository-drawer-client.d.ts.map +1 -1
  40. package/dist/src/presentation/web/components/common/control-center-drawer/repository-drawer-client.js +11 -1
  41. package/dist/src/presentation/web/components/common/floating-action-button/floating-action-button.d.ts +8 -2
  42. package/dist/src/presentation/web/components/common/floating-action-button/floating-action-button.d.ts.map +1 -1
  43. package/dist/src/presentation/web/components/common/floating-action-button/floating-action-button.js +10 -7
  44. package/dist/src/presentation/web/components/common/repository-node/repository-node.d.ts.map +1 -1
  45. package/dist/src/presentation/web/components/common/repository-node/repository-node.js +2 -3
  46. package/dist/src/presentation/web/components/features/chat/ChatSheet.d.ts.map +1 -1
  47. package/dist/src/presentation/web/components/features/chat/ChatSheet.js +43 -30
  48. package/dist/src/presentation/web/components/features/control-center/control-center-inner.d.ts.map +1 -1
  49. package/dist/src/presentation/web/components/features/control-center/control-center-inner.js +66 -3
  50. package/dist/src/presentation/web/components/features/features-canvas/canvas-toolbar.d.ts +1 -6
  51. package/dist/src/presentation/web/components/features/features-canvas/canvas-toolbar.d.ts.map +1 -1
  52. package/dist/src/presentation/web/components/features/features-canvas/canvas-toolbar.js +5 -6
  53. package/dist/src/presentation/web/components/features/features-canvas/features-canvas.js +1 -1
  54. package/dist/src/presentation/web/components/layouts/app-shell/app-shell.d.ts.map +1 -1
  55. package/dist/src/presentation/web/components/layouts/app-shell/app-shell.js +9 -5
  56. package/dist/src/presentation/web/hooks/turn-statuses-provider.d.ts +4 -8
  57. package/dist/src/presentation/web/hooks/turn-statuses-provider.d.ts.map +1 -1
  58. package/dist/src/presentation/web/hooks/turn-statuses-provider.js +4 -4
  59. package/dist/src/presentation/web/hooks/use-turn-statuses.d.ts +4 -5
  60. package/dist/src/presentation/web/hooks/use-turn-statuses.d.ts.map +1 -1
  61. package/dist/src/presentation/web/hooks/use-turn-statuses.js +7 -12
  62. package/dist/tsconfig.build.tsbuildinfo +1 -1
  63. package/package.json +1 -1
  64. package/web/.next/BUILD_ID +1 -1
  65. package/web/.next/build-manifest.json +2 -2
  66. package/web/.next/fallback-build-manifest.json +2 -2
  67. package/web/.next/prerender-manifest.json +3 -3
  68. package/web/.next/required-server-files.js +3 -3
  69. package/web/.next/required-server-files.json +3 -3
  70. package/web/.next/server/app/(dashboard)/@drawer/adopt/page/server-reference-manifest.json +28 -28
  71. package/web/.next/server/app/(dashboard)/@drawer/adopt/page.js.nft.json +1 -1
  72. package/web/.next/server/app/(dashboard)/@drawer/adopt/page_client-reference-manifest.js +1 -1
  73. package/web/.next/server/app/(dashboard)/@drawer/chat/page/server-reference-manifest.json +26 -26
  74. package/web/.next/server/app/(dashboard)/@drawer/chat/page.js.nft.json +1 -1
  75. package/web/.next/server/app/(dashboard)/@drawer/chat/page_client-reference-manifest.js +1 -1
  76. package/web/.next/server/app/(dashboard)/@drawer/create/page/server-reference-manifest.json +29 -29
  77. package/web/.next/server/app/(dashboard)/@drawer/create/page.js.nft.json +1 -1
  78. package/web/.next/server/app/(dashboard)/@drawer/create/page_client-reference-manifest.js +1 -1
  79. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page/server-reference-manifest.json +36 -36
  80. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page.js.nft.json +1 -1
  81. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page_client-reference-manifest.js +1 -1
  82. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page/server-reference-manifest.json +36 -36
  83. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js.nft.json +1 -1
  84. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page_client-reference-manifest.js +1 -1
  85. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/[tab]/page/server-reference-manifest.json +67 -52
  86. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/[tab]/page.js +1 -1
  87. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/[tab]/page.js.nft.json +1 -1
  88. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/[tab]/page_client-reference-manifest.js +1 -1
  89. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page/server-reference-manifest.json +67 -52
  90. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js +1 -1
  91. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js.nft.json +1 -1
  92. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  93. package/web/.next/server/app/(dashboard)/chat/page/server-reference-manifest.json +26 -26
  94. package/web/.next/server/app/(dashboard)/chat/page.js.nft.json +1 -1
  95. package/web/.next/server/app/(dashboard)/chat/page_client-reference-manifest.js +1 -1
  96. package/web/.next/server/app/(dashboard)/create/page/server-reference-manifest.json +29 -29
  97. package/web/.next/server/app/(dashboard)/create/page.js.nft.json +1 -1
  98. package/web/.next/server/app/(dashboard)/create/page_client-reference-manifest.js +1 -1
  99. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page/server-reference-manifest.json +36 -36
  100. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page.js.nft.json +1 -1
  101. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page_client-reference-manifest.js +1 -1
  102. package/web/.next/server/app/(dashboard)/feature/[featureId]/page/server-reference-manifest.json +36 -36
  103. package/web/.next/server/app/(dashboard)/feature/[featureId]/page.js.nft.json +1 -1
  104. package/web/.next/server/app/(dashboard)/feature/[featureId]/page_client-reference-manifest.js +1 -1
  105. package/web/.next/server/app/(dashboard)/page/server-reference-manifest.json +26 -26
  106. package/web/.next/server/app/(dashboard)/page.js.nft.json +1 -1
  107. package/web/.next/server/app/(dashboard)/page_client-reference-manifest.js +1 -1
  108. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/[tab]/page/server-reference-manifest.json +67 -52
  109. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/[tab]/page.js +1 -1
  110. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/[tab]/page.js.nft.json +1 -1
  111. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/[tab]/page_client-reference-manifest.js +1 -1
  112. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page/server-reference-manifest.json +67 -52
  113. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js +1 -1
  114. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js.nft.json +1 -1
  115. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  116. package/web/.next/server/app/_global-error.html +2 -2
  117. package/web/.next/server/app/_global-error.rsc +1 -1
  118. package/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  119. package/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  120. package/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  121. package/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  122. package/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  123. package/web/.next/server/app/_not-found/page/server-reference-manifest.json +5 -5
  124. package/web/.next/server/app/_not-found/page.js.nft.json +1 -1
  125. package/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  126. package/web/.next/server/app/api/attachments/preview/route.js.nft.json +1 -1
  127. package/web/.next/server/app/api/evidence/route.js.nft.json +1 -1
  128. package/web/.next/server/app/api/graph-data/route.js.nft.json +1 -1
  129. package/web/.next/server/app/api/interactive/chat/[featureId]/messages/route.js.nft.json +1 -1
  130. package/web/.next/server/app/api/sessions/route.js.nft.json +1 -1
  131. package/web/.next/server/app/api/sessions-batch/route.js.nft.json +1 -1
  132. package/web/.next/server/app/settings/page/server-reference-manifest.json +8 -8
  133. package/web/.next/server/app/settings/page.js.nft.json +1 -1
  134. package/web/.next/server/app/settings/page_client-reference-manifest.js +1 -1
  135. package/web/.next/server/app/skills/page/server-reference-manifest.json +10 -10
  136. package/web/.next/server/app/skills/page.js.nft.json +1 -1
  137. package/web/.next/server/app/skills/page_client-reference-manifest.js +1 -1
  138. package/web/.next/server/app/tools/page/server-reference-manifest.json +10 -10
  139. package/web/.next/server/app/tools/page.js.nft.json +1 -1
  140. package/web/.next/server/app/tools/page_client-reference-manifest.js +1 -1
  141. package/web/.next/server/app/version/page/server-reference-manifest.json +5 -5
  142. package/web/.next/server/app/version/page.js.nft.json +1 -1
  143. package/web/.next/server/app/version/page_client-reference-manifest.js +1 -1
  144. package/web/.next/server/chunks/[root-of-the-server]__a402b567._.js +1 -1
  145. package/web/.next/server/chunks/[root-of-the-server]__ab4951b1._.js +1 -1
  146. package/web/.next/server/chunks/[root-of-the-server]__ab4951b1._.js.map +1 -1
  147. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js +1 -1
  148. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js.map +1 -1
  149. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_feature-drawer-client_tsx_e9755fc8._.js +2 -2
  150. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_feature-drawer-client_tsx_e9755fc8._.js.map +1 -1
  151. package/web/.next/server/chunks/ssr/7f428_lucide-react_dist_esm_icons_refresh-cw_2796b1f0.js +3 -0
  152. package/web/.next/server/chunks/ssr/7f428_lucide-react_dist_esm_icons_refresh-cw_2796b1f0.js.map +1 -0
  153. package/web/.next/server/chunks/ssr/[root-of-the-server]__17ed7ed1._.js +1 -1
  154. package/web/.next/server/chunks/ssr/[root-of-the-server]__17ed7ed1._.js.map +1 -1
  155. package/web/.next/server/chunks/ssr/[root-of-the-server]__28d0d265._.js +2 -2
  156. package/web/.next/server/chunks/ssr/[root-of-the-server]__357d99f9._.js +1 -1
  157. package/web/.next/server/chunks/ssr/[root-of-the-server]__42bf1807._.js +1 -1
  158. package/web/.next/server/chunks/ssr/[root-of-the-server]__42bf1807._.js.map +1 -1
  159. package/web/.next/server/chunks/ssr/[root-of-the-server]__56b70465._.js +1 -1
  160. package/web/.next/server/chunks/ssr/[root-of-the-server]__56b70465._.js.map +1 -1
  161. package/web/.next/server/chunks/ssr/[root-of-the-server]__88f7e8e6._.js +1 -1
  162. package/web/.next/server/chunks/ssr/[root-of-the-server]__88f7e8e6._.js.map +1 -1
  163. package/web/.next/server/chunks/ssr/[root-of-the-server]__8b0aac03._.js +1 -1
  164. package/web/.next/server/chunks/ssr/[root-of-the-server]__c30f1f82._.js +1 -1
  165. package/web/.next/server/chunks/ssr/[root-of-the-server]__c30f1f82._.js.map +1 -1
  166. package/web/.next/server/chunks/ssr/[root-of-the-server]__ce859680._.js +3 -0
  167. package/web/.next/server/chunks/ssr/[root-of-the-server]__ce859680._.js.map +1 -0
  168. package/web/.next/server/chunks/ssr/[root-of-the-server]__f80bfc75._.js +1 -1
  169. package/web/.next/server/chunks/ssr/[root-of-the-server]__f80bfc75._.js.map +1 -1
  170. package/web/.next/server/chunks/ssr/_05c23ad9._.js +1 -1
  171. package/web/.next/server/chunks/ssr/_05c23ad9._.js.map +1 -1
  172. package/web/.next/server/chunks/ssr/_16eb4fec._.js +1 -1
  173. package/web/.next/server/chunks/ssr/_16eb4fec._.js.map +1 -1
  174. package/web/.next/server/chunks/ssr/{_5fce01a7._.js → _29ca8860._.js} +2 -2
  175. package/web/.next/server/chunks/ssr/{_5fce01a7._.js.map → _29ca8860._.js.map} +1 -1
  176. package/web/.next/server/chunks/ssr/_3a0b989f._.js +2 -2
  177. package/web/.next/server/chunks/ssr/_3a0b989f._.js.map +1 -1
  178. package/web/.next/server/chunks/ssr/{_d8bedf13._.js → _48066275._.js} +2 -2
  179. package/web/.next/server/chunks/ssr/_48066275._.js.map +1 -0
  180. package/web/.next/server/chunks/ssr/{_d86175ae._.js → _4b41246e._.js} +2 -2
  181. package/web/.next/server/chunks/ssr/_4b41246e._.js.map +1 -0
  182. package/web/.next/server/chunks/ssr/_56b9d60f._.js +1 -1
  183. package/web/.next/server/chunks/ssr/_56b9d60f._.js.map +1 -1
  184. package/web/.next/server/chunks/ssr/{_8219712a._.js → _5eb64260._.js} +2 -2
  185. package/web/.next/server/chunks/ssr/_5eb64260._.js.map +1 -0
  186. package/web/.next/server/chunks/ssr/{_5f69c13f._.js → _6438bf2d._.js} +2 -2
  187. package/web/.next/server/chunks/ssr/_6438bf2d._.js.map +1 -0
  188. package/web/.next/server/chunks/ssr/_7c5b97c6._.js +1 -1
  189. package/web/.next/server/chunks/ssr/_7c5b97c6._.js.map +1 -1
  190. package/web/.next/server/chunks/ssr/_82c57f10._.js +1 -1
  191. package/web/.next/server/chunks/ssr/_82c57f10._.js.map +1 -1
  192. package/web/.next/server/chunks/ssr/{_cb5a021e._.js → _87761ee1._.js} +2 -2
  193. package/web/.next/server/chunks/ssr/_87761ee1._.js.map +1 -0
  194. package/web/.next/server/chunks/ssr/_9495d50b._.js +1 -1
  195. package/web/.next/server/chunks/ssr/_9495d50b._.js.map +1 -1
  196. package/web/.next/server/chunks/ssr/_a0e3f7e4._.js +1 -1
  197. package/web/.next/server/chunks/ssr/_a0e3f7e4._.js.map +1 -1
  198. package/web/.next/server/chunks/ssr/{_cf1c5b73._.js → _a3aa1eb6._.js} +2 -2
  199. package/web/.next/server/chunks/ssr/_a3aa1eb6._.js.map +1 -0
  200. package/web/.next/server/chunks/ssr/_ac4a3873._.js +1 -1
  201. package/web/.next/server/chunks/ssr/_ac4a3873._.js.map +1 -1
  202. package/web/.next/server/chunks/ssr/_c93c0cc6._.js +3 -0
  203. package/web/.next/server/chunks/ssr/_c93c0cc6._.js.map +1 -0
  204. package/web/.next/server/chunks/ssr/_ca0aa7f0._.js +1 -1
  205. package/web/.next/server/chunks/ssr/_ca0aa7f0._.js.map +1 -1
  206. package/web/.next/server/chunks/ssr/{_e9a73a63._.js → _e55a0378._.js} +2 -2
  207. package/web/.next/server/chunks/ssr/_e55a0378._.js.map +1 -0
  208. package/web/.next/server/chunks/ssr/_fa7efce3._.js +2 -2
  209. package/web/.next/server/chunks/ssr/_fa7efce3._.js.map +1 -1
  210. package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_settings_settings-page-client_tsx_6ed9d5f8._.js +1 -1
  211. package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_settings_settings-page-client_tsx_6ed9d5f8._.js.map +1 -1
  212. package/web/.next/server/chunks/ssr/f3a1f_components_common_control-center-drawer_repository-drawer-client_tsx_39a00c03._.js +3 -0
  213. package/web/.next/server/chunks/ssr/f3a1f_components_common_control-center-drawer_repository-drawer-client_tsx_39a00c03._.js.map +1 -0
  214. package/web/.next/server/chunks/ssr/src_presentation_web_324a47da._.js +3 -0
  215. package/web/.next/server/chunks/ssr/src_presentation_web_324a47da._.js.map +1 -0
  216. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_skills_page_actions_cdc632e3.js +1 -1
  217. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_skills_page_actions_cdc632e3.js.map +1 -1
  218. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_tools_page_actions_39ca0924.js +1 -1
  219. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_tools_page_actions_39ca0924.js.map +1 -1
  220. package/web/.next/server/chunks/ssr/src_presentation_web_app_actions_open-ide_ts_baaca5d5._.js +1 -1
  221. package/web/.next/server/chunks/ssr/src_presentation_web_components_357e3eb0._.js +1 -1
  222. package/web/.next/server/chunks/ssr/src_presentation_web_components_357e3eb0._.js.map +1 -1
  223. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js +1 -1
  224. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js.map +1 -1
  225. package/web/.next/server/pages/500.html +2 -2
  226. package/web/.next/server/server-reference-manifest.js +1 -1
  227. package/web/.next/server/server-reference-manifest.json +185 -149
  228. package/web/.next/static/chunks/0b347558818d2628.js +1 -0
  229. package/web/.next/static/chunks/{cd54b758f58061d0.js → 1406c2860e7fac9c.js} +1 -1
  230. package/web/.next/static/chunks/36208713ad011740.js +1 -0
  231. package/web/.next/static/chunks/3f21588c6956d5b4.css +1 -0
  232. package/web/.next/static/chunks/471bebfd8d0f0acd.js +1 -0
  233. package/web/.next/static/chunks/{277a7f64d4ec189d.js → 5a585a2f6bcff4a9.js} +1 -1
  234. package/web/.next/static/chunks/{1b4429259bbf3064.js → 65ece264fa8f6fe1.js} +2 -2
  235. package/web/.next/static/chunks/{f9a80d3854a8d453.js → 929ed61442b5e9f7.js} +1 -1
  236. package/web/.next/static/chunks/{80c4c8b3a5c8e0b6.js → a4ffe2d157f11ad3.js} +1 -1
  237. package/web/.next/static/chunks/{bdd340ad42a34b41.js → aaf8507271e6f018.js} +1 -1
  238. package/web/.next/static/chunks/b27aae090cd67337.js +7 -0
  239. package/web/.next/static/chunks/{ef1c9f43aafff65f.js → b2c3da92e5d7864b.js} +2 -2
  240. package/web/.next/static/chunks/bb831852c32a9e59.js +1 -0
  241. package/web/.next/static/chunks/{a2257ffb1349f838.js → d13a4b544b737cbc.js} +1 -1
  242. package/web/.next/static/chunks/eef9a6b627e39d41.js +1 -0
  243. package/web/.next/static/chunks/{f33efe6a12242a8a.js → fa08611a63bb5369.js} +1 -1
  244. package/web/.next/server/chunks/ssr/[root-of-the-server]__563f2f7a._.js +0 -3
  245. package/web/.next/server/chunks/ssr/[root-of-the-server]__563f2f7a._.js.map +0 -1
  246. package/web/.next/server/chunks/ssr/_5f69c13f._.js.map +0 -1
  247. package/web/.next/server/chunks/ssr/_8219712a._.js.map +0 -1
  248. package/web/.next/server/chunks/ssr/_cb5a021e._.js.map +0 -1
  249. package/web/.next/server/chunks/ssr/_cf1c5b73._.js.map +0 -1
  250. package/web/.next/server/chunks/ssr/_cfbd1d7e._.js +0 -3
  251. package/web/.next/server/chunks/ssr/_cfbd1d7e._.js.map +0 -1
  252. package/web/.next/server/chunks/ssr/_d86175ae._.js.map +0 -1
  253. package/web/.next/server/chunks/ssr/_d8bedf13._.js.map +0 -1
  254. package/web/.next/server/chunks/ssr/_e9a73a63._.js.map +0 -1
  255. package/web/.next/server/chunks/ssr/_f78b4b9d._.js +0 -3
  256. package/web/.next/server/chunks/ssr/_f78b4b9d._.js.map +0 -1
  257. package/web/.next/static/chunks/22c459f1877b1e4f.js +0 -1
  258. package/web/.next/static/chunks/4908997348bd55f8.js +0 -1
  259. package/web/.next/static/chunks/6bf775818e4ad42e.js +0 -1
  260. package/web/.next/static/chunks/76858a51f2fbe99a.js +0 -7
  261. package/web/.next/static/chunks/8ba1c07ef18b15a9.js +0 -1
  262. package/web/.next/static/chunks/a919a9df4ab12a5c.css +0 -1
  263. package/web/.next/static/chunks/ee20803fb301d59e.js +0 -1
  264. /package/web/.next/static/{lPbWG8a1RwBDDcvRngp58 → -_iF1islqFSzVifHA2Zlt}/_buildManifest.js +0 -0
  265. /package/web/.next/static/{lPbWG8a1RwBDDcvRngp58 → -_iF1islqFSzVifHA2Zlt}/_clientMiddlewareManifest.json +0 -0
  266. /package/web/.next/static/{lPbWG8a1RwBDDcvRngp58 → -_iF1islqFSzVifHA2Zlt}/_ssgManifest.js +0 -0
@@ -0,0 +1,120 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { useState, useCallback } from 'react';
4
+ import { GitCommit, AlertCircle, GitBranch, Copy, Check, Loader2 } from 'lucide-react';
5
+ /* ---------------------------------------------------------------------------
6
+ * Helpers
7
+ * ------------------------------------------------------------------------- */
8
+ function formatRelativeDate(iso) {
9
+ if (!iso)
10
+ return '';
11
+ const date = new Date(iso);
12
+ if (Number.isNaN(date.getTime()))
13
+ return '';
14
+ const diffMs = Date.now() - date.getTime();
15
+ const diffSeconds = Math.floor(diffMs / 1000);
16
+ if (diffSeconds < 60)
17
+ return 'just now';
18
+ const diffMinutes = Math.floor(diffSeconds / 60);
19
+ if (diffMinutes < 60)
20
+ return `${diffMinutes}m ago`;
21
+ const diffHours = Math.floor(diffMinutes / 60);
22
+ if (diffHours < 24)
23
+ return `${diffHours}h ago`;
24
+ const diffDays = Math.floor(diffHours / 24);
25
+ if (diffDays < 30)
26
+ return `${diffDays}d ago`;
27
+ const diffMonths = Math.floor(diffDays / 30);
28
+ if (diffMonths < 12)
29
+ return `${diffMonths}mo ago`;
30
+ return `${Math.floor(diffMonths / 12)}y ago`;
31
+ }
32
+ /** Generate a deterministic color from a string (e.g. author email). */
33
+ function getAvatarColor(seed) {
34
+ let hash = 0;
35
+ for (let i = 0; i < seed.length; i++) {
36
+ hash = seed.charCodeAt(i) + ((hash << 5) - hash);
37
+ }
38
+ const hue = Math.abs(hash) % 360;
39
+ return `hsl(${hue}, 60%, 45%)`;
40
+ }
41
+ function getInitials(name) {
42
+ const parts = name.trim().split(/\s+/);
43
+ if (parts.length === 1)
44
+ return parts[0].slice(0, 2).toUpperCase();
45
+ return (parts[0][0] + parts[parts.length - 1][0]).toUpperCase();
46
+ }
47
+ /** Parse refs into branch and tag labels, stripping remote prefixes. */
48
+ function parseRefs(refs) {
49
+ const branches = [];
50
+ const tags = [];
51
+ for (const ref of refs) {
52
+ if (ref.startsWith('tag: ')) {
53
+ tags.push(ref.slice(5));
54
+ }
55
+ else if (ref.startsWith('HEAD -> ')) {
56
+ branches.push(ref.slice(8));
57
+ }
58
+ else if (!ref.startsWith('origin/') && !ref.startsWith('upstream/')) {
59
+ branches.push(ref);
60
+ }
61
+ }
62
+ return { branches, tags };
63
+ }
64
+ /* ---------------------------------------------------------------------------
65
+ * Sub-components
66
+ * ------------------------------------------------------------------------- */
67
+ function AuthorAvatar({ name, email }) {
68
+ const initials = getInitials(name || email || '?');
69
+ const color = getAvatarColor(email || name);
70
+ return (_jsx("span", { title: name || email, style: { backgroundColor: color }, className: "flex h-5 w-5 shrink-0 items-center justify-center rounded-full text-[9px] font-semibold text-white", children: initials }));
71
+ }
72
+ function RefBadge({ label, variant }) {
73
+ const classes = variant === 'head'
74
+ ? 'bg-violet-100 text-violet-700 dark:bg-violet-950/50 dark:text-violet-300'
75
+ : variant === 'branch'
76
+ ? 'bg-emerald-100 text-emerald-700 dark:bg-emerald-950/50 dark:text-emerald-300'
77
+ : 'bg-amber-100 text-amber-700 dark:bg-amber-950/50 dark:text-amber-300';
78
+ return (_jsxs("span", { className: `inline-flex items-center gap-0.5 rounded px-1 py-0.5 text-[10px] font-medium ${classes}`, children: [variant !== 'tag' && _jsx(GitBranch, { className: "h-2.5 w-2.5" }), label] }));
79
+ }
80
+ function CopyHashButton({ hash }) {
81
+ const [copied, setCopied] = useState(false);
82
+ const handleCopy = useCallback(() => {
83
+ navigator.clipboard.writeText(hash).then(() => {
84
+ setCopied(true);
85
+ setTimeout(() => setCopied(false), 1500);
86
+ });
87
+ }, [hash]);
88
+ return (_jsx("button", { type: "button", onClick: handleCopy, title: "Copy full commit hash", className: "text-muted-foreground/40 hover:text-muted-foreground ml-0.5 opacity-0 transition-opacity group-hover/commit:opacity-100", children: copied ? _jsx(Check, { className: "h-3 w-3 text-emerald-500" }) : _jsx(Copy, { className: "h-3 w-3" }) }));
89
+ }
90
+ function BranchSelector({ currentBranch, defaultBranch, activeBranch, onBranchChange, }) {
91
+ const branches = Array.from(new Set([currentBranch, defaultBranch].filter(Boolean)));
92
+ if (branches.length <= 1)
93
+ return null;
94
+ return (_jsx("div", { className: "flex items-center gap-1 px-4 py-2", children: branches.map((branch) => (_jsxs("button", { type: "button", onClick: () => onBranchChange(branch), className: `flex items-center gap-1 rounded-md px-2 py-1 text-xs font-medium transition-colors ${activeBranch === branch
95
+ ? 'bg-primary/10 text-primary'
96
+ : 'text-muted-foreground hover:text-foreground hover:bg-muted/50'}`, children: [_jsx(GitBranch, { className: "h-3 w-3" }), branch, branch === currentBranch && branch === activeBranch && (_jsx("span", { className: "bg-primary/20 text-primary rounded px-1 text-[9px]", children: "current" })), branch === defaultBranch && (_jsx("span", { className: "bg-muted text-muted-foreground rounded px-1 text-[9px]", children: "default" }))] }, branch))) }));
97
+ }
98
+ function CommitRow({ commit, isLast }) {
99
+ const { branches, tags } = parseRefs(commit.refs);
100
+ const headRef = commit.refs.find((r) => r.startsWith('HEAD -> '));
101
+ const headBranch = headRef ? headRef.slice(8) : null;
102
+ return (_jsxs("div", { className: "group/commit relative flex gap-3 px-4 py-2", children: [_jsxs("div", { className: "relative flex flex-col items-center", children: [_jsx("div", { className: "bg-primary relative z-10 mt-1.5 h-3 w-3 shrink-0 rounded-full border-2 border-white shadow-sm dark:border-gray-900" }), !isLast && (_jsx("div", { className: "bg-border/60 mt-0.5 w-px flex-1", style: { minHeight: '16px' } }))] }), _jsxs("div", { className: "min-w-0 flex-1 pb-1", children: [headBranch || branches.length > 0 || tags.length > 0 ? (_jsxs("div", { className: "mb-1 flex flex-wrap gap-1", children: [headBranch ? _jsx(RefBadge, { label: headBranch, variant: "head" }) : null, branches
103
+ .filter((b) => b !== headBranch)
104
+ .map((b) => (_jsx(RefBadge, { label: b, variant: "branch" }, b))), tags.map((t) => (_jsx(RefBadge, { label: t, variant: "tag" }, t)))] })) : null, _jsx("p", { className: "text-foreground/90 truncate text-sm leading-snug", title: commit.subject, children: commit.subject }), _jsxs("div", { className: "mt-1 flex items-center gap-2", children: [_jsx(AuthorAvatar, { name: commit.authorName, email: commit.authorEmail }), _jsx("span", { className: "text-muted-foreground min-w-0 truncate text-xs", children: commit.authorName || commit.authorEmail }), _jsx("span", { className: "text-muted-foreground/60 shrink-0 font-mono text-xs", children: commit.shortHash }), _jsx(CopyHashButton, { hash: commit.hash }), _jsx("span", { className: "text-muted-foreground/50 ml-auto shrink-0 text-xs tabular-nums", children: formatRelativeDate(commit.date) })] })] })] }));
105
+ }
106
+ /* ---------------------------------------------------------------------------
107
+ * Main component
108
+ * ------------------------------------------------------------------------- */
109
+ export function CommitHistoryTree({ commits, loading, error, currentBranch, defaultBranch, activeBranch, onBranchChange, }) {
110
+ if (loading) {
111
+ return (_jsx("div", { className: "flex items-center justify-center p-8", children: _jsx(Loader2, { className: "text-muted-foreground h-6 w-6 animate-spin" }) }));
112
+ }
113
+ if (error) {
114
+ 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 })] }));
115
+ }
116
+ if (!commits || commits.length === 0) {
117
+ return (_jsxs("div", { className: "flex flex-col items-center justify-center gap-2 p-8", children: [_jsx(GitCommit, { className: "text-muted-foreground h-8 w-8" }), _jsx("p", { className: "text-muted-foreground text-sm", children: "No commits found" })] }));
118
+ }
119
+ return (_jsxs("div", { className: "flex flex-col", children: [_jsx(BranchSelector, { currentBranch: currentBranch, defaultBranch: defaultBranch, activeBranch: activeBranch, onBranchChange: onBranchChange }), _jsx("div", { className: "flex flex-col", children: commits.map((commit, index) => (_jsx(CommitRow, { commit: commit, isLast: index === commits.length - 1 }, commit.hash))) })] }));
120
+ }
@@ -0,0 +1,12 @@
1
+ import type { Meta, StoryObj } from '@storybook/react';
2
+ import { CommitHistoryTree } from './commit-history-tree.js';
3
+ declare const meta: Meta<typeof CommitHistoryTree>;
4
+ export default meta;
5
+ type Story = StoryObj<typeof CommitHistoryTree>;
6
+ export declare const Default: Story;
7
+ export declare const OnDefaultBranch: Story;
8
+ export declare const Loading: Story;
9
+ export declare const Error: Story;
10
+ export declare const Empty: Story;
11
+ export declare const LongSubjects: Story;
12
+ //# sourceMappingURL=commit-history-tree.stories.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"commit-history-tree.stories.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/commit-history-tree/commit-history-tree.stories.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAG1D,QAAA,MAAM,IAAI,EAAE,IAAI,CAAC,OAAO,iBAAiB,CAcxC,CAAC;AAEF,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAsFhD,eAAO,MAAM,OAAO,EAAE,KAQrB,CAAC;AAEF,eAAO,MAAM,eAAe,EAAE,KAI7B,CAAC;AAKF,eAAO,MAAM,OAAO,EAAE,KAUrB,CAAC;AAEF,eAAO,MAAM,KAAK,EAAE,KAUnB,CAAC;AAEF,eAAO,MAAM,KAAK,EAAE,KAUnB,CAAC;AAEF,eAAO,MAAM,YAAY,EAAE,KA4B1B,CAAC"}
@@ -0,0 +1,140 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { useState } from 'react';
3
+ import { CommitHistoryTree } from './commit-history-tree.js';
4
+ const meta = {
5
+ title: 'Common/CommitHistoryTree',
6
+ component: CommitHistoryTree,
7
+ tags: ['autodocs'],
8
+ parameters: {
9
+ layout: 'padded',
10
+ },
11
+ decorators: [
12
+ (Story) => (_jsx("div", { className: "border-border bg-background w-[380px] overflow-y-auto rounded-lg border", children: _jsx(Story, {}) })),
13
+ ],
14
+ };
15
+ export default meta;
16
+ const now = new Date();
17
+ const daysAgo = (n) => new Date(now.getTime() - n * 86400000).toISOString();
18
+ const sampleCommits = [
19
+ {
20
+ hash: 'a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2',
21
+ shortHash: 'a1b2c3d',
22
+ subject: 'feat(web): add commit history tree component',
23
+ authorName: 'Alex Dev',
24
+ authorEmail: 'alex@example.com',
25
+ date: daysAgo(0),
26
+ refs: ['HEAD -> feat/commit-history-tree'],
27
+ },
28
+ {
29
+ hash: 'b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6b2c3d4',
30
+ shortHash: 'b2c3d4e',
31
+ subject: 'fix(web): resolve chat concurrency issue in polling',
32
+ authorName: 'Alex Dev',
33
+ authorEmail: 'alex@example.com',
34
+ date: daysAgo(1),
35
+ refs: [],
36
+ },
37
+ {
38
+ hash: 'c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6c3d4e5f6',
39
+ shortHash: 'c3d4e5f',
40
+ subject: 'chore(release): 1.152.0 [skip ci]',
41
+ authorName: 'Release Bot',
42
+ authorEmail: 'bot@example.com',
43
+ date: daysAgo(2),
44
+ refs: ['origin/main', 'main', 'v1.152.0'],
45
+ },
46
+ {
47
+ hash: 'd4e5f6a1b2c3d4e5f6a1b2c3d4e5f6d4e5f6a1b2',
48
+ shortHash: 'd4e5f6a',
49
+ subject: 'feat(agents): interactive feature agent with claude agent sdk',
50
+ authorName: 'Sam Engineer',
51
+ authorEmail: 'sam@example.com',
52
+ date: daysAgo(3),
53
+ refs: [],
54
+ },
55
+ {
56
+ hash: 'e5f6a1b2c3d4e5f6a1b2c3d4e5f6e5f6a1b2c3d4',
57
+ shortHash: 'e5f6a1b',
58
+ subject: 'fix(agents): deduplicate evidence across retry attempts',
59
+ authorName: 'Sam Engineer',
60
+ authorEmail: 'sam@example.com',
61
+ date: daysAgo(4),
62
+ refs: [],
63
+ },
64
+ {
65
+ hash: 'f6a1b2c3d4e5f6a1b2c3d4e5f6f6a1b2c3d4e5f6',
66
+ shortHash: 'f6a1b2c',
67
+ subject: 'refactor(web): reorganize sidebar layout with improved component structure',
68
+ authorName: 'Alex Dev',
69
+ authorEmail: 'alex@example.com',
70
+ date: daysAgo(5),
71
+ refs: [],
72
+ },
73
+ ];
74
+ function InteractiveTemplate({ commits, currentBranch, defaultBranch, }) {
75
+ const [activeBranch, setActiveBranch] = useState(currentBranch);
76
+ return (_jsx(CommitHistoryTree, { commits: commits, loading: false, error: null, currentBranch: currentBranch, defaultBranch: defaultBranch, activeBranch: activeBranch, onBranchChange: setActiveBranch }));
77
+ }
78
+ export const Default = {
79
+ render: () => (_jsx(InteractiveTemplate, { commits: sampleCommits, currentBranch: "feat/commit-history-tree", defaultBranch: "main" })),
80
+ };
81
+ export const OnDefaultBranch = {
82
+ render: () => (_jsx(InteractiveTemplate, { commits: sampleCommits, currentBranch: "main", defaultBranch: "main" })),
83
+ };
84
+ // eslint-disable-next-line @typescript-eslint/no-empty-function
85
+ const noop = (_branch) => { };
86
+ export const Loading = {
87
+ args: {
88
+ commits: null,
89
+ loading: true,
90
+ error: null,
91
+ currentBranch: 'main',
92
+ defaultBranch: 'main',
93
+ activeBranch: 'main',
94
+ onBranchChange: noop,
95
+ },
96
+ };
97
+ export const Error = {
98
+ args: {
99
+ commits: null,
100
+ loading: false,
101
+ error: 'Unable to determine default branch for repository. No remote HEAD configured.',
102
+ currentBranch: 'main',
103
+ defaultBranch: 'main',
104
+ activeBranch: 'main',
105
+ onBranchChange: noop,
106
+ },
107
+ };
108
+ export const Empty = {
109
+ args: {
110
+ commits: [],
111
+ loading: false,
112
+ error: null,
113
+ currentBranch: 'main',
114
+ defaultBranch: 'main',
115
+ activeBranch: 'main',
116
+ onBranchChange: noop,
117
+ },
118
+ };
119
+ export const LongSubjects = {
120
+ render: () => (_jsx(InteractiveTemplate, { commits: [
121
+ {
122
+ hash: 'a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2',
123
+ shortHash: 'a1b2c3d',
124
+ subject: 'feat(web): implement comprehensive commit history tree with branch selector, author avatars, ref badges, and copy hash functionality',
125
+ authorName: 'Very Long Author Name Indeed',
126
+ authorEmail: 'verylongname@example.com',
127
+ date: daysAgo(0),
128
+ refs: ['HEAD -> feat/very-long-branch-name-for-testing'],
129
+ },
130
+ {
131
+ hash: 'b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6b2c3d4',
132
+ shortHash: 'b2c3d4e',
133
+ subject: 'fix: short fix',
134
+ authorName: 'Al',
135
+ authorEmail: 'al@x.com',
136
+ date: daysAgo(7),
137
+ refs: ['origin/main', 'main', 'tag: v1.0.0'],
138
+ },
139
+ ], currentBranch: "feat/very-long-branch-name-for-testing", defaultBranch: "main" })),
140
+ };
@@ -0,0 +1,16 @@
1
+ import type { RepositoryCommitsData } from '../../../app/actions/get-repository-commits.js';
2
+ export interface UseCommitHistoryOptions {
3
+ repositoryPath: string | undefined;
4
+ branch?: string;
5
+ limit?: number;
6
+ /** Only fetch when enabled (e.g. when the tab is active) */
7
+ enabled?: boolean;
8
+ }
9
+ export interface UseCommitHistoryState {
10
+ data: RepositoryCommitsData | null;
11
+ loading: boolean;
12
+ error: string | null;
13
+ refresh: () => void;
14
+ }
15
+ export declare function useCommitHistory({ repositoryPath, branch, limit, enabled, }: UseCommitHistoryOptions): UseCommitHistoryState;
16
+ //# sourceMappingURL=use-commit-history.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-commit-history.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/commit-history-tree/use-commit-history.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,sCAAsC,CAAC;AAElF,MAAM,WAAW,uBAAuB;IACtC,cAAc,EAAE,MAAM,GAAG,SAAS,CAAC;IACnC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,4DAA4D;IAC5D,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,qBAAqB,GAAG,IAAI,CAAC;IACnC,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB;AAED,wBAAgB,gBAAgB,CAAC,EAC/B,cAAc,EACd,MAAM,EACN,KAAU,EACV,OAAc,GACf,EAAE,uBAAuB,GAAG,qBAAqB,CA4BjD"}
@@ -0,0 +1,33 @@
1
+ 'use client';
2
+ import { useState, useEffect, useCallback } from 'react';
3
+ import { getRepositoryCommits } from '../../../app/actions/get-repository-commits.js';
4
+ export function useCommitHistory({ repositoryPath, branch, limit = 50, enabled = true, }) {
5
+ const [data, setData] = useState(null);
6
+ const [loading, setLoading] = useState(false);
7
+ const [error, setError] = useState(null);
8
+ const fetch = useCallback(async () => {
9
+ if (!repositoryPath || !enabled)
10
+ return;
11
+ setLoading(true);
12
+ setError(null);
13
+ try {
14
+ const result = await getRepositoryCommits(repositoryPath, branch, limit);
15
+ if (result.success && result.data) {
16
+ setData(result.data);
17
+ }
18
+ else {
19
+ setError(result.error ?? 'Failed to load commit history');
20
+ }
21
+ }
22
+ catch (err) {
23
+ setError(err instanceof Error ? err.message : 'Failed to load commit history');
24
+ }
25
+ finally {
26
+ setLoading(false);
27
+ }
28
+ }, [repositoryPath, branch, limit, enabled]);
29
+ useEffect(() => {
30
+ void fetch();
31
+ }, [fetch]);
32
+ return { data, loading, error, refresh: fetch };
33
+ }
@@ -2,7 +2,7 @@ import type { RepositoryNodeData } from '../../common/repository-node/index.js';
2
2
  export interface RepositoryDrawerClientProps {
3
3
  data: RepositoryNodeData;
4
4
  /** Initial tab key from URL (e.g. 'chat'). */
5
- initialTab?: 'overview' | 'chat';
5
+ initialTab?: 'overview' | 'chat' | 'commits';
6
6
  }
7
7
  export declare function RepositoryDrawerClient({ data, initialTab }: RepositoryDrawerClientProps): import("react/jsx-runtime").JSX.Element;
8
8
  //# sourceMappingURL=repository-drawer-client.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"repository-drawer-client.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/control-center-drawer/repository-drawer-client.tsx"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,qCAAqC,CAAC;AAG9E,MAAM,WAAW,2BAA2B;IAC1C,IAAI,EAAE,kBAAkB,CAAC;IACzB,8CAA8C;IAC9C,UAAU,CAAC,EAAE,UAAU,GAAG,MAAM,CAAC;CAClC;AAED,wBAAgB,sBAAsB,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,2BAA2B,2CA6KvF"}
1
+ {"version":3,"file":"repository-drawer-client.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/control-center-drawer/repository-drawer-client.tsx"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,qCAAqC,CAAC;AAK9E,MAAM,WAAW,2BAA2B;IAC1C,IAAI,EAAE,kBAAkB,CAAC;IACzB,8CAA8C;IAC9C,UAAU,CAAC,EAAE,UAAU,GAAG,MAAM,GAAG,SAAS,CAAC;CAC9C;AAED,wBAAgB,sBAAsB,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,2BAA2B,2CA2MvF"}
@@ -13,12 +13,15 @@ import { useRepositoryActions } from '../../common/repository-node/use-repositor
13
13
  import { useDeployAction } from '../../../hooks/use-deploy-action.js';
14
14
  import { useFeatureFlags } from '../../../hooks/feature-flags-context.js';
15
15
  import { ChatTab } from '../../features/chat/ChatTab.js';
16
+ import { CommitHistoryTree } from '../../common/commit-history-tree/commit-history-tree.js';
17
+ import { useCommitHistory } from '../../common/commit-history-tree/use-commit-history.js';
16
18
  export function RepositoryDrawerClient({ data, initialTab }) {
17
19
  const featureFlags = useFeatureFlags();
18
20
  const router = useRouter();
19
21
  const pathname = usePathname();
20
22
  const isOpen = pathname.startsWith('/repository/');
21
23
  const [activeTab, setActiveTab] = useState(initialTab ?? 'overview');
24
+ const [commitBranch, setCommitBranch] = useState(undefined);
22
25
  const repoActions = useRepositoryActions(data.repositoryPath ? { repositoryId: data.id, repositoryPath: data.repositoryPath } : null);
23
26
  const onClose = useCallback(() => {
24
27
  router.push('/');
@@ -33,5 +36,12 @@ export function RepositoryDrawerClient({ data, initialTab }) {
33
36
  const isDeployActive = deployAction.status === 'Booting' || deployAction.status === 'Ready';
34
37
  // Session ID for repo chat — deterministic per repo
35
38
  const repoSessionId = data.id ? `repo-${data.id}` : `repo-${data.name}`;
36
- return (_jsx(BaseDrawer, { open: isOpen, onClose: onClose, size: "lg", modal: false, "data-testid": "repository-drawer", children: _jsxs(Tabs, { value: activeTab, onValueChange: setActiveTab, className: "flex min-h-0 flex-1 flex-col", children: [_jsxs("div", { className: "shrink-0 px-4 pt-4 pb-3", "data-testid": "repository-drawer-header", children: [_jsxs("div", { className: "flex items-baseline gap-4 pr-6", children: [_jsx("h2", { className: "text-foreground min-w-0 shrink truncate text-base font-semibold tracking-tight", children: data.name }), _jsxs(TabsList, { className: "h-auto shrink-0 gap-0.5 rounded-none border-0 bg-transparent p-0", children: [_jsx(TabsTrigger, { value: "overview", className: "text-muted-foreground hover:text-foreground data-[state=active]:text-foreground data-[state=active]:border-primary h-auto rounded-none border-b-2 border-transparent bg-transparent px-2 py-0.5 text-[12px] font-medium shadow-none transition-colors data-[state=active]:bg-transparent data-[state=active]:shadow-none", children: "Overview" }), _jsx(TabsTrigger, { value: "chat", className: "text-muted-foreground hover:text-foreground data-[state=active]:text-foreground data-[state=active]:border-primary h-auto rounded-none border-b-2 border-transparent bg-transparent px-2 py-0.5 text-[12px] font-medium shadow-none transition-colors data-[state=active]:bg-transparent data-[state=active]:shadow-none", children: "Chat" })] })] }), _jsxs("div", { className: "mt-1 flex items-center gap-2", children: [data.repositoryPath ? (_jsx("p", { className: "text-muted-foreground min-w-0 truncate font-mono text-xs", children: data.repositoryPath })) : null, featureFlags.envDeploy && data.repositoryPath ? (_jsxs("div", { className: "ml-auto flex shrink-0 items-center gap-2", children: [_jsx(TooltipProvider, { children: _jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx("span", { children: _jsx(ActionButton, { label: isDeployActive ? 'Stop Dev Server' : 'Start Dev Server', onClick: isDeployActive ? deployAction.stop : deployAction.deploy, loading: deployAction.deployLoading || deployAction.stopLoading, error: !!deployAction.deployError, icon: isDeployActive ? Square : Play, iconOnly: true, variant: "outline", size: "icon-sm" }) }) }), _jsx(TooltipContent, { children: isDeployActive ? 'Stop Dev Server' : 'Start Dev Server' })] }) }), isDeployActive ? (_jsx(DeploymentStatusBadge, { status: deployAction.status, url: deployAction.url, targetId: data.repositoryPath })) : null] })) : null] })] }), _jsx(Separator, {}), _jsx(TabsContent, { value: "overview", className: "mt-0 flex-1 overflow-y-auto", children: data.repositoryPath ? (_jsxs("div", { className: "flex-1 overflow-y-auto", children: [_jsxs("div", { className: "flex flex-col gap-3 p-4", children: [_jsx("div", { className: "text-muted-foreground text-xs font-semibold tracking-wider", children: "OPEN WITH" }), _jsxs("div", { className: "flex flex-col gap-2", children: [_jsx(ActionButton, { label: "Open in IDE", onClick: repoActions.openInIde, loading: repoActions.ideLoading, error: !!repoActions.ideError, icon: Code2, variant: "outline", size: "sm" }), _jsx(ActionButton, { label: "Open in Shell", onClick: repoActions.openInShell, loading: repoActions.shellLoading, error: !!repoActions.shellError, icon: Terminal, variant: "outline", size: "sm" }), _jsx(ActionButton, { label: "Open Folder", onClick: repoActions.openFolder, loading: repoActions.folderLoading, error: !!repoActions.folderError, icon: FolderOpen, variant: "outline", size: "sm" })] })] }), data.id && featureFlags.gitRebaseSync ? (_jsxs(_Fragment, { children: [_jsx(Separator, {}), _jsxs("div", { className: "flex flex-col gap-3 p-4", children: [_jsx("div", { className: "text-muted-foreground text-xs font-semibold tracking-wider", children: "GIT OPERATIONS" }), _jsxs("div", { className: "flex flex-col gap-2", children: [_jsx(ActionButton, { label: "Sync Main", onClick: repoActions.syncMain, loading: repoActions.syncLoading, error: !!repoActions.syncError, icon: RefreshCw, variant: "outline", size: "sm" }), repoActions.syncError ? (_jsx("p", { className: "text-destructive text-xs", children: repoActions.syncError })) : null] })] })] })) : null] })) : null }), _jsx(TabsContent, { value: "chat", className: "mt-0 flex min-h-0 flex-1 flex-col overflow-hidden", children: _jsx(ChatTab, { featureId: repoSessionId, worktreePath: data.repositoryPath }) })] }) }));
39
+ const commitHistory = useCommitHistory({
40
+ repositoryPath: data.repositoryPath,
41
+ branch: commitBranch,
42
+ enabled: activeTab === 'commits' && !!data.repositoryPath,
43
+ });
44
+ return (_jsx(BaseDrawer, { open: isOpen, onClose: onClose, size: "lg", modal: false, "data-testid": "repository-drawer", children: _jsxs(Tabs, { value: activeTab, onValueChange: setActiveTab, className: "flex min-h-0 flex-1 flex-col", children: [_jsxs("div", { className: "shrink-0 px-4 pt-4 pb-3", "data-testid": "repository-drawer-header", children: [_jsxs("div", { className: "flex items-baseline gap-4 pr-6", children: [_jsx("h2", { className: "text-foreground min-w-0 shrink truncate text-base font-semibold tracking-tight", children: data.name }), _jsxs(TabsList, { className: "h-auto shrink-0 gap-0.5 rounded-none border-0 bg-transparent p-0", children: [_jsx(TabsTrigger, { value: "overview", className: "text-muted-foreground hover:text-foreground data-[state=active]:text-foreground data-[state=active]:border-primary h-auto rounded-none border-b-2 border-transparent bg-transparent px-2 py-0.5 text-[12px] font-medium shadow-none transition-colors data-[state=active]:bg-transparent data-[state=active]:shadow-none", children: "Overview" }), _jsx(TabsTrigger, { value: "chat", className: "text-muted-foreground hover:text-foreground data-[state=active]:text-foreground data-[state=active]:border-primary h-auto rounded-none border-b-2 border-transparent bg-transparent px-2 py-0.5 text-[12px] font-medium shadow-none transition-colors data-[state=active]:bg-transparent data-[state=active]:shadow-none", children: "Chat" }), data.repositoryPath ? (_jsx(TabsTrigger, { value: "commits", className: "text-muted-foreground hover:text-foreground data-[state=active]:text-foreground data-[state=active]:border-primary h-auto rounded-none border-b-2 border-transparent bg-transparent px-2 py-0.5 text-[12px] font-medium shadow-none transition-colors data-[state=active]:bg-transparent data-[state=active]:shadow-none", children: "Commits" })) : null] })] }), _jsxs("div", { className: "mt-1 flex items-center gap-2", children: [data.repositoryPath ? (_jsx("p", { className: "text-muted-foreground min-w-0 truncate font-mono text-xs", children: data.repositoryPath })) : null, featureFlags.envDeploy && data.repositoryPath ? (_jsxs("div", { className: "ml-auto flex shrink-0 items-center gap-2", children: [_jsx(TooltipProvider, { children: _jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx("span", { children: _jsx(ActionButton, { label: isDeployActive ? 'Stop Dev Server' : 'Start Dev Server', onClick: isDeployActive ? deployAction.stop : deployAction.deploy, loading: deployAction.deployLoading || deployAction.stopLoading, error: !!deployAction.deployError, icon: isDeployActive ? Square : Play, iconOnly: true, variant: "outline", size: "icon-sm" }) }) }), _jsx(TooltipContent, { children: isDeployActive ? 'Stop Dev Server' : 'Start Dev Server' })] }) }), isDeployActive ? (_jsx(DeploymentStatusBadge, { status: deployAction.status, url: deployAction.url, targetId: data.repositoryPath })) : null] })) : null] })] }), _jsx(Separator, {}), _jsx(TabsContent, { value: "overview", className: "mt-0 flex-1 overflow-y-auto", children: data.repositoryPath ? (_jsxs("div", { className: "flex-1 overflow-y-auto", children: [_jsxs("div", { className: "flex flex-col gap-3 p-4", children: [_jsx("div", { className: "text-muted-foreground text-xs font-semibold tracking-wider", children: "OPEN WITH" }), _jsxs("div", { className: "flex flex-col gap-2", children: [_jsx(ActionButton, { label: "Open in IDE", onClick: repoActions.openInIde, loading: repoActions.ideLoading, error: !!repoActions.ideError, icon: Code2, variant: "outline", size: "sm" }), _jsx(ActionButton, { label: "Open in Shell", onClick: repoActions.openInShell, loading: repoActions.shellLoading, error: !!repoActions.shellError, icon: Terminal, variant: "outline", size: "sm" }), _jsx(ActionButton, { label: "Open Folder", onClick: repoActions.openFolder, loading: repoActions.folderLoading, error: !!repoActions.folderError, icon: FolderOpen, variant: "outline", size: "sm" })] })] }), data.id && featureFlags.gitRebaseSync ? (_jsxs(_Fragment, { children: [_jsx(Separator, {}), _jsxs("div", { className: "flex flex-col gap-3 p-4", children: [_jsx("div", { className: "text-muted-foreground text-xs font-semibold tracking-wider", children: "GIT OPERATIONS" }), _jsxs("div", { className: "flex flex-col gap-2", children: [_jsx(ActionButton, { label: "Sync Main", onClick: repoActions.syncMain, loading: repoActions.syncLoading, error: !!repoActions.syncError, icon: RefreshCw, variant: "outline", size: "sm" }), repoActions.syncError ? (_jsx("p", { className: "text-destructive text-xs", children: repoActions.syncError })) : null] })] })] })) : null] })) : null }), _jsx(TabsContent, { value: "chat", className: "mt-0 flex min-h-0 flex-1 flex-col overflow-hidden", children: _jsx(ChatTab, { featureId: repoSessionId, worktreePath: data.repositoryPath }) }), _jsx(TabsContent, { value: "commits", className: "mt-0 flex-1 overflow-y-auto", children: _jsx(CommitHistoryTree, { commits: commitHistory.data?.commits ?? null, loading: commitHistory.loading, error: commitHistory.error, currentBranch: commitHistory.data?.currentBranch ?? '', defaultBranch: commitHistory.data?.defaultBranch ?? '', activeBranch: commitBranch ?? commitHistory.data?.currentBranch ?? '', onBranchChange: (branch) => {
45
+ setCommitBranch(branch);
46
+ } }) })] }) }));
37
47
  }
@@ -16,8 +16,14 @@ export interface FloatingActionButtonAction {
16
16
  export interface FloatingActionButtonProps {
17
17
  /** Action items shown when the FAB is expanded. */
18
18
  actions: FloatingActionButtonAction[];
19
- /** Additional CSS classes for the container. */
19
+ /** Additional CSS classes for the wrapper. */
20
20
  className?: string;
21
+ /** Inline styles for the wrapper (e.g. dynamic positioning). */
22
+ style?: React.CSSProperties;
21
23
  }
22
- export declare function FloatingActionButton({ actions, className }: FloatingActionButtonProps): import("react/jsx-runtime").JSX.Element;
24
+ /**
25
+ * (+) FAB with expandable action menu.
26
+ * Renders inline — parent controls positioning.
27
+ */
28
+ export declare function FloatingActionButton({ actions, className, style }: FloatingActionButtonProps): import("react/jsx-runtime").JSX.Element;
23
29
  //# sourceMappingURL=floating-action-button.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"floating-action-button.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/floating-action-button/floating-action-button.tsx"],"names":[],"mappings":"AAEA,OAAO,KAA8B,MAAM,OAAO,CAAC;AAKnD,MAAM,WAAW,0BAA0B;IACzC,iCAAiC;IACjC,EAAE,EAAE,MAAM,CAAC;IACX,+CAA+C;IAC/C,KAAK,EAAE,MAAM,CAAC;IACd,6BAA6B;IAC7B,IAAI,EAAE,KAAK,CAAC,SAAS,CAAC;IACtB,yCAAyC;IACzC,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,+CAA+C;IAC/C,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,sCAAsC;IACtC,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,yBAAyB;IACxC,mDAAmD;IACnD,OAAO,EAAE,0BAA0B,EAAE,CAAC;IACtC,gDAAgD;IAChD,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAQD,wBAAgB,oBAAoB,CAAC,EAAE,OAAO,EAAE,SAAS,EAAE,EAAE,yBAAyB,2CA2GrF"}
1
+ {"version":3,"file":"floating-action-button.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/floating-action-button/floating-action-button.tsx"],"names":[],"mappings":"AAEA,OAAO,KAA8B,MAAM,OAAO,CAAC;AAKnD,MAAM,WAAW,0BAA0B;IACzC,iCAAiC;IACjC,EAAE,EAAE,MAAM,CAAC;IACX,+CAA+C;IAC/C,KAAK,EAAE,MAAM,CAAC;IACd,6BAA6B;IAC7B,IAAI,EAAE,KAAK,CAAC,SAAS,CAAC;IACtB,yCAAyC;IACzC,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,+CAA+C;IAC/C,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,sCAAsC;IACtC,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,yBAAyB;IACxC,mDAAmD;IACnD,OAAO,EAAE,0BAA0B,EAAE,CAAC;IACtC,8CAA8C;IAC9C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,gEAAgE;IAChE,KAAK,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;CAC7B;AAQD;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,EAAE,yBAAyB,2CAyG5F"}
@@ -8,7 +8,11 @@ import { Button } from '../../ui/button.js';
8
8
  const STAGGER_MS = 50;
9
9
  /** Total animation duration in ms. */
10
10
  const DURATION_MS = 250;
11
- export function FloatingActionButton({ actions, className }) {
11
+ /**
12
+ * (+) FAB with expandable action menu.
13
+ * Renders inline — parent controls positioning.
14
+ */
15
+ export function FloatingActionButton({ actions, className, style }) {
12
16
  const [open, setOpen] = useState(false);
13
17
  // Close on Escape key
14
18
  useEffect(() => {
@@ -22,14 +26,13 @@ export function FloatingActionButton({ actions, className }) {
22
26
  document.addEventListener('keydown', handleKeyDown);
23
27
  return () => document.removeEventListener('keydown', handleKeyDown);
24
28
  }, [open]);
25
- return (_jsxs(_Fragment, { children: [open ? (_jsx("div", { "data-testid": "fab-overlay", className: "fixed inset-0 z-40", onClick: () => setOpen(false), "aria-hidden": "true" })) : null, _jsxs("div", { "data-testid": "floating-action-button", className: cn('fixed right-6 bottom-6 z-50', className), children: [_jsx("div", { className: cn('absolute right-[calc(100%+12px)] bottom-0 flex flex-col items-end gap-2', !open && 'pointer-events-none'), "data-testid": "fab-actions", children: actions.map((action, i) => {
29
+ return (_jsxs(_Fragment, { children: [open ? (_jsx("div", { "data-testid": "fab-overlay", className: "fixed inset-0 z-40", onClick: () => setOpen(false), "aria-hidden": "true" })) : null, _jsxs("div", { "data-testid": "floating-action-button", className: cn('relative z-50', className), style: style, children: [_jsx("div", { className: cn('absolute bottom-[calc(100%+24px)] left-0 flex flex-col items-start gap-2', !open && 'pointer-events-none'), "data-testid": "fab-actions", children: actions.map((action, i) => {
26
30
  const openDelay = (actions.length - 1 - i) * STAGGER_MS;
27
- const closeDelay = i * STAGGER_MS;
28
- return (_jsxs("button", { "data-testid": `fab-action-${action.id}`, "aria-label": action.label, disabled: action.disabled ?? action.loading, className: cn('flex h-12 w-52 items-center justify-center gap-3 rounded-full px-4', 'bg-background text-foreground shadow-sm', 'border-border border', 'hover:bg-accent hover:text-accent-foreground', 'disabled:pointer-events-none disabled:opacity-50', open ? 'translate-x-0 opacity-100' : 'pointer-events-none translate-x-0 opacity-0'), style: {
29
- transition: `opacity ${open ? DURATION_MS : 150}ms ease-out ${open ? openDelay : closeDelay}ms`,
31
+ return (_jsxs("button", { "data-testid": `fab-action-${action.id}`, "aria-label": action.label, disabled: action.disabled ?? action.loading, className: cn('flex h-10 items-center gap-2.5 rounded-full px-4', 'bg-background text-foreground shadow-md', 'border-border border', 'hover:bg-accent hover:text-accent-foreground', 'disabled:pointer-events-none disabled:opacity-50', 'text-sm font-medium whitespace-nowrap', open ? 'translate-y-0 opacity-100' : 'pointer-events-none translate-y-0 opacity-0'), style: {
32
+ transition: `opacity ${open ? DURATION_MS : 120}ms ease-out ${open ? openDelay : 0}ms, transform ${open ? DURATION_MS : 120}ms ease-out ${open ? openDelay : 0}ms`,
30
33
  }, onClick: () => {
31
34
  action.onClick();
32
35
  setOpen(false);
33
- }, children: [_jsx("span", { className: "flex h-5 w-5 shrink-0 items-center justify-center", children: action.loading ? _jsx(Loader2, { className: "h-5 w-5 animate-spin" }) : action.icon }), _jsx("span", { className: "text-sm font-medium whitespace-nowrap", children: action.label })] }, action.id));
34
- }) }), _jsx("div", { className: "flex items-center", children: _jsxs(Button, { size: "icon", "data-testid": "fab-trigger", "aria-label": open ? 'Close actions' : 'Open actions', className: cn('relative h-14 w-14 rounded-full shadow-lg', 'bg-indigo-500 text-white hover:bg-indigo-400 dark:bg-indigo-500 dark:hover:bg-indigo-400', 'transition-all duration-200 hover:scale-105 hover:shadow-xl active:scale-95'), onClick: () => setOpen((prev) => !prev), children: [_jsx(Plus, { className: cn('absolute h-8 w-8 stroke-[2.5] transition-all', open ? 'scale-0 rotate-90 opacity-0' : 'scale-100 rotate-0 opacity-100'), style: { transitionDuration: `${DURATION_MS}ms` } }), _jsx(X, { className: cn('absolute h-8 w-8 stroke-[2.5] transition-all', open ? 'scale-100 rotate-0 opacity-100' : 'scale-0 -rotate-90 opacity-0'), style: { transitionDuration: `${DURATION_MS}ms` } })] }) })] })] }));
36
+ }, children: [_jsx("span", { className: "flex h-5 w-5 shrink-0 items-center justify-center", children: action.loading ? _jsx(Loader2, { className: "h-4 w-4 animate-spin" }) : action.icon }), _jsx("span", { children: action.label })] }, action.id));
37
+ }) }), _jsxs(Button, { size: "icon", "data-testid": "fab-trigger", "aria-label": open ? 'Close actions' : 'Create new', className: cn('relative h-14 w-14 rounded-full shadow-lg', 'bg-indigo-500 text-white hover:bg-indigo-400 dark:bg-indigo-500 dark:hover:bg-indigo-400', 'transition-all duration-200 hover:scale-105 hover:shadow-xl active:scale-95'), onClick: () => setOpen((prev) => !prev), children: [_jsx(Plus, { className: cn('absolute h-7 w-7 stroke-[2.5] transition-all', open ? 'scale-0 rotate-90 opacity-0' : 'scale-100 rotate-0 opacity-100'), style: { transitionDuration: `${DURATION_MS}ms` } }), _jsx(X, { className: cn('absolute h-6 w-6 stroke-[2.5] transition-all', open ? 'scale-100 rotate-0 opacity-100' : 'scale-0 -rotate-90 opacity-0'), style: { transitionDuration: `${DURATION_MS}ms` } })] })] })] }));
35
38
  }
@@ -1 +1 @@
1
- {"version":3,"file":"repository-node.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/repository-node/repository-node.tsx"],"names":[],"mappings":"AAoCA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AASnE,wBAAgB,cAAc,CAAC,EAC7B,IAAI,EACJ,QAAQ,GACT,EAAE;IACD,IAAI,EAAE,kBAAkB,CAAC;IACzB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB,2CAicA"}
1
+ {"version":3,"file":"repository-node.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/repository-node/repository-node.tsx"],"names":[],"mappings":"AAoCA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AASnE,wBAAgB,cAAc,CAAC,EAC7B,IAAI,EACJ,QAAQ,GACT,EAAE;IACD,IAAI,EAAE,kBAAkB,CAAC;IACzB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB,2CAgcA"}
@@ -13,15 +13,14 @@ import { useDeployAction } from '../../../hooks/use-deploy-action.js';
13
13
  import { useFeatureFlags } from '../../../hooks/feature-flags-context.js';
14
14
  import { useRepositoryActions } from './use-repository-actions.js';
15
15
  import { ChatDotIndicator } from '../../features/chat/ChatDotIndicator.js';
16
- import { useTurnStatuses } from '../../../hooks/use-turn-statuses.js';
16
+ import { useTurnStatus } from '../../../hooks/turn-statuses-provider.js';
17
17
  import { FeatureSessionsDropdown, } from '../../common/feature-node/feature-sessions-dropdown.js';
18
18
  export function RepositoryNode({ data, selected, }) {
19
19
  const router = useRouter();
20
20
  const featureFlags = useFeatureFlags();
21
21
  const [confirmOpen, setConfirmOpen] = useState(false);
22
22
  const repoScopeId = data.id ? `repo-${data.id}` : `repo-${data.name}`;
23
- const turnStatuses = useTurnStatuses([repoScopeId]);
24
- const chatTurnStatus = turnStatuses[repoScopeId] ?? 'idle';
23
+ const chatTurnStatus = useTurnStatus(repoScopeId);
25
24
  const actions = useRepositoryActions(data.repositoryPath ? { repositoryId: data.id, repositoryPath: data.repositoryPath } : null);
26
25
  const deployAction = useDeployAction(data.repositoryPath
27
26
  ? {
@@ -1 +1 @@
1
- {"version":3,"file":"ChatSheet.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/features/chat/ChatSheet.tsx"],"names":[],"mappings":"AAmDA,wBAAgB,eAAe,4CAyX9B"}
1
+ {"version":3,"file":"ChatSheet.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/features/chat/ChatSheet.tsx"],"names":[],"mappings":"AAwDA,wBAAgB,eAAe,4CA+X9B"}