@shepai/cli 1.129.1 → 1.129.2-pr396.29a046b

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 (243) hide show
  1. package/apis/json-schema/RelatedLink.yaml +14 -0
  2. package/apis/json-schema/SpecArtifactBase.yaml +1 -1
  3. package/dist/packages/core/src/application/ports/output/services/git-pr-service.interface.d.ts +73 -5
  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/git-pr-service.interface.js +6 -4
  6. package/dist/packages/core/src/application/use-cases/features/rebase-feature-on-main.use-case.d.ts +28 -0
  7. package/dist/packages/core/src/application/use-cases/features/rebase-feature-on-main.use-case.d.ts.map +1 -0
  8. package/dist/packages/core/src/application/use-cases/features/rebase-feature-on-main.use-case.js +81 -0
  9. package/dist/packages/core/src/application/use-cases/repositories/sync-repository-main.use-case.d.ts +16 -0
  10. package/dist/packages/core/src/application/use-cases/repositories/sync-repository-main.use-case.d.ts.map +1 -0
  11. package/dist/packages/core/src/application/use-cases/repositories/sync-repository-main.use-case.js +43 -0
  12. package/dist/packages/core/src/domain/generated/output.d.ts +14 -1
  13. package/dist/packages/core/src/domain/generated/output.d.ts.map +1 -1
  14. package/dist/packages/core/src/infrastructure/di/container.d.ts.map +1 -1
  15. package/dist/packages/core/src/infrastructure/di/container.js +15 -0
  16. package/dist/packages/core/src/infrastructure/services/agents/conflict-resolution/conflict-resolution.prompt.d.ts +35 -0
  17. package/dist/packages/core/src/infrastructure/services/agents/conflict-resolution/conflict-resolution.prompt.d.ts.map +1 -0
  18. package/dist/packages/core/src/infrastructure/services/agents/conflict-resolution/conflict-resolution.prompt.js +66 -0
  19. package/dist/packages/core/src/infrastructure/services/agents/conflict-resolution/conflict-resolution.service.d.ts +42 -0
  20. package/dist/packages/core/src/infrastructure/services/agents/conflict-resolution/conflict-resolution.service.d.ts.map +1 -0
  21. package/dist/packages/core/src/infrastructure/services/agents/conflict-resolution/conflict-resolution.service.js +169 -0
  22. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/prompts/research.prompt.d.ts.map +1 -1
  23. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/prompts/research.prompt.js +2 -1
  24. package/dist/packages/core/src/infrastructure/services/git/git-pr.service.d.ts +6 -0
  25. package/dist/packages/core/src/infrastructure/services/git/git-pr.service.d.ts.map +1 -1
  26. package/dist/packages/core/src/infrastructure/services/git/git-pr.service.js +134 -0
  27. package/dist/src/presentation/web/app/actions/rebase-feature.d.ts +5 -0
  28. package/dist/src/presentation/web/app/actions/rebase-feature.d.ts.map +1 -0
  29. package/dist/src/presentation/web/app/actions/rebase-feature.js +16 -0
  30. package/dist/src/presentation/web/app/actions/sync-repository.d.ts +5 -0
  31. package/dist/src/presentation/web/app/actions/sync-repository.d.ts.map +1 -0
  32. package/dist/src/presentation/web/app/actions/sync-repository.js +16 -0
  33. package/dist/src/presentation/web/components/common/control-center-drawer/feature-drawer-client.d.ts.map +1 -1
  34. package/dist/src/presentation/web/components/common/control-center-drawer/feature-drawer-client.js +2 -1
  35. package/dist/src/presentation/web/components/common/control-center-drawer/repository-drawer-client.d.ts.map +1 -1
  36. package/dist/src/presentation/web/components/common/control-center-drawer/repository-drawer-client.js +4 -4
  37. package/dist/src/presentation/web/components/common/feature-drawer/use-feature-actions.d.ts +4 -0
  38. package/dist/src/presentation/web/components/common/feature-drawer/use-feature-actions.d.ts.map +1 -1
  39. package/dist/src/presentation/web/components/common/feature-drawer/use-feature-actions.js +32 -1
  40. package/dist/src/presentation/web/components/common/feature-drawer-tabs/feature-drawer-tabs.d.ts +4 -1
  41. package/dist/src/presentation/web/components/common/feature-drawer-tabs/feature-drawer-tabs.d.ts.map +1 -1
  42. package/dist/src/presentation/web/components/common/feature-drawer-tabs/feature-drawer-tabs.js +2 -2
  43. package/dist/src/presentation/web/components/common/feature-drawer-tabs/overview-tab.d.ts +4 -1
  44. package/dist/src/presentation/web/components/common/feature-drawer-tabs/overview-tab.d.ts.map +1 -1
  45. package/dist/src/presentation/web/components/common/feature-drawer-tabs/overview-tab.js +8 -3
  46. package/dist/src/presentation/web/components/common/feature-drawer-tabs/overview-tab.stories.d.ts +6 -0
  47. package/dist/src/presentation/web/components/common/feature-drawer-tabs/overview-tab.stories.d.ts.map +1 -1
  48. package/dist/src/presentation/web/components/common/feature-drawer-tabs/overview-tab.stories.js +30 -0
  49. package/dist/src/presentation/web/components/common/open-action-menu/open-action-menu.stories.d.ts.map +1 -1
  50. package/dist/src/presentation/web/components/common/open-action-menu/open-action-menu.stories.js +3 -0
  51. package/dist/src/presentation/web/components/common/prd-questionnaire/prd-questionnaire.d.ts.map +1 -1
  52. package/dist/src/presentation/web/components/common/prd-questionnaire/prd-questionnaire.js +1 -1
  53. package/dist/src/presentation/web/components/common/prd-questionnaire/prd-questionnaire.stories.d.ts +6 -0
  54. package/dist/src/presentation/web/components/common/prd-questionnaire/prd-questionnaire.stories.d.ts.map +1 -1
  55. package/dist/src/presentation/web/components/common/prd-questionnaire/prd-questionnaire.stories.js +96 -1
  56. package/dist/src/presentation/web/components/common/product-decisions-summary/product-decisions-summary.d.ts.map +1 -1
  57. package/dist/src/presentation/web/components/common/product-decisions-summary/product-decisions-summary.js +1 -1
  58. package/dist/src/presentation/web/components/common/repository-node/repository-drawer.d.ts.map +1 -1
  59. package/dist/src/presentation/web/components/common/repository-node/repository-drawer.js +3 -3
  60. package/dist/src/presentation/web/components/common/repository-node/repository-node.js +1 -1
  61. package/dist/src/presentation/web/components/common/repository-node/use-repository-actions.d.ts +4 -0
  62. package/dist/src/presentation/web/components/common/repository-node/use-repository-actions.d.ts.map +1 -1
  63. package/dist/src/presentation/web/components/common/repository-node/use-repository-actions.js +11 -0
  64. package/dist/tsconfig.build.tsbuildinfo +1 -1
  65. package/package.json +1 -1
  66. package/web/.next/BUILD_ID +1 -1
  67. package/web/.next/build-manifest.json +2 -2
  68. package/web/.next/fallback-build-manifest.json +2 -2
  69. package/web/.next/prerender-manifest.json +3 -3
  70. package/web/.next/required-server-files.js +3 -3
  71. package/web/.next/required-server-files.json +3 -3
  72. package/web/.next/server/app/(dashboard)/@drawer/adopt/page/server-reference-manifest.json +63 -48
  73. package/web/.next/server/app/(dashboard)/@drawer/adopt/page.js +1 -1
  74. package/web/.next/server/app/(dashboard)/@drawer/adopt/page.js.nft.json +1 -1
  75. package/web/.next/server/app/(dashboard)/@drawer/adopt/page_client-reference-manifest.js +1 -1
  76. package/web/.next/server/app/(dashboard)/@drawer/create/page/server-reference-manifest.json +63 -48
  77. package/web/.next/server/app/(dashboard)/@drawer/create/page.js +1 -1
  78. package/web/.next/server/app/(dashboard)/@drawer/create/page.js.nft.json +1 -1
  79. package/web/.next/server/app/(dashboard)/@drawer/create/page_client-reference-manifest.js +1 -1
  80. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page/server-reference-manifest.json +90 -60
  81. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page.js +1 -1
  82. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page.js.nft.json +1 -1
  83. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page_client-reference-manifest.js +1 -1
  84. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page/server-reference-manifest.json +90 -60
  85. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js +1 -1
  86. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js.nft.json +1 -1
  87. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page_client-reference-manifest.js +1 -1
  88. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page/server-reference-manifest.json +59 -44
  89. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js +1 -1
  90. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js.nft.json +1 -1
  91. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  92. package/web/.next/server/app/(dashboard)/create/page/server-reference-manifest.json +63 -48
  93. package/web/.next/server/app/(dashboard)/create/page.js +1 -1
  94. package/web/.next/server/app/(dashboard)/create/page.js.nft.json +1 -1
  95. package/web/.next/server/app/(dashboard)/create/page_client-reference-manifest.js +1 -1
  96. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page/server-reference-manifest.json +90 -60
  97. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page.js +1 -1
  98. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page.js.nft.json +1 -1
  99. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page_client-reference-manifest.js +1 -1
  100. package/web/.next/server/app/(dashboard)/feature/[featureId]/page/server-reference-manifest.json +90 -60
  101. package/web/.next/server/app/(dashboard)/feature/[featureId]/page.js +1 -1
  102. package/web/.next/server/app/(dashboard)/feature/[featureId]/page.js.nft.json +1 -1
  103. package/web/.next/server/app/(dashboard)/feature/[featureId]/page_client-reference-manifest.js +1 -1
  104. package/web/.next/server/app/(dashboard)/page/server-reference-manifest.json +59 -44
  105. package/web/.next/server/app/(dashboard)/page.js +1 -1
  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]/page/server-reference-manifest.json +59 -44
  109. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js +1 -1
  110. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js.nft.json +1 -1
  111. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  112. package/web/.next/server/app/_global-error.html +2 -2
  113. package/web/.next/server/app/_global-error.rsc +1 -1
  114. package/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  115. package/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  116. package/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  117. package/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  118. package/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  119. package/web/.next/server/app/_not-found/page/server-reference-manifest.json +3 -3
  120. package/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  121. package/web/.next/server/app/api/attachments/preview/route.js.nft.json +1 -1
  122. package/web/.next/server/app/api/evidence/route.js.nft.json +1 -1
  123. package/web/.next/server/app/api/graph-data/route.js.nft.json +1 -1
  124. package/web/.next/server/app/settings/page/server-reference-manifest.json +8 -8
  125. package/web/.next/server/app/settings/page.js.nft.json +1 -1
  126. package/web/.next/server/app/settings/page_client-reference-manifest.js +1 -1
  127. package/web/.next/server/app/skills/page/server-reference-manifest.json +8 -8
  128. package/web/.next/server/app/skills/page.js.nft.json +1 -1
  129. package/web/.next/server/app/skills/page_client-reference-manifest.js +1 -1
  130. package/web/.next/server/app/tools/page/server-reference-manifest.json +8 -8
  131. package/web/.next/server/app/tools/page.js.nft.json +1 -1
  132. package/web/.next/server/app/tools/page_client-reference-manifest.js +1 -1
  133. package/web/.next/server/app/version/page/server-reference-manifest.json +3 -3
  134. package/web/.next/server/app/version/page_client-reference-manifest.js +1 -1
  135. package/web/.next/server/chunks/[root-of-the-server]__a402b567._.js +1 -1
  136. package/web/.next/server/chunks/[root-of-the-server]__cd67a84c._.js.map +1 -1
  137. package/web/.next/server/chunks/[root-of-the-server]__dcd4f847._.js.map +1 -1
  138. package/web/.next/server/chunks/ssr/744ca_web__next-internal_server_app_(dashboard)_@drawer_adopt_page_actions_99e84975.js +3 -0
  139. package/web/.next/server/chunks/ssr/744ca_web__next-internal_server_app_(dashboard)_@drawer_adopt_page_actions_99e84975.js.map +1 -0
  140. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js +1 -1
  141. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js.map +1 -1
  142. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_accb29f0.js +3 -0
  143. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_accb29f0.js.map +1 -0
  144. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_6a57c3a1.js +3 -0
  145. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_6a57c3a1.js.map +1 -0
  146. package/web/.next/server/chunks/ssr/[root-of-the-server]__0005fa7f._.js +3 -0
  147. package/web/.next/server/chunks/ssr/{[root-of-the-server]__c3ab8422._.js.map → [root-of-the-server]__0005fa7f._.js.map} +1 -1
  148. package/web/.next/server/chunks/ssr/[root-of-the-server]__0e842eba._.js +1 -1
  149. package/web/.next/server/chunks/ssr/[root-of-the-server]__0e842eba._.js.map +1 -1
  150. package/web/.next/server/chunks/ssr/[root-of-the-server]__2e4a6b80._.js +3 -0
  151. package/web/.next/server/chunks/ssr/[root-of-the-server]__2e4a6b80._.js.map +1 -0
  152. package/web/.next/server/chunks/ssr/[root-of-the-server]__2f886f77._.js +2 -2
  153. package/web/.next/server/chunks/ssr/[root-of-the-server]__30f59daf._.js +3 -0
  154. package/web/.next/server/chunks/ssr/{[root-of-the-server]__755cfe02._.js.map → [root-of-the-server]__30f59daf._.js.map} +1 -1
  155. package/web/.next/server/chunks/ssr/[root-of-the-server]__357d99f9._.js +1 -1
  156. package/web/.next/server/chunks/ssr/[root-of-the-server]__43f51aa6._.js +1 -1
  157. package/web/.next/server/chunks/ssr/[root-of-the-server]__43f51aa6._.js.map +1 -1
  158. package/web/.next/server/chunks/ssr/[root-of-the-server]__60684242._.js +2 -2
  159. package/web/.next/server/chunks/ssr/[root-of-the-server]__60684242._.js.map +1 -1
  160. package/web/.next/server/chunks/ssr/[root-of-the-server]__6bb00d90._.js +2 -2
  161. package/web/.next/server/chunks/ssr/[root-of-the-server]__6bb00d90._.js.map +1 -1
  162. package/web/.next/server/chunks/ssr/[root-of-the-server]__815546bd._.js +1 -1
  163. package/web/.next/server/chunks/ssr/[root-of-the-server]__815546bd._.js.map +1 -1
  164. package/web/.next/server/chunks/ssr/[root-of-the-server]__a21eef5a._.js.map +1 -1
  165. package/web/.next/server/chunks/ssr/[root-of-the-server]__c001183f._.js +3 -0
  166. package/web/.next/server/chunks/ssr/[root-of-the-server]__c001183f._.js.map +1 -0
  167. package/web/.next/server/chunks/ssr/[root-of-the-server]__f4a463ee._.js +2 -2
  168. package/web/.next/server/chunks/ssr/[root-of-the-server]__f4a463ee._.js.map +1 -1
  169. package/web/.next/server/chunks/ssr/_02ec1aea._.js +1 -1
  170. package/web/.next/server/chunks/ssr/_02ec1aea._.js.map +1 -1
  171. package/web/.next/server/chunks/ssr/_4d0f7251._.js +3 -0
  172. package/web/.next/server/chunks/ssr/_4d0f7251._.js.map +1 -0
  173. package/web/.next/server/chunks/ssr/{_92acff95._.js → _54973759._.js} +2 -2
  174. package/web/.next/server/chunks/ssr/{_92acff95._.js.map → _54973759._.js.map} +1 -1
  175. package/web/.next/server/chunks/ssr/_7dca1882._.js +1 -1
  176. package/web/.next/server/chunks/ssr/_7dca1882._.js.map +1 -1
  177. package/web/.next/server/chunks/ssr/_a9f57758._.js +1 -1
  178. package/web/.next/server/chunks/ssr/_d4b20e29._.js.map +1 -1
  179. package/web/.next/server/chunks/ssr/_d8575088._.js +1 -1
  180. package/web/.next/server/chunks/ssr/_d8575088._.js.map +1 -1
  181. package/web/.next/server/chunks/ssr/_f39a1adb._.js +1 -1
  182. package/web/.next/server/chunks/ssr/_f39a1adb._.js.map +1 -1
  183. package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_settings_settings-page-client_tsx_6ed9d5f8._.js +1 -1
  184. package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_settings_settings-page-client_tsx_6ed9d5f8._.js.map +1 -1
  185. package/web/.next/server/chunks/ssr/f3a1f_components_common_control-center-drawer_repository-drawer-client_tsx_39a00c03._.js +1 -1
  186. package/web/.next/server/chunks/ssr/f3a1f_components_common_control-center-drawer_repository-drawer-client_tsx_39a00c03._.js.map +1 -1
  187. package/web/.next/server/chunks/ssr/src_presentation_web_16204651._.js +5 -0
  188. package/web/.next/server/chunks/ssr/{src_presentation_web_8e7fe0d1._.js.map → src_presentation_web_16204651._.js.map} +1 -1
  189. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_02d24048.js +3 -0
  190. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_02d24048.js.map +1 -0
  191. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_skills_page_actions_1b176e3c.js +1 -1
  192. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_skills_page_actions_1b176e3c.js.map +1 -1
  193. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_tools_page_actions_bd9f0dda.js +1 -1
  194. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_tools_page_actions_bd9f0dda.js.map +1 -1
  195. package/web/.next/server/chunks/ssr/src_presentation_web_a1e81e83._.js +5 -0
  196. package/web/.next/server/chunks/ssr/{src_presentation_web_b9023017._.js.map → src_presentation_web_a1e81e83._.js.map} +1 -1
  197. package/web/.next/server/chunks/ssr/src_presentation_web_components_e599bb8c._.js +1 -1
  198. package/web/.next/server/chunks/ssr/src_presentation_web_components_e599bb8c._.js.map +1 -1
  199. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js +1 -1
  200. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js.map +1 -1
  201. package/web/.next/server/chunks/ssr/{src_presentation_web_efa91543._.js → src_presentation_web_ff4f5c85._.js} +2 -2
  202. package/web/.next/server/chunks/ssr/{src_presentation_web_efa91543._.js.map → src_presentation_web_ff4f5c85._.js.map} +1 -1
  203. package/web/.next/server/pages/500.html +2 -2
  204. package/web/.next/server/server-reference-manifest.js +1 -1
  205. package/web/.next/server/server-reference-manifest.json +410 -296
  206. package/web/.next/static/chunks/{4ee40070e69205bc.js → 175ca7ea02d97f30.js} +1 -1
  207. package/web/.next/static/chunks/{792cdceb624c561d.js → 419c19462c0cf858.js} +1 -1
  208. package/web/.next/static/chunks/{475b22f4bf14af2d.js → 41da6886a7e12ed0.js} +1 -1
  209. package/web/.next/static/chunks/{0a83031808867bca.js → 45aed33c09f2fa49.js} +1 -1
  210. package/web/.next/static/chunks/4b51f8f4e49665b8.js +1 -0
  211. package/web/.next/static/chunks/{e4ff24651224d4d2.js → 570ce910d5621970.js} +1 -1
  212. package/web/.next/static/chunks/6824f70fd5a25f49.js +2 -0
  213. package/web/.next/static/chunks/{cc974a8f14de58d0.js → 6865e7df610c998d.js} +1 -1
  214. package/web/.next/static/chunks/{5da0c2f16502fddd.js → 69a7f3e262affa5b.js} +1 -1
  215. package/web/.next/static/chunks/{2672ec79b6eb1b94.js → 727c77542ce6b900.js} +1 -1
  216. package/web/.next/static/chunks/{fd2ccf8f2022f2fb.js → 9b8cfca143672135.js} +1 -1
  217. package/web/.next/static/chunks/da484d44874006a2.css +1 -0
  218. package/web/.next/static/chunks/{5e11fe79741cd049.js → ebc8e49ca8e30930.js} +1 -1
  219. package/web/.next/static/chunks/{f84bbfe2662f35ed.js → f0cc9c9ee8a03ec6.js} +1 -1
  220. package/web/.next/server/chunks/ssr/744ca_web__next-internal_server_app_(dashboard)_@drawer_adopt_page_actions_4e741df2.js +0 -3
  221. package/web/.next/server/chunks/ssr/744ca_web__next-internal_server_app_(dashboard)_@drawer_adopt_page_actions_4e741df2.js.map +0 -1
  222. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_026fdffa.js +0 -3
  223. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_026fdffa.js.map +0 -1
  224. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_8b91e197.js +0 -3
  225. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_8b91e197.js.map +0 -1
  226. package/web/.next/server/chunks/ssr/[root-of-the-server]__755cfe02._.js +0 -3
  227. package/web/.next/server/chunks/ssr/[root-of-the-server]__a628fb91._.js +0 -3
  228. package/web/.next/server/chunks/ssr/[root-of-the-server]__a628fb91._.js.map +0 -1
  229. package/web/.next/server/chunks/ssr/[root-of-the-server]__bfba58e6._.js +0 -3
  230. package/web/.next/server/chunks/ssr/[root-of-the-server]__bfba58e6._.js.map +0 -1
  231. package/web/.next/server/chunks/ssr/[root-of-the-server]__c3ab8422._.js +0 -3
  232. package/web/.next/server/chunks/ssr/_a11d42e8._.js +0 -3
  233. package/web/.next/server/chunks/ssr/_a11d42e8._.js.map +0 -1
  234. package/web/.next/server/chunks/ssr/src_presentation_web_8e7fe0d1._.js +0 -5
  235. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_ca051134.js +0 -3
  236. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_ca051134.js.map +0 -1
  237. package/web/.next/server/chunks/ssr/src_presentation_web_b9023017._.js +0 -5
  238. package/web/.next/static/chunks/eb9841ec4d80af01.js +0 -1
  239. package/web/.next/static/chunks/f569a6dc0496430f.css +0 -1
  240. package/web/.next/static/chunks/fdff2d35956e7448.js +0 -2
  241. /package/web/.next/static/{yH8b83VvOS2P5F2XwxoFX → bAZScD4F_X6c2j5gmVUlR}/_buildManifest.js +0 -0
  242. /package/web/.next/static/{yH8b83VvOS2P5F2XwxoFX → bAZScD4F_X6c2j5gmVUlR}/_clientMiddlewareManifest.json +0 -0
  243. /package/web/.next/static/{yH8b83VvOS2P5F2XwxoFX → bAZScD4F_X6c2j5gmVUlR}/_ssgManifest.js +0 -0
