@shepai/cli 1.155.0-pr485.4c45fca → 1.155.0-pr486.e53674d

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 (537) hide show
  1. package/apis/json-schema/UserProfile.yaml +0 -3
  2. package/dist/packages/core/src/domain/generated/output.d.ts +0 -14
  3. package/dist/packages/core/src/domain/generated/output.d.ts.map +1 -1
  4. package/dist/packages/core/src/domain/generated/output.js +0 -11
  5. package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/settings.mapper.d.ts +0 -1
  6. package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/settings.mapper.d.ts.map +1 -1
  7. package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/settings.mapper.js +2 -4
  8. package/dist/packages/core/src/infrastructure/repositories/sqlite-settings.repository.d.ts.map +1 -1
  9. package/dist/packages/core/src/infrastructure/repositories/sqlite-settings.repository.js +2 -3
  10. package/dist/packages/core/src/infrastructure/services/tool-installer/tool-installer.service.d.ts.map +1 -1
  11. package/dist/packages/core/src/infrastructure/services/tool-installer/tool-installer.service.js +1 -3
  12. package/dist/packages/core/src/infrastructure/services/tool-installer/tools/claude-code.json +4 -3
  13. package/dist/src/presentation/cli/commands/_serve.command.d.ts.map +1 -1
  14. package/dist/src/presentation/cli/commands/_serve.command.js +3 -5
  15. package/dist/src/presentation/cli/commands/agent/approve.command.d.ts.map +1 -1
  16. package/dist/src/presentation/cli/commands/agent/approve.command.js +4 -9
  17. package/dist/src/presentation/cli/commands/agent/delete.command.d.ts.map +1 -1
  18. package/dist/src/presentation/cli/commands/agent/delete.command.js +5 -9
  19. package/dist/src/presentation/cli/commands/agent/index.d.ts.map +1 -1
  20. package/dist/src/presentation/cli/commands/agent/index.js +1 -3
  21. package/dist/src/presentation/cli/commands/agent/logs.command.d.ts.map +1 -1
  22. package/dist/src/presentation/cli/commands/agent/logs.command.js +5 -7
  23. package/dist/src/presentation/cli/commands/agent/ls.command.d.ts.map +1 -1
  24. package/dist/src/presentation/cli/commands/agent/ls.command.js +10 -12
  25. package/dist/src/presentation/cli/commands/agent/reject.command.d.ts.map +1 -1
  26. package/dist/src/presentation/cli/commands/agent/reject.command.js +5 -10
  27. package/dist/src/presentation/cli/commands/agent/resolve-run.d.ts.map +1 -1
  28. package/dist/src/presentation/cli/commands/agent/resolve-run.js +2 -7
  29. package/dist/src/presentation/cli/commands/agent/show.command.d.ts.map +1 -1
  30. package/dist/src/presentation/cli/commands/agent/show.command.js +6 -8
  31. package/dist/src/presentation/cli/commands/agent/stop.command.d.ts.map +1 -1
  32. package/dist/src/presentation/cli/commands/agent/stop.command.js +4 -9
  33. package/dist/src/presentation/cli/commands/daemon/start-daemon.d.ts.map +1 -1
  34. package/dist/src/presentation/cli/commands/daemon/start-daemon.js +8 -10
  35. package/dist/src/presentation/cli/commands/daemon/stop-daemon.d.ts.map +1 -1
  36. package/dist/src/presentation/cli/commands/daemon/stop-daemon.js +3 -5
  37. package/dist/src/presentation/cli/commands/feat/adopt.command.d.ts.map +1 -1
  38. package/dist/src/presentation/cli/commands/feat/adopt.command.js +12 -14
  39. package/dist/src/presentation/cli/commands/feat/approve.command.d.ts.map +1 -1
  40. package/dist/src/presentation/cli/commands/feat/approve.command.js +6 -8
  41. package/dist/src/presentation/cli/commands/feat/archive.command.d.ts.map +1 -1
  42. package/dist/src/presentation/cli/commands/feat/archive.command.js +8 -10
  43. package/dist/src/presentation/cli/commands/feat/del.command.d.ts.map +1 -1
  44. package/dist/src/presentation/cli/commands/feat/del.command.js +15 -17
  45. package/dist/src/presentation/cli/commands/feat/index.d.ts.map +1 -1
  46. package/dist/src/presentation/cli/commands/feat/index.js +1 -2
  47. package/dist/src/presentation/cli/commands/feat/logs.command.d.ts.map +1 -1
  48. package/dist/src/presentation/cli/commands/feat/logs.command.js +6 -8
  49. package/dist/src/presentation/cli/commands/feat/ls.command.d.ts.map +1 -1
  50. package/dist/src/presentation/cli/commands/feat/ls.command.js +12 -14
  51. package/dist/src/presentation/cli/commands/feat/new.command.d.ts.map +1 -1
  52. package/dist/src/presentation/cli/commands/feat/new.command.js +37 -43
  53. package/dist/src/presentation/cli/commands/feat/reject.command.d.ts.map +1 -1
  54. package/dist/src/presentation/cli/commands/feat/reject.command.js +9 -11
  55. package/dist/src/presentation/cli/commands/feat/resolve-waiting-feature.d.ts.map +1 -1
  56. package/dist/src/presentation/cli/commands/feat/resolve-waiting-feature.js +5 -12
  57. package/dist/src/presentation/cli/commands/feat/resume.command.d.ts.map +1 -1
  58. package/dist/src/presentation/cli/commands/feat/resume.command.js +6 -8
  59. package/dist/src/presentation/cli/commands/feat/review.command.d.ts.map +1 -1
  60. package/dist/src/presentation/cli/commands/feat/review.command.js +15 -17
  61. package/dist/src/presentation/cli/commands/feat/show.command.d.ts.map +1 -1
  62. package/dist/src/presentation/cli/commands/feat/show.command.js +45 -89
  63. package/dist/src/presentation/cli/commands/feat/start.command.d.ts.map +1 -1
  64. package/dist/src/presentation/cli/commands/feat/start.command.js +10 -12
  65. package/dist/src/presentation/cli/commands/feat/unarchive.command.d.ts.map +1 -1
  66. package/dist/src/presentation/cli/commands/feat/unarchive.command.js +6 -8
  67. package/dist/src/presentation/cli/commands/ide-open.command.d.ts.map +1 -1
  68. package/dist/src/presentation/cli/commands/ide-open.command.js +5 -10
  69. package/dist/src/presentation/cli/commands/install.command.d.ts.map +1 -1
  70. package/dist/src/presentation/cli/commands/install.command.js +21 -29
  71. package/dist/src/presentation/cli/commands/log-viewer.d.ts.map +1 -1
  72. package/dist/src/presentation/cli/commands/log-viewer.js +3 -6
  73. package/dist/src/presentation/cli/commands/repo/add.command.d.ts.map +1 -1
  74. package/dist/src/presentation/cli/commands/repo/add.command.js +10 -12
  75. package/dist/src/presentation/cli/commands/repo/index.d.ts.map +1 -1
  76. package/dist/src/presentation/cli/commands/repo/index.js +1 -3
  77. package/dist/src/presentation/cli/commands/repo/ls.command.d.ts.map +1 -1
  78. package/dist/src/presentation/cli/commands/repo/ls.command.js +9 -11
  79. package/dist/src/presentation/cli/commands/repo/resolve-repository.d.ts.map +1 -1
  80. package/dist/src/presentation/cli/commands/repo/resolve-repository.js +2 -7
  81. package/dist/src/presentation/cli/commands/repo/show.command.d.ts.map +1 -1
  82. package/dist/src/presentation/cli/commands/repo/show.command.js +10 -21
  83. package/dist/src/presentation/cli/commands/restart.command.d.ts.map +1 -1
  84. package/dist/src/presentation/cli/commands/restart.command.js +4 -6
  85. package/dist/src/presentation/cli/commands/run.command.d.ts.map +1 -1
  86. package/dist/src/presentation/cli/commands/run.command.js +17 -21
  87. package/dist/src/presentation/cli/commands/session/index.d.ts.map +1 -1
  88. package/dist/src/presentation/cli/commands/session/index.js +1 -3
  89. package/dist/src/presentation/cli/commands/session/ls.command.d.ts.map +1 -1
  90. package/dist/src/presentation/cli/commands/session/ls.command.js +9 -11
  91. package/dist/src/presentation/cli/commands/session/show.command.d.ts.map +1 -1
  92. package/dist/src/presentation/cli/commands/session/show.command.js +18 -26
  93. package/dist/src/presentation/cli/commands/settings/agent.command.d.ts.map +1 -1
  94. package/dist/src/presentation/cli/commands/settings/agent.command.js +8 -12
  95. package/dist/src/presentation/cli/commands/settings/ide.command.d.ts.map +1 -1
  96. package/dist/src/presentation/cli/commands/settings/ide.command.js +7 -13
  97. package/dist/src/presentation/cli/commands/settings/index.d.ts +0 -1
  98. package/dist/src/presentation/cli/commands/settings/index.d.ts.map +1 -1
  99. package/dist/src/presentation/cli/commands/settings/index.js +3 -7
  100. package/dist/src/presentation/cli/commands/settings/init.command.d.ts.map +1 -1
  101. package/dist/src/presentation/cli/commands/settings/init.command.js +7 -8
  102. package/dist/src/presentation/cli/commands/settings/model.command.d.ts.map +1 -1
  103. package/dist/src/presentation/cli/commands/settings/model.command.js +6 -7
  104. package/dist/src/presentation/cli/commands/settings/show.command.d.ts.map +1 -1
  105. package/dist/src/presentation/cli/commands/settings/show.command.js +3 -4
  106. package/dist/src/presentation/cli/commands/settings/workflow.command.d.ts.map +1 -1
  107. package/dist/src/presentation/cli/commands/settings/workflow.command.js +18 -20
  108. package/dist/src/presentation/cli/commands/start.command.d.ts.map +1 -1
  109. package/dist/src/presentation/cli/commands/start.command.js +3 -5
  110. package/dist/src/presentation/cli/commands/status.command.d.ts.map +1 -1
  111. package/dist/src/presentation/cli/commands/status.command.js +24 -32
  112. package/dist/src/presentation/cli/commands/stop.command.d.ts.map +1 -1
  113. package/dist/src/presentation/cli/commands/stop.command.js +2 -4
  114. package/dist/src/presentation/cli/commands/tools.command.d.ts.map +1 -1
  115. package/dist/src/presentation/cli/commands/tools.command.js +4 -8
  116. package/dist/src/presentation/cli/commands/ui.command.d.ts.map +1 -1
  117. package/dist/src/presentation/cli/commands/ui.command.js +10 -12
  118. package/dist/src/presentation/cli/commands/upgrade.command.d.ts.map +1 -1
  119. package/dist/src/presentation/cli/commands/upgrade.command.js +13 -18
  120. package/dist/src/presentation/cli/commands/version.command.d.ts.map +1 -1
  121. package/dist/src/presentation/cli/commands/version.command.js +3 -5
  122. package/dist/src/presentation/cli/index.js +1 -13
  123. package/dist/src/presentation/cli/ui/install-messages.d.ts.map +1 -1
  124. package/dist/src/presentation/cli/ui/install-messages.js +6 -16
  125. package/dist/src/presentation/tui/prompts/agent-select.prompt.d.ts +31 -13
  126. package/dist/src/presentation/tui/prompts/agent-select.prompt.d.ts.map +1 -1
  127. package/dist/src/presentation/tui/prompts/agent-select.prompt.js +15 -17
  128. package/dist/src/presentation/tui/prompts/auth-method.prompt.d.ts +11 -7
  129. package/dist/src/presentation/tui/prompts/auth-method.prompt.d.ts.map +1 -1
  130. package/dist/src/presentation/tui/prompts/auth-method.prompt.js +5 -7
  131. package/dist/src/presentation/tui/prompts/ide-select.prompt.d.ts.map +1 -1
  132. package/dist/src/presentation/tui/prompts/ide-select.prompt.js +1 -2
  133. package/dist/src/presentation/tui/prompts/prd-review-summary.prompt.d.ts.map +1 -1
  134. package/dist/src/presentation/tui/prompts/prd-review-summary.prompt.js +6 -8
  135. package/dist/src/presentation/tui/wizards/agent-config.wizard.d.ts.map +1 -1
  136. package/dist/src/presentation/tui/wizards/agent-config.wizard.js +1 -2
  137. package/dist/src/presentation/tui/wizards/github-import.wizard.d.ts.map +1 -1
  138. package/dist/src/presentation/tui/wizards/github-import.wizard.js +11 -15
  139. package/dist/src/presentation/tui/wizards/merge-review.wizard.d.ts.map +1 -1
  140. package/dist/src/presentation/tui/wizards/merge-review.wizard.js +8 -10
  141. package/dist/src/presentation/tui/wizards/onboarding/onboarding.wizard.d.ts.map +1 -1
  142. package/dist/src/presentation/tui/wizards/onboarding/onboarding.wizard.js +7 -10
  143. package/dist/src/presentation/tui/wizards/onboarding/steps/workflow-defaults.step.d.ts +41 -0
  144. package/dist/src/presentation/tui/wizards/onboarding/steps/workflow-defaults.step.d.ts.map +1 -1
  145. package/dist/src/presentation/tui/wizards/onboarding/steps/workflow-defaults.step.js +15 -15
  146. package/dist/src/presentation/tui/wizards/plan-review.wizard.d.ts.map +1 -1
  147. package/dist/src/presentation/tui/wizards/plan-review.wizard.js +8 -10
  148. package/dist/src/presentation/tui/wizards/prd-review.wizard.d.ts.map +1 -1
  149. package/dist/src/presentation/tui/wizards/prd-review.wizard.js +2 -3
  150. package/dist/src/presentation/web/app/layout.d.ts.map +1 -1
  151. package/dist/src/presentation/web/app/layout.js +2 -5
  152. package/dist/src/presentation/web/components/assistant-ui/thread.js +5 -5
  153. package/dist/src/presentation/web/components/common/attachment-chip/attachment-chip.js +1 -1
  154. package/dist/src/presentation/web/components/common/base-drawer/base-drawer.js +1 -1
  155. package/dist/src/presentation/web/components/common/ci-status-badge/ci-status-badge.js +3 -3
  156. package/dist/src/presentation/web/components/common/control-center-drawer/adopt-branch-drawer.js +4 -4
  157. package/dist/src/presentation/web/components/common/control-center-drawer/repository-drawer-client.js +1 -1
  158. package/dist/src/presentation/web/components/common/delete-feature-dialog/delete-feature-dialog.d.ts.map +1 -1
  159. package/dist/src/presentation/web/components/common/delete-feature-dialog/delete-feature-dialog.js +1 -3
  160. package/dist/src/presentation/web/components/common/deployment-status-badge/deployment-status-badge.js +2 -2
  161. package/dist/src/presentation/web/components/common/drawer-action-bar/drawer-action-bar.js +2 -2
  162. package/dist/src/presentation/web/components/common/empty-state/empty-state.stories.js +2 -2
  163. package/dist/src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.js +2 -2
  164. package/dist/src/presentation/web/components/common/feature-drawer-tabs/activity-tab.js +4 -4
  165. package/dist/src/presentation/web/components/common/feature-drawer-tabs/branch-sync-status.js +1 -1
  166. package/dist/src/presentation/web/components/common/feature-drawer-tabs/feature-drawer-tabs.js +1 -1
  167. package/dist/src/presentation/web/components/common/feature-drawer-tabs/log-tab.js +1 -1
  168. package/dist/src/presentation/web/components/common/feature-drawer-tabs/overview-tab.js +1 -1
  169. package/dist/src/presentation/web/components/common/feature-list-item/feature-list-item.js +1 -1
  170. package/dist/src/presentation/web/components/common/feature-node/feature-node-state-config.d.ts +2 -2
  171. package/dist/src/presentation/web/components/common/feature-node/feature-node-state-config.d.ts.map +1 -1
  172. package/dist/src/presentation/web/components/common/feature-node/feature-node-state-config.js +22 -22
  173. package/dist/src/presentation/web/components/common/feature-node/feature-node.js +4 -4
  174. package/dist/src/presentation/web/components/common/feature-node/feature-sessions-dropdown.js +1 -1
  175. package/dist/src/presentation/web/components/common/feature-status-group/feature-status-group.js +1 -1
  176. package/dist/src/presentation/web/components/common/github-import-dialog/github-repo-browser.js +1 -1
  177. package/dist/src/presentation/web/components/common/merge-review/diff-view.js +2 -2
  178. package/dist/src/presentation/web/components/common/merge-review/merge-review.js +2 -2
  179. package/dist/src/presentation/web/components/common/prd-questionnaire/prd-questionnaire.js +3 -3
  180. package/dist/src/presentation/web/components/common/reject-feedback-dialog/reject-feedback-dialog.d.ts.map +1 -1
  181. package/dist/src/presentation/web/components/common/reject-feedback-dialog/reject-feedback-dialog.js +4 -6
  182. package/dist/src/presentation/web/components/common/repository-node/repository-node.js +3 -3
  183. package/dist/src/presentation/web/components/common/server-log-viewer/server-log-viewer.js +1 -1
  184. package/dist/src/presentation/web/components/common/task-progress-view/task-progress-view.js +2 -2
  185. package/dist/src/presentation/web/components/common/tech-decisions-review/tech-decisions-review.js +2 -2
  186. package/dist/src/presentation/web/components/common/version-badge/version-badge.js +1 -1
  187. package/dist/src/presentation/web/components/features/chat/ChatMessageBubble.js +4 -4
  188. package/dist/src/presentation/web/components/features/chat/ChatMessageList.js +1 -1
  189. package/dist/src/presentation/web/components/features/chat/ChatTab.js +1 -1
  190. package/dist/src/presentation/web/components/features/control-center/control-center-empty-state.d.ts.map +1 -1
  191. package/dist/src/presentation/web/components/features/control-center/control-center-empty-state.js +11 -15
  192. package/dist/src/presentation/web/components/features/control-center/welcome-agent-setup.d.ts.map +1 -1
  193. package/dist/src/presentation/web/components/features/control-center/welcome-agent-setup.js +6 -8
  194. package/dist/src/presentation/web/components/features/features-canvas/canvas-toolbar.d.ts.map +1 -1
  195. package/dist/src/presentation/web/components/features/features-canvas/canvas-toolbar.js +1 -3
  196. package/dist/src/presentation/web/components/features/features-canvas/features-canvas.d.ts.map +1 -1
  197. package/dist/src/presentation/web/components/features/features-canvas/features-canvas.js +2 -4
  198. package/dist/src/presentation/web/components/features/settings/AgentModelPicker/index.js +2 -2
  199. package/dist/src/presentation/web/components/features/settings/ModelPicker/index.js +2 -2
  200. package/dist/src/presentation/web/components/features/settings/agent-settings-section.js +1 -1
  201. package/dist/src/presentation/web/components/features/settings/settings-page-client.d.ts.map +1 -1
  202. package/dist/src/presentation/web/components/features/settings/settings-page-client.js +77 -89
  203. package/dist/src/presentation/web/components/features/settings/timeout-slider.js +1 -1
  204. package/dist/src/presentation/web/components/features/skills/category-filter.js +1 -1
  205. package/dist/src/presentation/web/components/features/skills/skills-page-client.js +1 -1
  206. package/dist/src/presentation/web/components/features/tools/tool-card.js +1 -1
  207. package/dist/src/presentation/web/components/features/tools/tool-detail-drawer.js +2 -2
  208. package/dist/src/presentation/web/components/layouts/app-sidebar/app-sidebar.d.ts.map +1 -1
  209. package/dist/src/presentation/web/components/layouts/app-sidebar/app-sidebar.js +4 -10
  210. package/dist/src/presentation/web/components/ui/alert-dialog.js +1 -1
  211. package/dist/src/presentation/web/components/ui/alert.js +1 -1
  212. package/dist/src/presentation/web/components/ui/checkbox-group.js +1 -1
  213. package/dist/src/presentation/web/components/ui/command.js +1 -1
  214. package/dist/src/presentation/web/components/ui/dialog.d.ts.map +1 -1
  215. package/dist/src/presentation/web/components/ui/dialog.js +2 -2
  216. package/dist/src/presentation/web/components/ui/dialog.stories.js +1 -1
  217. package/dist/src/presentation/web/components/ui/drawer.js +1 -1
  218. package/dist/src/presentation/web/components/ui/dropdown-menu.js +6 -6
  219. package/dist/src/presentation/web/components/ui/scroll-area.js +1 -1
  220. package/dist/src/presentation/web/components/ui/select.js +1 -1
  221. package/dist/src/presentation/web/components/ui/sheet.js +1 -1
  222. package/dist/src/presentation/web/components/ui/sidebar.js +6 -6
  223. package/dist/src/presentation/web/hooks/use-sound-action.stories.js +1 -1
  224. package/dist/tsconfig.build.tsbuildinfo +1 -1
  225. package/package.json +2 -4
  226. package/web/.next/BUILD_ID +1 -1
  227. package/web/.next/build-manifest.json +2 -2
  228. package/web/.next/fallback-build-manifest.json +2 -2
  229. package/web/.next/prerender-manifest.json +3 -3
  230. package/web/.next/required-server-files.js +1 -1
  231. package/web/.next/required-server-files.json +1 -1
  232. package/web/.next/server/app/(dashboard)/@drawer/adopt/page/server-reference-manifest.json +28 -28
  233. package/web/.next/server/app/(dashboard)/@drawer/adopt/page.js +3 -3
  234. package/web/.next/server/app/(dashboard)/@drawer/adopt/page.js.nft.json +1 -1
  235. package/web/.next/server/app/(dashboard)/@drawer/adopt/page_client-reference-manifest.js +1 -1
  236. package/web/.next/server/app/(dashboard)/@drawer/chat/page/server-reference-manifest.json +26 -26
  237. package/web/.next/server/app/(dashboard)/@drawer/chat/page.js +3 -3
  238. package/web/.next/server/app/(dashboard)/@drawer/chat/page.js.nft.json +1 -1
  239. package/web/.next/server/app/(dashboard)/@drawer/chat/page_client-reference-manifest.js +1 -1
  240. package/web/.next/server/app/(dashboard)/@drawer/create/page/server-reference-manifest.json +29 -29
  241. package/web/.next/server/app/(dashboard)/@drawer/create/page.js +3 -3
  242. package/web/.next/server/app/(dashboard)/@drawer/create/page.js.nft.json +1 -1
  243. package/web/.next/server/app/(dashboard)/@drawer/create/page_client-reference-manifest.js +1 -1
  244. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page/server-reference-manifest.json +36 -36
  245. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page.js +4 -4
  246. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page.js.nft.json +1 -1
  247. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page_client-reference-manifest.js +1 -1
  248. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page/server-reference-manifest.json +36 -36
  249. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js +4 -4
  250. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js.nft.json +1 -1
  251. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page_client-reference-manifest.js +1 -1
  252. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/[tab]/page/server-reference-manifest.json +26 -26
  253. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/[tab]/page.js +3 -3
  254. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/[tab]/page.js.nft.json +1 -1
  255. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/[tab]/page_client-reference-manifest.js +1 -1
  256. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page/server-reference-manifest.json +26 -26
  257. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js +3 -3
  258. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js.nft.json +1 -1
  259. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  260. package/web/.next/server/app/(dashboard)/chat/page/server-reference-manifest.json +26 -26
  261. package/web/.next/server/app/(dashboard)/chat/page.js +3 -3
  262. package/web/.next/server/app/(dashboard)/chat/page.js.nft.json +1 -1
  263. package/web/.next/server/app/(dashboard)/chat/page_client-reference-manifest.js +1 -1
  264. package/web/.next/server/app/(dashboard)/create/page/server-reference-manifest.json +29 -29
  265. package/web/.next/server/app/(dashboard)/create/page.js +3 -3
  266. package/web/.next/server/app/(dashboard)/create/page.js.nft.json +1 -1
  267. package/web/.next/server/app/(dashboard)/create/page_client-reference-manifest.js +1 -1
  268. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page/server-reference-manifest.json +36 -36
  269. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page.js +4 -4
  270. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page.js.nft.json +1 -1
  271. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page_client-reference-manifest.js +1 -1
  272. package/web/.next/server/app/(dashboard)/feature/[featureId]/page/server-reference-manifest.json +36 -36
  273. package/web/.next/server/app/(dashboard)/feature/[featureId]/page.js +4 -4
  274. package/web/.next/server/app/(dashboard)/feature/[featureId]/page.js.nft.json +1 -1
  275. package/web/.next/server/app/(dashboard)/feature/[featureId]/page_client-reference-manifest.js +1 -1
  276. package/web/.next/server/app/(dashboard)/page/server-reference-manifest.json +26 -26
  277. package/web/.next/server/app/(dashboard)/page.js +3 -3
  278. package/web/.next/server/app/(dashboard)/page.js.nft.json +1 -1
  279. package/web/.next/server/app/(dashboard)/page_client-reference-manifest.js +1 -1
  280. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/[tab]/page/server-reference-manifest.json +26 -26
  281. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/[tab]/page.js +3 -3
  282. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/[tab]/page.js.nft.json +1 -1
  283. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/[tab]/page_client-reference-manifest.js +1 -1
  284. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page/server-reference-manifest.json +26 -26
  285. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js +3 -3
  286. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js.nft.json +1 -1
  287. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  288. package/web/.next/server/app/_global-error.html +2 -2
  289. package/web/.next/server/app/_global-error.rsc +1 -1
  290. package/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  291. package/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  292. package/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  293. package/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  294. package/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  295. package/web/.next/server/app/_not-found/page/server-reference-manifest.json +5 -5
  296. package/web/.next/server/app/_not-found/page.js +2 -2
  297. package/web/.next/server/app/_not-found/page.js.nft.json +1 -1
  298. package/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  299. package/web/.next/server/app/api/attachments/preview/route.js.nft.json +1 -1
  300. package/web/.next/server/app/api/evidence/route.js.nft.json +1 -1
  301. package/web/.next/server/app/api/graph-data/route.js.nft.json +1 -1
  302. package/web/.next/server/app/api/interactive/chat/[featureId]/messages/route.js.nft.json +1 -1
  303. package/web/.next/server/app/settings/page/server-reference-manifest.json +8 -8
  304. package/web/.next/server/app/settings/page.js +2 -2
  305. package/web/.next/server/app/settings/page.js.nft.json +1 -1
  306. package/web/.next/server/app/settings/page_client-reference-manifest.js +1 -1
  307. package/web/.next/server/app/skills/page/server-reference-manifest.json +10 -10
  308. package/web/.next/server/app/skills/page.js +4 -3
  309. package/web/.next/server/app/skills/page.js.nft.json +1 -1
  310. package/web/.next/server/app/skills/page_client-reference-manifest.js +1 -1
  311. package/web/.next/server/app/tools/page/server-reference-manifest.json +10 -10
  312. package/web/.next/server/app/tools/page.js +4 -3
  313. package/web/.next/server/app/tools/page.js.nft.json +1 -1
  314. package/web/.next/server/app/tools/page_client-reference-manifest.js +1 -1
  315. package/web/.next/server/app/version/page/server-reference-manifest.json +5 -5
  316. package/web/.next/server/app/version/page.js +2 -2
  317. package/web/.next/server/app/version/page.js.nft.json +1 -1
  318. package/web/.next/server/app/version/page_client-reference-manifest.js +1 -1
  319. package/web/.next/server/chunks/[root-of-the-server]__a402b567._.js +1 -1
  320. package/web/.next/server/chunks/[root-of-the-server]__beda892a._.js +1 -1
  321. package/web/.next/server/chunks/[root-of-the-server]__beda892a._.js.map +1 -1
  322. package/web/.next/server/chunks/[root-of-the-server]__cd67a84c._.js +1 -1
  323. package/web/.next/server/chunks/[root-of-the-server]__cd67a84c._.js.map +1 -1
  324. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js +1 -1
  325. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js.map +1 -1
  326. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_feature-drawer-client_tsx_e9755fc8._.js +2 -2
  327. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_feature-drawer-client_tsx_e9755fc8._.js.map +1 -1
  328. package/web/.next/server/chunks/ssr/[root-of-the-server]__0b150ddf._.js +3 -0
  329. package/web/.next/server/chunks/ssr/[root-of-the-server]__0b150ddf._.js.map +1 -0
  330. package/web/.next/server/chunks/ssr/{[root-of-the-server]__27301e38._.js → [root-of-the-server]__17ed7ed1._.js} +2 -2
  331. package/web/.next/server/chunks/ssr/{[root-of-the-server]__27301e38._.js.map → [root-of-the-server]__17ed7ed1._.js.map} +1 -1
  332. package/web/.next/server/chunks/ssr/{[root-of-the-server]__8d27866c._.js → [root-of-the-server]__28d0d265._.js} +3 -3
  333. package/web/.next/server/chunks/ssr/[root-of-the-server]__28d0d265._.js.map +1 -0
  334. package/web/.next/server/chunks/ssr/[root-of-the-server]__357d99f9._.js +1 -1
  335. package/web/.next/server/chunks/ssr/{[root-of-the-server]__6fecf886._.js → [root-of-the-server]__42bf1807._.js} +2 -2
  336. package/web/.next/server/chunks/ssr/{[root-of-the-server]__6fecf886._.js.map → [root-of-the-server]__42bf1807._.js.map} +1 -1
  337. package/web/.next/server/chunks/ssr/[root-of-the-server]__56b70465._.js +1 -1
  338. package/web/.next/server/chunks/ssr/[root-of-the-server]__56b70465._.js.map +1 -1
  339. package/web/.next/server/chunks/ssr/[root-of-the-server]__5edfc56b._.js +1 -1
  340. package/web/.next/server/chunks/ssr/{[root-of-the-server]__209c9597._.js → [root-of-the-server]__88f7e8e6._.js} +2 -2
  341. package/web/.next/server/chunks/ssr/{[root-of-the-server]__209c9597._.js.map → [root-of-the-server]__88f7e8e6._.js.map} +1 -1
  342. package/web/.next/server/chunks/ssr/[root-of-the-server]__8b0aac03._.js +1 -1
  343. package/web/.next/server/chunks/ssr/[root-of-the-server]__c30f1f82._.js +1 -1
  344. package/web/.next/server/chunks/ssr/[root-of-the-server]__c30f1f82._.js.map +1 -1
  345. package/web/.next/server/chunks/ssr/[root-of-the-server]__e91ffd5e._.js +2 -2
  346. package/web/.next/server/chunks/ssr/[root-of-the-server]__e91ffd5e._.js.map +1 -1
  347. package/web/.next/server/chunks/ssr/{[root-of-the-server]__9f3504c7._.js → [root-of-the-server]__f80bfc75._.js} +2 -2
  348. package/web/.next/server/chunks/ssr/{[root-of-the-server]__9f3504c7._.js.map → [root-of-the-server]__f80bfc75._.js.map} +1 -1
  349. package/web/.next/server/chunks/ssr/{[root-of-the-server]__25ee8d4c._.js → [root-of-the-server]__f8dd4422._.js} +2 -2
  350. package/web/.next/server/chunks/ssr/[root-of-the-server]__f8dd4422._.js.map +1 -0
  351. package/web/.next/server/chunks/ssr/_05c23ad9._.js +1 -1
  352. package/web/.next/server/chunks/ssr/_05c23ad9._.js.map +1 -1
  353. package/web/.next/server/chunks/ssr/_16eb4fec._.js +1 -1
  354. package/web/.next/server/chunks/ssr/_16eb4fec._.js.map +1 -1
  355. package/web/.next/server/chunks/ssr/_3a0b989f._.js +2 -2
  356. package/web/.next/server/chunks/ssr/_3a0b989f._.js.map +1 -1
  357. package/web/.next/server/chunks/ssr/_41633e32._.js +3 -0
  358. package/web/.next/server/chunks/ssr/{_28e7429c._.js.map → _41633e32._.js.map} +1 -1
  359. package/web/.next/server/chunks/ssr/_4b432739._.js +3 -0
  360. package/web/.next/server/chunks/ssr/_4b432739._.js.map +1 -0
  361. package/web/.next/server/chunks/ssr/{_b9ba2473._.js → _507a8382._.js} +2 -2
  362. package/web/.next/server/chunks/ssr/_507a8382._.js.map +1 -0
  363. package/web/.next/server/chunks/ssr/_56b9d60f._.js +1 -1
  364. package/web/.next/server/chunks/ssr/_56b9d60f._.js.map +1 -1
  365. package/web/.next/server/chunks/ssr/{_7773b2dc._.js → _59d0f988._.js} +2 -2
  366. package/web/.next/server/chunks/ssr/{_7773b2dc._.js.map → _59d0f988._.js.map} +1 -1
  367. package/web/.next/server/chunks/ssr/_5f69c13f._.js +1 -1
  368. package/web/.next/server/chunks/ssr/_5f69c13f._.js.map +1 -1
  369. package/web/.next/server/chunks/ssr/{_3bcda5d7._.js → _67104d9e._.js} +2 -2
  370. package/web/.next/server/chunks/ssr/{_3bcda5d7._.js.map → _67104d9e._.js.map} +1 -1
  371. package/web/.next/server/chunks/ssr/_7c5b97c6._.js +1 -1
  372. package/web/.next/server/chunks/ssr/_7c5b97c6._.js.map +1 -1
  373. package/web/.next/server/chunks/ssr/_813095ef._.js +4 -0
  374. package/web/.next/server/chunks/ssr/_813095ef._.js.map +1 -0
  375. package/web/.next/server/chunks/ssr/_8219712a._.js +3 -0
  376. package/web/.next/server/chunks/ssr/_8219712a._.js.map +1 -0
  377. package/web/.next/server/chunks/ssr/_82c57f10._.js +1 -1
  378. package/web/.next/server/chunks/ssr/_82c57f10._.js.map +1 -1
  379. package/web/.next/server/chunks/ssr/_8b57edb8._.js +1 -1
  380. package/web/.next/server/chunks/ssr/_8b57edb8._.js.map +1 -1
  381. package/web/.next/server/chunks/ssr/_9495d50b._.js +1 -1
  382. package/web/.next/server/chunks/ssr/_9495d50b._.js.map +1 -1
  383. package/web/.next/server/chunks/ssr/_a0e3f7e4._.js +1 -1
  384. package/web/.next/server/chunks/ssr/_a0e3f7e4._.js.map +1 -1
  385. package/web/.next/server/chunks/ssr/_ac4a3873._.js +1 -1
  386. package/web/.next/server/chunks/ssr/_ac4a3873._.js.map +1 -1
  387. package/web/.next/server/chunks/ssr/_ca0aa7f0._.js +1 -1
  388. package/web/.next/server/chunks/ssr/_ca0aa7f0._.js.map +1 -1
  389. package/web/.next/server/chunks/ssr/_cb5a021e._.js +1 -1
  390. package/web/.next/server/chunks/ssr/_cb5a021e._.js.map +1 -1
  391. package/web/.next/server/chunks/ssr/_cfbd1d7e._.js +1 -1
  392. package/web/.next/server/chunks/ssr/_cfbd1d7e._.js.map +1 -1
  393. package/web/.next/server/chunks/ssr/_d4b20e29._.js +1 -1
  394. package/web/.next/server/chunks/ssr/_d4b20e29._.js.map +1 -1
  395. package/web/.next/server/chunks/ssr/_d86175ae._.js +1 -1
  396. package/web/.next/server/chunks/ssr/_d86175ae._.js.map +1 -1
  397. package/web/.next/server/chunks/ssr/_d8bedf13._.js +1 -1
  398. package/web/.next/server/chunks/ssr/_d8bedf13._.js.map +1 -1
  399. package/web/.next/server/chunks/ssr/_e9a73a63._.js +9 -0
  400. package/web/.next/server/chunks/ssr/_e9a73a63._.js.map +1 -0
  401. package/web/.next/server/chunks/ssr/_fa7efce3._.js +2 -2
  402. package/web/.next/server/chunks/ssr/_fa7efce3._.js.map +1 -1
  403. package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_settings_settings-page-client_tsx_6ed9d5f8._.js +1 -1
  404. package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_settings_settings-page-client_tsx_6ed9d5f8._.js.map +1 -1
  405. package/web/.next/server/chunks/ssr/src_presentation_web_324a47da._.js +1 -1
  406. package/web/.next/server/chunks/ssr/src_presentation_web_324a47da._.js.map +1 -1
  407. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_skills_page_actions_cdc632e3.js +3 -0
  408. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_skills_page_actions_cdc632e3.js.map +1 -0
  409. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_tools_page_actions_39ca0924.js +3 -0
  410. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_tools_page_actions_39ca0924.js.map +1 -0
  411. package/web/.next/server/chunks/ssr/src_presentation_web_app_actions_open-ide_ts_baaca5d5._.js +1 -1
  412. package/web/.next/server/chunks/ssr/src_presentation_web_components_357e3eb0._.js +3 -0
  413. package/web/.next/server/chunks/ssr/src_presentation_web_components_357e3eb0._.js.map +1 -0
  414. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js +1 -1
  415. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js.map +1 -1
  416. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_tools_tools-page-client_tsx_3d0aa70c._.js +1 -1
  417. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_tools_tools-page-client_tsx_3d0aa70c._.js.map +1 -1
  418. package/web/.next/server/chunks/ssr/src_presentation_web_db9fa0c2._.js.map +1 -1
  419. package/web/.next/server/pages/500.html +2 -2
  420. package/web/.next/server/server-reference-manifest.js +1 -1
  421. package/web/.next/server/server-reference-manifest.json +45 -45
  422. package/web/.next/static/chunks/{47477ed4c5871747.js → 11091b676d1b3bd4.js} +1 -1
  423. package/web/.next/static/chunks/125b250c28113507.js +1 -0
  424. package/web/.next/static/chunks/{74db65fa7bfb80bd.js → 22c459f1877b1e4f.js} +1 -1
  425. package/web/.next/static/chunks/2817c3b9d560aaeb.js +1 -0
  426. package/web/.next/static/chunks/{24d5e151f7de6b4c.js → 42e9d0c76e624005.js} +1 -1
  427. package/web/.next/static/chunks/{e4e358c4f67366fd.js → 4b2c4a5c35ebb70d.js} +1 -1
  428. package/web/.next/static/chunks/{d6e702c209c413ce.js → 5ae60a052ab5f437.js} +2 -2
  429. package/web/.next/static/chunks/{3deefc76ea55047c.js → 688971d5bad5dc7c.js} +1 -1
  430. package/web/.next/static/chunks/{1c07a9270515f2e3.js → 6e6cd6218f76e404.js} +2 -2
  431. package/web/.next/static/chunks/7a1a68bdc20f0428.js +1 -0
  432. package/web/.next/static/chunks/8590bd2e69b24b9e.css +1 -0
  433. package/web/.next/static/chunks/{536afd754a63da39.js → 902c670cb337840c.js} +1 -1
  434. package/web/.next/static/chunks/{4978be67c4e6498f.js → a676d236e8214de3.js} +3 -3
  435. package/web/.next/static/chunks/a7c1cddd7d406fb8.js +7 -0
  436. package/web/.next/static/chunks/b3be394b3cc24151.js +1 -0
  437. package/web/.next/static/chunks/b4080e40597d7f8e.js +1 -0
  438. package/web/.next/static/chunks/{bfdb66301af07da1.js → b4cde06eff374c59.js} +2 -2
  439. package/web/.next/static/chunks/cd54b758f58061d0.js +1 -0
  440. package/web/.next/static/chunks/da980f1c277bafcb.js +2 -0
  441. package/web/.next/static/chunks/{b674bc11b321a5ee.js → ea823175bb410162.js} +1 -1
  442. package/apis/json-schema/Language.yaml +0 -13
  443. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/049-add-language-preference.d.ts +0 -14
  444. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/049-add-language-preference.d.ts.map +0 -1
  445. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/049-add-language-preference.js +0 -19
  446. package/dist/src/presentation/cli/commands/settings/language.command.d.ts +0 -14
  447. package/dist/src/presentation/cli/commands/settings/language.command.d.ts.map +0 -1
  448. package/dist/src/presentation/cli/commands/settings/language.command.js +0 -79
  449. package/dist/src/presentation/cli/i18n.d.ts +0 -41
  450. package/dist/src/presentation/cli/i18n.d.ts.map +0 -1
  451. package/dist/src/presentation/cli/i18n.js +0 -100
  452. package/dist/src/presentation/tui/i18n.d.ts +0 -24
  453. package/dist/src/presentation/tui/i18n.d.ts.map +0 -1
  454. package/dist/src/presentation/tui/i18n.js +0 -48
  455. package/dist/src/presentation/web/components/features/settings/language-settings-section.d.ts +0 -5
  456. package/dist/src/presentation/web/components/features/settings/language-settings-section.d.ts.map +0 -1
  457. package/dist/src/presentation/web/components/features/settings/language-settings-section.js +0 -54
  458. package/dist/src/presentation/web/components/features/settings/language-settings-section.stories.d.ts +0 -18
  459. package/dist/src/presentation/web/components/features/settings/language-settings-section.stories.d.ts.map +0 -1
  460. package/dist/src/presentation/web/components/features/settings/language-settings-section.stories.js +0 -36
  461. package/dist/src/presentation/web/components/providers/i18n-provider.d.ts +0 -17
  462. package/dist/src/presentation/web/components/providers/i18n-provider.d.ts.map +0 -1
  463. package/dist/src/presentation/web/components/providers/i18n-provider.js +0 -36
  464. package/dist/src/presentation/web/lib/i18n.d.ts +0 -15
  465. package/dist/src/presentation/web/lib/i18n.d.ts.map +0 -1
  466. package/dist/src/presentation/web/lib/i18n.js +0 -46
  467. package/dist/src/presentation/web/lib/language.d.ts +0 -23
  468. package/dist/src/presentation/web/lib/language.d.ts.map +0 -1
  469. package/dist/src/presentation/web/lib/language.js +0 -37
  470. package/dist/src/presentation/web/lib/rtl-fonts.d.ts +0 -19
  471. package/dist/src/presentation/web/lib/rtl-fonts.d.ts.map +0 -1
  472. package/dist/src/presentation/web/lib/rtl-fonts.js +0 -51
  473. package/dist/translations/ar/cli.json +0 -613
  474. package/dist/translations/ar/common.json +0 -55
  475. package/dist/translations/ar/tui.json +0 -130
  476. package/dist/translations/ar/web.json +0 -320
  477. package/dist/translations/de/cli.json +0 -613
  478. package/dist/translations/de/common.json +0 -55
  479. package/dist/translations/de/tui.json +0 -109
  480. package/dist/translations/de/web.json +0 -306
  481. package/dist/translations/en/cli.json +0 -613
  482. package/dist/translations/en/common.json +0 -55
  483. package/dist/translations/en/tui.json +0 -130
  484. package/dist/translations/en/web.json +0 -320
  485. package/dist/translations/es/cli.json +0 -613
  486. package/dist/translations/es/common.json +0 -55
  487. package/dist/translations/es/tui.json +0 -130
  488. package/dist/translations/es/web.json +0 -320
  489. package/dist/translations/fr/cli.json +0 -613
  490. package/dist/translations/fr/common.json +0 -55
  491. package/dist/translations/fr/tui.json +0 -130
  492. package/dist/translations/fr/web.json +0 -320
  493. package/dist/translations/he/cli.json +0 -613
  494. package/dist/translations/he/common.json +0 -55
  495. package/dist/translations/he/tui.json +0 -130
  496. package/dist/translations/he/web.json +0 -320
  497. package/dist/translations/pt/cli.json +0 -613
  498. package/dist/translations/pt/common.json +0 -55
  499. package/dist/translations/pt/tui.json +0 -130
  500. package/dist/translations/pt/web.json +0 -320
  501. package/dist/translations/ru/cli.json +0 -613
  502. package/dist/translations/ru/common.json +0 -55
  503. package/dist/translations/ru/tui.json +0 -130
  504. package/dist/translations/ru/web.json +0 -320
  505. package/web/.next/server/chunks/ssr/[root-of-the-server]__25ee8d4c._.js.map +0 -1
  506. package/web/.next/server/chunks/ssr/[root-of-the-server]__8d27866c._.js.map +0 -1
  507. package/web/.next/server/chunks/ssr/[root-of-the-server]__bd6ed91a._.js +0 -4
  508. package/web/.next/server/chunks/ssr/[root-of-the-server]__bd6ed91a._.js.map +0 -1
  509. package/web/.next/server/chunks/ssr/[root-of-the-server]__dffa13c5._.js +0 -3
  510. package/web/.next/server/chunks/ssr/[root-of-the-server]__dffa13c5._.js.map +0 -1
  511. package/web/.next/server/chunks/ssr/_0cd9ca53._.js +0 -3
  512. package/web/.next/server/chunks/ssr/_0cd9ca53._.js.map +0 -1
  513. package/web/.next/server/chunks/ssr/_28e7429c._.js +0 -3
  514. package/web/.next/server/chunks/ssr/_470e90f4._.js +0 -9
  515. package/web/.next/server/chunks/ssr/_470e90f4._.js.map +0 -1
  516. package/web/.next/server/chunks/ssr/_5bfcc8de._.js +0 -4
  517. package/web/.next/server/chunks/ssr/_5bfcc8de._.js.map +0 -1
  518. package/web/.next/server/chunks/ssr/_b9ba2473._.js.map +0 -1
  519. package/web/.next/server/chunks/ssr/_d90b0a06._.js +0 -3
  520. package/web/.next/server/chunks/ssr/_d90b0a06._.js.map +0 -1
  521. package/web/.next/server/chunks/ssr/node_modules__pnpm_55cf6695._.js +0 -3
  522. package/web/.next/server/chunks/ssr/node_modules__pnpm_55cf6695._.js.map +0 -1
  523. package/web/.next/server/chunks/ssr/src_presentation_web_components_895e5bfa._.js +0 -3
  524. package/web/.next/server/chunks/ssr/src_presentation_web_components_895e5bfa._.js.map +0 -1
  525. package/web/.next/static/chunks/05c9ed792a1d9056.js +0 -1
  526. package/web/.next/static/chunks/2aada437f51df3e6.js +0 -1
  527. package/web/.next/static/chunks/2eeee9bcbf660a4b.js +0 -1
  528. package/web/.next/static/chunks/4a399ee2a9942a1b.js +0 -1
  529. package/web/.next/static/chunks/70390bd89521bc19.js +0 -1
  530. package/web/.next/static/chunks/8fd082719935d5e6.js +0 -1
  531. package/web/.next/static/chunks/91927044df8e28bb.js +0 -7
  532. package/web/.next/static/chunks/b1b5b0bf84caabd4.js +0 -1
  533. package/web/.next/static/chunks/b68b16b4c3528979.js +0 -2
  534. package/web/.next/static/chunks/d58e68d03d055a9b.css +0 -1
  535. /package/web/.next/static/{Uqo91vsr2HsZrCKrZOYMZ → _5yY0q7bqEA7bwlEo729P}/_buildManifest.js +0 -0
  536. /package/web/.next/static/{Uqo91vsr2HsZrCKrZOYMZ → _5yY0q7bqEA7bwlEo729P}/_clientMiddlewareManifest.json +0 -0
  537. /package/web/.next/static/{Uqo91vsr2HsZrCKrZOYMZ → _5yY0q7bqEA7bwlEo729P}/_ssgManifest.js +0 -0
