@shepai/cli 1.155.0 → 1.156.0-pr485.030e6b4

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 (615) hide show
  1. package/README.md +276 -161
  2. package/apis/json-schema/Language.yaml +13 -0
  3. package/apis/json-schema/UserProfile.yaml +3 -0
  4. package/dist/packages/core/src/application/use-cases/agents/approve-agent-run.use-case.d.ts.map +1 -1
  5. package/dist/packages/core/src/application/use-cases/agents/approve-agent-run.use-case.js +5 -0
  6. package/dist/packages/core/src/application/use-cases/agents/reject-agent-run.use-case.d.ts.map +1 -1
  7. package/dist/packages/core/src/application/use-cases/agents/reject-agent-run.use-case.js +7 -0
  8. package/dist/packages/core/src/application/use-cases/features/check-and-unblock-features.use-case.d.ts.map +1 -1
  9. package/dist/packages/core/src/application/use-cases/features/check-and-unblock-features.use-case.js +11 -1
  10. package/dist/packages/core/src/application/use-cases/features/resume-feature.use-case.d.ts.map +1 -1
  11. package/dist/packages/core/src/application/use-cases/features/resume-feature.use-case.js +3 -0
  12. package/dist/packages/core/src/application/use-cases/features/start-feature.use-case.d.ts.map +1 -1
  13. package/dist/packages/core/src/application/use-cases/features/start-feature.use-case.js +5 -0
  14. package/dist/packages/core/src/domain/generated/output.d.ts +14 -0
  15. package/dist/packages/core/src/domain/generated/output.d.ts.map +1 -1
  16. package/dist/packages/core/src/domain/generated/output.js +11 -0
  17. package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/settings.mapper.d.ts +1 -0
  18. package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/settings.mapper.d.ts.map +1 -1
  19. package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/settings.mapper.js +4 -2
  20. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/049-add-language-preference.d.ts +14 -0
  21. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/049-add-language-preference.d.ts.map +1 -0
  22. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/049-add-language-preference.js +19 -0
  23. package/dist/packages/core/src/infrastructure/repositories/sqlite-settings.repository.d.ts.map +1 -1
  24. package/dist/packages/core/src/infrastructure/repositories/sqlite-settings.repository.js +3 -2
  25. package/dist/src/presentation/cli/commands/_serve.command.d.ts.map +1 -1
  26. package/dist/src/presentation/cli/commands/_serve.command.js +5 -3
  27. package/dist/src/presentation/cli/commands/agent/approve.command.d.ts.map +1 -1
  28. package/dist/src/presentation/cli/commands/agent/approve.command.js +9 -4
  29. package/dist/src/presentation/cli/commands/agent/delete.command.d.ts.map +1 -1
  30. package/dist/src/presentation/cli/commands/agent/delete.command.js +9 -5
  31. package/dist/src/presentation/cli/commands/agent/index.d.ts.map +1 -1
  32. package/dist/src/presentation/cli/commands/agent/index.js +3 -1
  33. package/dist/src/presentation/cli/commands/agent/logs.command.d.ts.map +1 -1
  34. package/dist/src/presentation/cli/commands/agent/logs.command.js +7 -5
  35. package/dist/src/presentation/cli/commands/agent/ls.command.d.ts.map +1 -1
  36. package/dist/src/presentation/cli/commands/agent/ls.command.js +12 -10
  37. package/dist/src/presentation/cli/commands/agent/reject.command.d.ts.map +1 -1
  38. package/dist/src/presentation/cli/commands/agent/reject.command.js +10 -5
  39. package/dist/src/presentation/cli/commands/agent/resolve-run.d.ts.map +1 -1
  40. package/dist/src/presentation/cli/commands/agent/resolve-run.js +7 -2
  41. package/dist/src/presentation/cli/commands/agent/show.command.d.ts.map +1 -1
  42. package/dist/src/presentation/cli/commands/agent/show.command.js +8 -6
  43. package/dist/src/presentation/cli/commands/agent/stop.command.d.ts.map +1 -1
  44. package/dist/src/presentation/cli/commands/agent/stop.command.js +9 -4
  45. package/dist/src/presentation/cli/commands/daemon/start-daemon.d.ts.map +1 -1
  46. package/dist/src/presentation/cli/commands/daemon/start-daemon.js +10 -8
  47. package/dist/src/presentation/cli/commands/daemon/stop-daemon.d.ts.map +1 -1
  48. package/dist/src/presentation/cli/commands/daemon/stop-daemon.js +5 -3
  49. package/dist/src/presentation/cli/commands/feat/adopt.command.d.ts.map +1 -1
  50. package/dist/src/presentation/cli/commands/feat/adopt.command.js +14 -12
  51. package/dist/src/presentation/cli/commands/feat/approve.command.d.ts.map +1 -1
  52. package/dist/src/presentation/cli/commands/feat/approve.command.js +8 -6
  53. package/dist/src/presentation/cli/commands/feat/archive.command.d.ts.map +1 -1
  54. package/dist/src/presentation/cli/commands/feat/archive.command.js +10 -8
  55. package/dist/src/presentation/cli/commands/feat/del.command.d.ts.map +1 -1
  56. package/dist/src/presentation/cli/commands/feat/del.command.js +17 -15
  57. package/dist/src/presentation/cli/commands/feat/index.d.ts.map +1 -1
  58. package/dist/src/presentation/cli/commands/feat/index.js +2 -1
  59. package/dist/src/presentation/cli/commands/feat/logs.command.d.ts.map +1 -1
  60. package/dist/src/presentation/cli/commands/feat/logs.command.js +8 -6
  61. package/dist/src/presentation/cli/commands/feat/ls.command.d.ts.map +1 -1
  62. package/dist/src/presentation/cli/commands/feat/ls.command.js +14 -12
  63. package/dist/src/presentation/cli/commands/feat/new.command.d.ts.map +1 -1
  64. package/dist/src/presentation/cli/commands/feat/new.command.js +43 -37
  65. package/dist/src/presentation/cli/commands/feat/reject.command.d.ts.map +1 -1
  66. package/dist/src/presentation/cli/commands/feat/reject.command.js +11 -9
  67. package/dist/src/presentation/cli/commands/feat/resolve-waiting-feature.d.ts.map +1 -1
  68. package/dist/src/presentation/cli/commands/feat/resolve-waiting-feature.js +12 -5
  69. package/dist/src/presentation/cli/commands/feat/resume.command.d.ts.map +1 -1
  70. package/dist/src/presentation/cli/commands/feat/resume.command.js +8 -6
  71. package/dist/src/presentation/cli/commands/feat/review.command.d.ts.map +1 -1
  72. package/dist/src/presentation/cli/commands/feat/review.command.js +17 -15
  73. package/dist/src/presentation/cli/commands/feat/show.command.d.ts.map +1 -1
  74. package/dist/src/presentation/cli/commands/feat/show.command.js +89 -45
  75. package/dist/src/presentation/cli/commands/feat/start.command.d.ts.map +1 -1
  76. package/dist/src/presentation/cli/commands/feat/start.command.js +12 -10
  77. package/dist/src/presentation/cli/commands/feat/unarchive.command.d.ts.map +1 -1
  78. package/dist/src/presentation/cli/commands/feat/unarchive.command.js +8 -6
  79. package/dist/src/presentation/cli/commands/ide-open.command.d.ts.map +1 -1
  80. package/dist/src/presentation/cli/commands/ide-open.command.js +10 -5
  81. package/dist/src/presentation/cli/commands/install.command.d.ts.map +1 -1
  82. package/dist/src/presentation/cli/commands/install.command.js +29 -21
  83. package/dist/src/presentation/cli/commands/log-viewer.d.ts.map +1 -1
  84. package/dist/src/presentation/cli/commands/log-viewer.js +6 -3
  85. package/dist/src/presentation/cli/commands/repo/add.command.d.ts.map +1 -1
  86. package/dist/src/presentation/cli/commands/repo/add.command.js +12 -10
  87. package/dist/src/presentation/cli/commands/repo/index.d.ts.map +1 -1
  88. package/dist/src/presentation/cli/commands/repo/index.js +3 -1
  89. package/dist/src/presentation/cli/commands/repo/ls.command.d.ts.map +1 -1
  90. package/dist/src/presentation/cli/commands/repo/ls.command.js +11 -9
  91. package/dist/src/presentation/cli/commands/repo/resolve-repository.d.ts.map +1 -1
  92. package/dist/src/presentation/cli/commands/repo/resolve-repository.js +7 -2
  93. package/dist/src/presentation/cli/commands/repo/show.command.d.ts.map +1 -1
  94. package/dist/src/presentation/cli/commands/repo/show.command.js +21 -10
  95. package/dist/src/presentation/cli/commands/restart.command.d.ts.map +1 -1
  96. package/dist/src/presentation/cli/commands/restart.command.js +6 -4
  97. package/dist/src/presentation/cli/commands/run.command.d.ts.map +1 -1
  98. package/dist/src/presentation/cli/commands/run.command.js +21 -17
  99. package/dist/src/presentation/cli/commands/session/index.d.ts.map +1 -1
  100. package/dist/src/presentation/cli/commands/session/index.js +3 -1
  101. package/dist/src/presentation/cli/commands/session/ls.command.d.ts.map +1 -1
  102. package/dist/src/presentation/cli/commands/session/ls.command.js +11 -9
  103. package/dist/src/presentation/cli/commands/session/show.command.d.ts.map +1 -1
  104. package/dist/src/presentation/cli/commands/session/show.command.js +26 -18
  105. package/dist/src/presentation/cli/commands/settings/agent.command.d.ts.map +1 -1
  106. package/dist/src/presentation/cli/commands/settings/agent.command.js +12 -8
  107. package/dist/src/presentation/cli/commands/settings/ide.command.d.ts.map +1 -1
  108. package/dist/src/presentation/cli/commands/settings/ide.command.js +13 -7
  109. package/dist/src/presentation/cli/commands/settings/index.d.ts +1 -0
  110. package/dist/src/presentation/cli/commands/settings/index.d.ts.map +1 -1
  111. package/dist/src/presentation/cli/commands/settings/index.js +7 -3
  112. package/dist/src/presentation/cli/commands/settings/init.command.d.ts.map +1 -1
  113. package/dist/src/presentation/cli/commands/settings/init.command.js +8 -7
  114. package/dist/src/presentation/cli/commands/settings/language.command.d.ts +14 -0
  115. package/dist/src/presentation/cli/commands/settings/language.command.d.ts.map +1 -0
  116. package/dist/src/presentation/cli/commands/settings/language.command.js +79 -0
  117. package/dist/src/presentation/cli/commands/settings/model.command.d.ts.map +1 -1
  118. package/dist/src/presentation/cli/commands/settings/model.command.js +7 -6
  119. package/dist/src/presentation/cli/commands/settings/show.command.d.ts.map +1 -1
  120. package/dist/src/presentation/cli/commands/settings/show.command.js +4 -3
  121. package/dist/src/presentation/cli/commands/settings/workflow.command.d.ts.map +1 -1
  122. package/dist/src/presentation/cli/commands/settings/workflow.command.js +20 -18
  123. package/dist/src/presentation/cli/commands/start.command.d.ts.map +1 -1
  124. package/dist/src/presentation/cli/commands/start.command.js +5 -3
  125. package/dist/src/presentation/cli/commands/status.command.d.ts.map +1 -1
  126. package/dist/src/presentation/cli/commands/status.command.js +32 -24
  127. package/dist/src/presentation/cli/commands/stop.command.d.ts.map +1 -1
  128. package/dist/src/presentation/cli/commands/stop.command.js +4 -2
  129. package/dist/src/presentation/cli/commands/tools.command.d.ts.map +1 -1
  130. package/dist/src/presentation/cli/commands/tools.command.js +8 -4
  131. package/dist/src/presentation/cli/commands/ui.command.d.ts.map +1 -1
  132. package/dist/src/presentation/cli/commands/ui.command.js +12 -10
  133. package/dist/src/presentation/cli/commands/upgrade.command.d.ts.map +1 -1
  134. package/dist/src/presentation/cli/commands/upgrade.command.js +18 -13
  135. package/dist/src/presentation/cli/commands/version.command.d.ts.map +1 -1
  136. package/dist/src/presentation/cli/commands/version.command.js +5 -3
  137. package/dist/src/presentation/cli/i18n.d.ts +41 -0
  138. package/dist/src/presentation/cli/i18n.d.ts.map +1 -0
  139. package/dist/src/presentation/cli/i18n.js +100 -0
  140. package/dist/src/presentation/cli/index.js +13 -1
  141. package/dist/src/presentation/cli/ui/install-messages.d.ts.map +1 -1
  142. package/dist/src/presentation/cli/ui/install-messages.js +16 -6
  143. package/dist/src/presentation/tui/i18n.d.ts +24 -0
  144. package/dist/src/presentation/tui/i18n.d.ts.map +1 -0
  145. package/dist/src/presentation/tui/i18n.js +48 -0
  146. package/dist/src/presentation/tui/prompts/agent-select.prompt.d.ts +13 -31
  147. package/dist/src/presentation/tui/prompts/agent-select.prompt.d.ts.map +1 -1
  148. package/dist/src/presentation/tui/prompts/agent-select.prompt.js +17 -15
  149. package/dist/src/presentation/tui/prompts/auth-method.prompt.d.ts +7 -11
  150. package/dist/src/presentation/tui/prompts/auth-method.prompt.d.ts.map +1 -1
  151. package/dist/src/presentation/tui/prompts/auth-method.prompt.js +7 -5
  152. package/dist/src/presentation/tui/prompts/ide-select.prompt.d.ts.map +1 -1
  153. package/dist/src/presentation/tui/prompts/ide-select.prompt.js +2 -1
  154. package/dist/src/presentation/tui/prompts/prd-review-summary.prompt.d.ts.map +1 -1
  155. package/dist/src/presentation/tui/prompts/prd-review-summary.prompt.js +8 -6
  156. package/dist/src/presentation/tui/wizards/agent-config.wizard.d.ts.map +1 -1
  157. package/dist/src/presentation/tui/wizards/agent-config.wizard.js +2 -1
  158. package/dist/src/presentation/tui/wizards/github-import.wizard.d.ts.map +1 -1
  159. package/dist/src/presentation/tui/wizards/github-import.wizard.js +15 -11
  160. package/dist/src/presentation/tui/wizards/merge-review.wizard.d.ts.map +1 -1
  161. package/dist/src/presentation/tui/wizards/merge-review.wizard.js +10 -8
  162. package/dist/src/presentation/tui/wizards/onboarding/onboarding.wizard.d.ts.map +1 -1
  163. package/dist/src/presentation/tui/wizards/onboarding/onboarding.wizard.js +10 -7
  164. package/dist/src/presentation/tui/wizards/onboarding/steps/workflow-defaults.step.d.ts +0 -41
  165. package/dist/src/presentation/tui/wizards/onboarding/steps/workflow-defaults.step.d.ts.map +1 -1
  166. package/dist/src/presentation/tui/wizards/onboarding/steps/workflow-defaults.step.js +15 -15
  167. package/dist/src/presentation/tui/wizards/plan-review.wizard.d.ts.map +1 -1
  168. package/dist/src/presentation/tui/wizards/plan-review.wizard.js +10 -8
  169. package/dist/src/presentation/tui/wizards/prd-review.wizard.d.ts.map +1 -1
  170. package/dist/src/presentation/tui/wizards/prd-review.wizard.js +3 -2
  171. package/dist/src/presentation/web/app/(dashboard)/get-graph-data.d.ts.map +1 -1
  172. package/dist/src/presentation/web/app/(dashboard)/get-graph-data.js +4 -2
  173. package/dist/src/presentation/web/app/actions/create-feature.d.ts.map +1 -1
  174. package/dist/src/presentation/web/app/actions/create-feature.js +3 -0
  175. package/dist/src/presentation/web/app/layout.d.ts.map +1 -1
  176. package/dist/src/presentation/web/app/layout.js +5 -2
  177. package/dist/src/presentation/web/components/assistant-ui/thread.d.ts.map +1 -1
  178. package/dist/src/presentation/web/components/assistant-ui/thread.js +13 -10
  179. package/dist/src/presentation/web/components/common/add-repository-button/add-repository-button.d.ts.map +1 -1
  180. package/dist/src/presentation/web/components/common/add-repository-button/add-repository-button.js +3 -1
  181. package/dist/src/presentation/web/components/common/attachment-chip/attachment-chip.js +1 -1
  182. package/dist/src/presentation/web/components/common/base-drawer/base-drawer.d.ts.map +1 -1
  183. package/dist/src/presentation/web/components/common/base-drawer/base-drawer.js +5 -2
  184. package/dist/src/presentation/web/components/common/ci-status-badge/ci-status-badge.js +3 -3
  185. package/dist/src/presentation/web/components/common/control-center-drawer/adopt-branch-drawer.js +4 -4
  186. package/dist/src/presentation/web/components/common/control-center-drawer/feature-drawer-client.d.ts.map +1 -1
  187. package/dist/src/presentation/web/components/common/control-center-drawer/feature-drawer-client.js +7 -1
  188. package/dist/src/presentation/web/components/common/control-center-drawer/repository-drawer-client.js +1 -1
  189. package/dist/src/presentation/web/components/common/delete-feature-dialog/delete-feature-dialog.d.ts.map +1 -1
  190. package/dist/src/presentation/web/components/common/delete-feature-dialog/delete-feature-dialog.js +3 -1
  191. package/dist/src/presentation/web/components/common/deployment-status-badge/deployment-status-badge.js +2 -2
  192. package/dist/src/presentation/web/components/common/drawer-action-bar/drawer-action-bar.d.ts.map +1 -1
  193. package/dist/src/presentation/web/components/common/drawer-action-bar/drawer-action-bar.js +6 -2
  194. package/dist/src/presentation/web/components/common/empty-state/empty-state.stories.js +2 -2
  195. package/dist/src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.d.ts.map +1 -1
  196. package/dist/src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.js +34 -22
  197. package/dist/src/presentation/web/components/common/feature-drawer-tabs/activity-tab.d.ts.map +1 -1
  198. package/dist/src/presentation/web/components/common/feature-drawer-tabs/activity-tab.js +11 -7
  199. package/dist/src/presentation/web/components/common/feature-drawer-tabs/branch-sync-status.d.ts.map +1 -1
  200. package/dist/src/presentation/web/components/common/feature-drawer-tabs/branch-sync-status.js +3 -1
  201. package/dist/src/presentation/web/components/common/feature-drawer-tabs/feature-drawer-tabs.d.ts.map +1 -1
  202. package/dist/src/presentation/web/components/common/feature-drawer-tabs/feature-drawer-tabs.js +4 -2
  203. package/dist/src/presentation/web/components/common/feature-drawer-tabs/log-tab.d.ts.map +1 -1
  204. package/dist/src/presentation/web/components/common/feature-drawer-tabs/log-tab.js +5 -3
  205. package/dist/src/presentation/web/components/common/feature-drawer-tabs/overview-tab.d.ts.map +1 -1
  206. package/dist/src/presentation/web/components/common/feature-drawer-tabs/overview-tab.js +9 -5
  207. package/dist/src/presentation/web/components/common/feature-list-item/feature-list-item.js +1 -1
  208. package/dist/src/presentation/web/components/common/feature-node/feature-node-state-config.d.ts +2 -2
  209. package/dist/src/presentation/web/components/common/feature-node/feature-node-state-config.d.ts.map +1 -1
  210. package/dist/src/presentation/web/components/common/feature-node/feature-node-state-config.js +22 -22
  211. package/dist/src/presentation/web/components/common/feature-node/feature-node.d.ts.map +1 -1
  212. package/dist/src/presentation/web/components/common/feature-node/feature-node.js +49 -36
  213. package/dist/src/presentation/web/components/common/feature-node/feature-sessions-dropdown.d.ts.map +1 -1
  214. package/dist/src/presentation/web/components/common/feature-node/feature-sessions-dropdown.js +7 -3
  215. package/dist/src/presentation/web/components/common/feature-status-badges/feature-status-badges.d.ts.map +1 -1
  216. package/dist/src/presentation/web/components/common/feature-status-badges/feature-status-badges.js +4 -2
  217. package/dist/src/presentation/web/components/common/feature-status-config.d.ts +2 -1
  218. package/dist/src/presentation/web/components/common/feature-status-config.d.ts.map +1 -1
  219. package/dist/src/presentation/web/components/common/feature-status-config.js +6 -6
  220. package/dist/src/presentation/web/components/common/feature-status-group/feature-status-group.js +1 -1
  221. package/dist/src/presentation/web/components/common/floating-action-button/floating-action-button.d.ts.map +1 -1
  222. package/dist/src/presentation/web/components/common/floating-action-button/floating-action-button.js +4 -2
  223. package/dist/src/presentation/web/components/common/github-import-dialog/github-repo-browser.js +1 -1
  224. package/dist/src/presentation/web/components/common/merge-review/diff-view.js +2 -2
  225. package/dist/src/presentation/web/components/common/merge-review/merge-review.js +2 -2
  226. package/dist/src/presentation/web/components/common/prd-questionnaire/prd-questionnaire.js +3 -3
  227. package/dist/src/presentation/web/components/common/reject-feedback-dialog/reject-feedback-dialog.d.ts.map +1 -1
  228. package/dist/src/presentation/web/components/common/reject-feedback-dialog/reject-feedback-dialog.js +6 -4
  229. package/dist/src/presentation/web/components/common/repository-node/repository-node.d.ts.map +1 -1
  230. package/dist/src/presentation/web/components/common/repository-node/repository-node.js +18 -11
  231. package/dist/src/presentation/web/components/common/server-log-viewer/server-log-viewer.js +1 -1
  232. package/dist/src/presentation/web/components/common/task-progress-view/task-progress-view.d.ts.map +1 -1
  233. package/dist/src/presentation/web/components/common/task-progress-view/task-progress-view.js +7 -4
  234. package/dist/src/presentation/web/components/common/tech-decisions-review/tech-decisions-review.js +2 -2
  235. package/dist/src/presentation/web/components/common/version-badge/version-badge.d.ts.map +1 -1
  236. package/dist/src/presentation/web/components/common/version-badge/version-badge.js +3 -1
  237. package/dist/src/presentation/web/components/features/chat/ChatComposer.d.ts.map +1 -1
  238. package/dist/src/presentation/web/components/features/chat/ChatComposer.js +3 -1
  239. package/dist/src/presentation/web/components/features/chat/ChatMessageBubble.d.ts.map +1 -1
  240. package/dist/src/presentation/web/components/features/chat/ChatMessageBubble.js +7 -5
  241. package/dist/src/presentation/web/components/features/chat/ChatMessageList.js +1 -1
  242. package/dist/src/presentation/web/components/features/chat/ChatSheet.d.ts.map +1 -1
  243. package/dist/src/presentation/web/components/features/chat/ChatSheet.js +5 -3
  244. package/dist/src/presentation/web/components/features/chat/ChatTab.d.ts.map +1 -1
  245. package/dist/src/presentation/web/components/features/chat/ChatTab.js +5 -3
  246. package/dist/src/presentation/web/components/features/control-center/control-center-empty-state.d.ts.map +1 -1
  247. package/dist/src/presentation/web/components/features/control-center/control-center-empty-state.js +15 -11
  248. package/dist/src/presentation/web/components/features/control-center/control-center-inner.d.ts.map +1 -1
  249. package/dist/src/presentation/web/components/features/control-center/control-center-inner.js +14 -6
  250. package/dist/src/presentation/web/components/features/control-center/use-control-center-state.js +2 -2
  251. package/dist/src/presentation/web/components/features/control-center/welcome-agent-setup.d.ts.map +1 -1
  252. package/dist/src/presentation/web/components/features/control-center/welcome-agent-setup.js +8 -6
  253. package/dist/src/presentation/web/components/features/features-canvas/canvas-toolbar.d.ts.map +1 -1
  254. package/dist/src/presentation/web/components/features/features-canvas/canvas-toolbar.js +3 -1
  255. package/dist/src/presentation/web/components/features/features-canvas/features-canvas.d.ts.map +1 -1
  256. package/dist/src/presentation/web/components/features/features-canvas/features-canvas.js +4 -2
  257. package/dist/src/presentation/web/components/features/settings/AgentModelPicker/index.js +2 -2
  258. package/dist/src/presentation/web/components/features/settings/ModelPicker/index.js +2 -2
  259. package/dist/src/presentation/web/components/features/settings/agent-settings-section.js +1 -1
  260. package/dist/src/presentation/web/components/features/settings/language-settings-section.d.ts +5 -0
  261. package/dist/src/presentation/web/components/features/settings/language-settings-section.d.ts.map +1 -0
  262. package/dist/src/presentation/web/components/features/settings/language-settings-section.js +54 -0
  263. package/dist/src/presentation/web/components/features/settings/language-settings-section.stories.d.ts +18 -0
  264. package/dist/src/presentation/web/components/features/settings/language-settings-section.stories.d.ts.map +1 -0
  265. package/dist/src/presentation/web/components/features/settings/language-settings-section.stories.js +36 -0
  266. package/dist/src/presentation/web/components/features/settings/settings-page-client.d.ts.map +1 -1
  267. package/dist/src/presentation/web/components/features/settings/settings-page-client.js +89 -77
  268. package/dist/src/presentation/web/components/features/settings/timeout-slider.js +1 -1
  269. package/dist/src/presentation/web/components/features/skills/category-filter.js +1 -1
  270. package/dist/src/presentation/web/components/features/skills/skills-page-client.js +1 -1
  271. package/dist/src/presentation/web/components/features/tools/tool-card.js +1 -1
  272. package/dist/src/presentation/web/components/features/tools/tool-detail-drawer.js +2 -2
  273. package/dist/src/presentation/web/components/layouts/app-shell/app-shell.d.ts.map +1 -1
  274. package/dist/src/presentation/web/components/layouts/app-shell/app-shell.js +5 -1
  275. package/dist/src/presentation/web/components/layouts/app-sidebar/app-sidebar.d.ts.map +1 -1
  276. package/dist/src/presentation/web/components/layouts/app-sidebar/app-sidebar.js +13 -7
  277. package/dist/src/presentation/web/components/providers/i18n-provider.d.ts +17 -0
  278. package/dist/src/presentation/web/components/providers/i18n-provider.d.ts.map +1 -0
  279. package/dist/src/presentation/web/components/providers/i18n-provider.js +36 -0
  280. package/dist/src/presentation/web/components/ui/alert-dialog.js +1 -1
  281. package/dist/src/presentation/web/components/ui/alert.js +1 -1
  282. package/dist/src/presentation/web/components/ui/checkbox-group.js +1 -1
  283. package/dist/src/presentation/web/components/ui/command.js +1 -1
  284. package/dist/src/presentation/web/components/ui/dialog.d.ts.map +1 -1
  285. package/dist/src/presentation/web/components/ui/dialog.js +2 -2
  286. package/dist/src/presentation/web/components/ui/dialog.stories.js +1 -1
  287. package/dist/src/presentation/web/components/ui/drawer.d.ts.map +1 -1
  288. package/dist/src/presentation/web/components/ui/drawer.js +2 -8
  289. package/dist/src/presentation/web/components/ui/dropdown-menu.js +6 -6
  290. package/dist/src/presentation/web/components/ui/scroll-area.js +1 -1
  291. package/dist/src/presentation/web/components/ui/select.js +1 -1
  292. package/dist/src/presentation/web/components/ui/sheet.js +3 -3
  293. package/dist/src/presentation/web/components/ui/sidebar.d.ts.map +1 -1
  294. package/dist/src/presentation/web/components/ui/sidebar.js +15 -15
  295. package/dist/src/presentation/web/components/ui/switch.js +1 -1
  296. package/dist/src/presentation/web/hooks/use-graph-state.d.ts.map +1 -1
  297. package/dist/src/presentation/web/hooks/use-graph-state.js +7 -4
  298. package/dist/src/presentation/web/hooks/use-sound-action.stories.js +1 -1
  299. package/dist/src/presentation/web/lib/i18n.d.ts +15 -0
  300. package/dist/src/presentation/web/lib/i18n.d.ts.map +1 -0
  301. package/dist/src/presentation/web/lib/i18n.js +64 -0
  302. package/dist/src/presentation/web/lib/language.d.ts +23 -0
  303. package/dist/src/presentation/web/lib/language.d.ts.map +1 -0
  304. package/dist/src/presentation/web/lib/language.js +37 -0
  305. package/dist/src/presentation/web/lib/layout-with-dagre.d.ts +2 -0
  306. package/dist/src/presentation/web/lib/layout-with-dagre.d.ts.map +1 -1
  307. package/dist/src/presentation/web/lib/layout-with-dagre.js +4 -0
  308. package/dist/src/presentation/web/lib/rtl-fonts.d.ts +19 -0
  309. package/dist/src/presentation/web/lib/rtl-fonts.d.ts.map +1 -0
  310. package/dist/src/presentation/web/lib/rtl-fonts.js +51 -0
  311. package/dist/translations/ar/cli.json +613 -0
  312. package/dist/translations/ar/common.json +55 -0
  313. package/dist/translations/ar/tui.json +130 -0
  314. package/dist/translations/ar/web.json +594 -0
  315. package/dist/translations/de/cli.json +613 -0
  316. package/dist/translations/de/common.json +55 -0
  317. package/dist/translations/de/tui.json +109 -0
  318. package/dist/translations/de/web.json +580 -0
  319. package/dist/translations/en/cli.json +613 -0
  320. package/dist/translations/en/common.json +55 -0
  321. package/dist/translations/en/tui.json +130 -0
  322. package/dist/translations/en/web.json +594 -0
  323. package/dist/translations/es/cli.json +613 -0
  324. package/dist/translations/es/common.json +55 -0
  325. package/dist/translations/es/tui.json +130 -0
  326. package/dist/translations/es/web.json +594 -0
  327. package/dist/translations/fr/cli.json +613 -0
  328. package/dist/translations/fr/common.json +55 -0
  329. package/dist/translations/fr/tui.json +130 -0
  330. package/dist/translations/fr/web.json +594 -0
  331. package/dist/translations/he/cli.json +613 -0
  332. package/dist/translations/he/common.json +55 -0
  333. package/dist/translations/he/tui.json +130 -0
  334. package/dist/translations/he/web.json +594 -0
  335. package/dist/translations/pt/cli.json +613 -0
  336. package/dist/translations/pt/common.json +55 -0
  337. package/dist/translations/pt/tui.json +130 -0
  338. package/dist/translations/pt/web.json +594 -0
  339. package/dist/translations/ru/cli.json +613 -0
  340. package/dist/translations/ru/common.json +55 -0
  341. package/dist/translations/ru/tui.json +130 -0
  342. package/dist/translations/ru/web.json +594 -0
  343. package/dist/tsconfig.build.tsbuildinfo +1 -1
  344. package/package.json +4 -2
  345. package/web/.next/BUILD_ID +1 -1
  346. package/web/.next/build-manifest.json +2 -2
  347. package/web/.next/fallback-build-manifest.json +2 -2
  348. package/web/.next/prerender-manifest.json +3 -3
  349. package/web/.next/required-server-files.js +7 -7
  350. package/web/.next/required-server-files.json +7 -7
  351. package/web/.next/server/app/(dashboard)/@drawer/adopt/page/server-reference-manifest.json +28 -28
  352. package/web/.next/server/app/(dashboard)/@drawer/adopt/page.js +3 -3
  353. package/web/.next/server/app/(dashboard)/@drawer/adopt/page.js.nft.json +1 -1
  354. package/web/.next/server/app/(dashboard)/@drawer/adopt/page_client-reference-manifest.js +1 -1
  355. package/web/.next/server/app/(dashboard)/@drawer/chat/page/server-reference-manifest.json +26 -26
  356. package/web/.next/server/app/(dashboard)/@drawer/chat/page.js +3 -3
  357. package/web/.next/server/app/(dashboard)/@drawer/chat/page.js.nft.json +1 -1
  358. package/web/.next/server/app/(dashboard)/@drawer/chat/page_client-reference-manifest.js +1 -1
  359. package/web/.next/server/app/(dashboard)/@drawer/create/page/server-reference-manifest.json +29 -29
  360. package/web/.next/server/app/(dashboard)/@drawer/create/page.js +3 -3
  361. package/web/.next/server/app/(dashboard)/@drawer/create/page.js.nft.json +1 -1
  362. package/web/.next/server/app/(dashboard)/@drawer/create/page_client-reference-manifest.js +1 -1
  363. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page/server-reference-manifest.json +36 -36
  364. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page.js +4 -4
  365. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page.js.nft.json +1 -1
  366. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page_client-reference-manifest.js +1 -1
  367. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page/server-reference-manifest.json +36 -36
  368. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js +4 -4
  369. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js.nft.json +1 -1
  370. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page_client-reference-manifest.js +1 -1
  371. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/[tab]/page/server-reference-manifest.json +26 -26
  372. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/[tab]/page.js +3 -3
  373. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/[tab]/page.js.nft.json +1 -1
  374. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/[tab]/page_client-reference-manifest.js +1 -1
  375. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page/server-reference-manifest.json +26 -26
  376. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js +3 -3
  377. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js.nft.json +1 -1
  378. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  379. package/web/.next/server/app/(dashboard)/chat/page/server-reference-manifest.json +26 -26
  380. package/web/.next/server/app/(dashboard)/chat/page.js +3 -3
  381. package/web/.next/server/app/(dashboard)/chat/page.js.nft.json +1 -1
  382. package/web/.next/server/app/(dashboard)/chat/page_client-reference-manifest.js +1 -1
  383. package/web/.next/server/app/(dashboard)/create/page/server-reference-manifest.json +29 -29
  384. package/web/.next/server/app/(dashboard)/create/page.js +3 -3
  385. package/web/.next/server/app/(dashboard)/create/page.js.nft.json +1 -1
  386. package/web/.next/server/app/(dashboard)/create/page_client-reference-manifest.js +1 -1
  387. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page/server-reference-manifest.json +36 -36
  388. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page.js +4 -4
  389. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page.js.nft.json +1 -1
  390. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page_client-reference-manifest.js +1 -1
  391. package/web/.next/server/app/(dashboard)/feature/[featureId]/page/server-reference-manifest.json +36 -36
  392. package/web/.next/server/app/(dashboard)/feature/[featureId]/page.js +4 -4
  393. package/web/.next/server/app/(dashboard)/feature/[featureId]/page.js.nft.json +1 -1
  394. package/web/.next/server/app/(dashboard)/feature/[featureId]/page_client-reference-manifest.js +1 -1
  395. package/web/.next/server/app/(dashboard)/page/server-reference-manifest.json +26 -26
  396. package/web/.next/server/app/(dashboard)/page.js +3 -3
  397. package/web/.next/server/app/(dashboard)/page.js.nft.json +1 -1
  398. package/web/.next/server/app/(dashboard)/page_client-reference-manifest.js +1 -1
  399. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/[tab]/page/server-reference-manifest.json +26 -26
  400. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/[tab]/page.js +3 -3
  401. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/[tab]/page.js.nft.json +1 -1
  402. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/[tab]/page_client-reference-manifest.js +1 -1
  403. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page/server-reference-manifest.json +26 -26
  404. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js +3 -3
  405. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js.nft.json +1 -1
  406. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  407. package/web/.next/server/app/_global-error.html +2 -2
  408. package/web/.next/server/app/_global-error.rsc +1 -1
  409. package/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  410. package/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  411. package/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  412. package/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  413. package/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  414. package/web/.next/server/app/_not-found/page/server-reference-manifest.json +5 -5
  415. package/web/.next/server/app/_not-found/page.js +2 -2
  416. package/web/.next/server/app/_not-found/page.js.nft.json +1 -1
  417. package/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  418. package/web/.next/server/app/api/attachments/preview/route.js.nft.json +1 -1
  419. package/web/.next/server/app/api/evidence/route.js.nft.json +1 -1
  420. package/web/.next/server/app/api/graph-data/route.js.nft.json +1 -1
  421. package/web/.next/server/app/api/interactive/chat/[featureId]/messages/route.js.nft.json +1 -1
  422. package/web/.next/server/app/settings/page/server-reference-manifest.json +8 -8
  423. package/web/.next/server/app/settings/page.js +2 -2
  424. package/web/.next/server/app/settings/page.js.nft.json +1 -1
  425. package/web/.next/server/app/settings/page_client-reference-manifest.js +1 -1
  426. package/web/.next/server/app/skills/page/server-reference-manifest.json +10 -10
  427. package/web/.next/server/app/skills/page.js +3 -4
  428. package/web/.next/server/app/skills/page.js.nft.json +1 -1
  429. package/web/.next/server/app/skills/page_client-reference-manifest.js +1 -1
  430. package/web/.next/server/app/tools/page/server-reference-manifest.json +10 -10
  431. package/web/.next/server/app/tools/page.js +3 -4
  432. package/web/.next/server/app/tools/page.js.nft.json +1 -1
  433. package/web/.next/server/app/tools/page_client-reference-manifest.js +1 -1
  434. package/web/.next/server/app/version/page/server-reference-manifest.json +5 -5
  435. package/web/.next/server/app/version/page.js +2 -2
  436. package/web/.next/server/app/version/page.js.nft.json +1 -1
  437. package/web/.next/server/app/version/page_client-reference-manifest.js +1 -1
  438. package/web/.next/server/chunks/403f9_next_dist_esm_build_templates_app-route_370c43b1.js +1 -1
  439. package/web/.next/server/chunks/403f9_next_dist_esm_build_templates_app-route_370c43b1.js.map +1 -1
  440. package/web/.next/server/chunks/[root-of-the-server]__a402b567._.js +1 -1
  441. package/web/.next/server/chunks/[root-of-the-server]__a402b567._.js.map +1 -1
  442. package/web/.next/server/chunks/[root-of-the-server]__b4102cc7._.js +1 -1
  443. package/web/.next/server/chunks/[root-of-the-server]__b4102cc7._.js.map +1 -1
  444. package/web/.next/server/chunks/[root-of-the-server]__beda892a._.js +1 -1
  445. package/web/.next/server/chunks/[root-of-the-server]__beda892a._.js.map +1 -1
  446. package/web/.next/server/chunks/[root-of-the-server]__cd67a84c._.js +1 -1
  447. package/web/.next/server/chunks/[root-of-the-server]__cd67a84c._.js.map +1 -1
  448. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js +1 -1
  449. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js.map +1 -1
  450. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_feature-drawer-client_tsx_e9755fc8._.js +3 -3
  451. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_feature-drawer-client_tsx_e9755fc8._.js.map +1 -1
  452. package/web/.next/server/chunks/ssr/[root-of-the-server]__209c9597._.js +4 -0
  453. package/web/.next/server/chunks/ssr/{[root-of-the-server]__88f7e8e6._.js.map → [root-of-the-server]__209c9597._.js.map} +1 -1
  454. package/web/.next/server/chunks/ssr/[root-of-the-server]__27301e38._.js +4 -0
  455. package/web/.next/server/chunks/ssr/{[root-of-the-server]__17ed7ed1._.js.map → [root-of-the-server]__27301e38._.js.map} +1 -1
  456. package/web/.next/server/chunks/ssr/[root-of-the-server]__357d99f9._.js +1 -1
  457. package/web/.next/server/chunks/ssr/[root-of-the-server]__56b70465._.js +1 -1
  458. package/web/.next/server/chunks/ssr/[root-of-the-server]__56b70465._.js.map +1 -1
  459. package/web/.next/server/chunks/ssr/[root-of-the-server]__6fecf886._.js +4 -0
  460. package/web/.next/server/chunks/ssr/{[root-of-the-server]__42bf1807._.js.map → [root-of-the-server]__6fecf886._.js.map} +1 -1
  461. package/web/.next/server/chunks/ssr/[root-of-the-server]__8b0aac03._.js +1 -1
  462. package/web/.next/server/chunks/ssr/[root-of-the-server]__8d27866c._.js +4 -0
  463. package/web/.next/server/chunks/ssr/[root-of-the-server]__8d27866c._.js.map +1 -0
  464. package/web/.next/server/chunks/ssr/[root-of-the-server]__9f3504c7._.js +4 -0
  465. package/web/.next/server/chunks/ssr/{[root-of-the-server]__f80bfc75._.js.map → [root-of-the-server]__9f3504c7._.js.map} +1 -1
  466. package/web/.next/server/chunks/ssr/[root-of-the-server]__bd6ed91a._.js +4 -0
  467. package/web/.next/server/chunks/ssr/[root-of-the-server]__bd6ed91a._.js.map +1 -0
  468. package/web/.next/server/chunks/ssr/[root-of-the-server]__c30f1f82._.js +1 -1
  469. package/web/.next/server/chunks/ssr/[root-of-the-server]__c30f1f82._.js.map +1 -1
  470. package/web/.next/server/chunks/ssr/[root-of-the-server]__dffa13c5._.js +3 -0
  471. package/web/.next/server/chunks/ssr/[root-of-the-server]__dffa13c5._.js.map +1 -0
  472. package/web/.next/server/chunks/ssr/[root-of-the-server]__e91ffd5e._.js +2 -2
  473. package/web/.next/server/chunks/ssr/[root-of-the-server]__e91ffd5e._.js.map +1 -1
  474. package/web/.next/server/chunks/ssr/[root-of-the-server]__f8dd4422._.js +1 -1
  475. package/web/.next/server/chunks/ssr/[root-of-the-server]__f8dd4422._.js.map +1 -1
  476. package/web/.next/server/chunks/ssr/_05c23ad9._.js +1 -1
  477. package/web/.next/server/chunks/ssr/_05c23ad9._.js.map +1 -1
  478. package/web/.next/server/chunks/ssr/_0dc06d07._.js +3 -0
  479. package/web/.next/server/chunks/ssr/_0dc06d07._.js.map +1 -0
  480. package/web/.next/server/chunks/ssr/_16eb4fec._.js +1 -1
  481. package/web/.next/server/chunks/ssr/_16eb4fec._.js.map +1 -1
  482. package/web/.next/server/chunks/ssr/_2b858df5._.js +3 -0
  483. package/web/.next/server/chunks/ssr/{_2c7d0c36._.js.map → _2b858df5._.js.map} +1 -1
  484. package/web/.next/server/chunks/ssr/_3a0b989f._.js +2 -2
  485. package/web/.next/server/chunks/ssr/_3a0b989f._.js.map +1 -1
  486. package/web/.next/server/chunks/ssr/{_67104d9e._.js → _3bcda5d7._.js} +2 -2
  487. package/web/.next/server/chunks/ssr/{_67104d9e._.js.map → _3bcda5d7._.js.map} +1 -1
  488. package/web/.next/server/chunks/ssr/{_71e47f04._.js → _4e19e8d2._.js} +2 -2
  489. package/web/.next/server/chunks/ssr/{_71e47f04._.js.map → _4e19e8d2._.js.map} +1 -1
  490. package/web/.next/server/chunks/ssr/_5119a3df._.js +3 -0
  491. package/web/.next/server/chunks/ssr/_5119a3df._.js.map +1 -0
  492. package/web/.next/server/chunks/ssr/_56b9d60f._.js +1 -1
  493. package/web/.next/server/chunks/ssr/_56b9d60f._.js.map +1 -1
  494. package/web/.next/server/chunks/ssr/_5f69c13f._.js +1 -1
  495. package/web/.next/server/chunks/ssr/_5f69c13f._.js.map +1 -1
  496. package/web/.next/server/chunks/ssr/_6645de45._.js +4 -0
  497. package/web/.next/server/chunks/ssr/_6645de45._.js.map +1 -0
  498. package/web/.next/server/chunks/ssr/_7c5b97c6._.js +1 -1
  499. package/web/.next/server/chunks/ssr/_7c5b97c6._.js.map +1 -1
  500. package/web/.next/server/chunks/ssr/_82c57f10._.js +1 -1
  501. package/web/.next/server/chunks/ssr/_82c57f10._.js.map +1 -1
  502. package/web/.next/server/chunks/ssr/_8b57edb8._.js +1 -1
  503. package/web/.next/server/chunks/ssr/_8b57edb8._.js.map +1 -1
  504. package/web/.next/server/chunks/ssr/_8d733ce4._.js +1 -1
  505. package/web/.next/server/chunks/ssr/_8d733ce4._.js.map +1 -1
  506. package/web/.next/server/chunks/ssr/_9495d50b._.js +1 -1
  507. package/web/.next/server/chunks/ssr/_9495d50b._.js.map +1 -1
  508. package/web/.next/server/chunks/ssr/_a0e3f7e4._.js +1 -1
  509. package/web/.next/server/chunks/ssr/_a0e3f7e4._.js.map +1 -1
  510. package/web/.next/server/chunks/ssr/_ac4a3873._.js +1 -1
  511. package/web/.next/server/chunks/ssr/_ac4a3873._.js.map +1 -1
  512. package/web/.next/server/chunks/ssr/{_507a8382._.js → _b9ba2473._.js} +2 -2
  513. package/web/.next/server/chunks/ssr/_b9ba2473._.js.map +1 -0
  514. package/web/.next/server/chunks/ssr/_bcaea66b._.js +3 -0
  515. package/web/.next/server/chunks/ssr/_bcaea66b._.js.map +1 -0
  516. package/web/.next/server/chunks/ssr/_bcfa8457._.js +9 -0
  517. package/web/.next/server/chunks/ssr/_bcfa8457._.js.map +1 -0
  518. package/web/.next/server/chunks/ssr/_ca0aa7f0._.js +1 -1
  519. package/web/.next/server/chunks/ssr/_ca0aa7f0._.js.map +1 -1
  520. package/web/.next/server/chunks/ssr/_cb5a021e._.js +1 -1
  521. package/web/.next/server/chunks/ssr/_cb5a021e._.js.map +1 -1
  522. package/web/.next/server/chunks/ssr/_cfbd1d7e._.js +1 -1
  523. package/web/.next/server/chunks/ssr/_cfbd1d7e._.js.map +1 -1
  524. package/web/.next/server/chunks/ssr/_d86175ae._.js +1 -1
  525. package/web/.next/server/chunks/ssr/_d86175ae._.js.map +1 -1
  526. package/web/.next/server/chunks/ssr/_d8bedf13._.js +1 -1
  527. package/web/.next/server/chunks/ssr/_d8bedf13._.js.map +1 -1
  528. package/web/.next/server/chunks/ssr/_d90b0a06._.js +3 -0
  529. package/web/.next/server/chunks/ssr/_d90b0a06._.js.map +1 -0
  530. package/web/.next/server/chunks/ssr/_fa7efce3._.js +2 -2
  531. package/web/.next/server/chunks/ssr/_fa7efce3._.js.map +1 -1
  532. package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_settings_settings-page-client_tsx_6ed9d5f8._.js +1 -1
  533. package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_settings_settings-page-client_tsx_6ed9d5f8._.js.map +1 -1
  534. package/web/.next/server/chunks/ssr/node_modules__pnpm_8ec2c790._.js +1 -1
  535. package/web/.next/server/chunks/ssr/node_modules__pnpm_8ec2c790._.js.map +1 -1
  536. package/web/.next/server/chunks/ssr/src_presentation_web_app_actions_open-ide_ts_baaca5d5._.js +1 -1
  537. package/web/.next/server/chunks/ssr/src_presentation_web_ca99d62d._.js +1 -1
  538. package/web/.next/server/chunks/ssr/src_presentation_web_ca99d62d._.js.map +1 -1
  539. package/web/.next/server/chunks/ssr/src_presentation_web_components_895e5bfa._.js +3 -0
  540. package/web/.next/server/chunks/ssr/src_presentation_web_components_895e5bfa._.js.map +1 -0
  541. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js +1 -1
  542. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js.map +1 -1
  543. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_tools_tools-page-client_tsx_3d0aa70c._.js +1 -1
  544. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_tools_tools-page-client_tsx_3d0aa70c._.js.map +1 -1
  545. package/web/.next/server/chunks/ssr/src_presentation_web_db9fa0c2._.js +1 -1
  546. package/web/.next/server/chunks/ssr/src_presentation_web_db9fa0c2._.js.map +1 -1
  547. package/web/.next/server/chunks/ssr/translations_23dd5e7e._.js +3 -0
  548. package/web/.next/server/chunks/ssr/translations_23dd5e7e._.js.map +1 -0
  549. package/web/.next/server/pages/500.html +2 -2
  550. package/web/.next/server/server-reference-manifest.js +1 -1
  551. package/web/.next/server/server-reference-manifest.json +45 -45
  552. package/web/.next/static/chunks/{b4cde06eff374c59.js → 0a79dfbb8486b66e.js} +2 -2
  553. package/web/.next/static/chunks/{f50d8e1825fae0fe.js → 0c87b59a0fdd22dd.js} +1 -1
  554. package/web/.next/static/chunks/11e4b9d959a6efa7.js +2 -0
  555. package/web/.next/static/chunks/{f6085a3750b6d8f4.js → 16d35285b664c30c.js} +1 -1
  556. package/web/.next/static/chunks/2273b81cd7c7d2af.css +1 -0
  557. package/web/.next/static/chunks/{60bc4daf6904d5a0.js → 24d701de138b762d.js} +1 -1
  558. package/web/.next/static/chunks/2c5bf14361cf6728.js +1 -0
  559. package/web/.next/static/chunks/{688971d5bad5dc7c.js → 3deefc76ea55047c.js} +1 -1
  560. package/web/.next/static/chunks/42e6a21f1d63dc5c.js +1 -0
  561. package/web/.next/static/chunks/{11091b676d1b3bd4.js → 47477ed4c5871747.js} +1 -1
  562. package/web/.next/static/chunks/4864ff06a738d58b.js +1 -0
  563. package/web/.next/static/chunks/{22c459f1877b1e4f.js → 74db65fa7bfb80bd.js} +1 -1
  564. package/web/.next/static/chunks/9061f08ab7e537a8.js +1 -0
  565. package/web/.next/static/chunks/919509a19de3205b.js +7 -0
  566. package/web/.next/static/chunks/{b3109b268c02449c.js → 9aa752f55e6cfcc9.js} +1 -1
  567. package/web/.next/static/chunks/a72f1d456f0afa8a.js +5 -0
  568. package/web/.next/static/chunks/ad5b1373e5ba0789.js +1 -0
  569. package/web/.next/static/chunks/b447e13b2ac5bb65.js +1 -0
  570. package/web/.next/static/chunks/d2cbeefbc8967b16.js +1 -0
  571. package/web/.next/static/chunks/d5366257d6b9f855.js +1 -0
  572. package/web/.next/static/chunks/{5ae60a052ab5f437.js → d6e702c209c413ce.js} +2 -2
  573. package/web/.next/static/chunks/{97c18bb438f775cf.js → e63d0d79a334fa97.js} +2 -2
  574. package/web/.next/server/chunks/ssr/[root-of-the-server]__0b150ddf._.js +0 -3
  575. package/web/.next/server/chunks/ssr/[root-of-the-server]__0b150ddf._.js.map +0 -1
  576. package/web/.next/server/chunks/ssr/[root-of-the-server]__17ed7ed1._.js +0 -4
  577. package/web/.next/server/chunks/ssr/[root-of-the-server]__28d0d265._.js +0 -4
  578. package/web/.next/server/chunks/ssr/[root-of-the-server]__28d0d265._.js.map +0 -1
  579. package/web/.next/server/chunks/ssr/[root-of-the-server]__42bf1807._.js +0 -4
  580. package/web/.next/server/chunks/ssr/[root-of-the-server]__88f7e8e6._.js +0 -4
  581. package/web/.next/server/chunks/ssr/[root-of-the-server]__f80bfc75._.js +0 -4
  582. package/web/.next/server/chunks/ssr/_2c7d0c36._.js +0 -3
  583. package/web/.next/server/chunks/ssr/_4b432739._.js +0 -3
  584. package/web/.next/server/chunks/ssr/_4b432739._.js.map +0 -1
  585. package/web/.next/server/chunks/ssr/_507a8382._.js.map +0 -1
  586. package/web/.next/server/chunks/ssr/_8219712a._.js +0 -3
  587. package/web/.next/server/chunks/ssr/_8219712a._.js.map +0 -1
  588. package/web/.next/server/chunks/ssr/_d4b20e29._.js +0 -3
  589. package/web/.next/server/chunks/ssr/_d4b20e29._.js.map +0 -1
  590. package/web/.next/server/chunks/ssr/_dd0d2cda._.js +0 -4
  591. package/web/.next/server/chunks/ssr/_dd0d2cda._.js.map +0 -1
  592. package/web/.next/server/chunks/ssr/_e9a73a63._.js +0 -9
  593. package/web/.next/server/chunks/ssr/_e9a73a63._.js.map +0 -1
  594. package/web/.next/server/chunks/ssr/src_presentation_web_324a47da._.js +0 -3
  595. package/web/.next/server/chunks/ssr/src_presentation_web_324a47da._.js.map +0 -1
  596. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_skills_page_actions_cdc632e3.js +0 -3
  597. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_skills_page_actions_cdc632e3.js.map +0 -1
  598. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_tools_page_actions_39ca0924.js +0 -3
  599. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_tools_page_actions_39ca0924.js.map +0 -1
  600. package/web/.next/server/chunks/ssr/src_presentation_web_components_357e3eb0._.js +0 -3
  601. package/web/.next/server/chunks/ssr/src_presentation_web_components_357e3eb0._.js.map +0 -1
  602. package/web/.next/static/chunks/08fe461cb16fced0.js +0 -1
  603. package/web/.next/static/chunks/1a1dc6a09c911b70.js +0 -1
  604. package/web/.next/static/chunks/21c8953d720bddcc.js +0 -7
  605. package/web/.next/static/chunks/450bfeed79bb1648.js +0 -1
  606. package/web/.next/static/chunks/4b2c4a5c35ebb70d.js +0 -1
  607. package/web/.next/static/chunks/711a2468a2ea3c85.js +0 -1
  608. package/web/.next/static/chunks/8590bd2e69b24b9e.css +0 -1
  609. package/web/.next/static/chunks/8ba1c07ef18b15a9.js +0 -1
  610. package/web/.next/static/chunks/cd54b758f58061d0.js +0 -1
  611. package/web/.next/static/chunks/d1fa9a48542437bd.js +0 -2
  612. package/web/.next/static/chunks/de8a83cc1a08a5f1.js +0 -5
  613. /package/web/.next/static/{gvtDuAeM3WKFc9kJihv1y → _3mdwhLrxBePUb5DWqy3q}/_buildManifest.js +0 -0
  614. /package/web/.next/static/{gvtDuAeM3WKFc9kJihv1y → _3mdwhLrxBePUb5DWqy3q}/_clientMiddlewareManifest.json +0 -0
  615. /package/web/.next/static/{gvtDuAeM3WKFc9kJihv1y → _3mdwhLrxBePUb5DWqy3q}/_ssgManifest.js +0 -0