@@ -29,9 +29,12 @@ export interface FeatureDrawerTabsProps {
29
29
  onMergeApprove?: () => void;
30
30
  onMergeReject?: (feedback: string, attachments: RejectAttachment[]) => void;
31
31
  isMergeLoading?: boolean;
32
+ onRebaseOnMain?: () => void;
33
+ rebaseLoading?: boolean;
34
+ rebaseError?: string | null;
32
35
  isRejecting?: boolean;
33
36
  chatInput?: string;
34
37
  onChatInputChange?: (value: string) => void;
35
38
  }
36
- export declare function FeatureDrawerTabs({ featureNode, featureId, initialTab, urlTab, prdData, prdSelections, onPrdSelect, onPrdApprove, onPrdReject, isPrdLoading, techData, onTechApprove, onTechReject, isTechLoading, productData, mergeData, onMergeApprove, onMergeReject, isMergeLoading, isRejecting, chatInput, onChatInputChange, sseEvents, }: FeatureDrawerTabsProps): import("react/jsx-runtime").JSX.Element;
39
+ export declare function FeatureDrawerTabs({ featureNode, featureId, initialTab, urlTab, prdData, prdSelections, onPrdSelect, onPrdApprove, onPrdReject, isPrdLoading, techData, onTechApprove, onTechReject, isTechLoading, productData, mergeData, onMergeApprove, onMergeReject, isMergeLoading, onRebaseOnMain, rebaseLoading, rebaseError, isRejecting, chatInput, onChatInputChange, sseEvents, }: FeatureDrawerTabsProps): import("react/jsx-runtime").JSX.Element;
37
40
  //# sourceMappingURL=feature-drawer-tabs.d.ts.map
