@shepai/cli 1.78.1 → 1.79.0

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 (292) hide show
  1. package/dist/src/presentation/web/app/(dashboard)/@drawer/feature/[featureId]/page.d.ts.map +1 -1
  2. package/dist/src/presentation/web/app/(dashboard)/@drawer/feature/[featureId]/page.js +14 -1
  3. package/dist/src/presentation/web/app/actions/get-feature-phase-timings.d.ts +17 -0
  4. package/dist/src/presentation/web/app/actions/get-feature-phase-timings.d.ts.map +1 -0
  5. package/dist/src/presentation/web/app/actions/get-feature-phase-timings.js +25 -0
  6. package/dist/src/presentation/web/app/actions/get-feature-plan.d.ts +18 -0
  7. package/dist/src/presentation/web/app/actions/get-feature-plan.d.ts.map +1 -0
  8. package/dist/src/presentation/web/app/actions/get-feature-plan.js +31 -0
  9. package/dist/src/presentation/web/app/api/feature-logs/route.d.ts +16 -0
  10. package/dist/src/presentation/web/app/api/feature-logs/route.d.ts.map +1 -0
  11. package/dist/src/presentation/web/app/api/feature-logs/route.js +184 -0
  12. package/dist/src/presentation/web/app/build-feature-node-data.d.ts +7 -1
  13. package/dist/src/presentation/web/app/build-feature-node-data.d.ts.map +1 -1
  14. package/dist/src/presentation/web/app/build-feature-node-data.js +7 -1
  15. package/dist/src/presentation/web/app/build-graph-nodes.js +7 -3
  16. package/dist/src/presentation/web/app/settings/page.js +1 -1
  17. package/dist/src/presentation/web/components/common/control-center-drawer/drawer-view.d.ts +7 -19
  18. package/dist/src/presentation/web/components/common/control-center-drawer/drawer-view.d.ts.map +1 -1
  19. package/dist/src/presentation/web/components/common/control-center-drawer/drawer-view.js +6 -6
  20. package/dist/src/presentation/web/components/common/control-center-drawer/feature-drawer-client.d.ts.map +1 -1
  21. package/dist/src/presentation/web/components/common/control-center-drawer/feature-drawer-client.js +48 -85
  22. package/dist/src/presentation/web/components/common/feature-drawer/index.d.ts +1 -1
  23. package/dist/src/presentation/web/components/common/feature-drawer/index.d.ts.map +1 -1
  24. package/dist/src/presentation/web/components/common/feature-drawer/index.js +1 -1
  25. package/dist/src/presentation/web/components/common/feature-drawer-tabs/activity-tab.d.ts +8 -0
  26. package/dist/src/presentation/web/components/common/feature-drawer-tabs/activity-tab.d.ts.map +1 -0
  27. package/dist/src/presentation/web/components/common/feature-drawer-tabs/activity-tab.js +90 -0
  28. package/dist/src/presentation/web/components/common/feature-drawer-tabs/activity-tab.stories.d.ts +20 -0
  29. package/dist/src/presentation/web/components/common/feature-drawer-tabs/activity-tab.stories.d.ts.map +1 -0
  30. package/dist/src/presentation/web/components/common/feature-drawer-tabs/activity-tab.stories.js +252 -0
  31. package/dist/src/presentation/web/components/common/feature-drawer-tabs/feature-drawer-tabs.d.ts +31 -0
  32. package/dist/src/presentation/web/components/common/feature-drawer-tabs/feature-drawer-tabs.d.ts.map +1 -0
  33. package/dist/src/presentation/web/components/common/feature-drawer-tabs/feature-drawer-tabs.js +123 -0
  34. package/dist/src/presentation/web/components/common/feature-drawer-tabs/feature-drawer-tabs.stories.d.ts +20 -0
  35. package/dist/src/presentation/web/components/common/feature-drawer-tabs/feature-drawer-tabs.stories.d.ts.map +1 -0
  36. package/dist/src/presentation/web/components/common/feature-drawer-tabs/feature-drawer-tabs.stories.js +315 -0
  37. package/dist/src/presentation/web/components/common/feature-drawer-tabs/index.d.ts +3 -0
  38. package/dist/src/presentation/web/components/common/feature-drawer-tabs/index.d.ts.map +1 -0
  39. package/dist/src/presentation/web/components/common/feature-drawer-tabs/index.js +1 -0
  40. package/dist/src/presentation/web/components/common/feature-drawer-tabs/log-tab.d.ts +7 -0
  41. package/dist/src/presentation/web/components/common/feature-drawer-tabs/log-tab.d.ts.map +1 -0
  42. package/dist/src/presentation/web/components/common/feature-drawer-tabs/log-tab.js +35 -0
  43. package/dist/src/presentation/web/components/common/feature-drawer-tabs/log-tab.stories.d.ts +18 -0
  44. package/dist/src/presentation/web/components/common/feature-drawer-tabs/log-tab.stories.d.ts.map +1 -0
  45. package/dist/src/presentation/web/components/common/feature-drawer-tabs/log-tab.stories.js +89 -0
  46. package/dist/src/presentation/web/components/common/feature-drawer-tabs/overview-tab.d.ts +6 -0
  47. package/dist/src/presentation/web/components/common/feature-drawer-tabs/overview-tab.d.ts.map +1 -0
  48. package/dist/src/presentation/web/components/common/feature-drawer-tabs/overview-tab.js +78 -0
  49. package/dist/src/presentation/web/components/common/feature-drawer-tabs/overview-tab.stories.d.ts +28 -0
  50. package/dist/src/presentation/web/components/common/feature-drawer-tabs/overview-tab.stories.d.ts.map +1 -0
  51. package/dist/src/presentation/web/components/common/feature-drawer-tabs/overview-tab.stories.js +157 -0
  52. package/dist/src/presentation/web/components/common/feature-drawer-tabs/plan-tab.d.ts +8 -0
  53. package/dist/src/presentation/web/components/common/feature-drawer-tabs/plan-tab.d.ts.map +1 -0
  54. package/dist/src/presentation/web/components/common/feature-drawer-tabs/plan-tab.js +40 -0
  55. package/dist/src/presentation/web/components/common/feature-drawer-tabs/plan-tab.stories.d.ts +22 -0
  56. package/dist/src/presentation/web/components/common/feature-drawer-tabs/plan-tab.stories.d.ts.map +1 -0
  57. package/dist/src/presentation/web/components/common/feature-drawer-tabs/plan-tab.stories.js +188 -0
  58. package/dist/src/presentation/web/components/common/feature-drawer-tabs/use-tab-data-fetch.d.ts +30 -0
  59. package/dist/src/presentation/web/components/common/feature-drawer-tabs/use-tab-data-fetch.d.ts.map +1 -0
  60. package/dist/src/presentation/web/components/common/feature-drawer-tabs/use-tab-data-fetch.js +100 -0
  61. package/dist/src/presentation/web/components/common/feature-node/feature-node-state-config.d.ts +12 -0
  62. package/dist/src/presentation/web/components/common/feature-node/feature-node-state-config.d.ts.map +1 -1
  63. package/dist/src/presentation/web/components/common/index.d.ts +3 -4
  64. package/dist/src/presentation/web/components/common/index.d.ts.map +1 -1
  65. package/dist/src/presentation/web/components/common/index.js +3 -4
  66. package/dist/src/presentation/web/components/common/merge-review/index.d.ts +1 -2
  67. package/dist/src/presentation/web/components/common/merge-review/index.d.ts.map +1 -1
  68. package/dist/src/presentation/web/components/common/merge-review/index.js +0 -1
  69. package/dist/src/presentation/web/components/common/merge-review/merge-review.stories.d.ts +0 -8
  70. package/dist/src/presentation/web/components/common/merge-review/merge-review.stories.d.ts.map +1 -1
  71. package/dist/src/presentation/web/components/common/merge-review/merge-review.stories.js +1 -33
  72. package/dist/src/presentation/web/components/common/prd-questionnaire/index.d.ts +1 -2
  73. package/dist/src/presentation/web/components/common/prd-questionnaire/index.d.ts.map +1 -1
  74. package/dist/src/presentation/web/components/common/prd-questionnaire/index.js +0 -1
  75. package/dist/src/presentation/web/components/common/prd-questionnaire/prd-questionnaire.stories.d.ts +0 -10
  76. package/dist/src/presentation/web/components/common/prd-questionnaire/prd-questionnaire.stories.d.ts.map +1 -1
  77. package/dist/src/presentation/web/components/common/prd-questionnaire/prd-questionnaire.stories.js +1 -38
  78. package/dist/src/presentation/web/components/common/tech-decisions-review/index.d.ts +1 -2
  79. package/dist/src/presentation/web/components/common/tech-decisions-review/index.d.ts.map +1 -1
  80. package/dist/src/presentation/web/components/common/tech-decisions-review/index.js +0 -1
  81. package/dist/src/presentation/web/components/common/tech-decisions-review/tech-decisions-review.stories.d.ts +0 -8
  82. package/dist/src/presentation/web/components/common/tech-decisions-review/tech-decisions-review.stories.d.ts.map +1 -1
  83. package/dist/src/presentation/web/components/common/tech-decisions-review/tech-decisions-review.stories.js +1 -29
  84. package/dist/src/presentation/web/components/features/settings/AgentModelPicker/index.js +2 -2
  85. package/dist/src/presentation/web/components/features/settings/settings-page-client.js +9 -9
  86. package/dist/src/presentation/web/hooks/use-feature-logs.d.ts +7 -0
  87. package/dist/src/presentation/web/hooks/use-feature-logs.d.ts.map +1 -0
  88. package/dist/src/presentation/web/hooks/use-feature-logs.js +52 -0
  89. package/dist/tsconfig.build.tsbuildinfo +1 -1
  90. package/package.json +1 -1
  91. package/web/.next/BUILD_ID +1 -1
  92. package/web/.next/app-path-routes-manifest.json +1 -0
  93. package/web/.next/build-manifest.json +2 -2
  94. package/web/.next/fallback-build-manifest.json +2 -2
  95. package/web/.next/prerender-manifest.json +3 -3
  96. package/web/.next/required-server-files.js +1 -1
  97. package/web/.next/required-server-files.json +1 -1
  98. package/web/.next/routes-manifest.json +6 -0
  99. package/web/.next/server/app/(dashboard)/@drawer/create/page/server-reference-manifest.json +18 -18
  100. package/web/.next/server/app/(dashboard)/@drawer/create/page.js.nft.json +1 -1
  101. package/web/.next/server/app/(dashboard)/@drawer/create/page_client-reference-manifest.js +1 -1
  102. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page/server-reference-manifest.json +68 -38
  103. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js +1 -1
  104. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js.nft.json +1 -1
  105. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page_client-reference-manifest.js +1 -1
  106. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page/server-reference-manifest.json +14 -14
  107. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js.nft.json +1 -1
  108. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  109. package/web/.next/server/app/(dashboard)/create/page/server-reference-manifest.json +18 -18
  110. package/web/.next/server/app/(dashboard)/create/page.js.nft.json +1 -1
  111. package/web/.next/server/app/(dashboard)/create/page_client-reference-manifest.js +1 -1
  112. package/web/.next/server/app/(dashboard)/feature/[featureId]/page/server-reference-manifest.json +68 -38
  113. package/web/.next/server/app/(dashboard)/feature/[featureId]/page.js +1 -1
  114. package/web/.next/server/app/(dashboard)/feature/[featureId]/page.js.nft.json +1 -1
  115. package/web/.next/server/app/(dashboard)/feature/[featureId]/page_client-reference-manifest.js +1 -1
  116. package/web/.next/server/app/(dashboard)/page/server-reference-manifest.json +14 -14
  117. package/web/.next/server/app/(dashboard)/page.js.nft.json +1 -1
  118. package/web/.next/server/app/(dashboard)/page_client-reference-manifest.js +1 -1
  119. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page/server-reference-manifest.json +14 -14
  120. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js.nft.json +1 -1
  121. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  122. package/web/.next/server/app/_global-error.html +2 -2
  123. package/web/.next/server/app/_global-error.rsc +1 -1
  124. package/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  125. package/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  126. package/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  127. package/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  128. package/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  129. package/web/.next/server/app/_not-found/page/server-reference-manifest.json +1 -1
  130. package/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  131. package/web/.next/server/app/api/feature-logs/route/app-paths-manifest.json +3 -0
  132. package/web/.next/server/app/api/feature-logs/route/build-manifest.json +11 -0
  133. package/web/.next/server/app/api/feature-logs/route/server-reference-manifest.json +4 -0
  134. package/web/.next/server/app/api/feature-logs/route.js +6 -0
  135. package/web/.next/server/app/api/feature-logs/route.js.map +5 -0
  136. package/web/.next/server/app/api/feature-logs/route.js.nft.json +1 -0
  137. package/web/.next/server/app/api/feature-logs/route_client-reference-manifest.js +2 -0
  138. package/web/.next/server/app/settings/page/server-reference-manifest.json +5 -5
  139. package/web/.next/server/app/settings/page.js.nft.json +1 -1
  140. package/web/.next/server/app/settings/page_client-reference-manifest.js +1 -1
  141. package/web/.next/server/app/skills/page/server-reference-manifest.json +6 -6
  142. package/web/.next/server/app/skills/page.js.nft.json +1 -1
  143. package/web/.next/server/app/skills/page_client-reference-manifest.js +1 -1
  144. package/web/.next/server/app/tools/page/server-reference-manifest.json +6 -6
  145. package/web/.next/server/app/tools/page.js.nft.json +1 -1
  146. package/web/.next/server/app/tools/page_client-reference-manifest.js +1 -1
  147. package/web/.next/server/app/version/page/server-reference-manifest.json +1 -1
  148. package/web/.next/server/app/version/page_client-reference-manifest.js +1 -1
  149. package/web/.next/server/app-paths-manifest.json +1 -0
  150. package/web/.next/server/chunks/744ca_web__next-internal_server_app_api_feature-logs_route_actions_177445e7.js +3 -0
  151. package/web/.next/server/chunks/744ca_web__next-internal_server_app_api_feature-logs_route_actions_177445e7.js.map +1 -0
  152. package/web/.next/server/chunks/[root-of-the-server]__91d44424._.js +12 -0
  153. package/web/.next/server/chunks/[root-of-the-server]__91d44424._.js.map +1 -0
  154. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js +1 -1
  155. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js.map +1 -1
  156. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_da7eef33.js +1 -1
  157. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_da7eef33.js.map +1 -1
  158. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_0a9251aa.js +1 -1
  159. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_0a9251aa.js.map +1 -1
  160. package/web/.next/server/chunks/ssr/[root-of-the-server]__11033878._.js +1 -1
  161. package/web/.next/server/chunks/ssr/[root-of-the-server]__11033878._.js.map +1 -1
  162. package/web/.next/server/chunks/ssr/[root-of-the-server]__357d99f9._.js +1 -1
  163. package/web/.next/server/chunks/ssr/[root-of-the-server]__4be9a9bb._.js +1 -1
  164. package/web/.next/server/chunks/ssr/[root-of-the-server]__5d87af2e._.js +1 -1
  165. package/web/.next/server/chunks/ssr/[root-of-the-server]__6eb2a2b0._.js +1 -1
  166. package/web/.next/server/chunks/ssr/[root-of-the-server]__6eb2a2b0._.js.map +1 -1
  167. package/web/.next/server/chunks/ssr/[root-of-the-server]__aad040c0._.js +1 -1
  168. package/web/.next/server/chunks/ssr/[root-of-the-server]__aad040c0._.js.map +1 -1
  169. package/web/.next/server/chunks/ssr/{[root-of-the-server]__a337ca5c._.js → [root-of-the-server]__ae824a5b._.js} +2 -2
  170. package/web/.next/server/chunks/ssr/[root-of-the-server]__ae824a5b._.js.map +1 -0
  171. package/web/.next/server/chunks/ssr/[root-of-the-server]__b3a4cef4._.js +1 -1
  172. package/web/.next/server/chunks/ssr/[root-of-the-server]__b3a4cef4._.js.map +1 -1
  173. package/web/.next/server/chunks/ssr/[root-of-the-server]__c3c963c6._.js +1 -1
  174. package/web/.next/server/chunks/ssr/[root-of-the-server]__c3c963c6._.js.map +1 -1
  175. package/web/.next/server/chunks/ssr/[root-of-the-server]__f0d8d054._.js +2 -2
  176. package/web/.next/server/chunks/ssr/[root-of-the-server]__fdc75809._.js +1 -1
  177. package/web/.next/server/chunks/ssr/[root-of-the-server]__fdc75809._.js.map +1 -1
  178. package/web/.next/server/chunks/ssr/_1e3cf73b._.js +1 -1
  179. package/web/.next/server/chunks/ssr/_1e3cf73b._.js.map +1 -1
  180. package/web/.next/server/chunks/ssr/_34fbed18._.js +1 -1
  181. package/web/.next/server/chunks/ssr/_34fbed18._.js.map +1 -1
  182. package/web/.next/server/chunks/ssr/{_06db7efd._.js → _3e88ce9d._.js} +2 -2
  183. package/web/.next/server/chunks/ssr/{_06db7efd._.js.map → _3e88ce9d._.js.map} +1 -1
  184. package/web/.next/server/chunks/ssr/_5d4e7151._.js +3 -0
  185. package/web/.next/server/chunks/ssr/{_5c4ce700._.js.map → _5d4e7151._.js.map} +1 -1
  186. package/web/.next/server/chunks/ssr/_63868199._.js +1 -1
  187. package/web/.next/server/chunks/ssr/_63868199._.js.map +1 -1
  188. package/web/.next/server/chunks/ssr/{_b0924a46._.js → _83cf28a3._.js} +2 -2
  189. package/web/.next/server/chunks/ssr/{_b0924a46._.js.map → _83cf28a3._.js.map} +1 -1
  190. package/web/.next/server/chunks/ssr/{_4031d614._.js → _887258d0._.js} +2 -2
  191. package/web/.next/server/chunks/ssr/{_4031d614._.js.map → _887258d0._.js.map} +1 -1
  192. package/web/.next/server/chunks/ssr/_8dacd1e7._.js +1 -1
  193. package/web/.next/server/chunks/ssr/_8dacd1e7._.js.map +1 -1
  194. package/web/.next/server/chunks/ssr/_acb6a73d._.js +3 -0
  195. package/web/.next/server/chunks/ssr/{_a38f282a._.js.map → _acb6a73d._.js.map} +1 -1
  196. package/web/.next/server/chunks/ssr/{_5dab501b._.js → _ba97cfd3._.js} +2 -2
  197. package/web/.next/server/chunks/ssr/{_5dab501b._.js.map → _ba97cfd3._.js.map} +1 -1
  198. package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_settings_settings-page-client_tsx_6ed9d5f8._.js +1 -1
  199. package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_settings_settings-page-client_tsx_6ed9d5f8._.js.map +1 -1
  200. package/web/.next/server/chunks/ssr/node_modules__pnpm_d80c1060._.js +3 -0
  201. package/web/.next/server/chunks/ssr/node_modules__pnpm_d80c1060._.js.map +1 -0
  202. package/web/.next/server/chunks/ssr/src_presentation_web_7efa14ca._.js +3 -0
  203. package/web/.next/server/chunks/ssr/src_presentation_web_7efa14ca._.js.map +1 -0
  204. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_021a05f2.js +1 -1
  205. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_021a05f2.js.map +1 -1
  206. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_skills_page_actions_1fa8042e.js +1 -1
  207. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_skills_page_actions_1fa8042e.js.map +1 -1
  208. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_tools_page_actions_24684200.js +1 -1
  209. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_tools_page_actions_24684200.js.map +1 -1
  210. package/web/.next/server/chunks/ssr/src_presentation_web_app_(dashboard)_get-graph-data_ts_b018483e._.js +1 -1
  211. package/web/.next/server/chunks/ssr/src_presentation_web_app_(dashboard)_get-graph-data_ts_b018483e._.js.map +1 -1
  212. package/web/.next/server/chunks/ssr/src_presentation_web_b59d79db._.js +3 -0
  213. package/web/.next/server/chunks/ssr/src_presentation_web_b59d79db._.js.map +1 -0
  214. package/web/.next/server/chunks/ssr/src_presentation_web_c4348b8a._.js +2 -2
  215. package/web/.next/server/chunks/ssr/src_presentation_web_c4348b8a._.js.map +1 -1
  216. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js +1 -1
  217. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js.map +1 -1
  218. package/web/.next/server/chunks/ssr/src_presentation_web_e4510d10._.js +2 -2
  219. package/web/.next/server/chunks/ssr/src_presentation_web_e4510d10._.js.map +1 -1
  220. package/web/.next/server/pages/500.html +2 -2
  221. package/web/.next/server/server-reference-manifest.js +1 -1
  222. package/web/.next/server/server-reference-manifest.json +108 -64
  223. package/web/.next/static/chunks/{87152e918f80ea8b.js → 297458261f67218c.js} +1 -1
  224. package/web/.next/static/chunks/{1f57d0c949dbb44d.js → 2a24ac257fc1c10b.js} +1 -1
  225. package/web/.next/static/chunks/352e25e1bb2b9edb.js +1 -0
  226. package/web/.next/static/chunks/{8fe834f8a3c36e2f.js → 47ecde22e9663419.js} +2 -2
  227. package/web/.next/static/chunks/{27c4a8493483e6f3.js → 49743c83c9bced40.js} +1 -1
  228. package/web/.next/static/chunks/4b20d522b4f5ca7e.js +1 -0
  229. package/web/.next/static/chunks/{9d8c6c874071efb2.js → 5688494bf052915d.js} +1 -1
  230. package/web/.next/static/chunks/77a956d5dd063fef.js +1 -0
  231. package/web/.next/static/chunks/{78455afb0164395c.js → 8eff15a7f35164f9.js} +2 -2
  232. package/web/.next/static/chunks/96bab6d3820504f3.css +2 -0
  233. package/web/.next/static/chunks/a1c2ecb710b44081.js +1 -0
  234. package/web/.next/static/chunks/{6f7ba7846dcc8b21.js → d8d464c156573994.js} +1 -1
  235. package/web/.next/static/chunks/e29d1e26c2694f78.js +1 -0
  236. package/dist/src/presentation/web/components/common/feature-drawer/feature-drawer.d.ts +0 -9
  237. package/dist/src/presentation/web/components/common/feature-drawer/feature-drawer.d.ts.map +0 -1
  238. package/dist/src/presentation/web/components/common/feature-drawer/feature-drawer.js +0 -60
  239. package/dist/src/presentation/web/components/common/feature-drawer/feature-drawer.stories.d.ts +0 -47
  240. package/dist/src/presentation/web/components/common/feature-drawer/feature-drawer.stories.d.ts.map +0 -1
  241. package/dist/src/presentation/web/components/common/feature-drawer/feature-drawer.stories.js +0 -307
  242. package/dist/src/presentation/web/components/common/merge-review/merge-review-drawer.d.ts +0 -3
  243. package/dist/src/presentation/web/components/common/merge-review/merge-review-drawer.d.ts.map +0 -1
  244. package/dist/src/presentation/web/components/common/merge-review/merge-review-drawer.js +0 -8
  245. package/dist/src/presentation/web/components/common/prd-questionnaire/prd-questionnaire-drawer.d.ts +0 -3
  246. package/dist/src/presentation/web/components/common/prd-questionnaire/prd-questionnaire-drawer.d.ts.map +0 -1
  247. package/dist/src/presentation/web/components/common/prd-questionnaire/prd-questionnaire-drawer.js +0 -8
  248. package/dist/src/presentation/web/components/common/review-drawer-shell/index.d.ts +0 -3
  249. package/dist/src/presentation/web/components/common/review-drawer-shell/index.d.ts.map +0 -1
  250. package/dist/src/presentation/web/components/common/review-drawer-shell/index.js +0 -1
  251. package/dist/src/presentation/web/components/common/review-drawer-shell/review-drawer-shell-config.d.ts +0 -26
  252. package/dist/src/presentation/web/components/common/review-drawer-shell/review-drawer-shell-config.d.ts.map +0 -1
  253. package/dist/src/presentation/web/components/common/review-drawer-shell/review-drawer-shell-config.js +0 -1
  254. package/dist/src/presentation/web/components/common/review-drawer-shell/review-drawer-shell.d.ts +0 -3
  255. package/dist/src/presentation/web/components/common/review-drawer-shell/review-drawer-shell.d.ts.map +0 -1
  256. package/dist/src/presentation/web/components/common/review-drawer-shell/review-drawer-shell.js +0 -29
  257. package/dist/src/presentation/web/components/common/review-drawer-shell/review-drawer-shell.stories.d.ts +0 -14
  258. package/dist/src/presentation/web/components/common/review-drawer-shell/review-drawer-shell.stories.d.ts.map +0 -1
  259. package/dist/src/presentation/web/components/common/review-drawer-shell/review-drawer-shell.stories.js +0 -33
  260. package/dist/src/presentation/web/components/common/tech-decisions-review/tech-decisions-drawer.d.ts +0 -3
  261. package/dist/src/presentation/web/components/common/tech-decisions-review/tech-decisions-drawer.d.ts.map +0 -1
  262. package/dist/src/presentation/web/components/common/tech-decisions-review/tech-decisions-drawer.js +0 -8
  263. package/dist/src/presentation/web/components/common/tech-review-tabs/index.d.ts +0 -3
  264. package/dist/src/presentation/web/components/common/tech-review-tabs/index.d.ts.map +0 -1
  265. package/dist/src/presentation/web/components/common/tech-review-tabs/index.js +0 -1
  266. package/dist/src/presentation/web/components/common/tech-review-tabs/tech-review-tabs-config.d.ts +0 -21
  267. package/dist/src/presentation/web/components/common/tech-review-tabs/tech-review-tabs-config.d.ts.map +0 -1
  268. package/dist/src/presentation/web/components/common/tech-review-tabs/tech-review-tabs-config.js +0 -1
  269. package/dist/src/presentation/web/components/common/tech-review-tabs/tech-review-tabs.d.ts +0 -3
  270. package/dist/src/presentation/web/components/common/tech-review-tabs/tech-review-tabs.d.ts.map +0 -1
  271. package/dist/src/presentation/web/components/common/tech-review-tabs/tech-review-tabs.js +0 -12
  272. package/dist/src/presentation/web/components/common/tech-review-tabs/tech-review-tabs.stories.d.ts +0 -16
  273. package/dist/src/presentation/web/components/common/tech-review-tabs/tech-review-tabs.stories.d.ts.map +0 -1
  274. package/dist/src/presentation/web/components/common/tech-review-tabs/tech-review-tabs.stories.js +0 -110
  275. package/web/.next/server/chunks/ssr/[root-of-the-server]__a337ca5c._.js.map +0 -1
  276. package/web/.next/server/chunks/ssr/_5c4ce700._.js +0 -3
  277. package/web/.next/server/chunks/ssr/_a38f282a._.js +0 -3
  278. package/web/.next/server/chunks/ssr/node_modules__pnpm_5412e589._.js +0 -3
  279. package/web/.next/server/chunks/ssr/node_modules__pnpm_5412e589._.js.map +0 -1
  280. package/web/.next/server/chunks/ssr/src_presentation_web_30d7eeda._.js +0 -3
  281. package/web/.next/server/chunks/ssr/src_presentation_web_30d7eeda._.js.map +0 -1
  282. package/web/.next/server/chunks/ssr/src_presentation_web_565a14f8._.js +0 -3
  283. package/web/.next/server/chunks/ssr/src_presentation_web_565a14f8._.js.map +0 -1
  284. package/web/.next/static/chunks/08c0a9667c05866c.css +0 -2
  285. package/web/.next/static/chunks/0fb8038f7ad4d2cf.js +0 -1
  286. package/web/.next/static/chunks/1211dcaac5963f92.js +0 -1
  287. package/web/.next/static/chunks/6a3e8ea6e1fd2113.js +0 -1
  288. package/web/.next/static/chunks/7336f9ec160c7bd8.js +0 -1
  289. package/web/.next/static/chunks/ba8b2aaa356a5487.js +0 -1
  290. /package/web/.next/static/{M0oz1_1InoSyr7OMLAKf7 → hVGa8-vd4pFs9splpgq-k}/_buildManifest.js +0 -0
  291. /package/web/.next/static/{M0oz1_1InoSyr7OMLAKf7 → hVGa8-vd4pFs9splpgq-k}/_clientMiddlewareManifest.json +0 -0
  292. /package/web/.next/static/{M0oz1_1InoSyr7OMLAKf7 → hVGa8-vd4pFs9splpgq-k}/_ssgManifest.js +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../../../src/presentation/web/lib/server-container.ts","../../../../../../src/presentation/web/app/api/feature-logs/route.ts","../../../../../../node_modules/.pnpm/next%4016.1.6_%40babel%2Bcore%407.29.0_%40playwright%2Btest%401.58.1_react-dom%4019.2.4_react%4019.2.4__react%4019.2.4/node_modules/next/dist/esm/build/templates/app-route.js"],"sourcesContent":["/**\n * Server Container Accessor\n *\n * Provides a `resolve()` helper for server components and API routes to\n * obtain DI-managed instances. The tsyringe container is placed on globalThis\n * by the CLI bootstrap (`shep ui`) or the dev-server (`pnpm dev:web`).\n */\n\nimport type { DependencyContainer, InjectionToken } from 'tsyringe';\n\nconst CONTAINER_KEY = '__shepContainer';\n\n/**\n * Resolve a dependency from the DI container.\n *\n * Usage in server components / API routes:\n * ```ts\n * import { resolve } from '@/lib/server-container';\n * import { ListFeaturesUseCase } from '@shepai/core/application/use-cases/features/list-features.use-case';\n *\n * const features = await resolve(ListFeaturesUseCase).execute();\n * ```\n */\nexport function resolve<T>(token: InjectionToken<T>): T {\n const container = (globalThis as Record<string, unknown>)[CONTAINER_KEY] as\n | DependencyContainer\n | undefined;\n\n if (!container) {\n throw new Error(\n 'DI container not available. Ensure the CLI bootstrap or dev-server has initialized it.'\n );\n }\n\n return container.resolve(token);\n}\n","/**\n * SSE API Route: GET /api/feature-logs\n *\n * Streams feature agent log output to the client via Server-Sent Events.\n * Resolves the feature to find its agentRunId, reads the corresponding\n * worker log file, and watches for new content.\n *\n * - Accepts ?featureId query parameter (required)\n * - Sends existing log content as SSE \"initial\" event\n * - Sends new log content as SSE \"log\" events\n * - Sends heartbeat comments every 30 seconds to keep connection alive\n * - Cleans up watchers/intervals on client disconnect\n */\n\nimport { resolve } from '@/lib/server-container';\nimport type { IFeatureRepository } from '@shepai/core/application/ports/output/repositories/feature-repository.interface';\nimport { join } from 'node:path';\nimport { homedir } from 'node:os';\nimport { readFile, stat } from 'node:fs/promises';\nimport { watch, type FSWatcher } from 'node:fs';\n\n// Force dynamic — SSE streams must never be statically optimized or cached\nexport const dynamic = 'force-dynamic';\n\nconst HEARTBEAT_INTERVAL_MS = 30_000;\nconst POLL_INTERVAL_MS = 2_000;\n\n/**\n * Create a short-lived SSE error response.\n */\nfunction sseError(error: string): Response {\n const stream = new ReadableStream<Uint8Array>({\n start(controller) {\n const encoder = new TextEncoder();\n controller.enqueue(encoder.encode(`event: error\\ndata: ${JSON.stringify({ error })}\\n\\n`));\n controller.close();\n },\n });\n\n return new Response(stream, {\n headers: {\n 'Content-Type': 'text/event-stream',\n 'Cache-Control': 'no-cache',\n Connection: 'keep-alive',\n },\n });\n}\n\nexport async function GET(request: Request): Promise<Response> {\n try {\n const url = new URL(request.url);\n const featureId = url.searchParams.get('featureId');\n\n if (!featureId?.trim()) {\n return sseError('featureId is required');\n }\n\n const featureRepo = resolve<IFeatureRepository>('IFeatureRepository');\n const feature = await featureRepo.findById(featureId);\n\n if (!feature) {\n return sseError(`Feature not found: ${featureId}`);\n }\n\n if (!feature.agentRunId) {\n return sseError(`Feature \"${feature.name}\" has no agent run`);\n }\n\n const logPath = join(homedir(), '.shep', 'logs', `worker-${feature.agentRunId}.log`);\n\n const stream = new ReadableStream<Uint8Array>({\n start(controller) {\n const encoder = new TextEncoder();\n let stopped = false;\n let bytesRead = 0;\n let watcher: FSWatcher | null = null;\n let pollInterval: ReturnType<typeof setInterval> | null = null;\n\n function enqueue(text: string) {\n if (stopped) return;\n try {\n controller.enqueue(encoder.encode(text));\n } catch {\n // Stream may be closed\n }\n }\n\n /**\n * Read any new content from the log file starting at `bytesRead`.\n * Returns the content read, or null if the file doesn't exist yet.\n */\n async function readNewContent(): Promise<string | null> {\n try {\n const fileStat = await stat(logPath);\n if (fileStat.size <= bytesRead) return null;\n\n const content = await readFile(logPath, 'utf-8');\n const newContent = content.slice(bytesRead);\n bytesRead = content.length;\n return newContent || null;\n } catch {\n // File doesn't exist yet — agent may have just started\n return null;\n }\n }\n\n /**\n * Check for new content and send it as a log event.\n */\n async function checkForUpdates() {\n if (stopped) return;\n try {\n const content = await readNewContent();\n if (content) {\n enqueue(`event: log\\ndata: ${JSON.stringify({ content })}\\n\\n`);\n }\n } catch {\n // Ignore read errors during polling\n }\n }\n\n // Initialize: read existing content and set up watchers\n (async () => {\n try {\n // Send existing content as initial event\n const initialContent = await readNewContent();\n if (initialContent) {\n enqueue(`event: initial\\ndata: ${JSON.stringify({ content: initialContent })}\\n\\n`);\n }\n\n if (stopped) return;\n\n // Watch for file changes with fs.watch\n try {\n watcher = watch(logPath, { persistent: false }, () => {\n void checkForUpdates();\n });\n\n watcher.on('error', () => {\n // Watcher error — fallback poll will handle it\n });\n } catch {\n // File may not exist yet — poll will handle it\n }\n\n // Fallback poll every 2s (handles cases where fs.watch misses events\n // or the file doesn't exist yet)\n pollInterval = setInterval(() => {\n void checkForUpdates();\n }, POLL_INTERVAL_MS);\n } catch {\n // Initialization error — stream will still stay open for heartbeats\n }\n })();\n\n // Heartbeat to keep connection alive\n const heartbeatInterval = setInterval(() => {\n enqueue(': heartbeat\\n\\n');\n }, HEARTBEAT_INTERVAL_MS);\n\n // Cleanup on client disconnect\n const cleanup = () => {\n stopped = true;\n if (watcher) {\n watcher.close();\n watcher = null;\n }\n if (pollInterval) {\n clearInterval(pollInterval);\n pollInterval = null;\n }\n clearInterval(heartbeatInterval);\n try {\n controller.close();\n } catch {\n // Stream may already be closed\n }\n };\n\n request.signal.addEventListener('abort', cleanup, { once: true });\n },\n });\n\n return new Response(stream, {\n headers: {\n 'Content-Type': 'text/event-stream',\n 'Cache-Control': 'no-cache',\n Connection: 'keep-alive',\n },\n });\n } catch (error) {\n // eslint-disable-next-line no-console\n console.error('[SSE route] GET /api/feature-logs error:', error);\n return new Response(JSON.stringify({ error: String(error) }), {\n status: 500,\n headers: { 'Content-Type': 'application/json' },\n });\n }\n}\n","import { AppRouteRouteModule } from \"next/dist/esm/server/route-modules/app-route/module.compiled\";\nimport { RouteKind } from \"next/dist/esm/server/route-kind\";\nimport { patchFetch as _patchFetch } from \"next/dist/esm/server/lib/patch-fetch\";\nimport { addRequestMeta, getRequestMeta } from \"next/dist/esm/server/request-meta\";\nimport { getTracer, SpanKind } from \"next/dist/esm/server/lib/trace/tracer\";\nimport { setManifestsSingleton } from \"next/dist/esm/server/app-render/manifests-singleton\";\nimport { normalizeAppPath } from \"next/dist/esm/shared/lib/router/utils/app-paths\";\nimport { NodeNextRequest, NodeNextResponse } from \"next/dist/esm/server/base-http/node\";\nimport { NextRequestAdapter, signalFromNodeResponse } from \"next/dist/esm/server/web/spec-extension/adapters/next-request\";\nimport { BaseServerSpan } from \"next/dist/esm/server/lib/trace/constants\";\nimport { getRevalidateReason } from \"next/dist/esm/server/instrumentation/utils\";\nimport { sendResponse } from \"next/dist/esm/server/send-response\";\nimport { fromNodeOutgoingHttpHeaders, toNodeOutgoingHttpHeaders } from \"next/dist/esm/server/web/utils\";\nimport { getCacheControlHeader } from \"next/dist/esm/server/lib/cache-control\";\nimport { INFINITE_CACHE, NEXT_CACHE_TAGS_HEADER } from \"next/dist/esm/lib/constants\";\nimport { NoFallbackError } from \"next/dist/esm/shared/lib/no-fallback-error.external\";\nimport { CachedRouteKind } from \"next/dist/esm/server/response-cache\";\nimport * as userland from \"INNER_APP_ROUTE\";\n// We inject the nextConfigOutput here so that we can use them in the route\n// module.\nconst nextConfigOutput = \"standalone\"\nconst routeModule = new AppRouteRouteModule({\n definition: {\n kind: RouteKind.APP_ROUTE,\n page: \"/api/feature-logs/route\",\n pathname: \"/api/feature-logs\",\n filename: \"route\",\n bundlePath: \"\"\n },\n distDir: process.env.__NEXT_RELATIVE_DIST_DIR || '',\n relativeProjectDir: process.env.__NEXT_RELATIVE_PROJECT_DIR || '',\n resolvedPagePath: \"[project]/src/presentation/web/app/api/feature-logs/route.ts\",\n nextConfigOutput,\n userland\n});\n// Pull out the exports that we need to expose from the module. This should\n// be eliminated when we've moved the other routes to the new format. These\n// are used to hook into the route.\nconst { workAsyncStorage, workUnitAsyncStorage, serverHooks } = routeModule;\nfunction patchFetch() {\n return _patchFetch({\n workAsyncStorage,\n workUnitAsyncStorage\n });\n}\nexport { routeModule, workAsyncStorage, workUnitAsyncStorage, serverHooks, patchFetch, };\nexport async function handler(req, res, ctx) {\n if (routeModule.isDev) {\n addRequestMeta(req, 'devRequestTimingInternalsEnd', process.hrtime.bigint());\n }\n let srcPage = \"/api/feature-logs/route\";\n // turbopack doesn't normalize `/index` in the page name\n // so we need to to process dynamic routes properly\n // TODO: fix turbopack providing differing value from webpack\n if (process.env.TURBOPACK) {\n srcPage = srcPage.replace(/\\/index$/, '') || '/';\n } else if (srcPage === '/index') {\n // we always normalize /index specifically\n srcPage = '/';\n }\n const multiZoneDraftMode = process.env.__NEXT_MULTI_ZONE_DRAFT_MODE;\n const prepareResult = await routeModule.prepare(req, res, {\n srcPage,\n multiZoneDraftMode\n });\n if (!prepareResult) {\n res.statusCode = 400;\n res.end('Bad Request');\n ctx.waitUntil == null ? void 0 : ctx.waitUntil.call(ctx, Promise.resolve());\n return null;\n }\n const { buildId, params, nextConfig, parsedUrl, isDraftMode, prerenderManifest, routerServerContext, isOnDemandRevalidate, revalidateOnlyGenerated, resolvedPathname, clientReferenceManifest, serverActionsManifest } = prepareResult;\n const normalizedSrcPage = normalizeAppPath(srcPage);\n let isIsr = Boolean(prerenderManifest.dynamicRoutes[normalizedSrcPage] || prerenderManifest.routes[resolvedPathname]);\n const render404 = async ()=>{\n // TODO: should route-module itself handle rendering the 404\n if (routerServerContext == null ? void 0 : routerServerContext.render404) {\n await routerServerContext.render404(req, res, parsedUrl, false);\n } else {\n res.end('This page could not be found');\n }\n return null;\n };\n if (isIsr && !isDraftMode) {\n const isPrerendered = Boolean(prerenderManifest.routes[resolvedPathname]);\n const prerenderInfo = prerenderManifest.dynamicRoutes[normalizedSrcPage];\n if (prerenderInfo) {\n if (prerenderInfo.fallback === false && !isPrerendered) {\n if (nextConfig.experimental.adapterPath) {\n return await render404();\n }\n throw new NoFallbackError();\n }\n }\n }\n let cacheKey = null;\n if (isIsr && !routeModule.isDev && !isDraftMode) {\n cacheKey = resolvedPathname;\n // ensure /index and / is normalized to one key\n cacheKey = cacheKey === '/index' ? '/' : cacheKey;\n }\n const supportsDynamicResponse = // If we're in development, we always support dynamic HTML\n routeModule.isDev === true || // If this is not SSG or does not have static paths, then it supports\n // dynamic HTML.\n !isIsr;\n // This is a revalidation request if the request is for a static\n // page and it is not being resumed from a postponed render and\n // it is not a dynamic RSC request then it is a revalidation\n // request.\n const isStaticGeneration = isIsr && !supportsDynamicResponse;\n // Before rendering (which initializes component tree modules), we have to\n // set the reference manifests to our global store so Server Action's\n // encryption util can access to them at the top level of the page module.\n if (serverActionsManifest && clientReferenceManifest) {\n setManifestsSingleton({\n page: srcPage,\n clientReferenceManifest,\n serverActionsManifest\n });\n }\n const method = req.method || 'GET';\n const tracer = getTracer();\n const activeSpan = tracer.getActiveScopeSpan();\n const context = {\n params,\n prerenderManifest,\n renderOpts: {\n experimental: {\n authInterrupts: Boolean(nextConfig.experimental.authInterrupts)\n },\n cacheComponents: Boolean(nextConfig.cacheComponents),\n supportsDynamicResponse,\n incrementalCache: getRequestMeta(req, 'incrementalCache'),\n cacheLifeProfiles: nextConfig.cacheLife,\n waitUntil: ctx.waitUntil,\n onClose: (cb)=>{\n res.on('close', cb);\n },\n onAfterTaskError: undefined,\n onInstrumentationRequestError: (error, _request, errorContext, silenceLog)=>routeModule.onRequestError(req, error, errorContext, silenceLog, routerServerContext)\n },\n sharedContext: {\n buildId\n }\n };\n const nodeNextReq = new NodeNextRequest(req);\n const nodeNextRes = new NodeNextResponse(res);\n const nextReq = NextRequestAdapter.fromNodeNextRequest(nodeNextReq, signalFromNodeResponse(res));\n try {\n const invokeRouteModule = async (span)=>{\n return routeModule.handle(nextReq, context).finally(()=>{\n if (!span) return;\n span.setAttributes({\n 'http.status_code': res.statusCode,\n 'next.rsc': false\n });\n const rootSpanAttributes = tracer.getRootSpanAttributes();\n // We were unable to get attributes, probably OTEL is not enabled\n if (!rootSpanAttributes) {\n return;\n }\n if (rootSpanAttributes.get('next.span_type') !== BaseServerSpan.handleRequest) {\n console.warn(`Unexpected root span type '${rootSpanAttributes.get('next.span_type')}'. Please report this Next.js issue https://github.com/vercel/next.js`);\n return;\n }\n const route = rootSpanAttributes.get('next.route');\n if (route) {\n const name = `${method} ${route}`;\n span.setAttributes({\n 'next.route': route,\n 'http.route': route,\n 'next.span_name': name\n });\n span.updateName(name);\n } else {\n span.updateName(`${method} ${srcPage}`);\n }\n });\n };\n const isMinimalMode = Boolean(process.env.MINIMAL_MODE || getRequestMeta(req, 'minimalMode'));\n const handleResponse = async (currentSpan)=>{\n var _cacheEntry_value;\n const responseGenerator = async ({ previousCacheEntry })=>{\n try {\n if (!isMinimalMode && isOnDemandRevalidate && revalidateOnlyGenerated && !previousCacheEntry) {\n res.statusCode = 404;\n // on-demand revalidate always sets this header\n res.setHeader('x-nextjs-cache', 'REVALIDATED');\n res.end('This page could not be found');\n return null;\n }\n const response = await invokeRouteModule(currentSpan);\n req.fetchMetrics = context.renderOpts.fetchMetrics;\n let pendingWaitUntil = context.renderOpts.pendingWaitUntil;\n // Attempt using provided waitUntil if available\n // if it's not we fallback to sendResponse's handling\n if (pendingWaitUntil) {\n if (ctx.waitUntil) {\n ctx.waitUntil(pendingWaitUntil);\n pendingWaitUntil = undefined;\n }\n }\n const cacheTags = context.renderOpts.collectedTags;\n // If the request is for a static response, we can cache it so long\n // as it's not edge.\n if (isIsr) {\n const blob = await response.blob();\n // Copy the headers from the response.\n const headers = toNodeOutgoingHttpHeaders(response.headers);\n if (cacheTags) {\n headers[NEXT_CACHE_TAGS_HEADER] = cacheTags;\n }\n if (!headers['content-type'] && blob.type) {\n headers['content-type'] = blob.type;\n }\n const revalidate = typeof context.renderOpts.collectedRevalidate === 'undefined' || context.renderOpts.collectedRevalidate >= INFINITE_CACHE ? false : context.renderOpts.collectedRevalidate;\n const expire = typeof context.renderOpts.collectedExpire === 'undefined' || context.renderOpts.collectedExpire >= INFINITE_CACHE ? undefined : context.renderOpts.collectedExpire;\n // Create the cache entry for the response.\n const cacheEntry = {\n value: {\n kind: CachedRouteKind.APP_ROUTE,\n status: response.status,\n body: Buffer.from(await blob.arrayBuffer()),\n headers\n },\n cacheControl: {\n revalidate,\n expire\n }\n };\n return cacheEntry;\n } else {\n // send response without caching if not ISR\n await sendResponse(nodeNextReq, nodeNextRes, response, context.renderOpts.pendingWaitUntil);\n return null;\n }\n } catch (err) {\n // if this is a background revalidate we need to report\n // the request error here as it won't be bubbled\n if (previousCacheEntry == null ? void 0 : previousCacheEntry.isStale) {\n const silenceLog = false;\n await routeModule.onRequestError(req, err, {\n routerKind: 'App Router',\n routePath: srcPage,\n routeType: 'route',\n revalidateReason: getRevalidateReason({\n isStaticGeneration,\n isOnDemandRevalidate\n })\n }, silenceLog, routerServerContext);\n }\n throw err;\n }\n };\n const cacheEntry = await routeModule.handleResponse({\n req,\n nextConfig,\n cacheKey,\n routeKind: RouteKind.APP_ROUTE,\n isFallback: false,\n prerenderManifest,\n isRoutePPREnabled: false,\n isOnDemandRevalidate,\n revalidateOnlyGenerated,\n responseGenerator,\n waitUntil: ctx.waitUntil,\n isMinimalMode\n });\n // we don't create a cacheEntry for ISR\n if (!isIsr) {\n return null;\n }\n if ((cacheEntry == null ? void 0 : (_cacheEntry_value = cacheEntry.value) == null ? void 0 : _cacheEntry_value.kind) !== CachedRouteKind.APP_ROUTE) {\n var _cacheEntry_value1;\n throw Object.defineProperty(new Error(`Invariant: app-route received invalid cache entry ${cacheEntry == null ? void 0 : (_cacheEntry_value1 = cacheEntry.value) == null ? void 0 : _cacheEntry_value1.kind}`), \"__NEXT_ERROR_CODE\", {\n value: \"E701\",\n enumerable: false,\n configurable: true\n });\n }\n if (!isMinimalMode) {\n res.setHeader('x-nextjs-cache', isOnDemandRevalidate ? 'REVALIDATED' : cacheEntry.isMiss ? 'MISS' : cacheEntry.isStale ? 'STALE' : 'HIT');\n }\n // Draft mode should never be cached\n if (isDraftMode) {\n res.setHeader('Cache-Control', 'private, no-cache, no-store, max-age=0, must-revalidate');\n }\n const headers = fromNodeOutgoingHttpHeaders(cacheEntry.value.headers);\n if (!(isMinimalMode && isIsr)) {\n headers.delete(NEXT_CACHE_TAGS_HEADER);\n }\n // If cache control is already set on the response we don't\n // override it to allow users to customize it via next.config\n if (cacheEntry.cacheControl && !res.getHeader('Cache-Control') && !headers.get('Cache-Control')) {\n headers.set('Cache-Control', getCacheControlHeader(cacheEntry.cacheControl));\n }\n await sendResponse(nodeNextReq, nodeNextRes, // @ts-expect-error - Argument of type 'Buffer<ArrayBufferLike>' is not assignable to parameter of type 'BodyInit | null | undefined'.\n new Response(cacheEntry.value.body, {\n headers,\n status: cacheEntry.value.status || 200\n }));\n return null;\n };\n // TODO: activeSpan code path is for when wrapped by\n // next-server can be removed when this is no longer used\n if (activeSpan) {\n await handleResponse(activeSpan);\n } else {\n await tracer.withPropagatedContext(req.headers, ()=>tracer.trace(BaseServerSpan.handleRequest, {\n spanName: `${method} ${srcPage}`,\n kind: SpanKind.SERVER,\n attributes: {\n 'http.method': method,\n 'http.target': req.url\n }\n }, handleResponse));\n }\n } catch (err) {\n if (!(err instanceof NoFallbackError)) {\n const silenceLog = false;\n await routeModule.onRequestError(req, err, {\n routerKind: 'App Router',\n routePath: normalizedSrcPage,\n routeType: 'route',\n revalidateReason: getRevalidateReason({\n isStaticGeneration,\n isOnDemandRevalidate\n })\n }, silenceLog, routerServerContext);\n }\n // rethrow so that we can handle serving error page\n // If this is during static generation, throw the error again.\n if (isIsr) throw err;\n // Otherwise, send a 500 response.\n await sendResponse(nodeNextReq, nodeNextRes, new Response(null, {\n status: 500\n }));\n return null;\n }\n}\n\n//# sourceMappingURL=app-route.js.map\n"],"names":[],"mappings":"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","ignoreList":[2]}
