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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (531) hide show
  1. package/apis/json-schema/Language.yaml +13 -0
  2. package/apis/json-schema/UserProfile.yaml +3 -0
  3. package/dist/packages/core/src/domain/generated/output.d.ts +14 -0
  4. package/dist/packages/core/src/domain/generated/output.d.ts.map +1 -1
  5. package/dist/packages/core/src/domain/generated/output.js +11 -0
  6. package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/settings.mapper.d.ts +1 -0
  7. package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/settings.mapper.d.ts.map +1 -1
  8. package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/settings.mapper.js +4 -2
  9. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/049-add-language-preference.d.ts +14 -0
  10. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/049-add-language-preference.d.ts.map +1 -0
  11. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/049-add-language-preference.js +19 -0
  12. package/dist/packages/core/src/infrastructure/repositories/sqlite-settings.repository.d.ts.map +1 -1
  13. package/dist/packages/core/src/infrastructure/repositories/sqlite-settings.repository.js +3 -2
  14. package/dist/src/presentation/cli/commands/_serve.command.d.ts.map +1 -1
  15. package/dist/src/presentation/cli/commands/_serve.command.js +5 -3
  16. package/dist/src/presentation/cli/commands/agent/approve.command.d.ts.map +1 -1
  17. package/dist/src/presentation/cli/commands/agent/approve.command.js +9 -4
  18. package/dist/src/presentation/cli/commands/agent/delete.command.d.ts.map +1 -1
  19. package/dist/src/presentation/cli/commands/agent/delete.command.js +9 -5
  20. package/dist/src/presentation/cli/commands/agent/index.d.ts.map +1 -1
  21. package/dist/src/presentation/cli/commands/agent/index.js +3 -1
  22. package/dist/src/presentation/cli/commands/agent/logs.command.d.ts.map +1 -1
  23. package/dist/src/presentation/cli/commands/agent/logs.command.js +7 -5
  24. package/dist/src/presentation/cli/commands/agent/ls.command.d.ts.map +1 -1
  25. package/dist/src/presentation/cli/commands/agent/ls.command.js +12 -10
  26. package/dist/src/presentation/cli/commands/agent/reject.command.d.ts.map +1 -1
  27. package/dist/src/presentation/cli/commands/agent/reject.command.js +10 -5
  28. package/dist/src/presentation/cli/commands/agent/resolve-run.d.ts.map +1 -1
  29. package/dist/src/presentation/cli/commands/agent/resolve-run.js +7 -2
  30. package/dist/src/presentation/cli/commands/agent/show.command.d.ts.map +1 -1
  31. package/dist/src/presentation/cli/commands/agent/show.command.js +8 -6
  32. package/dist/src/presentation/cli/commands/agent/stop.command.d.ts.map +1 -1
  33. package/dist/src/presentation/cli/commands/agent/stop.command.js +9 -4
  34. package/dist/src/presentation/cli/commands/daemon/start-daemon.d.ts.map +1 -1
  35. package/dist/src/presentation/cli/commands/daemon/start-daemon.js +10 -8
  36. package/dist/src/presentation/cli/commands/daemon/stop-daemon.d.ts.map +1 -1
  37. package/dist/src/presentation/cli/commands/daemon/stop-daemon.js +5 -3
  38. package/dist/src/presentation/cli/commands/feat/adopt.command.d.ts.map +1 -1
  39. package/dist/src/presentation/cli/commands/feat/adopt.command.js +14 -12
  40. package/dist/src/presentation/cli/commands/feat/approve.command.d.ts.map +1 -1
  41. package/dist/src/presentation/cli/commands/feat/approve.command.js +8 -6
  42. package/dist/src/presentation/cli/commands/feat/archive.command.d.ts.map +1 -1
  43. package/dist/src/presentation/cli/commands/feat/archive.command.js +10 -8
  44. package/dist/src/presentation/cli/commands/feat/del.command.d.ts.map +1 -1
  45. package/dist/src/presentation/cli/commands/feat/del.command.js +17 -15
  46. package/dist/src/presentation/cli/commands/feat/index.d.ts.map +1 -1
  47. package/dist/src/presentation/cli/commands/feat/index.js +2 -1
  48. package/dist/src/presentation/cli/commands/feat/logs.command.d.ts.map +1 -1
  49. package/dist/src/presentation/cli/commands/feat/logs.command.js +8 -6
  50. package/dist/src/presentation/cli/commands/feat/ls.command.d.ts.map +1 -1
  51. package/dist/src/presentation/cli/commands/feat/ls.command.js +14 -12
  52. package/dist/src/presentation/cli/commands/feat/new.command.d.ts.map +1 -1
  53. package/dist/src/presentation/cli/commands/feat/new.command.js +43 -37
  54. package/dist/src/presentation/cli/commands/feat/reject.command.d.ts.map +1 -1
  55. package/dist/src/presentation/cli/commands/feat/reject.command.js +11 -9
  56. package/dist/src/presentation/cli/commands/feat/resolve-waiting-feature.d.ts.map +1 -1
  57. package/dist/src/presentation/cli/commands/feat/resolve-waiting-feature.js +12 -5
  58. package/dist/src/presentation/cli/commands/feat/resume.command.d.ts.map +1 -1
  59. package/dist/src/presentation/cli/commands/feat/resume.command.js +8 -6
  60. package/dist/src/presentation/cli/commands/feat/review.command.d.ts.map +1 -1
  61. package/dist/src/presentation/cli/commands/feat/review.command.js +17 -15
  62. package/dist/src/presentation/cli/commands/feat/show.command.d.ts.map +1 -1
  63. package/dist/src/presentation/cli/commands/feat/show.command.js +89 -45
  64. package/dist/src/presentation/cli/commands/feat/start.command.d.ts.map +1 -1
  65. package/dist/src/presentation/cli/commands/feat/start.command.js +12 -10
  66. package/dist/src/presentation/cli/commands/feat/unarchive.command.d.ts.map +1 -1
  67. package/dist/src/presentation/cli/commands/feat/unarchive.command.js +8 -6
  68. package/dist/src/presentation/cli/commands/ide-open.command.d.ts.map +1 -1
  69. package/dist/src/presentation/cli/commands/ide-open.command.js +10 -5
  70. package/dist/src/presentation/cli/commands/install.command.d.ts.map +1 -1
  71. package/dist/src/presentation/cli/commands/install.command.js +29 -21
  72. package/dist/src/presentation/cli/commands/log-viewer.d.ts.map +1 -1
  73. package/dist/src/presentation/cli/commands/log-viewer.js +6 -3
  74. package/dist/src/presentation/cli/commands/repo/add.command.d.ts.map +1 -1
  75. package/dist/src/presentation/cli/commands/repo/add.command.js +12 -10
  76. package/dist/src/presentation/cli/commands/repo/index.d.ts.map +1 -1
  77. package/dist/src/presentation/cli/commands/repo/index.js +3 -1
  78. package/dist/src/presentation/cli/commands/repo/ls.command.d.ts.map +1 -1
  79. package/dist/src/presentation/cli/commands/repo/ls.command.js +11 -9
  80. package/dist/src/presentation/cli/commands/repo/resolve-repository.d.ts.map +1 -1
  81. package/dist/src/presentation/cli/commands/repo/resolve-repository.js +7 -2
  82. package/dist/src/presentation/cli/commands/repo/show.command.d.ts.map +1 -1
  83. package/dist/src/presentation/cli/commands/repo/show.command.js +21 -10
  84. package/dist/src/presentation/cli/commands/restart.command.d.ts.map +1 -1
  85. package/dist/src/presentation/cli/commands/restart.command.js +6 -4
  86. package/dist/src/presentation/cli/commands/run.command.d.ts.map +1 -1
  87. package/dist/src/presentation/cli/commands/run.command.js +21 -17
  88. package/dist/src/presentation/cli/commands/session/index.d.ts.map +1 -1
  89. package/dist/src/presentation/cli/commands/session/index.js +3 -1
  90. package/dist/src/presentation/cli/commands/session/ls.command.d.ts.map +1 -1
  91. package/dist/src/presentation/cli/commands/session/ls.command.js +11 -9
  92. package/dist/src/presentation/cli/commands/session/show.command.d.ts.map +1 -1
  93. package/dist/src/presentation/cli/commands/session/show.command.js +26 -18
  94. package/dist/src/presentation/cli/commands/settings/agent.command.d.ts.map +1 -1
  95. package/dist/src/presentation/cli/commands/settings/agent.command.js +12 -8
  96. package/dist/src/presentation/cli/commands/settings/ide.command.d.ts.map +1 -1
  97. package/dist/src/presentation/cli/commands/settings/ide.command.js +13 -7
  98. package/dist/src/presentation/cli/commands/settings/index.d.ts +1 -0
  99. package/dist/src/presentation/cli/commands/settings/index.d.ts.map +1 -1
  100. package/dist/src/presentation/cli/commands/settings/index.js +7 -3
  101. package/dist/src/presentation/cli/commands/settings/init.command.d.ts.map +1 -1
  102. package/dist/src/presentation/cli/commands/settings/init.command.js +8 -7
  103. package/dist/src/presentation/cli/commands/settings/language.command.d.ts +14 -0
  104. package/dist/src/presentation/cli/commands/settings/language.command.d.ts.map +1 -0
  105. package/dist/src/presentation/cli/commands/settings/language.command.js +79 -0
  106. package/dist/src/presentation/cli/commands/settings/model.command.d.ts.map +1 -1
  107. package/dist/src/presentation/cli/commands/settings/model.command.js +7 -6
  108. package/dist/src/presentation/cli/commands/settings/show.command.d.ts.map +1 -1
  109. package/dist/src/presentation/cli/commands/settings/show.command.js +4 -3
  110. package/dist/src/presentation/cli/commands/settings/workflow.command.d.ts.map +1 -1
  111. package/dist/src/presentation/cli/commands/settings/workflow.command.js +20 -18
  112. package/dist/src/presentation/cli/commands/start.command.d.ts.map +1 -1
  113. package/dist/src/presentation/cli/commands/start.command.js +5 -3
  114. package/dist/src/presentation/cli/commands/status.command.d.ts.map +1 -1
  115. package/dist/src/presentation/cli/commands/status.command.js +32 -24
  116. package/dist/src/presentation/cli/commands/stop.command.d.ts.map +1 -1
  117. package/dist/src/presentation/cli/commands/stop.command.js +4 -2
  118. package/dist/src/presentation/cli/commands/tools.command.d.ts.map +1 -1
  119. package/dist/src/presentation/cli/commands/tools.command.js +8 -4
  120. package/dist/src/presentation/cli/commands/ui.command.d.ts.map +1 -1
  121. package/dist/src/presentation/cli/commands/ui.command.js +12 -10
  122. package/dist/src/presentation/cli/commands/upgrade.command.d.ts.map +1 -1
  123. package/dist/src/presentation/cli/commands/upgrade.command.js +18 -13
  124. package/dist/src/presentation/cli/commands/version.command.d.ts.map +1 -1
  125. package/dist/src/presentation/cli/commands/version.command.js +5 -3
  126. package/dist/src/presentation/cli/i18n.d.ts +41 -0
  127. package/dist/src/presentation/cli/i18n.d.ts.map +1 -0
  128. package/dist/src/presentation/cli/i18n.js +100 -0
  129. package/dist/src/presentation/cli/index.js +13 -1
  130. package/dist/src/presentation/cli/ui/install-messages.d.ts.map +1 -1
  131. package/dist/src/presentation/cli/ui/install-messages.js +16 -6
  132. package/dist/src/presentation/tui/i18n.d.ts +24 -0
  133. package/dist/src/presentation/tui/i18n.d.ts.map +1 -0
  134. package/dist/src/presentation/tui/i18n.js +48 -0
  135. package/dist/src/presentation/tui/prompts/agent-select.prompt.d.ts +13 -31
  136. package/dist/src/presentation/tui/prompts/agent-select.prompt.d.ts.map +1 -1
  137. package/dist/src/presentation/tui/prompts/agent-select.prompt.js +17 -15
  138. package/dist/src/presentation/tui/prompts/auth-method.prompt.d.ts +7 -11
  139. package/dist/src/presentation/tui/prompts/auth-method.prompt.d.ts.map +1 -1
  140. package/dist/src/presentation/tui/prompts/auth-method.prompt.js +7 -5
  141. package/dist/src/presentation/tui/prompts/ide-select.prompt.d.ts.map +1 -1
  142. package/dist/src/presentation/tui/prompts/ide-select.prompt.js +2 -1
  143. package/dist/src/presentation/tui/prompts/prd-review-summary.prompt.d.ts.map +1 -1
  144. package/dist/src/presentation/tui/prompts/prd-review-summary.prompt.js +8 -6
  145. package/dist/src/presentation/tui/wizards/agent-config.wizard.d.ts.map +1 -1
  146. package/dist/src/presentation/tui/wizards/agent-config.wizard.js +2 -1
  147. package/dist/src/presentation/tui/wizards/github-import.wizard.d.ts.map +1 -1
  148. package/dist/src/presentation/tui/wizards/github-import.wizard.js +15 -11
  149. package/dist/src/presentation/tui/wizards/merge-review.wizard.d.ts.map +1 -1
  150. package/dist/src/presentation/tui/wizards/merge-review.wizard.js +10 -8
  151. package/dist/src/presentation/tui/wizards/onboarding/onboarding.wizard.d.ts.map +1 -1
  152. package/dist/src/presentation/tui/wizards/onboarding/onboarding.wizard.js +10 -7
  153. package/dist/src/presentation/tui/wizards/onboarding/steps/workflow-defaults.step.d.ts +0 -41
  154. package/dist/src/presentation/tui/wizards/onboarding/steps/workflow-defaults.step.d.ts.map +1 -1
  155. package/dist/src/presentation/tui/wizards/onboarding/steps/workflow-defaults.step.js +15 -15
  156. package/dist/src/presentation/tui/wizards/plan-review.wizard.d.ts.map +1 -1
  157. package/dist/src/presentation/tui/wizards/plan-review.wizard.js +10 -8
  158. package/dist/src/presentation/tui/wizards/prd-review.wizard.d.ts.map +1 -1
  159. package/dist/src/presentation/tui/wizards/prd-review.wizard.js +3 -2
  160. package/dist/src/presentation/web/app/layout.d.ts.map +1 -1
  161. package/dist/src/presentation/web/app/layout.js +5 -2
  162. package/dist/src/presentation/web/components/assistant-ui/thread.js +5 -5
  163. package/dist/src/presentation/web/components/common/attachment-chip/attachment-chip.js +1 -1
  164. package/dist/src/presentation/web/components/common/base-drawer/base-drawer.js +1 -1
  165. package/dist/src/presentation/web/components/common/ci-status-badge/ci-status-badge.js +3 -3
  166. package/dist/src/presentation/web/components/common/control-center-drawer/adopt-branch-drawer.js +4 -4
  167. package/dist/src/presentation/web/components/common/control-center-drawer/repository-drawer-client.js +1 -1
  168. package/dist/src/presentation/web/components/common/delete-feature-dialog/delete-feature-dialog.d.ts.map +1 -1
  169. package/dist/src/presentation/web/components/common/delete-feature-dialog/delete-feature-dialog.js +3 -1
  170. package/dist/src/presentation/web/components/common/deployment-status-badge/deployment-status-badge.js +2 -2
  171. package/dist/src/presentation/web/components/common/drawer-action-bar/drawer-action-bar.js +2 -2
  172. package/dist/src/presentation/web/components/common/empty-state/empty-state.stories.js +2 -2
  173. package/dist/src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.js +2 -2
  174. package/dist/src/presentation/web/components/common/feature-drawer-tabs/activity-tab.js +4 -4
  175. package/dist/src/presentation/web/components/common/feature-drawer-tabs/branch-sync-status.js +1 -1
  176. package/dist/src/presentation/web/components/common/feature-drawer-tabs/feature-drawer-tabs.js +1 -1
  177. package/dist/src/presentation/web/components/common/feature-drawer-tabs/log-tab.js +1 -1
  178. package/dist/src/presentation/web/components/common/feature-drawer-tabs/overview-tab.js +1 -1
  179. package/dist/src/presentation/web/components/common/feature-list-item/feature-list-item.js +1 -1
  180. package/dist/src/presentation/web/components/common/feature-node/feature-node-state-config.d.ts +2 -2
  181. package/dist/src/presentation/web/components/common/feature-node/feature-node-state-config.d.ts.map +1 -1
  182. package/dist/src/presentation/web/components/common/feature-node/feature-node-state-config.js +22 -22
  183. package/dist/src/presentation/web/components/common/feature-node/feature-node.js +4 -4
  184. package/dist/src/presentation/web/components/common/feature-node/feature-sessions-dropdown.js +1 -1
  185. package/dist/src/presentation/web/components/common/feature-status-group/feature-status-group.js +1 -1
  186. package/dist/src/presentation/web/components/common/github-import-dialog/github-repo-browser.js +1 -1
  187. package/dist/src/presentation/web/components/common/merge-review/diff-view.js +2 -2
  188. package/dist/src/presentation/web/components/common/merge-review/merge-review.js +2 -2
  189. package/dist/src/presentation/web/components/common/prd-questionnaire/prd-questionnaire.js +3 -3
  190. package/dist/src/presentation/web/components/common/reject-feedback-dialog/reject-feedback-dialog.d.ts.map +1 -1
  191. package/dist/src/presentation/web/components/common/reject-feedback-dialog/reject-feedback-dialog.js +6 -4
  192. package/dist/src/presentation/web/components/common/repository-node/repository-node.js +3 -3
  193. package/dist/src/presentation/web/components/common/server-log-viewer/server-log-viewer.js +1 -1
  194. package/dist/src/presentation/web/components/common/task-progress-view/task-progress-view.js +2 -2
  195. package/dist/src/presentation/web/components/common/tech-decisions-review/tech-decisions-review.js +2 -2
  196. package/dist/src/presentation/web/components/common/version-badge/version-badge.js +1 -1
  197. package/dist/src/presentation/web/components/features/chat/ChatMessageBubble.js +4 -4
  198. package/dist/src/presentation/web/components/features/chat/ChatMessageList.js +1 -1
  199. package/dist/src/presentation/web/components/features/chat/ChatTab.js +1 -1
  200. package/dist/src/presentation/web/components/features/control-center/control-center-empty-state.d.ts.map +1 -1
  201. package/dist/src/presentation/web/components/features/control-center/control-center-empty-state.js +15 -11
  202. package/dist/src/presentation/web/components/features/control-center/welcome-agent-setup.d.ts.map +1 -1
  203. package/dist/src/presentation/web/components/features/control-center/welcome-agent-setup.js +8 -6
  204. package/dist/src/presentation/web/components/features/features-canvas/canvas-toolbar.d.ts.map +1 -1
  205. package/dist/src/presentation/web/components/features/features-canvas/canvas-toolbar.js +3 -1
  206. package/dist/src/presentation/web/components/features/features-canvas/features-canvas.d.ts.map +1 -1
  207. package/dist/src/presentation/web/components/features/features-canvas/features-canvas.js +4 -2
  208. package/dist/src/presentation/web/components/features/settings/AgentModelPicker/index.js +2 -2
  209. package/dist/src/presentation/web/components/features/settings/ModelPicker/index.js +2 -2
  210. package/dist/src/presentation/web/components/features/settings/agent-settings-section.js +1 -1
  211. package/dist/src/presentation/web/components/features/settings/language-settings-section.d.ts +5 -0
  212. package/dist/src/presentation/web/components/features/settings/language-settings-section.d.ts.map +1 -0
  213. package/dist/src/presentation/web/components/features/settings/language-settings-section.js +54 -0
  214. package/dist/src/presentation/web/components/features/settings/language-settings-section.stories.d.ts +18 -0
  215. package/dist/src/presentation/web/components/features/settings/language-settings-section.stories.d.ts.map +1 -0
  216. package/dist/src/presentation/web/components/features/settings/language-settings-section.stories.js +36 -0
  217. package/dist/src/presentation/web/components/features/settings/settings-page-client.d.ts.map +1 -1
  218. package/dist/src/presentation/web/components/features/settings/settings-page-client.js +89 -77
  219. package/dist/src/presentation/web/components/features/settings/timeout-slider.js +1 -1
  220. package/dist/src/presentation/web/components/features/skills/category-filter.js +1 -1
  221. package/dist/src/presentation/web/components/features/skills/skills-page-client.js +1 -1
  222. package/dist/src/presentation/web/components/features/tools/tool-card.js +1 -1
  223. package/dist/src/presentation/web/components/features/tools/tool-detail-drawer.js +2 -2
  224. package/dist/src/presentation/web/components/layouts/app-sidebar/app-sidebar.d.ts.map +1 -1
  225. package/dist/src/presentation/web/components/layouts/app-sidebar/app-sidebar.js +10 -4
  226. package/dist/src/presentation/web/components/providers/i18n-provider.d.ts +17 -0
  227. package/dist/src/presentation/web/components/providers/i18n-provider.d.ts.map +1 -0
  228. package/dist/src/presentation/web/components/providers/i18n-provider.js +36 -0
  229. package/dist/src/presentation/web/components/ui/alert-dialog.js +1 -1
  230. package/dist/src/presentation/web/components/ui/alert.js +1 -1
  231. package/dist/src/presentation/web/components/ui/checkbox-group.js +1 -1
  232. package/dist/src/presentation/web/components/ui/command.js +1 -1
  233. package/dist/src/presentation/web/components/ui/dialog.d.ts.map +1 -1
  234. package/dist/src/presentation/web/components/ui/dialog.js +2 -2
  235. package/dist/src/presentation/web/components/ui/dialog.stories.js +1 -1
  236. package/dist/src/presentation/web/components/ui/drawer.js +1 -1
  237. package/dist/src/presentation/web/components/ui/dropdown-menu.js +6 -6
  238. package/dist/src/presentation/web/components/ui/scroll-area.js +1 -1
  239. package/dist/src/presentation/web/components/ui/select.js +1 -1
  240. package/dist/src/presentation/web/components/ui/sheet.js +1 -1
  241. package/dist/src/presentation/web/components/ui/sidebar.js +6 -6
  242. package/dist/src/presentation/web/hooks/use-sound-action.stories.js +1 -1
  243. package/dist/src/presentation/web/lib/i18n.d.ts +15 -0
  244. package/dist/src/presentation/web/lib/i18n.d.ts.map +1 -0
  245. package/dist/src/presentation/web/lib/i18n.js +46 -0
  246. package/dist/src/presentation/web/lib/language.d.ts +23 -0
  247. package/dist/src/presentation/web/lib/language.d.ts.map +1 -0
  248. package/dist/src/presentation/web/lib/language.js +37 -0
  249. package/dist/src/presentation/web/lib/rtl-fonts.d.ts +19 -0
  250. package/dist/src/presentation/web/lib/rtl-fonts.d.ts.map +1 -0
  251. package/dist/src/presentation/web/lib/rtl-fonts.js +51 -0
  252. package/dist/translations/ar/cli.json +613 -0
  253. package/dist/translations/ar/common.json +55 -0
  254. package/dist/translations/ar/tui.json +130 -0
  255. package/dist/translations/ar/web.json +320 -0
  256. package/dist/translations/de/cli.json +613 -0
  257. package/dist/translations/de/common.json +55 -0
  258. package/dist/translations/de/tui.json +109 -0
  259. package/dist/translations/de/web.json +306 -0
  260. package/dist/translations/en/cli.json +613 -0
  261. package/dist/translations/en/common.json +55 -0
  262. package/dist/translations/en/tui.json +130 -0
  263. package/dist/translations/en/web.json +320 -0
  264. package/dist/translations/es/cli.json +613 -0
  265. package/dist/translations/es/common.json +55 -0
  266. package/dist/translations/es/tui.json +130 -0
  267. package/dist/translations/es/web.json +320 -0
  268. package/dist/translations/fr/cli.json +613 -0
  269. package/dist/translations/fr/common.json +55 -0
  270. package/dist/translations/fr/tui.json +130 -0
  271. package/dist/translations/fr/web.json +320 -0
  272. package/dist/translations/he/cli.json +613 -0
  273. package/dist/translations/he/common.json +55 -0
  274. package/dist/translations/he/tui.json +130 -0
  275. package/dist/translations/he/web.json +320 -0
  276. package/dist/translations/pt/cli.json +613 -0
  277. package/dist/translations/pt/common.json +55 -0
  278. package/dist/translations/pt/tui.json +130 -0
  279. package/dist/translations/pt/web.json +320 -0
  280. package/dist/translations/ru/cli.json +613 -0
  281. package/dist/translations/ru/common.json +55 -0
  282. package/dist/translations/ru/tui.json +130 -0
  283. package/dist/translations/ru/web.json +320 -0
  284. package/dist/tsconfig.build.tsbuildinfo +1 -1
  285. package/package.json +4 -2
  286. package/web/.next/BUILD_ID +1 -1
  287. package/web/.next/build-manifest.json +2 -2
  288. package/web/.next/fallback-build-manifest.json +2 -2
  289. package/web/.next/prerender-manifest.json +3 -3
  290. package/web/.next/required-server-files.js +1 -1
  291. package/web/.next/required-server-files.json +1 -1
  292. package/web/.next/server/app/(dashboard)/@drawer/adopt/page/server-reference-manifest.json +28 -28
  293. package/web/.next/server/app/(dashboard)/@drawer/adopt/page.js +3 -3
  294. package/web/.next/server/app/(dashboard)/@drawer/adopt/page.js.nft.json +1 -1
  295. package/web/.next/server/app/(dashboard)/@drawer/adopt/page_client-reference-manifest.js +1 -1
  296. package/web/.next/server/app/(dashboard)/@drawer/chat/page/server-reference-manifest.json +26 -26
  297. package/web/.next/server/app/(dashboard)/@drawer/chat/page.js +3 -3
  298. package/web/.next/server/app/(dashboard)/@drawer/chat/page.js.nft.json +1 -1
  299. package/web/.next/server/app/(dashboard)/@drawer/chat/page_client-reference-manifest.js +1 -1
  300. package/web/.next/server/app/(dashboard)/@drawer/create/page/server-reference-manifest.json +29 -29
  301. package/web/.next/server/app/(dashboard)/@drawer/create/page.js +3 -3
  302. package/web/.next/server/app/(dashboard)/@drawer/create/page.js.nft.json +1 -1
  303. package/web/.next/server/app/(dashboard)/@drawer/create/page_client-reference-manifest.js +1 -1
  304. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page/server-reference-manifest.json +36 -36
  305. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page.js +4 -4
  306. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page.js.nft.json +1 -1
  307. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page_client-reference-manifest.js +1 -1
  308. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page/server-reference-manifest.json +36 -36
  309. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js +4 -4
  310. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js.nft.json +1 -1
  311. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page_client-reference-manifest.js +1 -1
  312. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/[tab]/page/server-reference-manifest.json +26 -26
  313. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/[tab]/page.js +3 -3
  314. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/[tab]/page.js.nft.json +1 -1
  315. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/[tab]/page_client-reference-manifest.js +1 -1
  316. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page/server-reference-manifest.json +26 -26
  317. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js +3 -3
  318. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js.nft.json +1 -1
  319. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  320. package/web/.next/server/app/(dashboard)/chat/page/server-reference-manifest.json +26 -26
  321. package/web/.next/server/app/(dashboard)/chat/page.js +3 -3
  322. package/web/.next/server/app/(dashboard)/chat/page.js.nft.json +1 -1
  323. package/web/.next/server/app/(dashboard)/chat/page_client-reference-manifest.js +1 -1
  324. package/web/.next/server/app/(dashboard)/create/page/server-reference-manifest.json +29 -29
  325. package/web/.next/server/app/(dashboard)/create/page.js +3 -3
  326. package/web/.next/server/app/(dashboard)/create/page.js.nft.json +1 -1
  327. package/web/.next/server/app/(dashboard)/create/page_client-reference-manifest.js +1 -1
  328. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page/server-reference-manifest.json +36 -36
  329. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page.js +4 -4
  330. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page.js.nft.json +1 -1
  331. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page_client-reference-manifest.js +1 -1
  332. package/web/.next/server/app/(dashboard)/feature/[featureId]/page/server-reference-manifest.json +36 -36
  333. package/web/.next/server/app/(dashboard)/feature/[featureId]/page.js +4 -4
  334. package/web/.next/server/app/(dashboard)/feature/[featureId]/page.js.nft.json +1 -1
  335. package/web/.next/server/app/(dashboard)/feature/[featureId]/page_client-reference-manifest.js +1 -1
  336. package/web/.next/server/app/(dashboard)/page/server-reference-manifest.json +26 -26
  337. package/web/.next/server/app/(dashboard)/page.js +3 -3
  338. package/web/.next/server/app/(dashboard)/page.js.nft.json +1 -1
  339. package/web/.next/server/app/(dashboard)/page_client-reference-manifest.js +1 -1
  340. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/[tab]/page/server-reference-manifest.json +26 -26
  341. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/[tab]/page.js +3 -3
  342. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/[tab]/page.js.nft.json +1 -1
  343. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/[tab]/page_client-reference-manifest.js +1 -1
  344. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page/server-reference-manifest.json +26 -26
  345. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js +3 -3
  346. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js.nft.json +1 -1
  347. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  348. package/web/.next/server/app/_global-error.html +2 -2
  349. package/web/.next/server/app/_global-error.rsc +1 -1
  350. package/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  351. package/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  352. package/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  353. package/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  354. package/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  355. package/web/.next/server/app/_not-found/page/server-reference-manifest.json +5 -5
  356. package/web/.next/server/app/_not-found/page.js +2 -2
  357. package/web/.next/server/app/_not-found/page.js.nft.json +1 -1
  358. package/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  359. package/web/.next/server/app/api/attachments/preview/route.js.nft.json +1 -1
  360. package/web/.next/server/app/api/evidence/route.js.nft.json +1 -1
  361. package/web/.next/server/app/api/graph-data/route.js.nft.json +1 -1
  362. package/web/.next/server/app/api/interactive/chat/[featureId]/messages/route.js.nft.json +1 -1
  363. package/web/.next/server/app/settings/page/server-reference-manifest.json +8 -8
  364. package/web/.next/server/app/settings/page.js +2 -2
  365. package/web/.next/server/app/settings/page.js.nft.json +1 -1
  366. package/web/.next/server/app/settings/page_client-reference-manifest.js +1 -1
  367. package/web/.next/server/app/skills/page/server-reference-manifest.json +10 -10
  368. package/web/.next/server/app/skills/page.js +3 -4
  369. package/web/.next/server/app/skills/page.js.nft.json +1 -1
  370. package/web/.next/server/app/skills/page_client-reference-manifest.js +1 -1
  371. package/web/.next/server/app/tools/page/server-reference-manifest.json +10 -10
  372. package/web/.next/server/app/tools/page.js +3 -4
  373. package/web/.next/server/app/tools/page.js.nft.json +1 -1
  374. package/web/.next/server/app/tools/page_client-reference-manifest.js +1 -1
  375. package/web/.next/server/app/version/page/server-reference-manifest.json +5 -5
  376. package/web/.next/server/app/version/page.js +2 -2
  377. package/web/.next/server/app/version/page.js.nft.json +1 -1
  378. package/web/.next/server/app/version/page_client-reference-manifest.js +1 -1
  379. package/web/.next/server/chunks/[root-of-the-server]__a402b567._.js +1 -1
  380. package/web/.next/server/chunks/[root-of-the-server]__beda892a._.js +1 -1
  381. package/web/.next/server/chunks/[root-of-the-server]__beda892a._.js.map +1 -1
  382. package/web/.next/server/chunks/[root-of-the-server]__cd67a84c._.js +1 -1
  383. package/web/.next/server/chunks/[root-of-the-server]__cd67a84c._.js.map +1 -1
  384. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js +1 -1
  385. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js.map +1 -1
  386. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_feature-drawer-client_tsx_e9755fc8._.js +2 -2
  387. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_feature-drawer-client_tsx_e9755fc8._.js.map +1 -1
  388. package/web/.next/server/chunks/ssr/{[root-of-the-server]__88f7e8e6._.js → [root-of-the-server]__209c9597._.js} +2 -2
  389. package/web/.next/server/chunks/ssr/{[root-of-the-server]__88f7e8e6._.js.map → [root-of-the-server]__209c9597._.js.map} +1 -1
  390. package/web/.next/server/chunks/ssr/{[root-of-the-server]__f8dd4422._.js → [root-of-the-server]__25ee8d4c._.js} +2 -2
  391. package/web/.next/server/chunks/ssr/[root-of-the-server]__25ee8d4c._.js.map +1 -0
  392. package/web/.next/server/chunks/ssr/{[root-of-the-server]__17ed7ed1._.js → [root-of-the-server]__27301e38._.js} +2 -2
  393. package/web/.next/server/chunks/ssr/{[root-of-the-server]__17ed7ed1._.js.map → [root-of-the-server]__27301e38._.js.map} +1 -1
  394. package/web/.next/server/chunks/ssr/[root-of-the-server]__357d99f9._.js +1 -1
  395. package/web/.next/server/chunks/ssr/[root-of-the-server]__56b70465._.js +1 -1
  396. package/web/.next/server/chunks/ssr/[root-of-the-server]__56b70465._.js.map +1 -1
  397. package/web/.next/server/chunks/ssr/{[root-of-the-server]__42bf1807._.js → [root-of-the-server]__6fecf886._.js} +2 -2
  398. package/web/.next/server/chunks/ssr/{[root-of-the-server]__42bf1807._.js.map → [root-of-the-server]__6fecf886._.js.map} +1 -1
  399. package/web/.next/server/chunks/ssr/[root-of-the-server]__8b0aac03._.js +1 -1
  400. package/web/.next/server/chunks/ssr/{[root-of-the-server]__28d0d265._.js → [root-of-the-server]__8d27866c._.js} +3 -3
  401. package/web/.next/server/chunks/ssr/[root-of-the-server]__8d27866c._.js.map +1 -0
  402. package/web/.next/server/chunks/ssr/{[root-of-the-server]__f80bfc75._.js → [root-of-the-server]__9f3504c7._.js} +2 -2
  403. package/web/.next/server/chunks/ssr/{[root-of-the-server]__f80bfc75._.js.map → [root-of-the-server]__9f3504c7._.js.map} +1 -1
  404. package/web/.next/server/chunks/ssr/[root-of-the-server]__bd6ed91a._.js +4 -0
  405. package/web/.next/server/chunks/ssr/[root-of-the-server]__bd6ed91a._.js.map +1 -0
  406. package/web/.next/server/chunks/ssr/[root-of-the-server]__c30f1f82._.js +1 -1
  407. package/web/.next/server/chunks/ssr/[root-of-the-server]__c30f1f82._.js.map +1 -1
  408. package/web/.next/server/chunks/ssr/[root-of-the-server]__dffa13c5._.js +3 -0
  409. package/web/.next/server/chunks/ssr/[root-of-the-server]__dffa13c5._.js.map +1 -0
  410. package/web/.next/server/chunks/ssr/[root-of-the-server]__e91ffd5e._.js +2 -2
  411. package/web/.next/server/chunks/ssr/[root-of-the-server]__e91ffd5e._.js.map +1 -1
  412. package/web/.next/server/chunks/ssr/_05c23ad9._.js +1 -1
  413. package/web/.next/server/chunks/ssr/_05c23ad9._.js.map +1 -1
  414. package/web/.next/server/chunks/ssr/_0cd9ca53._.js +3 -0
  415. package/web/.next/server/chunks/ssr/_0cd9ca53._.js.map +1 -0
  416. package/web/.next/server/chunks/ssr/_16eb4fec._.js +1 -1
  417. package/web/.next/server/chunks/ssr/_16eb4fec._.js.map +1 -1
  418. package/web/.next/server/chunks/ssr/{_08f3fd21._.js → _28e7429c._.js} +2 -2
  419. package/web/.next/server/chunks/ssr/{_08f3fd21._.js.map → _28e7429c._.js.map} +1 -1
  420. package/web/.next/server/chunks/ssr/_3a0b989f._.js +2 -2
  421. package/web/.next/server/chunks/ssr/_3a0b989f._.js.map +1 -1
  422. package/web/.next/server/chunks/ssr/{_67104d9e._.js → _3bcda5d7._.js} +2 -2
  423. package/web/.next/server/chunks/ssr/{_67104d9e._.js.map → _3bcda5d7._.js.map} +1 -1
  424. package/web/.next/server/chunks/ssr/_470e90f4._.js +9 -0
  425. package/web/.next/server/chunks/ssr/_470e90f4._.js.map +1 -0
  426. package/web/.next/server/chunks/ssr/_56b9d60f._.js +1 -1
  427. package/web/.next/server/chunks/ssr/_56b9d60f._.js.map +1 -1
  428. package/web/.next/server/chunks/ssr/_5bfcc8de._.js +4 -0
  429. package/web/.next/server/chunks/ssr/_5bfcc8de._.js.map +1 -0
  430. package/web/.next/server/chunks/ssr/_5f69c13f._.js +1 -1
  431. package/web/.next/server/chunks/ssr/_5f69c13f._.js.map +1 -1
  432. package/web/.next/server/chunks/ssr/{_d957c7f8._.js → _7773b2dc._.js} +2 -2
  433. package/web/.next/server/chunks/ssr/{_d957c7f8._.js.map → _7773b2dc._.js.map} +1 -1
  434. package/web/.next/server/chunks/ssr/_7c5b97c6._.js +1 -1
  435. package/web/.next/server/chunks/ssr/_7c5b97c6._.js.map +1 -1
  436. package/web/.next/server/chunks/ssr/_82c57f10._.js +1 -1
  437. package/web/.next/server/chunks/ssr/_82c57f10._.js.map +1 -1
  438. package/web/.next/server/chunks/ssr/_8b57edb8._.js +1 -1
  439. package/web/.next/server/chunks/ssr/_8b57edb8._.js.map +1 -1
  440. package/web/.next/server/chunks/ssr/_9495d50b._.js +1 -1
  441. package/web/.next/server/chunks/ssr/_9495d50b._.js.map +1 -1
  442. package/web/.next/server/chunks/ssr/_a0e3f7e4._.js +1 -1
  443. package/web/.next/server/chunks/ssr/_a0e3f7e4._.js.map +1 -1
  444. package/web/.next/server/chunks/ssr/_ac4a3873._.js +1 -1
  445. package/web/.next/server/chunks/ssr/_ac4a3873._.js.map +1 -1
  446. package/web/.next/server/chunks/ssr/{_507a8382._.js → _b9ba2473._.js} +2 -2
  447. package/web/.next/server/chunks/ssr/_b9ba2473._.js.map +1 -0
  448. package/web/.next/server/chunks/ssr/_ca0aa7f0._.js +1 -1
  449. package/web/.next/server/chunks/ssr/_ca0aa7f0._.js.map +1 -1
  450. package/web/.next/server/chunks/ssr/_cb5a021e._.js +1 -1
  451. package/web/.next/server/chunks/ssr/_cb5a021e._.js.map +1 -1
  452. package/web/.next/server/chunks/ssr/_cfbd1d7e._.js +1 -1
  453. package/web/.next/server/chunks/ssr/_cfbd1d7e._.js.map +1 -1
  454. package/web/.next/server/chunks/ssr/_d4b20e29._.js +1 -1
  455. package/web/.next/server/chunks/ssr/_d4b20e29._.js.map +1 -1
  456. package/web/.next/server/chunks/ssr/_d86175ae._.js +1 -1
  457. package/web/.next/server/chunks/ssr/_d86175ae._.js.map +1 -1
  458. package/web/.next/server/chunks/ssr/_d8bedf13._.js +1 -1
  459. package/web/.next/server/chunks/ssr/_d8bedf13._.js.map +1 -1
  460. package/web/.next/server/chunks/ssr/_d90b0a06._.js +3 -0
  461. package/web/.next/server/chunks/ssr/_d90b0a06._.js.map +1 -0
  462. package/web/.next/server/chunks/ssr/_fa7efce3._.js +2 -2
  463. package/web/.next/server/chunks/ssr/_fa7efce3._.js.map +1 -1
  464. package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_settings_settings-page-client_tsx_6ed9d5f8._.js +1 -1
  465. package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_settings_settings-page-client_tsx_6ed9d5f8._.js.map +1 -1
  466. package/web/.next/server/chunks/ssr/node_modules__pnpm_55cf6695._.js +3 -0
  467. package/web/.next/server/chunks/ssr/node_modules__pnpm_55cf6695._.js.map +1 -0
  468. package/web/.next/server/chunks/ssr/src_presentation_web_324a47da._.js +1 -1
  469. package/web/.next/server/chunks/ssr/src_presentation_web_324a47da._.js.map +1 -1
  470. package/web/.next/server/chunks/ssr/src_presentation_web_app_actions_open-ide_ts_baaca5d5._.js +1 -1
  471. package/web/.next/server/chunks/ssr/src_presentation_web_components_895e5bfa._.js +3 -0
  472. package/web/.next/server/chunks/ssr/src_presentation_web_components_895e5bfa._.js.map +1 -0
  473. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js +1 -1
  474. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js.map +1 -1
  475. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_tools_tools-page-client_tsx_3d0aa70c._.js +1 -1
  476. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_tools_tools-page-client_tsx_3d0aa70c._.js.map +1 -1
  477. package/web/.next/server/chunks/ssr/src_presentation_web_db9fa0c2._.js.map +1 -1
  478. package/web/.next/server/pages/500.html +2 -2
  479. package/web/.next/server/server-reference-manifest.js +1 -1
  480. package/web/.next/server/server-reference-manifest.json +45 -45
  481. package/web/.next/static/chunks/05c9ed792a1d9056.js +1 -0
  482. package/web/.next/static/chunks/{04cb9cede104b5f8.js → 1c07a9270515f2e3.js} +2 -2
  483. package/web/.next/static/chunks/{e3339b33db2768bd.js → 24d5e151f7de6b4c.js} +1 -1
  484. package/web/.next/static/chunks/{b224651a2324c8f7.js → 2aada437f51df3e6.js} +1 -1
  485. package/web/.next/static/chunks/2eeee9bcbf660a4b.js +1 -0
  486. package/web/.next/static/chunks/{688971d5bad5dc7c.js → 3deefc76ea55047c.js} +1 -1
  487. package/web/.next/static/chunks/{11091b676d1b3bd4.js → 47477ed4c5871747.js} +1 -1
  488. package/web/.next/static/chunks/{7bdd3f51e4993fb6.js → 4978be67c4e6498f.js} +3 -3
  489. package/web/.next/static/chunks/4a399ee2a9942a1b.js +1 -0
  490. package/web/.next/static/chunks/{c3a9b33826b0e541.js → 536afd754a63da39.js} +1 -1
  491. package/web/.next/static/chunks/70390bd89521bc19.js +1 -0
  492. package/web/.next/static/chunks/{22c459f1877b1e4f.js → 74db65fa7bfb80bd.js} +1 -1
  493. package/web/.next/static/chunks/8fd082719935d5e6.js +1 -0
  494. package/web/.next/static/chunks/91927044df8e28bb.js +7 -0
  495. package/web/.next/static/chunks/b1b5b0bf84caabd4.js +1 -0
  496. package/web/.next/static/chunks/{e1b6fd86f641261d.js → b674bc11b321a5ee.js} +1 -1
  497. package/web/.next/static/chunks/b68b16b4c3528979.js +2 -0
  498. package/web/.next/static/chunks/{b4cde06eff374c59.js → bfdb66301af07da1.js} +2 -2
  499. package/web/.next/static/chunks/d58e68d03d055a9b.css +1 -0
  500. package/web/.next/static/chunks/{5ae60a052ab5f437.js → d6e702c209c413ce.js} +2 -2
  501. package/web/.next/static/chunks/{4b2c4a5c35ebb70d.js → e4e358c4f67366fd.js} +1 -1
  502. package/web/.next/server/chunks/ssr/[root-of-the-server]__0b150ddf._.js +0 -3
  503. package/web/.next/server/chunks/ssr/[root-of-the-server]__0b150ddf._.js.map +0 -1
  504. package/web/.next/server/chunks/ssr/[root-of-the-server]__28d0d265._.js.map +0 -1
  505. package/web/.next/server/chunks/ssr/[root-of-the-server]__f8dd4422._.js.map +0 -1
  506. package/web/.next/server/chunks/ssr/_4601ff05._.js +0 -4
  507. package/web/.next/server/chunks/ssr/_4601ff05._.js.map +0 -1
  508. package/web/.next/server/chunks/ssr/_4b432739._.js +0 -3
  509. package/web/.next/server/chunks/ssr/_4b432739._.js.map +0 -1
  510. package/web/.next/server/chunks/ssr/_507a8382._.js.map +0 -1
  511. package/web/.next/server/chunks/ssr/_8219712a._.js +0 -3
  512. package/web/.next/server/chunks/ssr/_8219712a._.js.map +0 -1
  513. package/web/.next/server/chunks/ssr/_e9a73a63._.js +0 -9
  514. package/web/.next/server/chunks/ssr/_e9a73a63._.js.map +0 -1
  515. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_skills_page_actions_cdc632e3.js +0 -3
  516. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_skills_page_actions_cdc632e3.js.map +0 -1
  517. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_tools_page_actions_39ca0924.js +0 -3
  518. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_tools_page_actions_39ca0924.js.map +0 -1
  519. package/web/.next/server/chunks/ssr/src_presentation_web_components_357e3eb0._.js +0 -3
  520. package/web/.next/server/chunks/ssr/src_presentation_web_components_357e3eb0._.js.map +0 -1
  521. package/web/.next/static/chunks/190cb2b91443b7a2.js +0 -1
  522. package/web/.next/static/chunks/232221de97ee02ee.js +0 -1
  523. package/web/.next/static/chunks/5ea1d031a4327efd.js +0 -1
  524. package/web/.next/static/chunks/639776981e3c0300.js +0 -7
  525. package/web/.next/static/chunks/6bef26d1ebd38687.js +0 -1
  526. package/web/.next/static/chunks/8590bd2e69b24b9e.css +0 -1
  527. package/web/.next/static/chunks/9207c052206225b2.js +0 -2
  528. package/web/.next/static/chunks/cd54b758f58061d0.js +0 -1
  529. /package/web/.next/static/{SnRLSukTe4qbiJHXHhXVW → Uqo91vsr2HsZrCKrZOYMZ}/_buildManifest.js +0 -0
  530. /package/web/.next/static/{SnRLSukTe4qbiJHXHhXVW → Uqo91vsr2HsZrCKrZOYMZ}/_clientMiddlewareManifest.json +0 -0
  531. /package/web/.next/static/{SnRLSukTe4qbiJHXHhXVW → Uqo91vsr2HsZrCKrZOYMZ}/_ssgManifest.js +0 -0