@@ -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;AAkD3F,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"}
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;AAkD3F,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,cAAc,CAAC,EAAE,MAAM,IAAI,CAAC;IAC5B,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAG5B,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,cAAc,EACd,aAAa,EACb,WAAW,EACX,WAAW,EACX,SAAS,EACT,iBAAiB,EACjB,SAAS,GACV,EAAE,sBAAsB,2CAmVxB"}
@@ -67,7 +67,7 @@ const TAB_FETCHERS = {
67
67
  activity: fetchActivity,
68
68
  plan: fetchPlan,
69
69
  };
70
- export function FeatureDrawerTabs({ featureNode, featureId, initialTab, urlTab, prdData, prdSelections, onPrdSelect, onPrdApprove, onPrdReject, isPrdLoading, techData, onTechApprove, onTechReject, isTechLoading, productData, mergeData, onMergeApprove, onMergeReject, isMergeLoading, isRejecting, chatInput, onChatInputChange, sseEvents, }) {
70
+ export function FeatureDrawerTabs({ featureNode, featureId, initialTab, urlTab, prdData, prdSelections, onPrdSelect, onPrdApprove, onPrdReject, isPrdLoading, techData, onTechApprove, onTechReject, isTechLoading, productData, mergeData, onMergeApprove, onMergeReject, isMergeLoading, onRebaseOnMain, rebaseLoading, rebaseError, isRejecting, chatInput, onChatInputChange, sseEvents, }) {
71
71
  const pathname = usePathname();
72
72
  const visibleTabs = useMemo(() => computeVisibleTabs(featureNode), [featureNode]);
73
73
  const visibleTabDefs = useMemo(() => ALL_TABS.filter((t) => visibleTabs.includes(t.key)).map((t) => t.key === 'merge-review' && featureNode.lifecycle === 'maintain'
@@ -244,7 +244,7 @@ export function FeatureDrawerTabs({ featureNode, featureId, initialTab, urlTab,
244
244
  fetchTab(tab);
245
245
  }
246
246
  }, [fetchTab]);
247
- return (_jsx("div", { className: "flex min-h-0 flex-1 flex-col", children: _jsxs(Tabs, { value: activeTab, onValueChange: handleTabChange, className: "flex min-h-0 flex-1 flex-col", children: [_jsx("div", { className: "shrink-0 overflow-x-auto px-4 pt-4", children: _jsx(TabsList, { className: "flex w-full", children: visibleTabDefs.map((tab) => (_jsx(TabsTrigger, { value: tab.key, className: "flex-1", children: tab.label }, tab.key))) }) }), _jsx(TabsContent, { value: "overview", className: "mt-0 flex-1 overflow-y-auto", children: _jsx(OverviewTab, { data: featureNode }) }), _jsx(TabsContent, { value: "activity", className: "mt-0 flex-1 overflow-y-auto", children: _jsx(ActivityTab, { timings: tabs.activity.data?.timings ?? null, loading: tabs.activity.loading, error: tabs.activity.error, rejectionFeedback: tabs.activity.data?.rejectionFeedback }) }), _jsx(TabsContent, { value: "log", className: "mt-0 flex-1 overflow-hidden", children: _jsx(LogTab, { content: featureLogs.content, isConnected: featureLogs.isConnected, error: featureLogs.error }) }), _jsx(TabsContent, { value: "plan", className: "mt-0 flex-1 overflow-y-auto", children: _jsx(PlanTab, { plan: tabs.plan.data, loading: tabs.plan.loading, error: tabs.plan.error }) }), visibleTabs.includes('prd-review') ? (_jsx(TabsContent, { value: "prd-review", className: "mt-0 flex min-h-0 flex-1 flex-col", children: prdData ? (_jsx(PrdQuestionnaire, { data: prdData, selections: prdSelections ?? {}, onSelect: onPrdSelect ?? (() => undefined), onApprove: onPrdApprove ?? (() => undefined), onReject: onPrdReject, isProcessing: isPrdLoading, isRejecting: isRejecting, chatInput: chatInput, onChatInputChange: onChatInputChange })) : (_jsx("div", { className: "flex items-center justify-center p-8", children: _jsx(Loader2, { className: "text-muted-foreground h-6 w-6 animate-spin" }) })) })) : null, visibleTabs.includes('tech-decisions') ? (_jsx(TabsContent, { value: "tech-decisions", className: "mt-0 flex min-h-0 flex-1 flex-col", children: techData ? (_jsxs("div", { className: "flex min-h-0 flex-1 flex-col", children: [_jsx("div", { className: "flex-1 overflow-y-auto", children: _jsx(TechDecisionsContent, { data: techData }) }), _jsx(DrawerActionBarForTech, { onApprove: onTechApprove ?? (() => undefined), onReject: onTechReject, isProcessing: isTechLoading, isRejecting: isRejecting, chatInput: chatInput, onChatInputChange: onChatInputChange })] })) : (_jsx("div", { className: "flex items-center justify-center p-8", children: _jsx(Loader2, { className: "text-muted-foreground h-6 w-6 animate-spin" }) })) })) : null, visibleTabs.includes('product-decisions') ? (_jsx(TabsContent, { value: "product-decisions", className: "mt-0 flex-1 overflow-y-auto", children: productData === null ? (_jsx("div", { className: "flex items-center justify-center p-8", children: _jsx(Loader2, { className: "text-muted-foreground h-6 w-6 animate-spin" }) })) : productData ? (_jsx(ProductDecisionsSummary, { data: productData })) : (_jsx("p", { className: "text-muted-foreground p-4 text-center text-sm", children: "No product decisions available." })) })) : null, visibleTabs.includes('merge-review') ? (_jsx(TabsContent, { value: "merge-review", className: "mt-0 flex min-h-0 flex-1 flex-col", children: mergeData ? (_jsx(MergeReview, { data: mergeData, readOnly: featureNode.lifecycle === 'maintain', onApprove: onMergeApprove ?? (() => undefined), onReject: onMergeReject, isProcessing: isMergeLoading, isRejecting: isRejecting, chatInput: chatInput, onChatInputChange: onChatInputChange })) : (_jsx("div", { className: "flex items-center justify-center p-8", children: _jsx(Loader2, { className: "text-muted-foreground h-6 w-6 animate-spin" }) })) })) : null] }) }));
247
+ return (_jsx("div", { className: "flex min-h-0 flex-1 flex-col", children: _jsxs(Tabs, { value: activeTab, onValueChange: handleTabChange, className: "flex min-h-0 flex-1 flex-col", children: [_jsx("div", { className: "shrink-0 overflow-x-auto px-4 pt-4", children: _jsx(TabsList, { className: "flex w-full", children: visibleTabDefs.map((tab) => (_jsx(TabsTrigger, { value: tab.key, className: "flex-1", children: tab.label }, tab.key))) }) }), _jsx(TabsContent, { value: "overview", className: "mt-0 flex-1 overflow-y-auto", children: _jsx(OverviewTab, { data: featureNode, onRebaseOnMain: onRebaseOnMain, rebaseLoading: rebaseLoading, rebaseError: rebaseError }) }), _jsx(TabsContent, { value: "activity", className: "mt-0 flex-1 overflow-y-auto", children: _jsx(ActivityTab, { timings: tabs.activity.data?.timings ?? null, loading: tabs.activity.loading, error: tabs.activity.error, rejectionFeedback: tabs.activity.data?.rejectionFeedback }) }), _jsx(TabsContent, { value: "log", className: "mt-0 flex-1 overflow-hidden", children: _jsx(LogTab, { content: featureLogs.content, isConnected: featureLogs.isConnected, error: featureLogs.error }) }), _jsx(TabsContent, { value: "plan", className: "mt-0 flex-1 overflow-y-auto", children: _jsx(PlanTab, { plan: tabs.plan.data, loading: tabs.plan.loading, error: tabs.plan.error }) }), visibleTabs.includes('prd-review') ? (_jsx(TabsContent, { value: "prd-review", className: "mt-0 flex min-h-0 flex-1 flex-col", children: prdData ? (_jsx(PrdQuestionnaire, { data: prdData, selections: prdSelections ?? {}, onSelect: onPrdSelect ?? (() => undefined), onApprove: onPrdApprove ?? (() => undefined), onReject: onPrdReject, isProcessing: isPrdLoading, isRejecting: isRejecting, chatInput: chatInput, onChatInputChange: onChatInputChange })) : (_jsx("div", { className: "flex items-center justify-center p-8", children: _jsx(Loader2, { className: "text-muted-foreground h-6 w-6 animate-spin" }) })) })) : null, visibleTabs.includes('tech-decisions') ? (_jsx(TabsContent, { value: "tech-decisions", className: "mt-0 flex min-h-0 flex-1 flex-col", children: techData ? (_jsxs("div", { className: "flex min-h-0 flex-1 flex-col", children: [_jsx("div", { className: "flex-1 overflow-y-auto", children: _jsx(TechDecisionsContent, { data: techData }) }), _jsx(DrawerActionBarForTech, { onApprove: onTechApprove ?? (() => undefined), onReject: onTechReject, isProcessing: isTechLoading, isRejecting: isRejecting, chatInput: chatInput, onChatInputChange: onChatInputChange })] })) : (_jsx("div", { className: "flex items-center justify-center p-8", children: _jsx(Loader2, { className: "text-muted-foreground h-6 w-6 animate-spin" }) })) })) : null, visibleTabs.includes('product-decisions') ? (_jsx(TabsContent, { value: "product-decisions", className: "mt-0 flex-1 overflow-y-auto", children: productData === null ? (_jsx("div", { className: "flex items-center justify-center p-8", children: _jsx(Loader2, { className: "text-muted-foreground h-6 w-6 animate-spin" }) })) : productData ? (_jsx(ProductDecisionsSummary, { data: productData })) : (_jsx("p", { className: "text-muted-foreground p-4 text-center text-sm", children: "No product decisions available." })) })) : null, visibleTabs.includes('merge-review') ? (_jsx(TabsContent, { value: "merge-review", className: "mt-0 flex min-h-0 flex-1 flex-col", children: mergeData ? (_jsx(MergeReview, { data: mergeData, readOnly: featureNode.lifecycle === 'maintain', onApprove: onMergeApprove ?? (() => undefined), onReject: onMergeReject, isProcessing: isMergeLoading, isRejecting: isRejecting, chatInput: chatInput, onChatInputChange: onChatInputChange })) : (_jsx("div", { className: "flex items-center justify-center p-8", children: _jsx(Loader2, { className: "text-muted-foreground h-6 w-6 animate-spin" }) })) })) : null] }) }));
248
248
  }
249
249
  // ── Private helper ──────────────────────────────────────────────────────
250
250
  function DrawerActionBarForTech({ onApprove, onReject, isProcessing, isRejecting, chatInput, onChatInputChange, }) {
@@ -1,6 +1,9 @@
1
1
  import type { FeatureNodeData } from '../../common/feature-node/index.js';
2
2
  export interface OverviewTabProps {
3
3
  data: FeatureNodeData;
4
+ onRebaseOnMain?: () => void;
5
+ rebaseLoading?: boolean;
6
+ rebaseError?: string | null;
4
7
  }
5
- export declare function OverviewTab({ data }: OverviewTabProps): import("react/jsx-runtime").JSX.Element;
8
+ export declare function OverviewTab({ data, onRebaseOnMain, rebaseLoading, rebaseError, }: OverviewTabProps): import("react/jsx-runtime").JSX.Element;
6
9
  //# sourceMappingURL=overview-tab.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"overview-tab.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/feature-drawer-tabs/overview-tab.tsx"],"names":[],"mappings":"AAwBA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AAQxE,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,eAAe,CAAC;CACvB;AAED,wBAAgB,WAAW,CAAC,EAAE,IAAI,EAAE,EAAE,gBAAgB,2CA+DrD"}
1
+ {"version":3,"file":"overview-tab.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/feature-drawer-tabs/overview-tab.tsx"],"names":[],"mappings":"AA0BA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AAQxE,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,eAAe,CAAC;IACtB,cAAc,CAAC,EAAE,MAAM,IAAI,CAAC;IAC5B,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC7B;AAED,wBAAgB,WAAW,CAAC,EAC1B,IAAI,EACJ,cAAc,EACd,aAAa,EACb,WAAW,GACZ,EAAE,gBAAgB,2CAsElB"}
@@ -1,7 +1,7 @@
1
1
  'use client';
2
2
  import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
3
3
  import { useState, useEffect, useRef } from 'react';
4
- import { AlertTriangle, Check, ExternalLink, FileSearch, GitBranch, GitCommitHorizontal, RotateCcw, ShieldCheck, Square, X, Zap, } from 'lucide-react';
4
+ import { AlertTriangle, Check, ExternalLink, FileSearch, GitBranch, GitCommitHorizontal, GitMerge, RotateCcw, ShieldCheck, Square, X, Zap, } from 'lucide-react';
5
5
  import { InlineAttachments } from '../../common/inline-attachments/index.js';
6
6
  import { PrStatus } from '../../../../../../packages/core/src/domain/generated/output.js';
7
7
  import { cn } from '../../../lib/utils.js';
@@ -9,13 +9,14 @@ import { Badge } from '../../ui/badge.js';
9
9
  import { Separator } from '../../ui/separator.js';
10
10
  import { CiStatusBadge } from '../../common/ci-status-badge/index.js';
11
11
  import { CometSpinner } from '../../ui/comet-spinner.js';
12
+ import { ActionButton } from '../../common/action-button/index.js';
12
13
  import { featureNodeStateConfig, lifecycleDisplayLabels } from '../../common/feature-node/index.js';
13
14
  import { getAgentTypeIcon, agentTypeLabels, } from '../../common/feature-node/agent-type-icons.js';
14
15
  import { getModelMeta } from '../../../lib/model-metadata.js';
15
16
  import { formatDuration } from '../../../lib/format-duration.js';
16
- export function OverviewTab({ data }) {
17
+ export function OverviewTab({ data, onRebaseOnMain, rebaseLoading, rebaseError, }) {
17
18
  const isCompleted = data.lifecycle === 'maintain';
18
- return (_jsxs(_Fragment, { children: [_jsxs("div", { "data-testid": "feature-drawer-status", className: "flex flex-col gap-3 p-4", children: [_jsx("div", { className: "text-muted-foreground text-xs font-semibold tracking-wider", children: lifecycleDisplayLabels[data.lifecycle] }), _jsxs("div", { className: "flex items-center gap-2", children: [_jsx(FeatureStateBadge, { data: data }), data.state === 'error' && data.onRetry ? (_jsxs("button", { "data-testid": "feature-drawer-retry-button", onClick: () => data.onRetry(data.featureId), className: "flex shrink-0 cursor-pointer items-center gap-1.5 rounded-full bg-red-50 px-3 py-1.5 text-sm font-medium text-red-700 transition-colors hover:bg-red-100", children: [_jsx(RotateCcw, { className: "h-3.5 w-3.5" }), "Retry"] })) : null, (data.state === 'running' || data.state === 'action-required') && data.onStop ? (_jsxs("button", { "data-testid": "feature-drawer-stop-button", onClick: () => data.onStop(data.featureId), className: "flex shrink-0 cursor-pointer items-center gap-1.5 rounded-full bg-red-50 px-3 py-1.5 text-sm font-medium text-red-700 transition-colors hover:bg-red-100", children: [_jsx(Square, { className: "h-3.5 w-3.5" }), "Stop"] })) : null] }), !isCompleted && data.progress > 0 ? (_jsxs("div", { "data-testid": "feature-drawer-progress", className: "flex flex-col gap-1", children: [_jsxs("div", { className: "text-muted-foreground flex items-center justify-between text-xs", children: [_jsx("span", { children: "Progress" }), _jsxs("span", { children: [data.progress, "%"] })] }), _jsx("div", { className: "bg-muted h-2 w-full overflow-hidden rounded-full", children: _jsx("div", { className: cn('h-full rounded-full transition-all', featureNodeStateConfig[data.state].progressClass), style: { width: `${data.progress}%` } }) })] })) : null, isCompleted && data.pr ? _jsx(FeaturePrInfo, { pr: data.pr }) : null] }), _jsx(FeatureInfo, { data: data }), !isCompleted && data.pr ? (_jsxs(_Fragment, { children: [_jsx(Separator, {}), _jsx("div", { className: "p-4", children: _jsx(FeaturePrInfo, { pr: data.pr }) })] })) : null, _jsx(FeatureDetails, { data: data }), _jsx(FeatureSettings, { data: data })] }));
19
+ return (_jsxs(_Fragment, { children: [_jsxs("div", { "data-testid": "feature-drawer-status", className: "flex flex-col gap-3 p-4", children: [_jsx("div", { className: "text-muted-foreground text-xs font-semibold tracking-wider", children: lifecycleDisplayLabels[data.lifecycle] }), _jsxs("div", { className: "flex items-center gap-2", children: [_jsx(FeatureStateBadge, { data: data }), data.state === 'error' && data.onRetry ? (_jsxs("button", { "data-testid": "feature-drawer-retry-button", onClick: () => data.onRetry(data.featureId), className: "flex shrink-0 cursor-pointer items-center gap-1.5 rounded-full bg-red-50 px-3 py-1.5 text-sm font-medium text-red-700 transition-colors hover:bg-red-100", children: [_jsx(RotateCcw, { className: "h-3.5 w-3.5" }), "Retry"] })) : null, (data.state === 'running' || data.state === 'action-required') && data.onStop ? (_jsxs("button", { "data-testid": "feature-drawer-stop-button", onClick: () => data.onStop(data.featureId), className: "flex shrink-0 cursor-pointer items-center gap-1.5 rounded-full bg-red-50 px-3 py-1.5 text-sm font-medium text-red-700 transition-colors hover:bg-red-100", children: [_jsx(Square, { className: "h-3.5 w-3.5" }), "Stop"] })) : null] }), !isCompleted && data.progress > 0 ? (_jsxs("div", { "data-testid": "feature-drawer-progress", className: "flex flex-col gap-1", children: [_jsxs("div", { className: "text-muted-foreground flex items-center justify-between text-xs", children: [_jsx("span", { children: "Progress" }), _jsxs("span", { children: [data.progress, "%"] })] }), _jsx("div", { className: "bg-muted h-2 w-full overflow-hidden rounded-full", children: _jsx("div", { className: cn('h-full rounded-full transition-all', featureNodeStateConfig[data.state].progressClass), style: { width: `${data.progress}%` } }) })] })) : null, isCompleted && data.pr ? _jsx(FeaturePrInfo, { pr: data.pr }) : null] }), _jsx(FeatureInfo, { data: data }), !isCompleted && data.pr ? (_jsxs(_Fragment, { children: [_jsx(Separator, {}), _jsx("div", { className: "p-4", children: _jsx(FeaturePrInfo, { pr: data.pr }) })] })) : null, _jsx(FeatureDetails, { data: data }), onRebaseOnMain && data.branch ? (_jsx(FeatureGitOperations, { onRebaseOnMain: onRebaseOnMain, rebaseLoading: rebaseLoading, rebaseError: rebaseError })) : null, _jsx(FeatureSettings, { data: data })] }));
19
20
  }
20
21
  function FeatureStateBadge({ data }) {
21
22
  const config = featureNodeStateConfig[data.state];
@@ -109,6 +110,10 @@ function AgentDetailRow({ agentType }) {
109
110
  const label = agentTypeLabels[agentType] ?? agentType;
110
111
  return (_jsxs("div", { className: "flex flex-col gap-0.5", children: [_jsx("span", { className: "text-muted-foreground text-xs font-medium", children: "Agent" }), _jsxs("span", { className: "flex items-center gap-2 text-sm", children: [_jsx(Icon, { className: "h-4 w-4 shrink-0" }), label] })] }));
111
112
  }
113
+ // ── Git Operations section ───────────────────────────────────────────
114
+ function FeatureGitOperations({ onRebaseOnMain, rebaseLoading, rebaseError, }) {
115
+ return (_jsxs(_Fragment, { children: [_jsx(Separator, {}), _jsxs("div", { "data-testid": "feature-drawer-git-operations", 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: "Rebase on Main", onClick: onRebaseOnMain, loading: rebaseLoading ?? false, error: !!rebaseError, icon: GitMerge, variant: "outline", size: "sm" }), rebaseError ? _jsx("p", { className: "text-destructive text-xs", children: rebaseError }) : null] })] })] }));
116
+ }
112
117
  // ── Settings section ─────────────────────────────────────────────────