@@ -1,3 +1,3 @@
1
- module.exports=[93995,a=>{"use strict";var b=a.i(10973),c=a.i(96960),d=a.i(69845),e=a.i(52313),f=a.i(25674);let g=(0,f.createServerReference)("402f6c096143ec812a4a9ff701106198cf8b5d02df",f.callServer,void 0,f.findSourceMapURL,"createFeature");var h=a.i(87148),h=h,i=a.i(25700);let j=(0,i.default)("file",[["path",{d:"M6 22a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2z",key:"1oefj6"}],["path",{d:"M14 2v5a1 1 0 0 0 1 1h5",key:"wfsgrz"}]]);var k=a.i(42642),k=k;let l=(0,i.default)("image",[["rect",{width:"18",height:"18",x:"3",y:"3",rx:"2",ry:"2",key:"1m3agn"}],["circle",{cx:"9",cy:"9",r:"2",key:"af1f0g"}],["path",{d:"m21 15-3.086-3.086a2 2 0 0 0-2.828 0L6 21",key:"1xmnt7"}]]);var m=a.i(40617),m=m,n=a.i(26915),n=n;let o=(0,i.default)("chevrons-up-down",[["path",{d:"m7 15 5 5 5-5",key:"1hf1tw"}],["path",{d:"m7 9 5-5 5 5",key:"sgt6xg"}]]);var p=a.i(51969),p=p,q=a.i(85536),r=a.i(19884);a.i(78454);var s=a.i(24255),t=a.i(2824),u=a.i(18948),v=a.i(90920);function w({className:a,...c}){return(0,b.jsx)("textarea",{"data-slot":"textarea",className:(0,q.cn)("placeholder:text-muted-foreground selection:bg-primary selection:text-primary-foreground dark:bg-input/30 border-input field-sizing-content min-h-[80px] w-full rounded-md border bg-transparent px-3 py-2 text-base shadow-xs transition-[color,box-shadow] outline-none disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50 md:text-sm","focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px]","aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive",a),...c})}var x=a.i(58860),y=a.i(58339),z=a.i(80646),A=a.i(96867),B=a.i(82934),C=a.i(96213),D=a.i(61781);async function E(){let a=await fetch("/api/dialog/pick-files",{method:"POST"});if(!a.ok)throw Error("Failed to open file dialog");let b=await a.json();return b.cancelled?null:b.files}let F=[{id:"allowPrd",label:"PRD",description:"Auto-approve requirements move to planning."},{id:"allowPlan",label:"Plan",description:"Auto-approve planning move to implementation."},{id:"allowMerge",label:"Merge",description:"Auto-approve merge move to Done."}],G={allowPrd:!1,allowPlan:!1,allowMerge:!1};function H({open:a,onClose:d,onSubmit:e,repositoryPath:f,isSubmitting:g=!1,workflowDefaults:i,features:j,initialParentId:k,currentAgentType:l,currentModel:m}){let n=(0,r.useSoundAction)("create"),o=i?.approvalGates??G,p=i?.push??!1,v=i?.openPr??!1,[z,H]=(0,c.useState)(""),[K,L]=(0,c.useState)([]),[M,N]=(0,c.useState)({...o}),[O,P]=(0,c.useState)(p),[Q,R]=(0,c.useState)(v),[S,T]=(0,c.useState)(void 0),[U,V]=(0,c.useState)(!1),[W,X]=(0,c.useState)(void 0),[Y,Z]=(0,c.useState)(void 0);(0,c.useEffect)(()=>{i&&(N({...i.approvalGates}),P(i.push),R(i.openPr))},[i]),(0,c.useEffect)(()=>{a&&k&&T(k)},[a,k]);let $=(0,c.useCallback)(()=>{H(""),L([]),N({...o}),P(p),R(v),T(void 0),V(!1),X(void 0),Z(void 0)},[o,p,v]),_=""!==z.trim()||K.length>0,{attemptClose:aa}=(0,C.useGuardedDrawerClose)({open:a,isDirty:_,onClose:d,onReset:$}),ab=(0,c.useCallback)(a=>{a.preventDefault(),z.trim()&&(n.play(),e({description:z.trim(),attachments:K,repositoryPath:f,approvalGates:{allowPrd:M.allowPrd??!1,allowPlan:M.allowPlan??!1,allowMerge:M.allowMerge??!1},push:O||Q,openPr:Q,fast:U,...W?{agentType:W}:{},...Y?{model:Y}:{},...S?{parentId:S}:{}}),$())},[z,K,M,f,e,O,Q,U,W,Y,S,n,$]),ac=(0,c.useCallback)(async()=>{try{let a=await E();a&&L(b=>[...b,...a])}catch{}},[]),ad=(0,c.useCallback)(a=>{L(b=>b.filter(b=>b.path!==a))},[]),ae=j&&j.length>0;return(0,b.jsx)(s.BaseDrawer,{open:a,onClose:aa,size:"md",modal:!1,dismissOnOutsideClick:!0,"data-testid":"feature-create-drawer",header:(0,b.jsxs)(b.Fragment,{children:[(0,b.jsxs)("div",{className:"flex items-center gap-2",children:[(0,b.jsx)("div",{className:"h-2.5 w-2.5 shrink-0 rounded-full bg-blue-500"}),(0,b.jsx)(t.DrawerTitle,{children:"NEW FEATURE"})]}),g?(0,b.jsx)(t.DrawerDescription,{asChild:!0,children:(0,b.jsx)("div",{children:(0,b.jsx)(y.Badge,{variant:"secondary",children:"Creating..."})})}):null]}),footer:(0,b.jsxs)("div",{className:"flex flex-row justify-end gap-2",children:[(0,b.jsx)(u.Button,{variant:"outline",onClick:aa,disabled:g,children:"Cancel"}),(0,b.jsx)(u.Button,{type:"submit",form:"create-feature-form",disabled:!z.trim()||g,children:g?"Creating...":"+ Create Feature"})]}),children:(0,b.jsx)("div",{className:"overflow-y-auto p-4",children:(0,b.jsx)(B.TooltipProvider,{delayDuration:400,children:(0,b.jsxs)("form",{id:"create-feature-form",onSubmit:ab,className:"flex flex-col gap-4",children:[(0,b.jsxs)("div",{className:"flex flex-col gap-1.5",children:[(0,b.jsx)(x.Label,{htmlFor:"feature-description",className:"text-muted-foreground text-xs font-semibold tracking-wider",children:"DESCRIBE YOUR FEATURE"}),(0,b.jsxs)("div",{className:"border-input focus-within:ring-ring/50 focus-within:border-ring overflow-hidden rounded-md border shadow-xs transition-[color,box-shadow] focus-within:ring-[3px]",children:[(0,b.jsx)(w,{id:"feature-description",placeholder:"e.g. Add GitHub OAuth login with callback handling and token refresh...",value:z,onChange:a=>H(a.target.value),rows:7,required:!0,disabled:g,className:"field-sizing-fixed min-h-42! resize-none rounded-none border-0 shadow-none focus-visible:ring-0"}),(0,b.jsxs)("div",{className:"border-input flex items-center gap-3 border-t px-3 py-1.5",children:[(0,b.jsx)(D.AgentModelPicker,{initialAgentType:W??l??"claude-code",initialModel:Y??m??"claude-sonnet-4-6",mode:"override",onAgentModelChange:(a,b)=>{X(a),Z(b)},disabled:g,className:"w-55"}),(0,b.jsxs)(B.Tooltip,{children:[(0,b.jsx)(B.TooltipTrigger,{asChild:!0,children:(0,b.jsxs)("div",{className:"ml-auto flex cursor-pointer items-center gap-2",children:[(0,b.jsx)(A.Switch,{id:"fast-mode",checked:U,onCheckedChange:V,disabled:g}),(0,b.jsx)(x.Label,{htmlFor:"fast-mode",className:"cursor-pointer text-sm font-medium",children:"Fast Mode"})]})}),(0,b.jsx)(B.TooltipContent,{side:"bottom",children:"Skip SDLC phases and implement directly from your prompt."})]})]})]})]}),ae&&void 0!==k?(0,b.jsxs)("div",{className:"flex flex-col gap-1.5",children:[(0,b.jsx)(x.Label,{htmlFor:"parent-feature",className:"text-muted-foreground text-xs font-semibold tracking-wider",children:"PARENT FEATURE"}),(0,b.jsx)(I,{features:j,value:S,onChange:T,disabled:g})]}):null,(0,b.jsxs)("div",{className:"flex flex-col gap-2",children:[(0,b.jsxs)("div",{className:"border-input flex items-center gap-4 rounded-md border px-3 py-2.5",children:[(0,b.jsxs)(B.Tooltip,{children:[(0,b.jsx)(B.TooltipTrigger,{asChild:!0,children:(0,b.jsx)("span",{className:"text-muted-foreground w-16 shrink-0 cursor-default text-xs font-semibold tracking-wider",children:"APPROVE"})}),(0,b.jsx)(B.TooltipContent,{side:"bottom",children:"Auto-approve phase transitions without manual review."})]}),(0,b.jsx)("div",{className:"flex flex-1 items-center gap-4",children:F.map(a=>(0,b.jsxs)(B.Tooltip,{children:[(0,b.jsx)(B.TooltipTrigger,{asChild:!0,children:(0,b.jsxs)("div",{className:"flex cursor-pointer items-center gap-1.5",children:[(0,b.jsx)(A.Switch,{id:`approve-${a.id}`,size:"sm",checked:M[a.id]??!1,onCheckedChange:b=>N(c=>({...c,[a.id]:b})),disabled:g||U&&("allowPrd"===a.id||"allowPlan"===a.id)}),(0,b.jsx)(x.Label,{htmlFor:`approve-${a.id}`,className:"cursor-pointer text-xs font-medium",children:a.label})]})}),(0,b.jsx)(B.TooltipContent,{side:"bottom",children:U&&("allowPrd"===a.id||"allowPlan"===a.id)?"Skipped in Fast Mode":a.description})]},a.id))}),(0,b.jsxs)(B.Tooltip,{children:[(0,b.jsx)(B.TooltipTrigger,{asChild:!0,children:(0,b.jsx)("button",{type:"button",onClick:()=>{let a=F.every(a=>M[a.id]),b={};for(let c of F)b[c.id]=!a;N(b)},disabled:g,className:(0,q.cn)("text-muted-foreground hover:text-foreground cursor-pointer rounded px-1.5 py-0.5 text-[10px] font-semibold tracking-wider uppercase transition-colors",F.every(a=>M[a.id])&&"text-primary"),children:"All"})}),(0,b.jsx)(B.TooltipContent,{side:"bottom",children:"Toggle all approval gates"})]})]}),(0,b.jsxs)("div",{className:"border-input flex items-center gap-4 rounded-md border px-3 py-2.5",children:[(0,b.jsx)("span",{className:"text-muted-foreground w-16 shrink-0 text-xs font-semibold tracking-wider",children:"GIT"}),(0,b.jsxs)("div",{className:"flex flex-1 items-center gap-4",children:[(0,b.jsxs)(B.Tooltip,{children:[(0,b.jsx)(B.TooltipTrigger,{asChild:!0,children:(0,b.jsxs)("div",{className:"flex cursor-pointer items-center gap-1.5",children:[(0,b.jsx)(A.Switch,{id:"push",size:"sm",checked:O||Q,onCheckedChange:a=>{P(a),!a&&Q&&R(!1)},disabled:g}),(0,b.jsx)(x.Label,{htmlFor:"push",className:"cursor-pointer text-xs font-medium",children:"Push"})]})}),(0,b.jsx)(B.TooltipContent,{side:"bottom",children:"Push branch to remote after implementation."})]}),(0,b.jsxs)(B.Tooltip,{children:[(0,b.jsx)(B.TooltipTrigger,{asChild:!0,children:(0,b.jsxs)("div",{className:"flex cursor-pointer items-center gap-1.5",children:[(0,b.jsx)(A.Switch,{id:"open-pr",size:"sm",checked:Q,onCheckedChange:R,disabled:g}),(0,b.jsx)(x.Label,{htmlFor:"open-pr",className:"cursor-pointer text-xs font-medium",children:"PR"})]})}),(0,b.jsx)(B.TooltipContent,{side:"bottom",children:"Open a pull request after pushing."})]})]})]})]}),(0,b.jsxs)("div",{className:"flex flex-col gap-2",children:[(0,b.jsxs)("div",{className:"flex items-center justify-between",children:[(0,b.jsxs)(x.Label,{className:"text-muted-foreground text-xs font-semibold tracking-wider",children:["ATTACHMENTS",K.length>0&&(0,b.jsxs)("span",{className:"text-muted-foreground/60 ml-1.5",children:["(",K.length,")"]})]}),(0,b.jsxs)(u.Button,{type:"button",variant:"outline",size:"xs",onClick:ac,disabled:g,children:[(0,b.jsx)(h.default,{className:"size-3"}),"Add Files"]})]}),K.length>0&&(0,b.jsx)("div",{className:"flex flex-col gap-2",children:K.map(a=>(0,b.jsx)(J,{file:a,onRemove:()=>ad(a.path),disabled:g},a.path))})]})]})})})})}function I({features:a,value:d,onChange:e,disabled:f}){let[g,h]=(0,c.useState)(!1),[i,j]=(0,c.useState)(""),k=(0,c.useRef)(null),l=a.find(a=>a.id===d),m=i.trim()?a.filter(a=>a.name.toLowerCase().includes(i.toLowerCase())||a.id.toLowerCase().includes(i.toLowerCase())):a,n=(0,c.useCallback)(a=>{e(a),h(!1),j("")},[e]);return(0,c.useEffect)(()=>{g?setTimeout(()=>k.current?.focus(),0):j("")},[g]),(0,b.jsxs)(z.Popover,{open:g,onOpenChange:h,children:[(0,b.jsx)(z.PopoverTrigger,{asChild:!0,children:(0,b.jsxs)("button",{id:"parent-feature",type:"button",role:"combobox","aria-expanded":g,"aria-label":"Parent Feature",disabled:f,"data-testid":"parent-feature-combobox",className:(0,q.cn)("border-input bg-background ring-offset-background focus:ring-ring flex h-9 w-full items-center justify-between rounded-md border px-3 py-2 text-sm focus:ring-2 focus:ring-offset-2 focus:outline-none disabled:cursor-not-allowed disabled:opacity-50",!l&&"text-muted-foreground"),children:[(0,b.jsx)("span",{className:"truncate",children:l?`${l.name} (${l.id.slice(0,8)})`:"Select parent feature..."}),(0,b.jsx)(o,{className:"ml-2 h-4 w-4 shrink-0 opacity-50"})]})}),(0,b.jsx)(z.PopoverContent,{className:"w-80 p-0",align:"start","data-testid":"parent-feature-combobox-content",children:(0,b.jsxs)("div",{className:"flex flex-col",children:[(0,b.jsx)("div",{className:"border-b p-2",children:(0,b.jsx)(v.Input,{ref:k,placeholder:"Search features...",value:i,onChange:a=>j(a.target.value),className:"h-8 border-0 p-0 text-sm shadow-none focus-visible:ring-0","data-testid":"parent-feature-search"})}),(0,b.jsxs)("div",{className:"max-h-48 overflow-y-auto py-1",role:"listbox","aria-label":"Features",children:[(0,b.jsxs)("button",{type:"button",role:"option","aria-selected":void 0===d,onClick:()=>n(void 0),className:(0,q.cn)("hover:bg-accent hover:text-accent-foreground flex w-full items-center gap-2 px-3 py-2 text-sm",void 0===d&&"bg-accent/50"),"data-testid":"parent-feature-option-none",children:[(0,b.jsx)(p.default,{className:(0,q.cn)("h-4 w-4 shrink-0",void 0!==d&&"invisible")}),(0,b.jsx)("span",{className:"text-muted-foreground italic",children:"No parent"})]}),0===m.length&&i?(0,b.jsx)("p",{className:"text-muted-foreground px-3 py-2 text-sm",children:"No features found."}):m.map(a=>(0,b.jsxs)("button",{type:"button",role:"option","aria-selected":d===a.id,onClick:()=>n(a.id),className:(0,q.cn)("hover:bg-accent hover:text-accent-foreground flex w-full items-center gap-2 px-3 py-2 text-sm",d===a.id&&"bg-accent/50"),"data-testid":`parent-feature-option-${a.id}`,children:[(0,b.jsx)(p.default,{className:(0,q.cn)("h-4 w-4 shrink-0",d!==a.id&&"invisible")}),(0,b.jsxs)("span",{className:"truncate",children:[a.name," ",(0,b.jsxs)("span",{className:"text-muted-foreground font-mono text-xs",children:["(",a.id.slice(0,8),")"]})]})]},a.id))]})]})})]})}function J({file:a,onRemove:c,disabled:d}){var e,f,g;let h,i=(h=(e=a.name).lastIndexOf("."))>=0?e.slice(h).toLowerCase():"",o=(f=i,K.has(f)?l:".pdf"===f?k.default:L.has(f)?m.default:j),p=".pdf"===(g=i)?"bg-red-50 text-red-600":K.has(g)?"bg-blue-50 text-blue-600":L.has(g)?"bg-emerald-50 text-emerald-600":"bg-gray-50 text-gray-600";return(0,b.jsxs)("div",{className:"flex items-center gap-3 rounded-md border p-2",children:[(0,b.jsx)("div",{className:(0,q.cn)("flex h-8 w-8 shrink-0 items-center justify-center rounded",p),children:(0,b.jsx)(o,{className:"h-4 w-4"})}),(0,b.jsxs)("div",{className:"flex min-w-0 flex-1 flex-col",children:[(0,b.jsx)("span",{className:"truncate text-sm font-medium",children:a.name}),(0,b.jsx)("span",{className:"text-muted-foreground truncate text-xs",children:a.path}),(0,b.jsx)("span",{className:"text-muted-foreground text-xs",children:function(a){if(0===a)return"0 B";let b=Math.floor(Math.log(a)/Math.log(1024));return`${(a/Math.pow(1024,b)).toFixed(+(0!==b))} ${["B","KB","MB","GB"][b]}`}(a.size)})]}),(0,b.jsx)(u.Button,{type:"button",variant:"ghost",size:"icon-xs",onClick:c,disabled:d,"aria-label":`Remove ${a.name}`,children:(0,b.jsx)(n.default,{className:"h-3 w-3"})})]})}let K=new Set([".png",".jpg",".jpeg",".gif",".svg",".webp",".ico",".bmp"]),L=new Set([".ts",".tsx",".js",".jsx",".json",".yaml",".yml",".xml",".html",".css",".md"]);function M({repositoryPath:a,initialParentId:f,features:h,workflowDefaults:i,currentAgentType:j,currentModel:k}){let l=(0,d.useRouter)(),[m,n]=(0,c.useState)(!1),o=(0,d.usePathname)().startsWith("/create"),p=!m&&o;(0,c.useEffect)(()=>{!o&&m&&n(!1)},[o,m]);let q=(0,c.useCallback)(()=>{l.push("/")},[l]),r=(0,c.useCallback)(a=>{n(!0),l.push("/"),g(a).then(b=>{b.error?e.toast.error(b.error):window.dispatchEvent(new CustomEvent("shep:feature-created",{detail:{featureId:b.feature.id,name:b.feature.name,description:b.feature.description,repositoryPath:b.feature.repositoryPath,parentId:a.parentId}}))}).catch(()=>{e.toast.error("Failed to create feature"),n(!1)})},[l]);return(0,b.jsx)(H,{open:p,onClose:q,onSubmit:r,repositoryPath:a,features:h,workflowDefaults:i,initialParentId:f,isSubmitting:m,currentAgentType:j,currentModel:k})}a.s(["CreateDrawerClient",()=>M],93995)}];
1
+ module.exports=[93995,a=>{"use strict";var b=a.i(10973),c=a.i(96960),d=a.i(69845),e=a.i(52313),f=a.i(25674);let g=(0,f.createServerReference)("4029496866314880b1a802978e00fb0dfc7fc7deb9",f.callServer,void 0,f.findSourceMapURL,"createFeature");var h=a.i(87148),h=h,i=a.i(25700);let j=(0,i.default)("file",[["path",{d:"M6 22a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2z",key:"1oefj6"}],["path",{d:"M14 2v5a1 1 0 0 0 1 1h5",key:"wfsgrz"}]]);var k=a.i(42642),k=k;let l=(0,i.default)("image",[["rect",{width:"18",height:"18",x:"3",y:"3",rx:"2",ry:"2",key:"1m3agn"}],["circle",{cx:"9",cy:"9",r:"2",key:"af1f0g"}],["path",{d:"m21 15-3.086-3.086a2 2 0 0 0-2.828 0L6 21",key:"1xmnt7"}]]);var m=a.i(40617),m=m,n=a.i(26915),n=n;let o=(0,i.default)("chevrons-up-down",[["path",{d:"m7 15 5 5 5-5",key:"1hf1tw"}],["path",{d:"m7 9 5-5 5 5",key:"sgt6xg"}]]);var p=a.i(51969),p=p,q=a.i(85536),r=a.i(19884);a.i(78454);var s=a.i(24255),t=a.i(2824),u=a.i(18948),v=a.i(90920);function w({className:a,...c}){return(0,b.jsx)("textarea",{"data-slot":"textarea",className:(0,q.cn)("placeholder:text-muted-foreground selection:bg-primary selection:text-primary-foreground dark:bg-input/30 border-input field-sizing-content min-h-[80px] w-full rounded-md border bg-transparent px-3 py-2 text-base shadow-xs transition-[color,box-shadow] outline-none disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50 md:text-sm","focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px]","aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive",a),...c})}var x=a.i(58860),y=a.i(58339),z=a.i(80646),A=a.i(96867),B=a.i(82934),C=a.i(96213),D=a.i(61781);async function E(){let a=await fetch("/api/dialog/pick-files",{method:"POST"});if(!a.ok)throw Error("Failed to open file dialog");let b=await a.json();return b.cancelled?null:b.files}let F=[{id:"allowPrd",label:"PRD",description:"Auto-approve requirements move to planning."},{id:"allowPlan",label:"Plan",description:"Auto-approve planning move to implementation."},{id:"allowMerge",label:"Merge",description:"Auto-approve merge move to Done."}],G={allowPrd:!1,allowPlan:!1,allowMerge:!1};function H({open:a,onClose:d,onSubmit:e,repositoryPath:f,isSubmitting:g=!1,workflowDefaults:i,features:j,initialParentId:k,currentAgentType:l,currentModel:m}){let n=(0,r.useSoundAction)("create"),o=i?.approvalGates??G,p=i?.push??!1,v=i?.openPr??!1,[z,H]=(0,c.useState)(""),[K,L]=(0,c.useState)([]),[M,N]=(0,c.useState)({...o}),[O,P]=(0,c.useState)(p),[Q,R]=(0,c.useState)(v),[S,T]=(0,c.useState)(void 0),[U,V]=(0,c.useState)(!1),[W,X]=(0,c.useState)(void 0),[Y,Z]=(0,c.useState)(void 0);(0,c.useEffect)(()=>{i&&(N({...i.approvalGates}),P(i.push),R(i.openPr))},[i]),(0,c.useEffect)(()=>{a&&k&&T(k)},[a,k]);let $=(0,c.useCallback)(()=>{H(""),L([]),N({...o}),P(p),R(v),T(void 0),V(!1),X(void 0),Z(void 0)},[o,p,v]),_=""!==z.trim()||K.length>0,{attemptClose:aa}=(0,C.useGuardedDrawerClose)({open:a,isDirty:_,onClose:d,onReset:$}),ab=(0,c.useCallback)(a=>{a.preventDefault(),z.trim()&&(n.play(),e({description:z.trim(),attachments:K,repositoryPath:f,approvalGates:{allowPrd:M.allowPrd??!1,allowPlan:M.allowPlan??!1,allowMerge:M.allowMerge??!1},push:O||Q,openPr:Q,fast:U,...W?{agentType:W}:{},...Y?{model:Y}:{},...S?{parentId:S}:{}}),$())},[z,K,M,f,e,O,Q,U,W,Y,S,n,$]),ac=(0,c.useCallback)(async()=>{try{let a=await E();a&&L(b=>[...b,...a])}catch{}},[]),ad=(0,c.useCallback)(a=>{L(b=>b.filter(b=>b.path!==a))},[]),ae=j&&j.length>0;return(0,b.jsx)(s.BaseDrawer,{open:a,onClose:aa,size:"md",modal:!1,dismissOnOutsideClick:!0,"data-testid":"feature-create-drawer",header:(0,b.jsxs)(b.Fragment,{children:[(0,b.jsxs)("div",{className:"flex items-center gap-2",children:[(0,b.jsx)("div",{className:"h-2.5 w-2.5 shrink-0 rounded-full bg-blue-500"}),(0,b.jsx)(t.DrawerTitle,{children:"NEW FEATURE"})]}),g?(0,b.jsx)(t.DrawerDescription,{asChild:!0,children:(0,b.jsx)("div",{children:(0,b.jsx)(y.Badge,{variant:"secondary",children:"Creating..."})})}):null]}),footer:(0,b.jsxs)("div",{className:"flex flex-row justify-end gap-2",children:[(0,b.jsx)(u.Button,{variant:"outline",onClick:aa,disabled:g,children:"Cancel"}),(0,b.jsx)(u.Button,{type:"submit",form:"create-feature-form",disabled:!z.trim()||g,children:g?"Creating...":"+ Create Feature"})]}),children:(0,b.jsx)("div",{className:"overflow-y-auto p-4",children:(0,b.jsx)(B.TooltipProvider,{delayDuration:400,children:(0,b.jsxs)("form",{id:"create-feature-form",onSubmit:ab,className:"flex flex-col gap-4",children:[(0,b.jsxs)("div",{className:"flex flex-col gap-1.5",children:[(0,b.jsx)(x.Label,{htmlFor:"feature-description",className:"text-muted-foreground text-xs font-semibold tracking-wider",children:"DESCRIBE YOUR FEATURE"}),(0,b.jsxs)("div",{className:"border-input focus-within:ring-ring/50 focus-within:border-ring overflow-hidden rounded-md border shadow-xs transition-[color,box-shadow] focus-within:ring-[3px]",children:[(0,b.jsx)(w,{id:"feature-description",placeholder:"e.g. Add GitHub OAuth login with callback handling and token refresh...",value:z,onChange:a=>H(a.target.value),rows:7,required:!0,disabled:g,className:"field-sizing-fixed min-h-42! resize-none rounded-none border-0 shadow-none focus-visible:ring-0"}),(0,b.jsxs)("div",{className:"border-input flex items-center gap-3 border-t px-3 py-1.5",children:[(0,b.jsx)(D.AgentModelPicker,{initialAgentType:W??l??"claude-code",initialModel:Y??m??"claude-sonnet-4-6",mode:"override",onAgentModelChange:(a,b)=>{X(a),Z(b)},disabled:g,className:"w-55"}),(0,b.jsxs)(B.Tooltip,{children:[(0,b.jsx)(B.TooltipTrigger,{asChild:!0,children:(0,b.jsxs)("div",{className:"ml-auto flex cursor-pointer items-center gap-2",children:[(0,b.jsx)(A.Switch,{id:"fast-mode",checked:U,onCheckedChange:V,disabled:g}),(0,b.jsx)(x.Label,{htmlFor:"fast-mode",className:"cursor-pointer text-sm font-medium",children:"Fast Mode"})]})}),(0,b.jsx)(B.TooltipContent,{side:"bottom",children:"Skip SDLC phases and implement directly from your prompt."})]})]})]})]}),ae&&void 0!==k?(0,b.jsxs)("div",{className:"flex flex-col gap-1.5",children:[(0,b.jsx)(x.Label,{htmlFor:"parent-feature",className:"text-muted-foreground text-xs font-semibold tracking-wider",children:"PARENT FEATURE"}),(0,b.jsx)(I,{features:j,value:S,onChange:T,disabled:g})]}):null,(0,b.jsxs)("div",{className:"flex flex-col gap-2",children:[(0,b.jsxs)("div",{className:"border-input flex items-center gap-4 rounded-md border px-3 py-2.5",children:[(0,b.jsxs)(B.Tooltip,{children:[(0,b.jsx)(B.TooltipTrigger,{asChild:!0,children:(0,b.jsx)("span",{className:"text-muted-foreground w-16 shrink-0 cursor-default text-xs font-semibold tracking-wider",children:"APPROVE"})}),(0,b.jsx)(B.TooltipContent,{side:"bottom",children:"Auto-approve phase transitions without manual review."})]}),(0,b.jsx)("div",{className:"flex flex-1 items-center gap-4",children:F.map(a=>(0,b.jsxs)(B.Tooltip,{children:[(0,b.jsx)(B.TooltipTrigger,{asChild:!0,children:(0,b.jsxs)("div",{className:"flex cursor-pointer items-center gap-1.5",children:[(0,b.jsx)(A.Switch,{id:`approve-${a.id}`,size:"sm",checked:M[a.id]??!1,onCheckedChange:b=>N(c=>({...c,[a.id]:b})),disabled:g||U&&("allowPrd"===a.id||"allowPlan"===a.id)}),(0,b.jsx)(x.Label,{htmlFor:`approve-${a.id}`,className:"cursor-pointer text-xs font-medium",children:a.label})]})}),(0,b.jsx)(B.TooltipContent,{side:"bottom",children:U&&("allowPrd"===a.id||"allowPlan"===a.id)?"Skipped in Fast Mode":a.description})]},a.id))}),(0,b.jsxs)(B.Tooltip,{children:[(0,b.jsx)(B.TooltipTrigger,{asChild:!0,children:(0,b.jsx)("button",{type:"button",onClick:()=>{let a=F.every(a=>M[a.id]),b={};for(let c of F)b[c.id]=!a;N(b)},disabled:g,className:(0,q.cn)("text-muted-foreground hover:text-foreground cursor-pointer rounded px-1.5 py-0.5 text-[10px] font-semibold tracking-wider uppercase transition-colors",F.every(a=>M[a.id])&&"text-primary"),children:"All"})}),(0,b.jsx)(B.TooltipContent,{side:"bottom",children:"Toggle all approval gates"})]})]}),(0,b.jsxs)("div",{className:"border-input flex items-center gap-4 rounded-md border px-3 py-2.5",children:[(0,b.jsx)("span",{className:"text-muted-foreground w-16 shrink-0 text-xs font-semibold tracking-wider",children:"GIT"}),(0,b.jsxs)("div",{className:"flex flex-1 items-center gap-4",children:[(0,b.jsxs)(B.Tooltip,{children:[(0,b.jsx)(B.TooltipTrigger,{asChild:!0,children:(0,b.jsxs)("div",{className:"flex cursor-pointer items-center gap-1.5",children:[(0,b.jsx)(A.Switch,{id:"push",size:"sm",checked:O||Q,onCheckedChange:a=>{P(a),!a&&Q&&R(!1)},disabled:g}),(0,b.jsx)(x.Label,{htmlFor:"push",className:"cursor-pointer text-xs font-medium",children:"Push"})]})}),(0,b.jsx)(B.TooltipContent,{side:"bottom",children:"Push branch to remote after implementation."})]}),(0,b.jsxs)(B.Tooltip,{children:[(0,b.jsx)(B.TooltipTrigger,{asChild:!0,children:(0,b.jsxs)("div",{className:"flex cursor-pointer items-center gap-1.5",children:[(0,b.jsx)(A.Switch,{id:"open-pr",size:"sm",checked:Q,onCheckedChange:R,disabled:g}),(0,b.jsx)(x.Label,{htmlFor:"open-pr",className:"cursor-pointer text-xs font-medium",children:"PR"})]})}),(0,b.jsx)(B.TooltipContent,{side:"bottom",children:"Open a pull request after pushing."})]})]})]})]}),(0,b.jsxs)("div",{className:"flex flex-col gap-2",children:[(0,b.jsxs)("div",{className:"flex items-center justify-between",children:[(0,b.jsxs)(x.Label,{className:"text-muted-foreground text-xs font-semibold tracking-wider",children:["ATTACHMENTS",K.length>0&&(0,b.jsxs)("span",{className:"text-muted-foreground/60 ml-1.5",children:["(",K.length,")"]})]}),(0,b.jsxs)(u.Button,{type:"button",variant:"outline",size:"xs",onClick:ac,disabled:g,children:[(0,b.jsx)(h.default,{className:"size-3"}),"Add Files"]})]}),K.length>0&&(0,b.jsx)("div",{className:"flex flex-col gap-2",children:K.map(a=>(0,b.jsx)(J,{file:a,onRemove:()=>ad(a.path),disabled:g},a.path))})]})]})})})})}function I({features:a,value:d,onChange:e,disabled:f}){let[g,h]=(0,c.useState)(!1),[i,j]=(0,c.useState)(""),k=(0,c.useRef)(null),l=a.find(a=>a.id===d),m=i.trim()?a.filter(a=>a.name.toLowerCase().includes(i.toLowerCase())||a.id.toLowerCase().includes(i.toLowerCase())):a,n=(0,c.useCallback)(a=>{e(a),h(!1),j("")},[e]);return(0,c.useEffect)(()=>{g?setTimeout(()=>k.current?.focus(),0):j("")},[g]),(0,b.jsxs)(z.Popover,{open:g,onOpenChange:h,children:[(0,b.jsx)(z.PopoverTrigger,{asChild:!0,children:(0,b.jsxs)("button",{id:"parent-feature",type:"button",role:"combobox","aria-expanded":g,"aria-label":"Parent Feature",disabled:f,"data-testid":"parent-feature-combobox",className:(0,q.cn)("border-input bg-background ring-offset-background focus:ring-ring flex h-9 w-full items-center justify-between rounded-md border px-3 py-2 text-sm focus:ring-2 focus:ring-offset-2 focus:outline-none disabled:cursor-not-allowed disabled:opacity-50",!l&&"text-muted-foreground"),children:[(0,b.jsx)("span",{className:"truncate",children:l?`${l.name} (${l.id.slice(0,8)})`:"Select parent feature..."}),(0,b.jsx)(o,{className:"ml-2 h-4 w-4 shrink-0 opacity-50"})]})}),(0,b.jsx)(z.PopoverContent,{className:"w-80 p-0",align:"start","data-testid":"parent-feature-combobox-content",children:(0,b.jsxs)("div",{className:"flex flex-col",children:[(0,b.jsx)("div",{className:"border-b p-2",children:(0,b.jsx)(v.Input,{ref:k,placeholder:"Search features...",value:i,onChange:a=>j(a.target.value),className:"h-8 border-0 p-0 text-sm shadow-none focus-visible:ring-0","data-testid":"parent-feature-search"})}),(0,b.jsxs)("div",{className:"max-h-48 overflow-y-auto py-1",role:"listbox","aria-label":"Features",children:[(0,b.jsxs)("button",{type:"button",role:"option","aria-selected":void 0===d,onClick:()=>n(void 0),className:(0,q.cn)("hover:bg-accent hover:text-accent-foreground flex w-full items-center gap-2 px-3 py-2 text-sm",void 0===d&&"bg-accent/50"),"data-testid":"parent-feature-option-none",children:[(0,b.jsx)(p.default,{className:(0,q.cn)("h-4 w-4 shrink-0",void 0!==d&&"invisible")}),(0,b.jsx)("span",{className:"text-muted-foreground italic",children:"No parent"})]}),0===m.length&&i?(0,b.jsx)("p",{className:"text-muted-foreground px-3 py-2 text-sm",children:"No features found."}):m.map(a=>(0,b.jsxs)("button",{type:"button",role:"option","aria-selected":d===a.id,onClick:()=>n(a.id),className:(0,q.cn)("hover:bg-accent hover:text-accent-foreground flex w-full items-center gap-2 px-3 py-2 text-sm",d===a.id&&"bg-accent/50"),"data-testid":`parent-feature-option-${a.id}`,children:[(0,b.jsx)(p.default,{className:(0,q.cn)("h-4 w-4 shrink-0",d!==a.id&&"invisible")}),(0,b.jsxs)("span",{className:"truncate",children:[a.name," ",(0,b.jsxs)("span",{className:"text-muted-foreground font-mono text-xs",children:["(",a.id.slice(0,8),")"]})]})]},a.id))]})]})})]})}function J({file:a,onRemove:c,disabled:d}){var e,f,g;let h,i=(h=(e=a.name).lastIndexOf("."))>=0?e.slice(h).toLowerCase():"",o=(f=i,K.has(f)?l:".pdf"===f?k.default:L.has(f)?m.default:j),p=".pdf"===(g=i)?"bg-red-50 text-red-600":K.has(g)?"bg-blue-50 text-blue-600":L.has(g)?"bg-emerald-50 text-emerald-600":"bg-gray-50 text-gray-600";return(0,b.jsxs)("div",{className:"flex items-center gap-3 rounded-md border p-2",children:[(0,b.jsx)("div",{className:(0,q.cn)("flex h-8 w-8 shrink-0 items-center justify-center rounded",p),children:(0,b.jsx)(o,{className:"h-4 w-4"})}),(0,b.jsxs)("div",{className:"flex min-w-0 flex-1 flex-col",children:[(0,b.jsx)("span",{className:"truncate text-sm font-medium",children:a.name}),(0,b.jsx)("span",{className:"text-muted-foreground truncate text-xs",children:a.path}),(0,b.jsx)("span",{className:"text-muted-foreground text-xs",children:function(a){if(0===a)return"0 B";let b=Math.floor(Math.log(a)/Math.log(1024));return`${(a/Math.pow(1024,b)).toFixed(+(0!==b))} ${["B","KB","MB","GB"][b]}`}(a.size)})]}),(0,b.jsx)(u.Button,{type:"button",variant:"ghost",size:"icon-xs",onClick:c,disabled:d,"aria-label":`Remove ${a.name}`,children:(0,b.jsx)(n.default,{className:"h-3 w-3"})})]})}let K=new Set([".png",".jpg",".jpeg",".gif",".svg",".webp",".ico",".bmp"]),L=new Set([".ts",".tsx",".js",".jsx",".json",".yaml",".yml",".xml",".html",".css",".md"]);function M({repositoryPath:a,initialParentId:f,features:h,workflowDefaults:i,currentAgentType:j,currentModel:k}){let l=(0,d.useRouter)(),[m,n]=(0,c.useState)(!1),o=(0,d.usePathname)().startsWith("/create"),p=!m&&o;(0,c.useEffect)(()=>{!o&&m&&n(!1)},[o,m]);let q=(0,c.useCallback)(()=>{l.push("/")},[l]),r=(0,c.useCallback)(a=>{n(!0),l.push("/"),g(a).then(b=>{b.error?e.toast.error(b.error):window.dispatchEvent(new CustomEvent("shep:feature-created",{detail:{featureId:b.feature.id,name:b.feature.name,description:b.feature.description,repositoryPath:b.feature.repositoryPath,parentId:a.parentId}}))}).catch(()=>{e.toast.error("Failed to create feature"),n(!1)})},[l]);return(0,b.jsx)(H,{open:p,onClose:q,onSubmit:r,repositoryPath:a,features:h,workflowDefaults:i,initialParentId:f,isSubmitting:m,currentAgentType:j,currentModel:k})}a.s(["CreateDrawerClient",()=>M],93995)}];
2
2
 
