@shepai/cli 1.117.0 → 1.118.0-pr379.a71d408

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 (228) hide show
  1. package/apis/json-schema/EnvironmentConfig.yaml +5 -0
  2. package/apis/json-schema/TerminalType.yaml +10 -0
  3. package/apis/json-schema/WorkflowConfig.yaml +5 -0
  4. package/dist/packages/core/src/application/ports/output/services/git-pr-service.interface.d.ts +2 -1
  5. package/dist/packages/core/src/application/ports/output/services/git-pr-service.interface.d.ts.map +1 -1
  6. package/dist/packages/core/src/domain/factories/settings-defaults.factory.d.ts.map +1 -1
  7. package/dist/packages/core/src/domain/factories/settings-defaults.factory.js +7 -1
  8. package/dist/packages/core/src/domain/generated/output.d.ts +15 -0
  9. package/dist/packages/core/src/domain/generated/output.d.ts.map +1 -1
  10. package/dist/packages/core/src/domain/generated/output.js +8 -0
  11. package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/settings.mapper.d.ts +1 -0
  12. package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/settings.mapper.d.ts.map +1 -1
  13. package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/settings.mapper.js +2 -0
  14. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/036-add-terminal-preference.d.ts +11 -0
  15. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/036-add-terminal-preference.d.ts.map +1 -0
  16. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/036-add-terminal-preference.js +13 -0
  17. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations.js +1 -1
  18. package/dist/packages/core/src/infrastructure/repositories/sqlite-settings.repository.d.ts.map +1 -1
  19. package/dist/packages/core/src/infrastructure/repositories/sqlite-settings.repository.js +3 -2
  20. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/merge/ci-watch-fix-loop.d.ts.map +1 -1
  21. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/merge/ci-watch-fix-loop.js +3 -2
  22. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/prompts/merge-prompts.d.ts +5 -10
  23. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/prompts/merge-prompts.d.ts.map +1 -1
  24. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/prompts/merge-prompts.js +5 -73
  25. package/dist/packages/core/src/infrastructure/services/git/git-pr.service.d.ts +1 -1
  26. package/dist/packages/core/src/infrastructure/services/git/git-pr.service.d.ts.map +1 -1
  27. package/dist/packages/core/src/infrastructure/services/git/git-pr.service.js +12 -3
  28. package/dist/packages/core/src/infrastructure/services/tool-installer/tool-metadata.d.ts +5 -0
  29. package/dist/packages/core/src/infrastructure/services/tool-installer/tool-metadata.d.ts.map +1 -1
  30. package/dist/packages/core/src/infrastructure/services/tool-installer/tool-metadata.js +7 -0
  31. package/dist/packages/core/src/infrastructure/services/tool-installer/tools/system-terminal.json +24 -0
  32. package/dist/src/presentation/web/app/actions/get-available-terminals.d.ts +12 -0
  33. package/dist/src/presentation/web/app/actions/get-available-terminals.d.ts.map +1 -0
  34. package/dist/src/presentation/web/app/actions/get-available-terminals.js +53 -0
  35. package/dist/src/presentation/web/app/actions/open-shell.d.ts.map +1 -1
  36. package/dist/src/presentation/web/app/actions/open-shell.js +47 -3
  37. package/dist/src/presentation/web/app/settings/page.d.ts.map +1 -1
  38. package/dist/src/presentation/web/app/settings/page.js +6 -2
  39. package/dist/src/presentation/web/components/features/settings/environment-settings-section.d.ts +3 -1
  40. package/dist/src/presentation/web/components/features/settings/environment-settings-section.d.ts.map +1 -1
  41. package/dist/src/presentation/web/components/features/settings/environment-settings-section.js +32 -5
  42. package/dist/src/presentation/web/components/features/settings/environment-settings-section.stories.d.ts +2 -0
  43. package/dist/src/presentation/web/components/features/settings/environment-settings-section.stories.d.ts.map +1 -1
  44. package/dist/src/presentation/web/components/features/settings/environment-settings-section.stories.js +34 -1
  45. package/dist/src/presentation/web/components/features/settings/settings-page-client.d.ts +3 -1
  46. package/dist/src/presentation/web/components/features/settings/settings-page-client.d.ts.map +1 -1
  47. package/dist/src/presentation/web/components/features/settings/settings-page-client.js +56 -14
  48. package/dist/src/presentation/web/components/features/settings/workflow-settings-section.d.ts.map +1 -1
  49. package/dist/src/presentation/web/components/features/settings/workflow-settings-section.js +4 -1
  50. package/dist/tsconfig.build.tsbuildinfo +1 -1
  51. package/package.json +1 -1
  52. package/web/.next/BUILD_ID +1 -1
  53. package/web/.next/build-manifest.json +2 -2
  54. package/web/.next/fallback-build-manifest.json +2 -2
  55. package/web/.next/prerender-manifest.json +3 -3
  56. package/web/.next/required-server-files.js +3 -3
  57. package/web/.next/required-server-files.json +3 -3
  58. package/web/.next/server/app/(dashboard)/@drawer/create/page/server-reference-manifest.json +21 -21
  59. package/web/.next/server/app/(dashboard)/@drawer/create/page.js +2 -2
  60. package/web/.next/server/app/(dashboard)/@drawer/create/page.js.nft.json +1 -1
  61. package/web/.next/server/app/(dashboard)/@drawer/create/page_client-reference-manifest.js +1 -1
  62. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page/server-reference-manifest.json +27 -27
  63. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page.js +3 -3
  64. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page.js.nft.json +1 -1
  65. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page_client-reference-manifest.js +1 -1
  66. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page/server-reference-manifest.json +27 -27
  67. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js +3 -3
  68. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js.nft.json +1 -1
  69. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page_client-reference-manifest.js +1 -1
  70. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page/server-reference-manifest.json +19 -19
  71. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js +2 -2
  72. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js.nft.json +1 -1
  73. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  74. package/web/.next/server/app/(dashboard)/create/page/server-reference-manifest.json +21 -21
  75. package/web/.next/server/app/(dashboard)/create/page.js +2 -2
  76. package/web/.next/server/app/(dashboard)/create/page.js.nft.json +1 -1
  77. package/web/.next/server/app/(dashboard)/create/page_client-reference-manifest.js +1 -1
  78. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page/server-reference-manifest.json +27 -27
  79. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page.js +3 -3
  80. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page.js.nft.json +1 -1
  81. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page_client-reference-manifest.js +1 -1
  82. package/web/.next/server/app/(dashboard)/feature/[featureId]/page/server-reference-manifest.json +27 -27
  83. package/web/.next/server/app/(dashboard)/feature/[featureId]/page.js +3 -3
  84. package/web/.next/server/app/(dashboard)/feature/[featureId]/page.js.nft.json +1 -1
  85. package/web/.next/server/app/(dashboard)/feature/[featureId]/page_client-reference-manifest.js +1 -1
  86. package/web/.next/server/app/(dashboard)/page/server-reference-manifest.json +19 -19
  87. package/web/.next/server/app/(dashboard)/page.js +2 -2
  88. package/web/.next/server/app/(dashboard)/page.js.nft.json +1 -1
  89. package/web/.next/server/app/(dashboard)/page_client-reference-manifest.js +1 -1
  90. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page/server-reference-manifest.json +19 -19
  91. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js +2 -2
  92. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js.nft.json +1 -1
  93. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  94. package/web/.next/server/app/_global-error/page.js +1 -1
  95. package/web/.next/server/app/_global-error/page.js.nft.json +1 -1
  96. package/web/.next/server/app/_global-error.html +2 -2
  97. package/web/.next/server/app/_global-error.rsc +1 -1
  98. package/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  99. package/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  100. package/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  101. package/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  102. package/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  103. package/web/.next/server/app/_not-found/page/server-reference-manifest.json +1 -1
  104. package/web/.next/server/app/_not-found/page.js +2 -2
  105. package/web/.next/server/app/_not-found/page.js.nft.json +1 -1
  106. package/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  107. package/web/.next/server/app/api/attachments/preview/route.js.nft.json +1 -1
  108. package/web/.next/server/app/api/evidence/route.js.nft.json +1 -1
  109. package/web/.next/server/app/settings/page/server-reference-manifest.json +25 -10
  110. package/web/.next/server/app/settings/page.js +3 -3
  111. package/web/.next/server/app/settings/page.js.nft.json +1 -1
  112. package/web/.next/server/app/settings/page_client-reference-manifest.js +1 -1
  113. package/web/.next/server/app/skills/page/server-reference-manifest.json +6 -6
  114. package/web/.next/server/app/skills/page.js +2 -2
  115. package/web/.next/server/app/skills/page.js.nft.json +1 -1
  116. package/web/.next/server/app/skills/page_client-reference-manifest.js +1 -1
  117. package/web/.next/server/app/tools/page/server-reference-manifest.json +6 -6
  118. package/web/.next/server/app/tools/page.js +2 -2
  119. package/web/.next/server/app/tools/page.js.nft.json +1 -1
  120. package/web/.next/server/app/tools/page_client-reference-manifest.js +1 -1
  121. package/web/.next/server/app/version/page/server-reference-manifest.json +1 -1
  122. package/web/.next/server/app/version/page.js +2 -2
  123. package/web/.next/server/app/version/page.js.nft.json +1 -1
  124. package/web/.next/server/app/version/page_client-reference-manifest.js +1 -1
  125. package/web/.next/server/chunks/[root-of-the-server]__7d5492a0._.js +1 -1
  126. package/web/.next/server/chunks/[root-of-the-server]__7d5492a0._.js.map +1 -1
  127. package/web/.next/server/chunks/[root-of-the-server]__a402b567._.js +1 -1
  128. package/web/.next/server/chunks/[root-of-the-server]__cd67a84c._.js +1 -1
  129. package/web/.next/server/chunks/[root-of-the-server]__cd67a84c._.js.map +1 -1
  130. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js +1 -1
  131. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js.map +1 -1
  132. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_ed372306.js +1 -1
  133. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_ed372306.js.map +1 -1
  134. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_32e26434.js +1 -1
  135. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_32e26434.js.map +1 -1
  136. package/web/.next/server/chunks/ssr/[root-of-the-server]__07a39ff2._.js +1 -1
  137. package/web/.next/server/chunks/ssr/{[root-of-the-server]__4af0afe0._.js → [root-of-the-server]__2dddfea9._.js} +2 -2
  138. package/web/.next/server/chunks/ssr/{[root-of-the-server]__4af0afe0._.js.map → [root-of-the-server]__2dddfea9._.js.map} +1 -1
  139. package/web/.next/server/chunks/ssr/[root-of-the-server]__2ff2daf6._.js +4 -0
  140. package/web/.next/server/chunks/ssr/[root-of-the-server]__2ff2daf6._.js.map +1 -0
  141. package/web/.next/server/chunks/ssr/{[root-of-the-server]__ac0304e7._.js → [root-of-the-server]__3155add4._.js} +2 -2
  142. package/web/.next/server/chunks/ssr/{[root-of-the-server]__ac0304e7._.js.map → [root-of-the-server]__3155add4._.js.map} +1 -1
  143. package/web/.next/server/chunks/ssr/{[root-of-the-server]__9bc1434f._.js → [root-of-the-server]__4c7486cb._.js} +2 -2
  144. package/web/.next/server/chunks/ssr/{[root-of-the-server]__9bc1434f._.js.map → [root-of-the-server]__4c7486cb._.js.map} +1 -1
  145. package/web/.next/server/chunks/ssr/[root-of-the-server]__6367aea0._.js +1 -1
  146. package/web/.next/server/chunks/ssr/[root-of-the-server]__6367aea0._.js.map +1 -1
  147. package/web/.next/server/chunks/ssr/[root-of-the-server]__6b17a22d._.js +4 -0
  148. package/web/.next/server/chunks/ssr/{[root-of-the-server]__11033878._.js.map → [root-of-the-server]__6b17a22d._.js.map} +1 -1
  149. package/web/.next/server/chunks/ssr/[root-of-the-server]__6bb00d90._.js +4 -0
  150. package/web/.next/server/chunks/ssr/{[root-of-the-server]__aad040c0._.js.map → [root-of-the-server]__6bb00d90._.js.map} +1 -1
  151. package/web/.next/server/chunks/ssr/[root-of-the-server]__6eb2a2b0._.js +1 -1
  152. package/web/.next/server/chunks/ssr/[root-of-the-server]__6eb2a2b0._.js.map +1 -1
  153. package/web/.next/server/chunks/ssr/[root-of-the-server]__7b707feb._.js +4 -0
  154. package/web/.next/server/chunks/ssr/[root-of-the-server]__7b707feb._.js.map +1 -0
  155. package/web/.next/server/chunks/ssr/[root-of-the-server]__804c006d._.js +4 -0
  156. package/web/.next/server/chunks/ssr/{[root-of-the-server]__fdc75809._.js.map → [root-of-the-server]__804c006d._.js.map} +1 -1
  157. package/web/.next/server/chunks/ssr/{[root-of-the-server]__89e8a5cc._.js → [root-of-the-server]__8763fd7a._.js} +3 -3
  158. package/web/.next/server/chunks/ssr/[root-of-the-server]__8763fd7a._.js.map +1 -0
  159. package/web/.next/server/chunks/ssr/{[root-of-the-server]__2a5592d5._.js → [root-of-the-server]__9c56d724._.js} +2 -2
  160. package/web/.next/server/chunks/ssr/{[root-of-the-server]__2a5592d5._.js.map → [root-of-the-server]__9c56d724._.js.map} +1 -1
  161. package/web/.next/server/chunks/ssr/{[root-of-the-server]__a93289b0._.js → [root-of-the-server]__cfc116d5._.js} +2 -2
  162. package/web/.next/server/chunks/ssr/{[root-of-the-server]__a93289b0._.js.map → [root-of-the-server]__cfc116d5._.js.map} +1 -1
  163. package/web/.next/server/chunks/ssr/{[root-of-the-server]__172d9576._.js → [root-of-the-server]__d3841d9e._.js} +2 -2
  164. package/web/.next/server/chunks/ssr/{[root-of-the-server]__172d9576._.js.map → [root-of-the-server]__d3841d9e._.js.map} +1 -1
  165. package/web/.next/server/chunks/ssr/[root-of-the-server]__db9afe04._.js +3 -0
  166. package/web/.next/server/chunks/ssr/{[root-of-the-server]__b1e68e34._.js.map → [root-of-the-server]__db9afe04._.js.map} +1 -1
  167. package/web/.next/server/chunks/ssr/{_a8d14ab2._.js → _08d85106._.js} +2 -2
  168. package/web/.next/server/chunks/ssr/{_a8d14ab2._.js.map → _08d85106._.js.map} +1 -1
  169. package/web/.next/server/chunks/ssr/_135edb9c._.js +1 -1
  170. package/web/.next/server/chunks/ssr/_135edb9c._.js.map +1 -1
  171. package/web/.next/server/chunks/ssr/_1bb131c4._.js +1 -1
  172. package/web/.next/server/chunks/ssr/_1bb131c4._.js.map +1 -1
  173. package/web/.next/server/chunks/ssr/_250a63ae._.js.map +1 -1
  174. package/web/.next/server/chunks/ssr/{_8dacd1e7._.js → _2f6f48b8._.js} +2 -2
  175. package/web/.next/server/chunks/ssr/{_8dacd1e7._.js.map → _2f6f48b8._.js.map} +1 -1
  176. package/web/.next/server/chunks/ssr/{_d6a1ec27._.js → _34950c42._.js} +2 -2
  177. package/web/.next/server/chunks/ssr/{_d6a1ec27._.js.map → _34950c42._.js.map} +1 -1
  178. package/web/.next/server/chunks/ssr/{_125679ad._.js → _367737e0._.js} +2 -2
  179. package/web/.next/server/chunks/ssr/{_125679ad._.js.map → _367737e0._.js.map} +1 -1
  180. package/web/.next/server/chunks/ssr/_cc77a143._.js +1 -1
  181. package/web/.next/server/chunks/ssr/_cc77a143._.js.map +1 -1
  182. package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_settings_settings-page-client_tsx_6ed9d5f8._.js +1 -1
  183. package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_settings_settings-page-client_tsx_6ed9d5f8._.js.map +1 -1
  184. package/web/.next/server/chunks/ssr/src_presentation_web_0835b28e._.js +2 -2
  185. package/web/.next/server/chunks/ssr/src_presentation_web_0835b28e._.js.map +1 -1
  186. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_e99d78dd.js +1 -1
  187. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_e99d78dd.js.map +1 -1
  188. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_skills_page_actions_1fa8042e.js +1 -1
  189. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_skills_page_actions_1fa8042e.js.map +1 -1
  190. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_tools_page_actions_24684200.js +1 -1
  191. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_tools_page_actions_24684200.js.map +1 -1
  192. package/web/.next/server/chunks/ssr/src_presentation_web_components_bf50c527._.js +1 -1
  193. package/web/.next/server/chunks/ssr/src_presentation_web_components_bf50c527._.js.map +1 -1
  194. package/web/.next/server/chunks/ssr/src_presentation_web_components_de814675._.js +1 -1
  195. package/web/.next/server/chunks/ssr/src_presentation_web_components_de814675._.js.map +1 -1
  196. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js +1 -1
  197. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js.map +1 -1
  198. package/web/.next/server/chunks/ssr/src_presentation_web_e8034a29._.js +2 -2
  199. package/web/.next/server/chunks/ssr/src_presentation_web_e8034a29._.js.map +1 -1
  200. package/web/.next/server/pages/500.html +2 -2
  201. package/web/.next/server/server-reference-manifest.js +1 -1
  202. package/web/.next/server/server-reference-manifest.json +52 -37
  203. package/web/.next/static/chunks/{c76f6d06b1b69b57.js → 149c044db14ba247.js} +1 -1
  204. package/web/.next/static/chunks/2ccf294babe8a526.js +1 -0
  205. package/web/.next/static/chunks/{34b275db4ad6fb5d.js → 2ff4e51636afec0a.js} +1 -1
  206. package/web/.next/static/chunks/6e33380b294e51db.js +1 -0
  207. package/web/.next/static/chunks/8ce7853a87d4957e.js +1 -0
  208. package/web/.next/static/chunks/{2c98935265aa3622.js → a07b01a57cdb92f2.js} +2 -2
  209. package/web/.next/static/chunks/{498777301470975b.js → a9523cf5247ee791.js} +1 -1
  210. package/web/.next/static/chunks/{b855de1b1e5458f6.js → b8796bba61c5f1f9.js} +1 -1
  211. package/web/.next/static/chunks/{5fe03deadb83628b.js → cc5b77d2674bae26.js} +1 -1
  212. package/web/.next/static/chunks/{fcde0cbb2976b933.js → e2ef95d904c360f3.js} +1 -1
  213. package/web/.next/static/chunks/{425894e5bf370bd2.js → f5021ad2ecc5916b.js} +2 -2
  214. package/web/.next/server/chunks/ssr/[root-of-the-server]__11033878._.js +0 -4
  215. package/web/.next/server/chunks/ssr/[root-of-the-server]__24dd0927._.js +0 -4
  216. package/web/.next/server/chunks/ssr/[root-of-the-server]__24dd0927._.js.map +0 -1
  217. package/web/.next/server/chunks/ssr/[root-of-the-server]__5d87af2e._.js +0 -4
  218. package/web/.next/server/chunks/ssr/[root-of-the-server]__5d87af2e._.js.map +0 -1
  219. package/web/.next/server/chunks/ssr/[root-of-the-server]__89e8a5cc._.js.map +0 -1
  220. package/web/.next/server/chunks/ssr/[root-of-the-server]__aad040c0._.js +0 -4
  221. package/web/.next/server/chunks/ssr/[root-of-the-server]__b1e68e34._.js +0 -3
  222. package/web/.next/server/chunks/ssr/[root-of-the-server]__fdc75809._.js +0 -4
  223. package/web/.next/static/chunks/2251df6427162751.js +0 -1
  224. package/web/.next/static/chunks/50f06bb71bace452.js +0 -1
  225. package/web/.next/static/chunks/e2caffa0bb759c6c.js +0 -1
  226. /package/web/.next/static/{bAT4Gm6M7U0lGmNAN3mTn → 4lwbtGuLakkOP4dusXn2B}/_buildManifest.js +0 -0
  227. /package/web/.next/static/{bAT4Gm6M7U0lGmNAN3mTn → 4lwbtGuLakkOP4dusXn2B}/_clientMiddlewareManifest.json +0 -0
  228. /package/web/.next/static/{bAT4Gm6M7U0lGmNAN3mTn → 4lwbtGuLakkOP4dusXn2B}/_ssgManifest.js +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"tool-metadata.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/src/infrastructure/services/tool-installer/tool-metadata.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAMH,MAAM,WAAW,YAAY;IAC3B,kCAAkC;IAClC,IAAI,EAAE,MAAM,CAAC;IAEb,6BAA6B;IAC7B,OAAO,EAAE,MAAM,CAAC;IAEhB,2BAA2B;IAC3B,WAAW,EAAE,MAAM,CAAC;IAEpB,oFAAoF;IACpF,IAAI,EAAE,CAAC,KAAK,GAAG,WAAW,GAAG,KAAK,GAAG,UAAU,CAAC,EAAE,CAAC;IAEnD,gCAAgC;IAChC,MAAM,CAAC,EAAE,MAAM,CAAC;IAEhB,8DAA8D;IAC9D,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB,iDAAiD;IACjD,SAAS,CAAC,EAAE,CAAC,OAAO,GAAG,QAAQ,GAAG,OAAO,CAAC,EAAE,CAAC;IAE7C,wCAAwC;IACxC,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB,6EAA6E;IAC7E,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAExC,6CAA6C;IAC7C,cAAc,EAAE,MAAM,CAAC;IAEvB,wFAAwF;IACxF,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAEjC,2CAA2C;IAC3C,OAAO,EAAE,MAAM,CAAC;IAEhB,iCAAiC;IACjC,gBAAgB,EAAE,MAAM,CAAC;IAEzB,8DAA8D;IAC9D,aAAa,EAAE,MAAM,CAAC;IAEtB,uEAAuE;IACvE,WAAW,CAAC,EAAE,OAAO,CAAC;IAEtB,kFAAkF;IAClF,QAAQ,CAAC,EAAE,OAAO,CAAC;IAEnB;;yGAEqG;IACrG,aAAa,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAEhD;;iGAE6F;IAC7F,YAAY,CAAC,EAAE;QACb,KAAK,CAAC,EAAE,OAAO,CAAC;QAChB,KAAK,CAAC,EAAE,QAAQ,GAAG,SAAS,GAAG,MAAM,CAAC;QACtC,QAAQ,CAAC,EAAE,OAAO,CAAC;KACpB,CAAC;IAEF;;;;wEAIoE;IACpE,eAAe,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACnD;AAmDD,eAAO,MAAM,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAAsB,CAAC;AAE9E;;;;GAIG;AACH,wBAAgB,aAAa,IAAI,CAAC,MAAM,EAAE,YAAY,CAAC,EAAE,CAExD"}
