@shepai/cli 1.117.0 → 1.118.0-pr372.0212cc6

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 (405) hide show
  1. package/apis/json-schema/EnvironmentConfig.yaml +5 -0
  2. package/apis/json-schema/PhaseTiming.yaml +22 -1
  3. package/apis/json-schema/TerminalType.yaml +10 -0
  4. package/apis/json-schema/WorkflowConfig.yaml +10 -0
  5. package/dist/packages/core/src/application/ports/output/agents/agent-session-repository.interface.d.ts +2 -0
  6. package/dist/packages/core/src/application/ports/output/agents/agent-session-repository.interface.d.ts.map +1 -1
  7. package/dist/packages/core/src/application/ports/output/agents/phase-timing-repository.interface.d.ts +3 -3
  8. package/dist/packages/core/src/application/ports/output/agents/phase-timing-repository.interface.d.ts.map +1 -1
  9. package/dist/packages/core/src/application/ports/output/services/git-pr-service.interface.d.ts +2 -1
  10. package/dist/packages/core/src/application/ports/output/services/git-pr-service.interface.d.ts.map +1 -1
  11. package/dist/packages/core/src/domain/factories/settings-defaults.factory.d.ts.map +1 -1
  12. package/dist/packages/core/src/domain/factories/settings-defaults.factory.js +8 -1
  13. package/dist/packages/core/src/domain/generated/output.d.ts +48 -1
  14. package/dist/packages/core/src/domain/generated/output.d.ts.map +1 -1
  15. package/dist/packages/core/src/domain/generated/output.js +8 -0
  16. package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/settings.mapper.d.ts +2 -0
  17. package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/settings.mapper.d.ts.map +1 -1
  18. package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/settings.mapper.js +4 -0
  19. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/036-add-terminal-preference.d.ts +11 -0
  20. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/036-add-terminal-preference.d.ts.map +1 -0
  21. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/036-add-terminal-preference.js +13 -0
  22. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/037-add-ci-watch-enabled.d.ts +11 -0
  23. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/037-add-ci-watch-enabled.d.ts.map +1 -0
  24. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/037-add-ci-watch-enabled.js +15 -0
  25. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/038-add-phase-execution-metadata.d.ts +11 -0
  26. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/038-add-phase-execution-metadata.d.ts.map +1 -0
  27. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/038-add-phase-execution-metadata.js +27 -0
  28. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations.js +1 -1
  29. package/dist/packages/core/src/infrastructure/repositories/sqlite-phase-timing.repository.d.ts +1 -1
  30. package/dist/packages/core/src/infrastructure/repositories/sqlite-phase-timing.repository.d.ts.map +1 -1
  31. package/dist/packages/core/src/infrastructure/repositories/sqlite-phase-timing.repository.js +32 -0
  32. package/dist/packages/core/src/infrastructure/repositories/sqlite-settings.repository.d.ts.map +1 -1
  33. package/dist/packages/core/src/infrastructure/repositories/sqlite-settings.repository.js +3 -2
  34. package/dist/packages/core/src/infrastructure/services/agents/common/executors/dev-executor.service.d.ts.map +1 -1
  35. package/dist/packages/core/src/infrastructure/services/agents/common/executors/dev-executor.service.js +8 -1
  36. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/merge/ci-watch-fix-loop.d.ts.map +1 -1
  37. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/merge/ci-watch-fix-loop.js +3 -2
  38. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/merge/merge.node.d.ts.map +1 -1
  39. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/merge/merge.node.js +29 -7
  40. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/node-helpers.d.ts.map +1 -1
  41. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/node-helpers.js +19 -8
  42. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/prompts/merge-prompts.d.ts +5 -10
  43. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/prompts/merge-prompts.d.ts.map +1 -1
  44. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/prompts/merge-prompts.js +5 -73
  45. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/phase-timing-context.d.ts +17 -3
  46. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/phase-timing-context.d.ts.map +1 -1
  47. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/phase-timing-context.js +11 -3
  48. package/dist/packages/core/src/infrastructure/services/agents/sessions/claude-code-session.repository.d.ts +7 -0
  49. package/dist/packages/core/src/infrastructure/services/agents/sessions/claude-code-session.repository.d.ts.map +1 -1
  50. package/dist/packages/core/src/infrastructure/services/agents/sessions/claude-code-session.repository.js +35 -11
  51. package/dist/packages/core/src/infrastructure/services/git/git-pr.service.d.ts +1 -1
  52. package/dist/packages/core/src/infrastructure/services/git/git-pr.service.d.ts.map +1 -1
  53. package/dist/packages/core/src/infrastructure/services/git/git-pr.service.js +12 -3
  54. package/dist/packages/core/src/infrastructure/services/tool-installer/tool-metadata.d.ts +5 -0
  55. package/dist/packages/core/src/infrastructure/services/tool-installer/tool-metadata.d.ts.map +1 -1
  56. package/dist/packages/core/src/infrastructure/services/tool-installer/tool-metadata.js +7 -0
  57. package/dist/packages/core/src/infrastructure/services/tool-installer/tools/system-terminal.json +24 -0
  58. package/dist/src/presentation/web/app/(dashboard)/@drawer/create/page.d.ts +1 -0
  59. package/dist/src/presentation/web/app/(dashboard)/@drawer/create/page.d.ts.map +1 -1
  60. package/dist/src/presentation/web/app/(dashboard)/@drawer/create/page.js +2 -2
  61. package/dist/src/presentation/web/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page.d.ts.map +1 -1
  62. package/dist/src/presentation/web/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page.js +1 -0
  63. package/dist/src/presentation/web/app/(dashboard)/@drawer/feature/[featureId]/page.d.ts.map +1 -1
  64. package/dist/src/presentation/web/app/(dashboard)/@drawer/feature/[featureId]/page.js +1 -0
  65. package/dist/src/presentation/web/app/(dashboard)/get-graph-data.d.ts.map +1 -1
  66. package/dist/src/presentation/web/app/(dashboard)/get-graph-data.js +1 -0
  67. package/dist/src/presentation/web/app/actions/get-available-terminals.d.ts +12 -0
  68. package/dist/src/presentation/web/app/actions/get-available-terminals.d.ts.map +1 -0
  69. package/dist/src/presentation/web/app/actions/get-available-terminals.js +53 -0
  70. package/dist/src/presentation/web/app/actions/get-feature-phase-timings.d.ts +2 -0
  71. package/dist/src/presentation/web/app/actions/get-feature-phase-timings.d.ts.map +1 -1
  72. package/dist/src/presentation/web/app/actions/get-feature-phase-timings.js +2 -0
  73. package/dist/src/presentation/web/app/actions/get-merge-review-data.d.ts.map +1 -1
  74. package/dist/src/presentation/web/app/actions/get-merge-review-data.js +49 -13
  75. package/dist/src/presentation/web/app/actions/get-workflow-defaults.d.ts +1 -0
  76. package/dist/src/presentation/web/app/actions/get-workflow-defaults.d.ts.map +1 -1
  77. package/dist/src/presentation/web/app/actions/get-workflow-defaults.js +1 -0
  78. package/dist/src/presentation/web/app/actions/open-shell.d.ts.map +1 -1
  79. package/dist/src/presentation/web/app/actions/open-shell.js +47 -3
  80. package/dist/src/presentation/web/app/api/sessions/route.d.ts +24 -0
  81. package/dist/src/presentation/web/app/api/sessions/route.d.ts.map +1 -0
  82. package/dist/src/presentation/web/app/api/sessions/route.js +230 -0
  83. package/dist/src/presentation/web/app/build-feature-node-data.d.ts +2 -0
  84. package/dist/src/presentation/web/app/build-feature-node-data.d.ts.map +1 -1
  85. package/dist/src/presentation/web/app/build-feature-node-data.js +1 -0
  86. package/dist/src/presentation/web/app/build-graph-nodes.d.ts +2 -0
  87. package/dist/src/presentation/web/app/build-graph-nodes.d.ts.map +1 -1
  88. package/dist/src/presentation/web/app/build-graph-nodes.js +11 -0
  89. package/dist/src/presentation/web/app/settings/page.d.ts.map +1 -1
  90. package/dist/src/presentation/web/app/settings/page.js +6 -2
  91. package/dist/src/presentation/web/components/common/control-center-drawer/create-drawer-client.d.ts +2 -1
  92. package/dist/src/presentation/web/components/common/control-center-drawer/create-drawer-client.d.ts.map +1 -1
  93. package/dist/src/presentation/web/components/common/control-center-drawer/create-drawer-client.js +2 -2
  94. package/dist/src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.d.ts +4 -1
  95. package/dist/src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.d.ts.map +1 -1
  96. package/dist/src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.js +16 -3
  97. package/dist/src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.stories.d.ts.map +1 -1
  98. package/dist/src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.stories.js +1 -0
  99. package/dist/src/presentation/web/components/common/feature-drawer-tabs/activity-tab.d.ts.map +1 -1
  100. package/dist/src/presentation/web/components/common/feature-drawer-tabs/activity-tab.js +36 -10
  101. package/dist/src/presentation/web/components/common/feature-drawer-tabs/feature-drawer-tabs.d.ts.map +1 -1
  102. package/dist/src/presentation/web/components/common/feature-drawer-tabs/feature-drawer-tabs.js +7 -2
  103. package/dist/src/presentation/web/components/common/feature-drawer-tabs/overview-tab.js +2 -1
  104. package/dist/src/presentation/web/components/common/feature-node/feature-node-state-config.d.ts +4 -0
  105. package/dist/src/presentation/web/components/common/feature-node/feature-node-state-config.d.ts.map +1 -1
  106. package/dist/src/presentation/web/components/common/feature-node/feature-node.d.ts.map +1 -1
  107. package/dist/src/presentation/web/components/common/feature-node/feature-node.js +2 -1
  108. package/dist/src/presentation/web/components/common/feature-node/feature-sessions-dropdown.d.ts +21 -0
  109. package/dist/src/presentation/web/components/common/feature-node/feature-sessions-dropdown.d.ts.map +1 -0
  110. package/dist/src/presentation/web/components/common/feature-node/feature-sessions-dropdown.js +138 -0
  111. package/dist/src/presentation/web/components/common/feature-node/feature-sessions-dropdown.stories.d.ts +9 -0
  112. package/dist/src/presentation/web/components/common/feature-node/feature-sessions-dropdown.stories.d.ts.map +1 -0
  113. package/dist/src/presentation/web/components/common/feature-node/feature-sessions-dropdown.stories.js +77 -0
  114. package/dist/src/presentation/web/components/common/merge-review/merge-review-config.d.ts +3 -3
  115. package/dist/src/presentation/web/components/common/merge-review/merge-review-config.d.ts.map +1 -1
  116. package/dist/src/presentation/web/components/common/merge-review/merge-review.d.ts +1 -1
  117. package/dist/src/presentation/web/components/common/merge-review/merge-review.d.ts.map +1 -1
  118. package/dist/src/presentation/web/components/common/merge-review/merge-review.js +14 -20
  119. package/dist/src/presentation/web/components/common/merge-review/merge-review.stories.d.ts +6 -0
  120. package/dist/src/presentation/web/components/common/merge-review/merge-review.stories.d.ts.map +1 -1
  121. package/dist/src/presentation/web/components/common/merge-review/merge-review.stories.js +74 -0
  122. package/dist/src/presentation/web/components/common/repository-node/repository-node.d.ts.map +1 -1
  123. package/dist/src/presentation/web/components/common/repository-node/repository-node.js +35 -2
  124. package/dist/src/presentation/web/components/features/settings/environment-settings-section.d.ts +3 -1
  125. package/dist/src/presentation/web/components/features/settings/environment-settings-section.d.ts.map +1 -1
  126. package/dist/src/presentation/web/components/features/settings/environment-settings-section.js +32 -5
  127. package/dist/src/presentation/web/components/features/settings/environment-settings-section.stories.d.ts +2 -0
  128. package/dist/src/presentation/web/components/features/settings/environment-settings-section.stories.d.ts.map +1 -1
  129. package/dist/src/presentation/web/components/features/settings/environment-settings-section.stories.js +34 -1
  130. package/dist/src/presentation/web/components/features/settings/settings-page-client.d.ts +3 -1
  131. package/dist/src/presentation/web/components/features/settings/settings-page-client.d.ts.map +1 -1
  132. package/dist/src/presentation/web/components/features/settings/settings-page-client.js +61 -14
  133. package/dist/src/presentation/web/components/features/settings/workflow-settings-section.d.ts.map +1 -1
  134. package/dist/src/presentation/web/components/features/settings/workflow-settings-section.js +6 -1
  135. package/dist/src/presentation/web/components/features/settings/workflow-settings-section.stories.d.ts.map +1 -1
  136. package/dist/src/presentation/web/components/features/settings/workflow-settings-section.stories.js +3 -0
  137. package/dist/tsconfig.build.tsbuildinfo +1 -1
  138. package/package.json +1 -1
  139. package/web/.next/BUILD_ID +1 -1
  140. package/web/.next/app-path-routes-manifest.json +1 -0
  141. package/web/.next/build-manifest.json +2 -2
  142. package/web/.next/fallback-build-manifest.json +2 -2
  143. package/web/.next/prerender-manifest.json +3 -3
  144. package/web/.next/required-server-files.js +3 -3
  145. package/web/.next/required-server-files.json +3 -3
  146. package/web/.next/routes-manifest.json +6 -0
  147. package/web/.next/server/app/(dashboard)/@drawer/create/page/server-reference-manifest.json +21 -21
  148. package/web/.next/server/app/(dashboard)/@drawer/create/page.js +3 -3
  149. package/web/.next/server/app/(dashboard)/@drawer/create/page.js.nft.json +1 -1
  150. package/web/.next/server/app/(dashboard)/@drawer/create/page_client-reference-manifest.js +1 -1
  151. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page/server-reference-manifest.json +27 -27
  152. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page.js +4 -4
  153. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page.js.nft.json +1 -1
  154. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page_client-reference-manifest.js +1 -1
  155. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page/server-reference-manifest.json +27 -27
  156. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js +4 -4
  157. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js.nft.json +1 -1
  158. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page_client-reference-manifest.js +1 -1
  159. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page/server-reference-manifest.json +19 -19
  160. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js +3 -3
  161. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js.nft.json +1 -1
  162. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  163. package/web/.next/server/app/(dashboard)/create/page/server-reference-manifest.json +21 -21
  164. package/web/.next/server/app/(dashboard)/create/page.js +3 -3
  165. package/web/.next/server/app/(dashboard)/create/page.js.nft.json +1 -1
  166. package/web/.next/server/app/(dashboard)/create/page_client-reference-manifest.js +1 -1
  167. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page/server-reference-manifest.json +27 -27
  168. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page.js +4 -4
  169. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page.js.nft.json +1 -1
  170. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page_client-reference-manifest.js +1 -1
  171. package/web/.next/server/app/(dashboard)/feature/[featureId]/page/server-reference-manifest.json +27 -27
  172. package/web/.next/server/app/(dashboard)/feature/[featureId]/page.js +4 -4
  173. package/web/.next/server/app/(dashboard)/feature/[featureId]/page.js.nft.json +1 -1
  174. package/web/.next/server/app/(dashboard)/feature/[featureId]/page_client-reference-manifest.js +1 -1
  175. package/web/.next/server/app/(dashboard)/page/server-reference-manifest.json +19 -19
  176. package/web/.next/server/app/(dashboard)/page.js +3 -3
  177. package/web/.next/server/app/(dashboard)/page.js.nft.json +1 -1
  178. package/web/.next/server/app/(dashboard)/page_client-reference-manifest.js +1 -1
  179. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page/server-reference-manifest.json +19 -19
  180. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js +3 -3
  181. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js.nft.json +1 -1
  182. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  183. package/web/.next/server/app/_global-error/page.js +1 -1
  184. package/web/.next/server/app/_global-error/page.js.nft.json +1 -1
  185. package/web/.next/server/app/_global-error.html +2 -2
  186. package/web/.next/server/app/_global-error.rsc +1 -1
  187. package/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  188. package/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  189. package/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  190. package/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  191. package/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  192. package/web/.next/server/app/_not-found/page/server-reference-manifest.json +1 -1
  193. package/web/.next/server/app/_not-found/page.js +2 -2
  194. package/web/.next/server/app/_not-found/page.js.nft.json +1 -1
  195. package/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  196. package/web/.next/server/app/api/attachments/preview/route.js +1 -1
  197. package/web/.next/server/app/api/attachments/preview/route.js.nft.json +1 -1
  198. package/web/.next/server/app/api/evidence/route.js +1 -1
  199. package/web/.next/server/app/api/evidence/route.js.nft.json +1 -1
  200. package/web/.next/server/app/api/graph-data/route.js +1 -1
  201. package/web/.next/server/app/api/graph-data/route.js.nft.json +1 -1
  202. package/web/.next/server/app/api/sessions/route/app-paths-manifest.json +3 -0
  203. package/web/.next/server/app/api/sessions/route/build-manifest.json +11 -0
  204. package/web/.next/server/app/api/sessions/route/server-reference-manifest.json +4 -0
  205. package/web/.next/server/app/api/sessions/route.js +7 -0
  206. package/web/.next/server/app/api/sessions/route.js.map +5 -0
  207. package/web/.next/server/app/api/sessions/route.js.nft.json +1 -0
  208. package/web/.next/server/app/api/sessions/route_client-reference-manifest.js +2 -0
  209. package/web/.next/server/app/settings/page/server-reference-manifest.json +25 -10
  210. package/web/.next/server/app/settings/page.js +3 -3
  211. package/web/.next/server/app/settings/page.js.nft.json +1 -1
  212. package/web/.next/server/app/settings/page_client-reference-manifest.js +1 -1
  213. package/web/.next/server/app/skills/page/server-reference-manifest.json +6 -6
  214. package/web/.next/server/app/skills/page.js +2 -2
  215. package/web/.next/server/app/skills/page.js.nft.json +1 -1
  216. package/web/.next/server/app/skills/page_client-reference-manifest.js +1 -1
  217. package/web/.next/server/app/tools/page/server-reference-manifest.json +6 -6
  218. package/web/.next/server/app/tools/page.js +2 -2
  219. package/web/.next/server/app/tools/page.js.nft.json +1 -1
  220. package/web/.next/server/app/tools/page_client-reference-manifest.js +1 -1
  221. package/web/.next/server/app/version/page/server-reference-manifest.json +1 -1
  222. package/web/.next/server/app/version/page.js +3 -3
  223. package/web/.next/server/app/version/page.js.nft.json +1 -1
  224. package/web/.next/server/app/version/page_client-reference-manifest.js +1 -1
  225. package/web/.next/server/app-paths-manifest.json +1 -0
  226. package/web/.next/server/chunks/403f9_next_dist_esm_build_templates_app-route_370c43b1.js +1 -1
  227. package/web/.next/server/chunks/403f9_next_dist_esm_build_templates_app-route_370c43b1.js.map +1 -1
  228. package/web/.next/server/chunks/[root-of-the-server]__0fe7788d._.js +3 -0
  229. package/web/.next/server/chunks/[root-of-the-server]__0fe7788d._.js.map +1 -0
  230. package/web/.next/server/chunks/[root-of-the-server]__42b7ab55._.js +3 -0
  231. package/web/.next/server/chunks/[root-of-the-server]__42b7ab55._.js.map +1 -0
  232. package/web/.next/server/chunks/{[root-of-the-server]__7d63f9a4._.js → [root-of-the-server]__53013576._.js} +2 -2
  233. package/web/.next/server/chunks/{[root-of-the-server]__a1c7c02a._.js → [root-of-the-server]__92078db6._.js} +2 -2
  234. package/web/.next/server/chunks/[root-of-the-server]__a402b567._.js +1 -1
  235. package/web/.next/server/chunks/[root-of-the-server]__cd67a84c._.js +1 -1
  236. package/web/.next/server/chunks/[root-of-the-server]__cd67a84c._.js.map +1 -1
  237. package/web/.next/server/chunks/b1a17_presentation_web__next-internal_server_app_api_sessions_route_actions_c041a889.js +3 -0
  238. package/web/.next/server/chunks/b1a17_presentation_web__next-internal_server_app_api_sessions_route_actions_c041a889.js.map +1 -0
  239. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js +1 -1
  240. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js.map +1 -1
  241. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_ed372306.js +1 -1
  242. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_ed372306.js.map +1 -1
  243. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_32e26434.js +1 -1
  244. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_32e26434.js.map +1 -1
  245. package/web/.next/server/chunks/ssr/{[root-of-the-server]__07a39ff2._.js → [root-of-the-server]__06fef644._.js} +2 -2
  246. package/web/.next/server/chunks/ssr/{[root-of-the-server]__07a39ff2._.js.map → [root-of-the-server]__06fef644._.js.map} +1 -1
  247. package/web/.next/server/chunks/ssr/{[root-of-the-server]__4af0afe0._.js → [root-of-the-server]__2dddfea9._.js} +2 -2
  248. package/web/.next/server/chunks/ssr/{[root-of-the-server]__4af0afe0._.js.map → [root-of-the-server]__2dddfea9._.js.map} +1 -1
  249. package/web/.next/server/chunks/ssr/[root-of-the-server]__3b14e5a0._.js +3 -0
  250. package/web/.next/server/chunks/ssr/[root-of-the-server]__3b14e5a0._.js.map +1 -0
  251. package/web/.next/server/chunks/ssr/{[root-of-the-server]__9bc1434f._.js → [root-of-the-server]__4c7486cb._.js} +2 -2
  252. package/web/.next/server/chunks/ssr/{[root-of-the-server]__9bc1434f._.js.map → [root-of-the-server]__4c7486cb._.js.map} +1 -1
  253. package/web/.next/server/chunks/ssr/[root-of-the-server]__545792ab._.js +3 -0
  254. package/web/.next/server/chunks/ssr/[root-of-the-server]__545792ab._.js.map +1 -0
  255. package/web/.next/server/chunks/ssr/[root-of-the-server]__684a868c._.js +1 -1
  256. package/web/.next/server/chunks/ssr/[root-of-the-server]__684a868c._.js.map +1 -1
  257. package/web/.next/server/chunks/ssr/[root-of-the-server]__6b17a22d._.js +4 -0
  258. package/web/.next/server/chunks/ssr/{[root-of-the-server]__11033878._.js.map → [root-of-the-server]__6b17a22d._.js.map} +1 -1
  259. package/web/.next/server/chunks/ssr/[root-of-the-server]__6bb00d90._.js +4 -0
  260. package/web/.next/server/chunks/ssr/[root-of-the-server]__6bb00d90._.js.map +1 -0
  261. package/web/.next/server/chunks/ssr/[root-of-the-server]__6eb2a2b0._.js +1 -1
  262. package/web/.next/server/chunks/ssr/[root-of-the-server]__6eb2a2b0._.js.map +1 -1
  263. package/web/.next/server/chunks/ssr/[root-of-the-server]__804c006d._.js +4 -0
  264. package/web/.next/server/chunks/ssr/{[root-of-the-server]__fdc75809._.js.map → [root-of-the-server]__804c006d._.js.map} +1 -1
  265. package/web/.next/server/chunks/ssr/[root-of-the-server]__8b59c03e._.js +3 -0
  266. package/web/.next/server/chunks/ssr/[root-of-the-server]__8b59c03e._.js.map +1 -0
  267. package/web/.next/server/chunks/ssr/[root-of-the-server]__8c553503._.js +4 -0
  268. package/web/.next/server/chunks/ssr/[root-of-the-server]__8c553503._.js.map +1 -0
  269. package/web/.next/server/chunks/ssr/[root-of-the-server]__994ad9fe._.js +3 -0
  270. package/web/.next/server/chunks/ssr/[root-of-the-server]__994ad9fe._.js.map +1 -0
  271. package/web/.next/server/chunks/ssr/[root-of-the-server]__9f155c0e._.js +3 -0
  272. package/web/.next/server/chunks/ssr/[root-of-the-server]__9f155c0e._.js.map +1 -0
  273. package/web/.next/server/chunks/ssr/[root-of-the-server]__a022445f._.js +4 -0
  274. package/web/.next/server/chunks/ssr/[root-of-the-server]__a022445f._.js.map +1 -0
  275. package/web/.next/server/chunks/ssr/[root-of-the-server]__a7de2711._.js +4 -0
  276. package/web/.next/server/chunks/ssr/[root-of-the-server]__a7de2711._.js.map +1 -0
  277. package/web/.next/server/chunks/ssr/[root-of-the-server]__b724df9e._.js +3 -0
  278. package/web/.next/server/chunks/ssr/[root-of-the-server]__b724df9e._.js.map +1 -0
  279. package/web/.next/server/chunks/ssr/[root-of-the-server]__c16bf5de._.js +1 -1
  280. package/web/.next/server/chunks/ssr/[root-of-the-server]__c16bf5de._.js.map +1 -1
  281. package/web/.next/server/chunks/ssr/[root-of-the-server]__c9777776._.js +1 -1
  282. package/web/.next/server/chunks/ssr/[root-of-the-server]__c9777776._.js.map +1 -1
  283. package/web/.next/server/chunks/ssr/[root-of-the-server]__c9c1cfee._.js +3 -0
  284. package/web/.next/server/chunks/ssr/[root-of-the-server]__c9c1cfee._.js.map +1 -0
  285. package/web/.next/server/chunks/ssr/_135edb9c._.js +1 -1
  286. package/web/.next/server/chunks/ssr/_135edb9c._.js.map +1 -1
  287. package/web/.next/server/chunks/ssr/_1bb131c4._.js +1 -1
  288. package/web/.next/server/chunks/ssr/_1bb131c4._.js.map +1 -1
  289. package/web/.next/server/chunks/ssr/_1bb79fe8._.js +3 -0
  290. package/web/.next/server/chunks/ssr/_1bb79fe8._.js.map +1 -0
  291. package/web/.next/server/chunks/ssr/{_8dacd1e7._.js → _2f6f48b8._.js} +2 -2
  292. package/web/.next/server/chunks/ssr/{_8dacd1e7._.js.map → _2f6f48b8._.js.map} +1 -1
  293. package/web/.next/server/chunks/ssr/_438add33._.js +3 -0
  294. package/web/.next/server/chunks/ssr/_438add33._.js.map +1 -0
  295. package/web/.next/server/chunks/ssr/_75f4ccb3._.js +3 -0
  296. package/web/.next/server/chunks/ssr/_75f4ccb3._.js.map +1 -0
  297. package/web/.next/server/chunks/ssr/_7fb8340e._.js +3 -0
  298. package/web/.next/server/chunks/ssr/_7fb8340e._.js.map +1 -0
  299. package/web/.next/server/chunks/ssr/_ab069e13._.js +3 -0
  300. package/web/.next/server/chunks/ssr/_ab069e13._.js.map +1 -0
  301. package/web/.next/server/chunks/ssr/{_d6a1ec27._.js → _bb3e8d5b._.js} +2 -2
  302. package/web/.next/server/chunks/ssr/_bb3e8d5b._.js.map +1 -0
  303. package/web/.next/server/chunks/ssr/_cc77a143._.js +1 -1
  304. package/web/.next/server/chunks/ssr/_cc77a143._.js.map +1 -1
  305. package/web/.next/server/chunks/ssr/_f605354c._.js +9 -0
  306. package/web/.next/server/chunks/ssr/_f605354c._.js.map +1 -0
  307. package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_settings_settings-page-client_tsx_6ed9d5f8._.js +1 -1
  308. package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_settings_settings-page-client_tsx_6ed9d5f8._.js.map +1 -1
  309. package/web/.next/server/chunks/ssr/node_modules__pnpm_b59e4b16._.js +3 -0
  310. package/web/.next/server/chunks/ssr/node_modules__pnpm_b59e4b16._.js.map +1 -0
  311. package/web/.next/server/chunks/ssr/src_presentation_web_0835b28e._.js +2 -2
  312. package/web/.next/server/chunks/ssr/src_presentation_web_0835b28e._.js.map +1 -1
  313. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_e99d78dd.js +1 -1
  314. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_e99d78dd.js.map +1 -1
  315. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_skills_page_actions_1fa8042e.js +1 -1
  316. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_skills_page_actions_1fa8042e.js.map +1 -1
  317. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_tools_page_actions_24684200.js +1 -1
  318. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_tools_page_actions_24684200.js.map +1 -1
  319. package/web/.next/server/chunks/ssr/src_presentation_web_ca99d62d._.js +1 -1
  320. package/web/.next/server/chunks/ssr/src_presentation_web_ca99d62d._.js.map +1 -1
  321. package/web/.next/server/chunks/ssr/src_presentation_web_components_bdcfba35._.js +3 -0
  322. package/web/.next/server/chunks/ssr/src_presentation_web_components_bdcfba35._.js.map +1 -0
  323. package/web/.next/server/chunks/ssr/src_presentation_web_components_bf50c527._.js +1 -1
  324. package/web/.next/server/chunks/ssr/src_presentation_web_components_bf50c527._.js.map +1 -1
  325. package/web/.next/server/chunks/ssr/src_presentation_web_components_de814675._.js +1 -1
  326. package/web/.next/server/chunks/ssr/src_presentation_web_components_de814675._.js.map +1 -1
  327. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js +1 -1
  328. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js.map +1 -1
  329. package/web/.next/server/chunks/ssr/src_presentation_web_e8034a29._.js +2 -2
  330. package/web/.next/server/chunks/ssr/src_presentation_web_e8034a29._.js.map +1 -1
  331. package/web/.next/server/pages/500.html +2 -2
  332. package/web/.next/server/server-reference-manifest.js +1 -1
  333. package/web/.next/server/server-reference-manifest.json +52 -37
  334. package/web/.next/static/chunks/{498777301470975b.js → 232fae94396bd277.js} +1 -1
  335. package/web/.next/static/chunks/38b7fa587c27b9f2.js +1 -0
  336. package/web/.next/static/chunks/424bfa8457630f6e.js +2 -0
  337. package/web/.next/static/chunks/4562ee849ea13c3a.js +1 -0
  338. package/web/.next/static/chunks/{425894e5bf370bd2.js → 64d0980ec9943126.js} +2 -2
  339. package/web/.next/static/chunks/{c76f6d06b1b69b57.js → 7c950a929cfc18b5.js} +1 -1
  340. package/web/.next/static/chunks/{34b275db4ad6fb5d.js → 7c96e680a84ba93e.js} +1 -1
  341. package/web/.next/static/chunks/845d8e58a91014e6.js +1 -0
  342. package/web/.next/static/chunks/{2251df6427162751.js → 8b6436c1c90deb9a.js} +1 -1
  343. package/web/.next/static/chunks/9c534872d5483f5b.js +1 -0
  344. package/web/.next/static/chunks/cc7fd13543b950b3.js +11 -0
  345. package/web/.next/static/chunks/cca0f5112a9260d8.js +1 -0
  346. package/web/.next/static/chunks/d2739454715e5ef2.css +1 -0
  347. package/web/.next/static/chunks/{fcde0cbb2976b933.js → e2ef95d904c360f3.js} +1 -1
  348. package/web/.next/static/chunks/fc32f99270fad49d.js +1 -0
  349. package/web/.next/server/chunks/[root-of-the-server]__7d5492a0._.js +0 -3
  350. package/web/.next/server/chunks/[root-of-the-server]__7d5492a0._.js.map +0 -1
  351. package/web/.next/server/chunks/ssr/7f428_lucide-react_dist_esm_icons_rocket_1575cd4d.js +0 -3
  352. package/web/.next/server/chunks/ssr/7f428_lucide-react_dist_esm_icons_rocket_1575cd4d.js.map +0 -1
  353. package/web/.next/server/chunks/ssr/[root-of-the-server]__11033878._.js +0 -4
  354. package/web/.next/server/chunks/ssr/[root-of-the-server]__172d9576._.js +0 -3
  355. package/web/.next/server/chunks/ssr/[root-of-the-server]__172d9576._.js.map +0 -1
  356. package/web/.next/server/chunks/ssr/[root-of-the-server]__24dd0927._.js +0 -4
  357. package/web/.next/server/chunks/ssr/[root-of-the-server]__24dd0927._.js.map +0 -1
  358. package/web/.next/server/chunks/ssr/[root-of-the-server]__2a5592d5._.js +0 -3
  359. package/web/.next/server/chunks/ssr/[root-of-the-server]__2a5592d5._.js.map +0 -1
  360. package/web/.next/server/chunks/ssr/[root-of-the-server]__5d87af2e._.js +0 -4
  361. package/web/.next/server/chunks/ssr/[root-of-the-server]__5d87af2e._.js.map +0 -1
  362. package/web/.next/server/chunks/ssr/[root-of-the-server]__6367aea0._.js +0 -3
  363. package/web/.next/server/chunks/ssr/[root-of-the-server]__6367aea0._.js.map +0 -1
  364. package/web/.next/server/chunks/ssr/[root-of-the-server]__89e8a5cc._.js +0 -4
  365. package/web/.next/server/chunks/ssr/[root-of-the-server]__89e8a5cc._.js.map +0 -1
  366. package/web/.next/server/chunks/ssr/[root-of-the-server]__a93289b0._.js +0 -3
  367. package/web/.next/server/chunks/ssr/[root-of-the-server]__a93289b0._.js.map +0 -1
  368. package/web/.next/server/chunks/ssr/[root-of-the-server]__aad040c0._.js +0 -4
  369. package/web/.next/server/chunks/ssr/[root-of-the-server]__aad040c0._.js.map +0 -1
  370. package/web/.next/server/chunks/ssr/[root-of-the-server]__ac0304e7._.js +0 -3
  371. package/web/.next/server/chunks/ssr/[root-of-the-server]__ac0304e7._.js.map +0 -1
  372. package/web/.next/server/chunks/ssr/[root-of-the-server]__b1e68e34._.js +0 -3
  373. package/web/.next/server/chunks/ssr/[root-of-the-server]__b1e68e34._.js.map +0 -1
  374. package/web/.next/server/chunks/ssr/[root-of-the-server]__fdc75809._.js +0 -4
  375. package/web/.next/server/chunks/ssr/_125679ad._.js +0 -3
  376. package/web/.next/server/chunks/ssr/_125679ad._.js.map +0 -1
  377. package/web/.next/server/chunks/ssr/_250a63ae._.js +0 -3
  378. package/web/.next/server/chunks/ssr/_250a63ae._.js.map +0 -1
  379. package/web/.next/server/chunks/ssr/_273d4632._.js +0 -3
  380. package/web/.next/server/chunks/ssr/_273d4632._.js.map +0 -1
  381. package/web/.next/server/chunks/ssr/_922aa39f._.js +0 -3
  382. package/web/.next/server/chunks/ssr/_922aa39f._.js.map +0 -1
  383. package/web/.next/server/chunks/ssr/_a68d7e1c._.js +0 -9
  384. package/web/.next/server/chunks/ssr/_a68d7e1c._.js.map +0 -1
  385. package/web/.next/server/chunks/ssr/_a8d14ab2._.js +0 -3
  386. package/web/.next/server/chunks/ssr/_a8d14ab2._.js.map +0 -1
  387. package/web/.next/server/chunks/ssr/_d6a1ec27._.js.map +0 -1
  388. package/web/.next/server/chunks/ssr/_f5316e67._.js +0 -3
  389. package/web/.next/server/chunks/ssr/_f5316e67._.js.map +0 -1
  390. package/web/.next/server/chunks/ssr/src_presentation_web_components_a5e6c910._.js +0 -3
  391. package/web/.next/server/chunks/ssr/src_presentation_web_components_a5e6c910._.js.map +0 -1
  392. package/web/.next/static/chunks/2c98935265aa3622.js +0 -2
  393. package/web/.next/static/chunks/3a806cf059241bc9.js +0 -1
  394. package/web/.next/static/chunks/50f06bb71bace452.js +0 -1
  395. package/web/.next/static/chunks/55c131b6fc504375.js +0 -1
  396. package/web/.next/static/chunks/5fe03deadb83628b.js +0 -1
  397. package/web/.next/static/chunks/62a8173911f8f130.css +0 -1
  398. package/web/.next/static/chunks/b1f3c0e8e9872ef8.js +0 -1
  399. package/web/.next/static/chunks/b855de1b1e5458f6.js +0 -11
  400. package/web/.next/static/chunks/e2caffa0bb759c6c.js +0 -1
  401. /package/web/.next/server/chunks/{[root-of-the-server]__7d63f9a4._.js.map → [root-of-the-server]__53013576._.js.map} +0 -0
  402. /package/web/.next/server/chunks/{[root-of-the-server]__a1c7c02a._.js.map → [root-of-the-server]__92078db6._.js.map} +0 -0
  403. /package/web/.next/static/{bAT4Gm6M7U0lGmNAN3mTn → zBcClBvU2AkDXuIG0MLgY}/_buildManifest.js +0 -0
  404. /package/web/.next/static/{bAT4Gm6M7U0lGmNAN3mTn → zBcClBvU2AkDXuIG0MLgY}/_clientMiddlewareManifest.json +0 -0
  405. /package/web/.next/static/{bAT4Gm6M7U0lGmNAN3mTn → zBcClBvU2AkDXuIG0MLgY}/_ssgManifest.js +0 -0
