@shipit-ai/cli 1.169.0 → 1.170.0-pr13.d3605b0

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 (414) hide show
  1. package/apis/json-schema/ClaudeCodeProxyConfig.yaml +20 -0
  2. package/apis/json-schema/FeatureFlags.yaml +5 -0
  3. package/apis/json-schema/LiteLLMProxyConfig.yaml +17 -0
  4. package/apis/json-schema/LiteLLMProxyRoutingMode.yaml +8 -0
  5. package/apis/json-schema/Settings.yaml +3 -0
  6. package/dist/packages/core/src/application/ports/output/services/index.d.ts +1 -0
  7. package/dist/packages/core/src/application/ports/output/services/index.d.ts.map +1 -1
  8. package/dist/packages/core/src/application/ports/output/services/plugin-marketplace.interface.d.ts +46 -0
  9. package/dist/packages/core/src/application/ports/output/services/plugin-marketplace.interface.d.ts.map +1 -0
  10. package/dist/packages/core/src/application/ports/output/services/plugin-marketplace.interface.js +12 -0
  11. package/dist/packages/core/src/application/use-cases/plugins/add-marketplace.use-case.d.ts +16 -0
  12. package/dist/packages/core/src/application/use-cases/plugins/add-marketplace.use-case.d.ts.map +1 -0
  13. package/dist/packages/core/src/application/use-cases/plugins/add-marketplace.use-case.js +34 -0
  14. package/dist/packages/core/src/application/use-cases/plugins/fetch-plugin-catalog.use-case.d.ts +24 -0
  15. package/dist/packages/core/src/application/use-cases/plugins/fetch-plugin-catalog.use-case.d.ts.map +1 -0
  16. package/dist/packages/core/src/application/use-cases/plugins/fetch-plugin-catalog.use-case.js +52 -0
  17. package/dist/packages/core/src/application/use-cases/plugins/install-plugin.use-case.d.ts +17 -0
  18. package/dist/packages/core/src/application/use-cases/plugins/install-plugin.use-case.d.ts.map +1 -0
  19. package/dist/packages/core/src/application/use-cases/plugins/install-plugin.use-case.js +33 -0
  20. package/dist/packages/core/src/application/use-cases/plugins/toggle-plugin.use-case.d.ts +17 -0
  21. package/dist/packages/core/src/application/use-cases/plugins/toggle-plugin.use-case.d.ts.map +1 -0
  22. package/dist/packages/core/src/application/use-cases/plugins/toggle-plugin.use-case.js +33 -0
  23. package/dist/packages/core/src/application/use-cases/plugins/uninstall-plugin.use-case.d.ts +16 -0
  24. package/dist/packages/core/src/application/use-cases/plugins/uninstall-plugin.use-case.d.ts.map +1 -0
  25. package/dist/packages/core/src/application/use-cases/plugins/uninstall-plugin.use-case.js +33 -0
  26. package/dist/packages/core/src/domain/factories/settings-defaults.factory.d.ts.map +1 -1
  27. package/dist/packages/core/src/domain/factories/settings-defaults.factory.js +1 -0
  28. package/dist/packages/core/src/domain/generated/output.d.ts +59 -0
  29. package/dist/packages/core/src/domain/generated/output.d.ts.map +1 -1
  30. package/dist/packages/core/src/domain/generated/output.js +6 -0
  31. package/dist/packages/core/src/infrastructure/di/modules/services.module.d.ts.map +1 -1
  32. package/dist/packages/core/src/infrastructure/di/modules/services.module.js +13 -0
  33. package/dist/packages/core/src/infrastructure/di/modules/use-cases.module.d.ts.map +1 -1
  34. package/dist/packages/core/src/infrastructure/di/modules/use-cases.module.js +12 -0
  35. package/dist/packages/core/src/infrastructure/di/modules/web-tokens.module.d.ts.map +1 -1
  36. package/dist/packages/core/src/infrastructure/di/modules/web-tokens.module.js +22 -0
  37. package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/settings.mapper.d.ts +9 -0
  38. package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/settings.mapper.d.ts.map +1 -1
  39. package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/settings.mapper.js +41 -0
  40. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/054-add-litellm-proxy.d.ts +14 -0
  41. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/054-add-litellm-proxy.d.ts.map +1 -0
  42. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/054-add-litellm-proxy.js +28 -0
  43. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/055-add-litellm-proxy-agent-config.d.ts +15 -0
  44. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/055-add-litellm-proxy-agent-config.d.ts.map +1 -0
  45. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/055-add-litellm-proxy-agent-config.js +32 -0
  46. package/dist/packages/core/src/infrastructure/repositories/sqlite-settings.repository.d.ts.map +1 -1
  47. package/dist/packages/core/src/infrastructure/repositories/sqlite-settings.repository.js +36 -5
  48. package/dist/packages/core/src/infrastructure/services/agents/common/agent-executor-provider.service.d.ts.map +1 -1
  49. package/dist/packages/core/src/infrastructure/services/agents/common/agent-executor-provider.service.js +7 -1
  50. package/dist/packages/core/src/infrastructure/services/agents/common/executors/claude-code-executor.service.d.ts +4 -1
  51. package/dist/packages/core/src/infrastructure/services/agents/common/executors/claude-code-executor.service.d.ts.map +1 -1
  52. package/dist/packages/core/src/infrastructure/services/agents/common/executors/claude-code-executor.service.js +44 -0
  53. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/feature-agent-worker.d.ts.map +1 -1
  54. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/feature-agent-worker.js +5 -0
  55. package/dist/packages/core/src/infrastructure/services/plugin-marketplace/index.d.ts +4 -0
  56. package/dist/packages/core/src/infrastructure/services/plugin-marketplace/index.d.ts.map +1 -0
  57. package/dist/packages/core/src/infrastructure/services/plugin-marketplace/index.js +3 -0
  58. package/dist/packages/core/src/infrastructure/services/plugin-marketplace/plugin-marketplace.schema.d.ts +78 -0
  59. package/dist/packages/core/src/infrastructure/services/plugin-marketplace/plugin-marketplace.schema.d.ts.map +1 -0
  60. package/dist/packages/core/src/infrastructure/services/plugin-marketplace/plugin-marketplace.schema.js +46 -0
  61. package/dist/packages/core/src/infrastructure/services/plugin-marketplace/plugin-marketplace.service.d.ts +29 -0
  62. package/dist/packages/core/src/infrastructure/services/plugin-marketplace/plugin-marketplace.service.d.ts.map +1 -0
  63. package/dist/packages/core/src/infrastructure/services/plugin-marketplace/plugin-marketplace.service.js +147 -0
  64. package/dist/packages/core/src/infrastructure/services/plugin-marketplace/plugin-marketplace.validators.d.ts +11 -0
  65. package/dist/packages/core/src/infrastructure/services/plugin-marketplace/plugin-marketplace.validators.d.ts.map +1 -0
  66. package/dist/packages/core/src/infrastructure/services/plugin-marketplace/plugin-marketplace.validators.js +47 -0
  67. package/dist/src/presentation/web/app/actions/add-marketplace.d.ts +5 -0
  68. package/dist/src/presentation/web/app/actions/add-marketplace.d.ts.map +1 -0
  69. package/dist/src/presentation/web/app/actions/add-marketplace.js +11 -0
  70. package/dist/src/presentation/web/app/actions/fetch-plugin-catalog.d.ts +5 -0
  71. package/dist/src/presentation/web/app/actions/fetch-plugin-catalog.d.ts.map +1 -0
  72. package/dist/src/presentation/web/app/actions/fetch-plugin-catalog.js +11 -0
  73. package/dist/src/presentation/web/app/actions/install-plugin.d.ts +5 -0
  74. package/dist/src/presentation/web/app/actions/install-plugin.d.ts.map +1 -0
  75. package/dist/src/presentation/web/app/actions/install-plugin.js +11 -0
  76. package/dist/src/presentation/web/app/actions/toggle-plugin.d.ts +5 -0
  77. package/dist/src/presentation/web/app/actions/toggle-plugin.d.ts.map +1 -0
  78. package/dist/src/presentation/web/app/actions/toggle-plugin.js +11 -0
  79. package/dist/src/presentation/web/app/actions/uninstall-plugin.d.ts +5 -0
  80. package/dist/src/presentation/web/app/actions/uninstall-plugin.d.ts.map +1 -0
  81. package/dist/src/presentation/web/app/actions/uninstall-plugin.js +11 -0
  82. package/dist/src/presentation/web/app/plugins/page.d.ts +2 -0
  83. package/dist/src/presentation/web/app/plugins/page.d.ts.map +1 -0
  84. package/dist/src/presentation/web/app/plugins/page.js +23 -0
  85. package/dist/src/presentation/web/components/common/repository-node/repository-drawer.stories.d.ts.map +1 -1
  86. package/dist/src/presentation/web/components/common/repository-node/repository-drawer.stories.js +1 -0
  87. package/dist/src/presentation/web/components/features/plugins/plugin-card.d.ts +9 -0
  88. package/dist/src/presentation/web/components/features/plugins/plugin-card.d.ts.map +1 -0
  89. package/dist/src/presentation/web/components/features/plugins/plugin-card.js +15 -0
  90. package/dist/src/presentation/web/components/features/plugins/plugin-card.stories.d.ts +17 -0
  91. package/dist/src/presentation/web/components/features/plugins/plugin-card.stories.d.ts.map +1 -0
  92. package/dist/src/presentation/web/components/features/plugins/plugin-card.stories.js +60 -0
  93. package/dist/src/presentation/web/components/features/plugins/plugin-detail-drawer.d.ts +11 -0
  94. package/dist/src/presentation/web/components/features/plugins/plugin-detail-drawer.d.ts.map +1 -0
  95. package/dist/src/presentation/web/components/features/plugins/plugin-detail-drawer.js +33 -0
  96. package/dist/src/presentation/web/components/features/plugins/plugin-detail-drawer.stories.d.ts +18 -0
  97. package/dist/src/presentation/web/components/features/plugins/plugin-detail-drawer.stories.d.ts.map +1 -0
  98. package/dist/src/presentation/web/components/features/plugins/plugin-detail-drawer.stories.js +51 -0
  99. package/dist/src/presentation/web/components/features/plugins/plugins-page-client.d.ts +6 -0
  100. package/dist/src/presentation/web/components/features/plugins/plugins-page-client.d.ts.map +1 -0
  101. package/dist/src/presentation/web/components/features/plugins/plugins-page-client.js +124 -0
  102. package/dist/src/presentation/web/components/features/plugins/plugins-page-client.stories.d.ts +12 -0
  103. package/dist/src/presentation/web/components/features/plugins/plugins-page-client.stories.d.ts.map +1 -0
  104. package/dist/src/presentation/web/components/features/plugins/plugins-page-client.stories.js +24 -0
  105. package/dist/src/presentation/web/components/features/settings/feature-flags-settings-section.d.ts.map +1 -1
  106. package/dist/src/presentation/web/components/features/settings/feature-flags-settings-section.js +7 -0
  107. package/dist/src/presentation/web/components/features/settings/feature-flags-settings-section.stories.d.ts.map +1 -1
  108. package/dist/src/presentation/web/components/features/settings/feature-flags-settings-section.stories.js +2 -0
  109. package/dist/src/presentation/web/components/features/settings/litellm-proxy-routing-section.d.ts +6 -0
  110. package/dist/src/presentation/web/components/features/settings/litellm-proxy-routing-section.d.ts.map +1 -0
  111. package/dist/src/presentation/web/components/features/settings/litellm-proxy-routing-section.js +72 -0
  112. package/dist/src/presentation/web/components/features/settings/litellm-proxy-routing-section.stories.d.ts +16 -0
  113. package/dist/src/presentation/web/components/features/settings/litellm-proxy-routing-section.stories.d.ts.map +1 -0
  114. package/dist/src/presentation/web/components/features/settings/litellm-proxy-routing-section.stories.js +64 -0
  115. package/dist/src/presentation/web/components/features/settings/litellm-proxy-settings-section.d.ts +6 -0
  116. package/dist/src/presentation/web/components/features/settings/litellm-proxy-settings-section.d.ts.map +1 -0
  117. package/dist/src/presentation/web/components/features/settings/litellm-proxy-settings-section.js +73 -0
  118. package/dist/src/presentation/web/components/features/settings/litellm-proxy-settings-section.stories.d.ts +15 -0
  119. package/dist/src/presentation/web/components/features/settings/litellm-proxy-settings-section.stories.d.ts.map +1 -0
  120. package/dist/src/presentation/web/components/features/settings/litellm-proxy-settings-section.stories.js +29 -0
  121. package/dist/src/presentation/web/components/features/settings/settings-page-client.d.ts.map +1 -1
  122. package/dist/src/presentation/web/components/features/settings/settings-page-client.js +5 -2
  123. package/dist/src/presentation/web/components/features/settings/settings-page-client.stories.d.ts.map +1 -1
  124. package/dist/src/presentation/web/components/features/settings/settings-page-client.stories.js +1 -0
  125. package/dist/src/presentation/web/components/features/skills/skills-page-client.d.ts.map +1 -1
  126. package/dist/src/presentation/web/components/features/skills/skills-page-client.js +6 -2
  127. package/dist/src/presentation/web/components/features/tools/tools-page-client.d.ts.map +1 -1
  128. package/dist/src/presentation/web/components/features/tools/tools-page-client.js +23 -4
  129. package/dist/src/presentation/web/components/layouts/app-sidebar/app-sidebar.d.ts.map +1 -1
  130. package/dist/src/presentation/web/components/layouts/app-sidebar/app-sidebar.js +2 -2
  131. package/dist/src/presentation/web/components/layouts/app-sidebar/app-sidebar.stories.d.ts.map +1 -1
  132. package/dist/src/presentation/web/components/layouts/app-sidebar/app-sidebar.stories.js +1 -0
  133. package/dist/src/presentation/web/hooks/feature-flags-context.d.ts.map +1 -1
  134. package/dist/src/presentation/web/hooks/feature-flags-context.js +1 -0
  135. package/dist/src/presentation/web/lib/feature-flags.d.ts +2 -0
  136. package/dist/src/presentation/web/lib/feature-flags.d.ts.map +1 -1
  137. package/dist/src/presentation/web/lib/feature-flags.js +6 -0
  138. package/dist/translations/ar/web.json +56 -2
  139. package/dist/translations/de/web.json +56 -2
  140. package/dist/translations/en/web.json +56 -2
  141. package/dist/translations/es/web.json +56 -2
  142. package/dist/translations/fr/web.json +56 -2
  143. package/dist/translations/he/web.json +56 -2
  144. package/dist/translations/pt/web.json +56 -2
  145. package/dist/translations/ru/web.json +56 -2
  146. package/dist/tsconfig.build.tsbuildinfo +1 -1
  147. package/package.json +1 -1
  148. package/web/.next/BUILD_ID +1 -1
  149. package/web/.next/app-path-routes-manifest.json +1 -0
  150. package/web/.next/build-manifest.json +3 -3
  151. package/web/.next/fallback-build-manifest.json +3 -3
  152. package/web/.next/prerender-manifest.json +3 -3
  153. package/web/.next/required-server-files.js +3 -3
  154. package/web/.next/required-server-files.json +3 -3
  155. package/web/.next/routes-manifest.json +6 -0
  156. package/web/.next/server/app/(dashboard)/@drawer/adopt/page/server-reference-manifest.json +29 -29
  157. package/web/.next/server/app/(dashboard)/@drawer/adopt/page.js.nft.json +1 -1
  158. package/web/.next/server/app/(dashboard)/@drawer/adopt/page_client-reference-manifest.js +1 -1
  159. package/web/.next/server/app/(dashboard)/@drawer/chat/page/server-reference-manifest.json +27 -27
  160. package/web/.next/server/app/(dashboard)/@drawer/chat/page.js.nft.json +1 -1
  161. package/web/.next/server/app/(dashboard)/@drawer/chat/page_client-reference-manifest.js +1 -1
  162. package/web/.next/server/app/(dashboard)/@drawer/create/page/server-reference-manifest.json +31 -31
  163. package/web/.next/server/app/(dashboard)/@drawer/create/page.js.nft.json +1 -1
  164. package/web/.next/server/app/(dashboard)/@drawer/create/page_client-reference-manifest.js +1 -1
  165. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page/server-reference-manifest.json +37 -37
  166. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page.js.nft.json +1 -1
  167. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page_client-reference-manifest.js +1 -1
  168. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page/server-reference-manifest.json +37 -37
  169. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js.nft.json +1 -1
  170. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page_client-reference-manifest.js +1 -1
  171. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/[tab]/page/server-reference-manifest.json +28 -28
  172. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/[tab]/page.js.nft.json +1 -1
  173. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/[tab]/page_client-reference-manifest.js +1 -1
  174. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page/server-reference-manifest.json +28 -28
  175. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js.nft.json +1 -1
  176. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  177. package/web/.next/server/app/(dashboard)/chat/page/server-reference-manifest.json +27 -27
  178. package/web/.next/server/app/(dashboard)/chat/page.js.nft.json +1 -1
  179. package/web/.next/server/app/(dashboard)/chat/page_client-reference-manifest.js +1 -1
  180. package/web/.next/server/app/(dashboard)/create/page/server-reference-manifest.json +31 -31
  181. package/web/.next/server/app/(dashboard)/create/page.js.nft.json +1 -1
  182. package/web/.next/server/app/(dashboard)/create/page_client-reference-manifest.js +1 -1
  183. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page/server-reference-manifest.json +37 -37
  184. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page.js.nft.json +1 -1
  185. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page_client-reference-manifest.js +1 -1
  186. package/web/.next/server/app/(dashboard)/feature/[featureId]/page/server-reference-manifest.json +37 -37
  187. package/web/.next/server/app/(dashboard)/feature/[featureId]/page.js.nft.json +1 -1
  188. package/web/.next/server/app/(dashboard)/feature/[featureId]/page_client-reference-manifest.js +1 -1
  189. package/web/.next/server/app/(dashboard)/page/server-reference-manifest.json +27 -27
  190. package/web/.next/server/app/(dashboard)/page.js.nft.json +1 -1
  191. package/web/.next/server/app/(dashboard)/page_client-reference-manifest.js +1 -1
  192. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/[tab]/page/server-reference-manifest.json +28 -28
  193. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/[tab]/page.js.nft.json +1 -1
  194. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/[tab]/page_client-reference-manifest.js +1 -1
  195. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page/server-reference-manifest.json +28 -28
  196. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js.nft.json +1 -1
  197. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  198. package/web/.next/server/app/_global-error.html +1 -1
  199. package/web/.next/server/app/_global-error.rsc +1 -1
  200. package/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  201. package/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  202. package/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  203. package/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  204. package/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  205. package/web/.next/server/app/_not-found/page/server-reference-manifest.json +6 -6
  206. package/web/.next/server/app/_not-found/page.js.nft.json +1 -1
  207. package/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  208. package/web/.next/server/app/api/attachments/preview/route.js.nft.json +1 -1
  209. package/web/.next/server/app/api/dialog/pick-files/route.js.nft.json +1 -1
  210. package/web/.next/server/app/api/evidence/route.js.nft.json +1 -1
  211. package/web/.next/server/app/api/graph-data/route.js +1 -1
  212. package/web/.next/server/app/api/graph-data/route.js.nft.json +1 -1
  213. package/web/.next/server/app/api/interactive/chat/[featureId]/messages/route.js +1 -1
  214. package/web/.next/server/app/api/interactive/chat/[featureId]/messages/route.js.nft.json +1 -1
  215. package/web/.next/server/app/api/sessions-batch/route.js +1 -1
  216. package/web/.next/server/app/api/sessions-batch/route.js.nft.json +1 -1
  217. package/web/.next/server/app/plugins/page/app-paths-manifest.json +3 -0
  218. package/web/.next/server/app/plugins/page/build-manifest.json +18 -0
  219. package/web/.next/server/app/plugins/page/next-font-manifest.json +10 -0
  220. package/web/.next/server/app/plugins/page/react-loadable-manifest.json +8 -0
  221. package/web/.next/server/app/plugins/page/server-reference-manifest.json +185 -0
  222. package/web/.next/server/app/plugins/page.js +17 -0
  223. package/web/.next/server/app/plugins/page.js.map +5 -0
  224. package/web/.next/server/app/plugins/page.js.nft.json +1 -0
  225. package/web/.next/server/app/plugins/page_client-reference-manifest.js +3 -0
  226. package/web/.next/server/app/settings/page/server-reference-manifest.json +34 -22
  227. package/web/.next/server/app/settings/page.js +1 -1
  228. package/web/.next/server/app/settings/page.js.nft.json +1 -1
  229. package/web/.next/server/app/settings/page_client-reference-manifest.js +1 -1
  230. package/web/.next/server/app/skills/page/server-reference-manifest.json +11 -11
  231. package/web/.next/server/app/skills/page.js.nft.json +1 -1
  232. package/web/.next/server/app/skills/page_client-reference-manifest.js +1 -1
  233. package/web/.next/server/app/tools/page/server-reference-manifest.json +11 -11
  234. package/web/.next/server/app/tools/page.js.nft.json +1 -1
  235. package/web/.next/server/app/tools/page_client-reference-manifest.js +1 -1
  236. package/web/.next/server/app/version/page/server-reference-manifest.json +6 -6
  237. package/web/.next/server/app/version/page.js.nft.json +1 -1
  238. package/web/.next/server/app/version/page_client-reference-manifest.js +1 -1
  239. package/web/.next/server/app-paths-manifest.json +1 -0
  240. package/web/.next/server/chunks/11es_next_dist_esm_build_templates_app-route_067cwst.js +1 -1
  241. package/web/.next/server/chunks/11es_next_dist_esm_build_templates_app-route_067cwst.js.map +1 -1
  242. package/web/.next/server/chunks/{[root-of-the-server]__0zu_byw._.js → [root-of-the-server]__07suer1._.js} +2 -2
  243. package/web/.next/server/chunks/{[root-of-the-server]__0u1jyv9._.js → [root-of-the-server]__0sgzo7y._.js} +2 -2
  244. package/web/.next/server/chunks/[root-of-the-server]__0tb~wwk._.js +1 -1
  245. package/web/.next/server/chunks/{[root-of-the-server]__08cpfre._.js → [root-of-the-server]__0uxlr84._.js} +2 -2
  246. package/web/.next/server/chunks/ssr/0j.8_web_components_common_control-center-drawer_create-drawer-client_tsx_0g70fc5._.js +1 -1
  247. package/web/.next/server/chunks/ssr/0j.8_web_components_common_control-center-drawer_create-drawer-client_tsx_0g70fc5._.js.map +1 -1
  248. package/web/.next/server/chunks/ssr/0j.8_web_components_common_control-center-drawer_feature-drawer-client_tsx_104cna.._.js +2 -2
  249. package/web/.next/server/chunks/ssr/0j.8_web_components_common_control-center-drawer_feature-drawer-client_tsx_104cna.._.js.map +1 -1
  250. package/web/.next/server/chunks/ssr/0ukq_presentation_web_components_features_settings_settings-page-client_tsx_0j1uius._.js +1 -1
  251. package/web/.next/server/chunks/ssr/0ukq_presentation_web_components_features_settings_settings-page-client_tsx_0j1uius._.js.map +1 -1
  252. package/web/.next/server/chunks/ssr/11es_next_dist_esm_build_templates_app-page_0y6lfp8.js +4 -0
  253. package/web/.next/server/chunks/ssr/11es_next_dist_esm_build_templates_app-page_0y6lfp8.js.map +1 -0
  254. package/web/.next/server/chunks/ssr/11y9_components_common_control-center-drawer_repository-drawer-client_tsx_09z.znp._.js +1 -1
  255. package/web/.next/server/chunks/ssr/11y9_components_common_control-center-drawer_repository-drawer-client_tsx_09z.znp._.js.map +1 -1
  256. package/web/.next/server/chunks/ssr/{_04s_q5r._.js → 12k._sonner_dist_index_mjs_0-vmpk5._.js} +2 -2
  257. package/web/.next/server/chunks/ssr/12k._sonner_dist_index_mjs_0-vmpk5._.js.map +1 -0
  258. package/web/.next/server/chunks/ssr/{[root-of-the-server]__0rvrr1j._.js → [root-of-the-server]__0.5ojmt._.js} +2 -2
  259. package/web/.next/server/chunks/ssr/[root-of-the-server]__0.5ojmt._.js.map +1 -0
  260. package/web/.next/server/chunks/ssr/[root-of-the-server]__04h~gav._.js +3 -0
  261. package/web/.next/server/chunks/ssr/[root-of-the-server]__04h~gav._.js.map +1 -0
  262. package/web/.next/server/chunks/ssr/[root-of-the-server]__05_qc0n._.js +1 -1
  263. package/web/.next/server/chunks/ssr/[root-of-the-server]__05_qc0n._.js.map +1 -1
  264. package/web/.next/server/chunks/ssr/[root-of-the-server]__0dec29w._.js +3 -0
  265. package/web/.next/server/chunks/ssr/[root-of-the-server]__0dec29w._.js.map +1 -0
  266. package/web/.next/server/chunks/ssr/[root-of-the-server]__0ge~xny._.js +1 -1
  267. package/web/.next/server/chunks/ssr/[root-of-the-server]__0ge~xny._.js.map +1 -1
  268. package/web/.next/server/chunks/ssr/[root-of-the-server]__0qda~yi._.js +1 -1
  269. package/web/.next/server/chunks/ssr/[root-of-the-server]__0qda~yi._.js.map +1 -1
  270. package/web/.next/server/chunks/ssr/[root-of-the-server]__0rv1gci._.js +1 -1
  271. package/web/.next/server/chunks/ssr/[root-of-the-server]__0tq2syh._.js +1 -1
  272. package/web/.next/server/chunks/ssr/[root-of-the-server]__0t~u8sd._.js +1 -1
  273. package/web/.next/server/chunks/ssr/[root-of-the-server]__0t~u8sd._.js.map +1 -1
  274. package/web/.next/server/chunks/ssr/[root-of-the-server]__10tll_l._.js +1 -1
  275. package/web/.next/server/chunks/ssr/[root-of-the-server]__10tll_l._.js.map +1 -1
  276. package/web/.next/server/chunks/ssr/[root-of-the-server]__12j29w-._.js +1 -1
  277. package/web/.next/server/chunks/ssr/[root-of-the-server]__12j29w-._.js.map +1 -1
  278. package/web/.next/server/chunks/ssr/_01sesw0._.js +1 -1
  279. package/web/.next/server/chunks/ssr/_01sesw0._.js.map +1 -1
  280. package/web/.next/server/chunks/ssr/{_0wor25i._.js → _02g0xyh._.js} +2 -2
  281. package/web/.next/server/chunks/ssr/{_0wor25i._.js.map → _02g0xyh._.js.map} +1 -1
  282. package/web/.next/server/chunks/ssr/{_00u~.41._.js → _03x4h9e._.js} +2 -2
  283. package/web/.next/server/chunks/ssr/_03x4h9e._.js.map +1 -0
  284. package/web/.next/server/chunks/ssr/{_0~0jkp_._.js → _05fk0a4._.js} +2 -2
  285. package/web/.next/server/chunks/ssr/_05fk0a4._.js.map +1 -0
  286. package/web/.next/server/chunks/ssr/_069y.js._.js +2 -2
  287. package/web/.next/server/chunks/ssr/_069y.js._.js.map +1 -1
  288. package/web/.next/server/chunks/ssr/_083k45~._.js +3 -0
  289. package/web/.next/server/chunks/ssr/_083k45~._.js.map +1 -0
  290. package/web/.next/server/chunks/ssr/_0__4si~._.js +1 -1
  291. package/web/.next/server/chunks/ssr/_0__4si~._.js.map +1 -1
  292. package/web/.next/server/chunks/ssr/_0_m17kl._.js +1 -1
  293. package/web/.next/server/chunks/ssr/_0_m17kl._.js.map +1 -1
  294. package/web/.next/server/chunks/ssr/_0d4miu.._.js +1 -1
  295. package/web/.next/server/chunks/ssr/_0d4miu.._.js.map +1 -1
  296. package/web/.next/server/chunks/ssr/_0e8ern9._.js +1 -1
  297. package/web/.next/server/chunks/ssr/_0e8ern9._.js.map +1 -1
  298. package/web/.next/server/chunks/ssr/_0i~-084._.js +3 -0
  299. package/web/.next/server/chunks/ssr/_0i~-084._.js.map +1 -0
  300. package/web/.next/server/chunks/ssr/_0kaec~c._.js +3 -0
  301. package/web/.next/server/chunks/ssr/_0kaec~c._.js.map +1 -0
  302. package/web/.next/server/chunks/ssr/{_01qdxy2._.js → _0mdgz5u._.js} +2 -2
  303. package/web/.next/server/chunks/ssr/{_01qdxy2._.js.map → _0mdgz5u._.js.map} +1 -1
  304. package/web/.next/server/chunks/ssr/_0o.xc6x._.js +3 -0
  305. package/web/.next/server/chunks/ssr/_0o.xc6x._.js.map +1 -0
  306. package/web/.next/server/chunks/ssr/{_0hw~zvl._.js → _0o_oaao._.js} +2 -2
  307. package/web/.next/server/chunks/ssr/_0o_oaao._.js.map +1 -0
  308. package/web/.next/server/chunks/ssr/_0p3~u8u._.js +2 -2
  309. package/web/.next/server/chunks/ssr/_0p3~u8u._.js.map +1 -1
  310. package/web/.next/server/chunks/ssr/_0r.3n~3._.js +1 -1
  311. package/web/.next/server/chunks/ssr/_0r.3n~3._.js.map +1 -1
  312. package/web/.next/server/chunks/ssr/_0rcx2-c._.js +9 -0
  313. package/web/.next/server/chunks/ssr/_0rcx2-c._.js.map +1 -0
  314. package/web/.next/server/chunks/ssr/_0rqycsg._.js +3 -0
  315. package/web/.next/server/chunks/ssr/_0rqycsg._.js.map +1 -0
  316. package/web/.next/server/chunks/ssr/_0t59q8r._.js +1 -1
  317. package/web/.next/server/chunks/ssr/_0t59q8r._.js.map +1 -1
  318. package/web/.next/server/chunks/ssr/_0tcccbb._.js +1 -1
  319. package/web/.next/server/chunks/ssr/_0tcccbb._.js.map +1 -1
  320. package/web/.next/server/chunks/ssr/{_0pa1dkv._.js → _0u3d8.n._.js} +2 -2
  321. package/web/.next/server/chunks/ssr/_0u3d8.n._.js.map +1 -0
  322. package/web/.next/server/chunks/ssr/_0vyfc4b._.js +1 -1
  323. package/web/.next/server/chunks/ssr/_0vyfc4b._.js.map +1 -1
  324. package/web/.next/server/chunks/ssr/_0w-_hww._.js +1 -1
  325. package/web/.next/server/chunks/ssr/_0w-_hww._.js.map +1 -1
  326. package/web/.next/server/chunks/ssr/{_09r54oy._.js → _0ygafoy._.js} +2 -2
  327. package/web/.next/server/chunks/ssr/{_09r54oy._.js.map → _0ygafoy._.js.map} +1 -1
  328. package/web/.next/server/chunks/ssr/_0zk-h5w._.js +1 -1
  329. package/web/.next/server/chunks/ssr/_0zk-h5w._.js.map +1 -1
  330. package/web/.next/server/chunks/ssr/_0~7lwu_._.js +1 -1
  331. package/web/.next/server/chunks/ssr/_0~7lwu_._.js.map +1 -1
  332. package/web/.next/server/chunks/ssr/_10joy2y._.js +3 -0
  333. package/web/.next/server/chunks/ssr/_10joy2y._.js.map +1 -0
  334. package/web/.next/server/chunks/ssr/_1161g9x._.js +1 -1
  335. package/web/.next/server/chunks/ssr/_1161g9x._.js.map +1 -1
  336. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_plugins_page_actions_0rdndum.js +3 -0
  337. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_plugins_page_actions_0rdndum.js.map +1 -0
  338. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_skills_page_actions_05m2q~u.js +1 -1
  339. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_skills_page_actions_05m2q~u.js.map +1 -1
  340. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_tools_page_actions_0.6zk.t.js +1 -1
  341. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_tools_page_actions_0.6zk.t.js.map +1 -1
  342. package/web/.next/server/chunks/ssr/src_presentation_web_app_actions_approve-feature_ts_0pjb_re._.js +1 -1
  343. package/web/.next/server/chunks/ssr/src_presentation_web_app_actions_open-ide_ts_0w2wqvu._.js +1 -1
  344. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_0l3oxx9._.js +1 -1
  345. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_0l3oxx9._.js.map +1 -1
  346. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_tools_tools-page-client_tsx_0aji.op._.js +1 -1
  347. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_tools_tools-page-client_tsx_0aji.op._.js.map +1 -1
  348. package/web/.next/server/middleware-build-manifest.js +3 -3
  349. package/web/.next/server/next-font-manifest.js +1 -1
  350. package/web/.next/server/next-font-manifest.json +3 -0
  351. package/web/.next/server/pages/500.html +1 -1
  352. package/web/.next/server/server-reference-manifest.js +1 -1
  353. package/web/.next/server/server-reference-manifest.json +187 -61
  354. package/web/.next/static/chunks/0.s8cxri-_s9l.js +1 -0
  355. package/web/.next/static/chunks/012cnd7koqv6d.js +7 -0
  356. package/web/.next/static/chunks/{12axopx66pocj.js → 056k4f_cj86_m.js} +2 -2
  357. package/web/.next/static/chunks/{0k0j7anrbg-of.js → 05_pa1uvg8ndq.js} +3 -3
  358. package/web/.next/static/chunks/{0fg~vc93spa9c.js → 07gal-~-zwagj.js} +1 -1
  359. package/web/.next/static/chunks/{0in4l8mne5y~_.js → 0b2pi58fg3lt3.js} +1 -1
  360. package/web/.next/static/chunks/{0o33urrd3lk~u.js → 0dbuetfm_wux5.js} +1 -1
  361. package/web/.next/static/chunks/{1874_wt9rit96.js → 0dq~u_3-zgq73.js} +1 -1
  362. package/web/.next/static/chunks/{00m_fbc2z1gyi.js → 0f1m9w6~4f-.w.js} +3 -3
  363. package/web/.next/static/chunks/{0u_27fdqa2jeg.js → 0i~5fqskcb~~p.js} +1 -1
  364. package/web/.next/static/chunks/{0v~n9z6b639zm.js → 0jwq.mr-.ltps.js} +1 -1
  365. package/web/.next/static/chunks/0k8m.qcahm63g.js +1 -0
  366. package/web/.next/static/chunks/0kjqz.9e9sou2.js +1 -0
  367. package/web/.next/static/chunks/0lc0x8kcu46ae.js +1 -0
  368. package/web/.next/static/chunks/{183ehj-b80a~o.js → 0nfd9bvcnbcgl.js} +1 -1
  369. package/web/.next/static/chunks/0nnltbyg963sg.js +1 -0
  370. package/web/.next/static/chunks/0pik.2.wvg.el.js +1 -0
  371. package/web/.next/static/chunks/0r05-2~73nsxp.js +1 -0
  372. package/web/.next/static/chunks/0ug478hm-8bog.js +5 -0
  373. package/web/.next/static/chunks/{0yibymrb2j05t.css → 0v7r7y~3e~oo6.css} +1 -1
  374. package/web/.next/static/chunks/{0dq50gtgaj63f.js → 0wcqsl6fpljkf.js} +1 -1
  375. package/web/.next/static/chunks/10rtagfoabp3b.js +1 -0
  376. package/web/.next/static/chunks/112xn3.b2hrmh.js +1 -0
  377. package/web/.next/static/chunks/{11vbir.u7_zf7.js → 13mkca.j8w.7_.js} +1 -1
  378. package/web/.next/static/chunks/{121v1_d_dfk2k.js → 14ulzux4y._m-.js} +1 -1
  379. package/web/.next/server/chunks/ssr/[root-of-the-server]__0qxd563._.js +0 -3
  380. package/web/.next/server/chunks/ssr/[root-of-the-server]__0qxd563._.js.map +0 -1
  381. package/web/.next/server/chunks/ssr/[root-of-the-server]__0rvrr1j._.js.map +0 -1
  382. package/web/.next/server/chunks/ssr/_00u~.41._.js.map +0 -1
  383. package/web/.next/server/chunks/ssr/_04s_q5r._.js.map +0 -1
  384. package/web/.next/server/chunks/ssr/_0a_8rlj._.js +0 -3
  385. package/web/.next/server/chunks/ssr/_0a_8rlj._.js.map +0 -1
  386. package/web/.next/server/chunks/ssr/_0dy8.0k._.js +0 -3
  387. package/web/.next/server/chunks/ssr/_0dy8.0k._.js.map +0 -1
  388. package/web/.next/server/chunks/ssr/_0gdghcr._.js +0 -3
  389. package/web/.next/server/chunks/ssr/_0gdghcr._.js.map +0 -1
  390. package/web/.next/server/chunks/ssr/_0hw~zvl._.js.map +0 -1
  391. package/web/.next/server/chunks/ssr/_0l2~~pi._.js +0 -3
  392. package/web/.next/server/chunks/ssr/_0l2~~pi._.js.map +0 -1
  393. package/web/.next/server/chunks/ssr/_0n.magx._.js +0 -3
  394. package/web/.next/server/chunks/ssr/_0n.magx._.js.map +0 -1
  395. package/web/.next/server/chunks/ssr/_0pa1dkv._.js.map +0 -1
  396. package/web/.next/server/chunks/ssr/_0y8u4.e._.js +0 -9
  397. package/web/.next/server/chunks/ssr/_0y8u4.e._.js.map +0 -1
  398. package/web/.next/server/chunks/ssr/_0~0jkp_._.js.map +0 -1
  399. package/web/.next/static/chunks/0-ud~1jj7chzu.js +0 -7
  400. package/web/.next/static/chunks/09f2lesd_dd3~.js +0 -1
  401. package/web/.next/static/chunks/0c0dau5pmseko.js +0 -1
  402. package/web/.next/static/chunks/0n3kuj7t_-jzp.js +0 -1
  403. package/web/.next/static/chunks/0pt-d18f7zxvv.js +0 -1
  404. package/web/.next/static/chunks/0xwh.0u-dexsl.js +0 -1
  405. package/web/.next/static/chunks/103xnw203o9k1.js +0 -1
  406. package/web/.next/static/chunks/12pd180jp8zu..js +0 -5
  407. package/web/.next/static/chunks/13fcwhkw7dle2.js +0 -1
  408. package/web/.next/static/chunks/13q1peb_t9vj8.js +0 -1
  409. /package/web/.next/server/chunks/{[root-of-the-server]__0zu_byw._.js.map → [root-of-the-server]__07suer1._.js.map} +0 -0
  410. /package/web/.next/server/chunks/{[root-of-the-server]__0u1jyv9._.js.map → [root-of-the-server]__0sgzo7y._.js.map} +0 -0
  411. /package/web/.next/server/chunks/{[root-of-the-server]__08cpfre._.js.map → [root-of-the-server]__0uxlr84._.js.map} +0 -0
  412. /package/web/.next/static/{SNdaKJ9fpre8tUMRe1jlA → W6C3cWcub-2kZuXP7c21j}/_buildManifest.js +0 -0
  413. /package/web/.next/static/{SNdaKJ9fpre8tUMRe1jlA → W6C3cWcub-2kZuXP7c21j}/_clientMiddlewareManifest.js +0 -0
  414. /package/web/.next/static/{SNdaKJ9fpre8tUMRe1jlA → W6C3cWcub-2kZuXP7c21j}/_ssgManifest.js +0 -0
