@shepai/cli 1.155.0-pr484.1619afe → 1.155.0-pr485.4c45fca

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 (531) hide show
  1. package/apis/json-schema/Language.yaml +13 -0
  2. package/apis/json-schema/UserProfile.yaml +3 -0
  3. package/dist/packages/core/src/domain/generated/output.d.ts +14 -0
  4. package/dist/packages/core/src/domain/generated/output.d.ts.map +1 -1
  5. package/dist/packages/core/src/domain/generated/output.js +11 -0
  6. package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/settings.mapper.d.ts +1 -0
  7. package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/settings.mapper.d.ts.map +1 -1
  8. package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/settings.mapper.js +4 -2
  9. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/049-add-language-preference.d.ts +14 -0
  10. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/049-add-language-preference.d.ts.map +1 -0
  11. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/049-add-language-preference.js +19 -0
  12. package/dist/packages/core/src/infrastructure/repositories/sqlite-settings.repository.d.ts.map +1 -1
  13. package/dist/packages/core/src/infrastructure/repositories/sqlite-settings.repository.js +3 -2
  14. package/dist/src/presentation/cli/commands/_serve.command.d.ts.map +1 -1
  15. package/dist/src/presentation/cli/commands/_serve.command.js +5 -3
  16. package/dist/src/presentation/cli/commands/agent/approve.command.d.ts.map +1 -1
  17. package/dist/src/presentation/cli/commands/agent/approve.command.js +9 -4
  18. package/dist/src/presentation/cli/commands/agent/delete.command.d.ts.map +1 -1
  19. package/dist/src/presentation/cli/commands/agent/delete.command.js +9 -5
  20. package/dist/src/presentation/cli/commands/agent/index.d.ts.map +1 -1
  21. package/dist/src/presentation/cli/commands/agent/index.js +3 -1
  22. package/dist/src/presentation/cli/commands/agent/logs.command.d.ts.map +1 -1
  23. package/dist/src/presentation/cli/commands/agent/logs.command.js +7 -5
  24. package/dist/src/presentation/cli/commands/agent/ls.command.d.ts.map +1 -1
  25. package/dist/src/presentation/cli/commands/agent/ls.command.js +12 -10
  26. package/dist/src/presentation/cli/commands/agent/reject.command.d.ts.map +1 -1
  27. package/dist/src/presentation/cli/commands/agent/reject.command.js +10 -5
  28. package/dist/src/presentation/cli/commands/agent/resolve-run.d.ts.map +1 -1
  29. package/dist/src/presentation/cli/commands/agent/resolve-run.js +7 -2
  30. package/dist/src/presentation/cli/commands/agent/show.command.d.ts.map +1 -1
  31. package/dist/src/presentation/cli/commands/agent/show.command.js +8 -6
  32. package/dist/src/presentation/cli/commands/agent/stop.command.d.ts.map +1 -1
  33. package/dist/src/presentation/cli/commands/agent/stop.command.js +9 -4
  34. package/dist/src/presentation/cli/commands/daemon/start-daemon.d.ts.map +1 -1
  35. package/dist/src/presentation/cli/commands/daemon/start-daemon.js +10 -8
  36. package/dist/src/presentation/cli/commands/daemon/stop-daemon.d.ts.map +1 -1
  37. package/dist/src/presentation/cli/commands/daemon/stop-daemon.js +5 -3
  38. package/dist/src/presentation/cli/commands/feat/adopt.command.d.ts.map +1 -1
  39. package/dist/src/presentation/cli/commands/feat/adopt.command.js +14 -12
  40. package/dist/src/presentation/cli/commands/feat/approve.command.d.ts.map +1 -1
  41. package/dist/src/presentation/cli/commands/feat/approve.command.js +8 -6
  42. package/dist/src/presentation/cli/commands/feat/archive.command.d.ts.map +1 -1
  43. package/dist/src/presentation/cli/commands/feat/archive.command.js +10 -8
  44. package/dist/src/presentation/cli/commands/feat/del.command.d.ts.map +1 -1
  45. package/dist/src/presentation/cli/commands/feat/del.command.js +17 -15
  46. package/dist/src/presentation/cli/commands/feat/index.d.ts.map +1 -1
  47. package/dist/src/presentation/cli/commands/feat/index.js +2 -1
  48. package/dist/src/presentation/cli/commands/feat/logs.command.d.ts.map +1 -1
  49. package/dist/src/presentation/cli/commands/feat/logs.command.js +8 -6
  50. package/dist/src/presentation/cli/commands/feat/ls.command.d.ts.map +1 -1
  51. package/dist/src/presentation/cli/commands/feat/ls.command.js +14 -12
  52. package/dist/src/presentation/cli/commands/feat/new.command.d.ts.map +1 -1
  53. package/dist/src/presentation/cli/commands/feat/new.command.js +43 -37
  54. package/dist/src/presentation/cli/commands/feat/reject.command.d.ts.map +1 -1
  55. package/dist/src/presentation/cli/commands/feat/reject.command.js +11 -9
  56. package/dist/src/presentation/cli/commands/feat/resolve-waiting-feature.d.ts.map +1 -1
  57. package/dist/src/presentation/cli/commands/feat/resolve-waiting-feature.js +12 -5
  58. package/dist/src/presentation/cli/commands/feat/resume.command.d.ts.map +1 -1
  59. package/dist/src/presentation/cli/commands/feat/resume.command.js +8 -6
  60. package/dist/src/presentation/cli/commands/feat/review.command.d.ts.map +1 -1
  61. package/dist/src/presentation/cli/commands/feat/review.command.js +17 -15
  62. package/dist/src/presentation/cli/commands/feat/show.command.d.ts.map +1 -1
  63. package/dist/src/presentation/cli/commands/feat/show.command.js +89 -45
  64. package/dist/src/presentation/cli/commands/feat/start.command.d.ts.map +1 -1
  65. package/dist/src/presentation/cli/commands/feat/start.command.js +12 -10
  66. package/dist/src/presentation/cli/commands/feat/unarchive.command.d.ts.map +1 -1
  67. package/dist/src/presentation/cli/commands/feat/unarchive.command.js +8 -6
  68. package/dist/src/presentation/cli/commands/ide-open.command.d.ts.map +1 -1
  69. package/dist/src/presentation/cli/commands/ide-open.command.js +10 -5
  70. package/dist/src/presentation/cli/commands/install.command.d.ts.map +1 -1
  71. package/dist/src/presentation/cli/commands/install.command.js +29 -21
  72. package/dist/src/presentation/cli/commands/log-viewer.d.ts.map +1 -1
  73. package/dist/src/presentation/cli/commands/log-viewer.js +6 -3
  74. package/dist/src/presentation/cli/commands/repo/add.command.d.ts.map +1 -1
  75. package/dist/src/presentation/cli/commands/repo/add.command.js +12 -10
  76. package/dist/src/presentation/cli/commands/repo/index.d.ts.map +1 -1
  77. package/dist/src/presentation/cli/commands/repo/index.js +3 -1
  78. package/dist/src/presentation/cli/commands/repo/ls.command.d.ts.map +1 -1
  79. package/dist/src/presentation/cli/commands/repo/ls.command.js +11 -9
  80. package/dist/src/presentation/cli/commands/repo/resolve-repository.d.ts.map +1 -1
  81. package/dist/src/presentation/cli/commands/repo/resolve-repository.js +7 -2
  82. package/dist/src/presentation/cli/commands/repo/show.command.d.ts.map +1 -1
  83. package/dist/src/presentation/cli/commands/repo/show.command.js +21 -10
  84. package/dist/src/presentation/cli/commands/restart.command.d.ts.map +1 -1
  85. package/dist/src/presentation/cli/commands/restart.command.js +6 -4
  86. package/dist/src/presentation/cli/commands/run.command.d.ts.map +1 -1
  87. package/dist/src/presentation/cli/commands/run.command.js +21 -17
  88. package/dist/src/presentation/cli/commands/session/index.d.ts.map +1 -1
  89. package/dist/src/presentation/cli/commands/session/index.js +3 -1
  90. package/dist/src/presentation/cli/commands/session/ls.command.d.ts.map +1 -1
  91. package/dist/src/presentation/cli/commands/session/ls.command.js +11 -9
  92. package/dist/src/presentation/cli/commands/session/show.command.d.ts.map +1 -1
  93. package/dist/src/presentation/cli/commands/session/show.command.js +26 -18
  94. package/dist/src/presentation/cli/commands/settings/agent.command.d.ts.map +1 -1
  95. package/dist/src/presentation/cli/commands/settings/agent.command.js +12 -8
  96. package/dist/src/presentation/cli/commands/settings/ide.command.d.ts.map +1 -1
  97. package/dist/src/presentation/cli/commands/settings/ide.command.js +13 -7
  98. package/dist/src/presentation/cli/commands/settings/index.d.ts +1 -0
  99. package/dist/src/presentation/cli/commands/settings/index.d.ts.map +1 -1
  100. package/dist/src/presentation/cli/commands/settings/index.js +7 -3
  101. package/dist/src/presentation/cli/commands/settings/init.command.d.ts.map +1 -1
  102. package/dist/src/presentation/cli/commands/settings/init.command.js +8 -7
  103. package/dist/src/presentation/cli/commands/settings/language.command.d.ts +14 -0
  104. package/dist/src/presentation/cli/commands/settings/language.command.d.ts.map +1 -0
  105. package/dist/src/presentation/cli/commands/settings/language.command.js +79 -0
  106. package/dist/src/presentation/cli/commands/settings/model.command.d.ts.map +1 -1
  107. package/dist/src/presentation/cli/commands/settings/model.command.js +7 -6
  108. package/dist/src/presentation/cli/commands/settings/show.command.d.ts.map +1 -1
  109. package/dist/src/presentation/cli/commands/settings/show.command.js +4 -3
  110. package/dist/src/presentation/cli/commands/settings/workflow.command.d.ts.map +1 -1
  111. package/dist/src/presentation/cli/commands/settings/workflow.command.js +20 -18
  112. package/dist/src/presentation/cli/commands/start.command.d.ts.map +1 -1
  113. package/dist/src/presentation/cli/commands/start.command.js +5 -3
  114. package/dist/src/presentation/cli/commands/status.command.d.ts.map +1 -1
  115. package/dist/src/presentation/cli/commands/status.command.js +32 -24
  116. package/dist/src/presentation/cli/commands/stop.command.d.ts.map +1 -1
  117. package/dist/src/presentation/cli/commands/stop.command.js +4 -2
  118. package/dist/src/presentation/cli/commands/tools.command.d.ts.map +1 -1
  119. package/dist/src/presentation/cli/commands/tools.command.js +8 -4
  120. package/dist/src/presentation/cli/commands/ui.command.d.ts.map +1 -1
  121. package/dist/src/presentation/cli/commands/ui.command.js +12 -10
  122. package/dist/src/presentation/cli/commands/upgrade.command.d.ts.map +1 -1
  123. package/dist/src/presentation/cli/commands/upgrade.command.js +18 -13
  124. package/dist/src/presentation/cli/commands/version.command.d.ts.map +1 -1
  125. package/dist/src/presentation/cli/commands/version.command.js +5 -3
  126. package/dist/src/presentation/cli/i18n.d.ts +41 -0
  127. package/dist/src/presentation/cli/i18n.d.ts.map +1 -0
  128. package/dist/src/presentation/cli/i18n.js +100 -0
  129. package/dist/src/presentation/cli/index.js +13 -1
  130. package/dist/src/presentation/cli/ui/install-messages.d.ts.map +1 -1
  131. package/dist/src/presentation/cli/ui/install-messages.js +16 -6
  132. package/dist/src/presentation/tui/i18n.d.ts +24 -0
  133. package/dist/src/presentation/tui/i18n.d.ts.map +1 -0
  134. package/dist/src/presentation/tui/i18n.js +48 -0
  135. package/dist/src/presentation/tui/prompts/agent-select.prompt.d.ts +13 -31
  136. package/dist/src/presentation/tui/prompts/agent-select.prompt.d.ts.map +1 -1
  137. package/dist/src/presentation/tui/prompts/agent-select.prompt.js +17 -15
  138. package/dist/src/presentation/tui/prompts/auth-method.prompt.d.ts +7 -11
  139. package/dist/src/presentation/tui/prompts/auth-method.prompt.d.ts.map +1 -1
  140. package/dist/src/presentation/tui/prompts/auth-method.prompt.js +7 -5
  141. package/dist/src/presentation/tui/prompts/ide-select.prompt.d.ts.map +1 -1
  142. package/dist/src/presentation/tui/prompts/ide-select.prompt.js +2 -1
  143. package/dist/src/presentation/tui/prompts/prd-review-summary.prompt.d.ts.map +1 -1
  144. package/dist/src/presentation/tui/prompts/prd-review-summary.prompt.js +8 -6
  145. package/dist/src/presentation/tui/wizards/agent-config.wizard.d.ts.map +1 -1
  146. package/dist/src/presentation/tui/wizards/agent-config.wizard.js +2 -1
  147. package/dist/src/presentation/tui/wizards/github-import.wizard.d.ts.map +1 -1
  148. package/dist/src/presentation/tui/wizards/github-import.wizard.js +15 -11
  149. package/dist/src/presentation/tui/wizards/merge-review.wizard.d.ts.map +1 -1
  150. package/dist/src/presentation/tui/wizards/merge-review.wizard.js +10 -8
  151. package/dist/src/presentation/tui/wizards/onboarding/onboarding.wizard.d.ts.map +1 -1
  152. package/dist/src/presentation/tui/wizards/onboarding/onboarding.wizard.js +10 -7
  153. package/dist/src/presentation/tui/wizards/onboarding/steps/workflow-defaults.step.d.ts +0 -41
  154. package/dist/src/presentation/tui/wizards/onboarding/steps/workflow-defaults.step.d.ts.map +1 -1
  155. package/dist/src/presentation/tui/wizards/onboarding/steps/workflow-defaults.step.js +15 -15
  156. package/dist/src/presentation/tui/wizards/plan-review.wizard.d.ts.map +1 -1
  157. package/dist/src/presentation/tui/wizards/plan-review.wizard.js +10 -8
  158. package/dist/src/presentation/tui/wizards/prd-review.wizard.d.ts.map +1 -1
  159. package/dist/src/presentation/tui/wizards/prd-review.wizard.js +3 -2
  160. package/dist/src/presentation/web/app/layout.d.ts.map +1 -1
  161. package/dist/src/presentation/web/app/layout.js +5 -2
  162. package/dist/src/presentation/web/components/assistant-ui/thread.js +5 -5
  163. package/dist/src/presentation/web/components/common/attachment-chip/attachment-chip.js +1 -1
  164. package/dist/src/presentation/web/components/common/base-drawer/base-drawer.js +1 -1
  165. package/dist/src/presentation/web/components/common/ci-status-badge/ci-status-badge.js +3 -3
  166. package/dist/src/presentation/web/components/common/control-center-drawer/adopt-branch-drawer.js +4 -4
  167. package/dist/src/presentation/web/components/common/control-center-drawer/repository-drawer-client.js +1 -1
  168. package/dist/src/presentation/web/components/common/delete-feature-dialog/delete-feature-dialog.d.ts.map +1 -1
  169. package/dist/src/presentation/web/components/common/delete-feature-dialog/delete-feature-dialog.js +3 -1
  170. package/dist/src/presentation/web/components/common/deployment-status-badge/deployment-status-badge.js +2 -2
  171. package/dist/src/presentation/web/components/common/drawer-action-bar/drawer-action-bar.js +2 -2
  172. package/dist/src/presentation/web/components/common/empty-state/empty-state.stories.js +2 -2
  173. package/dist/src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.js +2 -2
  174. package/dist/src/presentation/web/components/common/feature-drawer-tabs/activity-tab.js +4 -4
  175. package/dist/src/presentation/web/components/common/feature-drawer-tabs/branch-sync-status.js +1 -1
  176. package/dist/src/presentation/web/components/common/feature-drawer-tabs/feature-drawer-tabs.js +1 -1
  177. package/dist/src/presentation/web/components/common/feature-drawer-tabs/log-tab.js +1 -1
  178. package/dist/src/presentation/web/components/common/feature-drawer-tabs/overview-tab.js +1 -1
  179. package/dist/src/presentation/web/components/common/feature-list-item/feature-list-item.js +1 -1
  180. package/dist/src/presentation/web/components/common/feature-node/feature-node-state-config.d.ts +2 -2
  181. package/dist/src/presentation/web/components/common/feature-node/feature-node-state-config.d.ts.map +1 -1
  182. package/dist/src/presentation/web/components/common/feature-node/feature-node-state-config.js +22 -22
  183. package/dist/src/presentation/web/components/common/feature-node/feature-node.js +4 -4
  184. package/dist/src/presentation/web/components/common/feature-node/feature-sessions-dropdown.js +1 -1
  185. package/dist/src/presentation/web/components/common/feature-status-group/feature-status-group.js +1 -1
  186. package/dist/src/presentation/web/components/common/github-import-dialog/github-repo-browser.js +1 -1
  187. package/dist/src/presentation/web/components/common/merge-review/diff-view.js +2 -2
  188. package/dist/src/presentation/web/components/common/merge-review/merge-review.js +2 -2
  189. package/dist/src/presentation/web/components/common/prd-questionnaire/prd-questionnaire.js +3 -3
  190. package/dist/src/presentation/web/components/common/reject-feedback-dialog/reject-feedback-dialog.d.ts.map +1 -1
  191. package/dist/src/presentation/web/components/common/reject-feedback-dialog/reject-feedback-dialog.js +6 -4
  192. package/dist/src/presentation/web/components/common/repository-node/repository-node.js +3 -3
  193. package/dist/src/presentation/web/components/common/server-log-viewer/server-log-viewer.js +1 -1
  194. package/dist/src/presentation/web/components/common/task-progress-view/task-progress-view.js +2 -2
  195. package/dist/src/presentation/web/components/common/tech-decisions-review/tech-decisions-review.js +2 -2
  196. package/dist/src/presentation/web/components/common/version-badge/version-badge.js +1 -1
  197. package/dist/src/presentation/web/components/features/chat/ChatMessageBubble.js +4 -4
  198. package/dist/src/presentation/web/components/features/chat/ChatMessageList.js +1 -1
  199. package/dist/src/presentation/web/components/features/chat/ChatTab.js +1 -1
  200. package/dist/src/presentation/web/components/features/control-center/control-center-empty-state.d.ts.map +1 -1
  201. package/dist/src/presentation/web/components/features/control-center/control-center-empty-state.js +15 -11
  202. package/dist/src/presentation/web/components/features/control-center/welcome-agent-setup.d.ts.map +1 -1
  203. package/dist/src/presentation/web/components/features/control-center/welcome-agent-setup.js +8 -6
  204. package/dist/src/presentation/web/components/features/features-canvas/canvas-toolbar.d.ts.map +1 -1
  205. package/dist/src/presentation/web/components/features/features-canvas/canvas-toolbar.js +3 -1
  206. package/dist/src/presentation/web/components/features/features-canvas/features-canvas.d.ts.map +1 -1
  207. package/dist/src/presentation/web/components/features/features-canvas/features-canvas.js +4 -2
  208. package/dist/src/presentation/web/components/features/settings/AgentModelPicker/index.js +2 -2
  209. package/dist/src/presentation/web/components/features/settings/ModelPicker/index.js +2 -2
  210. package/dist/src/presentation/web/components/features/settings/agent-settings-section.js +1 -1
  211. package/dist/src/presentation/web/components/features/settings/language-settings-section.d.ts +5 -0
  212. package/dist/src/presentation/web/components/features/settings/language-settings-section.d.ts.map +1 -0
  213. package/dist/src/presentation/web/components/features/settings/language-settings-section.js +54 -0
  214. package/dist/src/presentation/web/components/features/settings/language-settings-section.stories.d.ts +18 -0
  215. package/dist/src/presentation/web/components/features/settings/language-settings-section.stories.d.ts.map +1 -0
  216. package/dist/src/presentation/web/components/features/settings/language-settings-section.stories.js +36 -0
  217. package/dist/src/presentation/web/components/features/settings/settings-page-client.d.ts.map +1 -1
  218. package/dist/src/presentation/web/components/features/settings/settings-page-client.js +89 -77
  219. package/dist/src/presentation/web/components/features/settings/timeout-slider.js +1 -1
  220. package/dist/src/presentation/web/components/features/skills/category-filter.js +1 -1
  221. package/dist/src/presentation/web/components/features/skills/skills-page-client.js +1 -1
  222. package/dist/src/presentation/web/components/features/tools/tool-card.js +1 -1
  223. package/dist/src/presentation/web/components/features/tools/tool-detail-drawer.js +2 -2
  224. package/dist/src/presentation/web/components/layouts/app-sidebar/app-sidebar.d.ts.map +1 -1
  225. package/dist/src/presentation/web/components/layouts/app-sidebar/app-sidebar.js +10 -4
  226. package/dist/src/presentation/web/components/providers/i18n-provider.d.ts +17 -0
  227. package/dist/src/presentation/web/components/providers/i18n-provider.d.ts.map +1 -0
  228. package/dist/src/presentation/web/components/providers/i18n-provider.js +36 -0
  229. package/dist/src/presentation/web/components/ui/alert-dialog.js +1 -1
  230. package/dist/src/presentation/web/components/ui/alert.js +1 -1
  231. package/dist/src/presentation/web/components/ui/checkbox-group.js +1 -1
  232. package/dist/src/presentation/web/components/ui/command.js +1 -1
  233. package/dist/src/presentation/web/components/ui/dialog.d.ts.map +1 -1
  234. package/dist/src/presentation/web/components/ui/dialog.js +2 -2
  235. package/dist/src/presentation/web/components/ui/dialog.stories.js +1 -1
  236. package/dist/src/presentation/web/components/ui/drawer.js +1 -1
  237. package/dist/src/presentation/web/components/ui/dropdown-menu.js +6 -6
  238. package/dist/src/presentation/web/components/ui/scroll-area.js +1 -1
  239. package/dist/src/presentation/web/components/ui/select.js +1 -1
  240. package/dist/src/presentation/web/components/ui/sheet.js +1 -1
  241. package/dist/src/presentation/web/components/ui/sidebar.js +6 -6
  242. package/dist/src/presentation/web/hooks/use-sound-action.stories.js +1 -1
  243. package/dist/src/presentation/web/lib/i18n.d.ts +15 -0
  244. package/dist/src/presentation/web/lib/i18n.d.ts.map +1 -0
  245. package/dist/src/presentation/web/lib/i18n.js +46 -0
  246. package/dist/src/presentation/web/lib/language.d.ts +23 -0
  247. package/dist/src/presentation/web/lib/language.d.ts.map +1 -0
  248. package/dist/src/presentation/web/lib/language.js +37 -0
  249. package/dist/src/presentation/web/lib/rtl-fonts.d.ts +19 -0
  250. package/dist/src/presentation/web/lib/rtl-fonts.d.ts.map +1 -0
  251. package/dist/src/presentation/web/lib/rtl-fonts.js +51 -0
  252. package/dist/translations/ar/cli.json +613 -0
  253. package/dist/translations/ar/common.json +55 -0
  254. package/dist/translations/ar/tui.json +130 -0
  255. package/dist/translations/ar/web.json +320 -0
  256. package/dist/translations/de/cli.json +613 -0
  257. package/dist/translations/de/common.json +55 -0
  258. package/dist/translations/de/tui.json +109 -0
  259. package/dist/translations/de/web.json +306 -0
  260. package/dist/translations/en/cli.json +613 -0
  261. package/dist/translations/en/common.json +55 -0
  262. package/dist/translations/en/tui.json +130 -0
  263. package/dist/translations/en/web.json +320 -0
  264. package/dist/translations/es/cli.json +613 -0
  265. package/dist/translations/es/common.json +55 -0
  266. package/dist/translations/es/tui.json +130 -0
  267. package/dist/translations/es/web.json +320 -0
  268. package/dist/translations/fr/cli.json +613 -0
  269. package/dist/translations/fr/common.json +55 -0
  270. package/dist/translations/fr/tui.json +130 -0
  271. package/dist/translations/fr/web.json +320 -0
  272. package/dist/translations/he/cli.json +613 -0
  273. package/dist/translations/he/common.json +55 -0
  274. package/dist/translations/he/tui.json +130 -0
  275. package/dist/translations/he/web.json +320 -0
  276. package/dist/translations/pt/cli.json +613 -0
  277. package/dist/translations/pt/common.json +55 -0
  278. package/dist/translations/pt/tui.json +130 -0
  279. package/dist/translations/pt/web.json +320 -0
  280. package/dist/translations/ru/cli.json +613 -0
  281. package/dist/translations/ru/common.json +55 -0
  282. package/dist/translations/ru/tui.json +130 -0
  283. package/dist/translations/ru/web.json +320 -0
  284. package/dist/tsconfig.build.tsbuildinfo +1 -1
  285. package/package.json +4 -2
  286. package/web/.next/BUILD_ID +1 -1
  287. package/web/.next/build-manifest.json +2 -2
  288. package/web/.next/fallback-build-manifest.json +2 -2
  289. package/web/.next/prerender-manifest.json +3 -3
  290. package/web/.next/required-server-files.js +1 -1
  291. package/web/.next/required-server-files.json +1 -1
  292. package/web/.next/server/app/(dashboard)/@drawer/adopt/page/server-reference-manifest.json +28 -28
  293. package/web/.next/server/app/(dashboard)/@drawer/adopt/page.js +3 -3
  294. package/web/.next/server/app/(dashboard)/@drawer/adopt/page.js.nft.json +1 -1
  295. package/web/.next/server/app/(dashboard)/@drawer/adopt/page_client-reference-manifest.js +1 -1
  296. package/web/.next/server/app/(dashboard)/@drawer/chat/page/server-reference-manifest.json +26 -26
  297. package/web/.next/server/app/(dashboard)/@drawer/chat/page.js +3 -3
  298. package/web/.next/server/app/(dashboard)/@drawer/chat/page.js.nft.json +1 -1
  299. package/web/.next/server/app/(dashboard)/@drawer/chat/page_client-reference-manifest.js +1 -1
  300. package/web/.next/server/app/(dashboard)/@drawer/create/page/server-reference-manifest.json +29 -29
  301. package/web/.next/server/app/(dashboard)/@drawer/create/page.js +3 -3
  302. package/web/.next/server/app/(dashboard)/@drawer/create/page.js.nft.json +1 -1
  303. package/web/.next/server/app/(dashboard)/@drawer/create/page_client-reference-manifest.js +1 -1
  304. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page/server-reference-manifest.json +36 -36
  305. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page.js +4 -4
  306. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page.js.nft.json +1 -1
  307. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page_client-reference-manifest.js +1 -1
  308. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page/server-reference-manifest.json +36 -36
  309. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js +4 -4
  310. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js.nft.json +1 -1
  311. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page_client-reference-manifest.js +1 -1
  312. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/[tab]/page/server-reference-manifest.json +26 -26
  313. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/[tab]/page.js +3 -3
  314. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/[tab]/page.js.nft.json +1 -1
  315. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/[tab]/page_client-reference-manifest.js +1 -1
  316. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page/server-reference-manifest.json +26 -26
  317. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js +3 -3
  318. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js.nft.json +1 -1
  319. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  320. package/web/.next/server/app/(dashboard)/chat/page/server-reference-manifest.json +26 -26
  321. package/web/.next/server/app/(dashboard)/chat/page.js +3 -3
  322. package/web/.next/server/app/(dashboard)/chat/page.js.nft.json +1 -1
  323. package/web/.next/server/app/(dashboard)/chat/page_client-reference-manifest.js +1 -1
  324. package/web/.next/server/app/(dashboard)/create/page/server-reference-manifest.json +29 -29
  325. package/web/.next/server/app/(dashboard)/create/page.js +3 -3
  326. package/web/.next/server/app/(dashboard)/create/page.js.nft.json +1 -1
  327. package/web/.next/server/app/(dashboard)/create/page_client-reference-manifest.js +1 -1
  328. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page/server-reference-manifest.json +36 -36
  329. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page.js +4 -4
  330. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page.js.nft.json +1 -1
  331. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page_client-reference-manifest.js +1 -1
  332. package/web/.next/server/app/(dashboard)/feature/[featureId]/page/server-reference-manifest.json +36 -36
  333. package/web/.next/server/app/(dashboard)/feature/[featureId]/page.js +4 -4
  334. package/web/.next/server/app/(dashboard)/feature/[featureId]/page.js.nft.json +1 -1
  335. package/web/.next/server/app/(dashboard)/feature/[featureId]/page_client-reference-manifest.js +1 -1
  336. package/web/.next/server/app/(dashboard)/page/server-reference-manifest.json +26 -26
  337. package/web/.next/server/app/(dashboard)/page.js +3 -3
  338. package/web/.next/server/app/(dashboard)/page.js.nft.json +1 -1
  339. package/web/.next/server/app/(dashboard)/page_client-reference-manifest.js +1 -1
  340. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/[tab]/page/server-reference-manifest.json +26 -26
  341. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/[tab]/page.js +3 -3
  342. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/[tab]/page.js.nft.json +1 -1
  343. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/[tab]/page_client-reference-manifest.js +1 -1
  344. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page/server-reference-manifest.json +26 -26
  345. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js +3 -3
  346. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js.nft.json +1 -1
  347. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  348. package/web/.next/server/app/_global-error.html +2 -2
  349. package/web/.next/server/app/_global-error.rsc +1 -1
  350. package/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  351. package/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  352. package/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  353. package/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  354. package/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  355. package/web/.next/server/app/_not-found/page/server-reference-manifest.json +5 -5
  356. package/web/.next/server/app/_not-found/page.js +2 -2
  357. package/web/.next/server/app/_not-found/page.js.nft.json +1 -1
  358. package/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  359. package/web/.next/server/app/api/attachments/preview/route.js.nft.json +1 -1
  360. package/web/.next/server/app/api/evidence/route.js.nft.json +1 -1
  361. package/web/.next/server/app/api/graph-data/route.js.nft.json +1 -1
  362. package/web/.next/server/app/api/interactive/chat/[featureId]/messages/route.js.nft.json +1 -1
  363. package/web/.next/server/app/settings/page/server-reference-manifest.json +8 -8
  364. package/web/.next/server/app/settings/page.js +2 -2
  365. package/web/.next/server/app/settings/page.js.nft.json +1 -1
  366. package/web/.next/server/app/settings/page_client-reference-manifest.js +1 -1
  367. package/web/.next/server/app/skills/page/server-reference-manifest.json +10 -10
  368. package/web/.next/server/app/skills/page.js +3 -4
  369. package/web/.next/server/app/skills/page.js.nft.json +1 -1
  370. package/web/.next/server/app/skills/page_client-reference-manifest.js +1 -1
  371. package/web/.next/server/app/tools/page/server-reference-manifest.json +10 -10
  372. package/web/.next/server/app/tools/page.js +3 -4
  373. package/web/.next/server/app/tools/page.js.nft.json +1 -1
  374. package/web/.next/server/app/tools/page_client-reference-manifest.js +1 -1
  375. package/web/.next/server/app/version/page/server-reference-manifest.json +5 -5
  376. package/web/.next/server/app/version/page.js +2 -2
  377. package/web/.next/server/app/version/page.js.nft.json +1 -1
  378. package/web/.next/server/app/version/page_client-reference-manifest.js +1 -1
  379. package/web/.next/server/chunks/[root-of-the-server]__a402b567._.js +1 -1
  380. package/web/.next/server/chunks/[root-of-the-server]__beda892a._.js +1 -1
  381. package/web/.next/server/chunks/[root-of-the-server]__beda892a._.js.map +1 -1
  382. package/web/.next/server/chunks/[root-of-the-server]__cd67a84c._.js +1 -1
  383. package/web/.next/server/chunks/[root-of-the-server]__cd67a84c._.js.map +1 -1
  384. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js +1 -1
  385. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js.map +1 -1
  386. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_feature-drawer-client_tsx_e9755fc8._.js +2 -2
  387. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_feature-drawer-client_tsx_e9755fc8._.js.map +1 -1
  388. package/web/.next/server/chunks/ssr/{[root-of-the-server]__88f7e8e6._.js → [root-of-the-server]__209c9597._.js} +2 -2
  389. package/web/.next/server/chunks/ssr/{[root-of-the-server]__88f7e8e6._.js.map → [root-of-the-server]__209c9597._.js.map} +1 -1
  390. package/web/.next/server/chunks/ssr/{[root-of-the-server]__f8dd4422._.js → [root-of-the-server]__25ee8d4c._.js} +2 -2
  391. package/web/.next/server/chunks/ssr/[root-of-the-server]__25ee8d4c._.js.map +1 -0
  392. package/web/.next/server/chunks/ssr/{[root-of-the-server]__17ed7ed1._.js → [root-of-the-server]__27301e38._.js} +2 -2
  393. package/web/.next/server/chunks/ssr/{[root-of-the-server]__17ed7ed1._.js.map → [root-of-the-server]__27301e38._.js.map} +1 -1
  394. package/web/.next/server/chunks/ssr/[root-of-the-server]__357d99f9._.js +1 -1
  395. package/web/.next/server/chunks/ssr/[root-of-the-server]__56b70465._.js +1 -1
  396. package/web/.next/server/chunks/ssr/[root-of-the-server]__56b70465._.js.map +1 -1
  397. package/web/.next/server/chunks/ssr/{[root-of-the-server]__42bf1807._.js → [root-of-the-server]__6fecf886._.js} +2 -2
  398. package/web/.next/server/chunks/ssr/{[root-of-the-server]__42bf1807._.js.map → [root-of-the-server]__6fecf886._.js.map} +1 -1
  399. package/web/.next/server/chunks/ssr/[root-of-the-server]__8b0aac03._.js +1 -1
  400. package/web/.next/server/chunks/ssr/{[root-of-the-server]__28d0d265._.js → [root-of-the-server]__8d27866c._.js} +3 -3
  401. package/web/.next/server/chunks/ssr/[root-of-the-server]__8d27866c._.js.map +1 -0
  402. package/web/.next/server/chunks/ssr/{[root-of-the-server]__f80bfc75._.js → [root-of-the-server]__9f3504c7._.js} +2 -2
  403. package/web/.next/server/chunks/ssr/{[root-of-the-server]__f80bfc75._.js.map → [root-of-the-server]__9f3504c7._.js.map} +1 -1
  404. package/web/.next/server/chunks/ssr/[root-of-the-server]__bd6ed91a._.js +4 -0
  405. package/web/.next/server/chunks/ssr/[root-of-the-server]__bd6ed91a._.js.map +1 -0
  406. package/web/.next/server/chunks/ssr/[root-of-the-server]__c30f1f82._.js +1 -1
  407. package/web/.next/server/chunks/ssr/[root-of-the-server]__c30f1f82._.js.map +1 -1
  408. package/web/.next/server/chunks/ssr/[root-of-the-server]__dffa13c5._.js +3 -0
  409. package/web/.next/server/chunks/ssr/[root-of-the-server]__dffa13c5._.js.map +1 -0
  410. package/web/.next/server/chunks/ssr/[root-of-the-server]__e91ffd5e._.js +2 -2
  411. package/web/.next/server/chunks/ssr/[root-of-the-server]__e91ffd5e._.js.map +1 -1
  412. package/web/.next/server/chunks/ssr/_05c23ad9._.js +1 -1
  413. package/web/.next/server/chunks/ssr/_05c23ad9._.js.map +1 -1
  414. package/web/.next/server/chunks/ssr/_0cd9ca53._.js +3 -0
  415. package/web/.next/server/chunks/ssr/_0cd9ca53._.js.map +1 -0
  416. package/web/.next/server/chunks/ssr/_16eb4fec._.js +1 -1
  417. package/web/.next/server/chunks/ssr/_16eb4fec._.js.map +1 -1
  418. package/web/.next/server/chunks/ssr/{_08f3fd21._.js → _28e7429c._.js} +2 -2
  419. package/web/.next/server/chunks/ssr/{_08f3fd21._.js.map → _28e7429c._.js.map} +1 -1
  420. package/web/.next/server/chunks/ssr/_3a0b989f._.js +2 -2
  421. package/web/.next/server/chunks/ssr/_3a0b989f._.js.map +1 -1
  422. package/web/.next/server/chunks/ssr/{_67104d9e._.js → _3bcda5d7._.js} +2 -2
  423. package/web/.next/server/chunks/ssr/{_67104d9e._.js.map → _3bcda5d7._.js.map} +1 -1
  424. package/web/.next/server/chunks/ssr/_470e90f4._.js +9 -0
  425. package/web/.next/server/chunks/ssr/_470e90f4._.js.map +1 -0
  426. package/web/.next/server/chunks/ssr/_56b9d60f._.js +1 -1
  427. package/web/.next/server/chunks/ssr/_56b9d60f._.js.map +1 -1
  428. package/web/.next/server/chunks/ssr/_5bfcc8de._.js +4 -0
  429. package/web/.next/server/chunks/ssr/_5bfcc8de._.js.map +1 -0
  430. package/web/.next/server/chunks/ssr/_5f69c13f._.js +1 -1
  431. package/web/.next/server/chunks/ssr/_5f69c13f._.js.map +1 -1
  432. package/web/.next/server/chunks/ssr/{_d957c7f8._.js → _7773b2dc._.js} +2 -2
  433. package/web/.next/server/chunks/ssr/{_d957c7f8._.js.map → _7773b2dc._.js.map} +1 -1
  434. package/web/.next/server/chunks/ssr/_7c5b97c6._.js +1 -1
  435. package/web/.next/server/chunks/ssr/_7c5b97c6._.js.map +1 -1
  436. package/web/.next/server/chunks/ssr/_82c57f10._.js +1 -1
  437. package/web/.next/server/chunks/ssr/_82c57f10._.js.map +1 -1
  438. package/web/.next/server/chunks/ssr/_8b57edb8._.js +1 -1
  439. package/web/.next/server/chunks/ssr/_8b57edb8._.js.map +1 -1
  440. package/web/.next/server/chunks/ssr/_9495d50b._.js +1 -1
  441. package/web/.next/server/chunks/ssr/_9495d50b._.js.map +1 -1
  442. package/web/.next/server/chunks/ssr/_a0e3f7e4._.js +1 -1
  443. package/web/.next/server/chunks/ssr/_a0e3f7e4._.js.map +1 -1
  444. package/web/.next/server/chunks/ssr/_ac4a3873._.js +1 -1
  445. package/web/.next/server/chunks/ssr/_ac4a3873._.js.map +1 -1
  446. package/web/.next/server/chunks/ssr/{_507a8382._.js → _b9ba2473._.js} +2 -2
  447. package/web/.next/server/chunks/ssr/_b9ba2473._.js.map +1 -0
  448. package/web/.next/server/chunks/ssr/_ca0aa7f0._.js +1 -1
  449. package/web/.next/server/chunks/ssr/_ca0aa7f0._.js.map +1 -1
  450. package/web/.next/server/chunks/ssr/_cb5a021e._.js +1 -1
  451. package/web/.next/server/chunks/ssr/_cb5a021e._.js.map +1 -1
  452. package/web/.next/server/chunks/ssr/_cfbd1d7e._.js +1 -1
  453. package/web/.next/server/chunks/ssr/_cfbd1d7e._.js.map +1 -1
  454. package/web/.next/server/chunks/ssr/_d4b20e29._.js +1 -1
  455. package/web/.next/server/chunks/ssr/_d4b20e29._.js.map +1 -1
  456. package/web/.next/server/chunks/ssr/_d86175ae._.js +1 -1
  457. package/web/.next/server/chunks/ssr/_d86175ae._.js.map +1 -1
  458. package/web/.next/server/chunks/ssr/_d8bedf13._.js +1 -1
  459. package/web/.next/server/chunks/ssr/_d8bedf13._.js.map +1 -1
  460. package/web/.next/server/chunks/ssr/_d90b0a06._.js +3 -0
  461. package/web/.next/server/chunks/ssr/_d90b0a06._.js.map +1 -0
  462. package/web/.next/server/chunks/ssr/_fa7efce3._.js +2 -2
  463. package/web/.next/server/chunks/ssr/_fa7efce3._.js.map +1 -1
  464. package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_settings_settings-page-client_tsx_6ed9d5f8._.js +1 -1
  465. package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_settings_settings-page-client_tsx_6ed9d5f8._.js.map +1 -1
  466. package/web/.next/server/chunks/ssr/node_modules__pnpm_55cf6695._.js +3 -0
  467. package/web/.next/server/chunks/ssr/node_modules__pnpm_55cf6695._.js.map +1 -0
  468. package/web/.next/server/chunks/ssr/src_presentation_web_324a47da._.js +1 -1
  469. package/web/.next/server/chunks/ssr/src_presentation_web_324a47da._.js.map +1 -1
  470. package/web/.next/server/chunks/ssr/src_presentation_web_app_actions_open-ide_ts_baaca5d5._.js +1 -1
  471. package/web/.next/server/chunks/ssr/src_presentation_web_components_895e5bfa._.js +3 -0
  472. package/web/.next/server/chunks/ssr/src_presentation_web_components_895e5bfa._.js.map +1 -0
  473. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js +1 -1
  474. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js.map +1 -1
  475. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_tools_tools-page-client_tsx_3d0aa70c._.js +1 -1
  476. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_tools_tools-page-client_tsx_3d0aa70c._.js.map +1 -1
  477. package/web/.next/server/chunks/ssr/src_presentation_web_db9fa0c2._.js.map +1 -1
  478. package/web/.next/server/pages/500.html +2 -2
  479. package/web/.next/server/server-reference-manifest.js +1 -1
  480. package/web/.next/server/server-reference-manifest.json +45 -45
  481. package/web/.next/static/chunks/05c9ed792a1d9056.js +1 -0
  482. package/web/.next/static/chunks/{04cb9cede104b5f8.js → 1c07a9270515f2e3.js} +2 -2
  483. package/web/.next/static/chunks/{e3339b33db2768bd.js → 24d5e151f7de6b4c.js} +1 -1
  484. package/web/.next/static/chunks/{b224651a2324c8f7.js → 2aada437f51df3e6.js} +1 -1
  485. package/web/.next/static/chunks/2eeee9bcbf660a4b.js +1 -0
  486. package/web/.next/static/chunks/{688971d5bad5dc7c.js → 3deefc76ea55047c.js} +1 -1
  487. package/web/.next/static/chunks/{11091b676d1b3bd4.js → 47477ed4c5871747.js} +1 -1
  488. package/web/.next/static/chunks/{7bdd3f51e4993fb6.js → 4978be67c4e6498f.js} +3 -3
  489. package/web/.next/static/chunks/4a399ee2a9942a1b.js +1 -0
  490. package/web/.next/static/chunks/{c3a9b33826b0e541.js → 536afd754a63da39.js} +1 -1
  491. package/web/.next/static/chunks/70390bd89521bc19.js +1 -0
  492. package/web/.next/static/chunks/{22c459f1877b1e4f.js → 74db65fa7bfb80bd.js} +1 -1
  493. package/web/.next/static/chunks/8fd082719935d5e6.js +1 -0
  494. package/web/.next/static/chunks/91927044df8e28bb.js +7 -0
  495. package/web/.next/static/chunks/b1b5b0bf84caabd4.js +1 -0
  496. package/web/.next/static/chunks/{e1b6fd86f641261d.js → b674bc11b321a5ee.js} +1 -1
  497. package/web/.next/static/chunks/b68b16b4c3528979.js +2 -0
  498. package/web/.next/static/chunks/{b4cde06eff374c59.js → bfdb66301af07da1.js} +2 -2
  499. package/web/.next/static/chunks/d58e68d03d055a9b.css +1 -0
  500. package/web/.next/static/chunks/{5ae60a052ab5f437.js → d6e702c209c413ce.js} +2 -2
  501. package/web/.next/static/chunks/{4b2c4a5c35ebb70d.js → e4e358c4f67366fd.js} +1 -1
  502. package/web/.next/server/chunks/ssr/[root-of-the-server]__0b150ddf._.js +0 -3
  503. package/web/.next/server/chunks/ssr/[root-of-the-server]__0b150ddf._.js.map +0 -1
  504. package/web/.next/server/chunks/ssr/[root-of-the-server]__28d0d265._.js.map +0 -1
  505. package/web/.next/server/chunks/ssr/[root-of-the-server]__f8dd4422._.js.map +0 -1
  506. package/web/.next/server/chunks/ssr/_4601ff05._.js +0 -4
  507. package/web/.next/server/chunks/ssr/_4601ff05._.js.map +0 -1
  508. package/web/.next/server/chunks/ssr/_4b432739._.js +0 -3
  509. package/web/.next/server/chunks/ssr/_4b432739._.js.map +0 -1
  510. package/web/.next/server/chunks/ssr/_507a8382._.js.map +0 -1
  511. package/web/.next/server/chunks/ssr/_8219712a._.js +0 -3
  512. package/web/.next/server/chunks/ssr/_8219712a._.js.map +0 -1
  513. package/web/.next/server/chunks/ssr/_e9a73a63._.js +0 -9
  514. package/web/.next/server/chunks/ssr/_e9a73a63._.js.map +0 -1
  515. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_skills_page_actions_cdc632e3.js +0 -3
  516. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_skills_page_actions_cdc632e3.js.map +0 -1
  517. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_tools_page_actions_39ca0924.js +0 -3
  518. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_tools_page_actions_39ca0924.js.map +0 -1
  519. package/web/.next/server/chunks/ssr/src_presentation_web_components_357e3eb0._.js +0 -3
  520. package/web/.next/server/chunks/ssr/src_presentation_web_components_357e3eb0._.js.map +0 -1
  521. package/web/.next/static/chunks/190cb2b91443b7a2.js +0 -1
  522. package/web/.next/static/chunks/232221de97ee02ee.js +0 -1
  523. package/web/.next/static/chunks/5ea1d031a4327efd.js +0 -1
  524. package/web/.next/static/chunks/639776981e3c0300.js +0 -7
  525. package/web/.next/static/chunks/6bef26d1ebd38687.js +0 -1
  526. package/web/.next/static/chunks/8590bd2e69b24b9e.css +0 -1
  527. package/web/.next/static/chunks/9207c052206225b2.js +0 -2
  528. package/web/.next/static/chunks/cd54b758f58061d0.js +0 -1
  529. /package/web/.next/static/{SnRLSukTe4qbiJHXHhXVW → Uqo91vsr2HsZrCKrZOYMZ}/_buildManifest.js +0 -0
  530. /package/web/.next/static/{SnRLSukTe4qbiJHXHhXVW → Uqo91vsr2HsZrCKrZOYMZ}/_clientMiddlewareManifest.json +0 -0
  531. /package/web/.next/static/{SnRLSukTe4qbiJHXHhXVW → Uqo91vsr2HsZrCKrZOYMZ}/_ssgManifest.js +0 -0