@@ -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,6 +1,8 @@
1
1
  import type { EnvironmentConfig } from '../../../../../../packages/core/src/domain/generated/output.js';
2
+ import type { AvailableTerminal } from '../../../app/actions/get-available-terminals.js';
2
3
  export interface EnvironmentSettingsSectionProps {
3
4
  environment: EnvironmentConfig;
5
+ availableTerminals?: AvailableTerminal[];
4
6
  }
5
- export declare function EnvironmentSettingsSection({ environment }: EnvironmentSettingsSectionProps): import("react/jsx-runtime").JSX.Element;
7
+ export declare function EnvironmentSettingsSection({ environment, availableTerminals, }: EnvironmentSettingsSectionProps): import("react/jsx-runtime").JSX.Element;
6
8
  //# sourceMappingURL=environment-settings-section.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"environment-settings-section.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/features/settings/environment-settings-section.tsx"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,sCAAsC,CAAC;AAgB9E,MAAM,WAAW,+BAA+B;IAC9C,WAAW,EAAE,iBAAiB,CAAC;CAChC;AAED,wBAAgB,0BAA0B,CAAC,EAAE,WAAW,EAAE,EAAE,+BAA+B,2CAwF1F"}
1
+ {"version":3,"file":"environment-settings-section.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/features/settings/environment-settings-section.tsx"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,sCAAsC,CAAC;AAC9E,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,uCAAuC,CAAC;AAgB/E,MAAM,WAAW,+BAA+B;IAC9C,WAAW,EAAE,iBAAiB,CAAC;IAC/B,kBAAkB,CAAC,EAAE,iBAAiB,EAAE,CAAC;CAC1C;AAED,wBAAgB,0BAA0B,CAAC,EACzC,WAAW,EACX,kBAAkB,GACnB,EAAE,+BAA+B,2CAuIjC"}
@@ -7,7 +7,7 @@ import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '../..
7
7
  import { Label } from '../../ui/label.js';
8
8
  import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from '../../ui/select.js';
9
9
  import { updateSettingsAction } from '../../../app/actions/update-settings.js';
10
- import { EditorType } from '../../../../../../packages/core/src/domain/generated/output.js';
10
+ import { EditorType, TerminalType } from '../../../../../../packages/core/src/domain/generated/output.js';
11
11
  const EDITOR_OPTIONS = [
12
12
  { value: EditorType.VsCode, label: 'VS Code' },
13
13
  { value: EditorType.Cursor, label: 'Cursor' },
@@ -20,9 +20,10 @@ const SHELL_OPTIONS = [
20
20
  { value: 'zsh', label: 'Zsh' },
21
21
  { value: 'fish', label: 'Fish' },
22
22
  ];
23
- export function EnvironmentSettingsSection({ environment }) {
23
+ export function EnvironmentSettingsSection({ environment, availableTerminals, }) {
24
24
  const [editor, setEditor] = useState(environment.defaultEditor);
25
25
  const [shell, setShell] = useState(environment.shellPreference);
26
+ const [terminal, setTerminal] = useState(environment.terminalPreference ?? TerminalType.System);
26
27
  const [isPending, startTransition] = useTransition();
27
28
  const [showSaved, setShowSaved] = useState(false);
28
29
  const prevPendingRef = useRef(false);
@@ -44,11 +45,37 @@ export function EnvironmentSettingsSection({ environment }) {
44
45
  }
45
46
  function handleEditorChange(value) {
46
47
  setEditor(value);
47
- save({ environment: { defaultEditor: value, shellPreference: shell } });
48
+ save({
49
+ environment: {
50
+ defaultEditor: value,
51
+ shellPreference: shell,
52
+ terminalPreference: terminal,
53
+ },
54
+ });
48
55
  }
49
56
  function handleShellChange(value) {
50
57
  setShell(value);
51
- save({ environment: { defaultEditor: editor, shellPreference: value } });
58
+ save({
59
+ environment: {
60
+ defaultEditor: editor,
61
+ shellPreference: value,
62
+ terminalPreference: terminal,
63
+ },
64
+ });
65
+ }
66
+ function handleTerminalChange(value) {
67
+ setTerminal(value);
68
+ save({
69
+ environment: {
70
+ defaultEditor: editor,
71
+ shellPreference: shell,
72
+ terminalPreference: value,
73
+ },
74
+ });
52
75
  }
53
- return (_jsxs(Card, { id: "environment", className: "scroll-mt-6", "data-testid": "environment-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(Terminal, { className: "text-muted-foreground h-4 w-4" }), _jsx(CardTitle, { children: "IDE & Terminal" })] }), 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 your default editor and shell preferences" })] }), _jsxs(CardContent, { className: "space-y-4", children: [_jsxs("div", { className: "space-y-2", children: [_jsx(Label, { htmlFor: "default-editor", children: "Default Editor" }), _jsxs(Select, { value: editor, onValueChange: handleEditorChange, children: [_jsx(SelectTrigger, { id: "default-editor", "data-testid": "editor-select", children: _jsx(SelectValue, {}) }), _jsx(SelectContent, { children: EDITOR_OPTIONS.map((opt) => (_jsx(SelectItem, { value: opt.value, children: opt.label }, opt.value))) })] })] }), _jsxs("div", { className: "space-y-2", children: [_jsx(Label, { htmlFor: "shell-preference", children: "Shell Preference" }), _jsxs(Select, { value: shell, onValueChange: handleShellChange, children: [_jsx(SelectTrigger, { id: "shell-preference", "data-testid": "shell-select", children: _jsx(SelectValue, {}) }), _jsx(SelectContent, { children: SHELL_OPTIONS.map((opt) => (_jsx(SelectItem, { value: opt.value, children: opt.label }, opt.value))) })] })] })] })] }));
76
+ // Filter to only show installed terminals
77
+ const terminalOptions = availableTerminals
78
+ ? availableTerminals.filter((t) => t.available)
79
+ : [{ id: TerminalType.System, name: 'System Terminal', available: true }];
80
+ return (_jsxs(Card, { id: "environment", className: "scroll-mt-6", "data-testid": "environment-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(Terminal, { className: "text-muted-foreground h-4 w-4" }), _jsx(CardTitle, { children: "IDE & Terminal" })] }), 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 your default editor, shell, and terminal preferences" })] }), _jsxs(CardContent, { className: "space-y-4", children: [_jsxs("div", { className: "space-y-2", children: [_jsx(Label, { htmlFor: "default-editor", children: "Default Editor" }), _jsxs(Select, { value: editor, onValueChange: handleEditorChange, children: [_jsx(SelectTrigger, { id: "default-editor", "data-testid": "editor-select", children: _jsx(SelectValue, {}) }), _jsx(SelectContent, { children: EDITOR_OPTIONS.map((opt) => (_jsx(SelectItem, { value: opt.value, children: opt.label }, opt.value))) })] })] }), _jsxs("div", { className: "space-y-2", children: [_jsx(Label, { htmlFor: "shell-preference", children: "Shell Preference" }), _jsxs(Select, { value: shell, onValueChange: handleShellChange, children: [_jsx(SelectTrigger, { id: "shell-preference", "data-testid": "shell-select", children: _jsx(SelectValue, {}) }), _jsx(SelectContent, { children: SHELL_OPTIONS.map((opt) => (_jsx(SelectItem, { value: opt.value, children: opt.label }, opt.value))) })] })] }), _jsxs("div", { className: "space-y-2", children: [_jsx(Label, { htmlFor: "terminal-preference", children: "Terminal Emulator" }), _jsxs(Select, { value: terminal, onValueChange: handleTerminalChange, children: [_jsx(SelectTrigger, { id: "terminal-preference", "data-testid": "terminal-select", children: _jsx(SelectValue, {}) }), _jsx(SelectContent, { children: terminalOptions.map((opt) => (_jsx(SelectItem, { value: opt.id, children: opt.name }, opt.id))) })] })] })] })] }));
54
81
  }
