@shepai/cli 1.129.3 → 1.129.4-pr396.5d604d5

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 (299) hide show
  1. package/apis/json-schema/FeatureFlags.yaml +5 -0
  2. package/dist/packages/core/src/application/ports/output/agents/phase-timing-repository.interface.d.ts +1 -1
  3. package/dist/packages/core/src/application/ports/output/agents/phase-timing-repository.interface.d.ts.map +1 -1
  4. package/dist/packages/core/src/application/ports/output/services/git-pr-service.interface.d.ts +73 -5
  5. package/dist/packages/core/src/application/ports/output/services/git-pr-service.interface.d.ts.map +1 -1
  6. package/dist/packages/core/src/application/ports/output/services/git-pr-service.interface.js +6 -4
  7. package/dist/packages/core/src/application/use-cases/features/rebase-feature-on-main.use-case.d.ts +28 -0
  8. package/dist/packages/core/src/application/use-cases/features/rebase-feature-on-main.use-case.d.ts.map +1 -0
  9. package/dist/packages/core/src/application/use-cases/features/rebase-feature-on-main.use-case.js +81 -0
  10. package/dist/packages/core/src/application/use-cases/repositories/sync-repository-main.use-case.d.ts +16 -0
  11. package/dist/packages/core/src/application/use-cases/repositories/sync-repository-main.use-case.d.ts.map +1 -0
  12. package/dist/packages/core/src/application/use-cases/repositories/sync-repository-main.use-case.js +43 -0
  13. package/dist/packages/core/src/domain/factories/settings-defaults.factory.d.ts.map +1 -1
  14. package/dist/packages/core/src/domain/factories/settings-defaults.factory.js +1 -0
  15. package/dist/packages/core/src/domain/generated/output.d.ts +4 -0
  16. package/dist/packages/core/src/domain/generated/output.d.ts.map +1 -1
  17. package/dist/packages/core/src/infrastructure/di/container.d.ts.map +1 -1
  18. package/dist/packages/core/src/infrastructure/di/container.js +15 -0
  19. package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/settings.mapper.d.ts +1 -0
  20. package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/settings.mapper.d.ts.map +1 -1
  21. package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/settings.mapper.js +2 -0
  22. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/042-add-feature-flag-git-rebase-sync.d.ts +11 -0
  23. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/042-add-feature-flag-git-rebase-sync.d.ts.map +1 -0
  24. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/042-add-feature-flag-git-rebase-sync.js +17 -0
  25. package/dist/packages/core/src/infrastructure/repositories/sqlite-settings.repository.d.ts.map +1 -1
  26. package/dist/packages/core/src/infrastructure/repositories/sqlite-settings.repository.js +3 -2
  27. package/dist/packages/core/src/infrastructure/services/agents/conflict-resolution/conflict-resolution.prompt.d.ts +35 -0
  28. package/dist/packages/core/src/infrastructure/services/agents/conflict-resolution/conflict-resolution.prompt.d.ts.map +1 -0
  29. package/dist/packages/core/src/infrastructure/services/agents/conflict-resolution/conflict-resolution.prompt.js +66 -0
  30. package/dist/packages/core/src/infrastructure/services/agents/conflict-resolution/conflict-resolution.service.d.ts +42 -0
  31. package/dist/packages/core/src/infrastructure/services/agents/conflict-resolution/conflict-resolution.service.d.ts.map +1 -0
  32. package/dist/packages/core/src/infrastructure/services/agents/conflict-resolution/conflict-resolution.service.js +169 -0
  33. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/evidence.node.d.ts.map +1 -1
  34. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/evidence.node.js +21 -5
  35. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/fast-implement.node.d.ts.map +1 -1
  36. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/fast-implement.node.js +20 -4
  37. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/implement.node.d.ts.map +1 -1
  38. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/implement.node.js +71 -10
  39. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/merge/merge.node.d.ts.map +1 -1
  40. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/merge/merge.node.js +2 -1
  41. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/phase-timing-context.d.ts +8 -0
  42. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/phase-timing-context.d.ts.map +1 -1
  43. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/phase-timing-context.js +16 -0
  44. package/dist/packages/core/src/infrastructure/services/git/git-pr.service.d.ts +6 -0
  45. package/dist/packages/core/src/infrastructure/services/git/git-pr.service.d.ts.map +1 -1
  46. package/dist/packages/core/src/infrastructure/services/git/git-pr.service.js +134 -0
  47. package/dist/src/presentation/web/app/(dashboard)/get-graph-data.d.ts.map +1 -1
  48. package/dist/src/presentation/web/app/(dashboard)/get-graph-data.js +5 -12
  49. package/dist/src/presentation/web/app/actions/get-feature-phase-timings.d.ts +1 -0
  50. package/dist/src/presentation/web/app/actions/get-feature-phase-timings.d.ts.map +1 -1
  51. package/dist/src/presentation/web/app/actions/get-feature-phase-timings.js +1 -0
  52. package/dist/src/presentation/web/app/actions/rebase-feature.d.ts +5 -0
  53. package/dist/src/presentation/web/app/actions/rebase-feature.d.ts.map +1 -0
  54. package/dist/src/presentation/web/app/actions/rebase-feature.js +16 -0
  55. package/dist/src/presentation/web/app/actions/sync-repository.d.ts +5 -0
  56. package/dist/src/presentation/web/app/actions/sync-repository.d.ts.map +1 -0
  57. package/dist/src/presentation/web/app/actions/sync-repository.js +16 -0
  58. package/dist/src/presentation/web/components/common/control-center-drawer/feature-drawer-client.d.ts.map +1 -1
  59. package/dist/src/presentation/web/components/common/control-center-drawer/feature-drawer-client.js +22 -5
  60. package/dist/src/presentation/web/components/common/control-center-drawer/repository-drawer-client.d.ts.map +1 -1
  61. package/dist/src/presentation/web/components/common/control-center-drawer/repository-drawer-client.js +4 -4
  62. package/dist/src/presentation/web/components/common/control-center-drawer/use-artifact-fetch.d.ts +2 -1
  63. package/dist/src/presentation/web/components/common/control-center-drawer/use-artifact-fetch.d.ts.map +1 -1
  64. package/dist/src/presentation/web/components/common/control-center-drawer/use-artifact-fetch.js +3 -2
  65. package/dist/src/presentation/web/components/common/feature-drawer/use-feature-actions.d.ts +4 -0
  66. package/dist/src/presentation/web/components/common/feature-drawer/use-feature-actions.d.ts.map +1 -1
  67. package/dist/src/presentation/web/components/common/feature-drawer/use-feature-actions.js +32 -1
  68. package/dist/src/presentation/web/components/common/feature-drawer-tabs/activity-tab.d.ts.map +1 -1
  69. package/dist/src/presentation/web/components/common/feature-drawer-tabs/activity-tab.js +17 -4
  70. package/dist/src/presentation/web/components/common/feature-drawer-tabs/feature-drawer-tabs.d.ts +4 -1
  71. package/dist/src/presentation/web/components/common/feature-drawer-tabs/feature-drawer-tabs.d.ts.map +1 -1
  72. package/dist/src/presentation/web/components/common/feature-drawer-tabs/feature-drawer-tabs.js +3 -3
  73. package/dist/src/presentation/web/components/common/feature-drawer-tabs/overview-tab.d.ts +4 -1
  74. package/dist/src/presentation/web/components/common/feature-drawer-tabs/overview-tab.d.ts.map +1 -1
  75. package/dist/src/presentation/web/components/common/feature-drawer-tabs/overview-tab.js +8 -3
  76. package/dist/src/presentation/web/components/common/feature-drawer-tabs/overview-tab.stories.d.ts +6 -0
  77. package/dist/src/presentation/web/components/common/feature-drawer-tabs/overview-tab.stories.d.ts.map +1 -1
  78. package/dist/src/presentation/web/components/common/feature-drawer-tabs/overview-tab.stories.js +30 -0
  79. package/dist/src/presentation/web/components/common/open-action-menu/open-action-menu.stories.d.ts.map +1 -1
  80. package/dist/src/presentation/web/components/common/open-action-menu/open-action-menu.stories.js +3 -0
  81. package/dist/src/presentation/web/components/common/repository-node/repository-drawer.d.ts.map +1 -1
  82. package/dist/src/presentation/web/components/common/repository-node/repository-drawer.js +5 -3
  83. package/dist/src/presentation/web/components/common/repository-node/repository-node.js +1 -1
  84. package/dist/src/presentation/web/components/common/repository-node/use-repository-actions.d.ts +4 -0
  85. package/dist/src/presentation/web/components/common/repository-node/use-repository-actions.d.ts.map +1 -1
  86. package/dist/src/presentation/web/components/common/repository-node/use-repository-actions.js +11 -0
  87. package/dist/src/presentation/web/components/features/settings/feature-flags-settings-section.d.ts.map +1 -1
  88. package/dist/src/presentation/web/components/features/settings/feature-flags-settings-section.js +3 -0
  89. package/dist/src/presentation/web/components/features/settings/feature-flags-settings-section.stories.d.ts.map +1 -1
  90. package/dist/src/presentation/web/components/features/settings/feature-flags-settings-section.stories.js +3 -0
  91. package/dist/src/presentation/web/components/features/settings/settings-page-client.d.ts.map +1 -1
  92. package/dist/src/presentation/web/components/features/settings/settings-page-client.js +5 -0
  93. package/dist/src/presentation/web/components/features/settings/settings-page-client.stories.d.ts.map +1 -1
  94. package/dist/src/presentation/web/components/features/settings/settings-page-client.stories.js +1 -0
  95. package/dist/src/presentation/web/components/layouts/app-sidebar/app-sidebar.stories.d.ts.map +1 -1
  96. package/dist/src/presentation/web/components/layouts/app-sidebar/app-sidebar.stories.js +1 -0
  97. package/dist/src/presentation/web/hooks/feature-flags-context.d.ts.map +1 -1
  98. package/dist/src/presentation/web/hooks/feature-flags-context.js +1 -0
  99. package/dist/src/presentation/web/lib/feature-flags.d.ts +2 -0
  100. package/dist/src/presentation/web/lib/feature-flags.d.ts.map +1 -1
  101. package/dist/src/presentation/web/lib/feature-flags.js +5 -0
  102. package/dist/tsconfig.build.tsbuildinfo +1 -1
  103. package/package.json +1 -1
  104. package/web/.next/BUILD_ID +1 -1
  105. package/web/.next/build-manifest.json +2 -2
  106. package/web/.next/fallback-build-manifest.json +2 -2
  107. package/web/.next/prerender-manifest.json +3 -3
  108. package/web/.next/required-server-files.js +3 -3
  109. package/web/.next/required-server-files.json +3 -3
  110. package/web/.next/server/app/(dashboard)/@drawer/adopt/page/server-reference-manifest.json +63 -48
  111. package/web/.next/server/app/(dashboard)/@drawer/adopt/page.js +2 -2
  112. package/web/.next/server/app/(dashboard)/@drawer/adopt/page.js.nft.json +1 -1
  113. package/web/.next/server/app/(dashboard)/@drawer/adopt/page_client-reference-manifest.js +1 -1
  114. package/web/.next/server/app/(dashboard)/@drawer/create/page/server-reference-manifest.json +63 -48
  115. package/web/.next/server/app/(dashboard)/@drawer/create/page.js +2 -2
  116. package/web/.next/server/app/(dashboard)/@drawer/create/page.js.nft.json +1 -1
  117. package/web/.next/server/app/(dashboard)/@drawer/create/page_client-reference-manifest.js +1 -1
  118. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page/server-reference-manifest.json +90 -60
  119. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page.js +2 -2
  120. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page.js.nft.json +1 -1
  121. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page_client-reference-manifest.js +1 -1
  122. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page/server-reference-manifest.json +90 -60
  123. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js +2 -2
  124. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js.nft.json +1 -1
  125. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page_client-reference-manifest.js +1 -1
  126. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page/server-reference-manifest.json +59 -44
  127. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js +2 -2
  128. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js.nft.json +1 -1
  129. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  130. package/web/.next/server/app/(dashboard)/create/page/server-reference-manifest.json +63 -48
  131. package/web/.next/server/app/(dashboard)/create/page.js +2 -2
  132. package/web/.next/server/app/(dashboard)/create/page.js.nft.json +1 -1
  133. package/web/.next/server/app/(dashboard)/create/page_client-reference-manifest.js +1 -1
  134. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page/server-reference-manifest.json +90 -60
  135. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page.js +2 -2
  136. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page.js.nft.json +1 -1
  137. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page_client-reference-manifest.js +1 -1
  138. package/web/.next/server/app/(dashboard)/feature/[featureId]/page/server-reference-manifest.json +90 -60
  139. package/web/.next/server/app/(dashboard)/feature/[featureId]/page.js +2 -2
  140. package/web/.next/server/app/(dashboard)/feature/[featureId]/page.js.nft.json +1 -1
  141. package/web/.next/server/app/(dashboard)/feature/[featureId]/page_client-reference-manifest.js +1 -1
  142. package/web/.next/server/app/(dashboard)/page/server-reference-manifest.json +59 -44
  143. package/web/.next/server/app/(dashboard)/page.js +2 -2
  144. package/web/.next/server/app/(dashboard)/page.js.nft.json +1 -1
  145. package/web/.next/server/app/(dashboard)/page_client-reference-manifest.js +1 -1
  146. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page/server-reference-manifest.json +59 -44
  147. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js +2 -2
  148. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js.nft.json +1 -1
  149. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  150. package/web/.next/server/app/_global-error.html +2 -2
  151. package/web/.next/server/app/_global-error.rsc +1 -1
  152. package/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  153. package/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  154. package/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  155. package/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  156. package/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  157. package/web/.next/server/app/_not-found/page/server-reference-manifest.json +3 -3
  158. package/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  159. package/web/.next/server/app/api/attachments/preview/route.js.nft.json +1 -1
  160. package/web/.next/server/app/api/evidence/route.js.nft.json +1 -1
  161. package/web/.next/server/app/api/graph-data/route.js.nft.json +1 -1
  162. package/web/.next/server/app/settings/page/server-reference-manifest.json +8 -8
  163. package/web/.next/server/app/settings/page.js.nft.json +1 -1
  164. package/web/.next/server/app/settings/page_client-reference-manifest.js +1 -1
  165. package/web/.next/server/app/skills/page/server-reference-manifest.json +8 -8
  166. package/web/.next/server/app/skills/page.js.nft.json +1 -1
  167. package/web/.next/server/app/skills/page_client-reference-manifest.js +1 -1
  168. package/web/.next/server/app/tools/page/server-reference-manifest.json +8 -8
  169. package/web/.next/server/app/tools/page.js.nft.json +1 -1
  170. package/web/.next/server/app/tools/page_client-reference-manifest.js +1 -1
  171. package/web/.next/server/app/version/page/server-reference-manifest.json +3 -3
  172. package/web/.next/server/app/version/page_client-reference-manifest.js +1 -1
  173. package/web/.next/server/chunks/403f9_next_dist_esm_build_templates_app-route_370c43b1.js +1 -1
  174. package/web/.next/server/chunks/403f9_next_dist_esm_build_templates_app-route_370c43b1.js.map +1 -1
  175. package/web/.next/server/chunks/[root-of-the-server]__a402b567._.js +1 -1
  176. package/web/.next/server/chunks/[root-of-the-server]__bc532286._.js.map +1 -1
  177. package/web/.next/server/chunks/[root-of-the-server]__cd67a84c._.js.map +1 -1
  178. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js +1 -1
  179. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js.map +1 -1
  180. package/web/.next/server/chunks/ssr/[root-of-the-server]__0e842eba._.js +1 -1
  181. package/web/.next/server/chunks/ssr/[root-of-the-server]__0e842eba._.js.map +1 -1
  182. package/web/.next/server/chunks/ssr/[root-of-the-server]__357d99f9._.js +1 -1
  183. package/web/.next/server/chunks/ssr/[root-of-the-server]__39ecb785._.js +4 -0
  184. package/web/.next/server/chunks/ssr/[root-of-the-server]__39ecb785._.js.map +1 -0
  185. package/web/.next/server/chunks/ssr/[root-of-the-server]__43f51aa6._.js +1 -1
  186. package/web/.next/server/chunks/ssr/[root-of-the-server]__43f51aa6._.js.map +1 -1
  187. package/web/.next/server/chunks/ssr/[root-of-the-server]__465c0deb._.js +4 -0
  188. package/web/.next/server/chunks/ssr/[root-of-the-server]__465c0deb._.js.map +1 -0
  189. package/web/.next/server/chunks/ssr/[root-of-the-server]__60684242._.js +2 -2
  190. package/web/.next/server/chunks/ssr/[root-of-the-server]__60684242._.js.map +1 -1
  191. package/web/.next/server/chunks/ssr/[root-of-the-server]__62cdea24._.js +1 -1
  192. package/web/.next/server/chunks/ssr/[root-of-the-server]__6bb00d90._.js +2 -2
  193. package/web/.next/server/chunks/ssr/[root-of-the-server]__6bb00d90._.js.map +1 -1
  194. package/web/.next/server/chunks/ssr/[root-of-the-server]__815546bd._.js +1 -1
  195. package/web/.next/server/chunks/ssr/[root-of-the-server]__815546bd._.js.map +1 -1
  196. package/web/.next/server/chunks/ssr/[root-of-the-server]__8b6d1e18._.js +4 -0
  197. package/web/.next/server/chunks/ssr/[root-of-the-server]__8b6d1e18._.js.map +1 -0
  198. package/web/.next/server/chunks/ssr/[root-of-the-server]__8f6c27af._.js +6 -0
  199. package/web/.next/server/chunks/ssr/[root-of-the-server]__8f6c27af._.js.map +1 -0
  200. package/web/.next/server/chunks/ssr/[root-of-the-server]__910e9de5._.js +4 -0
  201. package/web/.next/server/chunks/ssr/[root-of-the-server]__910e9de5._.js.map +1 -0
  202. package/web/.next/server/chunks/ssr/[root-of-the-server]__a04af228._.js +4 -0
  203. package/web/.next/server/chunks/ssr/[root-of-the-server]__a04af228._.js.map +1 -0
  204. package/web/.next/server/chunks/ssr/[root-of-the-server]__a21eef5a._.js.map +1 -1
  205. package/web/.next/server/chunks/ssr/[root-of-the-server]__a32728d0._.js +4 -0
  206. package/web/.next/server/chunks/ssr/[root-of-the-server]__a32728d0._.js.map +1 -0
  207. package/web/.next/server/chunks/ssr/[root-of-the-server]__d6ab9c36._.js +6 -0
  208. package/web/.next/server/chunks/ssr/[root-of-the-server]__d6ab9c36._.js.map +1 -0
  209. package/web/.next/server/chunks/ssr/[root-of-the-server]__f2eb7d62._.js +4 -0
  210. package/web/.next/server/chunks/ssr/[root-of-the-server]__f2eb7d62._.js.map +1 -0
  211. package/web/.next/server/chunks/ssr/[root-of-the-server]__f3036814._.js +4 -0
  212. package/web/.next/server/chunks/ssr/[root-of-the-server]__f3036814._.js.map +1 -0
  213. package/web/.next/server/chunks/ssr/_0020fddd._.js +1 -1
  214. package/web/.next/server/chunks/ssr/_0020fddd._.js.map +1 -1
  215. package/web/.next/server/chunks/ssr/_01046927._.js +2 -2
  216. package/web/.next/server/chunks/ssr/_02ec1aea._.js +1 -1
  217. package/web/.next/server/chunks/ssr/_02ec1aea._.js.map +1 -1
  218. package/web/.next/server/chunks/ssr/_6f295a50._.js +3 -0
  219. package/web/.next/server/chunks/ssr/_6f295a50._.js.map +1 -0
  220. package/web/.next/server/chunks/ssr/_7dca1882._.js +1 -1
  221. package/web/.next/server/chunks/ssr/_7dca1882._.js.map +1 -1
  222. package/web/.next/server/chunks/ssr/_a37f5f18._.js +1 -1
  223. package/web/.next/server/chunks/ssr/_a37f5f18._.js.map +1 -1
  224. package/web/.next/server/chunks/ssr/_a9f57758._.js +1 -1
  225. package/web/.next/server/chunks/ssr/_a9f57758._.js.map +1 -1
  226. package/web/.next/server/chunks/ssr/{_324f08fa._.js → _b09cd608._.js} +2 -2
  227. package/web/.next/server/chunks/ssr/{_324f08fa._.js.map → _b09cd608._.js.map} +1 -1
  228. package/web/.next/server/chunks/ssr/_d4b20e29._.js.map +1 -1
  229. package/web/.next/server/chunks/ssr/_d8575088._.js +1 -1
  230. package/web/.next/server/chunks/ssr/_d8575088._.js.map +1 -1
  231. package/web/.next/server/chunks/ssr/_f39a1adb._.js +1 -1
  232. package/web/.next/server/chunks/ssr/_f39a1adb._.js.map +1 -1
  233. package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_settings_settings-page-client_tsx_6ed9d5f8._.js +1 -1
  234. package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_settings_settings-page-client_tsx_6ed9d5f8._.js.map +1 -1
  235. package/web/.next/server/chunks/ssr/f3a1f_components_common_control-center-drawer_repository-drawer-client_tsx_39a00c03._.js +1 -1
  236. package/web/.next/server/chunks/ssr/f3a1f_components_common_control-center-drawer_repository-drawer-client_tsx_39a00c03._.js.map +1 -1
  237. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_skills_page_actions_1b176e3c.js +1 -1
  238. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_skills_page_actions_1b176e3c.js.map +1 -1
  239. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_tools_page_actions_bd9f0dda.js +1 -1
  240. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_tools_page_actions_bd9f0dda.js.map +1 -1
  241. package/web/.next/server/chunks/ssr/src_presentation_web_a751c99b._.js +3 -0
  242. package/web/.next/server/chunks/ssr/{src_presentation_web_79c5e358._.js.map → src_presentation_web_a751c99b._.js.map} +1 -1
  243. package/web/.next/server/chunks/ssr/src_presentation_web_app_actions_open-ide_ts_baaca5d5._.js +3 -0
  244. package/web/.next/server/chunks/ssr/src_presentation_web_app_actions_open-ide_ts_baaca5d5._.js.map +1 -0
  245. package/web/.next/server/chunks/ssr/src_presentation_web_ca99d62d._.js +1 -1
  246. package/web/.next/server/chunks/ssr/src_presentation_web_ca99d62d._.js.map +1 -1
  247. package/web/.next/server/chunks/ssr/src_presentation_web_components_e599bb8c._.js +1 -1
  248. package/web/.next/server/chunks/ssr/src_presentation_web_components_e599bb8c._.js.map +1 -1
  249. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js +1 -1
  250. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js.map +1 -1
  251. package/web/.next/server/pages/500.html +2 -2
  252. package/web/.next/server/server-reference-manifest.js +1 -1
  253. package/web/.next/server/server-reference-manifest.json +410 -296
  254. package/web/.next/static/chunks/{a4d0f5c8adbd573e.js → 1469da8ddd6eea90.js} +1 -1
  255. package/web/.next/static/chunks/1642a69a3baf7820.js +2 -0
  256. package/web/.next/static/chunks/31ddce9ebee38ab1.css +1 -0
  257. package/web/.next/static/chunks/{75424b9eb679261a.js → 4aeed32883643436.js} +1 -1
  258. package/web/.next/static/chunks/{4d40135dc75a7412.js → 74fde105df75b977.js} +1 -1
  259. package/web/.next/static/chunks/{97778646dde1a546.js → 997a568d8ad04a23.js} +1 -1
  260. package/web/.next/static/chunks/{ef48a6beeb40b304.js → a063447a4428f722.js} +1 -1
  261. package/web/.next/static/chunks/{d2b3baac392d5097.js → a495659415f138d6.js} +1 -1
  262. package/web/.next/static/chunks/{21a98ed37526a704.js → b9e557204db8d0b3.js} +1 -1
  263. package/web/.next/static/chunks/bfda4e4194a4a633.js +1 -0
  264. package/web/.next/static/chunks/{140810c2538c85aa.js → df75002e2d1c7531.js} +2 -2
  265. package/web/.next/static/chunks/{a36ddda5a860c371.js → e5c346dccbba2214.js} +1 -1
  266. package/web/.next/static/chunks/{d1238d67f4b7fa61.js → f1801a777780b4e9.js} +1 -1
  267. package/web/.next/static/chunks/{d34a91958ca566fa.js → fb3e66702c475c87.js} +1 -1
  268. package/web/.next/static/chunks/{d0fb8a76a89bd016.js → febbfdc31eef505b.js} +1 -1
  269. package/web/.next/server/chunks/ssr/744ca_web__next-internal_server_app_(dashboard)_@drawer_adopt_page_actions_4e741df2.js +0 -3
  270. package/web/.next/server/chunks/ssr/744ca_web__next-internal_server_app_(dashboard)_@drawer_adopt_page_actions_4e741df2.js.map +0 -1
  271. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_026fdffa.js +0 -3
  272. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_026fdffa.js.map +0 -1
  273. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_8b91e197.js +0 -3
  274. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_8b91e197.js.map +0 -1
  275. package/web/.next/server/chunks/ssr/[root-of-the-server]__755cfe02._.js +0 -3
  276. package/web/.next/server/chunks/ssr/[root-of-the-server]__755cfe02._.js.map +0 -1
  277. package/web/.next/server/chunks/ssr/[root-of-the-server]__99ab2519._.js +0 -4
  278. package/web/.next/server/chunks/ssr/[root-of-the-server]__99ab2519._.js.map +0 -1
  279. package/web/.next/server/chunks/ssr/[root-of-the-server]__a628fb91._.js +0 -3
  280. package/web/.next/server/chunks/ssr/[root-of-the-server]__a628fb91._.js.map +0 -1
  281. package/web/.next/server/chunks/ssr/[root-of-the-server]__bfba58e6._.js +0 -3
  282. package/web/.next/server/chunks/ssr/[root-of-the-server]__bfba58e6._.js.map +0 -1
  283. package/web/.next/server/chunks/ssr/[root-of-the-server]__c3ab8422._.js +0 -3
  284. package/web/.next/server/chunks/ssr/[root-of-the-server]__c3ab8422._.js.map +0 -1
  285. package/web/.next/server/chunks/ssr/_8302fcae._.js +0 -3
  286. package/web/.next/server/chunks/ssr/_8302fcae._.js.map +0 -1
  287. package/web/.next/server/chunks/ssr/src_presentation_web_79c5e358._.js +0 -3
  288. package/web/.next/server/chunks/ssr/src_presentation_web_8e7fe0d1._.js +0 -5
  289. package/web/.next/server/chunks/ssr/src_presentation_web_8e7fe0d1._.js.map +0 -1
  290. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_ca051134.js +0 -3
  291. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_ca051134.js.map +0 -1
  292. package/web/.next/server/chunks/ssr/src_presentation_web_b9023017._.js +0 -5
  293. package/web/.next/server/chunks/ssr/src_presentation_web_b9023017._.js.map +0 -1
  294. package/web/.next/static/chunks/da484d44874006a2.css +0 -1
  295. package/web/.next/static/chunks/dc314fb7519088cf.js +0 -2
  296. package/web/.next/static/chunks/eb9841ec4d80af01.js +0 -1
  297. /package/web/.next/static/{8qbj3kELZ61JA30sTIVee → 9XEfk6BBAe6EEGca_Yisr}/_buildManifest.js +0 -0
  298. /package/web/.next/static/{8qbj3kELZ61JA30sTIVee → 9XEfk6BBAe6EEGca_Yisr}/_clientMiddlewareManifest.json +0 -0
  299. /package/web/.next/static/{8qbj3kELZ61JA30sTIVee → 9XEfk6BBAe6EEGca_Yisr}/_ssgManifest.js +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"phase-timing-context.d.ts","sourceRoot":"","sources":["../../../../../../../../packages/core/src/infrastructure/services/agents/feature-agent/phase-timing-context.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAGH,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,wEAAwE,CAAC;AAMrH;;GAEG;AACH,wBAAgB,eAAe,IAAI,MAAM,GAAG,IAAI,CAE/C;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,sBAAsB,GAAG,IAAI,CAG7F;AAED;;GAEG;AACH,wBAAgB,uBAAuB,IAAI,IAAI,CAI9C;AA+BD,sDAAsD;AACtD,MAAM,WAAW,kBAAkB;IACjC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;;;GAMG;AACH,wBAAsB,gBAAgB,CACpC,KAAK,EAAE,MAAM,EACb,QAAQ,CAAC,EAAE,kBAAkB,GAC5B,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAyBxB;AAED,qDAAqD;AACrD,MAAM,WAAW,gBAAgB;IAC/B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,wBAAwB,CAAC,EAAE,MAAM,CAAC;IAClC,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED;;;;GAIG;AACH,wBAAsB,cAAc,CAClC,QAAQ,EAAE,MAAM,GAAG,IAAI,EACvB,UAAU,EAAE,MAAM,EAClB,QAAQ,CAAC,EAAE,gBAAgB,GAC1B,OAAO,CAAC,IAAI,CAAC,CAwBf;AAED;;;;;;GAMG;AACH,wBAAsB,oBAAoB,CACxC,KAAK,EAAE,MAAM,EACb,aAAa,CAAC,EAAE,MAAM,EACtB,YAAY,CAAC,EAAE,sBAAsB,GACpC,OAAO,CAAC,IAAI,CAAC,CAoBf;AAED;;;GAGG;AACH,wBAAsB,uBAAuB,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAUpF"}