@@ -3,7 +3,8 @@ import { promisify } from 'node:util';
3
3
  import { IS_WINDOWS } from '../../../../../packages/core/src/infrastructure/platform.js';
4
4
  import { resolve } from '../../lib/server-container.js';
5
5
  import { getSettings } from '../../../../../packages/core/src/infrastructure/services/settings.service.js';
6
- import { layoutWithDagre, CANVAS_LAYOUT_DEFAULTS } from '../../lib/layout-with-dagre.js';
6
+ import { layoutWithDagre, getCanvasLayoutDefaults } from '../../lib/layout-with-dagre.js';
7
+ import { getLanguagePreference } from '../../lib/language.js';
7
8
  import { buildGraphNodes } from '../build-graph-nodes.js';
8
9
  const execFileAsync = promisify(execFileCb);
9
10
  // Cache git info per repo — refreshed every GIT_INFO_TTL_MS via background-style check.
@@ -154,5 +155,6 @@ export async function getGraphData() {
154
155
  }
155
156
  }
156
157
  }
157
- return layoutWithDagre(nodes, edges, CANVAS_LAYOUT_DEFAULTS);
158
+ const { dir } = getLanguagePreference();
159
+ return layoutWithDagre(nodes, edges, getCanvasLayoutDefaults(dir));
158
160
  }