113
118
  function SettingBadge({ enabled, label }) {
114
119
  return (_jsxs("span", { className: cn('inline-flex items-center gap-1 rounded-full px-2 py-0.5 text-xs font-medium', enabled ? 'bg-emerald-50 text-emerald-700' : 'bg-muted text-muted-foreground'), children: [enabled ? _jsx(Check, { className: "h-3 w-3" }) : _jsx(X, { className: "h-3 w-3" }), label] }));
@@ -49,4 +49,10 @@ export declare const WithSettingsAllApproved: Story;
49
49
  export declare const FastModeWithSettings: Story;
50
50
  /** Feature with evidence enabled but commit to PR disabled. */
51
51
  export declare const EvidenceCollectOnly: Story;
52
+ /** Feature with rebase action available — shows "GIT OPERATIONS" section. */
53
+ export declare const WithRebaseAction: Story;
54
+ /** Rebase action in loading state. */
55
+ export declare const RebaseLoading: Story;
56
+ /** Rebase action showing error. */
57
+ export declare const RebaseError: Story;
52
58
  //# sourceMappingURL=overview-tab.stories.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"overview-tab.stories.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/feature-drawer-tabs/overview-tab.stories.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAGvD,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAG7C,QAAA,MAAM,IAAI,EAAE,IAAI,CAAC,OAAO,WAAW,CAclC,CAAC;AAEF,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,WAAW,CAAC,CAAC;AA0G1C,uEAAuE;AACvE,eAAO,MAAM,OAAO,EAAE,KAErB,CAAC;AAEF,8CAA8C;AAC9C,eAAO,MAAM,IAAI,EAAE,KAElB,CAAC;AAEF,yDAAyD;AACzD,eAAO,MAAM,UAAU,EAAE,KAExB,CAAC;AAEF,wDAAwD;AACxD,eAAO,MAAM,gBAAgB,EAAE,KAE9B,CAAC;AAEF,iDAAiD;AACjD,eAAO,MAAM,OAAO,EAAE,KAErB,CAAC;AAEF,gDAAgD;AAChD,eAAO,MAAM,KAAK,EAAE,KAEnB,CAAC;AAOF,6CAA6C;AAC7C,eAAO,MAAM,cAAc,EAAE,KAE5B,CAAC;AAEF,8CAA8C;AAC9C,eAAO,MAAM,eAAe,EAAE,KAE7B,CAAC;AAEF,sEAAsE;AACtE,eAAO,MAAM,OAAO,EAAE,KAErB,CAAC;AAwBF,mEAAmE;AACnE,eAAO,MAAM,QAAQ,EAAE,KAEtB,CAAC;AAMF,0BAA0B;AAC1B,eAAO,MAAM,iBAAiB,EAAE,KAE/B,CAAC;AAEF,sBAAsB;AACtB,eAAO,MAAM,aAAa,EAAE,KAE3B,CAAC;AAEF,oBAAoB;AACpB,eAAO,MAAM,WAAW,EAAE,KAEzB,CAAC;AAEF,sBAAsB;AACtB,eAAO,MAAM,aAAa,EAAE,KAE3B,CAAC;AAEF,gEAAgE;AAChE,eAAO,MAAM,oBAAoB,EAAE,KAclC,CAAC;AAqBF,4DAA4D;AAC5D,eAAO,MAAM,sBAAsB,EAAE,KAEpC,CAAC;AAEF,sDAAsD;AACtD,eAAO,MAAM,gBAAgB,EAAE,KAO9B,CAAC;AAEF,+FAA+F;AAC/F,eAAO,MAAM,eAAe,EAAE,KAgB7B,CAAC;AAMF,oFAAoF;AACpF,eAAO,MAAM,eAAe,EAAE,KAY7B,CAAC;AAEF,kDAAkD;AAClD,eAAO,MAAM,uBAAuB,EAAE,KAYrC,CAAC;AAEF,mDAAmD;AACnD,eAAO,MAAM,uBAAuB,EAAE,KAYrC,CAAC;AAEF,2CAA2C;AAC3C,eAAO,MAAM,oBAAoB,EAAE,KAYlC,CAAC;AAEF,+DAA+D;AAC/D,eAAO,MAAM,mBAAmB,EAAE,KAQjC,CAAC"}
1
+ {"version":3,"file":"overview-tab.stories.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/feature-drawer-tabs/overview-tab.stories.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAGvD,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAG7C,QAAA,MAAM,IAAI,EAAE,IAAI,CAAC,OAAO,WAAW,CAclC,CAAC;AAEF,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,WAAW,CAAC,CAAC;AA0G1C,uEAAuE;AACvE,eAAO,MAAM,OAAO,EAAE,KAErB,CAAC;AAEF,8CAA8C;AAC9C,eAAO,MAAM,IAAI,EAAE,KAElB,CAAC;AAEF,yDAAyD;AACzD,eAAO,MAAM,UAAU,EAAE,KAExB,CAAC;AAEF,wDAAwD;AACxD,eAAO,MAAM,gBAAgB,EAAE,KAE9B,CAAC;AAEF,iDAAiD;AACjD,eAAO,MAAM,OAAO,EAAE,KAErB,CAAC;AAEF,gDAAgD;AAChD,eAAO,MAAM,KAAK,EAAE,KAEnB,CAAC;AAOF,6CAA6C;AAC7C,eAAO,MAAM,cAAc,EAAE,KAE5B,CAAC;AAEF,8CAA8C;AAC9C,eAAO,MAAM,eAAe,EAAE,KAE7B,CAAC;AAEF,sEAAsE;AACtE,eAAO,MAAM,OAAO,EAAE,KAErB,CAAC;AAwBF,mEAAmE;AACnE,eAAO,MAAM,QAAQ,EAAE,KAEtB,CAAC;AAMF,0BAA0B;AAC1B,eAAO,MAAM,iBAAiB,EAAE,KAE/B,CAAC;AAEF,sBAAsB;AACtB,eAAO,MAAM,aAAa,EAAE,KAE3B,CAAC;AAEF,oBAAoB;AACpB,eAAO,MAAM,WAAW,EAAE,KAEzB,CAAC;AAEF,sBAAsB;AACtB,eAAO,MAAM,aAAa,EAAE,KAE3B,CAAC;AAEF,gEAAgE;AAChE,eAAO,MAAM,oBAAoB,EAAE,KAclC,CAAC;AAqBF,4DAA4D;AAC5D,eAAO,MAAM,sBAAsB,EAAE,KAEpC,CAAC;AAEF,sDAAsD;AACtD,eAAO,MAAM,gBAAgB,EAAE,KAO9B,CAAC;AAEF,+FAA+F;AAC/F,eAAO,MAAM,eAAe,EAAE,KAgB7B,CAAC;AAMF,oFAAoF;AACpF,eAAO,MAAM,eAAe,EAAE,KAY7B,CAAC;AAEF,kDAAkD;AAClD,eAAO,MAAM,uBAAuB,EAAE,KAYrC,CAAC;AAEF,mDAAmD;AACnD,eAAO,MAAM,uBAAuB,EAAE,KAYrC,CAAC;AAEF,2CAA2C;AAC3C,eAAO,MAAM,oBAAoB,EAAE,KAYlC,CAAC;AAEF,+DAA+D;AAC/D,eAAO,MAAM,mBAAmB,EAAE,KAQjC,CAAC;AAMF,6EAA6E;AAC7E,eAAO,MAAM,gBAAgB,EAAE,KAO9B,CAAC;AAEF,sCAAsC;AACtC,eAAO,MAAM,aAAa,EAAE,KAO3B,CAAC;AAEF,mCAAmC;AACnC,eAAO,MAAM,WAAW,EAAE,KAOzB,CAAC"}
@@ -325,3 +325,33 @@ export const EvidenceCollectOnly = {
325
325
  },
326
326
  },
