@shepai/cli 1.78.0-pr247.58f85f0 → 1.78.0-pr247.d196fda

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 (182) hide show
  1. package/dist/src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.d.ts.map +1 -1
  2. package/dist/src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.js +1 -1
  3. package/dist/src/presentation/web/components/features/settings/AgentModelPicker/index.d.ts.map +1 -1
  4. package/dist/src/presentation/web/components/features/settings/AgentModelPicker/index.js +3 -3
  5. package/dist/src/presentation/web/components/features/settings/settings-page-client.d.ts.map +1 -1
  6. package/dist/src/presentation/web/components/features/settings/settings-page-client.js +103 -227
  7. package/dist/tsconfig.build.tsbuildinfo +1 -1
  8. package/package.json +1 -1
  9. package/web/.next/BUILD_ID +1 -1
  10. package/web/.next/build-manifest.json +2 -2
  11. package/web/.next/fallback-build-manifest.json +2 -2
  12. package/web/.next/prerender-manifest.json +3 -3
  13. package/web/.next/server/app/(dashboard)/@drawer/create/page/server-reference-manifest.json +18 -18
  14. package/web/.next/server/app/(dashboard)/@drawer/create/page.js.nft.json +1 -1
  15. package/web/.next/server/app/(dashboard)/@drawer/create/page_client-reference-manifest.js +1 -1
  16. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page/server-reference-manifest.json +19 -19
  17. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js.nft.json +1 -1
  18. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page_client-reference-manifest.js +1 -1
  19. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page/server-reference-manifest.json +14 -14
  20. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js.nft.json +1 -1
  21. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  22. package/web/.next/server/app/(dashboard)/create/page/server-reference-manifest.json +18 -18
  23. package/web/.next/server/app/(dashboard)/create/page.js.nft.json +1 -1
  24. package/web/.next/server/app/(dashboard)/create/page_client-reference-manifest.js +1 -1
  25. package/web/.next/server/app/(dashboard)/feature/[featureId]/page/server-reference-manifest.json +19 -19
  26. package/web/.next/server/app/(dashboard)/feature/[featureId]/page.js.nft.json +1 -1
  27. package/web/.next/server/app/(dashboard)/feature/[featureId]/page_client-reference-manifest.js +1 -1
  28. package/web/.next/server/app/(dashboard)/page/server-reference-manifest.json +14 -14
  29. package/web/.next/server/app/(dashboard)/page.js.nft.json +1 -1
  30. package/web/.next/server/app/(dashboard)/page_client-reference-manifest.js +1 -1
  31. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page/server-reference-manifest.json +14 -14
  32. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js.nft.json +1 -1
  33. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  34. package/web/.next/server/app/_global-error.html +2 -2
  35. package/web/.next/server/app/_global-error.rsc +1 -1
  36. package/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  37. package/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  38. package/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  39. package/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  40. package/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  41. package/web/.next/server/app/_not-found/page/server-reference-manifest.json +1 -1
  42. package/web/.next/server/app/_not-found/page.js.nft.json +1 -1
  43. package/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  44. package/web/.next/server/app/settings/page/server-reference-manifest.json +5 -5
  45. package/web/.next/server/app/settings/page.js.nft.json +1 -1
  46. package/web/.next/server/app/settings/page_client-reference-manifest.js +1 -1
  47. package/web/.next/server/app/skills/page/server-reference-manifest.json +6 -6
  48. package/web/.next/server/app/skills/page.js.nft.json +1 -1
  49. package/web/.next/server/app/skills/page_client-reference-manifest.js +1 -1
  50. package/web/.next/server/app/tools/page/server-reference-manifest.json +6 -6
  51. package/web/.next/server/app/tools/page.js.nft.json +1 -1
  52. package/web/.next/server/app/tools/page_client-reference-manifest.js +1 -1
  53. package/web/.next/server/app/version/page/server-reference-manifest.json +1 -1
  54. package/web/.next/server/app/version/page.js.nft.json +1 -1
  55. package/web/.next/server/app/version/page_client-reference-manifest.js +1 -1
  56. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js +1 -1
  57. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js.map +1 -1
  58. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_da7eef33.js +1 -1
  59. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_da7eef33.js.map +1 -1
  60. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_0a9251aa.js +1 -1
  61. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_0a9251aa.js.map +1 -1
  62. package/web/.next/server/chunks/ssr/[root-of-the-server]__11033878._.js +1 -1
  63. package/web/.next/server/chunks/ssr/[root-of-the-server]__11033878._.js.map +1 -1
  64. package/web/.next/server/chunks/ssr/[root-of-the-server]__4be9a9bb._.js +1 -1
  65. package/web/.next/server/chunks/ssr/[root-of-the-server]__5d87af2e._.js +1 -1
  66. package/web/.next/server/chunks/ssr/[root-of-the-server]__aad040c0._.js +1 -1
  67. package/web/.next/server/chunks/ssr/[root-of-the-server]__aad040c0._.js.map +1 -1
  68. package/web/.next/server/chunks/ssr/{[root-of-the-server]__b3a4cef4._.js → [root-of-the-server]__bff2deea._.js} +2 -2
  69. package/web/.next/server/chunks/ssr/{[root-of-the-server]__b3a4cef4._.js.map → [root-of-the-server]__bff2deea._.js.map} +1 -1
  70. package/web/.next/server/chunks/ssr/[root-of-the-server]__d076a90b._.js +3 -0
  71. package/web/.next/server/chunks/ssr/[root-of-the-server]__d076a90b._.js.map +1 -0
  72. package/web/.next/server/chunks/ssr/[root-of-the-server]__f0d8d054._.js +2 -2
  73. package/web/.next/server/chunks/ssr/[root-of-the-server]__fdc75809._.js +1 -1
  74. package/web/.next/server/chunks/ssr/[root-of-the-server]__fdc75809._.js.map +1 -1
  75. package/web/.next/server/chunks/ssr/{_a68d7e1c._.js → _0bd0fafb._.js} +2 -2
  76. package/web/.next/server/chunks/ssr/_0bd0fafb._.js.map +1 -0
  77. package/web/.next/server/chunks/ssr/_0e9d6bf7._.js +3 -0
  78. package/web/.next/server/chunks/ssr/_0e9d6bf7._.js.map +1 -0
  79. package/web/.next/server/chunks/ssr/_14fa79b2._.js +3 -0
  80. package/web/.next/server/chunks/ssr/_14fa79b2._.js.map +1 -0
  81. package/web/.next/server/chunks/ssr/_61351ed3._.js +3 -0
  82. package/web/.next/server/chunks/ssr/_61351ed3._.js.map +1 -0
  83. package/web/.next/server/chunks/ssr/{_fe901bb8._.js → _758603c5._.js} +2 -2
  84. package/web/.next/server/chunks/ssr/{_fe901bb8._.js.map → _758603c5._.js.map} +1 -1
  85. package/web/.next/server/chunks/ssr/_8400c8bb._.js +3 -0
  86. package/web/.next/server/chunks/ssr/_8400c8bb._.js.map +1 -0
  87. package/web/.next/server/chunks/ssr/_8dacd1e7._.js +1 -1
  88. package/web/.next/server/chunks/ssr/_8dacd1e7._.js.map +1 -1
  89. package/web/.next/server/chunks/ssr/_9ac70f88._.js +5 -0
  90. package/web/.next/server/chunks/ssr/_9ac70f88._.js.map +1 -0
  91. package/web/.next/server/chunks/ssr/{_34fbed18._.js → _9d11d025._.js} +2 -2
  92. package/web/.next/server/chunks/ssr/_9d11d025._.js.map +1 -0
  93. package/web/.next/server/chunks/ssr/_a29296f0._.js +3 -0
  94. package/web/.next/server/chunks/ssr/_a29296f0._.js.map +1 -0
  95. package/web/.next/server/chunks/ssr/{_c763badc._.js → _a66cde20._.js} +2 -2
  96. package/web/.next/server/chunks/ssr/{_c763badc._.js.map → _a66cde20._.js.map} +1 -1
  97. package/web/.next/server/chunks/ssr/{_2dfa2f07._.js → _b3692240._.js} +2 -2
  98. package/web/.next/server/chunks/ssr/{_2dfa2f07._.js.map → _b3692240._.js.map} +1 -1
  99. package/web/.next/server/chunks/ssr/{_1bb131c4._.js → _d4b20e29._.js} +2 -2
  100. package/web/.next/server/chunks/ssr/_d4b20e29._.js.map +1 -0
  101. package/web/.next/server/chunks/ssr/_ed356507._.js +3 -0
  102. package/web/.next/server/chunks/ssr/_ed356507._.js.map +1 -0
  103. package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_settings_settings-page-client_tsx_6ed9d5f8._.js +1 -1
  104. package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_settings_settings-page-client_tsx_6ed9d5f8._.js.map +1 -1
  105. package/web/.next/server/chunks/ssr/{node_modules__pnpm_c931457d._.js → node_modules__pnpm_1fcecd3a._.js} +2 -2
  106. package/web/.next/server/chunks/ssr/node_modules__pnpm_1fcecd3a._.js.map +1 -0
  107. package/web/.next/server/chunks/ssr/src_presentation_web_30d7eeda._.js +1 -1
  108. package/web/.next/server/chunks/ssr/src_presentation_web_30d7eeda._.js.map +1 -1
  109. package/web/.next/server/chunks/ssr/src_presentation_web_565a14f8._.js +1 -1
  110. package/web/.next/server/chunks/ssr/src_presentation_web_565a14f8._.js.map +1 -1
  111. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_021a05f2.js +1 -1
  112. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_021a05f2.js.map +1 -1
  113. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_skills_page_actions_1fa8042e.js +1 -1
  114. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_skills_page_actions_1fa8042e.js.map +1 -1
  115. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_tools_page_actions_24684200.js +1 -1
  116. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_tools_page_actions_24684200.js.map +1 -1
  117. package/web/.next/server/chunks/ssr/src_presentation_web_c4348b8a._.js +2 -2
  118. package/web/.next/server/chunks/ssr/src_presentation_web_c4348b8a._.js.map +1 -1
  119. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js +1 -1
  120. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js.map +1 -1
  121. package/web/.next/server/chunks/ssr/src_presentation_web_e4510d10._.js +2 -2
  122. package/web/.next/server/chunks/ssr/src_presentation_web_e4510d10._.js.map +1 -1
  123. package/web/.next/server/pages/500.html +2 -2
  124. package/web/.next/server/server-reference-manifest.js +1 -1
  125. package/web/.next/server/server-reference-manifest.json +26 -26
  126. package/web/.next/static/chunks/100bf43ee3be227d.js +1 -0
  127. package/web/.next/static/chunks/{cbcbfe23acaa4dc4.js → 2cde9c085a88faa2.js} +1 -1
  128. package/web/.next/static/chunks/37491dd00b50c048.js +1 -0
  129. package/web/.next/static/chunks/37701ed5abefa856.js +1 -0
  130. package/web/.next/static/chunks/42bd17823c7f41a1.css +2 -0
  131. package/web/.next/static/chunks/4570b60e2b206821.js +1 -0
  132. package/web/.next/static/chunks/4d5a5c3d8373423e.js +1 -0
  133. package/web/.next/static/chunks/51454a23ce051ec9.js +1 -0
  134. package/web/.next/static/chunks/52b56677c842e45f.js +3 -0
  135. package/web/.next/static/chunks/5f627cfc35ca21bc.js +1 -0
  136. package/web/.next/static/chunks/{b75777503f1b2966.js → 726928a3ba2ec53b.js} +1 -1
  137. package/web/.next/static/chunks/837e3099cbc581a3.js +1 -0
  138. package/web/.next/static/chunks/876edf7bbd901942.js +1 -0
  139. package/web/.next/static/chunks/883ee29df0f75f24.js +1 -0
  140. package/web/.next/static/chunks/8f122c3ac2102300.js +11 -0
  141. package/web/.next/static/chunks/bd539e609555e2b7.js +1 -0
  142. package/web/.next/static/chunks/c8b2868ae430a586.js +1 -0
  143. package/web/.next/static/chunks/edbd674102e897b4.js +1 -0
  144. package/web/.next/server/chunks/ssr/[root-of-the-server]__a337ca5c._.js +0 -3
  145. package/web/.next/server/chunks/ssr/[root-of-the-server]__a337ca5c._.js.map +0 -1
  146. package/web/.next/server/chunks/ssr/_06db7efd._.js +0 -3
  147. package/web/.next/server/chunks/ssr/_06db7efd._.js.map +0 -1
  148. package/web/.next/server/chunks/ssr/_1bb131c4._.js.map +0 -1
  149. package/web/.next/server/chunks/ssr/_1e3cf73b._.js +0 -3
  150. package/web/.next/server/chunks/ssr/_1e3cf73b._.js.map +0 -1
  151. package/web/.next/server/chunks/ssr/_34fbed18._.js.map +0 -1
  152. package/web/.next/server/chunks/ssr/_4031d614._.js +0 -3
  153. package/web/.next/server/chunks/ssr/_4031d614._.js.map +0 -1
  154. package/web/.next/server/chunks/ssr/_5c4ce700._.js +0 -3
  155. package/web/.next/server/chunks/ssr/_5c4ce700._.js.map +0 -1
  156. package/web/.next/server/chunks/ssr/_63868199._.js +0 -3
  157. package/web/.next/server/chunks/ssr/_63868199._.js.map +0 -1
  158. package/web/.next/server/chunks/ssr/_6d26a08f._.js +0 -3
  159. package/web/.next/server/chunks/ssr/_6d26a08f._.js.map +0 -1
  160. package/web/.next/server/chunks/ssr/_a68d7e1c._.js.map +0 -1
  161. package/web/.next/server/chunks/ssr/node_modules__pnpm_04f4e45f._.js +0 -5
  162. package/web/.next/server/chunks/ssr/node_modules__pnpm_04f4e45f._.js.map +0 -1
  163. package/web/.next/server/chunks/ssr/node_modules__pnpm_5412e589._.js +0 -3
  164. package/web/.next/server/chunks/ssr/node_modules__pnpm_5412e589._.js.map +0 -1
  165. package/web/.next/server/chunks/ssr/node_modules__pnpm_c931457d._.js.map +0 -1
  166. package/web/.next/static/chunks/0fb7745c30469b39.js +0 -1
  167. package/web/.next/static/chunks/1f57d0c949dbb44d.js +0 -1
  168. package/web/.next/static/chunks/29e2d20301cc0228.js +0 -1
  169. package/web/.next/static/chunks/3019bd1ba5b6dbd7.js +0 -1
  170. package/web/.next/static/chunks/303a1217006489b9.js +0 -1
  171. package/web/.next/static/chunks/368086b5cb9990cf.css +0 -2
  172. package/web/.next/static/chunks/43914dc116d274e5.js +0 -1
  173. package/web/.next/static/chunks/6a3e8ea6e1fd2113.js +0 -1
  174. package/web/.next/static/chunks/a170e5077f411792.js +0 -1
  175. package/web/.next/static/chunks/a2a64131db68e043.js +0 -1
  176. package/web/.next/static/chunks/b0c40d4968fc3f39.js +0 -11
  177. package/web/.next/static/chunks/ca60853bf54ad0e6.js +0 -1
  178. package/web/.next/static/chunks/e405f0502431ea60.js +0 -3
  179. package/web/.next/static/chunks/e51ca3823c36ce3d.js +0 -1
  180. /package/web/.next/static/{ol4LBWGA7YIGGHfJPTk1X → _p0UmHUYkX-o1pGYlVer1}/_buildManifest.js +0 -0
  181. /package/web/.next/static/{ol4LBWGA7YIGGHfJPTk1X → _p0UmHUYkX-o1pGYlVer1}/_clientMiddlewareManifest.json +0 -0
  182. /package/web/.next/static/{ol4LBWGA7YIGGHfJPTk1X → _p0UmHUYkX-o1pGYlVer1}/_ssgManifest.js +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"feature-create-drawer.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.tsx"],"names":[],"mappings":"AA2BA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,0DAA0D,CAAC;AAC/F,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,qCAAqC,CAAC;AAI5E,YAAY,EAAE,cAAc,EAAE,MAAM,0DAA0D,CAAC;AAE/F,0DAA0D;AAC1D,MAAM,WAAW,mBAAmB;IAClC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,oBAAoB;IACnC,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,cAAc,EAAE,CAAC;IAC9B,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa,EAAE;QACb,QAAQ,EAAE,OAAO,CAAC;QAClB,SAAS,EAAE,OAAO,CAAC;QACnB,UAAU,EAAE,OAAO,CAAC;KACrB,CAAC;IACF,IAAI,EAAE,OAAO,CAAC;IACd,MAAM,EAAE,OAAO,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,0EAA0E;IAC1E,IAAI,EAAE,OAAO,CAAC;IACd,wDAAwD;IACxD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,mDAAmD;IACnD,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAcD,MAAM,WAAW,wBAAwB;IACvC,IAAI,EAAE,OAAO,CAAC;IACd,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,QAAQ,EAAE,CAAC,IAAI,EAAE,oBAAoB,KAAK,IAAI,CAAC;IAC/C,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;IACpC,qEAAqE;IACrE,QAAQ,CAAC,EAAE,mBAAmB,EAAE,CAAC;IACjC,kGAAkG;IAClG,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,8CAA8C;IAC9C,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,yCAAyC;IACzC,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,wBAAgB,mBAAmB,CAAC,EAClC,IAAI,EACJ,OAAO,EACP,QAAQ,EACR,cAAc,EACd,YAAoB,EACpB,gBAAgB,EAChB,QAAQ,EACR,eAAe,EACf,gBAAgB,EAChB,YAAY,GACb,EAAE,wBAAwB,2CA6X1B"}