@@ -1 +1 @@
1
- {"version":3,"file":"create-feature.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/web/app/actions/create-feature.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,sCAAsC,CAAC;AAGpE,UAAU,UAAU;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAQD,UAAU,kBAAkB;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,CAAC,EAAE,UAAU,EAAE,CAAC;IAC3B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE;QACd,QAAQ,EAAE,OAAO,CAAC;QAClB,SAAS,EAAE,OAAO,CAAC;QACnB,UAAU,CAAC,EAAE,OAAO,CAAC;KACtB,CAAC;IACF,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,0EAA0E;IAC1E,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,yEAAyE;IACzE,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,yDAAyD;IACzD,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,uFAAuF;IACvF,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,2CAA2C;IAC3C,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,uDAAuD;IACvD,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,6BAA6B;IAC7B,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,wDAAwD;IACxD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,qDAAqD;IACrD,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,wBAAsB,aAAa,CACjC,KAAK,EAAE,kBAAkB,GACxB,OAAO,CAAC;IAAE,OAAO,CAAC,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CA2FhD"}
1
+ {"version":3,"file":"create-feature.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/web/app/actions/create-feature.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,sCAAsC,CAAC;AAGpE,UAAU,UAAU;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAQD,UAAU,kBAAkB;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,CAAC,EAAE,UAAU,EAAE,CAAC;IAC3B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE;QACd,QAAQ,EAAE,OAAO,CAAC;QAClB,SAAS,EAAE,OAAO,CAAC;QACnB,UAAU,CAAC,EAAE,OAAO,CAAC;KACtB,CAAC;IACF,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,0EAA0E;IAC1E,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,yEAAyE;IACzE,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,yDAAyD;IACzD,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,uFAAuF;IACvF,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,2CAA2C;IAC3C,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,uDAAuD;IACvD,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,6BAA6B;IAC7B,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,wDAAwD;IACxD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,qDAAqD;IACrD,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,wBAAsB,aAAa,CACjC,KAAK,EAAE,kBAAkB,GACxB,OAAO,CAAC;IAAE,OAAO,CAAC,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CA8FhD"}
@@ -50,6 +50,9 @@ export async function createFeature(input) {
50
50
  ...(pending ? { pending } : {}),
51
51
  ...(forkAndPr != null ? { forkAndPr } : {}),
52
52
  ...(commitSpecs != null ? { commitSpecs } : {}),
53
+ ...(ciWatchEnabled != null ? { ciWatchEnabled } : {}),
54
+ ...(enableEvidence != null ? { enableEvidence } : {}),
55
+ ...(commitEvidence != null ? { commitEvidence } : {}),
53
56
  ...(agentType ? { agentType } : {}),
54
57
  ...(model ? { model } : {}),
55
58
  ...(sessionId ? { sessionId } : {}),
@@ -1 +1 @@
1
- {"version":3,"file":"layout.d.ts","sourceRoot":"","sources":["../../../../../src/presentation/web/app/layout.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,MAAM,CAAC;AAErC,OAAO,6BAA6B,CAAC;AACrC,OAAO,2CAA2C,CAAC;AACnD,OAAO,eAAe,CAAC;AAOvB,sFAAsF;AACtF,eAAO,MAAM,OAAO,kBAAkB,CAAC;AAEvC,eAAO,MAAM,QAAQ,EAAE,QAkBtB,CAAC;AAEF,wBAA8B,UAAU,CAAC,EACvC,QAAQ,GACT,EAAE,QAAQ,CAAC;IACV,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;CAC3B,CAAC,oDAwBD"}
1
+ {"version":3,"file":"layout.d.ts","sourceRoot":"","sources":["../../../../../src/presentation/web/app/layout.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,MAAM,CAAC;AAErC,OAAO,6BAA6B,CAAC;AACrC,OAAO,2CAA2C,CAAC;AACnD,OAAO,eAAe,CAAC;AASvB,sFAAsF;AACtF,eAAO,MAAM,OAAO,kBAAkB,CAAC;AAEvC,eAAO,MAAM,QAAQ,EAAE,QAkBtB,CAAC;AAEF,wBAA8B,UAAU,CAAC,EACvC,QAAQ,GACT,EAAE,QAAQ,CAAC;IACV,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;CAC3B,CAAC,oDA2BD"}
@@ -8,6 +8,8 @@ import { Toaster } from '../components/ui/sonner.js';
8
8
  import { getFeatureFlags } from '../lib/feature-flags.js';
9
9
  import { FeatureFlagsProvider } from '../hooks/feature-flags-context.js';
10
10
  import { QueryProvider } from '../components/providers/query-provider.js';
11
+ import { I18nProvider } from '../components/providers/i18n-provider.js';
12
+ import { getLanguagePreference } from '../lib/language.js';
11
13
  /** Force dynamic rendering for all pages since they depend on client-side context. */
12
14
  export const dynamic = 'force-dynamic';
13
15
  export const metadata = {
@@ -31,7 +33,8 @@ export const metadata = {
31
33
  export default async function RootLayout({ children, }) {
32
34
  const cookieStore = await cookies();
33
35
  const sidebarOpen = cookieStore.get('shep-sidebar-open')?.value === 'true';
34
- return (_jsxs("html", { lang: "en", suppressHydrationWarning: true, children: [_jsx("head", { children: _jsx("script", { dangerouslySetInnerHTML: {
36
+ const { language, dir } = getLanguagePreference();
37
+ return (_jsxs("html", { lang: language, dir: dir, suppressHydrationWarning: true, children: [_jsx("head", { children: _jsx("script", { dangerouslySetInnerHTML: {
35
38
  __html: `(function(){try{var d=document.documentElement,t=localStorage.getItem('shep-theme'),s=window.matchMedia('(prefers-color-scheme: dark)').matches;if(t==='dark'||(t==='system'&&s)||(!t&&s)){d.classList.add('dark')}}catch(e){}})();`,
36
- } }) }), _jsxs("body", { className: "min-h-screen antialiased", children: [_jsx(QueryProvider, { children: _jsx(FeatureFlagsProvider, { flags: getFeatureFlags(), children: _jsx(AppShell, { sidebarOpen: sidebarOpen, children: children }) }) }), _jsx(Toaster, { position: "bottom-center" })] })] }));
39
+ } }) }), _jsxs("body", { className: "min-h-screen antialiased", children: [_jsx(I18nProvider, { initialLanguage: language, children: _jsx(QueryProvider, { children: _jsx(FeatureFlagsProvider, { flags: getFeatureFlags(), children: _jsx(AppShell, { sidebarOpen: sidebarOpen, children: children }) }) }) }), _jsx(Toaster, { position: "bottom-center" })] })] }));
37
40
  }
@@ -1 +1 @@
1
- {"version":3,"file":"thread.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/web/components/assistant-ui/thread.tsx"],"names":[],"mappings":"AAsFA,wBAAgB,MAAM,CAAC,EACrB,SAAS,EACT,SAAS,EACT,QAAQ,GACT,EAAE;IACD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC5B,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;CAC5B,2CAoBA"}
1
+ {"version":3,"file":"thread.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/web/components/assistant-ui/thread.tsx"],"names":[],"mappings":"AAuFA,wBAAgB,MAAM,CAAC,EACrB,SAAS,EACT,SAAS,EACT,QAAQ,GACT,EAAE;IACD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC5B,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;CAC5B,2CAoBA"}
@@ -4,6 +4,7 @@ import { createPortal } from 'react-dom';
4
4
  import { ActionBarPrimitive, ComposerPrimitive, MessagePrimitive, ThreadPrimitive, useMessage, } from '@assistant-ui/react';
5
5
  import Markdown from 'react-markdown';
6
6
  import remarkGfm from 'remark-gfm';
7
+ import { useTranslation } from 'react-i18next';
7
8
  import { cn } from '../../lib/utils.js';
8
9
  import { SendHorizontal, CircleStop, Copy, Paperclip, Bot, User, Maximize2, X, ChevronDown, ChevronUp, Loader2, } from 'lucide-react';
9
10
  // ── Markdown components for assistant messages ──────────────────────────────
@@ -23,17 +24,17 @@ const markdownComponents = {
23
24
  }
24
25
  return _jsx(CollapsibleCode, { language: lang, children: children });
25
26
  },
26
- ul: ({ children }) => _jsx("ul", { className: "mb-2 list-disc pl-4 last:mb-0", children: children }),
27
- ol: ({ children }) => _jsx("ol", { className: "mb-2 list-decimal pl-4 last:mb-0", children: children }),
27
+ ul: ({ children }) => _jsx("ul", { className: "mb-2 list-disc ps-4 last:mb-0", children: children }),
28
+ ol: ({ children }) => _jsx("ol", { className: "mb-2 list-decimal ps-4 last:mb-0", children: children }),
28
29
  li: ({ children }) => _jsx("li", { className: "mb-0.5", children: children }),
29
30
  h1: ({ children }) => _jsx("h1", { className: "mb-1 text-base font-bold", children: children }),
30
31
  h2: ({ children }) => _jsx("h2", { className: "mb-1 text-sm font-bold", children: children }),
31
32
  h3: ({ children }) => _jsx("h3", { className: "mb-1 text-sm font-semibold", children: children }),
32
33
  a: ({ children, href }) => (_jsx("a", { href: href, className: "text-blue-500 underline", target: "_blank", rel: "noopener noreferrer", children: children })),
33
- blockquote: ({ children }) => (_jsx("blockquote", { className: "border-muted-foreground/30 my-1 border-l-2 pl-3 italic opacity-80", children: children })),
34
+ blockquote: ({ children }) => (_jsx("blockquote", { className: "border-muted-foreground/30 my-1 border-s-2 ps-3 italic opacity-80", children: children })),
34
35
  table: ({ children }) => (_jsx("div", { className: "my-2 overflow-x-auto", children: _jsx("table", { className: "min-w-full border-collapse text-xs", children: children }) })),
35
36
  thead: ({ children }) => _jsx("thead", { className: "bg-muted/50 border-b", children: children }),
36
- th: ({ children }) => _jsx("th", { className: "px-2 py-1 text-left font-semibold", children: children }),
37
+ th: ({ children }) => _jsx("th", { className: "px-2 py-1 text-start font-semibold", children: children }),
37
38
  td: ({ children }) => _jsx("td", { className: "border-muted border-t px-2 py-1", children: children }),
38
39
  tr: ({ children }) => _jsx("tr", { children: children }),
39
40
  hr: () => _jsx("hr", { className: "border-border/40 my-3 border-t" }),
@@ -63,6 +64,7 @@ const AssistantMessage = () => {
63
64
  // ── Collapsible code block ───────────────────────────────────────────────
64
65
  const CODE_COLLAPSED_HEIGHT = 200; // px
65
66
  function CollapsibleCode({ children, language }) {
67
+ const { t } = useTranslation('web');
66
68
  const [expanded, setExpanded] = useState(false);
67
69
  const [needsCollapse, setNeedsCollapse] = useState(false);
68
70
  const ref = useRef(null);
@@ -78,10 +80,11 @@ function CollapsibleCode({ children, language }) {
78
80
  ? 'min(60vh, 500px)'
79
81
  : `${CODE_COLLAPSED_HEIGHT}px`,
80
82
  overflow: expanded ? 'auto' : undefined,
81
- }, children: children }), needsCollapse && !expanded ? (_jsx("div", { className: "absolute inset-x-0 bottom-0 flex items-end justify-center bg-gradient-to-t from-black/60 via-black/30 to-transparent pt-12 pb-3", children: _jsxs("button", { type: "button", onClick: () => setExpanded(true), className: "inline-flex items-center gap-1 rounded-full border border-white/10 bg-white/10 px-3 py-1 text-[11px] font-medium text-white/80 shadow-lg backdrop-blur-md transition-all hover:bg-white/20 hover:text-white", children: [_jsx(ChevronDown, { className: "h-3 w-3" }), "Show more"] }) })) : null, needsCollapse && expanded ? (_jsx("div", { className: "flex justify-center border-t border-white/5 py-1.5", children: _jsxs("button", { type: "button", onClick: () => setExpanded(false), className: "inline-flex items-center gap-1 rounded-full px-3 py-0.5 text-[11px] text-white/50 transition-colors hover:text-white/80", children: [_jsx(ChevronUp, { className: "h-3 w-3" }), "Show less"] }) })) : null] }));
83
+ }, children: children }), needsCollapse && !expanded ? (_jsx("div", { className: "absolute inset-x-0 bottom-0 flex items-end justify-center bg-gradient-to-t from-black/60 via-black/30 to-transparent pt-12 pb-3", children: _jsxs("button", { type: "button", onClick: () => setExpanded(true), className: "inline-flex items-center gap-1 rounded-full border border-white/10 bg-white/10 px-3 py-1 text-[11px] font-medium text-white/80 shadow-lg backdrop-blur-md transition-all hover:bg-white/20 hover:text-white", children: [_jsx(ChevronDown, { className: "h-3 w-3" }), t('chat.showMore')] }) })) : null, needsCollapse && expanded ? (_jsx("div", { className: "flex justify-center border-t border-white/5 py-1.5", children: _jsxs("button", { type: "button", onClick: () => setExpanded(false), className: "inline-flex items-center gap-1 rounded-full px-3 py-0.5 text-[11px] text-white/50 transition-colors hover:text-white/80", children: [_jsx(ChevronUp, { className: "h-3 w-3" }), t('chat.showLess')] }) })) : null] }));
82
84
  }