3
3
  //# sourceMappingURL=744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../../../src/presentation/web/components/common/control-center-drawer/create-drawer-client.tsx","../../../../../../../src/presentation/web/app/actions/data%3A3052fd%20%3Ctext/javascript%3E","../../../../../../../src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.tsx","../../../../../../../src/presentation/web/components/ui/textarea.tsx","../../../../../../../src/presentation/web/components/common/feature-create-drawer/pick-files.ts","../../../../../../../node_modules/.pnpm/lucide-react%400.563.0_react%4019.2.4/node_modules/lucide-react/src/icons/chevrons-up-down.ts","../../../../../../../node_modules/.pnpm/lucide-react%400.563.0_react%4019.2.4/node_modules/lucide-react/src/icons/image.ts","../../../../../../../node_modules/.pnpm/lucide-react%400.563.0_react%4019.2.4/node_modules/lucide-react/src/icons/file.ts"],"sourcesContent":["'use client';\n\nimport { useState, useCallback, useEffect } from 'react';\nimport { useRouter, usePathname } from 'next/navigation';\nimport { toast } from 'sonner';\nimport { createFeature } from '@/app/actions/create-feature';\nimport { FeatureCreateDrawer } from '@/components/common/feature-create-drawer';\nimport type { FeatureCreatePayload } from '@/components/common/feature-create-drawer';\nimport type { ParentFeatureOption } from '@/components/common/feature-create-drawer/feature-create-drawer';\nimport type { WorkflowDefaults } from '@/app/actions/get-workflow-defaults';\n\nexport interface CreateDrawerClientProps {\n repositoryPath: string;\n initialParentId?: string;\n features: ParentFeatureOption[];\n workflowDefaults?: WorkflowDefaults;\n currentAgentType?: string;\n currentModel?: string;\n}\n\nexport function CreateDrawerClient({\n repositoryPath,\n initialParentId,\n features,\n workflowDefaults,\n currentAgentType,\n currentModel,\n}: CreateDrawerClientProps) {\n const router = useRouter();\n const [isSubmitting, setIsSubmitting] = useState(false);\n\n // Derive open state from the URL. Next.js parallel routes preserve slot\n // content during soft navigation, so this component is NOT unmounted when\n // navigating to `/`. We watch the pathname and let Vaul handle the close\n // animation when the path no longer matches the create route.\n // When submitting, force the drawer closed immediately — router.push('/')\n // is async and the pathname may not update before the next render.\n const pathname = usePathname();\n const isOnCreateRoute = pathname.startsWith('/create');\n const isOpen = !isSubmitting && isOnCreateRoute;\n\n // Reset isSubmitting once the route has actually changed away from /create,\n // so the drawer can reopen on future visits. Without this, isSubmitting\n // would stay true forever since parallel routes preserve component state.\n useEffect(() => {\n if (!isOnCreateRoute && isSubmitting) {\n setIsSubmitting(false);\n }\n }, [isOnCreateRoute, isSubmitting]);\n\n const onClose = useCallback(() => {\n router.push('/');\n }, [router]);\n\n const onSubmit = useCallback(\n (data: FeatureCreatePayload) => {\n setIsSubmitting(true);\n\n // Close the drawer immediately for responsive UI\n router.push('/');\n\n // Server action Phase 1 returns fast with real feature ID (DB record created)\n // Phase 2 (metadata, worktree, agent) runs in background on server\n createFeature(data)\n .then((result) => {\n if (result.error) {\n toast.error(result.error);\n return;\n }\n // Dispatch event with real feature ID so control center adds it to featureMap\n window.dispatchEvent(\n new CustomEvent('shep:feature-created', {\n detail: {\n featureId: result.feature!.id,\n name: result.feature!.name,\n description: result.feature!.description,\n repositoryPath: result.feature!.repositoryPath,\n parentId: data.parentId,\n },\n })\n );\n })\n .catch(() => {\n toast.error('Failed to create feature');\n setIsSubmitting(false);\n });\n },\n [router]\n );\n\n return (\n <FeatureCreateDrawer\n open={isOpen}\n onClose={onClose}\n onSubmit={onSubmit}\n repositoryPath={repositoryPath}\n features={features}\n workflowDefaults={workflowDefaults}\n initialParentId={initialParentId}\n isSubmitting={isSubmitting}\n currentAgentType={currentAgentType}\n currentModel={currentModel}\n />\n );\n}\n","/* __next_internal_action_entry_do_not_use__ [{\"402f6c096143ec812a4a9ff701106198cf8b5d02df\":\"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(\"402f6c096143ec812a4a9ff701106198cf8b5d02df\",callServer,void 0,findSourceMapURL,\"createFeature\");export{$$RSC_SERVER_ACTION_0 as createFeature};","'use client';\n\nimport { useState, useCallback, useEffect, useRef } from 'react';\nimport type { LucideIcon } from 'lucide-react';\nimport {\n PlusIcon,\n FileIcon,\n FileTextIcon,\n ImageIcon,\n CodeIcon,\n Trash2Icon,\n ChevronsUpDown,\n CheckIcon,\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 type { FileAttachment } from '@shepai/core/infrastructure/services/file-dialog.service';\nimport type { WorkflowDefaults } from '@/app/actions/get-workflow-defaults';\nimport { AgentModelPicker } from '@/components/features/settings/AgentModelPicker';\nimport { pickFiles } from './pick-files';\n\nexport type { FileAttachment } from '@shepai/core/infrastructure/services/file-dialog.service';\n\n/** Minimal feature descriptor for the parent selector. */\nexport interface ParentFeatureOption {\n id: string;\n name: string;\n}\n\nexport interface FeatureCreatePayload {\n description: string;\n attachments: FileAttachment[];\n repositoryPath: string;\n approvalGates: {\n allowPrd: boolean;\n allowPlan: boolean;\n allowMerge: boolean;\n };\n push: boolean;\n openPr: boolean;\n parentId?: string;\n /** When true, skip SDLC phases and implement directly from the prompt. */\n fast: 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}\n\nconst AUTO_APPROVE_OPTIONS = [\n { id: 'allowPrd', label: 'PRD', description: 'Auto-approve requirements move to planning.' },\n { id: 'allowPlan', label: 'Plan', description: 'Auto-approve planning move to implementation.' },\n { id: 'allowMerge', label: 'Merge', description: 'Auto-approve merge move to Done.' },\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 /** 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}\n\nexport function FeatureCreateDrawer({\n open,\n onClose,\n onSubmit,\n repositoryPath,\n isSubmitting = false,\n workflowDefaults,\n features,\n initialParentId,\n currentAgentType,\n currentModel,\n}: FeatureCreateDrawerProps) {\n const createSound = useSoundAction('create');\n const defaultGates = workflowDefaults?.approvalGates ?? EMPTY_GATES;\n const defaultPush = workflowDefaults?.push ?? false;\n const defaultOpenPr = workflowDefaults?.openPr ?? false;\n\n const [description, setDescription] = useState('');\n const [attachments, setAttachments] = useState<FileAttachment[]>([]);\n const [approvalGates, setApprovalGates] = useState<Record<string, boolean>>({ ...defaultGates });\n const [push, setPush] = useState(defaultPush);\n const [openPr, setOpenPr] = useState(defaultOpenPr);\n const [parentId, setParentId] = useState<string | undefined>(undefined);\n const [fast, setFast] = useState(false);\n const [overrideAgent, setOverrideAgent] = useState<string | undefined>(undefined);\n const [overrideModel, setOverrideModel] = useState<string | undefined>(undefined);\n\n // Sync state when workflowDefaults load asynchronously\n useEffect(() => {\n if (workflowDefaults) {\n setApprovalGates({ ...workflowDefaults.approvalGates });\n setPush(workflowDefaults.push);\n setOpenPr(workflowDefaults.openPr);\n }\n }, [workflowDefaults]);\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 const resetForm = useCallback(() => {\n setDescription('');\n setAttachments([]);\n setApprovalGates({ ...defaultGates });\n setPush(defaultPush);\n setOpenPr(defaultOpenPr);\n setParentId(undefined);\n setFast(false);\n setOverrideAgent(undefined);\n setOverrideModel(undefined);\n }, [defaultGates, defaultPush, defaultOpenPr]);\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 const handleSubmit = useCallback(\n (e: React.FormEvent) => {\n e.preventDefault();\n if (!description.trim()) return;\n createSound.play();\n onSubmit({\n description: description.trim(),\n attachments,\n repositoryPath,\n approvalGates: {\n allowPrd: approvalGates.allowPrd ?? false,\n allowPlan: approvalGates.allowPlan ?? false,\n allowMerge: approvalGates.allowMerge ?? false,\n },\n push: push || openPr,\n openPr,\n fast,\n ...(overrideAgent ? { agentType: overrideAgent } : {}),\n ...(overrideModel ? { model: overrideModel } : {}),\n ...(parentId ? { parentId } : {}),\n });\n resetForm();\n },\n [\n description,\n attachments,\n approvalGates,\n repositoryPath,\n onSubmit,\n push,\n openPr,\n fast,\n overrideAgent,\n overrideModel,\n parentId,\n createSound,\n resetForm,\n ]\n );\n\n const handleAddFiles = useCallback(async () => {\n try {\n const files = await pickFiles();\n if (files) {\n setAttachments((prev) => [...prev, ...files]);\n }\n } catch {\n // Native dialog failed — silently ignore (user can retry)\n }\n }, []);\n\n const handleRemoveFile = useCallback((path: string) => {\n setAttachments((prev) => prev.filter((f) => f.path !== path));\n }, []);\n\n const hasFeatures = features && features.length > 0;\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>NEW FEATURE</DrawerTitle>\n </div>\n {isSubmitting ? (\n <DrawerDescription asChild>\n <div>\n <Badge variant=\"secondary\">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 Cancel\n </Button>\n <Button\n type=\"submit\"\n form=\"create-feature-form\"\n disabled={!description.trim() || isSubmitting}\n >\n {isSubmitting ? 'Creating...' : '+ Create Feature'}\n </Button>\n </div>\n }\n >\n {/* Form body */}\n <div className=\"overflow-y-auto p-4\">\n <TooltipProvider delayDuration={400}>\n <form id=\"create-feature-form\" onSubmit={handleSubmit} className=\"flex flex-col gap-4\">\n {/* Description + inline controls */}\n <div className=\"flex flex-col gap-1.5\">\n <Label\n htmlFor=\"feature-description\"\n className=\"text-muted-foreground text-xs font-semibold tracking-wider\"\n >\n DESCRIBE YOUR FEATURE\n </Label>\n <div className=\"border-input focus-within:ring-ring/50 focus-within:border-ring overflow-hidden rounded-md border shadow-xs transition-[color,box-shadow] focus-within:ring-[3px]\">\n <Textarea\n id=\"feature-description\"\n placeholder=\"e.g. Add GitHub OAuth login with callback handling and token refresh...\"\n value={description}\n onChange={(e) => setDescription(e.target.value)}\n rows={7}\n required\n disabled={isSubmitting}\n className=\"field-sizing-fixed min-h-42! resize-none rounded-none border-0 shadow-none focus-visible:ring-0\"\n />\n <div className=\"border-input flex items-center gap-3 border-t px-3 py-1.5\">\n <AgentModelPicker\n initialAgentType={overrideAgent ?? currentAgentType ?? 'claude-code'}\n initialModel={overrideModel ?? currentModel ?? 'claude-sonnet-4-6'}\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=\"fast-mode\"\n checked={fast}\n onCheckedChange={setFast}\n disabled={isSubmitting}\n />\n <Label htmlFor=\"fast-mode\" className=\"cursor-pointer text-sm font-medium\">\n Fast Mode\n </Label>\n </div>\n </TooltipTrigger>\n <TooltipContent side=\"bottom\">\n Skip SDLC phases and implement directly from your prompt.\n </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 PARENT FEATURE\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 APPROVE\n </span>\n </TooltipTrigger>\n <TooltipContent side=\"bottom\">\n Auto-approve phase transitions without manual review.\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 ? 'Skipped in Fast Mode'\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 All\n </button>\n </TooltipTrigger>\n <TooltipContent side=\"bottom\">Toggle all approval gates</TooltipContent>\n </Tooltip>\n </div>\n\n {/* Git row */}\n <div className=\"border-input flex items-center gap-4 rounded-md border px-3 py-2.5\">\n <span className=\"text-muted-foreground w-16 shrink-0 text-xs font-semibold tracking-wider\">\n GIT\n </span>\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=\"push\"\n size=\"sm\"\n checked={push || openPr}\n onCheckedChange={(v) => {\n setPush(v);\n if (!v && openPr) setOpenPr(false);\n }}\n disabled={isSubmitting}\n />\n <Label htmlFor=\"push\" className=\"cursor-pointer text-xs font-medium\">\n Push\n </Label>\n </div>\n </TooltipTrigger>\n <TooltipContent side=\"bottom\">\n Push branch to remote after implementation.\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={openPr}\n onCheckedChange={setOpenPr}\n disabled={isSubmitting}\n />\n <Label htmlFor=\"open-pr\" className=\"cursor-pointer text-xs font-medium\">\n PR\n </Label>\n </div>\n </TooltipTrigger>\n <TooltipContent side=\"bottom\">\n Open a pull request after pushing.\n </TooltipContent>\n </Tooltip>\n </div>\n </div>\n </div>\n\n {/* Attachments */}\n <div className=\"flex flex-col gap-2\">\n <div className=\"flex items-center justify-between\">\n <Label className=\"text-muted-foreground text-xs font-semibold tracking-wider\">\n ATTACHMENTS\n {attachments.length > 0 && (\n <span className=\"text-muted-foreground/60 ml-1.5\">({attachments.length})</span>\n )}\n </Label>\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"xs\"\n onClick={handleAddFiles}\n disabled={isSubmitting}\n >\n <PlusIcon className=\"size-3\" />\n Add Files\n </Button>\n </div>\n\n {attachments.length > 0 && (\n <div className=\"flex flex-col gap-2\">\n {attachments.map((file) => (\n <AttachmentCard\n key={file.path}\n file={file}\n onRemove={() => handleRemoveFile(file.path)}\n disabled={isSubmitting}\n />\n ))}\n </div>\n )}\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 [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 : 'Select parent feature...'}\n </span>\n <ChevronsUpDown className=\"ml-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=\"Search features...\"\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\">No parent</span>\n </button>\n\n {filtered.length === 0 && query ? (\n <p className=\"text-muted-foreground px-3 py-2 text-sm\">No features found.</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 * Private sub-components & utilities\n * ------------------------------------------------------------------------- */\n\nfunction AttachmentCard({\n file,\n onRemove,\n disabled,\n}: {\n file: FileAttachment;\n onRemove: () => void;\n disabled?: boolean;\n}) {\n const ext = getExtension(file.name);\n const Icon = getFileIcon(ext);\n const iconColorClass = getFileIconColor(ext);\n\n return (\n <div className=\"flex items-center gap-3 rounded-md border p-2\">\n <div\n className={cn('flex h-8 w-8 shrink-0 items-center justify-center rounded', iconColorClass)}\n >\n <Icon className=\"h-4 w-4\" />\n </div>\n <div className=\"flex min-w-0 flex-1 flex-col\">\n <span className=\"truncate text-sm font-medium\">{file.name}</span>\n <span className=\"text-muted-foreground truncate text-xs\">{file.path}</span>\n <span className=\"text-muted-foreground text-xs\">{formatFileSize(file.size)}</span>\n </div>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon-xs\"\n onClick={onRemove}\n disabled={disabled}\n aria-label={`Remove ${file.name}`}\n >\n <Trash2Icon className=\"h-3 w-3\" />\n </Button>\n </div>\n );\n}\n\nfunction getExtension(filename: string): string {\n const dot = filename.lastIndexOf('.');\n return dot >= 0 ? filename.slice(dot).toLowerCase() : '';\n}\n\nconst IMAGE_EXTS = new Set(['.png', '.jpg', '.jpeg', '.gif', '.svg', '.webp', '.ico', '.bmp']);\nconst CODE_EXTS = new Set([\n '.ts',\n '.tsx',\n '.js',\n '.jsx',\n '.json',\n '.yaml',\n '.yml',\n '.xml',\n '.html',\n '.css',\n '.md',\n]);\n\nfunction getFileIcon(ext: string): LucideIcon {\n if (IMAGE_EXTS.has(ext)) return ImageIcon;\n if (ext === '.pdf') return FileTextIcon;\n if (CODE_EXTS.has(ext)) return CodeIcon;\n return FileIcon;\n}\n\nfunction getFileIconColor(ext: string): string {\n if (ext === '.pdf') return 'bg-red-50 text-red-600';\n if (IMAGE_EXTS.has(ext)) return 'bg-blue-50 text-blue-600';\n if (CODE_EXTS.has(ext)) return 'bg-emerald-50 text-emerald-600';\n return 'bg-gray-50 text-gray-600';\n}\n\nfunction formatFileSize(bytes: number): string {\n if (bytes === 0) return '0 B';\n const units = ['B', 'KB', 'MB', 'GB'];\n const i = Math.floor(Math.log(bytes) / Math.log(1024));\n return `${(bytes / Math.pow(1024, i)).toFixed(i === 0 ? 0 : 1)} ${units[i]}`;\n}\n","import * as React from 'react';\n\nimport { cn } from '@/lib/utils';\n\nfunction Textarea({ className, ...props }: React.ComponentProps<'textarea'>) {\n return (\n <textarea\n data-slot=\"textarea\"\n className={cn(\n 'placeholder:text-muted-foreground selection:bg-primary selection:text-primary-foreground dark:bg-input/30 border-input field-sizing-content min-h-[80px] w-full rounded-md border bg-transparent px-3 py-2 text-base shadow-xs transition-[color,box-shadow] outline-none disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50 md:text-sm',\n 'focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px]',\n 'aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive',\n className\n )}\n {...props}\n />\n );\n}\n\nexport { Textarea };\n","import type { FileAttachment } from '@shepai/core/infrastructure/services/file-dialog.service';\n\n/**\n * Opens a native OS file picker dialog via API route.\n * Returns the selected files with metadata, or null if the user cancelled.\n */\nexport async function pickFiles(): Promise<FileAttachment[] | null> {\n const res = await fetch('/api/dialog/pick-files', { method: 'POST' });\n\n if (!res.ok) {\n throw new Error('Failed to open file dialog');\n }\n\n const data: { files: FileAttachment[] | null; cancelled: boolean } = await res.json();\n return data.cancelled ? null : data.files;\n}\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['path', { d: 'm7 15 5 5 5-5', key: '1hf1tw' }],\n ['path', { d: 'm7 9 5-5 5 5', key: 'sgt6xg' }],\n];\n\n/**\n * @component @name ChevronsUpDown\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJtNyAxNSA1IDUgNS01IiAvPgogIDxwYXRoIGQ9Im03IDkgNS01IDUgNSIgLz4KPC9zdmc+Cg==) - https://lucide.dev/icons/chevrons-up-down\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst ChevronsUpDown = createLucideIcon('chevrons-up-down', __iconNode);\n\nexport default ChevronsUpDown;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['rect', { width: '18', height: '18', x: '3', y: '3', rx: '2', ry: '2', key: '1m3agn' }],\n ['circle', { cx: '9', cy: '9', r: '2', key: 'af1f0g' }],\n ['path', { d: 'm21 15-3.086-3.086a2 2 0 0 0-2.828 0L6 21', key: '1xmnt7' }],\n];\n\n/**\n * @component @name Image\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cmVjdCB3aWR0aD0iMTgiIGhlaWdodD0iMTgiIHg9IjMiIHk9IjMiIHJ4PSIyIiByeT0iMiIgLz4KICA8Y2lyY2xlIGN4PSI5IiBjeT0iOSIgcj0iMiIgLz4KICA8cGF0aCBkPSJtMjEgMTUtMy4wODYtMy4wODZhMiAyIDAgMCAwLTIuODI4IDBMNiAyMSIgLz4KPC9zdmc+Cg==) - https://lucide.dev/icons/image\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Image = createLucideIcon('image', __iconNode);\n\nexport default Image;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n [\n 'path',\n {\n d: 'M6 22a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2z',\n key: '1oefj6',\n },\n ],\n ['path', { d: 'M14 2v5a1 1 0 0 0 1 1h5', key: 'wfsgrz' }],\n];\n\n/**\n * @component @name File\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNNiAyMmEyIDIgMCAwIDEtMi0yVjRhMiAyIDAgMCAxIDItMmg4YTIuNCAyLjQgMCAwIDEgMS43MDQuNzA2bDMuNTg4IDMuNTg4QTIuNCAyLjQgMCAwIDEgMjAgOHYxMmEyIDIgMCAwIDEtMiAyeiIgLz4KICA8cGF0aCBkPSJNMTQgMnY1YTEgMSAwIDAgMCAxIDFoNSIgLz4KPC9zdmc+Cg==) - https://lucide.dev/icons/file\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst File = createLucideIcon('file', __iconNode);\n\nexport default File;\n"],"names":[],"mappings":"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","ignoreList":[5,6,7]}