1
+ {"version":3,"file":"tool-metadata.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/src/infrastructure/services/tool-installer/tool-metadata.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAMH,MAAM,WAAW,YAAY;IAC3B,kCAAkC;IAClC,IAAI,EAAE,MAAM,CAAC;IAEb,6BAA6B;IAC7B,OAAO,EAAE,MAAM,CAAC;IAEhB,2BAA2B;IAC3B,WAAW,EAAE,MAAM,CAAC;IAEpB,oFAAoF;IACpF,IAAI,EAAE,CAAC,KAAK,GAAG,WAAW,GAAG,KAAK,GAAG,UAAU,CAAC,EAAE,CAAC;IAEnD,gCAAgC;IAChC,MAAM,CAAC,EAAE,MAAM,CAAC;IAEhB,8DAA8D;IAC9D,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB,iDAAiD;IACjD,SAAS,CAAC,EAAE,CAAC,OAAO,GAAG,QAAQ,GAAG,OAAO,CAAC,EAAE,CAAC;IAE7C,wCAAwC;IACxC,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB,6EAA6E;IAC7E,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAExC,6CAA6C;IAC7C,cAAc,EAAE,MAAM,CAAC;IAEvB,wFAAwF;IACxF,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAEjC,2CAA2C;IAC3C,OAAO,EAAE,MAAM,CAAC;IAEhB,iCAAiC;IACjC,gBAAgB,EAAE,MAAM,CAAC;IAEzB,8DAA8D;IAC9D,aAAa,EAAE,MAAM,CAAC;IAEtB,uEAAuE;IACvE,WAAW,CAAC,EAAE,OAAO,CAAC;IAEtB,kFAAkF;IAClF,QAAQ,CAAC,EAAE,OAAO,CAAC;IAEnB;;yGAEqG;IACrG,aAAa,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAEhD;;iGAE6F;IAC7F,YAAY,CAAC,EAAE;QACb,KAAK,CAAC,EAAE,OAAO,CAAC;QAChB,KAAK,CAAC,EAAE,QAAQ,GAAG,SAAS,GAAG,MAAM,CAAC;QACtC,QAAQ,CAAC,EAAE,OAAO,CAAC;KACpB,CAAC;IAEF;;;;wEAIoE;IACpE,eAAe,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACnD;AAmDD,eAAO,MAAM,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAAsB,CAAC;AAE9E;;;;GAIG;AACH,wBAAgB,aAAa,IAAI,CAAC,MAAM,EAAE,YAAY,CAAC,EAAE,CAExD;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,IAAI,CAAC,MAAM,EAAE,YAAY,CAAC,EAAE,CAI7D"}
@@ -63,3 +63,10 @@ export const TOOL_METADATA = loadToolMetadata();
63
63
  export function getIdeEntries() {
64
64
  return Object.entries(TOOL_METADATA).filter(([, meta]) => meta.openDirectory != null);
65
65
  }