83
85
  // ── HTML preview block with code/preview toggle ─────────────────────────
84
86
  function HtmlPreviewBlock({ code, language }) {
87
+ const { t } = useTranslation('web');
85
88
  const [showPreview, setShowPreview] = useState(false);
86
89
  const [maximized, setMaximized] = useState(false);
87
90
  const [fullscreenCode, setFullscreenCode] = useState(false);
@@ -89,17 +92,17 @@ function HtmlPreviewBlock({ code, language }) {
89
92
  const chars = code.length;
90
93
  return (_jsxs(_Fragment, { children: [_jsxs("div", { className: "bg-background/50 my-2 overflow-hidden rounded-md border", children: [_jsxs("div", { className: "flex items-center justify-between border-b px-3 py-1", children: [_jsx("span", { className: "text-muted-foreground font-mono text-xs uppercase", children: language }), _jsxs("div", { className: "flex items-center gap-1", children: [_jsx("button", { type: "button", onClick: () => setShowPreview(false), className: cn('rounded px-2.5 py-0.5 text-xs font-medium transition-colors', !showPreview
91
94
  ? 'bg-muted text-foreground'
92
- : 'text-muted-foreground hover:text-foreground'), children: "Code" }), _jsx("button", { type: "button", onClick: () => setShowPreview(true), className: cn('rounded px-2.5 py-0.5 text-xs font-medium transition-colors', showPreview
95
+ : 'text-muted-foreground hover:text-foreground'), children: t('chat.code') }), _jsx("button", { type: "button", onClick: () => setShowPreview(true), className: cn('rounded px-2.5 py-0.5 text-xs font-medium transition-colors', showPreview
93
96
  ? 'bg-muted text-foreground'
94
- : 'text-muted-foreground hover:text-foreground'), children: "Preview" }), _jsx("button", { type: "button", onClick: () => {
97
+ : 'text-muted-foreground hover:text-foreground'), children: t('chat.preview') }), _jsx("button", { type: "button", onClick: () => {
95
98
  setFullscreenCode(!showPreview);
96
99
  setMaximized(true);
97
- }, className: "text-muted-foreground hover:text-foreground ml-1 rounded p-0.5 transition-colors", title: "Open fullscreen", children: _jsx(Maximize2, { className: "h-3 w-3" }) })] })] }), _jsx("div", { style: { height: 'min(55vh, 450px)' }, children: showPreview ? (_jsx("iframe", { srcDoc: code, sandbox: "allow-scripts", className: "h-full w-full border-0 bg-white", title: "HTML Preview" })) : (_jsx("pre", { className: "h-full overflow-auto p-3 font-mono text-xs leading-relaxed", children: _jsx("code", { children: code }) })) })] }), maximized && typeof document !== 'undefined'
100
+ }, className: "text-muted-foreground hover:text-foreground ms-1 rounded p-0.5 transition-colors", title: t('chat.openFullscreen'), children: _jsx(Maximize2, { className: "h-3 w-3" }) })] })] }), _jsx("div", { style: { height: 'min(55vh, 450px)' }, children: showPreview ? (_jsx("iframe", { srcDoc: code, sandbox: "allow-scripts", className: "h-full w-full border-0 bg-white", title: t('chat.htmlPreview') })) : (_jsx("pre", { className: "h-full overflow-auto p-3 font-mono text-xs leading-relaxed", children: _jsx("code", { children: code }) })) })] }), maximized && typeof document !== 'undefined'
98
101
  ? createPortal(_jsx("div", { className: "fixed inset-0 z-[9999] flex items-center justify-center bg-black/70 backdrop-blur-sm", onClick: () => setMaximized(false), children: _jsxs("div", { className: "bg-background relative flex h-[95vh] w-[95vw] flex-col overflow-hidden rounded-xl border shadow-2xl", onClick: (e) => e.stopPropagation(), children: [_jsxs("div", { className: "bg-muted/80 flex h-12 shrink-0 items-center justify-between border-b px-5", children: [_jsxs("div", { className: "bg-muted flex items-center gap-0.5 rounded-lg p-1", children: [_jsx("button", { type: "button", onClick: () => setFullscreenCode(false), className: cn('rounded-md px-4 py-1.5 text-sm font-medium transition-all', !fullscreenCode
99
102
  ? 'bg-background text-foreground shadow-sm'
100
- : 'text-muted-foreground hover:text-foreground'), children: "Preview" }), _jsx("button", { type: "button", onClick: () => setFullscreenCode(true), className: cn('rounded-md px-4 py-1.5 text-sm font-medium transition-all', fullscreenCode
103
+ : 'text-muted-foreground hover:text-foreground'), children: t('chat.preview') }), _jsx("button", { type: "button", onClick: () => setFullscreenCode(true), className: cn('rounded-md px-4 py-1.5 text-sm font-medium transition-all', fullscreenCode
101
104
  ? 'bg-background text-foreground shadow-sm'
102
- : 'text-muted-foreground hover:text-foreground'), children: "Code" })] }), _jsxs("div", { className: "text-muted-foreground/60 flex items-center gap-4 text-xs", children: [_jsxs("span", { children: [lines, " lines"] }), _jsxs("span", { children: [chars.toLocaleString(), " chars"] }), _jsx("span", { className: "font-mono uppercase", children: language })] }), _jsx("button", { type: "button", onClick: () => setMaximized(false), className: "text-muted-foreground hover:bg-muted hover:text-foreground rounded-lg p-2 transition-colors", children: _jsx(X, { className: "h-5 w-5" }) })] }), fullscreenCode ? (_jsx("pre", { className: "flex-1 overflow-auto p-4 font-mono text-xs leading-relaxed", children: _jsx("code", { children: code }) })) : (_jsx("iframe", { srcDoc: code, sandbox: "allow-scripts", className: "flex-1 border-0 bg-white dark:bg-neutral-900", title: "HTML Preview Fullscreen" }))] }) }), document.body)
105
+ : 'text-muted-foreground hover:text-foreground'), children: t('chat.code') })] }), _jsxs("div", { className: "text-muted-foreground/60 flex items-center gap-4 text-xs", children: [_jsxs("span", { children: [lines, " lines"] }), _jsxs("span", { children: [chars.toLocaleString(), " chars"] }), _jsx("span", { className: "font-mono uppercase", children: language })] }), _jsx("button", { type: "button", onClick: () => setMaximized(false), className: "text-muted-foreground hover:bg-muted hover:text-foreground rounded-lg p-2 transition-colors", children: _jsx(X, { className: "h-5 w-5" }) })] }), fullscreenCode ? (_jsx("pre", { className: "flex-1 overflow-auto p-4 font-mono text-xs leading-relaxed", children: _jsx("code", { children: code }) })) : (_jsx("iframe", { srcDoc: code, sandbox: "allow-scripts", className: "flex-1 border-0 bg-white dark:bg-neutral-900", title: t('chat.htmlPreviewFullscreen') }))] }) }), document.body)
103
106
  : null] }));
104
107
  }
105
108
  const ACTIVITY_MARKER_RE = /^\*⏳ (.+)\*$/;