@@ -12,4 +12,6 @@ export default meta;
12
12
  type Story = StoryObj<typeof meta>;
13
13
  export declare const Default: Story;
14
14
  export declare const CursorWithZsh: Story;
15
+ export declare const WarpSelected: Story;
16
+ export declare const OnlySystemTerminal: Story;
15
17
  //# sourceMappingURL=environment-settings-section.stories.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"environment-settings-section.stories.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/features/settings/environment-settings-section.stories.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAQ,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,0BAA0B,EAAE,MAAM,gCAAgC,CAAC;AAG5E,QAAA,MAAM,IAAI;;;;;;;CAOyC,CAAC;AAEpD,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,IAAI,CAAC,CAAC;AAEnC,eAAO,MAAM,OAAO,EAAE,KAOrB,CAAC;AAEF,eAAO,MAAM,aAAa,EAAE,KAO3B,CAAC"}
1
+ {"version":3,"file":"environment-settings-section.stories.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/features/settings/environment-settings-section.stories.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAQ,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,0BAA0B,EAAE,MAAM,gCAAgC,CAAC;AAG5E,QAAA,MAAM,IAAI;;;;;;;CAOyC,CAAC;AAEpD,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,IAAI,CAAC,CAAC;AAEnC,eAAO,MAAM,OAAO,EAAE,KAarB,CAAC;AAEF,eAAO,MAAM,aAAa,EAAE,KAS3B,CAAC;AAEF,eAAO,MAAM,YAAY,EAAE,KAe1B,CAAC;AAEF,eAAO,MAAM,kBAAkB,EAAE,KAQhC,CAAC"}
@@ -1,5 +1,5 @@
1
1
  import { EnvironmentSettingsSection } from './environment-settings-section.js';