66
+ /**
67
+ * Returns entries from TOOL_METADATA tagged as "terminal" that have an
68
+ * `openDirectory` field. Each entry is [toolId, metadata].
69
+ */
70
+ export function getTerminalEntries() {
71
+ return Object.entries(TOOL_METADATA).filter(([, meta]) => meta.tags.includes('terminal') && meta.openDirectory != null);
72
+ }
@@ -0,0 +1,24 @@
1
+ {
2
+ "name": "System Terminal",
3
+ "summary": "OS default terminal emulator",
4
+ "description": "The default terminal emulator for your operating system: Terminal.app on macOS, x-terminal-emulator on Linux, and PowerShell on Windows.",
5
+ "tags": ["terminal"],
6
+ "author": "System",
7
+ "platforms": ["linux", "darwin", "win32"],
8
+ "binary": {
9
+ "darwin": "open",
10
+ "linux": "x-terminal-emulator",
11
+ "win32": "powershell"
12
+ },
13
+ "packageManager": "system",
14
+ "commands": {},
15
+ "timeout": 5000,
16
+ "documentationUrl": "https://support.apple.com/guide/terminal/welcome/mac",
17
+ "verifyCommand": "true",
18
+ "autoInstall": false,
19
+ "openDirectory": {
20
+ "darwin": "open -a Terminal {dir}",
21
+ "linux": "x-terminal-emulator --working-directory={dir}",
22
+ "win32": "powershell -NoExit -Command \"Set-Location \\\"{dir}\\\"\""
23
+ }
24
+ }
@@ -0,0 +1,12 @@
1
+ export interface AvailableTerminal {
2
+ id: string;
3
+ name: string;
4
+ available: boolean;
5
+ }
6
+ /**
7
+ * Returns the list of terminal entries from tool metadata, filtered to the
8
+ * current platform, with availability checks. The "system-terminal" entry
9
+ * is always marked available and listed first.
10
+ */
11
+ export declare function getAvailableTerminals(): Promise<AvailableTerminal[]>;
12
+ //# sourceMappingURL=get-available-terminals.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-available-terminals.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/web/app/actions/get-available-terminals.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,OAAO,CAAC;CACpB;AAED;;;;GAIG;AACH,wBAAsB,qBAAqB,IAAI,OAAO,CAAC,iBAAiB,EAAE,CAAC,CAkD1E"}
@@ -0,0 +1,53 @@
1
+ 'use server';
2
+ import { platform } from 'node:os';
3
+ import { getTerminalEntries } from '../../../../../packages/core/src/infrastructure/services/tool-installer/tool-metadata.js';
4
+ import { checkBinaryExists } from '../../../../../packages/core/src/infrastructure/services/tool-installer/binary-exists.js';
5
+ /**
6
+ * Returns the list of terminal entries from tool metadata, filtered to the
7
+ * current platform, with availability checks. The "system-terminal" entry
8
+ * is always marked available and listed first.
9
+ */
10
+ export async function getAvailableTerminals() {
11
+ const currentPlatform = platform();
12
+ const entries = getTerminalEntries();
13
+ const results = [];
14
+ for (const [id, meta] of entries) {
15
+ // Skip terminals not supported on this platform
16
+ if (meta.platforms &&
17
+ !meta.platforms.includes(currentPlatform)) {
18
+ continue;
19
+ }
20
+ // System terminal is always available
21
+ if (id === 'system-terminal') {
22
+ results.unshift({ id: 'system', name: meta.name, available: true });
23
+ continue;
24
+ }
25
+ // Check binary availability
26
+ const binary = typeof meta.binary === 'string' ? meta.binary : meta.binary[currentPlatform];
27
+ if (!binary)
28
+ continue;
29
+ // For app-bundle terminals (Warp, iTerm2) that use verifyCommand instead of binary check
30
+ let available = false;
31
+ if (meta.verifyCommand.startsWith('test ')) {
32
+ // Use verifyCommand for app-bundle checks (e.g., "test -d /Applications/Warp.app")
33
+ try {
34
+ const { execSync } = await import('node:child_process');
35
+ execSync(meta.verifyCommand, { stdio: 'ignore' });
36
+ available = true;
37
+ }
38
+ catch {
39
+ available = false;
40
+ }
41
+ }
42
+ else {
43
+ const result = await checkBinaryExists(binary);
44
+ available = result.found;
45
+ }
46
+ results.push({ id, name: meta.name, available });
47
+ }
48
+ // Ensure system terminal is always present even if not in tool metadata
49
+ if (!results.some((r) => r.id === 'system')) {
50
+ results.unshift({ id: 'system', name: 'System Terminal', available: true });
51
+ }
52
+ return results;
53
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"open-shell.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/web/app/actions/open-shell.ts"],"names":[],"mappings":"AAsBA,UAAU,cAAc;IACtB,cAAc,EAAE,MAAM,CAAC;IACvB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,wBAAsB,SAAS,CAC7B,KAAK,EAAE,cAAc,GACpB,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAoC9E"}
1
+ {"version":3,"file":"open-shell.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/web/app/actions/open-shell.ts"],"names":[],"mappings":"AA+BA,UAAU,cAAc;IACtB,cAAc,EAAE,MAAM,CAAC;IACvB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,wBAAsB,SAAS,CAC7B,KAAK,EAAE,cAAc,GACpB,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CA2E9E"}
@@ -5,11 +5,19 @@ import { isAbsolute } from 'node:path';
5
5
  import { spawn } from 'node:child_process';
