@shepai/cli 1.118.0 → 1.119.0

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 (358) hide show
  1. package/apis/json-schema/PhaseTiming.yaml +22 -1
  2. package/apis/json-schema/WorkflowConfig.yaml +10 -0
  3. package/dist/packages/core/src/application/ports/output/agents/agent-session-repository.interface.d.ts +2 -0
  4. package/dist/packages/core/src/application/ports/output/agents/agent-session-repository.interface.d.ts.map +1 -1
  5. package/dist/packages/core/src/application/ports/output/agents/phase-timing-repository.interface.d.ts +3 -3
  6. package/dist/packages/core/src/application/ports/output/agents/phase-timing-repository.interface.d.ts.map +1 -1
  7. package/dist/packages/core/src/application/ports/output/services/git-pr-service.interface.d.ts +2 -1
  8. package/dist/packages/core/src/application/ports/output/services/git-pr-service.interface.d.ts.map +1 -1
  9. package/dist/packages/core/src/domain/factories/settings-defaults.factory.d.ts.map +1 -1
  10. package/dist/packages/core/src/domain/factories/settings-defaults.factory.js +1 -0
  11. package/dist/packages/core/src/domain/generated/output.d.ts +37 -1
  12. package/dist/packages/core/src/domain/generated/output.d.ts.map +1 -1
  13. package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/settings.mapper.d.ts +1 -0
  14. package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/settings.mapper.d.ts.map +1 -1
  15. package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/settings.mapper.js +2 -0
  16. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/037-add-ci-watch-enabled.d.ts +11 -0
  17. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/037-add-ci-watch-enabled.d.ts.map +1 -0
  18. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/037-add-ci-watch-enabled.js +15 -0
  19. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/038-add-phase-execution-metadata.d.ts +11 -0
  20. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/038-add-phase-execution-metadata.d.ts.map +1 -0
  21. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/038-add-phase-execution-metadata.js +27 -0
  22. package/dist/packages/core/src/infrastructure/repositories/sqlite-phase-timing.repository.d.ts +1 -1
  23. package/dist/packages/core/src/infrastructure/repositories/sqlite-phase-timing.repository.d.ts.map +1 -1
  24. package/dist/packages/core/src/infrastructure/repositories/sqlite-phase-timing.repository.js +32 -0
  25. package/dist/packages/core/src/infrastructure/services/agents/common/executors/dev-executor.service.d.ts.map +1 -1
  26. package/dist/packages/core/src/infrastructure/services/agents/common/executors/dev-executor.service.js +8 -1
  27. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/merge/ci-watch-fix-loop.d.ts.map +1 -1
  28. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/merge/ci-watch-fix-loop.js +3 -2
  29. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/merge/merge.node.d.ts.map +1 -1
  30. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/merge/merge.node.js +29 -7
  31. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/node-helpers.d.ts.map +1 -1
  32. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/node-helpers.js +19 -8
  33. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/prompts/merge-prompts.d.ts +5 -10
  34. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/prompts/merge-prompts.d.ts.map +1 -1
  35. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/prompts/merge-prompts.js +5 -73
  36. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/phase-timing-context.d.ts +17 -3
  37. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/phase-timing-context.d.ts.map +1 -1
  38. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/phase-timing-context.js +11 -3
  39. package/dist/packages/core/src/infrastructure/services/agents/sessions/claude-code-session.repository.d.ts +7 -0
  40. package/dist/packages/core/src/infrastructure/services/agents/sessions/claude-code-session.repository.d.ts.map +1 -1
  41. package/dist/packages/core/src/infrastructure/services/agents/sessions/claude-code-session.repository.js +35 -11
  42. package/dist/packages/core/src/infrastructure/services/git/git-pr.service.d.ts +1 -1
  43. package/dist/packages/core/src/infrastructure/services/git/git-pr.service.d.ts.map +1 -1
  44. package/dist/packages/core/src/infrastructure/services/git/git-pr.service.js +12 -3
  45. package/dist/src/presentation/web/app/(dashboard)/@drawer/create/page.d.ts +1 -0
  46. package/dist/src/presentation/web/app/(dashboard)/@drawer/create/page.d.ts.map +1 -1
  47. package/dist/src/presentation/web/app/(dashboard)/@drawer/create/page.js +2 -2
  48. package/dist/src/presentation/web/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page.d.ts.map +1 -1
  49. package/dist/src/presentation/web/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page.js +1 -0
  50. package/dist/src/presentation/web/app/(dashboard)/@drawer/feature/[featureId]/page.d.ts.map +1 -1
  51. package/dist/src/presentation/web/app/(dashboard)/@drawer/feature/[featureId]/page.js +1 -0
  52. package/dist/src/presentation/web/app/(dashboard)/get-graph-data.d.ts.map +1 -1
  53. package/dist/src/presentation/web/app/(dashboard)/get-graph-data.js +1 -0
  54. package/dist/src/presentation/web/app/actions/get-feature-phase-timings.d.ts +2 -0
  55. package/dist/src/presentation/web/app/actions/get-feature-phase-timings.d.ts.map +1 -1
  56. package/dist/src/presentation/web/app/actions/get-feature-phase-timings.js +2 -0
  57. package/dist/src/presentation/web/app/actions/get-merge-review-data.d.ts.map +1 -1
  58. package/dist/src/presentation/web/app/actions/get-merge-review-data.js +49 -13
  59. package/dist/src/presentation/web/app/actions/get-workflow-defaults.d.ts +1 -0
  60. package/dist/src/presentation/web/app/actions/get-workflow-defaults.d.ts.map +1 -1
  61. package/dist/src/presentation/web/app/actions/get-workflow-defaults.js +1 -0
  62. package/dist/src/presentation/web/app/api/sessions/route.d.ts +24 -0
  63. package/dist/src/presentation/web/app/api/sessions/route.d.ts.map +1 -0
  64. package/dist/src/presentation/web/app/api/sessions/route.js +230 -0
  65. package/dist/src/presentation/web/app/build-feature-node-data.d.ts +2 -0
  66. package/dist/src/presentation/web/app/build-feature-node-data.d.ts.map +1 -1
  67. package/dist/src/presentation/web/app/build-feature-node-data.js +1 -0
  68. package/dist/src/presentation/web/app/build-graph-nodes.d.ts +2 -0
  69. package/dist/src/presentation/web/app/build-graph-nodes.d.ts.map +1 -1
  70. package/dist/src/presentation/web/app/build-graph-nodes.js +11 -0
  71. package/dist/src/presentation/web/components/common/control-center-drawer/create-drawer-client.d.ts +2 -1
  72. package/dist/src/presentation/web/components/common/control-center-drawer/create-drawer-client.d.ts.map +1 -1
  73. package/dist/src/presentation/web/components/common/control-center-drawer/create-drawer-client.js +2 -2
  74. package/dist/src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.d.ts +4 -1
  75. package/dist/src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.d.ts.map +1 -1
  76. package/dist/src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.js +16 -3
  77. package/dist/src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.stories.d.ts.map +1 -1
  78. package/dist/src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.stories.js +1 -0
  79. package/dist/src/presentation/web/components/common/feature-drawer-tabs/activity-tab.d.ts.map +1 -1
  80. package/dist/src/presentation/web/components/common/feature-drawer-tabs/activity-tab.js +36 -10
  81. package/dist/src/presentation/web/components/common/feature-drawer-tabs/feature-drawer-tabs.d.ts.map +1 -1
  82. package/dist/src/presentation/web/components/common/feature-drawer-tabs/feature-drawer-tabs.js +7 -2
  83. package/dist/src/presentation/web/components/common/feature-drawer-tabs/overview-tab.js +2 -1
  84. package/dist/src/presentation/web/components/common/feature-node/feature-node-state-config.d.ts +4 -0
  85. package/dist/src/presentation/web/components/common/feature-node/feature-node-state-config.d.ts.map +1 -1
  86. package/dist/src/presentation/web/components/common/feature-node/feature-node.d.ts.map +1 -1
  87. package/dist/src/presentation/web/components/common/feature-node/feature-node.js +2 -1
  88. package/dist/src/presentation/web/components/common/feature-node/feature-sessions-dropdown.d.ts +21 -0
  89. package/dist/src/presentation/web/components/common/feature-node/feature-sessions-dropdown.d.ts.map +1 -0
  90. package/dist/src/presentation/web/components/common/feature-node/feature-sessions-dropdown.js +138 -0
  91. package/dist/src/presentation/web/components/common/feature-node/feature-sessions-dropdown.stories.d.ts +9 -0
  92. package/dist/src/presentation/web/components/common/feature-node/feature-sessions-dropdown.stories.d.ts.map +1 -0
  93. package/dist/src/presentation/web/components/common/feature-node/feature-sessions-dropdown.stories.js +77 -0
  94. package/dist/src/presentation/web/components/common/merge-review/merge-review-config.d.ts +3 -3
  95. package/dist/src/presentation/web/components/common/merge-review/merge-review-config.d.ts.map +1 -1
  96. package/dist/src/presentation/web/components/common/merge-review/merge-review.d.ts +1 -1
  97. package/dist/src/presentation/web/components/common/merge-review/merge-review.d.ts.map +1 -1
  98. package/dist/src/presentation/web/components/common/merge-review/merge-review.js +14 -20
  99. package/dist/src/presentation/web/components/common/merge-review/merge-review.stories.d.ts +6 -0
  100. package/dist/src/presentation/web/components/common/merge-review/merge-review.stories.d.ts.map +1 -1
  101. package/dist/src/presentation/web/components/common/merge-review/merge-review.stories.js +74 -0
  102. package/dist/src/presentation/web/components/common/repository-node/repository-node.d.ts.map +1 -1
  103. package/dist/src/presentation/web/components/common/repository-node/repository-node.js +35 -2
  104. package/dist/src/presentation/web/components/features/settings/settings-page-client.d.ts.map +1 -1
  105. package/dist/src/presentation/web/components/features/settings/settings-page-client.js +16 -1
  106. package/dist/src/presentation/web/components/features/settings/workflow-settings-section.d.ts.map +1 -1
  107. package/dist/src/presentation/web/components/features/settings/workflow-settings-section.js +6 -1
  108. package/dist/src/presentation/web/components/features/settings/workflow-settings-section.stories.d.ts.map +1 -1
  109. package/dist/src/presentation/web/components/features/settings/workflow-settings-section.stories.js +3 -0
  110. package/dist/tsconfig.build.tsbuildinfo +1 -1
  111. package/package.json +1 -1
  112. package/web/.next/BUILD_ID +1 -1
  113. package/web/.next/app-path-routes-manifest.json +1 -0
  114. package/web/.next/build-manifest.json +2 -2
  115. package/web/.next/fallback-build-manifest.json +2 -2
  116. package/web/.next/prerender-manifest.json +3 -3
  117. package/web/.next/required-server-files.js +2 -2
  118. package/web/.next/required-server-files.json +2 -2
  119. package/web/.next/routes-manifest.json +6 -0
  120. package/web/.next/server/app/(dashboard)/@drawer/create/page/server-reference-manifest.json +21 -21
  121. package/web/.next/server/app/(dashboard)/@drawer/create/page.js +2 -2
  122. package/web/.next/server/app/(dashboard)/@drawer/create/page.js.nft.json +1 -1
  123. package/web/.next/server/app/(dashboard)/@drawer/create/page_client-reference-manifest.js +1 -1
  124. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page/server-reference-manifest.json +27 -27
  125. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page.js +3 -3
  126. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page.js.nft.json +1 -1
  127. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page_client-reference-manifest.js +1 -1
  128. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page/server-reference-manifest.json +27 -27
  129. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js +3 -3
  130. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js.nft.json +1 -1
  131. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page_client-reference-manifest.js +1 -1
  132. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page/server-reference-manifest.json +19 -19
  133. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js +2 -2
  134. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js.nft.json +1 -1
  135. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  136. package/web/.next/server/app/(dashboard)/create/page/server-reference-manifest.json +21 -21
  137. package/web/.next/server/app/(dashboard)/create/page.js +2 -2
  138. package/web/.next/server/app/(dashboard)/create/page.js.nft.json +1 -1
  139. package/web/.next/server/app/(dashboard)/create/page_client-reference-manifest.js +1 -1
  140. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page/server-reference-manifest.json +27 -27
  141. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page.js +3 -3
  142. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page.js.nft.json +1 -1
  143. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page_client-reference-manifest.js +1 -1
  144. package/web/.next/server/app/(dashboard)/feature/[featureId]/page/server-reference-manifest.json +27 -27
  145. package/web/.next/server/app/(dashboard)/feature/[featureId]/page.js +3 -3
  146. package/web/.next/server/app/(dashboard)/feature/[featureId]/page.js.nft.json +1 -1
  147. package/web/.next/server/app/(dashboard)/feature/[featureId]/page_client-reference-manifest.js +1 -1
  148. package/web/.next/server/app/(dashboard)/page/server-reference-manifest.json +19 -19
  149. package/web/.next/server/app/(dashboard)/page.js +2 -2
  150. package/web/.next/server/app/(dashboard)/page.js.nft.json +1 -1
  151. package/web/.next/server/app/(dashboard)/page_client-reference-manifest.js +1 -1
  152. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page/server-reference-manifest.json +19 -19
  153. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js +2 -2
  154. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js.nft.json +1 -1
  155. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  156. package/web/.next/server/app/_global-error.html +2 -2
  157. package/web/.next/server/app/_global-error.rsc +1 -1
  158. package/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  159. package/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  160. package/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  161. package/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  162. package/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  163. package/web/.next/server/app/_not-found/page/server-reference-manifest.json +1 -1
  164. package/web/.next/server/app/_not-found/page.js.nft.json +1 -1
  165. package/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  166. package/web/.next/server/app/api/attachments/preview/route.js +1 -1
  167. package/web/.next/server/app/api/attachments/preview/route.js.nft.json +1 -1
  168. package/web/.next/server/app/api/evidence/route.js +1 -1
  169. package/web/.next/server/app/api/evidence/route.js.nft.json +1 -1
  170. package/web/.next/server/app/api/graph-data/route.js +1 -1
  171. package/web/.next/server/app/api/graph-data/route.js.nft.json +1 -1
  172. package/web/.next/server/app/api/sessions/route/app-paths-manifest.json +3 -0
  173. package/web/.next/server/app/api/sessions/route/build-manifest.json +11 -0
  174. package/web/.next/server/app/api/sessions/route/server-reference-manifest.json +4 -0
  175. package/web/.next/server/app/api/sessions/route.js +7 -0
  176. package/web/.next/server/app/api/sessions/route.js.map +5 -0
  177. package/web/.next/server/app/api/sessions/route.js.nft.json +1 -0
  178. package/web/.next/server/app/api/sessions/route_client-reference-manifest.js +2 -0
  179. package/web/.next/server/app/settings/page/server-reference-manifest.json +6 -6
  180. package/web/.next/server/app/settings/page.js +1 -1
  181. package/web/.next/server/app/settings/page.js.nft.json +1 -1
  182. package/web/.next/server/app/settings/page_client-reference-manifest.js +1 -1
  183. package/web/.next/server/app/skills/page/server-reference-manifest.json +6 -6
  184. package/web/.next/server/app/skills/page.js +1 -1
  185. package/web/.next/server/app/skills/page.js.nft.json +1 -1
  186. package/web/.next/server/app/skills/page_client-reference-manifest.js +1 -1
  187. package/web/.next/server/app/tools/page/server-reference-manifest.json +6 -6
  188. package/web/.next/server/app/tools/page.js +1 -1
  189. package/web/.next/server/app/tools/page.js.nft.json +1 -1
  190. package/web/.next/server/app/tools/page_client-reference-manifest.js +1 -1
  191. package/web/.next/server/app/version/page/server-reference-manifest.json +1 -1
  192. package/web/.next/server/app/version/page.js +1 -1
  193. package/web/.next/server/app/version/page.js.nft.json +1 -1
  194. package/web/.next/server/app/version/page_client-reference-manifest.js +1 -1
  195. package/web/.next/server/app-paths-manifest.json +1 -0
  196. package/web/.next/server/chunks/403f9_next_dist_esm_build_templates_app-route_370c43b1.js +1 -1
  197. package/web/.next/server/chunks/403f9_next_dist_esm_build_templates_app-route_370c43b1.js.map +1 -1
  198. package/web/.next/server/chunks/[root-of-the-server]__0fe7788d._.js +3 -0
  199. package/web/.next/server/chunks/[root-of-the-server]__0fe7788d._.js.map +1 -0
  200. package/web/.next/server/chunks/[root-of-the-server]__42b7ab55._.js +3 -0
  201. package/web/.next/server/chunks/[root-of-the-server]__42b7ab55._.js.map +1 -0
  202. package/web/.next/server/chunks/{[root-of-the-server]__7d63f9a4._.js → [root-of-the-server]__53013576._.js} +2 -2
  203. package/web/.next/server/chunks/{[root-of-the-server]__a1c7c02a._.js → [root-of-the-server]__92078db6._.js} +2 -2
  204. package/web/.next/server/chunks/[root-of-the-server]__a402b567._.js +1 -1
  205. package/web/.next/server/chunks/[root-of-the-server]__cd67a84c._.js.map +1 -1
  206. package/web/.next/server/chunks/b1a17_presentation_web__next-internal_server_app_api_sessions_route_actions_c041a889.js +3 -0
  207. package/web/.next/server/chunks/b1a17_presentation_web__next-internal_server_app_api_sessions_route_actions_c041a889.js.map +1 -0
  208. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js +1 -1
  209. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js.map +1 -1
  210. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_ed372306.js +1 -1
  211. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_ed372306.js.map +1 -1
  212. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_32e26434.js +1 -1
  213. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_32e26434.js.map +1 -1
  214. package/web/.next/server/chunks/ssr/{[root-of-the-server]__07a39ff2._.js → [root-of-the-server]__06fef644._.js} +2 -2
  215. package/web/.next/server/chunks/ssr/{[root-of-the-server]__07a39ff2._.js.map → [root-of-the-server]__06fef644._.js.map} +1 -1
  216. package/web/.next/server/chunks/ssr/[root-of-the-server]__3b14e5a0._.js +3 -0
  217. package/web/.next/server/chunks/ssr/[root-of-the-server]__3b14e5a0._.js.map +1 -0
  218. package/web/.next/server/chunks/ssr/[root-of-the-server]__545792ab._.js +3 -0
  219. package/web/.next/server/chunks/ssr/[root-of-the-server]__545792ab._.js.map +1 -0
  220. package/web/.next/server/chunks/ssr/[root-of-the-server]__684a868c._.js +1 -1
  221. package/web/.next/server/chunks/ssr/[root-of-the-server]__684a868c._.js.map +1 -1
  222. package/web/.next/server/chunks/ssr/[root-of-the-server]__6b17a22d._.js +1 -1
  223. package/web/.next/server/chunks/ssr/[root-of-the-server]__6b17a22d._.js.map +1 -1
  224. package/web/.next/server/chunks/ssr/[root-of-the-server]__6bb00d90._.js +2 -2
  225. package/web/.next/server/chunks/ssr/[root-of-the-server]__6bb00d90._.js.map +1 -1
  226. package/web/.next/server/chunks/ssr/[root-of-the-server]__804c006d._.js +1 -1
  227. package/web/.next/server/chunks/ssr/[root-of-the-server]__804c006d._.js.map +1 -1
  228. package/web/.next/server/chunks/ssr/[root-of-the-server]__8b59c03e._.js +3 -0
  229. package/web/.next/server/chunks/ssr/[root-of-the-server]__8b59c03e._.js.map +1 -0
  230. package/web/.next/server/chunks/ssr/[root-of-the-server]__8c553503._.js +4 -0
  231. package/web/.next/server/chunks/ssr/{[root-of-the-server]__2ff2daf6._.js.map → [root-of-the-server]__8c553503._.js.map} +1 -1
  232. package/web/.next/server/chunks/ssr/[root-of-the-server]__994ad9fe._.js +3 -0
  233. package/web/.next/server/chunks/ssr/[root-of-the-server]__994ad9fe._.js.map +1 -0
  234. package/web/.next/server/chunks/ssr/[root-of-the-server]__9f155c0e._.js +3 -0
  235. package/web/.next/server/chunks/ssr/[root-of-the-server]__9f155c0e._.js.map +1 -0
  236. package/web/.next/server/chunks/ssr/[root-of-the-server]__a022445f._.js +4 -0
  237. package/web/.next/server/chunks/ssr/[root-of-the-server]__a022445f._.js.map +1 -0
  238. package/web/.next/server/chunks/ssr/[root-of-the-server]__a7de2711._.js +4 -0
  239. package/web/.next/server/chunks/ssr/[root-of-the-server]__a7de2711._.js.map +1 -0
  240. package/web/.next/server/chunks/ssr/[root-of-the-server]__b724df9e._.js +3 -0
  241. package/web/.next/server/chunks/ssr/[root-of-the-server]__b724df9e._.js.map +1 -0
  242. package/web/.next/server/chunks/ssr/[root-of-the-server]__c16bf5de._.js +1 -1
  243. package/web/.next/server/chunks/ssr/[root-of-the-server]__c16bf5de._.js.map +1 -1
  244. package/web/.next/server/chunks/ssr/[root-of-the-server]__c9777776._.js +1 -1
  245. package/web/.next/server/chunks/ssr/[root-of-the-server]__c9777776._.js.map +1 -1
  246. package/web/.next/server/chunks/ssr/[root-of-the-server]__c9c1cfee._.js +3 -0
  247. package/web/.next/server/chunks/ssr/[root-of-the-server]__c9c1cfee._.js.map +1 -0
  248. package/web/.next/server/chunks/ssr/_135edb9c._.js +1 -1
  249. package/web/.next/server/chunks/ssr/_135edb9c._.js.map +1 -1
  250. package/web/.next/server/chunks/ssr/_1bb131c4._.js.map +1 -1
  251. package/web/.next/server/chunks/ssr/_1bb79fe8._.js +3 -0
  252. package/web/.next/server/chunks/ssr/_1bb79fe8._.js.map +1 -0
  253. package/web/.next/server/chunks/ssr/_2f6f48b8._.js +1 -1
  254. package/web/.next/server/chunks/ssr/_2f6f48b8._.js.map +1 -1
  255. package/web/.next/server/chunks/ssr/_59ae996e._.js +3 -0
  256. package/web/.next/server/chunks/ssr/_59ae996e._.js.map +1 -0
  257. package/web/.next/server/chunks/ssr/_75f4ccb3._.js +3 -0
  258. package/web/.next/server/chunks/ssr/_75f4ccb3._.js.map +1 -0
  259. package/web/.next/server/chunks/ssr/_ab069e13._.js +3 -0
  260. package/web/.next/server/chunks/ssr/_ab069e13._.js.map +1 -0
  261. package/web/.next/server/chunks/ssr/{_5f868392._.js → _aeb74a70._.js} +2 -2
  262. package/web/.next/server/chunks/ssr/_aeb74a70._.js.map +1 -0
  263. package/web/.next/server/chunks/ssr/_bed4bbb9._.js +3 -0
  264. package/web/.next/server/chunks/ssr/_bed4bbb9._.js.map +1 -0
  265. package/web/.next/server/chunks/ssr/_cc77a143._.js +1 -1
  266. package/web/.next/server/chunks/ssr/_cc77a143._.js.map +1 -1
  267. package/web/.next/server/chunks/ssr/_f605354c._.js +9 -0
  268. package/web/.next/server/chunks/ssr/_f605354c._.js.map +1 -0
  269. package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_settings_settings-page-client_tsx_6ed9d5f8._.js +1 -1
  270. package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_settings_settings-page-client_tsx_6ed9d5f8._.js.map +1 -1
  271. package/web/.next/server/chunks/ssr/node_modules__pnpm_b59e4b16._.js +3 -0
  272. package/web/.next/server/chunks/ssr/node_modules__pnpm_b59e4b16._.js.map +1 -0
  273. package/web/.next/server/chunks/ssr/src_presentation_web_0835b28e._.js +2 -2
  274. package/web/.next/server/chunks/ssr/src_presentation_web_0835b28e._.js.map +1 -1
  275. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_e99d78dd.js +1 -1
  276. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_e99d78dd.js.map +1 -1
  277. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_skills_page_actions_1fa8042e.js +1 -1
  278. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_skills_page_actions_1fa8042e.js.map +1 -1
  279. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_tools_page_actions_24684200.js +1 -1
  280. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_tools_page_actions_24684200.js.map +1 -1
  281. package/web/.next/server/chunks/ssr/src_presentation_web_ca99d62d._.js +1 -1
  282. package/web/.next/server/chunks/ssr/src_presentation_web_ca99d62d._.js.map +1 -1
  283. package/web/.next/server/chunks/ssr/src_presentation_web_components_bdcfba35._.js +3 -0
  284. package/web/.next/server/chunks/ssr/src_presentation_web_components_bdcfba35._.js.map +1 -0
  285. package/web/.next/server/chunks/ssr/src_presentation_web_components_bf50c527._.js +1 -1
  286. package/web/.next/server/chunks/ssr/src_presentation_web_components_de814675._.js +1 -1
  287. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js +1 -1
  288. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js.map +1 -1
  289. package/web/.next/server/chunks/ssr/src_presentation_web_e8034a29._.js +2 -2
  290. package/web/.next/server/chunks/ssr/src_presentation_web_e8034a29._.js.map +1 -1
  291. package/web/.next/server/pages/500.html +2 -2
  292. package/web/.next/server/server-reference-manifest.js +1 -1
  293. package/web/.next/server/server-reference-manifest.json +33 -33
  294. package/web/.next/static/chunks/1c5310cfde612b81.js +1 -0
  295. package/web/.next/static/chunks/{da24af4a494de11a.js → 2b35632c1b784fae.js} +1 -1
  296. package/web/.next/static/chunks/{dc81cb5172953533.js → 30097f88cdf8fad8.js} +1 -1
  297. package/web/.next/static/chunks/3678617c34576e18.js +2 -0
  298. package/web/.next/static/chunks/4562ee849ea13c3a.js +1 -0
  299. package/web/.next/static/chunks/{169d4ce4e5fa10d2.js → 69c6d3ba1606e98d.js} +1 -1
  300. package/web/.next/static/chunks/{bf46b5bf0d9d43b3.js → 7c57a9143e66868c.js} +2 -2
  301. package/web/.next/static/chunks/845d8e58a91014e6.js +1 -0
  302. package/web/.next/static/chunks/{7ce5aacd9b492e8c.js → c1a6934d2281c088.js} +1 -1
  303. package/web/.next/static/chunks/c4477c532d2081e8.js +1 -0
  304. package/web/.next/static/chunks/cca0f5112a9260d8.js +1 -0
  305. package/web/.next/static/chunks/d2739454715e5ef2.css +1 -0
  306. package/web/.next/static/chunks/ed113fb744f2e4d8.js +11 -0
  307. package/web/.next/static/chunks/{9285299c4fb0f020.js → f3c4a7bb76c69b01.js} +1 -1
  308. package/web/.next/server/chunks/[root-of-the-server]__7d5492a0._.js +0 -3
  309. package/web/.next/server/chunks/[root-of-the-server]__7d5492a0._.js.map +0 -1
  310. package/web/.next/server/chunks/ssr/7f428_lucide-react_dist_esm_icons_rocket_1575cd4d.js +0 -3
  311. package/web/.next/server/chunks/ssr/7f428_lucide-react_dist_esm_icons_rocket_1575cd4d.js.map +0 -1
  312. package/web/.next/server/chunks/ssr/[root-of-the-server]__2ff2daf6._.js +0 -4
  313. package/web/.next/server/chunks/ssr/[root-of-the-server]__3155add4._.js +0 -3
  314. package/web/.next/server/chunks/ssr/[root-of-the-server]__3155add4._.js.map +0 -1
  315. package/web/.next/server/chunks/ssr/[root-of-the-server]__6367aea0._.js +0 -3
  316. package/web/.next/server/chunks/ssr/[root-of-the-server]__6367aea0._.js.map +0 -1
  317. package/web/.next/server/chunks/ssr/[root-of-the-server]__7b707feb._.js +0 -4
  318. package/web/.next/server/chunks/ssr/[root-of-the-server]__7b707feb._.js.map +0 -1
  319. package/web/.next/server/chunks/ssr/[root-of-the-server]__8763fd7a._.js +0 -4
  320. package/web/.next/server/chunks/ssr/[root-of-the-server]__8763fd7a._.js.map +0 -1
  321. package/web/.next/server/chunks/ssr/[root-of-the-server]__9c56d724._.js +0 -3
  322. package/web/.next/server/chunks/ssr/[root-of-the-server]__9c56d724._.js.map +0 -1
  323. package/web/.next/server/chunks/ssr/[root-of-the-server]__cfc116d5._.js +0 -3
  324. package/web/.next/server/chunks/ssr/[root-of-the-server]__cfc116d5._.js.map +0 -1
  325. package/web/.next/server/chunks/ssr/[root-of-the-server]__d3841d9e._.js +0 -3
  326. package/web/.next/server/chunks/ssr/[root-of-the-server]__d3841d9e._.js.map +0 -1
  327. package/web/.next/server/chunks/ssr/[root-of-the-server]__db9afe04._.js +0 -3
  328. package/web/.next/server/chunks/ssr/[root-of-the-server]__db9afe04._.js.map +0 -1
  329. package/web/.next/server/chunks/ssr/_250a63ae._.js +0 -3
  330. package/web/.next/server/chunks/ssr/_250a63ae._.js.map +0 -1
  331. package/web/.next/server/chunks/ssr/_273d4632._.js +0 -3
  332. package/web/.next/server/chunks/ssr/_273d4632._.js.map +0 -1
  333. package/web/.next/server/chunks/ssr/_5f868392._.js.map +0 -1
  334. package/web/.next/server/chunks/ssr/_922aa39f._.js +0 -3
  335. package/web/.next/server/chunks/ssr/_922aa39f._.js.map +0 -1
  336. package/web/.next/server/chunks/ssr/_a68d7e1c._.js +0 -9
  337. package/web/.next/server/chunks/ssr/_a68d7e1c._.js.map +0 -1
  338. package/web/.next/server/chunks/ssr/_c6ec0fa4._.js +0 -3
  339. package/web/.next/server/chunks/ssr/_c6ec0fa4._.js.map +0 -1
  340. package/web/.next/server/chunks/ssr/_ca5a8b32._.js +0 -3
  341. package/web/.next/server/chunks/ssr/_ca5a8b32._.js.map +0 -1
  342. package/web/.next/server/chunks/ssr/_f5316e67._.js +0 -3
  343. package/web/.next/server/chunks/ssr/_f5316e67._.js.map +0 -1
  344. package/web/.next/server/chunks/ssr/src_presentation_web_components_a5e6c910._.js +0 -3
  345. package/web/.next/server/chunks/ssr/src_presentation_web_components_a5e6c910._.js.map +0 -1
  346. package/web/.next/static/chunks/15a2249cbec45bee.js +0 -11
  347. package/web/.next/static/chunks/3a806cf059241bc9.js +0 -1
  348. package/web/.next/static/chunks/3fb7682246dbaf45.js +0 -1
  349. package/web/.next/static/chunks/55c131b6fc504375.js +0 -1
  350. package/web/.next/static/chunks/59e6b9b540f05bf1.js +0 -1
  351. package/web/.next/static/chunks/62a8173911f8f130.css +0 -1
  352. package/web/.next/static/chunks/b1f3c0e8e9872ef8.js +0 -1
  353. package/web/.next/static/chunks/f7577de2f653acfc.js +0 -2
  354. /package/web/.next/server/chunks/{[root-of-the-server]__7d63f9a4._.js.map → [root-of-the-server]__53013576._.js.map} +0 -0
  355. /package/web/.next/server/chunks/{[root-of-the-server]__a1c7c02a._.js.map → [root-of-the-server]__92078db6._.js.map} +0 -0
  356. /package/web/.next/static/{akrvSvVQ4BzHsJ1sA0rS7 → qmHUdyRBvaVksgjcL6w-m}/_buildManifest.js +0 -0
  357. /package/web/.next/static/{akrvSvVQ4BzHsJ1sA0rS7 → qmHUdyRBvaVksgjcL6w-m}/_clientMiddlewareManifest.json +0 -0
  358. /package/web/.next/static/{akrvSvVQ4BzHsJ1sA0rS7 → qmHUdyRBvaVksgjcL6w-m}/_ssgManifest.js +0 -0