2
- import { EditorType } from '../../../../../../packages/core/src/domain/generated/output.js';
2
+ import { EditorType, TerminalType } from '../../../../../../packages/core/src/domain/generated/output.js';
3
3
  const meta = {
4
4
  title: 'Features/Settings/EnvironmentSettingsSection',
5
5
  component: EnvironmentSettingsSection,
@@ -14,7 +14,13 @@ export const Default = {
14
14
  environment: {
15
15
  defaultEditor: EditorType.VsCode,
16
16
  shellPreference: 'bash',
17
+ terminalPreference: TerminalType.System,
17
18
  },
19
+ availableTerminals: [
20
+ { id: 'system', name: 'System Terminal', available: true },
21
+ { id: 'warp', name: 'Warp', available: true },
22
+ { id: 'iterm2', name: 'iTerm2', available: true },
23
+ ],
18
24
  },
19
25
  };
20
26
  export const CursorWithZsh = {
@@ -22,6 +28,33 @@ export const CursorWithZsh = {
22
28
  environment: {
23
29
  defaultEditor: EditorType.Cursor,
24
30
  shellPreference: 'zsh',
31
+ terminalPreference: TerminalType.System,
32
+ },
33
+ availableTerminals: [{ id: 'system', name: 'System Terminal', available: true }],
34
+ },
35
+ };
36
+ export const WarpSelected = {
37
+ args: {
38
+ environment: {
39
+ defaultEditor: EditorType.VsCode,
40
+ shellPreference: 'zsh',
41
+ terminalPreference: TerminalType.Warp,
42
+ },
43
+ availableTerminals: [
44
+ { id: 'system', name: 'System Terminal', available: true },
45
+ { id: 'warp', name: 'Warp', available: true },
46
+ { id: 'iterm2', name: 'iTerm2', available: true },
47
+ { id: 'alacritty', name: 'Alacritty', available: true },
48
+ { id: 'kitty', name: 'Kitty', available: true },
49
+ ],
50
+ },
51
+ };
52
+ export const OnlySystemTerminal = {
53
+ args: {
54
+ environment: {
55
+ defaultEditor: EditorType.VsCode,
56
+ shellPreference: 'bash',
57
+ terminalPreference: TerminalType.System,
25
58
  },
26
59
  },
27
60
  };