327
327
  };
328
+ /* ---------------------------------------------------------------------------
329
+ * Git operations stories
330
+ * ------------------------------------------------------------------------- */
331
+ /** Feature with rebase action available — shows "GIT OPERATIONS" section. */
332
+ export const WithRebaseAction = {
333
+ args: {
334
+ data: noPrData,
335
+ onRebaseOnMain: fn(),
336
+ rebaseLoading: false,
337
+ rebaseError: null,
338
+ },
339
+ };
340
+ /** Rebase action in loading state. */
341
+ export const RebaseLoading = {
342
+ args: {
343
+ data: noPrData,
344
+ onRebaseOnMain: fn(),
345
+ rebaseLoading: true,
346
+ rebaseError: null,
347
+ },
348
+ };
349
+ /** Rebase action showing error. */
350
+ export const RebaseError = {
351
+ args: {
352
+ data: noPrData,
353
+ onRebaseOnMain: fn(),
354
+ rebaseLoading: false,
355
+ rebaseError: 'Rebase failed: unresolvable conflicts in src/index.ts',
356
+ },
357
+ };
@@ -1 +1 @@
1
- {"version":3,"file":"open-action-menu.stories.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/open-action-menu/open-action-menu.stories.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAEvD,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAepD,QAAA,MAAM,IAAI,EAAE,IAAI,CAAC,OAAO,cAAc,CAOrC,CAAC;AAEF,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,cAAc,CAAC,CAAC;AAE7C,4DAA4D;AAC5D,eAAO,MAAM,OAAO,EAAE,KAMrB,CAAC;AAEF,wCAAwC;AACxC,eAAO,MAAM,YAAY,EAAE,KAM1B,CAAC;AAEF,wCAAwC;AACxC,eAAO,MAAM,OAAO,EAAE,KAMrB,CAAC;AAEF,4CAA4C;AAC5C,eAAO,MAAM,SAAS,EAAE,KAMvB,CAAC"}
1
+ {"version":3,"file":"open-action-menu.stories.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/open-action-menu/open-action-menu.stories.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAEvD,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAkBpD,QAAA,MAAM,IAAI,EAAE,IAAI,CAAC,OAAO,cAAc,CAOrC,CAAC;AAEF,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,cAAc,CAAC,CAAC;AAE7C,4DAA4D;AAC5D,eAAO,MAAM,OAAO,EAAE,KAMrB,CAAC;AAEF,wCAAwC;AACxC,eAAO,MAAM,YAAY,EAAE,KAM1B,CAAC;AAEF,wCAAwC;AACxC,eAAO,MAAM,OAAO,EAAE,KAMrB,CAAC;AAEF,4CAA4C;AAC5C,eAAO,MAAM,SAAS,EAAE,KAMvB,CAAC"}
@@ -4,12 +4,15 @@ const defaultActions = {
4
4
  openInIde: fn().mockName('openInIde'),
5
5
  openInShell: fn().mockName('openInShell'),
6
6
  openSpecsFolder: fn().mockName('openSpecsFolder'),
7
+ rebaseOnMain: fn().mockName('rebaseOnMain'),
7
8
  ideLoading: false,
8
9
  shellLoading: false,
9
10
  specsLoading: false,
11
+ rebaseLoading: false,
10
12
  ideError: null,
11
13
  shellError: null,
12
14
  specsError: null,
15
+ rebaseError: null,
13
16
  };