@@ -1,18 +1,16 @@
1
1
  'use client';
2
2
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
3
  import { useState, useTransition, useRef, useEffect, useCallback } from 'react';
4
- import { Check, Bot, Terminal, GitBranch, Activity, Bell, Flag, Database, Globe, Minus, Plus, ExternalLink, Settings2, Timer, MessageSquare, } from 'lucide-react';
4
+ import { Check, Bot, Terminal, GitBranch, Activity, Bell, Flag, Database, Minus, Plus, ExternalLink, Settings2, Timer, MessageSquare, } from 'lucide-react';
5
5
  import { toast } from 'sonner';
6
- import { useTranslation } from 'react-i18next';
7
6
  import { cn } from '../../../lib/utils.js';
8
7
  import { Label } from '../../ui/label.js';
9
8
  import { Switch } from '../../ui/switch.js';
10
9
  import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from '../../ui/select.js';
11
10
  import { updateSettingsAction } from '../../../app/actions/update-settings.js';
12
- import { EditorType, Language, TerminalType, } from '../../../../../../packages/core/src/domain/generated/output.js';
11
+ import { EditorType, TerminalType } from '../../../../../../packages/core/src/domain/generated/output.js';
13
12
  import { getEditorTypeIcon } from '../../common/editor-type-icons.js';