@@ -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
  }
@@ -23,17 +23,17 @@ const markdownComponents = {
23
23
  }
24
24
  return _jsx(CollapsibleCode, { language: lang, children: children });
25
25
  },
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 }),
26
+ ul: ({ children }) => _jsx("ul", { className: "mb-2 list-disc ps-4 last:mb-0", children: children }),
27
+ ol: ({ children }) => _jsx("ol", { className: "mb-2 list-decimal ps-4 last:mb-0", children: children }),
28
28
  li: ({ children }) => _jsx("li", { className: "mb-0.5", children: children }),
29
29
  h1: ({ children }) => _jsx("h1", { className: "mb-1 text-base font-bold", children: children }),
30
30
  h2: ({ children }) => _jsx("h2", { className: "mb-1 text-sm font-bold", children: children }),
31
31
  h3: ({ children }) => _jsx("h3", { className: "mb-1 text-sm font-semibold", children: children }),
32
32
  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 })),
33
+ blockquote: ({ children }) => (_jsx("blockquote", { className: "border-muted-foreground/30 my-1 border-s-2 ps-3 italic opacity-80", children: children })),
34
34
  table: ({ children }) => (_jsx("div", { className: "my-2 overflow-x-auto", children: _jsx("table", { className: "min-w-full border-collapse text-xs", children: children }) })),