1
+ {"version":3,"sources":["../../../../../../../src/presentation/web/components/common/control-center-drawer/create-drawer-client.tsx","../../../../../../../src/presentation/web/app/actions/data%3Ae924b9%20%3Ctext/javascript%3E","../../../../../../../src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.tsx","../../../../../../../src/presentation/web/components/ui/textarea.tsx","../../../../../../../src/presentation/web/components/common/feature-create-drawer/pick-files.ts","../../../../../../../node_modules/.pnpm/lucide-react%400.563.0_react%4019.2.4/node_modules/lucide-react/src/icons/chevrons-up-down.ts","../../../../../../../node_modules/.pnpm/lucide-react%400.563.0_react%4019.2.4/node_modules/lucide-react/src/icons/image.ts","../../../../../../../node_modules/.pnpm/lucide-react%400.563.0_react%4019.2.4/node_modules/lucide-react/src/icons/file.ts"],"sourcesContent":["'use client';\n\nimport { useState, useCallback, useEffect } from 'react';\nimport { useRouter, usePathname } from 'next/navigation';\nimport { toast } from 'sonner';\nimport { createFeature } from '@/app/actions/create-feature';\nimport { FeatureCreateDrawer } from '@/components/common/feature-create-drawer';\nimport type { FeatureCreatePayload } from '@/components/common/feature-create-drawer';\nimport type { ParentFeatureOption } from '@/components/common/feature-create-drawer/feature-create-drawer';\nimport type { WorkflowDefaults } from '@/app/actions/get-workflow-defaults';\n\nexport interface CreateDrawerClientProps {\n repositoryPath: string;\n initialParentId?: string;\n features: ParentFeatureOption[];\n workflowDefaults?: WorkflowDefaults;\n currentAgentType?: string;\n currentModel?: string;\n}\n\nexport function CreateDrawerClient({\n repositoryPath,\n initialParentId,\n features,\n workflowDefaults,\n currentAgentType,\n currentModel,\n}: CreateDrawerClientProps) {\n const router = useRouter();\n const [isSubmitting, setIsSubmitting] = useState(false);\n\n // Derive open state from the URL. Next.js parallel routes preserve slot\n // content during soft navigation, so this component is NOT unmounted when\n // navigating to `/`. We watch the pathname and let Vaul handle the close\n // animation when the path no longer matches the create route.\n // When submitting, force the drawer closed immediately — router.push('/')\n // is async and the pathname may not update before the next render.\n const pathname = usePathname();\n const isOnCreateRoute = pathname.startsWith('/create');\n const isOpen = !isSubmitting && isOnCreateRoute;\n\n // Reset isSubmitting once the route has actually changed away from /create,\n // so the drawer can reopen on future visits. Without this, isSubmitting\n // would stay true forever since parallel routes preserve component state.\n useEffect(() => {\n if (!isOnCreateRoute && isSubmitting) {\n setIsSubmitting(false);\n }\n }, [isOnCreateRoute, isSubmitting]);\n\n const onClose = useCallback(() => {\n router.push('/');\n }, [router]);\n\n const onSubmit = useCallback(\n (data: FeatureCreatePayload) => {\n setIsSubmitting(true);\n\n // Close the drawer immediately for responsive UI\n router.push('/');\n\n // Server action Phase 1 returns fast with real feature ID (DB record created)\n // Phase 2 (metadata, worktree, agent) runs in background on server\n createFeature(data)\n .then((result) => {\n if (result.error) {\n toast.error(result.error);\n return;\n }\n // Dispatch event with real feature ID so control center adds it to featureMap\n window.dispatchEvent(\n new CustomEvent('shep:feature-created', {\n detail: {\n featureId: result.feature!.id,\n name: result.feature!.name,\n description: result.feature!.description,\n repositoryPath: result.feature!.repositoryPath,\n parentId: data.parentId,\n },\n })\n );\n })\n .catch(() => {\n toast.error('Failed to create feature');\n setIsSubmitting(false);\n });\n },\n [router]\n );\n\n return (\n <FeatureCreateDrawer\n open={isOpen}\n onClose={onClose}\n onSubmit={onSubmit}\n repositoryPath={repositoryPath}\n features={features}\n workflowDefaults={workflowDefaults}\n initialParentId={initialParentId}\n isSubmitting={isSubmitting}\n currentAgentType={currentAgentType}\n currentModel={currentModel}\n />\n );\n}\n","/* __next_internal_action_entry_do_not_use__ [{\"4029496866314880b1a802978e00fb0dfc7fc7deb9\":\"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(\"4029496866314880b1a802978e00fb0dfc7fc7deb9\",callServer,void 0,findSourceMapURL,\"createFeature\");export{$$RSC_SERVER_ACTION_0 as createFeature};","'use client';\n\nimport { useState, useCallback, useEffect, useRef } from 'react';\nimport type { LucideIcon } from 'lucide-react';\nimport {\n PlusIcon,\n FileIcon,\n FileTextIcon,\n ImageIcon,\n CodeIcon,\n Trash2Icon,\n ChevronsUpDown,\n CheckIcon,\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 type { FileAttachment } from '@shepai/core/infrastructure/services/file-dialog.service';\nimport type { WorkflowDefaults } from '@/app/actions/get-workflow-defaults';\nimport { AgentModelPicker } from '@/components/features/settings/AgentModelPicker';\nimport { pickFiles } from './pick-files';\n\nexport type { FileAttachment } from '@shepai/core/infrastructure/services/file-dialog.service';\n\n/** Minimal feature descriptor for the parent selector. */\nexport interface ParentFeatureOption {\n id: string;\n name: string;\n}\n\nexport interface FeatureCreatePayload {\n description: string;\n attachments: FileAttachment[];\n repositoryPath: string;\n approvalGates: {\n allowPrd: boolean;\n allowPlan: boolean;\n allowMerge: boolean;\n };\n push: boolean;\n openPr: boolean;\n parentId?: string;\n /** When true, skip SDLC phases and implement directly from the prompt. */\n fast: 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}\n\nconst AUTO_APPROVE_OPTIONS = [\n { id: 'allowPrd', label: 'PRD', description: 'Auto-approve requirements move to planning.' },\n { id: 'allowPlan', label: 'Plan', description: 'Auto-approve planning move to implementation.' },\n { id: 'allowMerge', label: 'Merge', description: 'Auto-approve merge move to Done.' },\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 /** 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}\n\nexport function FeatureCreateDrawer({\n open,\n onClose,\n onSubmit,\n repositoryPath,\n isSubmitting = false,\n workflowDefaults,\n features,\n initialParentId,\n currentAgentType,\n currentModel,\n}: FeatureCreateDrawerProps) {\n const createSound = useSoundAction('create');\n const defaultGates = workflowDefaults?.approvalGates ?? EMPTY_GATES;\n const defaultPush = workflowDefaults?.push ?? false;\n const defaultOpenPr = workflowDefaults?.openPr ?? false;\n\n const [description, setDescription] = useState('');\n const [attachments, setAttachments] = useState<FileAttachment[]>([]);\n const [approvalGates, setApprovalGates] = useState<Record<string, boolean>>({ ...defaultGates });\n const [push, setPush] = useState(defaultPush);\n const [openPr, setOpenPr] = useState(defaultOpenPr);\n const [parentId, setParentId] = useState<string | undefined>(undefined);\n const [fast, setFast] = useState(false);\n const [overrideAgent, setOverrideAgent] = useState<string | undefined>(undefined);\n const [overrideModel, setOverrideModel] = useState<string | undefined>(undefined);\n\n // Sync state when workflowDefaults load asynchronously\n useEffect(() => {\n if (workflowDefaults) {\n setApprovalGates({ ...workflowDefaults.approvalGates });\n setPush(workflowDefaults.push);\n setOpenPr(workflowDefaults.openPr);\n }\n }, [workflowDefaults]);\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 const resetForm = useCallback(() => {\n setDescription('');\n setAttachments([]);\n setApprovalGates({ ...defaultGates });\n setPush(defaultPush);\n setOpenPr(defaultOpenPr);\n setParentId(undefined);\n setFast(false);\n setOverrideAgent(undefined);\n setOverrideModel(undefined);\n }, [defaultGates, defaultPush, defaultOpenPr]);\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 const handleSubmit = useCallback(\n (e: React.FormEvent) => {\n e.preventDefault();\n if (!description.trim()) return;\n createSound.play();\n onSubmit({\n description: description.trim(),\n attachments,\n repositoryPath,\n approvalGates: {\n allowPrd: approvalGates.allowPrd ?? false,\n allowPlan: approvalGates.allowPlan ?? false,\n allowMerge: approvalGates.allowMerge ?? false,\n },\n push: push || openPr,\n openPr,\n fast,\n ...(overrideAgent ? { agentType: overrideAgent } : {}),\n ...(overrideModel ? { model: overrideModel } : {}),\n ...(parentId ? { parentId } : {}),\n });\n resetForm();\n },\n [\n description,\n attachments,\n approvalGates,\n repositoryPath,\n onSubmit,\n push,\n openPr,\n fast,\n overrideAgent,\n overrideModel,\n parentId,\n createSound,\n resetForm,\n ]\n );\n\n const handleAddFiles = useCallback(async () => {\n try {\n const files = await pickFiles();\n if (files) {\n setAttachments((prev) => [...prev, ...files]);\n }\n } catch {\n // Native dialog failed — silently ignore (user can retry)\n }\n }, []);\n\n const handleRemoveFile = useCallback((path: string) => {\n setAttachments((prev) => prev.filter((f) => f.path !== path));\n }, []);\n\n const hasFeatures = features && features.length > 0;\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>NEW FEATURE</DrawerTitle>\n </div>\n {isSubmitting ? (\n <DrawerDescription asChild>\n <div>\n <Badge variant=\"secondary\">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 Cancel\n </Button>\n <Button\n type=\"submit\"\n form=\"create-feature-form\"\n disabled={!description.trim() || isSubmitting}\n >\n {isSubmitting ? 'Creating...' : '+ Create Feature'}\n </Button>\n </div>\n }\n >\n {/* Form body */}\n <div className=\"overflow-y-auto p-4\">\n <TooltipProvider delayDuration={400}>\n <form id=\"create-feature-form\" onSubmit={handleSubmit} className=\"flex flex-col gap-4\">\n {/* Description + inline controls */}\n <div className=\"flex flex-col gap-1.5\">\n <Label\n htmlFor=\"feature-description\"\n className=\"text-muted-foreground text-xs font-semibold tracking-wider\"\n >\n DESCRIBE YOUR FEATURE\n </Label>\n <div className=\"border-input focus-within:ring-ring/50 focus-within:border-ring overflow-hidden rounded-md border shadow-xs transition-[color,box-shadow] focus-within:ring-[3px]\">\n <Textarea\n id=\"feature-description\"\n placeholder=\"e.g. Add GitHub OAuth login with callback handling and token refresh...\"\n value={description}\n onChange={(e) => setDescription(e.target.value)}\n rows={7}\n required\n disabled={isSubmitting}\n className=\"field-sizing-fixed min-h-42! resize-none rounded-none border-0 shadow-none focus-visible:ring-0\"\n />\n <div className=\"border-input flex items-center gap-3 border-t px-3 py-1.5\">\n <AgentModelPicker\n initialAgentType={overrideAgent ?? currentAgentType ?? 'claude-code'}\n initialModel={overrideModel ?? currentModel ?? 'claude-sonnet-4-6'}\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=\"fast-mode\"\n checked={fast}\n onCheckedChange={setFast}\n disabled={isSubmitting}\n />\n <Label htmlFor=\"fast-mode\" className=\"cursor-pointer text-sm font-medium\">\n Fast Mode\n </Label>\n </div>\n </TooltipTrigger>\n <TooltipContent side=\"bottom\">\n Skip SDLC phases and implement directly from your prompt.\n </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 PARENT FEATURE\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 APPROVE\n </span>\n </TooltipTrigger>\n <TooltipContent side=\"bottom\">\n Auto-approve phase transitions without manual review.\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 ? 'Skipped in Fast Mode'\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 All\n </button>\n </TooltipTrigger>\n <TooltipContent side=\"bottom\">Toggle all approval gates</TooltipContent>\n </Tooltip>\n </div>\n\n {/* Git row */}\n <div className=\"border-input flex items-center gap-4 rounded-md border px-3 py-2.5\">\n <span className=\"text-muted-foreground w-16 shrink-0 text-xs font-semibold tracking-wider\">\n GIT\n </span>\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=\"push\"\n size=\"sm\"\n checked={push || openPr}\n onCheckedChange={(v) => {\n setPush(v);\n if (!v && openPr) setOpenPr(false);\n }}\n disabled={isSubmitting}\n />\n <Label htmlFor=\"push\" className=\"cursor-pointer text-xs font-medium\">\n Push\n </Label>\n </div>\n </TooltipTrigger>\n <TooltipContent side=\"bottom\">\n Push branch to remote after implementation.\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={openPr}\n onCheckedChange={setOpenPr}\n disabled={isSubmitting}\n />\n <Label htmlFor=\"open-pr\" className=\"cursor-pointer text-xs font-medium\">\n PR\n </Label>\n </div>\n </TooltipTrigger>\n <TooltipContent side=\"bottom\">\n Open a pull request after pushing.\n </TooltipContent>\n </Tooltip>\n </div>\n </div>\n </div>\n\n {/* Attachments */}\n <div className=\"flex flex-col gap-2\">\n <div className=\"flex items-center justify-between\">\n <Label className=\"text-muted-foreground text-xs font-semibold tracking-wider\">\n ATTACHMENTS\n {attachments.length > 0 && (\n <span className=\"text-muted-foreground/60 ml-1.5\">({attachments.length})</span>\n )}\n </Label>\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"xs\"\n onClick={handleAddFiles}\n disabled={isSubmitting}\n >\n <PlusIcon className=\"size-3\" />\n Add Files\n </Button>\n </div>\n\n {attachments.length > 0 && (\n <div className=\"flex flex-col gap-2\">\n {attachments.map((file) => (\n <AttachmentCard\n key={file.path}\n file={file}\n onRemove={() => handleRemoveFile(file.path)}\n disabled={isSubmitting}\n />\n ))}\n </div>\n )}\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 [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 : 'Select parent feature...'}\n </span>\n <ChevronsUpDown className=\"ml-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=\"Search features...\"\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\">No parent</span>\n </button>\n\n {filtered.length === 0 && query ? (\n <p className=\"text-muted-foreground px-3 py-2 text-sm\">No features found.</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 * Private sub-components & utilities\n * ------------------------------------------------------------------------- */\n\nfunction AttachmentCard({\n file,\n onRemove,\n disabled,\n}: {\n file: FileAttachment;\n onRemove: () => void;\n disabled?: boolean;\n}) {\n const ext = getExtension(file.name);\n const Icon = getFileIcon(ext);\n const iconColorClass = getFileIconColor(ext);\n\n return (\n <div className=\"flex items-center gap-3 rounded-md border p-2\">\n <div\n className={cn('flex h-8 w-8 shrink-0 items-center justify-center rounded', iconColorClass)}\n >\n <Icon className=\"h-4 w-4\" />\n </div>\n <div className=\"flex min-w-0 flex-1 flex-col\">\n <span className=\"truncate text-sm font-medium\">{file.name}</span>\n <span className=\"text-muted-foreground truncate text-xs\">{file.path}</span>\n <span className=\"text-muted-foreground text-xs\">{formatFileSize(file.size)}</span>\n </div>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon-xs\"\n onClick={onRemove}\n disabled={disabled}\n aria-label={`Remove ${file.name}`}\n >\n <Trash2Icon className=\"h-3 w-3\" />\n </Button>\n </div>\n );\n}\n\nfunction getExtension(filename: string): string {\n const dot = filename.lastIndexOf('.');\n return dot >= 0 ? filename.slice(dot).toLowerCase() : '';\n}\n\nconst IMAGE_EXTS = new Set(['.png', '.jpg', '.jpeg', '.gif', '.svg', '.webp', '.ico', '.bmp']);\nconst CODE_EXTS = new Set([\n '.ts',\n '.tsx',\n '.js',\n '.jsx',\n '.json',\n '.yaml',\n '.yml',\n '.xml',\n '.html',\n '.css',\n '.md',\n]);\n\nfunction getFileIcon(ext: string): LucideIcon {\n if (IMAGE_EXTS.has(ext)) return ImageIcon;\n if (ext === '.pdf') return FileTextIcon;\n if (CODE_EXTS.has(ext)) return CodeIcon;\n return FileIcon;\n}\n\nfunction getFileIconColor(ext: string): string {\n if (ext === '.pdf') return 'bg-red-50 text-red-600';\n if (IMAGE_EXTS.has(ext)) return 'bg-blue-50 text-blue-600';\n if (CODE_EXTS.has(ext)) return 'bg-emerald-50 text-emerald-600';\n return 'bg-gray-50 text-gray-600';\n}\n\nfunction formatFileSize(bytes: number): string {\n if (bytes === 0) return '0 B';\n const units = ['B', 'KB', 'MB', 'GB'];\n const i = Math.floor(Math.log(bytes) / Math.log(1024));\n return `${(bytes / Math.pow(1024, i)).toFixed(i === 0 ? 0 : 1)} ${units[i]}`;\n}\n","import * as React from 'react';\n\nimport { cn } from '@/lib/utils';\n\nfunction Textarea({ className, ...props }: React.ComponentProps<'textarea'>) {\n return (\n <textarea\n data-slot=\"textarea\"\n className={cn(\n 'placeholder:text-muted-foreground selection:bg-primary selection:text-primary-foreground dark:bg-input/30 border-input field-sizing-content min-h-[80px] w-full rounded-md border bg-transparent px-3 py-2 text-base shadow-xs transition-[color,box-shadow] outline-none disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50 md:text-sm',\n 'focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px]',\n 'aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive',\n className\n )}\n {...props}\n />\n );\n}\n\nexport { Textarea };\n","import type { FileAttachment } from '@shepai/core/infrastructure/services/file-dialog.service';\n\n/**\n * Opens a native OS file picker dialog via API route.\n * Returns the selected files with metadata, or null if the user cancelled.\n */\nexport async function pickFiles(): Promise<FileAttachment[] | null> {\n const res = await fetch('/api/dialog/pick-files', { method: 'POST' });\n\n if (!res.ok) {\n throw new Error('Failed to open file dialog');\n }\n\n const data: { files: FileAttachment[] | null; cancelled: boolean } = await res.json();\n return data.cancelled ? null : data.files;\n}\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['path', { d: 'm7 15 5 5 5-5', key: '1hf1tw' }],\n ['path', { d: 'm7 9 5-5 5 5', key: 'sgt6xg' }],\n];\n\n/**\n * @component @name ChevronsUpDown\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJtNyAxNSA1IDUgNS01IiAvPgogIDxwYXRoIGQ9Im03IDkgNS01IDUgNSIgLz4KPC9zdmc+Cg==) - https://lucide.dev/icons/chevrons-up-down\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst ChevronsUpDown = createLucideIcon('chevrons-up-down', __iconNode);\n\nexport default ChevronsUpDown;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['rect', { width: '18', height: '18', x: '3', y: '3', rx: '2', ry: '2', key: '1m3agn' }],\n ['circle', { cx: '9', cy: '9', r: '2', key: 'af1f0g' }],\n ['path', { d: 'm21 15-3.086-3.086a2 2 0 0 0-2.828 0L6 21', key: '1xmnt7' }],\n];\n\n/**\n * @component @name Image\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cmVjdCB3aWR0aD0iMTgiIGhlaWdodD0iMTgiIHg9IjMiIHk9IjMiIHJ4PSIyIiByeT0iMiIgLz4KICA8Y2lyY2xlIGN4PSI5IiBjeT0iOSIgcj0iMiIgLz4KICA8cGF0aCBkPSJtMjEgMTUtMy4wODYtMy4wODZhMiAyIDAgMCAwLTIuODI4IDBMNiAyMSIgLz4KPC9zdmc+Cg==) - https://lucide.dev/icons/image\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Image = createLucideIcon('image', __iconNode);\n\nexport default Image;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n [\n 'path',\n {\n d: 'M6 22a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2z',\n key: '1oefj6',\n },\n ],\n ['path', { d: 'M14 2v5a1 1 0 0 0 1 1h5', key: 'wfsgrz' }],\n];\n\n/**\n * @component @name File\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNNiAyMmEyIDIgMCAwIDEtMi0yVjRhMiAyIDAgMCAxIDItMmg4YTIuNCAyLjQgMCAwIDEgMS43MDQuNzA2bDMuNTg4IDMuNTg4QTIuNCAyLjQgMCAwIDEgMjAgOHYxMmEyIDIgMCAwIDEtMiAyeiIgLz4KICA8cGF0aCBkPSJNMTQgMnY1YTEgMSAwIDAgMCAxIDFoNSIgLz4KPC9zdmc+Cg==) - https://lucide.dev/icons/file\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst File = createLucideIcon('file', __iconNode);\n\nexport default File;\n"],"names":[],"mappings":"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","ignoreList":[5,6,7]}
@@ -1,3 +1,3 @@
1
- module.exports=[61199,a=>{"use strict";var b=a.i(12513),c=a.i(94691),d=a.i(33841),e=a.i(46646),f=a.i(68670),g=a.i(85321),h=a.i(84095),i=a.i(56799),j=a.i(80496),k=a.i(50845),l=a.i(49560),m=a.i(39353),n=a.i(29207),o=a.i(31075);a.s([],43119),a.i(43119),a.s(["004745af5f99a39044fd882d6da0f81b3fc3e07d6b",()=>o.fetchGraphData,"009878f66f161eb6b982122e598044c548a55be57d",()=>b.pickFolder,"4018b5e3de627b5924b180e9226481eae5192125c5",()=>j.openFolder,"40361fef913837f0051fc2affc921ff0c27b2b84f6",()=>n.getFeatureMetadata,"4040296efb65855962d3a47938bd2b4cfdd581dfec",()=>h.openIde,"4046bf2a295695131d6c4fdc8753910766208c1950",()=>k.deleteFeature,"40518fbc3bb4559750a8350be1450a3a857485f940",()=>i.openShell,"4061f0cbd061af373e89cc7f4f796e18172351c5e2",()=>e.deployRepository,"406c7f30aee074b62e41c41aabd72d89e7a3b9301a",()=>c.getDeploymentLogs,"407c9f6d19a2dacb8bacf5d10d204a6f71f865d495",()=>g.getDeploymentStatus,"4085d200b95dbed12616be23c09e0cc2c6ca7296a3",()=>d.deployFeature,"40a31e9984bb7740730612414bc393bcb05036649e",()=>m.deleteRepository,"40a7e1d45bdfdba16c36ff6ae6c0e11dba413d5e16",()=>l.addRepository,"40d46e1b19a94286678241ec8a587f0dd1ceaaa559",()=>f.stopDeployment],61199)}];
1
+ module.exports=[61199,a=>{"use strict";var b=a.i(12513),c=a.i(94691),d=a.i(33841),e=a.i(46646),f=a.i(68670),g=a.i(85321),h=a.i(84095),i=a.i(56799),j=a.i(80496),k=a.i(50845),l=a.i(49560),m=a.i(39353),n=a.i(29207),o=a.i(31075);a.s([],43119),a.i(43119),a.s(["00674dd0dafaf02891c8878928ec1353c0707222fd",()=>b.pickFolder,"00fba40567c65c19db7a15472a41bf98862a78a6f7",()=>o.fetchGraphData,"4023f8378dc36e9805403f4b8305441f6b65395b62",()=>n.getFeatureMetadata,"404316d0ec453ab565abb5b64112bea64575c5626f",()=>c.getDeploymentLogs,"40494c8554b691b7131291c73a4e9aca34c3080985",()=>k.deleteFeature,"4049881a2bdf6439f9f2958a76ae17589f6f87c531",()=>e.deployRepository,"404f29e645a841edb42fba76130b59034ed92eb427",()=>g.getDeploymentStatus,"4058652c6ec530ea4f12f84f5793b4b37703303558",()=>h.openIde,"408a3a1ebac2e7c597cc18471c18eab4945d5c39fb",()=>m.deleteRepository,"40a1b0fe7dc36f6f9d9ceaf99110121e0dc5773e7c",()=>j.openFolder,"40a3e5c3534bd58b9c9d4ae8aa9bc421c5475a7941",()=>l.addRepository,"40a8e259151ca50b8262db399be15b4f2e551bf8f7",()=>i.openShell,"40e21e41f9619a660875636ebdb416b09916c8afe5",()=>d.deployFeature,"40fd87d38320467e32dfefd84c9787391f1c42d7a2",()=>f.stopDeployment],61199)}];
2
2
 