@@ -1,16 +1,18 @@
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, Minus, Plus, ExternalLink, Settings2, Timer, MessageSquare, } from 'lucide-react';
4
+ import { Check, Bot, Terminal, GitBranch, Activity, Bell, Flag, Database, Globe, Minus, Plus, ExternalLink, Settings2, Timer, MessageSquare, } from 'lucide-react';
5
5
  import { toast } from 'sonner';
6
+ import { useTranslation } from 'react-i18next';
6
7
  import { cn } from '../../../lib/utils.js';
7
8
  import { Label } from '../../ui/label.js';
8
9
  import { Switch } from '../../ui/switch.js';
9
10
  import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from '../../ui/select.js';
10
11
  import { updateSettingsAction } from '../../../app/actions/update-settings.js';
11
- import { EditorType, TerminalType } from '../../../../../../packages/core/src/domain/generated/output.js';
12
+ import { EditorType, Language, TerminalType, } from '../../../../../../packages/core/src/domain/generated/output.js';
12
13
  import { getEditorTypeIcon } from '../../common/editor-type-icons.js';
13
14
  import { AgentModelPicker } from '../../features/settings/AgentModelPicker/index.js';
15
+ import { LanguageSettingsSection } from '../../features/settings/language-settings-section.js';
14
16
  import { TimeoutSlider } from '../../features/settings/timeout-slider.js';