1
+ {"version":3,"file":"phase-timing-context.d.ts","sourceRoot":"","sources":["../../../../../../../../packages/core/src/infrastructure/services/agents/feature-agent/phase-timing-context.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAGH,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,wEAAwE,CAAC;AAMrH;;GAEG;AACH,wBAAgB,eAAe,IAAI,MAAM,GAAG,IAAI,CAE/C;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,sBAAsB,GAAG,IAAI,CAG7F;AAED;;GAEG;AACH,wBAAgB,uBAAuB,IAAI,IAAI,CAI9C;AA+BD,sDAAsD;AACtD,MAAM,WAAW,kBAAkB;IACjC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;;;GAMG;AACH,wBAAsB,gBAAgB,CACpC,KAAK,EAAE,MAAM,EACb,QAAQ,CAAC,EAAE,kBAAkB,GAC5B,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAyBxB;AAED,qDAAqD;AACrD,MAAM,WAAW,gBAAgB;IAC/B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,wBAAwB,CAAC,EAAE,MAAM,CAAC;IAClC,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,gFAAgF;IAChF,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;;;GAIG;AACH,wBAAsB,cAAc,CAClC,QAAQ,EAAE,MAAM,GAAG,IAAI,EACvB,UAAU,EAAE,MAAM,EAClB,QAAQ,CAAC,EAAE,gBAAgB,GAC1B,OAAO,CAAC,IAAI,CAAC,CAyBf;AAED;;;;;;GAMG;AACH,wBAAsB,oBAAoB,CACxC,KAAK,EAAE,MAAM,EACb,aAAa,CAAC,EAAE,MAAM,EACtB,YAAY,CAAC,EAAE,sBAAsB,GACpC,OAAO,CAAC,IAAI,CAAC,CAoBf;AAED;;;;GAIG;AACH,wBAAsB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAQ9F;AAED;;;GAGG;AACH,wBAAsB,uBAAuB,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAUpF"}
@@ -114,6 +114,7 @@ export async function recordPhaseEnd(timingId, durationMs, metadata) {
114
114
  ...(metadata?.durationApiMs != null && { durationApiMs: BigInt(metadata.durationApiMs) }),
115
115
  ...(metadata?.exitCode != null && { exitCode: metadata.exitCode }),
116
116
  ...(metadata?.errorMessage != null && { errorMessage: metadata.errorMessage }),
117
+ ...(metadata?.prompt != null && { prompt: metadata.prompt }),
117
118
  });
