@shepai/cli 1.117.0-pr377.9e8e17c → 1.117.0-pr378.ba81704

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 (189) hide show
  1. package/dist/src/presentation/web/components/common/feature-drawer-tabs/feature-drawer-tabs.d.ts.map +1 -1
  2. package/dist/src/presentation/web/components/common/feature-drawer-tabs/feature-drawer-tabs.js +7 -2
  3. package/dist/src/presentation/web/components/common/merge-review/diff-view.d.ts.map +1 -1
  4. package/dist/src/presentation/web/components/common/merge-review/diff-view.js +8 -166
  5. package/dist/src/presentation/web/components/common/merge-review/merge-review-config.d.ts +2 -0
  6. package/dist/src/presentation/web/components/common/merge-review/merge-review-config.d.ts.map +1 -1
  7. package/dist/src/presentation/web/components/common/merge-review/merge-review.d.ts +1 -1
  8. package/dist/src/presentation/web/components/common/merge-review/merge-review.d.ts.map +1 -1
  9. package/dist/src/presentation/web/components/common/merge-review/merge-review.js +6 -4
  10. package/dist/src/presentation/web/components/common/merge-review/merge-review.stories.d.ts +6 -0
  11. package/dist/src/presentation/web/components/common/merge-review/merge-review.stories.d.ts.map +1 -1
  12. package/dist/src/presentation/web/components/common/merge-review/merge-review.stories.js +74 -0
  13. package/dist/tsconfig.build.tsbuildinfo +1 -1
  14. package/package.json +1 -1
  15. package/web/.next/BUILD_ID +1 -1
  16. package/web/.next/build-manifest.json +2 -2
  17. package/web/.next/fallback-build-manifest.json +2 -2
  18. package/web/.next/prerender-manifest.json +3 -3
  19. package/web/.next/required-server-files.js +1 -1
  20. package/web/.next/required-server-files.json +1 -1
  21. package/web/.next/server/app/(dashboard)/@drawer/create/page/server-reference-manifest.json +21 -21
  22. package/web/.next/server/app/(dashboard)/@drawer/create/page.js.nft.json +1 -1
  23. package/web/.next/server/app/(dashboard)/@drawer/create/page_client-reference-manifest.js +1 -1
  24. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page/server-reference-manifest.json +27 -27
  25. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page.js.nft.json +1 -1
  26. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page_client-reference-manifest.js +1 -1
  27. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page/server-reference-manifest.json +27 -27
  28. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js.nft.json +1 -1
  29. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page_client-reference-manifest.js +1 -1
  30. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page/server-reference-manifest.json +19 -19
  31. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js.nft.json +1 -1
  32. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  33. package/web/.next/server/app/(dashboard)/create/page/server-reference-manifest.json +21 -21
  34. package/web/.next/server/app/(dashboard)/create/page.js.nft.json +1 -1
  35. package/web/.next/server/app/(dashboard)/create/page_client-reference-manifest.js +1 -1
  36. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page/server-reference-manifest.json +27 -27
  37. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page.js.nft.json +1 -1
  38. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page_client-reference-manifest.js +1 -1
  39. package/web/.next/server/app/(dashboard)/feature/[featureId]/page/server-reference-manifest.json +27 -27
  40. package/web/.next/server/app/(dashboard)/feature/[featureId]/page.js.nft.json +1 -1
  41. package/web/.next/server/app/(dashboard)/feature/[featureId]/page_client-reference-manifest.js +1 -1
  42. package/web/.next/server/app/(dashboard)/page/server-reference-manifest.json +19 -19
  43. package/web/.next/server/app/(dashboard)/page.js.nft.json +1 -1
  44. package/web/.next/server/app/(dashboard)/page_client-reference-manifest.js +1 -1
  45. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page/server-reference-manifest.json +19 -19
  46. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js.nft.json +1 -1
  47. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  48. package/web/.next/server/app/_global-error.html +2 -2
  49. package/web/.next/server/app/_global-error.rsc +1 -1
  50. package/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  51. package/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  52. package/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  53. package/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  54. package/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  55. package/web/.next/server/app/_not-found/page/server-reference-manifest.json +1 -1
  56. package/web/.next/server/app/_not-found/page.js.nft.json +1 -1
  57. package/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  58. package/web/.next/server/app/api/attachments/preview/route.js.nft.json +1 -1
  59. package/web/.next/server/app/api/evidence/route.js.nft.json +1 -1
  60. package/web/.next/server/app/settings/page/server-reference-manifest.json +5 -5
  61. package/web/.next/server/app/settings/page.js.nft.json +1 -1
  62. package/web/.next/server/app/settings/page_client-reference-manifest.js +1 -1
  63. package/web/.next/server/app/skills/page/server-reference-manifest.json +6 -6
  64. package/web/.next/server/app/skills/page.js.nft.json +1 -1
  65. package/web/.next/server/app/skills/page_client-reference-manifest.js +1 -1
  66. package/web/.next/server/app/tools/page/server-reference-manifest.json +6 -6
  67. package/web/.next/server/app/tools/page.js.nft.json +1 -1
  68. package/web/.next/server/app/tools/page_client-reference-manifest.js +1 -1
  69. package/web/.next/server/app/version/page/server-reference-manifest.json +1 -1
  70. package/web/.next/server/app/version/page.js.nft.json +1 -1
  71. package/web/.next/server/app/version/page_client-reference-manifest.js +1 -1
  72. package/web/.next/server/chunks/[root-of-the-server]__a402b567._.js +1 -1
  73. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js +1 -1
  74. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js.map +1 -1
  75. package/web/.next/server/chunks/ssr/7f428_lucide-react_dist_esm_icons_d0119342._.js +3 -0
  76. package/web/.next/server/chunks/ssr/7f428_lucide-react_dist_esm_icons_d0119342._.js.map +1 -0
  77. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_ed372306.js +1 -1
  78. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_ed372306.js.map +1 -1
  79. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_32e26434.js +1 -1
  80. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_32e26434.js.map +1 -1
  81. package/web/.next/server/chunks/ssr/[root-of-the-server]__07a39ff2._.js +1 -1
  82. package/web/.next/server/chunks/ssr/[root-of-the-server]__11033878._.js +1 -1
  83. package/web/.next/server/chunks/ssr/[root-of-the-server]__11033878._.js.map +1 -1
  84. package/web/.next/server/chunks/ssr/[root-of-the-server]__172d9576._.js +1 -1
  85. package/web/.next/server/chunks/ssr/[root-of-the-server]__172d9576._.js.map +1 -1
  86. package/web/.next/server/chunks/ssr/[root-of-the-server]__24dd0927._.js +2 -2
  87. package/web/.next/server/chunks/ssr/[root-of-the-server]__2a5592d5._.js +1 -1
  88. package/web/.next/server/chunks/ssr/[root-of-the-server]__2a5592d5._.js.map +1 -1
  89. package/web/.next/server/chunks/ssr/[root-of-the-server]__5d87af2e._.js +1 -1
  90. package/web/.next/server/chunks/ssr/[root-of-the-server]__6367aea0._.js +3 -0
  91. package/web/.next/server/chunks/ssr/[root-of-the-server]__6367aea0._.js.map +1 -0
  92. package/web/.next/server/chunks/ssr/[root-of-the-server]__89e8a5cc._.js +2 -2
  93. package/web/.next/server/chunks/ssr/[root-of-the-server]__a93289b0._.js +1 -1
  94. package/web/.next/server/chunks/ssr/[root-of-the-server]__a93289b0._.js.map +1 -1
  95. package/web/.next/server/chunks/ssr/[root-of-the-server]__aad040c0._.js +4 -0
  96. package/web/.next/server/chunks/ssr/[root-of-the-server]__aad040c0._.js.map +1 -0
  97. package/web/.next/server/chunks/ssr/[root-of-the-server]__ac0304e7._.js +1 -1
  98. package/web/.next/server/chunks/ssr/[root-of-the-server]__ac0304e7._.js.map +1 -1
  99. package/web/.next/server/chunks/ssr/[root-of-the-server]__b1e68e34._.js +3 -0
  100. package/web/.next/server/chunks/ssr/[root-of-the-server]__b1e68e34._.js.map +1 -0
  101. package/web/.next/server/chunks/ssr/[root-of-the-server]__fdc75809._.js +1 -1
  102. package/web/.next/server/chunks/ssr/[root-of-the-server]__fdc75809._.js.map +1 -1
  103. package/web/.next/server/chunks/ssr/_135edb9c._.js +1 -1
  104. package/web/.next/server/chunks/ssr/_135edb9c._.js.map +1 -1
  105. package/web/.next/server/chunks/ssr/{_c5e12a69._.js → _524b38a3._.js} +2 -2
  106. package/web/.next/server/chunks/ssr/{_c5e12a69._.js.map → _524b38a3._.js.map} +1 -1
  107. package/web/.next/server/chunks/ssr/_6d26a08f._.js +1 -1
  108. package/web/.next/server/chunks/ssr/_6d26a08f._.js.map +1 -1
  109. package/web/.next/server/chunks/ssr/_8dacd1e7._.js +1 -1
  110. package/web/.next/server/chunks/ssr/_8dacd1e7._.js.map +1 -1
  111. package/web/.next/server/chunks/ssr/{_aef4036f._.js → _91f6d758._.js} +2 -2
  112. package/web/.next/server/chunks/ssr/{_aef4036f._.js.map → _91f6d758._.js.map} +1 -1
  113. package/web/.next/server/chunks/ssr/{_786e1f56._.js → _9e49abaa._.js} +2 -2
  114. package/web/.next/server/chunks/ssr/{_786e1f56._.js.map → _9e49abaa._.js.map} +1 -1
  115. package/web/.next/server/chunks/ssr/_cc77a143._.js +1 -1
  116. package/web/.next/server/chunks/ssr/_cc77a143._.js.map +1 -1
  117. package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_settings_settings-page-client_tsx_6ed9d5f8._.js +1 -1
  118. package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_settings_settings-page-client_tsx_6ed9d5f8._.js.map +1 -1
  119. package/web/.next/server/chunks/ssr/src_presentation_web_0835b28e._.js +2 -2
  120. package/web/.next/server/chunks/ssr/src_presentation_web_0835b28e._.js.map +1 -1
  121. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_e99d78dd.js +1 -1
  122. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_e99d78dd.js.map +1 -1
  123. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_skills_page_actions_1fa8042e.js +1 -1
  124. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_skills_page_actions_1fa8042e.js.map +1 -1
  125. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_tools_page_actions_24684200.js +1 -1
  126. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_tools_page_actions_24684200.js.map +1 -1
  127. package/web/.next/server/chunks/ssr/src_presentation_web_components_bf50c527._.js +1 -1
  128. package/web/.next/server/chunks/ssr/src_presentation_web_components_bf50c527._.js.map +1 -1
  129. package/web/.next/server/chunks/ssr/src_presentation_web_components_de814675._.js +1 -1
  130. package/web/.next/server/chunks/ssr/src_presentation_web_components_de814675._.js.map +1 -1
  131. package/web/.next/server/chunks/ssr/src_presentation_web_components_e599bb8c._.js +1 -1
  132. package/web/.next/server/chunks/ssr/src_presentation_web_components_e599bb8c._.js.map +1 -1
  133. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js +1 -1
  134. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js.map +1 -1
  135. package/web/.next/server/chunks/ssr/src_presentation_web_e8034a29._.js +2 -2
  136. package/web/.next/server/chunks/ssr/src_presentation_web_e8034a29._.js.map +1 -1
  137. package/web/.next/server/pages/500.html +2 -2
  138. package/web/.next/server/server-reference-manifest.js +1 -1
  139. package/web/.next/server/server-reference-manifest.json +32 -32
  140. package/web/.next/static/chunks/{2f750d537c3f7e31.js → 1729fe2ac1a8df22.js} +1 -1
  141. package/web/.next/static/chunks/303a1217006489b9.js +1 -0
  142. package/web/.next/static/chunks/3dc5abcd1187cd47.js +1 -0
  143. package/web/.next/static/chunks/3e47d1e571a82b7c.js +1 -0
  144. package/web/.next/static/chunks/{98af7ce84b9623c5.js → 46b623a4a941c63c.js} +1 -1
  145. package/web/.next/static/chunks/5a64ee5d82790de1.js +2 -0
  146. package/web/.next/static/chunks/{37a9d60101fcd7ae.js → 60a563f3e9bf8586.js} +1 -1
  147. package/web/.next/static/chunks/619af41a8d3232e5.js +1 -0
  148. package/web/.next/static/chunks/62a8173911f8f130.css +1 -0
  149. package/web/.next/static/chunks/b1f3c0e8e9872ef8.js +1 -0
  150. package/web/.next/static/chunks/bfa2e6f36f5a66e5.js +1 -0
  151. package/web/.next/static/chunks/{5382c19c5dff93e5.js → ce670d8f4a90eade.js} +1 -1
  152. package/web/.next/static/chunks/{d3fb12295262040f.js → d9078c8963172d03.js} +1 -1
  153. package/web/.next/static/chunks/f47c8ea3cfe6a43a.js +11 -0
  154. package/web/package.json +1 -3
  155. package/dist/src/presentation/web/components/ui/code-block.d.ts +0 -36
  156. package/dist/src/presentation/web/components/ui/code-block.d.ts.map +0 -1
  157. package/dist/src/presentation/web/components/ui/code-block.js +0 -103
  158. package/dist/src/presentation/web/components/ui/code-block.stories.d.ts +0 -16
  159. package/dist/src/presentation/web/components/ui/code-block.stories.d.ts.map +0 -1
  160. package/dist/src/presentation/web/components/ui/code-block.stories.js +0 -145
  161. package/dist/src/presentation/web/components/ui/file-tree.d.ts +0 -53
  162. package/dist/src/presentation/web/components/ui/file-tree.d.ts.map +0 -1
  163. package/dist/src/presentation/web/components/ui/file-tree.js +0 -185
  164. package/dist/src/presentation/web/components/ui/file-tree.stories.d.ts +0 -14
  165. package/dist/src/presentation/web/components/ui/file-tree.stories.d.ts.map +0 -1
  166. package/dist/src/presentation/web/components/ui/file-tree.stories.js +0 -84
  167. package/web/.next/server/chunks/ssr/[root-of-the-server]__0d4580d1._.js +0 -4
  168. package/web/.next/server/chunks/ssr/[root-of-the-server]__0d4580d1._.js.map +0 -1
  169. package/web/.next/server/chunks/ssr/[root-of-the-server]__98470b18._.js +0 -3
  170. package/web/.next/server/chunks/ssr/[root-of-the-server]__98470b18._.js.map +0 -1
  171. package/web/.next/server/chunks/ssr/[root-of-the-server]__ea2e0b1c._.js +0 -3
  172. package/web/.next/server/chunks/ssr/[root-of-the-server]__ea2e0b1c._.js.map +0 -1
  173. package/web/.next/server/chunks/ssr/_009a242e._.js +0 -3
  174. package/web/.next/server/chunks/ssr/_009a242e._.js.map +0 -1
  175. package/web/.next/server/chunks/ssr/src_presentation_web_components_ui_scroll-area_tsx_53ae5be7._.js +0 -3
  176. package/web/.next/server/chunks/ssr/src_presentation_web_components_ui_scroll-area_tsx_53ae5be7._.js.map +0 -1
  177. package/web/.next/static/chunks/16ac819e75bae3d0.js +0 -1
  178. package/web/.next/static/chunks/26bf91fe491accce.js +0 -1
  179. package/web/.next/static/chunks/3d673546d066ba0a.js +0 -11
  180. package/web/.next/static/chunks/4943e3f713ca59b9.js +0 -1
  181. package/web/.next/static/chunks/60108fd0bf8db1b0.js +0 -1
  182. package/web/.next/static/chunks/69a1e15358d875cc.css +0 -1
  183. package/web/.next/static/chunks/c0c8a062afe141ed.js +0 -1
  184. package/web/.next/static/chunks/d59479021791a7c1.js +0 -1
  185. package/web/.next/static/chunks/db91e49ac07fb578.js +0 -2
  186. package/web/.next/static/chunks/eddc1cdee17c30ef.js +0 -1
  187. /package/web/.next/static/{fBX3qEmi-temIllSxz1uu → Pv25YwqnApbBYI6OTQk3G}/_buildManifest.js +0 -0
  188. /package/web/.next/static/{fBX3qEmi-temIllSxz1uu → Pv25YwqnApbBYI6OTQk3G}/_clientMiddlewareManifest.json +0 -0
  189. /package/web/.next/static/{fBX3qEmi-temIllSxz1uu → Pv25YwqnApbBYI6OTQk3G}/_ssgManifest.js +0 -0