15
17
  const EDITOR_OPTIONS = [
16
18
  { value: EditorType.VsCode, label: 'VS Code' },
@@ -25,17 +27,19 @@ const SHELL_OPTIONS = [
25
27
  { value: 'fish', label: 'Fish' },
26
28
  ];
27
29
  const SECTIONS = [
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 },
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 },
37
40
  ];
38
41
  function useSaveIndicator() {
42
+ const { t } = useTranslation('web');
39
43
  const [isPending, startTransition] = useTransition();
40
44
  const [showSaving, setShowSaving] = useState(false);
41
45
  const [showSaved, setShowSaved] = useState(false);
@@ -69,10 +73,10 @@ function useSaveIndicator() {
69
73
  startTransition(async () => {
70
74
  const result = await updateSettingsAction(payload);
71
75
  if (!result.success) {
72
- toast.error(result.error ?? 'Failed to save settings');
76
+ toast.error(result.error ?? t('settings.failedToSave'));
73
77
  }
74
78
  });
75
- }, [startTransition]);
79
+ }, [startTransition, t]);
76
80
  return { showSaving, showSaved, save };
77
81
  }
78
82
  /* ── Reusable row components ── */
@@ -87,6 +91,7 @@ function SettingsSection({ icon: Icon, title, description, badge, testId, childr
87
91
  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 })] }));