@@ -1,3 +1,3 @@
1
- module.exports=[79020,a=>{"use strict";var b=a.i(53083),c=a.i(11321),d=a.i(87638),e=a.i(8685),f=a.i(37545),g=a.i(51423),h=a.i(97624);let i=(0,h.default)("bell",[["path",{d:"M10.268 21a2 2 0 0 0 3.464 0",key:"vwvbt9"}],["path",{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",key:"11g9vi"}]]),j=(0,h.default)("flag",[["path",{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",key:"1jaruq"}]]),k=(0,h.default)("database",[["ellipse",{cx:"12",cy:"5",rx:"9",ry:"3",key:"msslwz"}],["path",{d:"M3 5V19A9 3 0 0 0 21 19V5",key:"1wlel7"}],["path",{d:"M3 12A9 3 0 0 0 21 12",key:"mv7ke4"}]]);var l=a.i(69210),m=a.i(73952);let n=(0,h.default)("layout-grid",[["rect",{width:"7",height:"7",x:"3",y:"3",rx:"1",key:"1g98yp"}],["rect",{width:"7",height:"7",x:"14",y:"3",rx:"1",key:"6d4xhi"}],["rect",{width:"7",height:"7",x:"14",y:"14",rx:"1",key:"nxv5o0"}],["rect",{width:"7",height:"7",x:"3",y:"14",rx:"1",key:"1bb6yr"}]]),o=(0,h.default)("layout-list",[["rect",{width:"7",height:"7",x:"3",y:"3",rx:"1",key:"1g98yp"}],["rect",{width:"7",height:"7",x:"3",y:"14",rx:"1",key:"1bb6yr"}],["path",{d:"M14 4h7",key:"3xa0d5"}],["path",{d:"M14 9h7",key:"1icrd9"}],["path",{d:"M14 15h7",key:"1mj8o2"}],["path",{d:"M14 20h7",key:"11slyb"}]]);a.i(98617);var p=a.i(50040),q=a.i(85536),r=a.i(61781),s=a.i(49853),s=s,t=a.i(29370),u=a.i(2),v=a.i(77612),w=a.i(58860),x=a.i(96867),y=a.i(82934);function z({label:a,description:c,htmlFor:d,tooltip:e,children:f}){let g=e??c;return(0,b.jsxs)("div",{className:"flex items-center justify-between gap-4 border-b py-2.5 last:border-b-0",children:[(0,b.jsxs)("div",{className:"min-w-0",children:[(0,b.jsxs)("span",{className:"flex items-center gap-1.5",children:[(0,b.jsx)(w.Label,{htmlFor:d,className:"cursor-pointer text-sm font-normal whitespace-nowrap",children:a}),g?(0,b.jsxs)(y.Tooltip,{children:[(0,b.jsx)(y.TooltipTrigger,{asChild:!0,children:(0,b.jsx)(v.Info,{className:"text-muted-foreground/40 hover:text-muted-foreground h-3.5 w-3.5 shrink-0 cursor-help transition-colors"})}),(0,b.jsx)(y.TooltipContent,{side:"top",className:"max-w-64 text-[11px] leading-relaxed",children:(0,b.jsx)("span",{className:"text-muted-foreground",children:g})})]}):null]}),c?(0,b.jsx)("p",{className:"text-muted-foreground text-[11px] leading-tight",children:c}):null]}),(0,b.jsx)("div",{className:"flex shrink-0 items-center gap-2",children:f})]})}function A({label:a,description:c,id:d,testId:e,checked:f,onChange:g,disabled:h,tooltip:i}){return(0,b.jsx)(z,{label:a,description:c,htmlFor:d,tooltip:i,children:(0,b.jsx)(x.Switch,{id:d,"data-testid":e,checked:f,onCheckedChange:g,disabled:h,className:(0,q.cn)("cursor-pointer",h&&"cursor-not-allowed opacity-50")})})}function B({icon:a,title:c,description:d,badge:e,testId:f,tooltip:g,tooltipLinks:h,children:i}){return(0,b.jsxs)("div",{className:"bg-background rounded-lg border","data-testid":f,children:[(0,b.jsxs)("div",{className:"bg-muted/30 border-b px-4 py-3",children:[(0,b.jsxs)("div",{className:"flex items-center gap-2",children:[(0,b.jsx)(a,{className:"text-muted-foreground h-3.5 w-3.5"}),(0,b.jsx)("h2",{className:"text-sm font-semibold",children:c}),g?(0,b.jsxs)(y.Tooltip,{children:[(0,b.jsx)(y.TooltipTrigger,{asChild:!0,children:(0,b.jsx)(v.Info,{className:"text-muted-foreground/40 hover:text-muted-foreground h-3.5 w-3.5 shrink-0 cursor-help transition-colors"})}),(0,b.jsxs)(y.TooltipContent,{side:"bottom",className:"max-w-72 text-[11px] leading-relaxed",children:[(0,b.jsx)("p",{className:"text-muted-foreground",children:g}),null!=h&&h.length>0?(0,b.jsx)("div",{className:"border-border/50 mt-1.5 flex flex-col gap-0.5 border-t pt-1.5",children:h.map(a=>(0,b.jsxs)("a",{href:a.href,target:"_blank",rel:"noopener noreferrer",className:"text-muted-foreground hover:text-foreground inline-flex items-center gap-1.5 text-[10px] tracking-wide transition-colors",children:[(0,b.jsx)(u.ExternalLink,{className:"h-2.5 w-2.5 shrink-0 opacity-50"}),a.label]},a.href))}):null]})]}):null,e?(0,b.jsx)("span",{className:"bg-muted text-muted-foreground rounded px-1.5 py-0.5 text-[9px] font-medium tracking-wider uppercase",children:e}):null]}),(0,b.jsx)("p",{className:"text-muted-foreground mt-0.5 text-[11px]",children:d})]}),(0,b.jsx)("div",{className:"px-4",children:i})]})}function C({id:a,testId:c,value:d,onChange:e,onBlur:f,placeholder:g,min:h=1,max:i,step:j=1,suffix:k}){let{t:l}=(0,p.useTranslation)("web"),m=""===d?void 0:parseInt(d,10);return(0,b.jsxs)("div",{className:"flex items-center gap-1.5",children:[(0,b.jsxs)("div",{className:"flex items-center overflow-hidden rounded-md border",children:[(0,b.jsx)("button",{type:"button",onClick:()=>{e(String(Math.max(h,(m??parseInt(g,10))-j)))},onMouseUp:f,className:"text-muted-foreground hover:bg-muted hover:text-foreground flex h-8 w-7 cursor-pointer items-center justify-center border-r transition-colors","aria-label":l("common.decrease"),children:(0,b.jsx)(s.default,{className:"h-3 w-3"})}),(0,b.jsx)("input",{id:a,"data-testid":c,type:"text",inputMode:"numeric",pattern:"[0-9]*",value:d,placeholder:g,onChange:a=>{e(a.target.value.replace(/[^0-9]/g,""))},onBlur:f,className:"h-8 w-14 bg-transparent text-center text-xs outline-none"}),(0,b.jsx)("button",{type:"button",onClick:()=>{let a;a=m??parseInt(g,10),e(String(null!=i?Math.min(i,a+j):a+j))},onMouseUp:f,className:"text-muted-foreground hover:bg-muted hover:text-foreground flex h-8 w-7 cursor-pointer items-center justify-center border-l transition-colors","aria-label":l("common.increase"),children:(0,b.jsx)(t.Plus,{className:"h-3 w-3"})})]}),k?(0,b.jsx)("span",{className:"text-muted-foreground text-[11px]",children:k}):null]})}function D({children:a}){return(0,b.jsx)("div",{className:"border-b pt-3 pb-1",children:(0,b.jsx)("span",{className:"text-muted-foreground text-[10px] font-semibold tracking-wider uppercase",children:a})})}function E({settings:a}){let{t:e}=(0,p.useTranslation)("web"),[f,g]=(0,c.useState)(a.agent.type);return(0,b.jsx)(B,{icon:d.Bot,title:e("settings.agent.sectionTitle"),description:e("settings.agent.sectionDescription"),testId:"agent-settings-section",tooltip:e("settings.agent.hint"),tooltipLinks:[{label:e("settings.agent.links.agentSystem"),href:"https://github.com/jrmatherly/shipit/blob/main/docs/architecture/agent-system.md"},{label:e("settings.agent.links.addingAgents"),href:"https://github.com/jrmatherly/shipit/blob/main/docs/development/adding-agents.md"},{label:e("settings.agent.links.configurationGuide"),href:"https://github.com/jrmatherly/shipit/blob/main/docs/guides/configuration.md"}],children:(0,b.jsx)(z,{label:e("settings.agent.agentAndModel"),description:e("settings.agent.agentAndModelDescription"),tooltip:"Changing the agent switches which AI CLI tool runs your features. Each agent has different capabilities, speed, and cost tradeoffs.",htmlFor:"agent-model-picker",children:(0,b.jsx)(r.AgentModelPicker,{initialAgentType:f,initialModel:a.models.default,mode:"settings",onAgentModelChange:a=>g(a),className:"w-55"})})})}var F=a.i(52313),G=a.i(59175),H=a.i(58339),I=a.i(6120);let J=(0,I.createServerReference)("40626395fdbd03cc2884689ad7981dc6afc4df989e",I.callServer,void 0,I.findSourceMapURL,"updateSettingsAction");var K=a.i(46847),L=a.i(7077),M=a.i(11036),N=a.i(96436);function O(a){return(0,b.jsx)(M.Code,{className:(0,q.cn)("h-4 w-4",a.className),...a})}function P({className:a}){return(0,b.jsx)(L.default,{src:"/icons/editors/vscode.svg",alt:"VS Code",width:24,height:24,className:(0,q.cn)("rounded-sm object-contain",a)})}function Q({className:a}){return(0,b.jsx)(L.default,{src:"/icons/agents/cursor.jpeg",alt:"Cursor",width:24,height:24,className:(0,q.cn)("rounded-sm object-contain",a)})}function R({className:a}){return(0,b.jsx)(L.default,{src:"/icons/editors/windsurf.svg",alt:"Windsurf",width:24,height:24,className:(0,q.cn)("rounded-sm object-contain",a)})}function S({className:a}){return(0,b.jsx)(L.default,{src:"/icons/editors/zed.svg",alt:"Zed",width:24,height:24,className:(0,q.cn)("rounded-sm object-contain",a)})}function T({className:a,...c}){return(0,b.jsx)(N.Rocket,{className:(0,q.cn)("h-4 w-4",a),...c})}P.displayName="VsCodeIcon",Q.displayName="CursorEditorIcon",R.displayName="WindsurfIcon",S.displayName="ZedIcon",T.displayName="AntigravityIcon";let U={vscode:P,cursor:Q,windsurf:R,zed:S,antigravity:T},V=[{id:"vscode",name:"VS Code",available:!0},{id:"cursor",name:"Cursor",available:!0},{id:"windsurf",name:"Windsurf",available:!0},{id:"zed",name:"Zed",available:!0},{id:"antigravity",name:"Antigravity",available:!0}],W=[{id:"bash",name:"Bash",available:!0},{id:"zsh",name:"Zsh",available:!0},{id:"fish",name:"Fish",available:!0}];function X({settings:a,availableEditors:d,availableShells:f,availableTerminals:g}){let{t:h}=(0,p.useTranslation)("web"),[,i]=(0,c.useTransition)(),[j,k]=(0,c.useState)(a.environment.defaultEditor),[l,m]=(0,c.useState)(a.environment.shellPreference),[n,o]=(0,c.useState)(a.environment.terminalPreference??K.TerminalType.System),r=g??[{id:K.TerminalType.System,name:h("settings.environment.systemTerminal"),available:!0}];function s(a){i(async()=>{let b=await J(a);b.success||F.toast.error(b.error??h("settings.failedToSave"))})}return(0,b.jsxs)(B,{icon:e.Terminal,title:h("settings.environment.sectionTitle"),description:h("settings.environment.sectionDescription"),testId:"environment-settings-section",tooltip:h("settings.environment.hint"),tooltipLinks:[{label:h("settings.environment.links.configurationGuide"),href:"https://github.com/jrmatherly/shipit/blob/main/docs/guides/configuration.md"}],children:[(0,b.jsx)(z,{label:h("settings.environment.defaultEditor"),description:h("settings.environment.defaultEditorDescription"),tooltip:"The editor that opens when you click 'Launch' on a tool card or when ShipIT needs to open a file for review.",htmlFor:"default-editor",children:(0,b.jsxs)(G.Select,{value:j,onValueChange:a=>{k(a),s({environment:{defaultEditor:a,shellPreference:l,terminalPreference:n}})},children:[(0,b.jsx)(G.SelectTrigger,{id:"default-editor","data-testid":"editor-select",className:"w-64 cursor-pointer text-xs",children:(0,b.jsx)(G.SelectValue,{})}),(0,b.jsx)(G.SelectContent,{children:(d??V).map(a=>{var c;let d=(c=a.id)&&c in U?U[c]:O;return(0,b.jsx)(G.SelectItem,{value:a.id,disabled:!a.available,children:(0,b.jsxs)("span",{className:"flex items-center gap-2 text-xs",children:[(0,b.jsx)(d,{className:"h-4 w-4 shrink-0"}),a.name,(0,b.jsx)(H.Badge,{variant:"outline",className:(0,q.cn)("ml-auto px-1.5 py-0 text-[10px] leading-4 font-normal",a.available?"border-emerald-500/30 text-emerald-500":"border-muted-foreground/30 text-muted-foreground"),children:a.available?"Installed":"Not Installed"})]})},a.id)})})]})}),(0,b.jsx)(z,{label:h("settings.environment.shell"),description:h("settings.environment.shellDescription"),tooltip:"Controls which shell runs generated scripts like install commands and git operations. Match this to your daily driver shell.",htmlFor:"shell-preference",children:(0,b.jsxs)(G.Select,{value:l,onValueChange:a=>{m(a),s({environment:{defaultEditor:j,shellPreference:a,terminalPreference:n}})},children:[(0,b.jsx)(G.SelectTrigger,{id:"shell-preference","data-testid":"shell-select",className:"w-64 cursor-pointer text-xs",children:(0,b.jsx)(G.SelectValue,{})}),(0,b.jsx)(G.SelectContent,{children:(f??W).map(a=>(0,b.jsx)(G.SelectItem,{value:a.id,disabled:!a.available,children:(0,b.jsxs)("span",{className:"flex items-center gap-2 text-xs",children:[a.name,(0,b.jsx)(H.Badge,{variant:"outline",className:(0,q.cn)("ml-auto px-1.5 py-0 text-[10px] leading-4 font-normal",a.available?"border-emerald-500/30 text-emerald-500":"border-muted-foreground/30 text-muted-foreground"),children:a.available?"Installed":"Not Installed"})]})},a.id))})]})}),(0,b.jsx)(z,{label:h("settings.environment.terminal"),description:h("settings.environment.terminalDescription"),tooltip:"The terminal emulator launched when opening shell sessions from the web UI. Only affects web-launched terminals, not CLI usage.",htmlFor:"terminal-preference",children:(0,b.jsxs)(G.Select,{value:n,onValueChange:a=>{o(a),s({environment:{defaultEditor:j,shellPreference:l,terminalPreference:a}})},children:[(0,b.jsx)(G.SelectTrigger,{id:"terminal-preference","data-testid":"terminal-select",className:"w-64 cursor-pointer text-xs",children:(0,b.jsx)(G.SelectValue,{})}),(0,b.jsx)(G.SelectContent,{children:r.map(a=>(0,b.jsx)(G.SelectItem,{value:a.id,disabled:!a.available,children:(0,b.jsxs)("span",{className:"flex items-center gap-2 text-xs",children:[a.name,(0,b.jsx)(H.Badge,{variant:"outline",className:(0,q.cn)("ml-auto px-1.5 py-0 text-[10px] leading-4 font-normal",a.available?"border-emerald-500/30 text-emerald-500":"border-muted-foreground/30 text-muted-foreground"),children:a.available?"Installed":"Not Installed"})]})},a.id))})]})})]})}function Y(a,b={}){let c=b.autoArchiveEnabled??a.autoArchiveEnabled,d=parseInt(b.autoArchiveDelay??a.autoArchiveDelay,10);return{workflow:{openPrOnImplementationComplete:b.openPr??a.openPr,approvalGateDefaults:{pushOnImplementationComplete:b.pushOnComplete??a.pushOnComplete,allowPrd:b.allowPrd??a.allowPrd,allowPlan:b.allowPlan??a.allowPlan,allowMerge:b.allowMerge??a.allowMerge},enableEvidence:b.enableEvidence??a.enableEvidence,commitEvidence:b.commitEvidence??a.commitEvidence,ciWatchEnabled:b.ciWatchEnabled??a.ciWatchEnabled,defaultFastMode:b.defaultFastMode??a.defaultFastMode,autoArchiveDelayMinutes:c?Number.isNaN(d)||d<1?10:d:0}}}function Z({settings:a}){let{t:d}=(0,p.useTranslation)("web"),[,e]=(0,c.useTransition)(),[g,h]=(0,c.useState)(a.workflow.openPrOnImplementationComplete),[i,j]=(0,c.useState)(a.workflow.approvalGateDefaults.pushOnImplementationComplete),[k,l]=(0,c.useState)(a.workflow.approvalGateDefaults.allowPrd),[m,n]=(0,c.useState)(a.workflow.approvalGateDefaults.allowPlan),[o,q]=(0,c.useState)(a.workflow.approvalGateDefaults.allowMerge),[r,s]=(0,c.useState)(a.workflow.enableEvidence),[t,u]=(0,c.useState)(a.workflow.commitEvidence),[v,w]=(0,c.useState)(!1!==a.workflow.ciWatchEnabled),[x,y]=(0,c.useState)(!1!==a.workflow.defaultFastMode),[E,G]=(0,c.useState)((a.workflow.autoArchiveDelayMinutes??10)>0),[H,I]=(0,c.useState)(String(a.workflow.autoArchiveDelayMinutes??10));function K(){return{openPr:g,pushOnComplete:i,allowPrd:k,allowPlan:m,allowMerge:o,enableEvidence:r,commitEvidence:t,ciWatchEnabled:v,defaultFastMode:x,autoArchiveEnabled:E,autoArchiveDelay:H}}function L(a){e(async()=>{let b=await J(a);b.success||F.toast.error(b.error??d("settings.failedToSave"))})}return(0,b.jsxs)(B,{icon:f.GitBranch,title:d("settings.workflow.title"),description:d("settings.workflow.sectionDescription"),testId:"workflow-settings-section",tooltip:d("settings.workflow.hint"),tooltipLinks:[{label:d("settings.workflow.links.approvalGates"),href:"https://github.com/jrmatherly/shipit/blob/main/specs/016-hitl-approval-gates/spec.yaml"},{label:d("settings.workflow.links.pushAndPrFlags"),href:"https://github.com/jrmatherly/shipit/blob/main/specs/037-feature-pr-push-flags/spec.yaml"}],children:[(0,b.jsx)(A,{label:d("settings.workflow.defaultFastMode"),description:d("settings.workflow.defaultFastModeDescription"),tooltip:"When enabled, new features skip the PRD and Plan phases and go straight to implementation. Useful for quick fixes, risky for complex features.",id:"default-fast-mode",testId:"switch-default-fast-mode",checked:x,onChange:a=>{y(a),L(Y(K(),{defaultFastMode:a}))}}),(0,b.jsx)(D,{children:d("settings.workflow.subsections.approve")}),(0,b.jsx)(A,{label:d("settings.workflow.autoApprovePrd"),description:d("settings.workflow.autoApprovePrdDescription"),tooltip:"Automatically approves the requirements document without pausing for your review. Saves time but you lose the chance to refine requirements before planning.",id:"allow-prd",testId:"switch-allow-prd",checked:k,onChange:a=>{l(a),L(Y(K(),{allowPrd:a}))}}),(0,b.jsx)(A,{label:d("settings.workflow.autoApprovePlan"),description:d("settings.workflow.autoApprovePlanDescription"),tooltip:"Automatically approves the implementation plan. The agent proceeds to coding without waiting for your plan review.",id:"allow-plan",testId:"switch-allow-plan",checked:m,onChange:a=>{n(a),L(Y(K(),{allowPlan:a}))}}),(0,b.jsx)(A,{label:d("settings.workflow.autoApproveMerge"),description:d("settings.workflow.autoApproveMergeDescription"),tooltip:"Automatically merges the PR after implementation without requiring your final review. Use with caution on production branches.",id:"allow-merge",testId:"switch-allow-merge",checked:o,onChange:a=>{q(a),L(Y(K(),{allowMerge:a}))}}),(0,b.jsx)(D,{children:d("settings.workflow.subsections.evidence")}),(0,b.jsx)(A,{label:d("settings.workflow.collectEvidence"),description:d("settings.workflow.collectEvidenceDescription"),tooltip:"Captures screenshots and test outputs during implementation as proof of work. Useful for audit trails and PR documentation.",id:"enable-evidence",testId:"switch-enable-evidence",checked:r,onChange:a=>{s(a),a?L(Y(K(),{enableEvidence:a})):(u(!1),L(Y(K(),{enableEvidence:a,commitEvidence:!1})))}}),(0,b.jsx)(A,{label:d("settings.workflow.addEvidenceToPr"),description:d("settings.workflow.addEvidenceToPrDescription"),tooltip:"Attaches collected evidence artifacts (screenshots, logs) directly to the pull request description.",id:"commit-evidence",testId:"switch-commit-evidence",checked:t,disabled:!r||!g,onChange:a=>{u(a),L(Y(K(),{commitEvidence:a}))}}),(0,b.jsx)(D,{children:d("settings.workflow.subsections.git")}),(0,b.jsx)(A,{label:d("settings.workflow.pushOnComplete"),description:d("settings.workflow.pushOnCompleteDescription"),tooltip:"Automatically pushes the implementation branch to the remote repository when the agent finishes coding.",id:"push-on-complete",testId:"switch-push-on-complete",checked:i,onChange:a=>{j(a),L(Y(K(),{pushOnComplete:a}))}}),(0,b.jsx)(A,{label:d("settings.workflow.openPrOnComplete"),description:d("settings.workflow.openPrOnCompleteDescription"),tooltip:"Creates a pull request automatically after pushing. Combined with push-on-complete, this fully automates the delivery pipeline.",id:"open-pr",testId:"switch-open-pr",checked:g,onChange:a=>{h(a),a?L(Y(K(),{openPr:a})):(u(!1),L(Y(K(),{openPr:a,commitEvidence:!1})))}}),(0,b.jsx)(A,{label:d("settings.workflow.watchCiAfterPush"),description:d("settings.workflow.watchCiAfterPushDescription"),tooltip:"Monitors CI/CD pipeline status after pushing and can attempt fixes if tests fail. Disable if you prefer to handle CI failures manually.",id:"ci-watch-enabled",testId:"switch-ci-watch-enabled",checked:v,onChange:a=>{w(a),L(Y(K(),{ciWatchEnabled:a}))}}),(0,b.jsx)(D,{children:"Archive"}),(0,b.jsx)(A,{label:"Auto-archive completed",description:"Automatically archive features after they reach the completed state",tooltip:"Automatically archives features from the control center canvas after they reach the completed state, keeping the board clean.",id:"auto-archive-enabled",testId:"switch-auto-archive-enabled",checked:E,onChange:a=>{G(a),L(Y(K(),{autoArchiveEnabled:a}))}}),(0,b.jsx)(z,{label:"Archive delay",description:"Minutes to wait after completion before archiving (1-1440)",tooltip:"How long to wait after a feature completes before archiving it. Gives you time to review results before the feature moves off the board.",htmlFor:"auto-archive-delay",children:(0,b.jsx)(C,{id:"auto-archive-delay",testId:"input-auto-archive-delay",value:H,placeholder:"10",min:1,max:1440,suffix:"min",onChange:a=>{I(a)},onBlur:()=>{if(!E)return;let a=parseInt(H,10),b=Number.isNaN(a)?10:Math.min(1440,Math.max(1,a));I(String(b)),L(Y(K(),{autoArchiveDelay:String(b)}))}})})]})}function $(a){if(""===a)return;let b=parseInt(a,10);return Number.isNaN(b)||b<=0?void 0:b}function _({settings:a}){let{t:d}=(0,p.useTranslation)("web"),[,e]=(0,c.useTransition)(),[f,h]=(0,c.useState)(null!=a.workflow.ciMaxFixAttempts?String(a.workflow.ciMaxFixAttempts):""),[i,j]=(0,c.useState)(null!=a.workflow.ciWatchTimeoutMs?String(Math.round(a.workflow.ciWatchTimeoutMs/1e3)):""),[k,l]=(0,c.useState)(null!=a.workflow.ciLogMaxChars?String(a.workflow.ciLogMaxChars):""),[m,n]=(0,c.useState)(null!=a.workflow.ciWatchPollIntervalSeconds?String(a.workflow.ciWatchPollIntervalSeconds):""),[o,q]=(0,c.useState)(!1!==a.workflow.hideCiStatus),r=null!=a.workflow.ciMaxFixAttempts?String(a.workflow.ciMaxFixAttempts):"",s=null!=a.workflow.ciWatchTimeoutMs?String(Math.round(a.workflow.ciWatchTimeoutMs/1e3)):"",t=null!=a.workflow.ciLogMaxChars?String(a.workflow.ciLogMaxChars):"",u=null!=a.workflow.ciWatchPollIntervalSeconds?String(a.workflow.ciWatchPollIntervalSeconds):"";function v(a){e(async()=>{let b=await J(a);b.success||F.toast.error(b.error??d("settings.failedToSave"))})}function w(a){let b=$(a.ciTimeout??i);return{workflow:{ciMaxFixAttempts:$(a.ciMaxFix??f),ciWatchTimeoutMs:null!=b?1e3*b:void 0,ciLogMaxChars:$(a.ciLogMax??k),ciWatchPollIntervalSeconds:$(a.ciPollInterval??m),hideCiStatus:a.hideCiStatus??o}}}return(0,b.jsxs)(B,{icon:g.Activity,title:d("settings.ci.title"),description:d("settings.ci.description"),testId:"ci-settings-section",tooltip:d("settings.ci.hint"),tooltipLinks:[{label:d("settings.ci.links.cicdPipeline"),href:"https://github.com/jrmatherly/shipit/blob/main/docs/development/cicd.md"},{label:d("settings.ci.links.ciSecurityGates"),href:"https://github.com/jrmatherly/shipit/blob/main/specs/003-cicd-security-gates/spec.md"}],children:[(0,b.jsx)(z,{label:d("settings.ci.maxFixAttempts"),description:d("settings.ci.maxFixAttemptsDescription"),tooltip:"How many times the agent will attempt to fix failing CI checks before giving up. Higher values increase the chance of auto-resolution but consume more agent time and API calls.",htmlFor:"ci-max-fix",children:(0,b.jsx)(C,{id:"ci-max-fix",testId:"ci-max-fix-input",placeholder:"3",value:f,onChange:h,onBlur:()=>{f!==r&&v(w({ciMaxFix:f}))},min:1,max:10})}),(0,b.jsx)(z,{label:d("settings.ci.watchTimeout"),description:d("settings.ci.watchTimeoutDescription"),tooltip:"Maximum time the agent will wait for CI to finish. If CI hasn't completed within this window, the agent stops watching. Increase for repos with slow CI pipelines.",htmlFor:"ci-timeout",children:(0,b.jsx)(C,{id:"ci-timeout",testId:"ci-timeout-input",placeholder:"300",value:i,onChange:j,onBlur:()=>{i!==s&&v(w({ciTimeout:i}))},min:30,step:30,suffix:"sec"})}),(0,b.jsx)(z,{label:d("settings.ci.maxLogSize"),description:d("settings.ci.maxLogSizeDescription"),tooltip:"CI logs beyond this character limit are truncated before being sent to the agent for analysis. Keeps agent context focused and avoids excessive token usage.",htmlFor:"ci-log-max",children:(0,b.jsx)(C,{id:"ci-log-max",testId:"ci-log-max-input",placeholder:"50000",value:k,onChange:l,onBlur:()=>{k!==t&&v(w({ciLogMax:k}))},min:1e3,step:5e3,suffix:"chars"})}),(0,b.jsx)(z,{label:d("settings.ci.pollInterval"),description:d("settings.ci.pollIntervalDescription"),tooltip:"How frequently the agent checks GitHub for CI status updates. Lower values give faster feedback but increase API call volume.",htmlFor:"ci-poll-interval",children:(0,b.jsx)(C,{id:"ci-poll-interval",testId:"ci-poll-interval-input",placeholder:"30",value:m,onChange:n,onBlur:()=>{m!==u&&v(w({ciPollInterval:m}))},min:5,step:5,suffix:"sec"})}),(0,b.jsx)(A,{label:d("settings.ci.hideCiStatus"),description:d("settings.ci.hideCiStatusDescription"),tooltip:"When enabled, CI status indicators are hidden from the feature drawer and merge review panels. Useful if you monitor CI through GitHub directly.",id:"hide-ci-status",testId:"switch-hide-ci-status",checked:o,onChange:a=>{q(a),v(w({hideCiStatus:a}))}})]})}var aa=a.i(48972),ab=a.i(59653),ac=a.i(80303),ad=a.i(95819),ae=a.i(47427),af=a.i(60380),ag=a.i(41387),ah=a.i(97045),ai=a.i(30419),aj=a.i(69471),ak=["PageUp","PageDown"],al=["ArrowUp","ArrowDown","ArrowLeft","ArrowRight"],am={"from-left":["Home","PageDown","ArrowDown","ArrowLeft"],"from-right":["Home","PageDown","ArrowDown","ArrowRight"],"from-bottom":["Home","PageDown","ArrowDown","ArrowLeft"],"from-top":["Home","PageDown","ArrowUp","ArrowLeft"]},an="Slider",[ao,ap,aq]=(0,aj.createCollection)(an),[ar,as]=(0,ad.createContextScope)(an,[aq]),[at,au]=ar(an),av=c.forwardRef((a,d)=>{let{name:e,min:f=0,max:g=100,step:h=1,orientation:i="horizontal",disabled:j=!1,minStepsBetweenThumbs:k=0,defaultValue:l=[f],value:m,onValueChange:n=()=>{},onValueCommit:o=()=>{},inverted:p=!1,form:q,...r}=a,s=c.useRef(new Set),t=c.useRef(0),u="horizontal"===i,[v=[],w]=(0,ae.useControllableState)({prop:m,defaultProp:l,onChange:a=>{let b=[...s.current];b[t.current]?.focus(),n(a)}}),x=c.useRef(v);function y(a,b,{commit:c}={commit:!1}){let d,e=(String(h).split(".")[1]||"").length,i=Math.round((Math.round((a-f)/h)*h+f)*(d=Math.pow(10,e)))/d,j=(0,aa.clamp)(i,[f,g]);w((a=[])=>{let d=function(a=[],b,c){let d=[...a];return d[c]=b,d.sort((a,b)=>a-b)}(a,j,b);if(!function(a,b){if(b>0)return Math.min(...a.slice(0,-1).map((b,c)=>a[c+1]-b))>=b;return!0}(d,k*h))return a;{t.current=d.indexOf(j);let b=String(d)!==String(a);return b&&c&&o(d),b?d:a}})}return(0,b.jsx)(at,{scope:a.__scopeSlider,name:e,disabled:j,min:f,max:g,valueIndexToChangeRef:t,thumbs:s.current,values:v,orientation:i,form:q,children:(0,b.jsx)(ao.Provider,{scope:a.__scopeSlider,children:(0,b.jsx)(ao.Slot,{scope:a.__scopeSlider,children:(0,b.jsx)(u?ay:az,{"aria-disabled":j,"data-disabled":j?"":void 0,...r,ref:d,onPointerDown:(0,ab.composeEventHandlers)(r.onPointerDown,()=>{j||(x.current=v)}),min:f,max:g,inverted:p,onSlideStart:j?void 0:function(a){let b=function(a,b){if(1===a.length)return 0;let c=a.map(a=>Math.abs(a-b)),d=Math.min(...c);return c.indexOf(d)}(v,a);y(a,b)},onSlideMove:j?void 0:function(a){y(a,t.current)},onSlideEnd:j?void 0:function(){let a=x.current[t.current];v[t.current]!==a&&o(v)},onHomeKeyDown:()=>!j&&y(f,0,{commit:!0}),onEndKeyDown:()=>!j&&y(g,v.length-1,{commit:!0}),onStepKeyDown:({event:a,direction:b})=>{if(!j){let c=ak.includes(a.key)||a.shiftKey&&al.includes(a.key),d=t.current;y(v[d]+h*(c?10:1)*b,d,{commit:!0})}}})})})})});av.displayName=an;var[aw,ax]=ar(an,{startEdge:"left",endEdge:"right",size:"width",direction:1}),ay=c.forwardRef((a,d)=>{let{min:e,max:f,dir:g,inverted:h,onSlideStart:i,onSlideMove:j,onSlideEnd:k,onStepKeyDown:l,...m}=a,[n,o]=c.useState(null),p=(0,ac.useComposedRefs)(d,a=>o(a)),q=c.useRef(void 0),r=(0,af.useDirection)(g),s="ltr"===r,t=s&&!h||!s&&h;function u(a){let b=q.current||n.getBoundingClientRect(),c=aK([0,b.width],t?[e,f]:[f,e]);return q.current=b,c(a-b.left)}return(0,b.jsx)(aw,{scope:a.__scopeSlider,startEdge:t?"left":"right",endEdge:t?"right":"left",direction:t?1:-1,size:"width",children:(0,b.jsx)(aA,{dir:r,"data-orientation":"horizontal",...m,ref:p,style:{...m.style,"--radix-slider-thumb-transform":"translateX(-50%)"},onSlideStart:a=>{let b=u(a.clientX);i?.(b)},onSlideMove:a=>{let b=u(a.clientX);j?.(b)},onSlideEnd:()=>{q.current=void 0,k?.()},onStepKeyDown:a=>{let b=am[t?"from-left":"from-right"].includes(a.key);l?.({event:a,direction:b?-1:1})}})})}),az=c.forwardRef((a,d)=>{let{min:e,max:f,inverted:g,onSlideStart:h,onSlideMove:i,onSlideEnd:j,onStepKeyDown:k,...l}=a,m=c.useRef(null),n=(0,ac.useComposedRefs)(d,m),o=c.useRef(void 0),p=!g;function q(a){let b=o.current||m.current.getBoundingClientRect(),c=aK([0,b.height],p?[f,e]:[e,f]);return o.current=b,c(a-b.top)}return(0,b.jsx)(aw,{scope:a.__scopeSlider,startEdge:p?"bottom":"top",endEdge:p?"top":"bottom",size:"height",direction:p?1:-1,children:(0,b.jsx)(aA,{"data-orientation":"vertical",...l,ref:n,style:{...l.style,"--radix-slider-thumb-transform":"translateY(50%)"},onSlideStart:a=>{let b=q(a.clientY);h?.(b)},onSlideMove:a=>{let b=q(a.clientY);i?.(b)},onSlideEnd:()=>{o.current=void 0,j?.()},onStepKeyDown:a=>{let b=am[p?"from-bottom":"from-top"].includes(a.key);k?.({event:a,direction:b?-1:1})}})})}),aA=c.forwardRef((a,c)=>{let{__scopeSlider:d,onSlideStart:e,onSlideMove:f,onSlideEnd:g,onHomeKeyDown:h,onEndKeyDown:i,onStepKeyDown:j,...k}=a,l=au(an,d);return(0,b.jsx)(ai.Primitive.span,{...k,ref:c,onKeyDown:(0,ab.composeEventHandlers)(a.onKeyDown,a=>{"Home"===a.key?(h(a),a.preventDefault()):"End"===a.key?(i(a),a.preventDefault()):ak.concat(al).includes(a.key)&&(j(a),a.preventDefault())}),onPointerDown:(0,ab.composeEventHandlers)(a.onPointerDown,a=>{let b=a.target;b.setPointerCapture(a.pointerId),a.preventDefault(),l.thumbs.has(b)?b.focus():e(a)}),onPointerMove:(0,ab.composeEventHandlers)(a.onPointerMove,a=>{a.target.hasPointerCapture(a.pointerId)&&f(a)}),onPointerUp:(0,ab.composeEventHandlers)(a.onPointerUp,a=>{let b=a.target;b.hasPointerCapture(a.pointerId)&&(b.releasePointerCapture(a.pointerId),g(a))})})}),aB="SliderTrack",aC=c.forwardRef((a,c)=>{let{__scopeSlider:d,...e}=a,f=au(aB,d);return(0,b.jsx)(ai.Primitive.span,{"data-disabled":f.disabled?"":void 0,"data-orientation":f.orientation,...e,ref:c})});aC.displayName=aB;var aD="SliderRange",aE=c.forwardRef((a,d)=>{let{__scopeSlider:e,...f}=a,g=au(aD,e),h=ax(aD,e),i=c.useRef(null),j=(0,ac.useComposedRefs)(d,i),k=g.values.length,l=g.values.map(a=>aJ(a,g.min,g.max)),m=k>1?Math.min(...l):0,n=100-Math.max(...l);return(0,b.jsx)(ai.Primitive.span,{"data-orientation":g.orientation,"data-disabled":g.disabled?"":void 0,...f,ref:j,style:{...a.style,[h.startEdge]:m+"%",[h.endEdge]:n+"%"}})});aE.displayName=aD;var aF="SliderThumb",aG=c.forwardRef((a,d)=>{let e=ap(a.__scopeSlider),[f,g]=c.useState(null),h=(0,ac.useComposedRefs)(d,a=>g(a)),i=c.useMemo(()=>f?e().findIndex(a=>a.ref.current===f):-1,[e,f]);return(0,b.jsx)(aH,{...a,ref:h,index:i})}),aH=c.forwardRef((a,d)=>{var e,f,g,h,i;let j,k,{__scopeSlider:l,index:m,name:n,...o}=a,p=au(aF,l),q=ax(aF,l),[r,s]=c.useState(null),t=(0,ac.useComposedRefs)(d,a=>s(a)),u=!r||p.form||!!r.closest("form"),v=(0,ah.useSize)(r),w=p.values[m],x=void 0===w?0:aJ(w,p.min,p.max),y=(e=m,(f=p.values.length)>2?`Value ${e+1} of ${f}`:2===f?["Minimum","Maximum"][e]:void 0),z=v?.[q.size],A=z?(g=z,h=x,i=q.direction,k=aK([0,50],[0,j=g/2]),(j-k(h)*i)*i):0;return c.useEffect(()=>{if(r)return p.thumbs.add(r),()=>{p.thumbs.delete(r)}},[r,p.thumbs]),(0,b.jsxs)("span",{style:{transform:"var(--radix-slider-thumb-transform)",position:"absolute",[q.startEdge]:`calc(${x}% + ${A}px)`},children:[(0,b.jsx)(ao.ItemSlot,{scope:a.__scopeSlider,children:(0,b.jsx)(ai.Primitive.span,{role:"slider","aria-label":a["aria-label"]||y,"aria-valuemin":p.min,"aria-valuenow":w,"aria-valuemax":p.max,"aria-orientation":p.orientation,"data-orientation":p.orientation,"data-disabled":p.disabled?"":void 0,tabIndex:p.disabled?void 0:0,...o,ref:t,style:void 0===w?{display:"none"}:a.style,onFocus:(0,ab.composeEventHandlers)(a.onFocus,()=>{p.valueIndexToChangeRef.current=m})})}),u&&(0,b.jsx)(aI,{name:n??(p.name?p.name+(p.values.length>1?"[]":""):void 0),form:p.form,value:w},m)]})});aG.displayName=aF;var aI=c.forwardRef(({__scopeSlider:a,value:d,...e},f)=>{let g=c.useRef(null),h=(0,ac.useComposedRefs)(g,f),i=(0,ag.usePrevious)(d);return c.useEffect(()=>{let a=g.current;if(!a)return;let b=Object.getOwnPropertyDescriptor(window.HTMLInputElement.prototype,"value").set;if(i!==d&&b){let c=new Event("input",{bubbles:!0});b.call(a,d),a.dispatchEvent(c)}},[i,d]),(0,b.jsx)(ai.Primitive.input,{style:{display:"none"},...e,ref:h,defaultValue:d})});function aJ(a,b,c){return(0,aa.clamp)(100/(c-b)*(a-b),[0,100])}function aK(a,b){return c=>{if(a[0]===a[1]||b[0]===b[1])return b[0];let d=(b[1]-b[0])/(a[1]-a[0]);return b[0]+d*(c-a[0])}}aI.displayName="RadioBubbleInput",a.s(["Range",0,aE,"Root",0,av,"Slider",0,av,"SliderRange",0,aE,"SliderThumb",0,aG,"SliderTrack",0,aC,"Thumb",0,aG,"Track",0,aC,"createSliderScope",0,as],40432);var aL=a.i(40432),aL=aL;function aM({className:a,defaultValue:d,value:e,min:f=0,max:g=100,...h}){let i=c.useMemo(()=>Array.isArray(e)?e:Array.isArray(d)?d:[f,g],[e,d,f,g]);return(0,b.jsxs)(aL.Root,{"data-slot":"slider",defaultValue:d,value:e,min:f,max:g,className:(0,q.cn)("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",a),...h,children:[(0,b.jsx)(aL.Track,{"data-slot":"slider-track",className:(0,q.cn)("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"),children:(0,b.jsx)(aL.Range,{"data-slot":"slider-range",className:(0,q.cn)("bg-primary absolute data-[orientation=horizontal]:h-full data-[orientation=vertical]:w-full")})}),Array.from({length:i.length},(a,c)=>(0,b.jsx)(aL.Thumb,{"data-slot":"slider-thumb",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"},c))]})}let aN=[60,120,300,600,900,1800,2700,3600,7200,10800,14400,21600,28800,43200,86400],aO=aN.length-1;function aP(a){let b=0,c=Math.abs(a-aN[0]);for(let d=1;d<aN.length;d++){let e=Math.abs(a-aN[d]);e<c&&(c=e,b=d)}return b}function aQ({id:a,testId:d,value:e,onChange:f,onBlur:g,defaultSeconds:h=1800}){var i;let j,k,l=(""===e?h:parseInt(e,10))||h,[m,n]=(0,c.useState)(()=>aP(l)),o=aP(l);o!==m&&aN[m]!==l&&n(o);let p=(0,c.useCallback)(([a])=>{n(a),f(String(aN[a]))},[f]);return(0,b.jsxs)("div",{className:"flex w-55 items-center gap-2",children:[(0,b.jsx)(aM,{id:a,"data-testid":d,min:0,max:aO,step:1,value:[m],onValueChange:p,onValueCommit:()=>g(),className:"min-w-0 flex-1"}),(0,b.jsx)("span",{className:"text-muted-foreground shrink-0 text-end text-xs tabular-nums",children:(j=Math.floor((i=aN[m])/3600),k=Math.round(i%3600/60),0===j?`${k}m`:0===k?`${j}h`:`${j}h ${k}m`)})]})}function aR(a){if(void 0===a)return;let b=function(a){if(""===a)return;let b=parseInt(a,10);return Number.isNaN(b)||b<=0?void 0:b}(a);return null!=b?1e3*b:void 0}function aS({settings:a}){let{t:d}=(0,p.useTranslation)("web"),[,e]=(0,c.useTransition)(),f=a.workflow.stageTimeouts,g=a.workflow.analyzeRepoTimeouts,[h,i]=(0,c.useState)(String(Math.round((f?.analyzeMs??18e5)/1e3))),[j,k]=(0,c.useState)(String(Math.round((f?.requirementsMs??18e5)/1e3))),[m,n]=(0,c.useState)(String(Math.round((f?.researchMs??18e5)/1e3))),[o,q]=(0,c.useState)(String(Math.round((f?.planMs??18e5)/1e3))),[r,s]=(0,c.useState)(String(Math.round((f?.implementMs??18e5)/1e3))),[t,u]=(0,c.useState)(String(Math.round((f?.mergeMs??18e5)/1e3))),[v,w]=(0,c.useState)(String(Math.round((g?.analyzeMs??6e5)/1e3))),x=f?.analyzeMs!=null?String(Math.round(f.analyzeMs/1e3)):"",y=f?.requirementsMs!=null?String(Math.round(f.requirementsMs/1e3)):"",A=f?.researchMs!=null?String(Math.round(f.researchMs/1e3)):"",C=f?.planMs!=null?String(Math.round(f.planMs/1e3)):"",E=f?.implementMs!=null?String(Math.round(f.implementMs/1e3)):"",G=f?.mergeMs!=null?String(Math.round(f.mergeMs/1e3)):"",H=g?.analyzeMs!=null?String(Math.round(g.analyzeMs/1e3)):"";function I(a){return{workflow:{stageTimeouts:{analyzeMs:aR(a.analyzeTimeout??h),requirementsMs:aR(a.requirementsTimeout??j),researchMs:aR(a.researchTimeout??m),planMs:aR(a.planTimeout??o),implementMs:aR(a.implementTimeout??r),mergeMs:aR(a.mergeTimeout??t)},analyzeRepoTimeouts:{analyzeMs:aR(a.analyzeRepoTimeout??v)}}}}function K(a){e(async()=>{let b=await J(a);b.success||F.toast.error(b.error??d("settings.failedToSave"))})}return(0,b.jsxs)(B,{icon:l.Timer,title:d("settings.stageTimeouts.title"),description:d("settings.stageTimeouts.description"),testId:"stage-timeouts-settings-section",tooltip:d("settings.stageTimeouts.hint"),children:[(0,b.jsx)(D,{children:d("settings.stageTimeouts.subsections.featureAgent")}),(0,b.jsx)(z,{label:d("settings.stageTimeouts.analyze"),description:d("settings.stageTimeouts.analyzeDescription"),htmlFor:"timeout-analyze",children:(0,b.jsx)(aQ,{id:"timeout-analyze",testId:"timeout-analyze-input",value:h,onChange:i,onBlur:()=>{h!==x&&K(I({analyzeTimeout:h}))},defaultSeconds:1800})}),(0,b.jsx)(z,{label:d("settings.stageTimeouts.requirements"),description:d("settings.stageTimeouts.requirementsDescription"),htmlFor:"timeout-requirements",children:(0,b.jsx)(aQ,{id:"timeout-requirements",testId:"timeout-requirements-input",value:j,onChange:k,onBlur:()=>{j!==y&&K(I({requirementsTimeout:j}))},defaultSeconds:1800})}),(0,b.jsx)(z,{label:d("settings.stageTimeouts.research"),description:d("settings.stageTimeouts.researchDescription"),htmlFor:"timeout-research",children:(0,b.jsx)(aQ,{id:"timeout-research",testId:"timeout-research-input",value:m,onChange:n,onBlur:()=>{m!==A&&K(I({researchTimeout:m}))},defaultSeconds:1800})}),(0,b.jsx)(z,{label:d("settings.stageTimeouts.plan"),description:d("settings.stageTimeouts.planDescription"),htmlFor:"timeout-plan",children:(0,b.jsx)(aQ,{id:"timeout-plan",testId:"timeout-plan-input",value:o,onChange:q,onBlur:()=>{o!==C&&K(I({planTimeout:o}))},defaultSeconds:1800})}),(0,b.jsx)(z,{label:d("settings.stageTimeouts.implement"),description:d("settings.stageTimeouts.implementDescription"),htmlFor:"timeout-implement",children:(0,b.jsx)(aQ,{id:"timeout-implement",testId:"timeout-implement-input",value:r,onChange:s,onBlur:()=>{r!==E&&K(I({implementTimeout:r}))},defaultSeconds:1800})}),(0,b.jsx)(z,{label:d("settings.stageTimeouts.merge"),description:d("settings.stageTimeouts.mergeDescription"),htmlFor:"timeout-merge",children:(0,b.jsx)(aQ,{id:"timeout-merge",testId:"timeout-merge-input",value:t,onChange:u,onBlur:()=>{t!==G&&K(I({mergeTimeout:t}))},defaultSeconds:1800})}),(0,b.jsx)(D,{children:d("settings.stageTimeouts.subsections.analyzeRepoAgent")}),(0,b.jsx)(z,{label:d("settings.stageTimeouts.analyze"),description:d("settings.stageTimeouts.analyzeDescription"),htmlFor:"timeout-analyze-repo",children:(0,b.jsx)(aQ,{id:"timeout-analyze-repo",testId:"timeout-analyze-repo-input",value:v,onChange:w,onBlur:()=>{v!==H&&K(I({analyzeRepoTimeout:v}))},defaultSeconds:600})})]})}function aT({settings:a}){let{t:d}=(0,p.useTranslation)("web"),[,e]=(0,c.useTransition)(),[f,g]=(0,c.useState)(a.notifications.inApp.enabled),[h,j]=(0,c.useState)({...a.notifications.events});function k(a){e(async()=>{let b=await J(a);b.success||F.toast.error(b.error??d("settings.failedToSave"))})}function l(a={}){return{notifications:{inApp:{enabled:a.inApp??f},events:a.events??h}}}return(0,b.jsxs)(B,{icon:i,title:d("settings.notifications.title"),description:d("settings.notifications.sectionDescription"),testId:"notification-settings-section",tooltip:d("settings.notifications.hint"),tooltipLinks:[{label:d("settings.notifications.links.notificationSystem"),href:"https://github.com/jrmatherly/shipit/blob/main/specs/021-agent-notifications/spec.yaml"}],children:[(0,b.jsx)(D,{children:d("settings.notifications.channels")}),(0,b.jsx)(A,{label:d("settings.notifications.inAppLabel"),description:d("settings.notifications.inAppDescription"),tooltip:"Master toggle for in-app toast notifications. When disabled, no event toasts will appear regardless of individual event settings below.",id:"notif-in-app",testId:"switch-in-app",checked:f,onChange:a=>{g(a),k(l({inApp:a}))}}),(0,b.jsx)(D,{children:d("settings.notifications.subsections.agentEvents")}),(0,b.jsx)(A,{label:d("settings.notifications.events.agentStarted"),tooltip:"Controls whether you receive an in-app toast notification when an agent begins working on a feature.",id:"notif-event-agentStarted",testId:"switch-event-agentStarted",checked:h.agentStarted,onChange:a=>{let b={...h,agentStarted:a};j(b),k(l({events:b}))}}),(0,b.jsx)(A,{label:d("settings.notifications.events.phaseCompleted"),tooltip:"Controls whether you receive an in-app toast notification when an agent completes a workflow phase (e.g., requirements, planning, implementation).",id:"notif-event-phaseCompleted",testId:"switch-event-phaseCompleted",checked:h.phaseCompleted,onChange:a=>{let b={...h,phaseCompleted:a};j(b),k(l({events:b}))}}),(0,b.jsx)(A,{label:d("settings.notifications.events.waitingApproval"),tooltip:"Controls whether you receive an in-app toast notification when a feature is paused and waiting for your approval to continue.",id:"notif-event-waitingApproval",testId:"switch-event-waitingApproval",checked:h.waitingApproval,onChange:a=>{let b={...h,waitingApproval:a};j(b),k(l({events:b}))}}),(0,b.jsx)(A,{label:d("settings.notifications.events.agentCompleted"),tooltip:"Controls whether you receive an in-app toast notification when an agent finishes all work on a feature successfully.",id:"notif-event-agentCompleted",testId:"switch-event-agentCompleted",checked:h.agentCompleted,onChange:a=>{let b={...h,agentCompleted:a};j(b),k(l({events:b}))}}),(0,b.jsx)(A,{label:d("settings.notifications.events.agentFailed"),tooltip:"Controls whether you receive an in-app toast notification when an agent encounters an error and stops working on a feature.",id:"notif-event-agentFailed",testId:"switch-event-agentFailed",checked:h.agentFailed,onChange:a=>{let b={...h,agentFailed:a};j(b),k(l({events:b}))}}),(0,b.jsx)(D,{children:d("settings.notifications.subsections.pullRequestEvents")}),(0,b.jsx)(A,{label:d("settings.notifications.events.prMerged"),tooltip:"Controls whether you receive an in-app toast notification when a feature's pull request is merged into the target branch.",id:"notif-event-prMerged",testId:"switch-event-prMerged",checked:h.prMerged,onChange:a=>{let b={...h,prMerged:a};j(b),k(l({events:b}))}}),(0,b.jsx)(A,{label:d("settings.notifications.events.prClosed"),tooltip:"Controls whether you receive an in-app toast notification when a feature's pull request is closed without merging.",id:"notif-event-prClosed",testId:"switch-event-prClosed",checked:h.prClosed,onChange:a=>{let b={...h,prClosed:a};j(b),k(l({events:b}))}}),(0,b.jsx)(A,{label:d("settings.notifications.events.prChecksPassed"),tooltip:"Controls whether you receive an in-app toast notification when all CI checks pass on a feature's pull request.",id:"notif-event-prChecksPassed",testId:"switch-event-prChecksPassed",checked:h.prChecksPassed,onChange:a=>{let b={...h,prChecksPassed:a};j(b),k(l({events:b}))}}),(0,b.jsx)(A,{label:d("settings.notifications.events.prChecksFailed"),tooltip:"Controls whether you receive an in-app toast notification when CI checks fail on a feature's pull request.",id:"notif-event-prChecksFailed",testId:"switch-event-prChecksFailed",checked:h.prChecksFailed,onChange:a=>{let b={...h,prChecksFailed:a};j(b),k(l({events:b}))}}),(0,b.jsx)(A,{label:d("settings.notifications.events.prBlocked"),tooltip:"Controls whether you receive an in-app toast notification when a pull request is blocked by merge conflicts or branch protection rules.",id:"notif-event-prBlocked",testId:"switch-event-prBlocked",checked:h.prBlocked,onChange:a=>{let b={...h,prBlocked:a};j(b),k(l({events:b}))}}),(0,b.jsx)(A,{label:d("settings.notifications.events.mergeReviewReady"),tooltip:"Controls whether you receive an in-app toast notification when a feature's PR passes all checks and is ready for your merge review.",id:"notif-event-mergeReviewReady",testId:"switch-event-mergeReviewReady",checked:h.mergeReviewReady,onChange:a=>{let b={...h,mergeReviewReady:a};j(b),k(l({events:b}))}})]})}function aU({settings:a}){let{t:d}=(0,p.useTranslation)("web"),[,e]=(0,c.useTransition)(),f=a.featureFlags??{skills:!1,envDeploy:!1,debug:!1,githubImport:!1,adoptBranch:!1,gitRebaseSync:!1,reactFileManager:!1},[g,h]=(0,c.useState)({...f});function i(a){e(async()=>{let b=await J(a);b.success||F.toast.error(b.error??d("settings.failedToSave"))})}return(0,b.jsxs)(B,{icon:j,title:d("settings.featureFlags.title"),description:d("settings.featureFlags.sectionDescription"),badge:d("settings.featureFlags.badge"),testId:"feature-flags-settings-section",tooltip:d("settings.featureFlags.hint"),children:[(0,b.jsx)(A,{label:d("settings.featureFlags.skills"),description:d("settings.featureFlags.skillsDescription"),tooltip:"Enables the Skills page in the sidebar for browsing and managing Claude Code skills.",id:"flag-skills",testId:"switch-flag-skills",checked:g.skills,onChange:a=>{let b={...g,skills:a};h(b),i({featureFlags:b})}}),(0,b.jsx)(A,{label:d("settings.featureFlags.deployments"),description:d("settings.featureFlags.deploymentsDescription"),tooltip:"Enables experimental deployment features for environment management.",id:"flag-envDeploy",testId:"switch-flag-envDeploy",checked:g.envDeploy,onChange:a=>{let b={...g,envDeploy:a};h(b),i({featureFlags:b})}}),(0,b.jsx)(A,{label:d("settings.featureFlags.debug"),description:d("settings.featureFlags.debugDescription"),tooltip:"Shows additional debugging information in the UI for troubleshooting.",id:"flag-debug",testId:"switch-flag-debug",checked:g.debug,onChange:a=>{let b={...g,debug:a};h(b),i({featureFlags:b})}}),(0,b.jsx)(A,{label:d("settings.featureFlags.githubImport"),description:d("settings.featureFlags.githubImportDescription"),tooltip:"Enables importing repositories directly from GitHub.",id:"flag-githubImport",testId:"switch-flag-githubImport",checked:g.githubImport,onChange:a=>{let b={...g,githubImport:a};h(b),i({featureFlags:b})}}),(0,b.jsx)(A,{label:d("settings.featureFlags.adoptBranch"),description:d("settings.featureFlags.adoptBranchDescription"),tooltip:"Enables adopting existing git branches as ShipIT features.",id:"flag-adoptBranch",testId:"switch-flag-adoptBranch",checked:g.adoptBranch,onChange:a=>{let b={...g,adoptBranch:a};h(b),i({featureFlags:b})}}),(0,b.jsx)(A,{label:d("settings.featureFlags.gitRebaseSync"),description:d("settings.featureFlags.gitRebaseSyncDescription"),tooltip:"Uses git rebase instead of merge when syncing feature branches with the upstream branch.",id:"flag-gitRebaseSync",testId:"switch-flag-gitRebaseSync",checked:g.gitRebaseSync,onChange:a=>{let b={...g,gitRebaseSync:a};h(b),i({featureFlags:b})}}),(0,b.jsx)(A,{label:d("settings.featureFlags.reactFileManager"),description:d("settings.featureFlags.reactFileManagerDescription"),tooltip:"Replaces the native file picker dialog with a React-based file browser for selecting project folders.",id:"flag-reactFileManager",testId:"switch-flag-reactFileManager",checked:g.reactFileManager,onChange:a=>{let b={...g,reactFileManager:a};h(b),i({featureFlags:b})}})]})}function aV({settings:a}){let{t:d}=(0,p.useTranslation)("web"),[,e]=(0,c.useTransition)(),f=a.interactiveAgent??{enabled:!0,autoTimeoutMinutes:15,maxConcurrentSessions:3},[g,h]=(0,c.useState)(f.enabled),[i,j]=(0,c.useState)(String(f.autoTimeoutMinutes)),[k,l]=(0,c.useState)(String(f.maxConcurrentSessions));function n(a){e(async()=>{let b=await J(a);b.success||F.toast.error(b.error??d("settings.failedToSave"))})}return(0,b.jsxs)(B,{icon:m.MessageSquare,title:d("settings.interactiveAgent.title"),description:d("settings.interactiveAgent.description"),testId:"interactive-agent-settings-section",tooltip:d("settings.interactiveAgent.hint"),children:[(0,b.jsx)(A,{label:d("settings.interactiveAgent.enableChatTab"),description:d("settings.interactiveAgent.enableChatTabDescription"),tooltip:"Shows or hides the Chat tab on feature detail pages. When enabled, you can have interactive conversations with the agent about a specific feature.",id:"interactive-agent-enabled",testId:"switch-interactive-agent-enabled",checked:g,onChange:a=>{h(a),n({interactiveAgent:{enabled:a,autoTimeoutMinutes:parseInt(i,10)||15,maxConcurrentSessions:parseInt(k,10)||3}})}}),(0,b.jsx)(z,{label:d("settings.interactiveAgent.autoTimeout"),description:d("settings.interactiveAgent.autoTimeoutDescription"),tooltip:"Minutes of inactivity before a chat agent session is automatically terminated. Prevents idle agent processes from consuming resources indefinitely.",htmlFor:"interactive-agent-timeout",children:(0,b.jsx)(C,{id:"interactive-agent-timeout",testId:"input-interactive-agent-timeout",value:i,placeholder:"15",min:1,max:120,suffix:"min",onChange:j,onBlur:()=>{let a=parseInt(i,10),b=Number.isNaN(a)?15:Math.min(120,Math.max(1,a));j(String(b)),n({interactiveAgent:{enabled:g,autoTimeoutMinutes:b,maxConcurrentSessions:parseInt(k,10)||3}})}})}),(0,b.jsx)(z,{label:d("settings.interactiveAgent.maxConcurrentSessions"),description:d("settings.interactiveAgent.maxConcurrentSessionsDescription"),tooltip:"Maximum number of interactive agent sessions that can run simultaneously. Each session spawns a separate agent process, so higher values use more CPU and memory.",htmlFor:"interactive-agent-sessions",children:(0,b.jsx)(C,{id:"interactive-agent-sessions",testId:"input-interactive-agent-sessions",value:k,placeholder:"3",min:1,max:10,onChange:l,onBlur:()=>{let a=parseInt(k,10),b=Number.isNaN(a)?3:Math.min(10,Math.max(1,a));l(String(b)),n({interactiveAgent:{enabled:g,autoTimeoutMinutes:parseInt(i,10)||15,maxConcurrentSessions:b}})}})})]})}function aW({settings:a}){let{t:d}=(0,p.useTranslation)("web"),[,e]=(0,c.useTransition)(),f=a.fabLayout??{swapPosition:!1},[g,h]=(0,c.useState)(f.swapPosition);return(0,b.jsx)(B,{icon:n,title:d("settings.fabLayout.title"),description:d("settings.fabLayout.description"),testId:"fab-layout-settings-section",tooltip:d("settings.fabLayout.hint"),children:(0,b.jsx)(A,{label:d("settings.fabLayout.swapPosition"),description:d("settings.fabLayout.swapPositionDescription"),tooltip:"Swaps the Create button (bottom-right) and Chat button (bottom-left) positions on the control center canvas.",id:"fab-swap-position",testId:"switch-fab-swap-position",checked:g,onChange:a=>{var b;h(a),b={fabLayout:{swapPosition:a}},e(async()=>{let a=await J(b);a.success||F.toast.error(a.error??d("settings.failedToSave"))})}})})}function aX({shipitAiHome:a,dbFileSize:c}){let{t:d}=(0,p.useTranslation)("web");return(0,b.jsxs)(B,{icon:k,title:d("settings.database.title"),description:d("settings.database.sectionDescription"),testId:"database-settings-section",tooltip:d("settings.database.hint"),tooltipLinks:[{label:d("settings.database.links.settingsService"),href:"https://github.com/jrmatherly/shipit/blob/main/docs/architecture/settings-service.md"},{label:d("settings.database.links.settingsSpec"),href:"https://github.com/jrmatherly/shipit/blob/main/specs/005-global-settings-service/spec.md"}],children:[(0,b.jsx)(z,{label:d("settings.database.location"),description:d("settings.database.locationDescription"),tooltip:"The directory where ShipIT stores its SQLite database, logs, and configuration files. Change this via the SHIPIT_AI_HOME environment variable.",children:(0,b.jsx)("span",{className:"text-muted-foreground max-w-50 truncate font-mono text-xs","data-testid":"shipit-ai-home-path",children:a})}),(0,b.jsx)(z,{label:d("settings.database.size"),tooltip:"Current size of the SQLite database file on disk. Large databases may slow down startup; consider archiving old features if this grows significantly.",children:(0,b.jsx)("span",{className:"text-muted-foreground text-xs","data-testid":"db-file-size",children:c})})]})}let aY=[{id:"agent",labelKey:"settings.sections.agent",icon:d.Bot},{id:"environment",labelKey:"settings.sections.environment",icon:e.Terminal},{id:"workflow",labelKey:"settings.sections.workflow",icon:f.GitBranch},{id:"ci",labelKey:"settings.sections.ci",icon:g.Activity},{id:"stage-timeouts",labelKey:"settings.sections.timeouts",icon:l.Timer},{id:"notifications",labelKey:"settings.sections.notifications",icon:i},{id:"feature-flags",labelKey:"settings.sections.flags",icon:j},{id:"interactive-agent",labelKey:"settings.sections.chat",icon:m.MessageSquare},{id:"fab-layout",labelKey:"settings.sections.layout",icon:n},{id:"database",labelKey:"settings.sections.database",icon:k}],aZ=[{id:"all",labelKey:"settings.sections.all",icon:o},...aY];a.s(["SettingsPageClient",0,function({settings:a,shipitAiHome:d,dbFileSize:e,availableTerminals:f,availableEditors:g,availableShells:h}){let{t:i}=(0,p.useTranslation)("web"),[j,k]=(0,c.useState)("all"),[l,m]=(0,c.useState)("agent");return(0,c.useEffect)(()=>{if("all"!==j)return;let a=aY.map(a=>document.getElementById(`section-${a.id}`)).filter(Boolean);if(0===a.length)return;let b=new IntersectionObserver(a=>{for(let b of a)b.isIntersecting&&m(b.target.id.replace("section-",""))},{rootMargin:"-65px 0px -60% 0px",threshold:0});for(let c of a)b.observe(c);return()=>b.disconnect()},[j]),(0,b.jsxs)("div",{"data-testid":"settings-page-client",className:"max-w-5xl px-8 pt-8",children:[(0,b.jsxs)("div",{className:"bg-background/95 supports-backdrop-filter:bg-background/80 sticky top-0 z-10 pb-4 backdrop-blur",children:[(0,b.jsxs)("div",{className:"mb-4 space-y-1.5",children:[(0,b.jsx)("span",{className:"text-[10px] font-bold tracking-[0.2em] text-slate-400 uppercase",children:"Developer Portal"}),(0,b.jsx)("div",{className:"flex items-baseline gap-3",children:(0,b.jsx)("h1",{className:"text-foreground text-3xl font-black tracking-tight",children:i("settings.title")})})]}),(0,b.jsx)("nav",{className:"bg-card editorial-shadow flex flex-wrap items-center gap-0.5 rounded-lg p-1",children:aZ.map(a=>{let c=a.icon,d=j===a.id||"all"===j&&"all"!==a.id&&l===a.id;return(0,b.jsxs)("button",{type:"button",onClick:()=>k(a.id),className:(0,q.cn)("flex cursor-pointer items-center gap-1 rounded-md px-2 py-1.5 text-[11px] font-bold transition-all",d?"bg-muted text-primary shadow-sm ring-1 ring-slate-200/70 dark:ring-slate-700/50":"text-muted-foreground hover:text-foreground hover:bg-accent/50"),children:[(0,b.jsx)(c,{className:"h-3 w-3"}),(0,b.jsx)("span",{className:"hidden sm:inline",children:i(a.labelKey)})]},a.id)})})]}),(0,b.jsxs)("div",{className:"flex flex-col gap-3",children:[("all"===j||"agent"===j)&&(0,b.jsx)("div",{id:"section-agent",className:"scroll-mt-18 rounded-lg",children:(0,b.jsx)(E,{settings:a})}),("all"===j||"environment"===j)&&(0,b.jsx)("div",{id:"section-environment",className:"scroll-mt-18 rounded-lg",children:(0,b.jsx)(X,{settings:a,availableEditors:g,availableShells:h,availableTerminals:f})}),("all"===j||"workflow"===j)&&(0,b.jsx)("div",{id:"section-workflow",className:"scroll-mt-18 rounded-lg",children:(0,b.jsx)(Z,{settings:a})}),("all"===j||"ci"===j)&&(0,b.jsx)("div",{id:"section-ci",className:"scroll-mt-18 rounded-lg",children:(0,b.jsx)(_,{settings:a})}),("all"===j||"stage-timeouts"===j)&&(0,b.jsx)("div",{id:"section-stage-timeouts",className:"scroll-mt-18 rounded-lg",children:(0,b.jsx)(aS,{settings:a})}),("all"===j||"notifications"===j)&&(0,b.jsx)("div",{id:"section-notifications",className:"scroll-mt-18 rounded-lg",children:(0,b.jsx)(aT,{settings:a})}),("all"===j||"feature-flags"===j)&&(0,b.jsx)("div",{id:"section-feature-flags",className:"scroll-mt-18 rounded-lg",children:(0,b.jsx)(aU,{settings:a})}),("all"===j||"interactive-agent"===j)&&(0,b.jsx)("div",{id:"section-interactive-agent",className:"scroll-mt-18 rounded-lg",children:(0,b.jsx)(aV,{settings:a})}),("all"===j||"fab-layout"===j)&&(0,b.jsx)("div",{id:"section-fab-layout",className:"scroll-mt-18 rounded-lg",children:(0,b.jsx)(aW,{settings:a})}),("all"===j||"database"===j)&&(0,b.jsx)("div",{id:"section-database",className:"scroll-mt-18 rounded-lg",children:(0,b.jsx)(aX,{shipitAiHome:d,dbFileSize:e})})]})]})}],79020)}];
1
+ module.exports=[79020,a=>{"use strict";var b=a.i(53083),c=a.i(11321),d=a.i(87638),e=a.i(8685),f=a.i(37545),g=a.i(51423),h=a.i(97624);let i=(0,h.default)("bell",[["path",{d:"M10.268 21a2 2 0 0 0 3.464 0",key:"vwvbt9"}],["path",{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",key:"11g9vi"}]]),j=(0,h.default)("flag",[["path",{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",key:"1jaruq"}]]),k=(0,h.default)("database",[["ellipse",{cx:"12",cy:"5",rx:"9",ry:"3",key:"msslwz"}],["path",{d:"M3 5V19A9 3 0 0 0 21 19V5",key:"1wlel7"}],["path",{d:"M3 12A9 3 0 0 0 21 12",key:"mv7ke4"}]]);var l=a.i(69210),m=a.i(73952);let n=(0,h.default)("layout-grid",[["rect",{width:"7",height:"7",x:"3",y:"3",rx:"1",key:"1g98yp"}],["rect",{width:"7",height:"7",x:"14",y:"3",rx:"1",key:"6d4xhi"}],["rect",{width:"7",height:"7",x:"14",y:"14",rx:"1",key:"nxv5o0"}],["rect",{width:"7",height:"7",x:"3",y:"14",rx:"1",key:"1bb6yr"}]]),o=(0,h.default)("layout-list",[["rect",{width:"7",height:"7",x:"3",y:"3",rx:"1",key:"1g98yp"}],["rect",{width:"7",height:"7",x:"3",y:"14",rx:"1",key:"1bb6yr"}],["path",{d:"M14 4h7",key:"3xa0d5"}],["path",{d:"M14 9h7",key:"1icrd9"}],["path",{d:"M14 15h7",key:"1mj8o2"}],["path",{d:"M14 20h7",key:"11slyb"}]]);var p=a.i(63466);a.i(98617);var q=a.i(50040),r=a.i(85536),s=a.i(61781),t=a.i(49853),t=t,u=a.i(29370),v=a.i(2),w=a.i(77612),x=a.i(58860),y=a.i(96867),z=a.i(82934);function A({label:a,description:c,htmlFor:d,tooltip:e,children:f}){let g=e??c;return(0,b.jsxs)("div",{className:"flex items-center justify-between gap-4 border-b py-2.5 last:border-b-0",children:[(0,b.jsxs)("div",{className:"min-w-0",children:[(0,b.jsxs)("span",{className:"flex items-center gap-1.5",children:[(0,b.jsx)(x.Label,{htmlFor:d,className:"cursor-pointer text-sm font-normal whitespace-nowrap",children:a}),g?(0,b.jsxs)(z.Tooltip,{children:[(0,b.jsx)(z.TooltipTrigger,{asChild:!0,children:(0,b.jsx)(w.Info,{className:"text-muted-foreground/40 hover:text-muted-foreground h-3.5 w-3.5 shrink-0 cursor-help transition-colors"})}),(0,b.jsx)(z.TooltipContent,{side:"top",className:"max-w-64 text-[11px] leading-relaxed",children:(0,b.jsx)("span",{className:"text-muted-foreground",children:g})})]}):null]}),c?(0,b.jsx)("p",{className:"text-muted-foreground text-[11px] leading-tight",children:c}):null]}),(0,b.jsx)("div",{className:"flex shrink-0 items-center gap-2",children:f})]})}function B({label:a,description:c,id:d,testId:e,checked:f,onChange:g,disabled:h,tooltip:i}){return(0,b.jsx)(A,{label:a,description:c,htmlFor:d,tooltip:i,children:(0,b.jsx)(y.Switch,{id:d,"data-testid":e,checked:f,onCheckedChange:g,disabled:h,className:(0,r.cn)("cursor-pointer",h&&"cursor-not-allowed opacity-50")})})}function C({icon:a,title:c,description:d,badge:e,testId:f,tooltip:g,tooltipLinks:h,children:i}){return(0,b.jsxs)("div",{className:"bg-background rounded-lg border","data-testid":f,children:[(0,b.jsxs)("div",{className:"bg-muted/30 border-b px-4 py-3",children:[(0,b.jsxs)("div",{className:"flex items-center gap-2",children:[(0,b.jsx)(a,{className:"text-muted-foreground h-3.5 w-3.5"}),(0,b.jsx)("h2",{className:"text-sm font-semibold",children:c}),g?(0,b.jsxs)(z.Tooltip,{children:[(0,b.jsx)(z.TooltipTrigger,{asChild:!0,children:(0,b.jsx)(w.Info,{className:"text-muted-foreground/40 hover:text-muted-foreground h-3.5 w-3.5 shrink-0 cursor-help transition-colors"})}),(0,b.jsxs)(z.TooltipContent,{side:"bottom",className:"max-w-72 text-[11px] leading-relaxed",children:[(0,b.jsx)("p",{className:"text-muted-foreground",children:g}),null!=h&&h.length>0?(0,b.jsx)("div",{className:"border-border/50 mt-1.5 flex flex-col gap-0.5 border-t pt-1.5",children:h.map(a=>(0,b.jsxs)("a",{href:a.href,target:"_blank",rel:"noopener noreferrer",className:"text-muted-foreground hover:text-foreground inline-flex items-center gap-1.5 text-[10px] tracking-wide transition-colors",children:[(0,b.jsx)(v.ExternalLink,{className:"h-2.5 w-2.5 shrink-0 opacity-50"}),a.label]},a.href))}):null]})]}):null,e?(0,b.jsx)("span",{className:"bg-muted text-muted-foreground rounded px-1.5 py-0.5 text-[9px] font-medium tracking-wider uppercase",children:e}):null]}),(0,b.jsx)("p",{className:"text-muted-foreground mt-0.5 text-[11px]",children:d})]}),(0,b.jsx)("div",{className:"px-4",children:i})]})}function D({id:a,testId:c,value:d,onChange:e,onBlur:f,placeholder:g,min:h=1,max:i,step:j=1,suffix:k}){let{t:l}=(0,q.useTranslation)("web"),m=""===d?void 0:parseInt(d,10);return(0,b.jsxs)("div",{className:"flex items-center gap-1.5",children:[(0,b.jsxs)("div",{className:"flex items-center overflow-hidden rounded-md border",children:[(0,b.jsx)("button",{type:"button",onClick:()=>{e(String(Math.max(h,(m??parseInt(g,10))-j)))},onMouseUp:f,className:"text-muted-foreground hover:bg-muted hover:text-foreground flex h-8 w-7 cursor-pointer items-center justify-center border-r transition-colors","aria-label":l("common.decrease"),children:(0,b.jsx)(t.default,{className:"h-3 w-3"})}),(0,b.jsx)("input",{id:a,"data-testid":c,type:"text",inputMode:"numeric",pattern:"[0-9]*",value:d,placeholder:g,onChange:a=>{e(a.target.value.replace(/[^0-9]/g,""))},onBlur:f,className:"h-8 w-14 bg-transparent text-center text-xs outline-none"}),(0,b.jsx)("button",{type:"button",onClick:()=>{let a;a=m??parseInt(g,10),e(String(null!=i?Math.min(i,a+j):a+j))},onMouseUp:f,className:"text-muted-foreground hover:bg-muted hover:text-foreground flex h-8 w-7 cursor-pointer items-center justify-center border-l transition-colors","aria-label":l("common.increase"),children:(0,b.jsx)(u.Plus,{className:"h-3 w-3"})})]}),k?(0,b.jsx)("span",{className:"text-muted-foreground text-[11px]",children:k}):null]})}function E({children:a}){return(0,b.jsx)("div",{className:"border-b pt-3 pb-1",children:(0,b.jsx)("span",{className:"text-muted-foreground text-[10px] font-semibold tracking-wider uppercase",children:a})})}function F({settings:a}){let{t:e}=(0,q.useTranslation)("web"),[f,g]=(0,c.useState)(a.agent.type);return(0,b.jsx)(C,{icon:d.Bot,title:e("settings.agent.sectionTitle"),description:e("settings.agent.sectionDescription"),testId:"agent-settings-section",tooltip:e("settings.agent.hint"),tooltipLinks:[{label:e("settings.agent.links.agentSystem"),href:"https://github.com/jrmatherly/shipit/blob/main/docs/architecture/agent-system.md"},{label:e("settings.agent.links.addingAgents"),href:"https://github.com/jrmatherly/shipit/blob/main/docs/development/adding-agents.md"},{label:e("settings.agent.links.configurationGuide"),href:"https://github.com/jrmatherly/shipit/blob/main/docs/guides/configuration.md"}],children:(0,b.jsx)(A,{label:e("settings.agent.agentAndModel"),description:e("settings.agent.agentAndModelDescription"),tooltip:"Changing the agent switches which AI CLI tool runs your features. Each agent has different capabilities, speed, and cost tradeoffs.",htmlFor:"agent-model-picker",children:(0,b.jsx)(s.AgentModelPicker,{initialAgentType:f,initialModel:a.models.default,mode:"settings",onAgentModelChange:a=>g(a),className:"w-55"})})})}var G=a.i(52313),H=a.i(59175),I=a.i(58339),J=a.i(6120);let K=(0,J.createServerReference)("4081f3a5c7b884be8604f6a2f114f30c97c0b33276",J.callServer,void 0,J.findSourceMapURL,"updateSettingsAction");var L=a.i(46847),M=a.i(7077),N=a.i(11036),O=a.i(96436);function P(a){return(0,b.jsx)(N.Code,{className:(0,r.cn)("h-4 w-4",a.className),...a})}function Q({className:a}){return(0,b.jsx)(M.default,{src:"/icons/editors/vscode.svg",alt:"VS Code",width:24,height:24,className:(0,r.cn)("rounded-sm object-contain",a)})}function R({className:a}){return(0,b.jsx)(M.default,{src:"/icons/agents/cursor.jpeg",alt:"Cursor",width:24,height:24,className:(0,r.cn)("rounded-sm object-contain",a)})}function S({className:a}){return(0,b.jsx)(M.default,{src:"/icons/editors/windsurf.svg",alt:"Windsurf",width:24,height:24,className:(0,r.cn)("rounded-sm object-contain",a)})}function T({className:a}){return(0,b.jsx)(M.default,{src:"/icons/editors/zed.svg",alt:"Zed",width:24,height:24,className:(0,r.cn)("rounded-sm object-contain",a)})}function U({className:a,...c}){return(0,b.jsx)(O.Rocket,{className:(0,r.cn)("h-4 w-4",a),...c})}Q.displayName="VsCodeIcon",R.displayName="CursorEditorIcon",S.displayName="WindsurfIcon",T.displayName="ZedIcon",U.displayName="AntigravityIcon";let V={vscode:Q,cursor:R,windsurf:S,zed:T,antigravity:U},W=[{id:"vscode",name:"VS Code",available:!0},{id:"cursor",name:"Cursor",available:!0},{id:"windsurf",name:"Windsurf",available:!0},{id:"zed",name:"Zed",available:!0},{id:"antigravity",name:"Antigravity",available:!0}],X=[{id:"bash",name:"Bash",available:!0},{id:"zsh",name:"Zsh",available:!0},{id:"fish",name:"Fish",available:!0}];function Y({settings:a,availableEditors:d,availableShells:f,availableTerminals:g}){let{t:h}=(0,q.useTranslation)("web"),[,i]=(0,c.useTransition)(),[j,k]=(0,c.useState)(a.environment.defaultEditor),[l,m]=(0,c.useState)(a.environment.shellPreference),[n,o]=(0,c.useState)(a.environment.terminalPreference??L.TerminalType.System),p=g??[{id:L.TerminalType.System,name:h("settings.environment.systemTerminal"),available:!0}];function s(a){i(async()=>{let b=await K(a);b.success||G.toast.error(b.error??h("settings.failedToSave"))})}return(0,b.jsxs)(C,{icon:e.Terminal,title:h("settings.environment.sectionTitle"),description:h("settings.environment.sectionDescription"),testId:"environment-settings-section",tooltip:h("settings.environment.hint"),tooltipLinks:[{label:h("settings.environment.links.configurationGuide"),href:"https://github.com/jrmatherly/shipit/blob/main/docs/guides/configuration.md"}],children:[(0,b.jsx)(A,{label:h("settings.environment.defaultEditor"),description:h("settings.environment.defaultEditorDescription"),tooltip:"The editor that opens when you click 'Launch' on a tool card or when ShipIT needs to open a file for review.",htmlFor:"default-editor",children:(0,b.jsxs)(H.Select,{value:j,onValueChange:a=>{k(a),s({environment:{defaultEditor:a,shellPreference:l,terminalPreference:n}})},children:[(0,b.jsx)(H.SelectTrigger,{id:"default-editor","data-testid":"editor-select",className:"w-64 cursor-pointer text-xs",children:(0,b.jsx)(H.SelectValue,{})}),(0,b.jsx)(H.SelectContent,{children:(d??W).map(a=>{var c;let d=(c=a.id)&&c in V?V[c]:P;return(0,b.jsx)(H.SelectItem,{value:a.id,disabled:!a.available,children:(0,b.jsxs)("span",{className:"flex items-center gap-2 text-xs",children:[(0,b.jsx)(d,{className:"h-4 w-4 shrink-0"}),a.name,(0,b.jsx)(I.Badge,{variant:"outline",className:(0,r.cn)("ml-auto px-1.5 py-0 text-[10px] leading-4 font-normal",a.available?"border-emerald-500/30 text-emerald-500":"border-muted-foreground/30 text-muted-foreground"),children:a.available?"Installed":"Not Installed"})]})},a.id)})})]})}),(0,b.jsx)(A,{label:h("settings.environment.shell"),description:h("settings.environment.shellDescription"),tooltip:"Controls which shell runs generated scripts like install commands and git operations. Match this to your daily driver shell.",htmlFor:"shell-preference",children:(0,b.jsxs)(H.Select,{value:l,onValueChange:a=>{m(a),s({environment:{defaultEditor:j,shellPreference:a,terminalPreference:n}})},children:[(0,b.jsx)(H.SelectTrigger,{id:"shell-preference","data-testid":"shell-select",className:"w-64 cursor-pointer text-xs",children:(0,b.jsx)(H.SelectValue,{})}),(0,b.jsx)(H.SelectContent,{children:(f??X).map(a=>(0,b.jsx)(H.SelectItem,{value:a.id,disabled:!a.available,children:(0,b.jsxs)("span",{className:"flex items-center gap-2 text-xs",children:[a.name,(0,b.jsx)(I.Badge,{variant:"outline",className:(0,r.cn)("ml-auto px-1.5 py-0 text-[10px] leading-4 font-normal",a.available?"border-emerald-500/30 text-emerald-500":"border-muted-foreground/30 text-muted-foreground"),children:a.available?"Installed":"Not Installed"})]})},a.id))})]})}),(0,b.jsx)(A,{label:h("settings.environment.terminal"),description:h("settings.environment.terminalDescription"),tooltip:"The terminal emulator launched when opening shell sessions from the web UI. Only affects web-launched terminals, not CLI usage.",htmlFor:"terminal-preference",children:(0,b.jsxs)(H.Select,{value:n,onValueChange:a=>{o(a),s({environment:{defaultEditor:j,shellPreference:l,terminalPreference:a}})},children:[(0,b.jsx)(H.SelectTrigger,{id:"terminal-preference","data-testid":"terminal-select",className:"w-64 cursor-pointer text-xs",children:(0,b.jsx)(H.SelectValue,{})}),(0,b.jsx)(H.SelectContent,{children:p.map(a=>(0,b.jsx)(H.SelectItem,{value:a.id,disabled:!a.available,children:(0,b.jsxs)("span",{className:"flex items-center gap-2 text-xs",children:[a.name,(0,b.jsx)(I.Badge,{variant:"outline",className:(0,r.cn)("ml-auto px-1.5 py-0 text-[10px] leading-4 font-normal",a.available?"border-emerald-500/30 text-emerald-500":"border-muted-foreground/30 text-muted-foreground"),children:a.available?"Installed":"Not Installed"})]})},a.id))})]})})]})}function Z(a,b={}){let c=b.autoArchiveEnabled??a.autoArchiveEnabled,d=parseInt(b.autoArchiveDelay??a.autoArchiveDelay,10);return{workflow:{openPrOnImplementationComplete:b.openPr??a.openPr,approvalGateDefaults:{pushOnImplementationComplete:b.pushOnComplete??a.pushOnComplete,allowPrd:b.allowPrd??a.allowPrd,allowPlan:b.allowPlan??a.allowPlan,allowMerge:b.allowMerge??a.allowMerge},enableEvidence:b.enableEvidence??a.enableEvidence,commitEvidence:b.commitEvidence??a.commitEvidence,ciWatchEnabled:b.ciWatchEnabled??a.ciWatchEnabled,defaultFastMode:b.defaultFastMode??a.defaultFastMode,autoArchiveDelayMinutes:c?Number.isNaN(d)||d<1?10:d:0}}}function $({settings:a}){let{t:d}=(0,q.useTranslation)("web"),[,e]=(0,c.useTransition)(),[g,h]=(0,c.useState)(a.workflow.openPrOnImplementationComplete),[i,j]=(0,c.useState)(a.workflow.approvalGateDefaults.pushOnImplementationComplete),[k,l]=(0,c.useState)(a.workflow.approvalGateDefaults.allowPrd),[m,n]=(0,c.useState)(a.workflow.approvalGateDefaults.allowPlan),[o,p]=(0,c.useState)(a.workflow.approvalGateDefaults.allowMerge),[r,s]=(0,c.useState)(a.workflow.enableEvidence),[t,u]=(0,c.useState)(a.workflow.commitEvidence),[v,w]=(0,c.useState)(!1!==a.workflow.ciWatchEnabled),[x,y]=(0,c.useState)(!1!==a.workflow.defaultFastMode),[z,F]=(0,c.useState)((a.workflow.autoArchiveDelayMinutes??10)>0),[H,I]=(0,c.useState)(String(a.workflow.autoArchiveDelayMinutes??10));function J(){return{openPr:g,pushOnComplete:i,allowPrd:k,allowPlan:m,allowMerge:o,enableEvidence:r,commitEvidence:t,ciWatchEnabled:v,defaultFastMode:x,autoArchiveEnabled:z,autoArchiveDelay:H}}function L(a){e(async()=>{let b=await K(a);b.success||G.toast.error(b.error??d("settings.failedToSave"))})}return(0,b.jsxs)(C,{icon:f.GitBranch,title:d("settings.workflow.title"),description:d("settings.workflow.sectionDescription"),testId:"workflow-settings-section",tooltip:d("settings.workflow.hint"),tooltipLinks:[{label:d("settings.workflow.links.approvalGates"),href:"https://github.com/jrmatherly/shipit/blob/main/specs/016-hitl-approval-gates/spec.yaml"},{label:d("settings.workflow.links.pushAndPrFlags"),href:"https://github.com/jrmatherly/shipit/blob/main/specs/037-feature-pr-push-flags/spec.yaml"}],children:[(0,b.jsx)(B,{label:d("settings.workflow.defaultFastMode"),description:d("settings.workflow.defaultFastModeDescription"),tooltip:"When enabled, new features skip the PRD and Plan phases and go straight to implementation. Useful for quick fixes, risky for complex features.",id:"default-fast-mode",testId:"switch-default-fast-mode",checked:x,onChange:a=>{y(a),L(Z(J(),{defaultFastMode:a}))}}),(0,b.jsx)(E,{children:d("settings.workflow.subsections.approve")}),(0,b.jsx)(B,{label:d("settings.workflow.autoApprovePrd"),description:d("settings.workflow.autoApprovePrdDescription"),tooltip:"Automatically approves the requirements document without pausing for your review. Saves time but you lose the chance to refine requirements before planning.",id:"allow-prd",testId:"switch-allow-prd",checked:k,onChange:a=>{l(a),L(Z(J(),{allowPrd:a}))}}),(0,b.jsx)(B,{label:d("settings.workflow.autoApprovePlan"),description:d("settings.workflow.autoApprovePlanDescription"),tooltip:"Automatically approves the implementation plan. The agent proceeds to coding without waiting for your plan review.",id:"allow-plan",testId:"switch-allow-plan",checked:m,onChange:a=>{n(a),L(Z(J(),{allowPlan:a}))}}),(0,b.jsx)(B,{label:d("settings.workflow.autoApproveMerge"),description:d("settings.workflow.autoApproveMergeDescription"),tooltip:"Automatically merges the PR after implementation without requiring your final review. Use with caution on production branches.",id:"allow-merge",testId:"switch-allow-merge",checked:o,onChange:a=>{p(a),L(Z(J(),{allowMerge:a}))}}),(0,b.jsx)(E,{children:d("settings.workflow.subsections.evidence")}),(0,b.jsx)(B,{label:d("settings.workflow.collectEvidence"),description:d("settings.workflow.collectEvidenceDescription"),tooltip:"Captures screenshots and test outputs during implementation as proof of work. Useful for audit trails and PR documentation.",id:"enable-evidence",testId:"switch-enable-evidence",checked:r,onChange:a=>{s(a),a?L(Z(J(),{enableEvidence:a})):(u(!1),L(Z(J(),{enableEvidence:a,commitEvidence:!1})))}}),(0,b.jsx)(B,{label:d("settings.workflow.addEvidenceToPr"),description:d("settings.workflow.addEvidenceToPrDescription"),tooltip:"Attaches collected evidence artifacts (screenshots, logs) directly to the pull request description.",id:"commit-evidence",testId:"switch-commit-evidence",checked:t,disabled:!r||!g,onChange:a=>{u(a),L(Z(J(),{commitEvidence:a}))}}),(0,b.jsx)(E,{children:d("settings.workflow.subsections.git")}),(0,b.jsx)(B,{label:d("settings.workflow.pushOnComplete"),description:d("settings.workflow.pushOnCompleteDescription"),tooltip:"Automatically pushes the implementation branch to the remote repository when the agent finishes coding.",id:"push-on-complete",testId:"switch-push-on-complete",checked:i,onChange:a=>{j(a),L(Z(J(),{pushOnComplete:a}))}}),(0,b.jsx)(B,{label:d("settings.workflow.openPrOnComplete"),description:d("settings.workflow.openPrOnCompleteDescription"),tooltip:"Creates a pull request automatically after pushing. Combined with push-on-complete, this fully automates the delivery pipeline.",id:"open-pr",testId:"switch-open-pr",checked:g,onChange:a=>{h(a),a?L(Z(J(),{openPr:a})):(u(!1),L(Z(J(),{openPr:a,commitEvidence:!1})))}}),(0,b.jsx)(B,{label:d("settings.workflow.watchCiAfterPush"),description:d("settings.workflow.watchCiAfterPushDescription"),tooltip:"Monitors CI/CD pipeline status after pushing and can attempt fixes if tests fail. Disable if you prefer to handle CI failures manually.",id:"ci-watch-enabled",testId:"switch-ci-watch-enabled",checked:v,onChange:a=>{w(a),L(Z(J(),{ciWatchEnabled:a}))}}),(0,b.jsx)(E,{children:"Archive"}),(0,b.jsx)(B,{label:"Auto-archive completed",description:"Automatically archive features after they reach the completed state",tooltip:"Automatically archives features from the control center canvas after they reach the completed state, keeping the board clean.",id:"auto-archive-enabled",testId:"switch-auto-archive-enabled",checked:z,onChange:a=>{F(a),L(Z(J(),{autoArchiveEnabled:a}))}}),(0,b.jsx)(A,{label:"Archive delay",description:"Minutes to wait after completion before archiving (1-1440)",tooltip:"How long to wait after a feature completes before archiving it. Gives you time to review results before the feature moves off the board.",htmlFor:"auto-archive-delay",children:(0,b.jsx)(D,{id:"auto-archive-delay",testId:"input-auto-archive-delay",value:H,placeholder:"10",min:1,max:1440,suffix:"min",onChange:a=>{I(a)},onBlur:()=>{if(!z)return;let a=parseInt(H,10),b=Number.isNaN(a)?10:Math.min(1440,Math.max(1,a));I(String(b)),L(Z(J(),{autoArchiveDelay:String(b)}))}})})]})}function _(a){if(""===a)return;let b=parseInt(a,10);return Number.isNaN(b)||b<=0?void 0:b}function aa({settings:a}){let{t:d}=(0,q.useTranslation)("web"),[,e]=(0,c.useTransition)(),[f,h]=(0,c.useState)(null!=a.workflow.ciMaxFixAttempts?String(a.workflow.ciMaxFixAttempts):""),[i,j]=(0,c.useState)(null!=a.workflow.ciWatchTimeoutMs?String(Math.round(a.workflow.ciWatchTimeoutMs/1e3)):""),[k,l]=(0,c.useState)(null!=a.workflow.ciLogMaxChars?String(a.workflow.ciLogMaxChars):""),[m,n]=(0,c.useState)(null!=a.workflow.ciWatchPollIntervalSeconds?String(a.workflow.ciWatchPollIntervalSeconds):""),[o,p]=(0,c.useState)(!1!==a.workflow.hideCiStatus),r=null!=a.workflow.ciMaxFixAttempts?String(a.workflow.ciMaxFixAttempts):"",s=null!=a.workflow.ciWatchTimeoutMs?String(Math.round(a.workflow.ciWatchTimeoutMs/1e3)):"",t=null!=a.workflow.ciLogMaxChars?String(a.workflow.ciLogMaxChars):"",u=null!=a.workflow.ciWatchPollIntervalSeconds?String(a.workflow.ciWatchPollIntervalSeconds):"";function v(a){e(async()=>{let b=await K(a);b.success||G.toast.error(b.error??d("settings.failedToSave"))})}function w(a){let b=_(a.ciTimeout??i);return{workflow:{ciMaxFixAttempts:_(a.ciMaxFix??f),ciWatchTimeoutMs:null!=b?1e3*b:void 0,ciLogMaxChars:_(a.ciLogMax??k),ciWatchPollIntervalSeconds:_(a.ciPollInterval??m),hideCiStatus:a.hideCiStatus??o}}}return(0,b.jsxs)(C,{icon:g.Activity,title:d("settings.ci.title"),description:d("settings.ci.description"),testId:"ci-settings-section",tooltip:d("settings.ci.hint"),tooltipLinks:[{label:d("settings.ci.links.cicdPipeline"),href:"https://github.com/jrmatherly/shipit/blob/main/docs/development/cicd.md"},{label:d("settings.ci.links.ciSecurityGates"),href:"https://github.com/jrmatherly/shipit/blob/main/specs/003-cicd-security-gates/spec.md"}],children:[(0,b.jsx)(A,{label:d("settings.ci.maxFixAttempts"),description:d("settings.ci.maxFixAttemptsDescription"),tooltip:"How many times the agent will attempt to fix failing CI checks before giving up. Higher values increase the chance of auto-resolution but consume more agent time and API calls.",htmlFor:"ci-max-fix",children:(0,b.jsx)(D,{id:"ci-max-fix",testId:"ci-max-fix-input",placeholder:"3",value:f,onChange:h,onBlur:()=>{f!==r&&v(w({ciMaxFix:f}))},min:1,max:10})}),(0,b.jsx)(A,{label:d("settings.ci.watchTimeout"),description:d("settings.ci.watchTimeoutDescription"),tooltip:"Maximum time the agent will wait for CI to finish. If CI hasn't completed within this window, the agent stops watching. Increase for repos with slow CI pipelines.",htmlFor:"ci-timeout",children:(0,b.jsx)(D,{id:"ci-timeout",testId:"ci-timeout-input",placeholder:"300",value:i,onChange:j,onBlur:()=>{i!==s&&v(w({ciTimeout:i}))},min:30,step:30,suffix:"sec"})}),(0,b.jsx)(A,{label:d("settings.ci.maxLogSize"),description:d("settings.ci.maxLogSizeDescription"),tooltip:"CI logs beyond this character limit are truncated before being sent to the agent for analysis. Keeps agent context focused and avoids excessive token usage.",htmlFor:"ci-log-max",children:(0,b.jsx)(D,{id:"ci-log-max",testId:"ci-log-max-input",placeholder:"50000",value:k,onChange:l,onBlur:()=>{k!==t&&v(w({ciLogMax:k}))},min:1e3,step:5e3,suffix:"chars"})}),(0,b.jsx)(A,{label:d("settings.ci.pollInterval"),description:d("settings.ci.pollIntervalDescription"),tooltip:"How frequently the agent checks GitHub for CI status updates. Lower values give faster feedback but increase API call volume.",htmlFor:"ci-poll-interval",children:(0,b.jsx)(D,{id:"ci-poll-interval",testId:"ci-poll-interval-input",placeholder:"30",value:m,onChange:n,onBlur:()=>{m!==u&&v(w({ciPollInterval:m}))},min:5,step:5,suffix:"sec"})}),(0,b.jsx)(B,{label:d("settings.ci.hideCiStatus"),description:d("settings.ci.hideCiStatusDescription"),tooltip:"When enabled, CI status indicators are hidden from the feature drawer and merge review panels. Useful if you monitor CI through GitHub directly.",id:"hide-ci-status",testId:"switch-hide-ci-status",checked:o,onChange:a=>{p(a),v(w({hideCiStatus:a}))}})]})}var ab=a.i(48972),ac=a.i(59653),ad=a.i(80303),ae=a.i(95819),af=a.i(47427),ag=a.i(60380),ah=a.i(41387),ai=a.i(97045),aj=a.i(30419),ak=a.i(69471),al=["PageUp","PageDown"],am=["ArrowUp","ArrowDown","ArrowLeft","ArrowRight"],an={"from-left":["Home","PageDown","ArrowDown","ArrowLeft"],"from-right":["Home","PageDown","ArrowDown","ArrowRight"],"from-bottom":["Home","PageDown","ArrowDown","ArrowLeft"],"from-top":["Home","PageDown","ArrowUp","ArrowLeft"]},ao="Slider",[ap,aq,ar]=(0,ak.createCollection)(ao),[as,at]=(0,ae.createContextScope)(ao,[ar]),[au,av]=as(ao),aw=c.forwardRef((a,d)=>{let{name:e,min:f=0,max:g=100,step:h=1,orientation:i="horizontal",disabled:j=!1,minStepsBetweenThumbs:k=0,defaultValue:l=[f],value:m,onValueChange:n=()=>{},onValueCommit:o=()=>{},inverted:p=!1,form:q,...r}=a,s=c.useRef(new Set),t=c.useRef(0),u="horizontal"===i,[v=[],w]=(0,af.useControllableState)({prop:m,defaultProp:l,onChange:a=>{let b=[...s.current];b[t.current]?.focus(),n(a)}}),x=c.useRef(v);function y(a,b,{commit:c}={commit:!1}){let d,e=(String(h).split(".")[1]||"").length,i=Math.round((Math.round((a-f)/h)*h+f)*(d=Math.pow(10,e)))/d,j=(0,ab.clamp)(i,[f,g]);w((a=[])=>{let d=function(a=[],b,c){let d=[...a];return d[c]=b,d.sort((a,b)=>a-b)}(a,j,b);if(!function(a,b){if(b>0)return Math.min(...a.slice(0,-1).map((b,c)=>a[c+1]-b))>=b;return!0}(d,k*h))return a;{t.current=d.indexOf(j);let b=String(d)!==String(a);return b&&c&&o(d),b?d:a}})}return(0,b.jsx)(au,{scope:a.__scopeSlider,name:e,disabled:j,min:f,max:g,valueIndexToChangeRef:t,thumbs:s.current,values:v,orientation:i,form:q,children:(0,b.jsx)(ap.Provider,{scope:a.__scopeSlider,children:(0,b.jsx)(ap.Slot,{scope:a.__scopeSlider,children:(0,b.jsx)(u?az:aA,{"aria-disabled":j,"data-disabled":j?"":void 0,...r,ref:d,onPointerDown:(0,ac.composeEventHandlers)(r.onPointerDown,()=>{j||(x.current=v)}),min:f,max:g,inverted:p,onSlideStart:j?void 0:function(a){let b=function(a,b){if(1===a.length)return 0;let c=a.map(a=>Math.abs(a-b)),d=Math.min(...c);return c.indexOf(d)}(v,a);y(a,b)},onSlideMove:j?void 0:function(a){y(a,t.current)},onSlideEnd:j?void 0:function(){let a=x.current[t.current];v[t.current]!==a&&o(v)},onHomeKeyDown:()=>!j&&y(f,0,{commit:!0}),onEndKeyDown:()=>!j&&y(g,v.length-1,{commit:!0}),onStepKeyDown:({event:a,direction:b})=>{if(!j){let c=al.includes(a.key)||a.shiftKey&&am.includes(a.key),d=t.current;y(v[d]+h*(c?10:1)*b,d,{commit:!0})}}})})})})});aw.displayName=ao;var[ax,ay]=as(ao,{startEdge:"left",endEdge:"right",size:"width",direction:1}),az=c.forwardRef((a,d)=>{let{min:e,max:f,dir:g,inverted:h,onSlideStart:i,onSlideMove:j,onSlideEnd:k,onStepKeyDown:l,...m}=a,[n,o]=c.useState(null),p=(0,ad.useComposedRefs)(d,a=>o(a)),q=c.useRef(void 0),r=(0,ag.useDirection)(g),s="ltr"===r,t=s&&!h||!s&&h;function u(a){let b=q.current||n.getBoundingClientRect(),c=aL([0,b.width],t?[e,f]:[f,e]);return q.current=b,c(a-b.left)}return(0,b.jsx)(ax,{scope:a.__scopeSlider,startEdge:t?"left":"right",endEdge:t?"right":"left",direction:t?1:-1,size:"width",children:(0,b.jsx)(aB,{dir:r,"data-orientation":"horizontal",...m,ref:p,style:{...m.style,"--radix-slider-thumb-transform":"translateX(-50%)"},onSlideStart:a=>{let b=u(a.clientX);i?.(b)},onSlideMove:a=>{let b=u(a.clientX);j?.(b)},onSlideEnd:()=>{q.current=void 0,k?.()},onStepKeyDown:a=>{let b=an[t?"from-left":"from-right"].includes(a.key);l?.({event:a,direction:b?-1:1})}})})}),aA=c.forwardRef((a,d)=>{let{min:e,max:f,inverted:g,onSlideStart:h,onSlideMove:i,onSlideEnd:j,onStepKeyDown:k,...l}=a,m=c.useRef(null),n=(0,ad.useComposedRefs)(d,m),o=c.useRef(void 0),p=!g;function q(a){let b=o.current||m.current.getBoundingClientRect(),c=aL([0,b.height],p?[f,e]:[e,f]);return o.current=b,c(a-b.top)}return(0,b.jsx)(ax,{scope:a.__scopeSlider,startEdge:p?"bottom":"top",endEdge:p?"top":"bottom",size:"height",direction:p?1:-1,children:(0,b.jsx)(aB,{"data-orientation":"vertical",...l,ref:n,style:{...l.style,"--radix-slider-thumb-transform":"translateY(50%)"},onSlideStart:a=>{let b=q(a.clientY);h?.(b)},onSlideMove:a=>{let b=q(a.clientY);i?.(b)},onSlideEnd:()=>{o.current=void 0,j?.()},onStepKeyDown:a=>{let b=an[p?"from-bottom":"from-top"].includes(a.key);k?.({event:a,direction:b?-1:1})}})})}),aB=c.forwardRef((a,c)=>{let{__scopeSlider:d,onSlideStart:e,onSlideMove:f,onSlideEnd:g,onHomeKeyDown:h,onEndKeyDown:i,onStepKeyDown:j,...k}=a,l=av(ao,d);return(0,b.jsx)(aj.Primitive.span,{...k,ref:c,onKeyDown:(0,ac.composeEventHandlers)(a.onKeyDown,a=>{"Home"===a.key?(h(a),a.preventDefault()):"End"===a.key?(i(a),a.preventDefault()):al.concat(am).includes(a.key)&&(j(a),a.preventDefault())}),onPointerDown:(0,ac.composeEventHandlers)(a.onPointerDown,a=>{let b=a.target;b.setPointerCapture(a.pointerId),a.preventDefault(),l.thumbs.has(b)?b.focus():e(a)}),onPointerMove:(0,ac.composeEventHandlers)(a.onPointerMove,a=>{a.target.hasPointerCapture(a.pointerId)&&f(a)}),onPointerUp:(0,ac.composeEventHandlers)(a.onPointerUp,a=>{let b=a.target;b.hasPointerCapture(a.pointerId)&&(b.releasePointerCapture(a.pointerId),g(a))})})}),aC="SliderTrack",aD=c.forwardRef((a,c)=>{let{__scopeSlider:d,...e}=a,f=av(aC,d);return(0,b.jsx)(aj.Primitive.span,{"data-disabled":f.disabled?"":void 0,"data-orientation":f.orientation,...e,ref:c})});aD.displayName=aC;var aE="SliderRange",aF=c.forwardRef((a,d)=>{let{__scopeSlider:e,...f}=a,g=av(aE,e),h=ay(aE,e),i=c.useRef(null),j=(0,ad.useComposedRefs)(d,i),k=g.values.length,l=g.values.map(a=>aK(a,g.min,g.max)),m=k>1?Math.min(...l):0,n=100-Math.max(...l);return(0,b.jsx)(aj.Primitive.span,{"data-orientation":g.orientation,"data-disabled":g.disabled?"":void 0,...f,ref:j,style:{...a.style,[h.startEdge]:m+"%",[h.endEdge]:n+"%"}})});aF.displayName=aE;var aG="SliderThumb",aH=c.forwardRef((a,d)=>{let e=aq(a.__scopeSlider),[f,g]=c.useState(null),h=(0,ad.useComposedRefs)(d,a=>g(a)),i=c.useMemo(()=>f?e().findIndex(a=>a.ref.current===f):-1,[e,f]);return(0,b.jsx)(aI,{...a,ref:h,index:i})}),aI=c.forwardRef((a,d)=>{var e,f,g,h,i;let j,k,{__scopeSlider:l,index:m,name:n,...o}=a,p=av(aG,l),q=ay(aG,l),[r,s]=c.useState(null),t=(0,ad.useComposedRefs)(d,a=>s(a)),u=!r||p.form||!!r.closest("form"),v=(0,ai.useSize)(r),w=p.values[m],x=void 0===w?0:aK(w,p.min,p.max),y=(e=m,(f=p.values.length)>2?`Value ${e+1} of ${f}`:2===f?["Minimum","Maximum"][e]:void 0),z=v?.[q.size],A=z?(g=z,h=x,i=q.direction,k=aL([0,50],[0,j=g/2]),(j-k(h)*i)*i):0;return c.useEffect(()=>{if(r)return p.thumbs.add(r),()=>{p.thumbs.delete(r)}},[r,p.thumbs]),(0,b.jsxs)("span",{style:{transform:"var(--radix-slider-thumb-transform)",position:"absolute",[q.startEdge]:`calc(${x}% + ${A}px)`},children:[(0,b.jsx)(ap.ItemSlot,{scope:a.__scopeSlider,children:(0,b.jsx)(aj.Primitive.span,{role:"slider","aria-label":a["aria-label"]||y,"aria-valuemin":p.min,"aria-valuenow":w,"aria-valuemax":p.max,"aria-orientation":p.orientation,"data-orientation":p.orientation,"data-disabled":p.disabled?"":void 0,tabIndex:p.disabled?void 0:0,...o,ref:t,style:void 0===w?{display:"none"}:a.style,onFocus:(0,ac.composeEventHandlers)(a.onFocus,()=>{p.valueIndexToChangeRef.current=m})})}),u&&(0,b.jsx)(aJ,{name:n??(p.name?p.name+(p.values.length>1?"[]":""):void 0),form:p.form,value:w},m)]})});aH.displayName=aG;var aJ=c.forwardRef(({__scopeSlider:a,value:d,...e},f)=>{let g=c.useRef(null),h=(0,ad.useComposedRefs)(g,f),i=(0,ah.usePrevious)(d);return c.useEffect(()=>{let a=g.current;if(!a)return;let b=Object.getOwnPropertyDescriptor(window.HTMLInputElement.prototype,"value").set;if(i!==d&&b){let c=new Event("input",{bubbles:!0});b.call(a,d),a.dispatchEvent(c)}},[i,d]),(0,b.jsx)(aj.Primitive.input,{style:{display:"none"},...e,ref:h,defaultValue:d})});function aK(a,b,c){return(0,ab.clamp)(100/(c-b)*(a-b),[0,100])}function aL(a,b){return c=>{if(a[0]===a[1]||b[0]===b[1])return b[0];let d=(b[1]-b[0])/(a[1]-a[0]);return b[0]+d*(c-a[0])}}aJ.displayName="RadioBubbleInput",a.s(["Range",0,aF,"Root",0,aw,"Slider",0,aw,"SliderRange",0,aF,"SliderThumb",0,aH,"SliderTrack",0,aD,"Thumb",0,aH,"Track",0,aD,"createSliderScope",0,at],40432);var aM=a.i(40432),aM=aM;function aN({className:a,defaultValue:d,value:e,min:f=0,max:g=100,...h}){let i=c.useMemo(()=>Array.isArray(e)?e:Array.isArray(d)?d:[f,g],[e,d,f,g]);return(0,b.jsxs)(aM.Root,{"data-slot":"slider",defaultValue:d,value:e,min:f,max:g,className:(0,r.cn)("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",a),...h,children:[(0,b.jsx)(aM.Track,{"data-slot":"slider-track",className:(0,r.cn)("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"),children:(0,b.jsx)(aM.Range,{"data-slot":"slider-range",className:(0,r.cn)("bg-primary absolute data-[orientation=horizontal]:h-full data-[orientation=vertical]:w-full")})}),Array.from({length:i.length},(a,c)=>(0,b.jsx)(aM.Thumb,{"data-slot":"slider-thumb",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"},c))]})}let aO=[60,120,300,600,900,1800,2700,3600,7200,10800,14400,21600,28800,43200,86400],aP=aO.length-1;function aQ(a){let b=0,c=Math.abs(a-aO[0]);for(let d=1;d<aO.length;d++){let e=Math.abs(a-aO[d]);e<c&&(c=e,b=d)}return b}function aR({id:a,testId:d,value:e,onChange:f,onBlur:g,defaultSeconds:h=1800}){var i;let j,k,l=(""===e?h:parseInt(e,10))||h,[m,n]=(0,c.useState)(()=>aQ(l)),o=aQ(l);o!==m&&aO[m]!==l&&n(o);let p=(0,c.useCallback)(([a])=>{n(a),f(String(aO[a]))},[f]);return(0,b.jsxs)("div",{className:"flex w-55 items-center gap-2",children:[(0,b.jsx)(aN,{id:a,"data-testid":d,min:0,max:aP,step:1,value:[m],onValueChange:p,onValueCommit:()=>g(),className:"min-w-0 flex-1"}),(0,b.jsx)("span",{className:"text-muted-foreground shrink-0 text-end text-xs tabular-nums",children:(j=Math.floor((i=aO[m])/3600),k=Math.round(i%3600/60),0===j?`${k}m`:0===k?`${j}h`:`${j}h ${k}m`)})]})}function aS(a){if(void 0===a)return;let b=function(a){if(""===a)return;let b=parseInt(a,10);return Number.isNaN(b)||b<=0?void 0:b}(a);return null!=b?1e3*b:void 0}function aT({settings:a}){let{t:d}=(0,q.useTranslation)("web"),[,e]=(0,c.useTransition)(),f=a.workflow.stageTimeouts,g=a.workflow.analyzeRepoTimeouts,[h,i]=(0,c.useState)(String(Math.round((f?.analyzeMs??18e5)/1e3))),[j,k]=(0,c.useState)(String(Math.round((f?.requirementsMs??18e5)/1e3))),[m,n]=(0,c.useState)(String(Math.round((f?.researchMs??18e5)/1e3))),[o,p]=(0,c.useState)(String(Math.round((f?.planMs??18e5)/1e3))),[r,s]=(0,c.useState)(String(Math.round((f?.implementMs??18e5)/1e3))),[t,u]=(0,c.useState)(String(Math.round((f?.mergeMs??18e5)/1e3))),[v,w]=(0,c.useState)(String(Math.round((g?.analyzeMs??6e5)/1e3))),x=f?.analyzeMs!=null?String(Math.round(f.analyzeMs/1e3)):"",y=f?.requirementsMs!=null?String(Math.round(f.requirementsMs/1e3)):"",z=f?.researchMs!=null?String(Math.round(f.researchMs/1e3)):"",B=f?.planMs!=null?String(Math.round(f.planMs/1e3)):"",D=f?.implementMs!=null?String(Math.round(f.implementMs/1e3)):"",F=f?.mergeMs!=null?String(Math.round(f.mergeMs/1e3)):"",H=g?.analyzeMs!=null?String(Math.round(g.analyzeMs/1e3)):"";function I(a){return{workflow:{stageTimeouts:{analyzeMs:aS(a.analyzeTimeout??h),requirementsMs:aS(a.requirementsTimeout??j),researchMs:aS(a.researchTimeout??m),planMs:aS(a.planTimeout??o),implementMs:aS(a.implementTimeout??r),mergeMs:aS(a.mergeTimeout??t)},analyzeRepoTimeouts:{analyzeMs:aS(a.analyzeRepoTimeout??v)}}}}function J(a){e(async()=>{let b=await K(a);b.success||G.toast.error(b.error??d("settings.failedToSave"))})}return(0,b.jsxs)(C,{icon:l.Timer,title:d("settings.stageTimeouts.title"),description:d("settings.stageTimeouts.description"),testId:"stage-timeouts-settings-section",tooltip:d("settings.stageTimeouts.hint"),children:[(0,b.jsx)(E,{children:d("settings.stageTimeouts.subsections.featureAgent")}),(0,b.jsx)(A,{label:d("settings.stageTimeouts.analyze"),description:d("settings.stageTimeouts.analyzeDescription"),htmlFor:"timeout-analyze",children:(0,b.jsx)(aR,{id:"timeout-analyze",testId:"timeout-analyze-input",value:h,onChange:i,onBlur:()=>{h!==x&&J(I({analyzeTimeout:h}))},defaultSeconds:1800})}),(0,b.jsx)(A,{label:d("settings.stageTimeouts.requirements"),description:d("settings.stageTimeouts.requirementsDescription"),htmlFor:"timeout-requirements",children:(0,b.jsx)(aR,{id:"timeout-requirements",testId:"timeout-requirements-input",value:j,onChange:k,onBlur:()=>{j!==y&&J(I({requirementsTimeout:j}))},defaultSeconds:1800})}),(0,b.jsx)(A,{label:d("settings.stageTimeouts.research"),description:d("settings.stageTimeouts.researchDescription"),htmlFor:"timeout-research",children:(0,b.jsx)(aR,{id:"timeout-research",testId:"timeout-research-input",value:m,onChange:n,onBlur:()=>{m!==z&&J(I({researchTimeout:m}))},defaultSeconds:1800})}),(0,b.jsx)(A,{label:d("settings.stageTimeouts.plan"),description:d("settings.stageTimeouts.planDescription"),htmlFor:"timeout-plan",children:(0,b.jsx)(aR,{id:"timeout-plan",testId:"timeout-plan-input",value:o,onChange:p,onBlur:()=>{o!==B&&J(I({planTimeout:o}))},defaultSeconds:1800})}),(0,b.jsx)(A,{label:d("settings.stageTimeouts.implement"),description:d("settings.stageTimeouts.implementDescription"),htmlFor:"timeout-implement",children:(0,b.jsx)(aR,{id:"timeout-implement",testId:"timeout-implement-input",value:r,onChange:s,onBlur:()=>{r!==D&&J(I({implementTimeout:r}))},defaultSeconds:1800})}),(0,b.jsx)(A,{label:d("settings.stageTimeouts.merge"),description:d("settings.stageTimeouts.mergeDescription"),htmlFor:"timeout-merge",children:(0,b.jsx)(aR,{id:"timeout-merge",testId:"timeout-merge-input",value:t,onChange:u,onBlur:()=>{t!==F&&J(I({mergeTimeout:t}))},defaultSeconds:1800})}),(0,b.jsx)(E,{children:d("settings.stageTimeouts.subsections.analyzeRepoAgent")}),(0,b.jsx)(A,{label:d("settings.stageTimeouts.analyze"),description:d("settings.stageTimeouts.analyzeDescription"),htmlFor:"timeout-analyze-repo",children:(0,b.jsx)(aR,{id:"timeout-analyze-repo",testId:"timeout-analyze-repo-input",value:v,onChange:w,onBlur:()=>{v!==H&&J(I({analyzeRepoTimeout:v}))},defaultSeconds:600})})]})}function aU({settings:a}){let{t:d}=(0,q.useTranslation)("web"),[,e]=(0,c.useTransition)(),[f,g]=(0,c.useState)(a.notifications.inApp.enabled),[h,j]=(0,c.useState)({...a.notifications.events});function k(a){e(async()=>{let b=await K(a);b.success||G.toast.error(b.error??d("settings.failedToSave"))})}function l(a={}){return{notifications:{inApp:{enabled:a.inApp??f},events:a.events??h}}}return(0,b.jsxs)(C,{icon:i,title:d("settings.notifications.title"),description:d("settings.notifications.sectionDescription"),testId:"notification-settings-section",tooltip:d("settings.notifications.hint"),tooltipLinks:[{label:d("settings.notifications.links.notificationSystem"),href:"https://github.com/jrmatherly/shipit/blob/main/specs/021-agent-notifications/spec.yaml"}],children:[(0,b.jsx)(E,{children:d("settings.notifications.channels")}),(0,b.jsx)(B,{label:d("settings.notifications.inAppLabel"),description:d("settings.notifications.inAppDescription"),tooltip:"Master toggle for in-app toast notifications. When disabled, no event toasts will appear regardless of individual event settings below.",id:"notif-in-app",testId:"switch-in-app",checked:f,onChange:a=>{g(a),k(l({inApp:a}))}}),(0,b.jsx)(E,{children:d("settings.notifications.subsections.agentEvents")}),(0,b.jsx)(B,{label:d("settings.notifications.events.agentStarted"),tooltip:"Controls whether you receive an in-app toast notification when an agent begins working on a feature.",id:"notif-event-agentStarted",testId:"switch-event-agentStarted",checked:h.agentStarted,onChange:a=>{let b={...h,agentStarted:a};j(b),k(l({events:b}))}}),(0,b.jsx)(B,{label:d("settings.notifications.events.phaseCompleted"),tooltip:"Controls whether you receive an in-app toast notification when an agent completes a workflow phase (e.g., requirements, planning, implementation).",id:"notif-event-phaseCompleted",testId:"switch-event-phaseCompleted",checked:h.phaseCompleted,onChange:a=>{let b={...h,phaseCompleted:a};j(b),k(l({events:b}))}}),(0,b.jsx)(B,{label:d("settings.notifications.events.waitingApproval"),tooltip:"Controls whether you receive an in-app toast notification when a feature is paused and waiting for your approval to continue.",id:"notif-event-waitingApproval",testId:"switch-event-waitingApproval",checked:h.waitingApproval,onChange:a=>{let b={...h,waitingApproval:a};j(b),k(l({events:b}))}}),(0,b.jsx)(B,{label:d("settings.notifications.events.agentCompleted"),tooltip:"Controls whether you receive an in-app toast notification when an agent finishes all work on a feature successfully.",id:"notif-event-agentCompleted",testId:"switch-event-agentCompleted",checked:h.agentCompleted,onChange:a=>{let b={...h,agentCompleted:a};j(b),k(l({events:b}))}}),(0,b.jsx)(B,{label:d("settings.notifications.events.agentFailed"),tooltip:"Controls whether you receive an in-app toast notification when an agent encounters an error and stops working on a feature.",id:"notif-event-agentFailed",testId:"switch-event-agentFailed",checked:h.agentFailed,onChange:a=>{let b={...h,agentFailed:a};j(b),k(l({events:b}))}}),(0,b.jsx)(E,{children:d("settings.notifications.subsections.pullRequestEvents")}),(0,b.jsx)(B,{label:d("settings.notifications.events.prMerged"),tooltip:"Controls whether you receive an in-app toast notification when a feature's pull request is merged into the target branch.",id:"notif-event-prMerged",testId:"switch-event-prMerged",checked:h.prMerged,onChange:a=>{let b={...h,prMerged:a};j(b),k(l({events:b}))}}),(0,b.jsx)(B,{label:d("settings.notifications.events.prClosed"),tooltip:"Controls whether you receive an in-app toast notification when a feature's pull request is closed without merging.",id:"notif-event-prClosed",testId:"switch-event-prClosed",checked:h.prClosed,onChange:a=>{let b={...h,prClosed:a};j(b),k(l({events:b}))}}),(0,b.jsx)(B,{label:d("settings.notifications.events.prChecksPassed"),tooltip:"Controls whether you receive an in-app toast notification when all CI checks pass on a feature's pull request.",id:"notif-event-prChecksPassed",testId:"switch-event-prChecksPassed",checked:h.prChecksPassed,onChange:a=>{let b={...h,prChecksPassed:a};j(b),k(l({events:b}))}}),(0,b.jsx)(B,{label:d("settings.notifications.events.prChecksFailed"),tooltip:"Controls whether you receive an in-app toast notification when CI checks fail on a feature's pull request.",id:"notif-event-prChecksFailed",testId:"switch-event-prChecksFailed",checked:h.prChecksFailed,onChange:a=>{let b={...h,prChecksFailed:a};j(b),k(l({events:b}))}}),(0,b.jsx)(B,{label:d("settings.notifications.events.prBlocked"),tooltip:"Controls whether you receive an in-app toast notification when a pull request is blocked by merge conflicts or branch protection rules.",id:"notif-event-prBlocked",testId:"switch-event-prBlocked",checked:h.prBlocked,onChange:a=>{let b={...h,prBlocked:a};j(b),k(l({events:b}))}}),(0,b.jsx)(B,{label:d("settings.notifications.events.mergeReviewReady"),tooltip:"Controls whether you receive an in-app toast notification when a feature's PR passes all checks and is ready for your merge review.",id:"notif-event-mergeReviewReady",testId:"switch-event-mergeReviewReady",checked:h.mergeReviewReady,onChange:a=>{let b={...h,mergeReviewReady:a};j(b),k(l({events:b}))}})]})}function aV({settings:a}){let{t:d}=(0,q.useTranslation)("web"),[,e]=(0,c.useTransition)(),f=a.featureFlags??{skills:!1,envDeploy:!1,debug:!1,githubImport:!1,adoptBranch:!1,gitRebaseSync:!1,reactFileManager:!1,plugins:!1},[g,h]=(0,c.useState)({...f});function i(a){e(async()=>{let b=await K(a);b.success||G.toast.error(b.error??d("settings.failedToSave"))})}return(0,b.jsxs)(C,{icon:j,title:d("settings.featureFlags.title"),description:d("settings.featureFlags.sectionDescription"),badge:d("settings.featureFlags.badge"),testId:"feature-flags-settings-section",tooltip:d("settings.featureFlags.hint"),children:[(0,b.jsx)(B,{label:d("settings.featureFlags.skills"),description:d("settings.featureFlags.skillsDescription"),tooltip:"Enables the Skills page in the sidebar for browsing and managing Claude Code skills.",id:"flag-skills",testId:"switch-flag-skills",checked:g.skills,onChange:a=>{let b={...g,skills:a};h(b),i({featureFlags:b})}}),(0,b.jsx)(B,{label:d("settings.featureFlags.deployments"),description:d("settings.featureFlags.deploymentsDescription"),tooltip:"Enables experimental deployment features for environment management.",id:"flag-envDeploy",testId:"switch-flag-envDeploy",checked:g.envDeploy,onChange:a=>{let b={...g,envDeploy:a};h(b),i({featureFlags:b})}}),(0,b.jsx)(B,{label:d("settings.featureFlags.debug"),description:d("settings.featureFlags.debugDescription"),tooltip:"Shows additional debugging information in the UI for troubleshooting.",id:"flag-debug",testId:"switch-flag-debug",checked:g.debug,onChange:a=>{let b={...g,debug:a};h(b),i({featureFlags:b})}}),(0,b.jsx)(B,{label:d("settings.featureFlags.githubImport"),description:d("settings.featureFlags.githubImportDescription"),tooltip:"Enables importing repositories directly from GitHub.",id:"flag-githubImport",testId:"switch-flag-githubImport",checked:g.githubImport,onChange:a=>{let b={...g,githubImport:a};h(b),i({featureFlags:b})}}),(0,b.jsx)(B,{label:d("settings.featureFlags.adoptBranch"),description:d("settings.featureFlags.adoptBranchDescription"),tooltip:"Enables adopting existing git branches as ShipIT features.",id:"flag-adoptBranch",testId:"switch-flag-adoptBranch",checked:g.adoptBranch,onChange:a=>{let b={...g,adoptBranch:a};h(b),i({featureFlags:b})}}),(0,b.jsx)(B,{label:d("settings.featureFlags.gitRebaseSync"),description:d("settings.featureFlags.gitRebaseSyncDescription"),tooltip:"Uses git rebase instead of merge when syncing feature branches with the upstream branch.",id:"flag-gitRebaseSync",testId:"switch-flag-gitRebaseSync",checked:g.gitRebaseSync,onChange:a=>{let b={...g,gitRebaseSync:a};h(b),i({featureFlags:b})}}),(0,b.jsx)(B,{label:d("settings.featureFlags.reactFileManager"),description:d("settings.featureFlags.reactFileManagerDescription"),tooltip:"Replaces the native file picker dialog with a React-based file browser for selecting project folders.",id:"flag-reactFileManager",testId:"switch-flag-reactFileManager",checked:g.reactFileManager,onChange:a=>{let b={...g,reactFileManager:a};h(b),i({featureFlags:b})}}),(0,b.jsx)(B,{label:d("settings.featureFlags.plugins"),description:a.litellmProxy?.baseUrl?d("settings.featureFlags.pluginsDescription"):`${d("settings.featureFlags.pluginsDescription")} — ${d("plugins.noProxy")}`,tooltip:"Enables the Plugins page for browsing and managing Claude Code plugins from a LiteLLM marketplace. Requires a LiteLLM proxy URL to be configured.",id:"flag-plugins",testId:"switch-flag-plugins",checked:g.plugins,disabled:!a.litellmProxy?.baseUrl,onChange:a=>{let b={...g,plugins:a};h(b),i({featureFlags:b})}})]})}function aW({settings:a}){let{t:d}=(0,q.useTranslation)("web"),[,e]=(0,c.useTransition)(),f=a.interactiveAgent??{enabled:!0,autoTimeoutMinutes:15,maxConcurrentSessions:3},[g,h]=(0,c.useState)(f.enabled),[i,j]=(0,c.useState)(String(f.autoTimeoutMinutes)),[k,l]=(0,c.useState)(String(f.maxConcurrentSessions));function n(a){e(async()=>{let b=await K(a);b.success||G.toast.error(b.error??d("settings.failedToSave"))})}return(0,b.jsxs)(C,{icon:m.MessageSquare,title:d("settings.interactiveAgent.title"),description:d("settings.interactiveAgent.description"),testId:"interactive-agent-settings-section",tooltip:d("settings.interactiveAgent.hint"),children:[(0,b.jsx)(B,{label:d("settings.interactiveAgent.enableChatTab"),description:d("settings.interactiveAgent.enableChatTabDescription"),tooltip:"Shows or hides the Chat tab on feature detail pages. When enabled, you can have interactive conversations with the agent about a specific feature.",id:"interactive-agent-enabled",testId:"switch-interactive-agent-enabled",checked:g,onChange:a=>{h(a),n({interactiveAgent:{enabled:a,autoTimeoutMinutes:parseInt(i,10)||15,maxConcurrentSessions:parseInt(k,10)||3}})}}),(0,b.jsx)(A,{label:d("settings.interactiveAgent.autoTimeout"),description:d("settings.interactiveAgent.autoTimeoutDescription"),tooltip:"Minutes of inactivity before a chat agent session is automatically terminated. Prevents idle agent processes from consuming resources indefinitely.",htmlFor:"interactive-agent-timeout",children:(0,b.jsx)(D,{id:"interactive-agent-timeout",testId:"input-interactive-agent-timeout",value:i,placeholder:"15",min:1,max:120,suffix:"min",onChange:j,onBlur:()=>{let a=parseInt(i,10),b=Number.isNaN(a)?15:Math.min(120,Math.max(1,a));j(String(b)),n({interactiveAgent:{enabled:g,autoTimeoutMinutes:b,maxConcurrentSessions:parseInt(k,10)||3}})}})}),(0,b.jsx)(A,{label:d("settings.interactiveAgent.maxConcurrentSessions"),description:d("settings.interactiveAgent.maxConcurrentSessionsDescription"),tooltip:"Maximum number of interactive agent sessions that can run simultaneously. Each session spawns a separate agent process, so higher values use more CPU and memory.",htmlFor:"interactive-agent-sessions",children:(0,b.jsx)(D,{id:"interactive-agent-sessions",testId:"input-interactive-agent-sessions",value:k,placeholder:"3",min:1,max:10,onChange:l,onBlur:()=>{let a=parseInt(k,10),b=Number.isNaN(a)?3:Math.min(10,Math.max(1,a));l(String(b)),n({interactiveAgent:{enabled:g,autoTimeoutMinutes:parseInt(i,10)||15,maxConcurrentSessions:b}})}})})]})}function aX({settings:a}){let{t:d}=(0,q.useTranslation)("web"),[,e]=(0,c.useTransition)(),f=a.fabLayout??{swapPosition:!1},[g,h]=(0,c.useState)(f.swapPosition);return(0,b.jsx)(C,{icon:n,title:d("settings.fabLayout.title"),description:d("settings.fabLayout.description"),testId:"fab-layout-settings-section",tooltip:d("settings.fabLayout.hint"),children:(0,b.jsx)(B,{label:d("settings.fabLayout.swapPosition"),description:d("settings.fabLayout.swapPositionDescription"),tooltip:"Swaps the Create button (bottom-right) and Chat button (bottom-left) positions on the control center canvas.",id:"fab-swap-position",testId:"switch-fab-swap-position",checked:g,onChange:a=>{var b;h(a),b={fabLayout:{swapPosition:a}},e(async()=>{let a=await K(b);a.success||G.toast.error(a.error??d("settings.failedToSave"))})}})})}function aY({shipitAiHome:a,dbFileSize:c}){let{t:d}=(0,q.useTranslation)("web");return(0,b.jsxs)(C,{icon:k,title:d("settings.database.title"),description:d("settings.database.sectionDescription"),testId:"database-settings-section",tooltip:d("settings.database.hint"),tooltipLinks:[{label:d("settings.database.links.settingsService"),href:"https://github.com/jrmatherly/shipit/blob/main/docs/architecture/settings-service.md"},{label:d("settings.database.links.settingsSpec"),href:"https://github.com/jrmatherly/shipit/blob/main/specs/005-global-settings-service/spec.md"}],children:[(0,b.jsx)(A,{label:d("settings.database.location"),description:d("settings.database.locationDescription"),tooltip:"The directory where ShipIT stores its SQLite database, logs, and configuration files. Change this via the SHIPIT_AI_HOME environment variable.",children:(0,b.jsx)("span",{className:"text-muted-foreground max-w-50 truncate font-mono text-xs","data-testid":"shipit-ai-home-path",children:a})}),(0,b.jsx)(A,{label:d("settings.database.size"),tooltip:"Current size of the SQLite database file on disk. Large databases may slow down startup; consider archiving old features if this grows significantly.",children:(0,b.jsx)("span",{className:"text-muted-foreground text-xs","data-testid":"db-file-size",children:c})})]})}var aZ=a.i(98680),aZ=aZ,a$=a.i(74605),a$=a$;let a_=(0,J.createServerReference)("4089127be26c6a3cb053b2600efbcd8f26417ed18f",J.callServer,void 0,J.findSourceMapURL,"addMarketplaceAction");var a0=a.i(90920),a1=a.i(18948);function a2({settings:a}){let{t:d}=(0,q.useTranslation)("web"),[,e]=(0,c.useTransition)(),[f,g]=(0,c.useState)(a.litellmProxy?.baseUrl??""),[h,i]=(0,c.useState)(a.litellmProxy?.apiKey??""),[j,k]=(0,c.useState)("idle"),[l,m]=(0,c.useState)(!1),n=a.litellmProxy?.baseUrl??"",o=a.litellmProxy?.apiKey??"";function r(a){e(async()=>{let b=await K(a);b.success||G.toast.error(b.error??d("settings.failedToSave"))})}function s(a){let b=a?.baseUrl??f;return{litellmProxy:{baseUrl:b,apiKey:a?.apiKey??h,marketplaceEnabled:!!b}}}async function t(){if(f){m(!0),k("idle");try{let a=`${f.replace(/\/+$/,"")}/claude-code/marketplace.json`,b=await a_(a);k(b.success?"success":"failed"),b.success?G.toast.success(d("settings.litellmProxy.testSuccess")):G.toast.error(d("settings.litellmProxy.testFailed"))}catch{k("failed"),G.toast.error(d("settings.litellmProxy.testFailed"))}finally{m(!1)}}}return(0,b.jsxs)(C,{icon:p.Server,title:d("settings.litellmProxy.title"),description:d("settings.litellmProxy.description"),testId:"litellm-proxy-settings-section",tooltip:d("settings.litellmProxy.hint"),children:[(0,b.jsx)(A,{label:d("settings.litellmProxy.baseUrl"),description:d("settings.litellmProxy.baseUrlDescription"),tooltip:"The base URL of your LiteLLM proxy server. This is used to fetch the plugin marketplace catalog and route model requests.",htmlFor:"litellm-proxy-url",children:(0,b.jsx)(a0.Input,{id:"litellm-proxy-url","data-testid":"litellm-proxy-url-input",type:"text",placeholder:"http://localhost:4000",value:f,onChange:a=>{g(a.target.value),k("idle")},onBlur:()=>{f!==n&&r(s({baseUrl:f}))},className:"w-64 text-xs"})}),(0,b.jsx)(A,{label:d("settings.litellmProxy.apiKey"),description:d("settings.litellmProxy.apiKeyDescription"),tooltip:"A virtual API key for authenticating with the LiteLLM proxy. Stored locally alongside other agent credentials.",htmlFor:"litellm-api-key",children:(0,b.jsx)(a0.Input,{id:"litellm-api-key","data-testid":"litellm-api-key-input",type:"password",placeholder:"sk-...",value:h,onChange:a=>i(a.target.value),onBlur:()=>{h!==o&&r(s({apiKey:h}))},className:"w-64 text-xs"})}),(0,b.jsx)(A,{label:d("settings.litellmProxy.testConnection"),tooltip:"Attempt to connect to the proxy and fetch the marketplace catalog to verify the configuration is correct.",children:(0,b.jsxs)("div",{className:"flex items-center gap-2",children:[(0,b.jsx)(a1.Button,{variant:"outline",size:"sm","data-testid":"litellm-test-connection-btn",disabled:!f||l,onClick:t,className:"cursor-pointer text-xs",children:l?d("settings.saving"):d("settings.litellmProxy.testConnection")}),"success"===j&&(0,b.jsx)(aZ.default,{className:"h-4 w-4 text-emerald-500","data-testid":"litellm-test-success"}),"failed"===j&&(0,b.jsx)(a$.default,{className:"text-destructive h-4 w-4","data-testid":"litellm-test-failed"})]})})]})}let a3=(0,h.default)("route",[["circle",{cx:"6",cy:"19",r:"3",key:"1kj8tv"}],["path",{d:"M9 19h8.5a3.5 3.5 0 0 0 0-7h-11a3.5 3.5 0 0 1 0-7H15",key:"1d8sl"}],["circle",{cx:"18",cy:"5",r:"3",key:"gq8acd"}]]);var a4=a.i(79620);function a5({settings:a}){let{t:d}=(0,q.useTranslation)("web"),[,e]=(0,c.useTransition)(),f=a.litellmProxy?.claudeCode,[g,h]=(0,c.useState)(f?.routingMode??L.LiteLLMProxyRoutingMode.direct),[i,j]=(0,c.useState)(f?.customHeaders??""),[k,l]=(0,c.useState)(f?.sonnetModel??""),[m,n]=(0,c.useState)(f?.haikuModel??""),[o,p]=(0,c.useState)(f?.opusModel??""),r=f?.customHeaders??"",s=f?.sonnetModel??"",t=f?.haikuModel??"",u=f?.opusModel??"",v=g!==L.LiteLLMProxyRoutingMode.direct;function w(a){e(async()=>{let b=await K(a);b.success||G.toast.error(b.error??d("settings.failedToSave"))})}function x(b){return{litellmProxy:{baseUrl:a.litellmProxy?.baseUrl,apiKey:a.litellmProxy?.apiKey,marketplaceEnabled:!!a.litellmProxy?.baseUrl,claudeCode:{routingMode:b?.routingMode??g,customHeaders:(b?.customHeaders??i)||void 0,sonnetModel:(b?.sonnetModel??k)||void 0,haikuModel:(b?.haikuModel??m)||void 0,opusModel:(b?.opusModel??o)||void 0}}}}return(0,b.jsxs)(C,{icon:a3,title:d("settings.litellmProxy.routing.title"),description:d("settings.litellmProxy.routing.description"),testId:"litellm-proxy-routing-section",tooltip:d("settings.litellmProxy.routing.hint"),children:[(0,b.jsx)(A,{label:d("settings.litellmProxy.routing.mode"),description:d("settings.litellmProxy.routing.modeDescription"),htmlFor:"litellm-routing-mode",children:(0,b.jsxs)(H.Select,{value:g,onValueChange:function(a){h(a),w(x({routingMode:a}))},children:[(0,b.jsx)(H.SelectTrigger,{id:"litellm-routing-mode","data-testid":"litellm-routing-mode-select",className:"w-48 text-xs",children:(0,b.jsx)(H.SelectValue,{})}),(0,b.jsxs)(H.SelectContent,{children:[(0,b.jsx)(H.SelectItem,{value:L.LiteLLMProxyRoutingMode.direct,children:d("settings.litellmProxy.routing.modeDirect")}),(0,b.jsx)(H.SelectItem,{value:L.LiteLLMProxyRoutingMode.proxy,children:d("settings.litellmProxy.routing.modeProxy")}),(0,b.jsx)(H.SelectItem,{value:L.LiteLLMProxyRoutingMode.passthrough,children:d("settings.litellmProxy.routing.modePassthrough")})]})]})}),g===L.LiteLLMProxyRoutingMode.passthrough&&(0,b.jsx)(A,{label:"",description:d("settings.litellmProxy.routing.passthroughHelp"),children:(0,b.jsx)("span",{})}),v?(0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)(A,{label:d("settings.litellmProxy.routing.customHeaders"),description:d("settings.litellmProxy.routing.customHeadersDescription"),htmlFor:"litellm-custom-headers",children:(0,b.jsx)(a4.Textarea,{id:"litellm-custom-headers","data-testid":"litellm-custom-headers-input",placeholder:"x-litellm-customer-id: my-user\nx-litellm-tags: project:acme",value:i,onChange:a=>j(a.target.value),onBlur:()=>{i!==r&&w(x({customHeaders:i}))},rows:3,className:"w-64 text-xs"})}),(0,b.jsx)(A,{label:d("settings.litellmProxy.routing.sonnetModel"),description:d("settings.litellmProxy.routing.modelOverrideDescription"),htmlFor:"litellm-sonnet-model",children:(0,b.jsx)(a0.Input,{id:"litellm-sonnet-model","data-testid":"litellm-sonnet-model-input",type:"text",placeholder:"claude-sonnet-4-6",value:k,onChange:a=>l(a.target.value),onBlur:()=>{k!==s&&w(x({sonnetModel:k}))},className:"w-64 text-xs"})}),(0,b.jsx)(A,{label:d("settings.litellmProxy.routing.haikuModel"),htmlFor:"litellm-haiku-model",children:(0,b.jsx)(a0.Input,{id:"litellm-haiku-model","data-testid":"litellm-haiku-model-input",type:"text",placeholder:"claude-haiku-4-5",value:m,onChange:a=>n(a.target.value),onBlur:()=>{m!==t&&w(x({haikuModel:m}))},className:"w-64 text-xs"})}),(0,b.jsx)(A,{label:d("settings.litellmProxy.routing.opusModel"),htmlFor:"litellm-opus-model",children:(0,b.jsx)(a0.Input,{id:"litellm-opus-model","data-testid":"litellm-opus-model-input",type:"text",placeholder:"claude-opus-4-6",value:o,onChange:a=>p(a.target.value),onBlur:()=>{o!==u&&w(x({opusModel:o}))},className:"w-64 text-xs"})})]}):null]})}let a6=[{id:"agent",labelKey:"settings.sections.agent",icon:d.Bot},{id:"environment",labelKey:"settings.sections.environment",icon:e.Terminal},{id:"workflow",labelKey:"settings.sections.workflow",icon:f.GitBranch},{id:"ci",labelKey:"settings.sections.ci",icon:g.Activity},{id:"stage-timeouts",labelKey:"settings.sections.timeouts",icon:l.Timer},{id:"notifications",labelKey:"settings.sections.notifications",icon:i},{id:"feature-flags",labelKey:"settings.sections.flags",icon:j},{id:"interactive-agent",labelKey:"settings.sections.chat",icon:m.MessageSquare},{id:"fab-layout",labelKey:"settings.sections.layout",icon:n},{id:"database",labelKey:"settings.sections.database",icon:k},{id:"litellm-proxy",labelKey:"settings.sections.proxy",icon:p.Server}],a7=[{id:"all",labelKey:"settings.sections.all",icon:o},...a6];a.s(["SettingsPageClient",0,function({settings:a,shipitAiHome:d,dbFileSize:e,availableTerminals:f,availableEditors:g,availableShells:h}){let{t:i}=(0,q.useTranslation)("web"),[j,k]=(0,c.useState)("all"),[l,m]=(0,c.useState)("agent");return(0,c.useEffect)(()=>{if("all"!==j)return;let a=a6.map(a=>document.getElementById(`section-${a.id}`)).filter(Boolean);if(0===a.length)return;let b=new IntersectionObserver(a=>{for(let b of a)b.isIntersecting&&m(b.target.id.replace("section-",""))},{rootMargin:"-65px 0px -60% 0px",threshold:0});for(let c of a)b.observe(c);return()=>b.disconnect()},[j]),(0,b.jsxs)("div",{"data-testid":"settings-page-client",className:"max-w-5xl px-8 pt-8",children:[(0,b.jsxs)("div",{className:"bg-background/95 supports-backdrop-filter:bg-background/80 sticky top-0 z-10 pb-4 backdrop-blur",children:[(0,b.jsxs)("div",{className:"mb-4 space-y-1.5",children:[(0,b.jsx)("span",{className:"text-[10px] font-bold tracking-[0.2em] text-slate-400 uppercase",children:"Developer Portal"}),(0,b.jsx)("div",{className:"flex items-baseline gap-3",children:(0,b.jsx)("h1",{className:"text-foreground text-3xl font-black tracking-tight",children:i("settings.title")})})]}),(0,b.jsx)("nav",{className:"bg-card editorial-shadow flex flex-wrap items-center gap-0.5 rounded-lg p-1",children:a7.map(a=>{let c=a.icon,d=j===a.id||"all"===j&&"all"!==a.id&&l===a.id;return(0,b.jsxs)("button",{type:"button",onClick:()=>k(a.id),className:(0,r.cn)("flex cursor-pointer items-center gap-1 rounded-md px-2 py-1.5 text-[11px] font-bold transition-all",d?"bg-muted text-primary shadow-sm ring-1 ring-slate-200/70 dark:ring-slate-700/50":"text-muted-foreground hover:text-foreground hover:bg-accent/50"),children:[(0,b.jsx)(c,{className:"h-3 w-3"}),(0,b.jsx)("span",{className:"hidden sm:inline",children:i(a.labelKey)})]},a.id)})})]}),(0,b.jsxs)("div",{className:"flex flex-col gap-3",children:[("all"===j||"agent"===j)&&(0,b.jsx)("div",{id:"section-agent",className:"scroll-mt-18 rounded-lg",children:(0,b.jsx)(F,{settings:a})}),("all"===j||"environment"===j)&&(0,b.jsx)("div",{id:"section-environment",className:"scroll-mt-18 rounded-lg",children:(0,b.jsx)(Y,{settings:a,availableEditors:g,availableShells:h,availableTerminals:f})}),("all"===j||"workflow"===j)&&(0,b.jsx)("div",{id:"section-workflow",className:"scroll-mt-18 rounded-lg",children:(0,b.jsx)($,{settings:a})}),("all"===j||"ci"===j)&&(0,b.jsx)("div",{id:"section-ci",className:"scroll-mt-18 rounded-lg",children:(0,b.jsx)(aa,{settings:a})}),("all"===j||"stage-timeouts"===j)&&(0,b.jsx)("div",{id:"section-stage-timeouts",className:"scroll-mt-18 rounded-lg",children:(0,b.jsx)(aT,{settings:a})}),("all"===j||"notifications"===j)&&(0,b.jsx)("div",{id:"section-notifications",className:"scroll-mt-18 rounded-lg",children:(0,b.jsx)(aU,{settings:a})}),("all"===j||"feature-flags"===j)&&(0,b.jsx)("div",{id:"section-feature-flags",className:"scroll-mt-18 rounded-lg",children:(0,b.jsx)(aV,{settings:a})}),("all"===j||"interactive-agent"===j)&&(0,b.jsx)("div",{id:"section-interactive-agent",className:"scroll-mt-18 rounded-lg",children:(0,b.jsx)(aW,{settings:a})}),("all"===j||"fab-layout"===j)&&(0,b.jsx)("div",{id:"section-fab-layout",className:"scroll-mt-18 rounded-lg",children:(0,b.jsx)(aX,{settings:a})}),("all"===j||"database"===j)&&(0,b.jsx)("div",{id:"section-database",className:"scroll-mt-18 rounded-lg",children:(0,b.jsx)(aY,{shipitAiHome:d,dbFileSize:e})}),("all"===j||"litellm-proxy"===j)&&(0,b.jsxs)("div",{id:"section-litellm-proxy",className:"scroll-mt-18 rounded-lg",children:[(0,b.jsx)(a2,{settings:a}),a.litellmProxy?.baseUrl?(0,b.jsx)(a5,{settings:a}):null]})]})]})}],79020)}];
2
2
 
3
3
  //# sourceMappingURL=0ukq_presentation_web_components_features_settings_settings-page-client_tsx_0j1uius._.js.map