3
3
  //# sourceMappingURL=8ba4b_server_app_%28dashboard%29_%40drawer_repository_%5BrepositoryId%5D_page_actions_da7eef33.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../../../src/presentation/web/.next-internal/server/app/%28dashboard%29/%40drawer/repository/%5BrepositoryId%5D/page/actions.js%20%28server%20actions%20loader%29"],"sourcesContent":["export {pickFolder as '009878f66f161eb6b982122e598044c548a55be57d'} from 'ACTIONS_MODULE0'\nexport {getDeploymentLogs as '406c7f30aee074b62e41c41aabd72d89e7a3b9301a'} from 'ACTIONS_MODULE1'\nexport {deployFeature as '4085d200b95dbed12616be23c09e0cc2c6ca7296a3'} from 'ACTIONS_MODULE2'\nexport {deployRepository as '4061f0cbd061af373e89cc7f4f796e18172351c5e2'} from 'ACTIONS_MODULE3'\nexport {stopDeployment as '40d46e1b19a94286678241ec8a587f0dd1ceaaa559'} from 'ACTIONS_MODULE4'\nexport {getDeploymentStatus as '407c9f6d19a2dacb8bacf5d10d204a6f71f865d495'} from 'ACTIONS_MODULE5'\nexport {openIde as '4040296efb65855962d3a47938bd2b4cfdd581dfec'} from 'ACTIONS_MODULE6'\nexport {openShell as '40518fbc3bb4559750a8350be1450a3a857485f940'} from 'ACTIONS_MODULE7'\nexport {openFolder as '4018b5e3de627b5924b180e9226481eae5192125c5'} from 'ACTIONS_MODULE8'\nexport {deleteFeature as '4046bf2a295695131d6c4fdc8753910766208c1950'} from 'ACTIONS_MODULE9'\nexport {addRepository as '40a7e1d45bdfdba16c36ff6ae6c0e11dba413d5e16'} from 'ACTIONS_MODULE10'\nexport {deleteRepository as '40a31e9984bb7740730612414bc393bcb05036649e'} from 'ACTIONS_MODULE11'\nexport {getFeatureMetadata as '40361fef913837f0051fc2affc921ff0c27b2b84f6'} from 'ACTIONS_MODULE12'\nexport {fetchGraphData as '004745af5f99a39044fd882d6da0f81b3fc3e07d6b'} from 'ACTIONS_MODULE13'\n"],"names":[],"mappings":"uCAAA,IAAA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,EAAA,CAAA,CAAA"}