@@ -1,8 +1,10 @@
1
1
  import type { Settings } from '../../../../../../packages/core/src/domain/generated/output.js';
2
+ import type { AvailableTerminal } from '../../../app/actions/get-available-terminals.js';
2
3
  export interface SettingsPageClientProps {
3
4
  settings: Settings;
4
5
  shepHome: string;
5
6
  dbFileSize: string;
7
+ availableTerminals?: AvailableTerminal[];
6
8
  }
7
- export declare function SettingsPageClient({ settings, shepHome, dbFileSize }: SettingsPageClientProps): import("react/jsx-runtime").JSX.Element;
9
+ export declare function SettingsPageClient({ settings, shepHome, dbFileSize, availableTerminals, }: SettingsPageClientProps): import("react/jsx-runtime").JSX.Element;
8
10
  //# sourceMappingURL=settings-page-client.d.ts.map
@@ -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":"AAuCA,OAAO,KAAK,EACV,QAAQ,EAGT,MAAM,sCAAsC,CAAC;AA0B9C,MAAM,WAAW,uBAAuB;IACtC,QAAQ,EAAE,QAAQ,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;CACpB;AA6QD,wBAAgB,kBAAkB,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,UAAU,EAAE,EAAE,uBAAuB,2CA4iC7F"}
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"}
@@ -11,7 +11,7 @@ import { Switch } from '../../ui/switch.js';
11
11
  import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from '../../ui/tooltip.js';