@@ -1 +1 @@
1
- {"version":3,"file":"add-repository-button.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/add-repository-button/add-repository-button.tsx"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sCAAsC,CAAC;AAEvE,MAAM,WAAW,wBAAwB;IACvC,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,cAAc,CAAC,EAAE,CAAC,UAAU,EAAE,UAAU,KAAK,IAAI,CAAC;CACnD;AAED,wBAAgB,mBAAmB,CAAC,EAAE,QAAQ,EAAE,cAAc,EAAE,EAAE,wBAAwB,2CAsHzF"}
1
+ {"version":3,"file":"add-repository-button.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/add-repository-button/add-repository-button.tsx"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sCAAsC,CAAC;AAEvE,MAAM,WAAW,wBAAwB;IACvC,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,cAAc,CAAC,EAAE,CAAC,UAAU,EAAE,UAAU,KAAK,IAAI,CAAC;CACnD;AAED,wBAAgB,mBAAmB,CAAC,EAAE,QAAQ,EAAE,cAAc,EAAE,EAAE,wBAAwB,2CAuHzF"}
@@ -1,6 +1,7 @@
1
1
  'use client';
2
2
  import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
3
3
  import { useState } from 'react';
4
+ import { useTranslation } from 'react-i18next';
4
5
  import { FolderPlus, Github, Loader2, Plus } from 'lucide-react';
5
6
  import { Button } from '../../ui/button.js';
6
7
  import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from '../../ui/tooltip.js';
@@ -10,6 +11,7 @@ import { useFeatureFlags } from '../../../hooks/feature-flags-context.js';
10
11
  import { ReactFileManagerDialog } from '../../common/react-file-manager-dialog/index.js';
11
12
  import { pickFolder } from './pick-folder.js';
12
13
  export function AddRepositoryButton({ onSelect, onGitHubImport }) {
14
+ const { t } = useTranslation('web');
13
15
  const featureFlags = useFeatureFlags();
14
16
  const [loading, setLoading] = useState(false);
15
17
  const [popoverOpen, setPopoverOpen] = useState(false);
@@ -55,7 +57,7 @@ export function AddRepositoryButton({ onSelect, onGitHubImport }) {
55
57
  }
56
58
  setShowReactPicker(false);
57
59
  }
58
- return (_jsxs(_Fragment, { children: [_jsxs(Popover, { open: popoverOpen, onOpenChange: setPopoverOpen, children: [_jsx(TooltipProvider, { children: _jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx(PopoverTrigger, { asChild: true, children: _jsx(Button, { variant: "ghost", size: "icon", "aria-label": "Add Repository", "data-testid": "add-repository-button", disabled: loading, children: loading ? (_jsx(Loader2, { className: "h-5 w-5 animate-spin" })) : (_jsx(Plus, { className: "h-5 w-5" })) }) }) }), _jsx(TooltipContent, { children: "Add Repository" })] }) }), _jsxs(PopoverContent, { className: "w-48 p-1", align: "start", children: [_jsxs("button", { type: "button", className: "hover:bg-accent flex w-full items-center gap-2 rounded-sm px-2 py-1.5 text-sm", onClick: handleLocalFolder, "data-testid": "add-repo-local-folder", children: [_jsx(FolderPlus, { className: "h-4 w-4" }), "Local folder"] }), featureFlags.githubImport ? (_jsxs("button", { type: "button", className: "hover:bg-accent flex w-full items-center gap-2 rounded-sm px-2 py-1.5 text-sm", onClick: handleFromGitHub, "data-testid": "add-repo-from-github", children: [_jsx(Github, { className: "h-4 w-4" }), "From GitHub"] })) : null] })] }), featureFlags.githubImport ? (_jsx(GitHubImportDialog, { open: githubDialogOpen, onOpenChange: setGithubDialogOpen, onImportComplete: handleImportComplete })) : null, _jsx(ReactFileManagerDialog, { open: showReactPicker, onOpenChange: (open) => {
60
+ return (_jsxs(_Fragment, { children: [_jsxs(Popover, { open: popoverOpen, onOpenChange: setPopoverOpen, children: [_jsx(TooltipProvider, { children: _jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx(PopoverTrigger, { asChild: true, children: _jsx(Button, { variant: "ghost", size: "icon", "aria-label": t('addRepository.addRepository'), "data-testid": "add-repository-button", disabled: loading, children: loading ? (_jsx(Loader2, { className: "h-5 w-5 animate-spin" })) : (_jsx(Plus, { className: "h-5 w-5" })) }) }) }), _jsx(TooltipContent, { children: t('addRepository.addRepository') })] }) }), _jsxs(PopoverContent, { className: "w-48 p-1", align: "start", children: [_jsxs("button", { type: "button", className: "hover:bg-accent flex w-full items-center gap-2 rounded-sm px-2 py-1.5 text-sm", onClick: handleLocalFolder, "data-testid": "add-repo-local-folder", children: [_jsx(FolderPlus, { className: "h-4 w-4" }), "Local folder"] }), featureFlags.githubImport ? (_jsxs("button", { type: "button", className: "hover:bg-accent flex w-full items-center gap-2 rounded-sm px-2 py-1.5 text-sm", onClick: handleFromGitHub, "data-testid": "add-repo-from-github", children: [_jsx(Github, { className: "h-4 w-4" }), "From GitHub"] })) : null] })] }), featureFlags.githubImport ? (_jsx(GitHubImportDialog, { open: githubDialogOpen, onOpenChange: setGithubDialogOpen, onImportComplete: handleImportComplete })) : null, _jsx(ReactFileManagerDialog, { open: showReactPicker, onOpenChange: (open) => {
59
61
  if (!open) {
60
62
  setShowReactPicker(false);
61
63
  }
@@ -33,5 +33,5 @@ export function AttachmentChip({ name, size, mimeType, path, onRemove, loading =
33
33
  const thumbnail = (_jsxs("button", { type: "button", className: "relative block cursor-pointer rounded-md", children: [_jsx("img", { src: previewUrl(path, mimeType), alt: name, title: name, className: "h-12 w-12 rounded-md border object-cover transition-opacity hover:opacity-80" }), notes ? (_jsx("span", { className: "ring-background absolute -right-1 -bottom-1 flex h-4 w-4 items-center justify-center rounded-full bg-amber-500 text-white shadow-sm ring-2", children: _jsx(StickyNoteIcon, { className: "h-2.5 w-2.5" }) })) : null] }));
34
34
  return (_jsx(TooltipProvider, { delayDuration: 200, children: _jsxs(Dialog, { children: [_jsxs(Tooltip, { children: [_jsxs("div", { className: "group relative", children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx(DialogTrigger, { asChild: true, children: thumbnail }) }), !disabled && (_jsx("button", { type: "button", onClick: onRemove, className: "absolute -top-1.5 -right-1.5 hidden h-5 w-5 cursor-pointer items-center justify-center rounded-full bg-black/70 text-white group-hover:flex", "aria-label": `Remove ${name}`, children: _jsx(X, { className: "h-3 w-3" }) }))] }), notes ? (_jsx(TooltipContent, { side: "bottom", className: "max-w-[220px] border border-amber-200 bg-amber-50 text-amber-950 dark:border-amber-800 dark:bg-amber-950 dark:text-amber-100", children: _jsx("p", { className: "line-clamp-3 text-xs leading-snug", children: notes }) })) : null] }), _jsxs(DialogContent, { className: "max-w-3xl gap-0 overflow-hidden border-0 p-0 [&>button:last-child]:!cursor-pointer [&>button:last-child]:!rounded-full [&>button:last-child]:!bg-black/70 [&>button:last-child]:!p-1.5 [&>button:last-child]:!text-white [&>button:last-child]:!opacity-100 [&>button:last-child]:!shadow-lg [&>button:last-child]:!backdrop-blur-md [&>button:last-child]:hover:!bg-black/90", children: [_jsx(VisuallyHidden.Root, { children: _jsxs(DialogTitle, { children: ["Preview: ", name] }) }), _jsx("div", { className: "relative bg-black/90", children: _jsx("img", { src: previewUrl(path, mimeType), alt: name, className: "h-auto max-h-[70vh] w-full object-contain" }) }), _jsxs("div", { className: "bg-background flex flex-col gap-2 px-4 py-3", children: [_jsxs("div", { className: "flex items-center gap-3", children: [_jsxs("div", { className: "flex min-w-0 flex-1 flex-col", children: [_jsx("span", { className: "truncate text-sm font-medium", children: name }), _jsx("span", { className: "text-muted-foreground text-xs", children: formatFileSize(size) })] }), _jsx("a", { href: previewUrl(path, mimeType), download: name, className: "text-muted-foreground hover:text-foreground shrink-0 cursor-pointer rounded p-1.5 transition-colors", "aria-label": `Download ${name}`, children: _jsx(DownloadIcon, { className: "h-4 w-4" }) })] }), onNotesChange ? (_jsx(Textarea, { placeholder: "Add notes about this image\u2026", value: notes ?? '', onChange: (e) => onNotesChange(e.target.value), rows: 2, className: "resize-none text-sm", "aria-label": "Image notes" })) : notes ? (_jsx("p", { className: "text-muted-foreground text-sm", children: notes })) : null] })] })] }) }));
35
35
  }
36
- return (_jsxs("div", { className: "group relative flex items-center gap-2 rounded-full border py-1 pr-3 pl-2", children: [_jsx("div", { className: cn('flex h-6 w-6 shrink-0 items-center justify-center rounded-full', iconColorClass), children: _jsx(Icon, { className: "h-3 w-3" }) }), _jsx("span", { className: "max-w-[120px] truncate text-sm", children: name }), _jsx("span", { className: "text-muted-foreground text-xs", children: formatFileSize(size) }), !disabled && (_jsx("button", { type: "button", onClick: onRemove, className: "absolute -top-1.5 -right-1.5 hidden h-5 w-5 cursor-pointer items-center justify-center rounded-full bg-black/70 text-white group-hover:flex", "aria-label": `Remove ${name}`, children: _jsx(X, { className: "h-3 w-3" }) }))] }));
36
+ return (_jsxs("div", { className: "group relative flex items-center gap-2 rounded-full border py-1 ps-2 pe-3", children: [_jsx("div", { className: cn('flex h-6 w-6 shrink-0 items-center justify-center rounded-full', iconColorClass), children: _jsx(Icon, { className: "h-3 w-3" }) }), _jsx("span", { className: "max-w-[120px] truncate text-sm", children: name }), _jsx("span", { className: "text-muted-foreground text-xs", children: formatFileSize(size) }), !disabled && (_jsx("button", { type: "button", onClick: onRemove, className: "absolute -top-1.5 -right-1.5 hidden h-5 w-5 cursor-pointer items-center justify-center rounded-full bg-black/70 text-white group-hover:flex", "aria-label": `Remove ${name}`, children: _jsx(X, { className: "h-3 w-3" }) }))] }));
37
37
  }
@@ -1 +1 @@
1
- {"version":3,"file":"base-drawer.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/base-drawer/base-drawer.tsx"],"names":[],"mappings":"AAIA,OAAO,EAAO,KAAK,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAelE,OAAO,EAAmB,KAAK,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAGpF,QAAA,MAAM,cAAc;;8EAWlB,CAAC;AAEH,MAAM,WAAW,eAAgB,SAAQ,YAAY,CAAC,OAAO,cAAc,CAAC;IAC1E,IAAI,EAAE,OAAO,CAAC;IACd,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,yGAAyG;IACzG,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAChC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACzB,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,MAAM,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,YAAY,CAAC,EAAE,iBAAiB,CAAC;CAClC;AAED,wBAAgB,UAAU,CAAC,EACzB,IAAI,EACJ,OAAO,EACP,KAAa,EACb,qBAA6B,EAC7B,KAAgB,EAChB,IAAI,EACJ,MAAM,EACN,QAAQ,EACR,MAAM,EACN,SAAS,EACT,aAAa,EAAE,MAAM,EACrB,YAAY,GACb,EAAE,eAAe,2CA0FjB"}
1
+ {"version":3,"file":"base-drawer.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/base-drawer/base-drawer.tsx"],"names":[],"mappings":"AAIA,OAAO,EAAO,KAAK,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAgBlE,OAAO,EAAmB,KAAK,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAGpF,QAAA,MAAM,cAAc;;8EAWlB,CAAC;AAEH,MAAM,WAAW,eAAgB,SAAQ,YAAY,CAAC,OAAO,cAAc,CAAC;IAC1E,IAAI,EAAE,OAAO,CAAC;IACd,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,yGAAyG;IACzG,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAChC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACzB,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,MAAM,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,YAAY,CAAC,EAAE,iBAAiB,CAAC;CAClC;AAED,wBAAgB,UAAU,CAAC,EACzB,IAAI,EACJ,OAAO,EACP,KAAa,EACb,qBAA6B,EAC7B,KAAgB,EAChB,IAAI,EACJ,MAAM,EACN,QAAQ,EACR,MAAM,EACN,SAAS,EACT,aAAa,EAAE,MAAM,EACrB,YAAY,GACb,EAAE,eAAe,2CA4FjB"}
@@ -9,6 +9,7 @@ import { DeploymentStatusBadge } from '../../common/deployment-status-badge/inde
9
9
  import { Drawer, DrawerContent, DrawerHeader, DrawerFooter, DrawerOverlay, DrawerTitle, DrawerDescription, } from '../../ui/drawer.js';
10
10
  import { Separator } from '../../ui/separator.js';
11
11
  import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from '../../ui/tooltip.js';
12
+ import { useTranslation } from 'react-i18next';
12
13
  import { useDeployAction } from '../../../hooks/use-deploy-action.js';
13
14
  import { useFeatureFlags } from '../../../hooks/feature-flags-context.js';
14
15
  const drawerVariants = cva('', {
@@ -24,8 +25,10 @@ const drawerVariants = cva('', {
24
25
  },
25
26
  });
26
27
  export function BaseDrawer({ open, onClose, modal = false, dismissOnOutsideClick = false, title = 'Drawer', size, header, children, footer, className, 'data-testid': testId, deployTarget, }) {
28
+ const { i18n } = useTranslation();
27
29
  const featureFlags = useFeatureFlags();
28
30
  const contentRef = useRef(null);
31
+ const drawerDirection = i18n.dir() === 'rtl' ? 'left' : 'right';
29
32
  // Close when clicking outside the drawer panel (no overlay needed — canvas stays draggable).
30
33
  // Uses `click` (not `pointerdown`) so canvas drags don't trigger this.
31
34
  useEffect(() => {
@@ -52,10 +55,10 @@ export function BaseDrawer({ open, onClose, modal = false, dismissOnOutsideClick
52
55
  document.addEventListener('click', handleClick);
53
56
  return () => document.removeEventListener('click', handleClick);
54
57
  }, [open, modal, onClose, dismissOnOutsideClick]);
55
- return (_jsxs(Drawer, { direction: "right", modal: modal, handleOnly: true, open: open, onOpenChange: (isOpen) => {
58
+ return (_jsxs(Drawer, { direction: drawerDirection, modal: modal, handleOnly: true, open: open, onOpenChange: (isOpen) => {
56
59
  if (!isOpen)
57
60
  onClose();
58
- }, children: [modal ? _jsx(DrawerOverlay, {}) : null, _jsxs(DrawerContent, { ref: contentRef, direction: "right", showCloseButton: false, className: cn(drawerVariants({ size }), 'bg-white/85 backdrop-blur-xl dark:bg-neutral-800/85', className), "data-testid": testId, onInteractOutside: modal ? undefined : (e) => e.preventDefault(), children: [_jsx(DrawerTitle, { asChild: true, children: _jsx("span", { className: "sr-only", children: title }) }), _jsx(DrawerDescription, { asChild: true, children: _jsx("span", { className: "sr-only", children: title }) }), _jsxs("button", { type: "button", "aria-label": "Close", onClick: onClose, className: "ring-offset-background focus:ring-ring absolute top-4 right-4 rounded-xs opacity-70 transition-opacity hover:opacity-100 focus:ring-2 focus:ring-offset-2 focus:outline-hidden", "data-testid": testId ? `${testId}-close-button` : undefined, children: [_jsx(XIcon, { className: "size-4" }), _jsx("span", { className: "sr-only", children: "Close" })] }), header ? _jsx(DrawerHeader, { className: "shrink-0", children: header }) : null, header ? _jsx(Separator, {}) : null, featureFlags.envDeploy && deployTarget ? _jsx(DeployBar, { deployTarget: deployTarget }) : null, _jsx("div", { className: "flex min-h-0 flex-1 flex-col overflow-hidden", children: children }), footer ? _jsx(DrawerFooter, { className: "shrink-0", children: footer }) : null] })] }));
61
+ }, children: [modal ? _jsx(DrawerOverlay, {}) : null, _jsxs(DrawerContent, { ref: contentRef, direction: drawerDirection, showCloseButton: false, className: cn(drawerVariants({ size }), 'bg-white/85 backdrop-blur-xl dark:bg-neutral-800/85', className), "data-testid": testId, onInteractOutside: modal ? undefined : (e) => e.preventDefault(), children: [_jsx(DrawerTitle, { asChild: true, children: _jsx("span", { className: "sr-only", children: title }) }), _jsx(DrawerDescription, { asChild: true, children: _jsx("span", { className: "sr-only", children: title }) }), _jsxs("button", { type: "button", "aria-label": "Close", onClick: onClose, className: "ring-offset-background focus:ring-ring absolute end-4 top-4 rounded-xs opacity-70 transition-opacity hover:opacity-100 focus:ring-2 focus:ring-offset-2 focus:outline-hidden", "data-testid": testId ? `${testId}-close-button` : undefined, children: [_jsx(XIcon, { className: "size-4" }), _jsx("span", { className: "sr-only", children: "Close" })] }), header ? _jsx(DrawerHeader, { className: "shrink-0", children: header }) : null, header ? _jsx(Separator, {}) : null, featureFlags.envDeploy && deployTarget ? _jsx(DeployBar, { deployTarget: deployTarget }) : null, _jsx("div", { className: "flex min-h-0 flex-1 flex-col overflow-hidden", children: children }), footer ? _jsx(DrawerFooter, { className: "shrink-0", children: footer }) : null] })] }));
59
62
  }
60
63
  function DeployBar({ deployTarget }) {
61
64
  const deployAction = useDeployAction(deployTarget);
@@ -5,10 +5,10 @@ import { Badge } from '../../ui/badge.js';
5
5
  export function CiStatusBadge({ status }) {
6
6
  switch (status) {
7
7
  case CiStatus.Success:
8
- return (_jsxs(Badge, { className: "border-transparent bg-green-50 text-green-700 hover:bg-green-50", children: [_jsx(CheckCircle2, { className: "mr-1 h-3.5 w-3.5" }), "Passing"] }));
8
+ return (_jsxs(Badge, { className: "border-transparent bg-green-50 text-green-700 hover:bg-green-50", children: [_jsx(CheckCircle2, { className: "me-1 h-3.5 w-3.5" }), "Passing"] }));
9
9
  case CiStatus.Pending:
10
- return (_jsxs(Badge, { className: "border-transparent bg-yellow-50 text-yellow-700 hover:bg-yellow-50", children: [_jsx(Loader2, { className: "mr-1 h-3.5 w-3.5 animate-spin" }), "Pending"] }));
10
+ return (_jsxs(Badge, { className: "border-transparent bg-yellow-50 text-yellow-700 hover:bg-yellow-50", children: [_jsx(Loader2, { className: "me-1 h-3.5 w-3.5 animate-spin" }), "Pending"] }));
11
11
  case CiStatus.Failure:
12
- return (_jsxs(Badge, { className: "border-transparent bg-red-50 text-red-700 hover:bg-red-50", children: [_jsx(XCircle, { className: "mr-1 h-3.5 w-3.5" }), "Failing"] }));
12
+ return (_jsxs(Badge, { className: "border-transparent bg-red-50 text-red-700 hover:bg-red-50", children: [_jsx(XCircle, { className: "me-1 h-3.5 w-3.5" }), "Failing"] }));
13
13
  }
14
14
  }
@@ -91,15 +91,15 @@ export function AdoptBranchDrawer({ open, onClose, onSubmit, isSubmitting = fals
91
91
  }, [repoOpen]);
92
92
  const isDisabled = !branchName.trim() || !selectedRepositoryPath || isSubmitting;
93
93
  const header = (_jsxs("div", { children: [_jsxs(DrawerTitle, { className: "flex items-center gap-2", children: [_jsx(GitBranch, { className: "h-4 w-4" }), "Adopt Branch"] }), _jsx(DrawerDescription, { className: "text-muted-foreground text-sm", children: "Import an existing git branch into Shep's feature tracking" })] }));
94
- return (_jsx(BaseDrawer, { open: open, onClose: handleClose, size: "sm", modal: false, header: header, "data-testid": "adopt-branch-drawer", children: _jsxs("form", { onSubmit: handleSubmit, className: "flex flex-1 flex-col", children: [_jsx("div", { className: "flex-1 overflow-y-auto p-4", children: _jsxs("div", { className: "flex flex-col gap-4", children: [_jsxs("div", { className: "flex flex-col gap-2", children: [_jsx(Label, { children: "Repository" }), _jsxs(Popover, { open: repoOpen, onOpenChange: setRepoOpen, children: [_jsx(PopoverTrigger, { asChild: true, children: _jsxs("button", { type: "button", role: "combobox", "aria-expanded": repoOpen, "aria-label": "Repository", disabled: isSubmitting, "data-testid": "adopt-repo-combobox", className: cn('border-input bg-background ring-offset-background focus:ring-ring flex h-9 w-full items-center justify-between rounded-md border px-3 py-2 text-sm focus:ring-2 focus:ring-offset-2 focus:outline-none disabled:cursor-not-allowed disabled:opacity-50', !selectedRepo && 'text-muted-foreground'), children: [_jsx("span", { className: "truncate", children: selectedRepo ? selectedRepo.name : 'Select repository...' }), _jsx(ChevronsUpDown, { className: "ml-2 h-4 w-4 shrink-0 opacity-50" })] }) }), _jsx(PopoverContent, { className: "w-80 p-0", align: "start", "data-testid": "adopt-repo-combobox-content", children: _jsxs("div", { className: "flex flex-col", children: [_jsx("div", { className: "border-b p-2", children: _jsx(Input, { ref: repoInputRef, placeholder: "Search repositories...", value: repoQuery, onChange: (e) => setRepoQuery(e.target.value), className: "h-8 border-0 p-0 text-sm shadow-none focus-visible:ring-0", "data-testid": "adopt-repo-search" }) }), _jsx("div", { className: "max-h-48 overflow-y-auto py-1", role: "listbox", "aria-label": "Repositories", children: filteredRepos.length === 0 ? (_jsx("p", { className: "text-muted-foreground px-3 py-2 text-sm", children: "No repositories found." })) : (filteredRepos.map((r) => (_jsxs("button", { type: "button", role: "option", "aria-selected": selectedRepositoryPath === r.path, onClick: () => handleRepoSelect(r.path), className: cn('hover:bg-accent hover:text-accent-foreground flex w-full items-center gap-2 px-3 py-2 text-sm', selectedRepositoryPath === r.path && 'bg-accent/50'), "data-testid": `adopt-repo-option-${r.id}`, children: [_jsx(CheckIcon, { className: cn('h-4 w-4 shrink-0', selectedRepositoryPath !== r.path && 'invisible') }), _jsxs("span", { className: "flex flex-col items-start truncate", children: [_jsx("span", { className: "truncate", children: r.name }), _jsx("span", { className: "text-muted-foreground truncate text-xs", children: r.path })] })] }, r.id)))) })] }) })] }), _jsx("p", { className: "text-muted-foreground text-xs", children: "Select the repository that contains the branch you want to adopt." })] }), _jsxs("div", { className: "flex flex-col gap-2", children: [_jsx(Label, { htmlFor: "branch-name", children: "Branch name" }), _jsxs(Popover, { open: comboboxOpen, onOpenChange: setComboboxOpen, children: [_jsx(PopoverTrigger, { asChild: true, children: _jsxs(Button, { variant: "outline", role: "combobox", "aria-expanded": comboboxOpen, disabled: isSubmitting || !hasRepo, className: "w-full justify-between font-normal", "data-testid": "adopt-branch-input", children: [_jsx("span", { className: "truncate", children: !hasRepo
94
+ return (_jsx(BaseDrawer, { open: open, onClose: handleClose, size: "sm", modal: false, header: header, "data-testid": "adopt-branch-drawer", children: _jsxs("form", { onSubmit: handleSubmit, className: "flex flex-1 flex-col", children: [_jsx("div", { className: "flex-1 overflow-y-auto p-4", children: _jsxs("div", { className: "flex flex-col gap-4", children: [_jsxs("div", { className: "flex flex-col gap-2", children: [_jsx(Label, { children: "Repository" }), _jsxs(Popover, { open: repoOpen, onOpenChange: setRepoOpen, children: [_jsx(PopoverTrigger, { asChild: true, children: _jsxs("button", { type: "button", role: "combobox", "aria-expanded": repoOpen, "aria-label": "Repository", disabled: isSubmitting, "data-testid": "adopt-repo-combobox", className: cn('border-input bg-background ring-offset-background focus:ring-ring flex h-9 w-full items-center justify-between rounded-md border px-3 py-2 text-sm focus:ring-2 focus:ring-offset-2 focus:outline-none disabled:cursor-not-allowed disabled:opacity-50', !selectedRepo && 'text-muted-foreground'), children: [_jsx("span", { className: "truncate", children: selectedRepo ? selectedRepo.name : 'Select repository...' }), _jsx(ChevronsUpDown, { className: "ms-2 h-4 w-4 shrink-0 opacity-50" })] }) }), _jsx(PopoverContent, { className: "w-80 p-0", align: "start", "data-testid": "adopt-repo-combobox-content", children: _jsxs("div", { className: "flex flex-col", children: [_jsx("div", { className: "border-b p-2", children: _jsx(Input, { ref: repoInputRef, placeholder: "Search repositories...", value: repoQuery, onChange: (e) => setRepoQuery(e.target.value), className: "h-8 border-0 p-0 text-sm shadow-none focus-visible:ring-0", "data-testid": "adopt-repo-search" }) }), _jsx("div", { className: "max-h-48 overflow-y-auto py-1", role: "listbox", "aria-label": "Repositories", children: filteredRepos.length === 0 ? (_jsx("p", { className: "text-muted-foreground px-3 py-2 text-sm", children: "No repositories found." })) : (filteredRepos.map((r) => (_jsxs("button", { type: "button", role: "option", "aria-selected": selectedRepositoryPath === r.path, onClick: () => handleRepoSelect(r.path), className: cn('hover:bg-accent hover:text-accent-foreground flex w-full items-center gap-2 px-3 py-2 text-sm', selectedRepositoryPath === r.path && 'bg-accent/50'), "data-testid": `adopt-repo-option-${r.id}`, children: [_jsx(CheckIcon, { className: cn('h-4 w-4 shrink-0', selectedRepositoryPath !== r.path && 'invisible') }), _jsxs("span", { className: "flex flex-col items-start truncate", children: [_jsx("span", { className: "truncate", children: r.name }), _jsx("span", { className: "text-muted-foreground truncate text-xs", children: r.path })] })] }, r.id)))) })] }) })] }), _jsx("p", { className: "text-muted-foreground text-xs", children: "Select the repository that contains the branch you want to adopt." })] }), _jsxs("div", { className: "flex flex-col gap-2", children: [_jsx(Label, { htmlFor: "branch-name", children: "Branch name" }), _jsxs(Popover, { open: comboboxOpen, onOpenChange: setComboboxOpen, children: [_jsx(PopoverTrigger, { asChild: true, children: _jsxs(Button, { variant: "outline", role: "combobox", "aria-expanded": comboboxOpen, disabled: isSubmitting || !hasRepo, className: "w-full justify-between font-normal", "data-testid": "adopt-branch-input", children: [_jsx("span", { className: "truncate", children: !hasRepo
95
95
  ? 'Select a repository first...'
96
96
  : branchesLoading
97
97
  ? 'Loading branches...'
98
- : branchName || 'Select a branch...' }), _jsx(ChevronsUpDown, { className: "ml-2 h-4 w-4 shrink-0 opacity-50" })] }) }), _jsx(PopoverContent, { className: "w-[var(--radix-popover-trigger-width)] p-0", align: "start", children: _jsxs(Command, { children: [_jsx(CommandInput, { ref: inputRef, placeholder: "Search branches...", value: inputValue, onChange: handleInputChange, onKeyDown: handleInputKeyDown, "data-testid": "adopt-branch-search" }), _jsxs(CommandList, { children: [!branchesLoading && filteredBranches.length === 0 && (_jsx(CommandEmpty, { children: branches.length === 0
98
+ : branchName || 'Select a branch...' }), _jsx(ChevronsUpDown, { className: "ms-2 h-4 w-4 shrink-0 opacity-50" })] }) }), _jsx(PopoverContent, { className: "w-[var(--radix-popover-trigger-width)] p-0", align: "start", children: _jsxs(Command, { children: [_jsx(CommandInput, { ref: inputRef, placeholder: "Search branches...", value: inputValue, onChange: handleInputChange, onKeyDown: handleInputKeyDown, "data-testid": "adopt-branch-search" }), _jsxs(CommandList, { children: [!branchesLoading && filteredBranches.length === 0 && (_jsx(CommandEmpty, { children: branches.length === 0
99
99
  ? 'No branches found.'
100
100
  : inputValue
101
101
  ? 'No match — press Enter to use this value.'
102
- : 'No branches available.' })), branchesLoading ? (_jsx(CommandEmpty, { children: _jsx(Loader2, { className: "mx-auto h-4 w-4 animate-spin" }) })) : null, filteredBranches.length > 0 && (_jsx(CommandGroup, { children: filteredBranches.map((branch) => (_jsxs(CommandItem, { selected: branch === branchName, onClick: () => handleSelect(branch), children: [_jsx(Check, { className: cn('mr-2 h-4 w-4', branch === branchName ? 'opacity-100' : 'opacity-0') }), _jsx(GitBranch, { className: "mr-2 h-3 w-3 opacity-50" }), branch] }, branch))) }))] })] }) })] }), _jsx("p", { className: "text-muted-foreground text-xs", children: hasRepo
102
+ : 'No branches available.' })), branchesLoading ? (_jsx(CommandEmpty, { children: _jsx(Loader2, { className: "mx-auto h-4 w-4 animate-spin" }) })) : null, filteredBranches.length > 0 && (_jsx(CommandGroup, { children: filteredBranches.map((branch) => (_jsxs(CommandItem, { selected: branch === branchName, onClick: () => handleSelect(branch), children: [_jsx(Check, { className: cn('me-2 h-4 w-4', branch === branchName ? 'opacity-100' : 'opacity-0') }), _jsx(GitBranch, { className: "me-2 h-3 w-3 opacity-50" }), branch] }, branch))) }))] })] }) })] }), _jsx("p", { className: "text-muted-foreground text-xs", children: hasRepo
103
103
  ? 'Select a branch from the dropdown or type to search. Local and remote branches are shown.'
104
- : 'Please select a repository above to see available branches.' })] }), error ? (_jsx("p", { className: "text-destructive text-sm", "data-testid": "adopt-branch-error", children: error })) : null] }) }), _jsx("div", { className: "border-t p-4", children: _jsxs("div", { className: "flex gap-2", children: [_jsx(Button, { type: "button", variant: "outline", onClick: handleClose, disabled: isSubmitting, className: "flex-1", children: "Cancel" }), _jsx(Button, { type: "submit", disabled: isDisabled, className: "flex-1", "data-testid": "adopt-branch-submit", children: isSubmitting ? (_jsxs(_Fragment, { children: [_jsx(Loader2, { className: "mr-2 h-4 w-4 animate-spin" }), "Adopting..."] })) : ('Adopt Branch') })] }) })] }) }));
104
+ : 'Please select a repository above to see available branches.' })] }), error ? (_jsx("p", { className: "text-destructive text-sm", "data-testid": "adopt-branch-error", children: error })) : null] }) }), _jsx("div", { className: "border-t p-4", children: _jsxs("div", { className: "flex gap-2", children: [_jsx(Button, { type: "button", variant: "outline", onClick: handleClose, disabled: isSubmitting, className: "flex-1", children: "Cancel" }), _jsx(Button, { type: "submit", disabled: isDisabled, className: "flex-1", "data-testid": "adopt-branch-submit", children: isSubmitting ? (_jsxs(_Fragment, { children: [_jsx(Loader2, { className: "me-2 h-4 w-4 animate-spin" }), "Adopting..."] })) : ('Adopt Branch') })] }) })] }) }));
105
105
  }
@@ -1 +1 @@
1
- {"version":3,"file":"feature-drawer-client.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/control-center-drawer/feature-drawer-client.tsx"],"names":[],"mappings":"AAiDA,OAAO,KAAK,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAK/D,MAAM,WAAW,wBAAwB;IACvC,IAAI,EAAE,UAAU,CAAC;IACjB,8FAA8F;IAC9F,MAAM,CAAC,EAAE,aAAa,CAAC;IACvB,qFAAqF;IACrF,uBAAuB,CAAC,EAAE,OAAO,CAAC;CACnC;AAED,wBAAgB,mBAAmB,CAAC,EAClC,IAAI,EAAE,WAAW,EACjB,MAAM,EACN,uBAA8B,GAC/B,EAAE,wBAAwB,2CAmuB1B"}
1
+ {"version":3,"file":"feature-drawer-client.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/control-center-drawer/feature-drawer-client.tsx"],"names":[],"mappings":"AAkDA,OAAO,KAAK,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAK/D,MAAM,WAAW,wBAAwB;IACvC,IAAI,EAAE,UAAU,CAAC;IACjB,8FAA8F;IAC9F,MAAM,CAAC,EAAE,aAAa,CAAC;IACvB,qFAAqF;IACrF,uBAAuB,CAAC,EAAE,OAAO,CAAC;CACnC;AAED,wBAAgB,mBAAmB,CAAC,EAClC,IAAI,EAAE,WAAW,EACjB,MAAM,EACN,uBAA8B,GAC/B,EAAE,wBAAwB,2CA0uB1B"}
@@ -1,6 +1,7 @@
1
1
  'use client';
2
2
  import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
3
3
  import { useState, useCallback, useEffect, useRef } from 'react';
4
+ import { useTranslation } from 'react-i18next';
4
5
  import { useRouter, usePathname } from 'next/navigation';
5
6
  import { toast } from 'sonner';
6
7
  import { Loader2, Trash2, Play, Square, Copy, Check, Code2, ExternalLink, Archive, ArchiveRestore, } from 'lucide-react';
@@ -32,6 +33,7 @@ import { useDrawerSync } from './use-drawer-sync.js';
32
33
  import { useBranchSyncStatus } from '../../../hooks/use-branch-sync-status.js';
33
34
  export function FeatureDrawerClient({ view: initialView, urlTab, interactiveAgentEnabled = true, }) {
34
35
  const featureFlags = useFeatureFlags();
36
+ const { t } = useTranslation('web');
35
37
  const router = useRouter();
36
38
  const rejectSound = useSoundAction('reject');
37
39
  // Track the view locally so SSE events can update the drawer type in real-time
@@ -402,7 +404,11 @@ export function FeatureDrawerClient({ view: initialView, urlTab, interactiveAgen
402
404
  const repoName = featureNode.repositoryName ??
403
405
  featureNode.repositoryPath.split('/').filter(Boolean).at(-1) ??
404
406
  '';
405
- headerContent = (_jsxs(_Fragment, { children: [repoName ? (_jsxs("div", { className: "flex items-center gap-1.5 pt-0.5", children: [_jsx(Code2, { className: "text-muted-foreground size-3.5 shrink-0" }), featureNode.remoteUrl ? (_jsxs("a", { href: featureNode.remoteUrl, target: "_blank", rel: "noopener noreferrer", className: "text-muted-foreground hover:text-foreground inline-flex items-center gap-1 text-xs transition-colors", "data-testid": "feature-drawer-repo-link", children: [repoName, _jsx(ExternalLink, { className: "size-3" })] })) : (_jsx("span", { className: "text-muted-foreground text-xs", children: repoName }))] })) : null, featureActionsInput ? (_jsxs("div", { className: "flex items-center gap-2 pt-1", "data-testid": "feature-drawer-actions", children: [featureNode?.state !== 'done' ? (_jsx(OpenActionMenu, { actions: featureActions, repositoryPath: featureActionsInput.repositoryPath, worktreePath: featureActionsInput.worktreePath, showSpecs: !!featureActionsInput.specPath })) : null, featureNode?.state !== 'done' && featureFlags.envDeploy && featureDeployTarget ? (_jsxs(_Fragment, { children: [_jsx(TooltipProvider, { children: _jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx("span", { children: _jsx(ActionButton, { label: isFeatureDeployActive ? 'Stop Dev Server' : 'Start Dev Server', onClick: isFeatureDeployActive ? deployAction.stop : deployAction.deploy, loading: deployAction.deployLoading || deployAction.stopLoading, error: !!deployAction.deployError, icon: isFeatureDeployActive ? Square : Play, iconOnly: true, variant: "outline", size: "icon-sm" }) }) }), _jsx(TooltipContent, { children: isFeatureDeployActive ? 'Stop Dev Server' : 'Start Dev Server' })] }) }), isFeatureDeployActive ? (_jsx(DeploymentStatusBadge, { status: deployAction.status, url: deployAction.url, targetId: featureDeployTarget?.targetId })) : null] })) : null, _jsxs("div", { className: "ml-auto flex items-center gap-1.5", children: [_jsx("code", { className: "bg-muted text-muted-foreground rounded px-1.5 py-0.5 font-mono text-xs", children: shortId }), _jsx("button", { type: "button", onClick: handleCopyId, className: "text-muted-foreground hover:text-foreground inline-flex items-center rounded p-0.5 transition-colors", "aria-label": "Copy feature ID", "data-testid": "feature-drawer-copy-id", children: idCopied ? (_jsx(Check, { className: "size-3.5 text-green-600" })) : (_jsx(Copy, { className: "size-3.5" })) })] }), featureNode.featureId ? (_jsxs(_Fragment, { children: [featureNode.state === 'archived' ? (_jsx(TooltipProvider, { children: _jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx(Button, { variant: "ghost", size: "icon-sm", "aria-label": "Unarchive feature", disabled: isArchiving, className: "text-muted-foreground hover:text-primary", "data-testid": "feature-drawer-unarchive", onClick: () => handleUnarchive(featureNode.featureId), children: isArchiving ? (_jsx(Loader2, { className: "size-4 animate-spin" })) : (_jsx(ArchiveRestore, { className: "size-4" })) }) }), _jsx(TooltipContent, { children: "Unarchive feature" })] }) })) : featureNode.state !== 'deleting' ? (_jsx(TooltipProvider, { children: _jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx(Button, { variant: "ghost", size: "icon-sm", "aria-label": "Archive feature", disabled: isArchiving, className: "text-muted-foreground hover:text-foreground", "data-testid": "feature-drawer-archive", onClick: () => handleArchive(featureNode.featureId), children: isArchiving ? (_jsx(Loader2, { className: "size-4 animate-spin" })) : (_jsx(Archive, { className: "size-4" })) }) }), _jsx(TooltipContent, { children: "Archive feature" })] }) })) : null, _jsx(Button, { variant: "ghost", size: "icon-sm", "aria-label": "Delete feature", disabled: isDeleting, className: "text-muted-foreground hover:text-destructive", "data-testid": "feature-drawer-delete", onClick: () => setDeleteDialogOpen(true), children: isDeleting ? (_jsx(Loader2, { className: "size-4 animate-spin" })) : (_jsx(Trash2, { className: "size-4" })) }), _jsx(DeleteFeatureDialog, { open: deleteDialogOpen, onOpenChange: setDeleteDialogOpen, onConfirm: (cleanup, cascadeDelete, closePr) => handleDelete(featureNode.featureId, cleanup, cascadeDelete, closePr), isDeleting: isDeleting, featureName: featureNode.name, featureId: featureNode.featureId, hasChildren: featureNode.hasChildren, hasOpenPr: !!featureNode.pr && featureNode.pr.status === 'Open' })] })) : null] })) : null] }));
407
+ headerContent = (_jsxs(_Fragment, { children: [repoName ? (_jsxs("div", { className: "flex items-center gap-1.5 pt-0.5", children: [_jsx(Code2, { className: "text-muted-foreground size-3.5 shrink-0" }), featureNode.remoteUrl ? (_jsxs("a", { href: featureNode.remoteUrl, target: "_blank", rel: "noopener noreferrer", className: "text-muted-foreground hover:text-foreground inline-flex items-center gap-1 text-xs transition-colors", "data-testid": "feature-drawer-repo-link", children: [repoName, _jsx(ExternalLink, { className: "size-3" })] })) : (_jsx("span", { className: "text-muted-foreground text-xs", children: repoName }))] })) : null, featureActionsInput ? (_jsxs("div", { className: "flex items-center gap-2 pt-1", "data-testid": "feature-drawer-actions", children: [featureNode?.state !== 'done' ? (_jsx(OpenActionMenu, { actions: featureActions, repositoryPath: featureActionsInput.repositoryPath, worktreePath: featureActionsInput.worktreePath, showSpecs: !!featureActionsInput.specPath })) : null, featureNode?.state !== 'done' && featureFlags.envDeploy && featureDeployTarget ? (_jsxs(_Fragment, { children: [_jsx(TooltipProvider, { children: _jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx("span", { children: _jsx(ActionButton, { label: isFeatureDeployActive
408
+ ? t('featureDrawer.stopDevServer')
409
+ : t('featureDrawer.startDevServer'), onClick: isFeatureDeployActive ? deployAction.stop : deployAction.deploy, loading: deployAction.deployLoading || deployAction.stopLoading, error: !!deployAction.deployError, icon: isFeatureDeployActive ? Square : Play, iconOnly: true, variant: "outline", size: "icon-sm" }) }) }), _jsx(TooltipContent, { children: isFeatureDeployActive
410
+ ? t('featureDrawer.stopDevServer')
411
+ : t('featureDrawer.startDevServer') })] }) }), isFeatureDeployActive ? (_jsx(DeploymentStatusBadge, { status: deployAction.status, url: deployAction.url, targetId: featureDeployTarget?.targetId })) : null] })) : null, _jsxs("div", { className: "ml-auto flex items-center gap-1.5", children: [_jsx("code", { className: "bg-muted text-muted-foreground rounded px-1.5 py-0.5 font-mono text-xs", children: shortId }), _jsx("button", { type: "button", onClick: handleCopyId, className: "text-muted-foreground hover:text-foreground inline-flex items-center rounded p-0.5 transition-colors", "aria-label": t('featureDrawer.copyFeatureId'), "data-testid": "feature-drawer-copy-id", children: idCopied ? (_jsx(Check, { className: "size-3.5 text-green-600" })) : (_jsx(Copy, { className: "size-3.5" })) })] }), featureNode.featureId ? (_jsxs(_Fragment, { children: [featureNode.state === 'archived' ? (_jsx(TooltipProvider, { children: _jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx(Button, { variant: "ghost", size: "icon-sm", "aria-label": t('featureDrawer.unarchiveFeature'), disabled: isArchiving, className: "text-muted-foreground hover:text-primary", "data-testid": "feature-drawer-unarchive", onClick: () => handleUnarchive(featureNode.featureId), children: isArchiving ? (_jsx(Loader2, { className: "size-4 animate-spin" })) : (_jsx(ArchiveRestore, { className: "size-4" })) }) }), _jsx(TooltipContent, { children: t('featureDrawer.unarchiveFeature') })] }) })) : featureNode.state !== 'deleting' ? (_jsx(TooltipProvider, { children: _jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx(Button, { variant: "ghost", size: "icon-sm", "aria-label": t('featureDrawer.archiveFeature'), disabled: isArchiving, className: "text-muted-foreground hover:text-foreground", "data-testid": "feature-drawer-archive", onClick: () => handleArchive(featureNode.featureId), children: isArchiving ? (_jsx(Loader2, { className: "size-4 animate-spin" })) : (_jsx(Archive, { className: "size-4" })) }) }), _jsx(TooltipContent, { children: t('featureDrawer.archiveFeature') })] }) })) : null, _jsx(Button, { variant: "ghost", size: "icon-sm", "aria-label": t('featureDrawer.deleteFeature'), disabled: isDeleting, className: "text-muted-foreground hover:text-destructive", "data-testid": "feature-drawer-delete", onClick: () => setDeleteDialogOpen(true), children: isDeleting ? (_jsx(Loader2, { className: "size-4 animate-spin" })) : (_jsx(Trash2, { className: "size-4" })) }), _jsx(DeleteFeatureDialog, { open: deleteDialogOpen, onOpenChange: setDeleteDialogOpen, onConfirm: (cleanup, cascadeDelete, closePr) => handleDelete(featureNode.featureId, cleanup, cascadeDelete, closePr), isDeleting: isDeleting, featureName: featureNode.name, featureId: featureNode.featureId, hasChildren: featureNode.hasChildren, hasOpenPr: !!featureNode.pr && featureNode.pr.status === 'Open' })] })) : null] })) : null] }));
406
412
  }