1
+ {"version":3,"sources":["../../../../../../../src/presentation/web/.next-internal/server/app/%28dashboard%29/%40drawer/repository/%5BrepositoryId%5D/page/actions.js%20%28server%20actions%20loader%29"],"sourcesContent":["export {pickFolder as '00674dd0dafaf02891c8878928ec1353c0707222fd'} from 'ACTIONS_MODULE0'\nexport {getDeploymentLogs as '404316d0ec453ab565abb5b64112bea64575c5626f'} from 'ACTIONS_MODULE1'\nexport {deployFeature as '40e21e41f9619a660875636ebdb416b09916c8afe5'} from 'ACTIONS_MODULE2'\nexport {deployRepository as '4049881a2bdf6439f9f2958a76ae17589f6f87c531'} from 'ACTIONS_MODULE3'\nexport {stopDeployment as '40fd87d38320467e32dfefd84c9787391f1c42d7a2'} from 'ACTIONS_MODULE4'\nexport {getDeploymentStatus as '404f29e645a841edb42fba76130b59034ed92eb427'} from 'ACTIONS_MODULE5'\nexport {openIde as '4058652c6ec530ea4f12f84f5793b4b37703303558'} from 'ACTIONS_MODULE6'\nexport {openShell as '40a8e259151ca50b8262db399be15b4f2e551bf8f7'} from 'ACTIONS_MODULE7'\nexport {openFolder as '40a1b0fe7dc36f6f9d9ceaf99110121e0dc5773e7c'} from 'ACTIONS_MODULE8'\nexport {deleteFeature as '40494c8554b691b7131291c73a4e9aca34c3080985'} from 'ACTIONS_MODULE9'\nexport {addRepository as '40a3e5c3534bd58b9c9d4ae8aa9bc421c5475a7941'} from 'ACTIONS_MODULE10'\nexport {deleteRepository as '408a3a1ebac2e7c597cc18471c18eab4945d5c39fb'} from 'ACTIONS_MODULE11'\nexport {getFeatureMetadata as '4023f8378dc36e9805403f4b8305441f6b65395b62'} from 'ACTIONS_MODULE12'\nexport {fetchGraphData as '00fba40567c65c19db7a15472a41bf98862a78a6f7'} from 'ACTIONS_MODULE13'\n"],"names":[],"mappings":"uCAAA,IAAA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,EAAA,CAAA,CAAA"}
@@ -1,3 +1,3 @@
1
- module.exports=[23956,a=>{"use strict";var b=a.i(12513),c=a.i(94691),d=a.i(33841),e=a.i(46646),f=a.i(68670),g=a.i(85321),h=a.i(84095),i=a.i(56799),j=a.i(80496),k=a.i(50845),l=a.i(49560),m=a.i(39353),n=a.i(29207),o=a.i(31075);a.s([],25128),a.i(25128),a.s(["004745af5f99a39044fd882d6da0f81b3fc3e07d6b",()=>o.fetchGraphData,"009878f66f161eb6b982122e598044c548a55be57d",()=>b.pickFolder,"4018b5e3de627b5924b180e9226481eae5192125c5",()=>j.openFolder,"40361fef913837f0051fc2affc921ff0c27b2b84f6",()=>n.getFeatureMetadata,"4040296efb65855962d3a47938bd2b4cfdd581dfec",()=>h.openIde,"4046bf2a295695131d6c4fdc8753910766208c1950",()=>k.deleteFeature,"40518fbc3bb4559750a8350be1450a3a857485f940",()=>i.openShell,"4061f0cbd061af373e89cc7f4f796e18172351c5e2",()=>e.deployRepository,"406c7f30aee074b62e41c41aabd72d89e7a3b9301a",()=>c.getDeploymentLogs,"407c9f6d19a2dacb8bacf5d10d204a6f71f865d495",()=>g.getDeploymentStatus,"4085d200b95dbed12616be23c09e0cc2c6ca7296a3",()=>d.deployFeature,"40a31e9984bb7740730612414bc393bcb05036649e",()=>m.deleteRepository,"40a7e1d45bdfdba16c36ff6ae6c0e11dba413d5e16",()=>l.addRepository,"40d46e1b19a94286678241ec8a587f0dd1ceaaa559",()=>f.stopDeployment],23956)}];
1
+ module.exports=[23956,a=>{"use strict";var b=a.i(12513),c=a.i(94691),d=a.i(33841),e=a.i(46646),f=a.i(68670),g=a.i(85321),h=a.i(84095),i=a.i(56799),j=a.i(80496),k=a.i(50845),l=a.i(49560),m=a.i(39353),n=a.i(29207),o=a.i(31075);a.s([],25128),a.i(25128),a.s(["00674dd0dafaf02891c8878928ec1353c0707222fd",()=>b.pickFolder,"00fba40567c65c19db7a15472a41bf98862a78a6f7",()=>o.fetchGraphData,"4023f8378dc36e9805403f4b8305441f6b65395b62",()=>n.getFeatureMetadata,"404316d0ec453ab565abb5b64112bea64575c5626f",()=>c.getDeploymentLogs,"40494c8554b691b7131291c73a4e9aca34c3080985",()=>k.deleteFeature,"4049881a2bdf6439f9f2958a76ae17589f6f87c531",()=>e.deployRepository,"404f29e645a841edb42fba76130b59034ed92eb427",()=>g.getDeploymentStatus,"4058652c6ec530ea4f12f84f5793b4b37703303558",()=>h.openIde,"408a3a1ebac2e7c597cc18471c18eab4945d5c39fb",()=>m.deleteRepository,"40a1b0fe7dc36f6f9d9ceaf99110121e0dc5773e7c",()=>j.openFolder,"40a3e5c3534bd58b9c9d4ae8aa9bc421c5475a7941",()=>l.addRepository,"40a8e259151ca50b8262db399be15b4f2e551bf8f7",()=>i.openShell,"40e21e41f9619a660875636ebdb416b09916c8afe5",()=>d.deployFeature,"40fd87d38320467e32dfefd84c9787391f1c42d7a2",()=>f.stopDeployment],23956)}];
2
2
 