1
+ {"version":3,"file":"feature-create-drawer.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.tsx"],"names":[],"mappings":"AA2BA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,0DAA0D,CAAC;AAC/F,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,qCAAqC,CAAC;AAI5E,YAAY,EAAE,cAAc,EAAE,MAAM,0DAA0D,CAAC;AAE/F,0DAA0D;AAC1D,MAAM,WAAW,mBAAmB;IAClC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,oBAAoB;IACnC,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,cAAc,EAAE,CAAC;IAC9B,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa,EAAE;QACb,QAAQ,EAAE,OAAO,CAAC;QAClB,SAAS,EAAE,OAAO,CAAC;QACnB,UAAU,EAAE,OAAO,CAAC;KACrB,CAAC;IACF,IAAI,EAAE,OAAO,CAAC;IACd,MAAM,EAAE,OAAO,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,0EAA0E;IAC1E,IAAI,EAAE,OAAO,CAAC;IACd,wDAAwD;IACxD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,mDAAmD;IACnD,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAcD,MAAM,WAAW,wBAAwB;IACvC,IAAI,EAAE,OAAO,CAAC;IACd,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,QAAQ,EAAE,CAAC,IAAI,EAAE,oBAAoB,KAAK,IAAI,CAAC;IAC/C,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;IACpC,qEAAqE;IACrE,QAAQ,CAAC,EAAE,mBAAmB,EAAE,CAAC;IACjC,kGAAkG;IAClG,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,8CAA8C;IAC9C,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,yCAAyC;IACzC,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,wBAAgB,mBAAmB,CAAC,EAClC,IAAI,EACJ,OAAO,EACP,QAAQ,EACR,cAAc,EACd,YAAoB,EACpB,gBAAgB,EAChB,QAAQ,EACR,eAAe,EACf,gBAAgB,EAChB,YAAY,GACb,EAAE,wBAAwB,2CA4X1B"}
@@ -125,7 +125,7 @@ export function FeatureCreateDrawer({ open, onClose, onSubmit, repositoryPath, i
125
125
  return (_jsx(BaseDrawer, { open: open, onClose: attemptClose, size: "md", modal: false, dismissOnOutsideClick: true, "data-testid": "feature-create-drawer", header: _jsxs(_Fragment, { children: [_jsxs("div", { className: "flex items-center gap-2", children: [_jsx("div", { className: "h-2.5 w-2.5 shrink-0 rounded-full bg-blue-500" }), _jsx(DrawerTitle, { children: "NEW FEATURE" })] }), isSubmitting ? (_jsx(DrawerDescription, { asChild: true, children: _jsx("div", { children: _jsx(Badge, { variant: "secondary", children: "Creating..." }) }) })) : null] }), footer: _jsxs("div", { className: "flex flex-row justify-end gap-2", children: [_jsx(Button, { variant: "outline", onClick: attemptClose, disabled: isSubmitting, children: "Cancel" }), _jsx(Button, { type: "submit", form: "create-feature-form", disabled: !description.trim() || isSubmitting, children: isSubmitting ? 'Creating...' : '+ Create Feature' })] }), children: _jsx("div", { className: "overflow-y-auto p-4", children: _jsx(TooltipProvider, { delayDuration: 400, children: _jsxs("form", { id: "create-feature-form", onSubmit: handleSubmit, className: "flex flex-col gap-4", children: [_jsxs("div", { className: "flex flex-col gap-1.5", children: [_jsx(Label, { htmlFor: "feature-description", className: "text-muted-foreground text-xs font-semibold tracking-wider", children: "DESCRIBE YOUR FEATURE" }), _jsxs("div", { className: "border-input focus-within:ring-ring/50 focus-within:border-ring overflow-hidden rounded-md border shadow-xs transition-[color,box-shadow] focus-within:ring-[3px]", children: [_jsx(Textarea, { id: "feature-description", placeholder: "e.g. Add GitHub OAuth login with callback handling and token refresh...", value: description, onChange: (e) => setDescription(e.target.value), rows: 7, required: true, disabled: isSubmitting, className: "field-sizing-fixed min-h-42! resize-none rounded-none border-0 shadow-none focus-visible:ring-0" }), _jsxs("div", { className: "border-input flex items-center gap-3 border-t px-3 py-1.5", children: [_jsx(AgentModelPicker, { initialAgentType: overrideAgent ?? currentAgentType ?? 'claude-code', initialModel: overrideModel ?? currentModel ?? 'claude-sonnet-4-6', mode: "override", onAgentModelChange: (agent, model) => {
126
126
  setOverrideAgent(agent);
127
127
  setOverrideModel(model);
128
- }, disabled: isSubmitting, className: "w-55" }), _jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsxs("div", { className: "ml-auto flex cursor-pointer items-center gap-2", children: [_jsx(Switch, { id: "fast-mode", checked: fast, onCheckedChange: setFast, disabled: isSubmitting }), _jsx(Label, { htmlFor: "fast-mode", className: "cursor-pointer text-sm font-medium", children: "Fast Mode" })] }) }), _jsx(TooltipContent, { side: "bottom", children: "Skip SDLC phases and implement directly from your prompt." })] })] })] })] }), hasFeatures && initialParentId !== undefined ? (_jsxs("div", { className: "flex flex-col gap-1.5", children: [_jsx(Label, { htmlFor: "parent-feature", className: "text-muted-foreground text-xs font-semibold tracking-wider", children: "PARENT FEATURE" }), _jsx(ParentFeatureCombobox, { features: features, value: parentId, onChange: setParentId, disabled: isSubmitting })] })) : null, _jsxs("div", { className: "flex flex-col gap-2", children: [_jsxs("div", { className: "border-input flex items-center gap-4 rounded-md border px-3 py-2.5", children: [_jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx("span", { className: "text-muted-foreground w-16 shrink-0 cursor-default text-xs font-semibold tracking-wider", children: "APPROVE" }) }), _jsx(TooltipContent, { side: "bottom", children: "Auto-approve phase transitions without manual review." })] }), _jsx("div", { className: "flex flex-1 items-center gap-4", children: AUTO_APPROVE_OPTIONS.map((opt) => (_jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsxs("div", { className: "flex cursor-pointer items-center gap-1.5", children: [_jsx(Switch, { id: `approve-${opt.id}`, size: "sm", checked: approvalGates[opt.id] ?? false, onCheckedChange: (v) => setApprovalGates((prev) => ({ ...prev, [opt.id]: v })), disabled: isSubmitting ||
128
+ }, disabled: isSubmitting }), _jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsxs("div", { className: "ml-auto flex cursor-pointer items-center gap-2", children: [_jsx(Switch, { id: "fast-mode", checked: fast, onCheckedChange: setFast, disabled: isSubmitting }), _jsx(Label, { htmlFor: "fast-mode", className: "cursor-pointer text-sm font-medium", children: "Fast Mode" })] }) }), _jsx(TooltipContent, { side: "bottom", children: "Skip SDLC phases and implement directly from your prompt." })] })] })] })] }), hasFeatures && initialParentId !== undefined ? (_jsxs("div", { className: "flex flex-col gap-1.5", children: [_jsx(Label, { htmlFor: "parent-feature", className: "text-muted-foreground text-xs font-semibold tracking-wider", children: "PARENT FEATURE" }), _jsx(ParentFeatureCombobox, { features: features, value: parentId, onChange: setParentId, disabled: isSubmitting })] })) : null, _jsxs("div", { className: "flex flex-col gap-2", children: [_jsxs("div", { className: "border-input flex items-center gap-4 rounded-md border px-3 py-2.5", children: [_jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx("span", { className: "text-muted-foreground w-16 shrink-0 cursor-default text-xs font-semibold tracking-wider", children: "APPROVE" }) }), _jsx(TooltipContent, { side: "bottom", children: "Auto-approve phase transitions without manual review." })] }), _jsx("div", { className: "flex flex-1 items-center gap-4", children: AUTO_APPROVE_OPTIONS.map((opt) => (_jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsxs("div", { className: "flex cursor-pointer items-center gap-1.5", children: [_jsx(Switch, { id: `approve-${opt.id}`, size: "sm", checked: approvalGates[opt.id] ?? false, onCheckedChange: (v) => setApprovalGates((prev) => ({ ...prev, [opt.id]: v })), disabled: isSubmitting ||
129
129
  (fast && (opt.id === 'allowPrd' || opt.id === 'allowPlan')) }), _jsx(Label, { htmlFor: `approve-${opt.id}`, className: "cursor-pointer text-xs font-medium", children: opt.label })] }) }), _jsx(TooltipContent, { side: "bottom", children: fast && (opt.id === 'allowPrd' || opt.id === 'allowPlan')
130
130
  ? 'Skipped in Fast Mode'
131
131
  : opt.description })] }, opt.id))) }), _jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx("button", { type: "button", onClick: () => {
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../../../src/presentation/web/components/features/settings/AgentModelPicker/index.tsx"],"names":[],"mappings":"AAaA,MAAM,WAAW,qBAAqB;IACpC,gBAAgB,EAAE,MAAM,CAAC;IACzB,YAAY,EAAE,MAAM,CAAC;IACrB,kBAAkB,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAChE,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,0EAA0E;IAC1E,IAAI,EAAE,UAAU,GAAG,UAAU,CAAC;CAC/B;AAED,wBAAgB,gBAAgB,CAAC,EAC/B,gBAAgB,EAChB,YAAY,EACZ,kBAAkB,EAClB,QAAQ,EACR,SAAS,EACT,IAAI,GACL,EAAE,qBAAqB,2CAoNvB"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../../../src/presentation/web/components/features/settings/AgentModelPicker/index.tsx"],"names":[],"mappings":"AAaA,MAAM,WAAW,qBAAqB;IACpC,gBAAgB,EAAE,MAAM,CAAC;IACzB,YAAY,EAAE,MAAM,CAAC;IACrB,kBAAkB,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAChE,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,0EAA0E;IAC1E,IAAI,EAAE,UAAU,GAAG,UAAU,CAAC;CAC/B;AAED,wBAAgB,gBAAgB,CAAC,EAC/B,gBAAgB,EAChB,YAAY,EACZ,kBAAkB,EAClB,QAAQ,EACR,SAAS,EACT,IAAI,GACL,EAAE,qBAAqB,2CAqMvB"}
@@ -1,5 +1,5 @@
1
1
  'use client';
2
- import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
3
3
  import * as React from 'react';
4
4
  import { Check, ChevronLeft, ChevronRight } from 'lucide-react';
5
5
  import { getAllAgentModels } from '../../../../app/actions/get-all-agent-models.js';
@@ -82,9 +82,9 @@ export function AgentModelPicker({ initialAgentType, initialModel, onAgentModelC
82
82
  const isDisabled = (disabled ?? false) || loading;
83
83
  const AgentIcon = getAgentTypeIcon(agentType);
84
84
  const agentLabel = groups.find((g) => g.agentType === agentType)?.label ?? agentType;
85
- const modelName = model ? getModelMeta(model).displayName || model : null;
85
+ const displayModel = model ? getModelMeta(model).displayName || model : agentLabel;
86
86
  const activeGroup = drillAgent ? groups.find((g) => g.agentType === drillAgent) : null;
87
- return (_jsxs("div", { className: cn('flex flex-col gap-1', className), children: [_jsxs(Popover, { open: open, onOpenChange: setOpen, children: [_jsx(PopoverTrigger, { asChild: true, children: _jsx(Button, { variant: "outline", role: "combobox", "aria-expanded": open, disabled: isDisabled, className: "w-auto cursor-pointer justify-start font-normal hover:border-violet-300 hover:bg-violet-50/50 dark:hover:border-violet-700 dark:hover:bg-violet-950/30", children: _jsxs("span", { className: "flex items-center gap-2 truncate", children: [_jsx(AgentIcon, { className: "h-4 w-4 shrink-0" }), loading ? ('Loading…') : (_jsxs("span", { className: "flex items-center gap-1", children: [_jsx("span", { className: "text-muted-foreground text-xs", children: agentLabel }), modelName ? (_jsxs(_Fragment, { children: [_jsx("span", { className: "text-muted-foreground/50 text-xs", children: "\u00B7" }), _jsx("span", { className: "text-xs font-medium", children: modelName })] })) : null] }))] }) }) }), _jsx(PopoverContent, { className: "w-(--radix-popover-trigger-width) overflow-hidden p-0", align: "start", children: _jsxs("div", { className: "flex transition-transform duration-200 ease-in-out", style: { transform: `translateX(${level === 1 ? '-50%' : '0%'})`, width: '200%' }, children: [_jsxs("div", { className: "w-1/2 shrink-0", children: [_jsx("div", { className: "text-muted-foreground border-b px-3 py-2 text-xs font-medium", children: "Select agent" }), groups.map((group) => {
87
+ return (_jsxs("div", { className: cn('flex flex-col gap-1', className), children: [_jsxs(Popover, { open: open, onOpenChange: setOpen, children: [_jsx(PopoverTrigger, { asChild: true, children: _jsx(Button, { variant: "outline", role: "combobox", "aria-expanded": open, disabled: isDisabled, className: "w-auto cursor-pointer font-normal", children: _jsxs("span", { className: "flex items-center gap-2 truncate", children: [_jsx(AgentIcon, { className: "h-4 w-4 shrink-0" }), loading ? 'Loading…' : displayModel] }) }) }), _jsx(PopoverContent, { className: "w-64 overflow-hidden p-0", align: "start", children: _jsxs("div", { className: "flex transition-transform duration-200 ease-in-out", style: { transform: `translateX(${level === 1 ? '-50%' : '0%'})`, width: '200%' }, children: [_jsxs("div", { className: "w-1/2 shrink-0", children: [_jsx("div", { className: "text-muted-foreground border-b px-3 py-2 text-xs font-medium", children: "Select agent" }), groups.map((group) => {
88
88
  const GroupIcon = getAgentTypeIcon(group.agentType);
89
89
  const isActive = agentType === group.agentType;
90
90
  const hasModels = group.models.length > 0;
@@ -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":"AAoCA,OAAO,KAAK,EACV,QAAQ,EAGT,MAAM,sCAAsC,CAAC;AAyB9C,MAAM,WAAW,uBAAuB;IACtC,QAAQ,EAAE,QAAQ,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;CACpB;AAwPD,wBAAgB,kBAAkB,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,UAAU,EAAE,EAAE,uBAAuB,2CAyxB7F"}
1
+ {"version":3,"file":"settings-page-client.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/features/settings/settings-page-client.tsx"],"names":[],"mappings":"AAoBA,OAAO,KAAK,EACV,QAAQ,EAGT,MAAM,sCAAsC,CAAC;AAe9C,MAAM,WAAW,uBAAuB;IACtC,QAAQ,EAAE,QAAQ,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;CACpB;AA6GD,wBAAgB,kBAAkB,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,UAAU,EAAE,EAAE,uBAAuB,2CAyhB7F"}
@@ -1,14 +1,12 @@
1
1
  'use client';
2
2
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
3
  import { useState, useTransition, useRef, useEffect, useCallback } from 'react';
4
- import { Eye, EyeOff, Check, Bot, Terminal, GitBranch, Activity, Bell, Flag, Database, Minus, Plus, ExternalLink, } from 'lucide-react';
4
+ import { Eye, EyeOff, Check } from 'lucide-react';
5
5
  import { toast } from 'sonner';
6
- import { cn } from '../../../lib/utils.js';
7
6
  import { Label } from '../../ui/label.js';
8
7
  import { Input } from '../../ui/input.js';
9
8
  import { Button } from '../../ui/button.js';
10
9
  import { Switch } from '../../ui/switch.js';
11
- import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from '../../ui/tooltip.js';
12
10
  import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from '../../ui/select.js';
13
11
  import { updateSettingsAction } from '../../../app/actions/update-settings.js';
14
12
  import { AgentAuthMethod, EditorType } from '../../../../../../packages/core/src/domain/generated/output.js';
@@ -25,15 +23,6 @@ const EDITOR_OPTIONS = [
25
23
  { value: EditorType.Zed, label: 'Zed' },
26
24
  { value: EditorType.Antigravity, label: 'Antigravity' },
27
25
  ];
28
- const SECTIONS = [
29
- { id: 'agent', label: 'Agent', icon: Bot },
30
- { id: 'environment', label: 'Environment', icon: Terminal },
31
- { id: 'workflow', label: 'Workflow', icon: GitBranch },
32
- { id: 'ci', label: 'CI', icon: Activity },
33
- { id: 'notifications', label: 'Notifications', icon: Bell },
34
- { id: 'feature-flags', label: 'Flags', icon: Flag },
35
- { id: 'database', label: 'Database', icon: Database },
36
- ];
37
26
  function useSaveIndicator() {
38
27
  const [isPending, startTransition] = useTransition();
39
28
  const [showSaved, setShowSaved] = useState(false);
@@ -56,51 +45,21 @@ function useSaveIndicator() {
56
45
  }, [startTransition]);
57
46
  return { isPending, showSaved, save };
58
47
  }
59
- /* ── Reusable row components ── */
60
- function SettingsRow({ label, description, htmlFor, children, }) {
61
- return (_jsxs("div", { className: "flex items-center justify-between gap-4 border-b py-2.5 last:border-b-0", children: [_jsxs("div", { className: "min-w-0", children: [_jsx(Label, { htmlFor: htmlFor, className: "cursor-pointer text-sm font-normal whitespace-nowrap", children: label }), description ? (_jsx("p", { className: "text-muted-foreground text-[11px] leading-tight", children: description })) : null] }), _jsx("div", { className: "flex shrink-0 items-center gap-2", children: children })] }));
62
- }
63
- function SwitchRow({ label, description, id, testId, checked, onChange, }) {
64
- return (_jsx(SettingsRow, { label: label, description: description, htmlFor: id, children: _jsx(Switch, { id: id, "data-testid": testId, checked: checked, onCheckedChange: onChange, className: "cursor-pointer" }) }));
65
- }
66
- /* ── Section card wrapper ── */
67
- function SettingsSection({ icon: Icon, title, description, badge, testId, children, }) {
68
- return (_jsxs("div", { className: "bg-background rounded-lg border", "data-testid": testId, children: [_jsxs("div", { className: "bg-muted/30 border-b px-4 py-3", children: [_jsxs("div", { className: "flex items-center gap-2", children: [_jsx(Icon, { className: "text-muted-foreground h-3.5 w-3.5" }), _jsx("h2", { className: "text-sm font-semibold", children: title }), badge ? (_jsx("span", { className: "bg-muted text-muted-foreground rounded px-1.5 py-0.5 text-[9px] font-medium tracking-wider uppercase", children: badge })) : null] }), _jsx("p", { className: "text-muted-foreground mt-0.5 text-[11px]", children: description })] }), _jsx("div", { className: "px-4", children: children })] }));
48
+ function SettingsRow({ label, htmlFor, children, }) {
49
+ return (_jsxs("div", { className: "flex items-center justify-between gap-4 border-b py-3 last:border-b-0", children: [_jsx(Label, { htmlFor: htmlFor, className: "cursor-pointer text-sm font-normal whitespace-nowrap", children: label }), _jsx("div", { className: "flex items-center gap-2", children: children })] }));
69
50
  }
70
- function NumberStepper({ id, testId, value, onChange, onBlur, placeholder, min = 1, max, step = 1, suffix, }) {
71
- const numValue = value === '' ? undefined : parseInt(value, 10);
72
- const decrement = () => {
73
- const current = numValue ?? parseInt(placeholder, 10);
74
- const next = Math.max(min, current - step);
75
- onChange(String(next));
76
- };
77
- const increment = () => {
78
- const current = numValue ?? parseInt(placeholder, 10);
79
- const next = max != null ? Math.min(max, current + step) : current + step;
80
- onChange(String(next));
81
- };
82
- return (_jsxs("div", { className: "flex items-center gap-1.5", children: [_jsxs("div", { className: "flex items-center overflow-hidden rounded-md border", children: [_jsx("button", { type: "button", onClick: () => {
83
- decrement();
84
- }, onMouseUp: onBlur, className: "text-muted-foreground hover:bg-muted hover:text-foreground flex h-8 w-7 cursor-pointer items-center justify-center border-r transition-colors", "aria-label": "Decrease", children: _jsx(Minus, { className: "h-3 w-3" }) }), _jsx("input", { id: id, "data-testid": testId, type: "text", inputMode: "numeric", pattern: "[0-9]*", value: value, placeholder: placeholder, onChange: (e) => {
85
- const v = e.target.value.replace(/[^0-9]/g, '');
86
- onChange(v);
87
- }, onBlur: onBlur, className: "h-8 w-14 bg-transparent text-center text-xs outline-none" }), _jsx("button", { type: "button", onClick: () => {
88
- increment();
89
- }, onMouseUp: onBlur, className: "text-muted-foreground hover:bg-muted hover:text-foreground flex h-8 w-7 cursor-pointer items-center justify-center border-l transition-colors", "aria-label": "Increase", children: _jsx(Plus, { className: "h-3 w-3" }) })] }), suffix ? _jsx("span", { className: "text-muted-foreground text-[11px]", children: suffix }) : null] }));
51
+ function SelectRow({ label, id, testId, value, options, onChange, }) {
52
+ return (_jsx(SettingsRow, { label: label, htmlFor: id, children: _jsxs(Select, { value: value, onValueChange: onChange, children: [_jsx(SelectTrigger, { id: id, "data-testid": testId, className: "w-45 cursor-pointer", children: _jsx(SelectValue, {}) }), _jsx(SelectContent, { children: options.map((opt) => (_jsx(SelectItem, { value: opt.value, children: opt.label }, opt.value))) })] }) }));
90
53
  }
91
- function SubsectionLabel({ children }) {
92
- return (_jsx("div", { className: "border-b pt-3 pb-1", children: _jsx("span", { className: "text-muted-foreground text-[10px] font-semibold tracking-wider uppercase", children: children }) }));
54
+ function SwitchRow({ label, id, testId, checked, onChange, }) {
55
+ return (_jsx(SettingsRow, { label: label, htmlFor: id, children: _jsx(Switch, { id: id, "data-testid": testId, checked: checked, onCheckedChange: onChange, className: "cursor-pointer" }) }));
93
56
  }
94
- function SectionHint({ children, links, }) {
95
- 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] }));
96
- }
97
- /* ── Main component ── */
98
57
  export function SettingsPageClient({ settings, shepHome, dbFileSize }) {
99
58
  const { isPending, showSaved, save } = useSaveIndicator();
100
59
  const featureFlags = settings.featureFlags ?? { skills: false, envDeploy: false, debug: false };
101
60
  // Agent state
102
61
  const [agentType, setAgentType] = useState(settings.agent.type);
103
- const authMethod = settings.agent.authMethod;
62
+ const [authMethod, setAuthMethod] = useState(settings.agent.authMethod);
104
63
  const [token, setToken] = useState(settings.agent.token ?? '');
105
64
  const [showToken, setShowToken] = useState(false);
106
65
  // Environment state
@@ -174,182 +133,99 @@ export function SettingsPageClient({ settings, shepHome, dbFileSize }) {
174
133
  },
175
134
  };
176
135
  }
177
- const [activeSection, setActiveSection] = useState('agent');
178
- // Track which section is in view via IntersectionObserver
179
- useEffect(() => {
180
- const els = SECTIONS.map((s) => document.getElementById(`section-${s.id}`)).filter(Boolean);
181
- if (els.length === 0)
182
- return;
183
- const observer = new IntersectionObserver((entries) => {
184
- for (const entry of entries) {
185
- if (entry.isIntersecting) {
186
- setActiveSection(entry.target.id.replace('section-', ''));
187
- }
188
- }
189
- }, { rootMargin: '-20% 0px -60% 0px', threshold: 0 });
190
- for (const el of els)
191
- observer.observe(el);
192
- return () => observer.disconnect();
193
- }, []);
194
- const scrollToSection = useCallback((id) => {
195
- const el = document.getElementById(`section-${id}`);
196
- if (!el)
197
- return;
198
- el.scrollIntoView({ behavior: 'smooth', block: 'start' });
199
- // Flash highlight
200
- el.style.animation = 'none';
201
- // Force reflow
202
- void el.offsetHeight;
203
- el.style.animation = 'section-flash 1s ease-out';
204
- }, []);
205
- return (_jsxs("div", { "data-testid": "settings-page-client", className: "max-w-5xl", children: [_jsxs("div", { className: "mb-4 flex items-center gap-3", children: [_jsx("h1", { className: "text-sm font-bold tracking-tight", children: "Settings" }), _jsx("nav", { className: "flex items-center gap-0.5", children: SECTIONS.map((s) => {
206
- const SectionIcon = s.icon;
207
- const isActive = activeSection === s.id;
208
- return (_jsxs("button", { type: "button", onClick: () => scrollToSection(s.id), className: cn('flex cursor-pointer items-center gap-1 rounded-md px-1.5 py-1 text-[11px] transition-all', isActive
209
- ? 'bg-accent text-foreground font-medium'
210
- : 'text-muted-foreground/60 hover:text-foreground hover:bg-accent/50'), children: [_jsx(SectionIcon, { className: "h-3 w-3" }), _jsx("span", { className: "hidden sm:inline", children: s.label })] }, s.id));
211
- }) }), isPending ? (_jsx("span", { className: "text-muted-foreground ml-auto text-xs", children: "Saving..." })) : null, showSaved && !isPending ? (_jsxs("span", { className: "ml-auto flex items-center gap-1 text-xs text-green-600", children: [_jsx(Check, { className: "h-3 w-3" }), "Saved"] })) : null] }), _jsxs("div", { className: "flex flex-col gap-3", children: [_jsxs("div", { id: "section-agent", className: "grid scroll-mt-6 grid-cols-1 gap-x-5 rounded-lg lg:grid-cols-[1fr_280px]", children: [_jsxs(SettingsSection, { icon: Bot, title: "Agent", description: "AI coding agent and authentication", testId: "agent-settings-section", children: [_jsx(SettingsRow, { label: "Agent & Model", description: "Provider and model for all operations", htmlFor: "agent-model-picker", children: _jsx(AgentModelPicker, { initialAgentType: agentType, initialModel: settings.models.default, mode: "settings", onAgentModelChange: (newAgent) => setAgentType(newAgent), className: "w-55" }) }), _jsx(SettingsRow, { label: "Authentication", description: "How the agent authenticates", htmlFor: "auth-method", children: _jsx(TooltipProvider, { children: _jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx("div", { children: _jsxs(Select, { value: authMethod, disabled: true, children: [_jsx(SelectTrigger, { id: "auth-method", "data-testid": "auth-method-select", className: "w-55 cursor-not-allowed text-xs opacity-60", children: _jsx(SelectValue, {}) }), _jsx(SelectContent, { children: AUTH_METHOD_OPTIONS.map((opt) => (_jsx(SelectItem, { value: opt.value, children: opt.label }, opt.value))) })] }) }) }), _jsx(TooltipContent, { children: "Coming soon" })] }) }) }), authMethod === AgentAuthMethod.Token && (_jsx(SettingsRow, { label: "API Token", htmlFor: "agent-token", children: _jsxs("div", { className: "relative w-45", children: [_jsx(Input, { id: "agent-token", "data-testid": "agent-token-input", type: showToken ? 'text' : 'password', value: token, onChange: (e) => setToken(e.target.value), onBlur: () => {
212
- if (token !== (settings.agent.token ?? '')) {
213
- save(buildAgentPayload({ token }));
214
- }
215
- }, placeholder: "Enter token", className: "pr-8" }), _jsx(Button, { type: "button", variant: "ghost", size: "sm", className: "absolute top-0 right-0 h-full px-2 hover:bg-transparent", onClick: () => setShowToken(!showToken), "data-testid": "toggle-token-visibility", "aria-label": showToken ? 'Hide token' : 'Show token', children: showToken ? _jsx(EyeOff, { className: "h-3 w-3" }) : _jsx(Eye, { className: "h-3 w-3" }) })] }) }))] }), _jsx(SectionHint, { links: [
216
- {
217
- label: 'Agent system',
218
- href: 'https://github.com/shep-ai/cli/blob/main/docs/architecture/agent-system.md',
219
- },
220
- {
221
- label: 'Adding agents',
222
- href: 'https://github.com/shep-ai/cli/blob/main/docs/development/adding-agents.md',
223
- },
224
- {
225
- label: 'Configuration guide',
226
- href: 'https://github.com/shep-ai/cli/blob/main/docs/guides/configuration.md',
227
- },
228
- ], 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-6 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) => {
229
- setEditor(v);
230
- save({
231
- environment: { defaultEditor: v, shellPreference: shell },
232
- });
233
- }, 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) => {
234
- const Icon = getEditorTypeIcon(opt.value);
235
- 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));
236
- }) })] }) }) }), _jsx(SectionHint, { links: [
237
- {
238
- label: 'Configuration guide',
239
- href: 'https://github.com/shep-ai/cli/blob/main/docs/guides/configuration.md',
240
- },
241
- ], 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-6 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(SwitchRow, { label: "Auto-approve PRD", description: "Skip manual review of requirements", id: "allow-prd", testId: "switch-allow-prd", checked: allowPrd, onChange: (v) => {
242
- setAllowPrd(v);
243
- save(buildWorkflowPayload({ allowPrd: v }));
244
- } }), _jsx(SwitchRow, { label: "Auto-approve Plan", description: "Skip manual review of implementation plan", id: "allow-plan", testId: "switch-allow-plan", checked: allowPlan, onChange: (v) => {
245
- setAllowPlan(v);
246
- save(buildWorkflowPayload({ allowPlan: v }));
247
- } }), _jsx(SwitchRow, { label: "Auto-approve Merge", description: "Merge without manual review", id: "allow-merge", testId: "switch-allow-merge", checked: allowMerge, onChange: (v) => {
248
- setAllowMerge(v);
249
- save(buildWorkflowPayload({ allowMerge: v }));
250
- } }), _jsx(SwitchRow, { label: "Push on complete", description: "Push to remote when implementation finishes", id: "push-on-complete", testId: "switch-push-on-complete", checked: pushOnComplete, onChange: (v) => {
251
- setPushOnComplete(v);
252
- save(buildWorkflowPayload({ pushOnComplete: v }));
253
- } }), _jsx(SwitchRow, { label: "Open PR on complete", description: "Create a pull request when done", id: "open-pr", testId: "switch-open-pr", checked: openPr, onChange: (v) => {
254
- setOpenPr(v);
255
- save(buildWorkflowPayload({ openPr: v }));
256
- } })] }), _jsx(SectionHint, { links: [
257
- {
258
- label: 'Approval gates',
259
- href: 'https://github.com/shep-ai/cli/blob/main/specs/016-hitl-approval-gates/spec.yaml',
260
- },
261
- {
262
- label: 'Push & PR flags',
263
- href: 'https://github.com/shep-ai/cli/blob/main/specs/037-feature-pr-push-flags/spec.yaml',
264
- },
265
- ], children: "Control how autonomous each feature run is. Auto-approve skips the human review pause at each phase. Push and PR options control what happens after successful implementation." })] }), _jsxs("div", { id: "section-ci", className: "grid scroll-mt-6 grid-cols-1 gap-x-5 rounded-lg lg:grid-cols-[1fr_280px]", children: [_jsxs(SettingsSection, { icon: Activity, title: "Continuous Integration", description: "Limits and timeouts for CI monitoring", testId: "ci-settings-section", children: [_jsx(SettingsRow, { label: "Max fix attempts", description: "Agent retries on failing CI", htmlFor: "ci-max-fix", children: _jsx(NumberStepper, { id: "ci-max-fix", testId: "ci-max-fix-input", placeholder: "3", value: ciMaxFix, onChange: setCiMaxFix, onBlur: () => {
266
- if (ciMaxFix !== originalCiMaxFix)
267
- save(buildWorkflowPayload({ ciMaxFix }));
268
- }, min: 1, max: 10 }) }), _jsx(SettingsRow, { label: "Watch timeout", description: "Max wait for CI completion", htmlFor: "ci-timeout", children: _jsx(NumberStepper, { id: "ci-timeout", testId: "ci-timeout-input", placeholder: "300", value: ciTimeout, onChange: setCiTimeout, onBlur: () => {
269
- if (ciTimeout !== originalCiTimeout)
270
- save(buildWorkflowPayload({ ciTimeout }));
271
- }, 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: () => {
272
- if (ciLogMax !== originalCiLogMax)
273
- save(buildWorkflowPayload({ ciLogMax }));
274
- }, min: 1000, step: 5000, suffix: "chars" }) })] }), _jsx(SectionHint, { links: [
275
- {
276
- label: 'CI/CD pipeline',
277
- href: 'https://github.com/shep-ai/cli/blob/main/docs/development/cicd.md',
278
- },
279
- {
280
- label: 'CI security gates',
281
- href: 'https://github.com/shep-ai/cli/blob/main/specs/003-cicd-security-gates/spec.md',
282
- },
283
- ], children: "When a feature completes, the agent can watch CI and auto-fix failures. These limits prevent runaway retries and control how much log output is sent to the agent for analysis." })] }), _jsxs("div", { id: "section-notifications", className: "grid scroll-mt-6 grid-cols-1 gap-x-5 rounded-lg lg:grid-cols-[1fr_280px]", children: [_jsxs(SettingsSection, { icon: Bell, title: "Notifications", description: "How and when you get notified", testId: "notification-settings-section", children: [_jsx(SubsectionLabel, { children: "Channels" }), _jsx(SwitchRow, { label: "In-app", description: "Notifications inside the Shep UI", id: "notif-in-app", testId: "switch-in-app", checked: inApp, onChange: (v) => {
284
- setInApp(v);
285
- save(buildNotificationPayload({ inApp: v }));
286
- } }), _jsx(SwitchRow, { label: "Browser", description: "Push notifications via the browser", id: "notif-browser", testId: "switch-browser", checked: browser, onChange: (v) => {
287
- setBrowser(v);
288
- save(buildNotificationPayload({ browser: v }));
289
- } }), _jsx(SwitchRow, { label: "Desktop", description: "Native OS notifications", id: "notif-desktop", testId: "switch-desktop", checked: desktop, onChange: (v) => {
290
- setDesktop(v);
291
- save(buildNotificationPayload({ desktop: v }));
292
- } }), _jsx(SubsectionLabel, { children: "Agent Events" }), _jsx(SwitchRow, { label: "Agent started", id: "notif-event-agentStarted", testId: "switch-event-agentStarted", checked: events.agentStarted, onChange: (v) => {
293
- const newEvents = { ...events, agentStarted: v };
294
- setEvents(newEvents);
295
- save(buildNotificationPayload({ events: newEvents }));
296
- } }), _jsx(SwitchRow, { label: "Phase completed", id: "notif-event-phaseCompleted", testId: "switch-event-phaseCompleted", checked: events.phaseCompleted, onChange: (v) => {
297
- const newEvents = { ...events, phaseCompleted: v };
298
- setEvents(newEvents);
299
- save(buildNotificationPayload({ events: newEvents }));
300
- } }), _jsx(SwitchRow, { label: "Waiting approval", id: "notif-event-waitingApproval", testId: "switch-event-waitingApproval", checked: events.waitingApproval, onChange: (v) => {
301
- const newEvents = { ...events, waitingApproval: v };
302
- setEvents(newEvents);
303
- save(buildNotificationPayload({ events: newEvents }));
304
- } }), _jsx(SwitchRow, { label: "Agent completed", id: "notif-event-agentCompleted", testId: "switch-event-agentCompleted", checked: events.agentCompleted, onChange: (v) => {
305
- const newEvents = { ...events, agentCompleted: v };
306
- setEvents(newEvents);
307
- save(buildNotificationPayload({ events: newEvents }));
308
- } }), _jsx(SwitchRow, { label: "Agent failed", id: "notif-event-agentFailed", testId: "switch-event-agentFailed", checked: events.agentFailed, onChange: (v) => {
309
- const newEvents = { ...events, agentFailed: v };
310
- setEvents(newEvents);
311
- save(buildNotificationPayload({ events: newEvents }));
312
- } }), _jsx(SubsectionLabel, { children: "Pull Request Events" }), _jsx(SwitchRow, { label: "PR merged", id: "notif-event-prMerged", testId: "switch-event-prMerged", checked: events.prMerged, onChange: (v) => {
313
- const newEvents = { ...events, prMerged: v };
314
- setEvents(newEvents);
315
- save(buildNotificationPayload({ events: newEvents }));
316
- } }), _jsx(SwitchRow, { label: "PR closed", id: "notif-event-prClosed", testId: "switch-event-prClosed", checked: events.prClosed, onChange: (v) => {
317
- const newEvents = { ...events, prClosed: v };
318
- setEvents(newEvents);
319
- save(buildNotificationPayload({ events: newEvents }));
320
- } }), _jsx(SwitchRow, { label: "PR checks passed", id: "notif-event-prChecksPassed", testId: "switch-event-prChecksPassed", checked: events.prChecksPassed, onChange: (v) => {
321
- const newEvents = { ...events, prChecksPassed: v };
322
- setEvents(newEvents);
323
- save(buildNotificationPayload({ events: newEvents }));
324
- } }), _jsx(SwitchRow, { label: "PR checks failed", id: "notif-event-prChecksFailed", testId: "switch-event-prChecksFailed", checked: events.prChecksFailed, onChange: (v) => {
325
- const newEvents = { ...events, prChecksFailed: v };
326
- setEvents(newEvents);
327
- save(buildNotificationPayload({ events: newEvents }));
328
- } })] }), _jsx(SectionHint, { links: [
329
- {
330
- label: 'Notification system',
331
- href: 'https://github.com/shep-ai/cli/blob/main/specs/021-agent-notifications/spec.yaml',
332
- },
333
- ], children: "Three notification channels keep you in the loop: in-app toasts, browser push notifications, and native desktop alerts. Fine-tune which agent lifecycle events trigger a notification." })] }), _jsxs("div", { id: "section-feature-flags", className: "grid scroll-mt-6 grid-cols-1 gap-x-5 rounded-lg lg:grid-cols-[1fr_280px]", children: [_jsxs(SettingsSection, { icon: Flag, title: "Feature Flags", description: "Enable or disable experimental features", badge: "Experimental", testId: "feature-flags-settings-section", children: [_jsx(SwitchRow, { label: "Skills", description: "Enable the skills system for agent capabilities", id: "flag-skills", testId: "switch-flag-skills", checked: flags.skills, onChange: (v) => {
334
- const newFlags = { ...flags, skills: v };
335
- setFlags(newFlags);
336
- save({ featureFlags: newFlags });
337
- } }), _jsx(SwitchRow, { label: "Deployments", description: "Enable environment deployment workflows", id: "flag-envDeploy", testId: "switch-flag-envDeploy", checked: flags.envDeploy, onChange: (v) => {
338
- const newFlags = { ...flags, envDeploy: v };
339
- setFlags(newFlags);
340
- save({ featureFlags: newFlags });
341
- } }), _jsx(SwitchRow, { label: "Debug", description: "Show debug panels and verbose logging", id: "flag-debug", testId: "switch-flag-debug", checked: flags.debug, onChange: (v) => {
342
- const newFlags = { ...flags, debug: v };
343
- setFlags(newFlags);
344
- save({ featureFlags: newFlags });
345
- } })] }), _jsx(SectionHint, { children: "Experimental features that are still under development. Enable at your own risk \u2014 they may change or be removed in future versions. Debug mode adds verbose logging useful for troubleshooting." })] }), _jsxs("div", { id: "section-database", className: "grid scroll-mt-6 grid-cols-1 gap-x-5 rounded-lg lg:grid-cols-[1fr_280px]", children: [_jsxs(SettingsSection, { icon: Database, title: "Database", description: "Local storage information", testId: "database-settings-section", children: [_jsx(SettingsRow, { label: "Location", description: "Path to the local SQLite database", children: _jsx("span", { className: "text-muted-foreground max-w-50 truncate font-mono text-xs", "data-testid": "shep-home-path", children: shepHome }) }), _jsx(SettingsRow, { label: "Size", children: _jsx("span", { className: "text-muted-foreground text-xs", "data-testid": "db-file-size", children: dbFileSize }) })] }), _jsx(SectionHint, { links: [
346
- {
347
- label: 'Settings service',
348
- href: 'https://github.com/shep-ai/cli/blob/main/docs/architecture/settings-service.md',
349
- },
350
- {
351
- label: 'Settings spec',
352
- href: 'https://github.com/shep-ai/cli/blob/main/specs/005-global-settings-service/spec.md',
353
- },
354
- ], children: "All settings are stored in a local SQLite database at ~/.shep/data. The database uses a singleton record pattern with automatic migrations on startup." })] })] })] }));
136
+ return (_jsxs("div", { "data-testid": "settings-page-client", className: "max-w-lg", children: [_jsxs("div", { className: "flex items-center justify-between border-b pb-3", children: [_jsx("h1", { className: "text-sm font-bold tracking-tight", children: "Settings" }), 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] }), _jsxs("div", { children: [_jsx("h2", { className: "text-muted-foreground mt-6 mb-1 text-xs font-medium tracking-wide uppercase", "data-testid": "agent-settings-section", children: "Agent" }), _jsx(SettingsRow, { label: "Agent & Model", htmlFor: "agent-model-picker", children: _jsx(AgentModelPicker, { initialAgentType: agentType, initialModel: settings.models.default, mode: "settings", onAgentModelChange: (newAgent) => setAgentType(newAgent), className: "w-45" }) }), _jsx(SelectRow, { label: "Authentication", id: "auth-method", testId: "auth-method-select", value: authMethod, options: AUTH_METHOD_OPTIONS, onChange: (v) => {
137
+ setAuthMethod(v);
138
+ save(buildAgentPayload({ authMethod: v }));
139
+ } }), authMethod === AgentAuthMethod.Token && (_jsx(SettingsRow, { label: "API Token", htmlFor: "agent-token", children: _jsxs("div", { className: "relative w-45", children: [_jsx(Input, { id: "agent-token", "data-testid": "agent-token-input", type: showToken ? 'text' : 'password', value: token, onChange: (e) => setToken(e.target.value), onBlur: () => {
140
+ if (token !== (settings.agent.token ?? '')) {
141
+ save(buildAgentPayload({ token }));
142
+ }
143
+ }, placeholder: "Enter token", className: "pr-8" }), _jsx(Button, { type: "button", variant: "ghost", size: "sm", className: "absolute top-0 right-0 h-full px-2 hover:bg-transparent", onClick: () => setShowToken(!showToken), "data-testid": "toggle-token-visibility", "aria-label": showToken ? 'Hide token' : 'Show token', children: showToken ? _jsx(EyeOff, { className: "h-3 w-3" }) : _jsx(Eye, { className: "h-3 w-3" }) })] }) })), _jsx("h2", { className: "text-muted-foreground mt-6 mb-1 text-xs font-medium tracking-wide uppercase", "data-testid": "environment-settings-section", children: "Environment" }), _jsx(SettingsRow, { label: "Editor", htmlFor: "default-editor", children: _jsxs(Select, { value: editor, onValueChange: (v) => {
144
+ setEditor(v);
145
+ save({ environment: { defaultEditor: v, shellPreference: shell } });
146
+ }, children: [_jsx(SelectTrigger, { id: "default-editor", "data-testid": "editor-select", className: "w-45 cursor-pointer", children: _jsx(SelectValue, {}) }), _jsx(SelectContent, { children: EDITOR_OPTIONS.map((opt) => {
147
+ const Icon = getEditorTypeIcon(opt.value);
148
+ return (_jsx(SelectItem, { value: opt.value, children: _jsxs("span", { className: "flex items-center gap-2", children: [_jsx(Icon, { className: "h-4 w-4 shrink-0" }), opt.label] }) }, opt.value));
149
+ }) })] }) }), _jsx("h2", { className: "text-muted-foreground mt-6 mb-1 text-xs font-medium tracking-wide uppercase", "data-testid": "workflow-settings-section", children: "Workflow" }), _jsx(SwitchRow, { label: "Open PR on complete", id: "open-pr", testId: "switch-open-pr", checked: openPr, onChange: (v) => {
150
+ setOpenPr(v);
151
+ save(buildWorkflowPayload({ openPr: v }));
152
+ } }), _jsx(SwitchRow, { label: "Push on complete", id: "push-on-complete", testId: "switch-push-on-complete", checked: pushOnComplete, onChange: (v) => {
153
+ setPushOnComplete(v);
154
+ save(buildWorkflowPayload({ pushOnComplete: v }));
155
+ } }), _jsx(SwitchRow, { label: "Auto-approve PRD", id: "allow-prd", testId: "switch-allow-prd", checked: allowPrd, onChange: (v) => {
156
+ setAllowPrd(v);
157
+ save(buildWorkflowPayload({ allowPrd: v }));
158
+ } }), _jsx(SwitchRow, { label: "Auto-approve Plan", id: "allow-plan", testId: "switch-allow-plan", checked: allowPlan, onChange: (v) => {
159
+ setAllowPlan(v);
160
+ save(buildWorkflowPayload({ allowPlan: v }));
161
+ } }), _jsx(SwitchRow, { label: "Auto-approve Merge", id: "allow-merge", testId: "switch-allow-merge", checked: allowMerge, onChange: (v) => {
162
+ setAllowMerge(v);
163
+ save(buildWorkflowPayload({ allowMerge: v }));
164
+ } }), _jsx("h2", { className: "text-muted-foreground mt-6 mb-1 text-xs font-medium tracking-wide uppercase", "data-testid": "ci-settings-section", children: "CI" }), _jsx(SettingsRow, { label: "Max fix attempts", htmlFor: "ci-max-fix", children: _jsx(Input, { id: "ci-max-fix", "data-testid": "ci-max-fix-input", type: "text", inputMode: "numeric", pattern: "[0-9]*", placeholder: "3", value: ciMaxFix, onChange: (e) => setCiMaxFix(e.target.value), onBlur: () => {
165
+ if (ciMaxFix !== originalCiMaxFix)
166
+ save(buildWorkflowPayload({ ciMaxFix }));
167
+ }, className: "w-20" }) }), _jsx(SettingsRow, { label: "Watch timeout (s)", htmlFor: "ci-timeout", children: _jsx(Input, { id: "ci-timeout", "data-testid": "ci-timeout-input", type: "text", inputMode: "numeric", pattern: "[0-9]*", placeholder: "300", value: ciTimeout, onChange: (e) => setCiTimeout(e.target.value), onBlur: () => {
168
+ if (ciTimeout !== originalCiTimeout)
169
+ save(buildWorkflowPayload({ ciTimeout }));
170
+ }, className: "w-20" }) }), _jsx(SettingsRow, { label: "Max log chars", htmlFor: "ci-log-max", children: _jsx(Input, { id: "ci-log-max", "data-testid": "ci-log-max-input", type: "text", inputMode: "numeric", pattern: "[0-9]*", placeholder: "50000", value: ciLogMax, onChange: (e) => setCiLogMax(e.target.value), onBlur: () => {
171
+ if (ciLogMax !== originalCiLogMax)
172
+ save(buildWorkflowPayload({ ciLogMax }));
173
+ }, className: "w-20" }) }), _jsx("h2", { className: "text-muted-foreground mt-6 mb-1 text-xs font-medium tracking-wide uppercase", "data-testid": "notification-settings-section", children: "Notifications" }), _jsx(SwitchRow, { label: "In-app", id: "notif-in-app", testId: "switch-in-app", checked: inApp, onChange: (v) => {
174
+ setInApp(v);
175
+ save(buildNotificationPayload({ inApp: v }));
176
+ } }), _jsx(SwitchRow, { label: "Browser", id: "notif-browser", testId: "switch-browser", checked: browser, onChange: (v) => {
177
+ setBrowser(v);
178
+ save(buildNotificationPayload({ browser: v }));
179
+ } }), _jsx(SwitchRow, { label: "Desktop", id: "notif-desktop", testId: "switch-desktop", checked: desktop, onChange: (v) => {
180
+ setDesktop(v);
181
+ save(buildNotificationPayload({ desktop: v }));
182
+ } }), _jsx(SwitchRow, { label: "Agent started", id: "notif-event-agentStarted", testId: "switch-event-agentStarted", checked: events.agentStarted, onChange: (v) => {
183
+ const newEvents = { ...events, agentStarted: v };
184
+ setEvents(newEvents);
185
+ save(buildNotificationPayload({ events: newEvents }));
186
+ } }), _jsx(SwitchRow, { label: "Phase completed", id: "notif-event-phaseCompleted", testId: "switch-event-phaseCompleted", checked: events.phaseCompleted, onChange: (v) => {
187
+ const newEvents = { ...events, phaseCompleted: v };
188
+ setEvents(newEvents);
189
+ save(buildNotificationPayload({ events: newEvents }));
190
+ } }), _jsx(SwitchRow, { label: "Waiting approval", id: "notif-event-waitingApproval", testId: "switch-event-waitingApproval", checked: events.waitingApproval, onChange: (v) => {
191
+ const newEvents = { ...events, waitingApproval: v };
192
+ setEvents(newEvents);
193
+ save(buildNotificationPayload({ events: newEvents }));
194
+ } }), _jsx(SwitchRow, { label: "Agent completed", id: "notif-event-agentCompleted", testId: "switch-event-agentCompleted", checked: events.agentCompleted, onChange: (v) => {
195
+ const newEvents = { ...events, agentCompleted: v };
196
+ setEvents(newEvents);
197
+ save(buildNotificationPayload({ events: newEvents }));
198
+ } }), _jsx(SwitchRow, { label: "Agent failed", id: "notif-event-agentFailed", testId: "switch-event-agentFailed", checked: events.agentFailed, onChange: (v) => {
199
+ const newEvents = { ...events, agentFailed: v };
200
+ setEvents(newEvents);
201
+ save(buildNotificationPayload({ events: newEvents }));
202
+ } }), _jsx(SwitchRow, { label: "PR merged", id: "notif-event-prMerged", testId: "switch-event-prMerged", checked: events.prMerged, onChange: (v) => {
203
+ const newEvents = { ...events, prMerged: v };
204
+ setEvents(newEvents);
205
+ save(buildNotificationPayload({ events: newEvents }));
206
+ } }), _jsx(SwitchRow, { label: "PR closed", id: "notif-event-prClosed", testId: "switch-event-prClosed", checked: events.prClosed, onChange: (v) => {
207
+ const newEvents = { ...events, prClosed: v };
208
+ setEvents(newEvents);
209
+ save(buildNotificationPayload({ events: newEvents }));
210
+ } }), _jsx(SwitchRow, { label: "PR checks passed", id: "notif-event-prChecksPassed", testId: "switch-event-prChecksPassed", checked: events.prChecksPassed, onChange: (v) => {
211
+ const newEvents = { ...events, prChecksPassed: v };
212
+ setEvents(newEvents);
213
+ save(buildNotificationPayload({ events: newEvents }));
214
+ } }), _jsx(SwitchRow, { label: "PR checks failed", id: "notif-event-prChecksFailed", testId: "switch-event-prChecksFailed", checked: events.prChecksFailed, onChange: (v) => {
215
+ const newEvents = { ...events, prChecksFailed: v };
216
+ setEvents(newEvents);
217
+ save(buildNotificationPayload({ events: newEvents }));
218
+ } }), _jsx("h2", { className: "text-muted-foreground mt-6 mb-1 text-xs font-medium tracking-wide uppercase", "data-testid": "feature-flags-settings-section", children: "Feature Flags" }), _jsx(SwitchRow, { label: "Skills", id: "flag-skills", testId: "switch-flag-skills", checked: flags.skills, onChange: (v) => {
219
+ const newFlags = { ...flags, skills: v };
220
+ setFlags(newFlags);
221
+ save({ featureFlags: newFlags });
222
+ } }), _jsx(SwitchRow, { label: "Deployments", id: "flag-envDeploy", testId: "switch-flag-envDeploy", checked: flags.envDeploy, onChange: (v) => {
223
+ const newFlags = { ...flags, envDeploy: v };
224
+ setFlags(newFlags);
225
+ save({ featureFlags: newFlags });
226
+ } }), _jsx(SwitchRow, { label: "Debug", id: "flag-debug", testId: "switch-flag-debug", checked: flags.debug, onChange: (v) => {
227
+ const newFlags = { ...flags, debug: v };
228
+ setFlags(newFlags);
229
+ save({ featureFlags: newFlags });
230
+ } }), _jsx("h2", { className: "text-muted-foreground mt-6 mb-1 text-xs font-medium tracking-wide uppercase", "data-testid": "database-settings-section", children: "Database" }), _jsx(SettingsRow, { label: "Location", children: _jsx("span", { className: "text-muted-foreground max-w-50 truncate font-mono text-xs", "data-testid": "shep-home-path", children: shepHome }) }), _jsx(SettingsRow, { label: "Size", children: _jsx("span", { className: "text-muted-foreground text-xs", "data-testid": "db-file-size", children: dbFileSize }) })] })] }));
355
231
  }