118
119
  }
119
120
  catch {
@@ -149,6 +150,21 @@ export async function recordLifecycleEvent(phase, explicitRunId, explicitRepo) {
149
150
  // Swallow — lifecycle event recording is non-fatal
150
151
  }
151
152
  }
153
+ /**
154
+ * Update a phase timing record with the prompt text.
155
+ * Useful when the prompt is built after recordPhaseStart (e.g. merge node).
156
+ * No-op if timingId is null or context is not set.
157
+ */
158
+ export async function updatePhasePrompt(timingId, prompt) {
159
+ if (!timingId || !contextRepository)
160
+ return;
161
+ try {
162
+ await contextRepository.update(timingId, { prompt });
163
+ }
164
+ catch {
165
+ // Swallow — prompt update failure is non-fatal
166
+ }
167
+ }
152
168
  /**
153
169
  * Record the start of an approval wait. Sets waitingApprovalAt on the timing record.
154
170
  * No-op if timingId is null or context is not set.
@@ -45,5 +45,11 @@ export declare class GitPrService implements IGitPrService {
45
45
  private parseGhError;
46
46
  private parsePrNumberFromUrl;
47
47
  private parseDiffStat;
48
+ syncMain(cwd: string, baseBranch: string): Promise<void>;
49
+ rebaseOnMain(cwd: string, featureBranch: string, baseBranch: string): Promise<void>;
50
+ getConflictedFiles(cwd: string): Promise<string[]>;
51
+ stageFiles(cwd: string, files: string[]): Promise<void>;
52
+ rebaseContinue(cwd: string): Promise<void>;
53
+ rebaseAbort(cwd: string): Promise<void>;
48
54
  }
49
55
  //# sourceMappingURL=git-pr.service.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"git-pr.service.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/src/infrastructure/services/git/git-pr.service.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"git-pr.service.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/src/infrastructure/services/git/git-pr.service.ts"],"names":[],"mappings":"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"}
@@ -609,6 +609,14 @@ let GitPrService = class GitPrService {
609
609
  parseGitError(error) {
610
610
  const message = error instanceof Error ? error.message : String(error);
611
611
  const cause = error instanceof Error ? error : undefined;
612
+ // Rebase-specific: detect "CONFLICT" during rebase operations
613
+ if (message.includes('CONFLICT') && message.includes('rebase')) {
614
+ return new GitPrError(message, GitPrErrorCode.REBASE_CONFLICT, cause);
615
+ }
616
+ // Sync-specific: non-fast-forward or diverged branch
617
+ if (message.includes('non-fast-forward') || message.includes('diverged')) {
618
+ return new GitPrError(message, GitPrErrorCode.SYNC_FAILED, cause);
619
+ }
612
620
  if (message.includes('rejected') || message.includes('conflict')) {
613
621
  return new GitPrError(message, GitPrErrorCode.MERGE_CONFLICT, cause);
614
622
  }
@@ -649,6 +657,132 @@ let GitPrService = class GitPrService {
649
657
  commitCount,
650
658
  };
651
659
  }
660
+ // --- Rebase & Sync operations ---
661
+ async syncMain(cwd, baseBranch) {
662
+ try {
663
+ // Detect current branch
664
+ const { stdout } = await this.execFile('git', ['rev-parse', '--abbrev-ref', 'HEAD'], { cwd });
665
+ const currentBranch = stdout.trim();
666
+ if (currentBranch === baseBranch) {
667
+ // On the base branch — use git pull --ff-only
668
+ await this.execFile('git', ['pull', '--ff-only', 'origin', baseBranch], { cwd });
669
+ }
670
+ else {
671
+ // On a different branch — fetch the remote ref only (updates origin/<baseBranch>).
672
+ // We intentionally do NOT update the local <baseBranch> ref because it may be
673
+ // checked out in another worktree, which causes git to refuse the update with:
674
+ // "fatal: refusing to fetch into branch 'refs/heads/main' checked out at ..."
675
+ await this.execFile('git', ['fetch', 'origin', baseBranch], { cwd });
676
+ }
677
+ }
678
+ catch (error) {
679
+ const message = error instanceof Error ? error.message : String(error);
680
+ const cause = error instanceof Error ? error : undefined;
681
+ if (message.includes('non-fast-forward') ||
682
+ message.includes('Not possible to fast-forward') ||
683
+ message.includes('diverged')) {
684
+ throw new GitPrError(`Cannot fast-forward '${baseBranch}': local branch has diverged from remote. ` +
685
+ `Resolve the divergence manually with 'git checkout ${baseBranch} && git reset --hard origin/${baseBranch}' ` +
686
+ `if you want to discard local changes on ${baseBranch}.`, GitPrErrorCode.SYNC_FAILED, cause);
687
+ }
688
+ throw new GitPrError(`Failed to sync '${baseBranch}' with remote: ${message}`, GitPrErrorCode.GIT_ERROR, cause);
689
+ }
690
+ }
691
+ async rebaseOnMain(cwd, featureBranch, baseBranch) {
692
+ // Check for dirty worktree before starting
693
+ const dirty = await this.hasUncommittedChanges(cwd);
694
+ if (dirty) {
695
+ throw new GitPrError(`Cannot rebase: working directory has uncommitted changes. ` +
696
+ `Please commit or stash your changes before rebasing.`, GitPrErrorCode.GIT_ERROR);
697
+ }
698
+ // Checkout the feature branch
699
+ try {
700
+ await this.execFile('git', ['checkout', featureBranch], { cwd });
701
+ }
702
+ catch (error) {
703
+ const message = error instanceof Error ? error.message : String(error);
704
+ const cause = error instanceof Error ? error : undefined;
705
+ if (message.includes('did not match') ||
706
+ message.includes('not a commit') ||
707
+ message.includes('pathspec')) {
708
+ throw new GitPrError(`Branch '${featureBranch}' not found.`, GitPrErrorCode.BRANCH_NOT_FOUND, cause);
709
+ }
710
+ throw new GitPrError(`Failed to checkout '${featureBranch}': ${message}`, GitPrErrorCode.GIT_ERROR, cause);
711
+ }
712
+ // Rebase onto origin/<baseBranch> (the remote-tracking ref).
713
+ // We use origin/<baseBranch> rather than the local <baseBranch> because:
714
+ // 1. syncMain fetches origin/<baseBranch> — it's always up-to-date
715
+ // 2. The local <baseBranch> may be checked out in another worktree and stale
716
+ const rebaseTarget = `origin/${baseBranch}`;
717
+ try {
718
+ await this.execFile('git', ['rebase', rebaseTarget], { cwd });
719
+ }
720
+ catch (error) {
721
+ const message = error instanceof Error ? error.message : String(error);
722
+ const cause = error instanceof Error ? error : undefined;
723
+ // Detect rebase conflict from git stderr/exit code
724
+ if (message.includes('CONFLICT') || message.includes('could not apply')) {
725
+ // Get the list of conflicted files to include in the error message
726
+ let conflictedFiles = [];
727
+ try {
728
+ conflictedFiles = await this.getConflictedFiles(cwd);
729
+ }
730
+ catch {
731
+ // Failed to get conflicted files — still report the conflict
732
+ }
733
+ const fileList = conflictedFiles.length > 0 ? ` Conflicted files: ${conflictedFiles.join(', ')}` : '';
734
+ throw new GitPrError(`Rebase of '${featureBranch}' onto '${baseBranch}' encountered conflicts.${fileList}`, GitPrErrorCode.REBASE_CONFLICT, cause);
735
+ }
736
+ throw new GitPrError(`Rebase of '${featureBranch}' onto '${baseBranch}' failed: ${message}`, GitPrErrorCode.GIT_ERROR, cause);
737
+ }
738
+ }
739
+ async getConflictedFiles(cwd) {
740
+ try {
741
+ const { stdout } = await this.execFile('git', ['diff', '--name-only', '--diff-filter=U'], {
742
+ cwd,
743
+ });
744
+ return stdout
745
+ .trim()
746
+ .split('\n')
747
+ .filter((f) => f.length > 0)
748
+ .map((f) => f.replace(/\\/g, '/'));
749
+ }
750
+ catch (error) {
751
+ throw this.parseGitError(error);
752
+ }
753
+ }
754
+ async stageFiles(cwd, files) {
755
+ try {
756
+ await this.execFile('git', ['add', ...files], { cwd });
757
+ }
758
+ catch (error) {
759
+ throw this.parseGitError(error);
760
+ }
761
+ }
762
+ async rebaseContinue(cwd) {
763
+ try {
764
+ await this.execFile('git', ['rebase', '--continue'], {
765
+ cwd,
766
+ env: { ...process.env, GIT_EDITOR: 'true' },
767
+ });
768
+ }
769
+ catch (error) {
770
+ const message = error instanceof Error ? error.message : String(error);
771
+ const cause = error instanceof Error ? error : undefined;
772
+ if (message.includes('CONFLICT') || message.includes('could not apply')) {
773
+ throw new GitPrError(`Rebase continue encountered new conflicts: ${message}`, GitPrErrorCode.REBASE_CONFLICT, cause);
774
+ }
775
+ throw this.parseGitError(error);
776
+ }
777
+ }
778
+ async rebaseAbort(cwd) {
779
+ try {
780
+ await this.execFile('git', ['rebase', '--abort'], { cwd });
781
+ }
782
+ catch (error) {
783
+ throw this.parseGitError(error);
784
+ }
785
+ }
652
786
  };
653
787
  GitPrService = __decorate([
654
788
  injectable(),
@@ -1 +1 @@
1
- {"version":3,"file":"get-graph-data.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/web/app/(dashboard)/get-graph-data.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uCAAuC,CAAC;AAE5E,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAI1C,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B;AAwFD,MAAM,MAAM,aAAa,GACrB;IAAE,MAAM,EAAE,SAAS,CAAA;CAAE,GACrB;IAAE,MAAM,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,WAAW,CAAA;CAAE,GACtC;IAAE,MAAM,EAAE,YAAY,CAAA;CAAE,CAAC;AA6B7B,wBAAsB,YAAY,IAAI,OAAO,CAAC;IAAE,KAAK,EAAE,cAAc,EAAE,CAAC;IAAC,KAAK,EAAE,IAAI,EAAE,CAAA;CAAE,CAAC,CA6DxF"}
1
+ {"version":3,"file":"get-graph-data.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/web/app/(dashboard)/get-graph-data.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uCAAuC,CAAC;AAE5E,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAI1C,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B;AAiFD,MAAM,MAAM,aAAa,GACrB;IAAE,MAAM,EAAE,SAAS,CAAA;CAAE,GACrB;IAAE,MAAM,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,WAAW,CAAA;CAAE,GACtC;IAAE,MAAM,EAAE,YAAY,CAAA;CAAE,CAAC;AA6B7B,wBAAsB,YAAY,IAAI,OAAO,CAAC;IAAE,KAAK,EAAE,cAAc,EAAE,CAAC;IAAC,KAAK,EAAE,IAAI,EAAE,CAAA;CAAE,CAAC,CA6DxF"}
@@ -31,13 +31,7 @@ async function refreshRepoGitInfo(repo) {
31
31
  gitInfoCache.set(repo.path, { kind: 'not-a-repo', checkedAt: Date.now() });
32
32
  return;
33
33
  }
34
- const cached = gitInfoCache.get(repo.path);
35
- if (cached?.kind === 'repo' && cached.sha === headSha) {
36
- // HEAD unchanged — just bump checkedAt
37
- cached.checkedAt = Date.now();
38
- return;
39
- }
40
- // HEAD changed — fetch branch + subject & author in parallel
34
+ // Fetch branch + subject & author in parallel
41
35
  const [currentBranch, logLine] = await Promise.all([
42
36
  gitCommand(repo.path, ['symbolic-ref', '--short', 'HEAD']),
43
37
  gitCommand(repo.path, ['log', '-1', `--format=%s${FIELD_SEP}%an`]),
@@ -45,7 +39,8 @@ async function refreshRepoGitInfo(repo) {
45
39
  if (!currentBranch)
46
40
  return;
47
41
  const [commitMessage, committer] = (logLine ?? '').split(FIELD_SEP);
48
- // Behind count
42
+ // Behind count — always compute, even when on the default branch,
43
+ // because local main can be behind origin/main.
49
44
  let behindCount = null;
50
45
  const defaultBranchRef = await gitCommand(repo.path, [
51
46
  'symbolic-ref',
@@ -53,7 +48,8 @@ async function refreshRepoGitInfo(repo) {
53
48
  'refs/remotes/origin/HEAD',
54
49
  ]);
55
50
  const defaultBranch = defaultBranchRef?.replace('origin/', '') ?? null;
56
- if (defaultBranch && currentBranch !== defaultBranch) {
51
+ if (defaultBranch) {
52
+ // Compare current branch (or default branch itself) against origin
57
53
  const behind = await gitCommand(repo.path, [
58
54
  'rev-list',
59
55
  '--count',
@@ -63,9 +59,6 @@ async function refreshRepoGitInfo(repo) {
63
59
  if (isNaN(behindCount))
64
60
  behindCount = null;
65
61
  }
66
- else {
67
- behindCount = 0;
68
- }
69
62
  gitInfoCache.set(repo.path, {
70
63
  kind: 'repo',
71
64
  sha: headSha,
@@ -15,6 +15,7 @@ export interface PhaseTimingData {
15
15
  durationApiMs?: number;
16
16
  exitCode?: string;
17
17
  errorMessage?: string;
18
+ prompt?: string;
18
19
  }
19
20
  export interface RejectionFeedbackData {
20
21
  iteration: number;
@@ -1 +1 @@
1
- {"version":3,"file":"get-feature-phase-timings.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/web/app/actions/get-feature-phase-timings.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,eAAe;IAC9B,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,wBAAwB,CAAC,EAAE,MAAM,CAAC;IAClC,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,qBAAqB;IACpC,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;CACxB;AAED,KAAK,qBAAqB,GACtB;IAAE,OAAO,EAAE,eAAe,EAAE,CAAC;IAAC,iBAAiB,EAAE,qBAAqB,EAAE,CAAA;CAAE,GAC1E;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAEtB,wBAAsB,sBAAsB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,qBAAqB,CAAC,CAsC9F"}
1
+ {"version":3,"file":"get-feature-phase-timings.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/web/app/actions/get-feature-phase-timings.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,eAAe;IAC9B,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,wBAAwB,CAAC,EAAE,MAAM,CAAC;IAClC,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,qBAAqB;IACpC,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;CACxB;AAED,KAAK,qBAAqB,GACtB;IAAE,OAAO,EAAE,eAAe,EAAE,CAAC;IAAC,iBAAiB,EAAE,qBAAqB,EAAE,CAAA;CAAE,GAC1E;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAEtB,wBAAsB,sBAAsB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,qBAAqB,CAAC,CAuC9F"}
@@ -24,6 +24,7 @@ export async function getFeaturePhaseTimings(featureId) {
24
24
  durationApiMs: t.durationApiMs != null ? Number(t.durationApiMs) : undefined,
25
25
  exitCode: t.exitCode ?? undefined,
26
26
  errorMessage: t.errorMessage ?? undefined,
27
+ prompt: t.prompt ?? undefined,
27
28
  }));
28
29
  // Read rejection feedback from spec.yaml
29
30
  const rejectionFeedback = await readRejectionFeedback(featureId);
@@ -0,0 +1,5 @@
1
+ export declare function rebaseFeature(featureId: string): Promise<{
2
+ success: boolean;
3
+ error?: string;
4
+ }>;
5
+ //# sourceMappingURL=rebase-feature.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rebase-feature.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/web/app/actions/rebase-feature.ts"],"names":[],"mappings":"AAKA,wBAAsB,aAAa,CACjC,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAa/C"}
@@ -0,0 +1,16 @@
1
+ 'use server';
2
+ import { resolve } from '../../lib/server-container.js';
3
+ export async function rebaseFeature(featureId) {
4
+ if (!featureId?.trim()) {
5
+ return { success: false, error: 'Feature id is required' };
6
+ }
7
+ try {
8
+ const useCase = resolve('RebaseFeatureOnMainUseCase');
9
+ await useCase.execute(featureId);
10
+ return { success: true };
11
+ }
12
+ catch (error) {
13
+ const message = error instanceof Error ? error.message : 'Failed to rebase feature';
14
+ return { success: false, error: message };
15
+ }
16
+ }
@@ -0,0 +1,5 @@
1
+ export declare function syncRepository(repositoryId: string): Promise<{
2
+ success: boolean;
3
+ error?: string;
4
+ }>;
5
+ //# sourceMappingURL=sync-repository.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sync-repository.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/web/app/actions/sync-repository.ts"],"names":[],"mappings":"AAKA,wBAAsB,cAAc,CAClC,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAa/C"}
@@ -0,0 +1,16 @@
1
+ 'use server';
2
+ import { resolve } from '../../lib/server-container.js';
3
+ export async function syncRepository(repositoryId) {
4
+ if (!repositoryId?.trim()) {
5
+ return { success: false, error: 'Repository id is required' };
6
+ }
7
+ try {
8
+ const useCase = resolve('SyncRepositoryMainUseCase');
9
+ await useCase.execute(repositoryId);
10
+ return { success: true };
11
+ }
12
+ catch (error) {
13
+ const message = error instanceof Error ? error.message : 'Failed to sync repository';
14
+ return { success: false, error: message };
15
+ }
16
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"feature-drawer-client.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/control-center-drawer/feature-drawer-client.tsx"],"names":[],"mappings":"AAuCA,OAAO,KAAK,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAI/D,MAAM,WAAW,wBAAwB;IACvC,IAAI,EAAE,UAAU,CAAC;IACjB,8FAA8F;IAC9F,MAAM,CAAC,EAAE,aAAa,CAAC;CACxB;AAED,wBAAgB,mBAAmB,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,EAAE,wBAAwB,2CAskB1F"}
1
+ {"version":3,"file":"feature-drawer-client.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/control-center-drawer/feature-drawer-client.tsx"],"names":[],"mappings":"AAuCA,OAAO,KAAK,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAI/D,MAAM,WAAW,wBAAwB;IACvC,IAAI,EAAE,UAAU,CAAC;IACjB,8FAA8F;IAC9F,MAAM,CAAC,EAAE,aAAa,CAAC;CACxB;AAED,wBAAgB,mBAAmB,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,EAAE,wBAAwB,2CAkmB1F"}
@@ -113,6 +113,22 @@ export function FeatureDrawerClient({ view: initialView, urlTab }) {
113
113
  useEffect(() => {
114
114
  setChatInput('');
115
115
  }, [initialTab]);
116
+ // ── Artifact refresh key ─────────────────────────────────────────────
117
+ // Increments whenever state or lifecycle changes (via SSE or background sync),
118
+ // forcing useArtifactFetch to re-fetch even when the featureId stays the same.
119
+ // This fixes race conditions where the first fetch fires too early (e.g. merge
120
+ // data requested before the PR is created) and subsequent state updates don't
121
+ // trigger a re-fetch because the featureId dep hasn't changed.
122
+ const artifactRefreshKeyRef = useRef(0);
123
+ const prevStateRef = useRef(featureNode?.state);
124
+ const prevLifecycleRef = useRef(featureNode?.lifecycle);
125
+ if (featureNode?.state !== prevStateRef.current ||
126
+ featureNode?.lifecycle !== prevLifecycleRef.current) {
127
+ prevStateRef.current = featureNode?.state;
128
+ prevLifecycleRef.current = featureNode?.lifecycle;
129
+ artifactRefreshKeyRef.current += 1;
130
+ }
131
+ const artifactRefreshKey = artifactRefreshKeyRef.current;
116
132
  // ── Data fetching ─────────────────────────────────────────────────────
117
133
  const prdFeatureId = featureNode?.lifecycle === 'requirements' && featureNode?.state === 'action-required'
118
134
  ? featureNode.featureId
@@ -137,7 +153,7 @@ export function FeatureDrawerClient({ view: initialView, urlTab }) {
137
153
  setPrdSelections({});
138
154
  setPrdDefaultSelections({});
139
155
  setPrdData(null);
140
- }, 'Failed to load questionnaire');
156
+ }, 'Failed to load questionnaire', artifactRefreshKey);
141
157
  const techFeatureId = featureNode?.lifecycle === 'implementation' && featureNode?.state === 'action-required'
142
158
  ? featureNode.featureId
143
159
  : null;
@@ -148,11 +164,11 @@ export function FeatureDrawerClient({ view: initialView, urlTab }) {
148
164
  }
149
165
  if (result.techDecisions)
150
166
  setTechData(result.techDecisions);
151
- }, () => setTechData(null), 'Failed to load tech decisions');
167
+ }, () => setTechData(null), 'Failed to load tech decisions', artifactRefreshKey);
152
168
  const isLoadingTechProduct = useArtifactFetch(techFeatureId, getFeatureArtifact, (result) => {
153
169
  if (result.productDecisions)
154
170
  setTechProductData(result.productDecisions);
155
- }, () => setTechProductData(undefined));
171
+ }, () => setTechProductData(undefined), undefined, artifactRefreshKey);
156
172
  const mergeFeatureId = featureNode?.lifecycle === 'review' &&
157
173
  (featureNode?.state === 'action-required' || featureNode?.state === 'error')
158
174
  ? featureNode.featureId
@@ -163,7 +179,7 @@ export function FeatureDrawerClient({ view: initialView, urlTab }) {
163
179
  return;
164
180
  }
165
181
  setMergeData(result);
166
- }, () => setMergeData(null), 'Failed to load merge review data');
182
+ }, () => setMergeData(null), 'Failed to load merge review data', artifactRefreshKey);
167
183
  // ── Close guard ──────────────────────────────────────────────────────
168
184
  const isChatDirty = chatInput.trim().length > 0;
169
185
  const isPrdDirty = featureNode?.lifecycle === 'requirements' &&
@@ -303,6 +319,7 @@ export function FeatureDrawerClient({ view: initialView, urlTab }) {
303
319
  // ── Hooks (always called unconditionally per Rules of Hooks) ──────────
304
320
  const featureActionsInput = featureNode?.repositoryPath && featureNode?.branch
305
321
  ? {
322
+ featureId: featureNode.featureId,
306
323
  repositoryPath: featureNode.repositoryPath,
307
324
  branch: featureNode.branch,
308
325
  specPath: featureNode.specPath,
@@ -346,7 +363,7 @@ export function FeatureDrawerClient({ view: initialView, urlTab }) {
346
363
  ...(featureNode.state === 'error' && { onRetry: handleRetry }),
347
364
  ...(featureNode.state === 'pending' && { onStart: handleStart }),
348
365
  };
349
- body = (_jsx(FeatureDrawerTabs, { featureNode: enrichedNode, featureId: featureNode.featureId, initialTab: view.initialTab, urlTab: urlTab, sseEvents: events, prdData: prdData, prdSelections: prdSelections, onPrdSelect: (qId, oId) => setPrdSelections((prev) => ({ ...prev, [qId]: oId })), onPrdApprove: handlePrdApprove, onPrdReject: handlePrdReject, isPrdLoading: isLoadingPrd, techData: techData, onTechApprove: handleTechApprove, onTechReject: handleTechReject, isTechLoading: isLoadingTech, productData: isLoadingTechProduct ? null : techProductData, mergeData: mergeData, onMergeApprove: handleMergeApprove, onMergeReject: handleMergeReject, isMergeLoading: isLoadingMerge, isRejecting: isRejecting, chatInput: chatInput, onChatInputChange: setChatInput }));
366
+ body = (_jsx(FeatureDrawerTabs, { featureNode: enrichedNode, featureId: featureNode.featureId, initialTab: view.initialTab, urlTab: urlTab, sseEvents: events, prdData: prdData, prdSelections: prdSelections, onPrdSelect: (qId, oId) => setPrdSelections((prev) => ({ ...prev, [qId]: oId })), onPrdApprove: handlePrdApprove, onPrdReject: handlePrdReject, isPrdLoading: isLoadingPrd, techData: techData, onTechApprove: handleTechApprove, onTechReject: handleTechReject, isTechLoading: isLoadingTech, productData: isLoadingTechProduct ? null : techProductData, mergeData: mergeData, onMergeApprove: handleMergeApprove, onMergeReject: handleMergeReject, isMergeLoading: isLoadingMerge, onRebaseOnMain: featureFlags.gitRebaseSync ? featureActions.rebaseOnMain : undefined, rebaseLoading: featureActions.rebaseLoading, rebaseError: featureActions.rebaseError, isRejecting: isRejecting, chatInput: chatInput, onChatInputChange: setChatInput }));
350
367
  }
351
368
  return (_jsx(BaseDrawer, { open: isOpen, onClose: attemptClose, size: "md", modal: false, header: header, "data-testid": view.type === 'feature' ? 'feature-drawer' : 'repository-drawer', children: body }));
352
369
  }
@@ -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":"AAWA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,qCAAqC,CAAC;AAE9E,MAAM,WAAW,2BAA2B;IAC1C,IAAI,EAAE,kBAAkB,CAAC;CAC1B;AAED,wBAAgB,sBAAsB,CAAC,EAAE,IAAI,EAAE,EAAE,2BAA2B,2CAmF3E"}
1
+ {"version":3,"file":"repository-drawer-client.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/control-center-drawer/repository-drawer-client.tsx"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,qCAAqC,CAAC;AAE9E,MAAM,WAAW,2BAA2B;IAC1C,IAAI,EAAE,kBAAkB,CAAC;CAC1B;AAED,wBAAgB,sBAAsB,CAAC,EAAE,IAAI,EAAE,EAAE,2BAA2B,2CA2G3E"}
@@ -1,8 +1,8 @@
1
1
  'use client';
2
- import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
3
3
  import { useCallback } from 'react';
4
4
  import { useRouter, usePathname } from 'next/navigation';
5
- import { Code2, Terminal, FolderOpen } from 'lucide-react';
5
+ import { Code2, Terminal, FolderOpen, RefreshCw } from 'lucide-react';
6
6
  import { BaseDrawer } from '../../common/base-drawer/index.js';
7
7
  import { ActionButton } from '../../common/action-button/index.js';
8
8
  import { DrawerTitle, DrawerDescription } from '../../ui/drawer.js';
@@ -14,7 +14,7 @@ export function RepositoryDrawerClient({ data }) {
14
14
  const router = useRouter();
15
15
  const pathname = usePathname();
16
16
  const isOpen = pathname.startsWith('/repository/');
17
- const repoActions = useRepositoryActions(data.repositoryPath ? { repositoryPath: data.repositoryPath } : null);
17
+ const repoActions = useRepositoryActions(data.repositoryPath ? { repositoryId: data.id, repositoryPath: data.repositoryPath } : null);
18
18
  const onClose = useCallback(() => {
19
19
  router.push('/');
20
20
  }, [router]);
@@ -26,5 +26,5 @@ export function RepositoryDrawerClient({ data }) {
26
26
  }
27
27
  : undefined;
28
28
  const header = (_jsxs("div", { "data-testid": "repository-drawer-header", children: [_jsx(DrawerTitle, { children: data.name }), data.repositoryPath ? (_jsx(DrawerDescription, { className: "truncate font-mono text-xs", children: data.repositoryPath })) : null] }));
29
- return (_jsx(BaseDrawer, { open: isOpen, onClose: onClose, size: "md", modal: false, header: header, deployTarget: featureFlags.envDeploy ? repoDeployTarget : undefined, "data-testid": "repository-drawer", children: data.repositoryPath ? (_jsxs("div", { className: "flex-1 overflow-y-auto", children: [_jsx(Separator, {}), _jsxs("div", { className: "flex flex-col gap-3 p-4", children: [_jsx("div", { className: "text-muted-foreground text-xs font-semibold tracking-wider", children: "OPEN WITH" }), _jsxs("div", { className: "flex flex-col gap-2", children: [_jsx(ActionButton, { label: "Open in IDE", onClick: repoActions.openInIde, loading: repoActions.ideLoading, error: !!repoActions.ideError, icon: Code2, variant: "outline", size: "sm" }), _jsx(ActionButton, { label: "Open in Shell", onClick: repoActions.openInShell, loading: repoActions.shellLoading, error: !!repoActions.shellError, icon: Terminal, variant: "outline", size: "sm" }), _jsx(ActionButton, { label: "Open Folder", onClick: repoActions.openFolder, loading: repoActions.folderLoading, error: !!repoActions.folderError, icon: FolderOpen, variant: "outline", size: "sm" })] })] })] })) : null }));
29
+ return (_jsx(BaseDrawer, { open: isOpen, onClose: onClose, size: "md", modal: false, header: header, deployTarget: featureFlags.envDeploy ? repoDeployTarget : undefined, "data-testid": "repository-drawer", children: data.repositoryPath ? (_jsxs("div", { className: "flex-1 overflow-y-auto", children: [_jsx(Separator, {}), _jsxs("div", { className: "flex flex-col gap-3 p-4", children: [_jsx("div", { className: "text-muted-foreground text-xs font-semibold tracking-wider", children: "OPEN WITH" }), _jsxs("div", { className: "flex flex-col gap-2", children: [_jsx(ActionButton, { label: "Open in IDE", onClick: repoActions.openInIde, loading: repoActions.ideLoading, error: !!repoActions.ideError, icon: Code2, variant: "outline", size: "sm" }), _jsx(ActionButton, { label: "Open in Shell", onClick: repoActions.openInShell, loading: repoActions.shellLoading, error: !!repoActions.shellError, icon: Terminal, variant: "outline", size: "sm" }), _jsx(ActionButton, { label: "Open Folder", onClick: repoActions.openFolder, loading: repoActions.folderLoading, error: !!repoActions.folderError, icon: FolderOpen, variant: "outline", size: "sm" })] })] }), 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 }));
30
30
  }
@@ -7,7 +7,8 @@
7
7
  * @param onSuccess - Called with the fetch result when successful and not cancelled.
8
8
  * @param onReset - Called immediately when featureId changes (before fetching).
9
9
  * @param errorMessage - Optional toast message shown on fetch failure.
10
+ * @param refreshKey - Optional key that forces a re-fetch when it changes (even if featureId is the same).
10
11
  * @returns Whether the fetch is currently in progress.
11
12
  */