407
413
  // ── Body ──────────────────────────────────────────────────────────────
408
414
  let body = null;
@@ -33,5 +33,5 @@ export function RepositoryDrawerClient({ data, initialTab }) {
33
33
  const isDeployActive = deployAction.status === 'Booting' || deployAction.status === 'Ready';
34
34
  // Session ID for repo chat — deterministic per repo
35
35
  const repoSessionId = data.id ? `repo-${data.id}` : `repo-${data.name}`;
36
- return (_jsx(BaseDrawer, { open: isOpen, onClose: onClose, size: "lg", modal: false, "data-testid": "repository-drawer", children: _jsxs(Tabs, { value: activeTab, onValueChange: setActiveTab, className: "flex min-h-0 flex-1 flex-col", children: [_jsxs("div", { className: "shrink-0 px-4 pt-4 pb-3", "data-testid": "repository-drawer-header", children: [_jsxs("div", { className: "flex items-baseline gap-4 pr-6", children: [_jsx("h2", { className: "text-foreground min-w-0 shrink truncate text-base font-semibold tracking-tight", children: data.name }), _jsxs(TabsList, { className: "h-auto shrink-0 gap-0.5 rounded-none border-0 bg-transparent p-0", children: [_jsx(TabsTrigger, { value: "overview", className: "text-muted-foreground hover:text-foreground data-[state=active]:text-foreground data-[state=active]:border-primary h-auto rounded-none border-b-2 border-transparent bg-transparent px-2 py-0.5 text-[12px] font-medium shadow-none transition-colors data-[state=active]:bg-transparent data-[state=active]:shadow-none", children: "Overview" }), _jsx(TabsTrigger, { value: "chat", className: "text-muted-foreground hover:text-foreground data-[state=active]:text-foreground data-[state=active]:border-primary h-auto rounded-none border-b-2 border-transparent bg-transparent px-2 py-0.5 text-[12px] font-medium shadow-none transition-colors data-[state=active]:bg-transparent data-[state=active]:shadow-none", children: "Chat" })] })] }), _jsxs("div", { className: "mt-1 flex items-center gap-2", children: [data.repositoryPath ? (_jsx("p", { className: "text-muted-foreground min-w-0 truncate font-mono text-xs", children: data.repositoryPath })) : null, featureFlags.envDeploy && data.repositoryPath ? (_jsxs("div", { className: "ml-auto flex shrink-0 items-center gap-2", children: [_jsx(TooltipProvider, { children: _jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx("span", { children: _jsx(ActionButton, { label: isDeployActive ? 'Stop Dev Server' : 'Start Dev Server', onClick: isDeployActive ? deployAction.stop : deployAction.deploy, loading: deployAction.deployLoading || deployAction.stopLoading, error: !!deployAction.deployError, icon: isDeployActive ? Square : Play, iconOnly: true, variant: "outline", size: "icon-sm" }) }) }), _jsx(TooltipContent, { children: isDeployActive ? 'Stop Dev Server' : 'Start Dev Server' })] }) }), isDeployActive ? (_jsx(DeploymentStatusBadge, { status: deployAction.status, url: deployAction.url, targetId: data.repositoryPath })) : null] })) : null] })] }), _jsx(Separator, {}), _jsx(TabsContent, { value: "overview", className: "mt-0 flex-1 overflow-y-auto", children: data.repositoryPath ? (_jsxs("div", { className: "flex-1 overflow-y-auto", children: [_jsxs("div", { className: "flex flex-col gap-3 p-4", children: [_jsx("div", { className: "text-muted-foreground text-xs font-semibold tracking-wider", children: "OPEN WITH" }), _jsxs("div", { className: "flex flex-col gap-2", children: [_jsx(ActionButton, { label: "Open in IDE", onClick: repoActions.openInIde, loading: repoActions.ideLoading, error: !!repoActions.ideError, icon: Code2, variant: "outline", size: "sm" }), _jsx(ActionButton, { label: "Open in Shell", onClick: repoActions.openInShell, loading: repoActions.shellLoading, error: !!repoActions.shellError, icon: Terminal, variant: "outline", size: "sm" }), _jsx(ActionButton, { label: "Open Folder", onClick: repoActions.openFolder, loading: repoActions.folderLoading, error: !!repoActions.folderError, icon: FolderOpen, variant: "outline", size: "sm" })] })] }), data.id && featureFlags.gitRebaseSync ? (_jsxs(_Fragment, { children: [_jsx(Separator, {}), _jsxs("div", { className: "flex flex-col gap-3 p-4", children: [_jsx("div", { className: "text-muted-foreground text-xs font-semibold tracking-wider", children: "GIT OPERATIONS" }), _jsxs("div", { className: "flex flex-col gap-2", children: [_jsx(ActionButton, { label: "Sync Main", onClick: repoActions.syncMain, loading: repoActions.syncLoading, error: !!repoActions.syncError, icon: RefreshCw, variant: "outline", size: "sm" }), repoActions.syncError ? (_jsx("p", { className: "text-destructive text-xs", children: repoActions.syncError })) : null] })] })] })) : null] })) : null }), _jsx(TabsContent, { value: "chat", className: "mt-0 flex min-h-0 flex-1 flex-col overflow-hidden", children: _jsx(ChatTab, { featureId: repoSessionId, worktreePath: data.repositoryPath }) })] }) }));
36
+ return (_jsx(BaseDrawer, { open: isOpen, onClose: onClose, size: "lg", modal: false, "data-testid": "repository-drawer", children: _jsxs(Tabs, { value: activeTab, onValueChange: setActiveTab, className: "flex min-h-0 flex-1 flex-col", children: [_jsxs("div", { className: "shrink-0 px-4 pt-4 pb-3", "data-testid": "repository-drawer-header", children: [_jsxs("div", { className: "flex items-baseline gap-4 pe-6", children: [_jsx("h2", { className: "text-foreground min-w-0 shrink truncate text-base font-semibold tracking-tight", children: data.name }), _jsxs(TabsList, { className: "h-auto shrink-0 gap-0.5 rounded-none border-0 bg-transparent p-0", children: [_jsx(TabsTrigger, { value: "overview", className: "text-muted-foreground hover:text-foreground data-[state=active]:text-foreground data-[state=active]:border-primary h-auto rounded-none border-b-2 border-transparent bg-transparent px-2 py-0.5 text-[12px] font-medium shadow-none transition-colors data-[state=active]:bg-transparent data-[state=active]:shadow-none", children: "Overview" }), _jsx(TabsTrigger, { value: "chat", className: "text-muted-foreground hover:text-foreground data-[state=active]:text-foreground data-[state=active]:border-primary h-auto rounded-none border-b-2 border-transparent bg-transparent px-2 py-0.5 text-[12px] font-medium shadow-none transition-colors data-[state=active]:bg-transparent data-[state=active]:shadow-none", children: "Chat" })] })] }), _jsxs("div", { className: "mt-1 flex items-center gap-2", children: [data.repositoryPath ? (_jsx("p", { className: "text-muted-foreground min-w-0 truncate font-mono text-xs", children: data.repositoryPath })) : null, featureFlags.envDeploy && data.repositoryPath ? (_jsxs("div", { className: "ml-auto flex shrink-0 items-center gap-2", children: [_jsx(TooltipProvider, { children: _jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx("span", { children: _jsx(ActionButton, { label: isDeployActive ? 'Stop Dev Server' : 'Start Dev Server', onClick: isDeployActive ? deployAction.stop : deployAction.deploy, loading: deployAction.deployLoading || deployAction.stopLoading, error: !!deployAction.deployError, icon: isDeployActive ? Square : Play, iconOnly: true, variant: "outline", size: "icon-sm" }) }) }), _jsx(TooltipContent, { children: isDeployActive ? 'Stop Dev Server' : 'Start Dev Server' })] }) }), isDeployActive ? (_jsx(DeploymentStatusBadge, { status: deployAction.status, url: deployAction.url, targetId: data.repositoryPath })) : null] })) : null] })] }), _jsx(Separator, {}), _jsx(TabsContent, { value: "overview", className: "mt-0 flex-1 overflow-y-auto", children: data.repositoryPath ? (_jsxs("div", { className: "flex-1 overflow-y-auto", children: [_jsxs("div", { className: "flex flex-col gap-3 p-4", children: [_jsx("div", { className: "text-muted-foreground text-xs font-semibold tracking-wider", children: "OPEN WITH" }), _jsxs("div", { className: "flex flex-col gap-2", children: [_jsx(ActionButton, { label: "Open in IDE", onClick: repoActions.openInIde, loading: repoActions.ideLoading, error: !!repoActions.ideError, icon: Code2, variant: "outline", size: "sm" }), _jsx(ActionButton, { label: "Open in Shell", onClick: repoActions.openInShell, loading: repoActions.shellLoading, error: !!repoActions.shellError, icon: Terminal, variant: "outline", size: "sm" }), _jsx(ActionButton, { label: "Open Folder", onClick: repoActions.openFolder, loading: repoActions.folderLoading, error: !!repoActions.folderError, icon: FolderOpen, variant: "outline", size: "sm" })] })] }), data.id && featureFlags.gitRebaseSync ? (_jsxs(_Fragment, { children: [_jsx(Separator, {}), _jsxs("div", { className: "flex flex-col gap-3 p-4", children: [_jsx("div", { className: "text-muted-foreground text-xs font-semibold tracking-wider", children: "GIT OPERATIONS" }), _jsxs("div", { className: "flex flex-col gap-2", children: [_jsx(ActionButton, { label: "Sync Main", onClick: repoActions.syncMain, loading: repoActions.syncLoading, error: !!repoActions.syncError, icon: RefreshCw, variant: "outline", size: "sm" }), repoActions.syncError ? (_jsx("p", { className: "text-destructive text-xs", children: repoActions.syncError })) : null] })] })] })) : null] })) : null }), _jsx(TabsContent, { value: "chat", className: "mt-0 flex min-h-0 flex-1 flex-col overflow-hidden", children: _jsx(ChatTab, { featureId: repoSessionId, worktreePath: data.repositoryPath }) })] }) }));
37
37
  }