14
13
  import { AgentModelPicker } from '../../features/settings/AgentModelPicker/index.js';
15
- import { LanguageSettingsSection } from '../../features/settings/language-settings-section.js';
16
14
  import { TimeoutSlider } from '../../features/settings/timeout-slider.js';
17
15
  const EDITOR_OPTIONS = [
18
16
  { value: EditorType.VsCode, label: 'VS Code' },
@@ -27,19 +25,17 @@ const SHELL_OPTIONS = [
27
25
  { value: 'fish', label: 'Fish' },
28
26
  ];
29
27
  const SECTIONS = [
30
- { id: 'language', labelKey: 'settings.sections.language', icon: Globe },
31
- { id: 'agent', labelKey: 'settings.sections.agent', icon: Bot },
32
- { id: 'environment', labelKey: 'settings.sections.environment', icon: Terminal },
33
- { id: 'workflow', labelKey: 'settings.sections.workflow', icon: GitBranch },
34
- { id: 'ci', labelKey: 'settings.sections.ci', icon: Activity },
35
- { id: 'stage-timeouts', labelKey: 'settings.sections.timeouts', icon: Timer },
36
- { id: 'notifications', labelKey: 'settings.sections.notifications', icon: Bell },
37
- { id: 'feature-flags', labelKey: 'settings.sections.flags', icon: Flag },
38
- { id: 'interactive-agent', labelKey: 'settings.sections.chat', icon: MessageSquare },
39
- { id: 'database', labelKey: 'settings.sections.database', icon: Database },
28
+ { id: 'agent', label: 'Agent', icon: Bot },
29
+ { id: 'environment', label: 'Environment', icon: Terminal },
30
+ { id: 'workflow', label: 'Workflow', icon: GitBranch },
31
+ { id: 'ci', label: 'CI', icon: Activity },
32
+ { id: 'stage-timeouts', label: 'Timeouts', icon: Timer },
33
+ { id: 'notifications', label: 'Notifications', icon: Bell },
34
+ { id: 'feature-flags', label: 'Flags', icon: Flag },
35
+ { id: 'interactive-agent', label: 'Chat', icon: MessageSquare },
36
+ { id: 'database', label: 'Database', icon: Database },
40
37
  ];
41
38
  function useSaveIndicator() {
42
- const { t } = useTranslation('web');
43
39
  const [isPending, startTransition] = useTransition();
44
40
  const [showSaving, setShowSaving] = useState(false);
45
41
  const [showSaved, setShowSaved] = useState(false);
@@ -73,10 +69,10 @@ function useSaveIndicator() {
73
69
  startTransition(async () => {
74
70
  const result = await updateSettingsAction(payload);
75
71
  if (!result.success) {
76
- toast.error(result.error ?? t('settings.failedToSave'));
72
+ toast.error(result.error ?? 'Failed to save settings');
77
73
  }
78
74
  });
79
- }, [startTransition, t]);
75
+ }, [startTransition]);
80
76
  return { showSaving, showSaved, save };