12
- export declare function useArtifactFetch<TResult>(featureId: string | null, fetcher: (id: string) => Promise<TResult>, onSuccess: (result: TResult) => void, onReset: () => void, errorMessage?: string): boolean;
13
+ export declare function useArtifactFetch<TResult>(featureId: string | null, fetcher: (id: string) => Promise<TResult>, onSuccess: (result: TResult) => void, onReset: () => void, errorMessage?: string, refreshKey?: number): boolean;
13
14
  //# sourceMappingURL=use-artifact-fetch.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"use-artifact-fetch.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/control-center-drawer/use-artifact-fetch.ts"],"names":[],"mappings":"AAKA;;;;;;;;;;GAUG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EACtC,SAAS,EAAE,MAAM,GAAG,IAAI,EACxB,OAAO,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,EACzC,SAAS,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,IAAI,EACpC,OAAO,EAAE,MAAM,IAAI,EACnB,YAAY,CAAC,EAAE,MAAM,GACpB,OAAO,CAiCT"}
1
+ {"version":3,"file":"use-artifact-fetch.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/control-center-drawer/use-artifact-fetch.ts"],"names":[],"mappings":"AAKA;;;;;;;;;;;GAWG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EACtC,SAAS,EAAE,MAAM,GAAG,IAAI,EACxB,OAAO,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,EACzC,SAAS,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,IAAI,EACpC,OAAO,EAAE,MAAM,IAAI,EACnB,YAAY,CAAC,EAAE,MAAM,EACrB,UAAU,CAAC,EAAE,MAAM,GAClB,OAAO,CAiCT"}
@@ -10,9 +10,10 @@ import { toast } from 'sonner';
10
10
  * @param onSuccess - Called with the fetch result when successful and not cancelled.