14
17
  const meta = {
15
18
  title: 'Composed/OpenActionMenu',
@@ -1 +1 @@
1
- {"version":3,"file":"prd-questionnaire.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/prd-questionnaire/prd-questionnaire.tsx"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AAExE,wBAAgB,gBAAgB,CAAC,EAC/B,IAAI,EACJ,UAAU,EACV,QAAQ,EACR,SAAS,EACT,QAAQ,EACR,YAAoB,EACpB,WAAmB,EACnB,UAAkB,EAClB,SAAS,EACT,iBAAiB,GAClB,EAAE,qBAAqB,kDAkLvB"}
1
+ {"version":3,"file":"prd-questionnaire.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/prd-questionnaire/prd-questionnaire.tsx"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AAExE,wBAAgB,gBAAgB,CAAC,EAC/B,IAAI,EACJ,UAAU,EACV,QAAQ,EACR,SAAS,EACT,QAAQ,EACR,YAAoB,EACpB,WAAmB,EACnB,UAAkB,EAClB,SAAS,EACT,iBAAiB,GAClB,EAAE,qBAAqB,kDAuLvB"}
@@ -33,7 +33,7 @@ export function PrdQuestionnaire({ data, selections, onSelect, onApprove, onReje
33
33
  } }, q.id))) })] }), _jsx("div", { className: "space-y-2", children: currentQuestion.options.map((opt, optIdx) => {
34
34
  const selected = selections[currentQuestion.id] === opt.id;
35
35
  const letter = String.fromCharCode(65 + optIdx);
36
- return (_jsx("button", { type: "button", className: cn('border-border w-full rounded-md border px-3 py-3 text-left text-xs transition-all', 'hover:border-primary/70 hover:bg-primary/5 group', selected && 'border-primary bg-primary/5', opt.isNew && 'animate-option-highlight'), disabled: isProcessing, onClick: () => handleSelect(currentQuestion.id, opt.id), children: _jsxs("div", { className: "flex items-start gap-2", children: [_jsxs("span", { className: "text-muted-foreground mt-0.5 font-mono text-xs", children: [letter, "."] }), _jsxs("div", { className: "flex-1", children: [_jsxs("div", { className: "mb-0.5 flex items-center gap-2", children: [_jsx("span", { className: "text-foreground text-xs font-semibold", children: opt.label }), opt.recommended ? (_jsx(Badge, { className: "px-1.5 py-0 text-[10px]", children: "AI Recommended" })) : null, opt.isNew ? (_jsx(Badge, { className: "border-transparent bg-emerald-600 px-1.5 py-0 text-[10px] text-white hover:bg-emerald-600/80", children: "New" })) : null] }), _jsx("div", { className: "text-muted-foreground text-xs leading-snug", children: opt.rationale })] })] }) }, opt.id));
36
+ return (_jsx("button", { type: "button", className: cn('border-border w-full overflow-hidden rounded-md border px-3 py-3 text-left text-xs transition-all', 'hover:border-primary/70 hover:bg-primary/5 group', selected && 'border-primary bg-primary/5', opt.isNew && 'animate-option-highlight'), disabled: isProcessing, onClick: () => handleSelect(currentQuestion.id, opt.id), children: _jsxs("div", { className: "flex items-start gap-2", children: [_jsxs("span", { className: "text-muted-foreground mt-0.5 font-mono text-xs", children: [letter, "."] }), _jsxs("div", { className: "min-w-0 flex-1", children: [_jsx("div", { className: "text-foreground mb-0.5 text-xs font-semibold wrap-break-word", children: opt.label }), _jsx("div", { className: "text-muted-foreground text-xs leading-snug", children: opt.rationale })] }), opt.recommended || opt.isNew ? (_jsx("div", { className: "shrink-0 pt-0.5", children: opt.recommended ? (_jsx(Badge, { className: "px-1.5 py-0 text-[10px] whitespace-nowrap", children: "AI Recommended" })) : (_jsx(Badge, { className: "border-transparent bg-emerald-600 px-1.5 py-0 text-[10px] whitespace-nowrap text-white hover:bg-emerald-600/80", children: "New" })) })) : null] }) }, opt.id));
37
37
  }) })] }), _jsxs("div", { className: "flex items-center justify-between pt-2", children: [_jsxs(Button, { type: "button", variant: "ghost", size: "sm", disabled: isFirstStep || isProcessing, onClick: () => {
38
38
  navigateSound.play();
39
39
  setCurrentStep((s) => s - 1);
@@ -17,4 +17,10 @@ export declare const MinimalData: Story;
17
17
  export declare const WithRejectButton: Story;
18
18
  /** Rejecting state — reject button disabled with spinner while reject action is in flight. */
19
19
  export declare const RejectingState: Story;
20
+ /** Real-world LLM provider question — reproduces exact label text from the reported bug. Badge must stay on one line. */
21
+ export declare const LlmProviderQuestion: Story;
22
+ /** Pathological overflow — label with no natural word break (repeating token). Verifies button does not overflow panel. */
23
+ export declare const RepeatingLabelOverflow: Story;
24
+ /** Long labels — verifies that AI Recommended badge stays on one line even with very long option labels. Uses 640px width to match real panel width. */
25
+ export declare const LongLabels: Story;
20
26
  //# sourceMappingURL=prd-questionnaire.stories.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"prd-questionnaire.stories.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/prd-questionnaire/prd-questionnaire.stories.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAEvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAiKvD,QAAA,MAAM,IAAI,EAAE,IAAI,CAAC,OAAO,gBAAgB,CAkBvC,CAAC;AAEF,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAU/C,sJAAsJ;AACtJ,eAAO,MAAM,OAAO,EAAE,KAErB,CAAC;AAEF,2EAA2E;AAC3E,eAAO,MAAM,cAAc,EAAE,KAW5B,CAAC;AAEF,uEAAuE;AACvE,eAAO,MAAM,WAAW,EAAE,KAczB,CAAC;AAEF,0EAA0E;AAC1E,eAAO,MAAM,QAAQ,EAAE,KAStB,CAAC;AAEF,uDAAuD;AACvD,eAAO,MAAM,WAAW,EAAE,KA8BzB,CAAC;AAaF,4DAA4D;AAC5D,eAAO,MAAM,gBAAgB,EAAE,KAQ9B,CAAC;AAEF,8FAA8F;AAC9F,eAAO,MAAM,cAAc,EAAE,KAO5B,CAAC"}
1
+ {"version":3,"file":"prd-questionnaire.stories.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/prd-questionnaire/prd-questionnaire.stories.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAEvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAiKvD,QAAA,MAAM,IAAI,EAAE,IAAI,CAAC,OAAO,gBAAgB,CAkBvC,CAAC;AAEF,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAU/C,sJAAsJ;AACtJ,eAAO,MAAM,OAAO,EAAE,KAErB,CAAC;AAEF,2EAA2E;AAC3E,eAAO,MAAM,cAAc,EAAE,KAW5B,CAAC;AAEF,uEAAuE;AACvE,eAAO,MAAM,WAAW,EAAE,KAczB,CAAC;AAEF,0EAA0E;AAC1E,eAAO,MAAM,QAAQ,EAAE,KAStB,CAAC;AAEF,uDAAuD;AACvD,eAAO,MAAM,WAAW,EAAE,KA8BzB,CAAC;AAaF,4DAA4D;AAC5D,eAAO,MAAM,gBAAgB,EAAE,KAQ9B,CAAC;AAEF,8FAA8F;AAC9F,eAAO,MAAM,cAAc,EAAE,KAO5B,CAAC;AAEF,yHAAyH;AACzH,eAAO,MAAM,mBAAmB,EAAE,KAuCjC,CAAC;AAEF,2HAA2H;AAC3H,eAAO,MAAM,sBAAsB,EAAE,KAiCpC,CAAC;AAEF,wJAAwJ;AACxJ,eAAO,MAAM,UAAU,EAAE,KAyCxB,CAAC"}
@@ -154,7 +154,7 @@ const meta = {
154
154
  onApprove: { action: 'onApprove' },
155
155
  },
156
156
  decorators: [
157
- (Story) => (_jsx("div", { style: { height: '600px', width: '400px', border: '1px solid var(--color-border)' }, children: _jsx(Story, {}) })),
157
+ (Story) => (_jsx("div", { style: { height: '600px', width: '760px', border: '1px solid var(--color-border)' }, children: _jsx(Story, {}) })),
158
158
  ],
159
159
  };
160
160
  export default meta;
@@ -248,3 +248,98 @@ export const RejectingState = {
248
248
  isRejecting: true,
249
249
  },
250
250
  };
251
+ /** Real-world LLM provider question — reproduces exact label text from the reported bug. Badge must stay on one line. */
252
+ export const LlmProviderQuestion = {
253
+ render: () => (_jsx(InteractiveQuestionnaire, { data: {
254
+ question: 'Review Feature Requirements',
255
+ context: 'Testing badge nowrap with real-world LLM provider labels.',
256
+ questions: [
257
+ {
258
+ id: 'llm-provider',
259
+ question: 'Which LLM provider should be the primary AI engine?',
260
+ type: 'select',
261
+ options: [
262
+ {
263
+ id: 'claude-primary',
264
+ label: 'Claude (Anthropic) as primary for all AI tasks including vision/OCR, OpenAI as fallback LLM',
265
+ rationale: 'Claude is used as the primary engine for all AI tasks: structured reasoning, signal interpretation, opportunity scoring, AND vision/OCR for flyer image extraction.',
266
+ recommended: true,
267
+ },
268
+ {
269
+ id: 'split',
270
+ label: 'Claude (Anthropic) for reasoning, OpenAI Vision for OCR',
271
+ rationale: 'Split responsibilities: Claude for text reasoning tasks, OpenAI Vision API specifically for OCR/image analysis.',
272
+ },
273
+ {
274
+ id: 'single',
275
+ label: 'Single provider only (Claude OR OpenAI for everything)',
276
+ rationale: 'Simplifies implementation — one SDK, one billing relationship, one prompt format.',
277
+ },
278
+ ],
279
+ },
280
+ ],
281
+ finalAction: mockFinalAction,
282
+ } })),
283
+ };
284
+ /** Pathological overflow — label with no natural word break (repeating token). Verifies button does not overflow panel. */
285
+ export const RepeatingLabelOverflow = {
286
+ render: () => (_jsx(InteractiveQuestionnaire, { data: {
287
+ question: 'Where should the dark-mode preference be persisted?',
288
+ context: 'Testing overflow containment with no-break label text.',
289
+ questions: [
290
+ {
291
+ id: 'storage',
292
+ question: 'Where should the dark-mode preference be persisted?',
293
+ type: 'select',
294
+ options: [
295
+ {
296
+ id: 'localstorage',
297
+ label: 'localStorage only localStorage only localStorage only localStorage only localStorage only localStorage only',
298
+ rationale: 'Store the theme preference in localStorage. Zero backend changes, instant read on page load, and no need for API round-trips.',
299
+ recommended: true,
300
+ },
301
+ {
302
+ id: 'sqlite',
303
+ label: 'SQLite settings via backend API',
304
+ rationale: 'Persist the preference in the Shep SQLite settings store alongside other settings. Syncs across devices but requires API changes and a settings migration — out of scope for this feature.',
305
+ },
306
+ ],
307
+ },
308
+ ],
309
+ finalAction: mockFinalAction,
310
+ } })),
311
+ };
312
+ /** Long labels — verifies that AI Recommended badge stays on one line even with very long option labels. Uses 640px width to match real panel width. */
313
+ export const LongLabels = {
314
+ render: () => (_jsx(InteractiveQuestionnaire, { data: {
315
+ question: 'Review Feature Requirements',
316
+ context: 'Testing badge nowrap behavior with long option labels.',
317
+ questions: [
318
+ {
319
+ id: 'long-label',
320
+ question: 'Which deployment strategy should we use for the distributed microservices architecture?',
321
+ type: 'select',
322
+ options: [
323
+ {
324
+ id: 'opt-long-1',
325
+ label: 'Blue-Green Deployment with Automated Canary Analysis and Progressive Rollout',
326
+ rationale: 'Minimizes downtime and risk by running two identical production environments',
327
+ recommended: true,
328
+ },
329
+ {
330
+ id: 'opt-long-2',
331
+ label: 'Rolling Update with Health Check Verification and Automatic Rollback on Failure',
332
+ rationale: 'Gradually replaces instances with zero-downtime deployment',
333
+ },
334
+ {
335
+ id: 'opt-long-3',
336
+ label: 'Feature Flags with Percentage-Based Gradual Rollout to Target User Segments',
337
+ rationale: 'Enables targeted rollout and instant rollback via configuration',
338
+ isNew: true,
339
+ },
340
+ ],
341
+ },
342
+ ],
343
+ finalAction: mockFinalAction,
344
+ } })),
345
+ };
@@ -1 +1 @@
1
- {"version":3,"file":"product-decisions-summary.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/product-decisions-summary/product-decisions-summary.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EACV,4BAA4B,EAE7B,MAAM,oCAAoC,CAAC;AAyB5C,wBAAgB,uBAAuB,CAAC,EAAE,IAAI,EAAE,EAAE,4BAA4B,kDAmB7E"}
1
+ {"version":3,"file":"product-decisions-summary.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/product-decisions-summary/product-decisions-summary.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EACV,4BAA4B,EAE7B,MAAM,oCAAoC,CAAC;AA6B5C,wBAAgB,uBAAuB,CAAC,EAAE,IAAI,EAAE,EAAE,4BAA4B,kDAmB7E"}
@@ -3,7 +3,7 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
3
  import { ClipboardList } from 'lucide-react';
4
4
  import { Badge } from '../../ui/badge.js';
5
5
  function ProductDecisionCard({ item, index }) {
6
- return (_jsx("div", { className: "border-border rounded-lg border", children: _jsx("div", { className: "space-y-2 px-4 py-3", children: _jsxs("div", { className: "flex items-start gap-2.5", children: [_jsx("span", { className: "bg-primary text-primary-foreground flex h-6 w-6 shrink-0 items-center justify-center rounded-full text-xs font-bold", children: index + 1 }), _jsxs("div", { className: "min-w-0 flex-1", children: [_jsx("h3", { className: "text-foreground text-sm leading-tight font-semibold", children: item.question }), _jsxs("div", { className: "mt-1 flex items-center gap-2", children: [_jsx("p", { className: "text-muted-foreground text-xs", children: item.selectedOption }), item.wasRecommended ? (_jsx(Badge, { className: "px-1.5 py-0 text-[10px]", children: "AI Recommended" })) : null] })] })] }) }) }));
6
+ return (_jsx("div", { className: "border-border rounded-lg border", children: _jsx("div", { className: "space-y-2 px-4 py-3", children: _jsxs("div", { className: "flex items-start gap-2.5", children: [_jsx("span", { className: "bg-primary text-primary-foreground flex h-6 w-6 shrink-0 items-center justify-center rounded-full text-xs font-bold", children: index + 1 }), _jsxs("div", { className: "min-w-0 flex-1", children: [_jsx("h3", { className: "text-foreground text-sm leading-tight font-semibold", children: item.question }), _jsxs("div", { className: "mt-1 flex items-center gap-2", children: [_jsx("p", { className: "text-muted-foreground min-w-0 truncate text-xs", children: item.selectedOption }), item.wasRecommended ? (_jsx(Badge, { className: "shrink-0 px-1.5 py-0 text-[10px] whitespace-nowrap", children: "AI Recommended" })) : null] })] })] }) }) }));
7
7
  }
8
8
  export function ProductDecisionsSummary({ data }) {
9
9
  const { questions } = data;
@@ -1 +1 @@
1
- {"version":3,"file":"repository-drawer.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/repository-node/repository-drawer.tsx"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAGnE,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,kBAAkB,GAAG,IAAI,CAAC;IAChC,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB;AAED,wBAAgB,gBAAgB,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,qBAAqB,2CA+ExE"}
1
+ {"version":3,"file":"repository-drawer.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/repository-node/repository-drawer.tsx"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAGnE,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,kBAAkB,GAAG,IAAI,CAAC;IAChC,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB;AAED,wBAAgB,gBAAgB,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,qBAAqB,2CAuGxE"}
@@ -1,7 +1,7 @@
1
1
  'use client';
2
2
  import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
3
3
  import { useCallback } from 'react';
4
- import { Code2, Terminal, FolderOpen } from 'lucide-react';
4
+ import { Code2, Terminal, FolderOpen, RefreshCw } from 'lucide-react';
5
5
  import { BaseDrawer } from '../../common/base-drawer/index.js';
6
6
  import { DrawerTitle, DrawerDescription } from '../../ui/drawer.js';
7
7
  import { Separator } from '../../ui/separator.js';
@@ -11,12 +11,12 @@ export function RepositoryDrawer({ data, onClose }) {
11
11
  const handleClose = useCallback(() => {
12
12
  onClose();
13
13
  }, [onClose]);
14
- const actions = useRepositoryActions(data?.repositoryPath ? { repositoryPath: data.repositoryPath } : null);
14
+ const actions = useRepositoryActions(data?.repositoryPath ? { repositoryId: data.id, repositoryPath: data.repositoryPath } : null);
15
15
  return (_jsx(BaseDrawer, { open: data !== null, onClose: handleClose, size: "md", modal: false, "data-testid": "repository-drawer", deployTarget: data?.repositoryPath
16
16
  ? {
17
17
  targetId: data.repositoryPath,
18
18
  targetType: 'repository',
19
19
  repositoryPath: data.repositoryPath,
20
20
  }
21
- : undefined, header: data ? (_jsxs("div", { "data-testid": "repository-drawer-header", children: [_jsx(DrawerTitle, { children: data.name }), data.repositoryPath ? (_jsx(DrawerDescription, { className: "truncate font-mono text-xs", children: data.repositoryPath })) : null] })) : undefined, children: data?.repositoryPath ? (_jsxs(_Fragment, { children: [_jsx(Separator, {}), _jsxs("div", { className: "flex flex-col gap-3 p-4", children: [_jsx("div", { className: "text-muted-foreground text-xs font-semibold tracking-wider", children: "OPEN WITH" }), _jsxs("div", { className: "flex flex-col gap-2", children: [_jsx(ActionButton, { label: "Open in IDE", onClick: actions.openInIde, loading: actions.ideLoading, error: !!actions.ideError, icon: Code2, variant: "outline", size: "sm" }), _jsx(ActionButton, { label: "Open in Shell", onClick: actions.openInShell, loading: actions.shellLoading, error: !!actions.shellError, icon: Terminal, variant: "outline", size: "sm" }), _jsx(ActionButton, { label: "Open Folder", onClick: actions.openFolder, loading: actions.folderLoading, error: !!actions.folderError, icon: FolderOpen, variant: "outline", size: "sm" })] })] })] })) : null }));
21
+ : undefined, header: data ? (_jsxs("div", { "data-testid": "repository-drawer-header", children: [_jsx(DrawerTitle, { children: data.name }), data.repositoryPath ? (_jsx(DrawerDescription, { className: "truncate font-mono text-xs", children: data.repositoryPath })) : null] })) : undefined, children: data?.repositoryPath ? (_jsxs(_Fragment, { children: [_jsx(Separator, {}), _jsxs("div", { className: "flex flex-col gap-3 p-4", children: [_jsx("div", { className: "text-muted-foreground text-xs font-semibold tracking-wider", children: "OPEN WITH" }), _jsxs("div", { className: "flex flex-col gap-2", children: [_jsx(ActionButton, { label: "Open in IDE", onClick: actions.openInIde, loading: actions.ideLoading, error: !!actions.ideError, icon: Code2, variant: "outline", size: "sm" }), _jsx(ActionButton, { label: "Open in Shell", onClick: actions.openInShell, loading: actions.shellLoading, error: !!actions.shellError, icon: Terminal, variant: "outline", size: "sm" }), _jsx(ActionButton, { label: "Open Folder", onClick: actions.openFolder, loading: actions.folderLoading, error: !!actions.folderError, icon: FolderOpen, variant: "outline", size: "sm" })] })] }), data.id ? (_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: actions.syncMain, loading: actions.syncLoading, error: !!actions.syncError, icon: RefreshCw, variant: "outline", size: "sm" }), actions.syncError ? (_jsx("p", { className: "text-destructive text-xs", children: actions.syncError })) : null] })] })] })) : null] })) : null }));
22
22
  }