81
77
  }
82
78
  /* ── Reusable row components ── */
@@ -91,7 +87,6 @@ function SettingsSection({ icon: Icon, title, description, badge, testId, childr
91
87
  return (_jsxs("div", { className: "bg-background rounded-lg border", "data-testid": testId, children: [_jsxs("div", { className: "bg-muted/30 border-b px-4 py-3", children: [_jsxs("div", { className: "flex items-center gap-2", children: [_jsx(Icon, { className: "text-muted-foreground h-3.5 w-3.5" }), _jsx("h2", { className: "text-sm font-semibold", children: title }), badge ? (_jsx("span", { className: "bg-muted text-muted-foreground rounded px-1.5 py-0.5 text-[9px] font-medium tracking-wider uppercase", children: badge })) : null] }), _jsx("p", { className: "text-muted-foreground mt-0.5 text-[11px]", children: description })] }), _jsx("div", { className: "px-4", children: children })] }));
92
88
  }
93
89
  function NumberStepper({ id, testId, value, onChange, onBlur, placeholder, min = 1, max, step = 1, suffix, }) {
94
- const { t } = useTranslation('web');
95
90
  const numValue = value === '' ? undefined : parseInt(value, 10);
96
91
  const decrement = () => {
97
92
  const current = numValue ?? parseInt(placeholder, 10);
@@ -105,12 +100,12 @@ function NumberStepper({ id, testId, value, onChange, onBlur, placeholder, min =
105
100
  };
106
101
  return (_jsxs("div", { className: "flex items-center gap-1.5", children: [_jsxs("div", { className: "flex items-center overflow-hidden rounded-md border", children: [_jsx("button", { type: "button", onClick: () => {
107
102
  decrement();
108
- }, onMouseUp: onBlur, className: "text-muted-foreground hover:bg-muted hover:text-foreground flex h-8 w-7 cursor-pointer items-center justify-center border-r transition-colors", "aria-label": t('common.decrease'), children: _jsx(Minus, { className: "h-3 w-3" }) }), _jsx("input", { id: id, "data-testid": testId, type: "text", inputMode: "numeric", pattern: "[0-9]*", value: value, placeholder: placeholder, onChange: (e) => {
103
+ }, onMouseUp: onBlur, className: "text-muted-foreground hover:bg-muted hover:text-foreground flex h-8 w-7 cursor-pointer items-center justify-center border-r transition-colors", "aria-label": "Decrease", children: _jsx(Minus, { className: "h-3 w-3" }) }), _jsx("input", { id: id, "data-testid": testId, type: "text", inputMode: "numeric", pattern: "[0-9]*", value: value, placeholder: placeholder, onChange: (e) => {
109
104
  const v = e.target.value.replace(/[^0-9]/g, '');
110
105
  onChange(v);
111
106
  }, onBlur: onBlur, className: "h-8 w-14 bg-transparent text-center text-xs outline-none" }), _jsx("button", { type: "button", onClick: () => {
112
107
  increment();
113
- }, onMouseUp: onBlur, className: "text-muted-foreground hover:bg-muted hover:text-foreground flex h-8 w-7 cursor-pointer items-center justify-center border-l transition-colors", "aria-label": t('common.increase'), children: _jsx(Plus, { className: "h-3 w-3" }) })] }), suffix ? _jsx("span", { className: "text-muted-foreground text-[11px]", children: suffix }) : null] }));
108
+ }, onMouseUp: onBlur, className: "text-muted-foreground hover:bg-muted hover:text-foreground flex h-8 w-7 cursor-pointer items-center justify-center border-l transition-colors", "aria-label": "Increase", children: _jsx(Plus, { className: "h-3 w-3" }) })] }), suffix ? _jsx("span", { className: "text-muted-foreground text-[11px]", children: suffix }) : null] }));
114
109
  }
