@shipit-ai/cli 1.168.0 → 1.169.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (232) hide show
  1. package/dist/src/presentation/web/components/features/settings/agent-settings-section.d.ts +3 -3
  2. package/dist/src/presentation/web/components/features/settings/agent-settings-section.d.ts.map +1 -1
  3. package/dist/src/presentation/web/components/features/settings/agent-settings-section.js +23 -102
  4. package/dist/src/presentation/web/components/features/settings/agent-settings-section.stories.d.ts +2 -3
  5. package/dist/src/presentation/web/components/features/settings/agent-settings-section.stories.d.ts.map +1 -1
  6. package/dist/src/presentation/web/components/features/settings/agent-settings-section.stories.js +18 -22
  7. package/dist/src/presentation/web/components/features/settings/ci-settings-section.d.ts.map +1 -1
  8. package/dist/src/presentation/web/components/features/settings/ci-settings-section.js +14 -5
  9. package/dist/src/presentation/web/components/features/settings/database-settings-section.d.ts.map +1 -1
  10. package/dist/src/presentation/web/components/features/settings/database-settings-section.js +14 -4
  11. package/dist/src/presentation/web/components/features/settings/environment-settings-section.d.ts +9 -3
  12. package/dist/src/presentation/web/components/features/settings/environment-settings-section.d.ts.map +1 -1
  13. package/dist/src/presentation/web/components/features/settings/environment-settings-section.js +75 -65
  14. package/dist/src/presentation/web/components/features/settings/environment-settings-section.stories.d.ts.map +1 -1
  15. package/dist/src/presentation/web/components/features/settings/environment-settings-section.stories.js +20 -18
  16. package/dist/src/presentation/web/components/features/settings/fab-layout-settings-section.d.ts.map +1 -1
  17. package/dist/src/presentation/web/components/features/settings/fab-layout-settings-section.js +1 -1
  18. package/dist/src/presentation/web/components/features/settings/feature-flags-settings-section.d.ts +3 -3
  19. package/dist/src/presentation/web/components/features/settings/feature-flags-settings-section.d.ts.map +1 -1
  20. package/dist/src/presentation/web/components/features/settings/feature-flags-settings-section.js +48 -50
  21. package/dist/src/presentation/web/components/features/settings/feature-flags-settings-section.stories.d.ts.map +1 -1
  22. package/dist/src/presentation/web/components/features/settings/feature-flags-settings-section.stories.js +25 -25
  23. package/dist/src/presentation/web/components/features/settings/interactive-agent-settings-section.d.ts.map +1 -1
  24. package/dist/src/presentation/web/components/features/settings/interactive-agent-settings-section.js +3 -3
  25. package/dist/src/presentation/web/components/features/settings/notification-settings-section.d.ts +3 -3
  26. package/dist/src/presentation/web/components/features/settings/notification-settings-section.d.ts.map +1 -1
  27. package/dist/src/presentation/web/components/features/settings/notification-settings-section.js +64 -47
  28. package/dist/src/presentation/web/components/features/settings/notification-settings-section.stories.d.ts.map +1 -1
  29. package/dist/src/presentation/web/components/features/settings/notification-settings-section.stories.js +32 -24
  30. package/dist/src/presentation/web/components/features/settings/settings-page-client.d.ts.map +1 -1
  31. package/dist/src/presentation/web/components/features/settings/settings-page-client.js +27 -378
  32. package/dist/src/presentation/web/components/features/settings/settings-page-client.stories.d.ts +2 -0
  33. package/dist/src/presentation/web/components/features/settings/settings-page-client.stories.d.ts.map +1 -1
  34. package/dist/src/presentation/web/components/features/settings/settings-page-client.stories.js +13 -0
  35. package/dist/src/presentation/web/components/features/settings/settings-section-utils.d.ts +8 -8
  36. package/dist/src/presentation/web/components/features/settings/settings-section-utils.d.ts.map +1 -1
  37. package/dist/src/presentation/web/components/features/settings/settings-section-utils.js +3 -6
  38. package/dist/src/presentation/web/components/features/settings/settings-section-utils.stories.d.ts +1 -1
  39. package/dist/src/presentation/web/components/features/settings/settings-section-utils.stories.d.ts.map +1 -1
  40. package/dist/src/presentation/web/components/features/settings/settings-section-utils.stories.js +7 -7
  41. package/dist/src/presentation/web/components/features/settings/stage-timeouts-settings-section.d.ts.map +1 -1
  42. package/dist/src/presentation/web/components/features/settings/stage-timeouts-settings-section.js +1 -1
  43. package/dist/src/presentation/web/components/features/settings/workflow-settings-section.d.ts +3 -3
  44. package/dist/src/presentation/web/components/features/settings/workflow-settings-section.d.ts.map +1 -1
  45. package/dist/src/presentation/web/components/features/settings/workflow-settings-section.js +118 -165
  46. package/dist/src/presentation/web/components/features/settings/workflow-settings-section.stories.d.ts +1 -1
  47. package/dist/src/presentation/web/components/features/settings/workflow-settings-section.stories.d.ts.map +1 -1
  48. package/dist/src/presentation/web/components/features/settings/workflow-settings-section.stories.js +26 -64
  49. package/dist/src/presentation/web/components/ui/tooltip.d.ts.map +1 -1
  50. package/dist/src/presentation/web/components/ui/tooltip.js +3 -3
  51. package/dist/translations/ar/web.json +1 -0
  52. package/dist/translations/de/web.json +1 -0
  53. package/dist/translations/en/web.json +1 -0
  54. package/dist/translations/es/web.json +1 -0
  55. package/dist/translations/fr/web.json +1 -0
  56. package/dist/translations/he/web.json +1 -0
  57. package/dist/translations/pt/web.json +1 -0
  58. package/dist/translations/ru/web.json +1 -0
  59. package/dist/tsconfig.build.tsbuildinfo +1 -1
  60. package/package.json +1 -1
  61. package/web/.next/BUILD_ID +1 -1
  62. package/web/.next/build-manifest.json +3 -3
  63. package/web/.next/fallback-build-manifest.json +3 -3
  64. package/web/.next/prerender-manifest.json +3 -3
  65. package/web/.next/required-server-files.js +2 -2
  66. package/web/.next/required-server-files.json +2 -2
  67. package/web/.next/server/app/(dashboard)/@drawer/adopt/page/server-reference-manifest.json +29 -29
  68. package/web/.next/server/app/(dashboard)/@drawer/adopt/page.js.nft.json +1 -1
  69. package/web/.next/server/app/(dashboard)/@drawer/adopt/page_client-reference-manifest.js +1 -1
  70. package/web/.next/server/app/(dashboard)/@drawer/chat/page/server-reference-manifest.json +27 -27
  71. package/web/.next/server/app/(dashboard)/@drawer/chat/page.js.nft.json +1 -1
  72. package/web/.next/server/app/(dashboard)/@drawer/chat/page_client-reference-manifest.js +1 -1
  73. package/web/.next/server/app/(dashboard)/@drawer/create/page/server-reference-manifest.json +31 -31
  74. package/web/.next/server/app/(dashboard)/@drawer/create/page.js.nft.json +1 -1
  75. package/web/.next/server/app/(dashboard)/@drawer/create/page_client-reference-manifest.js +1 -1
  76. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page/server-reference-manifest.json +37 -37
  77. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page.js.nft.json +1 -1
  78. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page_client-reference-manifest.js +1 -1
  79. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page/server-reference-manifest.json +37 -37
  80. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js.nft.json +1 -1
  81. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page_client-reference-manifest.js +1 -1
  82. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/[tab]/page/server-reference-manifest.json +28 -28
  83. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/[tab]/page.js.nft.json +1 -1
  84. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/[tab]/page_client-reference-manifest.js +1 -1
  85. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page/server-reference-manifest.json +28 -28
  86. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js.nft.json +1 -1
  87. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  88. package/web/.next/server/app/(dashboard)/chat/page/server-reference-manifest.json +27 -27
  89. package/web/.next/server/app/(dashboard)/chat/page.js.nft.json +1 -1
  90. package/web/.next/server/app/(dashboard)/chat/page_client-reference-manifest.js +1 -1
  91. package/web/.next/server/app/(dashboard)/create/page/server-reference-manifest.json +31 -31
  92. package/web/.next/server/app/(dashboard)/create/page.js.nft.json +1 -1
  93. package/web/.next/server/app/(dashboard)/create/page_client-reference-manifest.js +1 -1
  94. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page/server-reference-manifest.json +37 -37
  95. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page.js.nft.json +1 -1
  96. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page_client-reference-manifest.js +1 -1
  97. package/web/.next/server/app/(dashboard)/feature/[featureId]/page/server-reference-manifest.json +37 -37
  98. package/web/.next/server/app/(dashboard)/feature/[featureId]/page.js.nft.json +1 -1
  99. package/web/.next/server/app/(dashboard)/feature/[featureId]/page_client-reference-manifest.js +1 -1
  100. package/web/.next/server/app/(dashboard)/page/server-reference-manifest.json +27 -27
  101. package/web/.next/server/app/(dashboard)/page.js.nft.json +1 -1
  102. package/web/.next/server/app/(dashboard)/page_client-reference-manifest.js +1 -1
  103. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/[tab]/page/server-reference-manifest.json +28 -28
  104. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/[tab]/page.js.nft.json +1 -1
  105. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/[tab]/page_client-reference-manifest.js +1 -1
  106. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page/server-reference-manifest.json +28 -28
  107. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js.nft.json +1 -1
  108. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  109. package/web/.next/server/app/_global-error.html +1 -1
  110. package/web/.next/server/app/_global-error.rsc +1 -1
  111. package/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  112. package/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  113. package/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  114. package/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  115. package/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  116. package/web/.next/server/app/_not-found/page/server-reference-manifest.json +6 -6
  117. package/web/.next/server/app/_not-found/page.js.nft.json +1 -1
  118. package/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  119. package/web/.next/server/app/settings/page/server-reference-manifest.json +11 -11
  120. package/web/.next/server/app/settings/page.js.nft.json +1 -1
  121. package/web/.next/server/app/settings/page_client-reference-manifest.js +1 -1
  122. package/web/.next/server/app/skills/page/server-reference-manifest.json +11 -11
  123. package/web/.next/server/app/skills/page.js.nft.json +1 -1
  124. package/web/.next/server/app/skills/page_client-reference-manifest.js +1 -1
  125. package/web/.next/server/app/tools/page/server-reference-manifest.json +11 -11
  126. package/web/.next/server/app/tools/page.js.nft.json +1 -1
  127. package/web/.next/server/app/tools/page_client-reference-manifest.js +1 -1
  128. package/web/.next/server/app/version/page/server-reference-manifest.json +6 -6
  129. package/web/.next/server/app/version/page.js.nft.json +1 -1
  130. package/web/.next/server/app/version/page_client-reference-manifest.js +1 -1
  131. package/web/.next/server/chunks/[root-of-the-server]__0tb~wwk._.js +1 -1
  132. package/web/.next/server/chunks/ssr/0j.8_web_components_common_control-center-drawer_create-drawer-client_tsx_0g70fc5._.js +1 -1
  133. package/web/.next/server/chunks/ssr/0j.8_web_components_common_control-center-drawer_create-drawer-client_tsx_0g70fc5._.js.map +1 -1
  134. package/web/.next/server/chunks/ssr/0j.8_web_components_common_control-center-drawer_feature-drawer-client_tsx_104cna.._.js +2 -2
  135. package/web/.next/server/chunks/ssr/0j.8_web_components_common_control-center-drawer_feature-drawer-client_tsx_104cna.._.js.map +1 -1
  136. package/web/.next/server/chunks/ssr/0ukq_presentation_web_components_features_settings_settings-page-client_tsx_0j1uius._.js +1 -1
  137. package/web/.next/server/chunks/ssr/0ukq_presentation_web_components_features_settings_settings-page-client_tsx_0j1uius._.js.map +1 -1
  138. package/web/.next/server/chunks/ssr/11y9_components_common_control-center-drawer_repository-drawer-client_tsx_09z.znp._.js +1 -1
  139. package/web/.next/server/chunks/ssr/11y9_components_common_control-center-drawer_repository-drawer-client_tsx_09z.znp._.js.map +1 -1
  140. package/web/.next/server/chunks/ssr/[root-of-the-server]__05_qc0n._.js +1 -1
  141. package/web/.next/server/chunks/ssr/[root-of-the-server]__05_qc0n._.js.map +1 -1
  142. package/web/.next/server/chunks/ssr/[root-of-the-server]__0ge~xny._.js +1 -1
  143. package/web/.next/server/chunks/ssr/[root-of-the-server]__0ge~xny._.js.map +1 -1
  144. package/web/.next/server/chunks/ssr/[root-of-the-server]__0qda~yi._.js +1 -1
  145. package/web/.next/server/chunks/ssr/[root-of-the-server]__0qda~yi._.js.map +1 -1
  146. package/web/.next/server/chunks/ssr/[root-of-the-server]__0qxd563._.js +1 -1
  147. package/web/.next/server/chunks/ssr/[root-of-the-server]__0qxd563._.js.map +1 -1
  148. package/web/.next/server/chunks/ssr/[root-of-the-server]__0rv1gci._.js +1 -1
  149. package/web/.next/server/chunks/ssr/[root-of-the-server]__0rvrr1j._.js +1 -1
  150. package/web/.next/server/chunks/ssr/[root-of-the-server]__0rvrr1j._.js.map +1 -1
  151. package/web/.next/server/chunks/ssr/[root-of-the-server]__0tq2syh._.js +1 -1
  152. package/web/.next/server/chunks/ssr/[root-of-the-server]__0t~u8sd._.js +1 -1
  153. package/web/.next/server/chunks/ssr/[root-of-the-server]__0t~u8sd._.js.map +1 -1
  154. package/web/.next/server/chunks/ssr/[root-of-the-server]__10tll_l._.js +1 -1
  155. package/web/.next/server/chunks/ssr/[root-of-the-server]__10tll_l._.js.map +1 -1
  156. package/web/.next/server/chunks/ssr/[root-of-the-server]__12j29w-._.js +1 -1
  157. package/web/.next/server/chunks/ssr/[root-of-the-server]__12j29w-._.js.map +1 -1
  158. package/web/.next/server/chunks/ssr/{_08_079y._.js → _01qdxy2._.js} +2 -2
  159. package/web/.next/server/chunks/ssr/{_08_079y._.js.map → _01qdxy2._.js.map} +1 -1
  160. package/web/.next/server/chunks/ssr/_01sesw0._.js +1 -1
  161. package/web/.next/server/chunks/ssr/_01sesw0._.js.map +1 -1
  162. package/web/.next/server/chunks/ssr/_069y.js._.js +2 -2
  163. package/web/.next/server/chunks/ssr/_069y.js._.js.map +1 -1
  164. package/web/.next/server/chunks/ssr/_0__4si~._.js +1 -1
  165. package/web/.next/server/chunks/ssr/_0__4si~._.js.map +1 -1
  166. package/web/.next/server/chunks/ssr/_0_m17kl._.js +1 -1
  167. package/web/.next/server/chunks/ssr/_0_m17kl._.js.map +1 -1
  168. package/web/.next/server/chunks/ssr/_0a_8rlj._.js +3 -0
  169. package/web/.next/server/chunks/ssr/{_0mi5qj~._.js.map → _0a_8rlj._.js.map} +1 -1
  170. package/web/.next/server/chunks/ssr/_0d4miu.._.js +1 -1
  171. package/web/.next/server/chunks/ssr/_0d4miu.._.js.map +1 -1
  172. package/web/.next/server/chunks/ssr/_0e8ern9._.js +1 -1
  173. package/web/.next/server/chunks/ssr/_0e8ern9._.js.map +1 -1
  174. package/web/.next/server/chunks/ssr/_0n.magx._.js +1 -1
  175. package/web/.next/server/chunks/ssr/_0n.magx._.js.map +1 -1
  176. package/web/.next/server/chunks/ssr/_0p3~u8u._.js +2 -2
  177. package/web/.next/server/chunks/ssr/_0p3~u8u._.js.map +1 -1
  178. package/web/.next/server/chunks/ssr/{_0txr945._.js → _0pa1dkv._.js} +2 -2
  179. package/web/.next/server/chunks/ssr/_0pa1dkv._.js.map +1 -0
  180. package/web/.next/server/chunks/ssr/_0r.3n~3._.js +1 -1
  181. package/web/.next/server/chunks/ssr/_0r.3n~3._.js.map +1 -1
  182. package/web/.next/server/chunks/ssr/_0t59q8r._.js +1 -1
  183. package/web/.next/server/chunks/ssr/_0t59q8r._.js.map +1 -1
  184. package/web/.next/server/chunks/ssr/_0vyfc4b._.js +1 -1
  185. package/web/.next/server/chunks/ssr/_0vyfc4b._.js.map +1 -1
  186. package/web/.next/server/chunks/ssr/_0w-_hww._.js +1 -1
  187. package/web/.next/server/chunks/ssr/_0w-_hww._.js.map +1 -1
  188. package/web/.next/server/chunks/ssr/{_0r04xhw._.js → _0wor25i._.js} +2 -2
  189. package/web/.next/server/chunks/ssr/{_0r04xhw._.js.map → _0wor25i._.js.map} +1 -1
  190. package/web/.next/server/chunks/ssr/_0zk-h5w._.js +1 -1
  191. package/web/.next/server/chunks/ssr/_0zk-h5w._.js.map +1 -1
  192. package/web/.next/server/chunks/ssr/_0~7lwu_._.js +1 -1
  193. package/web/.next/server/chunks/ssr/_0~7lwu_._.js.map +1 -1
  194. package/web/.next/server/chunks/ssr/_1161g9x._.js +1 -1
  195. package/web/.next/server/chunks/ssr/_1161g9x._.js.map +1 -1
  196. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_skills_page_actions_05m2q~u.js +1 -1
  197. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_skills_page_actions_05m2q~u.js.map +1 -1
  198. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_tools_page_actions_0.6zk.t.js +1 -1
  199. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_tools_page_actions_0.6zk.t.js.map +1 -1
  200. package/web/.next/server/chunks/ssr/src_presentation_web_app_actions_approve-feature_ts_0pjb_re._.js +1 -1
  201. package/web/.next/server/chunks/ssr/src_presentation_web_app_actions_open-ide_ts_0w2wqvu._.js +1 -1
  202. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_0l3oxx9._.js +1 -1
  203. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_0l3oxx9._.js.map +1 -1
  204. package/web/.next/server/middleware-build-manifest.js +3 -3
  205. package/web/.next/server/pages/500.html +1 -1
  206. package/web/.next/server/server-reference-manifest.js +1 -1
  207. package/web/.next/server/server-reference-manifest.json +50 -50
  208. package/web/.next/static/chunks/{01znjuvi5t9~q.js → 00m_fbc2z1gyi.js} +3 -3
  209. package/web/.next/static/chunks/{0ygtupas8pxdi.js → 09f2lesd_dd3~.js} +1 -1
  210. package/web/.next/static/chunks/0c0dau5pmseko.js +1 -0
  211. package/web/.next/static/chunks/{078lp287u~c~b.js → 0dq50gtgaj63f.js} +1 -1
  212. package/web/.next/static/chunks/{06nsv-_ec9ehn.js → 0k0j7anrbg-of.js} +1 -1
  213. package/web/.next/static/chunks/{17c31c1biwfyi.js → 0o33urrd3lk~u.js} +1 -1
  214. package/web/.next/static/chunks/0u_27fdqa2jeg.js +1 -0
  215. package/web/.next/static/chunks/0xwh.0u-dexsl.js +1 -0
  216. package/web/.next/static/chunks/0yibymrb2j05t.css +1 -0
  217. package/web/.next/static/chunks/103xnw203o9k1.js +1 -0
  218. package/web/.next/static/chunks/{0cv09-g0prv4o.js → 11vbir.u7_zf7.js} +1 -1
  219. package/web/.next/static/chunks/{133q8d69p6cl0.js → 121v1_d_dfk2k.js} +1 -1
  220. package/web/.next/static/chunks/{0_xww9bsde~1x.js → 12axopx66pocj.js} +1 -1
  221. package/web/.next/static/chunks/{0hg8qgtv~kuys.js → 183ehj-b80a~o.js} +1 -1
  222. package/web/.next/static/chunks/{0_v4t6gzx.332.js → 1874_wt9rit96.js} +1 -1
  223. package/web/.next/server/chunks/ssr/_0mi5qj~._.js +0 -3
  224. package/web/.next/server/chunks/ssr/_0txr945._.js.map +0 -1
  225. package/web/.next/static/chunks/033sl_l5o3uo8.css +0 -1
  226. package/web/.next/static/chunks/04r9m_5p953mf.js +0 -1
  227. package/web/.next/static/chunks/07i3-aamszsoh.js +0 -1
  228. package/web/.next/static/chunks/0ee1d3_y40g9f.js +0 -1
  229. package/web/.next/static/chunks/15mks7_3venc1.js +0 -1
  230. /package/web/.next/static/{LQMB6QAutWzPQnLUZG96y → SNdaKJ9fpre8tUMRe1jlA}/_buildManifest.js +0 -0
  231. /package/web/.next/static/{LQMB6QAutWzPQnLUZG96y → SNdaKJ9fpre8tUMRe1jlA}/_clientMiddlewareManifest.js +0 -0
  232. /package/web/.next/static/{LQMB6QAutWzPQnLUZG96y → SNdaKJ9fpre8tUMRe1jlA}/_ssgManifest.js +0 -0
