@shepai/cli 1.181.0 → 1.182.0-pr512.369be8e

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 (386) hide show
  1. package/apis/json-schema/MessagingCommand.yaml +28 -0
  2. package/apis/json-schema/MessagingCommandType.yaml +17 -0
  3. package/apis/json-schema/MessagingConfig.yaml +40 -0
  4. package/apis/json-schema/MessagingFrameType.yaml +8 -0
  5. package/apis/json-schema/MessagingNotification.yaml +22 -0
  6. package/apis/json-schema/MessagingPlatform.yaml +7 -0
  7. package/apis/json-schema/MessagingPlatformConfig.yaml +38 -0
  8. package/apis/json-schema/Settings.yaml +3 -0
  9. package/dist/packages/core/src/application/ports/output/services/gateway-client.interface.d.ts +58 -0
  10. package/dist/packages/core/src/application/ports/output/services/gateway-client.interface.d.ts.map +1 -0
  11. package/dist/packages/core/src/application/ports/output/services/gateway-client.interface.js +10 -0
  12. package/dist/packages/core/src/application/ports/output/services/message-sender.interface.d.ts +18 -0
  13. package/dist/packages/core/src/application/ports/output/services/message-sender.interface.d.ts.map +1 -0
  14. package/dist/packages/core/src/application/ports/output/services/message-sender.interface.js +9 -0
  15. package/dist/packages/core/src/application/ports/output/services/messaging-service.interface.d.ts +34 -0
  16. package/dist/packages/core/src/application/ports/output/services/messaging-service.interface.d.ts.map +1 -0
  17. package/dist/packages/core/src/application/ports/output/services/messaging-service.interface.js +12 -0
  18. package/dist/packages/core/src/application/ports/output/services/telegram-client.interface.d.ts +19 -0
  19. package/dist/packages/core/src/application/ports/output/services/telegram-client.interface.d.ts.map +1 -0
  20. package/dist/packages/core/src/application/ports/output/services/telegram-client.interface.js +8 -0
  21. package/dist/packages/core/src/application/use-cases/messaging/begin-pairing.use-case.d.ts +46 -0
  22. package/dist/packages/core/src/application/use-cases/messaging/begin-pairing.use-case.d.ts.map +1 -0
  23. package/dist/packages/core/src/application/use-cases/messaging/begin-pairing.use-case.js +148 -0
  24. package/dist/packages/core/src/application/use-cases/messaging/confirm-pairing.use-case.d.ts +19 -0
  25. package/dist/packages/core/src/application/use-cases/messaging/confirm-pairing.use-case.d.ts.map +1 -0
  26. package/dist/packages/core/src/application/use-cases/messaging/confirm-pairing.use-case.js +63 -0
  27. package/dist/packages/core/src/application/use-cases/messaging/disconnect-messaging.use-case.d.ts +19 -0
  28. package/dist/packages/core/src/application/use-cases/messaging/disconnect-messaging.use-case.d.ts.map +1 -0
  29. package/dist/packages/core/src/application/use-cases/messaging/disconnect-messaging.use-case.js +65 -0
  30. package/dist/packages/core/src/domain/generated/output.d.ts +155 -0
  31. package/dist/packages/core/src/domain/generated/output.d.ts.map +1 -1
  32. package/dist/packages/core/src/domain/generated/output.js +26 -0
  33. package/dist/packages/core/src/infrastructure/di/container.d.ts.map +1 -1
  34. package/dist/packages/core/src/infrastructure/di/container.js +117 -0
  35. package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/settings.mapper.d.ts +24 -0
  36. package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/settings.mapper.d.ts.map +1 -1
  37. package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/settings.mapper.js +117 -0
  38. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/056-add-messaging-remote-control.d.ts +22 -0
  39. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/056-add-messaging-remote-control.d.ts.map +1 -0
  40. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/056-add-messaging-remote-control.js +62 -0
  41. package/dist/packages/core/src/infrastructure/repositories/sqlite-settings.repository.d.ts.map +1 -1
  42. package/dist/packages/core/src/infrastructure/repositories/sqlite-settings.repository.js +43 -3
  43. package/dist/packages/core/src/infrastructure/services/messaging/chat-relay.d.ts +45 -0
  44. package/dist/packages/core/src/infrastructure/services/messaging/chat-relay.d.ts.map +1 -0
  45. package/dist/packages/core/src/infrastructure/services/messaging/chat-relay.js +100 -0
  46. package/dist/packages/core/src/infrastructure/services/messaging/command-executor.d.ts +53 -0
  47. package/dist/packages/core/src/infrastructure/services/messaging/command-executor.d.ts.map +1 -0
  48. package/dist/packages/core/src/infrastructure/services/messaging/command-executor.js +200 -0
  49. package/dist/packages/core/src/infrastructure/services/messaging/content-sanitizer.d.ts +23 -0
  50. package/dist/packages/core/src/infrastructure/services/messaging/content-sanitizer.d.ts.map +1 -0
  51. package/dist/packages/core/src/infrastructure/services/messaging/content-sanitizer.js +39 -0
  52. package/dist/packages/core/src/infrastructure/services/messaging/http-gateway.client.d.ts +19 -0
  53. package/dist/packages/core/src/infrastructure/services/messaging/http-gateway.client.d.ts.map +1 -0
  54. package/dist/packages/core/src/infrastructure/services/messaging/http-gateway.client.js +124 -0
  55. package/dist/packages/core/src/infrastructure/services/messaging/http-telegram.client.d.ts +18 -0
  56. package/dist/packages/core/src/infrastructure/services/messaging/http-telegram.client.d.ts.map +1 -0
  57. package/dist/packages/core/src/infrastructure/services/messaging/http-telegram.client.js +60 -0
  58. package/dist/packages/core/src/infrastructure/services/messaging/messaging-tunnel.adapter.d.ts +68 -0
  59. package/dist/packages/core/src/infrastructure/services/messaging/messaging-tunnel.adapter.d.ts.map +1 -0
  60. package/dist/packages/core/src/infrastructure/services/messaging/messaging-tunnel.adapter.js +262 -0
  61. package/dist/packages/core/src/infrastructure/services/messaging/messaging.service.d.ts +78 -0
  62. package/dist/packages/core/src/infrastructure/services/messaging/messaging.service.d.ts.map +1 -0
  63. package/dist/packages/core/src/infrastructure/services/messaging/messaging.service.js +279 -0
  64. package/dist/packages/core/src/infrastructure/services/messaging/notification-emitter.d.ts +33 -0
  65. package/dist/packages/core/src/infrastructure/services/messaging/notification-emitter.d.ts.map +1 -0
  66. package/dist/packages/core/src/infrastructure/services/messaging/notification-emitter.js +79 -0
  67. package/dist/packages/core/src/infrastructure/services/messaging/stub-gateway.client.d.ts +12 -0
  68. package/dist/packages/core/src/infrastructure/services/messaging/stub-gateway.client.d.ts.map +1 -0
  69. package/dist/packages/core/src/infrastructure/services/messaging/stub-gateway.client.js +26 -0
  70. package/dist/packages/core/src/infrastructure/services/messaging/telegram-message-sender.d.ts +26 -0
  71. package/dist/packages/core/src/infrastructure/services/messaging/telegram-message-sender.d.ts.map +1 -0
  72. package/dist/packages/core/src/infrastructure/services/messaging/telegram-message-sender.js +49 -0
  73. package/dist/packages/core/src/infrastructure/services/messaging/telegram-webhook.parser.d.ts +28 -0
  74. package/dist/packages/core/src/infrastructure/services/messaging/telegram-webhook.parser.d.ts.map +1 -0
  75. package/dist/packages/core/src/infrastructure/services/messaging/telegram-webhook.parser.js +45 -0
  76. package/dist/packages/core/src/infrastructure/services/messaging/tunnel-protocol.d.ts +102 -0
  77. package/dist/packages/core/src/infrastructure/services/messaging/tunnel-protocol.d.ts.map +1 -0
  78. package/dist/packages/core/src/infrastructure/services/messaging/tunnel-protocol.js +16 -0
  79. package/dist/packages/core/src/infrastructure/services/messaging/whatsapp-webhook.parser.d.ts +39 -0
  80. package/dist/packages/core/src/infrastructure/services/messaging/whatsapp-webhook.parser.d.ts.map +1 -0
  81. package/dist/packages/core/src/infrastructure/services/messaging/whatsapp-webhook.parser.js +56 -0
  82. package/dist/src/presentation/cli/commands/_serve.command.d.ts.map +1 -1
  83. package/dist/src/presentation/cli/commands/_serve.command.js +6 -0
  84. package/dist/src/presentation/cli/commands/app/del.command.d.ts +14 -0
  85. package/dist/src/presentation/cli/commands/app/del.command.d.ts.map +1 -0
  86. package/dist/src/presentation/cli/commands/app/del.command.js +58 -0
  87. package/dist/src/presentation/cli/commands/app/index.d.ts +20 -0
  88. package/dist/src/presentation/cli/commands/app/index.d.ts.map +1 -0
  89. package/dist/src/presentation/cli/commands/app/index.js +33 -0
  90. package/dist/src/presentation/cli/commands/app/ls.command.d.ts +11 -0
  91. package/dist/src/presentation/cli/commands/app/ls.command.d.ts.map +1 -0
  92. package/dist/src/presentation/cli/commands/app/ls.command.js +74 -0
  93. package/dist/src/presentation/cli/commands/app/new.command.d.ts +17 -0
  94. package/dist/src/presentation/cli/commands/app/new.command.d.ts.map +1 -0
  95. package/dist/src/presentation/cli/commands/app/new.command.js +58 -0
  96. package/dist/src/presentation/cli/commands/app/resolve-application.d.ts +10 -0
  97. package/dist/src/presentation/cli/commands/app/resolve-application.d.ts.map +1 -0
  98. package/dist/src/presentation/cli/commands/app/resolve-application.js +33 -0
  99. package/dist/src/presentation/cli/commands/app/show.command.d.ts +11 -0
  100. package/dist/src/presentation/cli/commands/app/show.command.d.ts.map +1 -0
  101. package/dist/src/presentation/cli/commands/app/show.command.js +95 -0
  102. package/dist/src/presentation/cli/commands/settings/index.d.ts.map +1 -1
  103. package/dist/src/presentation/cli/commands/settings/index.js +3 -1
  104. package/dist/src/presentation/cli/commands/settings/messaging.command.d.ts +17 -0
  105. package/dist/src/presentation/cli/commands/settings/messaging.command.d.ts.map +1 -0
  106. package/dist/src/presentation/cli/commands/settings/messaging.command.js +187 -0
  107. package/dist/src/presentation/cli/index.js +2 -0
  108. package/dist/src/presentation/web/app/actions/messaging.d.ts +29 -0
  109. package/dist/src/presentation/web/app/actions/messaging.d.ts.map +1 -0
  110. package/dist/src/presentation/web/app/actions/messaging.js +55 -0
  111. package/dist/src/presentation/web/components/features/settings/messaging-settings-section.d.ts +6 -0
  112. package/dist/src/presentation/web/components/features/settings/messaging-settings-section.d.ts.map +1 -0
  113. package/dist/src/presentation/web/components/features/settings/messaging-settings-section.js +206 -0
  114. package/dist/src/presentation/web/components/features/settings/messaging-settings-section.stories.d.ts +17 -0
  115. package/dist/src/presentation/web/components/features/settings/messaging-settings-section.stories.d.ts.map +1 -0
  116. package/dist/src/presentation/web/components/features/settings/messaging-settings-section.stories.js +55 -0
  117. package/dist/src/presentation/web/components/features/settings/settings-page-client.d.ts.map +1 -1
  118. package/dist/src/presentation/web/components/features/settings/settings-page-client.js +9 -2
  119. package/dist/src/presentation/web/dev-server.js +27 -0
  120. package/dist/translations/ar/cli.json +63 -0
  121. package/dist/translations/ar/web.json +2 -1
  122. package/dist/translations/de/cli.json +63 -0
  123. package/dist/translations/de/web.json +2 -1
  124. package/dist/translations/en/cli.json +63 -0
  125. package/dist/translations/en/web.json +13 -12
  126. package/dist/translations/es/cli.json +63 -0
  127. package/dist/translations/es/web.json +2 -1
  128. package/dist/translations/fr/cli.json +63 -0
  129. package/dist/translations/fr/web.json +2 -1
  130. package/dist/translations/he/cli.json +63 -0
  131. package/dist/translations/he/web.json +2 -1
  132. package/dist/translations/pt/cli.json +63 -0
  133. package/dist/translations/pt/web.json +2 -1
  134. package/dist/translations/ru/cli.json +63 -0
  135. package/dist/translations/ru/web.json +2 -1
  136. package/dist/translations/uk/cli.json +63 -0
  137. package/dist/translations/uk/web.json +2 -1
  138. package/dist/tsconfig.build.tsbuildinfo +1 -1
  139. package/package.json +3 -1
  140. package/web/.next/BUILD_ID +1 -1
  141. package/web/.next/build-manifest.json +2 -2
  142. package/web/.next/fallback-build-manifest.json +2 -2
  143. package/web/.next/prerender-manifest.json +3 -3
  144. package/web/.next/required-server-files.js +3 -3
  145. package/web/.next/required-server-files.json +3 -3
  146. package/web/.next/server/app/(dashboard)/@drawer/adopt/page/server-reference-manifest.json +32 -32
  147. package/web/.next/server/app/(dashboard)/@drawer/adopt/page.js.nft.json +1 -1
  148. package/web/.next/server/app/(dashboard)/@drawer/adopt/page_client-reference-manifest.js +1 -1
  149. package/web/.next/server/app/(dashboard)/@drawer/chat/page/server-reference-manifest.json +30 -30
  150. package/web/.next/server/app/(dashboard)/@drawer/chat/page.js.nft.json +1 -1
  151. package/web/.next/server/app/(dashboard)/@drawer/chat/page_client-reference-manifest.js +1 -1
  152. package/web/.next/server/app/(dashboard)/@drawer/create/page/server-reference-manifest.json +33 -33
  153. package/web/.next/server/app/(dashboard)/@drawer/create/page.js.nft.json +1 -1
  154. package/web/.next/server/app/(dashboard)/@drawer/create/page_client-reference-manifest.js +1 -1
  155. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page/server-reference-manifest.json +41 -41
  156. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page.js.nft.json +1 -1
  157. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page_client-reference-manifest.js +1 -1
  158. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page/server-reference-manifest.json +41 -41
  159. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js.nft.json +1 -1
  160. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page_client-reference-manifest.js +1 -1
  161. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/[tab]/page/server-reference-manifest.json +31 -31
  162. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/[tab]/page.js.nft.json +1 -1
  163. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/[tab]/page_client-reference-manifest.js +1 -1
  164. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page/server-reference-manifest.json +31 -31
  165. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js.nft.json +1 -1
  166. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  167. package/web/.next/server/app/(dashboard)/chat/page/server-reference-manifest.json +30 -30
  168. package/web/.next/server/app/(dashboard)/chat/page.js.nft.json +1 -1
  169. package/web/.next/server/app/(dashboard)/chat/page_client-reference-manifest.js +1 -1
  170. package/web/.next/server/app/(dashboard)/create/page/server-reference-manifest.json +33 -33
  171. package/web/.next/server/app/(dashboard)/create/page.js.nft.json +1 -1
  172. package/web/.next/server/app/(dashboard)/create/page_client-reference-manifest.js +1 -1
  173. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page/server-reference-manifest.json +41 -41
  174. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page.js.nft.json +1 -1
  175. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page_client-reference-manifest.js +1 -1
  176. package/web/.next/server/app/(dashboard)/feature/[featureId]/page/server-reference-manifest.json +41 -41
  177. package/web/.next/server/app/(dashboard)/feature/[featureId]/page.js.nft.json +1 -1
  178. package/web/.next/server/app/(dashboard)/feature/[featureId]/page_client-reference-manifest.js +1 -1
  179. package/web/.next/server/app/(dashboard)/page/server-reference-manifest.json +30 -30
  180. package/web/.next/server/app/(dashboard)/page.js.nft.json +1 -1
  181. package/web/.next/server/app/(dashboard)/page_client-reference-manifest.js +1 -1
  182. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/[tab]/page/server-reference-manifest.json +31 -31
  183. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/[tab]/page.js.nft.json +1 -1
  184. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/[tab]/page_client-reference-manifest.js +1 -1
  185. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page/server-reference-manifest.json +31 -31
  186. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js.nft.json +1 -1
  187. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  188. package/web/.next/server/app/_global-error.html +2 -2
  189. package/web/.next/server/app/_global-error.rsc +1 -1
  190. package/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  191. package/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  192. package/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  193. package/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  194. package/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  195. package/web/.next/server/app/_not-found/page/server-reference-manifest.json +7 -7
  196. package/web/.next/server/app/_not-found/page.js.nft.json +1 -1
  197. package/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  198. package/web/.next/server/app/api/attachments/preview/route.js.nft.json +1 -1
  199. package/web/.next/server/app/api/evidence/route.js.nft.json +1 -1
  200. package/web/.next/server/app/api/graph-data/route.js.nft.json +1 -1
  201. package/web/.next/server/app/api/interactive/chat/[featureId]/messages/route.js.nft.json +1 -1
  202. package/web/.next/server/app/application/[id]/page/server-reference-manifest.json +15 -15
  203. package/web/.next/server/app/application/[id]/page.js.nft.json +1 -1
  204. package/web/.next/server/app/application/[id]/page_client-reference-manifest.js +1 -1
  205. package/web/.next/server/app/features/page/server-reference-manifest.json +7 -7
  206. package/web/.next/server/app/features/page.js.nft.json +1 -1
  207. package/web/.next/server/app/features/page_client-reference-manifest.js +1 -1
  208. package/web/.next/server/app/settings/page/server-reference-manifest.json +65 -20
  209. package/web/.next/server/app/settings/page.js +1 -1
  210. package/web/.next/server/app/settings/page.js.nft.json +1 -1
  211. package/web/.next/server/app/settings/page_client-reference-manifest.js +1 -1
  212. package/web/.next/server/app/skills/page/server-reference-manifest.json +15 -15
  213. package/web/.next/server/app/skills/page.js.nft.json +1 -1
  214. package/web/.next/server/app/skills/page_client-reference-manifest.js +1 -1
  215. package/web/.next/server/app/tools/page/server-reference-manifest.json +13 -13
  216. package/web/.next/server/app/tools/page.js.nft.json +1 -1
  217. package/web/.next/server/app/tools/page_client-reference-manifest.js +1 -1
  218. package/web/.next/server/app/version/page/server-reference-manifest.json +7 -7
  219. package/web/.next/server/app/version/page.js.nft.json +1 -1
  220. package/web/.next/server/app/version/page_client-reference-manifest.js +1 -1
  221. package/web/.next/server/chunks/[root-of-the-server]__a402b567._.js +1 -1
  222. package/web/.next/server/chunks/[root-of-the-server]__b2a4bfcc._.js +1 -1
  223. package/web/.next/server/chunks/[root-of-the-server]__b2a4bfcc._.js.map +1 -1
  224. package/web/.next/server/chunks/[root-of-the-server]__cd67a84c._.js +1 -1
  225. package/web/.next/server/chunks/[root-of-the-server]__cd67a84c._.js.map +1 -1
  226. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js +1 -1
  227. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js.map +1 -1
  228. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_feature-drawer-client_tsx_e9755fc8._.js +2 -2
  229. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_feature-drawer-client_tsx_e9755fc8._.js.map +1 -1
  230. package/web/.next/server/chunks/ssr/{7f428_lucide-react_dist_esm_icons_5da25833._.js → 7f428_lucide-react_dist_esm_icons_469d51b7._.js} +2 -2
  231. package/web/.next/server/chunks/ssr/7f428_lucide-react_dist_esm_icons_469d51b7._.js.map +1 -0
  232. package/web/.next/server/chunks/ssr/[root-of-the-server]__013a0318._.js +1 -1
  233. package/web/.next/server/chunks/ssr/[root-of-the-server]__013a0318._.js.map +1 -1
  234. package/web/.next/server/chunks/ssr/[root-of-the-server]__17dadd08._.js +1 -1
  235. package/web/.next/server/chunks/ssr/[root-of-the-server]__17dadd08._.js.map +1 -1
  236. package/web/.next/server/chunks/ssr/[root-of-the-server]__1925bef0._.js +1 -1
  237. package/web/.next/server/chunks/ssr/[root-of-the-server]__1a9687c4._.js +1 -1
  238. package/web/.next/server/chunks/ssr/[root-of-the-server]__1a9687c4._.js.map +1 -1
  239. package/web/.next/server/chunks/ssr/[root-of-the-server]__24756fa9._.js +2 -2
  240. package/web/.next/server/chunks/ssr/[root-of-the-server]__24756fa9._.js.map +1 -1
  241. package/web/.next/server/chunks/ssr/[root-of-the-server]__42d066e1._.js +3 -0
  242. package/web/.next/server/chunks/ssr/[root-of-the-server]__42d066e1._.js.map +1 -0
  243. package/web/.next/server/chunks/ssr/[root-of-the-server]__4ee8be85._.js +1 -1
  244. package/web/.next/server/chunks/ssr/[root-of-the-server]__70986695._.js +1 -1
  245. package/web/.next/server/chunks/ssr/[root-of-the-server]__70986695._.js.map +1 -1
  246. package/web/.next/server/chunks/ssr/[root-of-the-server]__a5ea76a6._.js +1 -1
  247. package/web/.next/server/chunks/ssr/[root-of-the-server]__a5ea76a6._.js.map +1 -1
  248. package/web/.next/server/chunks/ssr/[root-of-the-server]__dd3e834e._.js +1 -1
  249. package/web/.next/server/chunks/ssr/[root-of-the-server]__dd3e834e._.js.map +1 -1
  250. package/web/.next/server/chunks/ssr/[root-of-the-server]__e265da61._.js +1 -1
  251. package/web/.next/server/chunks/ssr/[root-of-the-server]__f3ca7bea._.js +1 -1
  252. package/web/.next/server/chunks/ssr/[root-of-the-server]__f3ca7bea._.js.map +1 -1
  253. package/web/.next/server/chunks/ssr/{[root-of-the-server]__bb391c45._.js → [root-of-the-server]__f4f07ee6._.js} +2 -2
  254. package/web/.next/server/chunks/ssr/[root-of-the-server]__f4f07ee6._.js.map +1 -0
  255. package/web/.next/server/chunks/ssr/_0277d3b5._.js +1 -1
  256. package/web/.next/server/chunks/ssr/_0277d3b5._.js.map +1 -1
  257. package/web/.next/server/chunks/ssr/{_da028026._.js → _1c03437e._.js} +2 -2
  258. package/web/.next/server/chunks/ssr/{_da028026._.js.map → _1c03437e._.js.map} +1 -1
  259. package/web/.next/server/chunks/ssr/_45496654._.js.map +1 -1
  260. package/web/.next/server/chunks/ssr/{_655cc4fd._.js → _49838974._.js} +2 -2
  261. package/web/.next/server/chunks/ssr/{_655cc4fd._.js.map → _49838974._.js.map} +1 -1
  262. package/web/.next/server/chunks/ssr/_56b9d60f._.js +1 -1
  263. package/web/.next/server/chunks/ssr/_56b9d60f._.js.map +1 -1
  264. package/web/.next/server/chunks/ssr/_708a9069._.js +3 -0
  265. package/web/.next/server/chunks/ssr/_708a9069._.js.map +1 -0
  266. package/web/.next/server/chunks/ssr/{_295fffde._.js → _86bb5eb1._.js} +6 -2
  267. package/web/.next/server/chunks/ssr/_86bb5eb1._.js.map +1 -0
  268. package/web/.next/server/chunks/ssr/_946a7fc6._.js +1 -1
  269. package/web/.next/server/chunks/ssr/_946a7fc6._.js.map +1 -1
  270. package/web/.next/server/chunks/ssr/{_fbf4db9c._.js → _b6df235f._.js} +2 -2
  271. package/web/.next/server/chunks/ssr/{_fbf4db9c._.js.map → _b6df235f._.js.map} +1 -1
  272. package/web/.next/server/chunks/ssr/_bad61758._.js +3 -0
  273. package/web/.next/server/chunks/ssr/_bad61758._.js.map +1 -0
  274. package/web/.next/server/chunks/ssr/{_e5753970._.js → _c5357cf5._.js} +2 -2
  275. package/web/.next/server/chunks/ssr/{_e5753970._.js.map → _c5357cf5._.js.map} +1 -1
  276. package/web/.next/server/chunks/ssr/_d7d82308._.js +3 -0
  277. package/web/.next/server/chunks/ssr/_d7d82308._.js.map +1 -0
  278. package/web/.next/server/chunks/ssr/_dd852eae._.js +3 -0
  279. package/web/.next/server/chunks/ssr/_dd852eae._.js.map +1 -0
  280. package/web/.next/server/chunks/ssr/_eff1b518._.js +1 -1
  281. package/web/.next/server/chunks/ssr/_eff1b518._.js.map +1 -1
  282. package/web/.next/server/chunks/ssr/_f227429a._.js +1 -1
  283. package/web/.next/server/chunks/ssr/_f227429a._.js.map +1 -1
  284. package/web/.next/server/chunks/ssr/_f6b812ec._.js +9 -0
  285. package/web/.next/server/chunks/ssr/_f6b812ec._.js.map +1 -0
  286. package/web/.next/server/chunks/ssr/_f86fc1bf._.js +1 -1
  287. package/web/.next/server/chunks/ssr/_f86fc1bf._.js.map +1 -1
  288. package/web/.next/server/chunks/ssr/_f8c55130._.js +1 -1
  289. package/web/.next/server/chunks/ssr/{_5bb39227._.js → _fa95e517._.js} +2 -2
  290. package/web/.next/server/chunks/ssr/{_5bb39227._.js.map → _fa95e517._.js.map} +1 -1
  291. package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_settings_settings-page-client_tsx_6ed9d5f8._.js +1 -1
  292. package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_settings_settings-page-client_tsx_6ed9d5f8._.js.map +1 -1
  293. package/web/.next/server/chunks/ssr/f3a1f_components_common_control-center-drawer_repository-drawer-client_tsx_39a00c03._.js +1 -1
  294. package/web/.next/server/chunks/ssr/node_modules__pnpm_64cc95e9._.js +3 -0
  295. package/web/.next/server/chunks/ssr/node_modules__pnpm_64cc95e9._.js.map +1 -0
  296. package/web/.next/server/chunks/ssr/src_presentation_web_36f2bc45._.js +1 -1
  297. package/web/.next/server/chunks/ssr/src_presentation_web_36f2bc45._.js.map +1 -1
  298. package/web/.next/server/chunks/ssr/src_presentation_web_486908de._.js +1 -1
  299. package/web/.next/server/chunks/ssr/src_presentation_web_486908de._.js.map +1 -1
  300. package/web/.next/server/chunks/ssr/src_presentation_web_5c3596bc._.js +1 -1
  301. package/web/.next/server/chunks/ssr/src_presentation_web_5c3596bc._.js.map +1 -1
  302. package/web/.next/server/chunks/ssr/src_presentation_web_6159fef8._.js +1 -1
  303. package/web/.next/server/chunks/ssr/src_presentation_web_6159fef8._.js.map +1 -1
  304. package/web/.next/server/chunks/ssr/src_presentation_web_6326f81e._.js +1 -1
  305. package/web/.next/server/chunks/ssr/src_presentation_web_6326f81e._.js.map +1 -1
  306. package/web/.next/server/chunks/ssr/src_presentation_web_6b2fdcd8._.js +1 -1
  307. package/web/.next/server/chunks/ssr/src_presentation_web_6b2fdcd8._.js.map +1 -1
  308. package/web/.next/server/chunks/ssr/src_presentation_web_74703c9f._.js +1 -1
  309. package/web/.next/server/chunks/ssr/src_presentation_web_74703c9f._.js.map +1 -1
  310. package/web/.next/server/chunks/ssr/src_presentation_web_a8056dac._.js +1 -1
  311. package/web/.next/server/chunks/ssr/src_presentation_web_a8056dac._.js.map +1 -1
  312. package/web/.next/server/chunks/ssr/src_presentation_web_ad42cc73._.js +1 -1
  313. package/web/.next/server/chunks/ssr/src_presentation_web_ad42cc73._.js.map +1 -1
  314. package/web/.next/server/chunks/ssr/src_presentation_web_app_actions_open-ide_ts_baaca5d5._.js +3 -3
  315. package/web/.next/server/chunks/ssr/src_presentation_web_b00bfb08._.js +1 -1
  316. package/web/.next/server/chunks/ssr/src_presentation_web_b00bfb08._.js.map +1 -1
  317. package/web/.next/server/chunks/ssr/src_presentation_web_components_895e5bfa._.js +1 -1
  318. package/web/.next/server/chunks/ssr/src_presentation_web_components_895e5bfa._.js.map +1 -1
  319. package/web/.next/server/chunks/ssr/src_presentation_web_components_common_base-drawer_base-drawer_tsx_97dfbbc8._.js +1 -1
  320. package/web/.next/server/chunks/ssr/src_presentation_web_components_common_base-drawer_base-drawer_tsx_97dfbbc8._.js.map +1 -1
  321. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js +1 -1
  322. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js.map +1 -1
  323. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_skills_8a174cac._.js +1 -1
  324. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_skills_8a174cac._.js.map +1 -1
  325. package/web/.next/server/chunks/ssr/src_presentation_web_f1edcf5e._.js +1 -1
  326. package/web/.next/server/chunks/ssr/src_presentation_web_f1edcf5e._.js.map +1 -1
  327. package/web/.next/server/chunks/ssr/src_presentation_web_f9436804._.js +1 -1
  328. package/web/.next/server/chunks/ssr/src_presentation_web_f9436804._.js.map +1 -1
  329. package/web/.next/server/chunks/ssr/translations_23dd5e7e._.js +1 -1
  330. package/web/.next/server/chunks/ssr/translations_23dd5e7e._.js.map +1 -1
  331. package/web/.next/server/pages/500.html +2 -2
  332. package/web/.next/server/server-reference-manifest.js +1 -1
  333. package/web/.next/server/server-reference-manifest.json +109 -64
  334. package/web/.next/static/chunks/0239d68df2738a2a.js +1 -0
  335. package/web/.next/static/chunks/{b40755bc75789277.js → 101e7888c4b7e328.js} +1 -1
  336. package/web/.next/static/chunks/{53f9385d4a447ad4.js → 18fa374b1b856687.js} +2 -2
  337. package/web/.next/static/chunks/{7c3fe3c694874dea.js → 32940aa08b947f66.js} +1 -1
  338. package/web/.next/static/chunks/{ae94e98b7163890b.js → 42d86b3a628702b0.js} +1 -1
  339. package/web/.next/static/chunks/6da04daaac881f27.js +1 -0
  340. package/web/.next/static/chunks/6f9ba92ee19bcbd7.js +5 -0
  341. package/web/.next/static/chunks/{25bbd99fa3dcc0b2.js → 79a8ec8b8de391f8.js} +1 -1
  342. package/web/.next/static/chunks/{e8444bf5f6c35f8b.js → 7bbe49d9daedd94d.js} +5 -1
  343. package/web/.next/static/chunks/{d8e96baa3feb79cb.js → 7e0cb9a6e06f075f.js} +1 -1
  344. package/web/.next/static/chunks/87b197ebd301232a.js +3 -0
  345. package/web/.next/static/chunks/8fe70d4e73e1fe31.css +1 -0
  346. package/web/.next/static/chunks/{6ad23a3ac827b65b.js → b3051a00d29f0f0f.js} +1 -1
  347. package/web/.next/static/chunks/b6b07ccbccda00e2.js +7 -0
  348. package/web/.next/static/chunks/b9b3a6d83e07b213.js +1 -0
  349. package/web/.next/static/chunks/c92bc820f657f9d9.js +1 -0
  350. package/web/.next/static/chunks/{e11508a76f5fca98.js → d436ca26f19e7c42.js} +1 -1
  351. package/web/.next/static/chunks/{5635fe220632fced.js → d8505faa90c97f2b.js} +1 -1
  352. package/web/.next/static/chunks/{d7310881615cb55b.js → e2b0da48f8e15118.js} +1 -1
  353. package/web/.next/static/chunks/{443c0073e58878d8.js → e3ecbef934b77afa.js} +1 -1
  354. package/web/.next/static/chunks/{b6ddc3e5f64bef7f.js → e6fc771fc21a0b62.js} +1 -1
  355. package/web/.next/static/chunks/ecafea5bc026ed41.js +1 -0
  356. package/web/.next/static/chunks/{fe29d30a75e697ed.js → f28fa2d7fa19eee6.js} +1 -1
  357. package/web/.next/static/chunks/f79d32f56056c680.js +1 -0
  358. package/web/.next/server/chunks/ssr/7f428_lucide-react_dist_esm_icons_5da25833._.js.map +0 -1
  359. package/web/.next/server/chunks/ssr/[root-of-the-server]__a6f2b763._.js +0 -3
  360. package/web/.next/server/chunks/ssr/[root-of-the-server]__a6f2b763._.js.map +0 -1
  361. package/web/.next/server/chunks/ssr/[root-of-the-server]__bb391c45._.js.map +0 -1
  362. package/web/.next/server/chunks/ssr/_295fffde._.js.map +0 -1
  363. package/web/.next/server/chunks/ssr/_44531b76._.js +0 -9
  364. package/web/.next/server/chunks/ssr/_44531b76._.js.map +0 -1
  365. package/web/.next/server/chunks/ssr/_5bf2415e._.js +0 -7
  366. package/web/.next/server/chunks/ssr/_5bf2415e._.js.map +0 -1
  367. package/web/.next/server/chunks/ssr/_869a3a15._.js +0 -3
  368. package/web/.next/server/chunks/ssr/_869a3a15._.js.map +0 -1
  369. package/web/.next/server/chunks/ssr/_b227ff50._.js +0 -3
  370. package/web/.next/server/chunks/ssr/_b227ff50._.js.map +0 -1
  371. package/web/.next/server/chunks/ssr/_e071ba48._.js +0 -3
  372. package/web/.next/server/chunks/ssr/_e071ba48._.js.map +0 -1
  373. package/web/.next/server/chunks/ssr/node_modules__pnpm_747b43ac._.js +0 -3
  374. package/web/.next/server/chunks/ssr/node_modules__pnpm_747b43ac._.js.map +0 -1
  375. package/web/.next/static/chunks/06b9d6dbf635c370.css +0 -1
  376. package/web/.next/static/chunks/15951ad67a810e2c.js +0 -5
  377. package/web/.next/static/chunks/1ae0cf5be30ef398.js +0 -1
  378. package/web/.next/static/chunks/7a9d8b705c0f8d2d.js +0 -7
  379. package/web/.next/static/chunks/8492d8e0b5f9a4e8.js +0 -1
  380. package/web/.next/static/chunks/927442d2628f6e22.js +0 -1
  381. package/web/.next/static/chunks/b99506a6f7bc2fa8.js +0 -1
  382. package/web/.next/static/chunks/be165be5db7a6054.js +0 -7
  383. package/web/.next/static/chunks/e65f14d14ad46a32.js +0 -1
  384. /package/web/.next/static/{_PzlF7w3QzhaBsMnhT75_ → i04ZwSXpTvkppxSePII4p}/_buildManifest.js +0 -0
  385. /package/web/.next/static/{_PzlF7w3QzhaBsMnhT75_ → i04ZwSXpTvkppxSePII4p}/_clientMiddlewareManifest.json +0 -0
  386. /package/web/.next/static/{_PzlF7w3QzhaBsMnhT75_ → i04ZwSXpTvkppxSePII4p}/_ssgManifest.js +0 -0
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../../../src/presentation/web/components/features/settings/settings-page-client.tsx","../../../../../../../src/presentation/web/app/actions/data%3A6eaa83%20%3Ctext/javascript%3E","../../../../../../../src/presentation/web/components/features/settings/language-settings-section.tsx","../../../../../../../node_modules/.pnpm/%40radix-ui%2Breact-slider%401.3.6_%40types%2Breact-dom%4019.2.3_%40types%2Breact%4019.2.10__%40types%2Breact_ca43abb80e5f786fefe972afd09a8b45/node_modules/%40radix-ui/react-slider/dist/index.mjs","../../../../../../../src/presentation/web/components/ui/slider.tsx","../../../../../../../src/presentation/web/components/features/settings/timeout-slider.tsx","../../../../../../../src/presentation/web/components/common/editor-type-icons.tsx","../../../../../../../node_modules/.pnpm/lucide-react%400.563.0_react%4019.2.4/node_modules/lucide-react/src/icons/settings-2.ts","../../../../../../../node_modules/.pnpm/lucide-react%400.563.0_react%4019.2.4/node_modules/lucide-react/src/icons/database.ts","../../../../../../../node_modules/.pnpm/lucide-react%400.563.0_react%4019.2.4/node_modules/lucide-react/src/icons/bell.ts","../../../../../../../node_modules/.pnpm/%40radix-ui%2Breact-slider%401.3.6_%40types%2Breact-dom%4019.2.3_%40types%2Breact%4019.2.10__%40types%2Breact_ca43abb80e5f786fefe972afd09a8b45/node_modules/%40radix-ui/react-slider/src/slider.tsx","../../../../../../../node_modules/.pnpm/lucide-react%400.563.0_react%4019.2.4/node_modules/lucide-react/src/icons/flag.ts"],"sourcesContent":["'use client';\n\nimport { useState, useTransition, useRef, useEffect, useCallback } from 'react';\nimport {\n Check,\n Bot,\n Terminal,\n GitBranch,\n Activity,\n Bell,\n Flag,\n Database,\n Globe,\n Minus,\n Plus,\n ExternalLink,\n Settings2,\n Timer,\n MessageSquare,\n LayoutGrid,\n} from 'lucide-react';\nimport { toast } from 'sonner';\nimport { useTranslation } from 'react-i18next';\nimport { cn } from '@/lib/utils';\nimport { Label } from '@/components/ui/label';\nimport { Switch } from '@/components/ui/switch';\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from '@/components/ui/select';\nimport { updateSettingsAction } from '@/app/actions/update-settings';\nimport {\n type AgentType,\n EditorType,\n Language,\n TerminalType,\n} from '@shepai/core/domain/generated/output';\nimport { getEditorTypeIcon } from '@/components/common/editor-type-icons';\nimport { AgentModelPicker } from '@/components/features/settings/AgentModelPicker';\nimport { LanguageSettingsSection } from '@/components/features/settings/language-settings-section';\nimport { TimeoutSlider } from '@/components/features/settings/timeout-slider';\nimport type {\n Settings,\n FeatureFlags,\n NotificationPreferences,\n InteractiveAgentConfig,\n FabLayoutConfig,\n} from '@shepai/core/domain/generated/output';\nimport type { AvailableTerminal } from '@/app/actions/get-available-terminals';\n\nconst EDITOR_OPTIONS = [\n { value: EditorType.VsCode, label: 'VS Code' },\n { value: EditorType.Cursor, label: 'Cursor' },\n { value: EditorType.Windsurf, label: 'Windsurf' },\n { value: EditorType.Zed, label: 'Zed' },\n { value: EditorType.Antigravity, label: 'Antigravity' },\n];\n\nconst SHELL_OPTIONS = [\n { value: 'bash', label: 'Bash' },\n { value: 'zsh', label: 'Zsh' },\n { value: 'fish', label: 'Fish' },\n];\n\nconst SECTIONS = [\n { id: 'language', labelKey: 'settings.sections.language', icon: Globe },\n { id: 'agent', labelKey: 'settings.sections.agent', icon: Bot },\n { id: 'environment', labelKey: 'settings.sections.environment', icon: Terminal },\n { id: 'workflow', labelKey: 'settings.sections.workflow', icon: GitBranch },\n { id: 'ci', labelKey: 'settings.sections.ci', icon: Activity },\n { id: 'stage-timeouts', labelKey: 'settings.sections.timeouts', icon: Timer },\n { id: 'notifications', labelKey: 'settings.sections.notifications', icon: Bell },\n { id: 'feature-flags', labelKey: 'settings.sections.flags', icon: Flag },\n { id: 'interactive-agent', labelKey: 'settings.sections.chat', icon: MessageSquare },\n { id: 'fab-layout', labelKey: 'settings.sections.layout', icon: LayoutGrid },\n { id: 'database', labelKey: 'settings.sections.database', icon: Database },\n] as const;\n\nexport interface SettingsPageClientProps {\n settings: Settings;\n shepHome: string;\n dbFileSize: string;\n availableTerminals?: AvailableTerminal[];\n}\n\nfunction useSaveIndicator() {\n const { t } = useTranslation('web');\n const [isPending, startTransition] = useTransition();\n const [showSaving, setShowSaving] = useState(false);\n const [showSaved, setShowSaved] = useState(false);\n const minTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const pendingDoneRef = useRef(false);\n\n // Show \"Saving...\" with a minimum display time of 600ms\n useEffect(() => {\n if (isPending && !showSaving) {\n setShowSaving(true);\n pendingDoneRef.current = false;\n minTimerRef.current = setTimeout(() => {\n minTimerRef.current = null;\n if (pendingDoneRef.current) {\n setShowSaving(false);\n setShowSaved(true);\n setTimeout(() => setShowSaved(false), 2000);\n }\n }, 350);\n }\n if (!isPending && showSaving) {\n pendingDoneRef.current = true;\n // If min timer already elapsed, transition now\n if (!minTimerRef.current) {\n setShowSaving(false);\n setShowSaved(true);\n setTimeout(() => setShowSaved(false), 2000);\n }\n }\n }, [isPending, showSaving]);\n\n const save = useCallback(\n (payload: Record<string, unknown>) => {\n startTransition(async () => {\n const result = await updateSettingsAction(payload);\n if (!result.success) {\n toast.error(result.error ?? t('settings.failedToSave'));\n }\n });\n },\n [startTransition, t]\n );\n\n return { showSaving, showSaved, save };\n}\n\n/* ── Reusable row components ── */\n\nfunction SettingsRow({\n label,\n description,\n htmlFor,\n children,\n}: {\n label: string;\n description?: string;\n htmlFor?: string;\n children: React.ReactNode;\n}) {\n return (\n <div className=\"flex items-center justify-between gap-4 border-b py-2.5 last:border-b-0\">\n <div className=\"min-w-0\">\n <Label htmlFor={htmlFor} className=\"cursor-pointer text-sm font-normal whitespace-nowrap\">\n {label}\n </Label>\n {description ? (\n <p className=\"text-muted-foreground text-[11px] leading-tight\">{description}</p>\n ) : null}\n </div>\n <div className=\"flex shrink-0 items-center gap-2\">{children}</div>\n </div>\n );\n}\n\nfunction SwitchRow({\n label,\n description,\n id,\n testId,\n checked,\n onChange,\n disabled,\n}: {\n label: string;\n description?: string;\n id: string;\n testId: string;\n checked: boolean;\n onChange: (value: boolean) => void;\n disabled?: boolean;\n}) {\n return (\n <SettingsRow label={label} description={description} htmlFor={id}>\n <Switch\n id={id}\n data-testid={testId}\n checked={checked}\n onCheckedChange={onChange}\n disabled={disabled}\n className={cn('cursor-pointer', disabled && 'cursor-not-allowed opacity-50')}\n />\n </SettingsRow>\n );\n}\n\n/* ── Section card wrapper ── */\n\nfunction SettingsSection({\n icon: Icon,\n title,\n description,\n badge,\n testId,\n children,\n}: {\n icon: React.ComponentType<{ className?: string }>;\n title: string;\n description: string;\n badge?: string;\n testId: string;\n children: React.ReactNode;\n}) {\n return (\n <div className=\"bg-background rounded-lg border\" data-testid={testId}>\n <div className=\"bg-muted/30 border-b px-4 py-3\">\n <div className=\"flex items-center gap-2\">\n <Icon className=\"text-muted-foreground h-3.5 w-3.5\" />\n <h2 className=\"text-sm font-semibold\">{title}</h2>\n {badge ? (\n <span className=\"bg-muted text-muted-foreground rounded px-1.5 py-0.5 text-[9px] font-medium tracking-wider uppercase\">\n {badge}\n </span>\n ) : null}\n </div>\n <p className=\"text-muted-foreground mt-0.5 text-[11px]\">{description}</p>\n </div>\n <div className=\"px-4\">{children}</div>\n </div>\n );\n}\n\nfunction NumberStepper({\n id,\n testId,\n value,\n onChange,\n onBlur,\n placeholder,\n min = 1,\n max,\n step = 1,\n suffix,\n}: {\n id: string;\n testId: string;\n value: string;\n onChange: (value: string) => void;\n onBlur: () => void;\n placeholder: string;\n min?: number;\n max?: number;\n step?: number;\n suffix?: string;\n}) {\n const { t } = useTranslation('web');\n const numValue = value === '' ? undefined : parseInt(value, 10);\n\n const decrement = () => {\n const current = numValue ?? parseInt(placeholder, 10);\n const next = Math.max(min, current - step);\n onChange(String(next));\n };\n\n const increment = () => {\n const current = numValue ?? parseInt(placeholder, 10);\n const next = max != null ? Math.min(max, current + step) : current + step;\n onChange(String(next));\n };\n\n return (\n <div className=\"flex items-center gap-1.5\">\n <div className=\"flex items-center overflow-hidden rounded-md border\">\n <button\n type=\"button\"\n onClick={() => {\n decrement();\n }}\n onMouseUp={onBlur}\n 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\"\n aria-label={t('common.decrease')}\n >\n <Minus className=\"h-3 w-3\" />\n </button>\n <input\n id={id}\n data-testid={testId}\n type=\"text\"\n inputMode=\"numeric\"\n pattern=\"[0-9]*\"\n value={value}\n placeholder={placeholder}\n onChange={(e) => {\n const v = e.target.value.replace(/[^0-9]/g, '');\n onChange(v);\n }}\n onBlur={onBlur}\n className=\"h-8 w-14 bg-transparent text-center text-xs outline-none\"\n />\n <button\n type=\"button\"\n onClick={() => {\n increment();\n }}\n onMouseUp={onBlur}\n 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\"\n aria-label={t('common.increase')}\n >\n <Plus className=\"h-3 w-3\" />\n </button>\n </div>\n {suffix ? <span className=\"text-muted-foreground text-[11px]\">{suffix}</span> : null}\n </div>\n );\n}\n\nfunction SubsectionLabel({ children }: { children: React.ReactNode }) {\n return (\n <div className=\"border-b pt-3 pb-1\">\n <span className=\"text-muted-foreground text-[10px] font-semibold tracking-wider uppercase\">\n {children}\n </span>\n </div>\n );\n}\n\nfunction SectionHint({\n children,\n links,\n}: {\n children: React.ReactNode;\n links?: { label: string; href: string }[];\n}) {\n return (\n <div className=\"hidden pt-2 lg:block\">\n <p className=\"text-muted-foreground/70 text-[11px] leading-relaxed\">{children}</p>\n {links != null && links.length > 0 ? (\n <div className=\"mt-2 flex flex-col gap-1\">\n {links.map((link) => (\n <a\n key={link.href}\n href={link.href}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"text-muted-foreground hover:text-foreground inline-flex items-center gap-1 text-[10px] transition-colors\"\n >\n <ExternalLink className=\"h-2.5 w-2.5\" />\n {link.label}\n </a>\n ))}\n </div>\n ) : null}\n </div>\n );\n}\n\n/* ── Main component ── */\n\nexport function SettingsPageClient({\n settings,\n shepHome,\n dbFileSize,\n availableTerminals,\n}: SettingsPageClientProps) {\n const { t } = useTranslation('web');\n const { showSaving, showSaved, save } = useSaveIndicator();\n const featureFlags = settings.featureFlags ?? {\n skills: false,\n envDeploy: false,\n debug: false,\n githubImport: false,\n adoptBranch: false,\n gitRebaseSync: false,\n reactFileManager: false,\n inventory: false,\n };\n\n // Agent state\n const [agentType, setAgentType] = useState(settings.agent.type);\n\n // Environment state\n const [editor, setEditor] = useState(settings.environment.defaultEditor);\n const [shell, setShell] = useState(settings.environment.shellPreference);\n const [terminal, setTerminal] = useState(\n settings.environment.terminalPreference ?? TerminalType.System\n );\n\n // Filter to only show installed terminals\n const terminalOptions = availableTerminals\n ? availableTerminals.filter((t) => t.available)\n : [\n {\n id: TerminalType.System,\n name: t('settings.environment.systemTerminal'),\n available: true as const,\n },\n ];\n\n // Workflow state\n const [openPr, setOpenPr] = useState(settings.workflow.openPrOnImplementationComplete);\n const [pushOnComplete, setPushOnComplete] = useState(\n settings.workflow.approvalGateDefaults.pushOnImplementationComplete\n );\n const [allowPrd, setAllowPrd] = useState(settings.workflow.approvalGateDefaults.allowPrd);\n const [allowPlan, setAllowPlan] = useState(settings.workflow.approvalGateDefaults.allowPlan);\n const [allowMerge, setAllowMerge] = useState(settings.workflow.approvalGateDefaults.allowMerge);\n const [enableEvidence, setEnableEvidence] = useState(settings.workflow.enableEvidence);\n const [commitEvidence, setCommitEvidence] = useState(settings.workflow.commitEvidence);\n const [ciWatchEnabled, setCiWatchEnabled] = useState(settings.workflow.ciWatchEnabled !== false);\n const [hideCiStatus, setHideCiStatus] = useState(settings.workflow.hideCiStatus !== false);\n const [defaultFastMode, setDefaultFastMode] = useState(\n settings.workflow.defaultFastMode !== false\n );\n // Auto-archive state\n const [autoArchiveEnabled, setAutoArchiveEnabled] = useState(\n (settings.workflow.autoArchiveDelayMinutes ?? 10) > 0\n );\n const [autoArchiveDelay, setAutoArchiveDelay] = useState(\n String(settings.workflow.autoArchiveDelayMinutes ?? 10)\n );\n const [ciMaxFix, setCiMaxFix] = useState(\n settings.workflow.ciMaxFixAttempts != null ? String(settings.workflow.ciMaxFixAttempts) : ''\n );\n const [ciTimeout, setCiTimeout] = useState(\n settings.workflow.ciWatchTimeoutMs != null\n ? String(Math.round(settings.workflow.ciWatchTimeoutMs / 1000))\n : ''\n );\n const [ciLogMax, setCiLogMax] = useState(\n settings.workflow.ciLogMaxChars != null ? String(settings.workflow.ciLogMaxChars) : ''\n );\n const [ciPollInterval, setCiPollInterval] = useState(\n settings.workflow.ciWatchPollIntervalSeconds != null\n ? String(settings.workflow.ciWatchPollIntervalSeconds)\n : ''\n );\n // Feature agent per-stage timeout states (stored in seconds for display, converted to ms on save)\n // Defaults: feature agent stages = 1_800_000 ms (1800s), analyze-repo = 600_000 ms (600s)\n const stageTimeoutsConfig = settings.workflow.stageTimeouts;\n const [analyzeTimeout, setAnalyzeTimeout] = useState(\n String(Math.round((stageTimeoutsConfig?.analyzeMs ?? 1_800_000) / 1000))\n );\n const [requirementsTimeout, setRequirementsTimeout] = useState(\n String(Math.round((stageTimeoutsConfig?.requirementsMs ?? 1_800_000) / 1000))\n );\n const [researchTimeout, setResearchTimeout] = useState(\n String(Math.round((stageTimeoutsConfig?.researchMs ?? 1_800_000) / 1000))\n );\n const [planTimeout, setPlanTimeout] = useState(\n String(Math.round((stageTimeoutsConfig?.planMs ?? 1_800_000) / 1000))\n );\n const [implementTimeout, setImplementTimeout] = useState(\n String(Math.round((stageTimeoutsConfig?.implementMs ?? 1_800_000) / 1000))\n );\n const [fastImplementTimeout, setFastImplementTimeout] = useState(\n String(Math.round((stageTimeoutsConfig?.fastImplementMs ?? 1_800_000) / 1000))\n );\n const [mergeTimeout, setMergeTimeout] = useState(\n String(Math.round((stageTimeoutsConfig?.mergeMs ?? 1_800_000) / 1000))\n );\n // Analyze-repo agent timeout state\n const analyzeRepoConfig = settings.workflow.analyzeRepoTimeouts;\n const [analyzeRepoTimeout, setAnalyzeRepoTimeout] = useState(\n String(Math.round((analyzeRepoConfig?.analyzeMs ?? 600_000) / 1000))\n );\n\n // Interactive agent state\n const interactiveAgentConfig: InteractiveAgentConfig = settings.interactiveAgent ?? {\n enabled: true,\n autoTimeoutMinutes: 15,\n maxConcurrentSessions: 3,\n };\n const [interactiveEnabled, setInteractiveEnabled] = useState(interactiveAgentConfig.enabled);\n const [interactiveTimeout, setInteractiveTimeout] = useState(\n String(interactiveAgentConfig.autoTimeoutMinutes)\n );\n const [interactiveSessions, setInteractiveSessions] = useState(\n String(interactiveAgentConfig.maxConcurrentSessions)\n );\n\n // FAB layout state\n const fabLayoutConfig: FabLayoutConfig = settings.fabLayout ?? { swapPosition: false };\n const [fabSwapPosition, setFabSwapPosition] = useState(fabLayoutConfig.swapPosition);\n\n // Notification state\n const [inApp, setInApp] = useState(settings.notifications.inApp.enabled);\n const [events, setEvents] = useState({ ...settings.notifications.events });\n\n // Feature flags state\n const [flags, setFlags] = useState<FeatureFlags>({ ...featureFlags });\n\n // Original CI values for blur comparison\n const originalCiMaxFix =\n settings.workflow.ciMaxFixAttempts != null ? String(settings.workflow.ciMaxFixAttempts) : '';\n const originalCiTimeout =\n settings.workflow.ciWatchTimeoutMs != null\n ? String(Math.round(settings.workflow.ciWatchTimeoutMs / 1000))\n : '';\n const originalCiLogMax =\n settings.workflow.ciLogMaxChars != null ? String(settings.workflow.ciLogMaxChars) : '';\n const originalCiPollInterval =\n settings.workflow.ciWatchPollIntervalSeconds != null\n ? String(settings.workflow.ciWatchPollIntervalSeconds)\n : '';\n const originalAnalyzeTimeout =\n stageTimeoutsConfig?.analyzeMs != null\n ? String(Math.round(stageTimeoutsConfig.analyzeMs / 1000))\n : '';\n const originalRequirementsTimeout =\n stageTimeoutsConfig?.requirementsMs != null\n ? String(Math.round(stageTimeoutsConfig.requirementsMs / 1000))\n : '';\n const originalResearchTimeout =\n stageTimeoutsConfig?.researchMs != null\n ? String(Math.round(stageTimeoutsConfig.researchMs / 1000))\n : '';\n const originalPlanTimeout =\n stageTimeoutsConfig?.planMs != null\n ? String(Math.round(stageTimeoutsConfig.planMs / 1000))\n : '';\n const originalImplementTimeout =\n stageTimeoutsConfig?.implementMs != null\n ? String(Math.round(stageTimeoutsConfig.implementMs / 1000))\n : '';\n const originalFastImplementTimeout =\n stageTimeoutsConfig?.fastImplementMs != null\n ? String(Math.round(stageTimeoutsConfig.fastImplementMs / 1000))\n : '';\n const originalMergeTimeout =\n stageTimeoutsConfig?.mergeMs != null\n ? String(Math.round(stageTimeoutsConfig.mergeMs / 1000))\n : '';\n const originalAnalyzeRepoTimeout =\n analyzeRepoConfig?.analyzeMs != null\n ? String(Math.round(analyzeRepoConfig.analyzeMs / 1000))\n : '';\n\n function parseOptionalInt(value: string): number | undefined {\n if (value === '') return undefined;\n const n = parseInt(value, 10);\n return Number.isNaN(n) || n <= 0 ? undefined : n;\n }\n\n function secondsToMs(val: string | undefined): number | undefined {\n if (val === undefined) return undefined;\n const n = parseOptionalInt(val);\n return n != null ? n * 1000 : undefined;\n }\n\n // Workflow helpers\n function buildWorkflowPayload(\n overrides: {\n openPr?: boolean;\n pushOnComplete?: boolean;\n allowPrd?: boolean;\n allowPlan?: boolean;\n allowMerge?: boolean;\n enableEvidence?: boolean;\n commitEvidence?: boolean;\n ciWatchEnabled?: boolean;\n hideCiStatus?: boolean;\n defaultFastMode?: boolean;\n autoArchiveEnabled?: boolean;\n autoArchiveDelay?: string;\n ciMaxFix?: string;\n ciTimeout?: string;\n ciLogMax?: string;\n ciPollInterval?: string;\n analyzeTimeout?: string;\n requirementsTimeout?: string;\n researchTimeout?: string;\n planTimeout?: string;\n implementTimeout?: string;\n fastImplementTimeout?: string;\n mergeTimeout?: string;\n analyzeRepoTimeout?: string;\n } = {}\n ) {\n const timeoutSeconds = parseOptionalInt(overrides.ciTimeout ?? ciTimeout);\n const archiveEnabled = overrides.autoArchiveEnabled ?? autoArchiveEnabled;\n const archiveDelay = parseInt(overrides.autoArchiveDelay ?? autoArchiveDelay, 10);\n return {\n workflow: {\n openPrOnImplementationComplete: overrides.openPr ?? openPr,\n approvalGateDefaults: {\n pushOnImplementationComplete: overrides.pushOnComplete ?? pushOnComplete,\n allowPrd: overrides.allowPrd ?? allowPrd,\n allowPlan: overrides.allowPlan ?? allowPlan,\n allowMerge: overrides.allowMerge ?? allowMerge,\n },\n enableEvidence: overrides.enableEvidence ?? enableEvidence,\n commitEvidence: overrides.commitEvidence ?? commitEvidence,\n ciWatchEnabled: overrides.ciWatchEnabled ?? ciWatchEnabled,\n hideCiStatus: overrides.hideCiStatus ?? hideCiStatus,\n defaultFastMode: overrides.defaultFastMode ?? defaultFastMode,\n autoArchiveDelayMinutes: archiveEnabled\n ? Number.isNaN(archiveDelay) || archiveDelay < 1\n ? 10\n : archiveDelay\n : 0,\n ciMaxFixAttempts: parseOptionalInt(overrides.ciMaxFix ?? ciMaxFix),\n ciWatchTimeoutMs: timeoutSeconds != null ? timeoutSeconds * 1000 : undefined,\n ciLogMaxChars: parseOptionalInt(overrides.ciLogMax ?? ciLogMax),\n ciWatchPollIntervalSeconds: parseOptionalInt(overrides.ciPollInterval ?? ciPollInterval),\n stageTimeouts: {\n analyzeMs: secondsToMs(overrides.analyzeTimeout ?? analyzeTimeout),\n requirementsMs: secondsToMs(overrides.requirementsTimeout ?? requirementsTimeout),\n researchMs: secondsToMs(overrides.researchTimeout ?? researchTimeout),\n planMs: secondsToMs(overrides.planTimeout ?? planTimeout),\n implementMs: secondsToMs(overrides.implementTimeout ?? implementTimeout),\n fastImplementMs: secondsToMs(overrides.fastImplementTimeout ?? fastImplementTimeout),\n mergeMs: secondsToMs(overrides.mergeTimeout ?? mergeTimeout),\n },\n analyzeRepoTimeouts: {\n analyzeMs: secondsToMs(overrides.analyzeRepoTimeout ?? analyzeRepoTimeout),\n },\n },\n };\n }\n\n // Notification helpers\n function buildNotificationPayload(\n overrides: {\n inApp?: boolean;\n events?: NotificationPreferences['events'];\n } = {}\n ) {\n return {\n notifications: {\n inApp: { enabled: overrides.inApp ?? inApp },\n events: overrides.events ?? events,\n },\n };\n }\n\n const [activeSection, setActiveSection] = useState<string>('agent');\n\n // Track which section is in view via IntersectionObserver\n useEffect(() => {\n const els = SECTIONS.map((s) => document.getElementById(`section-${s.id}`)).filter(\n Boolean\n ) as HTMLElement[];\n if (els.length === 0) return;\n\n const observer = new IntersectionObserver(\n (entries) => {\n for (const entry of entries) {\n if (entry.isIntersecting) {\n setActiveSection(entry.target.id.replace('section-', ''));\n }\n }\n },\n { rootMargin: '-65px 0px -60% 0px', threshold: 0 }\n );\n\n for (const el of els) observer.observe(el);\n return () => observer.disconnect();\n }, []);\n\n const scrollToSection = useCallback((id: string) => {\n const el = document.getElementById(`section-${id}`);\n if (!el) return;\n el.scrollIntoView({ behavior: 'smooth', block: 'start' });\n // Flash highlight\n el.style.animation = 'none';\n // Force reflow\n void el.offsetHeight;\n el.style.animation = 'section-flash 1s ease-out';\n }, []);\n\n return (\n <div data-testid=\"settings-page-client\" className=\"max-w-5xl\">\n {/* Sticky header — title + save indicator + TOC in one row */}\n <div className=\"bg-background/95 supports-backdrop-filter:bg-background/80 sticky top-0 z-10 grid grid-cols-1 gap-x-5 pt-6 pb-4 backdrop-blur lg:grid-cols-[1fr_280px]\">\n <div className=\"flex items-center gap-2\">\n <Settings2 className=\"text-muted-foreground h-4 w-4\" />\n <h1 className=\"text-sm font-bold tracking-tight\">{t('settings.title')}</h1>\n <span className=\"relative h-4 w-16\">\n <span\n className={cn(\n 'text-muted-foreground absolute inset-0 flex items-center text-xs transition-opacity duration-300',\n showSaving ? 'opacity-100' : 'opacity-0'\n )}\n >\n {t('settings.saving')}\n </span>\n <span\n className={cn(\n 'absolute inset-0 flex items-center gap-1 text-xs text-green-600 transition-opacity duration-300',\n showSaved && !showSaving ? 'opacity-100' : 'opacity-0'\n )}\n >\n <Check className=\"h-3 w-3\" />\n {t('settings.saved')}\n </span>\n </span>\n <nav className=\"ml-auto flex items-center gap-0.5\">\n {SECTIONS.map((s) => {\n const SectionIcon = s.icon;\n const isActive = activeSection === s.id;\n return (\n <button\n key={s.id}\n type=\"button\"\n onClick={() => scrollToSection(s.id)}\n className={cn(\n 'flex cursor-pointer items-center gap-1 rounded-md px-1.5 py-1 text-[11px] transition-all',\n isActive\n ? 'bg-accent text-foreground font-medium'\n : 'text-muted-foreground/60 hover:text-foreground hover:bg-accent/50'\n )}\n >\n <SectionIcon className=\"h-3 w-3\" />\n <span className=\"hidden sm:inline\">{t(s.labelKey)}</span>\n </button>\n );\n })}\n </nav>\n </div>\n </div>\n\n <div className=\"flex flex-col gap-3\">\n {/* ── Language ── */}\n <div\n id=\"section-language\"\n className=\"grid scroll-mt-18 grid-cols-1 gap-x-5 rounded-lg lg:grid-cols-[1fr_280px]\"\n >\n <LanguageSettingsSection\n language={settings.user?.preferredLanguage ?? Language.English}\n />\n </div>\n\n {/* ── Agent ── */}\n <div\n id=\"section-agent\"\n className=\"grid scroll-mt-18 grid-cols-1 gap-x-5 rounded-lg lg:grid-cols-[1fr_280px]\"\n >\n <SettingsSection\n icon={Bot}\n title={t('settings.agent.sectionTitle')}\n description={t('settings.agent.sectionDescription')}\n testId=\"agent-settings-section\"\n >\n <SettingsRow\n label={t('settings.agent.agentAndModel')}\n description={t('settings.agent.agentAndModelDescription')}\n htmlFor=\"agent-model-picker\"\n >\n <AgentModelPicker\n initialAgentType={agentType}\n initialModel={settings.models.default}\n mode=\"settings\"\n onAgentModelChange={(newAgent) => setAgentType(newAgent as AgentType)}\n className=\"w-55\"\n />\n </SettingsRow>\n </SettingsSection>\n <SectionHint\n links={[\n {\n label: t('settings.agent.links.agentSystem'),\n href: 'https://github.com/shep-ai/shep/blob/main/docs/architecture/agent-system.md',\n },\n {\n label: t('settings.agent.links.addingAgents'),\n href: 'https://github.com/shep-ai/shep/blob/main/docs/development/adding-agents.md',\n },\n {\n label: t('settings.agent.links.configurationGuide'),\n href: 'https://github.com/shep-ai/shep/blob/main/docs/guides/configuration.md',\n },\n ]}\n >\n {t('settings.agent.hint')}\n </SectionHint>\n </div>\n\n {/* ── Environment ── */}\n <div\n id=\"section-environment\"\n className=\"grid scroll-mt-18 grid-cols-1 gap-x-5 rounded-lg lg:grid-cols-[1fr_280px]\"\n >\n <SettingsSection\n icon={Terminal}\n title={t('settings.environment.sectionTitle')}\n description={t('settings.environment.sectionDescription')}\n testId=\"environment-settings-section\"\n >\n <SettingsRow\n label={t('settings.environment.defaultEditor')}\n description={t('settings.environment.defaultEditorDescription')}\n htmlFor=\"default-editor\"\n >\n <Select\n value={editor}\n onValueChange={(v) => {\n setEditor(v as EditorType);\n save({\n environment: {\n defaultEditor: v as EditorType,\n shellPreference: shell,\n terminalPreference: terminal,\n },\n });\n }}\n >\n <SelectTrigger\n id=\"default-editor\"\n data-testid=\"editor-select\"\n className=\"w-55 cursor-pointer text-xs\"\n >\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {EDITOR_OPTIONS.map((opt) => {\n const Icon = getEditorTypeIcon(opt.value);\n return (\n <SelectItem key={opt.value} value={opt.value}>\n <span className=\"flex items-center gap-2 text-xs\">\n <Icon className=\"h-4 w-4 shrink-0\" />\n {opt.label}\n </span>\n </SelectItem>\n );\n })}\n </SelectContent>\n </Select>\n </SettingsRow>\n <SettingsRow\n label={t('settings.environment.shell')}\n description={t('settings.environment.shellDescription')}\n htmlFor=\"shell-preference\"\n >\n <Select\n value={shell}\n onValueChange={(v) => {\n setShell(v);\n save({\n environment: {\n defaultEditor: editor,\n shellPreference: v,\n terminalPreference: terminal,\n },\n });\n }}\n >\n <SelectTrigger\n id=\"shell-preference\"\n data-testid=\"shell-select\"\n className=\"w-55 cursor-pointer text-xs\"\n >\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {SHELL_OPTIONS.map((opt) => (\n <SelectItem key={opt.value} value={opt.value}>\n {opt.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </SettingsRow>\n <SettingsRow\n label={t('settings.environment.terminal')}\n description={t('settings.environment.terminalDescription')}\n htmlFor=\"terminal-preference\"\n >\n <Select\n value={terminal}\n onValueChange={(v) => {\n setTerminal(v as TerminalType);\n save({\n environment: {\n defaultEditor: editor,\n shellPreference: shell,\n terminalPreference: v as TerminalType,\n },\n });\n }}\n >\n <SelectTrigger\n id=\"terminal-preference\"\n data-testid=\"terminal-select\"\n className=\"w-55 cursor-pointer text-xs\"\n >\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {terminalOptions.map((opt) => (\n <SelectItem key={opt.id} value={opt.id}>\n {opt.name}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </SettingsRow>\n </SettingsSection>\n <SectionHint\n links={[\n {\n label: t('settings.environment.links.configurationGuide'),\n href: 'https://github.com/shep-ai/shep/blob/main/docs/guides/configuration.md',\n },\n ]}\n >\n {t('settings.environment.hint')}\n </SectionHint>\n </div>\n\n {/* ── Workflow ── */}\n <div\n id=\"section-workflow\"\n className=\"grid scroll-mt-18 grid-cols-1 gap-x-5 rounded-lg lg:grid-cols-[1fr_280px]\"\n >\n <SettingsSection\n icon={GitBranch}\n title={t('settings.workflow.title')}\n description={t('settings.workflow.sectionDescription')}\n testId=\"workflow-settings-section\"\n >\n <SwitchRow\n label={t('settings.workflow.defaultFastMode')}\n description={t('settings.workflow.defaultFastModeDescription')}\n id=\"default-fast-mode\"\n testId=\"switch-default-fast-mode\"\n checked={defaultFastMode}\n onChange={(v) => {\n setDefaultFastMode(v);\n save(buildWorkflowPayload({ defaultFastMode: v }));\n }}\n />\n <SubsectionLabel>{t('settings.workflow.subsections.approve')}</SubsectionLabel>\n <SwitchRow\n label={t('settings.workflow.autoApprovePrd')}\n description={t('settings.workflow.autoApprovePrdDescription')}\n id=\"allow-prd\"\n testId=\"switch-allow-prd\"\n checked={allowPrd}\n onChange={(v) => {\n setAllowPrd(v);\n save(buildWorkflowPayload({ allowPrd: v }));\n }}\n />\n <SwitchRow\n label={t('settings.workflow.autoApprovePlan')}\n description={t('settings.workflow.autoApprovePlanDescription')}\n id=\"allow-plan\"\n testId=\"switch-allow-plan\"\n checked={allowPlan}\n onChange={(v) => {\n setAllowPlan(v);\n save(buildWorkflowPayload({ allowPlan: v }));\n }}\n />\n <SwitchRow\n label={t('settings.workflow.autoApproveMerge')}\n description={t('settings.workflow.autoApproveMergeDescription')}\n id=\"allow-merge\"\n testId=\"switch-allow-merge\"\n checked={allowMerge}\n onChange={(v) => {\n setAllowMerge(v);\n save(buildWorkflowPayload({ allowMerge: v }));\n }}\n />\n <SubsectionLabel>{t('settings.workflow.subsections.evidence')}</SubsectionLabel>\n <SwitchRow\n label={t('settings.workflow.collectEvidence')}\n description={t('settings.workflow.collectEvidenceDescription')}\n id=\"enable-evidence\"\n testId=\"switch-enable-evidence\"\n checked={enableEvidence}\n onChange={(v) => {\n setEnableEvidence(v);\n if (!v) {\n setCommitEvidence(false);\n save(buildWorkflowPayload({ enableEvidence: v, commitEvidence: false }));\n } else {\n save(buildWorkflowPayload({ enableEvidence: v }));\n }\n }}\n />\n <SwitchRow\n label={t('settings.workflow.addEvidenceToPr')}\n description={t('settings.workflow.addEvidenceToPrDescription')}\n id=\"commit-evidence\"\n testId=\"switch-commit-evidence\"\n checked={commitEvidence}\n disabled={!enableEvidence || !openPr}\n onChange={(v) => {\n setCommitEvidence(v);\n save(buildWorkflowPayload({ commitEvidence: v }));\n }}\n />\n <SubsectionLabel>{t('settings.workflow.subsections.git')}</SubsectionLabel>\n <SwitchRow\n label={t('settings.workflow.pushOnComplete')}\n description={t('settings.workflow.pushOnCompleteDescription')}\n id=\"push-on-complete\"\n testId=\"switch-push-on-complete\"\n checked={pushOnComplete}\n onChange={(v) => {\n setPushOnComplete(v);\n save(buildWorkflowPayload({ pushOnComplete: v }));\n }}\n />\n <SwitchRow\n label={t('settings.workflow.openPrOnComplete')}\n description={t('settings.workflow.openPrOnCompleteDescription')}\n id=\"open-pr\"\n testId=\"switch-open-pr\"\n checked={openPr}\n onChange={(v) => {\n setOpenPr(v);\n if (!v) {\n setCommitEvidence(false);\n save(buildWorkflowPayload({ openPr: v, commitEvidence: false }));\n } else {\n save(buildWorkflowPayload({ openPr: v }));\n }\n }}\n />\n <SwitchRow\n label={t('settings.workflow.watchCiAfterPush')}\n description={t('settings.workflow.watchCiAfterPushDescription')}\n id=\"ci-watch-enabled\"\n testId=\"switch-ci-watch-enabled\"\n checked={ciWatchEnabled}\n onChange={(v) => {\n setCiWatchEnabled(v);\n save(buildWorkflowPayload({ ciWatchEnabled: v }));\n }}\n />\n <SubsectionLabel>Archive</SubsectionLabel>\n <SwitchRow\n label=\"Auto-archive completed\"\n description=\"Automatically archive features after they reach the completed state\"\n id=\"auto-archive-enabled\"\n testId=\"switch-auto-archive-enabled\"\n checked={autoArchiveEnabled}\n onChange={(v) => {\n setAutoArchiveEnabled(v);\n save(buildWorkflowPayload({ autoArchiveEnabled: v }));\n }}\n />\n <SettingsRow\n label=\"Archive delay\"\n description=\"Minutes to wait after completion before archiving (1–1440)\"\n htmlFor=\"auto-archive-delay\"\n >\n <NumberStepper\n id=\"auto-archive-delay\"\n testId=\"input-auto-archive-delay\"\n value={autoArchiveDelay}\n placeholder=\"10\"\n min={1}\n max={1440}\n suffix=\"min\"\n onChange={(v) => {\n setAutoArchiveDelay(v);\n }}\n onBlur={() => {\n if (!autoArchiveEnabled) return;\n const n = parseInt(autoArchiveDelay, 10);\n const clamped = Number.isNaN(n) ? 10 : Math.min(1440, Math.max(1, n));\n setAutoArchiveDelay(String(clamped));\n save(buildWorkflowPayload({ autoArchiveDelay: String(clamped) }));\n }}\n />\n </SettingsRow>\n </SettingsSection>\n <SectionHint\n links={[\n {\n label: t('settings.workflow.links.approvalGates'),\n href: 'https://github.com/shep-ai/shep/blob/main/specs/016-hitl-approval-gates/spec.yaml',\n },\n {\n label: t('settings.workflow.links.pushAndPrFlags'),\n href: 'https://github.com/shep-ai/shep/blob/main/specs/037-feature-pr-push-flags/spec.yaml',\n },\n ]}\n >\n {t('settings.workflow.hint')}\n </SectionHint>\n </div>\n\n {/* ── CI ── */}\n <div\n id=\"section-ci\"\n className=\"grid scroll-mt-18 grid-cols-1 gap-x-5 rounded-lg lg:grid-cols-[1fr_280px]\"\n >\n <SettingsSection\n icon={Activity}\n title={t('settings.ci.title')}\n description={t('settings.ci.description')}\n testId=\"ci-settings-section\"\n >\n <SettingsRow\n label={t('settings.ci.maxFixAttempts')}\n description={t('settings.ci.maxFixAttemptsDescription')}\n htmlFor=\"ci-max-fix\"\n >\n <NumberStepper\n id=\"ci-max-fix\"\n testId=\"ci-max-fix-input\"\n placeholder=\"3\"\n value={ciMaxFix}\n onChange={setCiMaxFix}\n onBlur={() => {\n if (ciMaxFix !== originalCiMaxFix) save(buildWorkflowPayload({ ciMaxFix }));\n }}\n min={1}\n max={10}\n />\n </SettingsRow>\n <SettingsRow\n label={t('settings.ci.watchTimeout')}\n description={t('settings.ci.watchTimeoutDescription')}\n htmlFor=\"ci-timeout\"\n >\n <NumberStepper\n id=\"ci-timeout\"\n testId=\"ci-timeout-input\"\n placeholder=\"300\"\n value={ciTimeout}\n onChange={setCiTimeout}\n onBlur={() => {\n if (ciTimeout !== originalCiTimeout) save(buildWorkflowPayload({ ciTimeout }));\n }}\n min={30}\n step={30}\n suffix=\"sec\"\n />\n </SettingsRow>\n <SettingsRow\n label={t('settings.ci.maxLogSize')}\n description={t('settings.ci.maxLogSizeDescription')}\n htmlFor=\"ci-log-max\"\n >\n <NumberStepper\n id=\"ci-log-max\"\n testId=\"ci-log-max-input\"\n placeholder=\"50000\"\n value={ciLogMax}\n onChange={setCiLogMax}\n onBlur={() => {\n if (ciLogMax !== originalCiLogMax) save(buildWorkflowPayload({ ciLogMax }));\n }}\n min={1000}\n step={5000}\n suffix=\"chars\"\n />\n </SettingsRow>\n <SettingsRow\n label={t('settings.ci.pollInterval')}\n description={t('settings.ci.pollIntervalDescription')}\n htmlFor=\"ci-poll-interval\"\n >\n <NumberStepper\n id=\"ci-poll-interval\"\n testId=\"ci-poll-interval-input\"\n placeholder=\"30\"\n value={ciPollInterval}\n onChange={setCiPollInterval}\n onBlur={() => {\n if (ciPollInterval !== originalCiPollInterval)\n save(buildWorkflowPayload({ ciPollInterval }));\n }}\n min={5}\n step={5}\n suffix=\"sec\"\n />\n </SettingsRow>\n <SwitchRow\n label={t('settings.ci.hideCiStatus')}\n description={t('settings.ci.hideCiStatusDescription')}\n id=\"hide-ci-status\"\n testId=\"switch-hide-ci-status\"\n checked={hideCiStatus}\n onChange={(v) => {\n setHideCiStatus(v);\n save(buildWorkflowPayload({ hideCiStatus: v }));\n }}\n />\n </SettingsSection>\n <SectionHint\n links={[\n {\n label: t('settings.ci.links.cicdPipeline'),\n href: 'https://github.com/shep-ai/shep/blob/main/docs/development/cicd.md',\n },\n {\n label: t('settings.ci.links.ciSecurityGates'),\n href: 'https://github.com/shep-ai/shep/blob/main/specs/003-cicd-security-gates/spec.md',\n },\n ]}\n >\n {t('settings.ci.hint')}\n </SectionHint>\n </div>\n\n {/* ── Stage Timeouts ── */}\n <div\n id=\"section-stage-timeouts\"\n className=\"grid scroll-mt-18 grid-cols-1 gap-x-5 rounded-lg lg:grid-cols-[1fr_280px]\"\n >\n <SettingsSection\n icon={Timer}\n title={t('settings.stageTimeouts.title')}\n description={t('settings.stageTimeouts.description')}\n testId=\"stage-timeouts-settings-section\"\n >\n <SubsectionLabel>\n {t('settings.stageTimeouts.subsections.featureAgent')}\n </SubsectionLabel>\n <SettingsRow\n label={t('settings.stageTimeouts.analyze')}\n description={t('settings.stageTimeouts.analyzeDescription')}\n htmlFor=\"timeout-analyze\"\n >\n <TimeoutSlider\n id=\"timeout-analyze\"\n testId=\"timeout-analyze-input\"\n value={analyzeTimeout}\n onChange={setAnalyzeTimeout}\n onBlur={() => {\n if (analyzeTimeout !== originalAnalyzeTimeout)\n save(buildWorkflowPayload({ analyzeTimeout }));\n }}\n defaultSeconds={1800}\n />\n </SettingsRow>\n <SettingsRow\n label={t('settings.stageTimeouts.requirements')}\n description={t('settings.stageTimeouts.requirementsDescription')}\n htmlFor=\"timeout-requirements\"\n >\n <TimeoutSlider\n id=\"timeout-requirements\"\n testId=\"timeout-requirements-input\"\n value={requirementsTimeout}\n onChange={setRequirementsTimeout}\n onBlur={() => {\n if (requirementsTimeout !== originalRequirementsTimeout)\n save(buildWorkflowPayload({ requirementsTimeout }));\n }}\n defaultSeconds={1800}\n />\n </SettingsRow>\n <SettingsRow\n label={t('settings.stageTimeouts.research')}\n description={t('settings.stageTimeouts.researchDescription')}\n htmlFor=\"timeout-research\"\n >\n <TimeoutSlider\n id=\"timeout-research\"\n testId=\"timeout-research-input\"\n value={researchTimeout}\n onChange={setResearchTimeout}\n onBlur={() => {\n if (researchTimeout !== originalResearchTimeout)\n save(buildWorkflowPayload({ researchTimeout }));\n }}\n defaultSeconds={1800}\n />\n </SettingsRow>\n <SettingsRow\n label={t('settings.stageTimeouts.plan')}\n description={t('settings.stageTimeouts.planDescription')}\n htmlFor=\"timeout-plan\"\n >\n <TimeoutSlider\n id=\"timeout-plan\"\n testId=\"timeout-plan-input\"\n value={planTimeout}\n onChange={setPlanTimeout}\n onBlur={() => {\n if (planTimeout !== originalPlanTimeout)\n save(buildWorkflowPayload({ planTimeout }));\n }}\n defaultSeconds={1800}\n />\n </SettingsRow>\n <SettingsRow\n label={t('settings.stageTimeouts.implement')}\n description={t('settings.stageTimeouts.implementDescription')}\n htmlFor=\"timeout-implement\"\n >\n <TimeoutSlider\n id=\"timeout-implement\"\n testId=\"timeout-implement-input\"\n value={implementTimeout}\n onChange={setImplementTimeout}\n onBlur={() => {\n if (implementTimeout !== originalImplementTimeout)\n save(buildWorkflowPayload({ implementTimeout }));\n }}\n defaultSeconds={1800}\n />\n </SettingsRow>\n <SettingsRow\n label={t('settings.stageTimeouts.fastImplement')}\n description={t('settings.stageTimeouts.fastImplementDescription')}\n htmlFor=\"timeout-fast-implement\"\n >\n <TimeoutSlider\n id=\"timeout-fast-implement\"\n testId=\"timeout-fast-implement-input\"\n value={fastImplementTimeout}\n onChange={setFastImplementTimeout}\n onBlur={() => {\n if (fastImplementTimeout !== originalFastImplementTimeout)\n save(buildWorkflowPayload({ fastImplementTimeout }));\n }}\n defaultSeconds={1800}\n />\n </SettingsRow>\n <SettingsRow\n label={t('settings.stageTimeouts.merge')}\n description={t('settings.stageTimeouts.mergeDescription')}\n htmlFor=\"timeout-merge\"\n >\n <TimeoutSlider\n id=\"timeout-merge\"\n testId=\"timeout-merge-input\"\n value={mergeTimeout}\n onChange={setMergeTimeout}\n onBlur={() => {\n if (mergeTimeout !== originalMergeTimeout)\n save(buildWorkflowPayload({ mergeTimeout }));\n }}\n defaultSeconds={1800}\n />\n </SettingsRow>\n <SubsectionLabel>\n {t('settings.stageTimeouts.subsections.analyzeRepoAgent')}\n </SubsectionLabel>\n <SettingsRow\n label={t('settings.stageTimeouts.analyze')}\n description={t('settings.stageTimeouts.analyzeDescription')}\n htmlFor=\"timeout-analyze-repo\"\n >\n <TimeoutSlider\n id=\"timeout-analyze-repo\"\n testId=\"timeout-analyze-repo-input\"\n value={analyzeRepoTimeout}\n onChange={setAnalyzeRepoTimeout}\n onBlur={() => {\n if (analyzeRepoTimeout !== originalAnalyzeRepoTimeout)\n save(buildWorkflowPayload({ analyzeRepoTimeout }));\n }}\n defaultSeconds={600}\n />\n </SettingsRow>\n </SettingsSection>\n <SectionHint>{t('settings.stageTimeouts.hint')}</SectionHint>\n </div>\n\n {/* ── Notifications ── */}\n <div\n id=\"section-notifications\"\n className=\"grid scroll-mt-18 grid-cols-1 gap-x-5 rounded-lg lg:grid-cols-[1fr_280px]\"\n >\n <SettingsSection\n icon={Bell}\n title={t('settings.notifications.title')}\n description={t('settings.notifications.sectionDescription')}\n testId=\"notification-settings-section\"\n >\n <SubsectionLabel>{t('settings.notifications.channels')}</SubsectionLabel>\n <SwitchRow\n label={t('settings.notifications.inAppLabel')}\n description={t('settings.notifications.inAppDescription')}\n id=\"notif-in-app\"\n testId=\"switch-in-app\"\n checked={inApp}\n onChange={(v) => {\n setInApp(v);\n save(buildNotificationPayload({ inApp: v }));\n }}\n />\n\n <SubsectionLabel>{t('settings.notifications.subsections.agentEvents')}</SubsectionLabel>\n <SwitchRow\n label={t('settings.notifications.events.agentStarted')}\n id=\"notif-event-agentStarted\"\n testId=\"switch-event-agentStarted\"\n checked={events.agentStarted}\n onChange={(v) => {\n const newEvents = { ...events, agentStarted: v };\n setEvents(newEvents);\n save(buildNotificationPayload({ events: newEvents }));\n }}\n />\n <SwitchRow\n label={t('settings.notifications.events.phaseCompleted')}\n id=\"notif-event-phaseCompleted\"\n testId=\"switch-event-phaseCompleted\"\n checked={events.phaseCompleted}\n onChange={(v) => {\n const newEvents = { ...events, phaseCompleted: v };\n setEvents(newEvents);\n save(buildNotificationPayload({ events: newEvents }));\n }}\n />\n <SwitchRow\n label={t('settings.notifications.events.waitingApproval')}\n id=\"notif-event-waitingApproval\"\n testId=\"switch-event-waitingApproval\"\n checked={events.waitingApproval}\n onChange={(v) => {\n const newEvents = { ...events, waitingApproval: v };\n setEvents(newEvents);\n save(buildNotificationPayload({ events: newEvents }));\n }}\n />\n <SwitchRow\n label={t('settings.notifications.events.agentCompleted')}\n id=\"notif-event-agentCompleted\"\n testId=\"switch-event-agentCompleted\"\n checked={events.agentCompleted}\n onChange={(v) => {\n const newEvents = { ...events, agentCompleted: v };\n setEvents(newEvents);\n save(buildNotificationPayload({ events: newEvents }));\n }}\n />\n <SwitchRow\n label={t('settings.notifications.events.agentFailed')}\n id=\"notif-event-agentFailed\"\n testId=\"switch-event-agentFailed\"\n checked={events.agentFailed}\n onChange={(v) => {\n const newEvents = { ...events, agentFailed: v };\n setEvents(newEvents);\n save(buildNotificationPayload({ events: newEvents }));\n }}\n />\n\n <SubsectionLabel>\n {t('settings.notifications.subsections.pullRequestEvents')}\n </SubsectionLabel>\n <SwitchRow\n label={t('settings.notifications.events.prMerged')}\n id=\"notif-event-prMerged\"\n testId=\"switch-event-prMerged\"\n checked={events.prMerged}\n onChange={(v) => {\n const newEvents = { ...events, prMerged: v };\n setEvents(newEvents);\n save(buildNotificationPayload({ events: newEvents }));\n }}\n />\n <SwitchRow\n label={t('settings.notifications.events.prClosed')}\n id=\"notif-event-prClosed\"\n testId=\"switch-event-prClosed\"\n checked={events.prClosed}\n onChange={(v) => {\n const newEvents = { ...events, prClosed: v };\n setEvents(newEvents);\n save(buildNotificationPayload({ events: newEvents }));\n }}\n />\n <SwitchRow\n label={t('settings.notifications.events.prChecksPassed')}\n id=\"notif-event-prChecksPassed\"\n testId=\"switch-event-prChecksPassed\"\n checked={events.prChecksPassed}\n onChange={(v) => {\n const newEvents = { ...events, prChecksPassed: v };\n setEvents(newEvents);\n save(buildNotificationPayload({ events: newEvents }));\n }}\n />\n <SwitchRow\n label={t('settings.notifications.events.prChecksFailed')}\n id=\"notif-event-prChecksFailed\"\n testId=\"switch-event-prChecksFailed\"\n checked={events.prChecksFailed}\n onChange={(v) => {\n const newEvents = { ...events, prChecksFailed: v };\n setEvents(newEvents);\n save(buildNotificationPayload({ events: newEvents }));\n }}\n />\n <SwitchRow\n label={t('settings.notifications.events.prBlocked')}\n id=\"notif-event-prBlocked\"\n testId=\"switch-event-prBlocked\"\n checked={events.prBlocked}\n onChange={(v) => {\n const newEvents = { ...events, prBlocked: v };\n setEvents(newEvents);\n save(buildNotificationPayload({ events: newEvents }));\n }}\n />\n <SwitchRow\n label={t('settings.notifications.events.mergeReviewReady')}\n id=\"notif-event-mergeReviewReady\"\n testId=\"switch-event-mergeReviewReady\"\n checked={events.mergeReviewReady}\n onChange={(v) => {\n const newEvents = { ...events, mergeReviewReady: v };\n setEvents(newEvents);\n save(buildNotificationPayload({ events: newEvents }));\n }}\n />\n </SettingsSection>\n <SectionHint\n links={[\n {\n label: t('settings.notifications.links.notificationSystem'),\n href: 'https://github.com/shep-ai/shep/blob/main/specs/021-agent-notifications/spec.yaml',\n },\n ]}\n >\n {t('settings.notifications.hint')}\n </SectionHint>\n </div>\n\n {/* ── Feature Flags ── */}\n <div\n id=\"section-feature-flags\"\n className=\"grid scroll-mt-18 grid-cols-1 gap-x-5 rounded-lg lg:grid-cols-[1fr_280px]\"\n >\n <SettingsSection\n icon={Flag}\n title={t('settings.featureFlags.title')}\n description={t('settings.featureFlags.sectionDescription')}\n badge={t('settings.featureFlags.badge')}\n testId=\"feature-flags-settings-section\"\n >\n <SwitchRow\n label={t('settings.featureFlags.skills')}\n description={t('settings.featureFlags.skillsDescription')}\n id=\"flag-skills\"\n testId=\"switch-flag-skills\"\n checked={flags.skills}\n onChange={(v) => {\n const newFlags = { ...flags, skills: v };\n setFlags(newFlags);\n save({ featureFlags: newFlags });\n }}\n />\n <SwitchRow\n label={t('settings.featureFlags.deployments')}\n description={t('settings.featureFlags.deploymentsDescription')}\n id=\"flag-envDeploy\"\n testId=\"switch-flag-envDeploy\"\n checked={flags.envDeploy}\n onChange={(v) => {\n const newFlags = { ...flags, envDeploy: v };\n setFlags(newFlags);\n save({ featureFlags: newFlags });\n }}\n />\n <SwitchRow\n label={t('settings.featureFlags.debug')}\n description={t('settings.featureFlags.debugDescription')}\n id=\"flag-debug\"\n testId=\"switch-flag-debug\"\n checked={flags.debug}\n onChange={(v) => {\n const newFlags = { ...flags, debug: v };\n setFlags(newFlags);\n save({ featureFlags: newFlags });\n }}\n />\n <SwitchRow\n label={t('settings.featureFlags.githubImport')}\n description={t('settings.featureFlags.githubImportDescription')}\n id=\"flag-githubImport\"\n testId=\"switch-flag-githubImport\"\n checked={flags.githubImport}\n onChange={(v) => {\n const newFlags = { ...flags, githubImport: v };\n setFlags(newFlags);\n save({ featureFlags: newFlags });\n }}\n />\n <SwitchRow\n label={t('settings.featureFlags.adoptBranch')}\n description={t('settings.featureFlags.adoptBranchDescription')}\n id=\"flag-adoptBranch\"\n testId=\"switch-flag-adoptBranch\"\n checked={flags.adoptBranch}\n onChange={(v) => {\n const newFlags = { ...flags, adoptBranch: v };\n setFlags(newFlags);\n save({ featureFlags: newFlags });\n }}\n />\n <SwitchRow\n label={t('settings.featureFlags.gitRebaseSync')}\n description={t('settings.featureFlags.gitRebaseSyncDescription')}\n id=\"flag-gitRebaseSync\"\n testId=\"switch-flag-gitRebaseSync\"\n checked={flags.gitRebaseSync}\n onChange={(v) => {\n const newFlags = { ...flags, gitRebaseSync: v };\n setFlags(newFlags);\n save({ featureFlags: newFlags });\n }}\n />\n <SwitchRow\n label={t('settings.featureFlags.reactFileManager')}\n description={t('settings.featureFlags.reactFileManagerDescription')}\n id=\"flag-reactFileManager\"\n testId=\"switch-flag-reactFileManager\"\n checked={flags.reactFileManager}\n onChange={(v) => {\n const newFlags = { ...flags, reactFileManager: v };\n setFlags(newFlags);\n save({ featureFlags: newFlags });\n }}\n />\n <SwitchRow\n label={t('settings.featureFlags.inventory')}\n description={t('settings.featureFlags.inventoryDescription')}\n id=\"flag-inventory\"\n testId=\"switch-flag-inventory\"\n checked={flags.inventory}\n onChange={(v) => {\n const newFlags = { ...flags, inventory: v };\n setFlags(newFlags);\n save({ featureFlags: newFlags });\n }}\n />\n </SettingsSection>\n <SectionHint>{t('settings.featureFlags.hint')}</SectionHint>\n </div>\n\n {/* ── Interactive Agent ── */}\n <div\n id=\"section-interactive-agent\"\n className=\"grid scroll-mt-18 grid-cols-1 gap-x-5 rounded-lg lg:grid-cols-[1fr_280px]\"\n >\n <SettingsSection\n icon={MessageSquare}\n title={t('settings.interactiveAgent.title')}\n description={t('settings.interactiveAgent.description')}\n testId=\"interactive-agent-settings-section\"\n >\n <SwitchRow\n label={t('settings.interactiveAgent.enableChatTab')}\n description={t('settings.interactiveAgent.enableChatTabDescription')}\n id=\"interactive-agent-enabled\"\n testId=\"switch-interactive-agent-enabled\"\n checked={interactiveEnabled}\n onChange={(v) => {\n setInteractiveEnabled(v);\n save({\n interactiveAgent: {\n enabled: v,\n autoTimeoutMinutes: parseInt(interactiveTimeout, 10) || 15,\n maxConcurrentSessions: parseInt(interactiveSessions, 10) || 3,\n },\n });\n }}\n />\n <SettingsRow\n label={t('settings.interactiveAgent.autoTimeout')}\n description={t('settings.interactiveAgent.autoTimeoutDescription')}\n htmlFor=\"interactive-agent-timeout\"\n >\n <NumberStepper\n id=\"interactive-agent-timeout\"\n testId=\"input-interactive-agent-timeout\"\n value={interactiveTimeout}\n placeholder=\"15\"\n min={1}\n max={120}\n suffix=\"min\"\n onChange={setInteractiveTimeout}\n onBlur={() => {\n const n = parseInt(interactiveTimeout, 10);\n const clamped = Number.isNaN(n) ? 15 : Math.min(120, Math.max(1, n));\n const clamped_str = String(clamped);\n setInteractiveTimeout(clamped_str);\n save({\n interactiveAgent: {\n enabled: interactiveEnabled,\n autoTimeoutMinutes: clamped,\n maxConcurrentSessions: parseInt(interactiveSessions, 10) || 3,\n },\n });\n }}\n />\n </SettingsRow>\n <SettingsRow\n label={t('settings.interactiveAgent.maxConcurrentSessions')}\n description={t('settings.interactiveAgent.maxConcurrentSessionsDescription')}\n htmlFor=\"interactive-agent-sessions\"\n >\n <NumberStepper\n id=\"interactive-agent-sessions\"\n testId=\"input-interactive-agent-sessions\"\n value={interactiveSessions}\n placeholder=\"3\"\n min={1}\n max={10}\n onChange={setInteractiveSessions}\n onBlur={() => {\n const n = parseInt(interactiveSessions, 10);\n const clamped = Number.isNaN(n) ? 3 : Math.min(10, Math.max(1, n));\n const clamped_str = String(clamped);\n setInteractiveSessions(clamped_str);\n save({\n interactiveAgent: {\n enabled: interactiveEnabled,\n autoTimeoutMinutes: parseInt(interactiveTimeout, 10) || 15,\n maxConcurrentSessions: clamped,\n },\n });\n }}\n />\n </SettingsRow>\n </SettingsSection>\n <SectionHint>{t('settings.interactiveAgent.hint')}</SectionHint>\n </div>\n\n {/* ── FAB Layout ── */}\n <div\n id=\"section-fab-layout\"\n className=\"grid scroll-mt-18 grid-cols-1 gap-x-5 rounded-lg lg:grid-cols-[1fr_280px]\"\n >\n <SettingsSection\n icon={LayoutGrid}\n title={t('settings.fabLayout.title')}\n description={t('settings.fabLayout.description')}\n testId=\"fab-layout-settings-section\"\n >\n <SwitchRow\n label={t('settings.fabLayout.swapPosition')}\n description={t('settings.fabLayout.swapPositionDescription')}\n id=\"fab-swap-position\"\n testId=\"switch-fab-swap-position\"\n checked={fabSwapPosition}\n onChange={(v) => {\n setFabSwapPosition(v);\n save({ fabLayout: { swapPosition: v } });\n }}\n />\n </SettingsSection>\n <SectionHint>{t('settings.fabLayout.hint')}</SectionHint>\n </div>\n\n {/* ── Database ── */}\n <div\n id=\"section-database\"\n className=\"grid scroll-mt-18 grid-cols-1 gap-x-5 rounded-lg lg:grid-cols-[1fr_280px]\"\n >\n <SettingsSection\n icon={Database}\n title={t('settings.database.title')}\n description={t('settings.database.sectionDescription')}\n testId=\"database-settings-section\"\n >\n <SettingsRow\n label={t('settings.database.location')}\n description={t('settings.database.locationDescription')}\n >\n <span\n className=\"text-muted-foreground max-w-50 truncate font-mono text-xs\"\n data-testid=\"shep-home-path\"\n >\n {shepHome}\n </span>\n </SettingsRow>\n <SettingsRow label={t('settings.database.size')}>\n <span className=\"text-muted-foreground text-xs\" data-testid=\"db-file-size\">\n {dbFileSize}\n </span>\n </SettingsRow>\n </SettingsSection>\n <SectionHint\n links={[\n {\n label: t('settings.database.links.settingsService'),\n href: 'https://github.com/shep-ai/shep/blob/main/docs/architecture/settings-service.md',\n },\n {\n label: t('settings.database.links.settingsSpec'),\n href: 'https://github.com/shep-ai/shep/blob/main/specs/005-global-settings-service/spec.md',\n },\n ]}\n >\n {t('settings.database.hint')}\n </SectionHint>\n </div>\n </div>\n </div>\n );\n}\n","/* __next_internal_action_entry_do_not_use__ [{\"409b76980a998d392c95b11c7d25e547f33c206c32\":\"updateSettingsAction\"},\"src/presentation/web/app/actions/update-settings.ts\",\"\"] */\"use turbopack no side effects\";import{createServerReference,callServer,findSourceMapURL}from\"private-next-rsc-action-client-wrapper\";const $$RSC_SERVER_ACTION_0=/*#__PURE__*/createServerReference(\"409b76980a998d392c95b11c7d25e547f33c206c32\",callServer,void 0,findSourceMapURL,\"updateSettingsAction\");export{$$RSC_SERVER_ACTION_0 as updateSettingsAction};","'use client';\n\nimport { useState, useTransition, useRef, useEffect } from 'react';\nimport { Globe, Check } from 'lucide-react';\nimport { toast } from 'sonner';\nimport { useTranslation } from 'react-i18next';\nimport { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@/components/ui/card';\nimport { Label } from '@/components/ui/label';\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from '@/components/ui/select';\nimport { updateSettingsAction } from '@/app/actions/update-settings';\nimport { Language } from '@shepai/core/domain/generated/output';\n\nconst LANGUAGE_OPTIONS = [\n { value: Language.English, label: 'English', nativeName: 'English' },\n { value: Language.Russian, label: 'Русский', nativeName: 'Русский' },\n { value: Language.Portuguese, label: 'Português', nativeName: 'Português' },\n { value: Language.Spanish, label: 'Español', nativeName: 'Español' },\n { value: Language.Arabic, label: 'العربية', nativeName: 'العربية' },\n { value: Language.Hebrew, label: 'עברית', nativeName: 'עברית' },\n { value: Language.French, label: 'Français', nativeName: 'Français' },\n { value: Language.German, label: 'Deutsch', nativeName: 'Deutsch' },\n];\n\nexport interface LanguageSettingsSectionProps {\n language: string;\n}\n\nexport function LanguageSettingsSection({\n language: initialLanguage,\n}: LanguageSettingsSectionProps) {\n const { t, i18n } = useTranslation('web');\n const [language, setLanguage] = useState(initialLanguage);\n const [isPending, startTransition] = useTransition();\n const [showSaved, setShowSaved] = useState(false);\n const prevPendingRef = useRef(false);\n\n useEffect(() => {\n if (prevPendingRef.current && !isPending) {\n setShowSaved(true);\n const timer = setTimeout(() => setShowSaved(false), 2000);\n return () => clearTimeout(timer);\n }\n prevPendingRef.current = isPending;\n }, [isPending]);\n\n function handleLanguageChange(value: string) {\n setLanguage(value);\n // Update i18n language immediately for instant UI feedback\n i18n.changeLanguage(value);\n // Update document direction for RTL languages\n const dir = value === 'ar' || value === 'he' ? 'rtl' : 'ltr';\n document.documentElement.lang = value;\n document.documentElement.dir = dir;\n\n startTransition(async () => {\n const result = await updateSettingsAction({\n user: { preferredLanguage: value as Language },\n });\n if (!result.success) {\n toast.error(\n result.error ?? t('settings.language.failedToSave', 'Failed to save language settings')\n );\n }\n });\n }\n\n return (\n <Card id=\"language\" className=\"scroll-mt-6\" data-testid=\"language-settings-section\">\n <CardHeader>\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-2\">\n <Globe className=\"text-muted-foreground h-4 w-4\" />\n <CardTitle>{t('settings.language.title')}</CardTitle>\n </div>\n {isPending ? (\n <span className=\"text-muted-foreground text-xs\">{t('common:labels.saving')}</span>\n ) : null}\n {showSaved && !isPending ? (\n <span className=\"flex items-center gap-1 text-xs text-green-600\">\n <Check className=\"h-3 w-3\" />\n {t('common:labels.saved')}\n </span>\n ) : null}\n </div>\n <CardDescription>{t('settings.language.description')}</CardDescription>\n </CardHeader>\n <CardContent className=\"space-y-4\">\n <div className=\"space-y-2\">\n <Label htmlFor=\"display-language\">{t('settings.language.label')}</Label>\n <Select value={language} onValueChange={handleLanguageChange}>\n <SelectTrigger id=\"display-language\" data-testid=\"language-select\">\n <SelectValue placeholder={t('settings.language.placeholder')} />\n </SelectTrigger>\n <SelectContent>\n {LANGUAGE_OPTIONS.map((opt) => (\n <SelectItem key={opt.value} value={opt.value}>\n {opt.nativeName}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n </CardContent>\n </Card>\n );\n}\n","\"use client\";\n\n// src/slider.tsx\nimport * as React from \"react\";\nimport { clamp } from \"@radix-ui/number\";\nimport { composeEventHandlers } from \"@radix-ui/primitive\";\nimport { useComposedRefs } from \"@radix-ui/react-compose-refs\";\nimport { createContextScope } from \"@radix-ui/react-context\";\nimport { useControllableState } from \"@radix-ui/react-use-controllable-state\";\nimport { useDirection } from \"@radix-ui/react-direction\";\nimport { usePrevious } from \"@radix-ui/react-use-previous\";\nimport { useSize } from \"@radix-ui/react-use-size\";\nimport { Primitive } from \"@radix-ui/react-primitive\";\nimport { createCollection } from \"@radix-ui/react-collection\";\nimport { jsx, jsxs } from \"react/jsx-runtime\";\nvar PAGE_KEYS = [\"PageUp\", \"PageDown\"];\nvar ARROW_KEYS = [\"ArrowUp\", \"ArrowDown\", \"ArrowLeft\", \"ArrowRight\"];\nvar BACK_KEYS = {\n \"from-left\": [\"Home\", \"PageDown\", \"ArrowDown\", \"ArrowLeft\"],\n \"from-right\": [\"Home\", \"PageDown\", \"ArrowDown\", \"ArrowRight\"],\n \"from-bottom\": [\"Home\", \"PageDown\", \"ArrowDown\", \"ArrowLeft\"],\n \"from-top\": [\"Home\", \"PageDown\", \"ArrowUp\", \"ArrowLeft\"]\n};\nvar SLIDER_NAME = \"Slider\";\nvar [Collection, useCollection, createCollectionScope] = createCollection(SLIDER_NAME);\nvar [createSliderContext, createSliderScope] = createContextScope(SLIDER_NAME, [\n createCollectionScope\n]);\nvar [SliderProvider, useSliderContext] = createSliderContext(SLIDER_NAME);\nvar Slider = React.forwardRef(\n (props, forwardedRef) => {\n const {\n name,\n min = 0,\n max = 100,\n step = 1,\n orientation = \"horizontal\",\n disabled = false,\n minStepsBetweenThumbs = 0,\n defaultValue = [min],\n value,\n onValueChange = () => {\n },\n onValueCommit = () => {\n },\n inverted = false,\n form,\n ...sliderProps\n } = props;\n const thumbRefs = React.useRef(/* @__PURE__ */ new Set());\n const valueIndexToChangeRef = React.useRef(0);\n const isHorizontal = orientation === \"horizontal\";\n const SliderOrientation = isHorizontal ? SliderHorizontal : SliderVertical;\n const [values = [], setValues] = useControllableState({\n prop: value,\n defaultProp: defaultValue,\n onChange: (value2) => {\n const thumbs = [...thumbRefs.current];\n thumbs[valueIndexToChangeRef.current]?.focus();\n onValueChange(value2);\n }\n });\n const valuesBeforeSlideStartRef = React.useRef(values);\n function handleSlideStart(value2) {\n const closestIndex = getClosestValueIndex(values, value2);\n updateValues(value2, closestIndex);\n }\n function handleSlideMove(value2) {\n updateValues(value2, valueIndexToChangeRef.current);\n }\n function handleSlideEnd() {\n const prevValue = valuesBeforeSlideStartRef.current[valueIndexToChangeRef.current];\n const nextValue = values[valueIndexToChangeRef.current];\n const hasChanged = nextValue !== prevValue;\n if (hasChanged) onValueCommit(values);\n }\n function updateValues(value2, atIndex, { commit } = { commit: false }) {\n const decimalCount = getDecimalCount(step);\n const snapToStep = roundValue(Math.round((value2 - min) / step) * step + min, decimalCount);\n const nextValue = clamp(snapToStep, [min, max]);\n setValues((prevValues = []) => {\n const nextValues = getNextSortedValues(prevValues, nextValue, atIndex);\n if (hasMinStepsBetweenValues(nextValues, minStepsBetweenThumbs * step)) {\n valueIndexToChangeRef.current = nextValues.indexOf(nextValue);\n const hasChanged = String(nextValues) !== String(prevValues);\n if (hasChanged && commit) onValueCommit(nextValues);\n return hasChanged ? nextValues : prevValues;\n } else {\n return prevValues;\n }\n });\n }\n return /* @__PURE__ */ jsx(\n SliderProvider,\n {\n scope: props.__scopeSlider,\n name,\n disabled,\n min,\n max,\n valueIndexToChangeRef,\n thumbs: thumbRefs.current,\n values,\n orientation,\n form,\n children: /* @__PURE__ */ jsx(Collection.Provider, { scope: props.__scopeSlider, children: /* @__PURE__ */ jsx(Collection.Slot, { scope: props.__scopeSlider, children: /* @__PURE__ */ jsx(\n SliderOrientation,\n {\n \"aria-disabled\": disabled,\n \"data-disabled\": disabled ? \"\" : void 0,\n ...sliderProps,\n ref: forwardedRef,\n onPointerDown: composeEventHandlers(sliderProps.onPointerDown, () => {\n if (!disabled) valuesBeforeSlideStartRef.current = values;\n }),\n min,\n max,\n inverted,\n onSlideStart: disabled ? void 0 : handleSlideStart,\n onSlideMove: disabled ? void 0 : handleSlideMove,\n onSlideEnd: disabled ? void 0 : handleSlideEnd,\n onHomeKeyDown: () => !disabled && updateValues(min, 0, { commit: true }),\n onEndKeyDown: () => !disabled && updateValues(max, values.length - 1, { commit: true }),\n onStepKeyDown: ({ event, direction: stepDirection }) => {\n if (!disabled) {\n const isPageKey = PAGE_KEYS.includes(event.key);\n const isSkipKey = isPageKey || event.shiftKey && ARROW_KEYS.includes(event.key);\n const multiplier = isSkipKey ? 10 : 1;\n const atIndex = valueIndexToChangeRef.current;\n const value2 = values[atIndex];\n const stepInDirection = step * multiplier * stepDirection;\n updateValues(value2 + stepInDirection, atIndex, { commit: true });\n }\n }\n }\n ) }) })\n }\n );\n }\n);\nSlider.displayName = SLIDER_NAME;\nvar [SliderOrientationProvider, useSliderOrientationContext] = createSliderContext(SLIDER_NAME, {\n startEdge: \"left\",\n endEdge: \"right\",\n size: \"width\",\n direction: 1\n});\nvar SliderHorizontal = React.forwardRef(\n (props, forwardedRef) => {\n const {\n min,\n max,\n dir,\n inverted,\n onSlideStart,\n onSlideMove,\n onSlideEnd,\n onStepKeyDown,\n ...sliderProps\n } = props;\n const [slider, setSlider] = React.useState(null);\n const composedRefs = useComposedRefs(forwardedRef, (node) => setSlider(node));\n const rectRef = React.useRef(void 0);\n const direction = useDirection(dir);\n const isDirectionLTR = direction === \"ltr\";\n const isSlidingFromLeft = isDirectionLTR && !inverted || !isDirectionLTR && inverted;\n function getValueFromPointer(pointerPosition) {\n const rect = rectRef.current || slider.getBoundingClientRect();\n const input = [0, rect.width];\n const output = isSlidingFromLeft ? [min, max] : [max, min];\n const value = linearScale(input, output);\n rectRef.current = rect;\n return value(pointerPosition - rect.left);\n }\n return /* @__PURE__ */ jsx(\n SliderOrientationProvider,\n {\n scope: props.__scopeSlider,\n startEdge: isSlidingFromLeft ? \"left\" : \"right\",\n endEdge: isSlidingFromLeft ? \"right\" : \"left\",\n direction: isSlidingFromLeft ? 1 : -1,\n size: \"width\",\n children: /* @__PURE__ */ jsx(\n SliderImpl,\n {\n dir: direction,\n \"data-orientation\": \"horizontal\",\n ...sliderProps,\n ref: composedRefs,\n style: {\n ...sliderProps.style,\n [\"--radix-slider-thumb-transform\"]: \"translateX(-50%)\"\n },\n onSlideStart: (event) => {\n const value = getValueFromPointer(event.clientX);\n onSlideStart?.(value);\n },\n onSlideMove: (event) => {\n const value = getValueFromPointer(event.clientX);\n onSlideMove?.(value);\n },\n onSlideEnd: () => {\n rectRef.current = void 0;\n onSlideEnd?.();\n },\n onStepKeyDown: (event) => {\n const slideDirection = isSlidingFromLeft ? \"from-left\" : \"from-right\";\n const isBackKey = BACK_KEYS[slideDirection].includes(event.key);\n onStepKeyDown?.({ event, direction: isBackKey ? -1 : 1 });\n }\n }\n )\n }\n );\n }\n);\nvar SliderVertical = React.forwardRef(\n (props, forwardedRef) => {\n const {\n min,\n max,\n inverted,\n onSlideStart,\n onSlideMove,\n onSlideEnd,\n onStepKeyDown,\n ...sliderProps\n } = props;\n const sliderRef = React.useRef(null);\n const ref = useComposedRefs(forwardedRef, sliderRef);\n const rectRef = React.useRef(void 0);\n const isSlidingFromBottom = !inverted;\n function getValueFromPointer(pointerPosition) {\n const rect = rectRef.current || sliderRef.current.getBoundingClientRect();\n const input = [0, rect.height];\n const output = isSlidingFromBottom ? [max, min] : [min, max];\n const value = linearScale(input, output);\n rectRef.current = rect;\n return value(pointerPosition - rect.top);\n }\n return /* @__PURE__ */ jsx(\n SliderOrientationProvider,\n {\n scope: props.__scopeSlider,\n startEdge: isSlidingFromBottom ? \"bottom\" : \"top\",\n endEdge: isSlidingFromBottom ? \"top\" : \"bottom\",\n size: \"height\",\n direction: isSlidingFromBottom ? 1 : -1,\n children: /* @__PURE__ */ jsx(\n SliderImpl,\n {\n \"data-orientation\": \"vertical\",\n ...sliderProps,\n ref,\n style: {\n ...sliderProps.style,\n [\"--radix-slider-thumb-transform\"]: \"translateY(50%)\"\n },\n onSlideStart: (event) => {\n const value = getValueFromPointer(event.clientY);\n onSlideStart?.(value);\n },\n onSlideMove: (event) => {\n const value = getValueFromPointer(event.clientY);\n onSlideMove?.(value);\n },\n onSlideEnd: () => {\n rectRef.current = void 0;\n onSlideEnd?.();\n },\n onStepKeyDown: (event) => {\n const slideDirection = isSlidingFromBottom ? \"from-bottom\" : \"from-top\";\n const isBackKey = BACK_KEYS[slideDirection].includes(event.key);\n onStepKeyDown?.({ event, direction: isBackKey ? -1 : 1 });\n }\n }\n )\n }\n );\n }\n);\nvar SliderImpl = React.forwardRef(\n (props, forwardedRef) => {\n const {\n __scopeSlider,\n onSlideStart,\n onSlideMove,\n onSlideEnd,\n onHomeKeyDown,\n onEndKeyDown,\n onStepKeyDown,\n ...sliderProps\n } = props;\n const context = useSliderContext(SLIDER_NAME, __scopeSlider);\n return /* @__PURE__ */ jsx(\n Primitive.span,\n {\n ...sliderProps,\n ref: forwardedRef,\n onKeyDown: composeEventHandlers(props.onKeyDown, (event) => {\n if (event.key === \"Home\") {\n onHomeKeyDown(event);\n event.preventDefault();\n } else if (event.key === \"End\") {\n onEndKeyDown(event);\n event.preventDefault();\n } else if (PAGE_KEYS.concat(ARROW_KEYS).includes(event.key)) {\n onStepKeyDown(event);\n event.preventDefault();\n }\n }),\n onPointerDown: composeEventHandlers(props.onPointerDown, (event) => {\n const target = event.target;\n target.setPointerCapture(event.pointerId);\n event.preventDefault();\n if (context.thumbs.has(target)) {\n target.focus();\n } else {\n onSlideStart(event);\n }\n }),\n onPointerMove: composeEventHandlers(props.onPointerMove, (event) => {\n const target = event.target;\n if (target.hasPointerCapture(event.pointerId)) onSlideMove(event);\n }),\n onPointerUp: composeEventHandlers(props.onPointerUp, (event) => {\n const target = event.target;\n if (target.hasPointerCapture(event.pointerId)) {\n target.releasePointerCapture(event.pointerId);\n onSlideEnd(event);\n }\n })\n }\n );\n }\n);\nvar TRACK_NAME = \"SliderTrack\";\nvar SliderTrack = React.forwardRef(\n (props, forwardedRef) => {\n const { __scopeSlider, ...trackProps } = props;\n const context = useSliderContext(TRACK_NAME, __scopeSlider);\n return /* @__PURE__ */ jsx(\n Primitive.span,\n {\n \"data-disabled\": context.disabled ? \"\" : void 0,\n \"data-orientation\": context.orientation,\n ...trackProps,\n ref: forwardedRef\n }\n );\n }\n);\nSliderTrack.displayName = TRACK_NAME;\nvar RANGE_NAME = \"SliderRange\";\nvar SliderRange = React.forwardRef(\n (props, forwardedRef) => {\n const { __scopeSlider, ...rangeProps } = props;\n const context = useSliderContext(RANGE_NAME, __scopeSlider);\n const orientation = useSliderOrientationContext(RANGE_NAME, __scopeSlider);\n const ref = React.useRef(null);\n const composedRefs = useComposedRefs(forwardedRef, ref);\n const valuesCount = context.values.length;\n const percentages = context.values.map(\n (value) => convertValueToPercentage(value, context.min, context.max)\n );\n const offsetStart = valuesCount > 1 ? Math.min(...percentages) : 0;\n const offsetEnd = 100 - Math.max(...percentages);\n return /* @__PURE__ */ jsx(\n Primitive.span,\n {\n \"data-orientation\": context.orientation,\n \"data-disabled\": context.disabled ? \"\" : void 0,\n ...rangeProps,\n ref: composedRefs,\n style: {\n ...props.style,\n [orientation.startEdge]: offsetStart + \"%\",\n [orientation.endEdge]: offsetEnd + \"%\"\n }\n }\n );\n }\n);\nSliderRange.displayName = RANGE_NAME;\nvar THUMB_NAME = \"SliderThumb\";\nvar SliderThumb = React.forwardRef(\n (props, forwardedRef) => {\n const getItems = useCollection(props.__scopeSlider);\n const [thumb, setThumb] = React.useState(null);\n const composedRefs = useComposedRefs(forwardedRef, (node) => setThumb(node));\n const index = React.useMemo(\n () => thumb ? getItems().findIndex((item) => item.ref.current === thumb) : -1,\n [getItems, thumb]\n );\n return /* @__PURE__ */ jsx(SliderThumbImpl, { ...props, ref: composedRefs, index });\n }\n);\nvar SliderThumbImpl = React.forwardRef(\n (props, forwardedRef) => {\n const { __scopeSlider, index, name, ...thumbProps } = props;\n const context = useSliderContext(THUMB_NAME, __scopeSlider);\n const orientation = useSliderOrientationContext(THUMB_NAME, __scopeSlider);\n const [thumb, setThumb] = React.useState(null);\n const composedRefs = useComposedRefs(forwardedRef, (node) => setThumb(node));\n const isFormControl = thumb ? context.form || !!thumb.closest(\"form\") : true;\n const size = useSize(thumb);\n const value = context.values[index];\n const percent = value === void 0 ? 0 : convertValueToPercentage(value, context.min, context.max);\n const label = getLabel(index, context.values.length);\n const orientationSize = size?.[orientation.size];\n const thumbInBoundsOffset = orientationSize ? getThumbInBoundsOffset(orientationSize, percent, orientation.direction) : 0;\n React.useEffect(() => {\n if (thumb) {\n context.thumbs.add(thumb);\n return () => {\n context.thumbs.delete(thumb);\n };\n }\n }, [thumb, context.thumbs]);\n return /* @__PURE__ */ jsxs(\n \"span\",\n {\n style: {\n transform: \"var(--radix-slider-thumb-transform)\",\n position: \"absolute\",\n [orientation.startEdge]: `calc(${percent}% + ${thumbInBoundsOffset}px)`\n },\n children: [\n /* @__PURE__ */ jsx(Collection.ItemSlot, { scope: props.__scopeSlider, children: /* @__PURE__ */ jsx(\n Primitive.span,\n {\n role: \"slider\",\n \"aria-label\": props[\"aria-label\"] || label,\n \"aria-valuemin\": context.min,\n \"aria-valuenow\": value,\n \"aria-valuemax\": context.max,\n \"aria-orientation\": context.orientation,\n \"data-orientation\": context.orientation,\n \"data-disabled\": context.disabled ? \"\" : void 0,\n tabIndex: context.disabled ? void 0 : 0,\n ...thumbProps,\n ref: composedRefs,\n style: value === void 0 ? { display: \"none\" } : props.style,\n onFocus: composeEventHandlers(props.onFocus, () => {\n context.valueIndexToChangeRef.current = index;\n })\n }\n ) }),\n isFormControl && /* @__PURE__ */ jsx(\n SliderBubbleInput,\n {\n name: name ?? (context.name ? context.name + (context.values.length > 1 ? \"[]\" : \"\") : void 0),\n form: context.form,\n value\n },\n index\n )\n ]\n }\n );\n }\n);\nSliderThumb.displayName = THUMB_NAME;\nvar BUBBLE_INPUT_NAME = \"RadioBubbleInput\";\nvar SliderBubbleInput = React.forwardRef(\n ({ __scopeSlider, value, ...props }, forwardedRef) => {\n const ref = React.useRef(null);\n const composedRefs = useComposedRefs(ref, forwardedRef);\n const prevValue = usePrevious(value);\n React.useEffect(() => {\n const input = ref.current;\n if (!input) return;\n const inputProto = window.HTMLInputElement.prototype;\n const descriptor = Object.getOwnPropertyDescriptor(inputProto, \"value\");\n const setValue = descriptor.set;\n if (prevValue !== value && setValue) {\n const event = new Event(\"input\", { bubbles: true });\n setValue.call(input, value);\n input.dispatchEvent(event);\n }\n }, [prevValue, value]);\n return /* @__PURE__ */ jsx(\n Primitive.input,\n {\n style: { display: \"none\" },\n ...props,\n ref: composedRefs,\n defaultValue: value\n }\n );\n }\n);\nSliderBubbleInput.displayName = BUBBLE_INPUT_NAME;\nfunction getNextSortedValues(prevValues = [], nextValue, atIndex) {\n const nextValues = [...prevValues];\n nextValues[atIndex] = nextValue;\n return nextValues.sort((a, b) => a - b);\n}\nfunction convertValueToPercentage(value, min, max) {\n const maxSteps = max - min;\n const percentPerStep = 100 / maxSteps;\n const percentage = percentPerStep * (value - min);\n return clamp(percentage, [0, 100]);\n}\nfunction getLabel(index, totalValues) {\n if (totalValues > 2) {\n return `Value ${index + 1} of ${totalValues}`;\n } else if (totalValues === 2) {\n return [\"Minimum\", \"Maximum\"][index];\n } else {\n return void 0;\n }\n}\nfunction getClosestValueIndex(values, nextValue) {\n if (values.length === 1) return 0;\n const distances = values.map((value) => Math.abs(value - nextValue));\n const closestDistance = Math.min(...distances);\n return distances.indexOf(closestDistance);\n}\nfunction getThumbInBoundsOffset(width, left, direction) {\n const halfWidth = width / 2;\n const halfPercent = 50;\n const offset = linearScale([0, halfPercent], [0, halfWidth]);\n return (halfWidth - offset(left) * direction) * direction;\n}\nfunction getStepsBetweenValues(values) {\n return values.slice(0, -1).map((value, index) => values[index + 1] - value);\n}\nfunction hasMinStepsBetweenValues(values, minStepsBetweenValues) {\n if (minStepsBetweenValues > 0) {\n const stepsBetweenValues = getStepsBetweenValues(values);\n const actualMinStepsBetweenValues = Math.min(...stepsBetweenValues);\n return actualMinStepsBetweenValues >= minStepsBetweenValues;\n }\n return true;\n}\nfunction linearScale(input, output) {\n return (value) => {\n if (input[0] === input[1] || output[0] === output[1]) return output[0];\n const ratio = (output[1] - output[0]) / (input[1] - input[0]);\n return output[0] + ratio * (value - input[0]);\n };\n}\nfunction getDecimalCount(value) {\n return (String(value).split(\".\")[1] || \"\").length;\n}\nfunction roundValue(value, decimalCount) {\n const rounder = Math.pow(10, decimalCount);\n return Math.round(value * rounder) / rounder;\n}\nvar Root = Slider;\nvar Track = SliderTrack;\nvar Range = SliderRange;\nvar Thumb = SliderThumb;\nexport {\n Range,\n Root,\n Slider,\n SliderRange,\n SliderThumb,\n SliderTrack,\n Thumb,\n Track,\n createSliderScope\n};\n//# sourceMappingURL=index.mjs.map\n","'use client';\n\nimport * as React from 'react';\nimport { Slider as SliderPrimitive } from 'radix-ui';\n\nimport { cn } from '@/lib/utils';\n\nfunction Slider({\n className,\n defaultValue,\n value,\n min = 0,\n max = 100,\n ...props\n}: React.ComponentProps<typeof SliderPrimitive.Root>) {\n const _values = React.useMemo(\n () => (Array.isArray(value) ? value : Array.isArray(defaultValue) ? defaultValue : [min, max]),\n [value, defaultValue, min, max]\n );\n\n return (\n <SliderPrimitive.Root\n data-slot=\"slider\"\n defaultValue={defaultValue}\n value={value}\n min={min}\n max={max}\n className={cn(\n 'relative flex w-full touch-none items-center select-none data-[disabled]:opacity-50 data-[orientation=vertical]:h-full data-[orientation=vertical]:min-h-44 data-[orientation=vertical]:w-auto data-[orientation=vertical]:flex-col',\n className\n )}\n {...props}\n >\n <SliderPrimitive.Track\n data-slot=\"slider-track\"\n className={cn(\n 'bg-muted relative grow overflow-hidden rounded-full data-[orientation=horizontal]:h-1.5 data-[orientation=horizontal]:w-full data-[orientation=vertical]:h-full data-[orientation=vertical]:w-1.5'\n )}\n >\n <SliderPrimitive.Range\n data-slot=\"slider-range\"\n className={cn(\n 'bg-primary absolute data-[orientation=horizontal]:h-full data-[orientation=vertical]:w-full'\n )}\n />\n </SliderPrimitive.Track>\n {Array.from({ length: _values.length }, (_, index) => (\n <SliderPrimitive.Thumb\n data-slot=\"slider-thumb\"\n key={index}\n className=\"border-primary ring-ring/50 block size-4 shrink-0 rounded-full border bg-white shadow-sm transition-[color,box-shadow] hover:ring-4 focus-visible:ring-4 focus-visible:outline-hidden disabled:pointer-events-none disabled:opacity-50\"\n />\n ))}\n </SliderPrimitive.Root>\n );\n}\n\nexport { Slider };\n","'use client';\n\nimport { useState, useCallback } from 'react';\nimport { Slider } from '@/components/ui/slider';\n\n/** Fixed duration presets in seconds — slider snaps to these values */\nconst PRESETS = [\n 60, // 1m\n 120, // 2m\n 300, // 5m\n 600, // 10m\n 900, // 15m\n 1800, // 30m\n 2700, // 45m\n 3600, // 1h\n 7200, // 2h\n 10800, // 3h\n 14400, // 4h\n 21600, // 6h\n 28800, // 8h\n 43200, // 12h\n 86400, // 24h\n];\n\nconst SLIDER_MAX = PRESETS.length - 1;\n\n/** Find the closest preset index for a given seconds value */\nfunction secondsToIndex(seconds: number): number {\n let closest = 0;\n let minDiff = Math.abs(seconds - PRESETS[0]);\n for (let i = 1; i < PRESETS.length; i++) {\n const diff = Math.abs(seconds - PRESETS[i]);\n if (diff < minDiff) {\n minDiff = diff;\n closest = i;\n }\n }\n return closest;\n}\n\nexport interface TimeoutSliderProps {\n id: string;\n testId: string;\n /** Current value in seconds (as a string for form compatibility) */\n value: string;\n onChange: (value: string) => void;\n onBlur: () => void;\n defaultSeconds?: number;\n}\n\nfunction formatDuration(totalSeconds: number): string {\n const hours = Math.floor(totalSeconds / 3600);\n const minutes = Math.round((totalSeconds % 3600) / 60);\n\n if (hours === 0) return `${minutes}m`;\n if (minutes === 0) return `${hours}h`;\n return `${hours}h ${minutes}m`;\n}\n\nexport function TimeoutSlider({\n id,\n testId,\n value,\n onChange,\n onBlur,\n defaultSeconds = 1800,\n}: TimeoutSliderProps) {\n const numValue = value === '' ? defaultSeconds : parseInt(value, 10);\n const seconds = numValue || defaultSeconds;\n\n // Local index state prevents snap-back during drag — updates immediately\n // without waiting for the parent to re-render with the new value.\n const [localIndex, setLocalIndex] = useState(() => secondsToIndex(seconds));\n\n // Sync from props only when the resolved index actually differs\n // (e.g. external reset or server push). Avoids overwriting during drag.\n const propsIndex = secondsToIndex(seconds);\n if (propsIndex !== localIndex && PRESETS[localIndex] !== seconds) {\n setLocalIndex(propsIndex);\n }\n\n const handleChange = useCallback(\n ([i]: number[]) => {\n setLocalIndex(i);\n onChange(String(PRESETS[i]));\n },\n [onChange]\n );\n\n return (\n <div className=\"flex w-55 items-center gap-2\">\n <Slider\n id={id}\n data-testid={testId}\n min={0}\n max={SLIDER_MAX}\n step={1}\n value={[localIndex]}\n onValueChange={handleChange}\n onValueCommit={() => onBlur()}\n className=\"min-w-0 flex-1\"\n />\n <span className=\"text-muted-foreground shrink-0 text-end text-xs tabular-nums\">\n {formatDuration(PRESETS[localIndex])}\n </span>\n </div>\n );\n}\n","import type { ComponentType, SVGProps } from 'react';\nimport Image from 'next/image';\nimport { Code, Rocket } from 'lucide-react';\nimport { cn } from '@/lib/utils';\n\ntype IconProps = SVGProps<SVGSVGElement> & { className?: string };\n\n/** Fallback icon for unknown editor types. */\nfunction DefaultEditorIcon(props: IconProps) {\n return <Code className={cn('h-4 w-4', props.className)} {...(props as object)} />;\n}\n\nfunction VsCodeIcon({ className }: IconProps) {\n return (\n <Image\n src=\"/icons/editors/vscode.svg\"\n alt=\"VS Code\"\n width={24}\n height={24}\n className={cn('rounded-sm object-contain', className)}\n />\n );\n}\nVsCodeIcon.displayName = 'VsCodeIcon';\n\nfunction CursorEditorIcon({ className }: IconProps) {\n return (\n <Image\n src=\"/icons/agents/cursor.jpeg\"\n alt=\"Cursor\"\n width={24}\n height={24}\n className={cn('rounded-sm object-contain', className)}\n />\n );\n}\nCursorEditorIcon.displayName = 'CursorEditorIcon';\n\nfunction WindsurfIcon({ className }: IconProps) {\n return (\n <Image\n src=\"/icons/editors/windsurf.svg\"\n alt=\"Windsurf\"\n width={24}\n height={24}\n className={cn('rounded-sm object-contain', className)}\n />\n );\n}\nWindsurfIcon.displayName = 'WindsurfIcon';\n\nfunction ZedIcon({ className }: IconProps) {\n return (\n <Image\n src=\"/icons/editors/zed.svg\"\n alt=\"Zed\"\n width={24}\n height={24}\n className={cn('rounded-sm object-contain', className)}\n />\n );\n}\nZedIcon.displayName = 'ZedIcon';\n\nfunction AntigravityIcon({ className, ...props }: IconProps) {\n return <Rocket className={cn('h-4 w-4', className)} {...(props as object)} />;\n}\nAntigravityIcon.displayName = 'AntigravityIcon';\n\nconst editorTypeIconMap: Record<string, ComponentType<IconProps>> = {\n vscode: VsCodeIcon,\n cursor: CursorEditorIcon,\n windsurf: WindsurfIcon,\n zed: ZedIcon,\n antigravity: AntigravityIcon,\n};\n\n/** Resolve an editor type string to its corresponding icon component. */\nexport function getEditorTypeIcon(editorType?: string): ComponentType<IconProps> {\n if (editorType && editorType in editorTypeIconMap) {\n return editorTypeIconMap[editorType];\n }\n return DefaultEditorIcon;\n}\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['path', { d: 'M14 17H5', key: 'gfn3mx' }],\n ['path', { d: 'M19 7h-9', key: '6i9tg' }],\n ['circle', { cx: '17', cy: '17', r: '3', key: '18b49y' }],\n ['circle', { cx: '7', cy: '7', r: '3', key: 'dfmy0x' }],\n];\n\n/**\n * @component @name Settings2\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMTQgMTdINSIgLz4KICA8cGF0aCBkPSJNMTkgN2gtOSIgLz4KICA8Y2lyY2xlIGN4PSIxNyIgY3k9IjE3IiByPSIzIiAvPgogIDxjaXJjbGUgY3g9IjciIGN5PSI3IiByPSIzIiAvPgo8L3N2Zz4K) - https://lucide.dev/icons/settings-2\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Settings2 = createLucideIcon('settings-2', __iconNode);\n\nexport default Settings2;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['ellipse', { cx: '12', cy: '5', rx: '9', ry: '3', key: 'msslwz' }],\n ['path', { d: 'M3 5V19A9 3 0 0 0 21 19V5', key: '1wlel7' }],\n ['path', { d: 'M3 12A9 3 0 0 0 21 12', key: 'mv7ke4' }],\n];\n\n/**\n * @component @name Database\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8ZWxsaXBzZSBjeD0iMTIiIGN5PSI1IiByeD0iOSIgcnk9IjMiIC8+CiAgPHBhdGggZD0iTTMgNVYxOUE5IDMgMCAwIDAgMjEgMTlWNSIgLz4KICA8cGF0aCBkPSJNMyAxMkE5IDMgMCAwIDAgMjEgMTIiIC8+Cjwvc3ZnPgo=) - https://lucide.dev/icons/database\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Database = createLucideIcon('database', __iconNode);\n\nexport default Database;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['path', { d: 'M10.268 21a2 2 0 0 0 3.464 0', key: 'vwvbt9' }],\n [\n 'path',\n {\n d: 'M3.262 15.326A1 1 0 0 0 4 17h16a1 1 0 0 0 .74-1.673C19.41 13.956 18 12.499 18 8A6 6 0 0 0 6 8c0 4.499-1.411 5.956-2.738 7.326',\n key: '11g9vi',\n },\n ],\n];\n\n/**\n * @component @name Bell\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMTAuMjY4IDIxYTIgMiAwIDAgMCAzLjQ2NCAwIiAvPgogIDxwYXRoIGQ9Ik0zLjI2MiAxNS4zMjZBMSAxIDAgMCAwIDQgMTdoMTZhMSAxIDAgMCAwIC43NC0xLjY3M0MxOS40MSAxMy45NTYgMTggMTIuNDk5IDE4IDhBNiA2IDAgMCAwIDYgOGMwIDQuNDk5LTEuNDExIDUuOTU2LTIuNzM4IDcuMzI2IiAvPgo8L3N2Zz4K) - https://lucide.dev/icons/bell\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Bell = createLucideIcon('bell', __iconNode);\n\nexport default Bell;\n","import * as React from 'react';\nimport { clamp } from '@radix-ui/number';\nimport { composeEventHandlers } from '@radix-ui/primitive';\nimport { useComposedRefs } from '@radix-ui/react-compose-refs';\nimport { createContextScope } from '@radix-ui/react-context';\nimport { useControllableState } from '@radix-ui/react-use-controllable-state';\nimport { useDirection } from '@radix-ui/react-direction';\nimport { usePrevious } from '@radix-ui/react-use-previous';\nimport { useSize } from '@radix-ui/react-use-size';\nimport { Primitive } from '@radix-ui/react-primitive';\nimport { createCollection } from '@radix-ui/react-collection';\n\nimport type { Scope } from '@radix-ui/react-context';\n\ntype Direction = 'ltr' | 'rtl';\n\nconst PAGE_KEYS = ['PageUp', 'PageDown'];\nconst ARROW_KEYS = ['ArrowUp', 'ArrowDown', 'ArrowLeft', 'ArrowRight'];\n\ntype SlideDirection = 'from-left' | 'from-right' | 'from-bottom' | 'from-top';\nconst BACK_KEYS: Record<SlideDirection, string[]> = {\n 'from-left': ['Home', 'PageDown', 'ArrowDown', 'ArrowLeft'],\n 'from-right': ['Home', 'PageDown', 'ArrowDown', 'ArrowRight'],\n 'from-bottom': ['Home', 'PageDown', 'ArrowDown', 'ArrowLeft'],\n 'from-top': ['Home', 'PageDown', 'ArrowUp', 'ArrowLeft'],\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Slider\n * -----------------------------------------------------------------------------------------------*/\n\nconst SLIDER_NAME = 'Slider';\n\nconst [Collection, useCollection, createCollectionScope] =\n createCollection<SliderThumbElement>(SLIDER_NAME);\n\ntype ScopedProps<P> = P & { __scopeSlider?: Scope };\nconst [createSliderContext, createSliderScope] = createContextScope(SLIDER_NAME, [\n createCollectionScope,\n]);\n\ntype SliderContextValue = {\n name: string | undefined;\n disabled: boolean | undefined;\n min: number;\n max: number;\n values: number[];\n valueIndexToChangeRef: React.MutableRefObject<number>;\n thumbs: Set<SliderThumbElement>;\n orientation: SliderProps['orientation'];\n form: string | undefined;\n};\n\nconst [SliderProvider, useSliderContext] = createSliderContext<SliderContextValue>(SLIDER_NAME);\n\ntype SliderElement = SliderHorizontalElement | SliderVerticalElement;\ninterface SliderProps\n extends Omit<\n SliderHorizontalProps | SliderVerticalProps,\n keyof SliderOrientationPrivateProps | 'defaultValue'\n > {\n name?: string;\n disabled?: boolean;\n orientation?: React.AriaAttributes['aria-orientation'];\n dir?: Direction;\n min?: number;\n max?: number;\n step?: number;\n minStepsBetweenThumbs?: number;\n value?: number[];\n defaultValue?: number[];\n onValueChange?(value: number[]): void;\n onValueCommit?(value: number[]): void;\n inverted?: boolean;\n form?: string;\n}\n\nconst Slider = React.forwardRef<SliderElement, SliderProps>(\n (props: ScopedProps<SliderProps>, forwardedRef) => {\n const {\n name,\n min = 0,\n max = 100,\n step = 1,\n orientation = 'horizontal',\n disabled = false,\n minStepsBetweenThumbs = 0,\n defaultValue = [min],\n value,\n onValueChange = () => {},\n onValueCommit = () => {},\n inverted = false,\n form,\n ...sliderProps\n } = props;\n const thumbRefs = React.useRef<SliderContextValue['thumbs']>(new Set());\n const valueIndexToChangeRef = React.useRef<number>(0);\n const isHorizontal = orientation === 'horizontal';\n const SliderOrientation = isHorizontal ? SliderHorizontal : SliderVertical;\n\n const [values = [], setValues] = useControllableState({\n prop: value,\n defaultProp: defaultValue,\n onChange: (value) => {\n const thumbs = [...thumbRefs.current];\n thumbs[valueIndexToChangeRef.current]?.focus();\n onValueChange(value);\n },\n });\n const valuesBeforeSlideStartRef = React.useRef(values);\n\n function handleSlideStart(value: number) {\n const closestIndex = getClosestValueIndex(values, value);\n updateValues(value, closestIndex);\n }\n\n function handleSlideMove(value: number) {\n updateValues(value, valueIndexToChangeRef.current);\n }\n\n function handleSlideEnd() {\n const prevValue = valuesBeforeSlideStartRef.current[valueIndexToChangeRef.current];\n const nextValue = values[valueIndexToChangeRef.current];\n const hasChanged = nextValue !== prevValue;\n if (hasChanged) onValueCommit(values);\n }\n\n function updateValues(value: number, atIndex: number, { commit } = { commit: false }) {\n const decimalCount = getDecimalCount(step);\n const snapToStep = roundValue(Math.round((value - min) / step) * step + min, decimalCount);\n const nextValue = clamp(snapToStep, [min, max]);\n\n setValues((prevValues = []) => {\n const nextValues = getNextSortedValues(prevValues, nextValue, atIndex);\n if (hasMinStepsBetweenValues(nextValues, minStepsBetweenThumbs * step)) {\n valueIndexToChangeRef.current = nextValues.indexOf(nextValue);\n const hasChanged = String(nextValues) !== String(prevValues);\n if (hasChanged && commit) onValueCommit(nextValues);\n return hasChanged ? nextValues : prevValues;\n } else {\n return prevValues;\n }\n });\n }\n\n return (\n <SliderProvider\n scope={props.__scopeSlider}\n name={name}\n disabled={disabled}\n min={min}\n max={max}\n valueIndexToChangeRef={valueIndexToChangeRef}\n thumbs={thumbRefs.current}\n values={values}\n orientation={orientation}\n form={form}\n >\n <Collection.Provider scope={props.__scopeSlider}>\n <Collection.Slot scope={props.__scopeSlider}>\n <SliderOrientation\n aria-disabled={disabled}\n data-disabled={disabled ? '' : undefined}\n {...sliderProps}\n ref={forwardedRef}\n onPointerDown={composeEventHandlers(sliderProps.onPointerDown, () => {\n if (!disabled) valuesBeforeSlideStartRef.current = values;\n })}\n min={min}\n max={max}\n inverted={inverted}\n onSlideStart={disabled ? undefined : handleSlideStart}\n onSlideMove={disabled ? undefined : handleSlideMove}\n onSlideEnd={disabled ? undefined : handleSlideEnd}\n onHomeKeyDown={() => !disabled && updateValues(min, 0, { commit: true })}\n onEndKeyDown={() =>\n !disabled && updateValues(max, values.length - 1, { commit: true })\n }\n onStepKeyDown={({ event, direction: stepDirection }) => {\n if (!disabled) {\n const isPageKey = PAGE_KEYS.includes(event.key);\n const isSkipKey = isPageKey || (event.shiftKey && ARROW_KEYS.includes(event.key));\n const multiplier = isSkipKey ? 10 : 1;\n const atIndex = valueIndexToChangeRef.current;\n const value = values[atIndex]!;\n const stepInDirection = step * multiplier * stepDirection;\n updateValues(value + stepInDirection, atIndex, { commit: true });\n }\n }}\n />\n </Collection.Slot>\n </Collection.Provider>\n </SliderProvider>\n );\n }\n);\n\nSlider.displayName = SLIDER_NAME;\n\n/* -------------------------------------------------------------------------------------------------\n * SliderHorizontal\n * -----------------------------------------------------------------------------------------------*/\n\ntype Side = 'top' | 'right' | 'bottom' | 'left';\n\nconst [SliderOrientationProvider, useSliderOrientationContext] = createSliderContext<{\n startEdge: Side;\n endEdge: Side;\n size: keyof NonNullable<ReturnType<typeof useSize>>;\n direction: number;\n}>(SLIDER_NAME, {\n startEdge: 'left',\n endEdge: 'right',\n size: 'width',\n direction: 1,\n});\n\ntype SliderOrientationPrivateProps = {\n min: number;\n max: number;\n inverted: boolean;\n onSlideStart?(value: number): void;\n onSlideMove?(value: number): void;\n onSlideEnd?(): void;\n onHomeKeyDown(event: React.KeyboardEvent): void;\n onEndKeyDown(event: React.KeyboardEvent): void;\n onStepKeyDown(step: { event: React.KeyboardEvent; direction: number }): void;\n};\ninterface SliderOrientationProps\n extends Omit<SliderImplProps, keyof SliderImplPrivateProps>,\n SliderOrientationPrivateProps {}\n\ntype SliderHorizontalElement = SliderImplElement;\ninterface SliderHorizontalProps extends SliderOrientationProps {\n dir?: Direction;\n}\n\nconst SliderHorizontal = React.forwardRef<SliderHorizontalElement, SliderHorizontalProps>(\n (props: ScopedProps<SliderHorizontalProps>, forwardedRef) => {\n const {\n min,\n max,\n dir,\n inverted,\n onSlideStart,\n onSlideMove,\n onSlideEnd,\n onStepKeyDown,\n ...sliderProps\n } = props;\n const [slider, setSlider] = React.useState<SliderImplElement | null>(null);\n const composedRefs = useComposedRefs(forwardedRef, (node) => setSlider(node));\n const rectRef = React.useRef<DOMRect>(undefined);\n const direction = useDirection(dir);\n const isDirectionLTR = direction === 'ltr';\n const isSlidingFromLeft = (isDirectionLTR && !inverted) || (!isDirectionLTR && inverted);\n\n function getValueFromPointer(pointerPosition: number) {\n const rect = rectRef.current || slider!.getBoundingClientRect();\n const input: [number, number] = [0, rect.width];\n const output: [number, number] = isSlidingFromLeft ? [min, max] : [max, min];\n const value = linearScale(input, output);\n\n rectRef.current = rect;\n return value(pointerPosition - rect.left);\n }\n\n return (\n <SliderOrientationProvider\n scope={props.__scopeSlider}\n startEdge={isSlidingFromLeft ? 'left' : 'right'}\n endEdge={isSlidingFromLeft ? 'right' : 'left'}\n direction={isSlidingFromLeft ? 1 : -1}\n size=\"width\"\n >\n <SliderImpl\n dir={direction}\n data-orientation=\"horizontal\"\n {...sliderProps}\n ref={composedRefs}\n style={{\n ...sliderProps.style,\n ['--radix-slider-thumb-transform' as any]: 'translateX(-50%)',\n }}\n onSlideStart={(event) => {\n const value = getValueFromPointer(event.clientX);\n onSlideStart?.(value);\n }}\n onSlideMove={(event) => {\n const value = getValueFromPointer(event.clientX);\n onSlideMove?.(value);\n }}\n onSlideEnd={() => {\n rectRef.current = undefined;\n onSlideEnd?.();\n }}\n onStepKeyDown={(event) => {\n const slideDirection = isSlidingFromLeft ? 'from-left' : 'from-right';\n const isBackKey = BACK_KEYS[slideDirection].includes(event.key);\n onStepKeyDown?.({ event, direction: isBackKey ? -1 : 1 });\n }}\n />\n </SliderOrientationProvider>\n );\n }\n);\n\n/* -------------------------------------------------------------------------------------------------\n * SliderVertical\n * -----------------------------------------------------------------------------------------------*/\n\ntype SliderVerticalElement = SliderImplElement;\ninterface SliderVerticalProps extends SliderOrientationProps {}\n\nconst SliderVertical = React.forwardRef<SliderVerticalElement, SliderVerticalProps>(\n (props: ScopedProps<SliderVerticalProps>, forwardedRef) => {\n const {\n min,\n max,\n inverted,\n onSlideStart,\n onSlideMove,\n onSlideEnd,\n onStepKeyDown,\n ...sliderProps\n } = props;\n const sliderRef = React.useRef<SliderImplElement>(null);\n const ref = useComposedRefs(forwardedRef, sliderRef);\n const rectRef = React.useRef<DOMRect>(undefined);\n const isSlidingFromBottom = !inverted;\n\n function getValueFromPointer(pointerPosition: number) {\n const rect = rectRef.current || sliderRef.current!.getBoundingClientRect();\n const input: [number, number] = [0, rect.height];\n const output: [number, number] = isSlidingFromBottom ? [max, min] : [min, max];\n const value = linearScale(input, output);\n\n rectRef.current = rect;\n return value(pointerPosition - rect.top);\n }\n\n return (\n <SliderOrientationProvider\n scope={props.__scopeSlider}\n startEdge={isSlidingFromBottom ? 'bottom' : 'top'}\n endEdge={isSlidingFromBottom ? 'top' : 'bottom'}\n size=\"height\"\n direction={isSlidingFromBottom ? 1 : -1}\n >\n <SliderImpl\n data-orientation=\"vertical\"\n {...sliderProps}\n ref={ref}\n style={{\n ...sliderProps.style,\n ['--radix-slider-thumb-transform' as any]: 'translateY(50%)',\n }}\n onSlideStart={(event) => {\n const value = getValueFromPointer(event.clientY);\n onSlideStart?.(value);\n }}\n onSlideMove={(event) => {\n const value = getValueFromPointer(event.clientY);\n onSlideMove?.(value);\n }}\n onSlideEnd={() => {\n rectRef.current = undefined;\n onSlideEnd?.();\n }}\n onStepKeyDown={(event) => {\n const slideDirection = isSlidingFromBottom ? 'from-bottom' : 'from-top';\n const isBackKey = BACK_KEYS[slideDirection].includes(event.key);\n onStepKeyDown?.({ event, direction: isBackKey ? -1 : 1 });\n }}\n />\n </SliderOrientationProvider>\n );\n }\n);\n\n/* -------------------------------------------------------------------------------------------------\n * SliderImpl\n * -----------------------------------------------------------------------------------------------*/\n\ntype SliderImplElement = React.ComponentRef<typeof Primitive.span>;\ntype PrimitiveDivProps = React.ComponentPropsWithoutRef<typeof Primitive.div>;\ntype SliderImplPrivateProps = {\n onSlideStart(event: React.PointerEvent): void;\n onSlideMove(event: React.PointerEvent): void;\n onSlideEnd(event: React.PointerEvent): void;\n onHomeKeyDown(event: React.KeyboardEvent): void;\n onEndKeyDown(event: React.KeyboardEvent): void;\n onStepKeyDown(event: React.KeyboardEvent): void;\n};\ninterface SliderImplProps extends PrimitiveDivProps, SliderImplPrivateProps {}\n\nconst SliderImpl = React.forwardRef<SliderImplElement, SliderImplProps>(\n (props: ScopedProps<SliderImplProps>, forwardedRef) => {\n const {\n __scopeSlider,\n onSlideStart,\n onSlideMove,\n onSlideEnd,\n onHomeKeyDown,\n onEndKeyDown,\n onStepKeyDown,\n ...sliderProps\n } = props;\n const context = useSliderContext(SLIDER_NAME, __scopeSlider);\n\n return (\n <Primitive.span\n {...sliderProps}\n ref={forwardedRef}\n onKeyDown={composeEventHandlers(props.onKeyDown, (event) => {\n if (event.key === 'Home') {\n onHomeKeyDown(event);\n // Prevent scrolling to page start\n event.preventDefault();\n } else if (event.key === 'End') {\n onEndKeyDown(event);\n // Prevent scrolling to page end\n event.preventDefault();\n } else if (PAGE_KEYS.concat(ARROW_KEYS).includes(event.key)) {\n onStepKeyDown(event);\n // Prevent scrolling for directional key presses\n event.preventDefault();\n }\n })}\n onPointerDown={composeEventHandlers(props.onPointerDown, (event) => {\n const target = event.target as HTMLElement;\n target.setPointerCapture(event.pointerId);\n // Prevent browser focus behaviour because we focus a thumb manually when values change.\n event.preventDefault();\n // Touch devices have a delay before focusing so won't focus if touch immediately moves\n // away from target (sliding). We want thumb to focus regardless.\n if (context.thumbs.has(target)) {\n target.focus();\n } else {\n onSlideStart(event);\n }\n })}\n onPointerMove={composeEventHandlers(props.onPointerMove, (event) => {\n const target = event.target as HTMLElement;\n if (target.hasPointerCapture(event.pointerId)) onSlideMove(event);\n })}\n onPointerUp={composeEventHandlers(props.onPointerUp, (event) => {\n const target = event.target as HTMLElement;\n if (target.hasPointerCapture(event.pointerId)) {\n target.releasePointerCapture(event.pointerId);\n onSlideEnd(event);\n }\n })}\n />\n );\n }\n);\n\n/* -------------------------------------------------------------------------------------------------\n * SliderTrack\n * -----------------------------------------------------------------------------------------------*/\n\nconst TRACK_NAME = 'SliderTrack';\n\ntype SliderTrackElement = React.ComponentRef<typeof Primitive.span>;\ntype PrimitiveSpanProps = React.ComponentPropsWithoutRef<typeof Primitive.span>;\ninterface SliderTrackProps extends PrimitiveSpanProps {}\n\nconst SliderTrack = React.forwardRef<SliderTrackElement, SliderTrackProps>(\n (props: ScopedProps<SliderTrackProps>, forwardedRef) => {\n const { __scopeSlider, ...trackProps } = props;\n const context = useSliderContext(TRACK_NAME, __scopeSlider);\n return (\n <Primitive.span\n data-disabled={context.disabled ? '' : undefined}\n data-orientation={context.orientation}\n {...trackProps}\n ref={forwardedRef}\n />\n );\n }\n);\n\nSliderTrack.displayName = TRACK_NAME;\n\n/* -------------------------------------------------------------------------------------------------\n * SliderRange\n * -----------------------------------------------------------------------------------------------*/\n\nconst RANGE_NAME = 'SliderRange';\n\ntype SliderRangeElement = React.ComponentRef<typeof Primitive.span>;\ninterface SliderRangeProps extends PrimitiveSpanProps {}\n\nconst SliderRange = React.forwardRef<SliderRangeElement, SliderRangeProps>(\n (props: ScopedProps<SliderRangeProps>, forwardedRef) => {\n const { __scopeSlider, ...rangeProps } = props;\n const context = useSliderContext(RANGE_NAME, __scopeSlider);\n const orientation = useSliderOrientationContext(RANGE_NAME, __scopeSlider);\n const ref = React.useRef<HTMLSpanElement>(null);\n const composedRefs = useComposedRefs(forwardedRef, ref);\n const valuesCount = context.values.length;\n const percentages = context.values.map((value) =>\n convertValueToPercentage(value, context.min, context.max)\n );\n const offsetStart = valuesCount > 1 ? Math.min(...percentages) : 0;\n const offsetEnd = 100 - Math.max(...percentages);\n\n return (\n <Primitive.span\n data-orientation={context.orientation}\n data-disabled={context.disabled ? '' : undefined}\n {...rangeProps}\n ref={composedRefs}\n style={{\n ...props.style,\n [orientation.startEdge]: offsetStart + '%',\n [orientation.endEdge]: offsetEnd + '%',\n }}\n />\n );\n }\n);\n\nSliderRange.displayName = RANGE_NAME;\n\n/* -------------------------------------------------------------------------------------------------\n * SliderThumb\n * -----------------------------------------------------------------------------------------------*/\n\nconst THUMB_NAME = 'SliderThumb';\n\ntype SliderThumbElement = SliderThumbImplElement;\ninterface SliderThumbProps extends Omit<SliderThumbImplProps, 'index'> {}\n\nconst SliderThumb = React.forwardRef<SliderThumbElement, SliderThumbProps>(\n (props: ScopedProps<SliderThumbProps>, forwardedRef) => {\n const getItems = useCollection(props.__scopeSlider);\n const [thumb, setThumb] = React.useState<SliderThumbImplElement | null>(null);\n const composedRefs = useComposedRefs(forwardedRef, (node) => setThumb(node));\n const index = React.useMemo(\n () => (thumb ? getItems().findIndex((item) => item.ref.current === thumb) : -1),\n [getItems, thumb]\n );\n return <SliderThumbImpl {...props} ref={composedRefs} index={index} />;\n }\n);\n\ntype SliderThumbImplElement = React.ComponentRef<typeof Primitive.span>;\ninterface SliderThumbImplProps extends PrimitiveSpanProps {\n index: number;\n name?: string;\n}\n\nconst SliderThumbImpl = React.forwardRef<SliderThumbImplElement, SliderThumbImplProps>(\n (props: ScopedProps<SliderThumbImplProps>, forwardedRef) => {\n const { __scopeSlider, index, name, ...thumbProps } = props;\n const context = useSliderContext(THUMB_NAME, __scopeSlider);\n const orientation = useSliderOrientationContext(THUMB_NAME, __scopeSlider);\n const [thumb, setThumb] = React.useState<HTMLSpanElement | null>(null);\n const composedRefs = useComposedRefs(forwardedRef, (node) => setThumb(node));\n // We set this to true by default so that events bubble to forms without JS (SSR)\n const isFormControl = thumb ? context.form || !!thumb.closest('form') : true;\n const size = useSize(thumb);\n // We cast because index could be `-1` which would return undefined\n const value = context.values[index] as number | undefined;\n const percent =\n value === undefined ? 0 : convertValueToPercentage(value, context.min, context.max);\n const label = getLabel(index, context.values.length);\n const orientationSize = size?.[orientation.size];\n const thumbInBoundsOffset = orientationSize\n ? getThumbInBoundsOffset(orientationSize, percent, orientation.direction)\n : 0;\n\n React.useEffect(() => {\n if (thumb) {\n context.thumbs.add(thumb);\n return () => {\n context.thumbs.delete(thumb);\n };\n }\n }, [thumb, context.thumbs]);\n\n return (\n <span\n style={{\n transform: 'var(--radix-slider-thumb-transform)',\n position: 'absolute',\n [orientation.startEdge]: `calc(${percent}% + ${thumbInBoundsOffset}px)`,\n }}\n >\n <Collection.ItemSlot scope={props.__scopeSlider}>\n <Primitive.span\n role=\"slider\"\n aria-label={props['aria-label'] || label}\n aria-valuemin={context.min}\n aria-valuenow={value}\n aria-valuemax={context.max}\n aria-orientation={context.orientation}\n data-orientation={context.orientation}\n data-disabled={context.disabled ? '' : undefined}\n tabIndex={context.disabled ? undefined : 0}\n {...thumbProps}\n ref={composedRefs}\n /**\n * There will be no value on initial render while we work out the index so we hide thumbs\n * without a value, otherwise SSR will render them in the wrong position before they\n * snap into the correct position during hydration which would be visually jarring for\n * slower connections.\n */\n style={value === undefined ? { display: 'none' } : props.style}\n onFocus={composeEventHandlers(props.onFocus, () => {\n context.valueIndexToChangeRef.current = index;\n })}\n />\n </Collection.ItemSlot>\n\n {isFormControl && (\n <SliderBubbleInput\n key={index}\n name={\n name ??\n (context.name ? context.name + (context.values.length > 1 ? '[]' : '') : undefined)\n }\n form={context.form}\n value={value}\n />\n )}\n </span>\n );\n }\n);\n\nSliderThumb.displayName = THUMB_NAME;\n\n/* -------------------------------------------------------------------------------------------------\n * SliderBubbleInput\n * -----------------------------------------------------------------------------------------------*/\n\nconst BUBBLE_INPUT_NAME = 'RadioBubbleInput';\n\ntype InputProps = React.ComponentPropsWithoutRef<typeof Primitive.input>;\ninterface SliderBubbleInputProps extends InputProps {}\n\nconst SliderBubbleInput = React.forwardRef<HTMLInputElement, SliderBubbleInputProps>(\n ({ __scopeSlider, value, ...props }: ScopedProps<SliderBubbleInputProps>, forwardedRef) => {\n const ref = React.useRef<HTMLInputElement>(null);\n const composedRefs = useComposedRefs(ref, forwardedRef);\n const prevValue = usePrevious(value);\n\n // Bubble value change to parents (e.g form change event)\n React.useEffect(() => {\n const input = ref.current;\n if (!input) return;\n\n const inputProto = window.HTMLInputElement.prototype;\n const descriptor = Object.getOwnPropertyDescriptor(inputProto, 'value') as PropertyDescriptor;\n const setValue = descriptor.set;\n if (prevValue !== value && setValue) {\n const event = new Event('input', { bubbles: true });\n setValue.call(input, value);\n input.dispatchEvent(event);\n }\n }, [prevValue, value]);\n\n /**\n * We purposefully do not use `type=\"hidden\"` here otherwise forms that\n * wrap it will not be able to access its value via the FormData API.\n *\n * We purposefully do not add the `value` attribute here to allow the value\n * to be set programmatically and bubble to any parent form `onChange` event.\n * Adding the `value` will cause React to consider the programmatic\n * dispatch a duplicate and it will get swallowed.\n */\n return (\n <Primitive.input\n style={{ display: 'none' }}\n {...props}\n ref={composedRefs}\n defaultValue={value}\n />\n );\n }\n);\n\nSliderBubbleInput.displayName = BUBBLE_INPUT_NAME;\n\n/* -----------------------------------------------------------------------------------------------*/\n\nfunction getNextSortedValues(prevValues: number[] = [], nextValue: number, atIndex: number) {\n const nextValues = [...prevValues];\n nextValues[atIndex] = nextValue;\n return nextValues.sort((a, b) => a - b);\n}\n\nfunction convertValueToPercentage(value: number, min: number, max: number) {\n const maxSteps = max - min;\n const percentPerStep = 100 / maxSteps;\n const percentage = percentPerStep * (value - min);\n return clamp(percentage, [0, 100]);\n}\n\n/**\n * Returns a label for each thumb when there are two or more thumbs\n */\nfunction getLabel(index: number, totalValues: number) {\n if (totalValues > 2) {\n return `Value ${index + 1} of ${totalValues}`;\n } else if (totalValues === 2) {\n return ['Minimum', 'Maximum'][index];\n } else {\n return undefined;\n }\n}\n\n/**\n * Given a `values` array and a `nextValue`, determine which value in\n * the array is closest to `nextValue` and return its index.\n *\n * @example\n * // returns 1\n * getClosestValueIndex([10, 30], 25);\n */\nfunction getClosestValueIndex(values: number[], nextValue: number) {\n if (values.length === 1) return 0;\n const distances = values.map((value) => Math.abs(value - nextValue));\n const closestDistance = Math.min(...distances);\n return distances.indexOf(closestDistance);\n}\n\n/**\n * Offsets the thumb centre point while sliding to ensure it remains\n * within the bounds of the slider when reaching the edges\n */\nfunction getThumbInBoundsOffset(width: number, left: number, direction: number) {\n const halfWidth = width / 2;\n const halfPercent = 50;\n const offset = linearScale([0, halfPercent], [0, halfWidth]);\n return (halfWidth - offset(left) * direction) * direction;\n}\n\n/**\n * Gets an array of steps between each value.\n *\n * @example\n * // returns [1, 9]\n * getStepsBetweenValues([10, 11, 20]);\n */\nfunction getStepsBetweenValues(values: number[]) {\n return values.slice(0, -1).map((value, index) => values[index + 1]! - value);\n}\n\n/**\n * Verifies the minimum steps between all values is greater than or equal\n * to the expected minimum steps.\n *\n * @example\n * // returns false\n * hasMinStepsBetweenValues([1,2,3], 2);\n *\n * @example\n * // returns true\n * hasMinStepsBetweenValues([1,2,3], 1);\n */\nfunction hasMinStepsBetweenValues(values: number[], minStepsBetweenValues: number) {\n if (minStepsBetweenValues > 0) {\n const stepsBetweenValues = getStepsBetweenValues(values);\n const actualMinStepsBetweenValues = Math.min(...stepsBetweenValues);\n return actualMinStepsBetweenValues >= minStepsBetweenValues;\n }\n return true;\n}\n\n// https://github.com/tmcw-up-for-adoption/simple-linear-scale/blob/master/index.js\nfunction linearScale(input: readonly [number, number], output: readonly [number, number]) {\n return (value: number) => {\n if (input[0] === input[1] || output[0] === output[1]) return output[0];\n const ratio = (output[1] - output[0]) / (input[1] - input[0]);\n return output[0] + ratio * (value - input[0]);\n };\n}\n\nfunction getDecimalCount(value: number) {\n return (String(value).split('.')[1] || '').length;\n}\n\nfunction roundValue(value: number, decimalCount: number) {\n const rounder = Math.pow(10, decimalCount);\n return Math.round(value * rounder) / rounder;\n}\n\nconst Root = Slider;\nconst Track = SliderTrack;\nconst Range = SliderRange;\nconst Thumb = SliderThumb;\n\nexport {\n createSliderScope,\n //\n Slider,\n SliderTrack,\n SliderRange,\n SliderThumb,\n //\n Root,\n Track,\n Range,\n Thumb,\n};\nexport type { SliderProps, SliderTrackProps, SliderRangeProps, SliderThumbProps };\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n [\n 'path',\n {\n d: 'M4 22V4a1 1 0 0 1 .4-.8A6 6 0 0 1 8 2c3 0 5 2 7.333 2q2 0 3.067-.8A1 1 0 0 1 20 4v10a1 1 0 0 1-.4.8A6 6 0 0 1 16 16c-3 0-5-2-8-2a6 6 0 0 0-4 1.528',\n key: '1jaruq',\n },\n ],\n];\n\n/**\n * @component @name Flag\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNNCAyMlY0YTEgMSAwIDAgMSAuNC0uOEE2IDYgMCAwIDEgOCAyYzMgMCA1IDIgNy4zMzMgMnEyIDAgMy4wNjctLjhBMSAxIDAgMCAxIDIwIDR2MTBhMSAxIDAgMCAxLS40LjhBNiA2IDAgMCAxIDE2IDE2Yy0zIDAtNS0yLTgtMmE2IDYgMCAwIDAtNCAxLjUyOCIgLz4KPC9zdmc+Cg==) - https://lucide.dev/icons/flag\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Flag = createLucideIcon('flag', __iconNode);\n\nexport default Flag;\n"],"names":[],"mappings":"wDAEA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,EAAA,CAAA,CAAA,OAAA,EAAA,EAAA,CAAA,CAAA,OAAA,EAAA,EAAA,CAAA,CAAA,OAAA,EAAA,EAAA,CAAA,CAAA,OAAA,EAAA,EAAA,CAAA,CAAA,oBSsBA,CAAA,GAAM,EAAA,CAAA,CAAA,CAAO,CAAA,CAAA,OAAA,EAAiB,CAAA,CAAA,CAAA,CAAA,CAAA,GAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,gDArByB,CDAL,QCGtD,GACK,oIACE,CAAA,CAAA,CAAA,CAAA,AFYL,MEXF,QEcS,EAAA,OAAA,EAAiB,CAAA,CAAA,CAAA,CAAA,CAAA,GAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,AAjBhC,CAAA,AJAH,AIiB6C,CJjB7C,yJICQ,CFAF,AEAE,CAAA,AFAF,CEAE,ADgkBL,AFpjBA,ACZG,CDYH,ACZG,AEAE,CFAF,AEAE,AHYL,MGTN,OHSiB,CCZR,ADYQ,AGZN,CHYM,ACZR,CDYQ,ACZR,CDYQ,ACZR,CAAA,ADYQ,CCZR,ADYQ,CCZR,ADYQ,CAAA,ACZR,CDYQ,ACZR,ACwJG,CF5IK,ACZR,CDYyB,AAAjB,ACZR,CDYQ,ACZR,ADYyB,ACZzB,CDYQ,ACZR,ADYyB,CAAjB,ACZR,ADYyB,CAAjB,ACZR,ADYyB,CCZzB,ADYyB,CCZzB,ADYyB,CCZzB,ADYyB,CCZzB,ADYyB,CCZzB,ADYyB,CAAA,ACZzB,CDL2B,ACK3B,CDYqC,CCZrC,ADYqC,CAAA,ACZrC,CAAA,ADYqC,CCZrC,ADYqC,CCZrC,ADYqC,MAhBhC,CAAA,QAAY,CDAV,ACAU,ACAV,EDAc,CCAd,AFAY,ACAE,CCAd,AFAY,ACAE,EAAK,CCAnB,AFAiB,CEAjB,AFAiB,ACAE,CAAA,ACAnB,AFAiB,uBCAyB,CAAU,CAAA,SACzD,CDAA,ACAA,EAAK,CDAA,ACAA,CAAA,ADAA,CCAA,ADAA,CCAA,ADAA,CCAA,ADAA,CCAA,ADAA,CAAA,ACAA,CEGQ,AFHR,ADAA,CAAA,ACAA,CAAA,ADAA,CCAA,ADAA,iBCA6B,CAAA,CAAA,CAAA,CA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","ignoreList":[3,7,8,9,10,11]}
1
+ {"version":3,"sources":["../../../../../../../src/presentation/web/app/actions/data%3A37fed9%20%3Ctext/javascript%3E","../../../../../../../src/presentation/web/components/features/settings/language-settings-section.tsx","../../../../../../../src/presentation/web/app/actions/data%3A7517cc%20%3Ctext/javascript%3E","../../../../../../../src/presentation/web/app/actions/data%3Aa87ed4%20%3Ctext/javascript%3E","../../../../../../../src/presentation/web/app/actions/data%3A376083%20%3Ctext/javascript%3E","../../../../../../../src/presentation/web/components/features/settings/messaging-settings-section.tsx","../../../../../../../node_modules/.pnpm/%40radix-ui%2Breact-slider%401.3.6_%40types%2Breact-dom%4019.2.3_%40types%2Breact%4019.2.10__%40types%2Breact_ca43abb80e5f786fefe972afd09a8b45/node_modules/%40radix-ui/react-slider/dist/index.mjs","../../../../../../../src/presentation/web/components/ui/slider.tsx","../../../../../../../src/presentation/web/components/features/settings/timeout-slider.tsx","../../../../../../../src/presentation/web/components/features/settings/settings-page-client.tsx","../../../../../../../src/presentation/web/components/common/editor-type-icons.tsx","../../../../../../../node_modules/.pnpm/lucide-react%400.563.0_react%4019.2.4/node_modules/lucide-react/src/icons/database.ts","../../../../../../../node_modules/.pnpm/lucide-react%400.563.0_react%4019.2.4/node_modules/lucide-react/src/icons/link-2.ts","../../../../../../../node_modules/.pnpm/lucide-react%400.563.0_react%4019.2.4/node_modules/lucide-react/src/icons/bell.ts","../../../../../../../node_modules/.pnpm/lucide-react%400.563.0_react%4019.2.4/node_modules/lucide-react/src/icons/settings-2.ts","../../../../../../../node_modules/.pnpm/lucide-react%400.563.0_react%4019.2.4/node_modules/lucide-react/src/icons/unplug.ts","../../../../../../../node_modules/.pnpm/%40radix-ui%2Breact-slider%401.3.6_%40types%2Breact-dom%4019.2.3_%40types%2Breact%4019.2.10__%40types%2Breact_ca43abb80e5f786fefe972afd09a8b45/node_modules/%40radix-ui/react-slider/src/slider.tsx","../../../../../../../node_modules/.pnpm/lucide-react%400.563.0_react%4019.2.4/node_modules/lucide-react/src/icons/message-circle.ts","../../../../../../../node_modules/.pnpm/lucide-react%400.563.0_react%4019.2.4/node_modules/lucide-react/src/icons/flag.ts"],"sourcesContent":["/* __next_internal_action_entry_do_not_use__ [{\"406b045f0c78c9b78df2841ef849b4a567c1cbb197\":\"updateSettingsAction\"},\"src/presentation/web/app/actions/update-settings.ts\",\"\"] */\"use turbopack no side effects\";import{createServerReference,callServer,findSourceMapURL}from\"private-next-rsc-action-client-wrapper\";const $$RSC_SERVER_ACTION_0=/*#__PURE__*/createServerReference(\"406b045f0c78c9b78df2841ef849b4a567c1cbb197\",callServer,void 0,findSourceMapURL,\"updateSettingsAction\");export{$$RSC_SERVER_ACTION_0 as updateSettingsAction};","'use client';\n\nimport { useState, useTransition, useRef, useEffect } from 'react';\nimport { Globe, Check } from 'lucide-react';\nimport { toast } from 'sonner';\nimport { useTranslation } from 'react-i18next';\nimport { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@/components/ui/card';\nimport { Label } from '@/components/ui/label';\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from '@/components/ui/select';\nimport { updateSettingsAction } from '@/app/actions/update-settings';\nimport { Language } from '@shepai/core/domain/generated/output';\n\nconst LANGUAGE_OPTIONS = [\n { value: Language.English, label: 'English', nativeName: 'English' },\n { value: Language.Russian, label: 'Русский', nativeName: 'Русский' },\n { value: Language.Portuguese, label: 'Português', nativeName: 'Português' },\n { value: Language.Spanish, label: 'Español', nativeName: 'Español' },\n { value: Language.Arabic, label: 'العربية', nativeName: 'العربية' },\n { value: Language.Hebrew, label: 'עברית', nativeName: 'עברית' },\n { value: Language.French, label: 'Français', nativeName: 'Français' },\n { value: Language.German, label: 'Deutsch', nativeName: 'Deutsch' },\n];\n\nexport interface LanguageSettingsSectionProps {\n language: string;\n}\n\nexport function LanguageSettingsSection({\n language: initialLanguage,\n}: LanguageSettingsSectionProps) {\n const { t, i18n } = useTranslation('web');\n const [language, setLanguage] = useState(initialLanguage);\n const [isPending, startTransition] = useTransition();\n const [showSaved, setShowSaved] = useState(false);\n const prevPendingRef = useRef(false);\n\n useEffect(() => {\n if (prevPendingRef.current && !isPending) {\n setShowSaved(true);\n const timer = setTimeout(() => setShowSaved(false), 2000);\n return () => clearTimeout(timer);\n }\n prevPendingRef.current = isPending;\n }, [isPending]);\n\n function handleLanguageChange(value: string) {\n setLanguage(value);\n // Update i18n language immediately for instant UI feedback\n i18n.changeLanguage(value);\n // Update document direction for RTL languages\n const dir = value === 'ar' || value === 'he' ? 'rtl' : 'ltr';\n document.documentElement.lang = value;\n document.documentElement.dir = dir;\n\n startTransition(async () => {\n const result = await updateSettingsAction({\n user: { preferredLanguage: value as Language },\n });\n if (!result.success) {\n toast.error(\n result.error ?? t('settings.language.failedToSave', 'Failed to save language settings')\n );\n }\n });\n }\n\n return (\n <Card id=\"language\" className=\"scroll-mt-6\" data-testid=\"language-settings-section\">\n <CardHeader>\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-2\">\n <Globe className=\"text-muted-foreground h-4 w-4\" />\n <CardTitle>{t('settings.language.title')}</CardTitle>\n </div>\n {isPending ? (\n <span className=\"text-muted-foreground text-xs\">{t('common:labels.saving')}</span>\n ) : null}\n {showSaved && !isPending ? (\n <span className=\"flex items-center gap-1 text-xs text-green-600\">\n <Check className=\"h-3 w-3\" />\n {t('common:labels.saved')}\n </span>\n ) : null}\n </div>\n <CardDescription>{t('settings.language.description')}</CardDescription>\n </CardHeader>\n <CardContent className=\"space-y-4\">\n <div className=\"space-y-2\">\n <Label htmlFor=\"display-language\">{t('settings.language.label')}</Label>\n <Select value={language} onValueChange={handleLanguageChange}>\n <SelectTrigger id=\"display-language\" data-testid=\"language-select\">\n <SelectValue placeholder={t('settings.language.placeholder')} />\n </SelectTrigger>\n <SelectContent>\n {LANGUAGE_OPTIONS.map((opt) => (\n <SelectItem key={opt.value} value={opt.value}>\n {opt.nativeName}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n </CardContent>\n </Card>\n );\n}\n","/* __next_internal_action_entry_do_not_use__ [{\"400d32443b18f55d511ebba12b946fb63691657ec0\":\"beginMessagingPairingAction\"},\"src/presentation/web/app/actions/messaging.ts\",\"\"] */\"use turbopack no side effects\";import{createServerReference,callServer,findSourceMapURL}from\"private-next-rsc-action-client-wrapper\";const $$RSC_SERVER_ACTION_0=/*#__PURE__*/createServerReference(\"400d32443b18f55d511ebba12b946fb63691657ec0\",callServer,void 0,findSourceMapURL,\"beginMessagingPairingAction\");export{$$RSC_SERVER_ACTION_0 as beginMessagingPairingAction};","/* __next_internal_action_entry_do_not_use__ [{\"4034272aa199ba9d4513245e1ed491fbf6958a6d5b\":\"confirmMessagingPairingAction\"},\"src/presentation/web/app/actions/messaging.ts\",\"\"] */\"use turbopack no side effects\";import{createServerReference,callServer,findSourceMapURL}from\"private-next-rsc-action-client-wrapper\";const $$RSC_SERVER_ACTION_1=/*#__PURE__*/createServerReference(\"4034272aa199ba9d4513245e1ed491fbf6958a6d5b\",callServer,void 0,findSourceMapURL,\"confirmMessagingPairingAction\");export{$$RSC_SERVER_ACTION_1 as confirmMessagingPairingAction};","/* __next_internal_action_entry_do_not_use__ [{\"403a6cb3ef64169ac4689bd43f5300110d3d07792d\":\"disconnectMessagingAction\"},\"src/presentation/web/app/actions/messaging.ts\",\"\"] */\"use turbopack no side effects\";import{createServerReference,callServer,findSourceMapURL}from\"private-next-rsc-action-client-wrapper\";const $$RSC_SERVER_ACTION_2=/*#__PURE__*/createServerReference(\"403a6cb3ef64169ac4689bd43f5300110d3d07792d\",callServer,void 0,findSourceMapURL,\"disconnectMessagingAction\");export{$$RSC_SERVER_ACTION_2 as disconnectMessagingAction};","'use client';\n\nimport { useState, useTransition, useRef, useEffect, useCallback } from 'react';\nimport { MessageCircle, Check, Copy, Link2, ShieldCheck, Unplug } from 'lucide-react';\nimport { toast } from 'sonner';\nimport { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@/components/ui/card';\nimport { Label } from '@/components/ui/label';\nimport { Switch } from '@/components/ui/switch';\nimport { Separator } from '@/components/ui/separator';\nimport { Input } from '@/components/ui/input';\nimport { Button } from '@/components/ui/button';\nimport { Badge } from '@/components/ui/badge';\nimport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n} from '@/components/ui/dialog';\nimport { updateSettingsAction } from '@/app/actions/update-settings';\nimport {\n beginMessagingPairingAction,\n confirmMessagingPairingAction,\n disconnectMessagingAction,\n} from '@/app/actions/messaging';\nimport type { MessagingConfig } from '@shepai/core/domain/generated/output';\nimport { MessagingPlatform } from '@shepai/core/domain/generated/output';\n\nexport interface MessagingSettingsSectionProps {\n messaging?: MessagingConfig;\n}\n\ninterface PairingSessionState {\n platform: MessagingPlatform;\n code: string;\n expiresAt: string;\n gatewayUrl: string;\n publicUrl: string;\n routeId: string;\n}\n\nconst DEFAULT_CONFIG: MessagingConfig = {\n enabled: false,\n debounceMs: 5000,\n chatBufferMs: 3000,\n};\n\nfunction platformLabel(platform: MessagingPlatform): string {\n return platform === MessagingPlatform.Telegram ? 'Telegram' : 'WhatsApp';\n}\n\nfunction isValidUrl(value: string): boolean {\n if (!value.trim()) return false;\n try {\n new URL(value);\n return true;\n } catch {\n return false;\n }\n}\n\nexport function MessagingSettingsSection({ messaging }: MessagingSettingsSectionProps) {\n const config = messaging ?? DEFAULT_CONFIG;\n\n const [enabled, setEnabled] = useState(config.enabled);\n const [gatewayUrl, setGatewayUrl] = useState(config.gatewayUrl ?? '');\n const [telegram, setTelegram] = useState(config.telegram);\n const [whatsapp, setWhatsapp] = useState(config.whatsapp);\n const [isPending, startTransition] = useTransition();\n const [showSaved, setShowSaved] = useState(false);\n const prevPendingRef = useRef(false);\n\n const [pairing, setPairing] = useState<PairingSessionState | null>(null);\n const [pairingLoading, setPairingLoading] = useState(false);\n const [chatIdInput, setChatIdInput] = useState('');\n\n useEffect(() => {\n if (prevPendingRef.current && !isPending) {\n setShowSaved(true);\n const timer = setTimeout(() => setShowSaved(false), 2000);\n return () => clearTimeout(timer);\n }\n prevPendingRef.current = isPending;\n }, [isPending]);\n\n // Keep local state in sync when the server prop changes after a server action.\n useEffect(() => {\n setEnabled(config.enabled);\n setGatewayUrl(config.gatewayUrl ?? '');\n setTelegram(config.telegram);\n setWhatsapp(config.whatsapp);\n }, [config.enabled, config.gatewayUrl, config.telegram, config.whatsapp]);\n\n const saveTopLevel = useCallback(\n (payload: { enabled?: boolean; gatewayUrl?: string }) => {\n startTransition(async () => {\n const result = await updateSettingsAction({\n messaging: {\n ...config,\n enabled: payload.enabled ?? enabled,\n gatewayUrl: payload.gatewayUrl ?? gatewayUrl,\n },\n });\n if (!result.success) {\n toast.error(result.error ?? 'Failed to save messaging settings');\n }\n });\n },\n [config, enabled, gatewayUrl]\n );\n\n const savePlatformBotToken = useCallback(\n (platform: MessagingPlatform, botToken: string) => {\n const key: 'telegram' | 'whatsapp' =\n platform === MessagingPlatform.Telegram ? 'telegram' : 'whatsapp';\n const existing = config[key];\n if (!existing) {\n toast.error('Pair this platform before setting a bot token.');\n return;\n }\n startTransition(async () => {\n const result = await updateSettingsAction({\n messaging: {\n ...config,\n [key]: { ...existing, botToken: botToken || undefined },\n },\n });\n if (!result.success) {\n toast.error(result.error ?? 'Failed to save bot token');\n }\n });\n },\n [config]\n );\n\n function handleEnableChange(value: boolean) {\n setEnabled(value);\n saveTopLevel({ enabled: value });\n }\n\n function handleGatewayBlur() {\n if (gatewayUrl === (config.gatewayUrl ?? '')) return;\n if (gatewayUrl && !isValidUrl(gatewayUrl)) {\n toast.error('Gateway URL must be a valid URL (e.g., https://gateway.example.com)');\n return;\n }\n saveTopLevel({ gatewayUrl });\n }\n\n async function handlePair(platform: MessagingPlatform) {\n if (!isValidUrl(gatewayUrl)) {\n toast.error('Set a valid Gateway URL before pairing');\n return;\n }\n setPairingLoading(true);\n setChatIdInput('');\n try {\n const result = await beginMessagingPairingAction({ platform, gatewayUrl });\n if (!result.success || !result.session) {\n toast.error(result.error ?? 'Failed to begin pairing');\n return;\n }\n setPairing(result.session);\n } finally {\n setPairingLoading(false);\n }\n }\n\n async function handleConfirmPairing() {\n if (!pairing) return;\n if (!chatIdInput.trim()) {\n toast.error('Enter the chat ID that received the code');\n return;\n }\n setPairingLoading(true);\n try {\n const result = await confirmMessagingPairingAction({\n platform: pairing.platform,\n chatId: chatIdInput.trim(),\n });\n if (!result.success) {\n toast.error(result.error ?? 'Failed to confirm pairing');\n return;\n }\n toast.success(`${platformLabel(pairing.platform)} paired`);\n setPairing(null);\n } finally {\n setPairingLoading(false);\n }\n }\n\n async function handleDisconnect(platform?: MessagingPlatform) {\n setPairingLoading(true);\n try {\n const result = await disconnectMessagingAction({ platform });\n if (!result.success) {\n toast.error(result.error ?? 'Failed to disconnect');\n return;\n }\n toast.success(\n platform ? `${platformLabel(platform)} disconnected` : 'Messaging disconnected'\n );\n } finally {\n setPairingLoading(false);\n }\n }\n\n async function handleCopyCode() {\n if (!pairing) return;\n try {\n await navigator.clipboard.writeText(pairing.code);\n toast.success('Code copied');\n } catch {\n toast.error('Unable to copy code');\n }\n }\n\n async function handleCopyPublicUrl() {\n if (!pairing) return;\n try {\n await navigator.clipboard.writeText(pairing.publicUrl);\n toast.success('Webhook URL copied');\n } catch {\n toast.error('Unable to copy URL');\n }\n }\n\n return (\n <Card id=\"messaging\" className=\"scroll-mt-6\" data-testid=\"messaging-settings-section\">\n <CardHeader>\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-2\">\n <MessageCircle className=\"text-muted-foreground h-4 w-4\" />\n <CardTitle>Messaging Remote Control</CardTitle>\n </div>\n {isPending ? <span className=\"text-muted-foreground text-xs\">Saving...</span> : null}\n {showSaved && !isPending ? (\n <span className=\"flex items-center gap-1 text-xs text-green-600\">\n <Check className=\"h-3 w-3\" />\n Saved\n </span>\n ) : null}\n </div>\n <CardDescription>\n Drive Shep remotely from Telegram or WhatsApp via the Commands.com Gateway.\n </CardDescription>\n </CardHeader>\n <CardContent className=\"space-y-4\">\n <div className=\"flex items-center justify-between\">\n <Label htmlFor=\"messaging-enabled\">Enable messaging</Label>\n <Switch\n id=\"messaging-enabled\"\n data-testid=\"switch-messaging-enabled\"\n checked={enabled}\n onCheckedChange={handleEnableChange}\n />\n </div>\n\n <div className=\"space-y-1.5\">\n <Label htmlFor=\"messaging-gateway-url\" className=\"flex items-center gap-1 text-xs\">\n <Link2 className=\"h-3 w-3\" />\n Gateway URL\n </Label>\n <Input\n id=\"messaging-gateway-url\"\n data-testid=\"input-gateway-url\"\n placeholder=\"https://gateway.example.com\"\n value={gatewayUrl}\n disabled={!enabled}\n onChange={(e) => setGatewayUrl(e.target.value)}\n onBlur={handleGatewayBlur}\n />\n </div>\n\n <Separator />\n\n <PlatformRow\n platform={MessagingPlatform.Telegram}\n config={telegram}\n disabled={!enabled || pairingLoading}\n onPair={() => handlePair(MessagingPlatform.Telegram)}\n onDisconnect={() => handleDisconnect(MessagingPlatform.Telegram)}\n onSaveBotToken={(value) => savePlatformBotToken(MessagingPlatform.Telegram, value)}\n />\n\n <PlatformRow\n platform={MessagingPlatform.WhatsApp}\n config={whatsapp}\n disabled={!enabled || pairingLoading}\n onPair={() => handlePair(MessagingPlatform.WhatsApp)}\n onDisconnect={() => handleDisconnect(MessagingPlatform.WhatsApp)}\n onSaveBotToken={(value) => savePlatformBotToken(MessagingPlatform.WhatsApp, value)}\n />\n\n {telegram?.paired === true || whatsapp?.paired === true ? (\n <>\n <Separator />\n <div className=\"flex items-center justify-between\">\n <div className=\"text-muted-foreground text-xs\">Disconnect all platforms</div>\n <Button\n variant=\"outline\"\n size=\"sm\"\n disabled={pairingLoading}\n data-testid=\"btn-disconnect-all\"\n onClick={() => handleDisconnect()}\n >\n <Unplug className=\"mr-1 h-3 w-3\" />\n Disconnect all\n </Button>\n </div>\n </>\n ) : null}\n </CardContent>\n\n <Dialog open={!!pairing} onOpenChange={(open) => !open && setPairing(null)}>\n <DialogContent data-testid=\"messaging-pairing-dialog\">\n <DialogHeader>\n <DialogTitle>Pair {pairing ? platformLabel(pairing.platform) : ''}</DialogTitle>\n <DialogDescription>\n Send this one-time code to your bot. Then enter the chat ID that received it to finish\n pairing.\n </DialogDescription>\n </DialogHeader>\n\n {pairing ? (\n <div className=\"space-y-4\">\n <div\n className=\"bg-muted flex items-center justify-between rounded-md border px-4 py-3\"\n data-testid=\"pairing-code-box\"\n >\n <code className=\"font-mono text-2xl tracking-[0.3em]\">{pairing.code}</code>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={handleCopyCode}\n data-testid=\"btn-copy-code\"\n aria-label=\"Copy code\"\n >\n <Copy className=\"h-4 w-4\" />\n </Button>\n </div>\n\n <div className=\"space-y-1.5\" data-testid=\"pairing-public-url-box\">\n <Label className=\"flex items-center gap-1 text-xs\">\n <Link2 className=\"h-3 w-3\" />\n Webhook URL for {platformLabel(pairing.platform)}\n </Label>\n <div className=\"bg-muted flex items-center justify-between gap-2 rounded-md border px-3 py-2\">\n <code className=\"truncate font-mono text-[11px]\" data-testid=\"pairing-public-url\">\n {pairing.publicUrl}\n </code>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={handleCopyPublicUrl}\n data-testid=\"btn-copy-public-url\"\n aria-label=\"Copy webhook URL\"\n >\n <Copy className=\"h-4 w-4\" />\n </Button>\n </div>\n </div>\n\n <ol className=\"text-muted-foreground list-decimal space-y-1 pl-4 text-xs\">\n <li>\n Point your {platformLabel(pairing.platform)} bot webhook at the URL above (e.g.{' '}\n <code className=\"font-mono\">setWebhook</code> for Telegram).\n </li>\n <li>\n Send <code className=\"font-mono\">/pair {pairing.code}</code> to the bot.\n </li>\n <li>Enter the chat ID that received your code below and click Confirm.</li>\n </ol>\n\n <div className=\"space-y-1.5\">\n <Label htmlFor=\"pairing-chat-id\" className=\"text-xs\">\n Chat ID\n </Label>\n <Input\n id=\"pairing-chat-id\"\n data-testid=\"input-pairing-chat-id\"\n placeholder=\"e.g. 123456789 or @username\"\n value={chatIdInput}\n onChange={(e) => setChatIdInput(e.target.value)}\n />\n </div>\n </div>\n ) : null}\n\n <DialogFooter>\n <Button\n variant=\"outline\"\n onClick={() => setPairing(null)}\n disabled={pairingLoading}\n data-testid=\"btn-cancel-pairing\"\n >\n Cancel\n </Button>\n <Button\n onClick={handleConfirmPairing}\n disabled={pairingLoading || !chatIdInput.trim()}\n data-testid=\"btn-confirm-pairing\"\n >\n <ShieldCheck className=\"mr-1 h-3 w-3\" />\n Confirm pairing\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n </Card>\n );\n}\n\nfunction PlatformRow({\n platform,\n config,\n disabled,\n onPair,\n onDisconnect,\n onSaveBotToken,\n}: {\n platform: MessagingPlatform;\n config: MessagingConfig['telegram'];\n disabled: boolean;\n onPair: () => void;\n onDisconnect: () => void;\n onSaveBotToken: (value: string) => void;\n}) {\n const label = platformLabel(platform);\n const paired = !!config?.paired;\n const enabled = !!config?.enabled;\n const chatId = config?.chatId;\n const testIdPrefix = platform === MessagingPlatform.Telegram ? 'telegram' : 'whatsapp';\n\n const [botToken, setBotToken] = useState(config?.botToken ?? '');\n useEffect(() => {\n setBotToken(config?.botToken ?? '');\n }, [config?.botToken]);\n\n function handleBotTokenBlur() {\n if (botToken === (config?.botToken ?? '')) return;\n onSaveBotToken(botToken);\n }\n\n return (\n <div className=\"space-y-2\" data-testid={`messaging-platform-${testIdPrefix}`}>\n <div className=\"flex items-center justify-between gap-2\">\n <div className=\"min-w-0\">\n <div className=\"flex items-center gap-2\">\n <Label className=\"text-sm\">{label}</Label>\n {paired ? (\n <Badge variant=\"secondary\" className=\"text-[10px]\">\n Paired\n </Badge>\n ) : enabled ? (\n <Badge variant=\"outline\" className=\"text-[10px]\">\n Pairing\n </Badge>\n ) : (\n <Badge variant=\"outline\" className=\"text-[10px]\">\n Not configured\n </Badge>\n )}\n </div>\n {chatId ? (\n <p className=\"text-muted-foreground truncate text-[11px]\">chat: {chatId}</p>\n ) : null}\n </div>\n <div className=\"flex shrink-0 gap-2\">\n {paired ? (\n <Button\n variant=\"outline\"\n size=\"sm\"\n disabled={disabled}\n onClick={onDisconnect}\n data-testid={`btn-${testIdPrefix}-disconnect`}\n >\n Disconnect\n </Button>\n ) : (\n <Button\n size=\"sm\"\n disabled={disabled}\n onClick={onPair}\n data-testid={`btn-${testIdPrefix}-pair`}\n >\n Pair device\n </Button>\n )}\n </div>\n </div>\n\n {paired ? (\n <div className=\"space-y-1 pl-1\">\n <Label htmlFor={`${testIdPrefix}-bot-token`} className=\"text-[11px]\">\n Bot API token\n </Label>\n <Input\n id={`${testIdPrefix}-bot-token`}\n data-testid={`input-${testIdPrefix}-bot-token`}\n type=\"password\"\n placeholder={\n platform === MessagingPlatform.Telegram ? '123456:ABC-...' : 'WhatsApp access token'\n }\n value={botToken}\n disabled={disabled}\n onChange={(e) => setBotToken(e.target.value)}\n onBlur={handleBotTokenBlur}\n />\n <p className=\"text-muted-foreground text-[10px]\">\n Needed so the daemon can send replies and notifications. Stored in settings.db; you can\n also set the <code className=\"font-mono\">SHEP_TELEGRAM_BOT_TOKEN</code> env var instead.\n </p>\n </div>\n ) : null}\n </div>\n );\n}\n","\"use client\";\n\n// src/slider.tsx\nimport * as React from \"react\";\nimport { clamp } from \"@radix-ui/number\";\nimport { composeEventHandlers } from \"@radix-ui/primitive\";\nimport { useComposedRefs } from \"@radix-ui/react-compose-refs\";\nimport { createContextScope } from \"@radix-ui/react-context\";\nimport { useControllableState } from \"@radix-ui/react-use-controllable-state\";\nimport { useDirection } from \"@radix-ui/react-direction\";\nimport { usePrevious } from \"@radix-ui/react-use-previous\";\nimport { useSize } from \"@radix-ui/react-use-size\";\nimport { Primitive } from \"@radix-ui/react-primitive\";\nimport { createCollection } from \"@radix-ui/react-collection\";\nimport { jsx, jsxs } from \"react/jsx-runtime\";\nvar PAGE_KEYS = [\"PageUp\", \"PageDown\"];\nvar ARROW_KEYS = [\"ArrowUp\", \"ArrowDown\", \"ArrowLeft\", \"ArrowRight\"];\nvar BACK_KEYS = {\n \"from-left\": [\"Home\", \"PageDown\", \"ArrowDown\", \"ArrowLeft\"],\n \"from-right\": [\"Home\", \"PageDown\", \"ArrowDown\", \"ArrowRight\"],\n \"from-bottom\": [\"Home\", \"PageDown\", \"ArrowDown\", \"ArrowLeft\"],\n \"from-top\": [\"Home\", \"PageDown\", \"ArrowUp\", \"ArrowLeft\"]\n};\nvar SLIDER_NAME = \"Slider\";\nvar [Collection, useCollection, createCollectionScope] = createCollection(SLIDER_NAME);\nvar [createSliderContext, createSliderScope] = createContextScope(SLIDER_NAME, [\n createCollectionScope\n]);\nvar [SliderProvider, useSliderContext] = createSliderContext(SLIDER_NAME);\nvar Slider = React.forwardRef(\n (props, forwardedRef) => {\n const {\n name,\n min = 0,\n max = 100,\n step = 1,\n orientation = \"horizontal\",\n disabled = false,\n minStepsBetweenThumbs = 0,\n defaultValue = [min],\n value,\n onValueChange = () => {\n },\n onValueCommit = () => {\n },\n inverted = false,\n form,\n ...sliderProps\n } = props;\n const thumbRefs = React.useRef(/* @__PURE__ */ new Set());\n const valueIndexToChangeRef = React.useRef(0);\n const isHorizontal = orientation === \"horizontal\";\n const SliderOrientation = isHorizontal ? SliderHorizontal : SliderVertical;\n const [values = [], setValues] = useControllableState({\n prop: value,\n defaultProp: defaultValue,\n onChange: (value2) => {\n const thumbs = [...thumbRefs.current];\n thumbs[valueIndexToChangeRef.current]?.focus();\n onValueChange(value2);\n }\n });\n const valuesBeforeSlideStartRef = React.useRef(values);\n function handleSlideStart(value2) {\n const closestIndex = getClosestValueIndex(values, value2);\n updateValues(value2, closestIndex);\n }\n function handleSlideMove(value2) {\n updateValues(value2, valueIndexToChangeRef.current);\n }\n function handleSlideEnd() {\n const prevValue = valuesBeforeSlideStartRef.current[valueIndexToChangeRef.current];\n const nextValue = values[valueIndexToChangeRef.current];\n const hasChanged = nextValue !== prevValue;\n if (hasChanged) onValueCommit(values);\n }\n function updateValues(value2, atIndex, { commit } = { commit: false }) {\n const decimalCount = getDecimalCount(step);\n const snapToStep = roundValue(Math.round((value2 - min) / step) * step + min, decimalCount);\n const nextValue = clamp(snapToStep, [min, max]);\n setValues((prevValues = []) => {\n const nextValues = getNextSortedValues(prevValues, nextValue, atIndex);\n if (hasMinStepsBetweenValues(nextValues, minStepsBetweenThumbs * step)) {\n valueIndexToChangeRef.current = nextValues.indexOf(nextValue);\n const hasChanged = String(nextValues) !== String(prevValues);\n if (hasChanged && commit) onValueCommit(nextValues);\n return hasChanged ? nextValues : prevValues;\n } else {\n return prevValues;\n }\n });\n }\n return /* @__PURE__ */ jsx(\n SliderProvider,\n {\n scope: props.__scopeSlider,\n name,\n disabled,\n min,\n max,\n valueIndexToChangeRef,\n thumbs: thumbRefs.current,\n values,\n orientation,\n form,\n children: /* @__PURE__ */ jsx(Collection.Provider, { scope: props.__scopeSlider, children: /* @__PURE__ */ jsx(Collection.Slot, { scope: props.__scopeSlider, children: /* @__PURE__ */ jsx(\n SliderOrientation,\n {\n \"aria-disabled\": disabled,\n \"data-disabled\": disabled ? \"\" : void 0,\n ...sliderProps,\n ref: forwardedRef,\n onPointerDown: composeEventHandlers(sliderProps.onPointerDown, () => {\n if (!disabled) valuesBeforeSlideStartRef.current = values;\n }),\n min,\n max,\n inverted,\n onSlideStart: disabled ? void 0 : handleSlideStart,\n onSlideMove: disabled ? void 0 : handleSlideMove,\n onSlideEnd: disabled ? void 0 : handleSlideEnd,\n onHomeKeyDown: () => !disabled && updateValues(min, 0, { commit: true }),\n onEndKeyDown: () => !disabled && updateValues(max, values.length - 1, { commit: true }),\n onStepKeyDown: ({ event, direction: stepDirection }) => {\n if (!disabled) {\n const isPageKey = PAGE_KEYS.includes(event.key);\n const isSkipKey = isPageKey || event.shiftKey && ARROW_KEYS.includes(event.key);\n const multiplier = isSkipKey ? 10 : 1;\n const atIndex = valueIndexToChangeRef.current;\n const value2 = values[atIndex];\n const stepInDirection = step * multiplier * stepDirection;\n updateValues(value2 + stepInDirection, atIndex, { commit: true });\n }\n }\n }\n ) }) })\n }\n );\n }\n);\nSlider.displayName = SLIDER_NAME;\nvar [SliderOrientationProvider, useSliderOrientationContext] = createSliderContext(SLIDER_NAME, {\n startEdge: \"left\",\n endEdge: \"right\",\n size: \"width\",\n direction: 1\n});\nvar SliderHorizontal = React.forwardRef(\n (props, forwardedRef) => {\n const {\n min,\n max,\n dir,\n inverted,\n onSlideStart,\n onSlideMove,\n onSlideEnd,\n onStepKeyDown,\n ...sliderProps\n } = props;\n const [slider, setSlider] = React.useState(null);\n const composedRefs = useComposedRefs(forwardedRef, (node) => setSlider(node));\n const rectRef = React.useRef(void 0);\n const direction = useDirection(dir);\n const isDirectionLTR = direction === \"ltr\";\n const isSlidingFromLeft = isDirectionLTR && !inverted || !isDirectionLTR && inverted;\n function getValueFromPointer(pointerPosition) {\n const rect = rectRef.current || slider.getBoundingClientRect();\n const input = [0, rect.width];\n const output = isSlidingFromLeft ? [min, max] : [max, min];\n const value = linearScale(input, output);\n rectRef.current = rect;\n return value(pointerPosition - rect.left);\n }\n return /* @__PURE__ */ jsx(\n SliderOrientationProvider,\n {\n scope: props.__scopeSlider,\n startEdge: isSlidingFromLeft ? \"left\" : \"right\",\n endEdge: isSlidingFromLeft ? \"right\" : \"left\",\n direction: isSlidingFromLeft ? 1 : -1,\n size: \"width\",\n children: /* @__PURE__ */ jsx(\n SliderImpl,\n {\n dir: direction,\n \"data-orientation\": \"horizontal\",\n ...sliderProps,\n ref: composedRefs,\n style: {\n ...sliderProps.style,\n [\"--radix-slider-thumb-transform\"]: \"translateX(-50%)\"\n },\n onSlideStart: (event) => {\n const value = getValueFromPointer(event.clientX);\n onSlideStart?.(value);\n },\n onSlideMove: (event) => {\n const value = getValueFromPointer(event.clientX);\n onSlideMove?.(value);\n },\n onSlideEnd: () => {\n rectRef.current = void 0;\n onSlideEnd?.();\n },\n onStepKeyDown: (event) => {\n const slideDirection = isSlidingFromLeft ? \"from-left\" : \"from-right\";\n const isBackKey = BACK_KEYS[slideDirection].includes(event.key);\n onStepKeyDown?.({ event, direction: isBackKey ? -1 : 1 });\n }\n }\n )\n }\n );\n }\n);\nvar SliderVertical = React.forwardRef(\n (props, forwardedRef) => {\n const {\n min,\n max,\n inverted,\n onSlideStart,\n onSlideMove,\n onSlideEnd,\n onStepKeyDown,\n ...sliderProps\n } = props;\n const sliderRef = React.useRef(null);\n const ref = useComposedRefs(forwardedRef, sliderRef);\n const rectRef = React.useRef(void 0);\n const isSlidingFromBottom = !inverted;\n function getValueFromPointer(pointerPosition) {\n const rect = rectRef.current || sliderRef.current.getBoundingClientRect();\n const input = [0, rect.height];\n const output = isSlidingFromBottom ? [max, min] : [min, max];\n const value = linearScale(input, output);\n rectRef.current = rect;\n return value(pointerPosition - rect.top);\n }\n return /* @__PURE__ */ jsx(\n SliderOrientationProvider,\n {\n scope: props.__scopeSlider,\n startEdge: isSlidingFromBottom ? \"bottom\" : \"top\",\n endEdge: isSlidingFromBottom ? \"top\" : \"bottom\",\n size: \"height\",\n direction: isSlidingFromBottom ? 1 : -1,\n children: /* @__PURE__ */ jsx(\n SliderImpl,\n {\n \"data-orientation\": \"vertical\",\n ...sliderProps,\n ref,\n style: {\n ...sliderProps.style,\n [\"--radix-slider-thumb-transform\"]: \"translateY(50%)\"\n },\n onSlideStart: (event) => {\n const value = getValueFromPointer(event.clientY);\n onSlideStart?.(value);\n },\n onSlideMove: (event) => {\n const value = getValueFromPointer(event.clientY);\n onSlideMove?.(value);\n },\n onSlideEnd: () => {\n rectRef.current = void 0;\n onSlideEnd?.();\n },\n onStepKeyDown: (event) => {\n const slideDirection = isSlidingFromBottom ? \"from-bottom\" : \"from-top\";\n const isBackKey = BACK_KEYS[slideDirection].includes(event.key);\n onStepKeyDown?.({ event, direction: isBackKey ? -1 : 1 });\n }\n }\n )\n }\n );\n }\n);\nvar SliderImpl = React.forwardRef(\n (props, forwardedRef) => {\n const {\n __scopeSlider,\n onSlideStart,\n onSlideMove,\n onSlideEnd,\n onHomeKeyDown,\n onEndKeyDown,\n onStepKeyDown,\n ...sliderProps\n } = props;\n const context = useSliderContext(SLIDER_NAME, __scopeSlider);\n return /* @__PURE__ */ jsx(\n Primitive.span,\n {\n ...sliderProps,\n ref: forwardedRef,\n onKeyDown: composeEventHandlers(props.onKeyDown, (event) => {\n if (event.key === \"Home\") {\n onHomeKeyDown(event);\n event.preventDefault();\n } else if (event.key === \"End\") {\n onEndKeyDown(event);\n event.preventDefault();\n } else if (PAGE_KEYS.concat(ARROW_KEYS).includes(event.key)) {\n onStepKeyDown(event);\n event.preventDefault();\n }\n }),\n onPointerDown: composeEventHandlers(props.onPointerDown, (event) => {\n const target = event.target;\n target.setPointerCapture(event.pointerId);\n event.preventDefault();\n if (context.thumbs.has(target)) {\n target.focus();\n } else {\n onSlideStart(event);\n }\n }),\n onPointerMove: composeEventHandlers(props.onPointerMove, (event) => {\n const target = event.target;\n if (target.hasPointerCapture(event.pointerId)) onSlideMove(event);\n }),\n onPointerUp: composeEventHandlers(props.onPointerUp, (event) => {\n const target = event.target;\n if (target.hasPointerCapture(event.pointerId)) {\n target.releasePointerCapture(event.pointerId);\n onSlideEnd(event);\n }\n })\n }\n );\n }\n);\nvar TRACK_NAME = \"SliderTrack\";\nvar SliderTrack = React.forwardRef(\n (props, forwardedRef) => {\n const { __scopeSlider, ...trackProps } = props;\n const context = useSliderContext(TRACK_NAME, __scopeSlider);\n return /* @__PURE__ */ jsx(\n Primitive.span,\n {\n \"data-disabled\": context.disabled ? \"\" : void 0,\n \"data-orientation\": context.orientation,\n ...trackProps,\n ref: forwardedRef\n }\n );\n }\n);\nSliderTrack.displayName = TRACK_NAME;\nvar RANGE_NAME = \"SliderRange\";\nvar SliderRange = React.forwardRef(\n (props, forwardedRef) => {\n const { __scopeSlider, ...rangeProps } = props;\n const context = useSliderContext(RANGE_NAME, __scopeSlider);\n const orientation = useSliderOrientationContext(RANGE_NAME, __scopeSlider);\n const ref = React.useRef(null);\n const composedRefs = useComposedRefs(forwardedRef, ref);\n const valuesCount = context.values.length;\n const percentages = context.values.map(\n (value) => convertValueToPercentage(value, context.min, context.max)\n );\n const offsetStart = valuesCount > 1 ? Math.min(...percentages) : 0;\n const offsetEnd = 100 - Math.max(...percentages);\n return /* @__PURE__ */ jsx(\n Primitive.span,\n {\n \"data-orientation\": context.orientation,\n \"data-disabled\": context.disabled ? \"\" : void 0,\n ...rangeProps,\n ref: composedRefs,\n style: {\n ...props.style,\n [orientation.startEdge]: offsetStart + \"%\",\n [orientation.endEdge]: offsetEnd + \"%\"\n }\n }\n );\n }\n);\nSliderRange.displayName = RANGE_NAME;\nvar THUMB_NAME = \"SliderThumb\";\nvar SliderThumb = React.forwardRef(\n (props, forwardedRef) => {\n const getItems = useCollection(props.__scopeSlider);\n const [thumb, setThumb] = React.useState(null);\n const composedRefs = useComposedRefs(forwardedRef, (node) => setThumb(node));\n const index = React.useMemo(\n () => thumb ? getItems().findIndex((item) => item.ref.current === thumb) : -1,\n [getItems, thumb]\n );\n return /* @__PURE__ */ jsx(SliderThumbImpl, { ...props, ref: composedRefs, index });\n }\n);\nvar SliderThumbImpl = React.forwardRef(\n (props, forwardedRef) => {\n const { __scopeSlider, index, name, ...thumbProps } = props;\n const context = useSliderContext(THUMB_NAME, __scopeSlider);\n const orientation = useSliderOrientationContext(THUMB_NAME, __scopeSlider);\n const [thumb, setThumb] = React.useState(null);\n const composedRefs = useComposedRefs(forwardedRef, (node) => setThumb(node));\n const isFormControl = thumb ? context.form || !!thumb.closest(\"form\") : true;\n const size = useSize(thumb);\n const value = context.values[index];\n const percent = value === void 0 ? 0 : convertValueToPercentage(value, context.min, context.max);\n const label = getLabel(index, context.values.length);\n const orientationSize = size?.[orientation.size];\n const thumbInBoundsOffset = orientationSize ? getThumbInBoundsOffset(orientationSize, percent, orientation.direction) : 0;\n React.useEffect(() => {\n if (thumb) {\n context.thumbs.add(thumb);\n return () => {\n context.thumbs.delete(thumb);\n };\n }\n }, [thumb, context.thumbs]);\n return /* @__PURE__ */ jsxs(\n \"span\",\n {\n style: {\n transform: \"var(--radix-slider-thumb-transform)\",\n position: \"absolute\",\n [orientation.startEdge]: `calc(${percent}% + ${thumbInBoundsOffset}px)`\n },\n children: [\n /* @__PURE__ */ jsx(Collection.ItemSlot, { scope: props.__scopeSlider, children: /* @__PURE__ */ jsx(\n Primitive.span,\n {\n role: \"slider\",\n \"aria-label\": props[\"aria-label\"] || label,\n \"aria-valuemin\": context.min,\n \"aria-valuenow\": value,\n \"aria-valuemax\": context.max,\n \"aria-orientation\": context.orientation,\n \"data-orientation\": context.orientation,\n \"data-disabled\": context.disabled ? \"\" : void 0,\n tabIndex: context.disabled ? void 0 : 0,\n ...thumbProps,\n ref: composedRefs,\n style: value === void 0 ? { display: \"none\" } : props.style,\n onFocus: composeEventHandlers(props.onFocus, () => {\n context.valueIndexToChangeRef.current = index;\n })\n }\n ) }),\n isFormControl && /* @__PURE__ */ jsx(\n SliderBubbleInput,\n {\n name: name ?? (context.name ? context.name + (context.values.length > 1 ? \"[]\" : \"\") : void 0),\n form: context.form,\n value\n },\n index\n )\n ]\n }\n );\n }\n);\nSliderThumb.displayName = THUMB_NAME;\nvar BUBBLE_INPUT_NAME = \"RadioBubbleInput\";\nvar SliderBubbleInput = React.forwardRef(\n ({ __scopeSlider, value, ...props }, forwardedRef) => {\n const ref = React.useRef(null);\n const composedRefs = useComposedRefs(ref, forwardedRef);\n const prevValue = usePrevious(value);\n React.useEffect(() => {\n const input = ref.current;\n if (!input) return;\n const inputProto = window.HTMLInputElement.prototype;\n const descriptor = Object.getOwnPropertyDescriptor(inputProto, \"value\");\n const setValue = descriptor.set;\n if (prevValue !== value && setValue) {\n const event = new Event(\"input\", { bubbles: true });\n setValue.call(input, value);\n input.dispatchEvent(event);\n }\n }, [prevValue, value]);\n return /* @__PURE__ */ jsx(\n Primitive.input,\n {\n style: { display: \"none\" },\n ...props,\n ref: composedRefs,\n defaultValue: value\n }\n );\n }\n);\nSliderBubbleInput.displayName = BUBBLE_INPUT_NAME;\nfunction getNextSortedValues(prevValues = [], nextValue, atIndex) {\n const nextValues = [...prevValues];\n nextValues[atIndex] = nextValue;\n return nextValues.sort((a, b) => a - b);\n}\nfunction convertValueToPercentage(value, min, max) {\n const maxSteps = max - min;\n const percentPerStep = 100 / maxSteps;\n const percentage = percentPerStep * (value - min);\n return clamp(percentage, [0, 100]);\n}\nfunction getLabel(index, totalValues) {\n if (totalValues > 2) {\n return `Value ${index + 1} of ${totalValues}`;\n } else if (totalValues === 2) {\n return [\"Minimum\", \"Maximum\"][index];\n } else {\n return void 0;\n }\n}\nfunction getClosestValueIndex(values, nextValue) {\n if (values.length === 1) return 0;\n const distances = values.map((value) => Math.abs(value - nextValue));\n const closestDistance = Math.min(...distances);\n return distances.indexOf(closestDistance);\n}\nfunction getThumbInBoundsOffset(width, left, direction) {\n const halfWidth = width / 2;\n const halfPercent = 50;\n const offset = linearScale([0, halfPercent], [0, halfWidth]);\n return (halfWidth - offset(left) * direction) * direction;\n}\nfunction getStepsBetweenValues(values) {\n return values.slice(0, -1).map((value, index) => values[index + 1] - value);\n}\nfunction hasMinStepsBetweenValues(values, minStepsBetweenValues) {\n if (minStepsBetweenValues > 0) {\n const stepsBetweenValues = getStepsBetweenValues(values);\n const actualMinStepsBetweenValues = Math.min(...stepsBetweenValues);\n return actualMinStepsBetweenValues >= minStepsBetweenValues;\n }\n return true;\n}\nfunction linearScale(input, output) {\n return (value) => {\n if (input[0] === input[1] || output[0] === output[1]) return output[0];\n const ratio = (output[1] - output[0]) / (input[1] - input[0]);\n return output[0] + ratio * (value - input[0]);\n };\n}\nfunction getDecimalCount(value) {\n return (String(value).split(\".\")[1] || \"\").length;\n}\nfunction roundValue(value, decimalCount) {\n const rounder = Math.pow(10, decimalCount);\n return Math.round(value * rounder) / rounder;\n}\nvar Root = Slider;\nvar Track = SliderTrack;\nvar Range = SliderRange;\nvar Thumb = SliderThumb;\nexport {\n Range,\n Root,\n Slider,\n SliderRange,\n SliderThumb,\n SliderTrack,\n Thumb,\n Track,\n createSliderScope\n};\n//# sourceMappingURL=index.mjs.map\n","'use client';\n\nimport * as React from 'react';\nimport { Slider as SliderPrimitive } from 'radix-ui';\n\nimport { cn } from '@/lib/utils';\n\nfunction Slider({\n className,\n defaultValue,\n value,\n min = 0,\n max = 100,\n ...props\n}: React.ComponentProps<typeof SliderPrimitive.Root>) {\n const _values = React.useMemo(\n () => (Array.isArray(value) ? value : Array.isArray(defaultValue) ? defaultValue : [min, max]),\n [value, defaultValue, min, max]\n );\n\n return (\n <SliderPrimitive.Root\n data-slot=\"slider\"\n defaultValue={defaultValue}\n value={value}\n min={min}\n max={max}\n className={cn(\n 'relative flex w-full touch-none items-center select-none data-[disabled]:opacity-50 data-[orientation=vertical]:h-full data-[orientation=vertical]:min-h-44 data-[orientation=vertical]:w-auto data-[orientation=vertical]:flex-col',\n className\n )}\n {...props}\n >\n <SliderPrimitive.Track\n data-slot=\"slider-track\"\n className={cn(\n 'bg-muted relative grow overflow-hidden rounded-full data-[orientation=horizontal]:h-1.5 data-[orientation=horizontal]:w-full data-[orientation=vertical]:h-full data-[orientation=vertical]:w-1.5'\n )}\n >\n <SliderPrimitive.Range\n data-slot=\"slider-range\"\n className={cn(\n 'bg-primary absolute data-[orientation=horizontal]:h-full data-[orientation=vertical]:w-full'\n )}\n />\n </SliderPrimitive.Track>\n {Array.from({ length: _values.length }, (_, index) => (\n <SliderPrimitive.Thumb\n data-slot=\"slider-thumb\"\n key={index}\n className=\"border-primary ring-ring/50 block size-4 shrink-0 rounded-full border bg-white shadow-sm transition-[color,box-shadow] hover:ring-4 focus-visible:ring-4 focus-visible:outline-hidden disabled:pointer-events-none disabled:opacity-50\"\n />\n ))}\n </SliderPrimitive.Root>\n );\n}\n\nexport { Slider };\n","'use client';\n\nimport { useState, useCallback } from 'react';\nimport { Slider } from '@/components/ui/slider';\n\n/** Fixed duration presets in seconds — slider snaps to these values */\nconst PRESETS = [\n 60, // 1m\n 120, // 2m\n 300, // 5m\n 600, // 10m\n 900, // 15m\n 1800, // 30m\n 2700, // 45m\n 3600, // 1h\n 7200, // 2h\n 10800, // 3h\n 14400, // 4h\n 21600, // 6h\n 28800, // 8h\n 43200, // 12h\n 86400, // 24h\n];\n\nconst SLIDER_MAX = PRESETS.length - 1;\n\n/** Find the closest preset index for a given seconds value */\nfunction secondsToIndex(seconds: number): number {\n let closest = 0;\n let minDiff = Math.abs(seconds - PRESETS[0]);\n for (let i = 1; i < PRESETS.length; i++) {\n const diff = Math.abs(seconds - PRESETS[i]);\n if (diff < minDiff) {\n minDiff = diff;\n closest = i;\n }\n }\n return closest;\n}\n\nexport interface TimeoutSliderProps {\n id: string;\n testId: string;\n /** Current value in seconds (as a string for form compatibility) */\n value: string;\n onChange: (value: string) => void;\n onBlur: () => void;\n defaultSeconds?: number;\n}\n\nfunction formatDuration(totalSeconds: number): string {\n const hours = Math.floor(totalSeconds / 3600);\n const minutes = Math.round((totalSeconds % 3600) / 60);\n\n if (hours === 0) return `${minutes}m`;\n if (minutes === 0) return `${hours}h`;\n return `${hours}h ${minutes}m`;\n}\n\nexport function TimeoutSlider({\n id,\n testId,\n value,\n onChange,\n onBlur,\n defaultSeconds = 1800,\n}: TimeoutSliderProps) {\n const numValue = value === '' ? defaultSeconds : parseInt(value, 10);\n const seconds = numValue || defaultSeconds;\n\n // Local index state prevents snap-back during drag — updates immediately\n // without waiting for the parent to re-render with the new value.\n const [localIndex, setLocalIndex] = useState(() => secondsToIndex(seconds));\n\n // Sync from props only when the resolved index actually differs\n // (e.g. external reset or server push). Avoids overwriting during drag.\n const propsIndex = secondsToIndex(seconds);\n if (propsIndex !== localIndex && PRESETS[localIndex] !== seconds) {\n setLocalIndex(propsIndex);\n }\n\n const handleChange = useCallback(\n ([i]: number[]) => {\n setLocalIndex(i);\n onChange(String(PRESETS[i]));\n },\n [onChange]\n );\n\n return (\n <div className=\"flex w-55 items-center gap-2\">\n <Slider\n id={id}\n data-testid={testId}\n min={0}\n max={SLIDER_MAX}\n step={1}\n value={[localIndex]}\n onValueChange={handleChange}\n onValueCommit={() => onBlur()}\n className=\"min-w-0 flex-1\"\n />\n <span className=\"text-muted-foreground shrink-0 text-end text-xs tabular-nums\">\n {formatDuration(PRESETS[localIndex])}\n </span>\n </div>\n );\n}\n","'use client';\n\nimport { useState, useTransition, useRef, useEffect, useCallback } from 'react';\nimport {\n Check,\n Bot,\n Terminal,\n GitBranch,\n Activity,\n Bell,\n Flag,\n Database,\n Globe,\n Minus,\n Plus,\n ExternalLink,\n Settings2,\n Timer,\n MessageSquare,\n LayoutGrid,\n MessageCircle,\n} from 'lucide-react';\nimport { toast } from 'sonner';\nimport { useTranslation } from 'react-i18next';\nimport { cn } from '@/lib/utils';\nimport { Label } from '@/components/ui/label';\nimport { Switch } from '@/components/ui/switch';\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from '@/components/ui/select';\nimport { updateSettingsAction } from '@/app/actions/update-settings';\nimport {\n type AgentType,\n EditorType,\n Language,\n TerminalType,\n} from '@shepai/core/domain/generated/output';\nimport { getEditorTypeIcon } from '@/components/common/editor-type-icons';\nimport { AgentModelPicker } from '@/components/features/settings/AgentModelPicker';\nimport { LanguageSettingsSection } from '@/components/features/settings/language-settings-section';\nimport { MessagingSettingsSection } from '@/components/features/settings/messaging-settings-section';\nimport { TimeoutSlider } from '@/components/features/settings/timeout-slider';\nimport type {\n Settings,\n FeatureFlags,\n NotificationPreferences,\n InteractiveAgentConfig,\n FabLayoutConfig,\n} from '@shepai/core/domain/generated/output';\nimport type { AvailableTerminal } from '@/app/actions/get-available-terminals';\n\nconst EDITOR_OPTIONS = [\n { value: EditorType.VsCode, label: 'VS Code' },\n { value: EditorType.Cursor, label: 'Cursor' },\n { value: EditorType.Windsurf, label: 'Windsurf' },\n { value: EditorType.Zed, label: 'Zed' },\n { value: EditorType.Antigravity, label: 'Antigravity' },\n];\n\nconst SHELL_OPTIONS = [\n { value: 'bash', label: 'Bash' },\n { value: 'zsh', label: 'Zsh' },\n { value: 'fish', label: 'Fish' },\n];\n\nconst SECTIONS = [\n { id: 'language', labelKey: 'settings.sections.language', icon: Globe },\n { id: 'agent', labelKey: 'settings.sections.agent', icon: Bot },\n { id: 'environment', labelKey: 'settings.sections.environment', icon: Terminal },\n { id: 'workflow', labelKey: 'settings.sections.workflow', icon: GitBranch },\n { id: 'ci', labelKey: 'settings.sections.ci', icon: Activity },\n { id: 'stage-timeouts', labelKey: 'settings.sections.timeouts', icon: Timer },\n { id: 'notifications', labelKey: 'settings.sections.notifications', icon: Bell },\n { id: 'messaging', labelKey: 'settings.sections.messaging', icon: MessageCircle },\n { id: 'feature-flags', labelKey: 'settings.sections.flags', icon: Flag },\n { id: 'interactive-agent', labelKey: 'settings.sections.chat', icon: MessageSquare },\n { id: 'fab-layout', labelKey: 'settings.sections.layout', icon: LayoutGrid },\n { id: 'database', labelKey: 'settings.sections.database', icon: Database },\n] as const;\n\nexport interface SettingsPageClientProps {\n settings: Settings;\n shepHome: string;\n dbFileSize: string;\n availableTerminals?: AvailableTerminal[];\n}\n\nfunction useSaveIndicator() {\n const { t } = useTranslation('web');\n const [isPending, startTransition] = useTransition();\n const [showSaving, setShowSaving] = useState(false);\n const [showSaved, setShowSaved] = useState(false);\n const minTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const pendingDoneRef = useRef(false);\n\n // Show \"Saving...\" with a minimum display time of 600ms\n useEffect(() => {\n if (isPending && !showSaving) {\n setShowSaving(true);\n pendingDoneRef.current = false;\n minTimerRef.current = setTimeout(() => {\n minTimerRef.current = null;\n if (pendingDoneRef.current) {\n setShowSaving(false);\n setShowSaved(true);\n setTimeout(() => setShowSaved(false), 2000);\n }\n }, 350);\n }\n if (!isPending && showSaving) {\n pendingDoneRef.current = true;\n // If min timer already elapsed, transition now\n if (!minTimerRef.current) {\n setShowSaving(false);\n setShowSaved(true);\n setTimeout(() => setShowSaved(false), 2000);\n }\n }\n }, [isPending, showSaving]);\n\n const save = useCallback(\n (payload: Record<string, unknown>) => {\n startTransition(async () => {\n const result = await updateSettingsAction(payload);\n if (!result.success) {\n toast.error(result.error ?? t('settings.failedToSave'));\n }\n });\n },\n [startTransition, t]\n );\n\n return { showSaving, showSaved, save };\n}\n\n/* ── Reusable row components ── */\n\nfunction SettingsRow({\n label,\n description,\n htmlFor,\n children,\n}: {\n label: string;\n description?: string;\n htmlFor?: string;\n children: React.ReactNode;\n}) {\n return (\n <div className=\"flex items-center justify-between gap-4 border-b py-2.5 last:border-b-0\">\n <div className=\"min-w-0\">\n <Label htmlFor={htmlFor} className=\"cursor-pointer text-sm font-normal whitespace-nowrap\">\n {label}\n </Label>\n {description ? (\n <p className=\"text-muted-foreground text-[11px] leading-tight\">{description}</p>\n ) : null}\n </div>\n <div className=\"flex shrink-0 items-center gap-2\">{children}</div>\n </div>\n );\n}\n\nfunction SwitchRow({\n label,\n description,\n id,\n testId,\n checked,\n onChange,\n disabled,\n}: {\n label: string;\n description?: string;\n id: string;\n testId: string;\n checked: boolean;\n onChange: (value: boolean) => void;\n disabled?: boolean;\n}) {\n return (\n <SettingsRow label={label} description={description} htmlFor={id}>\n <Switch\n id={id}\n data-testid={testId}\n checked={checked}\n onCheckedChange={onChange}\n disabled={disabled}\n className={cn('cursor-pointer', disabled && 'cursor-not-allowed opacity-50')}\n />\n </SettingsRow>\n );\n}\n\n/* ── Section card wrapper ── */\n\nfunction SettingsSection({\n icon: Icon,\n title,\n description,\n badge,\n testId,\n children,\n}: {\n icon: React.ComponentType<{ className?: string }>;\n title: string;\n description: string;\n badge?: string;\n testId: string;\n children: React.ReactNode;\n}) {\n return (\n <div className=\"bg-background rounded-lg border\" data-testid={testId}>\n <div className=\"bg-muted/30 border-b px-4 py-3\">\n <div className=\"flex items-center gap-2\">\n <Icon className=\"text-muted-foreground h-3.5 w-3.5\" />\n <h2 className=\"text-sm font-semibold\">{title}</h2>\n {badge ? (\n <span className=\"bg-muted text-muted-foreground rounded px-1.5 py-0.5 text-[9px] font-medium tracking-wider uppercase\">\n {badge}\n </span>\n ) : null}\n </div>\n <p className=\"text-muted-foreground mt-0.5 text-[11px]\">{description}</p>\n </div>\n <div className=\"px-4\">{children}</div>\n </div>\n );\n}\n\nfunction NumberStepper({\n id,\n testId,\n value,\n onChange,\n onBlur,\n placeholder,\n min = 1,\n max,\n step = 1,\n suffix,\n}: {\n id: string;\n testId: string;\n value: string;\n onChange: (value: string) => void;\n onBlur: () => void;\n placeholder: string;\n min?: number;\n max?: number;\n step?: number;\n suffix?: string;\n}) {\n const { t } = useTranslation('web');\n const numValue = value === '' ? undefined : parseInt(value, 10);\n\n const decrement = () => {\n const current = numValue ?? parseInt(placeholder, 10);\n const next = Math.max(min, current - step);\n onChange(String(next));\n };\n\n const increment = () => {\n const current = numValue ?? parseInt(placeholder, 10);\n const next = max != null ? Math.min(max, current + step) : current + step;\n onChange(String(next));\n };\n\n return (\n <div className=\"flex items-center gap-1.5\">\n <div className=\"flex items-center overflow-hidden rounded-md border\">\n <button\n type=\"button\"\n onClick={() => {\n decrement();\n }}\n onMouseUp={onBlur}\n 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\"\n aria-label={t('common.decrease')}\n >\n <Minus className=\"h-3 w-3\" />\n </button>\n <input\n id={id}\n data-testid={testId}\n type=\"text\"\n inputMode=\"numeric\"\n pattern=\"[0-9]*\"\n value={value}\n placeholder={placeholder}\n onChange={(e) => {\n const v = e.target.value.replace(/[^0-9]/g, '');\n onChange(v);\n }}\n onBlur={onBlur}\n className=\"h-8 w-14 bg-transparent text-center text-xs outline-none\"\n />\n <button\n type=\"button\"\n onClick={() => {\n increment();\n }}\n onMouseUp={onBlur}\n 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\"\n aria-label={t('common.increase')}\n >\n <Plus className=\"h-3 w-3\" />\n </button>\n </div>\n {suffix ? <span className=\"text-muted-foreground text-[11px]\">{suffix}</span> : null}\n </div>\n );\n}\n\nfunction SubsectionLabel({ children }: { children: React.ReactNode }) {\n return (\n <div className=\"border-b pt-3 pb-1\">\n <span className=\"text-muted-foreground text-[10px] font-semibold tracking-wider uppercase\">\n {children}\n </span>\n </div>\n );\n}\n\nfunction SectionHint({\n children,\n links,\n}: {\n children: React.ReactNode;\n links?: { label: string; href: string }[];\n}) {\n return (\n <div className=\"hidden pt-2 lg:block\">\n <p className=\"text-muted-foreground/70 text-[11px] leading-relaxed\">{children}</p>\n {links != null && links.length > 0 ? (\n <div className=\"mt-2 flex flex-col gap-1\">\n {links.map((link) => (\n <a\n key={link.href}\n href={link.href}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"text-muted-foreground hover:text-foreground inline-flex items-center gap-1 text-[10px] transition-colors\"\n >\n <ExternalLink className=\"h-2.5 w-2.5\" />\n {link.label}\n </a>\n ))}\n </div>\n ) : null}\n </div>\n );\n}\n\n/* ── Main component ── */\n\nexport function SettingsPageClient({\n settings,\n shepHome,\n dbFileSize,\n availableTerminals,\n}: SettingsPageClientProps) {\n const { t } = useTranslation('web');\n const { showSaving, showSaved, save } = useSaveIndicator();\n const featureFlags = settings.featureFlags ?? {\n skills: false,\n envDeploy: false,\n debug: false,\n githubImport: false,\n adoptBranch: false,\n gitRebaseSync: false,\n reactFileManager: false,\n inventory: false,\n };\n\n // Agent state\n const [agentType, setAgentType] = useState(settings.agent.type);\n\n // Environment state\n const [editor, setEditor] = useState(settings.environment.defaultEditor);\n const [shell, setShell] = useState(settings.environment.shellPreference);\n const [terminal, setTerminal] = useState(\n settings.environment.terminalPreference ?? TerminalType.System\n );\n\n // Filter to only show installed terminals\n const terminalOptions = availableTerminals\n ? availableTerminals.filter((t) => t.available)\n : [\n {\n id: TerminalType.System,\n name: t('settings.environment.systemTerminal'),\n available: true as const,\n },\n ];\n\n // Workflow state\n const [openPr, setOpenPr] = useState(settings.workflow.openPrOnImplementationComplete);\n const [pushOnComplete, setPushOnComplete] = useState(\n settings.workflow.approvalGateDefaults.pushOnImplementationComplete\n );\n const [allowPrd, setAllowPrd] = useState(settings.workflow.approvalGateDefaults.allowPrd);\n const [allowPlan, setAllowPlan] = useState(settings.workflow.approvalGateDefaults.allowPlan);\n const [allowMerge, setAllowMerge] = useState(settings.workflow.approvalGateDefaults.allowMerge);\n const [enableEvidence, setEnableEvidence] = useState(settings.workflow.enableEvidence);\n const [commitEvidence, setCommitEvidence] = useState(settings.workflow.commitEvidence);\n const [ciWatchEnabled, setCiWatchEnabled] = useState(settings.workflow.ciWatchEnabled !== false);\n const [hideCiStatus, setHideCiStatus] = useState(settings.workflow.hideCiStatus !== false);\n const [defaultFastMode, setDefaultFastMode] = useState(\n settings.workflow.defaultFastMode !== false\n );\n // Auto-archive state\n const [autoArchiveEnabled, setAutoArchiveEnabled] = useState(\n (settings.workflow.autoArchiveDelayMinutes ?? 10) > 0\n );\n const [autoArchiveDelay, setAutoArchiveDelay] = useState(\n String(settings.workflow.autoArchiveDelayMinutes ?? 10)\n );\n const [ciMaxFix, setCiMaxFix] = useState(\n settings.workflow.ciMaxFixAttempts != null ? String(settings.workflow.ciMaxFixAttempts) : ''\n );\n const [ciTimeout, setCiTimeout] = useState(\n settings.workflow.ciWatchTimeoutMs != null\n ? String(Math.round(settings.workflow.ciWatchTimeoutMs / 1000))\n : ''\n );\n const [ciLogMax, setCiLogMax] = useState(\n settings.workflow.ciLogMaxChars != null ? String(settings.workflow.ciLogMaxChars) : ''\n );\n const [ciPollInterval, setCiPollInterval] = useState(\n settings.workflow.ciWatchPollIntervalSeconds != null\n ? String(settings.workflow.ciWatchPollIntervalSeconds)\n : ''\n );\n // Feature agent per-stage timeout states (stored in seconds for display, converted to ms on save)\n // Defaults: feature agent stages = 1_800_000 ms (1800s), analyze-repo = 600_000 ms (600s)\n const stageTimeoutsConfig = settings.workflow.stageTimeouts;\n const [analyzeTimeout, setAnalyzeTimeout] = useState(\n String(Math.round((stageTimeoutsConfig?.analyzeMs ?? 1_800_000) / 1000))\n );\n const [requirementsTimeout, setRequirementsTimeout] = useState(\n String(Math.round((stageTimeoutsConfig?.requirementsMs ?? 1_800_000) / 1000))\n );\n const [researchTimeout, setResearchTimeout] = useState(\n String(Math.round((stageTimeoutsConfig?.researchMs ?? 1_800_000) / 1000))\n );\n const [planTimeout, setPlanTimeout] = useState(\n String(Math.round((stageTimeoutsConfig?.planMs ?? 1_800_000) / 1000))\n );\n const [implementTimeout, setImplementTimeout] = useState(\n String(Math.round((stageTimeoutsConfig?.implementMs ?? 1_800_000) / 1000))\n );\n const [fastImplementTimeout, setFastImplementTimeout] = useState(\n String(Math.round((stageTimeoutsConfig?.fastImplementMs ?? 1_800_000) / 1000))\n );\n const [mergeTimeout, setMergeTimeout] = useState(\n String(Math.round((stageTimeoutsConfig?.mergeMs ?? 1_800_000) / 1000))\n );\n // Analyze-repo agent timeout state\n const analyzeRepoConfig = settings.workflow.analyzeRepoTimeouts;\n const [analyzeRepoTimeout, setAnalyzeRepoTimeout] = useState(\n String(Math.round((analyzeRepoConfig?.analyzeMs ?? 600_000) / 1000))\n );\n\n // Interactive agent state\n const interactiveAgentConfig: InteractiveAgentConfig = settings.interactiveAgent ?? {\n enabled: true,\n autoTimeoutMinutes: 15,\n maxConcurrentSessions: 3,\n };\n const [interactiveEnabled, setInteractiveEnabled] = useState(interactiveAgentConfig.enabled);\n const [interactiveTimeout, setInteractiveTimeout] = useState(\n String(interactiveAgentConfig.autoTimeoutMinutes)\n );\n const [interactiveSessions, setInteractiveSessions] = useState(\n String(interactiveAgentConfig.maxConcurrentSessions)\n );\n\n // FAB layout state\n const fabLayoutConfig: FabLayoutConfig = settings.fabLayout ?? { swapPosition: false };\n const [fabSwapPosition, setFabSwapPosition] = useState(fabLayoutConfig.swapPosition);\n\n // Notification state\n const [inApp, setInApp] = useState(settings.notifications.inApp.enabled);\n const [events, setEvents] = useState({ ...settings.notifications.events });\n\n // Feature flags state\n const [flags, setFlags] = useState<FeatureFlags>({ ...featureFlags });\n\n // Original CI values for blur comparison\n const originalCiMaxFix =\n settings.workflow.ciMaxFixAttempts != null ? String(settings.workflow.ciMaxFixAttempts) : '';\n const originalCiTimeout =\n settings.workflow.ciWatchTimeoutMs != null\n ? String(Math.round(settings.workflow.ciWatchTimeoutMs / 1000))\n : '';\n const originalCiLogMax =\n settings.workflow.ciLogMaxChars != null ? String(settings.workflow.ciLogMaxChars) : '';\n const originalCiPollInterval =\n settings.workflow.ciWatchPollIntervalSeconds != null\n ? String(settings.workflow.ciWatchPollIntervalSeconds)\n : '';\n const originalAnalyzeTimeout =\n stageTimeoutsConfig?.analyzeMs != null\n ? String(Math.round(stageTimeoutsConfig.analyzeMs / 1000))\n : '';\n const originalRequirementsTimeout =\n stageTimeoutsConfig?.requirementsMs != null\n ? String(Math.round(stageTimeoutsConfig.requirementsMs / 1000))\n : '';\n const originalResearchTimeout =\n stageTimeoutsConfig?.researchMs != null\n ? String(Math.round(stageTimeoutsConfig.researchMs / 1000))\n : '';\n const originalPlanTimeout =\n stageTimeoutsConfig?.planMs != null\n ? String(Math.round(stageTimeoutsConfig.planMs / 1000))\n : '';\n const originalImplementTimeout =\n stageTimeoutsConfig?.implementMs != null\n ? String(Math.round(stageTimeoutsConfig.implementMs / 1000))\n : '';\n const originalFastImplementTimeout =\n stageTimeoutsConfig?.fastImplementMs != null\n ? String(Math.round(stageTimeoutsConfig.fastImplementMs / 1000))\n : '';\n const originalMergeTimeout =\n stageTimeoutsConfig?.mergeMs != null\n ? String(Math.round(stageTimeoutsConfig.mergeMs / 1000))\n : '';\n const originalAnalyzeRepoTimeout =\n analyzeRepoConfig?.analyzeMs != null\n ? String(Math.round(analyzeRepoConfig.analyzeMs / 1000))\n : '';\n\n function parseOptionalInt(value: string): number | undefined {\n if (value === '') return undefined;\n const n = parseInt(value, 10);\n return Number.isNaN(n) || n <= 0 ? undefined : n;\n }\n\n function secondsToMs(val: string | undefined): number | undefined {\n if (val === undefined) return undefined;\n const n = parseOptionalInt(val);\n return n != null ? n * 1000 : undefined;\n }\n\n // Workflow helpers\n function buildWorkflowPayload(\n overrides: {\n openPr?: boolean;\n pushOnComplete?: boolean;\n allowPrd?: boolean;\n allowPlan?: boolean;\n allowMerge?: boolean;\n enableEvidence?: boolean;\n commitEvidence?: boolean;\n ciWatchEnabled?: boolean;\n hideCiStatus?: boolean;\n defaultFastMode?: boolean;\n autoArchiveEnabled?: boolean;\n autoArchiveDelay?: string;\n ciMaxFix?: string;\n ciTimeout?: string;\n ciLogMax?: string;\n ciPollInterval?: string;\n analyzeTimeout?: string;\n requirementsTimeout?: string;\n researchTimeout?: string;\n planTimeout?: string;\n implementTimeout?: string;\n fastImplementTimeout?: string;\n mergeTimeout?: string;\n analyzeRepoTimeout?: string;\n } = {}\n ) {\n const timeoutSeconds = parseOptionalInt(overrides.ciTimeout ?? ciTimeout);\n const archiveEnabled = overrides.autoArchiveEnabled ?? autoArchiveEnabled;\n const archiveDelay = parseInt(overrides.autoArchiveDelay ?? autoArchiveDelay, 10);\n return {\n workflow: {\n openPrOnImplementationComplete: overrides.openPr ?? openPr,\n approvalGateDefaults: {\n pushOnImplementationComplete: overrides.pushOnComplete ?? pushOnComplete,\n allowPrd: overrides.allowPrd ?? allowPrd,\n allowPlan: overrides.allowPlan ?? allowPlan,\n allowMerge: overrides.allowMerge ?? allowMerge,\n },\n enableEvidence: overrides.enableEvidence ?? enableEvidence,\n commitEvidence: overrides.commitEvidence ?? commitEvidence,\n ciWatchEnabled: overrides.ciWatchEnabled ?? ciWatchEnabled,\n hideCiStatus: overrides.hideCiStatus ?? hideCiStatus,\n defaultFastMode: overrides.defaultFastMode ?? defaultFastMode,\n autoArchiveDelayMinutes: archiveEnabled\n ? Number.isNaN(archiveDelay) || archiveDelay < 1\n ? 10\n : archiveDelay\n : 0,\n ciMaxFixAttempts: parseOptionalInt(overrides.ciMaxFix ?? ciMaxFix),\n ciWatchTimeoutMs: timeoutSeconds != null ? timeoutSeconds * 1000 : undefined,\n ciLogMaxChars: parseOptionalInt(overrides.ciLogMax ?? ciLogMax),\n ciWatchPollIntervalSeconds: parseOptionalInt(overrides.ciPollInterval ?? ciPollInterval),\n stageTimeouts: {\n analyzeMs: secondsToMs(overrides.analyzeTimeout ?? analyzeTimeout),\n requirementsMs: secondsToMs(overrides.requirementsTimeout ?? requirementsTimeout),\n researchMs: secondsToMs(overrides.researchTimeout ?? researchTimeout),\n planMs: secondsToMs(overrides.planTimeout ?? planTimeout),\n implementMs: secondsToMs(overrides.implementTimeout ?? implementTimeout),\n fastImplementMs: secondsToMs(overrides.fastImplementTimeout ?? fastImplementTimeout),\n mergeMs: secondsToMs(overrides.mergeTimeout ?? mergeTimeout),\n },\n analyzeRepoTimeouts: {\n analyzeMs: secondsToMs(overrides.analyzeRepoTimeout ?? analyzeRepoTimeout),\n },\n },\n };\n }\n\n // Notification helpers\n function buildNotificationPayload(\n overrides: {\n inApp?: boolean;\n events?: NotificationPreferences['events'];\n } = {}\n ) {\n return {\n notifications: {\n inApp: { enabled: overrides.inApp ?? inApp },\n events: overrides.events ?? events,\n },\n };\n }\n\n const [activeSection, setActiveSection] = useState<string>('agent');\n\n // Track which section is in view via IntersectionObserver\n useEffect(() => {\n const els = SECTIONS.map((s) => document.getElementById(`section-${s.id}`)).filter(\n Boolean\n ) as HTMLElement[];\n if (els.length === 0) return;\n\n const observer = new IntersectionObserver(\n (entries) => {\n for (const entry of entries) {\n if (entry.isIntersecting) {\n setActiveSection(entry.target.id.replace('section-', ''));\n }\n }\n },\n { rootMargin: '-65px 0px -60% 0px', threshold: 0 }\n );\n\n for (const el of els) observer.observe(el);\n return () => observer.disconnect();\n }, []);\n\n const scrollToSection = useCallback((id: string) => {\n const el = document.getElementById(`section-${id}`);\n if (!el) return;\n el.scrollIntoView({ behavior: 'smooth', block: 'start' });\n // Flash highlight\n el.style.animation = 'none';\n // Force reflow\n void el.offsetHeight;\n el.style.animation = 'section-flash 1s ease-out';\n }, []);\n\n return (\n <div data-testid=\"settings-page-client\" className=\"max-w-5xl\">\n {/* Sticky header — title + save indicator + TOC in one row */}\n <div className=\"bg-background/95 supports-backdrop-filter:bg-background/80 sticky top-0 z-10 grid grid-cols-1 gap-x-5 pt-6 pb-4 backdrop-blur lg:grid-cols-[1fr_280px]\">\n <div className=\"flex items-center gap-2\">\n <Settings2 className=\"text-muted-foreground h-4 w-4\" />\n <h1 className=\"text-sm font-bold tracking-tight\">{t('settings.title')}</h1>\n <span className=\"relative h-4 w-16\">\n <span\n className={cn(\n 'text-muted-foreground absolute inset-0 flex items-center text-xs transition-opacity duration-300',\n showSaving ? 'opacity-100' : 'opacity-0'\n )}\n >\n {t('settings.saving')}\n </span>\n <span\n className={cn(\n 'absolute inset-0 flex items-center gap-1 text-xs text-green-600 transition-opacity duration-300',\n showSaved && !showSaving ? 'opacity-100' : 'opacity-0'\n )}\n >\n <Check className=\"h-3 w-3\" />\n {t('settings.saved')}\n </span>\n </span>\n <nav className=\"ml-auto flex items-center gap-0.5\">\n {SECTIONS.map((s) => {\n const SectionIcon = s.icon;\n const isActive = activeSection === s.id;\n return (\n <button\n key={s.id}\n type=\"button\"\n onClick={() => scrollToSection(s.id)}\n className={cn(\n 'flex cursor-pointer items-center gap-1 rounded-md px-1.5 py-1 text-[11px] transition-all',\n isActive\n ? 'bg-accent text-foreground font-medium'\n : 'text-muted-foreground/60 hover:text-foreground hover:bg-accent/50'\n )}\n >\n <SectionIcon className=\"h-3 w-3\" />\n <span className=\"hidden sm:inline\">{t(s.labelKey)}</span>\n </button>\n );\n })}\n </nav>\n </div>\n </div>\n\n <div className=\"flex flex-col gap-3\">\n {/* ── Language ── */}\n <div\n id=\"section-language\"\n className=\"grid scroll-mt-18 grid-cols-1 gap-x-5 rounded-lg lg:grid-cols-[1fr_280px]\"\n >\n <LanguageSettingsSection\n language={settings.user?.preferredLanguage ?? Language.English}\n />\n </div>\n\n {/* ── Agent ── */}\n <div\n id=\"section-agent\"\n className=\"grid scroll-mt-18 grid-cols-1 gap-x-5 rounded-lg lg:grid-cols-[1fr_280px]\"\n >\n <SettingsSection\n icon={Bot}\n title={t('settings.agent.sectionTitle')}\n description={t('settings.agent.sectionDescription')}\n testId=\"agent-settings-section\"\n >\n <SettingsRow\n label={t('settings.agent.agentAndModel')}\n description={t('settings.agent.agentAndModelDescription')}\n htmlFor=\"agent-model-picker\"\n >\n <AgentModelPicker\n initialAgentType={agentType}\n initialModel={settings.models.default}\n mode=\"settings\"\n onAgentModelChange={(newAgent) => setAgentType(newAgent as AgentType)}\n className=\"w-55\"\n />\n </SettingsRow>\n </SettingsSection>\n <SectionHint\n links={[\n {\n label: t('settings.agent.links.agentSystem'),\n href: 'https://github.com/shep-ai/shep/blob/main/docs/architecture/agent-system.md',\n },\n {\n label: t('settings.agent.links.addingAgents'),\n href: 'https://github.com/shep-ai/shep/blob/main/docs/development/adding-agents.md',\n },\n {\n label: t('settings.agent.links.configurationGuide'),\n href: 'https://github.com/shep-ai/shep/blob/main/docs/guides/configuration.md',\n },\n ]}\n >\n {t('settings.agent.hint')}\n </SectionHint>\n </div>\n\n {/* ── Environment ── */}\n <div\n id=\"section-environment\"\n className=\"grid scroll-mt-18 grid-cols-1 gap-x-5 rounded-lg lg:grid-cols-[1fr_280px]\"\n >\n <SettingsSection\n icon={Terminal}\n title={t('settings.environment.sectionTitle')}\n description={t('settings.environment.sectionDescription')}\n testId=\"environment-settings-section\"\n >\n <SettingsRow\n label={t('settings.environment.defaultEditor')}\n description={t('settings.environment.defaultEditorDescription')}\n htmlFor=\"default-editor\"\n >\n <Select\n value={editor}\n onValueChange={(v) => {\n setEditor(v as EditorType);\n save({\n environment: {\n defaultEditor: v as EditorType,\n shellPreference: shell,\n terminalPreference: terminal,\n },\n });\n }}\n >\n <SelectTrigger\n id=\"default-editor\"\n data-testid=\"editor-select\"\n className=\"w-55 cursor-pointer text-xs\"\n >\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {EDITOR_OPTIONS.map((opt) => {\n const Icon = getEditorTypeIcon(opt.value);\n return (\n <SelectItem key={opt.value} value={opt.value}>\n <span className=\"flex items-center gap-2 text-xs\">\n <Icon className=\"h-4 w-4 shrink-0\" />\n {opt.label}\n </span>\n </SelectItem>\n );\n })}\n </SelectContent>\n </Select>\n </SettingsRow>\n <SettingsRow\n label={t('settings.environment.shell')}\n description={t('settings.environment.shellDescription')}\n htmlFor=\"shell-preference\"\n >\n <Select\n value={shell}\n onValueChange={(v) => {\n setShell(v);\n save({\n environment: {\n defaultEditor: editor,\n shellPreference: v,\n terminalPreference: terminal,\n },\n });\n }}\n >\n <SelectTrigger\n id=\"shell-preference\"\n data-testid=\"shell-select\"\n className=\"w-55 cursor-pointer text-xs\"\n >\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {SHELL_OPTIONS.map((opt) => (\n <SelectItem key={opt.value} value={opt.value}>\n {opt.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </SettingsRow>\n <SettingsRow\n label={t('settings.environment.terminal')}\n description={t('settings.environment.terminalDescription')}\n htmlFor=\"terminal-preference\"\n >\n <Select\n value={terminal}\n onValueChange={(v) => {\n setTerminal(v as TerminalType);\n save({\n environment: {\n defaultEditor: editor,\n shellPreference: shell,\n terminalPreference: v as TerminalType,\n },\n });\n }}\n >\n <SelectTrigger\n id=\"terminal-preference\"\n data-testid=\"terminal-select\"\n className=\"w-55 cursor-pointer text-xs\"\n >\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {terminalOptions.map((opt) => (\n <SelectItem key={opt.id} value={opt.id}>\n {opt.name}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </SettingsRow>\n </SettingsSection>\n <SectionHint\n links={[\n {\n label: t('settings.environment.links.configurationGuide'),\n href: 'https://github.com/shep-ai/shep/blob/main/docs/guides/configuration.md',\n },\n ]}\n >\n {t('settings.environment.hint')}\n </SectionHint>\n </div>\n\n {/* ── Workflow ── */}\n <div\n id=\"section-workflow\"\n className=\"grid scroll-mt-18 grid-cols-1 gap-x-5 rounded-lg lg:grid-cols-[1fr_280px]\"\n >\n <SettingsSection\n icon={GitBranch}\n title={t('settings.workflow.title')}\n description={t('settings.workflow.sectionDescription')}\n testId=\"workflow-settings-section\"\n >\n <SwitchRow\n label={t('settings.workflow.defaultFastMode')}\n description={t('settings.workflow.defaultFastModeDescription')}\n id=\"default-fast-mode\"\n testId=\"switch-default-fast-mode\"\n checked={defaultFastMode}\n onChange={(v) => {\n setDefaultFastMode(v);\n save(buildWorkflowPayload({ defaultFastMode: v }));\n }}\n />\n <SubsectionLabel>{t('settings.workflow.subsections.approve')}</SubsectionLabel>\n <SwitchRow\n label={t('settings.workflow.autoApprovePrd')}\n description={t('settings.workflow.autoApprovePrdDescription')}\n id=\"allow-prd\"\n testId=\"switch-allow-prd\"\n checked={allowPrd}\n onChange={(v) => {\n setAllowPrd(v);\n save(buildWorkflowPayload({ allowPrd: v }));\n }}\n />\n <SwitchRow\n label={t('settings.workflow.autoApprovePlan')}\n description={t('settings.workflow.autoApprovePlanDescription')}\n id=\"allow-plan\"\n testId=\"switch-allow-plan\"\n checked={allowPlan}\n onChange={(v) => {\n setAllowPlan(v);\n save(buildWorkflowPayload({ allowPlan: v }));\n }}\n />\n <SwitchRow\n label={t('settings.workflow.autoApproveMerge')}\n description={t('settings.workflow.autoApproveMergeDescription')}\n id=\"allow-merge\"\n testId=\"switch-allow-merge\"\n checked={allowMerge}\n onChange={(v) => {\n setAllowMerge(v);\n save(buildWorkflowPayload({ allowMerge: v }));\n }}\n />\n <SubsectionLabel>{t('settings.workflow.subsections.evidence')}</SubsectionLabel>\n <SwitchRow\n label={t('settings.workflow.collectEvidence')}\n description={t('settings.workflow.collectEvidenceDescription')}\n id=\"enable-evidence\"\n testId=\"switch-enable-evidence\"\n checked={enableEvidence}\n onChange={(v) => {\n setEnableEvidence(v);\n if (!v) {\n setCommitEvidence(false);\n save(buildWorkflowPayload({ enableEvidence: v, commitEvidence: false }));\n } else {\n save(buildWorkflowPayload({ enableEvidence: v }));\n }\n }}\n />\n <SwitchRow\n label={t('settings.workflow.addEvidenceToPr')}\n description={t('settings.workflow.addEvidenceToPrDescription')}\n id=\"commit-evidence\"\n testId=\"switch-commit-evidence\"\n checked={commitEvidence}\n disabled={!enableEvidence || !openPr}\n onChange={(v) => {\n setCommitEvidence(v);\n save(buildWorkflowPayload({ commitEvidence: v }));\n }}\n />\n <SubsectionLabel>{t('settings.workflow.subsections.git')}</SubsectionLabel>\n <SwitchRow\n label={t('settings.workflow.pushOnComplete')}\n description={t('settings.workflow.pushOnCompleteDescription')}\n id=\"push-on-complete\"\n testId=\"switch-push-on-complete\"\n checked={pushOnComplete}\n onChange={(v) => {\n setPushOnComplete(v);\n save(buildWorkflowPayload({ pushOnComplete: v }));\n }}\n />\n <SwitchRow\n label={t('settings.workflow.openPrOnComplete')}\n description={t('settings.workflow.openPrOnCompleteDescription')}\n id=\"open-pr\"\n testId=\"switch-open-pr\"\n checked={openPr}\n onChange={(v) => {\n setOpenPr(v);\n if (!v) {\n setCommitEvidence(false);\n save(buildWorkflowPayload({ openPr: v, commitEvidence: false }));\n } else {\n save(buildWorkflowPayload({ openPr: v }));\n }\n }}\n />\n <SwitchRow\n label={t('settings.workflow.watchCiAfterPush')}\n description={t('settings.workflow.watchCiAfterPushDescription')}\n id=\"ci-watch-enabled\"\n testId=\"switch-ci-watch-enabled\"\n checked={ciWatchEnabled}\n onChange={(v) => {\n setCiWatchEnabled(v);\n save(buildWorkflowPayload({ ciWatchEnabled: v }));\n }}\n />\n <SubsectionLabel>Archive</SubsectionLabel>\n <SwitchRow\n label=\"Auto-archive completed\"\n description=\"Automatically archive features after they reach the completed state\"\n id=\"auto-archive-enabled\"\n testId=\"switch-auto-archive-enabled\"\n checked={autoArchiveEnabled}\n onChange={(v) => {\n setAutoArchiveEnabled(v);\n save(buildWorkflowPayload({ autoArchiveEnabled: v }));\n }}\n />\n <SettingsRow\n label=\"Archive delay\"\n description=\"Minutes to wait after completion before archiving (1–1440)\"\n htmlFor=\"auto-archive-delay\"\n >\n <NumberStepper\n id=\"auto-archive-delay\"\n testId=\"input-auto-archive-delay\"\n value={autoArchiveDelay}\n placeholder=\"10\"\n min={1}\n max={1440}\n suffix=\"min\"\n onChange={(v) => {\n setAutoArchiveDelay(v);\n }}\n onBlur={() => {\n if (!autoArchiveEnabled) return;\n const n = parseInt(autoArchiveDelay, 10);\n const clamped = Number.isNaN(n) ? 10 : Math.min(1440, Math.max(1, n));\n setAutoArchiveDelay(String(clamped));\n save(buildWorkflowPayload({ autoArchiveDelay: String(clamped) }));\n }}\n />\n </SettingsRow>\n </SettingsSection>\n <SectionHint\n links={[\n {\n label: t('settings.workflow.links.approvalGates'),\n href: 'https://github.com/shep-ai/shep/blob/main/specs/016-hitl-approval-gates/spec.yaml',\n },\n {\n label: t('settings.workflow.links.pushAndPrFlags'),\n href: 'https://github.com/shep-ai/shep/blob/main/specs/037-feature-pr-push-flags/spec.yaml',\n },\n ]}\n >\n {t('settings.workflow.hint')}\n </SectionHint>\n </div>\n\n {/* ── CI ── */}\n <div\n id=\"section-ci\"\n className=\"grid scroll-mt-18 grid-cols-1 gap-x-5 rounded-lg lg:grid-cols-[1fr_280px]\"\n >\n <SettingsSection\n icon={Activity}\n title={t('settings.ci.title')}\n description={t('settings.ci.description')}\n testId=\"ci-settings-section\"\n >\n <SettingsRow\n label={t('settings.ci.maxFixAttempts')}\n description={t('settings.ci.maxFixAttemptsDescription')}\n htmlFor=\"ci-max-fix\"\n >\n <NumberStepper\n id=\"ci-max-fix\"\n testId=\"ci-max-fix-input\"\n placeholder=\"3\"\n value={ciMaxFix}\n onChange={setCiMaxFix}\n onBlur={() => {\n if (ciMaxFix !== originalCiMaxFix) save(buildWorkflowPayload({ ciMaxFix }));\n }}\n min={1}\n max={10}\n />\n </SettingsRow>\n <SettingsRow\n label={t('settings.ci.watchTimeout')}\n description={t('settings.ci.watchTimeoutDescription')}\n htmlFor=\"ci-timeout\"\n >\n <NumberStepper\n id=\"ci-timeout\"\n testId=\"ci-timeout-input\"\n placeholder=\"300\"\n value={ciTimeout}\n onChange={setCiTimeout}\n onBlur={() => {\n if (ciTimeout !== originalCiTimeout) save(buildWorkflowPayload({ ciTimeout }));\n }}\n min={30}\n step={30}\n suffix=\"sec\"\n />\n </SettingsRow>\n <SettingsRow\n label={t('settings.ci.maxLogSize')}\n description={t('settings.ci.maxLogSizeDescription')}\n htmlFor=\"ci-log-max\"\n >\n <NumberStepper\n id=\"ci-log-max\"\n testId=\"ci-log-max-input\"\n placeholder=\"50000\"\n value={ciLogMax}\n onChange={setCiLogMax}\n onBlur={() => {\n if (ciLogMax !== originalCiLogMax) save(buildWorkflowPayload({ ciLogMax }));\n }}\n min={1000}\n step={5000}\n suffix=\"chars\"\n />\n </SettingsRow>\n <SettingsRow\n label={t('settings.ci.pollInterval')}\n description={t('settings.ci.pollIntervalDescription')}\n htmlFor=\"ci-poll-interval\"\n >\n <NumberStepper\n id=\"ci-poll-interval\"\n testId=\"ci-poll-interval-input\"\n placeholder=\"30\"\n value={ciPollInterval}\n onChange={setCiPollInterval}\n onBlur={() => {\n if (ciPollInterval !== originalCiPollInterval)\n save(buildWorkflowPayload({ ciPollInterval }));\n }}\n min={5}\n step={5}\n suffix=\"sec\"\n />\n </SettingsRow>\n <SwitchRow\n label={t('settings.ci.hideCiStatus')}\n description={t('settings.ci.hideCiStatusDescription')}\n id=\"hide-ci-status\"\n testId=\"switch-hide-ci-status\"\n checked={hideCiStatus}\n onChange={(v) => {\n setHideCiStatus(v);\n save(buildWorkflowPayload({ hideCiStatus: v }));\n }}\n />\n </SettingsSection>\n <SectionHint\n links={[\n {\n label: t('settings.ci.links.cicdPipeline'),\n href: 'https://github.com/shep-ai/shep/blob/main/docs/development/cicd.md',\n },\n {\n label: t('settings.ci.links.ciSecurityGates'),\n href: 'https://github.com/shep-ai/shep/blob/main/specs/003-cicd-security-gates/spec.md',\n },\n ]}\n >\n {t('settings.ci.hint')}\n </SectionHint>\n </div>\n\n {/* ── Stage Timeouts ── */}\n <div\n id=\"section-stage-timeouts\"\n className=\"grid scroll-mt-18 grid-cols-1 gap-x-5 rounded-lg lg:grid-cols-[1fr_280px]\"\n >\n <SettingsSection\n icon={Timer}\n title={t('settings.stageTimeouts.title')}\n description={t('settings.stageTimeouts.description')}\n testId=\"stage-timeouts-settings-section\"\n >\n <SubsectionLabel>\n {t('settings.stageTimeouts.subsections.featureAgent')}\n </SubsectionLabel>\n <SettingsRow\n label={t('settings.stageTimeouts.analyze')}\n description={t('settings.stageTimeouts.analyzeDescription')}\n htmlFor=\"timeout-analyze\"\n >\n <TimeoutSlider\n id=\"timeout-analyze\"\n testId=\"timeout-analyze-input\"\n value={analyzeTimeout}\n onChange={setAnalyzeTimeout}\n onBlur={() => {\n if (analyzeTimeout !== originalAnalyzeTimeout)\n save(buildWorkflowPayload({ analyzeTimeout }));\n }}\n defaultSeconds={1800}\n />\n </SettingsRow>\n <SettingsRow\n label={t('settings.stageTimeouts.requirements')}\n description={t('settings.stageTimeouts.requirementsDescription')}\n htmlFor=\"timeout-requirements\"\n >\n <TimeoutSlider\n id=\"timeout-requirements\"\n testId=\"timeout-requirements-input\"\n value={requirementsTimeout}\n onChange={setRequirementsTimeout}\n onBlur={() => {\n if (requirementsTimeout !== originalRequirementsTimeout)\n save(buildWorkflowPayload({ requirementsTimeout }));\n }}\n defaultSeconds={1800}\n />\n </SettingsRow>\n <SettingsRow\n label={t('settings.stageTimeouts.research')}\n description={t('settings.stageTimeouts.researchDescription')}\n htmlFor=\"timeout-research\"\n >\n <TimeoutSlider\n id=\"timeout-research\"\n testId=\"timeout-research-input\"\n value={researchTimeout}\n onChange={setResearchTimeout}\n onBlur={() => {\n if (researchTimeout !== originalResearchTimeout)\n save(buildWorkflowPayload({ researchTimeout }));\n }}\n defaultSeconds={1800}\n />\n </SettingsRow>\n <SettingsRow\n label={t('settings.stageTimeouts.plan')}\n description={t('settings.stageTimeouts.planDescription')}\n htmlFor=\"timeout-plan\"\n >\n <TimeoutSlider\n id=\"timeout-plan\"\n testId=\"timeout-plan-input\"\n value={planTimeout}\n onChange={setPlanTimeout}\n onBlur={() => {\n if (planTimeout !== originalPlanTimeout)\n save(buildWorkflowPayload({ planTimeout }));\n }}\n defaultSeconds={1800}\n />\n </SettingsRow>\n <SettingsRow\n label={t('settings.stageTimeouts.implement')}\n description={t('settings.stageTimeouts.implementDescription')}\n htmlFor=\"timeout-implement\"\n >\n <TimeoutSlider\n id=\"timeout-implement\"\n testId=\"timeout-implement-input\"\n value={implementTimeout}\n onChange={setImplementTimeout}\n onBlur={() => {\n if (implementTimeout !== originalImplementTimeout)\n save(buildWorkflowPayload({ implementTimeout }));\n }}\n defaultSeconds={1800}\n />\n </SettingsRow>\n <SettingsRow\n label={t('settings.stageTimeouts.fastImplement')}\n description={t('settings.stageTimeouts.fastImplementDescription')}\n htmlFor=\"timeout-fast-implement\"\n >\n <TimeoutSlider\n id=\"timeout-fast-implement\"\n testId=\"timeout-fast-implement-input\"\n value={fastImplementTimeout}\n onChange={setFastImplementTimeout}\n onBlur={() => {\n if (fastImplementTimeout !== originalFastImplementTimeout)\n save(buildWorkflowPayload({ fastImplementTimeout }));\n }}\n defaultSeconds={1800}\n />\n </SettingsRow>\n <SettingsRow\n label={t('settings.stageTimeouts.merge')}\n description={t('settings.stageTimeouts.mergeDescription')}\n htmlFor=\"timeout-merge\"\n >\n <TimeoutSlider\n id=\"timeout-merge\"\n testId=\"timeout-merge-input\"\n value={mergeTimeout}\n onChange={setMergeTimeout}\n onBlur={() => {\n if (mergeTimeout !== originalMergeTimeout)\n save(buildWorkflowPayload({ mergeTimeout }));\n }}\n defaultSeconds={1800}\n />\n </SettingsRow>\n <SubsectionLabel>\n {t('settings.stageTimeouts.subsections.analyzeRepoAgent')}\n </SubsectionLabel>\n <SettingsRow\n label={t('settings.stageTimeouts.analyze')}\n description={t('settings.stageTimeouts.analyzeDescription')}\n htmlFor=\"timeout-analyze-repo\"\n >\n <TimeoutSlider\n id=\"timeout-analyze-repo\"\n testId=\"timeout-analyze-repo-input\"\n value={analyzeRepoTimeout}\n onChange={setAnalyzeRepoTimeout}\n onBlur={() => {\n if (analyzeRepoTimeout !== originalAnalyzeRepoTimeout)\n save(buildWorkflowPayload({ analyzeRepoTimeout }));\n }}\n defaultSeconds={600}\n />\n </SettingsRow>\n </SettingsSection>\n <SectionHint>{t('settings.stageTimeouts.hint')}</SectionHint>\n </div>\n\n {/* ── Notifications ── */}\n <div\n id=\"section-notifications\"\n className=\"grid scroll-mt-18 grid-cols-1 gap-x-5 rounded-lg lg:grid-cols-[1fr_280px]\"\n >\n <SettingsSection\n icon={Bell}\n title={t('settings.notifications.title')}\n description={t('settings.notifications.sectionDescription')}\n testId=\"notification-settings-section\"\n >\n <SubsectionLabel>{t('settings.notifications.channels')}</SubsectionLabel>\n <SwitchRow\n label={t('settings.notifications.inAppLabel')}\n description={t('settings.notifications.inAppDescription')}\n id=\"notif-in-app\"\n testId=\"switch-in-app\"\n checked={inApp}\n onChange={(v) => {\n setInApp(v);\n save(buildNotificationPayload({ inApp: v }));\n }}\n />\n\n <SubsectionLabel>{t('settings.notifications.subsections.agentEvents')}</SubsectionLabel>\n <SwitchRow\n label={t('settings.notifications.events.agentStarted')}\n id=\"notif-event-agentStarted\"\n testId=\"switch-event-agentStarted\"\n checked={events.agentStarted}\n onChange={(v) => {\n const newEvents = { ...events, agentStarted: v };\n setEvents(newEvents);\n save(buildNotificationPayload({ events: newEvents }));\n }}\n />\n <SwitchRow\n label={t('settings.notifications.events.phaseCompleted')}\n id=\"notif-event-phaseCompleted\"\n testId=\"switch-event-phaseCompleted\"\n checked={events.phaseCompleted}\n onChange={(v) => {\n const newEvents = { ...events, phaseCompleted: v };\n setEvents(newEvents);\n save(buildNotificationPayload({ events: newEvents }));\n }}\n />\n <SwitchRow\n label={t('settings.notifications.events.waitingApproval')}\n id=\"notif-event-waitingApproval\"\n testId=\"switch-event-waitingApproval\"\n checked={events.waitingApproval}\n onChange={(v) => {\n const newEvents = { ...events, waitingApproval: v };\n setEvents(newEvents);\n save(buildNotificationPayload({ events: newEvents }));\n }}\n />\n <SwitchRow\n label={t('settings.notifications.events.agentCompleted')}\n id=\"notif-event-agentCompleted\"\n testId=\"switch-event-agentCompleted\"\n checked={events.agentCompleted}\n onChange={(v) => {\n const newEvents = { ...events, agentCompleted: v };\n setEvents(newEvents);\n save(buildNotificationPayload({ events: newEvents }));\n }}\n />\n <SwitchRow\n label={t('settings.notifications.events.agentFailed')}\n id=\"notif-event-agentFailed\"\n testId=\"switch-event-agentFailed\"\n checked={events.agentFailed}\n onChange={(v) => {\n const newEvents = { ...events, agentFailed: v };\n setEvents(newEvents);\n save(buildNotificationPayload({ events: newEvents }));\n }}\n />\n\n <SubsectionLabel>\n {t('settings.notifications.subsections.pullRequestEvents')}\n </SubsectionLabel>\n <SwitchRow\n label={t('settings.notifications.events.prMerged')}\n id=\"notif-event-prMerged\"\n testId=\"switch-event-prMerged\"\n checked={events.prMerged}\n onChange={(v) => {\n const newEvents = { ...events, prMerged: v };\n setEvents(newEvents);\n save(buildNotificationPayload({ events: newEvents }));\n }}\n />\n <SwitchRow\n label={t('settings.notifications.events.prClosed')}\n id=\"notif-event-prClosed\"\n testId=\"switch-event-prClosed\"\n checked={events.prClosed}\n onChange={(v) => {\n const newEvents = { ...events, prClosed: v };\n setEvents(newEvents);\n save(buildNotificationPayload({ events: newEvents }));\n }}\n />\n <SwitchRow\n label={t('settings.notifications.events.prChecksPassed')}\n id=\"notif-event-prChecksPassed\"\n testId=\"switch-event-prChecksPassed\"\n checked={events.prChecksPassed}\n onChange={(v) => {\n const newEvents = { ...events, prChecksPassed: v };\n setEvents(newEvents);\n save(buildNotificationPayload({ events: newEvents }));\n }}\n />\n <SwitchRow\n label={t('settings.notifications.events.prChecksFailed')}\n id=\"notif-event-prChecksFailed\"\n testId=\"switch-event-prChecksFailed\"\n checked={events.prChecksFailed}\n onChange={(v) => {\n const newEvents = { ...events, prChecksFailed: v };\n setEvents(newEvents);\n save(buildNotificationPayload({ events: newEvents }));\n }}\n />\n <SwitchRow\n label={t('settings.notifications.events.prBlocked')}\n id=\"notif-event-prBlocked\"\n testId=\"switch-event-prBlocked\"\n checked={events.prBlocked}\n onChange={(v) => {\n const newEvents = { ...events, prBlocked: v };\n setEvents(newEvents);\n save(buildNotificationPayload({ events: newEvents }));\n }}\n />\n <SwitchRow\n label={t('settings.notifications.events.mergeReviewReady')}\n id=\"notif-event-mergeReviewReady\"\n testId=\"switch-event-mergeReviewReady\"\n checked={events.mergeReviewReady}\n onChange={(v) => {\n const newEvents = { ...events, mergeReviewReady: v };\n setEvents(newEvents);\n save(buildNotificationPayload({ events: newEvents }));\n }}\n />\n </SettingsSection>\n <SectionHint\n links={[\n {\n label: t('settings.notifications.links.notificationSystem'),\n href: 'https://github.com/shep-ai/shep/blob/main/specs/021-agent-notifications/spec.yaml',\n },\n ]}\n >\n {t('settings.notifications.hint')}\n </SectionHint>\n </div>\n\n {/* ── Messaging Remote Control ── */}\n <div\n id=\"section-messaging\"\n className=\"grid scroll-mt-18 grid-cols-1 gap-x-5 rounded-lg lg:grid-cols-[1fr_280px]\"\n >\n <MessagingSettingsSection messaging={settings.messaging} />\n <SectionHint\n links={[\n {\n label: 'Commands.com Gateway',\n href: 'https://github.com/Commands-com/gateway',\n },\n ]}\n >\n Drive Shep remotely from Telegram or WhatsApp. Pair a chat to send commands and receive\n notifications through the Commands.com Gateway.\n </SectionHint>\n </div>\n\n {/* ── Feature Flags ── */}\n <div\n id=\"section-feature-flags\"\n className=\"grid scroll-mt-18 grid-cols-1 gap-x-5 rounded-lg lg:grid-cols-[1fr_280px]\"\n >\n <SettingsSection\n icon={Flag}\n title={t('settings.featureFlags.title')}\n description={t('settings.featureFlags.sectionDescription')}\n badge={t('settings.featureFlags.badge')}\n testId=\"feature-flags-settings-section\"\n >\n <SwitchRow\n label={t('settings.featureFlags.skills')}\n description={t('settings.featureFlags.skillsDescription')}\n id=\"flag-skills\"\n testId=\"switch-flag-skills\"\n checked={flags.skills}\n onChange={(v) => {\n const newFlags = { ...flags, skills: v };\n setFlags(newFlags);\n save({ featureFlags: newFlags });\n }}\n />\n <SwitchRow\n label={t('settings.featureFlags.deployments')}\n description={t('settings.featureFlags.deploymentsDescription')}\n id=\"flag-envDeploy\"\n testId=\"switch-flag-envDeploy\"\n checked={flags.envDeploy}\n onChange={(v) => {\n const newFlags = { ...flags, envDeploy: v };\n setFlags(newFlags);\n save({ featureFlags: newFlags });\n }}\n />\n <SwitchRow\n label={t('settings.featureFlags.debug')}\n description={t('settings.featureFlags.debugDescription')}\n id=\"flag-debug\"\n testId=\"switch-flag-debug\"\n checked={flags.debug}\n onChange={(v) => {\n const newFlags = { ...flags, debug: v };\n setFlags(newFlags);\n save({ featureFlags: newFlags });\n }}\n />\n <SwitchRow\n label={t('settings.featureFlags.githubImport')}\n description={t('settings.featureFlags.githubImportDescription')}\n id=\"flag-githubImport\"\n testId=\"switch-flag-githubImport\"\n checked={flags.githubImport}\n onChange={(v) => {\n const newFlags = { ...flags, githubImport: v };\n setFlags(newFlags);\n save({ featureFlags: newFlags });\n }}\n />\n <SwitchRow\n label={t('settings.featureFlags.adoptBranch')}\n description={t('settings.featureFlags.adoptBranchDescription')}\n id=\"flag-adoptBranch\"\n testId=\"switch-flag-adoptBranch\"\n checked={flags.adoptBranch}\n onChange={(v) => {\n const newFlags = { ...flags, adoptBranch: v };\n setFlags(newFlags);\n save({ featureFlags: newFlags });\n }}\n />\n <SwitchRow\n label={t('settings.featureFlags.gitRebaseSync')}\n description={t('settings.featureFlags.gitRebaseSyncDescription')}\n id=\"flag-gitRebaseSync\"\n testId=\"switch-flag-gitRebaseSync\"\n checked={flags.gitRebaseSync}\n onChange={(v) => {\n const newFlags = { ...flags, gitRebaseSync: v };\n setFlags(newFlags);\n save({ featureFlags: newFlags });\n }}\n />\n <SwitchRow\n label={t('settings.featureFlags.reactFileManager')}\n description={t('settings.featureFlags.reactFileManagerDescription')}\n id=\"flag-reactFileManager\"\n testId=\"switch-flag-reactFileManager\"\n checked={flags.reactFileManager}\n onChange={(v) => {\n const newFlags = { ...flags, reactFileManager: v };\n setFlags(newFlags);\n save({ featureFlags: newFlags });\n }}\n />\n <SwitchRow\n label={t('settings.featureFlags.inventory')}\n description={t('settings.featureFlags.inventoryDescription')}\n id=\"flag-inventory\"\n testId=\"switch-flag-inventory\"\n checked={flags.inventory}\n onChange={(v) => {\n const newFlags = { ...flags, inventory: v };\n setFlags(newFlags);\n save({ featureFlags: newFlags });\n }}\n />\n </SettingsSection>\n <SectionHint>{t('settings.featureFlags.hint')}</SectionHint>\n </div>\n\n {/* ── Interactive Agent ── */}\n <div\n id=\"section-interactive-agent\"\n className=\"grid scroll-mt-18 grid-cols-1 gap-x-5 rounded-lg lg:grid-cols-[1fr_280px]\"\n >\n <SettingsSection\n icon={MessageSquare}\n title={t('settings.interactiveAgent.title')}\n description={t('settings.interactiveAgent.description')}\n testId=\"interactive-agent-settings-section\"\n >\n <SwitchRow\n label={t('settings.interactiveAgent.enableChatTab')}\n description={t('settings.interactiveAgent.enableChatTabDescription')}\n id=\"interactive-agent-enabled\"\n testId=\"switch-interactive-agent-enabled\"\n checked={interactiveEnabled}\n onChange={(v) => {\n setInteractiveEnabled(v);\n save({\n interactiveAgent: {\n enabled: v,\n autoTimeoutMinutes: parseInt(interactiveTimeout, 10) || 15,\n maxConcurrentSessions: parseInt(interactiveSessions, 10) || 3,\n },\n });\n }}\n />\n <SettingsRow\n label={t('settings.interactiveAgent.autoTimeout')}\n description={t('settings.interactiveAgent.autoTimeoutDescription')}\n htmlFor=\"interactive-agent-timeout\"\n >\n <NumberStepper\n id=\"interactive-agent-timeout\"\n testId=\"input-interactive-agent-timeout\"\n value={interactiveTimeout}\n placeholder=\"15\"\n min={1}\n max={120}\n suffix=\"min\"\n onChange={setInteractiveTimeout}\n onBlur={() => {\n const n = parseInt(interactiveTimeout, 10);\n const clamped = Number.isNaN(n) ? 15 : Math.min(120, Math.max(1, n));\n const clamped_str = String(clamped);\n setInteractiveTimeout(clamped_str);\n save({\n interactiveAgent: {\n enabled: interactiveEnabled,\n autoTimeoutMinutes: clamped,\n maxConcurrentSessions: parseInt(interactiveSessions, 10) || 3,\n },\n });\n }}\n />\n </SettingsRow>\n <SettingsRow\n label={t('settings.interactiveAgent.maxConcurrentSessions')}\n description={t('settings.interactiveAgent.maxConcurrentSessionsDescription')}\n htmlFor=\"interactive-agent-sessions\"\n >\n <NumberStepper\n id=\"interactive-agent-sessions\"\n testId=\"input-interactive-agent-sessions\"\n value={interactiveSessions}\n placeholder=\"3\"\n min={1}\n max={10}\n onChange={setInteractiveSessions}\n onBlur={() => {\n const n = parseInt(interactiveSessions, 10);\n const clamped = Number.isNaN(n) ? 3 : Math.min(10, Math.max(1, n));\n const clamped_str = String(clamped);\n setInteractiveSessions(clamped_str);\n save({\n interactiveAgent: {\n enabled: interactiveEnabled,\n autoTimeoutMinutes: parseInt(interactiveTimeout, 10) || 15,\n maxConcurrentSessions: clamped,\n },\n });\n }}\n />\n </SettingsRow>\n </SettingsSection>\n <SectionHint>{t('settings.interactiveAgent.hint')}</SectionHint>\n </div>\n\n {/* ── FAB Layout ── */}\n <div\n id=\"section-fab-layout\"\n className=\"grid scroll-mt-18 grid-cols-1 gap-x-5 rounded-lg lg:grid-cols-[1fr_280px]\"\n >\n <SettingsSection\n icon={LayoutGrid}\n title={t('settings.fabLayout.title')}\n description={t('settings.fabLayout.description')}\n testId=\"fab-layout-settings-section\"\n >\n <SwitchRow\n label={t('settings.fabLayout.swapPosition')}\n description={t('settings.fabLayout.swapPositionDescription')}\n id=\"fab-swap-position\"\n testId=\"switch-fab-swap-position\"\n checked={fabSwapPosition}\n onChange={(v) => {\n setFabSwapPosition(v);\n save({ fabLayout: { swapPosition: v } });\n }}\n />\n </SettingsSection>\n <SectionHint>{t('settings.fabLayout.hint')}</SectionHint>\n </div>\n\n {/* ── Database ── */}\n <div\n id=\"section-database\"\n className=\"grid scroll-mt-18 grid-cols-1 gap-x-5 rounded-lg lg:grid-cols-[1fr_280px]\"\n >\n <SettingsSection\n icon={Database}\n title={t('settings.database.title')}\n description={t('settings.database.sectionDescription')}\n testId=\"database-settings-section\"\n >\n <SettingsRow\n label={t('settings.database.location')}\n description={t('settings.database.locationDescription')}\n >\n <span\n className=\"text-muted-foreground max-w-50 truncate font-mono text-xs\"\n data-testid=\"shep-home-path\"\n >\n {shepHome}\n </span>\n </SettingsRow>\n <SettingsRow label={t('settings.database.size')}>\n <span className=\"text-muted-foreground text-xs\" data-testid=\"db-file-size\">\n {dbFileSize}\n </span>\n </SettingsRow>\n </SettingsSection>\n <SectionHint\n links={[\n {\n label: t('settings.database.links.settingsService'),\n href: 'https://github.com/shep-ai/shep/blob/main/docs/architecture/settings-service.md',\n },\n {\n label: t('settings.database.links.settingsSpec'),\n href: 'https://github.com/shep-ai/shep/blob/main/specs/005-global-settings-service/spec.md',\n },\n ]}\n >\n {t('settings.database.hint')}\n </SectionHint>\n </div>\n </div>\n </div>\n );\n}\n","import type { ComponentType, SVGProps } from 'react';\nimport Image from 'next/image';\nimport { Code, Rocket } from 'lucide-react';\nimport { cn } from '@/lib/utils';\n\ntype IconProps = SVGProps<SVGSVGElement> & { className?: string };\n\n/** Fallback icon for unknown editor types. */\nfunction DefaultEditorIcon(props: IconProps) {\n return <Code className={cn('h-4 w-4', props.className)} {...(props as object)} />;\n}\n\nfunction VsCodeIcon({ className }: IconProps) {\n return (\n <Image\n src=\"/icons/editors/vscode.svg\"\n alt=\"VS Code\"\n width={24}\n height={24}\n className={cn('rounded-sm object-contain', className)}\n />\n );\n}\nVsCodeIcon.displayName = 'VsCodeIcon';\n\nfunction CursorEditorIcon({ className }: IconProps) {\n return (\n <Image\n src=\"/icons/agents/cursor.jpeg\"\n alt=\"Cursor\"\n width={24}\n height={24}\n className={cn('rounded-sm object-contain', className)}\n />\n );\n}\nCursorEditorIcon.displayName = 'CursorEditorIcon';\n\nfunction WindsurfIcon({ className }: IconProps) {\n return (\n <Image\n src=\"/icons/editors/windsurf.svg\"\n alt=\"Windsurf\"\n width={24}\n height={24}\n className={cn('rounded-sm object-contain', className)}\n />\n );\n}\nWindsurfIcon.displayName = 'WindsurfIcon';\n\nfunction ZedIcon({ className }: IconProps) {\n return (\n <Image\n src=\"/icons/editors/zed.svg\"\n alt=\"Zed\"\n width={24}\n height={24}\n className={cn('rounded-sm object-contain', className)}\n />\n );\n}\nZedIcon.displayName = 'ZedIcon';\n\nfunction AntigravityIcon({ className, ...props }: IconProps) {\n return <Rocket className={cn('h-4 w-4', className)} {...(props as object)} />;\n}\nAntigravityIcon.displayName = 'AntigravityIcon';\n\nconst editorTypeIconMap: Record<string, ComponentType<IconProps>> = {\n vscode: VsCodeIcon,\n cursor: CursorEditorIcon,\n windsurf: WindsurfIcon,\n zed: ZedIcon,\n antigravity: AntigravityIcon,\n};\n\n/** Resolve an editor type string to its corresponding icon component. */\nexport function getEditorTypeIcon(editorType?: string): ComponentType<IconProps> {\n if (editorType && editorType in editorTypeIconMap) {\n return editorTypeIconMap[editorType];\n }\n return DefaultEditorIcon;\n}\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['ellipse', { cx: '12', cy: '5', rx: '9', ry: '3', key: 'msslwz' }],\n ['path', { d: 'M3 5V19A9 3 0 0 0 21 19V5', key: '1wlel7' }],\n ['path', { d: 'M3 12A9 3 0 0 0 21 12', key: 'mv7ke4' }],\n];\n\n/**\n * @component @name Database\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8ZWxsaXBzZSBjeD0iMTIiIGN5PSI1IiByeD0iOSIgcnk9IjMiIC8+CiAgPHBhdGggZD0iTTMgNVYxOUE5IDMgMCAwIDAgMjEgMTlWNSIgLz4KICA8cGF0aCBkPSJNMyAxMkE5IDMgMCAwIDAgMjEgMTIiIC8+Cjwvc3ZnPgo=) - https://lucide.dev/icons/database\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Database = createLucideIcon('database', __iconNode);\n\nexport default Database;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['path', { d: 'M9 17H7A5 5 0 0 1 7 7h2', key: '8i5ue5' }],\n ['path', { d: 'M15 7h2a5 5 0 1 1 0 10h-2', key: '1b9ql8' }],\n ['line', { x1: '8', x2: '16', y1: '12', y2: '12', key: '1jonct' }],\n];\n\n/**\n * @component @name Link2\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNOSAxN0g3QTUgNSAwIDAgMSA3IDdoMiIgLz4KICA8cGF0aCBkPSJNMTUgN2gyYTUgNSAwIDEgMSAwIDEwaC0yIiAvPgogIDxsaW5lIHgxPSI4IiB4Mj0iMTYiIHkxPSIxMiIgeTI9IjEyIiAvPgo8L3N2Zz4K) - https://lucide.dev/icons/link-2\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Link2 = createLucideIcon('link-2', __iconNode);\n\nexport default Link2;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['path', { d: 'M10.268 21a2 2 0 0 0 3.464 0', key: 'vwvbt9' }],\n [\n 'path',\n {\n d: 'M3.262 15.326A1 1 0 0 0 4 17h16a1 1 0 0 0 .74-1.673C19.41 13.956 18 12.499 18 8A6 6 0 0 0 6 8c0 4.499-1.411 5.956-2.738 7.326',\n key: '11g9vi',\n },\n ],\n];\n\n/**\n * @component @name Bell\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMTAuMjY4IDIxYTIgMiAwIDAgMCAzLjQ2NCAwIiAvPgogIDxwYXRoIGQ9Ik0zLjI2MiAxNS4zMjZBMSAxIDAgMCAwIDQgMTdoMTZhMSAxIDAgMCAwIC43NC0xLjY3M0MxOS40MSAxMy45NTYgMTggMTIuNDk5IDE4IDhBNiA2IDAgMCAwIDYgOGMwIDQuNDk5LTEuNDExIDUuOTU2LTIuNzM4IDcuMzI2IiAvPgo8L3N2Zz4K) - https://lucide.dev/icons/bell\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Bell = createLucideIcon('bell', __iconNode);\n\nexport default Bell;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['path', { d: 'M14 17H5', key: 'gfn3mx' }],\n ['path', { d: 'M19 7h-9', key: '6i9tg' }],\n ['circle', { cx: '17', cy: '17', r: '3', key: '18b49y' }],\n ['circle', { cx: '7', cy: '7', r: '3', key: 'dfmy0x' }],\n];\n\n/**\n * @component @name Settings2\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMTQgMTdINSIgLz4KICA8cGF0aCBkPSJNMTkgN2gtOSIgLz4KICA8Y2lyY2xlIGN4PSIxNyIgY3k9IjE3IiByPSIzIiAvPgogIDxjaXJjbGUgY3g9IjciIGN5PSI3IiByPSIzIiAvPgo8L3N2Zz4K) - https://lucide.dev/icons/settings-2\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Settings2 = createLucideIcon('settings-2', __iconNode);\n\nexport default Settings2;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['path', { d: 'm19 5 3-3', key: 'yk6iyv' }],\n ['path', { d: 'm2 22 3-3', key: '19mgm9' }],\n [\n 'path',\n { d: 'M6.3 20.3a2.4 2.4 0 0 0 3.4 0L12 18l-6-6-2.3 2.3a2.4 2.4 0 0 0 0 3.4Z', key: 'goz73y' },\n ],\n ['path', { d: 'M7.5 13.5 10 11', key: '7xgeeb' }],\n ['path', { d: 'M10.5 16.5 13 14', key: '10btkg' }],\n [\n 'path',\n { d: 'm12 6 6 6 2.3-2.3a2.4 2.4 0 0 0 0-3.4l-2.6-2.6a2.4 2.4 0 0 0-3.4 0Z', key: '1snsnr' },\n ],\n];\n\n/**\n * @component @name Unplug\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJtMTkgNSAzLTMiIC8+CiAgPHBhdGggZD0ibTIgMjIgMy0zIiAvPgogIDxwYXRoIGQ9Ik02LjMgMjAuM2EyLjQgMi40IDAgMCAwIDMuNCAwTDEyIDE4bC02LTYtMi4zIDIuM2EyLjQgMi40IDAgMCAwIDAgMy40WiIgLz4KICA8cGF0aCBkPSJNNy41IDEzLjUgMTAgMTEiIC8+CiAgPHBhdGggZD0iTTEwLjUgMTYuNSAxMyAxNCIgLz4KICA8cGF0aCBkPSJtMTIgNiA2IDYgMi4zLTIuM2EyLjQgMi40IDAgMCAwIDAtMy40bC0yLjYtMi42YTIuNCAyLjQgMCAwIDAtMy40IDBaIiAvPgo8L3N2Zz4K) - https://lucide.dev/icons/unplug\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Unplug = createLucideIcon('unplug', __iconNode);\n\nexport default Unplug;\n","import * as React from 'react';\nimport { clamp } from '@radix-ui/number';\nimport { composeEventHandlers } from '@radix-ui/primitive';\nimport { useComposedRefs } from '@radix-ui/react-compose-refs';\nimport { createContextScope } from '@radix-ui/react-context';\nimport { useControllableState } from '@radix-ui/react-use-controllable-state';\nimport { useDirection } from '@radix-ui/react-direction';\nimport { usePrevious } from '@radix-ui/react-use-previous';\nimport { useSize } from '@radix-ui/react-use-size';\nimport { Primitive } from '@radix-ui/react-primitive';\nimport { createCollection } from '@radix-ui/react-collection';\n\nimport type { Scope } from '@radix-ui/react-context';\n\ntype Direction = 'ltr' | 'rtl';\n\nconst PAGE_KEYS = ['PageUp', 'PageDown'];\nconst ARROW_KEYS = ['ArrowUp', 'ArrowDown', 'ArrowLeft', 'ArrowRight'];\n\ntype SlideDirection = 'from-left' | 'from-right' | 'from-bottom' | 'from-top';\nconst BACK_KEYS: Record<SlideDirection, string[]> = {\n 'from-left': ['Home', 'PageDown', 'ArrowDown', 'ArrowLeft'],\n 'from-right': ['Home', 'PageDown', 'ArrowDown', 'ArrowRight'],\n 'from-bottom': ['Home', 'PageDown', 'ArrowDown', 'ArrowLeft'],\n 'from-top': ['Home', 'PageDown', 'ArrowUp', 'ArrowLeft'],\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Slider\n * -----------------------------------------------------------------------------------------------*/\n\nconst SLIDER_NAME = 'Slider';\n\nconst [Collection, useCollection, createCollectionScope] =\n createCollection<SliderThumbElement>(SLIDER_NAME);\n\ntype ScopedProps<P> = P & { __scopeSlider?: Scope };\nconst [createSliderContext, createSliderScope] = createContextScope(SLIDER_NAME, [\n createCollectionScope,\n]);\n\ntype SliderContextValue = {\n name: string | undefined;\n disabled: boolean | undefined;\n min: number;\n max: number;\n values: number[];\n valueIndexToChangeRef: React.MutableRefObject<number>;\n thumbs: Set<SliderThumbElement>;\n orientation: SliderProps['orientation'];\n form: string | undefined;\n};\n\nconst [SliderProvider, useSliderContext] = createSliderContext<SliderContextValue>(SLIDER_NAME);\n\ntype SliderElement = SliderHorizontalElement | SliderVerticalElement;\ninterface SliderProps\n extends Omit<\n SliderHorizontalProps | SliderVerticalProps,\n keyof SliderOrientationPrivateProps | 'defaultValue'\n > {\n name?: string;\n disabled?: boolean;\n orientation?: React.AriaAttributes['aria-orientation'];\n dir?: Direction;\n min?: number;\n max?: number;\n step?: number;\n minStepsBetweenThumbs?: number;\n value?: number[];\n defaultValue?: number[];\n onValueChange?(value: number[]): void;\n onValueCommit?(value: number[]): void;\n inverted?: boolean;\n form?: string;\n}\n\nconst Slider = React.forwardRef<SliderElement, SliderProps>(\n (props: ScopedProps<SliderProps>, forwardedRef) => {\n const {\n name,\n min = 0,\n max = 100,\n step = 1,\n orientation = 'horizontal',\n disabled = false,\n minStepsBetweenThumbs = 0,\n defaultValue = [min],\n value,\n onValueChange = () => {},\n onValueCommit = () => {},\n inverted = false,\n form,\n ...sliderProps\n } = props;\n const thumbRefs = React.useRef<SliderContextValue['thumbs']>(new Set());\n const valueIndexToChangeRef = React.useRef<number>(0);\n const isHorizontal = orientation === 'horizontal';\n const SliderOrientation = isHorizontal ? SliderHorizontal : SliderVertical;\n\n const [values = [], setValues] = useControllableState({\n prop: value,\n defaultProp: defaultValue,\n onChange: (value) => {\n const thumbs = [...thumbRefs.current];\n thumbs[valueIndexToChangeRef.current]?.focus();\n onValueChange(value);\n },\n });\n const valuesBeforeSlideStartRef = React.useRef(values);\n\n function handleSlideStart(value: number) {\n const closestIndex = getClosestValueIndex(values, value);\n updateValues(value, closestIndex);\n }\n\n function handleSlideMove(value: number) {\n updateValues(value, valueIndexToChangeRef.current);\n }\n\n function handleSlideEnd() {\n const prevValue = valuesBeforeSlideStartRef.current[valueIndexToChangeRef.current];\n const nextValue = values[valueIndexToChangeRef.current];\n const hasChanged = nextValue !== prevValue;\n if (hasChanged) onValueCommit(values);\n }\n\n function updateValues(value: number, atIndex: number, { commit } = { commit: false }) {\n const decimalCount = getDecimalCount(step);\n const snapToStep = roundValue(Math.round((value - min) / step) * step + min, decimalCount);\n const nextValue = clamp(snapToStep, [min, max]);\n\n setValues((prevValues = []) => {\n const nextValues = getNextSortedValues(prevValues, nextValue, atIndex);\n if (hasMinStepsBetweenValues(nextValues, minStepsBetweenThumbs * step)) {\n valueIndexToChangeRef.current = nextValues.indexOf(nextValue);\n const hasChanged = String(nextValues) !== String(prevValues);\n if (hasChanged && commit) onValueCommit(nextValues);\n return hasChanged ? nextValues : prevValues;\n } else {\n return prevValues;\n }\n });\n }\n\n return (\n <SliderProvider\n scope={props.__scopeSlider}\n name={name}\n disabled={disabled}\n min={min}\n max={max}\n valueIndexToChangeRef={valueIndexToChangeRef}\n thumbs={thumbRefs.current}\n values={values}\n orientation={orientation}\n form={form}\n >\n <Collection.Provider scope={props.__scopeSlider}>\n <Collection.Slot scope={props.__scopeSlider}>\n <SliderOrientation\n aria-disabled={disabled}\n data-disabled={disabled ? '' : undefined}\n {...sliderProps}\n ref={forwardedRef}\n onPointerDown={composeEventHandlers(sliderProps.onPointerDown, () => {\n if (!disabled) valuesBeforeSlideStartRef.current = values;\n })}\n min={min}\n max={max}\n inverted={inverted}\n onSlideStart={disabled ? undefined : handleSlideStart}\n onSlideMove={disabled ? undefined : handleSlideMove}\n onSlideEnd={disabled ? undefined : handleSlideEnd}\n onHomeKeyDown={() => !disabled && updateValues(min, 0, { commit: true })}\n onEndKeyDown={() =>\n !disabled && updateValues(max, values.length - 1, { commit: true })\n }\n onStepKeyDown={({ event, direction: stepDirection }) => {\n if (!disabled) {\n const isPageKey = PAGE_KEYS.includes(event.key);\n const isSkipKey = isPageKey || (event.shiftKey && ARROW_KEYS.includes(event.key));\n const multiplier = isSkipKey ? 10 : 1;\n const atIndex = valueIndexToChangeRef.current;\n const value = values[atIndex]!;\n const stepInDirection = step * multiplier * stepDirection;\n updateValues(value + stepInDirection, atIndex, { commit: true });\n }\n }}\n />\n </Collection.Slot>\n </Collection.Provider>\n </SliderProvider>\n );\n }\n);\n\nSlider.displayName = SLIDER_NAME;\n\n/* -------------------------------------------------------------------------------------------------\n * SliderHorizontal\n * -----------------------------------------------------------------------------------------------*/\n\ntype Side = 'top' | 'right' | 'bottom' | 'left';\n\nconst [SliderOrientationProvider, useSliderOrientationContext] = createSliderContext<{\n startEdge: Side;\n endEdge: Side;\n size: keyof NonNullable<ReturnType<typeof useSize>>;\n direction: number;\n}>(SLIDER_NAME, {\n startEdge: 'left',\n endEdge: 'right',\n size: 'width',\n direction: 1,\n});\n\ntype SliderOrientationPrivateProps = {\n min: number;\n max: number;\n inverted: boolean;\n onSlideStart?(value: number): void;\n onSlideMove?(value: number): void;\n onSlideEnd?(): void;\n onHomeKeyDown(event: React.KeyboardEvent): void;\n onEndKeyDown(event: React.KeyboardEvent): void;\n onStepKeyDown(step: { event: React.KeyboardEvent; direction: number }): void;\n};\ninterface SliderOrientationProps\n extends Omit<SliderImplProps, keyof SliderImplPrivateProps>,\n SliderOrientationPrivateProps {}\n\ntype SliderHorizontalElement = SliderImplElement;\ninterface SliderHorizontalProps extends SliderOrientationProps {\n dir?: Direction;\n}\n\nconst SliderHorizontal = React.forwardRef<SliderHorizontalElement, SliderHorizontalProps>(\n (props: ScopedProps<SliderHorizontalProps>, forwardedRef) => {\n const {\n min,\n max,\n dir,\n inverted,\n onSlideStart,\n onSlideMove,\n onSlideEnd,\n onStepKeyDown,\n ...sliderProps\n } = props;\n const [slider, setSlider] = React.useState<SliderImplElement | null>(null);\n const composedRefs = useComposedRefs(forwardedRef, (node) => setSlider(node));\n const rectRef = React.useRef<DOMRect>(undefined);\n const direction = useDirection(dir);\n const isDirectionLTR = direction === 'ltr';\n const isSlidingFromLeft = (isDirectionLTR && !inverted) || (!isDirectionLTR && inverted);\n\n function getValueFromPointer(pointerPosition: number) {\n const rect = rectRef.current || slider!.getBoundingClientRect();\n const input: [number, number] = [0, rect.width];\n const output: [number, number] = isSlidingFromLeft ? [min, max] : [max, min];\n const value = linearScale(input, output);\n\n rectRef.current = rect;\n return value(pointerPosition - rect.left);\n }\n\n return (\n <SliderOrientationProvider\n scope={props.__scopeSlider}\n startEdge={isSlidingFromLeft ? 'left' : 'right'}\n endEdge={isSlidingFromLeft ? 'right' : 'left'}\n direction={isSlidingFromLeft ? 1 : -1}\n size=\"width\"\n >\n <SliderImpl\n dir={direction}\n data-orientation=\"horizontal\"\n {...sliderProps}\n ref={composedRefs}\n style={{\n ...sliderProps.style,\n ['--radix-slider-thumb-transform' as any]: 'translateX(-50%)',\n }}\n onSlideStart={(event) => {\n const value = getValueFromPointer(event.clientX);\n onSlideStart?.(value);\n }}\n onSlideMove={(event) => {\n const value = getValueFromPointer(event.clientX);\n onSlideMove?.(value);\n }}\n onSlideEnd={() => {\n rectRef.current = undefined;\n onSlideEnd?.();\n }}\n onStepKeyDown={(event) => {\n const slideDirection = isSlidingFromLeft ? 'from-left' : 'from-right';\n const isBackKey = BACK_KEYS[slideDirection].includes(event.key);\n onStepKeyDown?.({ event, direction: isBackKey ? -1 : 1 });\n }}\n />\n </SliderOrientationProvider>\n );\n }\n);\n\n/* -------------------------------------------------------------------------------------------------\n * SliderVertical\n * -----------------------------------------------------------------------------------------------*/\n\ntype SliderVerticalElement = SliderImplElement;\ninterface SliderVerticalProps extends SliderOrientationProps {}\n\nconst SliderVertical = React.forwardRef<SliderVerticalElement, SliderVerticalProps>(\n (props: ScopedProps<SliderVerticalProps>, forwardedRef) => {\n const {\n min,\n max,\n inverted,\n onSlideStart,\n onSlideMove,\n onSlideEnd,\n onStepKeyDown,\n ...sliderProps\n } = props;\n const sliderRef = React.useRef<SliderImplElement>(null);\n const ref = useComposedRefs(forwardedRef, sliderRef);\n const rectRef = React.useRef<DOMRect>(undefined);\n const isSlidingFromBottom = !inverted;\n\n function getValueFromPointer(pointerPosition: number) {\n const rect = rectRef.current || sliderRef.current!.getBoundingClientRect();\n const input: [number, number] = [0, rect.height];\n const output: [number, number] = isSlidingFromBottom ? [max, min] : [min, max];\n const value = linearScale(input, output);\n\n rectRef.current = rect;\n return value(pointerPosition - rect.top);\n }\n\n return (\n <SliderOrientationProvider\n scope={props.__scopeSlider}\n startEdge={isSlidingFromBottom ? 'bottom' : 'top'}\n endEdge={isSlidingFromBottom ? 'top' : 'bottom'}\n size=\"height\"\n direction={isSlidingFromBottom ? 1 : -1}\n >\n <SliderImpl\n data-orientation=\"vertical\"\n {...sliderProps}\n ref={ref}\n style={{\n ...sliderProps.style,\n ['--radix-slider-thumb-transform' as any]: 'translateY(50%)',\n }}\n onSlideStart={(event) => {\n const value = getValueFromPointer(event.clientY);\n onSlideStart?.(value);\n }}\n onSlideMove={(event) => {\n const value = getValueFromPointer(event.clientY);\n onSlideMove?.(value);\n }}\n onSlideEnd={() => {\n rectRef.current = undefined;\n onSlideEnd?.();\n }}\n onStepKeyDown={(event) => {\n const slideDirection = isSlidingFromBottom ? 'from-bottom' : 'from-top';\n const isBackKey = BACK_KEYS[slideDirection].includes(event.key);\n onStepKeyDown?.({ event, direction: isBackKey ? -1 : 1 });\n }}\n />\n </SliderOrientationProvider>\n );\n }\n);\n\n/* -------------------------------------------------------------------------------------------------\n * SliderImpl\n * -----------------------------------------------------------------------------------------------*/\n\ntype SliderImplElement = React.ComponentRef<typeof Primitive.span>;\ntype PrimitiveDivProps = React.ComponentPropsWithoutRef<typeof Primitive.div>;\ntype SliderImplPrivateProps = {\n onSlideStart(event: React.PointerEvent): void;\n onSlideMove(event: React.PointerEvent): void;\n onSlideEnd(event: React.PointerEvent): void;\n onHomeKeyDown(event: React.KeyboardEvent): void;\n onEndKeyDown(event: React.KeyboardEvent): void;\n onStepKeyDown(event: React.KeyboardEvent): void;\n};\ninterface SliderImplProps extends PrimitiveDivProps, SliderImplPrivateProps {}\n\nconst SliderImpl = React.forwardRef<SliderImplElement, SliderImplProps>(\n (props: ScopedProps<SliderImplProps>, forwardedRef) => {\n const {\n __scopeSlider,\n onSlideStart,\n onSlideMove,\n onSlideEnd,\n onHomeKeyDown,\n onEndKeyDown,\n onStepKeyDown,\n ...sliderProps\n } = props;\n const context = useSliderContext(SLIDER_NAME, __scopeSlider);\n\n return (\n <Primitive.span\n {...sliderProps}\n ref={forwardedRef}\n onKeyDown={composeEventHandlers(props.onKeyDown, (event) => {\n if (event.key === 'Home') {\n onHomeKeyDown(event);\n // Prevent scrolling to page start\n event.preventDefault();\n } else if (event.key === 'End') {\n onEndKeyDown(event);\n // Prevent scrolling to page end\n event.preventDefault();\n } else if (PAGE_KEYS.concat(ARROW_KEYS).includes(event.key)) {\n onStepKeyDown(event);\n // Prevent scrolling for directional key presses\n event.preventDefault();\n }\n })}\n onPointerDown={composeEventHandlers(props.onPointerDown, (event) => {\n const target = event.target as HTMLElement;\n target.setPointerCapture(event.pointerId);\n // Prevent browser focus behaviour because we focus a thumb manually when values change.\n event.preventDefault();\n // Touch devices have a delay before focusing so won't focus if touch immediately moves\n // away from target (sliding). We want thumb to focus regardless.\n if (context.thumbs.has(target)) {\n target.focus();\n } else {\n onSlideStart(event);\n }\n })}\n onPointerMove={composeEventHandlers(props.onPointerMove, (event) => {\n const target = event.target as HTMLElement;\n if (target.hasPointerCapture(event.pointerId)) onSlideMove(event);\n })}\n onPointerUp={composeEventHandlers(props.onPointerUp, (event) => {\n const target = event.target as HTMLElement;\n if (target.hasPointerCapture(event.pointerId)) {\n target.releasePointerCapture(event.pointerId);\n onSlideEnd(event);\n }\n })}\n />\n );\n }\n);\n\n/* -------------------------------------------------------------------------------------------------\n * SliderTrack\n * -----------------------------------------------------------------------------------------------*/\n\nconst TRACK_NAME = 'SliderTrack';\n\ntype SliderTrackElement = React.ComponentRef<typeof Primitive.span>;\ntype PrimitiveSpanProps = React.ComponentPropsWithoutRef<typeof Primitive.span>;\ninterface SliderTrackProps extends PrimitiveSpanProps {}\n\nconst SliderTrack = React.forwardRef<SliderTrackElement, SliderTrackProps>(\n (props: ScopedProps<SliderTrackProps>, forwardedRef) => {\n const { __scopeSlider, ...trackProps } = props;\n const context = useSliderContext(TRACK_NAME, __scopeSlider);\n return (\n <Primitive.span\n data-disabled={context.disabled ? '' : undefined}\n data-orientation={context.orientation}\n {...trackProps}\n ref={forwardedRef}\n />\n );\n }\n);\n\nSliderTrack.displayName = TRACK_NAME;\n\n/* -------------------------------------------------------------------------------------------------\n * SliderRange\n * -----------------------------------------------------------------------------------------------*/\n\nconst RANGE_NAME = 'SliderRange';\n\ntype SliderRangeElement = React.ComponentRef<typeof Primitive.span>;\ninterface SliderRangeProps extends PrimitiveSpanProps {}\n\nconst SliderRange = React.forwardRef<SliderRangeElement, SliderRangeProps>(\n (props: ScopedProps<SliderRangeProps>, forwardedRef) => {\n const { __scopeSlider, ...rangeProps } = props;\n const context = useSliderContext(RANGE_NAME, __scopeSlider);\n const orientation = useSliderOrientationContext(RANGE_NAME, __scopeSlider);\n const ref = React.useRef<HTMLSpanElement>(null);\n const composedRefs = useComposedRefs(forwardedRef, ref);\n const valuesCount = context.values.length;\n const percentages = context.values.map((value) =>\n convertValueToPercentage(value, context.min, context.max)\n );\n const offsetStart = valuesCount > 1 ? Math.min(...percentages) : 0;\n const offsetEnd = 100 - Math.max(...percentages);\n\n return (\n <Primitive.span\n data-orientation={context.orientation}\n data-disabled={context.disabled ? '' : undefined}\n {...rangeProps}\n ref={composedRefs}\n style={{\n ...props.style,\n [orientation.startEdge]: offsetStart + '%',\n [orientation.endEdge]: offsetEnd + '%',\n }}\n />\n );\n }\n);\n\nSliderRange.displayName = RANGE_NAME;\n\n/* -------------------------------------------------------------------------------------------------\n * SliderThumb\n * -----------------------------------------------------------------------------------------------*/\n\nconst THUMB_NAME = 'SliderThumb';\n\ntype SliderThumbElement = SliderThumbImplElement;\ninterface SliderThumbProps extends Omit<SliderThumbImplProps, 'index'> {}\n\nconst SliderThumb = React.forwardRef<SliderThumbElement, SliderThumbProps>(\n (props: ScopedProps<SliderThumbProps>, forwardedRef) => {\n const getItems = useCollection(props.__scopeSlider);\n const [thumb, setThumb] = React.useState<SliderThumbImplElement | null>(null);\n const composedRefs = useComposedRefs(forwardedRef, (node) => setThumb(node));\n const index = React.useMemo(\n () => (thumb ? getItems().findIndex((item) => item.ref.current === thumb) : -1),\n [getItems, thumb]\n );\n return <SliderThumbImpl {...props} ref={composedRefs} index={index} />;\n }\n);\n\ntype SliderThumbImplElement = React.ComponentRef<typeof Primitive.span>;\ninterface SliderThumbImplProps extends PrimitiveSpanProps {\n index: number;\n name?: string;\n}\n\nconst SliderThumbImpl = React.forwardRef<SliderThumbImplElement, SliderThumbImplProps>(\n (props: ScopedProps<SliderThumbImplProps>, forwardedRef) => {\n const { __scopeSlider, index, name, ...thumbProps } = props;\n const context = useSliderContext(THUMB_NAME, __scopeSlider);\n const orientation = useSliderOrientationContext(THUMB_NAME, __scopeSlider);\n const [thumb, setThumb] = React.useState<HTMLSpanElement | null>(null);\n const composedRefs = useComposedRefs(forwardedRef, (node) => setThumb(node));\n // We set this to true by default so that events bubble to forms without JS (SSR)\n const isFormControl = thumb ? context.form || !!thumb.closest('form') : true;\n const size = useSize(thumb);\n // We cast because index could be `-1` which would return undefined\n const value = context.values[index] as number | undefined;\n const percent =\n value === undefined ? 0 : convertValueToPercentage(value, context.min, context.max);\n const label = getLabel(index, context.values.length);\n const orientationSize = size?.[orientation.size];\n const thumbInBoundsOffset = orientationSize\n ? getThumbInBoundsOffset(orientationSize, percent, orientation.direction)\n : 0;\n\n React.useEffect(() => {\n if (thumb) {\n context.thumbs.add(thumb);\n return () => {\n context.thumbs.delete(thumb);\n };\n }\n }, [thumb, context.thumbs]);\n\n return (\n <span\n style={{\n transform: 'var(--radix-slider-thumb-transform)',\n position: 'absolute',\n [orientation.startEdge]: `calc(${percent}% + ${thumbInBoundsOffset}px)`,\n }}\n >\n <Collection.ItemSlot scope={props.__scopeSlider}>\n <Primitive.span\n role=\"slider\"\n aria-label={props['aria-label'] || label}\n aria-valuemin={context.min}\n aria-valuenow={value}\n aria-valuemax={context.max}\n aria-orientation={context.orientation}\n data-orientation={context.orientation}\n data-disabled={context.disabled ? '' : undefined}\n tabIndex={context.disabled ? undefined : 0}\n {...thumbProps}\n ref={composedRefs}\n /**\n * There will be no value on initial render while we work out the index so we hide thumbs\n * without a value, otherwise SSR will render them in the wrong position before they\n * snap into the correct position during hydration which would be visually jarring for\n * slower connections.\n */\n style={value === undefined ? { display: 'none' } : props.style}\n onFocus={composeEventHandlers(props.onFocus, () => {\n context.valueIndexToChangeRef.current = index;\n })}\n />\n </Collection.ItemSlot>\n\n {isFormControl && (\n <SliderBubbleInput\n key={index}\n name={\n name ??\n (context.name ? context.name + (context.values.length > 1 ? '[]' : '') : undefined)\n }\n form={context.form}\n value={value}\n />\n )}\n </span>\n );\n }\n);\n\nSliderThumb.displayName = THUMB_NAME;\n\n/* -------------------------------------------------------------------------------------------------\n * SliderBubbleInput\n * -----------------------------------------------------------------------------------------------*/\n\nconst BUBBLE_INPUT_NAME = 'RadioBubbleInput';\n\ntype InputProps = React.ComponentPropsWithoutRef<typeof Primitive.input>;\ninterface SliderBubbleInputProps extends InputProps {}\n\nconst SliderBubbleInput = React.forwardRef<HTMLInputElement, SliderBubbleInputProps>(\n ({ __scopeSlider, value, ...props }: ScopedProps<SliderBubbleInputProps>, forwardedRef) => {\n const ref = React.useRef<HTMLInputElement>(null);\n const composedRefs = useComposedRefs(ref, forwardedRef);\n const prevValue = usePrevious(value);\n\n // Bubble value change to parents (e.g form change event)\n React.useEffect(() => {\n const input = ref.current;\n if (!input) return;\n\n const inputProto = window.HTMLInputElement.prototype;\n const descriptor = Object.getOwnPropertyDescriptor(inputProto, 'value') as PropertyDescriptor;\n const setValue = descriptor.set;\n if (prevValue !== value && setValue) {\n const event = new Event('input', { bubbles: true });\n setValue.call(input, value);\n input.dispatchEvent(event);\n }\n }, [prevValue, value]);\n\n /**\n * We purposefully do not use `type=\"hidden\"` here otherwise forms that\n * wrap it will not be able to access its value via the FormData API.\n *\n * We purposefully do not add the `value` attribute here to allow the value\n * to be set programmatically and bubble to any parent form `onChange` event.\n * Adding the `value` will cause React to consider the programmatic\n * dispatch a duplicate and it will get swallowed.\n */\n return (\n <Primitive.input\n style={{ display: 'none' }}\n {...props}\n ref={composedRefs}\n defaultValue={value}\n />\n );\n }\n);\n\nSliderBubbleInput.displayName = BUBBLE_INPUT_NAME;\n\n/* -----------------------------------------------------------------------------------------------*/\n\nfunction getNextSortedValues(prevValues: number[] = [], nextValue: number, atIndex: number) {\n const nextValues = [...prevValues];\n nextValues[atIndex] = nextValue;\n return nextValues.sort((a, b) => a - b);\n}\n\nfunction convertValueToPercentage(value: number, min: number, max: number) {\n const maxSteps = max - min;\n const percentPerStep = 100 / maxSteps;\n const percentage = percentPerStep * (value - min);\n return clamp(percentage, [0, 100]);\n}\n\n/**\n * Returns a label for each thumb when there are two or more thumbs\n */\nfunction getLabel(index: number, totalValues: number) {\n if (totalValues > 2) {\n return `Value ${index + 1} of ${totalValues}`;\n } else if (totalValues === 2) {\n return ['Minimum', 'Maximum'][index];\n } else {\n return undefined;\n }\n}\n\n/**\n * Given a `values` array and a `nextValue`, determine which value in\n * the array is closest to `nextValue` and return its index.\n *\n * @example\n * // returns 1\n * getClosestValueIndex([10, 30], 25);\n */\nfunction getClosestValueIndex(values: number[], nextValue: number) {\n if (values.length === 1) return 0;\n const distances = values.map((value) => Math.abs(value - nextValue));\n const closestDistance = Math.min(...distances);\n return distances.indexOf(closestDistance);\n}\n\n/**\n * Offsets the thumb centre point while sliding to ensure it remains\n * within the bounds of the slider when reaching the edges\n */\nfunction getThumbInBoundsOffset(width: number, left: number, direction: number) {\n const halfWidth = width / 2;\n const halfPercent = 50;\n const offset = linearScale([0, halfPercent], [0, halfWidth]);\n return (halfWidth - offset(left) * direction) * direction;\n}\n\n/**\n * Gets an array of steps between each value.\n *\n * @example\n * // returns [1, 9]\n * getStepsBetweenValues([10, 11, 20]);\n */\nfunction getStepsBetweenValues(values: number[]) {\n return values.slice(0, -1).map((value, index) => values[index + 1]! - value);\n}\n\n/**\n * Verifies the minimum steps between all values is greater than or equal\n * to the expected minimum steps.\n *\n * @example\n * // returns false\n * hasMinStepsBetweenValues([1,2,3], 2);\n *\n * @example\n * // returns true\n * hasMinStepsBetweenValues([1,2,3], 1);\n */\nfunction hasMinStepsBetweenValues(values: number[], minStepsBetweenValues: number) {\n if (minStepsBetweenValues > 0) {\n const stepsBetweenValues = getStepsBetweenValues(values);\n const actualMinStepsBetweenValues = Math.min(...stepsBetweenValues);\n return actualMinStepsBetweenValues >= minStepsBetweenValues;\n }\n return true;\n}\n\n// https://github.com/tmcw-up-for-adoption/simple-linear-scale/blob/master/index.js\nfunction linearScale(input: readonly [number, number], output: readonly [number, number]) {\n return (value: number) => {\n if (input[0] === input[1] || output[0] === output[1]) return output[0];\n const ratio = (output[1] - output[0]) / (input[1] - input[0]);\n return output[0] + ratio * (value - input[0]);\n };\n}\n\nfunction getDecimalCount(value: number) {\n return (String(value).split('.')[1] || '').length;\n}\n\nfunction roundValue(value: number, decimalCount: number) {\n const rounder = Math.pow(10, decimalCount);\n return Math.round(value * rounder) / rounder;\n}\n\nconst Root = Slider;\nconst Track = SliderTrack;\nconst Range = SliderRange;\nconst Thumb = SliderThumb;\n\nexport {\n createSliderScope,\n //\n Slider,\n SliderTrack,\n SliderRange,\n SliderThumb,\n //\n Root,\n Track,\n Range,\n Thumb,\n};\nexport type { SliderProps, SliderTrackProps, SliderRangeProps, SliderThumbProps };\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n [\n 'path',\n {\n d: 'M2.992 16.342a2 2 0 0 1 .094 1.167l-1.065 3.29a1 1 0 0 0 1.236 1.168l3.413-.998a2 2 0 0 1 1.099.092 10 10 0 1 0-4.777-4.719',\n key: '1sd12s',\n },\n ],\n];\n\n/**\n * @component @name MessageCircle\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMi45OTIgMTYuMzQyYTIgMiAwIDAgMSAuMDk0IDEuMTY3bC0xLjA2NSAzLjI5YTEgMSAwIDAgMCAxLjIzNiAxLjE2OGwzLjQxMy0uOTk4YTIgMiAwIDAgMSAxLjA5OS4wOTIgMTAgMTAgMCAxIDAtNC43NzctNC43MTkiIC8+Cjwvc3ZnPgo=) - https://lucide.dev/icons/message-circle\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst MessageCircle = createLucideIcon('message-circle', __iconNode);\n\nexport default MessageCircle;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n [\n 'path',\n {\n d: 'M4 22V4a1 1 0 0 1 .4-.8A6 6 0 0 1 8 2c3 0 5 2 7.333 2q2 0 3.067-.8A1 1 0 0 1 20 4v10a1 1 0 0 1-.4.8A6 6 0 0 1 16 16c-3 0-5-2-8-2a6 6 0 0 0-4 1.528',\n key: '1jaruq',\n },\n ],\n];\n\n/**\n * @component @name Flag\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNNCAyMlY0YTEgMSAwIDAgMSAuNC0uOEE2IDYgMCAwIDEgOCAyYzMgMCA1IDIgNy4zMzMgMnEyIDAgMy4wNjctLjhBMSAxIDAgMCAxIDIwIDR2MTBhMSAxIDAgMCAxLS40LjhBNiA2IDAgMCAxIDE2IDE2Yy0zIDAtNS0yLTgtMmE2IDYgMCAwIDAtNCAxLjUyOCIgLz4KPC9zdmc+Cg==) - https://lucide.dev/icons/flag\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Flag = createLucideIcon('flag', __iconNode);\n\nexport default Flag;\n"],"names":[],"mappings":"wDSEA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,EAAA,CAAA,CAAA,OAAA,EAAA,EAAA,CAAA,CAAA,OAAA,EAAA,EAAA,CAAA,CAAA,OAAA,EAAA,EAAA,CAAA,CAAA,OAAA,EAAA,EAAA,CAAA,CAAA,0BIsBa,CAAA,EAAA,EAAA,OAAA,EAAiB,CAAA,CAAA,CAAA,CAAA,CAAA,GAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,sCArBe,CDAL,ADAK,AEAA,CAAA,ADAL,ADAK,CAAA,AEAA,OAAU,CFAL,2IEKpD,IAAK,CAAA,CAAA,CAAA,CAAA,ACYL,ODTN,OKYa,EAAA,OAAA,EAAiB,CDAR,ACAQ,CDAR,ACAQ,CDAR,ACAQ,CDAR,ACAQ,CDAR,ACAQ,gNPJgB,CCAL,ACZhC,AFYqC,CEZrC,AFYqC,ACAL,CDAK,ACAL,ACZhC,CDYgC,ACZhC,AFYqC,CCAK,ADAL,AEZrC,MFJK,CAAA,QAAY,CEAV,ADAA,AGAA,ADAA,AHAU,EEAV,OFAuB,CIAL,ADAD,AFAjB,ADAuB,AEAvB,CAAA,ADAA,ADAuB,AIAL,KJAc,CEAA,ADAA,ADAA,CEAA,ADAA,ADAA,CEAA,ADAA,ADAA,CEAA,ADAA,YDAU,CAAU,CAAA,YACpD,CGAA,AHAA,ACAA,AGAA,CAAA,AHAA,ADAA,AGAA,CFAA,AEAA,ACAA,AJAA,CCAA,AEAA,ACAA,AJAA,CCAA,AEAA,ACAA,AJAA,CCAA,AEAA,ACAA,AJAA,CIAA,AJAA,ACAA,AEAA,CEGQ,ALHR,ACAA,AEAA,ACAA,CHAA,AEAA,ACAA,AJAA,CCAA,AGAA,AJAA,AGAA,CHAA,AGAA,ACAA,AHAA,+BDA4C,EACzD,kCAAsC,IAAK,CAAA,AGAH,YLH3C,IAAA,EAAA,EAAA,CAAA,CAAA,OAAA,EAAA,EAAA,CAAA,CAAA,OAAA,EAAA,EAAA,CAAA,CAAA,OAAA,EAAA,EAAA,CAAA,CAAA,yBKkBkB,EAAiB,CAAA,CAAA,AELI,YFKU,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAA,oDAhB1B,wBACd,uBAA6B,CHAF,AGAE,CAAA,AFAF,ADAA,CAA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","ignoreList":[6,11,12,13,14,15,16,17,18]}