3
3
  //# sourceMappingURL=8ba4b_server_app_%28dashboard%29_repository_%5BrepositoryId%5D_page_actions_0a9251aa.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../../../src/presentation/web/.next-internal/server/app/%28dashboard%29/repository/%5BrepositoryId%5D/page/actions.js%20%28server%20actions%20loader%29"],"sourcesContent":["export {pickFolder as '009878f66f161eb6b982122e598044c548a55be57d'} from 'ACTIONS_MODULE0'\nexport {getDeploymentLogs as '406c7f30aee074b62e41c41aabd72d89e7a3b9301a'} from 'ACTIONS_MODULE1'\nexport {deployFeature as '4085d200b95dbed12616be23c09e0cc2c6ca7296a3'} from 'ACTIONS_MODULE2'\nexport {deployRepository as '4061f0cbd061af373e89cc7f4f796e18172351c5e2'} from 'ACTIONS_MODULE3'\nexport {stopDeployment as '40d46e1b19a94286678241ec8a587f0dd1ceaaa559'} from 'ACTIONS_MODULE4'\nexport {getDeploymentStatus as '407c9f6d19a2dacb8bacf5d10d204a6f71f865d495'} from 'ACTIONS_MODULE5'\nexport {openIde as '4040296efb65855962d3a47938bd2b4cfdd581dfec'} from 'ACTIONS_MODULE6'\nexport {openShell as '40518fbc3bb4559750a8350be1450a3a857485f940'} from 'ACTIONS_MODULE7'\nexport {openFolder as '4018b5e3de627b5924b180e9226481eae5192125c5'} from 'ACTIONS_MODULE8'\nexport {deleteFeature as '4046bf2a295695131d6c4fdc8753910766208c1950'} from 'ACTIONS_MODULE9'\nexport {addRepository as '40a7e1d45bdfdba16c36ff6ae6c0e11dba413d5e16'} from 'ACTIONS_MODULE10'\nexport {deleteRepository as '40a31e9984bb7740730612414bc393bcb05036649e'} from 'ACTIONS_MODULE11'\nexport {getFeatureMetadata as '40361fef913837f0051fc2affc921ff0c27b2b84f6'} from 'ACTIONS_MODULE12'\nexport {fetchGraphData as '004745af5f99a39044fd882d6da0f81b3fc3e07d6b'} from 'ACTIONS_MODULE13'\n"],"names":[],"mappings":"uCAAA,IAAA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,EAAA,CAAA,CAAA"}
1
+ {"version":3,"sources":["../../../../../../../src/presentation/web/.next-internal/server/app/%28dashboard%29/repository/%5BrepositoryId%5D/page/actions.js%20%28server%20actions%20loader%29"],"sourcesContent":["export {pickFolder as '00674dd0dafaf02891c8878928ec1353c0707222fd'} from 'ACTIONS_MODULE0'\nexport {getDeploymentLogs as '404316d0ec453ab565abb5b64112bea64575c5626f'} from 'ACTIONS_MODULE1'\nexport {deployFeature as '40e21e41f9619a660875636ebdb416b09916c8afe5'} from 'ACTIONS_MODULE2'\nexport {deployRepository as '4049881a2bdf6439f9f2958a76ae17589f6f87c531'} from 'ACTIONS_MODULE3'\nexport {stopDeployment as '40fd87d38320467e32dfefd84c9787391f1c42d7a2'} from 'ACTIONS_MODULE4'\nexport {getDeploymentStatus as '404f29e645a841edb42fba76130b59034ed92eb427'} from 'ACTIONS_MODULE5'\nexport {openIde as '4058652c6ec530ea4f12f84f5793b4b37703303558'} from 'ACTIONS_MODULE6'\nexport {openShell as '40a8e259151ca50b8262db399be15b4f2e551bf8f7'} from 'ACTIONS_MODULE7'\nexport {openFolder as '40a1b0fe7dc36f6f9d9ceaf99110121e0dc5773e7c'} from 'ACTIONS_MODULE8'\nexport {deleteFeature as '40494c8554b691b7131291c73a4e9aca34c3080985'} from 'ACTIONS_MODULE9'\nexport {addRepository as '40a3e5c3534bd58b9c9d4ae8aa9bc421c5475a7941'} from 'ACTIONS_MODULE10'\nexport {deleteRepository as '408a3a1ebac2e7c597cc18471c18eab4945d5c39fb'} from 'ACTIONS_MODULE11'\nexport {getFeatureMetadata as '4023f8378dc36e9805403f4b8305441f6b65395b62'} from 'ACTIONS_MODULE12'\nexport {fetchGraphData as '00fba40567c65c19db7a15472a41bf98862a78a6f7'} from 'ACTIONS_MODULE13'\n"],"names":[],"mappings":"uCAAA,IAAA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,EAAA,CAAA,CAAA"}
@@ -1,4 +1,4 @@
1
1
  module.exports=[92658,(a,b,c)=>{"use strict";Object.defineProperty(c,"__esModule",{value:!0}),Object.defineProperty(c,"registerServerReference",{enumerable:!0,get:function(){return d.registerServerReference}});let d=a.r(28478)},12581,(a,b,c)=>{"use strict";function d(a){for(let b=0;b<a.length;b++){let c=a[b];if("function"!=typeof c)throw Object.defineProperty(Error(`A "use server" file can only export async functions, found ${typeof c}.
2
- Read more: https://nextjs.org/docs/messages/invalid-use-server-value`),"__NEXT_ERROR_CODE",{value:"E352",enumerable:!1,configurable:!0})}}Object.defineProperty(c,"__esModule",{value:!0}),Object.defineProperty(c,"ensureServerEntryExports",{enumerable:!0,get:function(){return d}})},74533,(a,b,c)=>{b.exports=a.x("node:child_process",()=>require("node:child_process"))},12513,a=>{"use strict";var b=a.i(92658),c=a.i(74533);let d={platform:process.platform,exec:(a,b)=>(0,c.execSync)(a,b)},e={darwin:"osascript -e 'POSIX path of (choose folder with prompt \"Select a repository folder\")'",linux:'zenity --file-selection --directory --title="Select a repository folder" 2>/dev/null',win32:"powershell -NoProfile -Command \"Add-Type -AssemblyName System.Windows.Forms; $f = New-Object System.Windows.Forms.FolderBrowserDialog; $f.Description = 'Select a repository folder'; if ($f.ShowDialog() -eq 'OK') { $f.SelectedPath } else { exit 1 }\""};class f{deps;constructor(a={}){this.deps={...d,...a}}getCommand(){return e[this.deps.platform]??null}pickFolder(){let a=this.getCommand();if(!a)throw Error(`Unsupported platform: ${this.deps.platform}`);try{let b=this.deps.exec(a,{encoding:"utf-8",timeout:6e4}).trim();return b.length>0?b:null}catch(a){var b;if("object"==typeof(b=a)&&null!==b&&"status"in b&&1===a.status)return null;throw a}}}async function g(){let a=new f;try{return{path:a.pickFolder()}}catch(a){return{path:null,error:a instanceof Error?a.message:"Failed to open folder dialog"}}}(0,a.i(12581).ensureServerEntryExports)([g]),(0,b.registerServerReference)(g,"009878f66f161eb6b982122e598044c548a55be57d",null),a.s(["pickFolder",()=>g],12513)},66973,a=>{"use strict";var b=a.i(12513);a.s([],65794),a.i(65794),a.s(["009878f66f161eb6b982122e598044c548a55be57d",()=>b.pickFolder],66973)}];
2
+ Read more: https://nextjs.org/docs/messages/invalid-use-server-value`),"__NEXT_ERROR_CODE",{value:"E352",enumerable:!1,configurable:!0})}}Object.defineProperty(c,"__esModule",{value:!0}),Object.defineProperty(c,"ensureServerEntryExports",{enumerable:!0,get:function(){return d}})},74533,(a,b,c)=>{b.exports=a.x("node:child_process",()=>require("node:child_process"))},12513,a=>{"use strict";var b=a.i(92658),c=a.i(74533);let d={platform:process.platform,exec:(a,b)=>(0,c.execSync)(a,b)},e={darwin:"osascript -e 'POSIX path of (choose folder with prompt \"Select a repository folder\")'",linux:'zenity --file-selection --directory --title="Select a repository folder" 2>/dev/null',win32:"powershell -NoProfile -Command \"Add-Type -AssemblyName System.Windows.Forms; $f = New-Object System.Windows.Forms.FolderBrowserDialog; $f.Description = 'Select a repository folder'; if ($f.ShowDialog() -eq 'OK') { $f.SelectedPath } else { exit 1 }\""};class f{deps;constructor(a={}){this.deps={...d,...a}}getCommand(){return e[this.deps.platform]??null}pickFolder(){let a=this.getCommand();if(!a)throw Error(`Unsupported platform: ${this.deps.platform}`);try{let b=this.deps.exec(a,{encoding:"utf-8",timeout:6e4}).trim();return b.length>0?b:null}catch(a){var b;if("object"==typeof(b=a)&&null!==b&&"status"in b&&1===a.status)return null;throw a}}}async function g(){let a=new f;try{return{path:a.pickFolder()}}catch(a){return{path:null,error:a instanceof Error?a.message:"Failed to open folder dialog"}}}(0,a.i(12581).ensureServerEntryExports)([g]),(0,b.registerServerReference)(g,"00674dd0dafaf02891c8878928ec1353c0707222fd",null),a.s(["pickFolder",()=>g],12513)},66973,a=>{"use strict";var b=a.i(12513);a.s([],65794),a.i(65794),a.s(["00674dd0dafaf02891c8878928ec1353c0707222fd",()=>b.pickFolder],66973)}];
3
3
 