@@ -17,7 +17,7 @@ export function RepositoryNode({ data }) {
17
17
  const router = useRouter();
18
18
  const featureFlags = useFeatureFlags();
19
19
  const [confirmOpen, setConfirmOpen] = useState(false);
20
- const actions = useRepositoryActions(data.repositoryPath ? { repositoryPath: data.repositoryPath } : null);
20
+ const actions = useRepositoryActions(data.repositoryPath ? { repositoryId: data.id, repositoryPath: data.repositoryPath } : null);
21
21
  const deployAction = useDeployAction(data.repositoryPath
22
22
  ? {
23
23
  targetId: data.repositoryPath,
@@ -1,16 +1,20 @@
1
1
  export interface RepositoryActionsInput {
2
+ repositoryId?: string;
2
3
  repositoryPath: string;
3
4
  }
4
5
  export interface RepositoryActionsState {
5
6
  openInIde: () => Promise<void>;
6
7
  openInShell: () => Promise<void>;
7
8
  openFolder: () => Promise<void>;
9
+ syncMain: () => Promise<void>;
8
10
  ideLoading: boolean;
9
11
  shellLoading: boolean;
10
12
  folderLoading: boolean;
13
+ syncLoading: boolean;
11
14
  ideError: string | null;
12
15
  shellError: string | null;
13
16
  folderError: string | null;
17
+ syncError: string | null;
14
18
  }
15
19
  export declare function useRepositoryActions(input: RepositoryActionsInput | null): RepositoryActionsState;
16
20
  //# sourceMappingURL=use-repository-actions.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"use-repository-actions.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/repository-node/use-repository-actions.ts"],"names":[],"mappings":"AAOA,MAAM,WAAW,sBAAsB;IACrC,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,sBAAsB;IACrC,SAAS,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/B,WAAW,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IACjC,UAAU,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAChC,UAAU,EAAE,OAAO,CAAC;IACpB,YAAY,EAAE,OAAO,CAAC;IACtB,aAAa,EAAE,OAAO,CAAC;IACvB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B;AAID,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,sBAAsB,GAAG,IAAI,GAAG,sBAAsB,CAyGjG"}
1
+ {"version":3,"file":"use-repository-actions.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/repository-node/use-repository-actions.ts"],"names":[],"mappings":"AAQA,MAAM,WAAW,sBAAsB;IACrC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,sBAAsB;IACrC,SAAS,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/B,WAAW,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IACjC,UAAU,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAChC,QAAQ,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9B,UAAU,EAAE,OAAO,CAAC;IACpB,YAAY,EAAE,OAAO,CAAC;IACtB,aAAa,EAAE,OAAO,CAAC;IACvB,WAAW,EAAE,OAAO,CAAC;IACrB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B;AAID,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,sBAAsB,GAAG,IAAI,GAAG,sBAAsB,CA6HjG"}
@@ -3,22 +3,27 @@ import { useState, useCallback, useRef, useEffect } from 'react';
3
3
  import { openIde } from '../../../app/actions/open-ide.js';
4
4
  import { openShell } from '../../../app/actions/open-shell.js';
5
5
  import { openFolder } from '../../../app/actions/open-folder.js';
6
+ import { syncRepository } from '../../../app/actions/sync-repository.js';
6
7
  const ERROR_CLEAR_DELAY = 5000;
7
8
  export function useRepositoryActions(input) {
8
9
  const [ideLoading, setIdeLoading] = useState(false);
9
10
  const [shellLoading, setShellLoading] = useState(false);
10
11
  const [folderLoading, setFolderLoading] = useState(false);
12
+ const [syncLoading, setSyncLoading] = useState(false);
11
13
  const [ideError, setIdeError] = useState(null);
12
14
  const [shellError, setShellError] = useState(null);
13
15
  const [folderError, setFolderError] = useState(null);
16
+ const [syncError, setSyncError] = useState(null);
14
17
  const ideTimerRef = useRef(null);
15
18
  const shellTimerRef = useRef(null);
16
19
  const folderTimerRef = useRef(null);
20
+ const syncTimerRef = useRef(null);
17
21
  // Clear timers on unmount
18
22
  useEffect(() => {
19
23
  const ideRef = ideTimerRef;
20
24
  const shellRef = shellTimerRef;
21
25
  const folderRef = folderTimerRef;
26
+ const syncRef = syncTimerRef;
22
27
  return () => {
23
28
  if (ideRef.current)
24
29
  clearTimeout(ideRef.current);
@@ -26,6 +31,8 @@ export function useRepositoryActions(input) {
26
31
  clearTimeout(shellRef.current);
27
32
  if (folderRef.current)
28
33
  clearTimeout(folderRef.current);
34
+ if (syncRef.current)
35
+ clearTimeout(syncRef.current);
29
36
  };
30
37
  }, []);
31
38
  const performAction = useCallback(async (action, setLoading, setError, timerRef, isLoading) => {
@@ -55,15 +62,19 @@ export function useRepositoryActions(input) {
55
62
  const handleOpenIde = useCallback(() => performAction(() => openIde({ repositoryPath: input.repositoryPath }), setIdeLoading, setIdeError, ideTimerRef, ideLoading), [performAction, ideLoading, input]);
56
63
  const handleOpenShell = useCallback(() => performAction(() => openShell({ repositoryPath: input.repositoryPath }), setShellLoading, setShellError, shellTimerRef, shellLoading), [performAction, shellLoading, input]);
57
64
  const handleOpenFolder = useCallback(() => performAction(() => openFolder(input.repositoryPath), setFolderLoading, setFolderError, folderTimerRef, folderLoading), [performAction, folderLoading, input]);
65
+ const handleSyncMain = useCallback(() => performAction(() => syncRepository(input.repositoryId ?? ''), setSyncLoading, setSyncError, syncTimerRef, syncLoading), [performAction, syncLoading, input]);
58
66
  return {
59
67
  openInIde: handleOpenIde,
60
68
  openInShell: handleOpenShell,
61
69
  openFolder: handleOpenFolder,
70
+ syncMain: handleSyncMain,
62
71
  ideLoading,
63
72
  shellLoading,
64
73
  folderLoading,
74
+ syncLoading,
65
75
  ideError,
66
76
  shellError,
67
77
  folderError,
78
+ syncError,
68
79
  };
69
80
  }