35
35
  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 }),
36
+ th: ({ children }) => _jsx("th", { className: "px-2 py-1 text-start font-semibold", children: children }),
37
37
  td: ({ children }) => _jsx("td", { className: "border-muted border-t px-2 py-1", children: children }),
38
38
  tr: ({ children }) => _jsx("tr", { children: children }),
39
39
  hr: () => _jsx("hr", { className: "border-border/40 my-3 border-t" }),
@@ -94,7 +94,7 @@ function HtmlPreviewBlock({ code, language }) {
94
94
  : 'text-muted-foreground hover:text-foreground'), children: "Preview" }), _jsx("button", { type: "button", onClick: () => {
95
95
  setFullscreenCode(!showPreview);
96
96
  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'
97
+ }, className: "text-muted-foreground hover:text-foreground ms-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'
98
98
  ? 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
99
  ? 'bg-background text-foreground shadow-sm'
100
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
@@ -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
  }
@@ -55,7 +55,7 @@ export function BaseDrawer({ open, onClose, modal = false, dismissOnOutsideClick
55
55
  return (_jsxs(Drawer, { direction: "right", modal: modal, handleOnly: true, open: open, onOpenChange: (isOpen) => {
56
56
  if (!isOpen)
57
57
  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] })] }));
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 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
59
  }