12
12
  import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from '../../ui/select.js';
13
13
  import { updateSettingsAction } from '../../../app/actions/update-settings.js';
14
- import { AgentAuthMethod, EditorType } from '../../../../../../packages/core/src/domain/generated/output.js';
14
+ import { AgentAuthMethod, EditorType, TerminalType, } from '../../../../../../packages/core/src/domain/generated/output.js';
15
15
  import { getEditorTypeIcon } from '../../common/editor-type-icons.js';
16
16
  import { AgentModelPicker } from '../../features/settings/AgentModelPicker/index.js';
17
17
  import { TimeoutSlider } from '../../features/settings/timeout-slider.js';
@@ -26,6 +26,11 @@ const EDITOR_OPTIONS = [
26
26
  { value: EditorType.Zed, label: 'Zed' },
27
27
  { value: EditorType.Antigravity, label: 'Antigravity' },
28
28
  ];
29
+ const SHELL_OPTIONS = [
30
+ { value: 'bash', label: 'Bash' },
31
+ { value: 'zsh', label: 'Zsh' },
32
+ { value: 'fish', label: 'Fish' },
33
+ ];
29
34
  const SECTIONS = [
30
35
  { id: 'agent', label: 'Agent', icon: Bot },
31
36
  { id: 'environment', label: 'Environment', icon: Terminal },
@@ -115,7 +120,7 @@ function SectionHint({ children, links, }) {
115
120
  return (_jsxs("div", { className: "hidden pt-2 lg:block", children: [_jsx("p", { className: "text-muted-foreground/70 text-[11px] leading-relaxed", children: children }), links != null && links.length > 0 ? (_jsx("div", { className: "mt-2 flex flex-col gap-1", children: links.map((link) => (_jsxs("a", { href: link.href, target: "_blank", rel: "noopener noreferrer", className: "text-muted-foreground hover:text-foreground inline-flex items-center gap-1 text-[10px] transition-colors", children: [_jsx(ExternalLink, { className: "h-2.5 w-2.5" }), link.label] }, link.href))) })) : null] }));
116
121
  }
117
122
  /* ── Main component ── */
118
- export function SettingsPageClient({ settings, shepHome, dbFileSize }) {
123
+ export function SettingsPageClient({ settings, shepHome, dbFileSize, availableTerminals, }) {
119
124
  const { showSaving, showSaved, save } = useSaveIndicator();
120
125
  const featureFlags = settings.featureFlags ?? { skills: false, envDeploy: false, debug: false };
121
126
  // Agent state
@@ -125,7 +130,12 @@ export function SettingsPageClient({ settings, shepHome, dbFileSize }) {
125
130
  const [showToken, setShowToken] = useState(false);
126
131
  // Environment state
127
132
  const [editor, setEditor] = useState(settings.environment.defaultEditor);
128
- const shell = settings.environment.shellPreference;
133
+ const [shell, setShell] = useState(settings.environment.shellPreference);
134
+ const [terminal, setTerminal] = useState(settings.environment.terminalPreference ?? TerminalType.System);
135
+ // Filter to only show installed terminals
136
+ const terminalOptions = availableTerminals
137
+ ? availableTerminals.filter((t) => t.available)
138
+ : [{ id: TerminalType.System, name: 'System Terminal', available: true }];
129
139
  // Workflow state
130
140
  const [openPr, setOpenPr] = useState(settings.workflow.openPrOnImplementationComplete);
131
141
  const [pushOnComplete, setPushOnComplete] = useState(settings.workflow.approvalGateDefaults.pushOnImplementationComplete);
@@ -134,11 +144,15 @@ export function SettingsPageClient({ settings, shepHome, dbFileSize }) {
134
144
  const [allowMerge, setAllowMerge] = useState(settings.workflow.approvalGateDefaults.allowMerge);
135
145
  const [enableEvidence, setEnableEvidence] = useState(settings.workflow.enableEvidence);
136
146
  const [commitEvidence, setCommitEvidence] = useState(settings.workflow.commitEvidence);
147
+ const [ciWatchEnabled, setCiWatchEnabled] = useState(settings.workflow.ciWatchEnabled !== false);
137
148
  const [ciMaxFix, setCiMaxFix] = useState(settings.workflow.ciMaxFixAttempts != null ? String(settings.workflow.ciMaxFixAttempts) : '');
138
149
  const [ciTimeout, setCiTimeout] = useState(settings.workflow.ciWatchTimeoutMs != null
139
150
  ? String(Math.round(settings.workflow.ciWatchTimeoutMs / 1000))
140
151
  : '');
141
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
+ : '');
142
156
  // Feature agent per-stage timeout states (stored in seconds for display, converted to ms on save)
143
157
  // Defaults: feature agent stages = 1_800_000 ms (1800s), analyze-repo = 600_000 ms (600s)
144
158
  const stageTimeoutsConfig = settings.workflow.stageTimeouts;
@@ -164,6 +178,9 @@ export function SettingsPageClient({ settings, shepHome, dbFileSize }) {
164
178
  ? String(Math.round(settings.workflow.ciWatchTimeoutMs / 1000))
165
179
  : '';
166
180
  const originalCiLogMax = settings.workflow.ciLogMaxChars != null ? String(settings.workflow.ciLogMaxChars) : '';
181
+ const originalCiPollInterval = settings.workflow.ciWatchPollIntervalSeconds != null
182
+ ? String(settings.workflow.ciWatchPollIntervalSeconds)
183
+ : '';
167
184
  const originalAnalyzeTimeout = stageTimeoutsConfig?.analyzeMs != null
168
185
  ? String(Math.round(stageTimeoutsConfig.analyzeMs / 1000))
169
186
  : '';
@@ -220,9 +237,11 @@ export function SettingsPageClient({ settings, shepHome, dbFileSize }) {
220
237
  },
221
238
  enableEvidence: overrides.enableEvidence ?? enableEvidence,
222
239
  commitEvidence: overrides.commitEvidence ?? commitEvidence,
240
+ ciWatchEnabled: overrides.ciWatchEnabled ?? ciWatchEnabled,
223
241
  ciMaxFixAttempts: parseOptionalInt(overrides.ciMaxFix ?? ciMaxFix),
224
242
  ciWatchTimeoutMs: timeoutSeconds != null ? timeoutSeconds * 1000 : undefined,
225
243
  ciLogMaxChars: parseOptionalInt(overrides.ciLogMax ?? ciLogMax),
244
+ ciWatchPollIntervalSeconds: parseOptionalInt(overrides.ciPollInterval ?? ciPollInterval),
226
245
  stageTimeouts: {
227
246
  analyzeMs: secondsToMs(overrides.analyzeTimeout ?? analyzeTimeout),
228
247
  requirementsMs: secondsToMs(overrides.requirementsTimeout ?? requirementsTimeout),
@@ -299,20 +318,42 @@ export function SettingsPageClient({ settings, shepHome, dbFileSize }) {
299
318
  label: 'Configuration guide',
300
319
  href: 'https://github.com/shep-ai/cli/blob/main/docs/guides/configuration.md',
301
320
  },
302
- ], children: "Choose which AI coding agent powers your features. Each agent supports different models and capabilities. Authentication is resolved automatically via your active session." })] }), _jsxs("div", { id: "section-environment", className: "grid scroll-mt-18 grid-cols-1 gap-x-5 rounded-lg lg:grid-cols-[1fr_280px]", children: [_jsx(SettingsSection, { icon: Terminal, title: "Environment", description: "Editor and shell preferences", testId: "environment-settings-section", children: _jsx(SettingsRow, { label: "Default Editor", description: "Editor launched for file operations", htmlFor: "default-editor", children: _jsxs(Select, { value: editor, onValueChange: (v) => {
303
- setEditor(v);
304
- save({
305
- environment: { defaultEditor: v, shellPreference: shell },
306
- });
307
- }, children: [_jsx(SelectTrigger, { id: "default-editor", "data-testid": "editor-select", className: "w-55 cursor-pointer text-xs", children: _jsx(SelectValue, {}) }), _jsx(SelectContent, { children: EDITOR_OPTIONS.map((opt) => {
308
- const Icon = getEditorTypeIcon(opt.value);
309
- return (_jsx(SelectItem, { value: opt.value, children: _jsxs("span", { className: "flex items-center gap-2 text-xs", children: [_jsx(Icon, { className: "h-4 w-4 shrink-0" }), opt.label] }) }, opt.value));
310
- }) })] }) }) }), _jsx(SectionHint, { links: [
321
+ ], children: "Choose which AI coding agent powers your features. Each agent supports different models and capabilities. Authentication is resolved automatically via your active session." })] }), _jsxs("div", { id: "section-environment", className: "grid scroll-mt-18 grid-cols-1 gap-x-5 rounded-lg lg:grid-cols-[1fr_280px]", children: [_jsxs(SettingsSection, { icon: Terminal, title: "Environment", description: "Editor, shell, and terminal preferences", testId: "environment-settings-section", children: [_jsx(SettingsRow, { label: "Default Editor", description: "Editor launched for file operations", htmlFor: "default-editor", children: _jsxs(Select, { value: editor, onValueChange: (v) => {
322
+ setEditor(v);
323
+ save({
324
+ environment: {
325
+ defaultEditor: v,
326
+ shellPreference: shell,
327
+ terminalPreference: terminal,
328
+ },
329
+ });
330
+ }, children: [_jsx(SelectTrigger, { id: "default-editor", "data-testid": "editor-select", className: "w-55 cursor-pointer text-xs", children: _jsx(SelectValue, {}) }), _jsx(SelectContent, { children: EDITOR_OPTIONS.map((opt) => {
331
+ const Icon = getEditorTypeIcon(opt.value);
332
+ return (_jsx(SelectItem, { value: opt.value, children: _jsxs("span", { className: "flex items-center gap-2 text-xs", children: [_jsx(Icon, { className: "h-4 w-4 shrink-0" }), opt.label] }) }, opt.value));
333
+ }) })] }) }), _jsx(SettingsRow, { label: "Shell", description: "Default shell for generated scripts", htmlFor: "shell-preference", children: _jsxs(Select, { value: shell, onValueChange: (v) => {
334
+ setShell(v);
335
+ save({
336
+ environment: {
337
+ defaultEditor: editor,
338
+ shellPreference: v,
339
+ terminalPreference: terminal,
340
+ },
341
+ });
342
+ }, children: [_jsx(SelectTrigger, { id: "shell-preference", "data-testid": "shell-select", className: "w-55 cursor-pointer text-xs", children: _jsx(SelectValue, {}) }), _jsx(SelectContent, { children: SHELL_OPTIONS.map((opt) => (_jsx(SelectItem, { value: opt.value, children: opt.label }, opt.value))) })] }) }), _jsx(SettingsRow, { label: "Terminal", description: "Terminal emulator for shell sessions", htmlFor: "terminal-preference", children: _jsxs(Select, { value: terminal, onValueChange: (v) => {
343
+ setTerminal(v);
344
+ save({
345
+ environment: {
346
+ defaultEditor: editor,
347
+ shellPreference: shell,
348
+ terminalPreference: v,
349
+ },
350
+ });
351
+ }, children: [_jsx(SelectTrigger, { id: "terminal-preference", "data-testid": "terminal-select", className: "w-55 cursor-pointer text-xs", children: _jsx(SelectValue, {}) }), _jsx(SelectContent, { children: terminalOptions.map((opt) => (_jsx(SelectItem, { value: opt.id, children: opt.name }, opt.id))) })] }) })] }), _jsx(SectionHint, { links: [
311
352
  {
312
353
  label: 'Configuration guide',
313
354
  href: 'https://github.com/shep-ai/cli/blob/main/docs/guides/configuration.md',
314
355
  },
315
- ], children: "Your preferred editor is used when opening files for review or editing during the development workflow." })] }), _jsxs("div", { id: "section-workflow", className: "grid scroll-mt-18 grid-cols-1 gap-x-5 rounded-lg lg:grid-cols-[1fr_280px]", children: [_jsxs(SettingsSection, { icon: GitBranch, title: "Workflow", description: "Automation behavior after implementation", testId: "workflow-settings-section", children: [_jsx(SubsectionLabel, { children: "Approve" }), _jsx(SwitchRow, { label: "Auto-approve PRD", description: "Skip manual review of requirements", id: "allow-prd", testId: "switch-allow-prd", checked: allowPrd, onChange: (v) => {
356
+ ], children: "Your preferred editor opens files for review. The shell setting controls generated scripts. The terminal emulator is launched when opening shell sessions from the web UI." })] }), _jsxs("div", { id: "section-workflow", className: "grid scroll-mt-18 grid-cols-1 gap-x-5 rounded-lg lg:grid-cols-[1fr_280px]", children: [_jsxs(SettingsSection, { icon: GitBranch, title: "Workflow", description: "Automation behavior after implementation", testId: "workflow-settings-section", children: [_jsx(SubsectionLabel, { children: "Approve" }), _jsx(SwitchRow, { label: "Auto-approve PRD", description: "Skip manual review of requirements", id: "allow-prd", testId: "switch-allow-prd", checked: allowPrd, onChange: (v) => {
316
357
  setAllowPrd(v);
317
358
  save(buildWorkflowPayload({ allowPrd: v }));
318
359
  } }), _jsx(SwitchRow, { label: "Auto-approve Plan", description: "Skip manual review of implementation plan", id: "allow-plan", testId: "switch-allow-plan", checked: allowPlan, onChange: (v) => {
@@ -345,6 +386,9 @@ export function SettingsPageClient({ settings, shepHome, dbFileSize }) {
345
386
  else {
346
387
  save(buildWorkflowPayload({ openPr: v }));
347
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 }));
348
392
  } })] }), _jsx(SectionHint, { links: [
349
393
  {
350
394
  label: 'Approval gates',
@@ -363,7 +407,10 @@ export function SettingsPageClient({ settings, shepHome, dbFileSize }) {
363
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: () => {
364
408
  if (ciLogMax !== originalCiLogMax)
365
409
  save(buildWorkflowPayload({ ciLogMax }));
366
- }, 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: [
367
414
  {
368
415
  label: 'CI/CD pipeline',
369
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"}