88
92
  }
89
93
  function NumberStepper({ id, testId, value, onChange, onBlur, placeholder, min = 1, max, step = 1, suffix, }) {
94
+ const { t } = useTranslation('web');
90
95
  const numValue = value === '' ? undefined : parseInt(value, 10);
91
96
  const decrement = () => {
92
97
  const current = numValue ?? parseInt(placeholder, 10);
@@ -100,12 +105,12 @@ function NumberStepper({ id, testId, value, onChange, onBlur, placeholder, min =
100
105
  };
101
106
  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: () => {
102
107
  decrement();
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) => {
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) => {
104
109
  const v = e.target.value.replace(/[^0-9]/g, '');
105
110
  onChange(v);
106
111
  }, onBlur: onBlur, className: "h-8 w-14 bg-transparent text-center text-xs outline-none" }), _jsx("button", { type: "button", onClick: () => {
107
112
  increment();
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] }));
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] }));
109
114
  }
110
115
  function SubsectionLabel({ children }) {
111
116
  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 }) }));
@@ -115,6 +120,7 @@ function SectionHint({ children, links, }) {
115
120
  }
116
121
  /* ── Main component ── */
117
122
  export function SettingsPageClient({ settings, shepHome, dbFileSize, availableTerminals, }) {
123
+ const { t } = useTranslation('web');
118
124
  const { showSaving, showSaved, save } = useSaveIndicator();
119
125
  const featureFlags = settings.featureFlags ?? {
120
126
  skills: false,
@@ -134,7 +140,13 @@ export function SettingsPageClient({ settings, shepHome, dbFileSize, availableTe
134
140
  // Filter to only show installed terminals
135
141
  const terminalOptions = availableTerminals
136
142
  ? availableTerminals.filter((t) => t.available)
137
- : [{ id: TerminalType.System, name: 'System Terminal', available: true }];
143
+ : [
144
+ {
145
+ id: TerminalType.System,
146
+ name: t('settings.environment.systemTerminal'),
147
+ available: true,
148
+ },
149
+ ];
138
150
  // Workflow state
139
151
  const [openPr, setOpenPr] = useState(settings.workflow.openPrOnImplementationComplete);
140
152
  const [pushOnComplete, setPushOnComplete] = useState(settings.workflow.approvalGateDefaults.pushOnImplementationComplete);
@@ -292,26 +304,26 @@ export function SettingsPageClient({ settings, shepHome, dbFileSize, availableTe
292
304
  void el.offsetHeight;
293
305
  el.style.animation = 'section-flash 1s ease-out';
294
306
  }, []);
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) => {
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) => {
296
308
  const SectionIcon = s.icon;
297
309
  const isActive = activeSection === s.id;
298
310
  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
299
311
  ? 'bg-accent text-foreground font-medium'
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: [
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: [
302
314
  {
303
- label: 'Agent system',
315
+ label: t('settings.agent.links.agentSystem'),
304
316
  href: 'https://github.com/shep-ai/cli/blob/main/docs/architecture/agent-system.md',
305
317
  },
306
318
  {
307
- label: 'Adding agents',
319
+ label: t('settings.agent.links.addingAgents'),
308
320
  href: 'https://github.com/shep-ai/cli/blob/main/docs/development/adding-agents.md',
309
321
  },
310
322
  {
311
- label: 'Configuration guide',
323
+ label: t('settings.agent.links.configurationGuide'),
312
324
  href: 'https://github.com/shep-ai/cli/blob/main/docs/guides/configuration.md',
313
325
  },
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) => {
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) => {
315
327
  setEditor(v);
316
328
  save({
317
329
  environment: {
@@ -323,7 +335,7 @@ export function SettingsPageClient({ settings, shepHome, dbFileSize, availableTe
323
335
  }, 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) => {
324
336
  const Icon = getEditorTypeIcon(opt.value);
325
337
  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));
326
- }) })] }) }), _jsx(SettingsRow, { label: "Shell", description: "Default shell for generated scripts", htmlFor: "shell-preference", children: _jsxs(Select, { value: shell, onValueChange: (v) => {
338
+ }) })] }) }), _jsx(SettingsRow, { label: t('settings.environment.shell'), description: t('settings.environment.shellDescription'), htmlFor: "shell-preference", children: _jsxs(Select, { value: shell, onValueChange: (v) => {
327
339
  setShell(v);
328
340
  save({
329
341
  environment: {
@@ -332,7 +344,7 @@ export function SettingsPageClient({ settings, shepHome, dbFileSize, availableTe
332
344
  terminalPreference: terminal,
333
345
  },
334
346
  });
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) => {
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) => {
336
348
  setTerminal(v);
337
349
  save({
338
350
  environment: {
@@ -343,19 +355,19 @@ export function SettingsPageClient({ settings, shepHome, dbFileSize, availableTe
343
355
  });
344
356
  }, 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: [
345
357
  {
346
- label: 'Configuration guide',
358
+ label: t('settings.environment.links.configurationGuide'),
347
359
  href: 'https://github.com/shep-ai/cli/blob/main/docs/guides/configuration.md',
348
360
  },
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) => {
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) => {
350
362
  setAllowPrd(v);
351
363
  save(buildWorkflowPayload({ allowPrd: 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) => {
364
+ } }), _jsx(SwitchRow, { label: t('settings.workflow.autoApprovePlan'), description: t('settings.workflow.autoApprovePlanDescription'), id: "allow-plan", testId: "switch-allow-plan", checked: allowPlan, onChange: (v) => {
353
365
  setAllowPlan(v);
354
366
  save(buildWorkflowPayload({ allowPlan: v }));
355
- } }), _jsx(SwitchRow, { label: "Auto-approve Merge", description: "Merge without manual review", id: "allow-merge", testId: "switch-allow-merge", checked: allowMerge, onChange: (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) => {
356
368
  setAllowMerge(v);
357
369
  save(buildWorkflowPayload({ allowMerge: 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) => {
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) => {
359
371
  setEnableEvidence(v);
360
372
  if (!v) {
361
373
  setCommitEvidence(false);
@@ -364,13 +376,13 @@ export function SettingsPageClient({ settings, shepHome, dbFileSize, availableTe
364
376
  else {
365
377
  save(buildWorkflowPayload({ enableEvidence: v }));
366
378
  }
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) => {
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) => {
368
380
  setCommitEvidence(v);
369
381
  save(buildWorkflowPayload({ commitEvidence: 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) => {
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) => {
371
383
  setPushOnComplete(v);
372
384
  save(buildWorkflowPayload({ pushOnComplete: 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) => {
385
+ } }), _jsx(SwitchRow, { label: t('settings.workflow.openPrOnComplete'), description: t('settings.workflow.openPrOnCompleteDescription'), id: "open-pr", testId: "switch-open-pr", checked: openPr, onChange: (v) => {
374
386
  setOpenPr(v);
375
387
  if (!v) {
376
388
  setCommitEvidence(false);
@@ -379,144 +391,144 @@ export function SettingsPageClient({ settings, shepHome, dbFileSize, availableTe
379
391
  else {
380
392
  save(buildWorkflowPayload({ openPr: v }));
381
393
  }
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) => {
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) => {
383
395
  setCiWatchEnabled(v);
384
396
  save(buildWorkflowPayload({ ciWatchEnabled: v }));
385
397
  } })] }), _jsx(SectionHint, { links: [
386
398
  {
387
- label: 'Approval gates',
399
+ label: t('settings.workflow.links.approvalGates'),
388
400
  href: 'https://github.com/shep-ai/cli/blob/main/specs/016-hitl-approval-gates/spec.yaml',
389
401
  },
390
402
  {
391
- label: 'Push & PR flags',
403
+ label: t('settings.workflow.links.pushAndPrFlags'),
392
404
  href: 'https://github.com/shep-ai/cli/blob/main/specs/037-feature-pr-push-flags/spec.yaml',
393
405
  },
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: () => {
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: () => {
395
407
  if (ciMaxFix !== originalCiMaxFix)
396
408
  save(buildWorkflowPayload({ ciMaxFix }));
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: () => {
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: () => {
398
410
  if (ciTimeout !== originalCiTimeout)
399
411
  save(buildWorkflowPayload({ ciTimeout }));
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: () => {
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: () => {
401
413
  if (ciLogMax !== originalCiLogMax)
402
414
  save(buildWorkflowPayload({ ciLogMax }));
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: () => {
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: () => {
404
416
  if (ciPollInterval !== originalCiPollInterval)
405
417
  save(buildWorkflowPayload({ ciPollInterval }));
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) => {
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) => {
407
419
  setHideCiStatus(v);
408
420
  save(buildWorkflowPayload({ hideCiStatus: v }));
409
421
  } })] }), _jsx(SectionHint, { links: [
410
422
  {
411
- label: 'CI/CD pipeline',
423
+ label: t('settings.ci.links.cicdPipeline'),
412
424
  href: 'https://github.com/shep-ai/cli/blob/main/docs/development/cicd.md',
413
425
  },
414
426
  {
415
- label: 'CI security gates',
427
+ label: t('settings.ci.links.ciSecurityGates'),
416
428
  href: 'https://github.com/shep-ai/cli/blob/main/specs/003-cicd-security-gates/spec.md',
417
429
  },
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: () => {
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: () => {
419
431
  if (analyzeTimeout !== originalAnalyzeTimeout)
420
432
  save(buildWorkflowPayload({ analyzeTimeout }));
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: () => {
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: () => {
422
434
  if (requirementsTimeout !== originalRequirementsTimeout)
423
435
  save(buildWorkflowPayload({ requirementsTimeout }));
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: () => {
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: () => {
425
437
  if (researchTimeout !== originalResearchTimeout)
426
438
  save(buildWorkflowPayload({ researchTimeout }));
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: () => {
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: () => {
428
440
  if (planTimeout !== originalPlanTimeout)
429
441
  save(buildWorkflowPayload({ planTimeout }));
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: () => {
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: () => {
431
443
  if (implementTimeout !== originalImplementTimeout)
432
444
  save(buildWorkflowPayload({ implementTimeout }));
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: () => {
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: () => {
434
446
  if (mergeTimeout !== originalMergeTimeout)
435
447
  save(buildWorkflowPayload({ mergeTimeout }));
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: () => {
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: () => {
437
449
  if (analyzeRepoTimeout !== originalAnalyzeRepoTimeout)
438
450
  save(buildWorkflowPayload({ analyzeRepoTimeout }));
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) => {
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) => {
440
452
  setInApp(v);
441
453
  save(buildNotificationPayload({ inApp: 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) => {
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) => {
443
455
  const newEvents = { ...events, agentStarted: v };
444
456
  setEvents(newEvents);
445
457
  save(buildNotificationPayload({ events: newEvents }));
446
- } }), _jsx(SwitchRow, { label: "Phase completed", id: "notif-event-phaseCompleted", testId: "switch-event-phaseCompleted", checked: events.phaseCompleted, onChange: (v) => {
458
+ } }), _jsx(SwitchRow, { label: t('settings.notifications.events.phaseCompleted'), id: "notif-event-phaseCompleted", testId: "switch-event-phaseCompleted", checked: events.phaseCompleted, onChange: (v) => {
447
459
  const newEvents = { ...events, phaseCompleted: v };
448
460
  setEvents(newEvents);
449
461
  save(buildNotificationPayload({ events: newEvents }));
450
- } }), _jsx(SwitchRow, { label: "Waiting approval", id: "notif-event-waitingApproval", testId: "switch-event-waitingApproval", checked: events.waitingApproval, onChange: (v) => {
462
+ } }), _jsx(SwitchRow, { label: t('settings.notifications.events.waitingApproval'), id: "notif-event-waitingApproval", testId: "switch-event-waitingApproval", checked: events.waitingApproval, onChange: (v) => {
451
463
  const newEvents = { ...events, waitingApproval: v };
452
464
  setEvents(newEvents);
453
465
  save(buildNotificationPayload({ events: newEvents }));
454
- } }), _jsx(SwitchRow, { label: "Agent completed", id: "notif-event-agentCompleted", testId: "switch-event-agentCompleted", checked: events.agentCompleted, onChange: (v) => {
466
+ } }), _jsx(SwitchRow, { label: t('settings.notifications.events.agentCompleted'), id: "notif-event-agentCompleted", testId: "switch-event-agentCompleted", checked: events.agentCompleted, onChange: (v) => {
455
467
  const newEvents = { ...events, agentCompleted: v };
456
468
  setEvents(newEvents);
457
469
  save(buildNotificationPayload({ events: newEvents }));
458
- } }), _jsx(SwitchRow, { label: "Agent failed", id: "notif-event-agentFailed", testId: "switch-event-agentFailed", checked: events.agentFailed, onChange: (v) => {
470
+ } }), _jsx(SwitchRow, { label: t('settings.notifications.events.agentFailed'), id: "notif-event-agentFailed", testId: "switch-event-agentFailed", checked: events.agentFailed, onChange: (v) => {
459
471
  const newEvents = { ...events, agentFailed: v };
460
472
  setEvents(newEvents);
461
473
  save(buildNotificationPayload({ events: newEvents }));
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) => {
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) => {
463
475
  const newEvents = { ...events, prMerged: v };
464
476
  setEvents(newEvents);
465
477
  save(buildNotificationPayload({ events: newEvents }));
466
- } }), _jsx(SwitchRow, { label: "PR closed", id: "notif-event-prClosed", testId: "switch-event-prClosed", checked: events.prClosed, onChange: (v) => {
478
+ } }), _jsx(SwitchRow, { label: t('settings.notifications.events.prClosed'), id: "notif-event-prClosed", testId: "switch-event-prClosed", checked: events.prClosed, onChange: (v) => {
467
479
  const newEvents = { ...events, prClosed: v };
468
480
  setEvents(newEvents);
469
481
  save(buildNotificationPayload({ events: newEvents }));
470
- } }), _jsx(SwitchRow, { label: "PR checks passed", id: "notif-event-prChecksPassed", testId: "switch-event-prChecksPassed", checked: events.prChecksPassed, onChange: (v) => {
482
+ } }), _jsx(SwitchRow, { label: t('settings.notifications.events.prChecksPassed'), id: "notif-event-prChecksPassed", testId: "switch-event-prChecksPassed", checked: events.prChecksPassed, onChange: (v) => {
471
483
  const newEvents = { ...events, prChecksPassed: v };
472
484
  setEvents(newEvents);
473
485
  save(buildNotificationPayload({ events: newEvents }));
474
- } }), _jsx(SwitchRow, { label: "PR checks failed", id: "notif-event-prChecksFailed", testId: "switch-event-prChecksFailed", checked: events.prChecksFailed, onChange: (v) => {
486
+ } }), _jsx(SwitchRow, { label: t('settings.notifications.events.prChecksFailed'), id: "notif-event-prChecksFailed", testId: "switch-event-prChecksFailed", checked: events.prChecksFailed, onChange: (v) => {
475
487
  const newEvents = { ...events, prChecksFailed: v };
476
488
  setEvents(newEvents);
477
489
  save(buildNotificationPayload({ events: newEvents }));
478
- } }), _jsx(SwitchRow, { label: "PR blocked", id: "notif-event-prBlocked", testId: "switch-event-prBlocked", checked: events.prBlocked, onChange: (v) => {
490
+ } }), _jsx(SwitchRow, { label: t('settings.notifications.events.prBlocked'), id: "notif-event-prBlocked", testId: "switch-event-prBlocked", checked: events.prBlocked, onChange: (v) => {
479
491
  const newEvents = { ...events, prBlocked: v };
480
492
  setEvents(newEvents);
481
493
  save(buildNotificationPayload({ events: newEvents }));
482
- } }), _jsx(SwitchRow, { label: "Merge review ready", id: "notif-event-mergeReviewReady", testId: "switch-event-mergeReviewReady", checked: events.mergeReviewReady, onChange: (v) => {
494
+ } }), _jsx(SwitchRow, { label: t('settings.notifications.events.mergeReviewReady'), id: "notif-event-mergeReviewReady", testId: "switch-event-mergeReviewReady", checked: events.mergeReviewReady, onChange: (v) => {
483
495
  const newEvents = { ...events, mergeReviewReady: v };
484
496
  setEvents(newEvents);
485
497
  save(buildNotificationPayload({ events: newEvents }));
486
498
  } })] }), _jsx(SectionHint, { links: [
487
499
  {
488
- label: 'Notification system',
500
+ label: t('settings.notifications.links.notificationSystem'),
489
501
  href: 'https://github.com/shep-ai/cli/blob/main/specs/021-agent-notifications/spec.yaml',
490
502
  },
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) => {
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) => {
492
504
  const newFlags = { ...flags, skills: v };
493
505
  setFlags(newFlags);
494
506
  save({ featureFlags: newFlags });
495
- } }), _jsx(SwitchRow, { label: "Deployments", description: "Enable environment deployment workflows", id: "flag-envDeploy", testId: "switch-flag-envDeploy", checked: flags.envDeploy, onChange: (v) => {
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) => {
496
508
  const newFlags = { ...flags, envDeploy: v };
497
509
  setFlags(newFlags);
498
510
  save({ featureFlags: newFlags });
499
- } }), _jsx(SwitchRow, { label: "Debug", description: "Show debug panels and verbose logging", id: "flag-debug", testId: "switch-flag-debug", checked: flags.debug, onChange: (v) => {
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) => {
500
512
  const newFlags = { ...flags, debug: v };
501
513
  setFlags(newFlags);
502
514
  save({ featureFlags: newFlags });
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) => {
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) => {
504
516
  const newFlags = { ...flags, githubImport: v };
505
517
  setFlags(newFlags);
506
518
  save({ featureFlags: newFlags });
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) => {
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) => {
508
520
  const newFlags = { ...flags, adoptBranch: v };
509
521
  setFlags(newFlags);
510
522
  save({ featureFlags: newFlags });
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) => {
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) => {
512
524
  const newFlags = { ...flags, gitRebaseSync: v };
513
525
  setFlags(newFlags);
514
526
  save({ featureFlags: newFlags });
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) => {
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) => {
516
528
  const newFlags = { ...flags, reactFileManager: v };
517
529
  setFlags(newFlags);
518
530
  save({ featureFlags: newFlags });
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) => {
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) => {
520
532
  setInteractiveEnabled(v);
521
533
  save({
522
534
  interactiveAgent: {
@@ -525,7 +537,7 @@ export function SettingsPageClient({ settings, shepHome, dbFileSize, availableTe
525
537
  maxConcurrentSessions: parseInt(interactiveSessions, 10) || 3,
526
538
  },
527
539
  });
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: () => {
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: () => {
529
541
  const n = parseInt(interactiveTimeout, 10);
530
542
  const clamped = Number.isNaN(n) ? 15 : Math.min(120, Math.max(1, n));
531
543
  const clamped_str = String(clamped);
@@ -537,7 +549,7 @@ export function SettingsPageClient({ settings, shepHome, dbFileSize, availableTe
537
549
  maxConcurrentSessions: parseInt(interactiveSessions, 10) || 3,
538
550
  },
539
551
  });
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: () => {
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: () => {
541
553
  const n = parseInt(interactiveSessions, 10);
542
554
  const clamped = Number.isNaN(n) ? 3 : Math.min(10, Math.max(1, n));
543
555
  const clamped_str = String(clamped);
@@ -549,14 +561,14 @@ export function SettingsPageClient({ settings, shepHome, dbFileSize, availableTe
549
561
  maxConcurrentSessions: clamped,
550
562
  },
551
563
  });
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: [
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: [
553
565
  {
554
- label: 'Settings service',
566
+ label: t('settings.database.links.settingsService'),
555
567
  href: 'https://github.com/shep-ai/cli/blob/main/docs/architecture/settings-service.md',
556
568
  },
557
569
  {
558
- label: 'Settings spec',
570
+ label: t('settings.database.links.settingsSpec'),
559
571
  href: 'https://github.com/shep-ai/cli/blob/main/specs/005-global-settings-service/spec.md',
560
572
  },
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." })] })] })] }));
573
+ ], children: t('settings.database.hint') })] })] })] }));
562
574
  }
@@ -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-right 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-end 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: "ml-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: "ms-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: "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) })] }));
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) })] }));
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: "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 })] }));
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 })] }));
44
44
  }