6
6
  import { getSettings } from '../../../../../packages/core/src/infrastructure/services/settings.service.js';
7
7
  import { computeWorktreePath } from '../../../../../packages/core/src/infrastructure/services/ide-launchers/compute-worktree-path.js';
8
- // Use a record lookup instead of if/else to prevent the bundler from
8
+ import { getTerminalEntries } from '../../../../../packages/core/src/infrastructure/services/tool-installer/tool-metadata.js';
9
+ /** Resolves a platform-keyed value to the current platform string. */
10
+ function resolvePlatformValue(value) {
11
+ if (typeof value === 'string')
12
+ return value;
13
+ return value[platform()] ?? Object.values(value)[0];
14
+ }
15
+ // Fallback commands for the "system" terminal when no tool metadata entry exists.
16
+ // Uses a record lookup instead of if/else to prevent the bundler from
9
17
  // tree-shaking platform branches at build time. Turbopack evaluates
10
18
  // os.platform() during the build and dead-code-eliminates unused branches,
11
19
  // baking in the CI platform (linux) and breaking macOS/Windows installs.
12
- const SHELL_COMMANDS = {
20
+ const SYSTEM_TERMINAL_COMMANDS = {
13
21
  darwin: { cmd: 'open', args: (p) => ['-a', 'Terminal', p] },
14
22
  linux: { cmd: 'x-terminal-emulator', args: (p) => [`--working-directory=${p}`] },
15
23
  win32: {
@@ -25,11 +33,47 @@ export async function openShell(input) {
25
33
  try {
26
34
  const settings = getSettings();
27
35
  const shell = settings.environment.shellPreference;
36
+ const terminalPref = settings.environment.terminalPreference ?? 'system';
28
37
  const targetPath = branch ? computeWorktreePath(repositoryPath, branch) : repositoryPath;
29
38
  if (!existsSync(targetPath)) {
30
39
  return { success: false, error: `Path does not exist: ${targetPath}` };
31
40
  }
32
- const entry = SHELL_COMMANDS[platform()];
41
+ // Try to find the terminal in tool metadata for non-system terminals
42
+ if (terminalPref !== 'system') {
43
+ const entries = getTerminalEntries();
44
+ const terminalEntry = entries.find(([id]) => id === terminalPref);
45
+ if (terminalEntry) {
46
+ const [, meta] = terminalEntry;
47
+ if (meta.openDirectory) {
48
+ const openCmd = resolvePlatformValue(meta.openDirectory);
49
+ if (openCmd.includes('{dir}')) {
50
+ const resolved = openCmd.replace('{dir}', targetPath);
51
+ const useShell = meta.spawnOptions?.shell === true;
52
+ if (useShell) {
53
+ const child = spawn(resolved, [], {
54
+ detached: true,
55
+ stdio: 'ignore',
56
+ shell: true,
57
+ });
58
+ child.on('error', () => undefined);
59
+ child.unref();
60
+ }
61
+ else {
62
+ const [command, ...args] = resolved.split(/\s+/);
63
+ const child = spawn(command, args, {
64
+ detached: true,
65
+ stdio: 'ignore',
66
+ });
67
+ child.on('error', () => undefined);
68
+ child.unref();
69
+ }
70
+ return { success: true, path: targetPath, shell };
71
+ }
72
+ }
73
+ }
74
+ }
75
+ // Fallback to system terminal
76
+ const entry = SYSTEM_TERMINAL_COMMANDS[platform()];
33
77
  if (!entry) {
34
78
  return {
35
79
  success: false,
@@ -1 +1 @@
1
- {"version":3,"file":"page.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/web/app/settings/page.tsx"],"names":[],"mappings":"AAGA,uFAAuF;AACvF,eAAO,MAAM,OAAO,kBAAkB,CAAC;AAEvC,wBAA8B,YAAY,qDAoBzC"}
1
+ {"version":3,"file":"page.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/web/app/settings/page.tsx"],"names":[],"mappings":"AAIA,uFAAuF;AACvF,eAAO,MAAM,OAAO,kBAAkB,CAAC;AAEvC,wBAA8B,YAAY,qDAwBzC"}
@@ -1,12 +1,16 @@
1
1
  import { jsxs as _jsxs, jsx as _jsx } from "react/jsx-runtime";
2
2
  import { loadSettings } from '../actions/load-settings.js';
3
+ import { getAvailableTerminals } from '../actions/get-available-terminals.js';
3
4
  import { SettingsPageClient } from '../../components/features/settings/settings-page-client.js';
4
5
  /** Skip static pre-rendering since we need runtime DI container and server context. */
5
6
  export const dynamic = 'force-dynamic';
6
7
  export default async function SettingsPage() {
7
- const { settings, shepHome, dbFileSize, error } = await loadSettings();
8
+ const [{ settings, shepHome, dbFileSize, error }, availableTerminals] = await Promise.all([
9
+ loadSettings(),
10
+ getAvailableTerminals(),
11
+ ]);
8
12
  if (error || !settings) {
9
13
  return (_jsx("div", { className: "flex h-full flex-col p-6", children: _jsxs("p", { className: "text-destructive text-sm", children: ["Failed to load settings: ", error] }) }));
10
14
  }
11
- return (_jsx("div", { className: "flex h-full flex-col px-6 pb-6", children: _jsx(SettingsPageClient, { settings: settings, shepHome: shepHome ?? '', dbFileSize: dbFileSize ?? 'Unknown' }) }));
15
+ return (_jsx("div", { className: "flex h-full flex-col px-6 pb-6", children: _jsx(SettingsPageClient, { settings: settings, shepHome: shepHome ?? '', dbFileSize: dbFileSize ?? 'Unknown', availableTerminals: availableTerminals }) }));
12
16
  }
@@ -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,2CA2pCzB"}
@@ -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);
@@ -139,6 +149,9 @@ export function SettingsPageClient({ settings, shepHome, dbFileSize }) {
139
149
  ? String(Math.round(settings.workflow.ciWatchTimeoutMs / 1000))
140
150
  : '');
141
151
  const [ciLogMax, setCiLogMax] = useState(settings.workflow.ciLogMaxChars != null ? String(settings.workflow.ciLogMaxChars) : '');
152
+ const [ciPollInterval, setCiPollInterval] = useState(settings.workflow.ciWatchPollIntervalSeconds != null
153
+ ? String(settings.workflow.ciWatchPollIntervalSeconds)
154
+ : '');
142
155
  // Feature agent per-stage timeout states (stored in seconds for display, converted to ms on save)
143
156
  // Defaults: feature agent stages = 1_800_000 ms (1800s), analyze-repo = 600_000 ms (600s)
144
157
  const stageTimeoutsConfig = settings.workflow.stageTimeouts;
@@ -164,6 +177,9 @@ export function SettingsPageClient({ settings, shepHome, dbFileSize }) {
164
177
  ? String(Math.round(settings.workflow.ciWatchTimeoutMs / 1000))
165
178
  : '';
166
179
  const originalCiLogMax = settings.workflow.ciLogMaxChars != null ? String(settings.workflow.ciLogMaxChars) : '';
180
+ const originalCiPollInterval = settings.workflow.ciWatchPollIntervalSeconds != null
181
+ ? String(settings.workflow.ciWatchPollIntervalSeconds)
182
+ : '';
167
183
  const originalAnalyzeTimeout = stageTimeoutsConfig?.analyzeMs != null
168
184
  ? String(Math.round(stageTimeoutsConfig.analyzeMs / 1000))
169
185
  : '';
@@ -223,6 +239,7 @@ export function SettingsPageClient({ settings, shepHome, dbFileSize }) {
223
239
  ciMaxFixAttempts: parseOptionalInt(overrides.ciMaxFix ?? ciMaxFix),
224
240
  ciWatchTimeoutMs: timeoutSeconds != null ? timeoutSeconds * 1000 : undefined,
225
241
  ciLogMaxChars: parseOptionalInt(overrides.ciLogMax ?? ciLogMax),
242
+ ciWatchPollIntervalSeconds: parseOptionalInt(overrides.ciPollInterval ?? ciPollInterval),
226
243
  stageTimeouts: {
227
244
  analyzeMs: secondsToMs(overrides.analyzeTimeout ?? analyzeTimeout),
228
245
  requirementsMs: secondsToMs(overrides.requirementsTimeout ?? requirementsTimeout),
@@ -299,20 +316,42 @@ export function SettingsPageClient({ settings, shepHome, dbFileSize }) {
299
316
  label: 'Configuration guide',
300
317
  href: 'https://github.com/shep-ai/cli/blob/main/docs/guides/configuration.md',
301
318
  },
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: [
319
+ ], 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) => {
320
+ setEditor(v);
321
+ save({
322
+ environment: {
323
+ defaultEditor: v,
324
+ shellPreference: shell,
325
+ terminalPreference: terminal,
326
+ },
327
+ });
328
+ }, 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) => {
329
+ const Icon = getEditorTypeIcon(opt.value);
330
+ 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));
331
+ }) })] }) }), _jsx(SettingsRow, { label: "Shell", description: "Default shell for generated scripts", htmlFor: "shell-preference", children: _jsxs(Select, { value: shell, onValueChange: (v) => {
332
+ setShell(v);
333
+ save({
334
+ environment: {
335
+ defaultEditor: editor,
336
+ shellPreference: v,
337
+ terminalPreference: terminal,
338
+ },
339
+ });
340
+ }, 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) => {
341
+ setTerminal(v);
342
+ save({
343
+ environment: {
344
+ defaultEditor: editor,
345
+ shellPreference: shell,
346
+ terminalPreference: v,
347
+ },
348
+ });
349
+ }, 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
350
  {
312
351
  label: 'Configuration guide',
313
352
  href: 'https://github.com/shep-ai/cli/blob/main/docs/guides/configuration.md',
314
353
  },
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) => {
354
+ ], 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
355
  setAllowPrd(v);
317
356
  save(buildWorkflowPayload({ allowPrd: v }));
318
357
  } }), _jsx(SwitchRow, { label: "Auto-approve Plan", description: "Skip manual review of implementation plan", id: "allow-plan", testId: "switch-allow-plan", checked: allowPlan, onChange: (v) => {
@@ -363,7 +402,10 @@ export function SettingsPageClient({ settings, shepHome, dbFileSize }) {
363
402
  }, 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
403
  if (ciLogMax !== originalCiLogMax)
365
404
  save(buildWorkflowPayload({ ciLogMax }));
366
- }, min: 1000, step: 5000, suffix: "chars" }) })] }), _jsx(SectionHint, { links: [
405
+ }, 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: () => {
406
+ if (ciPollInterval !== originalCiPollInterval)
407
+ save(buildWorkflowPayload({ ciPollInterval }));
408
+ }, min: 5, step: 5, suffix: "sec" }) })] }), _jsx(SectionHint, { links: [
367
409
  {
368
410
  label: 'CI/CD pipeline',
369
411
  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,2CAqcjF"}