@shepai/cli 1.202.1-pr606.60460ac → 1.202.2

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 (372) hide show
  1. package/package.json +1 -1
  2. package/web/.next/BUILD_ID +1 -1
  3. package/web/.next/build-manifest.json +2 -2
  4. package/web/.next/fallback-build-manifest.json +2 -2
  5. package/web/.next/prerender-manifest.json +3 -3
  6. package/web/.next/required-server-files.js +2 -2
  7. package/web/.next/required-server-files.json +2 -2
  8. package/web/.next/server/app/(dashboard)/@drawer/adopt/page/react-loadable-manifest.json +4 -4
  9. package/web/.next/server/app/(dashboard)/@drawer/adopt/page/server-reference-manifest.json +37 -37
  10. package/web/.next/server/app/(dashboard)/@drawer/adopt/page.js.nft.json +1 -1
  11. package/web/.next/server/app/(dashboard)/@drawer/adopt/page_client-reference-manifest.js +1 -1
  12. package/web/.next/server/app/(dashboard)/@drawer/chat/page/react-loadable-manifest.json +4 -4
  13. package/web/.next/server/app/(dashboard)/@drawer/chat/page/server-reference-manifest.json +35 -35
  14. package/web/.next/server/app/(dashboard)/@drawer/chat/page.js.nft.json +1 -1
  15. package/web/.next/server/app/(dashboard)/@drawer/chat/page_client-reference-manifest.js +1 -1
  16. package/web/.next/server/app/(dashboard)/@drawer/create/page/react-loadable-manifest.json +4 -4
  17. package/web/.next/server/app/(dashboard)/@drawer/create/page/server-reference-manifest.json +38 -38
  18. package/web/.next/server/app/(dashboard)/@drawer/create/page.js.nft.json +1 -1
  19. package/web/.next/server/app/(dashboard)/@drawer/create/page_client-reference-manifest.js +1 -1
  20. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page/react-loadable-manifest.json +4 -4
  21. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page/server-reference-manifest.json +47 -47
  22. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page.js.nft.json +1 -1
  23. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page_client-reference-manifest.js +1 -1
  24. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page/react-loadable-manifest.json +4 -4
  25. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page/server-reference-manifest.json +47 -47
  26. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js.nft.json +1 -1
  27. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page_client-reference-manifest.js +1 -1
  28. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/[tab]/page/react-loadable-manifest.json +4 -4
  29. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/[tab]/page/server-reference-manifest.json +36 -36
  30. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/[tab]/page.js.nft.json +1 -1
  31. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/[tab]/page_client-reference-manifest.js +1 -1
  32. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page/react-loadable-manifest.json +4 -4
  33. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page/server-reference-manifest.json +36 -36
  34. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js.nft.json +1 -1
  35. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  36. package/web/.next/server/app/(dashboard)/chat/page/react-loadable-manifest.json +4 -4
  37. package/web/.next/server/app/(dashboard)/chat/page/server-reference-manifest.json +35 -35
  38. package/web/.next/server/app/(dashboard)/chat/page.js.nft.json +1 -1
  39. package/web/.next/server/app/(dashboard)/chat/page_client-reference-manifest.js +1 -1
  40. package/web/.next/server/app/(dashboard)/control-center/page/react-loadable-manifest.json +4 -4
  41. package/web/.next/server/app/(dashboard)/control-center/page/server-reference-manifest.json +35 -35
  42. package/web/.next/server/app/(dashboard)/control-center/page.js.nft.json +1 -1
  43. package/web/.next/server/app/(dashboard)/control-center/page_client-reference-manifest.js +1 -1
  44. package/web/.next/server/app/(dashboard)/create/page/react-loadable-manifest.json +4 -4
  45. package/web/.next/server/app/(dashboard)/create/page/server-reference-manifest.json +38 -38
  46. package/web/.next/server/app/(dashboard)/create/page.js.nft.json +1 -1
  47. package/web/.next/server/app/(dashboard)/create/page_client-reference-manifest.js +1 -1
  48. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page/react-loadable-manifest.json +4 -4
  49. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page/server-reference-manifest.json +47 -47
  50. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page.js.nft.json +1 -1
  51. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page_client-reference-manifest.js +1 -1
  52. package/web/.next/server/app/(dashboard)/feature/[featureId]/page/react-loadable-manifest.json +4 -4
  53. package/web/.next/server/app/(dashboard)/feature/[featureId]/page/server-reference-manifest.json +47 -47
  54. package/web/.next/server/app/(dashboard)/feature/[featureId]/page.js.nft.json +1 -1
  55. package/web/.next/server/app/(dashboard)/feature/[featureId]/page_client-reference-manifest.js +1 -1
  56. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/[tab]/page/react-loadable-manifest.json +4 -4
  57. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/[tab]/page/server-reference-manifest.json +36 -36
  58. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/[tab]/page.js.nft.json +1 -1
  59. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/[tab]/page_client-reference-manifest.js +1 -1
  60. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page/react-loadable-manifest.json +4 -4
  61. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page/server-reference-manifest.json +36 -36
  62. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js.nft.json +1 -1
  63. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  64. package/web/.next/server/app/_global-error.html +2 -2
  65. package/web/.next/server/app/_global-error.rsc +1 -1
  66. package/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  67. package/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  68. package/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  69. package/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  70. package/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  71. package/web/.next/server/app/_not-found/page/react-loadable-manifest.json +4 -4
  72. package/web/.next/server/app/_not-found/page/server-reference-manifest.json +9 -9
  73. package/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  74. package/web/.next/server/app/agent-questions/page/react-loadable-manifest.json +4 -4
  75. package/web/.next/server/app/agent-questions/page/server-reference-manifest.json +11 -11
  76. package/web/.next/server/app/agent-questions/page_client-reference-manifest.js +1 -1
  77. package/web/.next/server/app/agents/[agentType]/page/react-loadable-manifest.json +4 -4
  78. package/web/.next/server/app/agents/[agentType]/page/server-reference-manifest.json +13 -13
  79. package/web/.next/server/app/agents/[agentType]/page_client-reference-manifest.js +1 -1
  80. package/web/.next/server/app/agents/page/react-loadable-manifest.json +4 -4
  81. package/web/.next/server/app/agents/page/server-reference-manifest.json +10 -10
  82. package/web/.next/server/app/agents/page_client-reference-manifest.js +1 -1
  83. package/web/.next/server/app/application/[id]/page/react-loadable-manifest.json +4 -4
  84. package/web/.next/server/app/application/[id]/page/server-reference-manifest.json +18 -18
  85. package/web/.next/server/app/application/[id]/page.js.nft.json +1 -1
  86. package/web/.next/server/app/application/[id]/page_client-reference-manifest.js +1 -1
  87. package/web/.next/server/app/application/[id]/supervisor/page/react-loadable-manifest.json +4 -4
  88. package/web/.next/server/app/application/[id]/supervisor/page/server-reference-manifest.json +10 -10
  89. package/web/.next/server/app/application/[id]/supervisor/page_client-reference-manifest.js +1 -1
  90. package/web/.next/server/app/applications/page/react-loadable-manifest.json +4 -4
  91. package/web/.next/server/app/applications/page/server-reference-manifest.json +20 -20
  92. package/web/.next/server/app/applications/page.js.nft.json +1 -1
  93. package/web/.next/server/app/applications/page_client-reference-manifest.js +1 -1
  94. package/web/.next/server/app/features/page/react-loadable-manifest.json +4 -4
  95. package/web/.next/server/app/features/page/server-reference-manifest.json +31 -31
  96. package/web/.next/server/app/features/page.js.nft.json +1 -1
  97. package/web/.next/server/app/features/page_client-reference-manifest.js +1 -1
  98. package/web/.next/server/app/onboarding/page/react-loadable-manifest.json +4 -4
  99. package/web/.next/server/app/onboarding/page/server-reference-manifest.json +9 -9
  100. package/web/.next/server/app/onboarding/page_client-reference-manifest.js +1 -1
  101. package/web/.next/server/app/page/react-loadable-manifest.json +4 -4
  102. package/web/.next/server/app/page/server-reference-manifest.json +9 -9
  103. package/web/.next/server/app/page_client-reference-manifest.js +1 -1
  104. package/web/.next/server/app/projects/[slug]/items/[itemId]/page/react-loadable-manifest.json +4 -4
  105. package/web/.next/server/app/projects/[slug]/items/[itemId]/page/server-reference-manifest.json +16 -16
  106. package/web/.next/server/app/projects/[slug]/items/[itemId]/page_client-reference-manifest.js +1 -1
  107. package/web/.next/server/app/projects/[slug]/page/react-loadable-manifest.json +4 -4
  108. package/web/.next/server/app/projects/[slug]/page/server-reference-manifest.json +28 -28
  109. package/web/.next/server/app/projects/[slug]/page_client-reference-manifest.js +1 -1
  110. package/web/.next/server/app/projects/[slug]/pages/page/react-loadable-manifest.json +4 -4
  111. package/web/.next/server/app/projects/[slug]/pages/page/server-reference-manifest.json +12 -12
  112. package/web/.next/server/app/projects/[slug]/pages/page_client-reference-manifest.js +1 -1
  113. package/web/.next/server/app/projects/[slug]/settings/page/react-loadable-manifest.json +4 -4
  114. package/web/.next/server/app/projects/[slug]/settings/page/server-reference-manifest.json +18 -18
  115. package/web/.next/server/app/projects/[slug]/settings/page_client-reference-manifest.js +1 -1
  116. package/web/.next/server/app/projects/page/react-loadable-manifest.json +4 -4
  117. package/web/.next/server/app/projects/page/server-reference-manifest.json +10 -10
  118. package/web/.next/server/app/projects/page_client-reference-manifest.js +1 -1
  119. package/web/.next/server/app/settings/page/react-loadable-manifest.json +4 -4
  120. package/web/.next/server/app/settings/page/server-reference-manifest.json +15 -15
  121. package/web/.next/server/app/settings/page_client-reference-manifest.js +1 -1
  122. package/web/.next/server/app/skills/page/react-loadable-manifest.json +4 -4
  123. package/web/.next/server/app/skills/page/server-reference-manifest.json +17 -17
  124. package/web/.next/server/app/skills/page_client-reference-manifest.js +1 -1
  125. package/web/.next/server/app/supervisor/feature/[featureId]/page/react-loadable-manifest.json +4 -4
  126. package/web/.next/server/app/supervisor/feature/[featureId]/page/server-reference-manifest.json +10 -10
  127. package/web/.next/server/app/supervisor/feature/[featureId]/page_client-reference-manifest.js +1 -1
  128. package/web/.next/server/app/supervisor/page/react-loadable-manifest.json +4 -4
  129. package/web/.next/server/app/supervisor/page/server-reference-manifest.json +10 -10
  130. package/web/.next/server/app/supervisor/page_client-reference-manifest.js +1 -1
  131. package/web/.next/server/app/supervisor/repo/[repositoryId]/page/react-loadable-manifest.json +4 -4
  132. package/web/.next/server/app/supervisor/repo/[repositoryId]/page/server-reference-manifest.json +10 -10
  133. package/web/.next/server/app/supervisor/repo/[repositoryId]/page_client-reference-manifest.js +1 -1
  134. package/web/.next/server/app/tools/page/react-loadable-manifest.json +4 -4
  135. package/web/.next/server/app/tools/page/server-reference-manifest.json +15 -15
  136. package/web/.next/server/app/tools/page_client-reference-manifest.js +1 -1
  137. package/web/.next/server/app/version/page/react-loadable-manifest.json +4 -4
  138. package/web/.next/server/app/version/page/server-reference-manifest.json +9 -9
  139. package/web/.next/server/app/version/page_client-reference-manifest.js +1 -1
  140. package/web/.next/server/chunks/[root-of-the-server]__10e976f3._.js +1 -1
  141. package/web/.next/server/chunks/ssr/744ca_web__next-internal_server_app_agent-questions_page_actions_4b694f8d.js +1 -1
  142. package/web/.next/server/chunks/ssr/744ca_web__next-internal_server_app_agent-questions_page_actions_4b694f8d.js.map +1 -1
  143. package/web/.next/server/chunks/ssr/744ca_web__next-internal_server_app_agents_[agentType]_page_actions_103679a6.js +1 -1
  144. package/web/.next/server/chunks/ssr/744ca_web__next-internal_server_app_agents_[agentType]_page_actions_103679a6.js.map +1 -1
  145. package/web/.next/server/chunks/ssr/744ca_web__next-internal_server_app_projects_[slug]_pages_page_actions_19d50f6c.js +1 -1
  146. package/web/.next/server/chunks/ssr/744ca_web__next-internal_server_app_projects_[slug]_pages_page_actions_19d50f6c.js.map +1 -1
  147. package/web/.next/server/chunks/ssr/744ca_web_app_projects_[slug]_items_[itemId]_work-item-detail-client_tsx_d2e02407._.js +1 -1
  148. package/web/.next/server/chunks/ssr/744ca_web_app_projects_[slug]_items_[itemId]_work-item-detail-client_tsx_d2e02407._.js.map +1 -1
  149. package/web/.next/server/chunks/ssr/744ca_web_app_projects_[slug]_settings_project-settings-client_tsx_e8b85ddc._.js +1 -1
  150. package/web/.next/server/chunks/ssr/744ca_web_app_projects_[slug]_settings_project-settings-client_tsx_e8b85ddc._.js.map +1 -1
  151. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_feature-drawer-client_tsx_e9755fc8._.js +2 -2
  152. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_feature-drawer-client_tsx_e9755fc8._.js.map +1 -1
  153. package/web/.next/server/chunks/ssr/744ca_web_components_features_applications_applications-page-client_tsx_d0db9938._.js +1 -1
  154. package/web/.next/server/chunks/ssr/744ca_web_components_features_applications_applications-page-client_tsx_d0db9938._.js.map +1 -1
  155. package/web/.next/server/chunks/ssr/[root-of-the-server]__0af8610a._.js +3 -3
  156. package/web/.next/server/chunks/ssr/[root-of-the-server]__0af8610a._.js.map +1 -1
  157. package/web/.next/server/chunks/ssr/[root-of-the-server]__0b652a2f._.js +1 -1
  158. package/web/.next/server/chunks/ssr/{[root-of-the-server]__8b73253b._.js → [root-of-the-server]__2e388ba3._.js} +2 -2
  159. package/web/.next/server/chunks/ssr/{[root-of-the-server]__8b73253b._.js.map → [root-of-the-server]__2e388ba3._.js.map} +1 -1
  160. package/web/.next/server/chunks/ssr/[root-of-the-server]__56cf47e7._.js +1 -1
  161. package/web/.next/server/chunks/ssr/[root-of-the-server]__56cf47e7._.js.map +1 -1
  162. package/web/.next/server/chunks/ssr/[root-of-the-server]__648730d4._.js +1 -1
  163. package/web/.next/server/chunks/ssr/[root-of-the-server]__68df6415._.js +1 -1
  164. package/web/.next/server/chunks/ssr/[root-of-the-server]__68df6415._.js.map +1 -1
  165. package/web/.next/server/chunks/ssr/[root-of-the-server]__6bc6bf96._.js +1 -1
  166. package/web/.next/server/chunks/ssr/[root-of-the-server]__6bc6bf96._.js.map +1 -1
  167. package/web/.next/server/chunks/ssr/[root-of-the-server]__9852cb08._.js +2 -2
  168. package/web/.next/server/chunks/ssr/[root-of-the-server]__9852cb08._.js.map +1 -1
  169. package/web/.next/server/chunks/ssr/[root-of-the-server]__a1167cec._.js +1 -1
  170. package/web/.next/server/chunks/ssr/[root-of-the-server]__a1167cec._.js.map +1 -1
  171. package/web/.next/server/chunks/ssr/[root-of-the-server]__a12d0ad7._.js +3 -0
  172. package/web/.next/server/chunks/ssr/{[root-of-the-server]__52ca7f88._.js.map → [root-of-the-server]__a12d0ad7._.js.map} +1 -1
  173. package/web/.next/server/chunks/ssr/[root-of-the-server]__ba699bec._.js +1 -1
  174. package/web/.next/server/chunks/ssr/[root-of-the-server]__ba699bec._.js.map +1 -1
  175. package/web/.next/server/chunks/ssr/[root-of-the-server]__e0741ee1._.js +1 -1
  176. package/web/.next/server/chunks/ssr/[root-of-the-server]__e0fa59e6._.js +1 -1
  177. package/web/.next/server/chunks/ssr/[root-of-the-server]__e0fa59e6._.js.map +1 -1
  178. package/web/.next/server/chunks/ssr/[root-of-the-server]__ea26ff90._.js +3 -3
  179. package/web/.next/server/chunks/ssr/[root-of-the-server]__ff0095e3._.js +1 -1
  180. package/web/.next/server/chunks/ssr/_07036593._.js +1 -1
  181. package/web/.next/server/chunks/ssr/_07036593._.js.map +1 -1
  182. package/web/.next/server/chunks/ssr/_0d2a7595._.js +1 -1
  183. package/web/.next/server/chunks/ssr/_0d2a7595._.js.map +1 -1
  184. package/web/.next/server/chunks/ssr/_101de7c3._.js +1 -1
  185. package/web/.next/server/chunks/ssr/_101de7c3._.js.map +1 -1
  186. package/web/.next/server/chunks/ssr/{_db111d21._.js → _10f54ace._.js} +2 -2
  187. package/web/.next/server/chunks/ssr/{_db111d21._.js.map → _10f54ace._.js.map} +1 -1
  188. package/web/.next/server/chunks/ssr/_24fca3cf._.js +1 -1
  189. package/web/.next/server/chunks/ssr/_24fca3cf._.js.map +1 -1
  190. package/web/.next/server/chunks/ssr/{_6ff832ad._.js → _2759af76._.js} +2 -2
  191. package/web/.next/server/chunks/ssr/{_6ff832ad._.js.map → _2759af76._.js.map} +1 -1
  192. package/web/.next/server/chunks/ssr/_2bc48f3d._.js +1 -1
  193. package/web/.next/server/chunks/ssr/_2bc48f3d._.js.map +1 -1
  194. package/web/.next/server/chunks/ssr/{_fb539286._.js → _2bef1982._.js} +2 -2
  195. package/web/.next/server/chunks/ssr/{_fb539286._.js.map → _2bef1982._.js.map} +1 -1
  196. package/web/.next/server/chunks/ssr/_32f66845._.js +1 -1
  197. package/web/.next/server/chunks/ssr/_408848e6._.js +1 -1
  198. package/web/.next/server/chunks/ssr/_408848e6._.js.map +1 -1
  199. package/web/.next/server/chunks/ssr/_40e02782._.js +1 -1
  200. package/web/.next/server/chunks/ssr/_40e02782._.js.map +1 -1
  201. package/web/.next/server/chunks/ssr/_486d45d6._.js +1 -1
  202. package/web/.next/server/chunks/ssr/_486d45d6._.js.map +1 -1
  203. package/web/.next/server/chunks/ssr/{_824d5772._.js → _498cba11._.js} +2 -2
  204. package/web/.next/server/chunks/ssr/{_824d5772._.js.map → _498cba11._.js.map} +1 -1
  205. package/web/.next/server/chunks/ssr/_56b9d60f._.js +1 -1
  206. package/web/.next/server/chunks/ssr/_56b9d60f._.js.map +1 -1
  207. package/web/.next/server/chunks/ssr/_5cbb0e22._.js +1 -1
  208. package/web/.next/server/chunks/ssr/_5cbb0e22._.js.map +1 -1
  209. package/web/.next/server/chunks/ssr/{_5a3edc88._.js → _673be4f1._.js} +2 -2
  210. package/web/.next/server/chunks/ssr/{_5a3edc88._.js.map → _673be4f1._.js.map} +1 -1
  211. package/web/.next/server/chunks/ssr/_7ba67729._.js +1 -1
  212. package/web/.next/server/chunks/ssr/_7ba67729._.js.map +1 -1
  213. package/web/.next/server/chunks/ssr/_805ae1aa._.js +1 -1
  214. package/web/.next/server/chunks/ssr/_805ae1aa._.js.map +1 -1
  215. package/web/.next/server/chunks/ssr/_87cf18c3._.js +1 -1
  216. package/web/.next/server/chunks/ssr/_87cf18c3._.js.map +1 -1
  217. package/web/.next/server/chunks/ssr/_8a700ff4._.js +1 -1
  218. package/web/.next/server/chunks/ssr/_8a700ff4._.js.map +1 -1
  219. package/web/.next/server/chunks/ssr/_95b97274._.js +1 -1
  220. package/web/.next/server/chunks/ssr/_95b97274._.js.map +1 -1
  221. package/web/.next/server/chunks/ssr/{_fbcfaf3a._.js → _9d18d1b1._.js} +2 -2
  222. package/web/.next/server/chunks/ssr/{_fbcfaf3a._.js.map → _9d18d1b1._.js.map} +1 -1
  223. package/web/.next/server/chunks/ssr/{_70ff64a1._.js → _a93687e6._.js} +2 -2
  224. package/web/.next/server/chunks/ssr/{_70ff64a1._.js.map → _a93687e6._.js.map} +1 -1
  225. package/web/.next/server/chunks/ssr/_c2e196ee._.js +1 -1
  226. package/web/.next/server/chunks/ssr/_c2e196ee._.js.map +1 -1
  227. package/web/.next/server/chunks/ssr/_ca3b7bf7._.js +1 -1
  228. package/web/.next/server/chunks/ssr/_ca3b7bf7._.js.map +1 -1
  229. package/web/.next/server/chunks/ssr/_d53224a9._.js +1 -1
  230. package/web/.next/server/chunks/ssr/_d53224a9._.js.map +1 -1
  231. package/web/.next/server/chunks/ssr/_d573dcc2._.js +1 -1
  232. package/web/.next/server/chunks/ssr/_e2671e14._.js +1 -1
  233. package/web/.next/server/chunks/ssr/_e2671e14._.js.map +1 -1
  234. package/web/.next/server/chunks/ssr/_ecd45b17._.js +1 -1
  235. package/web/.next/server/chunks/ssr/_ecd45b17._.js.map +1 -1
  236. package/web/.next/server/chunks/ssr/{_f0d45e47._.js → _f46d2018._.js} +2 -2
  237. package/web/.next/server/chunks/ssr/{_f0d45e47._.js.map → _f46d2018._.js.map} +1 -1
  238. package/web/.next/server/chunks/ssr/_f602cc9f._.js +1 -1
  239. package/web/.next/server/chunks/ssr/_f602cc9f._.js.map +1 -1
  240. package/web/.next/server/chunks/ssr/{_20a56008._.js → _f71954a5._.js} +2 -2
  241. package/web/.next/server/chunks/ssr/{_20a56008._.js.map → _f71954a5._.js.map} +1 -1
  242. package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_settings_settings-page-client_tsx_6ed9d5f8._.js +1 -1
  243. package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_settings_settings-page-client_tsx_6ed9d5f8._.js.map +1 -1
  244. package/web/.next/server/chunks/ssr/f3a1f_components_common_control-center-drawer_repository-drawer-client_tsx_39a00c03._.js +1 -1
  245. package/web/.next/server/chunks/ssr/src_presentation_web_0e291f0b._.js +1 -1
  246. package/web/.next/server/chunks/ssr/src_presentation_web_0e291f0b._.js.map +1 -1
  247. package/web/.next/server/chunks/ssr/{src_presentation_web_40673f0c._.js → src_presentation_web_16c83ab4._.js} +2 -2
  248. package/web/.next/server/chunks/ssr/{src_presentation_web_40673f0c._.js.map → src_presentation_web_16c83ab4._.js.map} +1 -1
  249. package/web/.next/server/chunks/ssr/src_presentation_web_1d8d177f._.js +1 -1
  250. package/web/.next/server/chunks/ssr/src_presentation_web_1d8d177f._.js.map +1 -1
  251. package/web/.next/server/chunks/ssr/src_presentation_web_450b58fc._.js +1 -1
  252. package/web/.next/server/chunks/ssr/src_presentation_web_450b58fc._.js.map +1 -1
  253. package/web/.next/server/chunks/ssr/src_presentation_web_47727150._.js +1 -1
  254. package/web/.next/server/chunks/ssr/src_presentation_web_47727150._.js.map +1 -1
  255. package/web/.next/server/chunks/ssr/src_presentation_web_64fcfc84._.js +1 -1
  256. package/web/.next/server/chunks/ssr/src_presentation_web_64fcfc84._.js.map +1 -1
  257. package/web/.next/server/chunks/ssr/src_presentation_web_74b7bdb2._.js +1 -1
  258. package/web/.next/server/chunks/ssr/src_presentation_web_74b7bdb2._.js.map +1 -1
  259. package/web/.next/server/chunks/ssr/src_presentation_web_82aeca34._.js +1 -1
  260. package/web/.next/server/chunks/ssr/src_presentation_web_82aeca34._.js.map +1 -1
  261. package/web/.next/server/chunks/ssr/src_presentation_web_8a564d47._.js +1 -1
  262. package/web/.next/server/chunks/ssr/src_presentation_web_8a564d47._.js.map +1 -1
  263. package/web/.next/server/chunks/ssr/src_presentation_web_9a543843._.js +1 -1
  264. package/web/.next/server/chunks/ssr/src_presentation_web_9a543843._.js.map +1 -1
  265. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app__not-found_page_actions_f4f3fad9.js +1 -1
  266. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app__not-found_page_actions_f4f3fad9.js.map +1 -1
  267. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_agents_page_actions_d4bd4711.js +1 -1
  268. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_agents_page_actions_d4bd4711.js.map +1 -1
  269. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_onboarding_page_actions_bb695e8d.js +1 -1
  270. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_onboarding_page_actions_bb695e8d.js.map +1 -1
  271. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_page_actions_ac47e420.js +1 -1
  272. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_page_actions_ac47e420.js.map +1 -1
  273. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_projects_page_actions_c91a23a8.js +1 -1
  274. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_projects_page_actions_c91a23a8.js.map +1 -1
  275. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_version_page_actions_63c2d912.js +1 -1
  276. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_version_page_actions_63c2d912.js.map +1 -1
  277. package/web/.next/server/chunks/ssr/src_presentation_web_a53a3da6._.js +1 -1
  278. package/web/.next/server/chunks/ssr/src_presentation_web_a53a3da6._.js.map +1 -1
  279. package/web/.next/server/chunks/ssr/src_presentation_web_app_actions_246617fe._.js +3 -3
  280. package/web/.next/server/chunks/ssr/src_presentation_web_app_actions_adopt-local-directory_ts_75f1f28c._.js +1 -1
  281. package/web/.next/server/chunks/ssr/src_presentation_web_app_actions_adopt-local-directory_ts_75f1f28c._.js.map +1 -1
  282. package/web/.next/server/chunks/ssr/src_presentation_web_app_actions_approve-feature_ts_9453ce8b._.js +1 -1
  283. package/web/.next/server/chunks/ssr/src_presentation_web_app_actions_open-directory_ts_1209d917._.js +1 -1
  284. package/web/.next/server/chunks/ssr/src_presentation_web_app_actions_open-directory_ts_1209d917._.js.map +1 -1
  285. package/web/.next/server/chunks/ssr/src_presentation_web_app_features_feature-tree-page-client_tsx_34c5cbbf._.js +1 -1
  286. package/web/.next/server/chunks/ssr/src_presentation_web_b1b3c26c._.js +1 -1
  287. package/web/.next/server/chunks/ssr/src_presentation_web_b1b3c26c._.js.map +1 -1
  288. package/web/.next/server/chunks/ssr/src_presentation_web_b98a4353._.js +1 -1
  289. package/web/.next/server/chunks/ssr/src_presentation_web_b98a4353._.js.map +1 -1
  290. package/web/.next/server/chunks/ssr/src_presentation_web_c96ca051._.js +1 -1
  291. package/web/.next/server/chunks/ssr/src_presentation_web_c96ca051._.js.map +1 -1
  292. package/web/.next/server/chunks/ssr/{src_presentation_web_e812a69b._.js → src_presentation_web_cb0d2c28._.js} +2 -2
  293. package/web/.next/server/chunks/ssr/{src_presentation_web_e812a69b._.js.map → src_presentation_web_cb0d2c28._.js.map} +1 -1
  294. package/web/.next/server/chunks/ssr/src_presentation_web_components_66643378._.js +1 -1
  295. package/web/.next/server/chunks/ssr/src_presentation_web_components_66643378._.js.map +1 -1
  296. package/web/.next/server/chunks/ssr/src_presentation_web_components_agent-editor_agent-editor-tabs_tsx_d5a954b4._.js +1 -1
  297. package/web/.next/server/chunks/ssr/src_presentation_web_components_agent-editor_agent-editor-tabs_tsx_d5a954b4._.js.map +1 -1
  298. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_skills_8a174cac._.js +1 -1
  299. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_skills_8a174cac._.js.map +1 -1
  300. package/web/.next/server/chunks/ssr/src_presentation_web_d3858f16._.js +1 -1
  301. package/web/.next/server/chunks/ssr/src_presentation_web_d3858f16._.js.map +1 -1
  302. package/web/.next/server/chunks/ssr/src_presentation_web_d7f8130c._.js +1 -1
  303. package/web/.next/server/chunks/ssr/src_presentation_web_d7f8130c._.js.map +1 -1
  304. package/web/.next/server/chunks/ssr/src_presentation_web_dddd8ccd._.js +1 -1
  305. package/web/.next/server/chunks/ssr/src_presentation_web_dddd8ccd._.js.map +1 -1
  306. package/web/.next/server/chunks/ssr/src_presentation_web_e13d58b0._.js +1 -1
  307. package/web/.next/server/chunks/ssr/src_presentation_web_e13d58b0._.js.map +1 -1
  308. package/web/.next/server/chunks/ssr/src_presentation_web_ee94a9aa._.js +1 -1
  309. package/web/.next/server/chunks/ssr/src_presentation_web_ee94a9aa._.js.map +1 -1
  310. package/web/.next/server/chunks/ssr/src_presentation_web_f0fcfdff._.js +1 -1
  311. package/web/.next/server/chunks/ssr/src_presentation_web_f0fcfdff._.js.map +1 -1
  312. package/web/.next/server/chunks/ssr/src_presentation_web_f17e8516._.js +1 -1
  313. package/web/.next/server/chunks/ssr/src_presentation_web_f17e8516._.js.map +1 -1
  314. package/web/.next/server/chunks/ssr/src_presentation_web_f7180fec._.js +1 -1
  315. package/web/.next/server/chunks/ssr/src_presentation_web_f7180fec._.js.map +1 -1
  316. package/web/.next/server/pages/500.html +2 -2
  317. package/web/.next/server/server-reference-manifest.js +1 -1
  318. package/web/.next/server/server-reference-manifest.json +111 -111
  319. package/web/.next/static/chunks/{5faa828877b1e669.js → 03dda23205877d8b.js} +1 -1
  320. package/web/.next/static/chunks/{4bf4f333302e24a4.js → 054e3a5f5ff4db71.js} +1 -1
  321. package/web/.next/static/chunks/{a868014dbe1b4e42.js → 06e58041911c290b.js} +1 -1
  322. package/web/.next/static/chunks/{b5ff852fee23795d.js → 089ef5b749d79ebd.js} +1 -1
  323. package/web/.next/static/chunks/{1a093b13a9d6952e.js → 0d106010c498c198.js} +2 -2
  324. package/web/.next/static/chunks/193e5a0540757f5e.js +1 -0
  325. package/web/.next/static/chunks/{9abc3e68af98e636.js → 25111a2f2597f500.js} +1 -1
  326. package/web/.next/static/chunks/285e724d07901ef6.js +1 -0
  327. package/web/.next/static/chunks/{3c396f63ebefe875.js → 2b2bfc0465b18a7d.js} +1 -1
  328. package/web/.next/static/chunks/{6af99a08ccacdbce.js → 2b436562e69d2827.js} +1 -1
  329. package/web/.next/static/chunks/{8c96a835b3b0dc44.js → 2e3844d0ac487ac7.js} +1 -1
  330. package/web/.next/static/chunks/325859b8a9482427.js +1 -0
  331. package/web/.next/static/chunks/{2773e7b2587bc9cc.js → 44ab458ceb89d85d.js} +1 -1
  332. package/web/.next/static/chunks/4fdf36904f5421a6.js +1 -0
  333. package/web/.next/static/chunks/59004c65d552581c.js +1 -0
  334. package/web/.next/static/chunks/{0edcdc8a2dd06b7a.js → 5c4837e88a3431b8.js} +1 -1
  335. package/web/.next/static/chunks/{a131f868af7f1f7c.js → 74cdd562eb663f72.js} +1 -1
  336. package/web/.next/static/chunks/{0315591c972888a6.js → 7670d76d4ee743e6.js} +1 -1
  337. package/web/.next/static/chunks/{02d88da9fd656fcd.js → 83fc784ce05a701e.js} +1 -1
  338. package/web/.next/static/chunks/{460cedaa85c821e7.js → 8dd4fdd20b103a66.js} +1 -1
  339. package/web/.next/static/chunks/9336bdc7fc319282.js +1 -0
  340. package/web/.next/static/chunks/9d285565922b2de7.js +1 -0
  341. package/web/.next/static/chunks/{45eeca36eabbed23.js → 9f7f2a11937d87eb.js} +1 -1
  342. package/web/.next/static/chunks/{c3931fdbae836be6.js → a7c7bcfb6f7696a3.js} +1 -1
  343. package/web/.next/static/chunks/{9f7985e2a73929a2.js → a8f57d2a12849f32.js} +1 -1
  344. package/web/.next/static/chunks/{0e1c933065a1100a.js → abe98954ccdf29db.js} +1 -1
  345. package/web/.next/static/chunks/{4378715fa2b5e7de.js → b05808da85e8b34c.js} +1 -1
  346. package/web/.next/static/chunks/{b5dc7979d66caa38.js → b5f83e5e1dad23d5.js} +1 -1
  347. package/web/.next/static/chunks/{6d2074fa3453d333.js → b8293a56f257e5a2.js} +1 -1
  348. package/web/.next/static/chunks/{bc5b87e4068ba11d.js → c61c5e97c76dc733.js} +1 -1
  349. package/web/.next/static/chunks/c6b411bf31744ca7.js +1 -0
  350. package/web/.next/static/chunks/{bdaa907bf3d1d932.js → c732d6cc4c5e4343.js} +1 -1
  351. package/web/.next/static/chunks/{25a200f055ae5cba.js → d214d6a670f48d79.js} +1 -1
  352. package/web/.next/static/chunks/{6901861cb53ab483.js → d7b17a93a26e97c8.js} +1 -1
  353. package/web/.next/static/chunks/{a0325f77bbccc63d.js → d8f14fac959a6bd0.js} +1 -1
  354. package/web/.next/static/chunks/{24ea54516dc249c0.js → d98912f5b6cf4938.js} +1 -1
  355. package/web/.next/static/chunks/{21500b3fe3754296.js → df79667c16344317.js} +1 -1
  356. package/web/.next/static/chunks/{05e8df10619fb980.js → ec8f19328ad1ecd4.js} +1 -1
  357. package/web/.next/static/chunks/{e6e6ba783b2e4d14.js → f0157331838ac962.js} +1 -1
  358. package/web/.next/static/chunks/{c687ed21b9518d73.js → f757d865fae71faf.js} +1 -1
  359. package/web/.next/static/chunks/fb3cbb7f575a7128.js +1 -0
  360. package/web/.next/server/chunks/ssr/[root-of-the-server]__52ca7f88._.js +0 -3
  361. package/web/.next/static/chunks/03d7b81c2554d52f.js +0 -1
  362. package/web/.next/static/chunks/15acdaaea57bb459.js +0 -1
  363. package/web/.next/static/chunks/39fe1c1397d5483b.js +0 -1
  364. package/web/.next/static/chunks/495883829026f13f.js +0 -1
  365. package/web/.next/static/chunks/4b3a4f416a6eb1ac.js +0 -1
  366. package/web/.next/static/chunks/4b4160f36cf2a3d6.js +0 -1
  367. package/web/.next/static/chunks/7269537b2188650d.js +0 -1
  368. package/web/.next/static/chunks/b1534b2f3d814fef.js +0 -1
  369. package/web/.next/static/chunks/f6dc1ba364203bb2.js +0 -1
  370. /package/web/.next/static/{My4IQDygZ4BFTXkkKanja → 9zd-B2rWybTaAgE74IKiK}/_buildManifest.js +0 -0
  371. /package/web/.next/static/{My4IQDygZ4BFTXkkKanja → 9zd-B2rWybTaAgE74IKiK}/_clientMiddlewareManifest.json +0 -0
  372. /package/web/.next/static/{My4IQDygZ4BFTXkkKanja → 9zd-B2rWybTaAgE74IKiK}/_ssgManifest.js +0 -0
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../../../src/presentation/web/app/actions/data%3Aaca7d7%20%3Ctext/javascript%3E","../../../../../../../src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.tsx","../../../../../../../src/presentation/web/app/actions/data%3A289573%20%3Ctext/javascript%3E"],"sourcesContent":["/* __next_internal_action_entry_do_not_use__ [{\"4023e0e62ab6873f251d393a3ac53fce2a7d1e363d\":\"createFeature\"},\"src/presentation/web/app/actions/create-feature.ts\",\"\"] */\"use turbopack no side effects\";import{createServerReference,callServer,findSourceMapURL}from\"private-next-rsc-action-client-wrapper\";const $$RSC_SERVER_ACTION_0=/*#__PURE__*/createServerReference(\"4023e0e62ab6873f251d393a3ac53fce2a7d1e363d\",callServer,void 0,findSourceMapURL,\"createFeature\");export{$$RSC_SERVER_ACTION_0 as createFeature};","'use client';\n\nimport { useState, useCallback, useEffect, useRef } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport {\n PaperclipIcon,\n ChevronsUpDown,\n CheckIcon,\n Zap,\n Clock,\n FolderPlus,\n Loader2,\n GitFork,\n FileText,\n Puzzle,\n RefreshCw,\n LayoutGrid,\n ClipboardList,\n} from 'lucide-react';\nimport { cn } from '@/lib/utils';\nimport { useSoundAction } from '@/hooks/use-sound-action';\nimport { BaseDrawer } from '@/components/common/base-drawer';\nimport { DrawerTitle, DrawerDescription } from '@/components/ui/drawer';\nimport { Button } from '@/components/ui/button';\nimport { Input } from '@/components/ui/input';\nimport { Textarea } from '@/components/ui/textarea';\nimport { Label } from '@/components/ui/label';\nimport { Badge } from '@/components/ui/badge';\nimport { Popover, PopoverContent, PopoverTrigger } from '@/components/ui/popover';\nimport { Switch } from '@/components/ui/switch';\nimport { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from '@/components/ui/tooltip';\nimport { useGuardedDrawerClose } from '@/hooks/drawer-close-guard';\nimport { AttachmentChip } from '@/components/common/attachment-chip';\nimport type { WorkflowDefaults } from '@/app/actions/get-workflow-defaults';\nimport { getViewerPermission } from '@/app/actions/get-viewer-permission';\nimport { AgentModelPicker } from '@/components/features/settings/AgentModelPicker';\nimport { Separator } from '@/components/ui/separator';\nimport { pickFolder } from '@/components/common/add-repository-button/pick-folder';\nimport { ReactFileManagerDialog } from '@/components/common/react-file-manager-dialog';\nimport { useFeatureFlags } from '@/hooks/feature-flags-context';\nimport { addRepository } from '@/app/actions/add-repository';\nimport { BuildMode as BuildModeEnum } from '@shepai/core/domain/generated/output';\nimport { pickFiles } from './pick-files';\n\nexport type { FileAttachment } from '@shepai/core/infrastructure/services/file-dialog.service';\n\n/** Attachment record for the create form — supports both picker and upload sources. */\nexport interface FormAttachment {\n id: string;\n name: string;\n size: number;\n mimeType: string;\n path: string;\n loading?: boolean;\n /** Optional user notes or annotations for this image */\n notes?: string;\n}\n\n/**\n * Build mode for the create drawer. Type alias derived from the generated\n * TypeSpec `BuildMode` enum so the UI cannot drift from the domain. Internal\n * code uses the enum members (`BuildModeEnum.Fast | .Spec`) per the\n * no-magic-values rule; the exported type is a string-literal union so call\n * sites can pass either enum members (preferred) or matching string literals.\n *\n * Note: the TypeSpec enum still includes `Application` for legacy rows that\n * were created before the picker was simplified — those features keep\n * working, but the drawer no longer offers `Application` as a selectable\n * option since it is operationally identical to `Spec` (both set fast=false).\n */\nexport type BuildMode = `${BuildModeEnum}`;\n\nconst BUILD_MODE_ORDER: readonly BuildMode[] = [BuildModeEnum.Fast, BuildModeEnum.Spec] as const;\n\nconst BUILD_MODE_META: Record<BuildMode, { icon: typeof Zap; labelKey: string }> = {\n // Application is retained in the meta map only so legacy `buildMode='application'`\n // rows do not crash if they ever flow through this path; it is never rendered.\n [BuildModeEnum.Application]: { icon: LayoutGrid, labelKey: 'createDrawer.modeApplication' },\n [BuildModeEnum.Fast]: { icon: Zap, labelKey: 'createDrawer.modeFast' },\n [BuildModeEnum.Spec]: { icon: ClipboardList, labelKey: 'createDrawer.modeSpec' },\n};\n\n/** Minimal feature descriptor for the parent selector. */\nexport interface ParentFeatureOption {\n id: string;\n name: string;\n}\n\n/** Minimal repository descriptor for the repository selector. */\nexport interface RepositoryOption {\n id: string;\n name: string;\n path: string;\n isFork?: boolean;\n upstreamUrl?: string;\n}\n\nexport interface FeatureCreatePayload {\n description: string;\n attachments: FormAttachment[];\n repositoryPath: string;\n approvalGates: {\n allowPrd: boolean;\n allowPlan: boolean;\n allowMerge: boolean;\n };\n push: boolean;\n openPr: boolean;\n ciWatchEnabled: boolean;\n enableEvidence: boolean;\n commitEvidence: boolean;\n parentId?: string;\n /** When true, skip SDLC phases and implement directly from the prompt. */\n fast: boolean;\n /** When true, create the feature in pending state (no agent spawned). */\n pending?: boolean;\n /** Fork repo and create PR to upstream at merge time. */\n forkAndPr: boolean;\n /** Commit specs/evidences into the repo (defaults false when forkAndPr is enabled). */\n commitSpecs: boolean;\n /** Sync main from remote before creating the feature branch (default: true). */\n rebaseBeforeBranch: boolean;\n /** Inject curated skills into the feature worktree. */\n injectSkills: boolean;\n /** Optional agent type override for this feature run */\n agentType?: string;\n /** Optional model override for this feature run */\n model?: string;\n sessionId?: string;\n /** When the drawer was launched scoped to an Application, the\n * application's domain UUID. Persisted on the Feature so the\n * Control Center can render an app→feature parent edge instead\n * of a virtual repository node. */\n applicationId?: string;\n}\n\nconst MAX_FILE_SIZE = 10 * 1024 * 1024; // 10 MB\n\nconst ALLOWED_EXTENSIONS = new Set([\n '.png',\n '.jpg',\n '.jpeg',\n '.gif',\n '.webp',\n '.svg',\n '.bmp',\n '.ico',\n '.pdf',\n '.doc',\n '.docx',\n '.xls',\n '.xlsx',\n '.ppt',\n '.pptx',\n '.txt',\n '.md',\n '.csv',\n '.json',\n '.yaml',\n '.yml',\n '.xml',\n '.ts',\n '.tsx',\n '.js',\n '.jsx',\n '.py',\n '.rb',\n '.go',\n '.rs',\n '.java',\n '.c',\n '.cpp',\n '.h',\n '.hpp',\n '.cs',\n '.swift',\n '.kt',\n '.html',\n '.css',\n '.scss',\n '.less',\n '.sh',\n '.bash',\n '.zsh',\n '.fish',\n '.toml',\n '.ini',\n '.cfg',\n '.conf',\n '.env',\n '.zip',\n '.tar',\n '.gz',\n '.log',\n]);\n\nfunction getExtension(filename: string): string {\n const dot = filename.lastIndexOf('.');\n return dot >= 0 ? filename.slice(dot).toLowerCase() : '';\n}\n\nconst EMPTY_GATES: Record<string, boolean> = {\n allowPrd: false,\n allowPlan: false,\n allowMerge: false,\n};\n\nexport interface FeatureCreateDrawerProps {\n open: boolean;\n onClose: () => void;\n onSubmit: (data: FeatureCreatePayload) => void;\n repositoryPath: string;\n isSubmitting?: boolean;\n workflowDefaults?: WorkflowDefaults;\n /** List of existing features available for selection as a parent. */\n features?: ParentFeatureOption[];\n /** List of tracked repositories for selection when repo context is missing. */\n repositories?: RepositoryOption[];\n /** Pre-select a parent feature when the drawer opens (e.g. from (+) button on a feature node). */\n initialParentId?: string;\n /** Current global agent type from settings */\n currentAgentType?: string;\n /** Current global model from settings */\n currentModel?: string;\n /** Pre-fill the description textarea (e.g. from session context) */\n initialDescription?: string;\n /** When true, user has push access — Fork & PR toggle will be hidden. */\n canPushDirectly?: boolean;\n /**\n * Pre-select a build mode (e.g. when the drawer is opened from a UI that\n * already chose one — apps page \"fast\" / \"spec\" buttons, FAB-with-mode).\n * When omitted, falls back to workflowDefaults.fast (true → 'fast', false →\n * 'spec'); fully omitted defaults select 'fast'.\n *\n * App-scoped invocations (`initialApplicationId` set) seed the picker with\n * `Spec` by default but the mode remains user-editable, so launching a\n * feature against an application behaves like launching one against a\n * regular repository — the user can switch to Fast in one click.\n */\n initialMode?: BuildMode;\n /**\n * Application context for the drawer. When set:\n * - the repository selector is rendered as a locked read-only label (the\n * app determines the repo, so the user cannot pick a different one)\n * - the mode picker stays editable; it just defaults to `Spec` so the SDD\n * intent is the easy path while the user can still pick `Fast`\n * - all other fields (description, attachments, advanced toggles) remain\n * editable\n *\n * Used by entry points launched from an Application (app card \"+\" button,\n * FAB context-aware action, app top-bar \"Open in Control Center\") so the\n * created feature is correctly scoped to the application without forcing\n * the user into a single mode.\n */\n initialApplicationId?: string;\n}\n\nfunction resolveInitialMode(\n initialMode: BuildMode | undefined,\n workflowDefaults: WorkflowDefaults | undefined\n): BuildMode {\n if (initialMode) return initialMode;\n if (workflowDefaults?.fast === false) return BuildModeEnum.Spec;\n return BuildModeEnum.Fast;\n}\n\nexport function FeatureCreateDrawer({\n open,\n onClose,\n onSubmit,\n repositoryPath,\n isSubmitting = false,\n workflowDefaults,\n features,\n repositories,\n initialParentId,\n currentAgentType,\n currentModel,\n initialDescription,\n canPushDirectly,\n initialMode,\n initialApplicationId,\n}: FeatureCreateDrawerProps) {\n const isAppScoped = initialApplicationId !== undefined;\n // App-scoped invocations seed the picker with `Spec` (the SDD intent) so\n // the easy path matches the entry-point name, but the picker remains\n // user-editable: launching a feature against an application should feel\n // like launching one against a regular repository.\n const effectiveInitialMode: BuildMode | undefined =\n isAppScoped && !initialMode ? BuildModeEnum.Spec : initialMode;\n const createSound = useSoundAction('create');\n const { t } = useTranslation('web');\n // Validate repositoryPath from URL against active repos — prevents stale URL params\n // from selecting deleted repos after add/delete/re-add cycles.\n // Trust the prop when: app-scoped (the application is the authority on its\n // own repo path, even if that path is not a registered Repository entity),\n // repos not loaded yet (undefined), empty list (no repos to check), or the\n // path matches an active repo.\n const validRepoPath = !repositoryPath\n ? ''\n : isAppScoped ||\n !repositories ||\n repositories.length === 0 ||\n repositories.some((r) => r.path === repositoryPath)\n ? repositoryPath\n : '';\n const defaultGates = workflowDefaults?.approvalGates ?? EMPTY_GATES;\n const defaultPush = workflowDefaults?.push ?? false;\n const defaultOpenPr = workflowDefaults?.openPr ?? false;\n const defaultCiWatch = workflowDefaults?.ciWatchEnabled !== false;\n const defaultEnableEvidence = workflowDefaults?.enableEvidence ?? false;\n const defaultCommitEvidence = workflowDefaults?.commitEvidence ?? false;\n const defaultMode = resolveInitialMode(effectiveInitialMode, workflowDefaults);\n\n const [description, setDescription] = useState(initialDescription ?? '');\n\n // Sync description when initialDescription prop changes (e.g. from session context)\n useEffect(() => {\n if (initialDescription) {\n setDescription(initialDescription);\n }\n }, [initialDescription]);\n\n const [attachments, setAttachments] = useState<FormAttachment[]>([]);\n const [approvalGates, setApprovalGates] = useState<Record<string, boolean>>({ ...defaultGates });\n const [push, setPush] = useState(defaultPush);\n const [openPr, setOpenPr] = useState(defaultOpenPr);\n const [ciWatchEnabled, setCiWatchEnabled] = useState(workflowDefaults?.ciWatchEnabled !== false);\n const [enableEvidence, setEnableEvidence] = useState(defaultEnableEvidence);\n const [commitEvidence, setCommitEvidence] = useState(defaultCommitEvidence);\n const [parentId, setParentId] = useState<string | undefined>(undefined);\n const [mode, setMode] = useState<BuildMode>(defaultMode);\n const fast = mode === BuildModeEnum.Fast;\n const [pending, setPending] = useState(false);\n const [forkAndPr, setForkAndPr] = useState(false);\n const [commitSpecs, setCommitSpecs] = useState(true);\n const [rebaseBeforeBranch, setRebaseBeforeBranch] = useState(true);\n const [injectSkills, setInjectSkills] = useState(workflowDefaults?.injectSkills ?? false);\n const [overrideAgent, setOverrideAgent] = useState<string | undefined>(undefined);\n const [overrideModel, setOverrideModel] = useState<string | undefined>(undefined);\n const [selectedRepoPath, setSelectedRepoPath] = useState<string | undefined>(\n validRepoPath || undefined\n );\n const [localRepos, setLocalRepos] = useState<RepositoryOption[]>(repositories ?? []);\n const [isDragOver, setIsDragOver] = useState(false);\n const [uploadError, setUploadError] = useState<string | null>(null);\n const [isPromptFocused, setIsPromptFocused] = useState(false);\n\n // Stable sessionId per mount — used for upload dedup grouping\n const sessionIdRef = useRef(crypto.randomUUID());\n const dragCounterRef = useRef(0);\n const promptContainerRef = useRef<HTMLDivElement>(null);\n\n // Sync state when workflowDefaults load asynchronously. Mode is only\n // re-synced from defaults when the caller did NOT pin an explicit\n // initialMode (or app-scoped Spec lock) — pinned modes win over async\n // defaults.\n useEffect(() => {\n if (workflowDefaults) {\n setApprovalGates({ ...workflowDefaults.approvalGates });\n setPush(workflowDefaults.push);\n setOpenPr(workflowDefaults.openPr);\n setCiWatchEnabled(workflowDefaults.ciWatchEnabled !== false);\n setEnableEvidence(workflowDefaults.enableEvidence);\n setCommitEvidence(workflowDefaults.commitEvidence);\n if (!effectiveInitialMode) {\n setMode(workflowDefaults.fast !== false ? BuildModeEnum.Fast : BuildModeEnum.Spec);\n }\n setInjectSkills(workflowDefaults.injectSkills ?? false);\n }\n }, [workflowDefaults, effectiveInitialMode]);\n\n // Sync localRepos when repositories prop changes\n useEffect(() => {\n setLocalRepos(repositories ?? []);\n }, [repositories]);\n\n // Pre-select parent when initialParentId changes (e.g. (+) button on feature node)\n useEffect(() => {\n if (open && initialParentId) {\n setParentId(initialParentId);\n }\n }, [open, initialParentId]);\n\n // Permission-aware Fork & PR toggle visibility\n const [canPush, setCanPush] = useState(canPushDirectly ?? false);\n\n // Sync canPush from prop when it changes (e.g. initial server-side value)\n useEffect(() => {\n setCanPush(canPushDirectly ?? false);\n }, [canPushDirectly]);\n\n // Re-check permission when user switches repos via the combobox\n const prevRepoRef = useRef(selectedRepoPath);\n useEffect(() => {\n if (selectedRepoPath && selectedRepoPath !== prevRepoRef.current) {\n prevRepoRef.current = selectedRepoPath;\n getViewerPermission(selectedRepoPath)\n .then((result) => setCanPush(result.canPushDirectly))\n .catch(() => setCanPush(false));\n }\n }, [selectedRepoPath]);\n\n // Auto-reset forkAndPr and dependent states when canPush becomes true\n useEffect(() => {\n if (canPush) {\n setForkAndPr(false);\n setPush(defaultPush);\n setOpenPr(defaultOpenPr);\n setCommitSpecs(true);\n }\n }, [canPush, defaultPush, defaultOpenPr]);\n\n const resetForm = useCallback(() => {\n setDescription('');\n setAttachments([]);\n setApprovalGates({ ...defaultGates });\n setPush(defaultPush);\n setOpenPr(defaultOpenPr);\n setCiWatchEnabled(defaultCiWatch);\n setEnableEvidence(defaultEnableEvidence);\n setCommitEvidence(defaultCommitEvidence);\n setParentId(undefined);\n setSelectedRepoPath(validRepoPath || undefined);\n setLocalRepos(repositories ?? []);\n setMode(defaultMode);\n setPending(false);\n setForkAndPr(false);\n setCommitSpecs(true);\n setRebaseBeforeBranch(true);\n setOverrideAgent(undefined);\n setOverrideModel(undefined);\n setUploadError(null);\n dragCounterRef.current = 0;\n setIsDragOver(false);\n }, [\n defaultGates,\n defaultPush,\n defaultOpenPr,\n defaultEnableEvidence,\n defaultCiWatch,\n defaultCommitEvidence,\n defaultMode,\n validRepoPath,\n repositories,\n ]);\n\n // Track whether the form has unsaved data\n const isDirty = description.trim() !== '' || attachments.length > 0;\n\n // Shared close guard — shows confirmation when dirty, prevents navigation\n const { attemptClose } = useGuardedDrawerClose({ open, isDirty, onClose, onReset: resetForm });\n\n /** Validate and upload files from drop or paste. */\n const handleFiles = useCallback(async (fileList: File[]) => {\n setUploadError(null);\n\n for (const file of fileList) {\n // Client-side size validation\n if (file.size > MAX_FILE_SIZE) {\n setUploadError(`\"${file.name}\" exceeds 10 MB limit`);\n return;\n }\n // Client-side extension validation\n const ext = getExtension(file.name);\n if (ext && !ALLOWED_EXTENSIONS.has(ext)) {\n setUploadError(`File type \"${ext}\" is not allowed`);\n return;\n }\n }\n\n for (const file of fileList) {\n const tempId = crypto.randomUUID();\n\n // Optimistic loading placeholder\n setAttachments((prev) => [\n ...prev,\n {\n id: tempId,\n name: file.name,\n size: file.size,\n mimeType: file.type || 'application/octet-stream',\n path: '',\n loading: true,\n },\n ]);\n\n try {\n const formData = new FormData();\n formData.append('file', file);\n formData.append('sessionId', sessionIdRef.current);\n\n const res = await fetch('/api/attachments/upload', {\n method: 'POST',\n body: formData,\n });\n\n if (!res.ok) {\n const body = await res.json().catch(() => ({ error: 'Upload failed' }));\n // Remove loading placeholder on error\n setAttachments((prev) => prev.filter((a) => a.id !== tempId));\n setUploadError(body.error ?? 'Upload failed');\n return;\n }\n\n const uploaded = await res.json();\n // Server dedup may return the same path for identical content — drop the duplicate.\n setAttachments((prev) => {\n const isDupe = prev.some((a) => a.id !== tempId && a.path === uploaded.path);\n if (isDupe) return prev.filter((a) => a.id !== tempId);\n return prev.map((a) =>\n a.id === tempId ? { ...uploaded, id: tempId, loading: false } : a\n );\n });\n } catch {\n setAttachments((prev) => prev.filter((a) => a.id !== tempId));\n setUploadError('Upload failed');\n }\n }\n }, []);\n\n const handleDragEnter = useCallback((e: React.DragEvent) => {\n e.preventDefault();\n e.stopPropagation();\n dragCounterRef.current += 1;\n if (dragCounterRef.current === 1) {\n setIsDragOver(true);\n }\n }, []);\n\n const handleDragLeave = useCallback((e: React.DragEvent) => {\n e.preventDefault();\n e.stopPropagation();\n dragCounterRef.current -= 1;\n if (dragCounterRef.current === 0) {\n setIsDragOver(false);\n }\n }, []);\n\n const handleDragOver = useCallback((e: React.DragEvent) => {\n e.preventDefault();\n e.stopPropagation();\n }, []);\n\n const handleDrop = useCallback(\n (e: React.DragEvent) => {\n e.preventDefault();\n e.stopPropagation();\n dragCounterRef.current = 0;\n setIsDragOver(false);\n\n const files = Array.from(e.dataTransfer.files);\n if (files.length > 0) {\n handleFiles(files);\n }\n },\n [handleFiles]\n );\n\n const handlePaste = useCallback(\n (e: React.ClipboardEvent) => {\n const items = e.clipboardData?.items;\n if (!items) return;\n\n const files: File[] = [];\n for (const item of Array.from(items)) {\n if (item.kind === 'file') {\n const file = item.getAsFile();\n if (file) files.push(file);\n }\n }\n\n if (files.length > 0) {\n e.preventDefault();\n handleFiles(files);\n }\n },\n [handleFiles]\n );\n\n const handleSubmit = useCallback(\n (e: React.FormEvent<HTMLFormElement>) => {\n e.preventDefault();\n if (!description.trim()) return;\n const effectiveRepoPath = selectedRepoPath ?? validRepoPath;\n if (!effectiveRepoPath) return;\n createSound.play();\n onSubmit({\n description: description.trim(),\n attachments: attachments.filter((a) => !a.loading),\n repositoryPath: effectiveRepoPath,\n approvalGates: {\n allowPrd: approvalGates.allowPrd ?? false,\n allowPlan: approvalGates.allowPlan ?? false,\n allowMerge: approvalGates.allowMerge ?? false,\n },\n push: forkAndPr ? true : push || openPr,\n openPr: forkAndPr ? true : openPr,\n ciWatchEnabled,\n enableEvidence,\n commitEvidence,\n fast,\n forkAndPr,\n commitSpecs,\n rebaseBeforeBranch,\n injectSkills,\n ...(pending ? { pending } : {}),\n ...(overrideAgent ? { agentType: overrideAgent } : {}),\n ...(overrideModel ? { model: overrideModel } : {}),\n ...(parentId ? { parentId } : {}),\n ...(initialApplicationId ? { applicationId: initialApplicationId } : {}),\n sessionId: sessionIdRef.current,\n });\n resetForm();\n },\n [\n description,\n attachments,\n approvalGates,\n selectedRepoPath,\n validRepoPath,\n onSubmit,\n push,\n openPr,\n enableEvidence,\n ciWatchEnabled,\n commitEvidence,\n fast,\n forkAndPr,\n commitSpecs,\n rebaseBeforeBranch,\n injectSkills,\n pending,\n overrideAgent,\n overrideModel,\n parentId,\n initialApplicationId,\n createSound,\n resetForm,\n ]\n );\n\n const handleAddFiles = useCallback(async () => {\n try {\n const files = await pickFiles();\n if (!files) return;\n\n for (const file of files) {\n const tempId = crypto.randomUUID();\n\n setAttachments((prev) => [\n ...prev,\n {\n id: tempId,\n name: file.name,\n size: file.size,\n mimeType: 'application/octet-stream',\n path: '',\n loading: true,\n },\n ]);\n\n try {\n const res = await fetch('/api/attachments/upload-from-path', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ path: file.path, sessionId: sessionIdRef.current }),\n });\n\n if (!res.ok) {\n const body = await res.json().catch(() => ({ error: 'Upload failed' }));\n setAttachments((prev) => prev.filter((a) => a.id !== tempId));\n setUploadError(body.error ?? 'Upload failed');\n return;\n }\n\n const uploaded = await res.json();\n setAttachments((prev) => {\n const isDupe = prev.some((a) => a.id !== tempId && a.path === uploaded.path);\n if (isDupe) return prev.filter((a) => a.id !== tempId);\n return prev.map((a) =>\n a.id === tempId ? { ...uploaded, id: tempId, loading: false } : a\n );\n });\n } catch {\n setAttachments((prev) => prev.filter((a) => a.id !== tempId));\n setUploadError('Upload failed');\n }\n }\n } catch {\n // Native dialog failed — silently ignore (user can retry)\n }\n }, []);\n\n const handleRemoveFile = useCallback((id: string) => {\n setAttachments((prev) => prev.filter((f) => f.id !== id));\n }, []);\n\n const handleNotesChange = useCallback((id: string, notes: string) => {\n setAttachments((prev) => prev.map((f) => (f.id === id ? { ...f, notes } : f)));\n }, []);\n\n const formRef = useRef<HTMLFormElement>(null);\n\n const handleKeyDown = useCallback((e: React.KeyboardEvent) => {\n if ((e.ctrlKey || e.metaKey) && e.key === 'Enter') {\n e.preventDefault();\n formRef.current?.requestSubmit();\n }\n }, []);\n\n const handlePromptFocus = useCallback(() => {\n setIsPromptFocused(true);\n }, []);\n\n const handlePromptBlur = useCallback(() => {\n // Defer the check so focus has time to settle on the new target.\n // This correctly handles Radix portals (e.g. AgentModelPicker popover) that\n // render outside the container DOM but are logically part of the prompt area.\n setTimeout(() => {\n const withinContainer = promptContainerRef.current?.contains(document.activeElement);\n const pickerPopoverOpen =\n promptContainerRef.current?.querySelector('[aria-expanded=\"true\"]') !== null;\n if (!withinContainer && !pickerPopoverOpen) {\n setIsPromptFocused(false);\n }\n }, 0);\n }, []);\n\n const hasFeatures = features && features.length > 0;\n const needsRepo = !validRepoPath && !selectedRepoPath;\n const showRepoSelector = !validRepoPath && repositories !== undefined;\n\n const AUTO_APPROVE_OPTIONS = [\n { id: 'allowPrd', label: t('createDrawer.prd'), description: t('createDrawer.prdDescription') },\n {\n id: 'allowPlan',\n label: t('createDrawer.plan'),\n description: t('createDrawer.planDescription'),\n },\n {\n id: 'allowMerge',\n label: t('createDrawer.merge'),\n description: t('createDrawer.mergeDescription'),\n },\n ];\n\n return (\n <BaseDrawer\n open={open}\n onClose={attemptClose}\n size=\"md\"\n modal={false}\n dismissOnOutsideClick\n data-testid=\"feature-create-drawer\"\n header={\n <>\n <div className=\"flex items-center gap-2\">\n <div className=\"h-2.5 w-2.5 shrink-0 rounded-full bg-blue-500\" />\n <DrawerTitle>{t('createDrawer.title')}</DrawerTitle>\n </div>\n {isSubmitting ? (\n <DrawerDescription asChild>\n <div>\n <Badge variant=\"secondary\">{t('createDrawer.creating')}</Badge>\n </div>\n </DrawerDescription>\n ) : null}\n </>\n }\n footer={\n <div className=\"flex flex-row justify-end gap-2\">\n <Button variant=\"outline\" onClick={attemptClose} disabled={isSubmitting}>\n {t('createDrawer.cancel')}\n </Button>\n <Button\n type=\"submit\"\n form=\"create-feature-form\"\n disabled={!description.trim() || isSubmitting || needsRepo}\n >\n {isSubmitting ? t('createDrawer.creating') : t('createDrawer.createFeature')}\n </Button>\n </div>\n }\n >\n {/* Form body */}\n <div className=\"overflow-y-auto p-4\">\n <TooltipProvider delayDuration={400}>\n <form\n ref={formRef}\n id=\"create-feature-form\"\n onSubmit={handleSubmit}\n onKeyDown={handleKeyDown}\n className=\"flex flex-col gap-4\"\n >\n {/* Repository selector (only when opened from sidebar without repo context) */}\n {isAppScoped ? (\n <div\n className=\"flex flex-col gap-1.5\"\n data-testid=\"repo-readonly-section\"\n data-locked-by-application=\"true\"\n >\n <Label className=\"text-muted-foreground text-xs font-semibold tracking-wider\">\n {t('createDrawer.repository')}\n </Label>\n <Tooltip>\n <TooltipTrigger asChild>\n <p\n className=\"text-sm opacity-70\"\n data-testid=\"repo-readonly-label\"\n aria-disabled=\"true\"\n aria-describedby=\"locked-by-application-tooltip\"\n title={t('createDrawer.lockedByApplication')}\n >\n {repositories?.find((r) => r.path === validRepoPath)?.name ??\n (validRepoPath ? validRepoPath.split('/').pop() : '') ??\n validRepoPath}\n </p>\n </TooltipTrigger>\n <TooltipContent id=\"locked-by-application-tooltip\" role=\"tooltip\" side=\"bottom\">\n {t('createDrawer.lockedByApplication')}\n </TooltipContent>\n </Tooltip>\n </div>\n ) : showRepoSelector ? (\n <div className=\"flex flex-col gap-1.5\" data-testid=\"repo-selector-section\">\n <Label className=\"text-muted-foreground text-xs font-semibold tracking-wider\">\n {t('createDrawer.repository')}\n </Label>\n <RepositoryCombobox\n repositories={localRepos}\n value={selectedRepoPath}\n onChange={setSelectedRepoPath}\n onAddRepository={(repo) => {\n setLocalRepos((prev) => [...prev, repo]);\n setSelectedRepoPath(repo.path);\n }}\n disabled={isSubmitting}\n />\n </div>\n ) : validRepoPath ? (\n <div className=\"flex flex-col gap-1.5\" data-testid=\"repo-readonly-section\">\n <Label className=\"text-muted-foreground text-xs font-semibold tracking-wider\">\n {t('createDrawer.repository')}\n </Label>\n <p className=\"text-sm\" data-testid=\"repo-readonly-label\">\n {repositories?.find((r) => r.path === validRepoPath)?.name ??\n validRepoPath.split('/').pop()}\n </p>\n </div>\n ) : null}\n\n {/* Description + inline controls with drop zone */}\n <div\n role=\"region\"\n aria-label={t('createDrawer.fileDropZone')}\n data-drag-over={isDragOver ? 'true' : 'false'}\n onDragEnter={handleDragEnter}\n onDragLeave={handleDragLeave}\n onDragOver={handleDragOver}\n onDrop={handleDrop}\n className={cn(\n 'flex flex-col gap-1.5 rounded-md border-2 border-transparent p-1 transition-colors',\n isDragOver && 'border-primary/50 bg-primary/5'\n )}\n >\n <Label\n htmlFor=\"feature-description\"\n className=\"text-muted-foreground text-xs font-semibold tracking-wider\"\n >\n {t('createDrawer.describeFeature')}\n </Label>\n <div\n ref={promptContainerRef}\n onFocus={handlePromptFocus}\n onBlur={handlePromptBlur}\n className={cn(\n 'border-input flex h-56 flex-col overflow-hidden rounded-md border shadow-xs transition-[color,box-shadow]',\n isPromptFocused && 'ring-ring/50 border-ring ring-[3px]'\n )}\n >\n <Textarea\n id=\"feature-description\"\n placeholder={t('createDrawer.featurePlaceholder')}\n value={description}\n onChange={(e) => setDescription(e.target.value)}\n onPaste={handlePaste}\n required\n disabled={isSubmitting}\n className=\"min-h-0 flex-1 resize-none rounded-none border-0 shadow-none focus-visible:ring-0\"\n />\n {/* Inline attachment chips — between textarea and controls */}\n {attachments.length > 0 && (\n <div className=\"flex flex-wrap items-center gap-1.5 px-3 py-2\">\n {attachments.map((file) => (\n <AttachmentChip\n key={file.id}\n name={file.name}\n size={file.size}\n mimeType={file.mimeType}\n path={file.path}\n onRemove={() => handleRemoveFile(file.id)}\n disabled={isSubmitting}\n loading={file.loading}\n notes={file.notes}\n onNotesChange={(notes) => handleNotesChange(file.id, notes)}\n />\n ))}\n </div>\n )}\n {uploadError ? (\n <p className=\"text-destructive px-3 pb-2 text-xs\">{uploadError}</p>\n ) : null}\n <div className=\"border-input flex items-center gap-3 border-t px-3 py-1.5\">\n <AgentModelPicker\n // No hardcoded `'claude-code'` fallback — `currentAgentType`\n // already comes from the user's settings via the create\n // drawer page's SSR pass (single source of truth). When\n // settings is absent (impossible in practice but kept\n // defensive), the picker shows an empty label and the\n // user can pick an agent explicitly.\n initialAgentType={overrideAgent ?? currentAgentType ?? ''}\n initialModel={overrideModel ?? currentModel ?? ''}\n mode=\"override\"\n onAgentModelChange={(agent, model) => {\n setOverrideAgent(agent);\n setOverrideModel(model);\n }}\n disabled={isSubmitting}\n className=\"w-55\"\n />\n <Tooltip>\n <TooltipTrigger asChild>\n <div className=\"ml-auto flex cursor-pointer items-center gap-2\">\n <Switch\n id=\"pending-mode\"\n checked={pending}\n onCheckedChange={setPending}\n disabled={isSubmitting}\n />\n <Label\n htmlFor=\"pending-mode\"\n className=\"flex cursor-pointer items-center gap-1 text-sm font-medium\"\n >\n <Clock className=\"h-3.5 w-3.5\" />\n {t('createDrawer.pendingMode')}\n </Label>\n </div>\n </TooltipTrigger>\n <TooltipContent side=\"bottom\">\n {t('createDrawer.pendingModeDescription')}\n </TooltipContent>\n </Tooltip>\n <div\n role=\"group\"\n aria-label={t('createDrawer.modeGroupLabel')}\n className=\"border-input flex items-center gap-0.5 rounded-md border p-0.5\"\n >\n {BUILD_MODE_ORDER.map((m) => {\n const meta = BUILD_MODE_META[m];\n const Icon = meta.icon;\n const isActive = mode === m;\n return (\n <Tooltip key={m}>\n <TooltipTrigger asChild>\n <button\n type=\"button\"\n data-testid={`build-mode-${m}`}\n aria-pressed={isActive}\n aria-disabled={isSubmitting}\n disabled={isSubmitting}\n onClick={() => setMode(m)}\n className={cn(\n 'flex cursor-pointer items-center gap-1 rounded-sm px-2 py-1 text-xs font-medium transition-colors',\n isActive\n ? 'bg-accent text-foreground'\n : 'text-muted-foreground hover:text-foreground',\n 'disabled:cursor-not-allowed disabled:opacity-50'\n )}\n >\n <Icon className=\"h-3.5 w-3.5\" />\n {t(meta.labelKey)}\n </button>\n </TooltipTrigger>\n <TooltipContent role=\"tooltip\" side=\"bottom\">\n {t(`${meta.labelKey}Description`)}\n </TooltipContent>\n </Tooltip>\n );\n })}\n </div>\n <Tooltip>\n <TooltipTrigger asChild>\n <button\n type=\"button\"\n onClick={handleAddFiles}\n disabled={isSubmitting}\n aria-label={t('chat.attachFiles')}\n className=\"text-muted-foreground hover:text-foreground cursor-pointer rounded p-1 transition-colors\"\n >\n <PaperclipIcon className=\"h-4 w-4\" />\n </button>\n </TooltipTrigger>\n <TooltipContent side=\"bottom\">{t('chat.attachFiles')}</TooltipContent>\n </Tooltip>\n </div>\n </div>\n </div>\n\n {/* Parent feature selector (only when opened from a feature node) */}\n {hasFeatures && initialParentId !== undefined ? (\n <div className=\"flex flex-col gap-1.5\">\n <Label\n htmlFor=\"parent-feature\"\n className=\"text-muted-foreground text-xs font-semibold tracking-wider\"\n >\n {t('createDrawer.parentFeature')}\n </Label>\n <ParentFeatureCombobox\n features={features}\n value={parentId}\n onChange={setParentId}\n disabled={isSubmitting}\n />\n </div>\n ) : null}\n\n {/* Approve + Git — compact switch groups */}\n <div className=\"flex flex-col gap-2\">\n {/* Approve row */}\n <div className=\"border-input flex items-center gap-4 rounded-md border px-3 py-2.5\">\n <Tooltip>\n <TooltipTrigger asChild>\n <span className=\"text-muted-foreground w-16 shrink-0 cursor-default text-xs font-semibold tracking-wider\">\n {t('createDrawer.approve')}\n </span>\n </TooltipTrigger>\n <TooltipContent side=\"bottom\">\n {t('createDrawer.approveDescription')}\n </TooltipContent>\n </Tooltip>\n <div className=\"flex flex-1 items-center gap-4\">\n {AUTO_APPROVE_OPTIONS.map((opt) => (\n <Tooltip key={opt.id}>\n <TooltipTrigger asChild>\n <div className=\"flex cursor-pointer items-center gap-1.5\">\n <Switch\n id={`approve-${opt.id}`}\n size=\"sm\"\n checked={approvalGates[opt.id] ?? false}\n onCheckedChange={(v) =>\n setApprovalGates((prev) => ({ ...prev, [opt.id]: v }))\n }\n disabled={\n isSubmitting ||\n (fast && (opt.id === 'allowPrd' || opt.id === 'allowPlan'))\n }\n />\n <Label\n htmlFor={`approve-${opt.id}`}\n className=\"cursor-pointer text-xs font-medium\"\n >\n {opt.label}\n </Label>\n </div>\n </TooltipTrigger>\n <TooltipContent side=\"bottom\">\n {fast && (opt.id === 'allowPrd' || opt.id === 'allowPlan')\n ? t('createDrawer.skippedInFastMode')\n : opt.description}\n </TooltipContent>\n </Tooltip>\n ))}\n </div>\n {/* Select all shortcut */}\n <Tooltip>\n <TooltipTrigger asChild>\n <button\n type=\"button\"\n onClick={() => {\n const allOn = AUTO_APPROVE_OPTIONS.every((o) => approvalGates[o.id]);\n const next: Record<string, boolean> = {};\n for (const o of AUTO_APPROVE_OPTIONS) next[o.id] = !allOn;\n setApprovalGates(next);\n }}\n disabled={isSubmitting}\n className={cn(\n 'text-muted-foreground hover:text-foreground cursor-pointer rounded px-1.5 py-0.5 text-[10px] font-semibold tracking-wider uppercase transition-colors',\n AUTO_APPROVE_OPTIONS.every((o) => approvalGates[o.id]) && 'text-primary'\n )}\n >\n {t('createDrawer.all')}\n </button>\n </TooltipTrigger>\n <TooltipContent side=\"bottom\">\n {t('createDrawer.toggleAllApprovalGates')}\n </TooltipContent>\n </Tooltip>\n </div>\n\n {/* Evidence row */}\n <div className=\"border-input flex items-center gap-4 rounded-md border px-3 py-2.5\">\n <Tooltip>\n <TooltipTrigger asChild>\n <span className=\"text-muted-foreground w-16 shrink-0 cursor-default text-xs font-semibold tracking-wider\">\n {t('createDrawer.evidence')}\n </span>\n </TooltipTrigger>\n <TooltipContent side=\"bottom\">\n {t('createDrawer.evidenceDescription')}\n </TooltipContent>\n </Tooltip>\n <div className=\"flex flex-1 items-center gap-4\">\n <Tooltip>\n <TooltipTrigger asChild>\n <div className=\"flex cursor-pointer items-center gap-1.5\">\n <Switch\n id=\"enable-evidence\"\n size=\"sm\"\n checked={enableEvidence}\n onCheckedChange={(v) => {\n setEnableEvidence(v);\n if (!v) setCommitEvidence(false);\n }}\n disabled={isSubmitting}\n />\n <Label\n htmlFor=\"enable-evidence\"\n className=\"cursor-pointer text-xs font-medium\"\n >\n {t('createDrawer.collect')}\n </Label>\n </div>\n </TooltipTrigger>\n <TooltipContent side=\"bottom\">\n {t('createDrawer.collectDescription')}\n </TooltipContent>\n </Tooltip>\n <Tooltip>\n <TooltipTrigger asChild>\n <div className=\"flex cursor-pointer items-center gap-1.5\">\n <Switch\n id=\"commit-evidence\"\n size=\"sm\"\n checked={commitEvidence}\n onCheckedChange={setCommitEvidence}\n disabled={isSubmitting || !enableEvidence || (!openPr && !forkAndPr)}\n />\n <Label\n htmlFor=\"commit-evidence\"\n className={cn(\n 'cursor-pointer text-xs font-medium',\n (!enableEvidence || (!openPr && !forkAndPr)) && 'opacity-50'\n )}\n >\n {t('createDrawer.addToPr')}\n </Label>\n </div>\n </TooltipTrigger>\n <TooltipContent side=\"bottom\">\n {!openPr && !forkAndPr\n ? t('createDrawer.requiresPr')\n : !enableEvidence\n ? t('createDrawer.requiresEvidence')\n : t('createDrawer.addToPrDescription')}\n </TooltipContent>\n </Tooltip>\n </div>\n </div>\n\n {/* Skills row */}\n <div className=\"border-input flex items-center gap-4 rounded-md border px-3 py-2.5\">\n <Tooltip>\n <TooltipTrigger asChild>\n <span className=\"text-muted-foreground w-16 shrink-0 cursor-default text-xs font-semibold tracking-wider\">\n {t('createDrawer.skills')}\n </span>\n </TooltipTrigger>\n <TooltipContent side=\"bottom\">\n {t('createDrawer.skillsDescription')}\n </TooltipContent>\n </Tooltip>\n <div className=\"flex flex-1 items-center gap-4\">\n <Tooltip>\n <TooltipTrigger asChild>\n <div className=\"flex cursor-pointer items-center gap-1.5\">\n <Switch\n id=\"inject-skills\"\n size=\"sm\"\n checked={injectSkills}\n onCheckedChange={setInjectSkills}\n disabled={isSubmitting}\n />\n <Label\n htmlFor=\"inject-skills\"\n className=\"flex cursor-pointer items-center gap-1 text-xs font-medium\"\n >\n <Puzzle className=\"h-3 w-3\" />\n {t('createDrawer.injectSkills')}\n </Label>\n </div>\n </TooltipTrigger>\n <TooltipContent side=\"bottom\">\n {t('createDrawer.injectSkillsDescription')}\n </TooltipContent>\n </Tooltip>\n </div>\n </div>\n\n {/* Git row */}\n <div className=\"border-input flex items-start gap-4 rounded-md border px-3 py-2.5\">\n <span className=\"text-muted-foreground w-16 shrink-0 pt-0.5 text-xs font-semibold tracking-wider\">\n {t('createDrawer.git')}\n </span>\n <div className=\"flex flex-1 flex-wrap items-center gap-4\">\n <Tooltip>\n <TooltipTrigger asChild>\n <div className=\"flex cursor-pointer items-center gap-1.5\">\n <Switch\n id=\"push\"\n size=\"sm\"\n checked={forkAndPr ? true : push || openPr}\n onCheckedChange={(v) => {\n setPush(v);\n if (!v && openPr) setOpenPr(false);\n }}\n disabled={isSubmitting || forkAndPr}\n />\n <Label\n htmlFor=\"push\"\n className={cn(\n 'cursor-pointer text-xs font-medium',\n forkAndPr && 'opacity-50'\n )}\n >\n {t('createDrawer.push')}\n </Label>\n </div>\n </TooltipTrigger>\n <TooltipContent side=\"bottom\">\n {forkAndPr\n ? 'Enabled — contributing to upstream'\n : t('createDrawer.pushDescription')}\n </TooltipContent>\n </Tooltip>\n <Tooltip>\n <TooltipTrigger asChild>\n <div className=\"flex cursor-pointer items-center gap-1.5\">\n <Switch\n id=\"open-pr\"\n size=\"sm\"\n checked={forkAndPr ? true : openPr}\n onCheckedChange={(v) => {\n setOpenPr(v);\n if (!v) setCommitEvidence(false);\n }}\n disabled={isSubmitting || forkAndPr}\n />\n <Label\n htmlFor=\"open-pr\"\n className={cn(\n 'cursor-pointer text-xs font-medium',\n forkAndPr && 'opacity-50'\n )}\n >\n {t('createDrawer.pr')}\n </Label>\n </div>\n </TooltipTrigger>\n <TooltipContent side=\"bottom\">\n {forkAndPr\n ? 'Enabled — contributing to upstream'\n : t('createDrawer.prDescription')}\n </TooltipContent>\n </Tooltip>\n <Tooltip>\n <TooltipTrigger asChild>\n <div className=\"flex cursor-pointer items-center gap-1.5\">\n <Switch\n id=\"ci-watch\"\n size=\"sm\"\n checked={ciWatchEnabled}\n onCheckedChange={setCiWatchEnabled}\n disabled={isSubmitting}\n />\n <Label htmlFor=\"ci-watch\" className=\"cursor-pointer text-xs font-medium\">\n {t('createDrawer.watch')}\n </Label>\n </div>\n </TooltipTrigger>\n <TooltipContent side=\"bottom\">\n {t('createDrawer.watchDescription')}\n </TooltipContent>\n </Tooltip>\n {/* Separator between standard git and repo options */}\n <div className=\"bg-border h-4 w-px shrink-0\" />\n <Tooltip>\n <TooltipTrigger asChild>\n <div className=\"flex cursor-pointer items-center gap-1.5\">\n <Switch\n id=\"rebase-before-branch\"\n size=\"sm\"\n checked={rebaseBeforeBranch}\n onCheckedChange={setRebaseBeforeBranch}\n disabled={isSubmitting}\n />\n <Label\n htmlFor=\"rebase-before-branch\"\n className=\"flex cursor-pointer items-center gap-1 text-xs font-medium\"\n >\n <RefreshCw className=\"h-3 w-3\" />\n {t('createDrawer.sync')}\n </Label>\n </div>\n </TooltipTrigger>\n <TooltipContent side=\"bottom\">\n {t('createDrawer.syncDescription')}\n </TooltipContent>\n </Tooltip>\n <Tooltip>\n <TooltipTrigger asChild>\n <div className=\"flex cursor-pointer items-center gap-1.5\">\n <Switch\n id=\"commit-specs\"\n size=\"sm\"\n checked={commitSpecs}\n onCheckedChange={setCommitSpecs}\n disabled={isSubmitting}\n />\n <Label\n htmlFor=\"commit-specs\"\n className=\"flex cursor-pointer items-center gap-1 text-xs font-medium\"\n >\n <FileText className=\"h-3 w-3\" />\n {t('createDrawer.commitSpecs')}\n </Label>\n </div>\n </TooltipTrigger>\n <TooltipContent side=\"bottom\">\n {t('createDrawer.commitSpecsDescription')}\n </TooltipContent>\n </Tooltip>\n {!canPush && (\n <Tooltip>\n <TooltipTrigger asChild>\n <div className=\"flex cursor-pointer items-center gap-1.5\">\n <Switch\n id=\"fork-and-pr\"\n size=\"sm\"\n checked={forkAndPr}\n onCheckedChange={(v) => {\n setForkAndPr(v);\n // Auto-flip commitSpecs to false when enabling contribute mode\n if (v) setCommitSpecs(false);\n }}\n disabled={isSubmitting}\n />\n <Label\n htmlFor=\"fork-and-pr\"\n className=\"flex cursor-pointer items-center gap-1 text-xs font-medium\"\n >\n <GitFork className=\"h-3 w-3\" />\n {t('createDrawer.forkAndPr')}\n </Label>\n </div>\n </TooltipTrigger>\n <TooltipContent side=\"bottom\">\n {t('createDrawer.forkAndPrDescription')}\n </TooltipContent>\n </Tooltip>\n )}\n </div>\n </div>\n </div>\n </form>\n </TooltipProvider>\n </div>\n </BaseDrawer>\n );\n}\n\n/* ---------------------------------------------------------------------------\n * ParentFeatureCombobox — searchable dropdown for parent feature selection\n * ------------------------------------------------------------------------- */\n\ninterface ParentFeatureComboboxProps {\n features: ParentFeatureOption[];\n value: string | undefined;\n onChange: (id: string | undefined) => void;\n disabled?: boolean;\n}\n\nfunction ParentFeatureCombobox({\n features,\n value,\n onChange,\n disabled,\n}: ParentFeatureComboboxProps) {\n const { t } = useTranslation('web');\n const [open, setOpen] = useState(false);\n const [query, setQuery] = useState('');\n const inputRef = useRef<HTMLInputElement>(null);\n\n const selectedFeature = features.find((f) => f.id === value);\n\n const filtered = query.trim()\n ? features.filter(\n (f) =>\n f.name.toLowerCase().includes(query.toLowerCase()) ||\n f.id.toLowerCase().includes(query.toLowerCase())\n )\n : features;\n\n const handleSelect = useCallback(\n (id: string | undefined) => {\n onChange(id);\n setOpen(false);\n setQuery('');\n },\n [onChange]\n );\n\n useEffect(() => {\n if (open) {\n setTimeout(() => inputRef.current?.focus(), 0);\n } else {\n setQuery('');\n }\n }, [open]);\n\n return (\n <Popover open={open} onOpenChange={setOpen}>\n <PopoverTrigger asChild>\n <button\n id=\"parent-feature\"\n type=\"button\"\n role=\"combobox\"\n aria-expanded={open}\n aria-label=\"Parent Feature\"\n disabled={disabled}\n data-testid=\"parent-feature-combobox\"\n className={cn(\n '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',\n !selectedFeature && 'text-muted-foreground'\n )}\n >\n <span className=\"truncate\">\n {selectedFeature\n ? `${selectedFeature.name} (${selectedFeature.id.slice(0, 8)})`\n : t('createDrawer.selectParent')}\n </span>\n <ChevronsUpDown className=\"ms-2 h-4 w-4 shrink-0 opacity-50\" />\n </button>\n </PopoverTrigger>\n <PopoverContent\n className=\"w-80 p-0\"\n align=\"start\"\n data-testid=\"parent-feature-combobox-content\"\n >\n <div className=\"flex flex-col\">\n {/* Search input */}\n <div className=\"border-b p-2\">\n <Input\n ref={inputRef}\n placeholder={t('createDrawer.searchFeatures')}\n value={query}\n onChange={(e) => setQuery(e.target.value)}\n className=\"h-8 border-0 p-0 text-sm shadow-none focus-visible:ring-0\"\n data-testid=\"parent-feature-search\"\n />\n </div>\n\n {/* Options list */}\n <div className=\"max-h-48 overflow-y-auto py-1\" role=\"listbox\" aria-label=\"Features\">\n {/* No parent option */}\n <button\n type=\"button\"\n role=\"option\"\n aria-selected={value === undefined}\n onClick={() => handleSelect(undefined)}\n className={cn(\n 'hover:bg-accent hover:text-accent-foreground flex w-full items-center gap-2 px-3 py-2 text-sm',\n value === undefined && 'bg-accent/50'\n )}\n data-testid=\"parent-feature-option-none\"\n >\n <CheckIcon className={cn('h-4 w-4 shrink-0', value !== undefined && 'invisible')} />\n <span className=\"text-muted-foreground italic\">{t('createDrawer.noParent')}</span>\n </button>\n\n {filtered.length === 0 && query ? (\n <p className=\"text-muted-foreground px-3 py-2 text-sm\">\n {t('createDrawer.noFeaturesFound')}\n </p>\n ) : (\n filtered.map((f) => (\n <button\n key={f.id}\n type=\"button\"\n role=\"option\"\n aria-selected={value === f.id}\n onClick={() => handleSelect(f.id)}\n className={cn(\n 'hover:bg-accent hover:text-accent-foreground flex w-full items-center gap-2 px-3 py-2 text-sm',\n value === f.id && 'bg-accent/50'\n )}\n data-testid={`parent-feature-option-${f.id}`}\n >\n <CheckIcon className={cn('h-4 w-4 shrink-0', value !== f.id && 'invisible')} />\n <span className=\"truncate\">\n {f.name}{' '}\n <span className=\"text-muted-foreground font-mono text-xs\">\n ({f.id.slice(0, 8)})\n </span>\n </span>\n </button>\n ))\n )}\n </div>\n </div>\n </PopoverContent>\n </Popover>\n );\n}\n\n/* ---------------------------------------------------------------------------\n * RepositoryCombobox — searchable dropdown for repository selection\n * ------------------------------------------------------------------------- */\n\nexport interface RepositoryComboboxProps {\n repositories: RepositoryOption[];\n value: string | undefined;\n onChange: (path: string | undefined) => void;\n onAddRepository?: (repo: RepositoryOption) => void;\n disabled?: boolean;\n}\n\nexport function RepositoryCombobox({\n repositories,\n value,\n onChange,\n onAddRepository,\n disabled,\n}: RepositoryComboboxProps) {\n const [open, setOpen] = useState(false);\n const [query, setQuery] = useState('');\n const [isAdding, setIsAdding] = useState(false);\n const [addError, setAddError] = useState<string | null>(null);\n const [showReactPicker, setShowReactPicker] = useState(false);\n const inputRef = useRef<HTMLInputElement>(null);\n const { reactFileManager: useReactFileManager } = useFeatureFlags();\n const { t } = useTranslation('web');\n\n const selectedRepo = repositories.find((r) => r.path === value);\n\n const filtered = query.trim()\n ? repositories.filter(\n (r) =>\n r.name.toLowerCase().includes(query.toLowerCase()) ||\n r.path.toLowerCase().includes(query.toLowerCase())\n )\n : repositories;\n\n const handleSelect = useCallback(\n (path: string | undefined) => {\n onChange(path);\n setOpen(false);\n setQuery('');\n },\n [onChange]\n );\n\n const addRepoFromPath = useCallback(\n async (folderPath: string) => {\n const result = await addRepository({ path: folderPath });\n if (result.error) {\n setAddError(result.error);\n setIsAdding(false);\n return;\n }\n if (result.repository) {\n const newRepo: RepositoryOption = {\n id: result.repository.id,\n name: result.repository.name,\n path: result.repository.path,\n };\n onAddRepository?.(newRepo);\n onChange(newRepo.path);\n setOpen(false);\n setQuery('');\n }\n },\n [onAddRepository, onChange]\n );\n\n const handleAddRepository = useCallback(async () => {\n if (isAdding) return;\n\n if (useReactFileManager) {\n setShowReactPicker(true);\n return;\n }\n\n setIsAdding(true);\n setAddError(null);\n try {\n const folderPath = await pickFolder();\n if (!folderPath) {\n setIsAdding(false);\n return;\n }\n await addRepoFromPath(folderPath);\n } catch {\n // Native picker failed — fall back to React file manager\n setShowReactPicker(true);\n } finally {\n setIsAdding(false);\n }\n }, [isAdding, useReactFileManager, addRepoFromPath]);\n\n const handleReactPickerSelect = useCallback(\n async (path: string | null) => {\n setShowReactPicker(false);\n if (!path) return;\n setIsAdding(true);\n setAddError(null);\n try {\n await addRepoFromPath(path);\n } catch (err: unknown) {\n setAddError(err instanceof Error ? err.message : 'Failed to add repository');\n } finally {\n setIsAdding(false);\n }\n },\n [addRepoFromPath]\n );\n\n useEffect(() => {\n if (open) {\n setTimeout(() => inputRef.current?.focus(), 0);\n } else {\n setQuery('');\n }\n }, [open]);\n\n return (\n <>\n <Popover open={open} onOpenChange={setOpen}>\n <PopoverTrigger asChild>\n <button\n type=\"button\"\n role=\"combobox\"\n aria-expanded={open}\n aria-label=\"Repository\"\n disabled={disabled}\n data-testid=\"repository-combobox\"\n className={cn(\n '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',\n !selectedRepo && 'text-muted-foreground'\n )}\n >\n <span className=\"truncate\">\n {selectedRepo ? selectedRepo.name : 'Select repository...'}\n </span>\n <ChevronsUpDown className=\"ms-2 h-4 w-4 shrink-0 opacity-50\" />\n </button>\n </PopoverTrigger>\n <PopoverContent\n className=\"w-80 p-0\"\n align=\"start\"\n data-testid=\"repository-combobox-content\"\n >\n <div className=\"flex flex-col\">\n {/* Search input */}\n <div className=\"border-b p-2\">\n <Input\n ref={inputRef}\n placeholder={t('createDrawer.searchRepositories')}\n value={query}\n onChange={(e) => setQuery(e.target.value)}\n className=\"h-8 border-0 p-0 text-sm shadow-none focus-visible:ring-0\"\n data-testid=\"repository-search\"\n />\n </div>\n\n {/* Options list */}\n <div className=\"max-h-48 overflow-y-auto py-1\" role=\"listbox\" aria-label=\"Repositories\">\n {filtered.length === 0 ? (\n <p\n className=\"text-muted-foreground px-3 py-2 text-sm\"\n data-testid=\"repository-empty\"\n >\n No repositories found.\n </p>\n ) : (\n filtered.map((r) => (\n <button\n key={r.id}\n type=\"button\"\n role=\"option\"\n aria-selected={value === r.path}\n onClick={() => handleSelect(r.path)}\n className={cn(\n 'hover:bg-accent hover:text-accent-foreground flex w-full items-center gap-2 px-3 py-2 text-sm',\n value === r.path && 'bg-accent/50'\n )}\n data-testid={`repository-option-${r.id}`}\n >\n <CheckIcon\n className={cn('h-4 w-4 shrink-0', value !== r.path && 'invisible')}\n />\n <span className=\"flex flex-col items-start truncate\">\n <span className=\"flex items-center gap-1.5 truncate\">\n {r.name}\n {r.isFork ? (\n <Badge variant=\"outline\" className=\"h-4 shrink-0 px-1 text-[10px]\">\n <GitFork className=\"mr-0.5 h-2.5 w-2.5\" />\n Fork\n </Badge>\n ) : null}\n </span>\n <span className=\"text-muted-foreground truncate text-xs\">{r.path}</span>\n </span>\n </button>\n ))\n )}\n </div>\n\n {/* Add new repository — pinned outside scroll area */}\n <Separator />\n <button\n type=\"button\"\n onClick={handleAddRepository}\n disabled={isAdding}\n className=\"hover:bg-accent hover:text-accent-foreground flex w-full items-center gap-2 px-3 py-2 text-sm\"\n data-testid=\"add-repository-item\"\n >\n {isAdding ? (\n <Loader2 className=\"h-4 w-4 shrink-0 animate-spin\" />\n ) : (\n <FolderPlus className=\"h-4 w-4 shrink-0\" />\n )}\n <span>Add new repository...</span>\n </button>\n {addError ? (\n <p className=\"px-3 pb-2 text-xs text-red-500\" data-testid=\"add-repository-error\">\n {addError}\n </p>\n ) : null}\n </div>\n </PopoverContent>\n </Popover>\n <ReactFileManagerDialog\n open={showReactPicker}\n onOpenChange={(isOpen) => {\n if (!isOpen) setShowReactPicker(false);\n }}\n onSelect={handleReactPickerSelect}\n />\n </>\n );\n}\n","/* __next_internal_action_entry_do_not_use__ [{\"40a9bed0961557794854c68543db57f58a5b63635e\":\"getViewerPermission\"},\"src/presentation/web/app/actions/get-viewer-permission.ts\",\"\"] */\"use turbopack no side effects\";import{createServerReference,callServer,findSourceMapURL}from\"private-next-rsc-action-client-wrapper\";const $$RSC_SERVER_ACTION_0=/*#__PURE__*/createServerReference(\"40a9bed0961557794854c68543db57f58a5b63635e\",callServer,void 0,findSourceMapURL,\"getViewerPermission\");export{$$RSC_SERVER_ACTION_0 as getViewerPermission};"],"names":[],"mappings":"wCAAwM,IAAA,EAAA,EAAA,CAAA,CAAA,QAAsG,IAAM,EAAmC,CAAA,EAAA,EAAA,iBAAb,IAAa,AAAqB,EAAC,KAAxB,wCAAqE,EAAA,UAAU,CAAC,KAAK,EAAE,EAAA,gBAAgB,CAAC,gGCE7b,EAAA,EAAA,CAAA,CAAA,QACA,EAAA,CAAA,CAAA,QAAA,IAAA,EAAA,EAAA,CAAA,CAAA,QACA,EAAA,EAAA,CAAA,CAAA,QAAA,EAAA,EAAA,CAAA,CAAA,OAAA,EAAA,EAAA,CAAA,CAAA,QAAA,EAAA,EAAA,CAAA,CAAA,QAAA,EAAA,EAAA,CAAA,CAAA,QAAA,EAAA,EAAA,CAAA,CAAA,QAAA,EAAA,EAAA,CAAA,CAAA,QAAA,EAAA,EAAA,CAAA,CAAA,QAAA,EAAA,EAAA,CAAA,CAAA,QAAA,EAAA,EAAA,CAAA,CAAA,QAAA,EAAA,EAAA,CAAA,CAAA,QAAA,EAAA,EAAA,CAAA,CAAA,QAAA,EAAA,EAAA,CAAA,CAAA,OAeA,EAAA,EAAA,CAAA,CAAA,QACA,EAAA,EAAA,CAAA,CAAA,QACA,EAAA,CAAA,CAAA,QAAA,IAAA,EAAA,EAAA,CAAA,CAAA,QACA,EAAA,EAAA,CAAA,CAAA,QACA,EAAA,EAAA,CAAA,CAAA,QACA,EAAA,EAAA,CAAA,CAAA,QACA,EAAA,EAAA,CAAA,CAAA,QACA,EAAA,EAAA,CAAA,CAAA,QACA,EAAA,EAAA,CAAA,CAAA,QACA,EAAA,EAAA,CAAA,CAAA,QACA,EAAA,EAAA,CAAA,CAAA,QACA,EAAA,EAAA,CAAA,CAAA,QACA,EAAA,EAAA,CAAA,CAAA,QACA,EAAA,CAAA,CAAA,QAAA,IAAA,EAAA,EAAA,CAAA,CAAA,QChCqN,EAAA,EAAA,CAAA,CAAA,QAAsG,IAAM,EAAmC,CAAA,EAAA,EAAA,iBAAb,IAAa,AAAqB,EAAC,KAAxB,wCAAqE,EAAA,UAAU,CAAC,KAAK,EAAE,EAAA,gBAAgB,CAAC,uBDmC1c,IAAA,EAAA,EAAA,CAAA,CAAA,QACA,EAAA,EAAA,CAAA,CAAA,QACA,EAAA,EAAA,CAAA,CAAA,QACA,EAAA,CAAA,CAAA,QAAA,IAAA,EAAA,EAAA,CAAA,CAAA,QACA,EAAA,EAAA,CAAA,CAAA,QACA,EAAA,EAAA,CAAA,CAAA,QACA,EAAA,EAAA,CAAA,CAAA,QACA,EAAA,EAAA,CAAA,CAAA,OA8BA,IAAM,EAAyC,CAAC,EAAA,SAAa,CAAC,IAAI,CAAE,EAAA,SAAa,CAAC,IAAI,CAAC,CAEjF,EAA6E,CAGjF,CAAC,EAAA,SAAa,CAAC,WAAW,CAAC,CAAE,CAAE,KAAM,EAAA,UAAU,CAAE,SAAU,8BAA+B,EAC1F,CAAC,EAAA,SAAa,CAAC,IAAI,CAAC,CAAE,CAAE,KAAM,EAAA,GAAG,CAAE,SAAU,uBAAwB,EACrE,CAAC,EAAA,SAAa,CAAC,IAAI,CAAC,CAAE,CAAE,KAAM,EAAA,aAAa,CAAE,SAAU,uBAAwB,CACjF,EA0DM,EAAqB,IAAI,IAAI,CACjC,OACA,OACA,QACA,OACA,QACA,OACA,OACA,OACA,OACA,OACA,QACA,OACA,QACA,OACA,QACA,OACA,MACA,OACA,QACA,QACA,OACA,OACA,MACA,OACA,MACA,OACA,MACA,MACA,MACA,MACA,QACA,KACA,OACA,KACA,OACA,MACA,SACA,MACA,QACA,OACA,QACA,QACA,MACA,QACA,OACA,QACA,QACA,OACA,OACA,QACA,OACA,OACA,OACA,MACA,OACD,EAOK,EAAuC,CAC3C,UAAU,EACV,WAAW,EACX,YAAY,CACd,EA6DO,SAAS,EAAoB,MAClC,CAAI,SACJ,CAAO,UACP,CAAQ,gBACR,CAAc,cACd,GAAe,CAAK,kBACpB,CAAgB,UAChB,CAAQ,cACR,CAAY,iBACZ,CAAe,kBACf,CAAgB,CAChB,cAAY,oBACZ,CAAkB,iBAClB,CAAe,aACf,CAAW,sBACX,CAAoB,CACK,EACzB,IAAM,OAAuC,IAAzB,EAKd,EACJ,GAAe,CAAC,EAAc,EAAA,SAAa,CAAC,IAAI,CAAG,EAC/C,EAAc,CAAA,EAAA,EAAA,cAAA,AAAc,EAAC,UAC7B,GAAE,CAAC,CAAE,CAAG,CAAA,EAAA,EAAA,cAAA,AAAc,EAAC,OAOvB,EAAiB,IAEnB,GACE,CAAC,GACuB,GAJR,CAIhB,EAHF,AAGe,MAAM,EACnB,EAAa,IAAI,CAAC,AAAC,GAAM,EAAE,IAAI,GAAK,EAAA,EACpC,EACA,GACA,EAAe,GAAkB,eAAiB,EAClD,EAAc,GAAkB,OAAQ,EACxC,EAAgB,GAAkB,QAAU,GAC5C,GAAiB,GAAkB,kBAAmB,EACtD,GAAwB,GAAkB,iBAAkB,EAC5D,GAAwB,GAAkB,iBAAkB,EAC5D,GAnDN,AAmDuC,IAnDnC,AAmDyD,AAlDzD,GAAkB,IAkDF,IAlDW,EAAc,AAD5B,EAC4B,GAAP,EADd,IACkC,CAAC,IAAI,CACxD,EAAA,SAAa,CAAC,IAAI,EAmDnB,CAAC,GAAa,GAAe,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,EAAC,GAAsB,IAGrE,CAAA,EAAA,EAAA,SAAA,AAAS,EAAC,KACJ,GACF,GAAe,EAEnB,EAAG,CAAC,EAAmB,EAEvB,GAAM,CAAC,CALmB,EAKN,GAAe,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,EAAmB,EAAE,EAC7D,CAAC,GAAe,GAAiB,CAAG,CAAA,EAAA,EAAA,QAAQ,AAAR,EAAkC,CAAE,GAAG,CAAY,AAAC,GACxF,CAAC,GAAM,GAAQ,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,EAAC,GAC3B,CAAC,GAAQ,GAAU,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,EAAC,GAC/B,CAAC,GAAgB,GAAkB,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,EAAC,GAAkB,kBAAmB,GACpF,CAAC,GAAgB,GAAkB,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,EAAC,IAC/C,CAAC,GAAgB,GAAkB,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,EAAC,IAC/C,CAAC,GAAU,GAAY,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,EAAqB,QACvD,CAAC,GAAM,GAAQ,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,EAAY,IACtC,GAAO,KAAS,EAAA,SAAa,CAAC,IAAI,CAClC,CAAC,GAAS,GAAW,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,GAAC,GACjC,CAAC,GAAW,GAAa,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,EAAC,IACrC,CAAC,GAAa,GAAe,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,GAAC,GACzC,CAAC,GAAoB,GAAsB,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,GAAC,GACvD,CAAC,GAAc,GAAgB,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,EAAC,GAAkB,eAAgB,GAC7E,CAAC,GAAe,GAAiB,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,EAAqB,QACjE,CAAC,GAAe,GAAiB,CAAG,CAAA,EAAA,EAAA,QAAQ,AAAR,OAA6B,GACjE,CAAC,GAAkB,GAAoB,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,EACtD,GAAiB,QAEb,CAAC,GAAY,GAAc,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,EAAqB,GAAgB,EAAE,EAC7E,CAAC,GAAY,GAAc,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,EAAC,IACvC,CAAC,GAAa,GAAe,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,EAAgB,MACxD,CAAC,GAAiB,GAAmB,CAAG,CAAA,EAAA,EAAA,QAAQ,AAAR,GAAS,GAGjD,GAAe,CAAA,EAAA,EAAA,MAAA,AAAM,EAAC,OAAO,UAAU,IACvC,GAAiB,CAAA,EAAA,EAAA,MAAA,AAAM,EAAC,GACxB,GAAqB,CAAA,EAAA,EAAA,MAAM,AAAN,EAAuB,MAMlD,CAAA,EAAA,EAAA,SAAA,AAAS,EAAC,KACJ,IACF,GAAiB,CAAE,GAAG,EAAiB,KADnB,QACgC,AAAC,GACrD,GAAQ,EAAiB,IAAI,EAC7B,GAAU,EAAiB,MAAM,EACjC,GAAkB,AAAoC,OAAnB,cAAc,EACjD,GAAkB,EAAiB,cAAc,EACjD,GAAkB,EAAiB,cAAc,EAC7C,AAAC,GACH,IAAkC,IAA1B,EAAiB,IAAI,CAAa,EAAA,EADjB,OAC8B,CAAC,IAAI,CAAG,EAAA,SAAa,CAAC,IAAI,EAEnF,GAAgB,EAAiB,YAAY,GAAI,GAErD,EAAG,CAAC,EAAkB,EAAqB,EAG3C,CAAA,EAAA,EAAA,SAAA,AAAS,EAAC,KACR,GAAc,GAAgB,EAAE,CAClC,EAAG,CAAC,EAAa,EAGjB,CAAA,EAAA,EAAA,SAAS,AAAT,EAAU,KACJ,GAAQ,GACV,GAAY,EAEhB,EAAG,CAAC,EAAM,EAAgB,EAHK,AAM/B,GAAM,CAAC,GAAS,GAAW,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,EAAC,IAAmB,GAG1D,CAAA,EAAA,EAAA,SAAA,AAAS,EAAC,KACR,GAAW,IAAmB,EAChC,EAAG,CAAC,EAAgB,EAGpB,IAAM,GAAc,CAAA,EAAA,EAAA,MAAA,AAAM,EAAC,IAC3B,CAAA,EAAA,EAAA,SAAA,AAAS,EAAC,KACJ,IAAoB,KAAqB,GAAY,OAAO,EAAE,CAChE,GAAY,OAAO,CAAG,GACtB,EAAoB,IACjB,IAAI,CAAC,AAAC,GAAW,GAAW,EAAO,eAAe,GAClD,KAAK,CAAC,IAAM,IAAW,IAE9B,EAAG,CAAC,GAAiB,EAGrB,CAAA,EAAA,EAAA,SAAA,AAAS,EAAC,KACJ,KACF,IADW,AACE,GACb,GAAQ,GACR,GAAU,GACV,IAAe,GAEnB,EAAG,CAAC,GAAS,EAAa,EAAc,EAExC,IAAM,GAAY,CAAA,EAAA,EAAA,WAAA,AAAW,EAAC,KAC5B,GAAe,IACf,GAAe,EAAE,EACjB,GAAiB,CAAE,GAAG,CAAa,AAAD,GAClC,GAAQ,GACR,GAAU,GACV,GAAkB,IAClB,GAAkB,IAClB,GAAkB,IAClB,QAAY,GACZ,GAAoB,QAAiB,GACrC,GAAc,GAAgB,EAAE,EAChC,GAAQ,IACR,IAAW,GACX,IAAa,GACb,IAAe,GACf,IAAsB,GACtB,QAAiB,GACjB,QAAiB,GACjB,GAAe,MACf,GAAe,OAAO,CAAG,EACzB,IAAc,EAChB,EAAG,CACD,EACA,EACA,EACA,GACA,GACA,GACA,GACA,EACA,EACD,EAGK,GAAiC,KAAvB,GAAY,IAAI,IAAa,GAAY,MAAM,CAAG,EAG5D,CAAE,eAAY,CAAE,CAAG,CAAA,EAAA,EAAA,qBAAA,AAAqB,EAAC,MAAE,UAAM,WAAS,EAAS,QAAS,EAAU,GAGtF,GAAc,CAAA,EAAA,EAAA,WAAA,AAAW,EAAC,MAAO,IAGrC,IAAK,IAAM,KAFX,GAAe,MAEI,GAAU,CAE3B,GAAI,EAAK,IAAI,CAnUG,EAmUA,GAnUK,IAmUU,GAnUH,MAAM,GAoUhC,GAAe,CAAC,CApUwB,AAoUvB,EAAE,EAAK,IAAI,CAAC,qBAAqB,CAAC,EAIrD,IAAM,EAAM,AA5QlB,SAAsB,AAAb,CAA6B,EACpC,IAAM,EAAM,EAAS,WAAW,CAAC,KACjC,OAAO,GAAO,EAAI,EAAS,KAAK,CAAC,GAAK,WAAW,GAAK,EACxD,EAyQ+B,EAAK,IAAI,EAClC,GAAI,GAAO,CAAC,EAAmB,GAAG,CAAC,GAAM,YACvC,GAAe,CAAC,WAAW,EAAE,EAAI,gBAAgB,CAAC,CAGtD,CAEA,IAAK,IAAM,KAAQ,EAAU,CAC3B,IAAM,EAAS,OAAO,UAAU,GAGhC,GAAe,AAAC,GAAS,IACpB,EACH,CACE,GAAI,EACJ,KAAM,EAAK,IAAI,CACf,KAAM,EAAK,IAAI,CACf,SAAU,EAAK,IAAI,EAAI,2BACvB,KAAM,GACN,SAAS,CACX,EACD,EAED,GAAI,CACF,IAAM,EAAW,IAAI,SACrB,EAAS,MAAM,CAAC,OAAQ,GACxB,EAAS,MAAM,CAAC,YAAa,GAAa,OAAO,EAEjD,IAAM,EAAM,MAAM,MAAM,0BAA2B,CACjD,OAAQ,OACR,KAAM,CACR,GAEA,GAAI,CAAC,EAAI,EAAE,CAAE,CACX,IAAM,EAAO,MAAM,EAAI,IAAI,GAAG,KAAK,CAAC,IAAM,AAAC,EAAE,MAAO,gBAAgB,CAAC,EAErE,GAAe,AAAC,GAAS,EAAK,MAAM,CAAC,AAAC,GAAM,EAAE,EAAE,GAAK,IACrD,GAAe,EAAK,KAAK,EAAI,iBAC7B,MACF,CAEA,IAAM,EAAW,MAAM,EAAI,IAAI,GAE/B,GAAe,AAAC,GACC,AACf,EADoB,EAChB,EADoB,CAAC,AAAC,GAAM,EAAE,AACtB,EADwB,GAAK,GAAU,EAAE,IAAI,GAAK,EAAS,IAAI,EACxD,EAAK,MAAM,CAAC,AAAC,GAAM,EAAE,EAAE,GAAK,GACxC,EAAK,GAAG,CAAC,AAAC,GACf,EAAE,EAAE,GAAK,EAAS,CAAE,GAAG,CAAQ,CAAE,GAAI,EAAQ,SAAS,CAAM,EAAI,GAGtE,CAAE,KAAM,CACN,GAAe,AAAC,GAAS,EAAK,MAAM,CAAC,AAAC,GAAM,EAAE,EAAE,GAAK,IACrD,GAAe,gBACjB,CACF,CACF,EAAG,EAAE,EAEC,GAAkB,CAAA,EAAA,EAAA,WAAA,AAAW,EAAE,AAAD,IAClC,EAAE,cAAc,GAChB,EAAE,eAAe,GACjB,GAAe,OAAO,EAAI,EACtB,AAA2B,GAAG,IAAf,OAAO,EACxB,IAAc,EAElB,EAAG,EAAE,EAEC,GAAkB,CAAA,EAAA,EAAA,WAAA,AAAW,EAAC,AAAC,IACnC,EAAE,cAAc,GAChB,EAAE,eAAe,GACjB,GAAe,OAAO,EAAI,EACK,GAAG,CAA9B,GAAe,OAAO,EACxB,IAAc,EAElB,EAAG,EAAE,EAEC,GAAiB,CAAA,EAAA,EAAA,WAAA,AAAW,EAAC,AAAC,IAClC,EAAE,cAAc,GAChB,EAAE,eAAe,EACnB,EAAG,EAAE,EAEC,GAAa,CAAA,EAAA,EAAA,WAAA,AAAW,EAC5B,AAAC,IACC,EAAE,cAAc,GAChB,EAAE,eAAe,GACjB,GAAe,OAAO,CAAG,EACzB,IAAc,GAEd,IAAM,EAAQ,MAAM,IAAI,CAAC,EAAE,YAAY,CAAC,KAAK,EACzC,EAAM,MAAM,CAAG,GAAG,AACpB,GAAY,EAEhB,EACA,CAAC,GAAY,EAGT,GAAc,CAAA,EAAA,EAAA,WAAA,AAAW,EAC7B,AAAC,IACC,IAAM,EAAQ,EAAE,aAAa,EAAE,MAC/B,GAAI,CAAC,EAAO,OAEZ,IAAM,EAAgB,EAAE,CACxB,IAAK,IAAM,KAAQ,MAAM,IAAI,CAAC,GAC5B,GAAkB,CADkB,QAChC,EAAK,IAAI,CAAa,CACxB,IAAM,EAAO,EAAK,SAAS,GACvB,GAAM,EAAM,IAAI,CAAC,EACvB,CAGE,EAAM,MAAM,CAAG,GAAG,CACpB,EAAE,cAAc,GAChB,GAAY,GAEhB,EACA,CAAC,GAAY,EAGT,GAAe,CAAA,EAAA,EAAA,WAAA,AAAW,EAC7B,AAAD,IAEE,GADA,EAAE,cAAc,GACZ,CAAC,GAAY,IAAI,GAAI,OACzB,IAAM,EAAoB,IAAoB,EACzC,IACL,EAAY,IAAI,GAChB,EAAS,CACP,GAHsB,SAGT,GAAY,IAAI,GAC7B,YAAa,GAAY,MAAM,CAAC,AAAC,GAAM,CAAC,EAAE,OAAO,EACjD,eAAgB,EAChB,cAAe,CACb,SAAU,GAAc,QAAQ,GAAI,EACpC,UAAW,GAAc,SAAS,GAAI,EACtC,WAAY,GAAc,UAAU,EAAI,EAC1C,EACA,KAAM,MAAmB,IAAQ,EAAf,CAClB,SAAQ,IAAmB,QAAP,UACpB,kBACA,kBACA,QACA,aACA,eACA,sBACA,gBACA,GACA,GAAI,GAAU,SAAE,EAAQ,EAAI,CAAC,CAAC,CAC9B,GAAI,GAAgB,CAAE,UAAW,EAAc,EAAI,CAAC,CAAC,CACrD,GAAI,GAAgB,CAAE,MAAO,EAAc,EAAI,CAAC,CAAC,CACjD,GAAI,GAAW,CAAE,WAAS,EAAI,CAAC,CAAC,CAChC,GAAI,EAAuB,CAAE,cAAe,CAAqB,EAAI,CAAC,CAAC,CACvE,UAAW,GAAa,OAAO,AACjC,GACA,KACF,EACA,CACE,GACA,GACA,GACA,GACA,EACA,EACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,EACA,EACA,GACD,EAGG,GAAiB,CAAA,EAAA,EAAA,WAAA,AAAW,EAAC,UACjC,GAAI,CACF,IAAM,EAAQ,MAAM,CAAA,EAAA,EAAA,SAAA,AAAS,IAC7B,GAAI,CAAC,EAAO,OAEZ,IAAK,IAAM,KAAQ,EAAO,CACxB,IAAM,EAAS,OAAO,UAAU,GAEhC,GAAe,AAAC,GAAS,IACpB,EACH,CACE,GAAI,EACJ,KAAM,EAAK,IAAI,CACf,KAAM,EAAK,IAAI,CACf,SAAU,2BACV,KAAM,GACN,SAAS,CACX,EACD,EAED,GAAI,CACF,IAAM,EAAM,MAAM,MAAM,oCAAqC,CAC3D,OAAQ,OACR,QAAS,CAAE,eAAgB,kBAAmB,EAC9C,KAAM,KAAK,SAAS,CAAC,CAAE,KAAM,EAAK,IAAI,CAAE,UAAW,GAAa,OAAO,AAAC,EAC1E,GAEA,GAAI,CAAC,EAAI,EAAE,CAAE,CACX,IAAM,EAAO,MAAM,EAAI,IAAI,GAAG,KAAK,CAAC,IAAM,CAAC,CAAE,MAAO,gBAAgB,CAAC,EACrE,GAAe,AAAC,GAAS,EAAK,MAAM,CAAC,AAAC,GAAM,EAAE,EAAE,GAAK,IACrD,GAAe,EAAK,KAAK,EAAI,iBAC7B,MACF,CAEA,IAAM,EAAW,MAAM,EAAI,IAAI,GAC/B,GAAe,AAAC,GACC,AACf,EADoB,EAChB,EADoB,CAAC,AAAC,GAAM,EAAE,AACtB,EADwB,GAAK,GAAU,EAAE,IAAI,GAAK,EAAS,IAAI,EACxD,EAAK,MAAM,CAAC,AAAC,GAAM,EAAE,EAAE,GAAK,GACxC,EAAK,GAAG,CAAC,AAAC,GACf,EAAE,EAAE,GAAK,EAAS,CAAE,GAAG,CAAQ,CAAE,GAAI,EAAQ,SAAS,CAAM,EAAI,GAGtE,CAAE,KAAM,CACN,GAAe,AAAC,GAAS,EAAK,MAAM,CAAC,AAAC,GAAM,EAAE,EAAE,GAAK,IACrD,GAAe,gBACjB,CACF,CACF,CAAE,KAAM,CAER,CACF,EAAG,EAAE,EAEC,GAAmB,CAAA,EAAA,EAAA,WAAA,AAAW,EAAC,AAAC,IACpC,GAAe,AAAC,GAAS,EAAK,MAAM,CAAC,AAAC,GAAM,EAAE,EAAE,GAAK,GACvD,EAAG,EAAE,EAEC,GAAoB,CAAA,EAAA,EAAA,WAAW,AAAX,EAAY,CAAC,EAAY,KACjD,GAAgB,AAAD,GAAU,EAAK,GAAG,CAAC,AAAC,GAAO,EAAE,EAAE,GAAK,EAAK,CAAE,GAAG,CAAC,OAAE,CAAM,EAAI,GAC5E,EAAG,EAAE,EAEC,GAAU,CAAA,EAAA,EAAA,MAAA,AAAM,EAAkB,MAElC,GAAgB,CAAA,EAAA,EAAA,WAAA,AAAW,EAAC,AAAC,KAC5B,EAAE,OAAO,EAAI,EAAE,OAAA,AAAO,GAAe,SAAS,CAAnB,EAAE,GAAG,GACnC,EAAE,cAAc,GAChB,GAAQ,OAAO,EAAE,gBAErB,EAAG,EAAE,EAEC,GAAoB,CAAA,EAAA,EAAA,WAAA,AAAW,EAAC,KACpC,IAAmB,EACrB,EAAG,EAAE,EAEC,GAAmB,CAAA,EAAA,EAAA,WAAA,AAAW,EAAC,KAInC,WAAW,KACT,IAAM,EAAkB,GAAmB,OAAO,EAAE,SAAS,SAAS,aAAa,EAC7E,EACJ,GAAmB,OAAO,EAAE,cAAc,4BAA8B,IACtE,CAAC,GAAoB,GACvB,IAAmB,EAEvB,EAAG,EACL,EAAG,CAJyB,CAIvB,EAJ2C,AAM1C,GAAc,GAAY,EAAS,MAAM,CAAG,EAC5C,GAAY,CAAC,GAAiB,CAAC,GAC/B,GAAmB,CAAC,QAAkC,IAAjB,EAErC,GAAuB,CAC3B,CAAE,GAAI,WAAY,MAAO,EAAE,oBAAqB,YAAa,EAAE,8BAA+B,EAC9F,CACE,GAAI,YACJ,MAAO,EAAE,qBACT,YAAa,EAAE,+BACjB,EACA,CACE,GAAI,aACJ,MAAO,EAAE,sBACT,YAAa,EAAE,gCACjB,EACD,CAED,MACE,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,UAAU,CAAA,CACT,KAAM,EACN,QAAS,GACT,KAAK,KACL,OAAO,EACP,qBAAqB,CAAA,CAAA,EACrB,cAAY,wBACZ,OACE,CAAA,EAAA,EAAA,IAAA,EAAA,EAAA,QAAA,CAAA,WACE,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,oCACb,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,kDACf,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,WAAW,CAAA,UAAE,EAAE,2BAEjB,EACC,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,iBAAiB,CAAA,CAAC,OAAO,CAAA,CAAA,WACxB,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,UACC,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,KAAK,CAAA,CAAC,QAAQ,qBAAa,EAAE,+BAGhC,QAGR,OACE,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,4CACb,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,MAAM,CAAA,CAAC,QAAQ,UAAU,QAAS,GAAc,SAAU,WACxD,EAAE,yBAEL,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,MAAM,CAAA,CACL,KAAK,SACL,KAAK,sBACL,SAAU,CAAC,GAAY,IAAI,IAAM,GAAgB,YAEhD,EAAe,EAAE,yBAA2B,EAAE,4CAMrD,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,+BACb,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,eAAe,CAAA,CAAC,cAAe,aAC9B,CAAA,EAAA,EAAA,IAAA,EAAC,OAAA,CACC,IAAK,GACL,GAAG,sBACH,SAAU,GACV,UAAW,GACX,UAAU,gCAGT,EACC,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CACC,UAAU,wBACV,cAAY,wBACZ,6BAA2B,iBAE3B,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,KAAK,CAAA,CAAC,UAAU,sEACd,EAAE,6BAEL,CAAA,EAAA,EAAA,IAAA,EAAC,EAAA,OAAO,CAAA,WACN,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,cAAc,CAAA,CAAC,OAAO,CAAA,CAAA,WACrB,CAAA,EAAA,EAAA,GAAA,EAAC,IAAA,CACC,UAAU,qBACV,cAAY,sBACZ,gBAAc,OACd,mBAAiB,gCACjB,MAAO,EAAE,6CAER,GAAc,KAAK,AAAC,GAAM,EAAE,IAAI,GAAK,IAAgB,OACnD,CAAD,CAAiB,EAAc,KAAK,CAAC,KAAK,GAAG,GAAK,EAAA,CAAE,EACpD,MAGN,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,cAAc,CAAA,CAAC,GAAG,gCAAgC,KAAK,UAAU,KAAK,kBACpE,EAAE,4CAIP,GACF,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,wBAAwB,cAAY,kCACjD,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,KAAK,CAAA,CAAC,UAAU,sEACd,EAAE,6BAEL,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,CACC,aAAc,GACd,MAAO,GACP,SAAU,GACV,gBAAiB,AAAC,IAChB,GAAc,AAAC,GAAS,IAAI,EAAM,EAAK,EACvC,GAAoB,EAAK,IAAI,CAC/B,EACA,SAAU,OAGZ,EACF,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,wBAAwB,cAAY,kCACjD,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,KAAK,CAAA,CAAC,UAAU,sEACd,EAAE,6BAEL,CAAA,EAAA,EAAA,GAAA,EAAC,IAAA,CAAE,UAAU,UAAU,cAAY,+BAChC,GAAc,KAAK,AAAC,GAAM,EAAE,IAAI,GAAK,IAAgB,MACpD,EAAc,KAAK,CAAC,KAAK,GAAG,QAGhC,KAGJ,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CACC,KAAK,SACL,aAAY,EAAE,6BACd,iBAAgB,GAAa,OAAS,QACtC,YAAa,GACb,YAAa,GACb,WAAY,GACZ,OAAQ,GACR,UAAW,CAAA,EAAA,EAAA,EAAA,AAAE,EACX,qFACA,IAAc,4CAGhB,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,KAAK,CAAA,CACJ,QAAQ,sBACR,UAAU,sEAET,EAAE,kCAEL,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CACC,IAAK,GACL,QAAS,GACT,OAAQ,GACR,UAAW,CAAA,EAAA,EAAA,EAAA,AAAE,EACX,4GACA,IAAmB,iDAGrB,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,QAAQ,CAAA,CACP,GAAG,sBACH,YAAa,EAAE,mCACf,MAAO,GACP,SAAU,AAAC,GAAM,GAAe,EAAE,MAAM,CAAC,KAAK,EAC9C,QAAS,GACT,QAAQ,CAAA,CAAA,EACR,SAAU,EACV,UAAU,sFAGX,GAAY,MAAM,CAAG,GACpB,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,yDACZ,GAAY,GAAG,CAAC,AAAC,GAChB,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,cAAc,CAAA,CAEb,KAAM,EAAK,IAAI,CACf,KAAM,EAAK,IAAI,CACf,SAAU,EAAK,QAAQ,CACvB,KAAM,EAAK,IAAI,CACf,SAAU,IAAM,GAAiB,EAAK,EAAE,EACxC,SAAU,EACV,QAAS,EAAK,OAAO,CACrB,MAAO,EAAK,KAAK,CACjB,cAAe,AAAC,GAAU,GAAkB,EAAK,EAAE,CAAE,IAThD,EAAK,EAAE,KAcnB,GACC,CAAA,EAAA,EAAA,GAAA,EAAC,IAAA,CAAE,UAAU,8CAAsC,KACjD,KACJ,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,sEACb,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,gBAAgB,CAAA,CAOf,iBAAkB,IAAiB,GAAoB,GACvD,aAAc,IAAiB,GAAgB,GAC/C,KAAK,WACL,mBAAoB,CAAC,EAAO,KAC1B,GAAiB,GACjB,GAAiB,EACnB,EACA,SAAU,EACV,UAAU,SAEZ,CAAA,EAAA,EAAA,IAAA,EAAC,EAAA,OAAO,CAAA,WACN,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,cAAc,CAAA,CAAC,OAAO,CAAA,CAAA,WACrB,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,2DACb,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,MAAM,CAAA,CACL,GAAG,eACH,QAAS,GACT,gBAAiB,GACjB,SAAU,IAEZ,CAAA,EAAA,EAAA,IAAA,EAAC,EAAA,KAAK,CAAA,CACJ,QAAQ,eACR,UAAU,uEAEV,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,KAAK,CAAA,CAAC,UAAU,gBAChB,EAAE,oCAIT,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,cAAc,CAAA,CAAC,KAAK,kBAClB,EAAE,4CAGP,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CACC,KAAK,QACL,aAAY,EAAE,+BACd,UAAU,0EAET,EAAiB,GAAG,CAAC,AAAC,IACrB,IAAM,EAAO,CAAe,CAAC,EAAE,CACzB,EAAO,EAAK,IAAI,CAChB,EAAW,KAAS,EAC1B,MACE,CAAA,EAAA,EAAA,IAAA,EAAC,EAAA,OAAO,CAAA,WACN,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,cAAc,CAAA,CAAC,OAAO,CAAA,CAAA,WACrB,CAAA,EAAA,EAAA,IAAA,EAAC,SAAA,CACC,KAAK,SACL,cAAa,CAAC,WAAW,EAAE,EAAA,CAAG,CAC9B,eAAc,EACd,gBAAe,EACf,SAAU,EACV,QAAS,IAAM,GAAQ,GACvB,UAAW,CAAA,EAAA,EAAA,EAAA,AAAE,EACX,oGACA,EACI,4BACA,8CACJ,6DAGF,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,CAAK,UAAU,gBACf,EAAE,EAAK,QAAQ,OAGpB,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,cAAc,CAAA,CAAC,KAAK,UAAU,KAAK,kBACjC,EAAE,CAAA,EAAG,EAAK,QAAQ,CAAC,WAAW,CAAC,MAtBtB,EA0BlB,KAEF,CAAA,EAAA,EAAA,IAAA,EAAC,EAAA,OAAO,CAAA,WACN,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,cAAc,CAAA,CAAC,OAAO,CAAA,CAAA,WACrB,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CACC,KAAK,SACL,QAAS,GACT,SAAU,EACV,aAAY,EAAE,oBACd,UAAU,oGAEV,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,aAAa,CAAA,CAAC,UAAU,gBAG7B,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,cAAc,CAAA,CAAC,KAAK,kBAAU,EAAE,kCAOxC,SAAmC,IAApB,EACd,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,kCACb,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,KAAK,CAAA,CACJ,QAAQ,iBACR,UAAU,sEAET,EAAE,gCAEL,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,CACC,SAAU,EACV,MAAO,GACP,SAAU,GACV,SAAU,OAGZ,KAGJ,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,gCAEb,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,+EACb,CAAA,EAAA,EAAA,IAAA,EAAC,EAAA,OAAO,CAAA,WACN,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,cAAc,CAAA,CAAC,OAAO,CAAA,CAAA,WACrB,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,UAAU,mGACb,EAAE,4BAGP,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,cAAc,CAAA,CAAC,KAAK,kBAClB,EAAE,wCAGP,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,0CACZ,GAAqB,GAAG,CAAC,AAAC,GACzB,CAAA,EAAA,EAAA,IAAA,EAAC,EAAA,OAAO,CAAA,WACN,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,cAAc,CAAA,CAAC,OAAO,CAAA,CAAA,WACrB,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,qDACb,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,MAAM,CAAA,CACL,GAAI,CAAC,QAAQ,EAAE,EAAI,EAAE,CAAA,CAAE,CACvB,KAAK,KACL,QAAS,EAAa,CAAC,EAAI,EAAE,CAAC,GAAI,EAClC,gBAAiB,AAAC,GAChB,GAAiB,AAAC,IAAU,CAAE,EAAH,CAAM,CAAI,CAAE,CAAC,EAAI,EAAE,CAAC,CAAE,EAAE,CAAC,EAEtD,SACE,GACC,KAAoB,GAAZ,UAAC,EAAI,EAAE,EAA8B,cAAX,EAAI,EAAE,AAAK,CAAW,GAG7D,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,KAAK,CAAA,CACJ,QAAS,CAAC,QAAQ,EAAE,EAAI,EAAE,CAAA,CAAE,CAC5B,UAAU,8CAET,EAAI,KAAK,QAIhB,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,cAAc,CAAA,CAAC,KAAK,kBAClB,KAAoB,GAAZ,UAAC,EAAI,EAAE,EAA8B,cAAX,EAAI,EAAE,AAAK,CAAW,CACrD,EAAE,kCACF,EAAI,WAAW,KA1BT,EAAI,EAAE,KAgCxB,CAAA,EAAA,EAAA,IAAA,EAAC,EAAA,OAAO,CAAA,WACN,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,cAAc,CAAA,CAAC,OAAO,CAAA,CAAA,WACrB,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CACC,KAAK,SACL,QAAS,KACP,IAAM,EAAQ,GAAqB,KAAK,CAAC,AAAC,GAAM,EAAa,CAAC,EAAE,EAAE,CAAC,EAC7D,EAAgC,CAAC,EACvC,IAAK,IAAM,KAAK,GAAsB,CAAI,CAAC,EAAE,EAAE,CAAC,CAAG,CAAC,EACpD,GAAiB,EACnB,EACA,SAAU,EACV,UAAW,CAAA,EAAA,EAAA,EAAA,AAAE,EACX,wJACA,GAAqB,KAAK,CAAC,AAAC,GAAM,EAAa,CAAC,EAAE,EAAE,CAAC,GAAK,yBAG3D,EAAE,wBAGP,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,cAAc,CAAA,CAAC,KAAK,kBAClB,EAAE,+CAMT,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,+EACb,CAAA,EAAA,EAAA,IAAA,EAAC,EAAA,OAAO,CAAA,WACN,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,cAAc,CAAA,CAAC,OAAO,CAAA,CAAA,WACrB,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,UAAU,mGACb,EAAE,6BAGP,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,cAAc,CAAA,CAAC,KAAK,kBAClB,EAAE,yCAGP,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,2CACb,CAAA,EAAA,EAAA,IAAA,EAAC,EAAA,OAAO,CAAA,WACN,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,cAAc,CAAA,CAAC,OAAO,CAAA,CAAA,WACrB,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,qDACb,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,MAAM,CAAA,CACL,GAAG,kBACH,KAAK,KACL,QAAS,GACT,gBAAiB,AAAC,IAChB,GAAkB,GACd,AAAC,GAAG,GAAkB,GAC5B,EACA,SAAU,IAEZ,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,KAAK,CAAA,CACJ,QAAQ,kBACR,UAAU,8CAET,EAAE,+BAIT,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,cAAc,CAAA,CAAC,KAAK,kBAClB,EAAE,wCAGP,CAAA,EAAA,EAAA,IAAA,EAAC,EAAA,OAAO,CAAA,WACN,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,cAAc,CAAA,CAAC,OAAO,CAAA,CAAA,WACrB,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,qDACb,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,MAAM,CAAA,CACL,GAAG,kBACH,KAAK,KACL,QAAS,GACT,gBAAiB,GACjB,SAAU,GAAgB,CAAC,IAAmB,CAAC,IAAU,CAAC,KAE5D,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,KAAK,CAAA,CACJ,QAAQ,kBACR,UAAW,CAAA,EAAA,EAAA,EAAA,AAAE,EACX,qCACA,CAAC,CAAC,IAAmB,CAAC,IAAU,CAAC,EAAA,CAAU,EAAK,uBAGjD,EAAE,+BAIT,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,cAAc,CAAA,CAAC,KAAK,kBAClB,AAAC,IAAW,GAET,AAAC,GAEC,AAJM,EAIJ,mCADF,EAAE,iCAFJ,EAAE,sCAUd,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,+EACb,CAAA,EAAA,EAAA,IAAA,EAAC,EAAA,OAAO,CAAA,WACN,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,cAAc,CAAA,CAAC,OAAO,CAAA,CAAA,WACrB,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,UAAU,mGACb,EAAE,2BAGP,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,cAAc,CAAA,CAAC,KAAK,kBAClB,EAAE,uCAGP,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,0CACb,CAAA,EAAA,EAAA,IAAA,EAAC,EAAA,OAAO,CAAA,WACN,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,cAAc,CAAA,CAAC,OAAO,CAAA,CAAA,WACrB,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,qDACb,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,MAAM,CAAA,CACL,GAAG,gBACH,KAAK,KACL,QAAS,GACT,gBAAiB,GACjB,SAAU,IAEZ,CAAA,EAAA,EAAA,IAAA,EAAC,EAAA,KAAK,CAAA,CACJ,QAAQ,gBACR,UAAU,uEAEV,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,MAAM,CAAA,CAAC,UAAU,YACjB,EAAE,qCAIT,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,cAAc,CAAA,CAAC,KAAK,kBAClB,EAAE,kDAOX,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,8EACb,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,UAAU,2FACb,EAAE,sBAEL,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,qDACb,CAAA,EAAA,EAAA,IAAA,EAAC,EAAA,OAAO,CAAA,WACN,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,cAAc,CAAA,CAAC,OAAO,CAAA,CAAA,WACrB,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,qDACb,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,MAAM,CAAA,CACL,GAAG,OACH,KAAK,KACL,UAAS,IAAmB,IAAQ,GACpC,CADqB,eACJ,AAAC,IAChB,GAAQ,GACJ,CAAC,GAAK,IAAQ,IAAU,EAC9B,EACA,SAAU,GAAgB,KAE5B,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,KAAK,CAAA,CACJ,QAAQ,OACR,UAAW,CAAA,EAAA,EAAA,EAAA,AAAE,EACX,qCACA,IAAa,uBAGd,EAAE,4BAIT,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,cAAc,CAAA,CAAC,KAAK,kBAClB,GACG,qCACA,EAAE,qCAGV,CAAA,EAAA,EAAA,IAAA,EAAC,EAAA,OAAO,CAAA,WACN,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,cAAc,CAAA,CAAC,OAAO,CAAA,CAAA,WACrB,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,qDACb,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,MAAM,CAAA,CACL,GAAG,UACH,KAAK,KACL,UAAS,IAAmB,GAC5B,KADqB,WACJ,AAAC,IAChB,GAAU,GACN,AAAC,GAAG,IAAkB,EAC5B,EACA,SAAU,GAAgB,KAE5B,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,KAAK,CAAA,CACJ,QAAQ,UACR,UAAW,CAAA,EAAA,EAAA,EAAA,AAAE,EACX,qCACA,IAAa,uBAGd,EAAE,0BAIT,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,cAAc,CAAA,CAAC,KAAK,kBAClB,GACG,qCACA,EAAE,mCAGV,CAAA,EAAA,EAAA,IAAA,EAAC,EAAA,OAAO,CAAA,WACN,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,cAAc,CAAA,CAAC,OAAO,CAAA,CAAA,WACrB,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,qDACb,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,MAAM,CAAA,CACL,GAAG,WACH,KAAK,KACL,QAAS,GACT,gBAAiB,GACjB,SAAU,IAEZ,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,KAAK,CAAA,CAAC,QAAQ,WAAW,UAAU,8CACjC,EAAE,6BAIT,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,cAAc,CAAA,CAAC,KAAK,kBAClB,EAAE,sCAIP,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,gCACf,CAAA,EAAA,EAAA,IAAA,EAAC,EAAA,OAAO,CAAA,WACN,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,cAAc,CAAA,CAAC,OAAO,CAAA,CAAA,WACrB,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,qDACb,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,MAAM,CAAA,CACL,GAAG,uBACH,KAAK,KACL,QAAS,GACT,gBAAiB,GACjB,SAAU,IAEZ,CAAA,EAAA,EAAA,IAAA,EAAC,EAAA,KAAK,CAAA,CACJ,QAAQ,uBACR,UAAU,uEAEV,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,SAAS,CAAA,CAAC,UAAU,YACpB,EAAE,6BAIT,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,cAAc,CAAA,CAAC,KAAK,kBAClB,EAAE,qCAGP,CAAA,EAAA,EAAA,IAAA,EAAC,EAAA,OAAO,CAAA,WACN,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,cAAc,CAAA,CAAC,OAAO,CAAA,CAAA,WACrB,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,qDACb,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,MAAM,CAAA,CACL,GAAG,eACH,KAAK,KACL,QAAS,GACT,gBAAiB,GACjB,SAAU,IAEZ,CAAA,EAAA,EAAA,IAAA,EAAC,EAAA,KAAK,CAAA,CACJ,QAAQ,eACR,UAAU,uEAEV,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,QAAQ,CAAA,CAAC,UAAU,YACnB,EAAE,oCAIT,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,cAAc,CAAA,CAAC,KAAK,kBAClB,EAAE,4CAGN,CAAC,IACA,CAAA,EAAA,EAAA,IAAA,EAAC,EAAA,OAAO,CAAA,WACN,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,cAAc,CAAA,CAAC,OAAO,CAAA,CAAA,WACrB,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,qDACb,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,MAAM,CAAA,CACL,GAAG,cACH,KAAK,KACL,QAAS,GACT,gBAAiB,AAAC,IAChB,GAAa,GAET,GAAG,IAAe,EACxB,EACA,SAAU,IAEZ,CAAA,EAAA,EAAA,IAAA,EAAC,EAAA,KAAK,CAAA,CACJ,QAAQ,cACR,UAAU,uEAEV,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,OAAO,CAAA,CAAC,UAAU,YAClB,EAAE,kCAIT,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,cAAc,CAAA,CAAC,KAAK,kBAClB,EAAE,2DAY3B,CAaA,SAAS,EAAsB,CAC7B,UAAQ,OACR,CAAK,UACL,CAAQ,UACR,CAAQ,CACmB,EAC3B,GAAM,GAAE,CAAC,CAAE,CAAG,CAAA,EAAA,EAAA,cAAA,AAAc,EAAC,OACvB,CAAC,EAAM,EAAQ,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,GAAC,GAC3B,CAAC,EAAO,EAAS,CAAG,CAAA,EAAA,EAAA,QAAQ,AAAR,EAAS,IAC7B,EAAW,CAAA,EAAA,EAAA,MAAA,AAAM,EAAmB,MAEpC,EAAkB,EAAS,IAAI,CAAC,AAAC,GAAM,EAAE,EAAE,GAAK,GAEhD,EAAW,EAAM,IAAI,GACvB,EAAS,MAAM,CACb,AAAC,GACC,EAAE,IAAI,CAAC,WAAW,GAAG,QAAQ,CAAC,EAAM,WAAW,KAC/C,EAAE,EAAE,CAAC,WAAW,GAAG,QAAQ,CAAC,EAAM,WAAW,KAEjD,EAEE,EAAe,CAAA,EAAA,EAAA,WAAA,AAAW,EAC9B,AAAC,IACC,EAAS,GACT,GAAQ,GACR,EAAS,GACX,EACA,CAAC,EAAS,EAWZ,MARA,CAAA,EAAA,EAAA,SAAA,AAAS,EAAC,KACJ,EACF,IADQ,OACG,IAAM,EAAS,OAAO,EAAE,QAAS,GAE5C,EAAS,GAEb,EAAG,CAAC,EAAK,EAGP,CAAA,EAAA,EAAA,IAAA,EAAC,EAAA,OAAO,CAAA,CAAC,KAAM,EAAM,aAAc,YACjC,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,cAAc,CAAA,CAAC,OAAO,CAAA,CAAA,WACrB,CAAA,EAAA,EAAA,IAAA,EAAC,SAAA,CACC,GAAG,iBACH,KAAK,SACL,KAAK,WACL,gBAAe,EACf,aAAW,iBACX,SAAU,EACV,cAAY,0BACZ,UAAW,CAAA,EAAA,EAAA,EAAA,AAAE,EACX,yPACA,CAAC,GAAmB,mCAGtB,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,UAAU,oBACb,EACG,CAAA,EAAG,EAAgB,IAAI,CAAC,EAAE,EAAE,EAAgB,EAAE,CAAC,KAAK,CAAC,EAAG,GAAG,CAAC,CAAC,CAC7D,EAAE,+BAER,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,cAAc,CAAA,CAAC,UAAU,0CAG9B,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,cAAc,CAAA,CACb,UAAU,WACV,MAAM,QACN,cAAY,2CAEZ,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,0BAEb,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,wBACb,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,KAAK,CAAA,CACJ,IAAK,EACL,YAAa,EAAE,+BACf,MAAO,EACP,SAAW,AAAD,GAAO,EAAS,EAAE,MAAM,CAAC,KAAK,EACxC,UAAU,4DACV,cAAY,4BAKhB,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,gCAAgC,KAAK,UAAU,aAAW,qBAEvE,CAAA,EAAA,EAAA,IAAA,EAAC,SAAA,CACC,KAAK,SACL,KAAK,SACL,qBAAyB,IAAV,EACf,QAAS,IAAM,OAAa,GAC5B,UAAW,CAAA,EAAA,EAAA,EAAA,AAAE,EACX,qGACU,IAAV,GAAuB,gBAEzB,cAAY,uCAEZ,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,SAAS,CAAA,CAAC,UAAW,CAAA,EAAA,EAAA,EAAA,AAAE,EAAC,wBAA8B,IAAV,GAAuB,eACpE,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,UAAU,wCAAgC,EAAE,8BAGnD,AAAoB,MAAX,MAAM,EAAU,EACxB,CAAA,EAAA,EAAA,GAAA,EAAC,IAAA,CAAE,UAAU,mDACV,EAAE,kCAGL,EAAS,GAAG,CAAE,AAAD,GACX,CAAA,EAAA,EAAA,IAAA,EAAC,SAAA,CAEC,KAAK,SACL,KAAK,SACL,gBAAe,IAAU,EAAE,EAAE,CAC7B,QAAS,IAAM,EAAa,EAAE,EAAE,EAChC,UAAW,CAAA,EAAA,EAAA,EAAA,AAAE,EACX,gGACA,IAAU,EAAE,EAAE,EAAI,gBAEpB,cAAa,CAAC,sBAAsB,EAAE,EAAE,EAAE,CAAA,CAAE,WAE5C,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,SAAS,CAAA,CAAC,UAAW,CAAA,EAAA,EAAA,EAAA,AAAE,EAAC,mBAAoB,IAAU,EAAE,EAAE,EAAI,eAC/D,CAAA,EAAA,EAAA,IAAA,EAAC,OAAA,CAAK,UAAU,qBACb,EAAE,IAAI,CAAE,IACT,CAAA,EAAA,EAAA,IAAA,EAAC,OAAA,CAAK,UAAU,oDAA0C,IACtD,EAAE,EAAE,CAAC,KAAK,CAAC,EAAG,GAAG,YAflB,EAAE,EAAE,aA0B3B,CAcO,SAAS,EAAmB,CACjC,cAAY,CACZ,OAAK,UACL,CAAQ,iBACR,CAAe,UACf,CAAQ,CACgB,EACxB,GAAM,CAAC,EAAM,EAAQ,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,GAAC,GAC3B,CAAC,EAAO,EAAS,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,EAAC,IAC7B,CAAC,EAAU,EAAY,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,GAAC,GACnC,CAAC,EAAU,EAAY,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,EAAgB,MAClD,CAAC,EAAiB,EAAmB,CAAG,CAAA,EAAA,EAAA,QAAQ,AAAR,GAAS,GACjD,EAAW,CAAA,EAAA,EAAA,MAAA,AAAM,EAAmB,MACpC,CAAE,iBAAkB,CAAmB,CAAE,CAAG,CAAA,EAAA,EAAA,eAAA,AAAe,IAC3D,GAAE,CAAC,CAAE,CAAG,CAAA,EAAA,EAAA,cAAA,AAAc,EAAC,OAEvB,EAAe,EAAa,IAAI,CAAC,AAAC,GAAM,EAAE,IAAI,GAAK,GAEnD,EAAW,EAAM,IAAI,GACvB,EAAa,MAAM,CACjB,AAAC,GACC,EAAE,IAAI,CAAC,WAAW,GAAG,QAAQ,CAAC,EAAM,WAAW,KAC/C,EAAE,IAAI,CAAC,WAAW,GAAG,QAAQ,CAAC,EAAM,WAAW,KAEnD,EAEE,EAAe,CAAA,EAAA,EAAA,WAAA,AAAW,EAC9B,AAAC,IACC,EAAS,GACT,GAAQ,GACR,EAAS,GACX,EACA,CAAC,EAAS,EAGN,EAAkB,CAAA,EAAA,EAAA,WAAA,AAAW,EACjC,MAAO,IACL,IAAM,EAAS,MAAM,CAAA,EAAA,EAAA,aAAA,AAAa,EAAC,CAAE,KAAM,CAAW,GACtD,GAAI,EAAO,KAAK,CAAE,CAChB,EAAY,EAAO,KAAK,EACxB,GAAY,GACZ,MACF,CACA,GAAI,EAAO,UAAU,CAAE,CACrB,IAAM,EAA4B,CAChC,GAAI,EAAO,UAAU,CAAC,EAAE,CACxB,KAAM,EAAO,UAAU,CAAC,IAAI,CAC5B,KAAM,EAAO,UAAU,CAAC,IAAI,AAC9B,EACA,IAAkB,GAClB,EAAS,EAAQ,IAAI,EACrB,GAAQ,GACR,EAAS,GACX,CACF,EACA,CAAC,EAAiB,EAAS,EAGvB,EAAsB,CAAA,EAAA,EAAA,WAAA,AAAW,EAAC,UACtC,IAAI,GAEJ,GAAI,EAAqB,EAFX,UAGZ,GAAmB,GAIrB,GAAY,GACZ,EAAY,MACZ,GAAI,CACF,IAAM,EAAa,MAAM,CAAA,EAAA,EAAA,UAAA,AAAU,IACnC,GAAI,CAAC,EAAY,YACf,GAAY,EAGd,OAAM,EAAgB,EACxB,CAAE,KAAM,CAEN,GAAmB,EACrB,QAAU,CACR,GAAY,EACd,EACF,EAAG,CAAC,EAAU,EAAqB,EAAgB,EAE7C,EAA0B,CAAA,EAAA,EAAA,WAAA,AAAW,EACzC,MAAO,IAEL,GADA,CACI,EADe,GACd,GACL,GADW,AACC,GACZ,EAAY,MACZ,GAAI,CACF,MAAM,EAAgB,EACxB,CAAE,MAAO,EAAc,CACrB,EAAY,aAAe,MAAQ,EAAI,OAAO,CAAG,2BACnD,QAAU,CACR,GAAY,EACd,EACF,EACA,CAAC,EAAgB,EAWnB,MARA,CAAA,EAAA,EAAA,SAAA,AAAS,EAAC,KACJ,EACF,IADQ,OACG,IAAM,EAAS,OAAO,EAAE,QAAS,GAE5C,EAAS,GAEb,EAAG,CAAC,EAAK,EAGP,CAAA,EAAA,EAAA,IAAA,EAAA,EAAA,QAAA,CAAA,WACE,CAAA,EAAA,EAAA,IAAA,EAAC,EAAA,OAAO,CAAA,CAAC,KAAM,EAAM,aAAc,YACjC,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,cAAc,CAAA,CAAC,OAAO,CAAA,CAAA,WACrB,CAAA,EAAA,EAAA,IAAA,EAAC,SAAA,CACC,KAAK,SACL,KAAK,WACL,gBAAe,EACf,aAAW,aACX,SAAU,EACV,cAAY,sBACZ,UAAW,CAAA,EAAA,EAAA,EAAA,AAAE,EACX,yPACA,CAAC,GAAgB,mCAGnB,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,UAAU,oBACb,EAAe,EAAa,IAAI,CAAG,yBAEtC,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,cAAc,CAAA,CAAC,UAAU,0CAG9B,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,cAAc,CAAA,CACb,UAAU,WACV,MAAM,QACN,cAAY,uCAEZ,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,0BAEb,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,wBACb,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,KAAK,CAAA,CACJ,IAAK,EACL,YAAa,EAAE,mCACf,MAAO,EACP,SAAU,AAAC,GAAM,EAAS,EAAE,MAAM,CAAC,KAAK,EACxC,UAAU,4DACV,cAAY,wBAKhB,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,gCAAgC,KAAK,UAAU,aAAW,wBAClD,IAApB,EAAS,MAAM,CACd,CAAA,EAAA,EAAA,GAAA,EAAC,IAAA,CACC,UAAU,0CACV,cAAY,4BACb,2BAID,EAAS,GAAG,CAAC,AAAC,GACZ,CAAA,EAAA,EAAA,IAAA,EAAC,SAAA,CAEC,KAAK,SACL,KAAK,SACL,gBAAe,IAAU,EAAE,IAAI,CAC/B,QAAS,IAAM,EAAa,EAAE,IAAI,EAClC,UAAW,CAAA,EAAA,EAAA,EAAA,AAAE,EACX,gGACA,IAAU,EAAE,IAAI,EAAI,gBAEtB,cAAa,CAAC,kBAAkB,EAAE,EAAE,EAAE,CAAA,CAAE,WAExC,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,SAAS,CAAA,CACR,UAAW,CAAA,EAAA,EAAA,EAAA,AAAE,EAAC,mBAAoB,IAAU,EAAE,IAAI,EAAI,eAExD,CAAA,EAAA,EAAA,IAAA,EAAC,OAAA,CAAK,UAAU,+CACd,CAAA,EAAA,EAAA,IAAA,EAAC,OAAA,CAAK,UAAU,+CACb,EAAE,IAAI,CACN,EAAE,MAAM,CACP,CAAA,EAAA,EAAA,IAAA,EAAC,EAAA,KAAK,CAAA,CAAC,QAAQ,UAAU,UAAU,0CACjC,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,OAAO,CAAA,CAAC,UAAU,uBAAuB,UAG1C,QAEN,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,UAAU,kDAA0C,EAAE,IAAI,QAxB7D,EAAE,EAAE,KAgCjB,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,SAAS,CAAA,CAAA,GACV,CAAA,EAAA,EAAA,IAAA,EAAC,SAAA,CACC,KAAK,SACL,QAAS,EACT,SAAU,EACV,UAAU,gGACV,cAAY,gCAEX,EACC,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,OAAO,CAAA,CAAC,UAAU,kCAEnB,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,UAAU,CAAA,CAAC,UAAU,qBAExB,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,UAAK,6BAEP,EACC,CAAA,EAAA,EAAA,GAAA,EAAC,IAAA,CAAE,UAAU,iCAAiC,cAAY,gCACvD,IAED,aAIV,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,sBAAsB,CAAA,CACrB,KAAM,EACN,aAAc,AAAC,IACT,AAAC,GAAQ,EAAmB,GAClC,EACA,SAAU,MAIlB"}
1
+ {"version":3,"sources":["../../../../../../../src/presentation/web/app/actions/data%3Ada4f12%20%3Ctext/javascript%3E","../../../../../../../src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.tsx","../../../../../../../src/presentation/web/app/actions/data%3A98e61a%20%3Ctext/javascript%3E"],"sourcesContent":["/* __next_internal_action_entry_do_not_use__ [{\"403977b65265c2fd34e4541180b371a5c974c91cf4\":\"createFeature\"},\"src/presentation/web/app/actions/create-feature.ts\",\"\"] */\"use turbopack no side effects\";import{createServerReference,callServer,findSourceMapURL}from\"private-next-rsc-action-client-wrapper\";const $$RSC_SERVER_ACTION_0=/*#__PURE__*/createServerReference(\"403977b65265c2fd34e4541180b371a5c974c91cf4\",callServer,void 0,findSourceMapURL,\"createFeature\");export{$$RSC_SERVER_ACTION_0 as createFeature};","'use client';\n\nimport { useState, useCallback, useEffect, useRef } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport {\n PaperclipIcon,\n ChevronsUpDown,\n CheckIcon,\n Zap,\n Clock,\n FolderPlus,\n Loader2,\n GitFork,\n FileText,\n Puzzle,\n RefreshCw,\n LayoutGrid,\n ClipboardList,\n} from 'lucide-react';\nimport { cn } from '@/lib/utils';\nimport { useSoundAction } from '@/hooks/use-sound-action';\nimport { BaseDrawer } from '@/components/common/base-drawer';\nimport { DrawerTitle, DrawerDescription } from '@/components/ui/drawer';\nimport { Button } from '@/components/ui/button';\nimport { Input } from '@/components/ui/input';\nimport { Textarea } from '@/components/ui/textarea';\nimport { Label } from '@/components/ui/label';\nimport { Badge } from '@/components/ui/badge';\nimport { Popover, PopoverContent, PopoverTrigger } from '@/components/ui/popover';\nimport { Switch } from '@/components/ui/switch';\nimport { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from '@/components/ui/tooltip';\nimport { useGuardedDrawerClose } from '@/hooks/drawer-close-guard';\nimport { AttachmentChip } from '@/components/common/attachment-chip';\nimport type { WorkflowDefaults } from '@/app/actions/get-workflow-defaults';\nimport { getViewerPermission } from '@/app/actions/get-viewer-permission';\nimport { AgentModelPicker } from '@/components/features/settings/AgentModelPicker';\nimport { Separator } from '@/components/ui/separator';\nimport { pickFolder } from '@/components/common/add-repository-button/pick-folder';\nimport { ReactFileManagerDialog } from '@/components/common/react-file-manager-dialog';\nimport { useFeatureFlags } from '@/hooks/feature-flags-context';\nimport { addRepository } from '@/app/actions/add-repository';\nimport { BuildMode as BuildModeEnum } from '@shepai/core/domain/generated/output';\nimport { pickFiles } from './pick-files';\n\nexport type { FileAttachment } from '@shepai/core/infrastructure/services/file-dialog.service';\n\n/** Attachment record for the create form — supports both picker and upload sources. */\nexport interface FormAttachment {\n id: string;\n name: string;\n size: number;\n mimeType: string;\n path: string;\n loading?: boolean;\n /** Optional user notes or annotations for this image */\n notes?: string;\n}\n\n/**\n * Build mode for the create drawer. Type alias derived from the generated\n * TypeSpec `BuildMode` enum so the UI cannot drift from the domain. Internal\n * code uses the enum members (`BuildModeEnum.Fast | .Spec`) per the\n * no-magic-values rule; the exported type is a string-literal union so call\n * sites can pass either enum members (preferred) or matching string literals.\n *\n * Note: the TypeSpec enum still includes `Application` for legacy rows that\n * were created before the picker was simplified — those features keep\n * working, but the drawer no longer offers `Application` as a selectable\n * option since it is operationally identical to `Spec` (both set fast=false).\n */\nexport type BuildMode = `${BuildModeEnum}`;\n\nconst BUILD_MODE_ORDER: readonly BuildMode[] = [BuildModeEnum.Fast, BuildModeEnum.Spec] as const;\n\nconst BUILD_MODE_META: Record<BuildMode, { icon: typeof Zap; labelKey: string }> = {\n // Application is retained in the meta map only so legacy `buildMode='application'`\n // rows do not crash if they ever flow through this path; it is never rendered.\n [BuildModeEnum.Application]: { icon: LayoutGrid, labelKey: 'createDrawer.modeApplication' },\n [BuildModeEnum.Fast]: { icon: Zap, labelKey: 'createDrawer.modeFast' },\n [BuildModeEnum.Spec]: { icon: ClipboardList, labelKey: 'createDrawer.modeSpec' },\n};\n\n/** Minimal feature descriptor for the parent selector. */\nexport interface ParentFeatureOption {\n id: string;\n name: string;\n}\n\n/** Minimal repository descriptor for the repository selector. */\nexport interface RepositoryOption {\n id: string;\n name: string;\n path: string;\n isFork?: boolean;\n upstreamUrl?: string;\n}\n\nexport interface FeatureCreatePayload {\n description: string;\n attachments: FormAttachment[];\n repositoryPath: string;\n approvalGates: {\n allowPrd: boolean;\n allowPlan: boolean;\n allowMerge: boolean;\n };\n push: boolean;\n openPr: boolean;\n ciWatchEnabled: boolean;\n enableEvidence: boolean;\n commitEvidence: boolean;\n parentId?: string;\n /** When true, skip SDLC phases and implement directly from the prompt. */\n fast: boolean;\n /** When true, create the feature in pending state (no agent spawned). */\n pending?: boolean;\n /** Fork repo and create PR to upstream at merge time. */\n forkAndPr: boolean;\n /** Commit specs/evidences into the repo (defaults false when forkAndPr is enabled). */\n commitSpecs: boolean;\n /** Sync main from remote before creating the feature branch (default: true). */\n rebaseBeforeBranch: boolean;\n /** Inject curated skills into the feature worktree. */\n injectSkills: boolean;\n /** Optional agent type override for this feature run */\n agentType?: string;\n /** Optional model override for this feature run */\n model?: string;\n sessionId?: string;\n /** When the drawer was launched scoped to an Application, the\n * application's domain UUID. Persisted on the Feature so the\n * Control Center can render an app→feature parent edge instead\n * of a virtual repository node. */\n applicationId?: string;\n}\n\nconst MAX_FILE_SIZE = 10 * 1024 * 1024; // 10 MB\n\nconst ALLOWED_EXTENSIONS = new Set([\n '.png',\n '.jpg',\n '.jpeg',\n '.gif',\n '.webp',\n '.svg',\n '.bmp',\n '.ico',\n '.pdf',\n '.doc',\n '.docx',\n '.xls',\n '.xlsx',\n '.ppt',\n '.pptx',\n '.txt',\n '.md',\n '.csv',\n '.json',\n '.yaml',\n '.yml',\n '.xml',\n '.ts',\n '.tsx',\n '.js',\n '.jsx',\n '.py',\n '.rb',\n '.go',\n '.rs',\n '.java',\n '.c',\n '.cpp',\n '.h',\n '.hpp',\n '.cs',\n '.swift',\n '.kt',\n '.html',\n '.css',\n '.scss',\n '.less',\n '.sh',\n '.bash',\n '.zsh',\n '.fish',\n '.toml',\n '.ini',\n '.cfg',\n '.conf',\n '.env',\n '.zip',\n '.tar',\n '.gz',\n '.log',\n]);\n\nfunction getExtension(filename: string): string {\n const dot = filename.lastIndexOf('.');\n return dot >= 0 ? filename.slice(dot).toLowerCase() : '';\n}\n\nconst EMPTY_GATES: Record<string, boolean> = {\n allowPrd: false,\n allowPlan: false,\n allowMerge: false,\n};\n\nexport interface FeatureCreateDrawerProps {\n open: boolean;\n onClose: () => void;\n onSubmit: (data: FeatureCreatePayload) => void;\n repositoryPath: string;\n isSubmitting?: boolean;\n workflowDefaults?: WorkflowDefaults;\n /** List of existing features available for selection as a parent. */\n features?: ParentFeatureOption[];\n /** List of tracked repositories for selection when repo context is missing. */\n repositories?: RepositoryOption[];\n /** Pre-select a parent feature when the drawer opens (e.g. from (+) button on a feature node). */\n initialParentId?: string;\n /** Current global agent type from settings */\n currentAgentType?: string;\n /** Current global model from settings */\n currentModel?: string;\n /** Pre-fill the description textarea (e.g. from session context) */\n initialDescription?: string;\n /** When true, user has push access — Fork & PR toggle will be hidden. */\n canPushDirectly?: boolean;\n /**\n * Pre-select a build mode (e.g. when the drawer is opened from a UI that\n * already chose one — apps page \"fast\" / \"spec\" buttons, FAB-with-mode).\n * When omitted, falls back to workflowDefaults.fast (true → 'fast', false →\n * 'spec'); fully omitted defaults select 'fast'.\n *\n * App-scoped invocations (`initialApplicationId` set) seed the picker with\n * `Spec` by default but the mode remains user-editable, so launching a\n * feature against an application behaves like launching one against a\n * regular repository — the user can switch to Fast in one click.\n */\n initialMode?: BuildMode;\n /**\n * Application context for the drawer. When set:\n * - the repository selector is rendered as a locked read-only label (the\n * app determines the repo, so the user cannot pick a different one)\n * - the mode picker stays editable; it just defaults to `Spec` so the SDD\n * intent is the easy path while the user can still pick `Fast`\n * - all other fields (description, attachments, advanced toggles) remain\n * editable\n *\n * Used by entry points launched from an Application (app card \"+\" button,\n * FAB context-aware action, app top-bar \"Open in Control Center\") so the\n * created feature is correctly scoped to the application without forcing\n * the user into a single mode.\n */\n initialApplicationId?: string;\n}\n\nfunction resolveInitialMode(\n initialMode: BuildMode | undefined,\n workflowDefaults: WorkflowDefaults | undefined\n): BuildMode {\n if (initialMode) return initialMode;\n if (workflowDefaults?.fast === false) return BuildModeEnum.Spec;\n return BuildModeEnum.Fast;\n}\n\nexport function FeatureCreateDrawer({\n open,\n onClose,\n onSubmit,\n repositoryPath,\n isSubmitting = false,\n workflowDefaults,\n features,\n repositories,\n initialParentId,\n currentAgentType,\n currentModel,\n initialDescription,\n canPushDirectly,\n initialMode,\n initialApplicationId,\n}: FeatureCreateDrawerProps) {\n const isAppScoped = initialApplicationId !== undefined;\n // App-scoped invocations seed the picker with `Spec` (the SDD intent) so\n // the easy path matches the entry-point name, but the picker remains\n // user-editable: launching a feature against an application should feel\n // like launching one against a regular repository.\n const effectiveInitialMode: BuildMode | undefined =\n isAppScoped && !initialMode ? BuildModeEnum.Spec : initialMode;\n const createSound = useSoundAction('create');\n const { t } = useTranslation('web');\n // Validate repositoryPath from URL against active repos — prevents stale URL params\n // from selecting deleted repos after add/delete/re-add cycles.\n // Trust the prop when: app-scoped (the application is the authority on its\n // own repo path, even if that path is not a registered Repository entity),\n // repos not loaded yet (undefined), empty list (no repos to check), or the\n // path matches an active repo.\n const validRepoPath = !repositoryPath\n ? ''\n : isAppScoped ||\n !repositories ||\n repositories.length === 0 ||\n repositories.some((r) => r.path === repositoryPath)\n ? repositoryPath\n : '';\n const defaultGates = workflowDefaults?.approvalGates ?? EMPTY_GATES;\n const defaultPush = workflowDefaults?.push ?? false;\n const defaultOpenPr = workflowDefaults?.openPr ?? false;\n const defaultCiWatch = workflowDefaults?.ciWatchEnabled !== false;\n const defaultEnableEvidence = workflowDefaults?.enableEvidence ?? false;\n const defaultCommitEvidence = workflowDefaults?.commitEvidence ?? false;\n const defaultMode = resolveInitialMode(effectiveInitialMode, workflowDefaults);\n\n const [description, setDescription] = useState(initialDescription ?? '');\n\n // Sync description when initialDescription prop changes (e.g. from session context)\n useEffect(() => {\n if (initialDescription) {\n setDescription(initialDescription);\n }\n }, [initialDescription]);\n\n const [attachments, setAttachments] = useState<FormAttachment[]>([]);\n const [approvalGates, setApprovalGates] = useState<Record<string, boolean>>({ ...defaultGates });\n const [push, setPush] = useState(defaultPush);\n const [openPr, setOpenPr] = useState(defaultOpenPr);\n const [ciWatchEnabled, setCiWatchEnabled] = useState(workflowDefaults?.ciWatchEnabled !== false);\n const [enableEvidence, setEnableEvidence] = useState(defaultEnableEvidence);\n const [commitEvidence, setCommitEvidence] = useState(defaultCommitEvidence);\n const [parentId, setParentId] = useState<string | undefined>(undefined);\n const [mode, setMode] = useState<BuildMode>(defaultMode);\n const fast = mode === BuildModeEnum.Fast;\n const [pending, setPending] = useState(false);\n const [forkAndPr, setForkAndPr] = useState(false);\n const [commitSpecs, setCommitSpecs] = useState(true);\n const [rebaseBeforeBranch, setRebaseBeforeBranch] = useState(true);\n const [injectSkills, setInjectSkills] = useState(workflowDefaults?.injectSkills ?? false);\n const [overrideAgent, setOverrideAgent] = useState<string | undefined>(undefined);\n const [overrideModel, setOverrideModel] = useState<string | undefined>(undefined);\n const [selectedRepoPath, setSelectedRepoPath] = useState<string | undefined>(\n validRepoPath || undefined\n );\n const [localRepos, setLocalRepos] = useState<RepositoryOption[]>(repositories ?? []);\n const [isDragOver, setIsDragOver] = useState(false);\n const [uploadError, setUploadError] = useState<string | null>(null);\n const [isPromptFocused, setIsPromptFocused] = useState(false);\n\n // Stable sessionId per mount — used for upload dedup grouping\n const sessionIdRef = useRef(crypto.randomUUID());\n const dragCounterRef = useRef(0);\n const promptContainerRef = useRef<HTMLDivElement>(null);\n\n // Sync state when workflowDefaults load asynchronously. Mode is only\n // re-synced from defaults when the caller did NOT pin an explicit\n // initialMode (or app-scoped Spec lock) — pinned modes win over async\n // defaults.\n useEffect(() => {\n if (workflowDefaults) {\n setApprovalGates({ ...workflowDefaults.approvalGates });\n setPush(workflowDefaults.push);\n setOpenPr(workflowDefaults.openPr);\n setCiWatchEnabled(workflowDefaults.ciWatchEnabled !== false);\n setEnableEvidence(workflowDefaults.enableEvidence);\n setCommitEvidence(workflowDefaults.commitEvidence);\n if (!effectiveInitialMode) {\n setMode(workflowDefaults.fast !== false ? BuildModeEnum.Fast : BuildModeEnum.Spec);\n }\n setInjectSkills(workflowDefaults.injectSkills ?? false);\n }\n }, [workflowDefaults, effectiveInitialMode]);\n\n // Sync localRepos when repositories prop changes\n useEffect(() => {\n setLocalRepos(repositories ?? []);\n }, [repositories]);\n\n // Pre-select parent when initialParentId changes (e.g. (+) button on feature node)\n useEffect(() => {\n if (open && initialParentId) {\n setParentId(initialParentId);\n }\n }, [open, initialParentId]);\n\n // Permission-aware Fork & PR toggle visibility\n const [canPush, setCanPush] = useState(canPushDirectly ?? false);\n\n // Sync canPush from prop when it changes (e.g. initial server-side value)\n useEffect(() => {\n setCanPush(canPushDirectly ?? false);\n }, [canPushDirectly]);\n\n // Re-check permission when user switches repos via the combobox\n const prevRepoRef = useRef(selectedRepoPath);\n useEffect(() => {\n if (selectedRepoPath && selectedRepoPath !== prevRepoRef.current) {\n prevRepoRef.current = selectedRepoPath;\n getViewerPermission(selectedRepoPath)\n .then((result) => setCanPush(result.canPushDirectly))\n .catch(() => setCanPush(false));\n }\n }, [selectedRepoPath]);\n\n // Auto-reset forkAndPr and dependent states when canPush becomes true\n useEffect(() => {\n if (canPush) {\n setForkAndPr(false);\n setPush(defaultPush);\n setOpenPr(defaultOpenPr);\n setCommitSpecs(true);\n }\n }, [canPush, defaultPush, defaultOpenPr]);\n\n const resetForm = useCallback(() => {\n setDescription('');\n setAttachments([]);\n setApprovalGates({ ...defaultGates });\n setPush(defaultPush);\n setOpenPr(defaultOpenPr);\n setCiWatchEnabled(defaultCiWatch);\n setEnableEvidence(defaultEnableEvidence);\n setCommitEvidence(defaultCommitEvidence);\n setParentId(undefined);\n setSelectedRepoPath(validRepoPath || undefined);\n setLocalRepos(repositories ?? []);\n setMode(defaultMode);\n setPending(false);\n setForkAndPr(false);\n setCommitSpecs(true);\n setRebaseBeforeBranch(true);\n setOverrideAgent(undefined);\n setOverrideModel(undefined);\n setUploadError(null);\n dragCounterRef.current = 0;\n setIsDragOver(false);\n }, [\n defaultGates,\n defaultPush,\n defaultOpenPr,\n defaultEnableEvidence,\n defaultCiWatch,\n defaultCommitEvidence,\n defaultMode,\n validRepoPath,\n repositories,\n ]);\n\n // Track whether the form has unsaved data\n const isDirty = description.trim() !== '' || attachments.length > 0;\n\n // Shared close guard — shows confirmation when dirty, prevents navigation\n const { attemptClose } = useGuardedDrawerClose({ open, isDirty, onClose, onReset: resetForm });\n\n /** Validate and upload files from drop or paste. */\n const handleFiles = useCallback(async (fileList: File[]) => {\n setUploadError(null);\n\n for (const file of fileList) {\n // Client-side size validation\n if (file.size > MAX_FILE_SIZE) {\n setUploadError(`\"${file.name}\" exceeds 10 MB limit`);\n return;\n }\n // Client-side extension validation\n const ext = getExtension(file.name);\n if (ext && !ALLOWED_EXTENSIONS.has(ext)) {\n setUploadError(`File type \"${ext}\" is not allowed`);\n return;\n }\n }\n\n for (const file of fileList) {\n const tempId = crypto.randomUUID();\n\n // Optimistic loading placeholder\n setAttachments((prev) => [\n ...prev,\n {\n id: tempId,\n name: file.name,\n size: file.size,\n mimeType: file.type || 'application/octet-stream',\n path: '',\n loading: true,\n },\n ]);\n\n try {\n const formData = new FormData();\n formData.append('file', file);\n formData.append('sessionId', sessionIdRef.current);\n\n const res = await fetch('/api/attachments/upload', {\n method: 'POST',\n body: formData,\n });\n\n if (!res.ok) {\n const body = await res.json().catch(() => ({ error: 'Upload failed' }));\n // Remove loading placeholder on error\n setAttachments((prev) => prev.filter((a) => a.id !== tempId));\n setUploadError(body.error ?? 'Upload failed');\n return;\n }\n\n const uploaded = await res.json();\n // Server dedup may return the same path for identical content — drop the duplicate.\n setAttachments((prev) => {\n const isDupe = prev.some((a) => a.id !== tempId && a.path === uploaded.path);\n if (isDupe) return prev.filter((a) => a.id !== tempId);\n return prev.map((a) =>\n a.id === tempId ? { ...uploaded, id: tempId, loading: false } : a\n );\n });\n } catch {\n setAttachments((prev) => prev.filter((a) => a.id !== tempId));\n setUploadError('Upload failed');\n }\n }\n }, []);\n\n const handleDragEnter = useCallback((e: React.DragEvent) => {\n e.preventDefault();\n e.stopPropagation();\n dragCounterRef.current += 1;\n if (dragCounterRef.current === 1) {\n setIsDragOver(true);\n }\n }, []);\n\n const handleDragLeave = useCallback((e: React.DragEvent) => {\n e.preventDefault();\n e.stopPropagation();\n dragCounterRef.current -= 1;\n if (dragCounterRef.current === 0) {\n setIsDragOver(false);\n }\n }, []);\n\n const handleDragOver = useCallback((e: React.DragEvent) => {\n e.preventDefault();\n e.stopPropagation();\n }, []);\n\n const handleDrop = useCallback(\n (e: React.DragEvent) => {\n e.preventDefault();\n e.stopPropagation();\n dragCounterRef.current = 0;\n setIsDragOver(false);\n\n const files = Array.from(e.dataTransfer.files);\n if (files.length > 0) {\n handleFiles(files);\n }\n },\n [handleFiles]\n );\n\n const handlePaste = useCallback(\n (e: React.ClipboardEvent) => {\n const items = e.clipboardData?.items;\n if (!items) return;\n\n const files: File[] = [];\n for (const item of Array.from(items)) {\n if (item.kind === 'file') {\n const file = item.getAsFile();\n if (file) files.push(file);\n }\n }\n\n if (files.length > 0) {\n e.preventDefault();\n handleFiles(files);\n }\n },\n [handleFiles]\n );\n\n const handleSubmit = useCallback(\n (e: React.FormEvent<HTMLFormElement>) => {\n e.preventDefault();\n if (!description.trim()) return;\n const effectiveRepoPath = selectedRepoPath ?? validRepoPath;\n if (!effectiveRepoPath) return;\n createSound.play();\n onSubmit({\n description: description.trim(),\n attachments: attachments.filter((a) => !a.loading),\n repositoryPath: effectiveRepoPath,\n approvalGates: {\n allowPrd: approvalGates.allowPrd ?? false,\n allowPlan: approvalGates.allowPlan ?? false,\n allowMerge: approvalGates.allowMerge ?? false,\n },\n push: forkAndPr ? true : push || openPr,\n openPr: forkAndPr ? true : openPr,\n ciWatchEnabled,\n enableEvidence,\n commitEvidence,\n fast,\n forkAndPr,\n commitSpecs,\n rebaseBeforeBranch,\n injectSkills,\n ...(pending ? { pending } : {}),\n ...(overrideAgent ? { agentType: overrideAgent } : {}),\n ...(overrideModel ? { model: overrideModel } : {}),\n ...(parentId ? { parentId } : {}),\n ...(initialApplicationId ? { applicationId: initialApplicationId } : {}),\n sessionId: sessionIdRef.current,\n });\n resetForm();\n },\n [\n description,\n attachments,\n approvalGates,\n selectedRepoPath,\n validRepoPath,\n onSubmit,\n push,\n openPr,\n enableEvidence,\n ciWatchEnabled,\n commitEvidence,\n fast,\n forkAndPr,\n commitSpecs,\n rebaseBeforeBranch,\n injectSkills,\n pending,\n overrideAgent,\n overrideModel,\n parentId,\n initialApplicationId,\n createSound,\n resetForm,\n ]\n );\n\n const handleAddFiles = useCallback(async () => {\n try {\n const files = await pickFiles();\n if (!files) return;\n\n for (const file of files) {\n const tempId = crypto.randomUUID();\n\n setAttachments((prev) => [\n ...prev,\n {\n id: tempId,\n name: file.name,\n size: file.size,\n mimeType: 'application/octet-stream',\n path: '',\n loading: true,\n },\n ]);\n\n try {\n const res = await fetch('/api/attachments/upload-from-path', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ path: file.path, sessionId: sessionIdRef.current }),\n });\n\n if (!res.ok) {\n const body = await res.json().catch(() => ({ error: 'Upload failed' }));\n setAttachments((prev) => prev.filter((a) => a.id !== tempId));\n setUploadError(body.error ?? 'Upload failed');\n return;\n }\n\n const uploaded = await res.json();\n setAttachments((prev) => {\n const isDupe = prev.some((a) => a.id !== tempId && a.path === uploaded.path);\n if (isDupe) return prev.filter((a) => a.id !== tempId);\n return prev.map((a) =>\n a.id === tempId ? { ...uploaded, id: tempId, loading: false } : a\n );\n });\n } catch {\n setAttachments((prev) => prev.filter((a) => a.id !== tempId));\n setUploadError('Upload failed');\n }\n }\n } catch {\n // Native dialog failed — silently ignore (user can retry)\n }\n }, []);\n\n const handleRemoveFile = useCallback((id: string) => {\n setAttachments((prev) => prev.filter((f) => f.id !== id));\n }, []);\n\n const handleNotesChange = useCallback((id: string, notes: string) => {\n setAttachments((prev) => prev.map((f) => (f.id === id ? { ...f, notes } : f)));\n }, []);\n\n const formRef = useRef<HTMLFormElement>(null);\n\n const handleKeyDown = useCallback((e: React.KeyboardEvent) => {\n if ((e.ctrlKey || e.metaKey) && e.key === 'Enter') {\n e.preventDefault();\n formRef.current?.requestSubmit();\n }\n }, []);\n\n const handlePromptFocus = useCallback(() => {\n setIsPromptFocused(true);\n }, []);\n\n const handlePromptBlur = useCallback(() => {\n // Defer the check so focus has time to settle on the new target.\n // This correctly handles Radix portals (e.g. AgentModelPicker popover) that\n // render outside the container DOM but are logically part of the prompt area.\n setTimeout(() => {\n const withinContainer = promptContainerRef.current?.contains(document.activeElement);\n const pickerPopoverOpen =\n promptContainerRef.current?.querySelector('[aria-expanded=\"true\"]') !== null;\n if (!withinContainer && !pickerPopoverOpen) {\n setIsPromptFocused(false);\n }\n }, 0);\n }, []);\n\n const hasFeatures = features && features.length > 0;\n const needsRepo = !validRepoPath && !selectedRepoPath;\n const showRepoSelector = !validRepoPath && repositories !== undefined;\n\n const AUTO_APPROVE_OPTIONS = [\n { id: 'allowPrd', label: t('createDrawer.prd'), description: t('createDrawer.prdDescription') },\n {\n id: 'allowPlan',\n label: t('createDrawer.plan'),\n description: t('createDrawer.planDescription'),\n },\n {\n id: 'allowMerge',\n label: t('createDrawer.merge'),\n description: t('createDrawer.mergeDescription'),\n },\n ];\n\n return (\n <BaseDrawer\n open={open}\n onClose={attemptClose}\n size=\"md\"\n modal={false}\n dismissOnOutsideClick\n data-testid=\"feature-create-drawer\"\n header={\n <>\n <div className=\"flex items-center gap-2\">\n <div className=\"h-2.5 w-2.5 shrink-0 rounded-full bg-blue-500\" />\n <DrawerTitle>{t('createDrawer.title')}</DrawerTitle>\n </div>\n {isSubmitting ? (\n <DrawerDescription asChild>\n <div>\n <Badge variant=\"secondary\">{t('createDrawer.creating')}</Badge>\n </div>\n </DrawerDescription>\n ) : null}\n </>\n }\n footer={\n <div className=\"flex flex-row justify-end gap-2\">\n <Button variant=\"outline\" onClick={attemptClose} disabled={isSubmitting}>\n {t('createDrawer.cancel')}\n </Button>\n <Button\n type=\"submit\"\n form=\"create-feature-form\"\n disabled={!description.trim() || isSubmitting || needsRepo}\n >\n {isSubmitting ? t('createDrawer.creating') : t('createDrawer.createFeature')}\n </Button>\n </div>\n }\n >\n {/* Form body */}\n <div className=\"overflow-y-auto p-4\">\n <TooltipProvider delayDuration={400}>\n <form\n ref={formRef}\n id=\"create-feature-form\"\n onSubmit={handleSubmit}\n onKeyDown={handleKeyDown}\n className=\"flex flex-col gap-4\"\n >\n {/* Repository selector (only when opened from sidebar without repo context) */}\n {isAppScoped ? (\n <div\n className=\"flex flex-col gap-1.5\"\n data-testid=\"repo-readonly-section\"\n data-locked-by-application=\"true\"\n >\n <Label className=\"text-muted-foreground text-xs font-semibold tracking-wider\">\n {t('createDrawer.repository')}\n </Label>\n <Tooltip>\n <TooltipTrigger asChild>\n <p\n className=\"text-sm opacity-70\"\n data-testid=\"repo-readonly-label\"\n aria-disabled=\"true\"\n aria-describedby=\"locked-by-application-tooltip\"\n title={t('createDrawer.lockedByApplication')}\n >\n {repositories?.find((r) => r.path === validRepoPath)?.name ??\n (validRepoPath ? validRepoPath.split('/').pop() : '') ??\n validRepoPath}\n </p>\n </TooltipTrigger>\n <TooltipContent id=\"locked-by-application-tooltip\" role=\"tooltip\" side=\"bottom\">\n {t('createDrawer.lockedByApplication')}\n </TooltipContent>\n </Tooltip>\n </div>\n ) : showRepoSelector ? (\n <div className=\"flex flex-col gap-1.5\" data-testid=\"repo-selector-section\">\n <Label className=\"text-muted-foreground text-xs font-semibold tracking-wider\">\n {t('createDrawer.repository')}\n </Label>\n <RepositoryCombobox\n repositories={localRepos}\n value={selectedRepoPath}\n onChange={setSelectedRepoPath}\n onAddRepository={(repo) => {\n setLocalRepos((prev) => [...prev, repo]);\n setSelectedRepoPath(repo.path);\n }}\n disabled={isSubmitting}\n />\n </div>\n ) : validRepoPath ? (\n <div className=\"flex flex-col gap-1.5\" data-testid=\"repo-readonly-section\">\n <Label className=\"text-muted-foreground text-xs font-semibold tracking-wider\">\n {t('createDrawer.repository')}\n </Label>\n <p className=\"text-sm\" data-testid=\"repo-readonly-label\">\n {repositories?.find((r) => r.path === validRepoPath)?.name ??\n validRepoPath.split('/').pop()}\n </p>\n </div>\n ) : null}\n\n {/* Description + inline controls with drop zone */}\n <div\n role=\"region\"\n aria-label={t('createDrawer.fileDropZone')}\n data-drag-over={isDragOver ? 'true' : 'false'}\n onDragEnter={handleDragEnter}\n onDragLeave={handleDragLeave}\n onDragOver={handleDragOver}\n onDrop={handleDrop}\n className={cn(\n 'flex flex-col gap-1.5 rounded-md border-2 border-transparent p-1 transition-colors',\n isDragOver && 'border-primary/50 bg-primary/5'\n )}\n >\n <Label\n htmlFor=\"feature-description\"\n className=\"text-muted-foreground text-xs font-semibold tracking-wider\"\n >\n {t('createDrawer.describeFeature')}\n </Label>\n <div\n ref={promptContainerRef}\n onFocus={handlePromptFocus}\n onBlur={handlePromptBlur}\n className={cn(\n 'border-input flex h-56 flex-col overflow-hidden rounded-md border shadow-xs transition-[color,box-shadow]',\n isPromptFocused && 'ring-ring/50 border-ring ring-[3px]'\n )}\n >\n <Textarea\n id=\"feature-description\"\n placeholder={t('createDrawer.featurePlaceholder')}\n value={description}\n onChange={(e) => setDescription(e.target.value)}\n onPaste={handlePaste}\n required\n disabled={isSubmitting}\n className=\"min-h-0 flex-1 resize-none rounded-none border-0 shadow-none focus-visible:ring-0\"\n />\n {/* Inline attachment chips — between textarea and controls */}\n {attachments.length > 0 && (\n <div className=\"flex flex-wrap items-center gap-1.5 px-3 py-2\">\n {attachments.map((file) => (\n <AttachmentChip\n key={file.id}\n name={file.name}\n size={file.size}\n mimeType={file.mimeType}\n path={file.path}\n onRemove={() => handleRemoveFile(file.id)}\n disabled={isSubmitting}\n loading={file.loading}\n notes={file.notes}\n onNotesChange={(notes) => handleNotesChange(file.id, notes)}\n />\n ))}\n </div>\n )}\n {uploadError ? (\n <p className=\"text-destructive px-3 pb-2 text-xs\">{uploadError}</p>\n ) : null}\n <div className=\"border-input flex items-center gap-3 border-t px-3 py-1.5\">\n <AgentModelPicker\n // No hardcoded `'claude-code'` fallback — `currentAgentType`\n // already comes from the user's settings via the create\n // drawer page's SSR pass (single source of truth). When\n // settings is absent (impossible in practice but kept\n // defensive), the picker shows an empty label and the\n // user can pick an agent explicitly.\n initialAgentType={overrideAgent ?? currentAgentType ?? ''}\n initialModel={overrideModel ?? currentModel ?? ''}\n mode=\"override\"\n onAgentModelChange={(agent, model) => {\n setOverrideAgent(agent);\n setOverrideModel(model);\n }}\n disabled={isSubmitting}\n className=\"w-55\"\n />\n <Tooltip>\n <TooltipTrigger asChild>\n <div className=\"ml-auto flex cursor-pointer items-center gap-2\">\n <Switch\n id=\"pending-mode\"\n checked={pending}\n onCheckedChange={setPending}\n disabled={isSubmitting}\n />\n <Label\n htmlFor=\"pending-mode\"\n className=\"flex cursor-pointer items-center gap-1 text-sm font-medium\"\n >\n <Clock className=\"h-3.5 w-3.5\" />\n {t('createDrawer.pendingMode')}\n </Label>\n </div>\n </TooltipTrigger>\n <TooltipContent side=\"bottom\">\n {t('createDrawer.pendingModeDescription')}\n </TooltipContent>\n </Tooltip>\n <div\n role=\"group\"\n aria-label={t('createDrawer.modeGroupLabel')}\n className=\"border-input flex items-center gap-0.5 rounded-md border p-0.5\"\n >\n {BUILD_MODE_ORDER.map((m) => {\n const meta = BUILD_MODE_META[m];\n const Icon = meta.icon;\n const isActive = mode === m;\n return (\n <Tooltip key={m}>\n <TooltipTrigger asChild>\n <button\n type=\"button\"\n data-testid={`build-mode-${m}`}\n aria-pressed={isActive}\n aria-disabled={isSubmitting}\n disabled={isSubmitting}\n onClick={() => setMode(m)}\n className={cn(\n 'flex cursor-pointer items-center gap-1 rounded-sm px-2 py-1 text-xs font-medium transition-colors',\n isActive\n ? 'bg-accent text-foreground'\n : 'text-muted-foreground hover:text-foreground',\n 'disabled:cursor-not-allowed disabled:opacity-50'\n )}\n >\n <Icon className=\"h-3.5 w-3.5\" />\n {t(meta.labelKey)}\n </button>\n </TooltipTrigger>\n <TooltipContent role=\"tooltip\" side=\"bottom\">\n {t(`${meta.labelKey}Description`)}\n </TooltipContent>\n </Tooltip>\n );\n })}\n </div>\n <Tooltip>\n <TooltipTrigger asChild>\n <button\n type=\"button\"\n onClick={handleAddFiles}\n disabled={isSubmitting}\n aria-label={t('chat.attachFiles')}\n className=\"text-muted-foreground hover:text-foreground cursor-pointer rounded p-1 transition-colors\"\n >\n <PaperclipIcon className=\"h-4 w-4\" />\n </button>\n </TooltipTrigger>\n <TooltipContent side=\"bottom\">{t('chat.attachFiles')}</TooltipContent>\n </Tooltip>\n </div>\n </div>\n </div>\n\n {/* Parent feature selector (only when opened from a feature node) */}\n {hasFeatures && initialParentId !== undefined ? (\n <div className=\"flex flex-col gap-1.5\">\n <Label\n htmlFor=\"parent-feature\"\n className=\"text-muted-foreground text-xs font-semibold tracking-wider\"\n >\n {t('createDrawer.parentFeature')}\n </Label>\n <ParentFeatureCombobox\n features={features}\n value={parentId}\n onChange={setParentId}\n disabled={isSubmitting}\n />\n </div>\n ) : null}\n\n {/* Approve + Git — compact switch groups */}\n <div className=\"flex flex-col gap-2\">\n {/* Approve row */}\n <div className=\"border-input flex items-center gap-4 rounded-md border px-3 py-2.5\">\n <Tooltip>\n <TooltipTrigger asChild>\n <span className=\"text-muted-foreground w-16 shrink-0 cursor-default text-xs font-semibold tracking-wider\">\n {t('createDrawer.approve')}\n </span>\n </TooltipTrigger>\n <TooltipContent side=\"bottom\">\n {t('createDrawer.approveDescription')}\n </TooltipContent>\n </Tooltip>\n <div className=\"flex flex-1 items-center gap-4\">\n {AUTO_APPROVE_OPTIONS.map((opt) => (\n <Tooltip key={opt.id}>\n <TooltipTrigger asChild>\n <div className=\"flex cursor-pointer items-center gap-1.5\">\n <Switch\n id={`approve-${opt.id}`}\n size=\"sm\"\n checked={approvalGates[opt.id] ?? false}\n onCheckedChange={(v) =>\n setApprovalGates((prev) => ({ ...prev, [opt.id]: v }))\n }\n disabled={\n isSubmitting ||\n (fast && (opt.id === 'allowPrd' || opt.id === 'allowPlan'))\n }\n />\n <Label\n htmlFor={`approve-${opt.id}`}\n className=\"cursor-pointer text-xs font-medium\"\n >\n {opt.label}\n </Label>\n </div>\n </TooltipTrigger>\n <TooltipContent side=\"bottom\">\n {fast && (opt.id === 'allowPrd' || opt.id === 'allowPlan')\n ? t('createDrawer.skippedInFastMode')\n : opt.description}\n </TooltipContent>\n </Tooltip>\n ))}\n </div>\n {/* Select all shortcut */}\n <Tooltip>\n <TooltipTrigger asChild>\n <button\n type=\"button\"\n onClick={() => {\n const allOn = AUTO_APPROVE_OPTIONS.every((o) => approvalGates[o.id]);\n const next: Record<string, boolean> = {};\n for (const o of AUTO_APPROVE_OPTIONS) next[o.id] = !allOn;\n setApprovalGates(next);\n }}\n disabled={isSubmitting}\n className={cn(\n 'text-muted-foreground hover:text-foreground cursor-pointer rounded px-1.5 py-0.5 text-[10px] font-semibold tracking-wider uppercase transition-colors',\n AUTO_APPROVE_OPTIONS.every((o) => approvalGates[o.id]) && 'text-primary'\n )}\n >\n {t('createDrawer.all')}\n </button>\n </TooltipTrigger>\n <TooltipContent side=\"bottom\">\n {t('createDrawer.toggleAllApprovalGates')}\n </TooltipContent>\n </Tooltip>\n </div>\n\n {/* Evidence row */}\n <div className=\"border-input flex items-center gap-4 rounded-md border px-3 py-2.5\">\n <Tooltip>\n <TooltipTrigger asChild>\n <span className=\"text-muted-foreground w-16 shrink-0 cursor-default text-xs font-semibold tracking-wider\">\n {t('createDrawer.evidence')}\n </span>\n </TooltipTrigger>\n <TooltipContent side=\"bottom\">\n {t('createDrawer.evidenceDescription')}\n </TooltipContent>\n </Tooltip>\n <div className=\"flex flex-1 items-center gap-4\">\n <Tooltip>\n <TooltipTrigger asChild>\n <div className=\"flex cursor-pointer items-center gap-1.5\">\n <Switch\n id=\"enable-evidence\"\n size=\"sm\"\n checked={enableEvidence}\n onCheckedChange={(v) => {\n setEnableEvidence(v);\n if (!v) setCommitEvidence(false);\n }}\n disabled={isSubmitting}\n />\n <Label\n htmlFor=\"enable-evidence\"\n className=\"cursor-pointer text-xs font-medium\"\n >\n {t('createDrawer.collect')}\n </Label>\n </div>\n </TooltipTrigger>\n <TooltipContent side=\"bottom\">\n {t('createDrawer.collectDescription')}\n </TooltipContent>\n </Tooltip>\n <Tooltip>\n <TooltipTrigger asChild>\n <div className=\"flex cursor-pointer items-center gap-1.5\">\n <Switch\n id=\"commit-evidence\"\n size=\"sm\"\n checked={commitEvidence}\n onCheckedChange={setCommitEvidence}\n disabled={isSubmitting || !enableEvidence || (!openPr && !forkAndPr)}\n />\n <Label\n htmlFor=\"commit-evidence\"\n className={cn(\n 'cursor-pointer text-xs font-medium',\n (!enableEvidence || (!openPr && !forkAndPr)) && 'opacity-50'\n )}\n >\n {t('createDrawer.addToPr')}\n </Label>\n </div>\n </TooltipTrigger>\n <TooltipContent side=\"bottom\">\n {!openPr && !forkAndPr\n ? t('createDrawer.requiresPr')\n : !enableEvidence\n ? t('createDrawer.requiresEvidence')\n : t('createDrawer.addToPrDescription')}\n </TooltipContent>\n </Tooltip>\n </div>\n </div>\n\n {/* Skills row */}\n <div className=\"border-input flex items-center gap-4 rounded-md border px-3 py-2.5\">\n <Tooltip>\n <TooltipTrigger asChild>\n <span className=\"text-muted-foreground w-16 shrink-0 cursor-default text-xs font-semibold tracking-wider\">\n {t('createDrawer.skills')}\n </span>\n </TooltipTrigger>\n <TooltipContent side=\"bottom\">\n {t('createDrawer.skillsDescription')}\n </TooltipContent>\n </Tooltip>\n <div className=\"flex flex-1 items-center gap-4\">\n <Tooltip>\n <TooltipTrigger asChild>\n <div className=\"flex cursor-pointer items-center gap-1.5\">\n <Switch\n id=\"inject-skills\"\n size=\"sm\"\n checked={injectSkills}\n onCheckedChange={setInjectSkills}\n disabled={isSubmitting}\n />\n <Label\n htmlFor=\"inject-skills\"\n className=\"flex cursor-pointer items-center gap-1 text-xs font-medium\"\n >\n <Puzzle className=\"h-3 w-3\" />\n {t('createDrawer.injectSkills')}\n </Label>\n </div>\n </TooltipTrigger>\n <TooltipContent side=\"bottom\">\n {t('createDrawer.injectSkillsDescription')}\n </TooltipContent>\n </Tooltip>\n </div>\n </div>\n\n {/* Git row */}\n <div className=\"border-input flex items-start gap-4 rounded-md border px-3 py-2.5\">\n <span className=\"text-muted-foreground w-16 shrink-0 pt-0.5 text-xs font-semibold tracking-wider\">\n {t('createDrawer.git')}\n </span>\n <div className=\"flex flex-1 flex-wrap items-center gap-4\">\n <Tooltip>\n <TooltipTrigger asChild>\n <div className=\"flex cursor-pointer items-center gap-1.5\">\n <Switch\n id=\"push\"\n size=\"sm\"\n checked={forkAndPr ? true : push || openPr}\n onCheckedChange={(v) => {\n setPush(v);\n if (!v && openPr) setOpenPr(false);\n }}\n disabled={isSubmitting || forkAndPr}\n />\n <Label\n htmlFor=\"push\"\n className={cn(\n 'cursor-pointer text-xs font-medium',\n forkAndPr && 'opacity-50'\n )}\n >\n {t('createDrawer.push')}\n </Label>\n </div>\n </TooltipTrigger>\n <TooltipContent side=\"bottom\">\n {forkAndPr\n ? 'Enabled — contributing to upstream'\n : t('createDrawer.pushDescription')}\n </TooltipContent>\n </Tooltip>\n <Tooltip>\n <TooltipTrigger asChild>\n <div className=\"flex cursor-pointer items-center gap-1.5\">\n <Switch\n id=\"open-pr\"\n size=\"sm\"\n checked={forkAndPr ? true : openPr}\n onCheckedChange={(v) => {\n setOpenPr(v);\n if (!v) setCommitEvidence(false);\n }}\n disabled={isSubmitting || forkAndPr}\n />\n <Label\n htmlFor=\"open-pr\"\n className={cn(\n 'cursor-pointer text-xs font-medium',\n forkAndPr && 'opacity-50'\n )}\n >\n {t('createDrawer.pr')}\n </Label>\n </div>\n </TooltipTrigger>\n <TooltipContent side=\"bottom\">\n {forkAndPr\n ? 'Enabled — contributing to upstream'\n : t('createDrawer.prDescription')}\n </TooltipContent>\n </Tooltip>\n <Tooltip>\n <TooltipTrigger asChild>\n <div className=\"flex cursor-pointer items-center gap-1.5\">\n <Switch\n id=\"ci-watch\"\n size=\"sm\"\n checked={ciWatchEnabled}\n onCheckedChange={setCiWatchEnabled}\n disabled={isSubmitting}\n />\n <Label htmlFor=\"ci-watch\" className=\"cursor-pointer text-xs font-medium\">\n {t('createDrawer.watch')}\n </Label>\n </div>\n </TooltipTrigger>\n <TooltipContent side=\"bottom\">\n {t('createDrawer.watchDescription')}\n </TooltipContent>\n </Tooltip>\n {/* Separator between standard git and repo options */}\n <div className=\"bg-border h-4 w-px shrink-0\" />\n <Tooltip>\n <TooltipTrigger asChild>\n <div className=\"flex cursor-pointer items-center gap-1.5\">\n <Switch\n id=\"rebase-before-branch\"\n size=\"sm\"\n checked={rebaseBeforeBranch}\n onCheckedChange={setRebaseBeforeBranch}\n disabled={isSubmitting}\n />\n <Label\n htmlFor=\"rebase-before-branch\"\n className=\"flex cursor-pointer items-center gap-1 text-xs font-medium\"\n >\n <RefreshCw className=\"h-3 w-3\" />\n {t('createDrawer.sync')}\n </Label>\n </div>\n </TooltipTrigger>\n <TooltipContent side=\"bottom\">\n {t('createDrawer.syncDescription')}\n </TooltipContent>\n </Tooltip>\n <Tooltip>\n <TooltipTrigger asChild>\n <div className=\"flex cursor-pointer items-center gap-1.5\">\n <Switch\n id=\"commit-specs\"\n size=\"sm\"\n checked={commitSpecs}\n onCheckedChange={setCommitSpecs}\n disabled={isSubmitting}\n />\n <Label\n htmlFor=\"commit-specs\"\n className=\"flex cursor-pointer items-center gap-1 text-xs font-medium\"\n >\n <FileText className=\"h-3 w-3\" />\n {t('createDrawer.commitSpecs')}\n </Label>\n </div>\n </TooltipTrigger>\n <TooltipContent side=\"bottom\">\n {t('createDrawer.commitSpecsDescription')}\n </TooltipContent>\n </Tooltip>\n {!canPush && (\n <Tooltip>\n <TooltipTrigger asChild>\n <div className=\"flex cursor-pointer items-center gap-1.5\">\n <Switch\n id=\"fork-and-pr\"\n size=\"sm\"\n checked={forkAndPr}\n onCheckedChange={(v) => {\n setForkAndPr(v);\n // Auto-flip commitSpecs to false when enabling contribute mode\n if (v) setCommitSpecs(false);\n }}\n disabled={isSubmitting}\n />\n <Label\n htmlFor=\"fork-and-pr\"\n className=\"flex cursor-pointer items-center gap-1 text-xs font-medium\"\n >\n <GitFork className=\"h-3 w-3\" />\n {t('createDrawer.forkAndPr')}\n </Label>\n </div>\n </TooltipTrigger>\n <TooltipContent side=\"bottom\">\n {t('createDrawer.forkAndPrDescription')}\n </TooltipContent>\n </Tooltip>\n )}\n </div>\n </div>\n </div>\n </form>\n </TooltipProvider>\n </div>\n </BaseDrawer>\n );\n}\n\n/* ---------------------------------------------------------------------------\n * ParentFeatureCombobox — searchable dropdown for parent feature selection\n * ------------------------------------------------------------------------- */\n\ninterface ParentFeatureComboboxProps {\n features: ParentFeatureOption[];\n value: string | undefined;\n onChange: (id: string | undefined) => void;\n disabled?: boolean;\n}\n\nfunction ParentFeatureCombobox({\n features,\n value,\n onChange,\n disabled,\n}: ParentFeatureComboboxProps) {\n const { t } = useTranslation('web');\n const [open, setOpen] = useState(false);\n const [query, setQuery] = useState('');\n const inputRef = useRef<HTMLInputElement>(null);\n\n const selectedFeature = features.find((f) => f.id === value);\n\n const filtered = query.trim()\n ? features.filter(\n (f) =>\n f.name.toLowerCase().includes(query.toLowerCase()) ||\n f.id.toLowerCase().includes(query.toLowerCase())\n )\n : features;\n\n const handleSelect = useCallback(\n (id: string | undefined) => {\n onChange(id);\n setOpen(false);\n setQuery('');\n },\n [onChange]\n );\n\n useEffect(() => {\n if (open) {\n setTimeout(() => inputRef.current?.focus(), 0);\n } else {\n setQuery('');\n }\n }, [open]);\n\n return (\n <Popover open={open} onOpenChange={setOpen}>\n <PopoverTrigger asChild>\n <button\n id=\"parent-feature\"\n type=\"button\"\n role=\"combobox\"\n aria-expanded={open}\n aria-label=\"Parent Feature\"\n disabled={disabled}\n data-testid=\"parent-feature-combobox\"\n className={cn(\n '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',\n !selectedFeature && 'text-muted-foreground'\n )}\n >\n <span className=\"truncate\">\n {selectedFeature\n ? `${selectedFeature.name} (${selectedFeature.id.slice(0, 8)})`\n : t('createDrawer.selectParent')}\n </span>\n <ChevronsUpDown className=\"ms-2 h-4 w-4 shrink-0 opacity-50\" />\n </button>\n </PopoverTrigger>\n <PopoverContent\n className=\"w-80 p-0\"\n align=\"start\"\n data-testid=\"parent-feature-combobox-content\"\n >\n <div className=\"flex flex-col\">\n {/* Search input */}\n <div className=\"border-b p-2\">\n <Input\n ref={inputRef}\n placeholder={t('createDrawer.searchFeatures')}\n value={query}\n onChange={(e) => setQuery(e.target.value)}\n className=\"h-8 border-0 p-0 text-sm shadow-none focus-visible:ring-0\"\n data-testid=\"parent-feature-search\"\n />\n </div>\n\n {/* Options list */}\n <div className=\"max-h-48 overflow-y-auto py-1\" role=\"listbox\" aria-label=\"Features\">\n {/* No parent option */}\n <button\n type=\"button\"\n role=\"option\"\n aria-selected={value === undefined}\n onClick={() => handleSelect(undefined)}\n className={cn(\n 'hover:bg-accent hover:text-accent-foreground flex w-full items-center gap-2 px-3 py-2 text-sm',\n value === undefined && 'bg-accent/50'\n )}\n data-testid=\"parent-feature-option-none\"\n >\n <CheckIcon className={cn('h-4 w-4 shrink-0', value !== undefined && 'invisible')} />\n <span className=\"text-muted-foreground italic\">{t('createDrawer.noParent')}</span>\n </button>\n\n {filtered.length === 0 && query ? (\n <p className=\"text-muted-foreground px-3 py-2 text-sm\">\n {t('createDrawer.noFeaturesFound')}\n </p>\n ) : (\n filtered.map((f) => (\n <button\n key={f.id}\n type=\"button\"\n role=\"option\"\n aria-selected={value === f.id}\n onClick={() => handleSelect(f.id)}\n className={cn(\n 'hover:bg-accent hover:text-accent-foreground flex w-full items-center gap-2 px-3 py-2 text-sm',\n value === f.id && 'bg-accent/50'\n )}\n data-testid={`parent-feature-option-${f.id}`}\n >\n <CheckIcon className={cn('h-4 w-4 shrink-0', value !== f.id && 'invisible')} />\n <span className=\"truncate\">\n {f.name}{' '}\n <span className=\"text-muted-foreground font-mono text-xs\">\n ({f.id.slice(0, 8)})\n </span>\n </span>\n </button>\n ))\n )}\n </div>\n </div>\n </PopoverContent>\n </Popover>\n );\n}\n\n/* ---------------------------------------------------------------------------\n * RepositoryCombobox — searchable dropdown for repository selection\n * ------------------------------------------------------------------------- */\n\nexport interface RepositoryComboboxProps {\n repositories: RepositoryOption[];\n value: string | undefined;\n onChange: (path: string | undefined) => void;\n onAddRepository?: (repo: RepositoryOption) => void;\n disabled?: boolean;\n}\n\nexport function RepositoryCombobox({\n repositories,\n value,\n onChange,\n onAddRepository,\n disabled,\n}: RepositoryComboboxProps) {\n const [open, setOpen] = useState(false);\n const [query, setQuery] = useState('');\n const [isAdding, setIsAdding] = useState(false);\n const [addError, setAddError] = useState<string | null>(null);\n const [showReactPicker, setShowReactPicker] = useState(false);\n const inputRef = useRef<HTMLInputElement>(null);\n const { reactFileManager: useReactFileManager } = useFeatureFlags();\n const { t } = useTranslation('web');\n\n const selectedRepo = repositories.find((r) => r.path === value);\n\n const filtered = query.trim()\n ? repositories.filter(\n (r) =>\n r.name.toLowerCase().includes(query.toLowerCase()) ||\n r.path.toLowerCase().includes(query.toLowerCase())\n )\n : repositories;\n\n const handleSelect = useCallback(\n (path: string | undefined) => {\n onChange(path);\n setOpen(false);\n setQuery('');\n },\n [onChange]\n );\n\n const addRepoFromPath = useCallback(\n async (folderPath: string) => {\n const result = await addRepository({ path: folderPath });\n if (result.error) {\n setAddError(result.error);\n setIsAdding(false);\n return;\n }\n if (result.repository) {\n const newRepo: RepositoryOption = {\n id: result.repository.id,\n name: result.repository.name,\n path: result.repository.path,\n };\n onAddRepository?.(newRepo);\n onChange(newRepo.path);\n setOpen(false);\n setQuery('');\n }\n },\n [onAddRepository, onChange]\n );\n\n const handleAddRepository = useCallback(async () => {\n if (isAdding) return;\n\n if (useReactFileManager) {\n setShowReactPicker(true);\n return;\n }\n\n setIsAdding(true);\n setAddError(null);\n try {\n const folderPath = await pickFolder();\n if (!folderPath) {\n setIsAdding(false);\n return;\n }\n await addRepoFromPath(folderPath);\n } catch {\n // Native picker failed — fall back to React file manager\n setShowReactPicker(true);\n } finally {\n setIsAdding(false);\n }\n }, [isAdding, useReactFileManager, addRepoFromPath]);\n\n const handleReactPickerSelect = useCallback(\n async (path: string | null) => {\n setShowReactPicker(false);\n if (!path) return;\n setIsAdding(true);\n setAddError(null);\n try {\n await addRepoFromPath(path);\n } catch (err: unknown) {\n setAddError(err instanceof Error ? err.message : 'Failed to add repository');\n } finally {\n setIsAdding(false);\n }\n },\n [addRepoFromPath]\n );\n\n useEffect(() => {\n if (open) {\n setTimeout(() => inputRef.current?.focus(), 0);\n } else {\n setQuery('');\n }\n }, [open]);\n\n return (\n <>\n <Popover open={open} onOpenChange={setOpen}>\n <PopoverTrigger asChild>\n <button\n type=\"button\"\n role=\"combobox\"\n aria-expanded={open}\n aria-label=\"Repository\"\n disabled={disabled}\n data-testid=\"repository-combobox\"\n className={cn(\n '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',\n !selectedRepo && 'text-muted-foreground'\n )}\n >\n <span className=\"truncate\">\n {selectedRepo ? selectedRepo.name : 'Select repository...'}\n </span>\n <ChevronsUpDown className=\"ms-2 h-4 w-4 shrink-0 opacity-50\" />\n </button>\n </PopoverTrigger>\n <PopoverContent\n className=\"w-80 p-0\"\n align=\"start\"\n data-testid=\"repository-combobox-content\"\n >\n <div className=\"flex flex-col\">\n {/* Search input */}\n <div className=\"border-b p-2\">\n <Input\n ref={inputRef}\n placeholder={t('createDrawer.searchRepositories')}\n value={query}\n onChange={(e) => setQuery(e.target.value)}\n className=\"h-8 border-0 p-0 text-sm shadow-none focus-visible:ring-0\"\n data-testid=\"repository-search\"\n />\n </div>\n\n {/* Options list */}\n <div className=\"max-h-48 overflow-y-auto py-1\" role=\"listbox\" aria-label=\"Repositories\">\n {filtered.length === 0 ? (\n <p\n className=\"text-muted-foreground px-3 py-2 text-sm\"\n data-testid=\"repository-empty\"\n >\n No repositories found.\n </p>\n ) : (\n filtered.map((r) => (\n <button\n key={r.id}\n type=\"button\"\n role=\"option\"\n aria-selected={value === r.path}\n onClick={() => handleSelect(r.path)}\n className={cn(\n 'hover:bg-accent hover:text-accent-foreground flex w-full items-center gap-2 px-3 py-2 text-sm',\n value === r.path && 'bg-accent/50'\n )}\n data-testid={`repository-option-${r.id}`}\n >\n <CheckIcon\n className={cn('h-4 w-4 shrink-0', value !== r.path && 'invisible')}\n />\n <span className=\"flex flex-col items-start truncate\">\n <span className=\"flex items-center gap-1.5 truncate\">\n {r.name}\n {r.isFork ? (\n <Badge variant=\"outline\" className=\"h-4 shrink-0 px-1 text-[10px]\">\n <GitFork className=\"mr-0.5 h-2.5 w-2.5\" />\n Fork\n </Badge>\n ) : null}\n </span>\n <span className=\"text-muted-foreground truncate text-xs\">{r.path}</span>\n </span>\n </button>\n ))\n )}\n </div>\n\n {/* Add new repository — pinned outside scroll area */}\n <Separator />\n <button\n type=\"button\"\n onClick={handleAddRepository}\n disabled={isAdding}\n className=\"hover:bg-accent hover:text-accent-foreground flex w-full items-center gap-2 px-3 py-2 text-sm\"\n data-testid=\"add-repository-item\"\n >\n {isAdding ? (\n <Loader2 className=\"h-4 w-4 shrink-0 animate-spin\" />\n ) : (\n <FolderPlus className=\"h-4 w-4 shrink-0\" />\n )}\n <span>Add new repository...</span>\n </button>\n {addError ? (\n <p className=\"px-3 pb-2 text-xs text-red-500\" data-testid=\"add-repository-error\">\n {addError}\n </p>\n ) : null}\n </div>\n </PopoverContent>\n </Popover>\n <ReactFileManagerDialog\n open={showReactPicker}\n onOpenChange={(isOpen) => {\n if (!isOpen) setShowReactPicker(false);\n }}\n onSelect={handleReactPickerSelect}\n />\n </>\n );\n}\n","/* __next_internal_action_entry_do_not_use__ [{\"40b7b82f66bd9e710a727e7544c2fb50fda2cf3008\":\"getViewerPermission\"},\"src/presentation/web/app/actions/get-viewer-permission.ts\",\"\"] */\"use turbopack no side effects\";import{createServerReference,callServer,findSourceMapURL}from\"private-next-rsc-action-client-wrapper\";const $$RSC_SERVER_ACTION_0=/*#__PURE__*/createServerReference(\"40b7b82f66bd9e710a727e7544c2fb50fda2cf3008\",callServer,void 0,findSourceMapURL,\"getViewerPermission\");export{$$RSC_SERVER_ACTION_0 as getViewerPermission};"],"names":[],"mappings":"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"}
@@ -1,3 +1,3 @@
1
- module.exports=[433841,46646,868378,268670,685321,a=>{"use strict";var b=a.i(237705),c=a.i(996380);let d=()=>void 0;function e(a){let b=!!process.env.DEBUG;return{info:b?(...b)=>console.info(a,...b):d,debug:b?(...b)=>console.debug(a,...b):d,warn:(...b)=>console.warn(a,...b),error:(...b)=>console.error(a,...b)}}var f=a.i(701904);let g=e("[deployFeature]");async function h(a){g.info(`called — featureId="${a}"`);try{let b=(0,c.resolve)("StartFeatureDeploymentUseCase"),d=await b.execute(a);return g.info(`start succeeded — state=${d.state}`),{success:!0,state:d.state}}catch(b){let a=b instanceof Error?b.message:"Failed to deploy feature";return g.error(`error: ${a}`,b),{success:!1,error:a}}}(0,f.ensureServerEntryExports)([h]),(0,b.registerServerReference)(h,"401846920f6fb739e32233d9d6a6df7945b8621c00",null),a.s(["deployFeature",()=>h],433841);let i=e("[deployRepository]");async function j(a){i.info(`called — repositoryPath="${a}"`);try{let b=(0,c.resolve)("StartRepositoryDeploymentUseCase"),d=await b.execute(a);return i.info(`start succeeded — state=${d.state}`),{success:!0,state:d.state}}catch(b){let a=b instanceof Error?b.message:"Failed to deploy repository";return i.error(`error: ${a}`,b),{success:!1,error:a}}}(0,f.ensureServerEntryExports)([j]),(0,b.registerServerReference)(j,"408a28f520d819792447d4b47d9b73a5ddf7296469",null),a.s(["deployRepository",()=>j],46646);class k extends Error{applicationId;code;constructor(a){super(`Application ${a} not found`),this.applicationId=a,this.code="APPLICATION_NOT_FOUND",this.name="ApplicationNotFoundError",Object.setPrototypeOf(this,new.target.prototype)}}class l extends Error{applicationId;repositoryPath;code;constructor(a,b){super(`Repository path does not exist: ${b}`),this.applicationId=a,this.repositoryPath=b,this.code="APPLICATION_REPOSITORY_NOT_ON_DISK",this.name="ApplicationRepositoryNotOnDiskError",Object.setPrototypeOf(this,new.target.prototype)}}class m extends Error{repositoryPath;code;constructor(a){super("Cannot start a dev server for the repository Shep is running from"),this.repositoryPath=a,this.code="CANNOT_DEPLOY_SELF",this.name="CannotDeploySelfError",Object.setPrototypeOf(this,new.target.prototype)}}async function n(a){if(!a?.trim())return{success:!1,error:"applicationId is required"};try{let b=(0,c.resolve)("StartApplicationDeploymentUseCase"),d=await b.execute({applicationId:a});return{success:!0,state:d.state}}catch(b){if(b instanceof k)return{success:!1,error:`Application not found: ${a}`};if(b instanceof l)return{success:!1,error:`Repository path does not exist: ${b.repositoryPath}`};if(b instanceof m)return{success:!1,error:"Cannot start a dev server for the repository Shep is running from"};return{success:!1,error:b instanceof Error?b.message:"Failed to deploy application"}}}async function o(a){try{let b=(0,c.resolve)("StopDeploymentUseCase");return await b.execute(a),{success:!0}}catch(a){return{success:!1,error:a instanceof Error?a.message:"Failed to stop deployment"}}}async function p(a){return(0,c.resolve)("GetDeploymentStatusUseCase").execute(a)}(0,f.ensureServerEntryExports)([n]),(0,b.registerServerReference)(n,"4005923232df16201d86b35c46dbbe719725cbcd26",null),a.s(["deployApplication",()=>n],868378),(0,f.ensureServerEntryExports)([o]),(0,b.registerServerReference)(o,"409ab95b1ec58ad7dd578b018e11d5bd766839f8bc",null),a.s(["stopDeployment",()=>o],268670),(0,f.ensureServerEntryExports)([p]),(0,b.registerServerReference)(p,"40ed3ea24841c9c4280513ab004dcdbce3d545bcdb",null),a.s(["getDeploymentStatus",()=>p],685321)},794691,a=>{"use strict";var b=a.i(237705),c=a.i(996380);async function d(a){return a?.trim()?(0,c.resolve)("IDeploymentService").getLogs(a):null}(0,a.i(701904).ensureServerEntryExports)([d]),(0,b.registerServerReference)(d,"405723722c9eb9b4888b52203cfb121401f0c61a80",null),a.s(["getDeploymentLogs",()=>d])},958925,a=>{"use strict";var b=a.i(912513),c=a.i(889253),d=a.i(723504),e=a.i(408115),f=a.i(827900),g=a.i(673350),h=a.i(673101),i=a.i(654775),j=a.i(265324),k=a.i(794691),l=a.i(433841),m=a.i(46646),n=a.i(868378),o=a.i(268670),p=a.i(685321),q=a.i(237705),r=a.i(615704),s=a.i(996380),t=a.i(633244),u=a.i(701904);async function v(a){try{let b=(0,s.resolve)("LoadSettingsUseCase"),c=await b.execute(),d=c.workflow.skillInjection?.skills??[],e=d.filter(b=>b.name!==a);if(e.length===d.length)return{success:!1,error:`Skill "${a}" not found in configuration`};let f={...c,workflow:{...c.workflow,skillInjection:{enabled:c.workflow.skillInjection?.enabled??!1,skills:e}},updatedAt:new Date},g=(0,s.resolve)("UpdateSettingsUseCase");return await g.execute(f),(0,t.updateSettings)(f),(0,r.revalidatePath)("/skills"),{success:!0}}catch(a){return{success:!1,error:a instanceof Error?a.message:"Failed to remove skill"}}}async function w(a){try{let b=(0,s.resolve)("LoadSettingsUseCase"),c=await b.execute(),d=c.workflow.skillInjection?.skills??[];if(d.some(b=>b.name===a.name))return{success:!1,error:`Skill "${a.name}" is already configured`};let e={...c,workflow:{...c.workflow,skillInjection:{enabled:c.workflow.skillInjection?.enabled??!0,skills:[...d,a]}},updatedAt:new Date},f=(0,s.resolve)("UpdateSettingsUseCase");return await f.execute(e),(0,t.updateSettings)(e),(0,r.revalidatePath)("/skills"),{success:!0}}catch(a){return{success:!1,error:a instanceof Error?a.message:"Failed to add skill"}}}(0,u.ensureServerEntryExports)([v]),(0,q.registerServerReference)(v,"404cbbf5cbe0cfdf07d93183de60894f8629e44bbf",null),(0,u.ensureServerEntryExports)([w]),(0,q.registerServerReference)(w,"40f4b35b187e528b58a0ceffc79c02c821fbf3d40b",null),a.s([],408157),a.i(408157),a.s(["0015f0a240c29915a74257d5ff2d7d15b32c6a778d",()=>b.pickFolder,"00613a83ba2b2619c9ef46303abae5aded26339bc3",()=>i.listGitHubOrganizations,"006ff5a74754817b8a495d7ba26e66c354851f6c99",()=>c.getDefaultAgentAndModel,"00d2c30c2b08e36b014924412d0cd61610cd91c78e",()=>e.checkAllAgentsStatus,"00d43390ab8112b0e6ec134ef3485ab210e36f7842",()=>d.getAllAgentModels,"4005923232df16201d86b35c46dbbe719725cbcd26",()=>n.deployApplication,"401846920f6fb739e32233d9d6a6df7945b8621c00",()=>l.deployFeature,"403ab98df2cf8db571b47142cd90ab7c7f297fa90f",()=>h.listGitHubRepositories,"404cbbf5cbe0cfdf07d93183de60894f8629e44bbf",()=>v,"405723722c9eb9b4888b52203cfb121401f0c61a80",()=>k.getDeploymentLogs,"408a28f520d819792447d4b47d9b73a5ddf7296469",()=>m.deployRepository,"409ab95b1ec58ad7dd578b018e11d5bd766839f8bc",()=>o.stopDeployment,"40e011f8f2f54f36460ff5310dd49178590a992d44",()=>j.importGitHubRepository,"40ed3ea24841c9c4280513ab004dcdbce3d545bcdb",()=>p.getDeploymentStatus,"40f4b35b187e528b58a0ceffc79c02c821fbf3d40b",()=>w,"40fcb38a7daafc835826043ee30ef771eae2a2f635",()=>g.globalSearch,"60036293085b1751ff35875b7762b2353bb09757b5",()=>f.updateAgentAndModel],958925)}];
1
+ module.exports=[433841,46646,868378,268670,685321,a=>{"use strict";var b=a.i(237705),c=a.i(996380);let d=()=>void 0;function e(a){let b=!!process.env.DEBUG;return{info:b?(...b)=>console.info(a,...b):d,debug:b?(...b)=>console.debug(a,...b):d,warn:(...b)=>console.warn(a,...b),error:(...b)=>console.error(a,...b)}}var f=a.i(701904);let g=e("[deployFeature]");async function h(a){g.info(`called — featureId="${a}"`);try{let b=(0,c.resolve)("StartFeatureDeploymentUseCase"),d=await b.execute(a);return g.info(`start succeeded — state=${d.state}`),{success:!0,state:d.state}}catch(b){let a=b instanceof Error?b.message:"Failed to deploy feature";return g.error(`error: ${a}`,b),{success:!1,error:a}}}(0,f.ensureServerEntryExports)([h]),(0,b.registerServerReference)(h,"40aa1efa0fed8941c16c9537ba0c5d988cf13fecaf",null),a.s(["deployFeature",()=>h],433841);let i=e("[deployRepository]");async function j(a){i.info(`called — repositoryPath="${a}"`);try{let b=(0,c.resolve)("StartRepositoryDeploymentUseCase"),d=await b.execute(a);return i.info(`start succeeded — state=${d.state}`),{success:!0,state:d.state}}catch(b){let a=b instanceof Error?b.message:"Failed to deploy repository";return i.error(`error: ${a}`,b),{success:!1,error:a}}}(0,f.ensureServerEntryExports)([j]),(0,b.registerServerReference)(j,"403a844cbb36e5d50051fe552f050ed35a8b88f317",null),a.s(["deployRepository",()=>j],46646);class k extends Error{applicationId;code;constructor(a){super(`Application ${a} not found`),this.applicationId=a,this.code="APPLICATION_NOT_FOUND",this.name="ApplicationNotFoundError",Object.setPrototypeOf(this,new.target.prototype)}}class l extends Error{applicationId;repositoryPath;code;constructor(a,b){super(`Repository path does not exist: ${b}`),this.applicationId=a,this.repositoryPath=b,this.code="APPLICATION_REPOSITORY_NOT_ON_DISK",this.name="ApplicationRepositoryNotOnDiskError",Object.setPrototypeOf(this,new.target.prototype)}}class m extends Error{repositoryPath;code;constructor(a){super("Cannot start a dev server for the repository Shep is running from"),this.repositoryPath=a,this.code="CANNOT_DEPLOY_SELF",this.name="CannotDeploySelfError",Object.setPrototypeOf(this,new.target.prototype)}}async function n(a){if(!a?.trim())return{success:!1,error:"applicationId is required"};try{let b=(0,c.resolve)("StartApplicationDeploymentUseCase"),d=await b.execute({applicationId:a});return{success:!0,state:d.state}}catch(b){if(b instanceof k)return{success:!1,error:`Application not found: ${a}`};if(b instanceof l)return{success:!1,error:`Repository path does not exist: ${b.repositoryPath}`};if(b instanceof m)return{success:!1,error:"Cannot start a dev server for the repository Shep is running from"};return{success:!1,error:b instanceof Error?b.message:"Failed to deploy application"}}}async function o(a){try{let b=(0,c.resolve)("StopDeploymentUseCase");return await b.execute(a),{success:!0}}catch(a){return{success:!1,error:a instanceof Error?a.message:"Failed to stop deployment"}}}async function p(a){return(0,c.resolve)("GetDeploymentStatusUseCase").execute(a)}(0,f.ensureServerEntryExports)([n]),(0,b.registerServerReference)(n,"40559cc32878be443a5d902e563fa65ac29566c575",null),a.s(["deployApplication",()=>n],868378),(0,f.ensureServerEntryExports)([o]),(0,b.registerServerReference)(o,"403c93928208c54fe25784ff60dcb073f25d1055c1",null),a.s(["stopDeployment",()=>o],268670),(0,f.ensureServerEntryExports)([p]),(0,b.registerServerReference)(p,"402a545f24583952d99d18566abf474dd10d07741b",null),a.s(["getDeploymentStatus",()=>p],685321)},794691,a=>{"use strict";var b=a.i(237705),c=a.i(996380);async function d(a){return a?.trim()?(0,c.resolve)("IDeploymentService").getLogs(a):null}(0,a.i(701904).ensureServerEntryExports)([d]),(0,b.registerServerReference)(d,"40e827f64795e580b75e126ddfefa3a9a722da877c",null),a.s(["getDeploymentLogs",()=>d])},958925,a=>{"use strict";var b=a.i(912513),c=a.i(889253),d=a.i(723504),e=a.i(408115),f=a.i(827900),g=a.i(673350),h=a.i(673101),i=a.i(654775),j=a.i(265324),k=a.i(794691),l=a.i(433841),m=a.i(46646),n=a.i(868378),o=a.i(268670),p=a.i(685321),q=a.i(237705),r=a.i(615704),s=a.i(996380),t=a.i(633244),u=a.i(701904);async function v(a){try{let b=(0,s.resolve)("LoadSettingsUseCase"),c=await b.execute(),d=c.workflow.skillInjection?.skills??[],e=d.filter(b=>b.name!==a);if(e.length===d.length)return{success:!1,error:`Skill "${a}" not found in configuration`};let f={...c,workflow:{...c.workflow,skillInjection:{enabled:c.workflow.skillInjection?.enabled??!1,skills:e}},updatedAt:new Date},g=(0,s.resolve)("UpdateSettingsUseCase");return await g.execute(f),(0,t.updateSettings)(f),(0,r.revalidatePath)("/skills"),{success:!0}}catch(a){return{success:!1,error:a instanceof Error?a.message:"Failed to remove skill"}}}async function w(a){try{let b=(0,s.resolve)("LoadSettingsUseCase"),c=await b.execute(),d=c.workflow.skillInjection?.skills??[];if(d.some(b=>b.name===a.name))return{success:!1,error:`Skill "${a.name}" is already configured`};let e={...c,workflow:{...c.workflow,skillInjection:{enabled:c.workflow.skillInjection?.enabled??!0,skills:[...d,a]}},updatedAt:new Date},f=(0,s.resolve)("UpdateSettingsUseCase");return await f.execute(e),(0,t.updateSettings)(e),(0,r.revalidatePath)("/skills"),{success:!0}}catch(a){return{success:!1,error:a instanceof Error?a.message:"Failed to add skill"}}}(0,u.ensureServerEntryExports)([v]),(0,q.registerServerReference)(v,"40bbc7a178882065cb023af5e8c819713966705830",null),(0,u.ensureServerEntryExports)([w]),(0,q.registerServerReference)(w,"40e2f63b6c84afbed3693cc4359e99d9f35adc1047",null),a.s([],408157),a.i(408157),a.s(["00c270c7a6f9c21fabe7b7271a4bf75d5cef02d22a",()=>c.getDefaultAgentAndModel,"00c38b234d35460bb11ea6a1b0fff1c22e01c08873",()=>e.checkAllAgentsStatus,"00c4af7e37cefa35ac7db65fa9b45995caf677a597",()=>i.listGitHubOrganizations,"00c6d708f17ef9dc5f3443dc4d3b3f3756c20b1392",()=>d.getAllAgentModels,"00e58a33ab1b838c8207f1b7dbe831d7a7b8cd3330",()=>b.pickFolder,"4015ea81e1b2a02fe57f374a012b37e2cd322146f1",()=>g.globalSearch,"402a545f24583952d99d18566abf474dd10d07741b",()=>p.getDeploymentStatus,"403a844cbb36e5d50051fe552f050ed35a8b88f317",()=>m.deployRepository,"403c93928208c54fe25784ff60dcb073f25d1055c1",()=>o.stopDeployment,"40559cc32878be443a5d902e563fa65ac29566c575",()=>n.deployApplication,"405f5f5259eaed6742d1a59f416d4319ea63f3bb3d",()=>j.importGitHubRepository,"40aa1efa0fed8941c16c9537ba0c5d988cf13fecaf",()=>l.deployFeature,"40bbc7a178882065cb023af5e8c819713966705830",()=>v,"40d1082c73e97a2c5f99ef11d815cefe59a26e8998",()=>h.listGitHubRepositories,"40e2f63b6c84afbed3693cc4359e99d9f35adc1047",()=>w,"40e827f64795e580b75e126ddfefa3a9a722da877c",()=>k.getDeploymentLogs,"60afd0d4fa2a6638646f7d23dc6c8673fd27a69207",()=>f.updateAgentAndModel],958925)}];
2
2
 
3
3
  //# sourceMappingURL=src_presentation_web_1d8d177f._.js.map