@@ -1 +1 @@
1
- {"version":3,"file":"delete-feature-dialog.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/delete-feature-dialog/delete-feature-dialog.tsx"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,gCAAgC,CAAC;AAE/E,wBAAgB,mBAAmB,CAAC,EAClC,IAAI,EACJ,YAAY,EACZ,SAAS,EACT,UAAU,EACV,WAAW,EACX,SAAS,EACT,WAAW,EACX,SAAS,GACV,EAAE,wBAAwB,2CA+F1B"}
1
+ {"version":3,"file":"delete-feature-dialog.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/delete-feature-dialog/delete-feature-dialog.tsx"],"names":[],"mappings":"AAiBA,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,gCAAgC,CAAC;AAE/E,wBAAgB,mBAAmB,CAAC,EAClC,IAAI,EACJ,YAAY,EACZ,SAAS,EACT,UAAU,EACV,WAAW,EACX,SAAS,EACT,WAAW,EACX,SAAS,GACV,EAAE,wBAAwB,2CAoG1B"}
@@ -2,10 +2,12 @@
2
2
  import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
3
3
  import { useEffect, useState } from 'react';
4
4
  import { Loader2 } from 'lucide-react';
5
+ import { Trans, useTranslation } from 'react-i18next';
5
6
  import { AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogTitle, } from '../../ui/alert-dialog.js';
6
7
  import { Checkbox } from '../../ui/checkbox.js';
7
8
  import { Label } from '../../ui/label.js';
8
9
  export function DeleteFeatureDialog({ open, onOpenChange, onConfirm, isDeleting, featureName, featureId, hasChildren, hasOpenPr, }) {
10
+ const { t } = useTranslation('web');
9
11
  const [cleanup, setCleanup] = useState(true);
10
12
  const [cascadeDelete, setCascadeDelete] = useState(false);
11
13
  const [closePr, setClosePr] = useState(true);
@@ -24,5 +26,5 @@ export function DeleteFeatureDialog({ open, onOpenChange, onConfirm, isDeleting,
24
26
  setClosePr(false);
25
27
  }
26
28
  }, [cleanup]);
27
- return (_jsx(AlertDialog, { open: open, onOpenChange: onOpenChange, children: _jsxs(AlertDialogContent, { onCloseAutoFocus: (e) => e.preventDefault(), children: [_jsxs(AlertDialogHeader, { children: [_jsx(AlertDialogTitle, { children: "Delete feature?" }), _jsxs(AlertDialogDescription, { children: ["This will permanently delete ", _jsx("strong", { children: featureName }), " (", featureId, "). This action cannot be undone."] })] }), _jsxs("div", { className: "flex flex-col gap-2", children: [_jsxs("div", { className: "flex items-center gap-2", children: [_jsx(Checkbox, { id: "cleanup-checkbox", checked: cleanup, onCheckedChange: (checked) => setCleanup(checked === true), disabled: isDeleting, "aria-label": "Clean up worktree and branches" }), _jsx(Label, { htmlFor: "cleanup-checkbox", className: "cursor-pointer text-sm", children: "Clean up worktree and branches" })] }), hasChildren ? (_jsxs("div", { className: "flex items-center gap-2", children: [_jsx(Checkbox, { id: "cascade-delete-checkbox", checked: cascadeDelete, onCheckedChange: (checked) => setCascadeDelete(checked === true), disabled: isDeleting, "aria-label": "Delete sub-features" }), _jsx(Label, { htmlFor: "cascade-delete-checkbox", className: "cursor-pointer text-sm", children: "Delete sub-features" })] })) : null, hasOpenPr ? (_jsxs("div", { className: "flex items-center gap-2", children: [_jsx(Checkbox, { id: "close-pr-checkbox", checked: closePr, onCheckedChange: (checked) => setClosePr(checked === true), disabled: isDeleting || !cleanup, "aria-label": "Close pull request" }), _jsx(Label, { htmlFor: "close-pr-checkbox", className: "cursor-pointer text-sm", children: "Close pull request" })] })) : null] }), _jsxs(AlertDialogFooter, { children: [_jsx(AlertDialogCancel, { disabled: isDeleting, onClick: () => onOpenChange(false), children: "Cancel" }), _jsx(AlertDialogAction, { variant: "destructive", disabled: isDeleting, onClick: () => onConfirm(cleanup, cascadeDelete, hasOpenPr ? closePr : false), children: isDeleting ? (_jsxs(_Fragment, { children: [_jsx(Loader2, { className: "mr-2 h-4 w-4 animate-spin" }), "Deleting\u2026"] })) : ('Delete') })] })] }) }));
29
+ return (_jsx(AlertDialog, { open: open, onOpenChange: onOpenChange, children: _jsxs(AlertDialogContent, { onCloseAutoFocus: (e) => e.preventDefault(), children: [_jsxs(AlertDialogHeader, { children: [_jsx(AlertDialogTitle, { children: t('deleteFeature.title') }), _jsx(AlertDialogDescription, { children: _jsx(Trans, { t: t, i18nKey: "deleteFeature.description", values: { featureName, featureId }, components: { strong: _jsx("strong", {}) } }) })] }), _jsxs("div", { className: "flex flex-col gap-2", children: [_jsxs("div", { className: "flex items-center gap-2", children: [_jsx(Checkbox, { id: "cleanup-checkbox", checked: cleanup, onCheckedChange: (checked) => setCleanup(checked === true), disabled: isDeleting, "aria-label": t('deleteFeature.cleanupLabel') }), _jsx(Label, { htmlFor: "cleanup-checkbox", className: "cursor-pointer text-sm", children: t('deleteFeature.cleanupLabel') })] }), hasChildren ? (_jsxs("div", { className: "flex items-center gap-2", children: [_jsx(Checkbox, { id: "cascade-delete-checkbox", checked: cascadeDelete, onCheckedChange: (checked) => setCascadeDelete(checked === true), disabled: isDeleting, "aria-label": t('deleteFeature.deleteSubFeatures') }), _jsx(Label, { htmlFor: "cascade-delete-checkbox", className: "cursor-pointer text-sm", children: t('deleteFeature.deleteSubFeatures') })] })) : null, hasOpenPr ? (_jsxs("div", { className: "flex items-center gap-2", children: [_jsx(Checkbox, { id: "close-pr-checkbox", checked: closePr, onCheckedChange: (checked) => setClosePr(checked === true), disabled: isDeleting || !cleanup, "aria-label": t('deleteFeature.closePullRequest') }), _jsx(Label, { htmlFor: "close-pr-checkbox", className: "cursor-pointer text-sm", children: t('deleteFeature.closePullRequest') })] })) : null] }), _jsxs(AlertDialogFooter, { children: [_jsx(AlertDialogCancel, { disabled: isDeleting, onClick: () => onOpenChange(false), children: t('deleteFeature.cancel') }), _jsx(AlertDialogAction, { variant: "destructive", disabled: isDeleting, onClick: () => onConfirm(cleanup, cascadeDelete, hasOpenPr ? closePr : false), children: isDeleting ? (_jsxs(_Fragment, { children: [_jsx(Loader2, { className: "me-2 h-4 w-4 animate-spin" }), t('deleteFeature.deleting')] })) : (t('deleteFeature.delete')) })] })] }) }));
28
30
  }