11
11
  * @param onReset - Called immediately when featureId changes (before fetching).
12
12
  * @param errorMessage - Optional toast message shown on fetch failure.
13
+ * @param refreshKey - Optional key that forces a re-fetch when it changes (even if featureId is the same).
13
14
  * @returns Whether the fetch is currently in progress.
14
15
  */
15
- export function useArtifactFetch(featureId, fetcher, onSuccess, onReset, errorMessage) {
16
+ export function useArtifactFetch(featureId, fetcher, onSuccess, onReset, errorMessage, refreshKey) {
16
17
  const [isLoading, setIsLoading] = useState(false);
17
18
  // Use refs to avoid stale callbacks in the effect without triggering re-runs.
18
19
  const onSuccessRef = useRef(onSuccess);
@@ -41,6 +42,6 @@ export function useArtifactFetch(featureId, fetcher, onSuccess, onReset, errorMe
41
42
  return () => {
42
43
  cancelled = true;
43
44
  };
44
- }, [featureId, fetcher, errorMessage]);
45
+ }, [featureId, fetcher, errorMessage, refreshKey]);
45
46
  return isLoading;
46
47
  }
@@ -1,4 +1,5 @@
1
1
  export interface FeatureActionsInput {
2
+ featureId: string;
2
3
  repositoryPath: string;
3
4
  branch: string;
4
5
  specPath?: string;
@@ -7,12 +8,15 @@ export interface FeatureActionsState {
7
8
  openInIde: () => Promise<void>;
8
9
  openInShell: () => Promise<void>;
9
10
  openSpecsFolder: () => Promise<void>;
11
+ rebaseOnMain: () => Promise<void>;
10
12
  ideLoading: boolean;
11
13
  shellLoading: boolean;
12
14
  specsLoading: boolean;
15
+ rebaseLoading: boolean;
13
16
  ideError: string | null;
14
17
  shellError: string | null;
15
18
  specsError: string | null;
19
+ rebaseError: string | null;
16
20
  }
17
21
  export declare function useFeatureActions(input: FeatureActionsInput | null): FeatureActionsState;
18
22
  //# sourceMappingURL=use-feature-actions.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"use-feature-actions.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/feature-drawer/use-feature-actions.ts"],"names":[],"mappings":"AAOA,MAAM,WAAW,mBAAmB;IAClC,cAAc,EAAE,MAAM,CAAC;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,mBAAmB;IAClC,SAAS,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/B,WAAW,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IACjC,eAAe,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IACrC,UAAU,EAAE,OAAO,CAAC;IACpB,YAAY,EAAE,OAAO,CAAC;IACtB,YAAY,EAAE,OAAO,CAAC;IACtB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B;AAID,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,mBAAmB,GAAG,IAAI,GAAG,mBAAmB,CA8GxF"}
1
+ {"version":3,"file":"use-feature-actions.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/feature-drawer/use-feature-actions.ts"],"names":[],"mappings":"AAQA,MAAM,WAAW,mBAAmB;IAClC,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,MAAM,CAAC;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,mBAAmB;IAClC,SAAS,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/B,WAAW,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IACjC,eAAe,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IACrC,YAAY,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAClC,UAAU,EAAE,OAAO,CAAC;IACpB,YAAY,EAAE,OAAO,CAAC;IACtB,YAAY,EAAE,OAAO,CAAC;IACtB,aAAa,EAAE,OAAO,CAAC;IACvB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B;AAID,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,mBAAmB,GAAG,IAAI,GAAG,mBAAmB,CA6IxF"}
@@ -3,21 +3,25 @@ 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 { rebaseFeature } from '../../../app/actions/rebase-feature.js';
6
7
  const ERROR_CLEAR_DELAY = 5000;