@@ -18,23 +18,15 @@ function getExtension(path) {
18
18
  const dot = path.lastIndexOf('.');
19
19
  return dot >= 0 ? path.slice(dot).toLowerCase() : '';
20
20
  }
21
- /** Build the API URL for serving an evidence file. */
22
- function buildEvidenceUrl(relativePath, basePath) {
23
- // If relativePath is already absolute, use it directly
24
- const filePath = relativePath.startsWith('/')
25
- ? relativePath
26
- : basePath
27
- ? `${basePath}/${relativePath}`
28
- : undefined;
29
- if (!filePath)
30
- return undefined;
31
- return `/api/evidence?path=${encodeURIComponent(filePath)}`;
21
+ /** Build the API URL for serving an evidence file (paths are pre-normalized to absolute). */
22
+ function buildEvidenceUrl(absolutePath) {
23
+ return `/api/evidence?path=${encodeURIComponent(absolutePath)}`;
32
24
  }
33
- function EvidenceItem({ evidence, basePath, }) {
25
+ function EvidenceItem({ evidence }) {
34
26
  const [expanded, setExpanded] = useState(true);
35
27
  const Icon = EVIDENCE_ICONS[evidence.type] ?? Camera;
36
28
  const ext = getExtension(evidence.relativePath);
37
- const url = buildEvidenceUrl(evidence.relativePath, basePath);
29
+ const url = buildEvidenceUrl(evidence.relativePath);
38
30
  const isImage = evidence.type === 'Screenshot' || IMAGE_EXTENSIONS.has(ext);
39
31
  const isVideo = evidence.type === 'Video' || VIDEO_EXTENSIONS.has(ext);
40
32
  const isText = evidence.type === 'TestOutput' || evidence.type === 'TerminalRecording';
@@ -62,14 +54,16 @@ function EvidenceTextPreview({ url }) {
62
54
  }
63
55
  return (_jsx("pre", { className: "bg-muted/50 max-h-60 overflow-auto rounded-md p-3 font-mono text-[11px] leading-relaxed", children: content }));
64
56
  }
65
- function EvidenceList({ evidence, basePath, }) {
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}`))) })] }) }));
57
+ function EvidenceList({ evidence }) {
58
+ 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 }, `${e.type}-${e.relativePath}`))) })] }) }));
67
59
  }
68
- export function MergeReview({ data, onApprove, onReject, isProcessing = false, isRejecting = false, chatInput, onChatInputChange, }) {
69
- const { pr, diffSummary, fileDiffs, branch, warning, evidence, evidenceBasePath } = data;
60
+ export function MergeReview({ data, readOnly = false, onApprove, onReject, isProcessing = false, isRejecting = false, chatInput, onChatInputChange, }) {
61
+ const { pr, diffSummary, fileDiffs, branch, warning, evidence } = data;
70
62
  const hasConflicts = pr?.mergeable === false;
71
63
  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 })] }));
64
+ 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
65
+ ? 'This feature was merged. Review the pull request details and evidence below.'
66
+ : pr
67
+ ? 'Review the pull request details and approve to merge.'
68
+ : '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 }) : 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
69
  }
@@ -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
+ };
@@ -1 +1 @@
1
- {"version":3,"file":"repository-node.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/repository-node/repository-node.tsx"],"names":[],"mappings":"AAqBA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAGnE,wBAAgB,cAAc,CAAC,EAAE,IAAI,EAAE,EAAE;IAAE,IAAI,EAAE,kBAAkB,CAAC;IAAC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;CAAE,2CAkP5F"}
1
+ {"version":3,"file":"repository-node.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/repository-node/repository-node.tsx"],"names":[],"mappings":"AAsBA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAOnE,wBAAgB,cAAc,CAAC,EAAE,IAAI,EAAE,EAAE;IAAE,IAAI,EAAE,kBAAkB,CAAC;IAAC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;CAAE,2CAyR5F"}
@@ -1,7 +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 } from 'react';
3
+ import { useState, useCallback } from 'react';
4
4
  import { Handle, Position } from '@xyflow/react';
5
+ import { useRouter } from 'next/navigation';
5
6
  import { Github, Plus, Code2, Terminal, FolderOpen, Trash2, Play, Square } from 'lucide-react';
6
7
  import { cn } from '../../../lib/utils.js';
7
8
  import { ActionButton } from '../../common/action-button/index.js';
@@ -12,7 +13,9 @@ import { DeploymentStatusBadge } from '../../common/deployment-status-badge/inde
12
13
  import { useDeployAction } from '../../../hooks/use-deploy-action.js';
13
14
  import { useFeatureFlags } from '../../../hooks/feature-flags-context.js';
14
15
  import { useRepositoryActions } from './use-repository-actions.js';
16
+ import { FeatureSessionsDropdown, } from '../../common/feature-node/feature-sessions-dropdown.js';
15
17
  export function RepositoryNode({ data }) {
18
+ const router = useRouter();
16
19
  const featureFlags = useFeatureFlags();
17
20
  const [confirmOpen, setConfirmOpen] = useState(false);
18
21
  const actions = useRepositoryActions(data.repositoryPath ? { repositoryPath: data.repositoryPath } : null);
@@ -24,6 +27,36 @@ export function RepositoryNode({ data }) {
24
27
  }
25
28
  : null);
26
29
  const isDeploymentActive = deployAction.status === 'Booting' || deployAction.status === 'Ready';
30
+ const handleCreateFromSession = useCallback((session, sessionFilePath) => {
31
+ if (!data.repositoryPath)
32
+ return;
33
+ const preview = session.preview ? session.preview.slice(0, 200) : 'Unknown conversation';
34
+ const prompt = [
35
+ `Continue work from a previous agent session.`,
36
+ ``,
37
+ `## Session Context`,
38
+ `- Session ID: ${session.id}`,
39
+ `- Messages: ${session.messageCount}`,
40
+ session.lastMessageAt ? `- Last active: ${session.lastMessageAt}` : '',
41
+ `- Conversation file: ${sessionFilePath}`,
42
+ ``,
43
+ `## Session Preview`,
44
+ `> ${preview}`,
45
+ ``,
46
+ `## Instructions`,
47
+ `1. Read the full conversation history from the file above`,
48
+ `2. Analyze the current state of the repository — what was done, what remains`,
49
+ `3. Create or update spec files to accurately reflect the current state and remaining work`,
50
+ `4. Continue implementing any unfinished work from the conversation`,
51
+ ]
52
+ .filter(Boolean)
53
+ .join('\n');
54
+ const params = new URLSearchParams({
55
+ repo: data.repositoryPath,
56
+ prompt,
57
+ });
58
+ router.push(`/create?${params.toString()}`);
59
+ }, [data.repositoryPath, router]);
27
60
  return (_jsxs("div", { className: cn('group relative', data.onDelete && data.id && 'pl-10'), children: [data.showHandles ? (_jsx(Handle, { type: "target", position: Position.Left, isConnectable: false, className: "opacity-0!" })) : null, data.onDelete && data.id ? (_jsxs(_Fragment, { children: [_jsx("div", { className: "absolute top-1/2 left-0 -translate-y-1/2 opacity-0 transition-opacity group-hover:opacity-100", children: _jsx(TooltipProvider, { children: _jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx("button", { "aria-label": "Remove repository", "data-testid": "repository-node-delete-button", onClick: (e) => {
28
61
  e.stopPropagation();
29
62
  setConfirmOpen(true);
@@ -39,7 +72,7 @@ export function RepositoryNode({ data }) {
39
72
  e.stopPropagation();
40
73
  data.onClick?.();
41
74
  }
42
- }, className: "nodrag bg-card flex min-w-[18rem] cursor-pointer items-center gap-3 rounded-full border px-4 py-3 shadow-sm", children: [_jsx(Github, { className: "text-muted-foreground h-5 w-5 shrink-0" }), _jsx("span", { "data-testid": "repository-node-name", className: "min-w-0 truncate text-sm font-medium", children: data.name }), _jsxs("div", { className: cn('flex shrink-0 items-center gap-2', (data.repositoryPath ?? data.onAdd) && 'ml-auto'), onClick: (e) => e.stopPropagation(), children: [data.repositoryPath ? (_jsxs(_Fragment, { children: [_jsx(TooltipProvider, { children: _jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx("span", { className: "flex items-center", children: _jsx(ActionButton, { label: "Open in IDE", onClick: actions.openInIde, loading: actions.ideLoading, error: !!actions.ideError, icon: Code2, iconOnly: true, variant: "ghost", size: "icon-xs" }) }) }), _jsx(TooltipContent, { children: "Open in IDE" })] }) }), _jsx(TooltipProvider, { children: _jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx("span", { className: "flex items-center", children: _jsx(ActionButton, { label: "Open in Shell", onClick: actions.openInShell, loading: actions.shellLoading, error: !!actions.shellError, icon: Terminal, iconOnly: true, variant: "ghost", size: "icon-xs" }) }) }), _jsx(TooltipContent, { children: "Open in Shell" })] }) }), _jsx(TooltipProvider, { children: _jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx("span", { className: "flex items-center", children: _jsx(ActionButton, { label: "Open Folder", onClick: actions.openFolder, loading: actions.folderLoading, error: !!actions.folderError, icon: FolderOpen, iconOnly: true, variant: "ghost", size: "icon-xs" }) }) }), _jsx(TooltipContent, { children: "Open Folder" })] }) }), featureFlags.envDeploy ? (_jsxs(_Fragment, { children: [_jsx(TooltipProvider, { children: _jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx("span", { className: "flex items-center", children: _jsx(ActionButton, { label: isDeploymentActive ? 'Stop Dev Server' : 'Start Dev Server', onClick: isDeploymentActive ? deployAction.stop : deployAction.deploy, loading: deployAction.deployLoading || deployAction.stopLoading, error: !!deployAction.deployError, icon: isDeploymentActive ? Square : Play, iconOnly: true, variant: "ghost", size: "icon-xs" }) }) }), _jsx(TooltipContent, { children: isDeploymentActive ? 'Stop Dev Server' : 'Start Dev Server' })] }) }), isDeploymentActive ? (_jsx(DeploymentStatusBadge, { status: deployAction.status, url: deployAction.url, targetId: data.repositoryPath })) : null] })) : null] })) : null, data.onAdd ? (_jsx(TooltipProvider, { children: _jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx("button", { "aria-label": "Add feature", "data-testid": "repository-node-add-button", onClick: (e) => {
75
+ }, className: "nodrag bg-card flex min-w-[18rem] cursor-pointer items-center gap-3 rounded-full border px-4 py-3 shadow-sm", children: [_jsx(Github, { className: "text-muted-foreground h-5 w-5 shrink-0" }), _jsx("span", { "data-testid": "repository-node-name", className: "min-w-0 truncate text-sm font-medium", children: data.name }), _jsxs("div", { className: cn('flex shrink-0 items-center gap-2', (data.repositoryPath ?? data.onAdd) && 'ml-auto'), onClick: (e) => e.stopPropagation(), children: [data.repositoryPath ? (_jsxs(_Fragment, { children: [_jsx(TooltipProvider, { children: _jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx("span", { className: "flex items-center", children: _jsx(ActionButton, { label: "Open in IDE", onClick: actions.openInIde, loading: actions.ideLoading, error: !!actions.ideError, icon: Code2, iconOnly: true, variant: "ghost", size: "icon-xs" }) }) }), _jsx(TooltipContent, { children: "Open in IDE" })] }) }), _jsx(TooltipProvider, { children: _jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx("span", { className: "flex items-center", children: _jsx(ActionButton, { label: "Open in Shell", onClick: actions.openInShell, loading: actions.shellLoading, error: !!actions.shellError, icon: Terminal, iconOnly: true, variant: "ghost", size: "icon-xs" }) }) }), _jsx(TooltipContent, { children: "Open in Shell" })] }) }), _jsx(TooltipProvider, { children: _jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx("span", { className: "flex items-center", children: _jsx(ActionButton, { label: "Open Folder", onClick: actions.openFolder, loading: actions.folderLoading, error: !!actions.folderError, icon: FolderOpen, iconOnly: true, variant: "ghost", size: "icon-xs" }) }) }), _jsx(TooltipContent, { children: "Open Folder" })] }) }), _jsx(FeatureSessionsDropdown, { repositoryPath: data.repositoryPath, onCreateFromSession: handleCreateFromSession }), featureFlags.envDeploy ? (_jsxs(_Fragment, { children: [_jsx(TooltipProvider, { children: _jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx("span", { className: "flex items-center", children: _jsx(ActionButton, { label: isDeploymentActive ? 'Stop Dev Server' : 'Start Dev Server', onClick: isDeploymentActive ? deployAction.stop : deployAction.deploy, loading: deployAction.deployLoading || deployAction.stopLoading, error: !!deployAction.deployError, icon: isDeploymentActive ? Square : Play, iconOnly: true, variant: "ghost", size: "icon-xs" }) }) }), _jsx(TooltipContent, { children: isDeploymentActive ? 'Stop Dev Server' : 'Start Dev Server' })] }) }), isDeploymentActive ? (_jsx(DeploymentStatusBadge, { status: deployAction.status, url: deployAction.url, targetId: data.repositoryPath })) : null] })) : null] })) : null, data.onAdd ? (_jsx(TooltipProvider, { children: _jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx("button", { "aria-label": "Add feature", "data-testid": "repository-node-add-button", onClick: (e) => {
43
76
  e.stopPropagation();
44
77
  data.onAdd?.();
45
78
  }, className: cn('text-muted-foreground hover:bg-accent dark:hover:bg-accent/50 flex h-6 w-6 shrink-0 cursor-pointer items-center justify-center rounded-full transition-colors hover:text-blue-500', data.pulseAdd &&
@@ -1 +1 @@
1
- {"version":3,"file":"settings-page-client.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/features/settings/settings-page-client.tsx"],"names":[],"mappings":"AA4CA,OAAO,KAAK,EACV,QAAQ,EAGT,MAAM,sCAAsC,CAAC;AAC9C,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,uCAAuC,CAAC;AAgC/E,MAAM,WAAW,uBAAuB;IACtC,QAAQ,EAAE,QAAQ,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,kBAAkB,CAAC,EAAE,iBAAiB,EAAE,CAAC;CAC1C;AA6QD,wBAAgB,kBAAkB,CAAC,EACjC,QAAQ,EACR,QAAQ,EACR,UAAU,EACV,kBAAkB,GACnB,EAAE,uBAAuB,2CA4nCzB"}
1
+ {"version":3,"file":"settings-page-client.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/features/settings/settings-page-client.tsx"],"names":[],"mappings":"AA4CA,OAAO,KAAK,EACV,QAAQ,EAGT,MAAM,sCAAsC,CAAC;AAC9C,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,uCAAuC,CAAC;AAgC/E,MAAM,WAAW,uBAAuB;IACtC,QAAQ,EAAE,QAAQ,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,kBAAkB,CAAC,EAAE,iBAAiB,EAAE,CAAC;CAC1C;AA6QD,wBAAgB,kBAAkB,CAAC,EACjC,QAAQ,EACR,QAAQ,EACR,UAAU,EACV,kBAAkB,GACnB,EAAE,uBAAuB,2CAyqCzB"}
@@ -144,11 +144,15 @@ export function SettingsPageClient({ settings, shepHome, dbFileSize, availableTe
144
144
  const [allowMerge, setAllowMerge] = useState(settings.workflow.approvalGateDefaults.allowMerge);
145
145
  const [enableEvidence, setEnableEvidence] = useState(settings.workflow.enableEvidence);
146
146
  const [commitEvidence, setCommitEvidence] = useState(settings.workflow.commitEvidence);
147
+ const [ciWatchEnabled, setCiWatchEnabled] = useState(settings.workflow.ciWatchEnabled !== false);
147
148
  const [ciMaxFix, setCiMaxFix] = useState(settings.workflow.ciMaxFixAttempts != null ? String(settings.workflow.ciMaxFixAttempts) : '');
148
149
  const [ciTimeout, setCiTimeout] = useState(settings.workflow.ciWatchTimeoutMs != null
149
150
  ? String(Math.round(settings.workflow.ciWatchTimeoutMs / 1000))
150
151
  : '');
151
152
  const [ciLogMax, setCiLogMax] = useState(settings.workflow.ciLogMaxChars != null ? String(settings.workflow.ciLogMaxChars) : '');
153
+ const [ciPollInterval, setCiPollInterval] = useState(settings.workflow.ciWatchPollIntervalSeconds != null
154
+ ? String(settings.workflow.ciWatchPollIntervalSeconds)
155
+ : '');
152
156
  // Feature agent per-stage timeout states (stored in seconds for display, converted to ms on save)
153
157
  // Defaults: feature agent stages = 1_800_000 ms (1800s), analyze-repo = 600_000 ms (600s)
154
158
  const stageTimeoutsConfig = settings.workflow.stageTimeouts;
@@ -174,6 +178,9 @@ export function SettingsPageClient({ settings, shepHome, dbFileSize, availableTe
174
178
  ? String(Math.round(settings.workflow.ciWatchTimeoutMs / 1000))
175
179
  : '';
176
180
  const originalCiLogMax = settings.workflow.ciLogMaxChars != null ? String(settings.workflow.ciLogMaxChars) : '';
181
+ const originalCiPollInterval = settings.workflow.ciWatchPollIntervalSeconds != null
182
+ ? String(settings.workflow.ciWatchPollIntervalSeconds)
183
+ : '';
177
184
  const originalAnalyzeTimeout = stageTimeoutsConfig?.analyzeMs != null
178
185
  ? String(Math.round(stageTimeoutsConfig.analyzeMs / 1000))
179
186
  : '';
@@ -230,9 +237,11 @@ export function SettingsPageClient({ settings, shepHome, dbFileSize, availableTe
230
237
  },
231
238
  enableEvidence: overrides.enableEvidence ?? enableEvidence,
232
239
  commitEvidence: overrides.commitEvidence ?? commitEvidence,
240
+ ciWatchEnabled: overrides.ciWatchEnabled ?? ciWatchEnabled,
233
241
  ciMaxFixAttempts: parseOptionalInt(overrides.ciMaxFix ?? ciMaxFix),
234
242
  ciWatchTimeoutMs: timeoutSeconds != null ? timeoutSeconds * 1000 : undefined,
235
243
  ciLogMaxChars: parseOptionalInt(overrides.ciLogMax ?? ciLogMax),
244
+ ciWatchPollIntervalSeconds: parseOptionalInt(overrides.ciPollInterval ?? ciPollInterval),
236
245
  stageTimeouts: {
237
246
  analyzeMs: secondsToMs(overrides.analyzeTimeout ?? analyzeTimeout),
238
247
  requirementsMs: secondsToMs(overrides.requirementsTimeout ?? requirementsTimeout),
@@ -377,6 +386,9 @@ export function SettingsPageClient({ settings, shepHome, dbFileSize, availableTe
377
386
  else {
378
387
  save(buildWorkflowPayload({ openPr: v }));
379
388
  }
389
+ } }), _jsx(SwitchRow, { label: "Watch CI after push", description: "Monitor CI and auto-fix failures. Disable to avoid rate limits.", id: "ci-watch-enabled", testId: "switch-ci-watch-enabled", checked: ciWatchEnabled, onChange: (v) => {
390
+ setCiWatchEnabled(v);
391
+ save(buildWorkflowPayload({ ciWatchEnabled: v }));
380
392
  } })] }), _jsx(SectionHint, { links: [
381
393
  {
382
394
  label: 'Approval gates',
@@ -395,7 +407,10 @@ export function SettingsPageClient({ settings, shepHome, dbFileSize, availableTe
395
407
  }, min: 30, step: 30, suffix: "sec" }) }), _jsx(SettingsRow, { label: "Max log size", description: "Truncate CI logs beyond this limit", htmlFor: "ci-log-max", children: _jsx(NumberStepper, { id: "ci-log-max", testId: "ci-log-max-input", placeholder: "50000", value: ciLogMax, onChange: setCiLogMax, onBlur: () => {
396
408
  if (ciLogMax !== originalCiLogMax)
397
409
  save(buildWorkflowPayload({ ciLogMax }));
398
- }, min: 1000, step: 5000, suffix: "chars" }) })] }), _jsx(SectionHint, { links: [
410
+ }, min: 1000, step: 5000, suffix: "chars" }) }), _jsx(SettingsRow, { label: "Poll interval", description: "How often to check GitHub for CI status updates", htmlFor: "ci-poll-interval", children: _jsx(NumberStepper, { id: "ci-poll-interval", testId: "ci-poll-interval-input", placeholder: "30", value: ciPollInterval, onChange: setCiPollInterval, onBlur: () => {
411
+ if (ciPollInterval !== originalCiPollInterval)
412
+ save(buildWorkflowPayload({ ciPollInterval }));
413
+ }, min: 5, step: 5, suffix: "sec" }) })] }), _jsx(SectionHint, { links: [
399
414
  {
400
415
  label: 'CI/CD pipeline',
401
416
  href: 'https://github.com/shep-ai/cli/blob/main/docs/development/cicd.md',
@@ -1 +1 @@
1
- {"version":3,"file":"workflow-settings-section.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/features/settings/workflow-settings-section.tsx"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sCAAsC,CAAC;AAE3E,MAAM,WAAW,4BAA4B;IAC3C,QAAQ,EAAE,cAAc,CAAC;CAC1B;AAED,wBAAgB,uBAAuB,CAAC,EAAE,QAAQ,EAAE,EAAE,4BAA4B,2CA0ajF"}
1
+ {"version":3,"file":"workflow-settings-section.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/features/settings/workflow-settings-section.tsx"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sCAAsC,CAAC;AAE3E,MAAM,WAAW,4BAA4B;IAC3C,QAAQ,EAAE,cAAc,CAAC;CAC1B;AAED,wBAAgB,uBAAuB,CAAC,EAAE,QAAQ,EAAE,EAAE,4BAA4B,2CAudjF"}
@@ -16,9 +16,11 @@ export function WorkflowSettingsSection({ workflow }) {
16
16
  const [allowPrd, setAllowPrd] = useState(workflow.approvalGateDefaults.allowPrd);
17
17
  const [allowPlan, setAllowPlan] = useState(workflow.approvalGateDefaults.allowPlan);
18
18
  const [allowMerge, setAllowMerge] = useState(workflow.approvalGateDefaults.allowMerge);
19
+ const [ciWatchEnabled, setCiWatchEnabled] = useState(workflow.ciWatchEnabled !== false);
19
20
  const [ciMaxFix, setCiMaxFix] = useState(workflow.ciMaxFixAttempts != null ? String(workflow.ciMaxFixAttempts) : '');
20
21
  const [ciTimeout, setCiTimeout] = useState(workflow.ciWatchTimeoutMs != null ? String(Math.round(workflow.ciWatchTimeoutMs / 1000)) : '');
21
22
  const [ciLogMax, setCiLogMax] = useState(workflow.ciLogMaxChars != null ? String(workflow.ciLogMaxChars) : '');
23
+ const [ciPollInterval, setCiPollInterval] = useState(workflow.ciWatchPollIntervalSeconds != null ? String(workflow.ciWatchPollIntervalSeconds) : '');
22
24
  // Per-stage timeout states (seconds for display)
23
25
  // Defaults: feature agent stages = 1_800_000 ms (1800s), analyze-repo = 600_000 ms (600s)
24
26
  const st = workflow.stageTimeouts;
@@ -63,9 +65,11 @@ export function WorkflowSettingsSection({ workflow }) {
63
65
  allowPlan: overrides.allowPlan ?? allowPlan,
64
66
  allowMerge: overrides.allowMerge ?? allowMerge,
65
67
  },
68
+ ciWatchEnabled: overrides.ciWatchEnabled ?? ciWatchEnabled,
66
69
  ciMaxFixAttempts: parseOptionalInt(overrides.ciMaxFix ?? ciMaxFix),
67
70
  ciWatchTimeoutMs: timeoutSeconds != null ? timeoutSeconds * 1000 : undefined,
68
71
  ciLogMaxChars: parseOptionalInt(overrides.ciLogMax ?? ciLogMax),
72
+ ciWatchPollIntervalSeconds: parseOptionalInt(overrides.ciPollInterval ?? ciPollInterval),
69
73
  stageTimeouts: {
70
74
  analyzeMs: secondsToMs(overrides.analyzeTimeout ?? analyzeTimeout),
71
75
  requirementsMs: secondsToMs(overrides.requirementsTimeout ?? requirementsTimeout),
@@ -100,6 +104,7 @@ export function WorkflowSettingsSection({ workflow }) {
100
104
  const originalCiMaxFix = workflow.ciMaxFixAttempts != null ? String(workflow.ciMaxFixAttempts) : '';
101
105
  const originalCiTimeout = workflow.ciWatchTimeoutMs != null ? String(Math.round(workflow.ciWatchTimeoutMs / 1000)) : '';
102
106
  const originalCiLogMax = workflow.ciLogMaxChars != null ? String(workflow.ciLogMaxChars) : '';
107
+ const originalCiPollInterval = workflow.ciWatchPollIntervalSeconds != null ? String(workflow.ciWatchPollIntervalSeconds) : '';
103
108
  const originalAnalyzeTimeout = st?.analyzeMs != null ? String(Math.round(st.analyzeMs / 1000)) : '';
104
109
  const originalRequirementsTimeout = st?.requirementsMs != null ? String(Math.round(st.requirementsMs / 1000)) : '';
105
110
  const originalResearchTimeout = st?.researchMs != null ? String(Math.round(st.researchMs / 1000)) : '';
@@ -167,5 +172,5 @@ export function WorkflowSettingsSection({ workflow }) {
167
172
  original: originalAnalyzeRepoTimeout,
168
173
  },
169
174
  ];
170
- return (_jsxs(Card, { id: "workflow", className: "scroll-mt-6", "data-testid": "workflow-settings-section", children: [_jsxs(CardHeader, { children: [_jsxs("div", { className: "flex items-center justify-between", children: [_jsxs("div", { className: "flex items-center gap-2", children: [_jsx(GitBranch, { className: "text-muted-foreground h-4 w-4" }), _jsx(CardTitle, { children: "Workflow" })] }), isPending ? _jsx("span", { className: "text-muted-foreground text-xs", children: "Saving..." }) : null, showSaved && !isPending ? (_jsxs("span", { className: "flex items-center gap-1 text-xs text-green-600", children: [_jsx(Check, { className: "h-3 w-3" }), "Saved"] })) : null] }), _jsx(CardDescription, { children: "Configure PR behavior, approval gates, and CI settings" })] }), _jsxs(CardContent, { className: "space-y-4", children: [_jsxs("div", { className: "space-y-3", children: [_jsxs("div", { className: "flex items-center justify-between gap-4", children: [_jsxs("div", { className: "space-y-0.5", children: [_jsx(Label, { htmlFor: "open-pr", children: "Open PR on implementation complete" }), _jsx("p", { className: "text-muted-foreground text-xs", children: "Automatically create a pull request when the agent finishes" })] }), _jsx(Switch, { id: "open-pr", "data-testid": "switch-open-pr", checked: openPr, onCheckedChange: (v) => handleSwitchChange('openPr', setOpenPr, v) })] }), _jsxs("div", { className: "flex items-center justify-between gap-4", children: [_jsxs("div", { className: "space-y-0.5", children: [_jsx(Label, { htmlFor: "push-on-complete", children: "Push on implementation complete" }), _jsx("p", { className: "text-muted-foreground text-xs", children: "Push the branch to remote when implementation is done" })] }), _jsx(Switch, { id: "push-on-complete", "data-testid": "switch-push-on-complete", checked: pushOnComplete, onCheckedChange: (v) => handleSwitchChange('pushOnComplete', setPushOnComplete, v) })] })] }), _jsx(Separator, {}), _jsxs("div", { className: "space-y-3", children: [_jsx("h3", { className: "text-sm font-semibold", children: "Approval Gates" }), _jsxs("div", { className: "flex items-center justify-between gap-4", children: [_jsxs("div", { className: "space-y-0.5", children: [_jsx(Label, { htmlFor: "allow-prd", children: "PRD auto-approval" }), _jsx("p", { className: "text-muted-foreground text-xs", children: "Skip manual approval for product requirement documents" })] }), _jsx(Switch, { id: "allow-prd", "data-testid": "switch-allow-prd", checked: allowPrd, onCheckedChange: (v) => handleSwitchChange('allowPrd', setAllowPrd, v) })] }), _jsxs("div", { className: "flex items-center justify-between gap-4", children: [_jsxs("div", { className: "space-y-0.5", children: [_jsx(Label, { htmlFor: "allow-plan", children: "Plan auto-approval" }), _jsx("p", { className: "text-muted-foreground text-xs", children: "Skip manual approval for implementation plans" })] }), _jsx(Switch, { id: "allow-plan", "data-testid": "switch-allow-plan", checked: allowPlan, onCheckedChange: (v) => handleSwitchChange('allowPlan', setAllowPlan, v) })] }), _jsxs("div", { className: "flex items-center justify-between gap-4", children: [_jsxs("div", { className: "space-y-0.5", children: [_jsx(Label, { htmlFor: "allow-merge", children: "Merge auto-approval" }), _jsx("p", { className: "text-muted-foreground text-xs", children: "Skip manual approval for PR merges" })] }), _jsx(Switch, { id: "allow-merge", "data-testid": "switch-allow-merge", checked: allowMerge, onCheckedChange: (v) => handleSwitchChange('allowMerge', setAllowMerge, v) })] })] }), _jsx(Separator, {}), _jsxs("div", { className: "space-y-3", children: [_jsx("h3", { className: "text-sm font-semibold", children: "CI Settings" }), _jsxs("div", { className: "space-y-1.5", children: [_jsx(Label, { htmlFor: "ci-max-fix", children: "Max fix attempts" }), _jsx(Input, { id: "ci-max-fix", "data-testid": "ci-max-fix-input", type: "text", inputMode: "numeric", pattern: "[0-9]*", min: 1, max: 10, placeholder: "e.g., 3", value: ciMaxFix, onChange: (e) => setCiMaxFix(e.target.value), onBlur: () => handleFieldBlur('ciMaxFix', ciMaxFix, originalCiMaxFix) }), _jsx("p", { className: "text-muted-foreground text-xs", children: "How many times the agent retries fixing CI failures" })] }), _jsxs("div", { className: "space-y-1.5", children: [_jsx(Label, { htmlFor: "ci-timeout", children: "Watch timeout (seconds)" }), _jsx(Input, { id: "ci-timeout", "data-testid": "ci-timeout-input", type: "text", inputMode: "numeric", pattern: "[0-9]*", placeholder: "e.g., 300", value: ciTimeout, onChange: (e) => setCiTimeout(e.target.value), onBlur: () => handleFieldBlur('ciTimeout', ciTimeout, originalCiTimeout) }), _jsx("p", { className: "text-muted-foreground text-xs", children: "How long to wait for CI to complete before timing out" })] }), _jsxs("div", { className: "space-y-1.5", children: [_jsx(Label, { htmlFor: "ci-log-max", children: "Max log characters" }), _jsx(Input, { id: "ci-log-max", "data-testid": "ci-log-max-input", type: "text", inputMode: "numeric", pattern: "[0-9]*", placeholder: "e.g., 50000", value: ciLogMax, onChange: (e) => setCiLogMax(e.target.value), onBlur: () => handleFieldBlur('ciLogMax', ciLogMax, originalCiLogMax) }), _jsx("p", { className: "text-muted-foreground text-xs", children: "Maximum characters to capture from CI logs" })] })] }), _jsx(Separator, {}), _jsxs("div", { className: "space-y-3", children: [_jsx("h3", { className: "text-sm font-semibold", children: "Stage Timeouts" }), _jsx("p", { className: "text-muted-foreground text-xs", children: "Maximum execution time per agent stage" }), _jsx("h4", { className: "text-muted-foreground text-xs font-semibold tracking-wider uppercase", children: "Feature Agent" }), FEATURE_AGENT_FIELDS.map((field) => (_jsxs("div", { className: "flex items-center justify-between gap-4", children: [_jsx(Label, { htmlFor: `stage-timeout-${field.key}`, children: field.label }), _jsx(TimeoutSlider, { id: `stage-timeout-${field.key}`, testId: `stage-timeout-${field.key}-input`, value: field.state, onChange: field.setter, onBlur: () => handleFieldBlur(field.key, field.state, field.original), defaultSeconds: field.defaultSeconds })] }, field.key))), _jsx("h4", { className: "text-muted-foreground pt-2 text-xs font-semibold tracking-wider uppercase", children: "Analyze Repository Agent" }), ANALYZE_REPO_FIELDS.map((field) => (_jsxs("div", { className: "flex items-center justify-between gap-4", children: [_jsx(Label, { htmlFor: `stage-timeout-${field.key}`, children: field.label }), _jsx(TimeoutSlider, { id: `stage-timeout-${field.key}`, testId: `stage-timeout-${field.key}-input`, value: field.state, onChange: field.setter, onBlur: () => handleFieldBlur(field.key, field.state, field.original), defaultSeconds: field.defaultSeconds })] }, field.key)))] })] })] }));
175
+ return (_jsxs(Card, { id: "workflow", className: "scroll-mt-6", "data-testid": "workflow-settings-section", children: [_jsxs(CardHeader, { children: [_jsxs("div", { className: "flex items-center justify-between", children: [_jsxs("div", { className: "flex items-center gap-2", children: [_jsx(GitBranch, { className: "text-muted-foreground h-4 w-4" }), _jsx(CardTitle, { children: "Workflow" })] }), isPending ? _jsx("span", { className: "text-muted-foreground text-xs", children: "Saving..." }) : null, showSaved && !isPending ? (_jsxs("span", { className: "flex items-center gap-1 text-xs text-green-600", children: [_jsx(Check, { className: "h-3 w-3" }), "Saved"] })) : null] }), _jsx(CardDescription, { children: "Configure PR behavior, approval gates, and CI settings" })] }), _jsxs(CardContent, { className: "space-y-4", children: [_jsxs("div", { className: "space-y-3", children: [_jsxs("div", { className: "flex items-center justify-between gap-4", children: [_jsxs("div", { className: "space-y-0.5", children: [_jsx(Label, { htmlFor: "open-pr", children: "Open PR on implementation complete" }), _jsx("p", { className: "text-muted-foreground text-xs", children: "Automatically create a pull request when the agent finishes" })] }), _jsx(Switch, { id: "open-pr", "data-testid": "switch-open-pr", checked: openPr, onCheckedChange: (v) => handleSwitchChange('openPr', setOpenPr, v) })] }), _jsxs("div", { className: "flex items-center justify-between gap-4", children: [_jsxs("div", { className: "space-y-0.5", children: [_jsx(Label, { htmlFor: "push-on-complete", children: "Push on implementation complete" }), _jsx("p", { className: "text-muted-foreground text-xs", children: "Push the branch to remote when implementation is done" })] }), _jsx(Switch, { id: "push-on-complete", "data-testid": "switch-push-on-complete", checked: pushOnComplete, onCheckedChange: (v) => handleSwitchChange('pushOnComplete', setPushOnComplete, v) })] })] }), _jsx(Separator, {}), _jsxs("div", { className: "space-y-3", children: [_jsx("h3", { className: "text-sm font-semibold", children: "Approval Gates" }), _jsxs("div", { className: "flex items-center justify-between gap-4", children: [_jsxs("div", { className: "space-y-0.5", children: [_jsx(Label, { htmlFor: "allow-prd", children: "PRD auto-approval" }), _jsx("p", { className: "text-muted-foreground text-xs", children: "Skip manual approval for product requirement documents" })] }), _jsx(Switch, { id: "allow-prd", "data-testid": "switch-allow-prd", checked: allowPrd, onCheckedChange: (v) => handleSwitchChange('allowPrd', setAllowPrd, v) })] }), _jsxs("div", { className: "flex items-center justify-between gap-4", children: [_jsxs("div", { className: "space-y-0.5", children: [_jsx(Label, { htmlFor: "allow-plan", children: "Plan auto-approval" }), _jsx("p", { className: "text-muted-foreground text-xs", children: "Skip manual approval for implementation plans" })] }), _jsx(Switch, { id: "allow-plan", "data-testid": "switch-allow-plan", checked: allowPlan, onCheckedChange: (v) => handleSwitchChange('allowPlan', setAllowPlan, v) })] }), _jsxs("div", { className: "flex items-center justify-between gap-4", children: [_jsxs("div", { className: "space-y-0.5", children: [_jsx(Label, { htmlFor: "allow-merge", children: "Merge auto-approval" }), _jsx("p", { className: "text-muted-foreground text-xs", children: "Skip manual approval for PR merges" })] }), _jsx(Switch, { id: "allow-merge", "data-testid": "switch-allow-merge", checked: allowMerge, onCheckedChange: (v) => handleSwitchChange('allowMerge', setAllowMerge, v) })] })] }), _jsx(Separator, {}), _jsxs("div", { className: "space-y-3", children: [_jsx("h3", { className: "text-sm font-semibold", children: "CI Settings" }), _jsxs("div", { className: "flex items-center justify-between gap-4", children: [_jsxs("div", { className: "space-y-0.5", children: [_jsx(Label, { htmlFor: "ci-watch-enabled", children: "CI watch/fix loop" }), _jsx("p", { className: "text-muted-foreground text-xs", children: "Watch CI status after push and auto-fix failures. Disable to avoid GitHub API rate limits." })] }), _jsx(Switch, { id: "ci-watch-enabled", "data-testid": "switch-ci-watch-enabled", checked: ciWatchEnabled, onCheckedChange: (v) => handleSwitchChange('ciWatchEnabled', setCiWatchEnabled, v) })] }), _jsxs("div", { className: "space-y-1.5", children: [_jsx(Label, { htmlFor: "ci-max-fix", children: "Max fix attempts" }), _jsx(Input, { id: "ci-max-fix", "data-testid": "ci-max-fix-input", type: "text", inputMode: "numeric", pattern: "[0-9]*", min: 1, max: 10, placeholder: "e.g., 3", value: ciMaxFix, onChange: (e) => setCiMaxFix(e.target.value), onBlur: () => handleFieldBlur('ciMaxFix', ciMaxFix, originalCiMaxFix) }), _jsx("p", { className: "text-muted-foreground text-xs", children: "How many times the agent retries fixing CI failures" })] }), _jsxs("div", { className: "space-y-1.5", children: [_jsx(Label, { htmlFor: "ci-timeout", children: "Watch timeout (seconds)" }), _jsx(Input, { id: "ci-timeout", "data-testid": "ci-timeout-input", type: "text", inputMode: "numeric", pattern: "[0-9]*", placeholder: "e.g., 300", value: ciTimeout, onChange: (e) => setCiTimeout(e.target.value), onBlur: () => handleFieldBlur('ciTimeout', ciTimeout, originalCiTimeout) }), _jsx("p", { className: "text-muted-foreground text-xs", children: "How long to wait for CI to complete before timing out" })] }), _jsxs("div", { className: "space-y-1.5", children: [_jsx(Label, { htmlFor: "ci-log-max", children: "Max log characters" }), _jsx(Input, { id: "ci-log-max", "data-testid": "ci-log-max-input", type: "text", inputMode: "numeric", pattern: "[0-9]*", placeholder: "e.g., 50000", value: ciLogMax, onChange: (e) => setCiLogMax(e.target.value), onBlur: () => handleFieldBlur('ciLogMax', ciLogMax, originalCiLogMax) }), _jsx("p", { className: "text-muted-foreground text-xs", children: "Maximum characters to capture from CI logs" })] }), _jsxs("div", { className: "space-y-1.5", children: [_jsx(Label, { htmlFor: "ci-poll-interval", children: "Poll interval (seconds)" }), _jsx(Input, { id: "ci-poll-interval", "data-testid": "ci-poll-interval-input", type: "text", inputMode: "numeric", pattern: "[0-9]*", placeholder: "e.g., 30", value: ciPollInterval, onChange: (e) => setCiPollInterval(e.target.value), onBlur: () => handleFieldBlur('ciPollInterval', ciPollInterval, originalCiPollInterval) }), _jsx("p", { className: "text-muted-foreground text-xs", children: "How often to poll GitHub for CI run status updates" })] })] }), _jsx(Separator, {}), _jsxs("div", { className: "space-y-3", children: [_jsx("h3", { className: "text-sm font-semibold", children: "Stage Timeouts" }), _jsx("p", { className: "text-muted-foreground text-xs", children: "Maximum execution time per agent stage" }), _jsx("h4", { className: "text-muted-foreground text-xs font-semibold tracking-wider uppercase", children: "Feature Agent" }), FEATURE_AGENT_FIELDS.map((field) => (_jsxs("div", { className: "flex items-center justify-between gap-4", children: [_jsx(Label, { htmlFor: `stage-timeout-${field.key}`, children: field.label }), _jsx(TimeoutSlider, { id: `stage-timeout-${field.key}`, testId: `stage-timeout-${field.key}-input`, value: field.state, onChange: field.setter, onBlur: () => handleFieldBlur(field.key, field.state, field.original), defaultSeconds: field.defaultSeconds })] }, field.key))), _jsx("h4", { className: "text-muted-foreground pt-2 text-xs font-semibold tracking-wider uppercase", children: "Analyze Repository Agent" }), ANALYZE_REPO_FIELDS.map((field) => (_jsxs("div", { className: "flex items-center justify-between gap-4", children: [_jsx(Label, { htmlFor: `stage-timeout-${field.key}`, children: field.label }), _jsx(TimeoutSlider, { id: `stage-timeout-${field.key}`, testId: `stage-timeout-${field.key}-input`, value: field.state, onChange: field.setter, onBlur: () => handleFieldBlur(field.key, field.state, field.original), defaultSeconds: field.defaultSeconds })] }, field.key)))] })] })] }));
171
176
  }
@@ -1 +1 @@
1
- {"version":3,"file":"workflow-settings-section.stories.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/features/settings/workflow-settings-section.stories.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAQ,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,uBAAuB,EAAE,MAAM,6BAA6B,CAAC;AAEtE,QAAA,MAAM,IAAI;;;;;;;CAOsC,CAAC;AAEjD,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,IAAI,CAAC,CAAC;AAEnC,eAAO,MAAM,OAAO,EAAE,KAcrB,CAAC;AAEF,eAAO,MAAM,UAAU,EAAE,KA4BxB,CAAC;AAEF,eAAO,MAAM,cAAc,EAAE,KA4B5B,CAAC"}
1
+ {"version":3,"file":"workflow-settings-section.stories.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/features/settings/workflow-settings-section.stories.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAQ,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,uBAAuB,EAAE,MAAM,6BAA6B,CAAC;AAEtE,QAAA,MAAM,IAAI;;;;;;;CAOsC,CAAC;AAEjD,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,IAAI,CAAC,CAAC;AAEnC,eAAO,MAAM,OAAO,EAAE,KAerB,CAAC;AAEF,eAAO,MAAM,UAAU,EAAE,KA6BxB,CAAC;AAEF,eAAO,MAAM,cAAc,EAAE,KA6B5B,CAAC"}
@@ -18,6 +18,7 @@ export const Default = {
18
18
  allowMerge: false,
19
19
  pushOnImplementationComplete: false,
20
20
  },
21
+ ciWatchEnabled: true,
21
22
  enableEvidence: false,
22
23
  commitEvidence: false,
23
24
  },
@@ -47,6 +48,7 @@ export const AllEnabled = {
47
48
  analyzeRepoTimeouts: {
48
49
  analyzeMs: 600000,
49
50
  },
51
+ ciWatchEnabled: true,
50
52
  enableEvidence: true,
51
53
  commitEvidence: true,
52
54
  },
@@ -76,6 +78,7 @@ export const WithCiSettings = {
76
78
  analyzeRepoTimeouts: {
77
79
  analyzeMs: 1200000,
78
80
  },
81
+ ciWatchEnabled: true,
79
82
  enableEvidence: false,
80
83
  commitEvidence: false,
81
84
  },