@@ -1,6 +1,6 @@
1
- import type { FeatureFlags } from '../../../../../../packages/core/src/domain/generated/output.js';
1
+ import type { Settings } from '../../../../../../packages/core/src/domain/generated/output.js';
2
2
  export interface FeatureFlagsSettingsSectionProps {
3
- featureFlags: FeatureFlags;
3
+ settings: Settings;
4
4
  }
5
- export declare function FeatureFlagsSettingsSection({ featureFlags }: FeatureFlagsSettingsSectionProps): import("react/jsx-runtime").JSX.Element;
5
+ export declare function FeatureFlagsSettingsSection({ settings }: FeatureFlagsSettingsSectionProps): import("react/jsx-runtime").JSX.Element;
6
6
  //# sourceMappingURL=feature-flags-settings-section.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"feature-flags-settings-section.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/features/settings/feature-flags-settings-section.tsx"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,yCAAyC,CAAC;AAiC5E,MAAM,WAAW,gCAAgC;IAC/C,YAAY,EAAE,YAAY,CAAC;CAC5B;AAED,wBAAgB,2BAA2B,CAAC,EAAE,YAAY,EAAE,EAAE,gCAAgC,2CAgE7F"}
1
+ {"version":3,"file":"feature-flags-settings-section.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/features/settings/feature-flags-settings-section.tsx"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,QAAQ,EAAgB,MAAM,yCAAyC,CAAC;AAGtF,MAAM,WAAW,gCAAgC;IAC/C,QAAQ,EAAE,QAAQ,CAAC;CACpB;AAED,wBAAgB,2BAA2B,CAAC,EAAE,QAAQ,EAAE,EAAE,gCAAgC,2CA+HzF"}
@@ -1,61 +1,59 @@
1
1
  'use client';
2
2
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
- import { useState, useTransition, useRef, useEffect } from 'react';
4
- import { Flag, Check } from 'lucide-react';
3
+ import { useState, useTransition } from 'react';
4
+ import { Flag } from 'lucide-react';
5
5
  import { toast } from 'sonner';
6
- import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '../../ui/card.js';
7
- import { Label } from '../../ui/label.js';
8
- import { Switch } from '../../ui/switch.js';
6
+ import { useTranslation } from 'react-i18next';
9
7
  import { updateSettingsAction } from '../../../app/actions/update-settings.js';
10
- const FLAG_DESCRIPTIONS = {
11
- skills: 'Enable Skills navigation and functionality in the web UI',
12
- envDeploy: 'Enable environment deployment features in the web UI',
13
- debug: 'Enable debug UI elements and verbose client-side logging',
14
- githubImport: 'Enable GitHub repository import in the web UI',
15
- adoptBranch: 'Enable the ability to adopt existing branches as tracked features',
16
- gitRebaseSync: 'Enable git rebase-on-main and sync-main operations in the web UI',
17
- reactFileManager: 'Use the built-in React file manager instead of the native OS folder picker. Also serves as automatic fallback when the native picker is unavailable.',
18
- };
19
- const FLAG_LABELS = {
20
- skills: 'Skills',
21
- envDeploy: 'Deployments',
22
- debug: 'Debug',
23
- githubImport: 'GitHub Import',
24
- adoptBranch: 'Adopt Branch',
25
- gitRebaseSync: 'Git Rebase & Sync',
26
- reactFileManager: 'React File Manager',
27
- };
28
- const FLAG_KEYS = [
29
- 'skills',
30
- 'envDeploy',
31
- 'debug',
32
- 'githubImport',
33
- 'adoptBranch',
34
- 'gitRebaseSync',
35
- 'reactFileManager',
36
- ];
37
- export function FeatureFlagsSettingsSection({ featureFlags }) {
8
+ import { SettingsSection, SwitchRow } from './settings-section-utils.js';
9
+ export function FeatureFlagsSettingsSection({ settings }) {
10
+ const { t } = useTranslation('web');
11
+ const [, startTransition] = useTransition();
12
+ const featureFlags = settings.featureFlags ?? {
13
+ skills: false,
14
+ envDeploy: false,
15
+ debug: false,
16
+ githubImport: false,
17
+ adoptBranch: false,
18
+ gitRebaseSync: false,
19
+ reactFileManager: false,
20
+ };
38
21
  const [flags, setFlags] = useState({ ...featureFlags });
39
- const [isPending, startTransition] = useTransition();
40
- const [showSaved, setShowSaved] = useState(false);
41
- const prevPendingRef = useRef(false);
42
- useEffect(() => {
43
- if (prevPendingRef.current && !isPending) {
44
- setShowSaved(true);
45
- const timer = setTimeout(() => setShowSaved(false), 2000);
46
- return () => clearTimeout(timer);
47
- }
48
- prevPendingRef.current = isPending;
49
- }, [isPending]);
50
- function handleFlagChange(key, value) {
51
- const newFlags = { ...flags, [key]: value };
52
- setFlags(newFlags);
22
+ function save(payload) {
53
23
  startTransition(async () => {
54
- const result = await updateSettingsAction({ featureFlags: newFlags });
24
+ const result = await updateSettingsAction(payload);
55
25
  if (!result.success) {
56
- toast.error(result.error ?? 'Failed to save feature flags');
26
+ toast.error(result.error ?? t('settings.failedToSave'));
57
27
  }
58
28
  });
59
29
  }
60
- return (_jsxs(Card, { id: "feature-flags", className: "scroll-mt-6", "data-testid": "feature-flags-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(Flag, { className: "text-muted-foreground h-4 w-4" }), _jsx(CardTitle, { children: "Feature Flags" })] }), 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: "Toggle experimental and optional features. Changes take effect after page navigation." })] }), _jsx(CardContent, { className: "space-y-4", children: FLAG_KEYS.map((key) => (_jsxs("div", { className: "flex items-center justify-between gap-4", children: [_jsxs("div", { className: "space-y-0.5", children: [_jsx(Label, { htmlFor: `flag-${key}`, children: FLAG_LABELS[key] }), _jsx("p", { className: "text-muted-foreground text-xs", children: FLAG_DESCRIPTIONS[key] })] }), _jsx(Switch, { id: `flag-${key}`, "data-testid": `switch-flag-${key}`, checked: flags[key], onCheckedChange: (v) => handleFlagChange(key, v) })] }, key))) })] }));
30
+ return (_jsxs(SettingsSection, { icon: Flag, title: t('settings.featureFlags.title'), description: t('settings.featureFlags.sectionDescription'), badge: t('settings.featureFlags.badge'), testId: "feature-flags-settings-section", tooltip: t('settings.featureFlags.hint'), children: [_jsx(SwitchRow, { label: t('settings.featureFlags.skills'), description: t('settings.featureFlags.skillsDescription'), tooltip: "Enables the Skills page in the sidebar for browsing and managing Claude Code skills.", id: "flag-skills", testId: "switch-flag-skills", checked: flags.skills, onChange: (v) => {
31
+ const newFlags = { ...flags, skills: v };
32
+ setFlags(newFlags);
33
+ save({ featureFlags: newFlags });
34
+ } }), _jsx(SwitchRow, { label: t('settings.featureFlags.deployments'), description: t('settings.featureFlags.deploymentsDescription'), tooltip: "Enables experimental deployment features for environment management.", id: "flag-envDeploy", testId: "switch-flag-envDeploy", checked: flags.envDeploy, onChange: (v) => {
35
+ const newFlags = { ...flags, envDeploy: v };
36
+ setFlags(newFlags);
37
+ save({ featureFlags: newFlags });
38
+ } }), _jsx(SwitchRow, { label: t('settings.featureFlags.debug'), description: t('settings.featureFlags.debugDescription'), tooltip: "Shows additional debugging information in the UI for troubleshooting.", id: "flag-debug", testId: "switch-flag-debug", checked: flags.debug, onChange: (v) => {
39
+ const newFlags = { ...flags, debug: v };
40
+ setFlags(newFlags);
41
+ save({ featureFlags: newFlags });
42
+ } }), _jsx(SwitchRow, { label: t('settings.featureFlags.githubImport'), description: t('settings.featureFlags.githubImportDescription'), tooltip: "Enables importing repositories directly from GitHub.", id: "flag-githubImport", testId: "switch-flag-githubImport", checked: flags.githubImport, onChange: (v) => {
43
+ const newFlags = { ...flags, githubImport: v };
44
+ setFlags(newFlags);
45
+ save({ featureFlags: newFlags });
46
+ } }), _jsx(SwitchRow, { label: t('settings.featureFlags.adoptBranch'), description: t('settings.featureFlags.adoptBranchDescription'), tooltip: "Enables adopting existing git branches as ShipIT features.", id: "flag-adoptBranch", testId: "switch-flag-adoptBranch", checked: flags.adoptBranch, onChange: (v) => {
47
+ const newFlags = { ...flags, adoptBranch: v };
48
+ setFlags(newFlags);
49
+ save({ featureFlags: newFlags });
50
+ } }), _jsx(SwitchRow, { label: t('settings.featureFlags.gitRebaseSync'), description: t('settings.featureFlags.gitRebaseSyncDescription'), tooltip: "Uses git rebase instead of merge when syncing feature branches with the upstream branch.", id: "flag-gitRebaseSync", testId: "switch-flag-gitRebaseSync", checked: flags.gitRebaseSync, onChange: (v) => {
51
+ const newFlags = { ...flags, gitRebaseSync: v };
52
+ setFlags(newFlags);
53
+ save({ featureFlags: newFlags });
54
+ } }), _jsx(SwitchRow, { label: t('settings.featureFlags.reactFileManager'), description: t('settings.featureFlags.reactFileManagerDescription'), tooltip: "Replaces the native file picker dialog with a React-based file browser for selecting project folders.", id: "flag-reactFileManager", testId: "switch-flag-reactFileManager", checked: flags.reactFileManager, onChange: (v) => {
55
+ const newFlags = { ...flags, reactFileManager: v };
56
+ setFlags(newFlags);
57
+ save({ featureFlags: newFlags });
58
+ } })] }));
61
59
  }
@@ -1 +1 @@
1
- {"version":3,"file":"feature-flags-settings-section.stories.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/features/settings/feature-flags-settings-section.stories.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAQ,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,2BAA2B,EAAE,MAAM,kCAAkC,CAAC;AAE/E,QAAA,MAAM,IAAI;;;;;;;CAO0C,CAAC;AAErD,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,IAAI,CAAC,CAAC;AAEnC,eAAO,MAAM,OAAO,EAAE,KAYrB,CAAC;AAEF,eAAO,MAAM,UAAU,EAAE,KAYxB,CAAC;AAEF,eAAO,MAAM,WAAW,EAAE,KAYzB,CAAC"}
1
+ {"version":3,"file":"feature-flags-settings-section.stories.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/features/settings/feature-flags-settings-section.stories.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAQ,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,2BAA2B,EAAE,MAAM,kCAAkC,CAAC;AAK/E,QAAA,MAAM,IAAI;;;;;;;CAO0C,CAAC;AAErD,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,IAAI,CAAC,CAAC;AAEnC,eAAO,MAAM,OAAO,EAAE,KAIrB,CAAC;AAEF,eAAO,MAAM,UAAU,EAAE,KAexB,CAAC;AAEF,eAAO,MAAM,WAAW,EAAE,KAezB,CAAC"}
@@ -1,4 +1,6 @@
1
1
  import { FeatureFlagsSettingsSection } from './feature-flags-settings-section.js';
2
+ import { createDefaultSettings } from '../../../../../../packages/core/src/domain/factories/settings-defaults.factory.js';
3
+ const baseSettings = createDefaultSettings();
2
4
  const meta = {
3
5
  title: 'Features/Settings/FeatureFlagsSettingsSection',
4
6
  component: FeatureFlagsSettingsSection,
@@ -10,40 +12,38 @@ const meta = {
10
12
  export default meta;
11
13
  export const Default = {
12
14
  args: {
13
- featureFlags: {
14
- skills: false,
15
- envDeploy: false,
16
- debug: false,
17
- githubImport: false,
18
- adoptBranch: false,
19
- gitRebaseSync: false,
20
- reactFileManager: false,
21
- },
15
+ settings: baseSettings,
22
16
  },
23
17
  };
24
18
  export const AllEnabled = {
25
19
  args: {
26
- featureFlags: {
27
- skills: true,
28
- envDeploy: true,
29
- debug: true,
30
- githubImport: true,
31
- adoptBranch: true,
32
- gitRebaseSync: true,
33
- reactFileManager: true,
20
+ settings: {
21
+ ...baseSettings,
22
+ featureFlags: {
23
+ skills: true,
24
+ envDeploy: true,
25
+ debug: true,
26
+ githubImport: true,
27
+ adoptBranch: true,
28
+ gitRebaseSync: true,
29
+ reactFileManager: true,
30
+ },
34
31
  },
35
32
  },
36
33
  };
37
34
  export const AllDisabled = {
38
35
  args: {
39
- featureFlags: {
40
- skills: false,
41
- envDeploy: false,
42
- debug: false,
43
- githubImport: false,
44
- adoptBranch: false,
45
- gitRebaseSync: false,
46
- reactFileManager: false,
36
+ settings: {
37
+ ...baseSettings,
38
+ featureFlags: {
39
+ skills: false,
40
+ envDeploy: false,
41
+ debug: false,
42
+ githubImport: false,
43
+ adoptBranch: false,
44
+ gitRebaseSync: false,
45
+ reactFileManager: false,
46
+ },
47
47
  },
48
48
  },
49
49
  };
@@ -1 +1 @@
1
- {"version":3,"file":"interactive-agent-settings-section.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/features/settings/interactive-agent-settings-section.tsx"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,QAAQ,EAA0B,MAAM,yCAAyC,CAAC;AAGhG,MAAM,WAAW,oCAAoC;IACnD,QAAQ,EAAE,QAAQ,CAAC;CACpB;AAED,wBAAgB,+BAA+B,CAAC,EAC9C,QAAQ,GACT,EAAE,oCAAoC,2CA8GtC"}
1
+ {"version":3,"file":"interactive-agent-settings-section.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/features/settings/interactive-agent-settings-section.tsx"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,QAAQ,EAA0B,MAAM,yCAAyC,CAAC;AAGhG,MAAM,WAAW,oCAAoC;IACnD,QAAQ,EAAE,QAAQ,CAAC;CACpB;AAED,wBAAgB,+BAA+B,CAAC,EAC9C,QAAQ,GACT,EAAE,oCAAoC,2CAkHtC"}
@@ -25,7 +25,7 @@ export function InteractiveAgentSettingsSection({ settings, }) {
25
25
  }
26
26
  });
27
27
  }
28
- return (_jsxs(SettingsSection, { icon: MessageSquare, title: t('settings.interactiveAgent.title'), description: t('settings.interactiveAgent.description'), testId: "interactive-agent-settings-section", children: [_jsx(SwitchRow, { label: t('settings.interactiveAgent.enableChatTab'), description: t('settings.interactiveAgent.enableChatTabDescription'), id: "interactive-agent-enabled", testId: "switch-interactive-agent-enabled", checked: interactiveEnabled, onChange: (v) => {
28
+ return (_jsxs(SettingsSection, { icon: MessageSquare, title: t('settings.interactiveAgent.title'), description: t('settings.interactiveAgent.description'), testId: "interactive-agent-settings-section", tooltip: t('settings.interactiveAgent.hint'), children: [_jsx(SwitchRow, { label: t('settings.interactiveAgent.enableChatTab'), description: t('settings.interactiveAgent.enableChatTabDescription'), tooltip: "Shows or hides the Chat tab on feature detail pages. When enabled, you can have interactive conversations with the agent about a specific feature.", id: "interactive-agent-enabled", testId: "switch-interactive-agent-enabled", checked: interactiveEnabled, onChange: (v) => {
29
29
  setInteractiveEnabled(v);
30
30
  save({
31
31
  interactiveAgent: {
@@ -34,7 +34,7 @@ export function InteractiveAgentSettingsSection({ settings, }) {
34
34
  maxConcurrentSessions: parseInt(interactiveSessions, 10) || 3,
35
35
  },
36
36
  });
37
- } }), _jsx(SettingsRow, { label: t('settings.interactiveAgent.autoTimeout'), description: t('settings.interactiveAgent.autoTimeoutDescription'), htmlFor: "interactive-agent-timeout", children: _jsx(NumberStepper, { id: "interactive-agent-timeout", testId: "input-interactive-agent-timeout", value: interactiveTimeout, placeholder: "15", min: 1, max: 120, suffix: "min", onChange: setInteractiveTimeout, onBlur: () => {
37
+ } }), _jsx(SettingsRow, { label: t('settings.interactiveAgent.autoTimeout'), description: t('settings.interactiveAgent.autoTimeoutDescription'), tooltip: "Minutes of inactivity before a chat agent session is automatically terminated. Prevents idle agent processes from consuming resources indefinitely.", htmlFor: "interactive-agent-timeout", children: _jsx(NumberStepper, { id: "interactive-agent-timeout", testId: "input-interactive-agent-timeout", value: interactiveTimeout, placeholder: "15", min: 1, max: 120, suffix: "min", onChange: setInteractiveTimeout, onBlur: () => {
38
38
  const n = parseInt(interactiveTimeout, 10);
39
39
  const clamped = Number.isNaN(n) ? 15 : Math.min(120, Math.max(1, n));
40
40
  const clampedStr = String(clamped);
@@ -46,7 +46,7 @@ export function InteractiveAgentSettingsSection({ settings, }) {
46
46
  maxConcurrentSessions: parseInt(interactiveSessions, 10) || 3,
47
47
  },
48
48
  });
49
- } }) }), _jsx(SettingsRow, { label: t('settings.interactiveAgent.maxConcurrentSessions'), description: t('settings.interactiveAgent.maxConcurrentSessionsDescription'), htmlFor: "interactive-agent-sessions", children: _jsx(NumberStepper, { id: "interactive-agent-sessions", testId: "input-interactive-agent-sessions", value: interactiveSessions, placeholder: "3", min: 1, max: 10, onChange: setInteractiveSessions, onBlur: () => {
49
+ } }) }), _jsx(SettingsRow, { label: t('settings.interactiveAgent.maxConcurrentSessions'), description: t('settings.interactiveAgent.maxConcurrentSessionsDescription'), tooltip: "Maximum number of interactive agent sessions that can run simultaneously. Each session spawns a separate agent process, so higher values use more CPU and memory.", htmlFor: "interactive-agent-sessions", children: _jsx(NumberStepper, { id: "interactive-agent-sessions", testId: "input-interactive-agent-sessions", value: interactiveSessions, placeholder: "3", min: 1, max: 10, onChange: setInteractiveSessions, onBlur: () => {
50
50
  const n = parseInt(interactiveSessions, 10);
51
51
  const clamped = Number.isNaN(n) ? 3 : Math.min(10, Math.max(1, n));
52
52
  const clampedStr = String(clamped);
@@ -1,6 +1,6 @@
1
- import type { NotificationPreferences } from '../../../../../../packages/core/src/domain/generated/output.js';
1
+ import type { Settings } from '../../../../../../packages/core/src/domain/generated/output.js';
2
2
  export interface NotificationSettingsSectionProps {
3
- notifications: NotificationPreferences;
3
+ settings: Settings;
4
4
  }
5
- export declare function NotificationSettingsSection({ notifications }: NotificationSettingsSectionProps): import("react/jsx-runtime").JSX.Element;
5
+ export declare function NotificationSettingsSection({ settings }: NotificationSettingsSectionProps): import("react/jsx-runtime").JSX.Element;
6
6
  //# sourceMappingURL=notification-settings-section.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"notification-settings-section.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/features/settings/notification-settings-section.tsx"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,yCAAyC,CAAC;AAmBvF,MAAM,WAAW,gCAAgC;IAC/C,aAAa,EAAE,uBAAuB,CAAC;CACxC;AAED,wBAAgB,2BAA2B,CAAC,EAAE,aAAa,EAAE,EAAE,gCAAgC,2CAsH9F"}
1
+ {"version":3,"file":"notification-settings-section.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/features/settings/notification-settings-section.tsx"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,QAAQ,EAA2B,MAAM,yCAAyC,CAAC;AAGjG,MAAM,WAAW,gCAAgC;IAC/C,QAAQ,EAAE,QAAQ,CAAC;CACpB;AAED,wBAAgB,2BAA2B,CAAC,EAAE,QAAQ,EAAE,EAAE,gCAAgC,2CAmMzF"}
@@ -1,51 +1,25 @@
1
1
  'use client';
2
2
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
- import { useState, useTransition, useRef, useEffect } from 'react';
4
- import { Bell, Check } from 'lucide-react';
3
+ import { useState, useTransition } from 'react';
4
+ import { Bell } from 'lucide-react';
5
5
  import { toast } from 'sonner';
6
- import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '../../ui/card.js';
7
- import { Label } from '../../ui/label.js';
8
- import { Switch } from '../../ui/switch.js';
9
- import { Separator } from '../../ui/separator.js';
6
+ import { useTranslation } from 'react-i18next';
10
7
  import { updateSettingsAction } from '../../../app/actions/update-settings.js';
11
- const AGENT_EVENT_TOGGLES = [
12
- { key: 'agentStarted', label: 'Agent Started' },
13
- { key: 'phaseCompleted', label: 'Phase Completed' },
14
- { key: 'waitingApproval', label: 'Waiting Approval' },
15
- { key: 'agentCompleted', label: 'Agent Completed' },
16
- { key: 'agentFailed', label: 'Agent Failed' },
17
- ];
18
- const PR_EVENT_TOGGLES = [
19
- { key: 'mergeReviewReady', label: 'Merge Review Ready' },
20
- { key: 'prMerged', label: 'PR Merged' },
21
- { key: 'prClosed', label: 'PR Closed' },
22
- { key: 'prChecksPassed', label: 'PR Checks Passed' },
23
- { key: 'prChecksFailed', label: 'PR Checks Failed' },
24
- { key: 'prBlocked', label: 'PR Blocked' },
25
- ];
26
- export function NotificationSettingsSection({ notifications }) {
27
- const [inApp, setInApp] = useState(notifications.inApp.enabled);
28
- const [events, setEvents] = useState({ ...notifications.events });
29
- const [isPending, startTransition] = useTransition();
30
- const [showSaved, setShowSaved] = useState(false);
31
- const prevPendingRef = useRef(false);
32
- useEffect(() => {
33
- if (prevPendingRef.current && !isPending) {
34
- setShowSaved(true);
35
- const timer = setTimeout(() => setShowSaved(false), 2000);
36
- return () => clearTimeout(timer);
37
- }
38
- prevPendingRef.current = isPending;
39
- }, [isPending]);
8
+ import { SettingsSection, SwitchRow, SubsectionLabel } from './settings-section-utils.js';
9
+ export function NotificationSettingsSection({ settings }) {
10
+ const { t } = useTranslation('web');
11
+ const [, startTransition] = useTransition();
12
+ const [inApp, setInApp] = useState(settings.notifications.inApp.enabled);
13
+ const [events, setEvents] = useState({ ...settings.notifications.events });
40
14
  function save(payload) {
41
15
  startTransition(async () => {
42
16
  const result = await updateSettingsAction(payload);
43
17
  if (!result.success) {
44
- toast.error(result.error ?? 'Failed to save notification settings');
18
+ toast.error(result.error ?? t('settings.failedToSave'));
45
19
  }
46
20
  });
47
21
  }
48
- function buildFullPayload(overrides = {}) {
22
+ function buildNotificationPayload(overrides = {}) {
49
23
  return {
50
24
  notifications: {
51
25
  inApp: { enabled: overrides.inApp ?? inApp },
@@ -53,14 +27,57 @@ export function NotificationSettingsSection({ notifications }) {
53
27
  },
54
28
  };
55
29
  }
56
- function handleInAppChange(value) {
57
- setInApp(value);
58
- save(buildFullPayload({ inApp: value }));
59
- }
60
- function handleEventChange(key, value) {
61
- const newEvents = { ...events, [key]: value };
62
- setEvents(newEvents);
63
- save(buildFullPayload({ events: newEvents }));
64
- }
65
- return (_jsxs(Card, { id: "notifications", className: "scroll-mt-6", "data-testid": "notification-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(Bell, { className: "text-muted-foreground h-4 w-4" }), _jsx(CardTitle, { children: "Notifications" })] }), 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 notification channels and event preferences" })] }), _jsxs(CardContent, { className: "space-y-4", children: [_jsxs("div", { className: "space-y-3", children: [_jsx("h3", { className: "text-sm font-semibold", children: "Channels" }), _jsxs("div", { className: "flex items-center justify-between", children: [_jsx(Label, { htmlFor: "notif-in-app", children: "In-App" }), _jsx(Switch, { id: "notif-in-app", "data-testid": "switch-in-app", checked: inApp, onCheckedChange: handleInAppChange })] })] }), _jsx(Separator, {}), _jsxs("div", { className: "space-y-3", children: [_jsx("h3", { className: "text-sm font-semibold", children: "Agent Events" }), AGENT_EVENT_TOGGLES.map(({ key, label }) => (_jsxs("div", { className: "flex items-center justify-between", children: [_jsx(Label, { htmlFor: `notif-event-${key}`, children: label }), _jsx(Switch, { id: `notif-event-${key}`, "data-testid": `switch-event-${key}`, checked: events[key], onCheckedChange: (v) => handleEventChange(key, v) })] }, key)))] }), _jsx(Separator, {}), _jsxs("div", { className: "space-y-3", children: [_jsx("h3", { className: "text-sm font-semibold", children: "PR Events" }), PR_EVENT_TOGGLES.map(({ key, label }) => (_jsxs("div", { className: "flex items-center justify-between", children: [_jsx(Label, { htmlFor: `notif-event-${key}`, children: label }), _jsx(Switch, { id: `notif-event-${key}`, "data-testid": `switch-event-${key}`, checked: events[key], onCheckedChange: (v) => handleEventChange(key, v) })] }, key)))] })] })] }));
30
+ return (_jsxs(SettingsSection, { icon: Bell, title: t('settings.notifications.title'), description: t('settings.notifications.sectionDescription'), testId: "notification-settings-section", tooltip: t('settings.notifications.hint'), tooltipLinks: [
31
+ {
32
+ label: t('settings.notifications.links.notificationSystem'),
33
+ href: 'https://github.com/jrmatherly/shipit/blob/main/specs/021-agent-notifications/spec.yaml',
34
+ },
35
+ ], children: [_jsx(SubsectionLabel, { children: t('settings.notifications.channels') }), _jsx(SwitchRow, { label: t('settings.notifications.inAppLabel'), description: t('settings.notifications.inAppDescription'), tooltip: "Master toggle for in-app toast notifications. When disabled, no event toasts will appear regardless of individual event settings below.", id: "notif-in-app", testId: "switch-in-app", checked: inApp, onChange: (v) => {
36
+ setInApp(v);
37
+ save(buildNotificationPayload({ inApp: v }));
38
+ } }), _jsx(SubsectionLabel, { children: t('settings.notifications.subsections.agentEvents') }), _jsx(SwitchRow, { label: t('settings.notifications.events.agentStarted'), tooltip: "Controls whether you receive an in-app toast notification when an agent begins working on a feature.", id: "notif-event-agentStarted", testId: "switch-event-agentStarted", checked: events.agentStarted, onChange: (v) => {
39
+ const newEvents = { ...events, agentStarted: v };
40
+ setEvents(newEvents);
41
+ save(buildNotificationPayload({ events: newEvents }));
42
+ } }), _jsx(SwitchRow, { label: t('settings.notifications.events.phaseCompleted'), tooltip: "Controls whether you receive an in-app toast notification when an agent completes a workflow phase (e.g., requirements, planning, implementation).", id: "notif-event-phaseCompleted", testId: "switch-event-phaseCompleted", checked: events.phaseCompleted, onChange: (v) => {
43
+ const newEvents = { ...events, phaseCompleted: v };
44
+ setEvents(newEvents);
45
+ save(buildNotificationPayload({ events: newEvents }));
46
+ } }), _jsx(SwitchRow, { label: t('settings.notifications.events.waitingApproval'), tooltip: "Controls whether you receive an in-app toast notification when a feature is paused and waiting for your approval to continue.", id: "notif-event-waitingApproval", testId: "switch-event-waitingApproval", checked: events.waitingApproval, onChange: (v) => {
47
+ const newEvents = { ...events, waitingApproval: v };
48
+ setEvents(newEvents);
49
+ save(buildNotificationPayload({ events: newEvents }));
50
+ } }), _jsx(SwitchRow, { label: t('settings.notifications.events.agentCompleted'), tooltip: "Controls whether you receive an in-app toast notification when an agent finishes all work on a feature successfully.", id: "notif-event-agentCompleted", testId: "switch-event-agentCompleted", checked: events.agentCompleted, onChange: (v) => {
51
+ const newEvents = { ...events, agentCompleted: v };
52
+ setEvents(newEvents);
53
+ save(buildNotificationPayload({ events: newEvents }));
54
+ } }), _jsx(SwitchRow, { label: t('settings.notifications.events.agentFailed'), tooltip: "Controls whether you receive an in-app toast notification when an agent encounters an error and stops working on a feature.", id: "notif-event-agentFailed", testId: "switch-event-agentFailed", checked: events.agentFailed, onChange: (v) => {
55
+ const newEvents = { ...events, agentFailed: v };
56
+ setEvents(newEvents);
57
+ save(buildNotificationPayload({ events: newEvents }));
58
+ } }), _jsx(SubsectionLabel, { children: t('settings.notifications.subsections.pullRequestEvents') }), _jsx(SwitchRow, { label: t('settings.notifications.events.prMerged'), tooltip: "Controls whether you receive an in-app toast notification when a feature's pull request is merged into the target branch.", id: "notif-event-prMerged", testId: "switch-event-prMerged", checked: events.prMerged, onChange: (v) => {
59
+ const newEvents = { ...events, prMerged: v };
60
+ setEvents(newEvents);
61
+ save(buildNotificationPayload({ events: newEvents }));
62
+ } }), _jsx(SwitchRow, { label: t('settings.notifications.events.prClosed'), tooltip: "Controls whether you receive an in-app toast notification when a feature's pull request is closed without merging.", id: "notif-event-prClosed", testId: "switch-event-prClosed", checked: events.prClosed, onChange: (v) => {
63
+ const newEvents = { ...events, prClosed: v };
64
+ setEvents(newEvents);
65
+ save(buildNotificationPayload({ events: newEvents }));
66
+ } }), _jsx(SwitchRow, { label: t('settings.notifications.events.prChecksPassed'), tooltip: "Controls whether you receive an in-app toast notification when all CI checks pass on a feature's pull request.", id: "notif-event-prChecksPassed", testId: "switch-event-prChecksPassed", checked: events.prChecksPassed, onChange: (v) => {
67
+ const newEvents = { ...events, prChecksPassed: v };
68
+ setEvents(newEvents);
69
+ save(buildNotificationPayload({ events: newEvents }));
70
+ } }), _jsx(SwitchRow, { label: t('settings.notifications.events.prChecksFailed'), tooltip: "Controls whether you receive an in-app toast notification when CI checks fail on a feature's pull request.", id: "notif-event-prChecksFailed", testId: "switch-event-prChecksFailed", checked: events.prChecksFailed, onChange: (v) => {
71
+ const newEvents = { ...events, prChecksFailed: v };
72
+ setEvents(newEvents);
73
+ save(buildNotificationPayload({ events: newEvents }));
74
+ } }), _jsx(SwitchRow, { label: t('settings.notifications.events.prBlocked'), tooltip: "Controls whether you receive an in-app toast notification when a pull request is blocked by merge conflicts or branch protection rules.", id: "notif-event-prBlocked", testId: "switch-event-prBlocked", checked: events.prBlocked, onChange: (v) => {
75
+ const newEvents = { ...events, prBlocked: v };
76
+ setEvents(newEvents);
77
+ save(buildNotificationPayload({ events: newEvents }));
78
+ } }), _jsx(SwitchRow, { label: t('settings.notifications.events.mergeReviewReady'), tooltip: "Controls whether you receive an in-app toast notification when a feature's PR passes all checks and is ready for your merge review.", id: "notif-event-mergeReviewReady", testId: "switch-event-mergeReviewReady", checked: events.mergeReviewReady, onChange: (v) => {
79
+ const newEvents = { ...events, mergeReviewReady: v };
80
+ setEvents(newEvents);
81
+ save(buildNotificationPayload({ events: newEvents }));
82
+ } })] }));
66
83
  }
@@ -1 +1 @@
1
- {"version":3,"file":"notification-settings-section.stories.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/features/settings/notification-settings-section.stories.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAQ,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,2BAA2B,EAAE,MAAM,iCAAiC,CAAC;AAE9E,QAAA,MAAM,IAAI;;;;;;;CAO0C,CAAC;AAErD,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,IAAI,CAAC,CAAC;AA8BnC,eAAO,MAAM,OAAO,EAAE,KASrB,CAAC;AAEF,eAAO,MAAM,UAAU,EAAE,KASxB,CAAC;AAEF,eAAO,MAAM,WAAW,EAAE,KASzB,CAAC"}
1
+ {"version":3,"file":"notification-settings-section.stories.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/features/settings/notification-settings-section.stories.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAQ,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,2BAA2B,EAAE,MAAM,iCAAiC,CAAC;AAiC9E,QAAA,MAAM,IAAI;;;;;;;CAO0C,CAAC;AAErD,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,IAAI,CAAC,CAAC;AAEnC,eAAO,MAAM,OAAO,EAAE,KAWrB,CAAC;AAEF,eAAO,MAAM,UAAU,EAAE,KAWxB,CAAC;AAEF,eAAO,MAAM,WAAW,EAAE,KAWzB,CAAC"}
@@ -1,13 +1,6 @@
1
1
  import { NotificationSettingsSection } from './notification-settings-section.js';
2
- const meta = {
3
- title: 'Features/Settings/NotificationSettingsSection',
4
- component: NotificationSettingsSection,
5
- tags: ['autodocs'],
6
- parameters: {
7
- layout: 'padded',
8
- },
9
- };
10
- export default meta;
2
+ import { createDefaultSettings } from '../../../../../../packages/core/src/domain/factories/settings-defaults.factory.js';
3
+ const baseSettings = createDefaultSettings();
11
4
  const allEvents = {
12
5
  agentStarted: true,
13
6
  phaseCompleted: true,
@@ -34,33 +27,48 @@ const noEvents = {
34
27
  prChecksFailed: false,
35
28
  prBlocked: false,
36
29
  };
30
+ const meta = {
31
+ title: 'Features/Settings/NotificationSettingsSection',
32
+ component: NotificationSettingsSection,
33
+ tags: ['autodocs'],
34
+ parameters: {
35
+ layout: 'padded',
36
+ },
37
+ };
38
+ export default meta;
37
39
  export const Default = {
38
40
  args: {
39
- notifications: {
40
- inApp: { enabled: true },
41
- browser: { enabled: false },
42
- desktop: { enabled: false },
43
- events: allEvents,
41
+ settings: {
42
+ ...baseSettings,
43
+ notifications: {
44
+ ...baseSettings.notifications,
45
+ inApp: { enabled: true },
46
+ events: allEvents,
47
+ },
44
48
  },
45
49
  },
46
50
  };
47
51
  export const AllEnabled = {
48
52
  args: {
49
- notifications: {
50
- inApp: { enabled: true },
51
- browser: { enabled: false },
52
- desktop: { enabled: false },
53
- events: allEvents,
53
+ settings: {
54
+ ...baseSettings,
55
+ notifications: {
56
+ ...baseSettings.notifications,
57
+ inApp: { enabled: true },
58
+ events: allEvents,
59
+ },
54
60
  },
55
61
  },
56
62
  };
57
63
  export const AllDisabled = {
58
64
  args: {
59
- notifications: {
60
- inApp: { enabled: false },
61
- browser: { enabled: false },
62
- desktop: { enabled: false },
63
- events: noEvents,
65
+ settings: {
66
+ ...baseSettings,
67
+ notifications: {
68
+ ...baseSettings.notifications,
69
+ inApp: { enabled: false },
70
+ events: noEvents,
71
+ },
64
72
  },
65
73
  },
66
74
  };
@@ -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":"AA+CA,OAAO,KAAK,EACV,QAAQ,EAGT,MAAM,yCAAyC,CAAC;AACjD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,uCAAuC,CAAC;AAC/E,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,qCAAqC,CAAC;AAC3E,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AA6BzE,MAAM,WAAW,uBAAuB;IACtC,QAAQ,EAAE,QAAQ,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,kBAAkB,CAAC,EAAE,iBAAiB,EAAE,CAAC;IACzC,gBAAgB,CAAC,EAAE,eAAe,EAAE,CAAC;IACrC,eAAe,CAAC,EAAE,cAAc,EAAE,CAAC;CACpC;AAoDD,wBAAgB,kBAAkB,CAAC,EACjC,QAAQ,EACR,YAAY,EACZ,UAAU,EACV,kBAAkB,EAClB,gBAAgB,EAChB,eAAe,GAChB,EAAE,uBAAuB,2CA2+BzB"}
1
+ {"version":3,"file":"settings-page-client.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/features/settings/settings-page-client.tsx"],"names":[],"mappings":"AA4BA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,yCAAyC,CAAC;AACxE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,uCAAuC,CAAC;AAC/E,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,qCAAqC,CAAC;AAC3E,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AAiBzE,MAAM,WAAW,uBAAuB;IACtC,QAAQ,EAAE,QAAQ,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,kBAAkB,CAAC,EAAE,iBAAiB,EAAE,CAAC;IACzC,gBAAgB,CAAC,EAAE,eAAe,EAAE,CAAC;IACrC,eAAe,CAAC,EAAE,cAAc,EAAE,CAAC;CACpC;AAED,wBAAgB,kBAAkB,CAAC,EACjC,QAAQ,EACR,YAAY,EACZ,UAAU,EACV,kBAAkB,EAClB,gBAAgB,EAChB,eAAe,GAChB,EAAE,uBAAuB,2CAqJzB"}