@@ -10,12 +10,12 @@ export function DeploymentStatusBadge({ status, url, targetId }) {
10
10
  const showLogButton = targetId && (status === DeploymentState.Booting || status === DeploymentState.Ready);
11
11
  switch (status) {
12
12
  case DeploymentState.Booting:
13
- return (_jsxs(_Fragment, { children: [_jsxs(Badge, { className: "border-transparent bg-blue-50 text-blue-700 hover:bg-blue-50", children: [_jsx(Loader2, { className: "mr-1 h-3.5 w-3.5 animate-spin" }), "Starting...", showLogButton ? (_jsx("button", { type: "button", "aria-label": "View server logs", className: "ml-1.5 inline-flex items-center rounded-sm p-0.5 hover:bg-blue-100", onClick: (e) => {
13
+ return (_jsxs(_Fragment, { children: [_jsxs(Badge, { className: "border-transparent bg-blue-50 text-blue-700 hover:bg-blue-50", children: [_jsx(Loader2, { className: "me-1 h-3.5 w-3.5 animate-spin" }), "Starting...", showLogButton ? (_jsx("button", { type: "button", "aria-label": "View server logs", className: "ms-1.5 inline-flex items-center rounded-sm p-0.5 hover:bg-blue-100", onClick: (e) => {
14
14
  e.stopPropagation();
15
15
  setLogViewerOpen(true);
16
16
  }, children: _jsx(Terminal, { className: "h-3 w-3" }) })) : null] }), showLogButton ? (_jsx(ServerLogViewer, { open: logViewerOpen, onOpenChange: setLogViewerOpen, targetId: targetId })) : null] }));
17
17
  case DeploymentState.Ready:
18
- return (_jsxs(_Fragment, { children: [_jsxs(Badge, { className: "border-transparent bg-green-50 text-green-700 hover:bg-green-50", children: [_jsx("span", { className: "mr-1 inline-block h-2 w-2 rounded-full bg-green-500" }), url ? (_jsxs("a", { href: url, target: "_blank", rel: "noopener noreferrer", className: "inline-flex items-center gap-1 hover:underline", onClick: (e) => e.stopPropagation(), children: [url, _jsx(ExternalLink, { className: "h-3 w-3" })] })) : ('Ready'), showLogButton ? (_jsx("button", { type: "button", "aria-label": "View server logs", className: "ml-1.5 inline-flex items-center rounded-sm p-0.5 hover:bg-green-100", onClick: (e) => {
18
+ return (_jsxs(_Fragment, { children: [_jsxs(Badge, { className: "border-transparent bg-green-50 text-green-700 hover:bg-green-50", children: [_jsx("span", { className: "me-1 inline-block h-2 w-2 rounded-full bg-green-500" }), url ? (_jsxs("a", { href: url, target: "_blank", rel: "noopener noreferrer", className: "inline-flex items-center gap-1 hover:underline", onClick: (e) => e.stopPropagation(), children: [url, _jsx(ExternalLink, { className: "h-3 w-3" })] })) : ('Ready'), showLogButton ? (_jsx("button", { type: "button", "aria-label": "View server logs", className: "ms-1.5 inline-flex items-center rounded-sm p-0.5 hover:bg-green-100", onClick: (e) => {
19
19
  e.stopPropagation();
20
20
  setLogViewerOpen(true);
21
21
  }, children: _jsx(Terminal, { className: "h-3 w-3" }) })) : null] }), showLogButton ? (_jsx(ServerLogViewer, { open: logViewerOpen, onOpenChange: setLogViewerOpen, targetId: targetId })) : null] }));
@@ -1 +1 @@
1
- {"version":3,"file":"drawer-action-bar.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/drawer-action-bar/drawer-action-bar.tsx"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,oBAAoB,EAAoB,MAAM,4BAA4B,CAAC;AAmEzF,wBAAgB,eAAe,CAAC,EAC9B,QAAQ,EACR,SAAS,EACT,YAAY,EACZ,cAA0B,EAC1B,mBAAmB,EACnB,YAAoB,EACpB,WAAmB,EACnB,QAAQ,EACR,SAAS,EAAE,mBAAmB,EAC9B,iBAAiB,GAClB,EAAE,oBAAoB,2CA0YtB"}
1
+ {"version":3,"file":"drawer-action-bar.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/drawer-action-bar/drawer-action-bar.tsx"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,oBAAoB,EAAoB,MAAM,4BAA4B,CAAC;AAmEzF,wBAAgB,eAAe,CAAC,EAC9B,QAAQ,EACR,SAAS,EACT,YAAY,EACZ,cAA0B,EAC1B,mBAAmB,EACnB,YAAoB,EACpB,WAAmB,EACnB,QAAQ,EACR,SAAS,EAAE,mBAAmB,EAC9B,iBAAiB,GAClB,EAAE,oBAAoB,2CA6YtB"}
@@ -1,6 +1,7 @@
1
1
  'use client';
2
2
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
3
  import { useState, useCallback, useRef, useEffect } from 'react';
4
+ import { useTranslation } from 'react-i18next';
4
5
  import { PaperclipIcon, Send, ChevronLeft, Check, AlertTriangle } from 'lucide-react';
5
6
  import { cn } from '../../../lib/utils.js';
6
7
  import { Button } from '../../ui/button.js';
@@ -72,6 +73,7 @@ function getExtension(filename) {
72
73
  return dot >= 0 ? filename.slice(dot).toLowerCase() : '';
73
74
  }
74
75
  export function DrawerActionBar({ onReject, onApprove, approveLabel, approveVariant = 'default', revisionPlaceholder, isProcessing = false, isRejecting = false, children, chatInput: controlledChatInput, onChatInputChange, }) {
76
+ const { t } = useTranslation('web');
75
77
  const isWarning = approveVariant === 'warning';
76
78
  const ApproveIcon = isWarning ? AlertTriangle : Check;
77
79
  const accentBg = isWarning ? 'bg-orange-500/85' : 'bg-blue-500/85';
@@ -277,13 +279,15 @@ export function DrawerActionBar({ onReject, onApprove, approveLabel, approveVari
277
279
  }
278
280
  }, []);
279
281
  const modKey = typeof navigator !== 'undefined' && /Mac/i.test(navigator.userAgent) ? '⌘' : 'Ctrl';
280
- return (_jsxs("div", { className: "border-border shrink-0 border-t", children: [children, onReject ? (_jsx(TooltipProvider, { delayDuration: 400, children: _jsx("form", { ref: formRef, onSubmit: handleFormSubmit, className: "p-3", children: _jsx("div", { role: "region", "aria-label": "File drop zone", "data-drag-over": isDragOver ? 'true' : 'false', onDragEnter: handleDragEnter, onDragLeave: handleDragLeave, onDragOver: handleDragOver, onDrop: handleDrop, className: cn('rounded-md border-2 border-transparent transition-colors', isDragOver && 'border-primary/50 bg-primary/5'), children: _jsxs("div", { className: "border-input focus-within:ring-ring/50 focus-within:border-ring flex flex-col overflow-hidden rounded-md border shadow-xs transition-[color,box-shadow] focus-within:ring-[3px]", children: [_jsx(Textarea, { placeholder: revisionPlaceholder ?? 'Ask AI to revise...', "aria-label": revisionPlaceholder ?? 'Ask AI to revise...', disabled: disabled, value: chatInput, onChange: (e) => setChatInput(e.target.value), onKeyDown: handleKeyDown, onPaste: handlePaste, rows: 1, className: "max-h-[35dvh] min-h-9 flex-1 resize-none overflow-y-auto rounded-none border-0 py-2 shadow-none focus-visible:ring-0", "data-testid": "drawer-chat-input" }), attachments.length > 0 && (_jsx("div", { className: "flex flex-wrap items-center gap-1.5 px-3 py-2", children: attachments.map((file) => (_jsx(AttachmentChip, { name: file.name, size: file.size, mimeType: file.mimeType, path: file.path, onRemove: () => handleRemoveFile(file.id), disabled: disabled, loading: file.loading, notes: file.notes, onNotesChange: (notes) => handleNotesChange(file.id, notes) }, file.id))) })), uploadError ? (_jsx("p", { className: "text-destructive px-3 pb-2 text-xs", children: uploadError })) : null, _jsxs("div", { className: "border-input flex items-center gap-2 border-t px-3 py-1.5", children: [_jsxs("span", { className: "text-muted-foreground flex-1 truncate text-[11px]", children: [_jsxs("kbd", { className: "bg-muted rounded px-1 py-0.5 font-mono text-[10px]", children: [modKey, "+Enter"] }), ' ', hasText ? 'reject' : 'approve'] }), _jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx("button", { type: "button", onClick: handleAddFiles, disabled: disabled, "aria-label": "Attach files", className: "text-muted-foreground hover:text-foreground cursor-pointer rounded p-1 transition-colors", children: _jsx(PaperclipIcon, { className: "h-4 w-4" }) }) }), _jsx(TooltipContent, { side: "top", children: "Attach files" })] }), _jsx("div", { onMouseLeave: () => setHoverExpanded(false), children: _jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsxs("button", { type: "submit", disabled: disabled, "data-testid": "drawer-action-submit", className: cn('relative flex h-9 min-w-[12rem] cursor-pointer items-center overflow-hidden rounded-md border pr-10 pl-4 text-sm font-medium whitespace-nowrap transition-colors', 'disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50', approveExpanded
282
+ return (_jsxs("div", { className: "border-border shrink-0 border-t", children: [children, onReject ? (_jsx(TooltipProvider, { delayDuration: 400, children: _jsx("form", { ref: formRef, onSubmit: handleFormSubmit, className: "p-3", children: _jsx("div", { role: "region", "aria-label": t('createDrawer.fileDropZone'), "data-drag-over": isDragOver ? 'true' : 'false', onDragEnter: handleDragEnter, onDragLeave: handleDragLeave, onDragOver: handleDragOver, onDrop: handleDrop, className: cn('rounded-md border-2 border-transparent transition-colors', isDragOver && 'border-primary/50 bg-primary/5'), children: _jsxs("div", { className: "border-input focus-within:ring-ring/50 focus-within:border-ring flex flex-col overflow-hidden rounded-md border shadow-xs transition-[color,box-shadow] focus-within:ring-[3px]", children: [_jsx(Textarea, { placeholder: revisionPlaceholder ?? 'Ask AI to revise...', "aria-label": revisionPlaceholder ?? 'Ask AI to revise...', disabled: disabled, value: chatInput, onChange: (e) => setChatInput(e.target.value), onKeyDown: handleKeyDown, onPaste: handlePaste, rows: 1, className: "max-h-[35dvh] min-h-9 flex-1 resize-none overflow-y-auto rounded-none border-0 py-2 shadow-none focus-visible:ring-0", "data-testid": "drawer-chat-input" }), attachments.length > 0 && (_jsx("div", { className: "flex flex-wrap items-center gap-1.5 px-3 py-2", children: attachments.map((file) => (_jsx(AttachmentChip, { name: file.name, size: file.size, mimeType: file.mimeType, path: file.path, onRemove: () => handleRemoveFile(file.id), disabled: disabled, loading: file.loading, notes: file.notes, onNotesChange: (notes) => handleNotesChange(file.id, notes) }, file.id))) })), uploadError ? (_jsx("p", { className: "text-destructive px-3 pb-2 text-xs", children: uploadError })) : null, _jsxs("div", { className: "border-input flex items-center gap-2 border-t px-3 py-1.5", children: [_jsxs("span", { className: "text-muted-foreground flex-1 truncate text-[11px]", children: [_jsxs("kbd", { className: "bg-muted rounded px-1 py-0.5 font-mono text-[10px]", children: [modKey, "+Enter"] }), ' ', hasText ? 'reject' : 'approve'] }), _jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx("button", { type: "button", onClick: handleAddFiles, disabled: disabled, "aria-label": t('chat.attachFiles'), className: "text-muted-foreground hover:text-foreground cursor-pointer rounded p-1 transition-colors", children: _jsx(PaperclipIcon, { className: "h-4 w-4" }) }) }), _jsx(TooltipContent, { side: "top", children: t('chat.attachFiles') })] }), _jsx("div", { onMouseLeave: () => setHoverExpanded(false), children: _jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsxs("button", { type: "submit", disabled: disabled, "data-testid": "drawer-action-submit", className: cn('relative flex h-9 min-w-[12rem] cursor-pointer items-center overflow-hidden rounded-md border ps-4 pe-10 text-sm font-medium whitespace-nowrap transition-colors', 'disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50', approveExpanded
281
283
  ? `${accentBorder} text-white`
282
284
  : rejectHighlighted
283
285
  ? 'border-primary bg-muted ring-primary/30 shadow-sm ring-1'
284
286
  : 'border-border bg-muted/50 hover:bg-muted shadow-sm'), children: [_jsx("div", { className: cn('pointer-events-none absolute inset-0 transition-transform duration-300 ease-in-out', accentBg), style: {
285
287
  transform: approveExpanded ? 'translateX(0)' : 'translateX(100%)',
286
- } }), _jsxs("span", { className: cn('absolute inset-0 z-10 flex items-center justify-center gap-2 pr-8 transition-opacity duration-300', approveExpanded ? 'opacity-0' : 'opacity-100'), children: [_jsx(Send, { className: "h-4 w-4 shrink-0" }), "Reject"] }), _jsxs("span", { className: cn('absolute inset-0 z-10 flex items-center justify-center gap-2 text-white transition-opacity duration-300', approveExpanded ? 'opacity-100' : 'opacity-0'), children: [_jsx(ApproveIcon, { className: "h-4 w-4 shrink-0" }), approveLabel] }), _jsx("span", { className: cn(`border-input/60 absolute inset-y-0 right-0 z-20 flex w-8 cursor-pointer items-center justify-center rounded-r-[5px] border-l ${accentBg} transition-opacity duration-300`, !hasText && !hoverExpanded && 'pointer-events-none opacity-0'), onMouseEnter: () => setHoverExpanded(true), children: _jsx(ChevronLeft, { className: "h-4 w-4 text-white" }) })] }) }), !isWarning ? (_jsx(TooltipContent, { side: "top", children: approveExpanded ? approveLabel : 'Send revision feedback' })) : null] }) })] })] }) }) }) })) : (_jsx("div", { className: "flex items-center gap-2 px-4 pb-4", children: _jsx(Button, { type: "button", className: "flex-1", disabled: disabled, onClick: () => {
288
+ } }), _jsxs("span", { className: cn('absolute inset-0 z-10 flex items-center justify-center gap-2 pe-8 transition-opacity duration-300', approveExpanded ? 'opacity-0' : 'opacity-100'), children: [_jsx(Send, { className: "h-4 w-4 shrink-0" }), "Reject"] }), _jsxs("span", { className: cn('absolute inset-0 z-10 flex items-center justify-center gap-2 text-white transition-opacity duration-300', approveExpanded ? 'opacity-100' : 'opacity-0'), children: [_jsx(ApproveIcon, { className: "h-4 w-4 shrink-0" }), approveLabel] }), _jsx("span", { className: cn(`border-input/60 absolute inset-y-0 right-0 z-20 flex w-8 cursor-pointer items-center justify-center rounded-e-[5px] border-s ${accentBg} transition-opacity duration-300`, !hasText && !hoverExpanded && 'pointer-events-none opacity-0'), onMouseEnter: () => setHoverExpanded(true), children: _jsx(ChevronLeft, { className: "h-4 w-4 text-white" }) })] }) }), !isWarning ? (_jsx(TooltipContent, { side: "top", children: approveExpanded
289
+ ? approveLabel
290
+ : t('drawerActionBar.sendRevisionFeedback') })) : null] }) })] })] }) }) }) })) : (_jsx("div", { className: "flex items-center gap-2 px-4 pb-4", children: _jsx(Button, { type: "button", className: "flex-1", disabled: disabled, onClick: () => {
287
291
  approveSound.play();
288
292
  onApprove();
289
293
  }, children: approveLabel }) }))] }));
@@ -32,7 +32,7 @@ export const WithAction = {
32
32
  args: {
33
33
  title: 'No projects yet',
34
34
  description: 'Get started by creating your first project.',
35
- action: (_jsxs(Button, { children: [_jsx(Plus, { className: "mr-2 h-4 w-4" }), "Create Project"] })),
35
+ action: (_jsxs(Button, { children: [_jsx(Plus, { className: "me-2 h-4 w-4" }), "Create Project"] })),
36
36
  },
37
37
  };
38
38
  export const FullExample = {
@@ -40,6 +40,6 @@ export const FullExample = {
40
40
  icon: _jsx(FileQuestion, { className: "h-12 w-12" }),
41
41
  title: 'No features found',
42
42
  description: 'It looks like you have not created any features yet. Start by creating a new feature to track your development workflow.',
43
- action: (_jsxs(Button, { children: [_jsx(Plus, { className: "mr-2 h-4 w-4" }), "New Feature"] })),
43
+ action: (_jsxs(Button, { children: [_jsx(Plus, { className: "me-2 h-4 w-4" }), "New Feature"] })),
44
44
  },
45
45
  };
@@ -1 +1 @@
1
- {"version":3,"file":"feature-create-drawer.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.tsx"],"names":[],"mappings":"AA4BA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,qCAAqC,CAAC;AAU5E,YAAY,EAAE,cAAc,EAAE,MAAM,0DAA0D,CAAC;AAE/F,uFAAuF;AACvF,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,wDAAwD;IACxD,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,0DAA0D;AAC1D,MAAM,WAAW,mBAAmB;IAClC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;CACd;AAED,iEAAiE;AACjE,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,oBAAoB;IACnC,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,cAAc,EAAE,CAAC;IAC9B,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa,EAAE;QACb,QAAQ,EAAE,OAAO,CAAC;QAClB,SAAS,EAAE,OAAO,CAAC;QACnB,UAAU,EAAE,OAAO,CAAC;KACrB,CAAC;IACF,IAAI,EAAE,OAAO,CAAC;IACd,MAAM,EAAE,OAAO,CAAC;IAChB,cAAc,EAAE,OAAO,CAAC;IACxB,cAAc,EAAE,OAAO,CAAC;IACxB,cAAc,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,0EAA0E;IAC1E,IAAI,EAAE,OAAO,CAAC;IACd,yEAAyE;IACzE,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,yDAAyD;IACzD,SAAS,EAAE,OAAO,CAAC;IACnB,uFAAuF;IACvF,WAAW,EAAE,OAAO,CAAC;IACrB,wDAAwD;IACxD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,mDAAmD;IACnD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AA+ED,MAAM,WAAW,wBAAwB;IACvC,IAAI,EAAE,OAAO,CAAC;IACd,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,QAAQ,EAAE,CAAC,IAAI,EAAE,oBAAoB,KAAK,IAAI,CAAC;IAC/C,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;IACpC,qEAAqE;IACrE,QAAQ,CAAC,EAAE,mBAAmB,EAAE,CAAC;IACjC,+EAA+E;IAC/E,YAAY,CAAC,EAAE,gBAAgB,EAAE,CAAC;IAClC,kGAAkG;IAClG,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,8CAA8C;IAC9C,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,yCAAyC;IACzC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,oEAAoE;IACpE,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,yEAAyE;IACzE,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED,wBAAgB,mBAAmB,CAAC,EAClC,IAAI,EACJ,OAAO,EACP,QAAQ,EACR,cAAc,EACd,YAAoB,EACpB,gBAAgB,EAChB,QAAQ,EACR,YAAY,EACZ,eAAe,EACf,gBAAgB,EAChB,YAAY,EACZ,kBAAkB,EAClB,eAAe,GAChB,EAAE,wBAAwB,2CAu6B1B;AAmJD,MAAM,WAAW,uBAAuB;IACtC,YAAY,EAAE,gBAAgB,EAAE,CAAC;IACjC,KAAK,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1B,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,KAAK,IAAI,CAAC;IAC7C,eAAe,CAAC,EAAE,CAAC,IAAI,EAAE,gBAAgB,KAAK,IAAI,CAAC;IACnD,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,wBAAgB,kBAAkB,CAAC,EACjC,YAAY,EACZ,KAAK,EACL,QAAQ,EACR,eAAe,EACf,QAAQ,GACT,EAAE,uBAAuB,2CAiNzB"}
1
+ {"version":3,"file":"feature-create-drawer.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.tsx"],"names":[],"mappings":"AA6BA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,qCAAqC,CAAC;AAU5E,YAAY,EAAE,cAAc,EAAE,MAAM,0DAA0D,CAAC;AAE/F,uFAAuF;AACvF,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,wDAAwD;IACxD,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,0DAA0D;AAC1D,MAAM,WAAW,mBAAmB;IAClC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;CACd;AAED,iEAAiE;AACjE,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,oBAAoB;IACnC,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,cAAc,EAAE,CAAC;IAC9B,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa,EAAE;QACb,QAAQ,EAAE,OAAO,CAAC;QAClB,SAAS,EAAE,OAAO,CAAC;QACnB,UAAU,EAAE,OAAO,CAAC;KACrB,CAAC;IACF,IAAI,EAAE,OAAO,CAAC;IACd,MAAM,EAAE,OAAO,CAAC;IAChB,cAAc,EAAE,OAAO,CAAC;IACxB,cAAc,EAAE,OAAO,CAAC;IACxB,cAAc,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,0EAA0E;IAC1E,IAAI,EAAE,OAAO,CAAC;IACd,yEAAyE;IACzE,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,yDAAyD;IACzD,SAAS,EAAE,OAAO,CAAC;IACnB,uFAAuF;IACvF,WAAW,EAAE,OAAO,CAAC;IACrB,wDAAwD;IACxD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,mDAAmD;IACnD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAyED,MAAM,WAAW,wBAAwB;IACvC,IAAI,EAAE,OAAO,CAAC;IACd,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,QAAQ,EAAE,CAAC,IAAI,EAAE,oBAAoB,KAAK,IAAI,CAAC;IAC/C,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;IACpC,qEAAqE;IACrE,QAAQ,CAAC,EAAE,mBAAmB,EAAE,CAAC;IACjC,+EAA+E;IAC/E,YAAY,CAAC,EAAE,gBAAgB,EAAE,CAAC;IAClC,kGAAkG;IAClG,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,8CAA8C;IAC9C,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,yCAAyC;IACzC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,oEAAoE;IACpE,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,yEAAyE;IACzE,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED,wBAAgB,mBAAmB,CAAC,EAClC,IAAI,EACJ,OAAO,EACP,QAAQ,EACR,cAAc,EACd,YAAoB,EACpB,gBAAgB,EAChB,QAAQ,EACR,YAAY,EACZ,eAAe,EACf,gBAAgB,EAChB,YAAY,EACZ,kBAAkB,EAClB,eAAe,GAChB,EAAE,wBAAwB,2CA47B1B;AAsJD,MAAM,WAAW,uBAAuB;IACtC,YAAY,EAAE,gBAAgB,EAAE,CAAC;IACjC,KAAK,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1B,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,KAAK,IAAI,CAAC;IAC7C,eAAe,CAAC,EAAE,CAAC,IAAI,EAAE,gBAAgB,KAAK,IAAI,CAAC;IACnD,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,wBAAgB,kBAAkB,CAAC,EACjC,YAAY,EACZ,KAAK,EACL,QAAQ,EACR,eAAe,EACf,QAAQ,GACT,EAAE,uBAAuB,2CAkNzB"}