@@ -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;AA2C3F,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,2CA2TxB"}
1
+ {"version":3,"file":"feature-drawer-tabs.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/feature-drawer-tabs/feature-drawer-tabs.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,sCAAsC,CAAC;AAS9E,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AACxE,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,uCAAuC,CAAC;AAClF,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,2CAA2C,CAAC;AACzF,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,+CAA+C,CAAC;AACjG,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AAMxE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uCAAuC,CAAC;AAQ9E,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uDAAuD,CAAC;AA8C3F,MAAM,WAAW,sBAAsB;IACrC,WAAW,EAAE,eAAe,CAAC;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,aAAa,CAAC;IAC3B,gFAAgF;IAChF,MAAM,CAAC,EAAE,aAAa,CAAC;IACvB,mFAAmF;IACnF,SAAS,CAAC,EAAE,SAAS,iBAAiB,EAAE,CAAC;IAGzC,OAAO,CAAC,EAAE,oBAAoB,GAAG,IAAI,CAAC;IACtC,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACvC,WAAW,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;IAC7D,YAAY,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;IAC1C,WAAW,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,gBAAgB,EAAE,KAAK,IAAI,CAAC;IAC1E,YAAY,CAAC,EAAE,OAAO,CAAC;IAGvB,QAAQ,CAAC,EAAE,uBAAuB,GAAG,IAAI,CAAC;IAC1C,aAAa,CAAC,EAAE,MAAM,IAAI,CAAC;IAC3B,YAAY,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,gBAAgB,EAAE,KAAK,IAAI,CAAC;IAC3E,aAAa,CAAC,EAAE,OAAO,CAAC;IAGxB,WAAW,CAAC,EAAE,2BAA2B,GAAG,IAAI,CAAC;IAGjD,SAAS,CAAC,EAAE,eAAe,GAAG,IAAI,CAAC;IACnC,cAAc,CAAC,EAAE,MAAM,IAAI,CAAC;IAC5B,aAAa,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,gBAAgB,EAAE,KAAK,IAAI,CAAC;IAC5E,cAAc,CAAC,EAAE,OAAO,CAAC;IAGzB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,iBAAiB,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;CAC7C;AAwBD,wBAAgB,iBAAiB,CAAC,EAChC,WAAW,EACX,SAAS,EACT,UAAU,EACV,MAAM,EACN,OAAO,EACP,aAAa,EACb,WAAW,EACX,YAAY,EACZ,WAAW,EACX,YAAY,EACZ,QAAQ,EACR,aAAa,EACb,YAAY,EACZ,aAAa,EACb,WAAW,EACX,SAAS,EACT,cAAc,EACd,aAAa,EACb,cAAc,EACd,WAAW,EACX,SAAS,EACT,iBAAiB,EACjB,SAAS,GACV,EAAE,sBAAsB,2CAiUxB"}
@@ -43,6 +43,9 @@ function computeVisibleTabs(node) {
43
43
  if (node.lifecycle === 'review' && (node.state === 'action-required' || node.state === 'error')) {
44
44
  tabs.push('merge-review');
45
45
  }
46
+ if (node.lifecycle === 'maintain' && node.pr) {
47
+ tabs.push('merge-review');
48
+ }
46
49
  return tabs;
47
50
  }