60
60
  function DeployBar({ deployTarget }) {
61
61
  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
  }
@@ -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] }));
@@ -277,13 +277,13 @@ export function DrawerActionBar({ onReject, onApprove, approveLabel, approveVari
277
277
  }
278
278
  }, []);
279
279
  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
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 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
281
  ? `${accentBorder} text-white`
282
282
  : rejectHighlighted
283
283
  ? 'border-primary bg-muted ring-primary/30 shadow-sm ring-1'
284
284
  : '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
285
  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: () => {
286
+ } }), _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 ? 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: () => {
287
287
  approveSound.play();
288
288
  onApprove();
289
289
  }, 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
  };
@@ -533,7 +533,7 @@ function ParentFeatureCombobox({ features, value, onChange, disabled, }) {
533
533
  }, [open]);
534
534
  return (_jsxs(Popover, { open: open, onOpenChange: setOpen, children: [_jsx(PopoverTrigger, { asChild: true, children: _jsxs("button", { id: "parent-feature", type: "button", role: "combobox", "aria-expanded": open, "aria-label": "Parent Feature", disabled: disabled, "data-testid": "parent-feature-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', !selectedFeature && 'text-muted-foreground'), children: [_jsx("span", { className: "truncate", children: selectedFeature
535
535
  ? `${selectedFeature.name} (${selectedFeature.id.slice(0, 8)})`
536
- : 'Select parent feature...' }), _jsx(ChevronsUpDown, { className: "ml-2 h-4 w-4 shrink-0 opacity-50" })] }) }), _jsx(PopoverContent, { className: "w-80 p-0", align: "start", "data-testid": "parent-feature-combobox-content", children: _jsxs("div", { className: "flex flex-col", children: [_jsx("div", { className: "border-b p-2", children: _jsx(Input, { ref: inputRef, placeholder: "Search features...", value: query, onChange: (e) => setQuery(e.target.value), className: "h-8 border-0 p-0 text-sm shadow-none focus-visible:ring-0", "data-testid": "parent-feature-search" }) }), _jsxs("div", { className: "max-h-48 overflow-y-auto py-1", role: "listbox", "aria-label": "Features", children: [_jsxs("button", { type: "button", role: "option", "aria-selected": value === undefined, onClick: () => handleSelect(undefined), className: cn('hover:bg-accent hover:text-accent-foreground flex w-full items-center gap-2 px-3 py-2 text-sm', value === undefined && 'bg-accent/50'), "data-testid": "parent-feature-option-none", children: [_jsx(CheckIcon, { className: cn('h-4 w-4 shrink-0', value !== undefined && 'invisible') }), _jsx("span", { className: "text-muted-foreground italic", children: "No parent" })] }), filtered.length === 0 && query ? (_jsx("p", { className: "text-muted-foreground px-3 py-2 text-sm", children: "No features found." })) : (filtered.map((f) => (_jsxs("button", { type: "button", role: "option", "aria-selected": value === f.id, onClick: () => handleSelect(f.id), className: cn('hover:bg-accent hover:text-accent-foreground flex w-full items-center gap-2 px-3 py-2 text-sm', value === f.id && 'bg-accent/50'), "data-testid": `parent-feature-option-${f.id}`, children: [_jsx(CheckIcon, { className: cn('h-4 w-4 shrink-0', value !== f.id && 'invisible') }), _jsxs("span", { className: "truncate", children: [f.name, ' ', _jsxs("span", { className: "text-muted-foreground font-mono text-xs", children: ["(", f.id.slice(0, 8), ")"] })] })] }, f.id))))] })] }) })] }));
536
+ : 'Select parent feature...' }), _jsx(ChevronsUpDown, { className: "ms-2 h-4 w-4 shrink-0 opacity-50" })] }) }), _jsx(PopoverContent, { className: "w-80 p-0", align: "start", "data-testid": "parent-feature-combobox-content", children: _jsxs("div", { className: "flex flex-col", children: [_jsx("div", { className: "border-b p-2", children: _jsx(Input, { ref: inputRef, placeholder: "Search features...", value: query, onChange: (e) => setQuery(e.target.value), className: "h-8 border-0 p-0 text-sm shadow-none focus-visible:ring-0", "data-testid": "parent-feature-search" }) }), _jsxs("div", { className: "max-h-48 overflow-y-auto py-1", role: "listbox", "aria-label": "Features", children: [_jsxs("button", { type: "button", role: "option", "aria-selected": value === undefined, onClick: () => handleSelect(undefined), className: cn('hover:bg-accent hover:text-accent-foreground flex w-full items-center gap-2 px-3 py-2 text-sm', value === undefined && 'bg-accent/50'), "data-testid": "parent-feature-option-none", children: [_jsx(CheckIcon, { className: cn('h-4 w-4 shrink-0', value !== undefined && 'invisible') }), _jsx("span", { className: "text-muted-foreground italic", children: "No parent" })] }), filtered.length === 0 && query ? (_jsx("p", { className: "text-muted-foreground px-3 py-2 text-sm", children: "No features found." })) : (filtered.map((f) => (_jsxs("button", { type: "button", role: "option", "aria-selected": value === f.id, onClick: () => handleSelect(f.id), className: cn('hover:bg-accent hover:text-accent-foreground flex w-full items-center gap-2 px-3 py-2 text-sm', value === f.id && 'bg-accent/50'), "data-testid": `parent-feature-option-${f.id}`, children: [_jsx(CheckIcon, { className: cn('h-4 w-4 shrink-0', value !== f.id && 'invisible') }), _jsxs("span", { className: "truncate", children: [f.name, ' ', _jsxs("span", { className: "text-muted-foreground font-mono text-xs", children: ["(", f.id.slice(0, 8), ")"] })] })] }, f.id))))] })] }) })] }));
537
537
  }