4
4
  //# sourceMappingURL=%5Broot-of-the-server%5D__11033878._.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../../../node_modules/.pnpm/next%4016.1.6_%40babel%2Bcore%407.29.0_%40playwright%2Btest%401.58.1_react-dom%4019.2.4_react%4019.2.4__react%4019.2.4/node_modules/next/src/build/webpack/loaders/next-flight-loader/server-reference.ts","../../../../../../../node_modules/.pnpm/next%4016.1.6_%40babel%2Bcore%407.29.0_%40playwright%2Btest%401.58.1_react-dom%4019.2.4_react%4019.2.4__react%4019.2.4/node_modules/next/src/build/webpack/loaders/next-flight-loader/action-validate.ts","../../../../../../../packages/core/src/infrastructure/services/folder-dialog.service.ts","../../../../../../../src/presentation/web/app/actions/pick-folder.ts","../../../../../../../src/presentation/web/.next-internal/server/app/_not-found/page/actions.js%20%28server%20actions%20loader%29"],"sourcesContent":["/* eslint-disable import/no-extraneous-dependencies */\nexport { registerServerReference } from 'react-server-dom-webpack/server'\n","// This function ensures that all the exported values are valid server actions,\n// during the runtime. By definition all actions are required to be async\n// functions, but here we can only check that they are functions.\nexport function ensureServerEntryExports(actions: any[]) {\n for (let i = 0; i < actions.length; i++) {\n const action = actions[i]\n if (typeof action !== 'function') {\n throw new Error(\n `A \"use server\" file can only export async functions, found ${typeof action}.\\nRead more: https://nextjs.org/docs/messages/invalid-use-server-value`\n )\n }\n }\n}\n","import { execSync } from 'node:child_process';\n\nexport interface FolderDialogDeps {\n platform: NodeJS.Platform;\n exec: (cmd: string, opts?: { encoding: BufferEncoding; timeout?: number }) => string;\n}\n\nconst defaultDeps: FolderDialogDeps = {\n platform: process.platform,\n exec: (cmd, opts) => execSync(cmd, opts) as unknown as string,\n};\n\n/**\n * Platform-specific commands that open a native OS folder picker dialog.\n * Each returns the chosen absolute folder path on stdout, or exits non-zero / returns empty on cancel.\n */\nconst PLATFORM_COMMANDS: Record<string, string> = {\n darwin: `osascript -e 'POSIX path of (choose folder with prompt \"Select a repository folder\")'`,\n linux: `zenity --file-selection --directory --title=\"Select a repository folder\" 2>/dev/null`,\n win32: `powershell -NoProfile -Command \"Add-Type -AssemblyName System.Windows.Forms; $f = New-Object System.Windows.Forms.FolderBrowserDialog; $f.Description = 'Select a repository folder'; if ($f.ShowDialog() -eq 'OK') { $f.SelectedPath } else { exit 1 }\"`,\n};\n\nexport class FolderDialogService {\n private deps: FolderDialogDeps;\n\n constructor(deps: Partial<FolderDialogDeps> = {}) {\n this.deps = { ...defaultDeps, ...deps };\n }\n\n /** Returns the OS-specific command string, or null if the platform is unsupported. */\n getCommand(): string | null {\n return PLATFORM_COMMANDS[this.deps.platform] ?? null;\n }\n\n /**\n * Opens a native folder picker dialog and returns the selected absolute path.\n * Returns `null` if the user cancels the dialog.\n * Throws if the platform is unsupported or the command fails unexpectedly.\n */\n pickFolder(): string | null {\n const command = this.getCommand();\n if (!command) {\n throw new Error(`Unsupported platform: ${this.deps.platform}`);\n }\n\n try {\n const result = this.deps.exec(command, { encoding: 'utf-8', timeout: 60_000 });\n const trimmed = result.trim();\n return trimmed.length > 0 ? trimmed : null;\n } catch (error: unknown) {\n // User cancelled the dialog — exit code 1 from osascript/zenity/powershell\n if (isExecError(error) && error.status === 1) {\n return null;\n }\n throw error;\n }\n }\n}\n\nfunction isExecError(error: unknown): error is { status: number } {\n return typeof error === 'object' && error !== null && 'status' in error;\n}\n","'use server';\n\nimport { FolderDialogService } from '@shepai/core/infrastructure/services/folder-dialog.service';\n\nexport async function pickFolder(): Promise<{ path: string | null; error?: string }> {\n const service = new FolderDialogService();\n\n try {\n const path = service.pickFolder();\n return { path };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : 'Failed to open folder dialog';\n return { path: null, error: message };\n }\n}\n","export {pickFolder as '009878f66f161eb6b982122e598044c548a55be57d'} from 'ACTIONS_MODULE0'\n"],"names":["registerServerReference","ensureServerEntryExports","actions","i","length","action","Error"],"mappings":"6CAAoD,OAAA,cAAA,CAAA,EAAA,aAAA,oCAC3CA,0BAAAA,qCAAAA,EAAAA,uBAAuB,YAAQ,CAAA,CAAA,IAAA,iCCEjC,SAASC,EAAyBC,CAAc,EACrD,IAAK,IAAIC,EAAI,EAAGA,EAAID,EAAQE,MAAM,CAAED,IAAK,CACvC,IAAME,EAASH,CAAO,CAACC,EAAE,CACzB,GAAsB,YAAlB,AAA8B,OAAvBE,EACT,MAAM,OAAA,cAEL,CAFK,AAAIC,MACR,CAAC,2DAA2D,EAAE,OAAOD,EAAO;AAAA,oEAAuE,CAAC,EADhJ,oBAAA,OAAA,mBAAA,gBAAA,CAEN,EAEJ,CACF,0EATgBJ,2BAAAA,qCAAAA,qICHhB,EAAA,EAAA,CAAA,CAAA,OAOA,IAAM,EAAgC,CACpC,SAAU,QAAQ,QAAQ,CAC1B,KAAM,CAAC,EAAK,IAAS,CAAA,EAAA,EAAA,QAAQ,AAAR,EAAS,EAAK,EACrC,EAMM,EAA4C,CAChD,OAAQ,CAAC,qFAAqF,CAAC,GAC/F,MAAO,CAAC,oFAAoF,CAAC,CAC7F,MAAO,CAAC,wPAAwP,CAAC,EACnQ,CAEO,OAAM,EACH,IAAuB,AAE/B,aAAY,EAAkC,CAAC,CAAC,CAAE,CAChD,IAAI,CAAC,IAAI,CAAG,CAAE,GAAG,CAAW,CAAE,GAAG,CAAI,AAAC,CACxC,CAGA,YAA4B,CAC1B,OAAO,CAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAI,IAClD,CAOA,YAA4B,CAC1B,IAAM,EAAU,IAAI,CAAC,UAAU,GAC/B,GAAI,CAAC,EACH,MAAM,AAAI,CADE,KACI,CAAC,sBAAsB,EAAE,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAA,CAAE,EAG/D,GAAI,CAEF,IAAM,EADS,AACC,IADG,CAAC,IAAI,CAAC,IAAI,CAAC,EAAS,CAAE,SAAU,QAAS,QAAS,GAAO,GACrD,IAAI,GAC3B,OAAO,EAAQ,MAAM,CAAG,EAAI,EAAU,IACxC,CAAE,MAAO,EAAgB,OAEvB,GAAI,AASgB,UAAjB,OADY,AACL,EATM,GAQa,CACa,OAAV,GAAkB,WAAY,GATnB,GAAG,CAApB,EAAM,MAAM,CACpC,OAAO,IAET,OAAM,CACR,CACF,CACF,CCrDO,eAAe,IACpB,IAAM,EAAU,IAAI,EAEpB,GAAI,CAEF,MAAO,CAAE,KADI,EAAQ,UAAU,EACjB,CAChB,CAAE,MAAO,EAAgB,CAEvB,MAAO,CAAE,KAAM,KAAM,MADL,CACY,YADK,MAAQ,EAAM,OAAO,CAAG,8BACrB,CACtC,CACF,0CAVsB,IAAA,CAAA,EAAA,EAAA,uBAAA,EAAA,EAAA,6CAAA,8DCJtB,IAAA,EAAA,EAAA,CAAA,CAAA","ignoreList":[0,1]}
1
+ {"version":3,"sources":["../../../../../../../node_modules/.pnpm/next%4016.1.6_%40babel%2Bcore%407.29.0_%40playwright%2Btest%401.58.1_react-dom%4019.2.4_react%4019.2.4__react%4019.2.4/node_modules/next/src/build/webpack/loaders/next-flight-loader/server-reference.ts","../../../../../../../node_modules/.pnpm/next%4016.1.6_%40babel%2Bcore%407.29.0_%40playwright%2Btest%401.58.1_react-dom%4019.2.4_react%4019.2.4__react%4019.2.4/node_modules/next/src/build/webpack/loaders/next-flight-loader/action-validate.ts","../../../../../../../packages/core/src/infrastructure/services/folder-dialog.service.ts","../../../../../../../src/presentation/web/app/actions/pick-folder.ts","../../../../../../../src/presentation/web/.next-internal/server/app/_not-found/page/actions.js%20%28server%20actions%20loader%29"],"sourcesContent":["/* eslint-disable import/no-extraneous-dependencies */\nexport { registerServerReference } from 'react-server-dom-webpack/server'\n","// This function ensures that all the exported values are valid server actions,\n// during the runtime. By definition all actions are required to be async\n// functions, but here we can only check that they are functions.\nexport function ensureServerEntryExports(actions: any[]) {\n for (let i = 0; i < actions.length; i++) {\n const action = actions[i]\n if (typeof action !== 'function') {\n throw new Error(\n `A \"use server\" file can only export async functions, found ${typeof action}.\\nRead more: https://nextjs.org/docs/messages/invalid-use-server-value`\n )\n }\n }\n}\n","import { execSync } from 'node:child_process';\n\nexport interface FolderDialogDeps {\n platform: NodeJS.Platform;\n exec: (cmd: string, opts?: { encoding: BufferEncoding; timeout?: number }) => string;\n}\n\nconst defaultDeps: FolderDialogDeps = {\n platform: process.platform,\n exec: (cmd, opts) => execSync(cmd, opts) as unknown as string,\n};\n\n/**\n * Platform-specific commands that open a native OS folder picker dialog.\n * Each returns the chosen absolute folder path on stdout, or exits non-zero / returns empty on cancel.\n */\nconst PLATFORM_COMMANDS: Record<string, string> = {\n darwin: `osascript -e 'POSIX path of (choose folder with prompt \"Select a repository folder\")'`,\n linux: `zenity --file-selection --directory --title=\"Select a repository folder\" 2>/dev/null`,\n win32: `powershell -NoProfile -Command \"Add-Type -AssemblyName System.Windows.Forms; $f = New-Object System.Windows.Forms.FolderBrowserDialog; $f.Description = 'Select a repository folder'; if ($f.ShowDialog() -eq 'OK') { $f.SelectedPath } else { exit 1 }\"`,\n};\n\nexport class FolderDialogService {\n private deps: FolderDialogDeps;\n\n constructor(deps: Partial<FolderDialogDeps> = {}) {\n this.deps = { ...defaultDeps, ...deps };\n }\n\n /** Returns the OS-specific command string, or null if the platform is unsupported. */\n getCommand(): string | null {\n return PLATFORM_COMMANDS[this.deps.platform] ?? null;\n }\n\n /**\n * Opens a native folder picker dialog and returns the selected absolute path.\n * Returns `null` if the user cancels the dialog.\n * Throws if the platform is unsupported or the command fails unexpectedly.\n */\n pickFolder(): string | null {\n const command = this.getCommand();\n if (!command) {\n throw new Error(`Unsupported platform: ${this.deps.platform}`);\n }\n\n try {\n const result = this.deps.exec(command, { encoding: 'utf-8', timeout: 60_000 });\n const trimmed = result.trim();\n return trimmed.length > 0 ? trimmed : null;\n } catch (error: unknown) {\n // User cancelled the dialog — exit code 1 from osascript/zenity/powershell\n if (isExecError(error) && error.status === 1) {\n return null;\n }\n throw error;\n }\n }\n}\n\nfunction isExecError(error: unknown): error is { status: number } {\n return typeof error === 'object' && error !== null && 'status' in error;\n}\n","'use server';\n\nimport { FolderDialogService } from '@shepai/core/infrastructure/services/folder-dialog.service';\n\nexport async function pickFolder(): Promise<{ path: string | null; error?: string }> {\n const service = new FolderDialogService();\n\n try {\n const path = service.pickFolder();\n return { path };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : 'Failed to open folder dialog';\n return { path: null, error: message };\n }\n}\n","export {pickFolder as '00674dd0dafaf02891c8878928ec1353c0707222fd'} from 'ACTIONS_MODULE0'\n"],"names":["registerServerReference","ensureServerEntryExports","actions","i","length","action","Error"],"mappings":"6CAAoD,OAAA,cAAA,CAAA,EAAA,aAAA,oCAC3CA,0BAAAA,qCAAAA,EAAAA,uBAAuB,YAAQ,CAAA,CAAA,IAAA,iCCEjC,SAASC,EAAyBC,CAAc,EACrD,IAAK,IAAIC,EAAI,EAAGA,EAAID,EAAQE,MAAM,CAAED,IAAK,CACvC,IAAME,EAASH,CAAO,CAACC,EAAE,CACzB,GAAsB,YAAlB,AAA8B,OAAvBE,EACT,MAAM,OAAA,cAEL,CAFK,AAAIC,MACR,CAAC,2DAA2D,EAAE,OAAOD,EAAO;AAAA,oEAAuE,CAAC,EADhJ,oBAAA,OAAA,mBAAA,gBAAA,CAEN,EAEJ,CACF,0EATgBJ,2BAAAA,qCAAAA,qICHhB,EAAA,EAAA,CAAA,CAAA,OAOA,IAAM,EAAgC,CACpC,SAAU,QAAQ,QAAQ,CAC1B,KAAM,CAAC,EAAK,IAAS,CAAA,EAAA,EAAA,QAAQ,AAAR,EAAS,EAAK,EACrC,EAMM,EAA4C,CAChD,OAAQ,CAAC,qFAAqF,CAAC,GAC/F,MAAO,CAAC,oFAAoF,CAAC,CAC7F,MAAO,CAAC,wPAAwP,CAAC,EACnQ,CAEO,OAAM,EACH,IAAuB,AAE/B,aAAY,EAAkC,CAAC,CAAC,CAAE,CAChD,IAAI,CAAC,IAAI,CAAG,CAAE,GAAG,CAAW,CAAE,GAAG,CAAI,AAAC,CACxC,CAGA,YAA4B,CAC1B,OAAO,CAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAI,IAClD,CAOA,YAA4B,CAC1B,IAAM,EAAU,IAAI,CAAC,UAAU,GAC/B,GAAI,CAAC,EACH,MAAM,AAAI,CADE,KACI,CAAC,sBAAsB,EAAE,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAA,CAAE,EAG/D,GAAI,CAEF,IAAM,EADS,AACC,IADG,CAAC,IAAI,CAAC,IAAI,CAAC,EAAS,CAAE,SAAU,QAAS,QAAS,GAAO,GACrD,IAAI,GAC3B,OAAO,EAAQ,MAAM,CAAG,EAAI,EAAU,IACxC,CAAE,MAAO,EAAgB,OAEvB,GAAI,AASgB,UAAjB,OADY,AACL,EATM,GAQa,CACa,OAAV,GAAkB,WAAY,GATnB,GAAG,CAApB,EAAM,MAAM,CACpC,OAAO,IAET,OAAM,CACR,CACF,CACF,CCrDO,eAAe,IACpB,IAAM,EAAU,IAAI,EAEpB,GAAI,CAEF,MAAO,CAAE,KADI,EAAQ,UAAU,EACjB,CAChB,CAAE,MAAO,EAAgB,CAEvB,MAAO,CAAE,KAAM,KAAM,MADL,CACY,YADK,MAAQ,EAAM,OAAO,CAAG,8BACrB,CACtC,CACF,0CAVsB,IAAA,CAAA,EAAA,EAAA,uBAAA,EAAA,EAAA,6CAAA,8DCJtB,IAAA,EAAA,EAAA,CAAA,CAAA","ignoreList":[0,1]}
@@ -1,3 +1,3 @@
1
- module.exports=[60526,(a,b,c)=>{b.exports=a.x("node:os",()=>require("node:os"))},93695,(a,b,c)=>{b.exports=a.x("next/dist/shared/lib/no-fallback-error.external.js",()=>require("next/dist/shared/lib/no-fallback-error.external.js"))},47407,a=>{a.n(a.i(5983))},59975,a=>{a.n(a.i(72884))},63754,a=>{a.n(a.i(39838))},27075,a=>{a.n(a.i(26048))},37458,a=>{a.n(a.i(72330))},32459,a=>{"use strict";a.s(["default",()=>b]);let b=(0,a.i(28478).registerClientReference)(function(){throw Error("Attempted to call the default export of [project]/src/presentation/web/components/features/version/version-page-client.tsx <module evaluation> from the server, but it's on the client. It's not possible to invoke a client function from the server, it can only be rendered as a Component or passed to props of a Client Component.")},"[project]/src/presentation/web/components/features/version/version-page-client.tsx <module evaluation>","default")},93933,a=>{"use strict";a.s(["default",()=>b]);let b=(0,a.i(28478).registerClientReference)(function(){throw Error("Attempted to call the default export of [project]/src/presentation/web/components/features/version/version-page-client.tsx from the server, but it's on the client. It's not possible to invoke a client function from the server, it can only be rendered as a Component or passed to props of a Client Component.")},"[project]/src/presentation/web/components/features/version/version-page-client.tsx","default")},67651,a=>{"use strict";a.i(32459);var b=a.i(93933);a.n(b)},77048,a=>{"use strict";var b=a.i(92807),c=a.i(60526),d=a.i(67651);function e(){let a={nodeVersion:process.version,platform:(0,c.platform)(),arch:(0,c.arch)()};return(0,b.jsx)(d.default,{versionInfo:{version:"1.78.0",name:"@shepai/cli",description:"Autonomous AI Native SDLC Platform - Automate the development cycle from idea to deploy"},systemInfo:a})}a.s(["default",()=>e],77048)}];
1
+ module.exports=[60526,(a,b,c)=>{b.exports=a.x("node:os",()=>require("node:os"))},93695,(a,b,c)=>{b.exports=a.x("next/dist/shared/lib/no-fallback-error.external.js",()=>require("next/dist/shared/lib/no-fallback-error.external.js"))},47407,a=>{a.n(a.i(5983))},59975,a=>{a.n(a.i(72884))},63754,a=>{a.n(a.i(39838))},27075,a=>{a.n(a.i(26048))},37458,a=>{a.n(a.i(72330))},32459,a=>{"use strict";a.s(["default",()=>b]);let b=(0,a.i(28478).registerClientReference)(function(){throw Error("Attempted to call the default export of [project]/src/presentation/web/components/features/version/version-page-client.tsx <module evaluation> from the server, but it's on the client. It's not possible to invoke a client function from the server, it can only be rendered as a Component or passed to props of a Client Component.")},"[project]/src/presentation/web/components/features/version/version-page-client.tsx <module evaluation>","default")},93933,a=>{"use strict";a.s(["default",()=>b]);let b=(0,a.i(28478).registerClientReference)(function(){throw Error("Attempted to call the default export of [project]/src/presentation/web/components/features/version/version-page-client.tsx from the server, but it's on the client. It's not possible to invoke a client function from the server, it can only be rendered as a Component or passed to props of a Client Component.")},"[project]/src/presentation/web/components/features/version/version-page-client.tsx","default")},67651,a=>{"use strict";a.i(32459);var b=a.i(93933);a.n(b)},77048,a=>{"use strict";var b=a.i(92807),c=a.i(60526),d=a.i(67651);function e(){let a={nodeVersion:process.version,platform:(0,c.platform)(),arch:(0,c.arch)()};return(0,b.jsx)(d.default,{versionInfo:{version:"1.78.1",name:"@shepai/cli",description:"Autonomous AI Native SDLC Platform - Automate the development cycle from idea to deploy"},systemInfo:a})}a.s(["default",()=>e],77048)}];
2
2
 
3
3
  //# sourceMappingURL=%5Broot-of-the-server%5D__357d99f9._.js.map