48
51
  async function fetchActivity(featureId) {
@@ -64,7 +67,9 @@ const TAB_FETCHERS = {
64
67
  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, }) {
65
68
  const pathname = usePathname();
66
69
  const visibleTabs = useMemo(() => computeVisibleTabs(featureNode), [featureNode]);
67
- const visibleTabDefs = useMemo(() => ALL_TABS.filter((t) => visibleTabs.includes(t.key)), [visibleTabs]);
70
+ const visibleTabDefs = useMemo(() => ALL_TABS.filter((t) => visibleTabs.includes(t.key)).map((t) => t.key === 'merge-review' && featureNode.lifecycle === 'maintain'
71
+ ? { ...t, label: 'Merge History' }
72
+ : t), [visibleTabs, featureNode.lifecycle]);
68
73
  // Derive the base path (without tab segment) from the current pathname.
69
74
  // e.g. /feature/abc123/activity → /feature/abc123
70
75
  const basePath = useMemo(() => {
@@ -223,7 +228,7 @@ export function FeatureDrawerTabs({ featureNode, featureId, initialTab, urlTab,
223
228
  fetchTab(tab);
224
229
  }
225
230
  }, [fetchTab]);
226
- 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, 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] }) }));
231
+ 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] }) }));
227
232
  }
228
233
  // ── Private helper ──────────────────────────────────────────────────────