115
110
  function SubsectionLabel({ children }) {
116
111
  return (_jsx("div", { className: "border-b pt-3 pb-1", children: _jsx("span", { className: "text-muted-foreground text-[10px] font-semibold tracking-wider uppercase", children: children }) }));
@@ -120,7 +115,6 @@ function SectionHint({ children, links, }) {
120
115
  }
121
116
  /* ── Main component ── */
122
117
  export function SettingsPageClient({ settings, shepHome, dbFileSize, availableTerminals, }) {
123
- const { t } = useTranslation('web');
124
118
  const { showSaving, showSaved, save } = useSaveIndicator();
125
119
  const featureFlags = settings.featureFlags ?? {
126
120
  skills: false,
@@ -140,13 +134,7 @@ export function SettingsPageClient({ settings, shepHome, dbFileSize, availableTe
140
134
  // Filter to only show installed terminals
141
135
  const terminalOptions = availableTerminals
142
136
  ? availableTerminals.filter((t) => t.available)
143
- : [
144
- {
145
- id: TerminalType.System,
146
- name: t('settings.environment.systemTerminal'),
147
- available: true,
148
- },
149
- ];
137
+ : [{ id: TerminalType.System, name: 'System Terminal', available: true }];
150
138
  // Workflow state
151
139
  const [openPr, setOpenPr] = useState(settings.workflow.openPrOnImplementationComplete);
152
140
  const [pushOnComplete, setPushOnComplete] = useState(settings.workflow.approvalGateDefaults.pushOnImplementationComplete);
@@ -304,26 +292,26 @@ export function SettingsPageClient({ settings, shepHome, dbFileSize, availableTe
304
292
  void el.offsetHeight;
305
293
  el.style.animation = 'section-flash 1s ease-out';
306
294
  }, []);
307
- return (_jsxs("div", { "data-testid": "settings-page-client", className: "max-w-5xl", children: [_jsx("div", { className: "bg-background/95 supports-backdrop-filter:bg-background/80 sticky top-0 z-10 grid grid-cols-1 gap-x-5 pt-6 pb-4 backdrop-blur lg:grid-cols-[1fr_280px]", children: _jsxs("div", { className: "flex items-center gap-2", children: [_jsx(Settings2, { className: "text-muted-foreground h-4 w-4" }), _jsx("h1", { className: "text-sm font-bold tracking-tight", children: t('settings.title') }), _jsxs("span", { className: "relative h-4 w-16", children: [_jsx("span", { className: cn('text-muted-foreground absolute inset-0 flex items-center text-xs transition-opacity duration-300', showSaving ? 'opacity-100' : 'opacity-0'), children: t('settings.saving') }), _jsxs("span", { className: cn('absolute inset-0 flex items-center gap-1 text-xs text-green-600 transition-opacity duration-300', showSaved && !showSaving ? 'opacity-100' : 'opacity-0'), children: [_jsx(Check, { className: "h-3 w-3" }), t('settings.saved')] })] }), _jsx("nav", { className: "ml-auto flex items-center gap-0.5", children: SECTIONS.map((s) => {
295
+ return (_jsxs("div", { "data-testid": "settings-page-client", className: "max-w-5xl", children: [_jsx("div", { className: "bg-background/95 supports-backdrop-filter:bg-background/80 sticky top-0 z-10 grid grid-cols-1 gap-x-5 pt-6 pb-4 backdrop-blur lg:grid-cols-[1fr_280px]", children: _jsxs("div", { className: "flex items-center gap-2", children: [_jsx(Settings2, { className: "text-muted-foreground h-4 w-4" }), _jsx("h1", { className: "text-sm font-bold tracking-tight", children: "Settings" }), _jsxs("span", { className: "relative h-4 w-16", children: [_jsx("span", { className: cn('text-muted-foreground absolute inset-0 flex items-center text-xs transition-opacity duration-300', showSaving ? 'opacity-100' : 'opacity-0'), children: "Saving..." }), _jsxs("span", { className: cn('absolute inset-0 flex items-center gap-1 text-xs text-green-600 transition-opacity duration-300', showSaved && !showSaving ? 'opacity-100' : 'opacity-0'), children: [_jsx(Check, { className: "h-3 w-3" }), "Saved"] })] }), _jsx("nav", { className: "ml-auto flex items-center gap-0.5", children: SECTIONS.map((s) => {
308
296
  const SectionIcon = s.icon;
309
297
  const isActive = activeSection === s.id;
310
298
  return (_jsxs("button", { type: "button", onClick: () => scrollToSection(s.id), className: cn('flex cursor-pointer items-center gap-1 rounded-md px-1.5 py-1 text-[11px] transition-all', isActive
311
299
  ? 'bg-accent text-foreground font-medium'
312
- : 'text-muted-foreground/60 hover:text-foreground hover:bg-accent/50'), children: [_jsx(SectionIcon, { className: "h-3 w-3" }), _jsx("span", { className: "hidden sm:inline", children: t(s.labelKey) })] }, s.id));
313
- }) })] }) }), _jsxs("div", { className: "flex flex-col gap-3", children: [_jsx("div", { id: "section-language", className: "grid scroll-mt-18 grid-cols-1 gap-x-5 rounded-lg lg:grid-cols-[1fr_280px]", children: _jsx(LanguageSettingsSection, { language: settings.user?.preferredLanguage ?? Language.English }) }), _jsxs("div", { id: "section-agent", className: "grid scroll-mt-18 grid-cols-1 gap-x-5 rounded-lg lg:grid-cols-[1fr_280px]", children: [_jsx(SettingsSection, { icon: Bot, title: t('settings.agent.sectionTitle'), description: t('settings.agent.sectionDescription'), testId: "agent-settings-section", children: _jsx(SettingsRow, { label: t('settings.agent.agentAndModel'), description: t('settings.agent.agentAndModelDescription'), htmlFor: "agent-model-picker", children: _jsx(AgentModelPicker, { initialAgentType: agentType, initialModel: settings.models.default, mode: "settings", onAgentModelChange: (newAgent) => setAgentType(newAgent), className: "w-55" }) }) }), _jsx(SectionHint, { links: [
300
+ : 'text-muted-foreground/60 hover:text-foreground hover:bg-accent/50'), children: [_jsx(SectionIcon, { className: "h-3 w-3" }), _jsx("span", { className: "hidden sm:inline", children: s.label })] }, s.id));
301
+ }) })] }) }), _jsxs("div", { className: "flex flex-col gap-3", children: [_jsxs("div", { id: "section-agent", className: "grid scroll-mt-18 grid-cols-1 gap-x-5 rounded-lg lg:grid-cols-[1fr_280px]", children: [_jsx(SettingsSection, { icon: Bot, title: "Agent", description: "AI coding agent and authentication", testId: "agent-settings-section", children: _jsx(SettingsRow, { label: "Agent & Model", description: "Provider and model for all operations", htmlFor: "agent-model-picker", children: _jsx(AgentModelPicker, { initialAgentType: agentType, initialModel: settings.models.default, mode: "settings", onAgentModelChange: (newAgent) => setAgentType(newAgent), className: "w-55" }) }) }), _jsx(SectionHint, { links: [
314
302
  {
315
- label: t('settings.agent.links.agentSystem'),
303
+ label: 'Agent system',
316
304
  href: 'https://github.com/shep-ai/cli/blob/main/docs/architecture/agent-system.md',
317
305
  },
318
306
  {
319
- label: t('settings.agent.links.addingAgents'),
307
+ label: 'Adding agents',
320
308
  href: 'https://github.com/shep-ai/cli/blob/main/docs/development/adding-agents.md',
321
309
  },
322
310
  {
323
- label: t('settings.agent.links.configurationGuide'),
311
+ label: 'Configuration guide',
324
312
  href: 'https://github.com/shep-ai/cli/blob/main/docs/guides/configuration.md',
325
313
  },
326
- ], children: t('settings.agent.hint') })] }), _jsxs("div", { id: "section-environment", className: "grid scroll-mt-18 grid-cols-1 gap-x-5 rounded-lg lg:grid-cols-[1fr_280px]", children: [_jsxs(SettingsSection, { icon: Terminal, title: t('settings.environment.sectionTitle'), description: t('settings.environment.sectionDescription'), testId: "environment-settings-section", children: [_jsx(SettingsRow, { label: t('settings.environment.defaultEditor'), description: t('settings.environment.defaultEditorDescription'), htmlFor: "default-editor", children: _jsxs(Select, { value: editor, onValueChange: (v) => {
314
+ ], children: "Choose which AI coding agent powers your features. Each agent supports different models and capabilities. Authentication is resolved automatically via your active session." })] }), _jsxs("div", { id: "section-environment", className: "grid scroll-mt-18 grid-cols-1 gap-x-5 rounded-lg lg:grid-cols-[1fr_280px]", children: [_jsxs(SettingsSection, { icon: Terminal, title: "Environment", description: "Editor, shell, and terminal preferences", testId: "environment-settings-section", children: [_jsx(SettingsRow, { label: "Default Editor", description: "Editor launched for file operations", htmlFor: "default-editor", children: _jsxs(Select, { value: editor, onValueChange: (v) => {
327
315
  setEditor(v);
328
316
  save({
329
317
  environment: {
@@ -335,7 +323,7 @@ export function SettingsPageClient({ settings, shepHome, dbFileSize, availableTe
335
323
  }, children: [_jsx(SelectTrigger, { id: "default-editor", "data-testid": "editor-select", className: "w-55 cursor-pointer text-xs", children: _jsx(SelectValue, {}) }), _jsx(SelectContent, { children: EDITOR_OPTIONS.map((opt) => {
336
324
  const Icon = getEditorTypeIcon(opt.value);
337
325
  return (_jsx(SelectItem, { value: opt.value, children: _jsxs("span", { className: "flex items-center gap-2 text-xs", children: [_jsx(Icon, { className: "h-4 w-4 shrink-0" }), opt.label] }) }, opt.value));
338
- }) })] }) }), _jsx(SettingsRow, { label: t('settings.environment.shell'), description: t('settings.environment.shellDescription'), htmlFor: "shell-preference", children: _jsxs(Select, { value: shell, onValueChange: (v) => {
326
+ }) })] }) }), _jsx(SettingsRow, { label: "Shell", description: "Default shell for generated scripts", htmlFor: "shell-preference", children: _jsxs(Select, { value: shell, onValueChange: (v) => {
339
327
  setShell(v);
340
328
  save({
341
329
  environment: {
@@ -344,7 +332,7 @@ export function SettingsPageClient({ settings, shepHome, dbFileSize, availableTe
344
332
  terminalPreference: terminal,
345
333
  },
346
334
  });
347
- }, children: [_jsx(SelectTrigger, { id: "shell-preference", "data-testid": "shell-select", className: "w-55 cursor-pointer text-xs", children: _jsx(SelectValue, {}) }), _jsx(SelectContent, { children: SHELL_OPTIONS.map((opt) => (_jsx(SelectItem, { value: opt.value, children: opt.label }, opt.value))) })] }) }), _jsx(SettingsRow, { label: t('settings.environment.terminal'), description: t('settings.environment.terminalDescription'), htmlFor: "terminal-preference", children: _jsxs(Select, { value: terminal, onValueChange: (v) => {
335
+ }, children: [_jsx(SelectTrigger, { id: "shell-preference", "data-testid": "shell-select", className: "w-55 cursor-pointer text-xs", children: _jsx(SelectValue, {}) }), _jsx(SelectContent, { children: SHELL_OPTIONS.map((opt) => (_jsx(SelectItem, { value: opt.value, children: opt.label }, opt.value))) })] }) }), _jsx(SettingsRow, { label: "Terminal", description: "Terminal emulator for shell sessions", htmlFor: "terminal-preference", children: _jsxs(Select, { value: terminal, onValueChange: (v) => {
348
336
  setTerminal(v);
349
337
  save({
350
338
  environment: {
@@ -355,19 +343,19 @@ export function SettingsPageClient({ settings, shepHome, dbFileSize, availableTe
355
343
  });
356
344
  }, children: [_jsx(SelectTrigger, { id: "terminal-preference", "data-testid": "terminal-select", className: "w-55 cursor-pointer text-xs", children: _jsx(SelectValue, {}) }), _jsx(SelectContent, { children: terminalOptions.map((opt) => (_jsx(SelectItem, { value: opt.id, children: opt.name }, opt.id))) })] }) })] }), _jsx(SectionHint, { links: [
357
345
  {
358
- label: t('settings.environment.links.configurationGuide'),
346
+ label: 'Configuration guide',
359
347
  href: 'https://github.com/shep-ai/cli/blob/main/docs/guides/configuration.md',
360
348
  },
361
- ], children: t('settings.environment.hint') })] }), _jsxs("div", { id: "section-workflow", className: "grid scroll-mt-18 grid-cols-1 gap-x-5 rounded-lg lg:grid-cols-[1fr_280px]", children: [_jsxs(SettingsSection, { icon: GitBranch, title: t('settings.workflow.title'), description: t('settings.workflow.sectionDescription'), testId: "workflow-settings-section", children: [_jsx(SubsectionLabel, { children: t('settings.workflow.subsections.approve') }), _jsx(SwitchRow, { label: t('settings.workflow.autoApprovePrd'), description: t('settings.workflow.autoApprovePrdDescription'), id: "allow-prd", testId: "switch-allow-prd", checked: allowPrd, onChange: (v) => {
349
+ ], children: "Your preferred editor opens files for review. The shell setting controls generated scripts. The terminal emulator is launched when opening shell sessions from the web UI." })] }), _jsxs("div", { id: "section-workflow", className: "grid scroll-mt-18 grid-cols-1 gap-x-5 rounded-lg lg:grid-cols-[1fr_280px]", children: [_jsxs(SettingsSection, { icon: GitBranch, title: "Workflow", description: "Automation behavior after implementation", testId: "workflow-settings-section", children: [_jsx(SubsectionLabel, { children: "Approve" }), _jsx(SwitchRow, { label: "Auto-approve PRD", description: "Skip manual review of requirements", id: "allow-prd", testId: "switch-allow-prd", checked: allowPrd, onChange: (v) => {
362
350
  setAllowPrd(v);
363
351
  save(buildWorkflowPayload({ allowPrd: v }));
364
- } }), _jsx(SwitchRow, { label: t('settings.workflow.autoApprovePlan'), description: t('settings.workflow.autoApprovePlanDescription'), id: "allow-plan", testId: "switch-allow-plan", checked: allowPlan, onChange: (v) => {
352
+ } }), _jsx(SwitchRow, { label: "Auto-approve Plan", description: "Skip manual review of implementation plan", id: "allow-plan", testId: "switch-allow-plan", checked: allowPlan, onChange: (v) => {
365
353
  setAllowPlan(v);
366
354
  save(buildWorkflowPayload({ allowPlan: v }));
367
- } }), _jsx(SwitchRow, { label: t('settings.workflow.autoApproveMerge'), description: t('settings.workflow.autoApproveMergeDescription'), id: "allow-merge", testId: "switch-allow-merge", checked: allowMerge, onChange: (v) => {
355
+ } }), _jsx(SwitchRow, { label: "Auto-approve Merge", description: "Merge without manual review", id: "allow-merge", testId: "switch-allow-merge", checked: allowMerge, onChange: (v) => {
368
356
  setAllowMerge(v);
369
357
  save(buildWorkflowPayload({ allowMerge: v }));
370
- } }), _jsx(SubsectionLabel, { children: t('settings.workflow.subsections.evidence') }), _jsx(SwitchRow, { label: t('settings.workflow.collectEvidence'), description: t('settings.workflow.collectEvidenceDescription'), id: "enable-evidence", testId: "switch-enable-evidence", checked: enableEvidence, onChange: (v) => {
358
+ } }), _jsx(SubsectionLabel, { children: "Evidence" }), _jsx(SwitchRow, { label: "Collect evidence", description: "Capture screenshots and artifacts after implementation", id: "enable-evidence", testId: "switch-enable-evidence", checked: enableEvidence, onChange: (v) => {
371
359
  setEnableEvidence(v);
372
360
  if (!v) {
373
361
  setCommitEvidence(false);
@@ -376,13 +364,13 @@ export function SettingsPageClient({ settings, shepHome, dbFileSize, availableTe
376
364
  else {
377
365
  save(buildWorkflowPayload({ enableEvidence: v }));
378
366
  }
379
- } }), _jsx(SwitchRow, { label: t('settings.workflow.addEvidenceToPr'), description: t('settings.workflow.addEvidenceToPrDescription'), id: "commit-evidence", testId: "switch-commit-evidence", checked: commitEvidence, disabled: !enableEvidence || !openPr, onChange: (v) => {
367
+ } }), _jsx(SwitchRow, { label: "Add evidence to PR", description: "Include evidence in the pull request body", id: "commit-evidence", testId: "switch-commit-evidence", checked: commitEvidence, disabled: !enableEvidence || !openPr, onChange: (v) => {
380
368
  setCommitEvidence(v);
381
369
  save(buildWorkflowPayload({ commitEvidence: v }));
382
- } }), _jsx(SubsectionLabel, { children: t('settings.workflow.subsections.git') }), _jsx(SwitchRow, { label: t('settings.workflow.pushOnComplete'), description: t('settings.workflow.pushOnCompleteDescription'), id: "push-on-complete", testId: "switch-push-on-complete", checked: pushOnComplete, onChange: (v) => {
370
+ } }), _jsx(SubsectionLabel, { children: "Git" }), _jsx(SwitchRow, { label: "Push on complete", description: "Push to remote when implementation finishes", id: "push-on-complete", testId: "switch-push-on-complete", checked: pushOnComplete, onChange: (v) => {
383
371
  setPushOnComplete(v);
384
372
  save(buildWorkflowPayload({ pushOnComplete: v }));
385
- } }), _jsx(SwitchRow, { label: t('settings.workflow.openPrOnComplete'), description: t('settings.workflow.openPrOnCompleteDescription'), id: "open-pr", testId: "switch-open-pr", checked: openPr, onChange: (v) => {
373
+ } }), _jsx(SwitchRow, { label: "Open PR on complete", description: "Create a pull request when done", id: "open-pr", testId: "switch-open-pr", checked: openPr, onChange: (v) => {
386
374
  setOpenPr(v);
387
375
  if (!v) {
388
376
  setCommitEvidence(false);
@@ -391,144 +379,144 @@ export function SettingsPageClient({ settings, shepHome, dbFileSize, availableTe
391
379
  else {
392
380
  save(buildWorkflowPayload({ openPr: v }));
393
381
  }
394
- } }), _jsx(SwitchRow, { label: t('settings.workflow.watchCiAfterPush'), description: t('settings.workflow.watchCiAfterPushDescription'), id: "ci-watch-enabled", testId: "switch-ci-watch-enabled", checked: ciWatchEnabled, onChange: (v) => {
382
+ } }), _jsx(SwitchRow, { label: "Watch CI after push", description: "Monitor CI and auto-fix failures. Disable to avoid rate limits.", id: "ci-watch-enabled", testId: "switch-ci-watch-enabled", checked: ciWatchEnabled, onChange: (v) => {
395
383
  setCiWatchEnabled(v);
396
384
  save(buildWorkflowPayload({ ciWatchEnabled: v }));
397
385
  } })] }), _jsx(SectionHint, { links: [
398
386
  {
399
- label: t('settings.workflow.links.approvalGates'),
387
+ label: 'Approval gates',
400
388
  href: 'https://github.com/shep-ai/cli/blob/main/specs/016-hitl-approval-gates/spec.yaml',
401
389
  },
402
390
  {
403
- label: t('settings.workflow.links.pushAndPrFlags'),
391
+ label: 'Push & PR flags',
404
392
  href: 'https://github.com/shep-ai/cli/blob/main/specs/037-feature-pr-push-flags/spec.yaml',
405
393
  },
406
- ], children: t('settings.workflow.hint') })] }), _jsxs("div", { id: "section-ci", className: "grid scroll-mt-18 grid-cols-1 gap-x-5 rounded-lg lg:grid-cols-[1fr_280px]", children: [_jsxs(SettingsSection, { icon: Activity, title: t('settings.ci.title'), description: t('settings.ci.description'), testId: "ci-settings-section", children: [_jsx(SettingsRow, { label: t('settings.ci.maxFixAttempts'), description: t('settings.ci.maxFixAttemptsDescription'), htmlFor: "ci-max-fix", children: _jsx(NumberStepper, { id: "ci-max-fix", testId: "ci-max-fix-input", placeholder: "3", value: ciMaxFix, onChange: setCiMaxFix, onBlur: () => {
394
+ ], children: "Control how autonomous each feature run is. Auto-approve skips the human review pause at each phase. Push and PR options control what happens after successful implementation." })] }), _jsxs("div", { id: "section-ci", className: "grid scroll-mt-18 grid-cols-1 gap-x-5 rounded-lg lg:grid-cols-[1fr_280px]", children: [_jsxs(SettingsSection, { icon: Activity, title: "Continuous Integration", description: "Limits and timeouts for CI monitoring", testId: "ci-settings-section", children: [_jsx(SettingsRow, { label: "Max fix attempts", description: "Agent retries on failing CI", htmlFor: "ci-max-fix", children: _jsx(NumberStepper, { id: "ci-max-fix", testId: "ci-max-fix-input", placeholder: "3", value: ciMaxFix, onChange: setCiMaxFix, onBlur: () => {
407
395
  if (ciMaxFix !== originalCiMaxFix)
408
396
  save(buildWorkflowPayload({ ciMaxFix }));
409
- }, min: 1, max: 10 }) }), _jsx(SettingsRow, { label: t('settings.ci.watchTimeout'), description: t('settings.ci.watchTimeoutDescription'), htmlFor: "ci-timeout", children: _jsx(NumberStepper, { id: "ci-timeout", testId: "ci-timeout-input", placeholder: "300", value: ciTimeout, onChange: setCiTimeout, onBlur: () => {
397
+ }, min: 1, max: 10 }) }), _jsx(SettingsRow, { label: "Watch timeout", description: "Max wait for CI completion", htmlFor: "ci-timeout", children: _jsx(NumberStepper, { id: "ci-timeout", testId: "ci-timeout-input", placeholder: "300", value: ciTimeout, onChange: setCiTimeout, onBlur: () => {
410
398
  if (ciTimeout !== originalCiTimeout)
411
399
  save(buildWorkflowPayload({ ciTimeout }));
412
- }, min: 30, step: 30, suffix: "sec" }) }), _jsx(SettingsRow, { label: t('settings.ci.maxLogSize'), description: t('settings.ci.maxLogSizeDescription'), htmlFor: "ci-log-max", children: _jsx(NumberStepper, { id: "ci-log-max", testId: "ci-log-max-input", placeholder: "50000", value: ciLogMax, onChange: setCiLogMax, onBlur: () => {
400
+ }, min: 30, step: 30, suffix: "sec" }) }), _jsx(SettingsRow, { label: "Max log size", description: "Truncate CI logs beyond this limit", htmlFor: "ci-log-max", children: _jsx(NumberStepper, { id: "ci-log-max", testId: "ci-log-max-input", placeholder: "50000", value: ciLogMax, onChange: setCiLogMax, onBlur: () => {
413
401
  if (ciLogMax !== originalCiLogMax)
414
402
  save(buildWorkflowPayload({ ciLogMax }));
415
- }, min: 1000, step: 5000, suffix: "chars" }) }), _jsx(SettingsRow, { label: t('settings.ci.pollInterval'), description: t('settings.ci.pollIntervalDescription'), htmlFor: "ci-poll-interval", children: _jsx(NumberStepper, { id: "ci-poll-interval", testId: "ci-poll-interval-input", placeholder: "30", value: ciPollInterval, onChange: setCiPollInterval, onBlur: () => {
403
+ }, min: 1000, step: 5000, suffix: "chars" }) }), _jsx(SettingsRow, { label: "Poll interval", description: "How often to check GitHub for CI status updates", htmlFor: "ci-poll-interval", children: _jsx(NumberStepper, { id: "ci-poll-interval", testId: "ci-poll-interval-input", placeholder: "30", value: ciPollInterval, onChange: setCiPollInterval, onBlur: () => {
416
404
  if (ciPollInterval !== originalCiPollInterval)
417
405
  save(buildWorkflowPayload({ ciPollInterval }));
418
- }, min: 5, step: 5, suffix: "sec" }) }), _jsx(SwitchRow, { label: t('settings.ci.hideCiStatus'), description: t('settings.ci.hideCiStatusDescription'), id: "hide-ci-status", testId: "switch-hide-ci-status", checked: hideCiStatus, onChange: (v) => {
406
+ }, min: 5, step: 5, suffix: "sec" }) }), _jsx(SwitchRow, { label: "Hide CI status", description: "Hide CI status badges from feature drawer and merge review", id: "hide-ci-status", testId: "switch-hide-ci-status", checked: hideCiStatus, onChange: (v) => {
419
407
  setHideCiStatus(v);
420
408
  save(buildWorkflowPayload({ hideCiStatus: v }));
421
409
  } })] }), _jsx(SectionHint, { links: [
422
410
  {
423
- label: t('settings.ci.links.cicdPipeline'),
411
+ label: 'CI/CD pipeline',
424
412
  href: 'https://github.com/shep-ai/cli/blob/main/docs/development/cicd.md',
425
413
  },
426
414
  {
427
- label: t('settings.ci.links.ciSecurityGates'),
415
+ label: 'CI security gates',
428
416
  href: 'https://github.com/shep-ai/cli/blob/main/specs/003-cicd-security-gates/spec.md',
429
417
  },
430
- ], children: t('settings.ci.hint') })] }), _jsxs("div", { id: "section-stage-timeouts", className: "grid scroll-mt-18 grid-cols-1 gap-x-5 rounded-lg lg:grid-cols-[1fr_280px]", children: [_jsxs(SettingsSection, { icon: Timer, title: t('settings.stageTimeouts.title'), description: t('settings.stageTimeouts.description'), testId: "stage-timeouts-settings-section", children: [_jsx(SubsectionLabel, { children: t('settings.stageTimeouts.subsections.featureAgent') }), _jsx(SettingsRow, { label: t('settings.stageTimeouts.analyze'), description: t('settings.stageTimeouts.analyzeDescription'), htmlFor: "timeout-analyze", children: _jsx(TimeoutSlider, { id: "timeout-analyze", testId: "timeout-analyze-input", value: analyzeTimeout, onChange: setAnalyzeTimeout, onBlur: () => {
418
+ ], children: "When a feature completes, the agent can watch CI and auto-fix failures. These limits prevent runaway retries and control how much log output is sent to the agent for analysis." })] }), _jsxs("div", { id: "section-stage-timeouts", className: "grid scroll-mt-18 grid-cols-1 gap-x-5 rounded-lg lg:grid-cols-[1fr_280px]", children: [_jsxs(SettingsSection, { icon: Timer, title: "Stage Timeouts", description: "Maximum execution time per agent stage", testId: "stage-timeouts-settings-section", children: [_jsx(SubsectionLabel, { children: "Feature Agent" }), _jsx(SettingsRow, { label: "Analyze", description: "Repository analysis timeout", htmlFor: "timeout-analyze", children: _jsx(TimeoutSlider, { id: "timeout-analyze", testId: "timeout-analyze-input", value: analyzeTimeout, onChange: setAnalyzeTimeout, onBlur: () => {
431
419
  if (analyzeTimeout !== originalAnalyzeTimeout)
432
420
  save(buildWorkflowPayload({ analyzeTimeout }));
433
- }, defaultSeconds: 1800 }) }), _jsx(SettingsRow, { label: t('settings.stageTimeouts.requirements'), description: t('settings.stageTimeouts.requirementsDescription'), htmlFor: "timeout-requirements", children: _jsx(TimeoutSlider, { id: "timeout-requirements", testId: "timeout-requirements-input", value: requirementsTimeout, onChange: setRequirementsTimeout, onBlur: () => {
421
+ }, defaultSeconds: 1800 }) }), _jsx(SettingsRow, { label: "Requirements", description: "Requirements gathering timeout", htmlFor: "timeout-requirements", children: _jsx(TimeoutSlider, { id: "timeout-requirements", testId: "timeout-requirements-input", value: requirementsTimeout, onChange: setRequirementsTimeout, onBlur: () => {
434
422
  if (requirementsTimeout !== originalRequirementsTimeout)
435
423
  save(buildWorkflowPayload({ requirementsTimeout }));
436
- }, defaultSeconds: 1800 }) }), _jsx(SettingsRow, { label: t('settings.stageTimeouts.research'), description: t('settings.stageTimeouts.researchDescription'), htmlFor: "timeout-research", children: _jsx(TimeoutSlider, { id: "timeout-research", testId: "timeout-research-input", value: researchTimeout, onChange: setResearchTimeout, onBlur: () => {
424
+ }, defaultSeconds: 1800 }) }), _jsx(SettingsRow, { label: "Research", description: "Technical research timeout", htmlFor: "timeout-research", children: _jsx(TimeoutSlider, { id: "timeout-research", testId: "timeout-research-input", value: researchTimeout, onChange: setResearchTimeout, onBlur: () => {
437
425
  if (researchTimeout !== originalResearchTimeout)
438
426
  save(buildWorkflowPayload({ researchTimeout }));
439
- }, defaultSeconds: 1800 }) }), _jsx(SettingsRow, { label: t('settings.stageTimeouts.plan'), description: t('settings.stageTimeouts.planDescription'), htmlFor: "timeout-plan", children: _jsx(TimeoutSlider, { id: "timeout-plan", testId: "timeout-plan-input", value: planTimeout, onChange: setPlanTimeout, onBlur: () => {
427
+ }, defaultSeconds: 1800 }) }), _jsx(SettingsRow, { label: "Plan", description: "Implementation planning timeout", htmlFor: "timeout-plan", children: _jsx(TimeoutSlider, { id: "timeout-plan", testId: "timeout-plan-input", value: planTimeout, onChange: setPlanTimeout, onBlur: () => {
440
428
  if (planTimeout !== originalPlanTimeout)
441
429
  save(buildWorkflowPayload({ planTimeout }));
442
- }, defaultSeconds: 1800 }) }), _jsx(SettingsRow, { label: t('settings.stageTimeouts.implement'), description: t('settings.stageTimeouts.implementDescription'), htmlFor: "timeout-implement", children: _jsx(TimeoutSlider, { id: "timeout-implement", testId: "timeout-implement-input", value: implementTimeout, onChange: setImplementTimeout, onBlur: () => {
430
+ }, defaultSeconds: 1800 }) }), _jsx(SettingsRow, { label: "Implement", description: "Code implementation timeout", htmlFor: "timeout-implement", children: _jsx(TimeoutSlider, { id: "timeout-implement", testId: "timeout-implement-input", value: implementTimeout, onChange: setImplementTimeout, onBlur: () => {
443
431
  if (implementTimeout !== originalImplementTimeout)
444
432
  save(buildWorkflowPayload({ implementTimeout }));
445
- }, defaultSeconds: 1800 }) }), _jsx(SettingsRow, { label: t('settings.stageTimeouts.merge'), description: t('settings.stageTimeouts.mergeDescription'), htmlFor: "timeout-merge", children: _jsx(TimeoutSlider, { id: "timeout-merge", testId: "timeout-merge-input", value: mergeTimeout, onChange: setMergeTimeout, onBlur: () => {
433
+ }, defaultSeconds: 1800 }) }), _jsx(SettingsRow, { label: "Merge", description: "PR creation and merge timeout", htmlFor: "timeout-merge", children: _jsx(TimeoutSlider, { id: "timeout-merge", testId: "timeout-merge-input", value: mergeTimeout, onChange: setMergeTimeout, onBlur: () => {
446
434
  if (mergeTimeout !== originalMergeTimeout)
447
435
  save(buildWorkflowPayload({ mergeTimeout }));
448
- }, defaultSeconds: 1800 }) }), _jsx(SubsectionLabel, { children: t('settings.stageTimeouts.subsections.analyzeRepoAgent') }), _jsx(SettingsRow, { label: t('settings.stageTimeouts.analyze'), description: t('settings.stageTimeouts.analyzeDescription'), htmlFor: "timeout-analyze-repo", children: _jsx(TimeoutSlider, { id: "timeout-analyze-repo", testId: "timeout-analyze-repo-input", value: analyzeRepoTimeout, onChange: setAnalyzeRepoTimeout, onBlur: () => {
436
+ }, defaultSeconds: 1800 }) }), _jsx(SubsectionLabel, { children: "Analyze Repository Agent" }), _jsx(SettingsRow, { label: "Analyze", description: "Repository analysis timeout", htmlFor: "timeout-analyze-repo", children: _jsx(TimeoutSlider, { id: "timeout-analyze-repo", testId: "timeout-analyze-repo-input", value: analyzeRepoTimeout, onChange: setAnalyzeRepoTimeout, onBlur: () => {
449
437
  if (analyzeRepoTimeout !== originalAnalyzeRepoTimeout)
450
438
  save(buildWorkflowPayload({ analyzeRepoTimeout }));
451
- }, defaultSeconds: 600 }) })] }), _jsx(SectionHint, { children: t('settings.stageTimeouts.hint') })] }), _jsxs("div", { id: "section-notifications", className: "grid scroll-mt-18 grid-cols-1 gap-x-5 rounded-lg lg:grid-cols-[1fr_280px]", children: [_jsxs(SettingsSection, { icon: Bell, title: t('settings.notifications.title'), description: t('settings.notifications.sectionDescription'), testId: "notification-settings-section", children: [_jsx(SubsectionLabel, { children: t('settings.notifications.channels') }), _jsx(SwitchRow, { label: t('settings.notifications.inAppLabel'), description: t('settings.notifications.inAppDescription'), id: "notif-in-app", testId: "switch-in-app", checked: inApp, onChange: (v) => {
439
+ }, defaultSeconds: 600 }) })] }), _jsx(SectionHint, { children: "Each agent has independently configurable stage timeouts. When a stage exceeds its timeout, the agent is terminated. Longer timeouts are useful for complex implementations. Feature agent defaults to 30 minutes per stage. Analyze repository agent defaults to 10 minutes." })] }), _jsxs("div", { id: "section-notifications", className: "grid scroll-mt-18 grid-cols-1 gap-x-5 rounded-lg lg:grid-cols-[1fr_280px]", children: [_jsxs(SettingsSection, { icon: Bell, title: "Notifications", description: "How and when you get notified", testId: "notification-settings-section", children: [_jsx(SubsectionLabel, { children: "Channels" }), _jsx(SwitchRow, { label: "In-app", description: "Notifications inside the Shep UI", id: "notif-in-app", testId: "switch-in-app", checked: inApp, onChange: (v) => {
452
440
  setInApp(v);
453
441
  save(buildNotificationPayload({ inApp: v }));
454
- } }), _jsx(SubsectionLabel, { children: t('settings.notifications.subsections.agentEvents') }), _jsx(SwitchRow, { label: t('settings.notifications.events.agentStarted'), id: "notif-event-agentStarted", testId: "switch-event-agentStarted", checked: events.agentStarted, onChange: (v) => {
442
+ } }), _jsx(SubsectionLabel, { children: "Agent Events" }), _jsx(SwitchRow, { label: "Agent started", id: "notif-event-agentStarted", testId: "switch-event-agentStarted", checked: events.agentStarted, onChange: (v) => {
455
443
  const newEvents = { ...events, agentStarted: v };
456
444
  setEvents(newEvents);
457
445
  save(buildNotificationPayload({ events: newEvents }));
458
- } }), _jsx(SwitchRow, { label: t('settings.notifications.events.phaseCompleted'), id: "notif-event-phaseCompleted", testId: "switch-event-phaseCompleted", checked: events.phaseCompleted, onChange: (v) => {
446
+ } }), _jsx(SwitchRow, { label: "Phase completed", id: "notif-event-phaseCompleted", testId: "switch-event-phaseCompleted", checked: events.phaseCompleted, onChange: (v) => {
459
447
  const newEvents = { ...events, phaseCompleted: v };
460
448
  setEvents(newEvents);
461
449
  save(buildNotificationPayload({ events: newEvents }));
462
- } }), _jsx(SwitchRow, { label: t('settings.notifications.events.waitingApproval'), id: "notif-event-waitingApproval", testId: "switch-event-waitingApproval", checked: events.waitingApproval, onChange: (v) => {
450
+ } }), _jsx(SwitchRow, { label: "Waiting approval", id: "notif-event-waitingApproval", testId: "switch-event-waitingApproval", checked: events.waitingApproval, onChange: (v) => {
463
451
  const newEvents = { ...events, waitingApproval: v };
464
452
  setEvents(newEvents);
465
453
  save(buildNotificationPayload({ events: newEvents }));
466
- } }), _jsx(SwitchRow, { label: t('settings.notifications.events.agentCompleted'), id: "notif-event-agentCompleted", testId: "switch-event-agentCompleted", checked: events.agentCompleted, onChange: (v) => {
454
+ } }), _jsx(SwitchRow, { label: "Agent completed", id: "notif-event-agentCompleted", testId: "switch-event-agentCompleted", checked: events.agentCompleted, onChange: (v) => {
467
455
  const newEvents = { ...events, agentCompleted: v };
468
456
  setEvents(newEvents);
469
457
  save(buildNotificationPayload({ events: newEvents }));
470
- } }), _jsx(SwitchRow, { label: t('settings.notifications.events.agentFailed'), id: "notif-event-agentFailed", testId: "switch-event-agentFailed", checked: events.agentFailed, onChange: (v) => {
458
+ } }), _jsx(SwitchRow, { label: "Agent failed", id: "notif-event-agentFailed", testId: "switch-event-agentFailed", checked: events.agentFailed, onChange: (v) => {
471
459
  const newEvents = { ...events, agentFailed: v };
472
460
  setEvents(newEvents);
473
461
  save(buildNotificationPayload({ events: newEvents }));
474
- } }), _jsx(SubsectionLabel, { children: t('settings.notifications.subsections.pullRequestEvents') }), _jsx(SwitchRow, { label: t('settings.notifications.events.prMerged'), id: "notif-event-prMerged", testId: "switch-event-prMerged", checked: events.prMerged, onChange: (v) => {
462
+ } }), _jsx(SubsectionLabel, { children: "Pull Request Events" }), _jsx(SwitchRow, { label: "PR merged", id: "notif-event-prMerged", testId: "switch-event-prMerged", checked: events.prMerged, onChange: (v) => {
475
463
  const newEvents = { ...events, prMerged: v };
476
464
  setEvents(newEvents);
477
465
  save(buildNotificationPayload({ events: newEvents }));
478
- } }), _jsx(SwitchRow, { label: t('settings.notifications.events.prClosed'), id: "notif-event-prClosed", testId: "switch-event-prClosed", checked: events.prClosed, onChange: (v) => {
466
+ } }), _jsx(SwitchRow, { label: "PR closed", id: "notif-event-prClosed", testId: "switch-event-prClosed", checked: events.prClosed, onChange: (v) => {
479
467
  const newEvents = { ...events, prClosed: v };
480
468
  setEvents(newEvents);
481
469
  save(buildNotificationPayload({ events: newEvents }));
482
- } }), _jsx(SwitchRow, { label: t('settings.notifications.events.prChecksPassed'), id: "notif-event-prChecksPassed", testId: "switch-event-prChecksPassed", checked: events.prChecksPassed, onChange: (v) => {
470
+ } }), _jsx(SwitchRow, { label: "PR checks passed", id: "notif-event-prChecksPassed", testId: "switch-event-prChecksPassed", checked: events.prChecksPassed, onChange: (v) => {
483
471
  const newEvents = { ...events, prChecksPassed: v };
484
472
  setEvents(newEvents);
485
473
  save(buildNotificationPayload({ events: newEvents }));
486
- } }), _jsx(SwitchRow, { label: t('settings.notifications.events.prChecksFailed'), id: "notif-event-prChecksFailed", testId: "switch-event-prChecksFailed", checked: events.prChecksFailed, onChange: (v) => {
474
+ } }), _jsx(SwitchRow, { label: "PR checks failed", id: "notif-event-prChecksFailed", testId: "switch-event-prChecksFailed", checked: events.prChecksFailed, onChange: (v) => {
487
475
  const newEvents = { ...events, prChecksFailed: v };
488
476
  setEvents(newEvents);
489
477
  save(buildNotificationPayload({ events: newEvents }));
490
- } }), _jsx(SwitchRow, { label: t('settings.notifications.events.prBlocked'), id: "notif-event-prBlocked", testId: "switch-event-prBlocked", checked: events.prBlocked, onChange: (v) => {
478
+ } }), _jsx(SwitchRow, { label: "PR blocked", id: "notif-event-prBlocked", testId: "switch-event-prBlocked", checked: events.prBlocked, onChange: (v) => {
491
479
  const newEvents = { ...events, prBlocked: v };
492
480
  setEvents(newEvents);
493
481
  save(buildNotificationPayload({ events: newEvents }));
494
- } }), _jsx(SwitchRow, { label: t('settings.notifications.events.mergeReviewReady'), id: "notif-event-mergeReviewReady", testId: "switch-event-mergeReviewReady", checked: events.mergeReviewReady, onChange: (v) => {
482
+ } }), _jsx(SwitchRow, { label: "Merge review ready", id: "notif-event-mergeReviewReady", testId: "switch-event-mergeReviewReady", checked: events.mergeReviewReady, onChange: (v) => {
495
483
  const newEvents = { ...events, mergeReviewReady: v };
496
484
  setEvents(newEvents);
497
485
  save(buildNotificationPayload({ events: newEvents }));
498
486
  } })] }), _jsx(SectionHint, { links: [
499
487
  {
500
- label: t('settings.notifications.links.notificationSystem'),
488
+ label: 'Notification system',
501
489
  href: 'https://github.com/shep-ai/cli/blob/main/specs/021-agent-notifications/spec.yaml',
502
490
  },
503
- ], children: t('settings.notifications.hint') })] }), _jsxs("div", { id: "section-feature-flags", className: "grid scroll-mt-18 grid-cols-1 gap-x-5 rounded-lg lg:grid-cols-[1fr_280px]", children: [_jsxs(SettingsSection, { icon: Flag, title: t('settings.featureFlags.title'), description: t('settings.featureFlags.sectionDescription'), badge: t('settings.featureFlags.badge'), testId: "feature-flags-settings-section", children: [_jsx(SwitchRow, { label: t('settings.featureFlags.skills'), description: t('settings.featureFlags.skillsDescription'), id: "flag-skills", testId: "switch-flag-skills", checked: flags.skills, onChange: (v) => {
491
+ ], children: "In-app toast notifications keep you in the loop. Fine-tune which agent lifecycle events trigger a notification." })] }), _jsxs("div", { id: "section-feature-flags", className: "grid scroll-mt-18 grid-cols-1 gap-x-5 rounded-lg lg:grid-cols-[1fr_280px]", children: [_jsxs(SettingsSection, { icon: Flag, title: "Feature Flags", description: "Enable or disable experimental features", badge: "Experimental", testId: "feature-flags-settings-section", children: [_jsx(SwitchRow, { label: "Skills", description: "Enable the skills system for agent capabilities", id: "flag-skills", testId: "switch-flag-skills", checked: flags.skills, onChange: (v) => {
504
492
  const newFlags = { ...flags, skills: v };
505
493
  setFlags(newFlags);
506
494
  save({ featureFlags: newFlags });
507
- } }), _jsx(SwitchRow, { label: t('settings.featureFlags.deployments'), description: t('settings.featureFlags.deploymentsDescription'), id: "flag-envDeploy", testId: "switch-flag-envDeploy", checked: flags.envDeploy, onChange: (v) => {
495
+ } }), _jsx(SwitchRow, { label: "Deployments", description: "Enable environment deployment workflows", id: "flag-envDeploy", testId: "switch-flag-envDeploy", checked: flags.envDeploy, onChange: (v) => {
508
496
  const newFlags = { ...flags, envDeploy: v };
509
497
  setFlags(newFlags);
510
498
  save({ featureFlags: newFlags });
511
- } }), _jsx(SwitchRow, { label: t('settings.featureFlags.debug'), description: t('settings.featureFlags.debugDescription'), id: "flag-debug", testId: "switch-flag-debug", checked: flags.debug, onChange: (v) => {
499
+ } }), _jsx(SwitchRow, { label: "Debug", description: "Show debug panels and verbose logging", id: "flag-debug", testId: "switch-flag-debug", checked: flags.debug, onChange: (v) => {
512
500
  const newFlags = { ...flags, debug: v };
513
501
  setFlags(newFlags);
514
502
  save({ featureFlags: newFlags });
515
- } }), _jsx(SwitchRow, { label: t('settings.featureFlags.githubImport'), description: t('settings.featureFlags.githubImportDescription'), id: "flag-githubImport", testId: "switch-flag-githubImport", checked: flags.githubImport, onChange: (v) => {
503
+ } }), _jsx(SwitchRow, { label: "GitHub Import", description: "Enable GitHub repository import in the web UI", id: "flag-githubImport", testId: "switch-flag-githubImport", checked: flags.githubImport, onChange: (v) => {
516
504
  const newFlags = { ...flags, githubImport: v };
517
505
  setFlags(newFlags);
518
506
  save({ featureFlags: newFlags });
519
- } }), _jsx(SwitchRow, { label: t('settings.featureFlags.adoptBranch'), description: t('settings.featureFlags.adoptBranchDescription'), id: "flag-adoptBranch", testId: "switch-flag-adoptBranch", checked: flags.adoptBranch, onChange: (v) => {
507
+ } }), _jsx(SwitchRow, { label: "Adopt Branch", description: "Import existing branches as tracked features", id: "flag-adoptBranch", testId: "switch-flag-adoptBranch", checked: flags.adoptBranch, onChange: (v) => {
520
508
  const newFlags = { ...flags, adoptBranch: v };
521
509
  setFlags(newFlags);
522
510
  save({ featureFlags: newFlags });
523
- } }), _jsx(SwitchRow, { label: t('settings.featureFlags.gitRebaseSync'), description: t('settings.featureFlags.gitRebaseSyncDescription'), id: "flag-gitRebaseSync", testId: "switch-flag-gitRebaseSync", checked: flags.gitRebaseSync, onChange: (v) => {
511
+ } }), _jsx(SwitchRow, { label: "Git Rebase & Sync", description: "Enable git rebase-on-main and sync-main operations", id: "flag-gitRebaseSync", testId: "switch-flag-gitRebaseSync", checked: flags.gitRebaseSync, onChange: (v) => {
524
512
  const newFlags = { ...flags, gitRebaseSync: v };
525
513
  setFlags(newFlags);
526
514
  save({ featureFlags: newFlags });
527
- } }), _jsx(SwitchRow, { label: t('settings.featureFlags.reactFileManager'), description: t('settings.featureFlags.reactFileManagerDescription'), id: "flag-reactFileManager", testId: "switch-flag-reactFileManager", checked: flags.reactFileManager, onChange: (v) => {
515
+ } }), _jsx(SwitchRow, { label: "React File Manager", description: "Use the built-in React file manager instead of the native OS folder picker", id: "flag-reactFileManager", testId: "switch-flag-reactFileManager", checked: flags.reactFileManager, onChange: (v) => {
528
516
  const newFlags = { ...flags, reactFileManager: v };
529
517
  setFlags(newFlags);
530
518
  save({ featureFlags: newFlags });
531
- } })] }), _jsx(SectionHint, { children: t('settings.featureFlags.hint') })] }), _jsxs("div", { id: "section-interactive-agent", className: "grid scroll-mt-18 grid-cols-1 gap-x-5 rounded-lg lg:grid-cols-[1fr_280px]", children: [_jsxs(SettingsSection, { icon: MessageSquare, title: t('settings.interactiveAgent.title'), description: t('settings.interactiveAgent.description'), testId: "interactive-agent-settings-section", children: [_jsx(SwitchRow, { label: t('settings.interactiveAgent.enableChatTab'), description: t('settings.interactiveAgent.enableChatTabDescription'), id: "interactive-agent-enabled", testId: "switch-interactive-agent-enabled", checked: interactiveEnabled, onChange: (v) => {
519
+ } })] }), _jsx(SectionHint, { children: "Experimental features that are still under development. Enable at your own risk \u2014 they may change or be removed in future versions. Debug mode adds verbose logging useful for troubleshooting." })] }), _jsxs("div", { id: "section-interactive-agent", className: "grid scroll-mt-18 grid-cols-1 gap-x-5 rounded-lg lg:grid-cols-[1fr_280px]", children: [_jsxs(SettingsSection, { icon: MessageSquare, title: "Interactive Agent", description: "Chat tab settings for per-feature interactive agent sessions", testId: "interactive-agent-settings-section", children: [_jsx(SwitchRow, { label: "Enable Chat tab", description: "Show the Chat tab on all feature detail pages", id: "interactive-agent-enabled", testId: "switch-interactive-agent-enabled", checked: interactiveEnabled, onChange: (v) => {
532
520
  setInteractiveEnabled(v);
533
521
  save({
534
522
  interactiveAgent: {
@@ -537,7 +525,7 @@ export function SettingsPageClient({ settings, shepHome, dbFileSize, availableTe
537
525
  maxConcurrentSessions: parseInt(interactiveSessions, 10) || 3,
538
526
  },
539
527
  });
540
- } }), _jsx(SettingsRow, { label: t('settings.interactiveAgent.autoTimeout'), description: t('settings.interactiveAgent.autoTimeoutDescription'), htmlFor: "interactive-agent-timeout", children: _jsx(NumberStepper, { id: "interactive-agent-timeout", testId: "input-interactive-agent-timeout", value: interactiveTimeout, placeholder: "15", min: 1, max: 120, suffix: "min", onChange: setInteractiveTimeout, onBlur: () => {
528
+ } }), _jsx(SettingsRow, { label: "Auto-timeout", description: "Minutes of inactivity before the agent is stopped automatically (1\u2013120)", htmlFor: "interactive-agent-timeout", children: _jsx(NumberStepper, { id: "interactive-agent-timeout", testId: "input-interactive-agent-timeout", value: interactiveTimeout, placeholder: "15", min: 1, max: 120, suffix: "min", onChange: setInteractiveTimeout, onBlur: () => {
541
529
  const n = parseInt(interactiveTimeout, 10);
542
530
  const clamped = Number.isNaN(n) ? 15 : Math.min(120, Math.max(1, n));
543
531
  const clamped_str = String(clamped);
@@ -549,7 +537,7 @@ export function SettingsPageClient({ settings, shepHome, dbFileSize, availableTe
549
537
  maxConcurrentSessions: parseInt(interactiveSessions, 10) || 3,
550
538
  },
551
539
  });
552
- } }) }), _jsx(SettingsRow, { label: t('settings.interactiveAgent.maxConcurrentSessions'), description: t('settings.interactiveAgent.maxConcurrentSessionsDescription'), htmlFor: "interactive-agent-sessions", children: _jsx(NumberStepper, { id: "interactive-agent-sessions", testId: "input-interactive-agent-sessions", value: interactiveSessions, placeholder: "3", min: 1, max: 10, onChange: setInteractiveSessions, onBlur: () => {
540
+ } }) }), _jsx(SettingsRow, { label: "Max concurrent sessions", description: "Maximum number of active interactive agent sessions at once (1\u201310)", htmlFor: "interactive-agent-sessions", children: _jsx(NumberStepper, { id: "interactive-agent-sessions", testId: "input-interactive-agent-sessions", value: interactiveSessions, placeholder: "3", min: 1, max: 10, onChange: setInteractiveSessions, onBlur: () => {
553
541
  const n = parseInt(interactiveSessions, 10);
554
542
  const clamped = Number.isNaN(n) ? 3 : Math.min(10, Math.max(1, n));
555
543
  const clamped_str = String(clamped);
@@ -561,14 +549,14 @@ export function SettingsPageClient({ settings, shepHome, dbFileSize, availableTe
561
549
  maxConcurrentSessions: clamped,
562
550
  },
563
551
  });
564
- } }) })] }), _jsx(SectionHint, { children: t('settings.interactiveAgent.hint') })] }), _jsxs("div", { id: "section-database", className: "grid scroll-mt-18 grid-cols-1 gap-x-5 rounded-lg lg:grid-cols-[1fr_280px]", children: [_jsxs(SettingsSection, { icon: Database, title: t('settings.database.title'), description: t('settings.database.sectionDescription'), testId: "database-settings-section", children: [_jsx(SettingsRow, { label: t('settings.database.location'), description: t('settings.database.locationDescription'), children: _jsx("span", { className: "text-muted-foreground max-w-50 truncate font-mono text-xs", "data-testid": "shep-home-path", children: shepHome }) }), _jsx(SettingsRow, { label: t('settings.database.size'), children: _jsx("span", { className: "text-muted-foreground text-xs", "data-testid": "db-file-size", children: dbFileSize }) })] }), _jsx(SectionHint, { links: [
552
+ } }) })] }), _jsx(SectionHint, { children: "The Chat tab spawns a persistent agent process per feature. Auto-timeout stops idle sessions automatically to conserve resources. The concurrent session cap prevents runaway resource usage on developer machines." })] }), _jsxs("div", { id: "section-database", className: "grid scroll-mt-18 grid-cols-1 gap-x-5 rounded-lg lg:grid-cols-[1fr_280px]", children: [_jsxs(SettingsSection, { icon: Database, title: "Database", description: "Local storage information", testId: "database-settings-section", children: [_jsx(SettingsRow, { label: "Location", description: "Path to the local SQLite database", children: _jsx("span", { className: "text-muted-foreground max-w-50 truncate font-mono text-xs", "data-testid": "shep-home-path", children: shepHome }) }), _jsx(SettingsRow, { label: "Size", children: _jsx("span", { className: "text-muted-foreground text-xs", "data-testid": "db-file-size", children: dbFileSize }) })] }), _jsx(SectionHint, { links: [
565
553
  {
566
- label: t('settings.database.links.settingsService'),
554
+ label: 'Settings service',
567
555
  href: 'https://github.com/shep-ai/cli/blob/main/docs/architecture/settings-service.md',
568
556
  },
569
557
  {
570
- label: t('settings.database.links.settingsSpec'),
558
+ label: 'Settings spec',
571
559
  href: 'https://github.com/shep-ai/cli/blob/main/specs/005-global-settings-service/spec.md',
572
560
  },
573
- ], children: t('settings.database.hint') })] })] })] }));
561
+ ], children: "All settings are stored in a local SQLite database at ~/.shep/data. The database uses a singleton record pattern with automatic migrations on startup." })] })] })] }));
574
562
  }
@@ -59,5 +59,5 @@ export function TimeoutSlider({ id, testId, value, onChange, onBlur, defaultSeco
59
59
  setLocalIndex(i);
60
60
  onChange(String(PRESETS[i]));
61
61
  }, [onChange]);
62
- return (_jsxs("div", { className: "flex w-55 items-center gap-2", children: [_jsx(Slider, { id: id, "data-testid": testId, min: 0, max: SLIDER_MAX, step: 1, value: [localIndex], onValueChange: handleChange, onValueCommit: () => onBlur(), className: "min-w-0 flex-1" }), _jsx("span", { className: "text-muted-foreground shrink-0 text-end text-xs tabular-nums", children: formatDuration(PRESETS[localIndex]) })] }));
62
+ return (_jsxs("div", { className: "flex w-55 items-center gap-2", children: [_jsx(Slider, { id: id, "data-testid": testId, min: 0, max: SLIDER_MAX, step: 1, value: [localIndex], onValueChange: handleChange, onValueCommit: () => onBlur(), className: "min-w-0 flex-1" }), _jsx("span", { className: "text-muted-foreground shrink-0 text-right text-xs tabular-nums", children: formatDuration(PRESETS[localIndex]) })] }));
63
63
  }
@@ -8,5 +8,5 @@ const CATEGORIES = [
8
8
  { label: 'Reference', value: 'Reference' },
9
9
  ];
10
10
  export function CategoryFilter({ activeCategory, onCategoryChange, counts }) {
11
- return (_jsx("div", { className: "flex flex-wrap gap-2", role: "group", "aria-label": "Filter by category", children: CATEGORIES.map(({ label, value }) => (_jsxs(Button, { variant: activeCategory === value ? 'default' : 'outline', size: "sm", onClick: () => onCategoryChange(value), children: [label, counts && value ? (_jsxs("span", { className: "ms-1 text-xs opacity-70", children: ["(", counts[value], ")"] })) : null] }, label))) }));
11
+ return (_jsx("div", { className: "flex flex-wrap gap-2", role: "group", "aria-label": "Filter by category", children: CATEGORIES.map(({ label, value }) => (_jsxs(Button, { variant: activeCategory === value ? 'default' : 'outline', size: "sm", onClick: () => onCategoryChange(value), children: [label, counts && value ? (_jsxs("span", { className: "ml-1 text-xs opacity-70", children: ["(", counts[value], ")"] })) : null] }, label))) }));
12
12
  }
@@ -48,5 +48,5 @@ export function SkillsPageClient({ skills }) {
48
48
  if (skills.length === 0) {
49
49
  return (_jsxs("div", { className: "flex flex-col gap-6 p-6", children: [_jsx(PageHeader, { title: "Skills", description: "Claude Code skills installed in this project" }), _jsx(EmptyState, { icon: _jsx(Puzzle, { className: "size-10" }), title: "No skills found", description: "No Claude Code skills are installed. Add skills to .claude/skills/ to get started." })] }));
50
50
  }
51
- return (_jsxs("div", { className: "flex flex-col gap-6 p-6", children: [_jsx(PageHeader, { title: "Skills", description: "Claude Code skills installed in this project" }), _jsxs("div", { className: "relative", children: [_jsx(Search, { className: "text-muted-foreground absolute top-1/2 left-3 size-4 -translate-y-1/2" }), _jsx(Input, { placeholder: "Search skills...", value: searchQuery, onChange: (e) => setSearchQuery(e.target.value), className: "ps-9" })] }), _jsx(CategoryFilter, { activeCategory: activeCategory, onCategoryChange: setActiveCategory, counts: categoryCounts }), filteredSkills.length > 0 ? (_jsx(SkillList, { skills: filteredSkills, onSkillSelect: setSelectedSkill })) : (_jsx(EmptyState, { icon: _jsx(Search, { className: "size-10" }), title: "No matching skills", description: "No skills match your current search and filter criteria.", action: _jsx(Button, { variant: "outline", onClick: clearFilters, children: "Clear filters" }) })), _jsx(SkillDetailDrawer, { skill: selectedSkill, onClose: () => setSelectedSkill(null) })] }));
51
+ return (_jsxs("div", { className: "flex flex-col gap-6 p-6", children: [_jsx(PageHeader, { title: "Skills", description: "Claude Code skills installed in this project" }), _jsxs("div", { className: "relative", children: [_jsx(Search, { className: "text-muted-foreground absolute top-1/2 left-3 size-4 -translate-y-1/2" }), _jsx(Input, { placeholder: "Search skills...", value: searchQuery, onChange: (e) => setSearchQuery(e.target.value), className: "pl-9" })] }), _jsx(CategoryFilter, { activeCategory: activeCategory, onCategoryChange: setActiveCategory, counts: categoryCounts }), filteredSkills.length > 0 ? (_jsx(SkillList, { skills: filteredSkills, onSkillSelect: setSelectedSkill })) : (_jsx(EmptyState, { icon: _jsx(Search, { className: "size-10" }), title: "No matching skills", description: "No skills match your current search and filter criteria.", action: _jsx(Button, { variant: "outline", onClick: clearFilters, children: "Clear filters" }) })), _jsx(SkillDetailDrawer, { skill: selectedSkill, onClose: () => setSelectedSkill(null) })] }));
52
52
  }
@@ -40,5 +40,5 @@ export function ToolCard({ tool, onRefresh, className }) {
40
40
  const config = TAG_CONFIG[tag] ?? { label: tag, icon: Monitor };
41
41
  const TagIcon = config.icon;
42
42
  return (_jsxs("span", { className: "text-muted-foreground/70 inline-flex items-center gap-0.5 text-[9px]", children: [_jsx(TagIcon, { className: "h-2.5 w-2.5" }), config.label] }, tag));
43
- }) })] }), _jsx("p", { "data-testid": "tool-card-summary", className: "text-muted-foreground mt-1 truncate text-xs", children: tool.summary }), _jsxs("div", { className: "mt-auto flex items-center justify-between pt-3", children: [_jsxs("div", { className: "flex items-center gap-2", children: [isError && tool.status.status === 'error' ? (_jsxs("span", { className: "flex items-center gap-1 truncate text-[10px] text-red-600 dark:text-red-400", title: tool.status.errorMessage, children: [_jsx(CircleX, { className: "h-3 w-3 shrink-0" }), tool.status.errorMessage ?? 'Error'] })) : isInstalled ? (_jsxs("span", { className: "flex items-center gap-1 text-[10px] text-emerald-600 dark:text-emerald-400", children: [_jsx(CheckCircle2, { className: "h-3 w-3" }), "Installed"] })) : (_jsxs("span", { className: "text-muted-foreground flex items-center gap-1 text-[10px]", children: [_jsx(Circle, { className: "h-3 w-3" }), "Not installed"] })), tool.required ? (_jsx(TooltipProvider, { children: _jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx("span", { className: "rounded bg-amber-100 px-1.5 py-0.5 text-[9px] font-medium text-amber-700 dark:bg-amber-900/50 dark:text-amber-400", children: "Required" }) }), _jsx(TooltipContent, { side: "top", children: "This tool is required for Shep to function properly" })] }) })) : null] }), _jsx("div", { className: "flex items-center gap-1", children: isInstalled && canLaunch ? (_jsxs(Button, { size: "sm", variant: "outline", onClick: handleLaunch, disabled: isPending, "aria-label": `Launch ${tool.name}`, "data-testid": "tool-card-launch-button", className: "h-7 cursor-pointer rounded-md px-3 text-xs", children: [isPending ? (_jsx(Loader2, { className: "me-1 h-3 w-3 animate-spin" })) : (_jsx(Rocket, { className: "me-1 h-3 w-3" })), "Launch"] })) : !isInstalled && !isError ? (_jsxs(Button, { size: "sm", variant: "default", onClick: handleInstallClick, "aria-label": `Install ${tool.name}`, "data-testid": "tool-card-install-button", className: "h-7 cursor-pointer rounded-md px-3 text-xs", children: [_jsx(Download, { className: "me-1 h-3 w-3" }), "Install"] })) : null })] })] }), _jsx(ToolDetailDrawer, { tool: tool, open: drawerOpen, onClose: () => setDrawerOpen(false), onRefresh: onRefresh, autoStart: autoStartInstall })] }));
43
+ }) })] }), _jsx("p", { "data-testid": "tool-card-summary", className: "text-muted-foreground mt-1 truncate text-xs", children: tool.summary }), _jsxs("div", { className: "mt-auto flex items-center justify-between pt-3", children: [_jsxs("div", { className: "flex items-center gap-2", children: [isError && tool.status.status === 'error' ? (_jsxs("span", { className: "flex items-center gap-1 truncate text-[10px] text-red-600 dark:text-red-400", title: tool.status.errorMessage, children: [_jsx(CircleX, { className: "h-3 w-3 shrink-0" }), tool.status.errorMessage ?? 'Error'] })) : isInstalled ? (_jsxs("span", { className: "flex items-center gap-1 text-[10px] text-emerald-600 dark:text-emerald-400", children: [_jsx(CheckCircle2, { className: "h-3 w-3" }), "Installed"] })) : (_jsxs("span", { className: "text-muted-foreground flex items-center gap-1 text-[10px]", children: [_jsx(Circle, { className: "h-3 w-3" }), "Not installed"] })), tool.required ? (_jsx(TooltipProvider, { children: _jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx("span", { className: "rounded bg-amber-100 px-1.5 py-0.5 text-[9px] font-medium text-amber-700 dark:bg-amber-900/50 dark:text-amber-400", children: "Required" }) }), _jsx(TooltipContent, { side: "top", children: "This tool is required for Shep to function properly" })] }) })) : null] }), _jsx("div", { className: "flex items-center gap-1", children: isInstalled && canLaunch ? (_jsxs(Button, { size: "sm", variant: "outline", onClick: handleLaunch, disabled: isPending, "aria-label": `Launch ${tool.name}`, "data-testid": "tool-card-launch-button", className: "h-7 cursor-pointer rounded-md px-3 text-xs", children: [isPending ? (_jsx(Loader2, { className: "mr-1 h-3 w-3 animate-spin" })) : (_jsx(Rocket, { className: "mr-1 h-3 w-3" })), "Launch"] })) : !isInstalled && !isError ? (_jsxs(Button, { size: "sm", variant: "default", onClick: handleInstallClick, "aria-label": `Install ${tool.name}`, "data-testid": "tool-card-install-button", className: "h-7 cursor-pointer rounded-md px-3 text-xs", children: [_jsx(Download, { className: "mr-1 h-3 w-3" }), "Install"] })) : null })] })] }), _jsx(ToolDetailDrawer, { tool: tool, open: drawerOpen, onClose: () => setDrawerOpen(false), onRefresh: onRefresh, autoStart: autoStartInstall })] }));
44
44
  }