7
8
  export function useFeatureActions(input) {
8
9
  const [ideLoading, setIdeLoading] = useState(false);
9
10
  const [shellLoading, setShellLoading] = useState(false);
10
11
  const [specsLoading, setSpecsLoading] = useState(false);
12
+ const [rebaseLoading, setRebaseLoading] = useState(false);
11
13
  const [ideError, setIdeError] = useState(null);
12
14
  const [shellError, setShellError] = useState(null);
13
15
  const [specsError, setSpecsError] = useState(null);
16
+ const [rebaseError, setRebaseError] = useState(null);
14
17
  const ideTimerRef = useRef(null);
15
18
  const shellTimerRef = useRef(null);
16
19
  const specsTimerRef = useRef(null);
20
+ const rebaseTimerRef = useRef(null);
17
21
  // Clear timers on unmount — read .current inside cleanup so we get the
18
22
  // actual timer value at teardown time, not the always-null value at mount.
19
23
  useEffect(() => {
20
- const refs = [ideTimerRef, shellTimerRef, specsTimerRef];
24
+ const refs = [ideTimerRef, shellTimerRef, specsTimerRef, rebaseTimerRef];
21
25
  return () => {
22
26
  for (const ref of refs) {
23
27
  if (ref.current)
@@ -79,15 +83,42 @@ export function useFeatureActions(input) {
79
83
  setSpecsLoading(false);
80
84
  }
81
85
  }, [input, specsLoading]);
86
+ const handleRebaseOnMain = useCallback(async () => {
87
+ if (!input?.featureId || rebaseLoading)
88
+ return;
89
+ if (rebaseTimerRef.current)
90
+ clearTimeout(rebaseTimerRef.current);
91
+ setRebaseLoading(true);
92
+ setRebaseError(null);
93
+ try {
94
+ const result = await rebaseFeature(input.featureId);
95
+ if (!result.success) {
96
+ const errorMessage = result.error ?? 'An unexpected error occurred';
97
+ setRebaseError(errorMessage);
98
+ rebaseTimerRef.current = setTimeout(() => setRebaseError(null), ERROR_CLEAR_DELAY);
99
+ }
100
+ }
101
+ catch (err) {
102
+ const errorMessage = err instanceof Error ? err.message : 'An unexpected error occurred';
103
+ setRebaseError(errorMessage);
104
+ rebaseTimerRef.current = setTimeout(() => setRebaseError(null), ERROR_CLEAR_DELAY);
105
+ }
106
+ finally {
107
+ setRebaseLoading(false);
108
+ }
109
+ }, [input, rebaseLoading]);
82
110
  return {
83
111
  openInIde: handleOpenIde,
84
112
  openInShell: handleOpenShell,
85
113
  openSpecsFolder: handleOpenSpecsFolder,
114
+ rebaseOnMain: handleRebaseOnMain,
86
115
  ideLoading,
87
116
  shellLoading,
88
117
  specsLoading,
118
+ rebaseLoading,
89
119
  ideError,
90
120
  shellError,
91
121
  specsError,
122
+ rebaseError,
92
123
  };
93
124
  }
@@ -1 +1 @@
1
- {"version":3,"file":"activity-tab.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/feature-drawer-tabs/activity-tab.tsx"],"names":[],"mappings":"AAoBA,OAAO,KAAK,EACV,eAAe,EACf,qBAAqB,EACtB,MAAM,yCAAyC,CAAC;AAmEjD,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,eAAe,EAAE,GAAG,IAAI,CAAC;IAClC,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,iBAAiB,CAAC,EAAE,qBAAqB,EAAE,CAAC;CAC7C;AAmED;;;;;;;GAOG;AACH,MAAM,WAAW,iBAAiB;IAChC,+BAA+B;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,0CAA0C;IAC1C,OAAO,EAAE,eAAe,EAAE,CAAC;IAC3B,mEAAmE;IACnE,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,8DAA8D;IAC9D,oBAAoB,CAAC,EAAE,MAAM,EAAE,CAAC;CACjC;AAED;;;;;;;;;GASG;AACH,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,eAAe,EAAE,EAC1B,QAAQ,CAAC,EAAE,qBAAqB,EAAE,GACjC,iBAAiB,EAAE,CAgErB;AA6BD,wBAAgB,WAAW,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,iBAAiB,EAAE,EAAE,gBAAgB,2CAqE3F"}
1
+ {"version":3,"file":"activity-tab.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/feature-drawer-tabs/activity-tab.tsx"],"names":[],"mappings":"AAsBA,OAAO,KAAK,EACV,eAAe,EACf,qBAAqB,EACtB,MAAM,yCAAyC,CAAC;AAmEjD,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,eAAe,EAAE,GAAG,IAAI,CAAC;IAClC,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,iBAAiB,CAAC,EAAE,qBAAqB,EAAE,CAAC;CAC7C;AAuED;;;;;;;GAOG;AACH,MAAM,WAAW,iBAAiB;IAChC,+BAA+B;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,0CAA0C;IAC1C,OAAO,EAAE,eAAe,EAAE,CAAC;IAC3B,mEAAmE;IACnE,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,8DAA8D;IAC9D,oBAAoB,CAAC,EAAE,MAAM,EAAE,CAAC;CACjC;AAED;;;;;;;;;GASG;AACH,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,eAAe,EAAE,EAC1B,QAAQ,CAAC,EAAE,qBAAqB,EAAE,GACjC,iBAAiB,EAAE,CAgErB;AA6BD,wBAAgB,WAAW,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,iBAAiB,EAAE,EAAE,gBAAgB,2CAqE3F"}