229
234
  function DrawerActionBarForTech({ onApprove, onReject, isProcessing, isRejecting, chatInput, onChatInputChange, }) {
@@ -1 +1 @@
1
- {"version":3,"file":"diff-view.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/merge-review/diff-view.tsx"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAmPjE,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,mBAAmB,EAAE,CAAC;CAClC;AAED,wBAAgB,QAAQ,CAAC,EAAE,SAAS,EAAE,EAAE,aAAa,kDAmFpD"}
1
+ {"version":3,"file":"diff-view.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/merge-review/diff-view.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,mBAAmB,EAAuB,MAAM,uBAAuB,CAAC;AA4GtF,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,mBAAmB,EAAE,CAAC;CAClC;AAED,wBAAgB,QAAQ,CAAC,EAAE,SAAS,EAAE,EAAE,aAAa,kDAmBpD"}
@@ -1,55 +1,8 @@
1
1
  'use client';
2
2
  import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
3
- import { useState, useRef, useCallback, useMemo } from 'react';
4
- import { FilePlus, FileMinus, FileEdit, FileText, ChevronDown, ChevronRight } from 'lucide-react';
3
+ import { useState } from 'react';
4
+ import { ChevronRight, FileText, FilePlus, FileMinus, FileEdit } from 'lucide-react';
5
5
  import { cn } from '../../../lib/utils.js';
6
- import { CollapseButton, File, Folder, Tree, } from '../../ui/file-tree.js';
7
- import { DiffCodeBlock } from '../../ui/code-block.js';
8
- /* ─── Language detection from file extension ─── */
9
- const EXT_TO_LANGUAGE = {
10
- '.ts': 'typescript',
11
- '.tsx': 'tsx',
12
- '.js': 'javascript',
13
- '.jsx': 'jsx',
14
- '.mjs': 'javascript',
15
- '.cjs': 'javascript',
16
- '.json': 'json',
17
- '.css': 'css',
18
- '.scss': 'scss',
19
- '.html': 'markup',
20
- '.xml': 'markup',
21
- '.svg': 'markup',
22
- '.md': 'markdown',
23
- '.mdx': 'markdown',
24
- '.py': 'python',
25
- '.rb': 'ruby',
26
- '.go': 'go',
27
- '.rs': 'rust',
28
- '.java': 'java',
29
- '.kt': 'kotlin',
30
- '.swift': 'swift',
31
- '.sh': 'bash',
32
- '.bash': 'bash',
33
- '.zsh': 'bash',
34
- '.yml': 'yaml',
35
- '.yaml': 'yaml',
36
- '.toml': 'toml',
37
- '.sql': 'sql',
38
- '.graphql': 'graphql',
39
- '.gql': 'graphql',
40
- '.dockerfile': 'docker',
41
- '.tsp': 'typescript',
42
- };
43
- function getLanguageFromPath(path) {
44
- const ext = path.includes('.') ? `.${path.split('.').pop()?.toLowerCase()}` : '';
45
- const basename = path.split('/').pop()?.toLowerCase() ?? '';
46
- if (basename === 'dockerfile')
47
- return 'docker';
48
- if (basename === 'makefile')
49
- return 'makefile';
50
- return EXT_TO_LANGUAGE[ext] ?? 'text';
51
- }
52
- /* ─── Status config ─── */
53
6
  const STATUS_CONFIG = {
54
7
  added: { icon: FilePlus, label: 'A', className: 'text-green-600' },
55
8
  modified: { icon: FileEdit, label: 'M', className: 'text-amber-600' },
@@ -61,128 +14,17 @@ function FileStatusIcon({ status }) {
61
14
  const Icon = config.icon;
62
15
  return _jsx(Icon, { className: cn('h-3.5 w-3.5 shrink-0', config.className) });
63
16
  }
64
- function buildFileTree(files) {
65
- const root = { name: '', fullPath: '', children: new Map(), isFile: false };
66
- for (const file of files) {
67
- const parts = file.path.split('/');
68
- let current = root;
69
- for (let i = 0; i < parts.length; i++) {
70
- const part = parts[i];
71
- const isLast = i === parts.length - 1;
72
- if (!current.children.has(part)) {
73
- current.children.set(part, {
74
- name: part,
75
- fullPath: parts.slice(0, i + 1).join('/'),
76
- children: new Map(),
77
- isFile: isLast,
78
- });
79
- }
80
- current = current.children.get(part);
81
- if (isLast) {
82
- current.isFile = true;
83
- }
84
- }
85
- }
86
- function toTreeElements(node) {
87
- const entries = Array.from(node.children.values());
88
- // Sort: folders first, then files, both alphabetical
89
- entries.sort((a, b) => {
90
- if (a.isFile !== b.isFile)
91
- return a.isFile ? 1 : -1;
92
- return a.name.localeCompare(b.name);
93
- });
94
- return entries.map((entry) => ({
95
- id: entry.fullPath,
96
- name: entry.name,
97
- isSelectable: true,
98
- children: entry.children.size > 0 ? toTreeElements(entry) : undefined,
99
- }));
100
- }
101
- // Collapse single-child directories (e.g. "src/components" instead of "src" > "components")
102
- function collapse(elements) {
103
- return elements.map((el) => {
104
- if (el.children?.length === 1 && el.children[0].children) {
105
- const child = el.children[0];
106
- return collapse([
107
- {
108
- ...child,
109
- id: child.id,
110
- name: `${el.name}/${child.name}`,
111
- },
112
- ])[0];
113
- }
114
- return {
115
- ...el,
116
- children: el.children ? collapse(el.children) : undefined,
117
- };
118
- });
119
- }
120
- return collapse(toTreeElements(root));
17
+ function HunkView({ hunk }) {
18
+ return (_jsxs("div", { className: "border-border border-t first:border-t-0", children: [_jsx("div", { className: "bg-muted/50 text-muted-foreground px-3 py-1 font-mono text-[10px]", children: hunk.header }), _jsx("div", { className: "font-mono text-[11px] leading-[18px]", children: hunk.lines.map((line) => (_jsxs("div", { className: cn('flex', line.type === 'added' && 'bg-green-50 dark:bg-green-950/30', line.type === 'removed' && 'bg-red-50 dark:bg-red-950/30'), children: [_jsx("span", { className: "text-muted-foreground w-10 shrink-0 px-1 text-right text-[10px] select-none", children: line.oldNumber ?? '' }), _jsx("span", { className: "text-muted-foreground w-10 shrink-0 px-1 text-right text-[10px] select-none", children: line.newNumber ?? '' }), _jsx("span", { className: cn('w-4 shrink-0 text-center select-none', line.type === 'added' && 'text-green-700 dark:text-green-400', line.type === 'removed' && 'text-red-700 dark:text-red-400'), children: line.type === 'added' ? '+' : line.type === 'removed' ? '-' : ' ' }), _jsx("span", { className: "min-w-0 flex-1 pr-2 break-all whitespace-pre-wrap", children: line.content })] }, `${line.type}-${line.oldNumber ?? ''}-${line.newNumber ?? ''}`))) })] }));
121
19
  }
122
- function getAllIds(elements) {
123
- const ids = [];
124
- for (const el of elements) {
125
- ids.push(el.id);
126
- if (el.children) {
127
- ids.push(...getAllIds(el.children));
128
- }
129
- }
130
- return ids;
131
- }
132
- /* ─── File diff card with collapsible DiffCodeBlock ─── */
133
- function FileDiffCard({ file, isExpanded, onToggle, innerRef, }) {
20
+ function FileDiffItem({ file }) {
21
+ const [isOpen, setIsOpen] = useState(false);
134
22
  const fileName = file.path.split('/').pop() ?? file.path;
135
23
  const dirPath = file.path.includes('/') ? file.path.slice(0, file.path.lastIndexOf('/')) : '';
136
- const language = getLanguageFromPath(file.path);
137
- return (_jsxs("div", { ref: innerRef, className: "border-border border-b last:border-b-0", children: [_jsxs("button", { type: "button", onClick: onToggle, className: "hover:bg-muted/50 flex w-full items-center gap-2 px-3 py-2 text-left", children: [isExpanded ? (_jsx(ChevronDown, { className: "text-muted-foreground h-3 w-3 shrink-0" })) : (_jsx(ChevronRight, { className: "text-muted-foreground h-3 w-3 shrink-0 transition-transform duration-150" })), _jsx(FileStatusIcon, { status: file.status }), _jsx("span", { className: "text-foreground min-w-0 flex-1 truncate font-mono text-xs", children: dirPath ? (_jsxs(_Fragment, { children: [_jsxs("span", { className: "text-muted-foreground", children: [dirPath, "/"] }), fileName] })) : (fileName) }), file.oldPath ? (_jsxs("span", { className: "text-muted-foreground truncate text-[10px]", children: ["\u2190 ", file.oldPath.split('/').pop()] })) : null, _jsxs("span", { className: "shrink-0 text-[10px]", children: [file.additions > 0 ? _jsxs("span", { className: "text-green-600", children: ["+", file.additions] }) : null, file.additions > 0 && file.deletions > 0 ? ' ' : null, file.deletions > 0 ? _jsxs("span", { className: "text-red-600", children: ["-", file.deletions] }) : null] })] }), isExpanded && file.hunks.length > 0 ? (_jsx("div", { className: "px-2 pb-2", children: _jsx(DiffCodeBlock, { language: language, filename: file.path, hunks: file.hunks }) })) : null] }));
138
- }
139
- /* ─── Render tree nodes recursively ─── */
140
- function renderTreeNodes(elements, fileMap) {
141
- return elements.map((el) => {
142
- if (el.children && el.children.length > 0) {
143
- return (_jsx(Folder, { element: el.name, value: el.id, children: renderTreeNodes(el.children, fileMap) }, el.id));
144
- }
145
- const fileDiff = fileMap.get(el.id);
146
- const status = fileDiff?.status ?? 'modified';
147
- return (_jsxs(File, { value: el.id, fileIcon: _jsx(FileStatusIcon, { status: status }), children: [_jsx("span", { className: "text-xs", children: el.name }), fileDiff ? (_jsxs("span", { className: "ml-auto shrink-0 pl-2 text-[10px]", children: [fileDiff.additions > 0 ? (_jsxs("span", { className: "text-green-600", children: ["+", fileDiff.additions] })) : null, fileDiff.additions > 0 && fileDiff.deletions > 0 ? ' ' : null, fileDiff.deletions > 0 ? (_jsxs("span", { className: "text-red-600", children: ["-", fileDiff.deletions] })) : null] })) : null] }, el.id));
148
- });
24
+ return (_jsxs("div", { className: "border-border border-b last:border-b-0", children: [_jsxs("button", { type: "button", onClick: () => setIsOpen(!isOpen), className: "hover:bg-muted/50 flex w-full items-center gap-2 px-3 py-2 text-left", children: [_jsx(ChevronRight, { className: cn('text-muted-foreground h-3 w-3 shrink-0 transition-transform duration-150', isOpen && 'rotate-90') }), _jsx(FileStatusIcon, { status: file.status }), _jsx("span", { className: "text-foreground min-w-0 flex-1 truncate text-xs", children: dirPath ? (_jsxs(_Fragment, { children: [_jsxs("span", { className: "text-muted-foreground", children: [dirPath, "/"] }), fileName] })) : (fileName) }), file.oldPath ? (_jsxs("span", { className: "text-muted-foreground truncate text-[10px]", children: ["\u2190 ", file.oldPath.split('/').pop()] })) : null, _jsxs("span", { className: "shrink-0 text-[10px]", children: [file.additions > 0 ? _jsxs("span", { className: "text-green-600", children: ["+", file.additions] }) : null, file.additions > 0 && file.deletions > 0 ? ' ' : null, file.deletions > 0 ? _jsxs("span", { className: "text-red-600", children: ["-", file.deletions] }) : null] })] }), isOpen && file.hunks.length > 0 ? (_jsx("div", { className: "border-border overflow-x-auto border-t", children: file.hunks.map((hunk) => (_jsx(HunkView, { hunk: hunk }, hunk.header))) })) : null] }));
149
25
  }
150
26
  export function DiffView({ fileDiffs }) {
151
- const [expandedFiles, setExpandedFiles] = useState(new Set());
152
- const fileRefs = useRef(new Map());
153
- const fileMap = useMemo(() => new Map(fileDiffs.map((f) => [f.path, f])), [fileDiffs]);
154
- const treeElements = useMemo(() => buildFileTree(fileDiffs), [fileDiffs]);
155
- const allTreeIds = useMemo(() => getAllIds(treeElements), [treeElements]);
156
- const handleFileSelect = useCallback((fileId) => {
157
- // If the selected ID corresponds to a file (not a folder), expand it and scroll to it
158
- if (fileMap.has(fileId)) {
159
- setExpandedFiles((prev) => {
160
- const next = new Set(prev);
161
- next.add(fileId);
162
- return next;
163
- });
164
- // Scroll into view after render
165
- requestAnimationFrame(() => {
166
- const el = fileRefs.current.get(fileId);
167
- el?.scrollIntoView({ behavior: 'smooth', block: 'nearest' });
168
- });
169
- }
170
- }, [fileMap]);
171
- const toggleFile = useCallback((path) => {
172
- setExpandedFiles((prev) => {
173
- const next = new Set(prev);
174
- if (next.has(path)) {
175
- next.delete(path);
176
- }
177
- else {
178
- next.add(path);
179
- }
180
- return next;
181
- });
182
- }, []);
183
27
  if (fileDiffs.length === 0)
184
28
  return null;
185
- return (_jsxs("div", { className: "border-border rounded-lg border", children: [_jsx("div", { className: "px-4 py-3", children: _jsxs("div", { className: "flex items-center gap-2", children: [_jsx(FileText, { className: "text-muted-foreground h-4 w-4" }), _jsx("span", { className: "text-foreground text-xs font-semibold", children: "Changed Files" }), _jsxs("span", { className: "text-muted-foreground text-[10px]", children: ["(", fileDiffs.length, ")"] })] }) }), _jsx("div", { className: "border-border border-t px-2 py-2", children: _jsxs(Tree, { className: "max-h-48 overflow-hidden rounded-md", initialExpandedItems: allTreeIds, elements: treeElements, onSelect: handleFileSelect, sort: "none", children: [renderTreeNodes(treeElements, fileMap), _jsx(CollapseButton, { elements: treeElements, className: "mt-1" })] }) }), _jsx("div", { className: "border-border border-t", children: fileDiffs.map((file) => (_jsx(FileDiffCard, { file: file, isExpanded: expandedFiles.has(file.path), onToggle: () => toggleFile(file.path), innerRef: (el) => {
186
- fileRefs.current.set(file.path, el);
187
- } }, `${file.status}-${file.path}`))) })] }));
29
+ return (_jsxs("div", { className: "border-border rounded-lg border", children: [_jsx("div", { className: "px-4 py-3", children: _jsxs("div", { className: "mb-2 flex items-center gap-2", children: [_jsx(FileText, { className: "text-muted-foreground h-4 w-4" }), _jsx("span", { className: "text-foreground text-xs font-semibold", children: "Changed Files" }), _jsxs("span", { className: "text-muted-foreground text-[10px]", children: ["(", fileDiffs.length, ")"] })] }) }), _jsx("div", { className: "border-border border-t", children: fileDiffs.map((file) => (_jsx(FileDiffItem, { file: file }, `${file.status}-${file.path}`))) })] }));
188
30
  }
@@ -74,6 +74,8 @@ export interface MergeReviewData {
74
74
  export interface MergeReviewProps {
75
75
  /** Merge review data from the server action */
76
76
  data: MergeReviewData;
77
+ /** When true, hides the action bar and shows archival header text (post-merge history mode) */
78
+ readOnly?: boolean;
77
79
  /** Approve merge callback */
78
80
  onApprove: () => void;
79
81
  /** Reject merge callback — opens feedback dialog when provided; also used for inline text rejection */
@@ -1 +1 @@
1
- {"version":3,"file":"merge-review-config.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/merge-review/merge-review-config.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"merge-review-config.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/merge-review/merge-review-config.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,3 @@
1
1
  import type { MergeReviewProps } from './merge-review-config.js';
2
- export declare function MergeReview({ data, onApprove, onReject, isProcessing, isRejecting, chatInput, onChatInputChange, }: MergeReviewProps): import("react/jsx-runtime").JSX.Element;
2
+ export declare function MergeReview({ data, readOnly, onApprove, onReject, isProcessing, isRejecting, chatInput, onChatInputChange, }: MergeReviewProps): import("react/jsx-runtime").JSX.Element;
3
3
  //# sourceMappingURL=merge-review.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"merge-review.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/merge-review/merge-review.tsx"],"names":[],"mappings":"AAsBA,OAAO,KAAK,EAAE,gBAAgB,EAAuB,MAAM,uBAAuB,CAAC;AA0KnF,wBAAgB,WAAW,CAAC,EAC1B,IAAI,EACJ,SAAS,EACT,QAAQ,EACR,YAAoB,EACpB,WAAmB,EACnB,SAAS,EACT,iBAAiB,GAClB,EAAE,gBAAgB,2CA2JlB"}
1
+ {"version":3,"file":"merge-review.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/merge-review/merge-review.tsx"],"names":[],"mappings":"AAsBA,OAAO,KAAK,EAAE,gBAAgB,EAAuB,MAAM,uBAAuB,CAAC;AA0KnF,wBAAgB,WAAW,CAAC,EAC1B,IAAI,EACJ,QAAgB,EAChB,SAAS,EACT,QAAQ,EACR,YAAoB,EACpB,WAAmB,EACnB,SAAS,EACT,iBAAiB,GAClB,EAAE,gBAAgB,2CAiKlB"}
@@ -65,11 +65,13 @@ function EvidenceTextPreview({ url }) {
65
65
  function EvidenceList({ evidence, basePath, }) {
66
66
  return (_jsx("div", { className: "border-border rounded-lg border", children: _jsxs("div", { className: "px-4 py-3", children: [_jsxs("div", { className: "mb-3 flex items-center gap-2", children: [_jsx(Camera, { className: "text-muted-foreground h-4 w-4" }), _jsx("span", { className: "text-foreground text-xs font-semibold", children: "Evidence" }), _jsx(Badge, { variant: "secondary", className: "text-[10px]", children: evidence.length })] }), _jsx("ul", { className: "space-y-2", children: evidence.map((e) => (_jsx(EvidenceItem, { evidence: e, basePath: basePath }, `${e.type}-${e.relativePath}`))) })] }) }));
67
67
  }
68
- export function MergeReview({ data, onApprove, onReject, isProcessing = false, isRejecting = false, chatInput, onChatInputChange, }) {
68
+ export function MergeReview({ data, readOnly = false, onApprove, onReject, isProcessing = false, isRejecting = false, chatInput, onChatInputChange, }) {
69
69
  const { pr, diffSummary, fileDiffs, branch, warning, evidence, evidenceBasePath } = data;
70
70
  const hasConflicts = pr?.mergeable === false;
71
71
  const handleApproveOrResolve = hasConflicts && onReject ? () => onReject('Resolve merge conflicts', []) : onApprove;
72
- return (_jsxs("div", { className: "flex min-h-0 flex-1 flex-col", children: [_jsxs("div", { className: "flex-1 space-y-4 overflow-y-auto p-4", children: [_jsxs("div", { className: "flex items-start gap-3", children: [_jsx("div", { className: "mt-1.5 h-2.5 w-2.5 shrink-0 rounded-full bg-emerald-500" }), _jsxs("div", { className: "flex-1", children: [_jsx("h2", { className: "text-foreground text-sm font-bold", children: "Merge Review" }), _jsx("p", { className: "text-muted-foreground mt-1 text-xs leading-relaxed", children: pr
73
- ? 'Review the pull request details and approve to merge.'
74
- : 'Review the changes and approve to merge.' })] })] }), branch ? (_jsx("div", { className: "border-border rounded-lg border", children: _jsxs("div", { className: "flex items-center gap-2 px-4 py-3", children: [_jsx(GitBranch, { className: "text-muted-foreground h-4 w-4 shrink-0" }), _jsx(Badge, { variant: "secondary", className: "font-mono text-[11px]", children: branch.source }), _jsx(ArrowRight, { className: "text-muted-foreground h-3.5 w-3.5 shrink-0" }), _jsx(Badge, { variant: "outline", className: "font-mono text-[11px]", children: branch.target })] }) })) : null, pr ? (_jsx("div", { className: "border-border rounded-lg border", children: _jsxs("div", { className: "space-y-3 px-4 py-3", children: [_jsxs("div", { className: "flex items-center justify-between", children: [_jsxs("a", { href: pr.url, target: "_blank", rel: "noopener noreferrer", className: "text-primary flex items-center gap-1.5 text-sm font-semibold underline underline-offset-2", children: ["PR #", pr.number, _jsx(ExternalLink, { className: "h-3.5 w-3.5" })] }), _jsx(Badge, { variant: "outline", className: "text-xs", children: pr.status })] }), pr.mergeable === false ? (_jsxs("div", { className: "flex items-center justify-between", children: [_jsx("span", { className: "text-muted-foreground text-xs font-medium", children: "Merge Status" }), _jsxs(Badge, { className: "border-transparent bg-orange-50 text-orange-700 hover:bg-orange-50", children: [_jsx(AlertTriangle, { className: "mr-1 h-3.5 w-3.5" }), "Conflicts"] })] })) : null, pr.ciStatus ? (_jsxs("div", { className: "flex items-center justify-between", children: [_jsx("span", { className: "text-muted-foreground text-xs font-medium", children: "CI Status" }), _jsx(CiStatusBadge, { status: pr.ciStatus })] })) : null, pr.commitHash ? (_jsxs("div", { className: "flex items-center justify-between", children: [_jsx("span", { className: "text-muted-foreground text-xs font-medium", children: "Commit" }), _jsxs("div", { className: "flex items-center gap-1.5", children: [_jsx(GitCommitHorizontal, { className: "text-muted-foreground h-3.5 w-3.5" }), _jsx("code", { className: "bg-muted text-foreground rounded-md px-1.5 py-0.5 font-mono text-[11px]", children: pr.commitHash.slice(0, 7) })] })] })) : null] }) })) : null, diffSummary ? (_jsx("div", { className: "border-border rounded-lg border", children: _jsxs("div", { className: "px-4 py-3", children: [_jsxs("div", { className: "mb-3 flex items-center gap-2", children: [_jsx(FileDiff, { className: "text-muted-foreground h-4 w-4" }), _jsx("span", { className: "text-foreground text-xs font-semibold", children: "Changes" })] }), _jsxs("div", { className: "grid grid-cols-4 gap-3", children: [_jsxs("div", { className: "text-center", children: [_jsx("div", { className: "text-foreground text-sm font-bold", children: diffSummary.filesChanged }), _jsx("div", { className: "text-muted-foreground text-[10px]", children: "files" })] }), _jsxs("div", { className: "text-center", children: [_jsxs("div", { className: "text-sm font-bold text-green-600", children: ["+", diffSummary.additions] }), _jsx("div", { className: "text-muted-foreground text-[10px]", children: "additions" })] }), _jsxs("div", { className: "text-center", children: [_jsxs("div", { className: "text-sm font-bold text-red-600", children: ["-", diffSummary.deletions] }), _jsx("div", { className: "text-muted-foreground text-[10px]", children: "deletions" })] }), _jsxs("div", { className: "text-center", children: [_jsx("div", { className: "text-foreground text-sm font-bold", children: diffSummary.commitCount }), _jsx("div", { className: "text-muted-foreground text-[10px]", children: "commits" })] })] })] }) })) : warning ? (_jsx("div", { className: "border-border rounded-lg border", children: _jsxs("div", { className: "flex items-center gap-2 px-4 py-3", children: [_jsx(AlertTriangle, { className: "text-muted-foreground h-4 w-4 shrink-0" }), _jsx("span", { className: "text-muted-foreground text-xs", children: warning })] }) })) : null, evidence && evidence.length > 0 ? (_jsx(EvidenceList, { evidence: evidence, basePath: evidenceBasePath })) : null, fileDiffs && fileDiffs.length > 0 ? _jsx(DiffView, { fileDiffs: fileDiffs }) : null] }), _jsx(DrawerActionBar, { onReject: onReject, onApprove: handleApproveOrResolve, approveLabel: hasConflicts ? 'Resolve Conflicts' : 'Approve Merge', approveVariant: hasConflicts ? 'warning' : 'default', revisionPlaceholder: "Ask AI to revise before merging...", isProcessing: isProcessing, isRejecting: isRejecting, chatInput: chatInput, onChatInputChange: onChatInputChange })] }));
72
+ return (_jsxs("div", { className: "flex min-h-0 flex-1 flex-col", children: [_jsxs("div", { className: "flex-1 space-y-4 overflow-y-auto p-4", children: [_jsxs("div", { className: "flex items-start gap-3", children: [_jsx("div", { className: "mt-1.5 h-2.5 w-2.5 shrink-0 rounded-full bg-emerald-500" }), _jsxs("div", { className: "flex-1", children: [_jsx("h2", { className: "text-foreground text-sm font-bold", children: readOnly ? 'Merge History' : 'Merge Review' }), _jsx("p", { className: "text-muted-foreground mt-1 text-xs leading-relaxed", children: readOnly
73
+ ? 'This feature was merged. Review the pull request details and evidence below.'
74
+ : pr
75
+ ? 'Review the pull request details and approve to merge.'
76
+ : 'Review the changes and approve to merge.' })] })] }), branch ? (_jsx("div", { className: "border-border rounded-lg border", children: _jsxs("div", { className: "flex items-center gap-2 px-4 py-3", children: [_jsx(GitBranch, { className: "text-muted-foreground h-4 w-4 shrink-0" }), _jsx(Badge, { variant: "secondary", className: "font-mono text-[11px]", children: branch.source }), _jsx(ArrowRight, { className: "text-muted-foreground h-3.5 w-3.5 shrink-0" }), _jsx(Badge, { variant: "outline", className: "font-mono text-[11px]", children: branch.target })] }) })) : null, pr ? (_jsx("div", { className: "border-border rounded-lg border", children: _jsxs("div", { className: "space-y-3 px-4 py-3", children: [_jsxs("div", { className: "flex items-center justify-between", children: [_jsxs("a", { href: pr.url, target: "_blank", rel: "noopener noreferrer", className: "text-primary flex items-center gap-1.5 text-sm font-semibold underline underline-offset-2", children: ["PR #", pr.number, _jsx(ExternalLink, { className: "h-3.5 w-3.5" })] }), _jsx(Badge, { variant: "outline", className: "text-xs", children: pr.status })] }), pr.mergeable === false ? (_jsxs("div", { className: "flex items-center justify-between", children: [_jsx("span", { className: "text-muted-foreground text-xs font-medium", children: "Merge Status" }), _jsxs(Badge, { className: "border-transparent bg-orange-50 text-orange-700 hover:bg-orange-50", children: [_jsx(AlertTriangle, { className: "mr-1 h-3.5 w-3.5" }), "Conflicts"] })] })) : null, pr.ciStatus ? (_jsxs("div", { className: "flex items-center justify-between", children: [_jsx("span", { className: "text-muted-foreground text-xs font-medium", children: "CI Status" }), _jsx(CiStatusBadge, { status: pr.ciStatus })] })) : null, pr.commitHash ? (_jsxs("div", { className: "flex items-center justify-between", children: [_jsx("span", { className: "text-muted-foreground text-xs font-medium", children: "Commit" }), _jsxs("div", { className: "flex items-center gap-1.5", children: [_jsx(GitCommitHorizontal, { className: "text-muted-foreground h-3.5 w-3.5" }), _jsx("code", { className: "bg-muted text-foreground rounded-md px-1.5 py-0.5 font-mono text-[11px]", children: pr.commitHash.slice(0, 7) })] })] })) : null] }) })) : null, diffSummary ? (_jsx("div", { className: "border-border rounded-lg border", children: _jsxs("div", { className: "px-4 py-3", children: [_jsxs("div", { className: "mb-3 flex items-center gap-2", children: [_jsx(FileDiff, { className: "text-muted-foreground h-4 w-4" }), _jsx("span", { className: "text-foreground text-xs font-semibold", children: "Changes" })] }), _jsxs("div", { className: "grid grid-cols-4 gap-3", children: [_jsxs("div", { className: "text-center", children: [_jsx("div", { className: "text-foreground text-sm font-bold", children: diffSummary.filesChanged }), _jsx("div", { className: "text-muted-foreground text-[10px]", children: "files" })] }), _jsxs("div", { className: "text-center", children: [_jsxs("div", { className: "text-sm font-bold text-green-600", children: ["+", diffSummary.additions] }), _jsx("div", { className: "text-muted-foreground text-[10px]", children: "additions" })] }), _jsxs("div", { className: "text-center", children: [_jsxs("div", { className: "text-sm font-bold text-red-600", children: ["-", diffSummary.deletions] }), _jsx("div", { className: "text-muted-foreground text-[10px]", children: "deletions" })] }), _jsxs("div", { className: "text-center", children: [_jsx("div", { className: "text-foreground text-sm font-bold", children: diffSummary.commitCount }), _jsx("div", { className: "text-muted-foreground text-[10px]", children: "commits" })] })] })] }) })) : warning ? (_jsx("div", { className: "border-border rounded-lg border", children: _jsxs("div", { className: "flex items-center gap-2 px-4 py-3", children: [_jsx(AlertTriangle, { className: "text-muted-foreground h-4 w-4 shrink-0" }), _jsx("span", { className: "text-muted-foreground text-xs", children: warning })] }) })) : null, evidence && evidence.length > 0 ? (_jsx(EvidenceList, { evidence: evidence, basePath: evidenceBasePath })) : null, fileDiffs && fileDiffs.length > 0 ? _jsx(DiffView, { fileDiffs: fileDiffs }) : null] }), !readOnly && (_jsx(DrawerActionBar, { onReject: onReject, onApprove: handleApproveOrResolve, approveLabel: hasConflicts ? 'Resolve Conflicts' : 'Approve Merge', approveVariant: hasConflicts ? 'warning' : 'default', revisionPlaceholder: "Ask AI to revise before merging...", isProcessing: isProcessing, isRejecting: isRejecting, chatInput: chatInput, onChatInputChange: onChatInputChange }))] }));
75
77
  }
@@ -25,4 +25,10 @@ export declare const NoPrNoDiff: Story;
25
25
  export declare const WithFileDiffs: Story;
26
26
  /** With evidence — shows evidence items captured during implementation. */
27
27
  export declare const WithEvidence: Story;
28
+ /** Read-only mode with full data — PR, diff summary, evidence, and file diffs. No action bar. */
29
+ export declare const ReadOnlyFullData: Story;
30
+ /** Read-only mode with evidence but no diffs — warning message shown for unavailable diffs. */
31
+ export declare const ReadOnlyEvidenceNoDiffs: Story;
32
+ /** Read-only mode with PR metadata only — no evidence, no diffs. */
33
+ export declare const ReadOnlyPrOnly: Story;
28
34
  //# sourceMappingURL=merge-review.stories.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"merge-review.stories.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/merge-review/merge-review.stories.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAGvD,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AA2F7C,QAAA,MAAM,IAAI,EAAE,IAAI,CAAC,OAAO,WAAW,CAclC,CAAC;AAEF,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,WAAW,CAAC,CAAC;AAE1C,kDAAkD;AAClD,eAAO,MAAM,OAAO,EAAE,KAKrB,CAAC;AAEF,mDAAmD;AACnD,eAAO,MAAM,cAAc,EAAE,KAQ5B,CAAC;AAEF,8DAA8D;AAC9D,eAAO,MAAM,SAAS,EAAE,KAQvB,CAAC;AAEF,8CAA8C;AAC9C,eAAO,MAAM,SAAS,EAAE,KAQvB,CAAC;AAEF,wDAAwD;AACxD,eAAO,MAAM,aAAa,EAAE,KAS3B,CAAC;AAEF,yDAAyD;AACzD,eAAO,MAAM,UAAU,EAAE,KAQxB,CAAC;AAEF,+DAA+D;AAC/D,eAAO,MAAM,UAAU,EAAE,KAMxB,CAAC;AAEF,qFAAqF;AACrF,eAAO,MAAM,YAAY,EAAE,KAQ1B,CAAC;AAEF,gEAAgE;AAChE,eAAO,MAAM,UAAU,EAAE,KAQxB,CAAC;AAEF,4EAA4E;AAC5E,eAAO,MAAM,aAAa,EAAE,KAQ3B,CAAC;AAEF,2EAA2E;AAC3E,eAAO,MAAM,YAAY,EAAE,KAoC1B,CAAC"}
1
+ {"version":3,"file":"merge-review.stories.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/merge-review/merge-review.stories.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAGvD,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AA2F7C,QAAA,MAAM,IAAI,EAAE,IAAI,CAAC,OAAO,WAAW,CAclC,CAAC;AAEF,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,WAAW,CAAC,CAAC;AAE1C,kDAAkD;AAClD,eAAO,MAAM,OAAO,EAAE,KAKrB,CAAC;AAEF,mDAAmD;AACnD,eAAO,MAAM,cAAc,EAAE,KAQ5B,CAAC;AAEF,8DAA8D;AAC9D,eAAO,MAAM,SAAS,EAAE,KAQvB,CAAC;AAEF,8CAA8C;AAC9C,eAAO,MAAM,SAAS,EAAE,KAQvB,CAAC;AAEF,wDAAwD;AACxD,eAAO,MAAM,aAAa,EAAE,KAS3B,CAAC;AAEF,yDAAyD;AACzD,eAAO,MAAM,UAAU,EAAE,KAQxB,CAAC;AAEF,+DAA+D;AAC/D,eAAO,MAAM,UAAU,EAAE,KAMxB,CAAC;AAEF,qFAAqF;AACrF,eAAO,MAAM,YAAY,EAAE,KAQ1B,CAAC;AAEF,gEAAgE;AAChE,eAAO,MAAM,UAAU,EAAE,KAQxB,CAAC;AAEF,4EAA4E;AAC5E,eAAO,MAAM,aAAa,EAAE,KAQ3B,CAAC;AAEF,2EAA2E;AAC3E,eAAO,MAAM,YAAY,EAAE,KAoC1B,CAAC;AAaF,iGAAiG;AACjG,eAAO,MAAM,gBAAgB,EAAE,KA2B9B,CAAC;AAEF,+FAA+F;AAC/F,eAAO,MAAM,uBAAuB,EAAE,KAwBrC,CAAC;AAEF,oEAAoE;AACpE,eAAO,MAAM,cAAc,EAAE,KAS5B,CAAC"}
@@ -230,3 +230,77 @@ export const WithEvidence = {
230
230
  ...defaultActions,
231
231
  },
232
232
  };
233
+ /* ─── Read-Only / History Mode ─── */
234
+ const mergedPr = {
235
+ ...fullPr,
236
+ status: PrStatus.Merged,
237
+ };
238
+ const readOnlyActions = {
239
+ onApprove: fn().mockName('onApprove'),
240
+ };
241
+ /** Read-only mode with full data — PR, diff summary, evidence, and file diffs. No action bar. */
242
+ export const ReadOnlyFullData = {
243
+ args: {
244
+ data: {
245
+ pr: mergedPr,
246
+ branch: sampleBranch,
247
+ diffSummary: fullData.diffSummary,
248
+ fileDiffs: sampleFileDiffs,
249
+ evidence: [
250
+ {
251
+ type: 'Screenshot',
252
+ capturedAt: '2026-03-09T12:00:00Z',
253
+ description: 'Homepage showing new auth banner',
254
+ relativePath: '.shep/evidence/homepage-banner.png',
255
+ taskRef: 'task-1',
256
+ },
257
+ {
258
+ type: 'TestOutput',
259
+ capturedAt: '2026-03-09T12:01:00Z',
260
+ description: 'Unit tests — all 42 passing',
261
+ relativePath: '.shep/evidence/unit-test-results.txt',
262
+ taskRef: 'task-2',
263
+ },
264
+ ],
265
+ },
266
+ readOnly: true,
267
+ ...readOnlyActions,
268
+ },
269
+ };
270
+ /** Read-only mode with evidence but no diffs — warning message shown for unavailable diffs. */
271
+ export const ReadOnlyEvidenceNoDiffs = {
272
+ args: {
273
+ data: {
274
+ pr: mergedPr,
275
+ branch: sampleBranch,
276
+ warning: 'Diff statistics unavailable — worktree was removed after merge',
277
+ evidence: [
278
+ {
279
+ type: 'Screenshot',
280
+ capturedAt: '2026-03-09T12:00:00Z',
281
+ description: 'Final state of the feature',
282
+ relativePath: '.shep/evidence/final-state.png',
283
+ },
284
+ {
285
+ type: 'Video',
286
+ capturedAt: '2026-03-09T12:02:00Z',
287
+ description: 'Demo walkthrough recording',
288
+ relativePath: '.shep/evidence/demo.mp4',
289
+ },
290
+ ],
291
+ },
292
+ readOnly: true,
293
+ ...readOnlyActions,
294
+ },
295
+ };
296
+ /** Read-only mode with PR metadata only — no evidence, no diffs. */
297
+ export const ReadOnlyPrOnly = {
298
+ args: {
299
+ data: {
300
+ pr: mergedPr,
301
+ branch: sampleBranch,
302
+ },
303
+ readOnly: true,
304
+ ...readOnlyActions,
305
+ },
306
+ };