538
538
  export function RepositoryCombobox({ repositories, value, onChange, onAddRepository, disabled, }) {
539
539
  const [open, setOpen] = useState(false);
@@ -621,7 +621,7 @@ export function RepositoryCombobox({ repositories, value, onChange, onAddReposit
621
621
  setQuery('');
622
622
  }
623
623
  }, [open]);
624
- return (_jsxs(_Fragment, { children: [_jsxs(Popover, { open: open, onOpenChange: setOpen, children: [_jsx(PopoverTrigger, { asChild: true, children: _jsxs("button", { type: "button", role: "combobox", "aria-expanded": open, "aria-label": "Repository", disabled: disabled, "data-testid": "repository-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": "repository-combobox-content", children: _jsxs("div", { className: "flex flex-col", children: [_jsx("div", { className: "border-b p-2", children: _jsx(Input, { ref: inputRef, placeholder: "Search repositories...", value: query, onChange: (e) => setQuery(e.target.value), className: "h-8 border-0 p-0 text-sm shadow-none focus-visible:ring-0", "data-testid": "repository-search" }) }), _jsx("div", { className: "max-h-48 overflow-y-auto py-1", role: "listbox", "aria-label": "Repositories", children: filtered.length === 0 ? (_jsx("p", { className: "text-muted-foreground px-3 py-2 text-sm", "data-testid": "repository-empty", children: "No repositories found." })) : (filtered.map((r) => (_jsxs("button", { type: "button", role: "option", "aria-selected": value === r.path, onClick: () => handleSelect(r.path), className: cn('hover:bg-accent hover:text-accent-foreground flex w-full items-center gap-2 px-3 py-2 text-sm', value === r.path && 'bg-accent/50'), "data-testid": `repository-option-${r.id}`, children: [_jsx(CheckIcon, { className: cn('h-4 w-4 shrink-0', value !== 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(Separator, {}), _jsxs("button", { type: "button", onClick: handleAddRepository, disabled: isAdding, className: "hover:bg-accent hover:text-accent-foreground flex w-full items-center gap-2 px-3 py-2 text-sm", "data-testid": "add-repository-item", children: [isAdding ? (_jsx(Loader2, { className: "h-4 w-4 shrink-0 animate-spin" })) : (_jsx(FolderPlus, { className: "h-4 w-4 shrink-0" })), _jsx("span", { children: "Add new repository..." })] }), addError ? (_jsx("p", { className: "px-3 pb-2 text-xs text-red-500", "data-testid": "add-repository-error", children: addError })) : null] }) })] }), _jsx(ReactFileManagerDialog, { open: showReactPicker, onOpenChange: (isOpen) => {
624
+ return (_jsxs(_Fragment, { children: [_jsxs(Popover, { open: open, onOpenChange: setOpen, children: [_jsx(PopoverTrigger, { asChild: true, children: _jsxs("button", { type: "button", role: "combobox", "aria-expanded": open, "aria-label": "Repository", disabled: disabled, "data-testid": "repository-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": "repository-combobox-content", children: _jsxs("div", { className: "flex flex-col", children: [_jsx("div", { className: "border-b p-2", children: _jsx(Input, { ref: inputRef, placeholder: "Search repositories...", value: query, onChange: (e) => setQuery(e.target.value), className: "h-8 border-0 p-0 text-sm shadow-none focus-visible:ring-0", "data-testid": "repository-search" }) }), _jsx("div", { className: "max-h-48 overflow-y-auto py-1", role: "listbox", "aria-label": "Repositories", children: filtered.length === 0 ? (_jsx("p", { className: "text-muted-foreground px-3 py-2 text-sm", "data-testid": "repository-empty", children: "No repositories found." })) : (filtered.map((r) => (_jsxs("button", { type: "button", role: "option", "aria-selected": value === r.path, onClick: () => handleSelect(r.path), className: cn('hover:bg-accent hover:text-accent-foreground flex w-full items-center gap-2 px-3 py-2 text-sm', value === r.path && 'bg-accent/50'), "data-testid": `repository-option-${r.id}`, children: [_jsx(CheckIcon, { className: cn('h-4 w-4 shrink-0', value !== 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(Separator, {}), _jsxs("button", { type: "button", onClick: handleAddRepository, disabled: isAdding, className: "hover:bg-accent hover:text-accent-foreground flex w-full items-center gap-2 px-3 py-2 text-sm", "data-testid": "add-repository-item", children: [isAdding ? (_jsx(Loader2, { className: "h-4 w-4 shrink-0 animate-spin" })) : (_jsx(FolderPlus, { className: "h-4 w-4 shrink-0" })), _jsx("span", { children: "Add new repository..." })] }), addError ? (_jsx("p", { className: "px-3 pb-2 text-xs text-red-500", "data-testid": "add-repository-error", children: addError })) : null] }) })] }), _jsx(ReactFileManagerDialog, { open: showReactPicker, onOpenChange: (isOpen) => {
625
625
  if (!isOpen)
626
626
  setShowReactPicker(false);
627
627
  }, onSelect: handleReactPickerSelect })] }));
@@ -319,20 +319,20 @@ function NodeTimingRow({ timing, maxDurationMs, now, }) {
319
319
  setTimeout(() => setCopied(false), 1500);
320
320
  });
321
321
  }, [timing.prompt]);
322
- return (_jsxs("div", { className: `group/phase relative flex flex-col gap-0.5 px-3 py-1.5 ${isSubPhase ? 'ml-4' : ''}`, children: [_jsxs("div", { "data-testid": `timing-bar-${timing.phase}`, className: "flex items-center gap-2", children: [_jsx("div", { className: "relative z-10 flex h-5 w-5 shrink-0 items-center justify-center", children: _jsx("div", { className: `rounded-full ${isRunning ? 'h-3 w-3 animate-pulse' : 'h-2.5 w-2.5'} ${isRunning
322
+ return (_jsxs("div", { className: `group/phase relative flex flex-col gap-0.5 px-3 py-1.5 ${isSubPhase ? 'ms-4' : ''}`, children: [_jsxs("div", { "data-testid": `timing-bar-${timing.phase}`, className: "flex items-center gap-2", children: [_jsx("div", { className: "relative z-10 flex h-5 w-5 shrink-0 items-center justify-center", children: _jsx("div", { className: `rounded-full ${isRunning ? 'h-3 w-3 animate-pulse' : 'h-2.5 w-2.5'} ${isRunning
323
323
  ? 'bg-blue-500'
324
324
  : timing.completedAt
325
325
  ? 'bg-emerald-500'
326
- : 'bg-muted-foreground/30'}` }) }), _jsx("span", { className: `w-28 shrink-0 truncate text-sm font-medium ${isSubPhase ? 'text-muted-foreground' : 'text-foreground/80'}`, children: label }), timing.prompt ? (_jsx("button", { type: "button", onClick: handleCopyPrompt, className: "text-muted-foreground/50 hover:text-foreground/70 -ml-1 shrink-0 opacity-0 transition-opacity group-hover/phase:opacity-100", title: "Copy prompt to clipboard", children: copied ? (_jsx(Check, { className: "h-3.5 w-3.5 text-emerald-500" })) : (_jsx(Copy, { className: "h-3.5 w-3.5" })) })) : null, _jsx("div", { className: `bg-muted relative min-w-0 flex-1 overflow-hidden rounded-full ${isSubPhase ? 'h-1.5' : 'h-2'}`, children: isRunning ? (_jsx("div", { className: "absolute inset-0 rounded-full bg-blue-500/30", style: {
326
+ : 'bg-muted-foreground/30'}` }) }), _jsx("span", { className: `w-28 shrink-0 truncate text-sm font-medium ${isSubPhase ? 'text-muted-foreground' : 'text-foreground/80'}`, children: label }), timing.prompt ? (_jsx("button", { type: "button", onClick: handleCopyPrompt, className: "text-muted-foreground/50 hover:text-foreground/70 -ms-1 shrink-0 opacity-0 transition-opacity group-hover/phase:opacity-100", title: "Copy prompt to clipboard", children: copied ? (_jsx(Check, { className: "h-3.5 w-3.5 text-emerald-500" })) : (_jsx(Copy, { className: "h-3.5 w-3.5" })) })) : null, _jsx("div", { className: `bg-muted relative min-w-0 flex-1 overflow-hidden rounded-full ${isSubPhase ? 'h-1.5' : 'h-2'}`, children: isRunning ? (_jsx("div", { className: "absolute inset-0 rounded-full bg-blue-500/30", style: {
327
327
  backgroundImage: 'linear-gradient(90deg, transparent 0%, rgb(59 130 246) 50%, transparent 100%)',
328
328
  backgroundSize: '200% 100%',
329
329
  animation: 'shimmer 1.5s ease-in-out infinite',
330
- } })) : (_jsx("div", { className: `h-full rounded-full transition-all duration-300 ${barColorClass}`, style: { width: `${Math.min(barPercent, 100)}%` } })) }), _jsx("span", { className: "text-muted-foreground w-14 shrink-0 text-right text-sm font-medium tabular-nums", children: formatDuration(durationMs) })] }), _jsxs("div", { className: "ml-[28px] flex items-center gap-3 text-xs", children: [timing.startedAt ? (_jsx("span", { className: "text-muted-foreground/60 tabular-nums", children: formatTimestamp(timing.startedAt) })) : null, totalTokens != null && totalTokens > 0 ? (_jsxs("span", { className: "text-muted-foreground/70 inline-flex items-center gap-0.5", children: [_jsx(Zap, { className: "h-3 w-3 opacity-50" }), formatTokens(totalTokens)] })) : null, timing.costUsd != null && timing.costUsd > 0 ? (_jsxs("span", { className: "text-muted-foreground/70 inline-flex items-center gap-0.5", children: [_jsx(DollarSign, { className: "h-3 w-3 opacity-50" }), formatCost(timing.costUsd)] })) : null] }), timing.approvalWaitMs != null && timing.approvalWaitMs > 0 ? (_jsx(ApprovalWaitRow, { timing: timing, maxDurationMs: maxDurationMs })) : null] }));
330
+ } })) : (_jsx("div", { className: `h-full rounded-full transition-all duration-300 ${barColorClass}`, style: { width: `${Math.min(barPercent, 100)}%` } })) }), _jsx("span", { className: "text-muted-foreground w-14 shrink-0 text-end text-sm font-medium tabular-nums", children: formatDuration(durationMs) })] }), _jsxs("div", { className: "ml-[28px] flex items-center gap-3 text-xs", children: [timing.startedAt ? (_jsx("span", { className: "text-muted-foreground/60 tabular-nums", children: formatTimestamp(timing.startedAt) })) : null, totalTokens != null && totalTokens > 0 ? (_jsxs("span", { className: "text-muted-foreground/70 inline-flex items-center gap-0.5", children: [_jsx(Zap, { className: "h-3 w-3 opacity-50" }), formatTokens(totalTokens)] })) : null, timing.costUsd != null && timing.costUsd > 0 ? (_jsxs("span", { className: "text-muted-foreground/70 inline-flex items-center gap-0.5", children: [_jsx(DollarSign, { className: "h-3 w-3 opacity-50" }), formatCost(timing.costUsd)] })) : null] }), timing.approvalWaitMs != null && timing.approvalWaitMs > 0 ? (_jsx(ApprovalWaitRow, { timing: timing, maxDurationMs: maxDurationMs })) : null] }));
331
331
  }
332
332
  function ApprovalWaitRow({ timing, maxDurationMs, }) {
333
333
  const waitMs = timing.approvalWaitMs ?? 0;
334
334
  const barPercent = maxDurationMs > 0 ? Math.max(2, (waitMs / maxDurationMs) * 100) : 2;
335
- return (_jsxs("div", { "data-testid": `approval-wait-${timing.phase}`, className: "ml-[26px] flex items-center gap-2 rounded-md bg-amber-50/50 px-1.5 py-1 dark:bg-amber-950/20", children: [_jsx(Timer, { className: "h-3.5 w-3.5 shrink-0 text-amber-500" }), _jsx("span", { className: "text-muted-foreground w-16 shrink-0 text-xs", children: "approval" }), _jsx("div", { className: "bg-muted h-1.5 min-w-0 flex-1 overflow-hidden rounded-full", children: _jsx("div", { className: "h-full rounded-full bg-amber-500", style: { width: `${Math.min(barPercent, 100)}%` } }) }), _jsx("span", { className: "text-muted-foreground w-14 shrink-0 text-right text-xs tabular-nums", children: formatDuration(waitMs) })] }));
335
+ return (_jsxs("div", { "data-testid": `approval-wait-${timing.phase}`, className: "ml-[26px] flex items-center gap-2 rounded-md bg-amber-50/50 px-1.5 py-1 dark:bg-amber-950/20", children: [_jsx(Timer, { className: "h-3.5 w-3.5 shrink-0 text-amber-500" }), _jsx("span", { className: "text-muted-foreground w-16 shrink-0 text-xs", children: "approval" }), _jsx("div", { className: "bg-muted h-1.5 min-w-0 flex-1 overflow-hidden rounded-full", children: _jsx("div", { className: "h-full rounded-full bg-amber-500", style: { width: `${Math.min(barPercent, 100)}%` } }) }), _jsx("span", { className: "text-muted-foreground w-14 shrink-0 text-end text-xs tabular-nums", children: formatDuration(waitMs) })] }));
336
336
  }
337
337
  function SummaryTotals({ totalExecMs, totalWaitMs, totalInputTokens, totalOutputTokens, totalCostUsd, }) {
338
338
  const totalTokens = totalInputTokens + totalOutputTokens;
@@ -9,5 +9,5 @@ export function BranchSyncStatus({ syncStatus, syncLoading, syncError, onRefresh
9
9
  const isBehind = syncStatus != null && syncStatus.behind > 0;
10
10
  const isUpToDate = syncStatus?.behind === 0;
11
11
  const baseBranch = syncStatus?.baseBranch ?? 'main';
12
- return (_jsxs(_Fragment, { children: [_jsx(Separator, {}), _jsxs("div", { "data-testid": "branch-sync-status", className: "flex flex-col gap-3 p-4", children: [_jsx("div", { className: "text-muted-foreground text-xs font-semibold tracking-wider", children: "BRANCH SYNC" }), _jsxs("div", { className: "flex items-center justify-between", children: [_jsx("div", { className: "flex items-center gap-2", children: syncLoading && !syncStatus ? (_jsxs(_Fragment, { children: [_jsx(CometSpinner, { size: "sm", className: "shrink-0" }), _jsx("span", { className: "text-muted-foreground text-sm", children: "Checking..." })] })) : syncError ? (_jsxs(_Fragment, { children: [_jsx(AlertTriangle, { className: "h-4 w-4 shrink-0 text-red-500" }), _jsx("span", { className: "text-sm text-red-600", children: syncError })] })) : isRebasing ? (_jsxs(_Fragment, { children: [_jsx(CometSpinner, { size: "sm", className: "shrink-0" }), _jsxs("span", { className: "text-sm", children: ["Rebasing on", ' ', _jsx("code", { className: "bg-muted rounded px-1 py-0.5 font-mono text-xs", children: baseBranch }), "..."] })] })) : isBehind ? (_jsxs(_Fragment, { children: [_jsx(AlertTriangle, { className: "h-4 w-4 shrink-0 text-orange-500" }), _jsxs("span", { className: "text-sm", children: [syncStatus.behind, " commit", syncStatus.behind === 1 ? '' : 's', " behind", ' ', _jsx("code", { className: "bg-muted rounded px-1 py-0.5 font-mono text-xs", children: baseBranch }), syncStatus.ahead > 0 ? (_jsxs("span", { className: "text-muted-foreground ml-1", children: ["\u00B7 ", syncStatus.ahead, " ahead"] })) : null] })] })) : isUpToDate ? (_jsxs(_Fragment, { children: [_jsx(CheckCircle2, { className: "h-4 w-4 shrink-0 text-green-500" }), _jsxs("span", { className: "text-sm", children: ["Up to date with", ' ', _jsx("code", { className: "bg-muted rounded px-1 py-0.5 font-mono text-xs", children: baseBranch }), syncStatus.ahead > 0 ? (_jsxs("span", { className: "text-muted-foreground ml-1", children: ["\u00B7 ", syncStatus.ahead, " ahead"] })) : null] })] })) : null }), (syncStatus || syncError) && !isRebasing ? (_jsx("button", { "data-testid": "sync-refresh-button", onClick: onRefreshSync, disabled: syncLoading, className: "text-muted-foreground hover:text-foreground inline-flex items-center rounded p-1 transition-colors disabled:opacity-50", "aria-label": "Refresh sync status", children: _jsx(RefreshCw, { className: `h-3.5 w-3.5 ${syncLoading ? 'animate-spin' : ''}` }) })) : null] }), isBehind && !isRebasing ? (_jsx(ActionButton, { label: "Rebase on Main", onClick: onRebaseOnMain, loading: false, error: !!rebaseError, icon: GitMerge, variant: "outline", size: "sm" })) : null, rebaseError ? _jsx("p", { className: "text-destructive text-xs", children: rebaseError }) : null] })] }));
12
+ return (_jsxs(_Fragment, { children: [_jsx(Separator, {}), _jsxs("div", { "data-testid": "branch-sync-status", className: "flex flex-col gap-3 p-4", children: [_jsx("div", { className: "text-muted-foreground text-xs font-semibold tracking-wider", children: "BRANCH SYNC" }), _jsxs("div", { className: "flex items-center justify-between", children: [_jsx("div", { className: "flex items-center gap-2", children: syncLoading && !syncStatus ? (_jsxs(_Fragment, { children: [_jsx(CometSpinner, { size: "sm", className: "shrink-0" }), _jsx("span", { className: "text-muted-foreground text-sm", children: "Checking..." })] })) : syncError ? (_jsxs(_Fragment, { children: [_jsx(AlertTriangle, { className: "h-4 w-4 shrink-0 text-red-500" }), _jsx("span", { className: "text-sm text-red-600", children: syncError })] })) : isRebasing ? (_jsxs(_Fragment, { children: [_jsx(CometSpinner, { size: "sm", className: "shrink-0" }), _jsxs("span", { className: "text-sm", children: ["Rebasing on", ' ', _jsx("code", { className: "bg-muted rounded px-1 py-0.5 font-mono text-xs", children: baseBranch }), "..."] })] })) : isBehind ? (_jsxs(_Fragment, { children: [_jsx(AlertTriangle, { className: "h-4 w-4 shrink-0 text-orange-500" }), _jsxs("span", { className: "text-sm", children: [syncStatus.behind, " commit", syncStatus.behind === 1 ? '' : 's', " behind", ' ', _jsx("code", { className: "bg-muted rounded px-1 py-0.5 font-mono text-xs", children: baseBranch }), syncStatus.ahead > 0 ? (_jsxs("span", { className: "text-muted-foreground ms-1", children: ["\u00B7 ", syncStatus.ahead, " ahead"] })) : null] })] })) : isUpToDate ? (_jsxs(_Fragment, { children: [_jsx(CheckCircle2, { className: "h-4 w-4 shrink-0 text-green-500" }), _jsxs("span", { className: "text-sm", children: ["Up to date with", ' ', _jsx("code", { className: "bg-muted rounded px-1 py-0.5 font-mono text-xs", children: baseBranch }), syncStatus.ahead > 0 ? (_jsxs("span", { className: "text-muted-foreground ms-1", children: ["\u00B7 ", syncStatus.ahead, " ahead"] })) : null] })] })) : null }), (syncStatus || syncError) && !isRebasing ? (_jsx("button", { "data-testid": "sync-refresh-button", onClick: onRefreshSync, disabled: syncLoading, className: "text-muted-foreground hover:text-foreground inline-flex items-center rounded p-1 transition-colors disabled:opacity-50", "aria-label": "Refresh sync status", children: _jsx(RefreshCw, { className: `h-3.5 w-3.5 ${syncLoading ? 'animate-spin' : ''}` }) })) : null] }), isBehind && !isRebasing ? (_jsx(ActionButton, { label: "Rebase on Main", onClick: onRebaseOnMain, loading: false, error: !!rebaseError, icon: GitMerge, variant: "outline", size: "sm" })) : null, rebaseError ? _jsx("p", { className: "text-destructive text-xs", children: rebaseError }) : null] })] }));
13
13
  }
@@ -251,7 +251,7 @@ export function FeatureDrawerTabs({ featureName, headerContent, featureNode, fea
251
251
  fetchTab(tab);
252
252
  }
253
253
  }, [fetchTab]);
254
- return (_jsx("div", { className: "flex min-h-0 flex-1 flex-col", children: _jsxs(Tabs, { value: activeTab, onValueChange: handleTabChange, className: "flex min-h-0 flex-1 flex-col", children: [_jsxs("div", { className: "shrink-0 px-4 pt-4 pb-3", "data-testid": "feature-drawer-header", children: [_jsxs("div", { className: "flex items-baseline gap-4 pr-6", children: [featureName ? (_jsx("h2", { className: "text-foreground min-w-0 shrink truncate text-base font-semibold tracking-tight", children: featureName })) : null, _jsx(TabsList, { className: "h-auto shrink-0 gap-0.5 rounded-none border-0 bg-transparent p-0", children: visibleTabDefs.map((tab) => (_jsx(TabsTrigger, { value: tab.key, 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: tab.label }, tab.key))) })] }), headerContent] }), _jsx(Separator, {}), _jsx(TabsContent, { value: "overview", className: "mt-0 flex-1 overflow-y-auto", children: _jsx(OverviewTab, { data: featureNode, syncStatus: syncStatus, syncLoading: syncLoading, syncError: syncError, onRefreshSync: onRefreshSync, onRebaseOnMain: onRebaseOnMain, rebaseLoading: rebaseLoading, rebaseError: rebaseError }) }), _jsx(TabsContent, { value: "activity", className: "mt-0 flex-1 overflow-y-auto", children: _jsx(ActivityTab, { timings: tabs.activity.data?.timings ?? null, loading: tabs.activity.loading, error: tabs.activity.error, rejectionFeedback: tabs.activity.data?.rejectionFeedback }) }), _jsx(TabsContent, { value: "log", className: "mt-0 flex-1 overflow-hidden", children: _jsx(LogTab, { content: featureLogs.content, isConnected: featureLogs.isConnected, error: featureLogs.error }) }), _jsx(TabsContent, { value: "plan", className: "mt-0 flex-1 overflow-y-auto", children: _jsx(PlanTab, { plan: tabs.plan.data, loading: tabs.plan.loading, error: tabs.plan.error }) }), visibleTabs.includes('prd-review') ? (_jsx(TabsContent, { value: "prd-review", className: "mt-0 flex min-h-0 flex-1 flex-col", children: prdData ? (_jsx(PrdQuestionnaire, { data: prdData, selections: prdSelections ?? {}, onSelect: onPrdSelect ?? (() => undefined), onApprove: onPrdApprove ?? (() => undefined), onReject: onPrdReject, isProcessing: isPrdLoading, isRejecting: isRejecting, chatInput: chatInput, onChatInputChange: onChatInputChange })) : (_jsx("div", { className: "flex items-center justify-center p-8", children: _jsx(Loader2, { className: "text-muted-foreground h-6 w-6 animate-spin" }) })) })) : null, visibleTabs.includes('tech-decisions') ? (_jsx(TabsContent, { value: "tech-decisions", className: "mt-0 flex min-h-0 flex-1 flex-col", children: techData ? (_jsxs("div", { className: "flex min-h-0 flex-1 flex-col", children: [_jsx("div", { className: "flex-1 overflow-y-auto", children: _jsx(TechDecisionsContent, { data: techData }) }), _jsx(DrawerActionBarForTech, { onApprove: onTechApprove ?? (() => undefined), onReject: onTechReject, isProcessing: isTechLoading, isRejecting: isRejecting, chatInput: chatInput, onChatInputChange: onChatInputChange })] })) : (_jsx("div", { className: "flex items-center justify-center p-8", children: _jsx(Loader2, { className: "text-muted-foreground h-6 w-6 animate-spin" }) })) })) : null, visibleTabs.includes('product-decisions') ? (_jsx(TabsContent, { value: "product-decisions", className: "mt-0 flex-1 overflow-y-auto", children: productData === null ? (_jsx("div", { className: "flex items-center justify-center p-8", children: _jsx(Loader2, { className: "text-muted-foreground h-6 w-6 animate-spin" }) })) : productData ? (_jsx(ProductDecisionsSummary, { data: productData })) : (_jsx("p", { className: "text-muted-foreground p-4 text-center text-sm", children: "No product decisions available." })) })) : null, visibleTabs.includes('merge-review') ? (_jsx(TabsContent, { value: "merge-review", className: "mt-0 flex min-h-0 flex-1 flex-col", children: mergeData ? (_jsx(MergeReview, { data: mergeData, readOnly: featureNode.lifecycle === 'maintain', onApprove: onMergeApprove ?? (() => undefined), onReject: onMergeReject, isProcessing: isMergeLoading, isRejecting: isRejecting, chatInput: chatInput, onChatInputChange: onChatInputChange })) : (_jsx("div", { className: "flex items-center justify-center p-8", children: isMergeLoading ? (_jsx(Loader2, { className: "text-muted-foreground h-6 w-6 animate-spin" })) : (_jsxs("div", { className: "text-muted-foreground flex flex-col items-center gap-2 text-sm", children: [_jsx(AlertCircle, { className: "h-6 w-6" }), _jsx("span", { children: "Merge review data unavailable" })] })) })) })) : null, visibleTabs.includes('chat') ? (_jsx(TabsContent, { value: "chat", className: "mt-0 flex min-h-0 flex-1 flex-col overflow-hidden", children: _jsx(ChatTab, { featureId: featureId, worktreePath: featureNode.worktreePath }) })) : null] }) }));
254
+ return (_jsx("div", { className: "flex min-h-0 flex-1 flex-col", children: _jsxs(Tabs, { value: activeTab, onValueChange: handleTabChange, className: "flex min-h-0 flex-1 flex-col", children: [_jsxs("div", { className: "shrink-0 px-4 pt-4 pb-3", "data-testid": "feature-drawer-header", children: [_jsxs("div", { className: "flex items-baseline gap-4 pe-6", children: [featureName ? (_jsx("h2", { className: "text-foreground min-w-0 shrink truncate text-base font-semibold tracking-tight", children: featureName })) : null, _jsx(TabsList, { className: "h-auto shrink-0 gap-0.5 rounded-none border-0 bg-transparent p-0", children: visibleTabDefs.map((tab) => (_jsx(TabsTrigger, { value: tab.key, 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: tab.label }, tab.key))) })] }), headerContent] }), _jsx(Separator, {}), _jsx(TabsContent, { value: "overview", className: "mt-0 flex-1 overflow-y-auto", children: _jsx(OverviewTab, { data: featureNode, syncStatus: syncStatus, syncLoading: syncLoading, syncError: syncError, onRefreshSync: onRefreshSync, onRebaseOnMain: onRebaseOnMain, rebaseLoading: rebaseLoading, rebaseError: rebaseError }) }), _jsx(TabsContent, { value: "activity", className: "mt-0 flex-1 overflow-y-auto", children: _jsx(ActivityTab, { timings: tabs.activity.data?.timings ?? null, loading: tabs.activity.loading, error: tabs.activity.error, rejectionFeedback: tabs.activity.data?.rejectionFeedback }) }), _jsx(TabsContent, { value: "log", className: "mt-0 flex-1 overflow-hidden", children: _jsx(LogTab, { content: featureLogs.content, isConnected: featureLogs.isConnected, error: featureLogs.error }) }), _jsx(TabsContent, { value: "plan", className: "mt-0 flex-1 overflow-y-auto", children: _jsx(PlanTab, { plan: tabs.plan.data, loading: tabs.plan.loading, error: tabs.plan.error }) }), visibleTabs.includes('prd-review') ? (_jsx(TabsContent, { value: "prd-review", className: "mt-0 flex min-h-0 flex-1 flex-col", children: prdData ? (_jsx(PrdQuestionnaire, { data: prdData, selections: prdSelections ?? {}, onSelect: onPrdSelect ?? (() => undefined), onApprove: onPrdApprove ?? (() => undefined), onReject: onPrdReject, isProcessing: isPrdLoading, isRejecting: isRejecting, chatInput: chatInput, onChatInputChange: onChatInputChange })) : (_jsx("div", { className: "flex items-center justify-center p-8", children: _jsx(Loader2, { className: "text-muted-foreground h-6 w-6 animate-spin" }) })) })) : null, visibleTabs.includes('tech-decisions') ? (_jsx(TabsContent, { value: "tech-decisions", className: "mt-0 flex min-h-0 flex-1 flex-col", children: techData ? (_jsxs("div", { className: "flex min-h-0 flex-1 flex-col", children: [_jsx("div", { className: "flex-1 overflow-y-auto", children: _jsx(TechDecisionsContent, { data: techData }) }), _jsx(DrawerActionBarForTech, { onApprove: onTechApprove ?? (() => undefined), onReject: onTechReject, isProcessing: isTechLoading, isRejecting: isRejecting, chatInput: chatInput, onChatInputChange: onChatInputChange })] })) : (_jsx("div", { className: "flex items-center justify-center p-8", children: _jsx(Loader2, { className: "text-muted-foreground h-6 w-6 animate-spin" }) })) })) : null, visibleTabs.includes('product-decisions') ? (_jsx(TabsContent, { value: "product-decisions", className: "mt-0 flex-1 overflow-y-auto", children: productData === null ? (_jsx("div", { className: "flex items-center justify-center p-8", children: _jsx(Loader2, { className: "text-muted-foreground h-6 w-6 animate-spin" }) })) : productData ? (_jsx(ProductDecisionsSummary, { data: productData })) : (_jsx("p", { className: "text-muted-foreground p-4 text-center text-sm", children: "No product decisions available." })) })) : null, visibleTabs.includes('merge-review') ? (_jsx(TabsContent, { value: "merge-review", className: "mt-0 flex min-h-0 flex-1 flex-col", children: mergeData ? (_jsx(MergeReview, { data: mergeData, readOnly: featureNode.lifecycle === 'maintain', onApprove: onMergeApprove ?? (() => undefined), onReject: onMergeReject, isProcessing: isMergeLoading, isRejecting: isRejecting, chatInput: chatInput, onChatInputChange: onChatInputChange })) : (_jsx("div", { className: "flex items-center justify-center p-8", children: isMergeLoading ? (_jsx(Loader2, { className: "text-muted-foreground h-6 w-6 animate-spin" })) : (_jsxs("div", { className: "text-muted-foreground flex flex-col items-center gap-2 text-sm", children: [_jsx(AlertCircle, { className: "h-6 w-6" }), _jsx("span", { children: "Merge review data unavailable" })] })) })) })) : null, visibleTabs.includes('chat') ? (_jsx(TabsContent, { value: "chat", className: "mt-0 flex min-h-0 flex-1 flex-col overflow-hidden", children: _jsx(ChatTab, { featureId: featureId, worktreePath: featureNode.worktreePath }) })) : null] }) }));
255
255
  }
256
256
  // ── Private helper ──────────────────────────────────────────────────────
257
257
  function DrawerActionBarForTech({ onApprove, onReject, isProcessing, isRejecting, chatInput, onChatInputChange, }) {
@@ -37,7 +37,7 @@ export function LogTab({ content, isConnected, error }) {
37
37
  ? 'bg-muted text-foreground'
38
38
  : 'text-muted-foreground hover:text-foreground'}`, title: "Structured view", children: _jsx(FileText, { className: "h-3.5 w-3.5" }) }), _jsx("button", { type: "button", onClick: () => setViewMode('raw'), className: `rounded p-1 transition-colors ${viewMode === 'raw'
39
39
  ? 'bg-muted text-foreground'
40
- : 'text-muted-foreground hover:text-foreground'}`, title: "Raw view", children: _jsx(Code, { className: "h-3.5 w-3.5" }) }), !autoScroll ? (_jsxs("button", { type: "button", onClick: jumpToBottom, className: "text-muted-foreground hover:text-foreground ml-1 flex items-center gap-1 text-xs", children: [_jsx(ArrowDown, { className: "h-3 w-3" }), "Jump to bottom"] })) : null] })] }), _jsx("div", { ref: containerRef, onScroll: handleScroll, className: `flex-1 overflow-y-auto ${viewMode === 'raw'
40
+ : 'text-muted-foreground hover:text-foreground'}`, title: "Raw view", children: _jsx(Code, { className: "h-3.5 w-3.5" }) }), !autoScroll ? (_jsxs("button", { type: "button", onClick: jumpToBottom, className: "text-muted-foreground hover:text-foreground ms-1 flex items-center gap-1 text-xs", children: [_jsx(ArrowDown, { className: "h-3 w-3" }), "Jump to bottom"] })) : null] })] }), _jsx("div", { ref: containerRef, onScroll: handleScroll, className: `flex-1 overflow-y-auto ${viewMode === 'raw'
41
41
  ? 'bg-zinc-950 p-3 font-mono text-xs leading-relaxed break-all whitespace-pre-wrap text-zinc-300'
42
42
  : 'bg-background'}`, children: viewMode === 'structured' ? _jsx(EventLogViewer, { content: content }) : content })] }));
43
43
  }
@@ -65,7 +65,7 @@ const prStatusStyles = {
65
65
  [PrStatus.Closed]: 'border-transparent bg-red-50 text-red-700 hover:bg-red-50',
66
66
  };
67
67
  function FeaturePrInfo({ pr, hideCiStatus, }) {
68
- return (_jsx("div", { "data-testid": "feature-drawer-pr", children: _jsxs("div", { className: "space-y-3", children: [_jsxs("div", { className: "flex items-center justify-between", children: [_jsxs("a", { href: pr.url, target: "_blank", rel: "noopener noreferrer", className: "text-primary flex items-center gap-1.5 text-sm font-semibold underline underline-offset-2", children: ["PR #", pr.number, _jsx(ExternalLink, { className: "h-3.5 w-3.5" })] }), _jsx(Badge, { className: prStatusStyles[pr.status], children: pr.status })] }), pr.ciStatus && hideCiStatus !== true ? (_jsxs("div", { className: "flex items-center justify-between", children: [_jsx("span", { className: "text-muted-foreground text-xs font-medium", children: "CI Status" }), _jsx(CiStatusBadge, { status: pr.ciStatus })] })) : null, pr.mergeable === false ? (_jsxs("div", { "data-testid": "pr-merge-conflict", className: "flex items-center justify-between", children: [_jsx("span", { className: "text-muted-foreground text-xs font-medium", children: "Merge Status" }), _jsxs(Badge, { className: "border-transparent bg-orange-50 text-orange-700 hover:bg-orange-50", children: [_jsx(AlertTriangle, { className: "mr-1 h-3.5 w-3.5" }), "Conflicts"] })] })) : null, pr.commitHash ? (_jsxs("div", { className: "flex items-center justify-between", children: [_jsx("span", { className: "text-muted-foreground text-xs font-medium", children: "Commit" }), _jsxs("div", { className: "flex items-center gap-1.5", children: [_jsx(GitCommitHorizontal, { className: "text-muted-foreground h-3.5 w-3.5" }), _jsx("code", { className: "bg-muted text-foreground rounded-md px-1.5 py-0.5 font-mono text-[11px]", children: pr.commitHash.slice(0, 7) })] })] })) : null] }) }));
68
+ return (_jsx("div", { "data-testid": "feature-drawer-pr", children: _jsxs("div", { className: "space-y-3", children: [_jsxs("div", { className: "flex items-center justify-between", children: [_jsxs("a", { href: pr.url, target: "_blank", rel: "noopener noreferrer", className: "text-primary flex items-center gap-1.5 text-sm font-semibold underline underline-offset-2", children: ["PR #", pr.number, _jsx(ExternalLink, { className: "h-3.5 w-3.5" })] }), _jsx(Badge, { className: prStatusStyles[pr.status], children: pr.status })] }), pr.ciStatus && hideCiStatus !== true ? (_jsxs("div", { className: "flex items-center justify-between", children: [_jsx("span", { className: "text-muted-foreground text-xs font-medium", children: "CI Status" }), _jsx(CiStatusBadge, { status: pr.ciStatus })] })) : null, pr.mergeable === false ? (_jsxs("div", { "data-testid": "pr-merge-conflict", className: "flex items-center justify-between", children: [_jsx("span", { className: "text-muted-foreground text-xs font-medium", children: "Merge Status" }), _jsxs(Badge, { className: "border-transparent bg-orange-50 text-orange-700 hover:bg-orange-50", children: [_jsx(AlertTriangle, { className: "me-1 h-3.5 w-3.5" }), "Conflicts"] })] })) : null, pr.commitHash ? (_jsxs("div", { className: "flex items-center justify-between", children: [_jsx("span", { className: "text-muted-foreground text-xs font-medium", children: "Commit" }), _jsxs("div", { className: "flex items-center gap-1.5", children: [_jsx(GitCommitHorizontal, { className: "text-muted-foreground h-3.5 w-3.5" }), _jsx("code", { className: "bg-muted text-foreground rounded-md px-1.5 py-0.5 font-mono text-[11px]", children: pr.commitHash.slice(0, 7) })] })] })) : null] }) }));
69
69
  }
70
70
  // ── Details section ──────────────────────────────────────────────────
71
71
  /** Hook that returns a live-updating elapsed time string for running features. */
@@ -9,5 +9,5 @@ import { getModelMeta } from '../../../lib/model-metadata.js';
9
9
  export function FeatureListItem({ name, status, startedAt, duration, agentType, modelId, onClick, }) {
10
10
  const { icon: StatusIcon, iconClass } = featureStatusConfig[status];
11
11
  const AgentIcon = agentType ? getAgentTypeIcon(agentType) : null;
12
- return (_jsx(SidebarMenuItem, { "data-testid": "feature-list-item", children: _jsxs(SidebarMenuButton, { size: "sm", onClick: onClick, tooltip: name, className: "cursor-pointer", children: [_jsx(StatusIcon, { className: iconClass }), _jsx("span", { className: "flex-1 truncate font-medium", children: name }), status === 'in-progress' && startedAt != null ? (_jsx("span", { "data-testid": "feature-list-item-meta", className: "text-muted-foreground ml-auto text-xs tabular-nums", children: _jsx(ElapsedTime, { startedAt: startedAt }) })) : null, status === 'done' && duration ? (_jsx("span", { "data-testid": "feature-list-item-meta", className: "text-muted-foreground ml-auto text-xs tabular-nums", children: duration })) : null, AgentIcon ? (_jsx(TooltipProvider, { children: _jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx("span", { className: "ml-auto shrink-0", children: _jsx(AgentIcon, { className: "h-3.5 w-3.5" }) }) }), _jsxs(TooltipContent, { side: "right", children: [_jsx("span", { className: "font-medium", children: agentTypeLabels[agentType] ?? agentType }), modelId ? (_jsxs("span", { className: "ml-1 opacity-70", children: ["\u00B7 ", getModelMeta(modelId).displayName || modelId] })) : null] })] }) })) : null] }) }));
12
+ return (_jsx(SidebarMenuItem, { "data-testid": "feature-list-item", children: _jsxs(SidebarMenuButton, { size: "sm", onClick: onClick, tooltip: name, className: "cursor-pointer", children: [_jsx(StatusIcon, { className: iconClass }), _jsx("span", { className: "flex-1 truncate font-medium", children: name }), status === 'in-progress' && startedAt != null ? (_jsx("span", { "data-testid": "feature-list-item-meta", className: "text-muted-foreground ml-auto text-xs tabular-nums", children: _jsx(ElapsedTime, { startedAt: startedAt }) })) : null, status === 'done' && duration ? (_jsx("span", { "data-testid": "feature-list-item-meta", className: "text-muted-foreground ml-auto text-xs tabular-nums", children: duration })) : null, AgentIcon ? (_jsx(TooltipProvider, { children: _jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx("span", { className: "ml-auto shrink-0", children: _jsx(AgentIcon, { className: "h-3.5 w-3.5" }) }) }), _jsxs(TooltipContent, { side: "right", children: [_jsx("span", { className: "font-medium", children: agentTypeLabels[agentType] ?? agentType }), modelId ? (_jsxs("span", { className: "ms-1 opacity-70", children: ["\u00B7 ", getModelMeta(modelId).displayName || modelId] })) : null] })] }) })) : null] }) }));
13
13
  }
@@ -6,7 +6,7 @@ export type FeatureNodeState = 'creating' | 'running' | 'action-required' | 'don
6
6
  export type FeatureLifecyclePhase = 'pending' | 'requirements' | 'research' | 'implementation' | 'review' | 'awaitingUpstream' | 'deploy' | 'maintain';
7
7
  /** Human-readable display labels for lifecycle phases. */
8
8
  export declare const lifecycleDisplayLabels: Record<FeatureLifecyclePhase, string>;
9
- /** Left border color for each lifecycle phase. */
9
+ /** Inline-start border color for each lifecycle phase. */
10
10
  export declare const lifecycleBorderColors: Record<FeatureLifecyclePhase, string>;
11
11
  /** Accent bar background color for each lifecycle phase. */
12
12
  export declare const lifecycleAccentColors: Record<FeatureLifecyclePhase, string>;
@@ -19,7 +19,7 @@ export declare const lifecyclePhaseBadge: Record<FeatureLifecyclePhase, {
19
19
  tooltip: string;
20
20
  description: string;
21
21
  }>;
22
- /** State-based left border overrides (takes precedence over lifecycle). */
22
+ /** State-based inline-start border overrides (takes precedence over lifecycle). */
23
23
  export declare const stateBorderColors: Partial<Record<FeatureNodeState, string>>;
24
24
  /** State-based accent bar overrides (takes precedence over lifecycle). */
25
25
  export declare const stateAccentColors: Partial<Record<FeatureNodeState, string>>;
@@ -1 +1 @@
1
- {"version":3,"file":"feature-node-state-config.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/feature-node/feature-node-state-config.ts"],"names":[],"mappings":"AAAA,OAAO,EASL,KAAK,UAAU,EAChB,MAAM,cAAc,CAAC;AACtB,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAC1C,OAAO,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,sCAAsC,CAAC;AAChG,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAEzD,MAAM,MAAM,gBAAgB,GACxB,UAAU,GACV,SAAS,GACT,iBAAiB,GACjB,MAAM,GACN,SAAS,GACT,SAAS,GACT,OAAO,GACP,UAAU,GACV,UAAU,CAAC;AAEf,MAAM,MAAM,qBAAqB,GAC7B,SAAS,GACT,cAAc,GACd,UAAU,GACV,gBAAgB,GAChB,QAAQ,GACR,kBAAkB,GAClB,QAAQ,GACR,UAAU,CAAC;AAEf,0DAA0D;AAC1D,eAAO,MAAM,sBAAsB,EAAE,MAAM,CAAC,qBAAqB,EAAE,MAAM,CASxE,CAAC;AAEF,kDAAkD;AAClD,eAAO,MAAM,qBAAqB,EAAE,MAAM,CAAC,qBAAqB,EAAE,MAAM,CASvE,CAAC;AAEF,4DAA4D;AAC5D,eAAO,MAAM,qBAAqB,EAAE,MAAM,CAAC,qBAAqB,EAAE,MAAM,CASvE,CAAC;AAEF,2EAA2E;AAC3E,eAAO,MAAM,mBAAmB,EAAE,MAAM,CACtC,qBAAqB,EACrB;IACE,MAAM,EAAE,MAAM,CAAC;IACf,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;CACrB,CAwEF,CAAC;AAEF,2EAA2E;AAC3E,eAAO,MAAM,iBAAiB,EAAE,OAAO,CAAC,MAAM,CAAC,gBAAgB,EAAE,MAAM,CAAC,CAIvE,CAAC;AAEF,0EAA0E;AAC1E,eAAO,MAAM,iBAAiB,EAAE,OAAO,CAAC,MAAM,CAAC,gBAAgB,EAAE,MAAM,CAAC,CAIvE,CAAC;AAEF,gFAAgF;AAChF,eAAO,MAAM,qBAAqB,EAAE,MAAM,CAAC,qBAAqB,EAAE,MAAM,CASvE,CAAC;AAEF,MAAM,WAAW,eAAe;IAC9B,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,qBAAqB,CAAC;IACjC,KAAK,EAAE,gBAAgB,CAAC;IACxB,QAAQ,EAAE,MAAM,CAAC;IACjB,8CAA8C;IAC9C,cAAc,EAAE,MAAM,CAAC;IACvB,uCAAuC;IACvC,MAAM,EAAE,MAAM,CAAC;IACf,kFAAkF;IAClF,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,gDAAgD;IAChD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,gFAAgF;IAChF,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,4DAA4D;IAC5D,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,2CAA2C;IAC3C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,0CAA0C;IAC1C,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,uEAAuE;IACvE,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,0DAA0D;IAC1D,SAAS,CAAC,EAAE,cAAc,CAAC;IAC3B,8DAA8D;IAC9D,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,mCAAmC;IACnC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,0DAA0D;IAC1D,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAC5B,+CAA+C;IAC/C,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,0EAA0E;IAC1E,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,8DAA8D;IAC9D,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,4EAA4E;IAC5E,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,sDAAsD;IACtD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,+DAA+D;IAC/D,EAAE,CAAC,EAAE;QACH,GAAG,EAAE,MAAM,CAAC;QACZ,MAAM,EAAE,MAAM,CAAC;QACf,MAAM,EAAE,QAAQ,CAAC;QACjB,QAAQ,CAAC,EAAE,QAAQ,CAAC;QACpB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,SAAS,CAAC,EAAE,OAAO,CAAC;KACrB,CAAC;IACF,yDAAyD;IACzD,aAAa,CAAC,EAAE;QACd,QAAQ,EAAE,OAAO,CAAC;QAClB,SAAS,EAAE,OAAO,CAAC;QACnB,UAAU,EAAE,OAAO,CAAC;KACrB,CAAC;IACF,4DAA4D;IAC5D,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,gDAAgD;IAChD,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,sDAAsD;IACtD,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,8DAA8D;IAC9D,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,mDAAmD;IACnD,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,2DAA2D;IAC3D,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,kDAAkD;IAClD,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,+CAA+C;IAC/C,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,+EAA+E;IAC/E,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,kDAAkD;IAClD,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,+DAA+D;IAC/D,UAAU,CAAC,EAAE;QACX,MAAM,EAAE,eAAe,CAAC;QACxB,GAAG,CAAC,EAAE,MAAM,CAAC;KACd,CAAC;IACF,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,IAAI,CAAC;IACxB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,QAAQ,CAAC,EAAE,CACT,SAAS,EAAE,MAAM,EACjB,OAAO,CAAC,EAAE,OAAO,EACjB,aAAa,CAAC,EAAE,OAAO,EACvB,OAAO,CAAC,EAAE,OAAO,KACd,IAAI,CAAC;IACV,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IACtC,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IACtC,MAAM,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IACrC,SAAS,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC,WAAW,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IAC1C,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED,MAAM,MAAM,eAAe,GAAG,IAAI,CAAC,eAAe,EAAE,aAAa,CAAC,CAAC;AAEnE,MAAM,WAAW,sBAAsB;IACrC,IAAI,EAAE,UAAU,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,eAAe,EAAE,OAAO,CAAC;CAC1B;AAED,eAAO,MAAM,sBAAsB,EAAE,MAAM,CAAC,gBAAgB,EAAE,sBAAsB,CA2FnF,CAAC"}
1
+ {"version":3,"file":"feature-node-state-config.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/feature-node/feature-node-state-config.ts"],"names":[],"mappings":"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"}