@shepai/cli 1.170.0-pr513.cff27cb → 1.171.0-pr527.e2ee839

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 (588) hide show
  1. package/apis/json-schema/ActionDispositionEntry.yaml +14 -0
  2. package/apis/json-schema/DependencyFinding.yaml +28 -0
  3. package/apis/json-schema/DependencyRiskType.yaml +11 -0
  4. package/apis/json-schema/DependencyRules.yaml +38 -0
  5. package/apis/json-schema/EffectivePolicySnapshot.yaml +24 -0
  6. package/apis/json-schema/Feature.yaml +5 -17
  7. package/apis/json-schema/ReleaseIntegrityCheck.yaml +22 -0
  8. package/apis/json-schema/ReleaseIntegrityCheckType.yaml +9 -0
  9. package/apis/json-schema/ReleaseIntegrityResult.yaml +16 -0
  10. package/apis/json-schema/ReleaseRules.yaml +21 -0
  11. package/apis/json-schema/SdlcLifecycle.yaml +0 -1
  12. package/apis/json-schema/SecurityActionCategory.yaml +10 -0
  13. package/apis/json-schema/SecurityActionDisposition.yaml +8 -0
  14. package/apis/json-schema/SecurityConfig.yaml +17 -0
  15. package/apis/json-schema/SecurityEvent.yaml +36 -0
  16. package/apis/json-schema/SecurityMode.yaml +8 -0
  17. package/apis/json-schema/SecurityPolicy.yaml +24 -0
  18. package/apis/json-schema/SecuritySeverity.yaml +9 -0
  19. package/apis/json-schema/Settings.yaml +3 -0
  20. package/apis/json-schema/WorkflowConfig.yaml +5 -10
  21. package/dist/packages/core/src/application/ports/output/agents/agent-executor.interface.d.ts +15 -1
  22. package/dist/packages/core/src/application/ports/output/agents/agent-executor.interface.d.ts.map +1 -1
  23. package/dist/packages/core/src/application/ports/output/agents/feature-agent-process.interface.d.ts +4 -2
  24. package/dist/packages/core/src/application/ports/output/agents/feature-agent-process.interface.d.ts.map +1 -1
  25. package/dist/packages/core/src/application/ports/output/repositories/security-event.repository.interface.d.ts +76 -0
  26. package/dist/packages/core/src/application/ports/output/repositories/security-event.repository.interface.d.ts.map +1 -0
  27. package/dist/packages/core/src/application/ports/output/repositories/security-event.repository.interface.js +11 -0
  28. package/dist/packages/core/src/application/ports/output/services/github-repository-service.interface.d.ts +38 -0
  29. package/dist/packages/core/src/application/ports/output/services/github-repository-service.interface.d.ts.map +1 -1
  30. package/dist/packages/core/src/application/ports/output/services/github-repository-service.interface.js +9 -0
  31. package/dist/packages/core/src/application/ports/output/services/security-policy-service.interface.d.ts +77 -0
  32. package/dist/packages/core/src/application/ports/output/services/security-policy-service.interface.d.ts.map +1 -0
  33. package/dist/packages/core/src/application/ports/output/services/security-policy-service.interface.js +13 -0
  34. package/dist/packages/core/src/application/ports/output/services/spec-initializer.interface.d.ts +14 -4
  35. package/dist/packages/core/src/application/ports/output/services/spec-initializer.interface.d.ts.map +1 -1
  36. package/dist/packages/core/src/application/use-cases/agents/approve-agent-run.use-case.d.ts.map +1 -1
  37. package/dist/packages/core/src/application/use-cases/agents/approve-agent-run.use-case.js +4 -2
  38. package/dist/packages/core/src/application/use-cases/agents/reject-agent-run.use-case.d.ts.map +1 -1
  39. package/dist/packages/core/src/application/use-cases/agents/reject-agent-run.use-case.js +4 -2
  40. package/dist/packages/core/src/application/use-cases/features/adopt-branch.use-case.d.ts.map +1 -1
  41. package/dist/packages/core/src/application/use-cases/features/adopt-branch.use-case.js +2 -3
  42. package/dist/packages/core/src/application/use-cases/features/check-and-unblock-features.use-case.d.ts.map +1 -1
  43. package/dist/packages/core/src/application/use-cases/features/check-and-unblock-features.use-case.js +4 -2
  44. package/dist/packages/core/src/application/use-cases/features/create/create-feature.use-case.d.ts.map +1 -1
  45. package/dist/packages/core/src/application/use-cases/features/create/create-feature.use-case.js +8 -18
  46. package/dist/packages/core/src/application/use-cases/features/create/types.d.ts +2 -3
  47. package/dist/packages/core/src/application/use-cases/features/create/types.d.ts.map +1 -1
  48. package/dist/packages/core/src/application/use-cases/features/delete-feature.use-case.d.ts.map +1 -1
  49. package/dist/packages/core/src/application/use-cases/features/delete-feature.use-case.js +0 -13
  50. package/dist/packages/core/src/application/use-cases/features/resume-feature.use-case.d.ts.map +1 -1
  51. package/dist/packages/core/src/application/use-cases/features/resume-feature.use-case.js +4 -2
  52. package/dist/packages/core/src/application/use-cases/features/start-feature.use-case.d.ts.map +1 -1
  53. package/dist/packages/core/src/application/use-cases/features/start-feature.use-case.js +5 -5
  54. package/dist/packages/core/src/application/use-cases/security/enforce-security.use-case.d.ts +71 -0
  55. package/dist/packages/core/src/application/use-cases/security/enforce-security.use-case.d.ts.map +1 -0
  56. package/dist/packages/core/src/application/use-cases/security/enforce-security.use-case.js +215 -0
  57. package/dist/packages/core/src/application/use-cases/security/evaluate-security-policy.use-case.d.ts +24 -0
  58. package/dist/packages/core/src/application/use-cases/security/evaluate-security-policy.use-case.d.ts.map +1 -0
  59. package/dist/packages/core/src/application/use-cases/security/evaluate-security-policy.use-case.js +56 -0
  60. package/dist/packages/core/src/application/use-cases/security/get-security-state.use-case.d.ts +36 -0
  61. package/dist/packages/core/src/application/use-cases/security/get-security-state.use-case.d.ts.map +1 -0
  62. package/dist/packages/core/src/application/use-cases/security/get-security-state.use-case.js +76 -0
  63. package/dist/packages/core/src/application/use-cases/security/record-security-event.use-case.d.ts +14 -0
  64. package/dist/packages/core/src/application/use-cases/security/record-security-event.use-case.d.ts.map +1 -0
  65. package/dist/packages/core/src/application/use-cases/security/record-security-event.use-case.js +46 -0
  66. package/dist/packages/core/src/application/use-cases/upgrade/upgrade-cli.use-case.d.ts +1 -0
  67. package/dist/packages/core/src/application/use-cases/upgrade/upgrade-cli.use-case.d.ts.map +1 -1
  68. package/dist/packages/core/src/application/use-cases/upgrade/upgrade-cli.use-case.js +59 -2
  69. package/dist/packages/core/src/domain/errors/security-violation.error.d.ts +15 -0
  70. package/dist/packages/core/src/domain/errors/security-violation.error.d.ts.map +1 -0
  71. package/dist/packages/core/src/domain/errors/security-violation.error.js +20 -0
  72. package/dist/packages/core/src/domain/factories/settings-defaults.factory.d.ts.map +1 -1
  73. package/dist/packages/core/src/domain/factories/settings-defaults.factory.js +6 -3
  74. package/dist/packages/core/src/domain/generated/output.d.ts +263 -22
  75. package/dist/packages/core/src/domain/generated/output.d.ts.map +1 -1
  76. package/dist/packages/core/src/domain/generated/output.js +43 -7
  77. package/dist/packages/core/src/domain/lifecycle-gates.d.ts +6 -21
  78. package/dist/packages/core/src/domain/lifecycle-gates.d.ts.map +1 -1
  79. package/dist/packages/core/src/domain/lifecycle-gates.js +6 -25
  80. package/dist/packages/core/src/infrastructure/di/container.d.ts.map +1 -1
  81. package/dist/packages/core/src/infrastructure/di/container.js +57 -5
  82. package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/feature.mapper.d.ts +1 -3
  83. package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/feature.mapper.d.ts.map +1 -1
  84. package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/feature.mapper.js +4 -10
  85. package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/security-event.mapper.d.ts +44 -0
  86. package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/security-event.mapper.d.ts.map +1 -0
  87. package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/security-event.mapper.js +55 -0
  88. package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/settings.mapper.d.ts +4 -2
  89. package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/settings.mapper.d.ts.map +1 -1
  90. package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/settings.mapper.js +16 -7
  91. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/053-add-security-settings-columns.d.ts +18 -0
  92. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/053-add-security-settings-columns.d.ts.map +1 -0
  93. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/053-add-security-settings-columns.js +31 -0
  94. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/054-create-security-events-table.d.ts +29 -0
  95. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/054-create-security-events-table.d.ts.map +1 -0
  96. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/054-create-security-events-table.js +53 -0
  97. package/dist/packages/core/src/infrastructure/repositories/sqlite-feature.repository.d.ts.map +1 -1
  98. package/dist/packages/core/src/infrastructure/repositories/sqlite-feature.repository.js +3 -5
  99. package/dist/packages/core/src/infrastructure/repositories/sqlite-security-event.repository.d.ts +24 -0
  100. package/dist/packages/core/src/infrastructure/repositories/sqlite-security-event.repository.d.ts.map +1 -0
  101. package/dist/packages/core/src/infrastructure/repositories/sqlite-security-event.repository.js +96 -0
  102. package/dist/packages/core/src/infrastructure/repositories/sqlite-settings.repository.d.ts.map +1 -1
  103. package/dist/packages/core/src/infrastructure/repositories/sqlite-settings.repository.js +15 -6
  104. package/dist/packages/core/src/infrastructure/services/agents/common/executors/claude-code-executor.service.d.ts +2 -0
  105. package/dist/packages/core/src/infrastructure/services/agents/common/executors/claude-code-executor.service.d.ts.map +1 -1
  106. package/dist/packages/core/src/infrastructure/services/agents/common/executors/claude-code-executor.service.js +12 -0
  107. package/dist/packages/core/src/infrastructure/services/agents/common/executors/security-constraint-validator.d.ts +22 -0
  108. package/dist/packages/core/src/infrastructure/services/agents/common/executors/security-constraint-validator.d.ts.map +1 -0
  109. package/dist/packages/core/src/infrastructure/services/agents/common/executors/security-constraint-validator.js +30 -0
  110. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/fast-feature-agent-graph.d.ts +10 -20
  111. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/fast-feature-agent-graph.d.ts.map +1 -1
  112. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/feature-agent-graph.d.ts +34 -68
  113. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/feature-agent-graph.d.ts.map +1 -1
  114. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/feature-agent-process.service.d.ts +4 -2
  115. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/feature-agent-process.service.d.ts.map +1 -1
  116. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/feature-agent-process.service.js +9 -3
  117. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/feature-agent-worker.d.ts +4 -2
  118. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/feature-agent-worker.d.ts.map +1 -1
  119. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/feature-agent-worker.js +39 -19
  120. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/lifecycle-context.d.ts.map +1 -1
  121. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/lifecycle-context.js +0 -1
  122. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/node-helpers.d.ts.map +1 -1
  123. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/node-helpers.js +19 -1
  124. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/security-pre-check.d.ts +45 -0
  125. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/security-pre-check.d.ts.map +1 -0
  126. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/security-pre-check.js +70 -0
  127. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/state.d.ts +4 -5
  128. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/state.d.ts.map +1 -1
  129. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/state.js +6 -13
  130. package/dist/packages/core/src/infrastructure/services/external/github-repository.service.d.ts +10 -1
  131. package/dist/packages/core/src/infrastructure/services/external/github-repository.service.d.ts.map +1 -1
  132. package/dist/packages/core/src/infrastructure/services/external/github-repository.service.js +101 -1
  133. package/dist/packages/core/src/infrastructure/services/security/dependency-risk-evaluator.d.ts +53 -0
  134. package/dist/packages/core/src/infrastructure/services/security/dependency-risk-evaluator.d.ts.map +1 -0
  135. package/dist/packages/core/src/infrastructure/services/security/dependency-risk-evaluator.js +241 -0
  136. package/dist/packages/core/src/infrastructure/services/security/release-integrity-evaluator.d.ts +44 -0
  137. package/dist/packages/core/src/infrastructure/services/security/release-integrity-evaluator.d.ts.map +1 -0
  138. package/dist/packages/core/src/infrastructure/services/security/release-integrity-evaluator.js +194 -0
  139. package/dist/packages/core/src/infrastructure/services/security/security-policy-file-reader.d.ts +28 -0
  140. package/dist/packages/core/src/infrastructure/services/security/security-policy-file-reader.d.ts.map +1 -0
  141. package/dist/packages/core/src/infrastructure/services/security/security-policy-file-reader.js +50 -0
  142. package/dist/packages/core/src/infrastructure/services/security/security-policy-validator.d.ts +26 -0
  143. package/dist/packages/core/src/infrastructure/services/security/security-policy-validator.d.ts.map +1 -0
  144. package/dist/packages/core/src/infrastructure/services/security/security-policy-validator.js +147 -0
  145. package/dist/packages/core/src/infrastructure/services/security/security-policy.service.d.ts +44 -0
  146. package/dist/packages/core/src/infrastructure/services/security/security-policy.service.d.ts.map +1 -0
  147. package/dist/packages/core/src/infrastructure/services/security/security-policy.service.js +174 -0
  148. package/dist/packages/core/src/infrastructure/services/spec/spec-initializer.service.d.ts +2 -1
  149. package/dist/packages/core/src/infrastructure/services/spec/spec-initializer.service.d.ts.map +1 -1
  150. package/dist/packages/core/src/infrastructure/services/spec/spec-initializer.service.js +65 -7
  151. package/dist/src/presentation/cli/commands/feat/index.d.ts.map +1 -1
  152. package/dist/src/presentation/cli/commands/feat/index.js +1 -5
  153. package/dist/src/presentation/cli/commands/feat/new.command.d.ts.map +1 -1
  154. package/dist/src/presentation/cli/commands/feat/new.command.js +5 -18
  155. package/dist/src/presentation/cli/commands/security.command.d.ts +16 -0
  156. package/dist/src/presentation/cli/commands/security.command.d.ts.map +1 -0
  157. package/dist/src/presentation/cli/commands/security.command.js +118 -0
  158. package/dist/src/presentation/cli/commands/upgrade.command.d.ts.map +1 -1
  159. package/dist/src/presentation/cli/commands/upgrade.command.js +68 -3
  160. package/dist/src/presentation/cli/index.js +2 -0
  161. package/dist/src/presentation/web/app/actions/create-feature.d.ts +2 -3
  162. package/dist/src/presentation/web/app/actions/create-feature.d.ts.map +1 -1
  163. package/dist/src/presentation/web/app/actions/create-feature.js +3 -3
  164. package/dist/src/presentation/web/app/actions/get-workflow-defaults.d.ts +1 -2
  165. package/dist/src/presentation/web/app/actions/get-workflow-defaults.d.ts.map +1 -1
  166. package/dist/src/presentation/web/app/actions/get-workflow-defaults.js +1 -2
  167. package/dist/src/presentation/web/app/actions/security.d.ts +28 -0
  168. package/dist/src/presentation/web/app/actions/security.d.ts.map +1 -0
  169. package/dist/src/presentation/web/app/actions/security.js +59 -0
  170. package/dist/src/presentation/web/app/api/agent-events/route.d.ts.map +1 -1
  171. package/dist/src/presentation/web/app/api/agent-events/route.js +0 -1
  172. package/dist/src/presentation/web/app/build-feature-node-data.d.ts.map +1 -1
  173. package/dist/src/presentation/web/app/build-feature-node-data.js +2 -4
  174. package/dist/src/presentation/web/app/build-graph-nodes.d.ts +3 -1
  175. package/dist/src/presentation/web/app/build-graph-nodes.d.ts.map +1 -1
  176. package/dist/src/presentation/web/app/build-graph-nodes.js +4 -4
  177. package/dist/src/presentation/web/components/common/control-center-drawer/drawer-view.d.ts +1 -1
  178. package/dist/src/presentation/web/components/common/control-center-drawer/drawer-view.d.ts.map +1 -1
  179. package/dist/src/presentation/web/components/common/control-center-drawer/drawer-view.js +0 -3
  180. package/dist/src/presentation/web/components/common/control-center-drawer/feature-drawer-client.d.ts.map +1 -1
  181. package/dist/src/presentation/web/components/common/control-center-drawer/feature-drawer-client.js +1 -65
  182. package/dist/src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.d.ts +2 -3
  183. package/dist/src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.d.ts.map +1 -1
  184. package/dist/src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.js +11 -15
  185. package/dist/src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.stories.d.ts.map +1 -1
  186. package/dist/src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.stories.js +1 -2
  187. package/dist/src/presentation/web/components/common/feature-drawer-tabs/feature-drawer-tabs.d.ts +1 -6
  188. package/dist/src/presentation/web/components/common/feature-drawer-tabs/feature-drawer-tabs.d.ts.map +1 -1
  189. package/dist/src/presentation/web/components/common/feature-drawer-tabs/feature-drawer-tabs.js +4 -16
  190. package/dist/src/presentation/web/components/common/feature-node/derive-feature-state.d.ts.map +1 -1
  191. package/dist/src/presentation/web/components/common/feature-node/derive-feature-state.js +0 -2
  192. package/dist/src/presentation/web/components/common/feature-node/feature-node-state-config.d.ts +4 -6
  193. package/dist/src/presentation/web/components/common/feature-node/feature-node-state-config.d.ts.map +1 -1
  194. package/dist/src/presentation/web/components/common/feature-node/feature-node-state-config.js +0 -12
  195. package/dist/src/presentation/web/components/common/feature-node/feature-node.d.ts.map +1 -1
  196. package/dist/src/presentation/web/components/common/feature-node/feature-node.js +3 -7
  197. package/dist/src/presentation/web/components/common/repository-node/repository-drawer.d.ts +3 -1
  198. package/dist/src/presentation/web/components/common/repository-node/repository-drawer.d.ts.map +1 -1
  199. package/dist/src/presentation/web/components/common/repository-node/repository-drawer.js +3 -2
  200. package/dist/src/presentation/web/components/common/repository-node/security-panel.d.ts +6 -0
  201. package/dist/src/presentation/web/components/common/repository-node/security-panel.d.ts.map +1 -0
  202. package/dist/src/presentation/web/components/common/repository-node/security-panel.js +29 -0
  203. package/dist/src/presentation/web/components/common/repository-node/security-panel.stories.d.ts +10 -0
  204. package/dist/src/presentation/web/components/common/repository-node/security-panel.stories.d.ts.map +1 -0
  205. package/dist/src/presentation/web/components/common/repository-node/security-panel.stories.js +53 -0
  206. package/dist/src/presentation/web/components/common/security-badge.d.ts +7 -0
  207. package/dist/src/presentation/web/components/common/security-badge.d.ts.map +1 -0
  208. package/dist/src/presentation/web/components/common/security-badge.js +30 -0
  209. package/dist/src/presentation/web/components/common/security-badge.stories.d.ts +12 -0
  210. package/dist/src/presentation/web/components/common/security-badge.stories.d.ts.map +1 -0
  211. package/dist/src/presentation/web/components/common/security-badge.stories.js +20 -0
  212. package/dist/src/presentation/web/components/features/settings/settings-page-client.d.ts.map +1 -1
  213. package/dist/src/presentation/web/components/features/settings/settings-page-client.js +22 -9
  214. package/dist/src/presentation/web/components/features/settings/supply-chain-security-settings-section.d.ts +6 -0
  215. package/dist/src/presentation/web/components/features/settings/supply-chain-security-settings-section.d.ts.map +1 -0
  216. package/dist/src/presentation/web/components/features/settings/supply-chain-security-settings-section.js +60 -0
  217. package/dist/src/presentation/web/components/features/settings/supply-chain-security-settings-section.stories.d.ts +14 -0
  218. package/dist/src/presentation/web/components/features/settings/supply-chain-security-settings-section.stories.d.ts.map +1 -0
  219. package/dist/src/presentation/web/components/features/settings/supply-chain-security-settings-section.stories.js +116 -0
  220. package/dist/src/presentation/web/components/features/settings/workflow-settings-section.stories.js +3 -3
  221. package/dist/translations/ar/cli.json +22 -24
  222. package/dist/translations/ar/web.json +45 -7
  223. package/dist/translations/de/cli.json +22 -24
  224. package/dist/translations/de/web.json +45 -7
  225. package/dist/translations/en/cli.json +22 -24
  226. package/dist/translations/en/web.json +45 -7
  227. package/dist/translations/es/cli.json +22 -24
  228. package/dist/translations/es/web.json +45 -7
  229. package/dist/translations/fr/cli.json +22 -24
  230. package/dist/translations/fr/web.json +45 -7
  231. package/dist/translations/he/cli.json +22 -24
  232. package/dist/translations/he/web.json +45 -7
  233. package/dist/translations/pt/cli.json +22 -24
  234. package/dist/translations/pt/web.json +45 -7
  235. package/dist/translations/ru/cli.json +22 -24
  236. package/dist/translations/ru/web.json +45 -7
  237. package/dist/tsconfig.build.tsbuildinfo +1 -1
  238. package/package.json +1 -1
  239. package/web/.next/BUILD_ID +1 -1
  240. package/web/.next/build-manifest.json +2 -2
  241. package/web/.next/fallback-build-manifest.json +2 -2
  242. package/web/.next/prerender-manifest.json +3 -3
  243. package/web/.next/required-server-files.js +2 -2
  244. package/web/.next/required-server-files.json +2 -2
  245. package/web/.next/server/app/(dashboard)/@drawer/adopt/page/server-reference-manifest.json +29 -29
  246. package/web/.next/server/app/(dashboard)/@drawer/adopt/page.js +2 -1
  247. package/web/.next/server/app/(dashboard)/@drawer/adopt/page.js.nft.json +1 -1
  248. package/web/.next/server/app/(dashboard)/@drawer/adopt/page_client-reference-manifest.js +1 -1
  249. package/web/.next/server/app/(dashboard)/@drawer/chat/page/server-reference-manifest.json +27 -27
  250. package/web/.next/server/app/(dashboard)/@drawer/chat/page.js +2 -1
  251. package/web/.next/server/app/(dashboard)/@drawer/chat/page.js.nft.json +1 -1
  252. package/web/.next/server/app/(dashboard)/@drawer/chat/page_client-reference-manifest.js +1 -1
  253. package/web/.next/server/app/(dashboard)/@drawer/create/page/server-reference-manifest.json +30 -30
  254. package/web/.next/server/app/(dashboard)/@drawer/create/page.js +2 -1
  255. package/web/.next/server/app/(dashboard)/@drawer/create/page.js.nft.json +1 -1
  256. package/web/.next/server/app/(dashboard)/@drawer/create/page_client-reference-manifest.js +1 -1
  257. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page/server-reference-manifest.json +76 -121
  258. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page.js +2 -2
  259. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page.js.nft.json +1 -1
  260. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page_client-reference-manifest.js +1 -1
  261. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page/server-reference-manifest.json +76 -121
  262. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js +2 -2
  263. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js.nft.json +1 -1
  264. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page_client-reference-manifest.js +1 -1
  265. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/[tab]/page/server-reference-manifest.json +28 -28
  266. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/[tab]/page.js +2 -1
  267. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/[tab]/page.js.nft.json +1 -1
  268. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/[tab]/page_client-reference-manifest.js +1 -1
  269. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page/server-reference-manifest.json +28 -28
  270. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js +2 -1
  271. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js.nft.json +1 -1
  272. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  273. package/web/.next/server/app/(dashboard)/chat/page/server-reference-manifest.json +27 -27
  274. package/web/.next/server/app/(dashboard)/chat/page.js +2 -1
  275. package/web/.next/server/app/(dashboard)/chat/page.js.nft.json +1 -1
  276. package/web/.next/server/app/(dashboard)/chat/page_client-reference-manifest.js +1 -1
  277. package/web/.next/server/app/(dashboard)/create/page/server-reference-manifest.json +30 -30
  278. package/web/.next/server/app/(dashboard)/create/page.js +2 -1
  279. package/web/.next/server/app/(dashboard)/create/page.js.nft.json +1 -1
  280. package/web/.next/server/app/(dashboard)/create/page_client-reference-manifest.js +1 -1
  281. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page/server-reference-manifest.json +76 -121
  282. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page.js +2 -2
  283. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page.js.nft.json +1 -1
  284. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page_client-reference-manifest.js +1 -1
  285. package/web/.next/server/app/(dashboard)/feature/[featureId]/page/server-reference-manifest.json +76 -121
  286. package/web/.next/server/app/(dashboard)/feature/[featureId]/page.js +2 -2
  287. package/web/.next/server/app/(dashboard)/feature/[featureId]/page.js.nft.json +1 -1
  288. package/web/.next/server/app/(dashboard)/feature/[featureId]/page_client-reference-manifest.js +1 -1
  289. package/web/.next/server/app/(dashboard)/page/server-reference-manifest.json +27 -27
  290. package/web/.next/server/app/(dashboard)/page.js +2 -1
  291. package/web/.next/server/app/(dashboard)/page.js.nft.json +1 -1
  292. package/web/.next/server/app/(dashboard)/page_client-reference-manifest.js +1 -1
  293. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/[tab]/page/server-reference-manifest.json +28 -28
  294. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/[tab]/page.js +2 -1
  295. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/[tab]/page.js.nft.json +1 -1
  296. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/[tab]/page_client-reference-manifest.js +1 -1
  297. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page/server-reference-manifest.json +28 -28
  298. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js +2 -1
  299. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js.nft.json +1 -1
  300. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  301. package/web/.next/server/app/_global-error.html +2 -2
  302. package/web/.next/server/app/_global-error.rsc +1 -1
  303. package/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  304. package/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  305. package/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  306. package/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  307. package/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  308. package/web/.next/server/app/_not-found/page/server-reference-manifest.json +6 -6
  309. package/web/.next/server/app/_not-found/page.js.nft.json +1 -1
  310. package/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  311. package/web/.next/server/app/api/attachments/preview/route.js.nft.json +1 -1
  312. package/web/.next/server/app/api/evidence/route.js.nft.json +1 -1
  313. package/web/.next/server/app/api/graph-data/route.js.nft.json +1 -1
  314. package/web/.next/server/app/api/interactive/chat/[featureId]/messages/route.js.nft.json +1 -1
  315. package/web/.next/server/app/api/sessions/route.js.nft.json +1 -1
  316. package/web/.next/server/app/api/sessions-batch/route.js.nft.json +1 -1
  317. package/web/.next/server/app/features/page/server-reference-manifest.json +6 -6
  318. package/web/.next/server/app/features/page.js.nft.json +1 -1
  319. package/web/.next/server/app/features/page_client-reference-manifest.js +1 -1
  320. package/web/.next/server/app/settings/page/server-reference-manifest.json +33 -18
  321. package/web/.next/server/app/settings/page.js +1 -1
  322. package/web/.next/server/app/settings/page.js.nft.json +1 -1
  323. package/web/.next/server/app/settings/page_client-reference-manifest.js +1 -1
  324. package/web/.next/server/app/skills/page/server-reference-manifest.json +13 -13
  325. package/web/.next/server/app/skills/page.js +2 -1
  326. package/web/.next/server/app/skills/page.js.nft.json +1 -1
  327. package/web/.next/server/app/skills/page_client-reference-manifest.js +1 -1
  328. package/web/.next/server/app/tools/page/server-reference-manifest.json +11 -11
  329. package/web/.next/server/app/tools/page.js +2 -1
  330. package/web/.next/server/app/tools/page.js.nft.json +1 -1
  331. package/web/.next/server/app/tools/page_client-reference-manifest.js +1 -1
  332. package/web/.next/server/app/version/page/server-reference-manifest.json +6 -6
  333. package/web/.next/server/app/version/page.js.nft.json +1 -1
  334. package/web/.next/server/app/version/page_client-reference-manifest.js +1 -1
  335. package/web/.next/server/chunks/403f9_next_dist_esm_build_templates_app-route_370c43b1.js +1 -1
  336. package/web/.next/server/chunks/403f9_next_dist_esm_build_templates_app-route_370c43b1.js.map +1 -1
  337. package/web/.next/server/chunks/403f9_next_dist_esm_build_templates_app-route_4d623b8e.js +1 -1
  338. package/web/.next/server/chunks/403f9_next_dist_esm_build_templates_app-route_4d623b8e.js.map +1 -1
  339. package/web/.next/server/chunks/[root-of-the-server]__a402b567._.js +1 -1
  340. package/web/.next/server/chunks/[root-of-the-server]__c78383b1._.js +1 -1
  341. package/web/.next/server/chunks/[root-of-the-server]__c78383b1._.js.map +1 -1
  342. package/web/.next/server/chunks/[root-of-the-server]__cd67a84c._.js +1 -1
  343. package/web/.next/server/chunks/[root-of-the-server]__cd67a84c._.js.map +1 -1
  344. package/web/.next/server/chunks/ssr/744ca_web__next-internal_server_app_(dashboard)_@drawer_adopt_page_actions_ad0071c9.js +3 -0
  345. package/web/.next/server/chunks/ssr/744ca_web__next-internal_server_app_(dashboard)_@drawer_adopt_page_actions_ad0071c9.js.map +1 -0
  346. package/web/.next/server/chunks/ssr/744ca_web__next-internal_server_app_(dashboard)_@drawer_chat_page_actions_90d98b2b.js +3 -0
  347. package/web/.next/server/chunks/ssr/744ca_web__next-internal_server_app_(dashboard)_@drawer_chat_page_actions_90d98b2b.js.map +1 -0
  348. package/web/.next/server/chunks/ssr/744ca_web__next-internal_server_app_(dashboard)_chat_page_actions_d3828105.js +3 -0
  349. package/web/.next/server/chunks/ssr/744ca_web__next-internal_server_app_(dashboard)_chat_page_actions_d3828105.js.map +1 -0
  350. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js +1 -1
  351. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js.map +1 -1
  352. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_feature-drawer-client_tsx_e9755fc8._.js +3 -3
  353. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_feature-drawer-client_tsx_e9755fc8._.js.map +1 -1
  354. package/web/.next/server/chunks/ssr/[root-of-the-server]__1f389e5d._.js +1 -1
  355. package/web/.next/server/chunks/ssr/[root-of-the-server]__1f389e5d._.js.map +1 -1
  356. package/web/.next/server/chunks/ssr/[root-of-the-server]__357d99f9._.js +1 -1
  357. package/web/.next/server/chunks/ssr/[root-of-the-server]__4ed9b909._.js +1 -1
  358. package/web/.next/server/chunks/ssr/[root-of-the-server]__51ec77a8._.js +3 -0
  359. package/web/.next/server/chunks/ssr/[root-of-the-server]__51ec77a8._.js.map +1 -0
  360. package/web/.next/server/chunks/ssr/[root-of-the-server]__540c615f._.js +4 -0
  361. package/web/.next/server/chunks/ssr/[root-of-the-server]__540c615f._.js.map +1 -0
  362. package/web/.next/server/chunks/ssr/[root-of-the-server]__66047a1b._.js +3 -0
  363. package/web/.next/server/chunks/ssr/[root-of-the-server]__66047a1b._.js.map +1 -0
  364. package/web/.next/server/chunks/ssr/[root-of-the-server]__684a868c._.js +1 -1
  365. package/web/.next/server/chunks/ssr/[root-of-the-server]__684a868c._.js.map +1 -1
  366. package/web/.next/server/chunks/ssr/[root-of-the-server]__69dd3217._.js +1 -1
  367. package/web/.next/server/chunks/ssr/[root-of-the-server]__69dd3217._.js.map +1 -1
  368. package/web/.next/server/chunks/ssr/[root-of-the-server]__6c7d3936._.js +1 -1
  369. package/web/.next/server/chunks/ssr/[root-of-the-server]__6c7d3936._.js.map +1 -1
  370. package/web/.next/server/chunks/ssr/[root-of-the-server]__9a9cb046._.js +3 -0
  371. package/web/.next/server/chunks/ssr/[root-of-the-server]__9a9cb046._.js.map +1 -0
  372. package/web/.next/server/chunks/ssr/[root-of-the-server]__a2d6c0ac._.js +4 -0
  373. package/web/.next/server/chunks/ssr/[root-of-the-server]__a2d6c0ac._.js.map +1 -0
  374. package/web/.next/server/chunks/ssr/[root-of-the-server]__a932cd3a._.js +3 -0
  375. package/web/.next/server/chunks/ssr/[root-of-the-server]__a932cd3a._.js.map +1 -0
  376. package/web/.next/server/chunks/ssr/[root-of-the-server]__aa72e794._.js +3 -0
  377. package/web/.next/server/chunks/ssr/[root-of-the-server]__aa72e794._.js.map +1 -0
  378. package/web/.next/server/chunks/ssr/[root-of-the-server]__b7b96453._.js +1 -1
  379. package/web/.next/server/chunks/ssr/[root-of-the-server]__b7b96453._.js.map +1 -1
  380. package/web/.next/server/chunks/ssr/[root-of-the-server]__c1262d08._.js +1 -1
  381. package/web/.next/server/chunks/ssr/[root-of-the-server]__c16bf5de._.js +1 -1
  382. package/web/.next/server/chunks/ssr/[root-of-the-server]__c16bf5de._.js.map +1 -1
  383. package/web/.next/server/chunks/ssr/_02580450._.js +3 -0
  384. package/web/.next/server/chunks/ssr/_02580450._.js.map +1 -0
  385. package/web/.next/server/chunks/ssr/_05c23ad9._.js +1 -1
  386. package/web/.next/server/chunks/ssr/_05c23ad9._.js.map +1 -1
  387. package/web/.next/server/chunks/ssr/_1594e369._.js +9 -0
  388. package/web/.next/server/chunks/ssr/_1594e369._.js.map +1 -0
  389. package/web/.next/server/chunks/ssr/_16eb4fec._.js +1 -1
  390. package/web/.next/server/chunks/ssr/_16eb4fec._.js.map +1 -1
  391. package/web/.next/server/chunks/ssr/_21d37090._.js +3 -0
  392. package/web/.next/server/chunks/ssr/_21d37090._.js.map +1 -0
  393. package/web/.next/server/chunks/ssr/_45496654._.js +1 -1
  394. package/web/.next/server/chunks/ssr/_45496654._.js.map +1 -1
  395. package/web/.next/server/chunks/ssr/_4cbb7f95._.js +1 -1
  396. package/web/.next/server/chunks/ssr/_4cbb7f95._.js.map +1 -1
  397. package/web/.next/server/chunks/ssr/_5119a3df._.js +1 -1
  398. package/web/.next/server/chunks/ssr/_5119a3df._.js.map +1 -1
  399. package/web/.next/server/chunks/ssr/_56b9d60f._.js +1 -1
  400. package/web/.next/server/chunks/ssr/_56b9d60f._.js.map +1 -1
  401. package/web/.next/server/chunks/ssr/{_0fd635d7._.js → _767748d2._.js} +2 -2
  402. package/web/.next/server/chunks/ssr/_767748d2._.js.map +1 -0
  403. package/web/.next/server/chunks/ssr/_df737cce._.js +1 -1
  404. package/web/.next/server/chunks/ssr/{_34d897da._.js → _ee42a212._.js} +2 -2
  405. package/web/.next/server/chunks/ssr/{_34d897da._.js.map → _ee42a212._.js.map} +1 -1
  406. package/web/.next/server/chunks/ssr/_f8c55130._.js +4 -0
  407. package/web/.next/server/chunks/ssr/_f8c55130._.js.map +1 -0
  408. package/web/.next/server/chunks/ssr/_ff04802c._.js +3 -0
  409. package/web/.next/server/chunks/ssr/_ff04802c._.js.map +1 -0
  410. package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_settings_settings-page-client_tsx_6ed9d5f8._.js +1 -1
  411. package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_settings_settings-page-client_tsx_6ed9d5f8._.js.map +1 -1
  412. package/web/.next/server/chunks/ssr/f3a1f_components_common_control-center-drawer_repository-drawer-client_tsx_39a00c03._.js +1 -1
  413. package/web/.next/server/chunks/ssr/f3a1f_components_common_control-center-drawer_repository-drawer-client_tsx_39a00c03._.js.map +1 -1
  414. package/web/.next/server/chunks/ssr/src_presentation_web_17d39233._.js +3 -0
  415. package/web/.next/server/chunks/ssr/src_presentation_web_17d39233._.js.map +1 -0
  416. package/web/.next/server/chunks/ssr/src_presentation_web_54b02639._.js +5 -0
  417. package/web/.next/server/chunks/ssr/src_presentation_web_54b02639._.js.map +1 -0
  418. package/web/.next/server/chunks/ssr/src_presentation_web_7b7b9e3b._.js +5 -0
  419. package/web/.next/server/chunks/ssr/src_presentation_web_7b7b9e3b._.js.map +1 -0
  420. package/web/.next/server/chunks/ssr/src_presentation_web_807cba76._.js +3 -0
  421. package/web/.next/server/chunks/ssr/src_presentation_web_807cba76._.js.map +1 -0
  422. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_90b5e66e.js +3 -0
  423. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_90b5e66e.js.map +1 -0
  424. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_skills_page_actions_4ce30db7.js +3 -0
  425. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_skills_page_actions_4ce30db7.js.map +1 -0
  426. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_tools_page_actions_e4032193.js +3 -0
  427. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_tools_page_actions_e4032193.js.map +1 -0
  428. package/web/.next/server/chunks/ssr/src_presentation_web_app_actions_open-ide_ts_baaca5d5._.js +1 -1
  429. package/web/.next/server/chunks/ssr/src_presentation_web_ca99d62d._.js +1 -1
  430. package/web/.next/server/chunks/ssr/src_presentation_web_ca99d62d._.js.map +1 -1
  431. package/web/.next/server/chunks/ssr/src_presentation_web_components_895e5bfa._.js +1 -1
  432. package/web/.next/server/chunks/ssr/src_presentation_web_components_895e5bfa._.js.map +1 -1
  433. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js +1 -1
  434. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js.map +1 -1
  435. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_skills_8a174cac._.js +1 -1
  436. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_skills_8a174cac._.js.map +1 -1
  437. package/web/.next/server/chunks/ssr/src_presentation_web_db9fa0c2._.js +1 -1
  438. package/web/.next/server/chunks/ssr/src_presentation_web_db9fa0c2._.js.map +1 -1
  439. package/web/.next/server/chunks/ssr/src_presentation_web_e1cd1869._.js +3 -0
  440. package/web/.next/server/chunks/ssr/src_presentation_web_e1cd1869._.js.map +1 -0
  441. package/web/.next/server/chunks/ssr/src_presentation_web_e3a30e30._.js +3 -0
  442. package/web/.next/server/chunks/ssr/src_presentation_web_e3a30e30._.js.map +1 -0
  443. package/web/.next/server/chunks/ssr/translations_23dd5e7e._.js +1 -1
  444. package/web/.next/server/chunks/ssr/translations_23dd5e7e._.js.map +1 -1
  445. package/web/.next/server/pages/500.html +2 -2
  446. package/web/.next/server/server-reference-manifest.js +1 -1
  447. package/web/.next/server/server-reference-manifest.json +226 -319
  448. package/web/.next/static/chunks/051873309d87fb45.css +1 -0
  449. package/web/.next/static/chunks/{52681a7f14138e48.js → 16fa4d3877c28fe2.js} +1 -1
  450. package/web/.next/static/chunks/23d80bb760e7dc4c.js +1 -0
  451. package/web/.next/static/chunks/30a0ba9015f94405.js +7 -0
  452. package/web/.next/static/chunks/{0f30a983f3467cd5.js → 39f6ad3f9005703a.js} +1 -1
  453. package/web/.next/static/chunks/3aba9d2242420cb5.js +1 -0
  454. package/web/.next/static/chunks/{d5bf9c963b5346e1.js → 7a6f56f37aaa17ea.js} +1 -1
  455. package/web/.next/static/chunks/{09a25231e5fc1ab8.js → 7e05e7e25220ee9a.js} +1 -1
  456. package/web/.next/static/chunks/{4219ddfde68a6d0b.js → 89dd90bf14488ec0.js} +1 -1
  457. package/web/.next/static/chunks/{e93ae5725b0babeb.js → 9374d251360e808b.js} +1 -1
  458. package/web/.next/static/chunks/{fc595d95626ac9bb.js → 9423dc2310202fda.js} +1 -1
  459. package/web/.next/static/chunks/a794cf7a1a5648dd.js +1 -0
  460. package/web/.next/static/chunks/{37f9543560c58ea6.js → a8edb9423086e83f.js} +1 -1
  461. package/web/.next/static/chunks/ae81796726a9bba3.js +1 -0
  462. package/web/.next/static/chunks/{9a78b4c5dcd28196.js → b9c62932ed987239.js} +2 -2
  463. package/web/.next/static/chunks/{478adf5d5156f002.js → d1c3e0ee8e788c87.js} +1 -1
  464. package/web/.next/static/chunks/e8c3c12f92e9a521.js +5 -0
  465. package/web/.next/static/chunks/f3d5e0ae13def35a.js +1 -0
  466. package/web/.next/static/chunks/{2a9af061f4fbe7f5.js → fb8dadb64c0ffc6b.js} +1 -1
  467. package/web/.next/static/chunks/fd232b88b5b50b2e.js +1 -0
  468. package/apis/json-schema/FeatureMode.yaml +0 -8
  469. package/dist/packages/core/src/application/use-cases/features/promote/promote-exploration.use-case.d.ts +0 -40
  470. package/dist/packages/core/src/application/use-cases/features/promote/promote-exploration.use-case.d.ts.map +0 -1
  471. package/dist/packages/core/src/application/use-cases/features/promote/promote-exploration.use-case.js +0 -125
  472. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/051-replace-fast-with-mode.d.ts +0 -19
  473. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/051-replace-fast-with-mode.d.ts.map +0 -1
  474. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/051-replace-fast-with-mode.js +0 -46
  475. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/052-replace-default-fast-mode-with-default-mode.d.ts +0 -17
  476. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/052-replace-default-fast-mode-with-default-mode.d.ts.map +0 -1
  477. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/052-replace-default-fast-mode-with-default-mode.js +0 -37
  478. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/053-add-exploration-max-iterations.d.ts +0 -12
  479. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/053-add-exploration-max-iterations.d.ts.map +0 -1
  480. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/053-add-exploration-max-iterations.js +0 -17
  481. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/exploration-agent-graph.d.ts +0 -362
  482. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/exploration-agent-graph.d.ts.map +0 -1
  483. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/exploration-agent-graph.js +0 -72
  484. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/apply-feedback.node.d.ts +0 -18
  485. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/apply-feedback.node.d.ts.map +0 -1
  486. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/apply-feedback.node.js +0 -52
  487. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/prompts/apply-feedback.prompt.d.ts +0 -24
  488. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/prompts/apply-feedback.prompt.d.ts.map +0 -1
  489. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/prompts/apply-feedback.prompt.js +0 -38
  490. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/prompts/prototype-generate.prompt.d.ts +0 -31
  491. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/prompts/prototype-generate.prompt.d.ts.map +0 -1
  492. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/prompts/prototype-generate.prompt.js +0 -240
  493. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/prototype-generate.node.d.ts +0 -21
  494. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/prototype-generate.node.d.ts.map +0 -1
  495. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/prototype-generate.node.js +0 -134
  496. package/dist/src/presentation/cli/commands/feat/feedback.command.d.ts +0 -12
  497. package/dist/src/presentation/cli/commands/feat/feedback.command.d.ts.map +0 -1
  498. package/dist/src/presentation/cli/commands/feat/feedback.command.js +0 -64
  499. package/dist/src/presentation/cli/commands/feat/promote.command.d.ts +0 -13
  500. package/dist/src/presentation/cli/commands/feat/promote.command.d.ts.map +0 -1
  501. package/dist/src/presentation/cli/commands/feat/promote.command.js +0 -41
  502. package/dist/src/presentation/web/app/actions/discard-exploration.d.ts +0 -9
  503. package/dist/src/presentation/web/app/actions/discard-exploration.d.ts.map +0 -1
  504. package/dist/src/presentation/web/app/actions/discard-exploration.js +0 -29
  505. package/dist/src/presentation/web/app/actions/promote-exploration.d.ts +0 -11
  506. package/dist/src/presentation/web/app/actions/promote-exploration.d.ts.map +0 -1
  507. package/dist/src/presentation/web/app/actions/promote-exploration.js +0 -21
  508. package/dist/src/presentation/web/app/actions/submit-exploration-feedback.d.ts +0 -12
  509. package/dist/src/presentation/web/app/actions/submit-exploration-feedback.d.ts.map +0 -1
  510. package/dist/src/presentation/web/app/actions/submit-exploration-feedback.js +0 -40
  511. package/dist/src/presentation/web/components/common/feature-create-drawer/mode-selector.d.ts +0 -8
  512. package/dist/src/presentation/web/components/common/feature-create-drawer/mode-selector.d.ts.map +0 -1
  513. package/dist/src/presentation/web/components/common/feature-create-drawer/mode-selector.js +0 -33
  514. package/dist/src/presentation/web/components/common/feature-create-drawer/mode-selector.stories.d.ts +0 -10
  515. package/dist/src/presentation/web/components/common/feature-create-drawer/mode-selector.stories.d.ts.map +0 -1
  516. package/dist/src/presentation/web/components/common/feature-create-drawer/mode-selector.stories.js +0 -33
  517. package/dist/src/presentation/web/components/common/feature-drawer-tabs/prototype-tab.d.ts +0 -11
  518. package/dist/src/presentation/web/components/common/feature-drawer-tabs/prototype-tab.d.ts.map +0 -1
  519. package/dist/src/presentation/web/components/common/feature-drawer-tabs/prototype-tab.js +0 -34
  520. package/dist/src/presentation/web/components/common/feature-drawer-tabs/prototype-tab.stories.d.ts +0 -16
  521. package/dist/src/presentation/web/components/common/feature-drawer-tabs/prototype-tab.stories.d.ts.map +0 -1
  522. package/dist/src/presentation/web/components/common/feature-drawer-tabs/prototype-tab.stories.js +0 -70
  523. package/dist/src/presentation/web/components/ui/toggle-group.d.ts +0 -10
  524. package/dist/src/presentation/web/components/ui/toggle-group.d.ts.map +0 -1
  525. package/dist/src/presentation/web/components/ui/toggle-group.js +0 -22
  526. package/dist/src/presentation/web/components/ui/toggle.d.ts +0 -10
  527. package/dist/src/presentation/web/components/ui/toggle.d.ts.map +0 -1
  528. package/dist/src/presentation/web/components/ui/toggle.js +0 -26
  529. package/web/.next/server/chunks/ssr/[root-of-the-server]__03c66352._.js +0 -4
  530. package/web/.next/server/chunks/ssr/[root-of-the-server]__03c66352._.js.map +0 -1
  531. package/web/.next/server/chunks/ssr/[root-of-the-server]__1cd4327c._.js +0 -4
  532. package/web/.next/server/chunks/ssr/[root-of-the-server]__1cd4327c._.js.map +0 -1
  533. package/web/.next/server/chunks/ssr/[root-of-the-server]__403afc23._.js +0 -4
  534. package/web/.next/server/chunks/ssr/[root-of-the-server]__403afc23._.js.map +0 -1
  535. package/web/.next/server/chunks/ssr/[root-of-the-server]__92ffd5ee._.js +0 -4
  536. package/web/.next/server/chunks/ssr/[root-of-the-server]__92ffd5ee._.js.map +0 -1
  537. package/web/.next/server/chunks/ssr/[root-of-the-server]__b020c17d._.js +0 -4
  538. package/web/.next/server/chunks/ssr/[root-of-the-server]__b020c17d._.js.map +0 -1
  539. package/web/.next/server/chunks/ssr/[root-of-the-server]__df550e85._.js +0 -3
  540. package/web/.next/server/chunks/ssr/[root-of-the-server]__df550e85._.js.map +0 -1
  541. package/web/.next/server/chunks/ssr/[root-of-the-server]__df5602bf._.js +0 -4
  542. package/web/.next/server/chunks/ssr/[root-of-the-server]__df5602bf._.js.map +0 -1
  543. package/web/.next/server/chunks/ssr/[root-of-the-server]__e9f4767a._.js +0 -4
  544. package/web/.next/server/chunks/ssr/[root-of-the-server]__e9f4767a._.js.map +0 -1
  545. package/web/.next/server/chunks/ssr/_02e01240._.js +0 -4
  546. package/web/.next/server/chunks/ssr/_02e01240._.js.map +0 -1
  547. package/web/.next/server/chunks/ssr/_0fd635d7._.js.map +0 -1
  548. package/web/.next/server/chunks/ssr/_18886033._.js +0 -4
  549. package/web/.next/server/chunks/ssr/_18886033._.js.map +0 -1
  550. package/web/.next/server/chunks/ssr/_22e00a14._.js +0 -4
  551. package/web/.next/server/chunks/ssr/_22e00a14._.js.map +0 -1
  552. package/web/.next/server/chunks/ssr/_30ddea9d._.js +0 -9
  553. package/web/.next/server/chunks/ssr/_30ddea9d._.js.map +0 -1
  554. package/web/.next/server/chunks/ssr/_43ba79e7._.js +0 -3
  555. package/web/.next/server/chunks/ssr/_43ba79e7._.js.map +0 -1
  556. package/web/.next/server/chunks/ssr/_6e79a2cc._.js +0 -3
  557. package/web/.next/server/chunks/ssr/_6e79a2cc._.js.map +0 -1
  558. package/web/.next/server/chunks/ssr/_a5a5901d._.js +0 -4
  559. package/web/.next/server/chunks/ssr/_a5a5901d._.js.map +0 -1
  560. package/web/.next/server/chunks/ssr/_ad09f271._.js +0 -4
  561. package/web/.next/server/chunks/ssr/_ad09f271._.js.map +0 -1
  562. package/web/.next/server/chunks/ssr/_c3f595c6._.js +0 -4
  563. package/web/.next/server/chunks/ssr/_c3f595c6._.js.map +0 -1
  564. package/web/.next/server/chunks/ssr/_cac4abe6._.js +0 -3
  565. package/web/.next/server/chunks/ssr/_cac4abe6._.js.map +0 -1
  566. package/web/.next/server/chunks/ssr/_ea9e1556._.js +0 -4
  567. package/web/.next/server/chunks/ssr/_ea9e1556._.js.map +0 -1
  568. package/web/.next/server/chunks/ssr/_f1ba9be6._.js +0 -6
  569. package/web/.next/server/chunks/ssr/_f1ba9be6._.js.map +0 -1
  570. package/web/.next/server/chunks/ssr/_f33cd07e._.js +0 -6
  571. package/web/.next/server/chunks/ssr/_f33cd07e._.js.map +0 -1
  572. package/web/.next/server/chunks/ssr/_f8b45233._.js +0 -4
  573. package/web/.next/server/chunks/ssr/_f8b45233._.js.map +0 -1
  574. package/web/.next/server/chunks/ssr/src_presentation_web_app_actions_approve-feature_ts_9453ce8b._.js +0 -3
  575. package/web/.next/server/chunks/ssr/src_presentation_web_app_actions_approve-feature_ts_9453ce8b._.js.map +0 -1
  576. package/web/.next/static/chunks/0769c695d6b663c7.js +0 -1
  577. package/web/.next/static/chunks/2ceebcc839ee0d4b.js +0 -1
  578. package/web/.next/static/chunks/5743a9c1c63e5261.js +0 -5
  579. package/web/.next/static/chunks/5cf9745e2ef3837c.js +0 -1
  580. package/web/.next/static/chunks/5e20f692bbfcfb94.js +0 -7
  581. package/web/.next/static/chunks/8b0a9cb5109fe899.js +0 -1
  582. package/web/.next/static/chunks/c80e8e3d0cf5baa6.css +0 -1
  583. package/web/.next/static/chunks/d60cee2e7318f425.js +0 -1
  584. package/web/.next/static/chunks/da565c85277c2461.js +0 -1
  585. package/web/.next/static/chunks/fb89cf91c10b2e8b.js +0 -1
  586. /package/web/.next/static/{G895CgnbZl4YvWN_DaRC- → t6SUt71jyk_PYf152Imog}/_buildManifest.js +0 -0
  587. /package/web/.next/static/{G895CgnbZl4YvWN_DaRC- → t6SUt71jyk_PYf152Imog}/_clientMiddlewareManifest.json +0 -0
  588. /package/web/.next/static/{G895CgnbZl4YvWN_DaRC- → t6SUt71jyk_PYf152Imog}/_ssgManifest.js +0 -0
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../../../src/presentation/web/components/common/control-center-drawer/create-drawer-client.tsx","../../../../../../../src/presentation/web/app/actions/data%3A025f54%20%3Ctext/javascript%3E","../../../../../../../node_modules/.pnpm/%40radix-ui%2Breact-toggle%401.1.10_%40types%2Breact-dom%4019.2.3_%40types%2Breact%4019.2.10__%40types%2Breac_ac954931be38b8943a4772f30be6b8cd/node_modules/%40radix-ui/react-toggle/dist/index.mjs","../../../../../../../node_modules/.pnpm/%40radix-ui%2Breact-toggle-group%401.1.11_%40types%2Breact-dom%4019.2.3_%40types%2Breact%4019.2.10__%40type_1c3e06769648befb283f52b0de4ae8b0/node_modules/%40radix-ui/react-toggle-group/dist/index.mjs","../../../../../../../src/presentation/web/components/ui/toggle.tsx","../../../../../../../src/presentation/web/components/ui/toggle-group.tsx","../../../../../../../src/presentation/web/app/actions/data%3Adf6c76%20%3Ctext/javascript%3E","../../../../../../../src/presentation/web/components/common/feature-create-drawer/mode-selector.tsx","../../../../../../../src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.tsx"],"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 { RepositoryOption } 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 initialDescription?: string;\n features: ParentFeatureOption[];\n repositories?: RepositoryOption[];\n workflowDefaults?: WorkflowDefaults;\n currentAgentType?: string;\n currentModel?: string;\n canPushDirectly?: boolean;\n}\n\nexport function CreateDrawerClient({\n repositoryPath,\n initialParentId,\n initialDescription,\n features,\n repositories,\n workflowDefaults,\n currentAgentType,\n currentModel,\n canPushDirectly,\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 repositories={repositories}\n workflowDefaults={workflowDefaults}\n initialParentId={initialParentId}\n initialDescription={initialDescription}\n isSubmitting={isSubmitting}\n currentAgentType={currentAgentType}\n currentModel={currentModel}\n canPushDirectly={canPushDirectly}\n />\n );\n}\n","/* __next_internal_action_entry_do_not_use__ [{\"40370a7dd12efe6d81fbd551b123f1c23aac7d784a\":\"getViewerPermission\"},\"src/presentation/web/app/actions/get-viewer-permission.ts\",\"\"] */\"use turbopack no side effects\";import{createServerReference,callServer,findSourceMapURL}from\"private-next-rsc-action-client-wrapper\";const $$RSC_SERVER_ACTION_0=/*#__PURE__*/createServerReference(\"40370a7dd12efe6d81fbd551b123f1c23aac7d784a\",callServer,void 0,findSourceMapURL,\"getViewerPermission\");export{$$RSC_SERVER_ACTION_0 as getViewerPermission};","\"use client\";\n\n// src/toggle.tsx\nimport * as React from \"react\";\nimport { composeEventHandlers } from \"@radix-ui/primitive\";\nimport { useControllableState } from \"@radix-ui/react-use-controllable-state\";\nimport { Primitive } from \"@radix-ui/react-primitive\";\nimport { jsx } from \"react/jsx-runtime\";\nvar NAME = \"Toggle\";\nvar Toggle = React.forwardRef((props, forwardedRef) => {\n const { pressed: pressedProp, defaultPressed, onPressedChange, ...buttonProps } = props;\n const [pressed, setPressed] = useControllableState({\n prop: pressedProp,\n onChange: onPressedChange,\n defaultProp: defaultPressed ?? false,\n caller: NAME\n });\n return /* @__PURE__ */ jsx(\n Primitive.button,\n {\n type: \"button\",\n \"aria-pressed\": pressed,\n \"data-state\": pressed ? \"on\" : \"off\",\n \"data-disabled\": props.disabled ? \"\" : void 0,\n ...buttonProps,\n ref: forwardedRef,\n onClick: composeEventHandlers(props.onClick, () => {\n if (!props.disabled) {\n setPressed(!pressed);\n }\n })\n }\n );\n});\nToggle.displayName = NAME;\nvar Root = Toggle;\nexport {\n Root,\n Toggle\n};\n//# sourceMappingURL=index.mjs.map\n","\"use client\";\n\n// src/toggle-group.tsx\nimport React from \"react\";\nimport { createContextScope } from \"@radix-ui/react-context\";\nimport { Primitive } from \"@radix-ui/react-primitive\";\nimport * as RovingFocusGroup from \"@radix-ui/react-roving-focus\";\nimport { createRovingFocusGroupScope } from \"@radix-ui/react-roving-focus\";\nimport { Toggle } from \"@radix-ui/react-toggle\";\nimport { useControllableState } from \"@radix-ui/react-use-controllable-state\";\nimport { useDirection } from \"@radix-ui/react-direction\";\nimport { jsx } from \"react/jsx-runtime\";\nvar TOGGLE_GROUP_NAME = \"ToggleGroup\";\nvar [createToggleGroupContext, createToggleGroupScope] = createContextScope(TOGGLE_GROUP_NAME, [\n createRovingFocusGroupScope\n]);\nvar useRovingFocusGroupScope = createRovingFocusGroupScope();\nvar ToggleGroup = React.forwardRef((props, forwardedRef) => {\n const { type, ...toggleGroupProps } = props;\n if (type === \"single\") {\n const singleProps = toggleGroupProps;\n return /* @__PURE__ */ jsx(ToggleGroupImplSingle, { ...singleProps, ref: forwardedRef });\n }\n if (type === \"multiple\") {\n const multipleProps = toggleGroupProps;\n return /* @__PURE__ */ jsx(ToggleGroupImplMultiple, { ...multipleProps, ref: forwardedRef });\n }\n throw new Error(`Missing prop \\`type\\` expected on \\`${TOGGLE_GROUP_NAME}\\``);\n});\nToggleGroup.displayName = TOGGLE_GROUP_NAME;\nvar [ToggleGroupValueProvider, useToggleGroupValueContext] = createToggleGroupContext(TOGGLE_GROUP_NAME);\nvar ToggleGroupImplSingle = React.forwardRef((props, forwardedRef) => {\n const {\n value: valueProp,\n defaultValue,\n onValueChange = () => {\n },\n ...toggleGroupSingleProps\n } = props;\n const [value, setValue] = useControllableState({\n prop: valueProp,\n defaultProp: defaultValue ?? \"\",\n onChange: onValueChange,\n caller: TOGGLE_GROUP_NAME\n });\n return /* @__PURE__ */ jsx(\n ToggleGroupValueProvider,\n {\n scope: props.__scopeToggleGroup,\n type: \"single\",\n value: React.useMemo(() => value ? [value] : [], [value]),\n onItemActivate: setValue,\n onItemDeactivate: React.useCallback(() => setValue(\"\"), [setValue]),\n children: /* @__PURE__ */ jsx(ToggleGroupImpl, { ...toggleGroupSingleProps, ref: forwardedRef })\n }\n );\n});\nvar ToggleGroupImplMultiple = React.forwardRef((props, forwardedRef) => {\n const {\n value: valueProp,\n defaultValue,\n onValueChange = () => {\n },\n ...toggleGroupMultipleProps\n } = props;\n const [value, setValue] = useControllableState({\n prop: valueProp,\n defaultProp: defaultValue ?? [],\n onChange: onValueChange,\n caller: TOGGLE_GROUP_NAME\n });\n const handleButtonActivate = React.useCallback(\n (itemValue) => setValue((prevValue = []) => [...prevValue, itemValue]),\n [setValue]\n );\n const handleButtonDeactivate = React.useCallback(\n (itemValue) => setValue((prevValue = []) => prevValue.filter((value2) => value2 !== itemValue)),\n [setValue]\n );\n return /* @__PURE__ */ jsx(\n ToggleGroupValueProvider,\n {\n scope: props.__scopeToggleGroup,\n type: \"multiple\",\n value,\n onItemActivate: handleButtonActivate,\n onItemDeactivate: handleButtonDeactivate,\n children: /* @__PURE__ */ jsx(ToggleGroupImpl, { ...toggleGroupMultipleProps, ref: forwardedRef })\n }\n );\n});\nToggleGroup.displayName = TOGGLE_GROUP_NAME;\nvar [ToggleGroupContext, useToggleGroupContext] = createToggleGroupContext(TOGGLE_GROUP_NAME);\nvar ToggleGroupImpl = React.forwardRef(\n (props, forwardedRef) => {\n const {\n __scopeToggleGroup,\n disabled = false,\n rovingFocus = true,\n orientation,\n dir,\n loop = true,\n ...toggleGroupProps\n } = props;\n const rovingFocusGroupScope = useRovingFocusGroupScope(__scopeToggleGroup);\n const direction = useDirection(dir);\n const commonProps = { role: \"group\", dir: direction, ...toggleGroupProps };\n return /* @__PURE__ */ jsx(ToggleGroupContext, { scope: __scopeToggleGroup, rovingFocus, disabled, children: rovingFocus ? /* @__PURE__ */ jsx(\n RovingFocusGroup.Root,\n {\n asChild: true,\n ...rovingFocusGroupScope,\n orientation,\n dir: direction,\n loop,\n children: /* @__PURE__ */ jsx(Primitive.div, { ...commonProps, ref: forwardedRef })\n }\n ) : /* @__PURE__ */ jsx(Primitive.div, { ...commonProps, ref: forwardedRef }) });\n }\n);\nvar ITEM_NAME = \"ToggleGroupItem\";\nvar ToggleGroupItem = React.forwardRef(\n (props, forwardedRef) => {\n const valueContext = useToggleGroupValueContext(ITEM_NAME, props.__scopeToggleGroup);\n const context = useToggleGroupContext(ITEM_NAME, props.__scopeToggleGroup);\n const rovingFocusGroupScope = useRovingFocusGroupScope(props.__scopeToggleGroup);\n const pressed = valueContext.value.includes(props.value);\n const disabled = context.disabled || props.disabled;\n const commonProps = { ...props, pressed, disabled };\n const ref = React.useRef(null);\n return context.rovingFocus ? /* @__PURE__ */ jsx(\n RovingFocusGroup.Item,\n {\n asChild: true,\n ...rovingFocusGroupScope,\n focusable: !disabled,\n active: pressed,\n ref,\n children: /* @__PURE__ */ jsx(ToggleGroupItemImpl, { ...commonProps, ref: forwardedRef })\n }\n ) : /* @__PURE__ */ jsx(ToggleGroupItemImpl, { ...commonProps, ref: forwardedRef });\n }\n);\nToggleGroupItem.displayName = ITEM_NAME;\nvar ToggleGroupItemImpl = React.forwardRef(\n (props, forwardedRef) => {\n const { __scopeToggleGroup, value, ...itemProps } = props;\n const valueContext = useToggleGroupValueContext(ITEM_NAME, __scopeToggleGroup);\n const singleProps = { role: \"radio\", \"aria-checked\": props.pressed, \"aria-pressed\": void 0 };\n const typeProps = valueContext.type === \"single\" ? singleProps : void 0;\n return /* @__PURE__ */ jsx(\n Toggle,\n {\n ...typeProps,\n ...itemProps,\n ref: forwardedRef,\n onPressedChange: (pressed) => {\n if (pressed) {\n valueContext.onItemActivate(value);\n } else {\n valueContext.onItemDeactivate(value);\n }\n }\n }\n );\n }\n);\nvar Root2 = ToggleGroup;\nvar Item2 = ToggleGroupItem;\nexport {\n Item2 as Item,\n Root2 as Root,\n ToggleGroup,\n ToggleGroupItem,\n createToggleGroupScope\n};\n//# sourceMappingURL=index.mjs.map\n","'use client';\n\nimport * as React from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { Toggle as TogglePrimitive } from 'radix-ui';\n\nimport { cn } from '@/lib/utils';\n\nconst toggleVariants = cva(\n \"inline-flex items-center justify-center gap-2 rounded-md text-sm font-medium whitespace-nowrap transition-[color,box-shadow] outline-none hover:bg-muted hover:text-muted-foreground focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 disabled:pointer-events-none disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-destructive/20 data-[state=on]:bg-accent data-[state=on]:text-accent-foreground dark:aria-invalid:ring-destructive/40 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n {\n variants: {\n variant: {\n default: 'bg-transparent',\n outline:\n 'border border-input bg-transparent shadow-xs hover:bg-accent hover:text-accent-foreground',\n },\n size: {\n default: 'h-9 min-w-9 px-2',\n sm: 'h-8 min-w-8 px-1.5',\n lg: 'h-10 min-w-10 px-2.5',\n },\n },\n defaultVariants: {\n variant: 'default',\n size: 'default',\n },\n }\n);\n\nfunction Toggle({\n className,\n variant,\n size,\n ...props\n}: React.ComponentProps<typeof TogglePrimitive.Root> & VariantProps<typeof toggleVariants>) {\n return (\n <TogglePrimitive.Root\n data-slot=\"toggle\"\n className={cn(toggleVariants({ variant, size, className }))}\n {...props}\n />\n );\n}\n\nexport { Toggle, toggleVariants };\n","'use client';\n\nimport * as React from 'react';\nimport { type VariantProps } from 'class-variance-authority';\nimport { ToggleGroup as ToggleGroupPrimitive } from 'radix-ui';\n\nimport { cn } from '@/lib/utils';\nimport { toggleVariants } from '@/components/ui/toggle';\n\nconst ToggleGroupContext = React.createContext<\n VariantProps<typeof toggleVariants> & {\n spacing?: number;\n }\n>({\n size: 'default',\n variant: 'default',\n spacing: 0,\n});\n\nfunction ToggleGroup({\n className,\n variant,\n size,\n spacing = 0,\n children,\n ...props\n}: React.ComponentProps<typeof ToggleGroupPrimitive.Root> &\n VariantProps<typeof toggleVariants> & {\n spacing?: number;\n }) {\n return (\n <ToggleGroupPrimitive.Root\n data-slot=\"toggle-group\"\n data-variant={variant}\n data-size={size}\n data-spacing={spacing}\n style={{ '--gap': spacing } as React.CSSProperties}\n className={cn(\n 'group/toggle-group flex w-fit items-center gap-[--spacing(var(--gap))] rounded-md data-[spacing=default]:data-[variant=outline]:shadow-xs',\n className\n )}\n {...props}\n >\n <ToggleGroupContext.Provider value={{ variant, size, spacing }}>\n {children}\n </ToggleGroupContext.Provider>\n </ToggleGroupPrimitive.Root>\n );\n}\n\nfunction ToggleGroupItem({\n className,\n children,\n variant,\n size,\n ...props\n}: React.ComponentProps<typeof ToggleGroupPrimitive.Item> & VariantProps<typeof toggleVariants>) {\n const context = React.useContext(ToggleGroupContext);\n\n return (\n <ToggleGroupPrimitive.Item\n data-slot=\"toggle-group-item\"\n data-variant={context.variant ?? variant}\n data-size={context.size ?? size}\n data-spacing={context.spacing}\n className={cn(\n toggleVariants({\n variant: context.variant ?? variant,\n size: context.size ?? size,\n }),\n 'w-auto min-w-0 shrink-0 px-3 focus:z-10 focus-visible:z-10',\n 'data-[spacing=0]:rounded-none data-[spacing=0]:shadow-none data-[spacing=0]:first:rounded-l-md data-[spacing=0]:last:rounded-r-md data-[spacing=0]:data-[variant=outline]:border-l-0 data-[spacing=0]:data-[variant=outline]:first:border-l',\n className\n )}\n {...props}\n >\n {children}\n </ToggleGroupPrimitive.Item>\n );\n}\n\nexport { ToggleGroup, ToggleGroupItem };\n","/* __next_internal_action_entry_do_not_use__ [{\"40a2b97957d9585c08a96e0fae6a12b1e5bb83a643\":\"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(\"40a2b97957d9585c08a96e0fae6a12b1e5bb83a643\",callServer,void 0,findSourceMapURL,\"createFeature\");export{$$RSC_SERVER_ACTION_0 as createFeature};","'use client';\n\nimport { ClipboardList, Zap, FlaskConical } from 'lucide-react';\nimport { ToggleGroup, ToggleGroupItem } from '@/components/ui/toggle-group';\nimport { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from '@/components/ui/tooltip';\nimport { FeatureMode } from '@shepai/core/domain/generated/output';\n\nconst MODE_OPTIONS = [\n {\n value: FeatureMode.Regular,\n icon: ClipboardList,\n label: 'Regular',\n description: 'Full SDLC — requirements, research, planning, implementation, and review.',\n },\n {\n value: FeatureMode.Fast,\n icon: Zap,\n label: 'Fast',\n description: 'Direct implementation — skip SDLC phases, go straight to code.',\n },\n {\n value: FeatureMode.Exploration,\n icon: FlaskConical,\n label: 'Explore',\n description: 'Iterative prototyping — generate quick prototypes and iterate with feedback.',\n },\n] as const;\n\nexport interface ModeSelectorProps {\n value: FeatureMode;\n onChange: (mode: FeatureMode) => void;\n disabled?: boolean;\n}\n\nexport function ModeSelector({ value, onChange, disabled }: ModeSelectorProps) {\n return (\n <TooltipProvider delayDuration={300}>\n <ToggleGroup\n type=\"single\"\n variant=\"outline\"\n size=\"sm\"\n value={value}\n onValueChange={(v) => {\n // ToggleGroup emits empty string when clicking the already-selected item — ignore it\n if (v) onChange(v as FeatureMode);\n }}\n disabled={disabled}\n aria-label=\"Feature mode\"\n data-testid=\"mode-selector\"\n >\n {MODE_OPTIONS.map((opt) => (\n <Tooltip key={opt.value}>\n <TooltipTrigger asChild>\n <ToggleGroupItem\n value={opt.value}\n aria-label={opt.label}\n data-testid={`mode-option-${opt.value.toLowerCase()}`}\n className=\"data-[state=on]:bg-primary data-[state=on]:text-primary-foreground flex items-center gap-1 px-2 text-xs\"\n >\n <opt.icon className=\"h-3.5 w-3.5\" />\n {opt.label}\n </ToggleGroupItem>\n </TooltipTrigger>\n <TooltipContent side=\"bottom\">{opt.description}</TooltipContent>\n </Tooltip>\n ))}\n </ToggleGroup>\n </TooltipProvider>\n );\n}\n","'use client';\n\nimport { useState, useCallback, useEffect, useRef } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport {\n PaperclipIcon,\n ChevronsUpDown,\n CheckIcon,\n Clock,\n FolderPlus,\n Loader2,\n GitFork,\n FileText,\n Puzzle,\n RefreshCw,\n} from 'lucide-react';\nimport { cn } from '@/lib/utils';\nimport { useSoundAction } from '@/hooks/use-sound-action';\nimport { BaseDrawer } from '@/components/common/base-drawer';\nimport { DrawerTitle, DrawerDescription } from '@/components/ui/drawer';\nimport { Button } from '@/components/ui/button';\nimport { Input } from '@/components/ui/input';\nimport { Textarea } from '@/components/ui/textarea';\nimport { Label } from '@/components/ui/label';\nimport { Badge } from '@/components/ui/badge';\nimport { Popover, PopoverContent, PopoverTrigger } from '@/components/ui/popover';\nimport { Switch } from '@/components/ui/switch';\nimport { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from '@/components/ui/tooltip';\nimport { useGuardedDrawerClose } from '@/hooks/drawer-close-guard';\nimport { AttachmentChip } from '@/components/common/attachment-chip';\nimport type { WorkflowDefaults } from '@/app/actions/get-workflow-defaults';\nimport { getViewerPermission } from '@/app/actions/get-viewer-permission';\nimport { AgentModelPicker } from '@/components/features/settings/AgentModelPicker';\nimport { Separator } from '@/components/ui/separator';\nimport { pickFolder } from '@/components/common/add-repository-button/pick-folder';\nimport { ReactFileManagerDialog } from '@/components/common/react-file-manager-dialog';\nimport { useFeatureFlags } from '@/hooks/feature-flags-context';\nimport { FeatureMode } from '@shepai/core/domain/generated/output';\nimport { addRepository } from '@/app/actions/add-repository';\nimport { ModeSelector } from './mode-selector';\nimport { pickFiles } from './pick-files';\n\nexport type { FileAttachment } from '@shepai/core/infrastructure/services/file-dialog.service';\n\n/** Attachment record for the create form — supports both picker and upload sources. */\nexport interface FormAttachment {\n id: string;\n name: string;\n size: number;\n mimeType: string;\n path: string;\n loading?: boolean;\n /** Optional user notes or annotations for this image */\n notes?: string;\n}\n\n/** Minimal feature descriptor for the parent selector. */\nexport interface ParentFeatureOption {\n id: string;\n name: string;\n}\n\n/** Minimal repository descriptor for the repository selector. */\nexport interface RepositoryOption {\n id: string;\n name: string;\n path: string;\n}\n\nexport interface FeatureCreatePayload {\n description: string;\n attachments: FormAttachment[];\n repositoryPath: string;\n approvalGates: {\n allowPrd: boolean;\n allowPlan: boolean;\n allowMerge: boolean;\n };\n push: boolean;\n openPr: boolean;\n ciWatchEnabled: boolean;\n enableEvidence: boolean;\n commitEvidence: boolean;\n parentId?: string;\n /** Execution mode: Regular (full SDLC), Fast (direct implementation), or Exploration (iterative prototyping). */\n mode: FeatureMode;\n /** When true, create the feature in pending state (no agent spawned). */\n pending?: boolean;\n /** Fork repo and create PR to upstream at merge time. */\n forkAndPr: boolean;\n /** Commit specs/evidences into the repo (defaults false when forkAndPr is enabled). */\n commitSpecs: boolean;\n /** Sync main from remote before creating the feature branch (default: true). */\n rebaseBeforeBranch: boolean;\n /** Inject curated skills into the feature worktree. */\n injectSkills: boolean;\n /** Optional agent type override for this feature run */\n agentType?: string;\n /** Optional model override for this feature run */\n model?: string;\n sessionId?: string;\n}\n\nconst MAX_FILE_SIZE = 10 * 1024 * 1024; // 10 MB\n\nconst ALLOWED_EXTENSIONS = new Set([\n '.png',\n '.jpg',\n '.jpeg',\n '.gif',\n '.webp',\n '.svg',\n '.bmp',\n '.ico',\n '.pdf',\n '.doc',\n '.docx',\n '.xls',\n '.xlsx',\n '.ppt',\n '.pptx',\n '.txt',\n '.md',\n '.csv',\n '.json',\n '.yaml',\n '.yml',\n '.xml',\n '.ts',\n '.tsx',\n '.js',\n '.jsx',\n '.py',\n '.rb',\n '.go',\n '.rs',\n '.java',\n '.c',\n '.cpp',\n '.h',\n '.hpp',\n '.cs',\n '.swift',\n '.kt',\n '.html',\n '.css',\n '.scss',\n '.less',\n '.sh',\n '.bash',\n '.zsh',\n '.fish',\n '.toml',\n '.ini',\n '.cfg',\n '.conf',\n '.env',\n '.zip',\n '.tar',\n '.gz',\n '.log',\n]);\n\nfunction getExtension(filename: string): string {\n const dot = filename.lastIndexOf('.');\n return dot >= 0 ? filename.slice(dot).toLowerCase() : '';\n}\n\nconst EMPTY_GATES: Record<string, boolean> = {\n allowPrd: false,\n allowPlan: false,\n allowMerge: false,\n};\n\nexport interface FeatureCreateDrawerProps {\n open: boolean;\n onClose: () => void;\n onSubmit: (data: FeatureCreatePayload) => void;\n repositoryPath: string;\n isSubmitting?: boolean;\n workflowDefaults?: WorkflowDefaults;\n /** List of existing features available for selection as a parent. */\n features?: ParentFeatureOption[];\n /** List of tracked repositories for selection when repo context is missing. */\n repositories?: RepositoryOption[];\n /** Pre-select a parent feature when the drawer opens (e.g. from (+) button on a feature node). */\n initialParentId?: string;\n /** Current global agent type from settings */\n currentAgentType?: string;\n /** Current global model from settings */\n currentModel?: string;\n /** Pre-fill the description textarea (e.g. from session context) */\n initialDescription?: string;\n /** When true, user has push access — Fork & PR toggle will be hidden. */\n canPushDirectly?: boolean;\n}\n\nexport function FeatureCreateDrawer({\n open,\n onClose,\n onSubmit,\n repositoryPath,\n isSubmitting = false,\n workflowDefaults,\n features,\n repositories,\n initialParentId,\n currentAgentType,\n currentModel,\n initialDescription,\n canPushDirectly,\n}: FeatureCreateDrawerProps) {\n const createSound = useSoundAction('create');\n const { t } = useTranslation('web');\n // Validate repositoryPath from URL against active repos — prevents stale URL params\n // from selecting deleted repos after add/delete/re-add cycles.\n // Trust the prop when: repos not loaded yet (undefined), empty list (no repos to check),\n // or the path matches an active repo.\n const validRepoPath = !repositoryPath\n ? ''\n : !repositories ||\n repositories.length === 0 ||\n repositories.some((r) => r.path === repositoryPath)\n ? repositoryPath\n : '';\n const defaultGates = workflowDefaults?.approvalGates ?? EMPTY_GATES;\n const defaultPush = workflowDefaults?.push ?? false;\n const defaultOpenPr = workflowDefaults?.openPr ?? false;\n const defaultCiWatch = workflowDefaults?.ciWatchEnabled !== false;\n const defaultEnableEvidence = workflowDefaults?.enableEvidence ?? false;\n const defaultCommitEvidence = workflowDefaults?.commitEvidence ?? false;\n const defaultMode = workflowDefaults?.defaultMode ?? FeatureMode.Fast;\n\n const [description, setDescription] = useState(initialDescription ?? '');\n\n // Sync description when initialDescription prop changes (e.g. from session context)\n useEffect(() => {\n if (initialDescription) {\n setDescription(initialDescription);\n }\n }, [initialDescription]);\n\n const [attachments, setAttachments] = useState<FormAttachment[]>([]);\n const [approvalGates, setApprovalGates] = useState<Record<string, boolean>>({ ...defaultGates });\n const [push, setPush] = useState(defaultPush);\n const [openPr, setOpenPr] = useState(defaultOpenPr);\n const [ciWatchEnabled, setCiWatchEnabled] = useState(workflowDefaults?.ciWatchEnabled !== false);\n const [enableEvidence, setEnableEvidence] = useState(defaultEnableEvidence);\n const [commitEvidence, setCommitEvidence] = useState(defaultCommitEvidence);\n const [parentId, setParentId] = useState<string | undefined>(undefined);\n const [mode, setMode] = useState<FeatureMode>(defaultMode);\n const [pending, setPending] = useState(false);\n const [forkAndPr, setForkAndPr] = useState(false);\n const [commitSpecs, setCommitSpecs] = useState(true);\n const [rebaseBeforeBranch, setRebaseBeforeBranch] = useState(true);\n const [injectSkills, setInjectSkills] = useState(workflowDefaults?.injectSkills ?? false);\n const [overrideAgent, setOverrideAgent] = useState<string | undefined>(undefined);\n const [overrideModel, setOverrideModel] = useState<string | undefined>(undefined);\n const [selectedRepoPath, setSelectedRepoPath] = useState<string | undefined>(\n validRepoPath || undefined\n );\n const [localRepos, setLocalRepos] = useState<RepositoryOption[]>(repositories ?? []);\n const [isDragOver, setIsDragOver] = useState(false);\n const [uploadError, setUploadError] = useState<string | null>(null);\n const [isPromptFocused, setIsPromptFocused] = useState(false);\n\n // Stable sessionId per mount — used for upload dedup grouping\n const sessionIdRef = useRef(crypto.randomUUID());\n const dragCounterRef = useRef(0);\n const promptContainerRef = useRef<HTMLDivElement>(null);\n\n // Sync state when workflowDefaults load asynchronously\n useEffect(() => {\n if (workflowDefaults) {\n setApprovalGates({ ...workflowDefaults.approvalGates });\n setPush(workflowDefaults.push);\n setOpenPr(workflowDefaults.openPr);\n setCiWatchEnabled(workflowDefaults.ciWatchEnabled !== false);\n setEnableEvidence(workflowDefaults.enableEvidence);\n setCommitEvidence(workflowDefaults.commitEvidence);\n setMode(workflowDefaults.defaultMode ?? FeatureMode.Fast);\n setInjectSkills(workflowDefaults.injectSkills ?? false);\n }\n }, [workflowDefaults]);\n\n // Sync localRepos when repositories prop changes\n useEffect(() => {\n setLocalRepos(repositories ?? []);\n }, [repositories]);\n\n // Pre-select parent when initialParentId changes (e.g. (+) button on feature node)\n useEffect(() => {\n if (open && initialParentId) {\n setParentId(initialParentId);\n }\n }, [open, initialParentId]);\n\n // Permission-aware Fork & PR toggle visibility\n const [canPush, setCanPush] = useState(canPushDirectly ?? false);\n\n // Sync canPush from prop when it changes (e.g. initial server-side value)\n useEffect(() => {\n setCanPush(canPushDirectly ?? false);\n }, [canPushDirectly]);\n\n // Re-check permission when user switches repos via the combobox\n const prevRepoRef = useRef(selectedRepoPath);\n useEffect(() => {\n if (selectedRepoPath && selectedRepoPath !== prevRepoRef.current) {\n prevRepoRef.current = selectedRepoPath;\n getViewerPermission(selectedRepoPath)\n .then((result) => setCanPush(result.canPushDirectly))\n .catch(() => setCanPush(false));\n }\n }, [selectedRepoPath]);\n\n // Auto-reset forkAndPr and dependent states when canPush becomes true\n useEffect(() => {\n if (canPush) {\n setForkAndPr(false);\n setPush(defaultPush);\n setOpenPr(defaultOpenPr);\n setCommitSpecs(true);\n }\n }, [canPush, defaultPush, defaultOpenPr]);\n\n const resetForm = useCallback(() => {\n setDescription('');\n setAttachments([]);\n setApprovalGates({ ...defaultGates });\n setPush(defaultPush);\n setOpenPr(defaultOpenPr);\n setCiWatchEnabled(defaultCiWatch);\n setEnableEvidence(defaultEnableEvidence);\n setCommitEvidence(defaultCommitEvidence);\n setParentId(undefined);\n setSelectedRepoPath(validRepoPath || undefined);\n setLocalRepos(repositories ?? []);\n setMode(defaultMode);\n setPending(false);\n setForkAndPr(false);\n setCommitSpecs(true);\n setRebaseBeforeBranch(true);\n setOverrideAgent(undefined);\n setOverrideModel(undefined);\n setUploadError(null);\n dragCounterRef.current = 0;\n setIsDragOver(false);\n }, [\n defaultGates,\n defaultPush,\n defaultOpenPr,\n defaultEnableEvidence,\n defaultCiWatch,\n defaultCommitEvidence,\n defaultMode,\n validRepoPath,\n repositories,\n ]);\n\n // Track whether the form has unsaved data\n const isDirty = description.trim() !== '' || attachments.length > 0;\n\n // Shared close guard — shows confirmation when dirty, prevents navigation\n const { attemptClose } = useGuardedDrawerClose({ open, isDirty, onClose, onReset: resetForm });\n\n /** Validate and upload files from drop or paste. */\n const handleFiles = useCallback(async (fileList: File[]) => {\n setUploadError(null);\n\n for (const file of fileList) {\n // Client-side size validation\n if (file.size > MAX_FILE_SIZE) {\n setUploadError(`\"${file.name}\" exceeds 10 MB limit`);\n return;\n }\n // Client-side extension validation\n const ext = getExtension(file.name);\n if (ext && !ALLOWED_EXTENSIONS.has(ext)) {\n setUploadError(`File type \"${ext}\" is not allowed`);\n return;\n }\n }\n\n for (const file of fileList) {\n const tempId = crypto.randomUUID();\n\n // Optimistic loading placeholder\n setAttachments((prev) => [\n ...prev,\n {\n id: tempId,\n name: file.name,\n size: file.size,\n mimeType: file.type || 'application/octet-stream',\n path: '',\n loading: true,\n },\n ]);\n\n try {\n const formData = new FormData();\n formData.append('file', file);\n formData.append('sessionId', sessionIdRef.current);\n\n const res = await fetch('/api/attachments/upload', {\n method: 'POST',\n body: formData,\n });\n\n if (!res.ok) {\n const body = await res.json().catch(() => ({ error: 'Upload failed' }));\n // Remove loading placeholder on error\n setAttachments((prev) => prev.filter((a) => a.id !== tempId));\n setUploadError(body.error ?? 'Upload failed');\n return;\n }\n\n const uploaded = await res.json();\n // Server dedup may return the same path for identical content — drop the duplicate.\n setAttachments((prev) => {\n const isDupe = prev.some((a) => a.id !== tempId && a.path === uploaded.path);\n if (isDupe) return prev.filter((a) => a.id !== tempId);\n return prev.map((a) =>\n a.id === tempId ? { ...uploaded, id: tempId, loading: false } : a\n );\n });\n } catch {\n setAttachments((prev) => prev.filter((a) => a.id !== tempId));\n setUploadError('Upload failed');\n }\n }\n }, []);\n\n const handleDragEnter = useCallback((e: React.DragEvent) => {\n e.preventDefault();\n e.stopPropagation();\n dragCounterRef.current += 1;\n if (dragCounterRef.current === 1) {\n setIsDragOver(true);\n }\n }, []);\n\n const handleDragLeave = useCallback((e: React.DragEvent) => {\n e.preventDefault();\n e.stopPropagation();\n dragCounterRef.current -= 1;\n if (dragCounterRef.current === 0) {\n setIsDragOver(false);\n }\n }, []);\n\n const handleDragOver = useCallback((e: React.DragEvent) => {\n e.preventDefault();\n e.stopPropagation();\n }, []);\n\n const handleDrop = useCallback(\n (e: React.DragEvent) => {\n e.preventDefault();\n e.stopPropagation();\n dragCounterRef.current = 0;\n setIsDragOver(false);\n\n const files = Array.from(e.dataTransfer.files);\n if (files.length > 0) {\n handleFiles(files);\n }\n },\n [handleFiles]\n );\n\n const handlePaste = useCallback(\n (e: React.ClipboardEvent) => {\n const items = e.clipboardData?.items;\n if (!items) return;\n\n const files: File[] = [];\n for (const item of Array.from(items)) {\n if (item.kind === 'file') {\n const file = item.getAsFile();\n if (file) files.push(file);\n }\n }\n\n if (files.length > 0) {\n e.preventDefault();\n handleFiles(files);\n }\n },\n [handleFiles]\n );\n\n const handleSubmit = useCallback(\n (e: React.FormEvent<HTMLFormElement>) => {\n e.preventDefault();\n if (!description.trim()) return;\n const effectiveRepoPath = selectedRepoPath ?? validRepoPath;\n if (!effectiveRepoPath) return;\n createSound.play();\n onSubmit({\n description: description.trim(),\n attachments: attachments.filter((a) => !a.loading),\n repositoryPath: effectiveRepoPath,\n approvalGates: {\n allowPrd: approvalGates.allowPrd ?? false,\n allowPlan: approvalGates.allowPlan ?? false,\n allowMerge: approvalGates.allowMerge ?? false,\n },\n push: forkAndPr ? true : push || openPr,\n openPr: forkAndPr ? true : openPr,\n ciWatchEnabled,\n enableEvidence,\n commitEvidence,\n mode,\n forkAndPr,\n commitSpecs,\n rebaseBeforeBranch,\n injectSkills,\n ...(pending ? { pending } : {}),\n ...(overrideAgent ? { agentType: overrideAgent } : {}),\n ...(overrideModel ? { model: overrideModel } : {}),\n ...(parentId ? { parentId } : {}),\n sessionId: sessionIdRef.current,\n });\n resetForm();\n },\n [\n description,\n attachments,\n approvalGates,\n selectedRepoPath,\n validRepoPath,\n onSubmit,\n push,\n openPr,\n enableEvidence,\n ciWatchEnabled,\n commitEvidence,\n mode,\n forkAndPr,\n commitSpecs,\n rebaseBeforeBranch,\n injectSkills,\n pending,\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) return;\n\n for (const file of files) {\n const tempId = crypto.randomUUID();\n\n setAttachments((prev) => [\n ...prev,\n {\n id: tempId,\n name: file.name,\n size: file.size,\n mimeType: 'application/octet-stream',\n path: '',\n loading: true,\n },\n ]);\n\n try {\n const res = await fetch('/api/attachments/upload-from-path', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ path: file.path, sessionId: sessionIdRef.current }),\n });\n\n if (!res.ok) {\n const body = await res.json().catch(() => ({ error: 'Upload failed' }));\n setAttachments((prev) => prev.filter((a) => a.id !== tempId));\n setUploadError(body.error ?? 'Upload failed');\n return;\n }\n\n const uploaded = await res.json();\n setAttachments((prev) => {\n const isDupe = prev.some((a) => a.id !== tempId && a.path === uploaded.path);\n if (isDupe) return prev.filter((a) => a.id !== tempId);\n return prev.map((a) =>\n a.id === tempId ? { ...uploaded, id: tempId, loading: false } : a\n );\n });\n } catch {\n setAttachments((prev) => prev.filter((a) => a.id !== tempId));\n setUploadError('Upload failed');\n }\n }\n } catch {\n // Native dialog failed — silently ignore (user can retry)\n }\n }, []);\n\n const handleRemoveFile = useCallback((id: string) => {\n setAttachments((prev) => prev.filter((f) => f.id !== id));\n }, []);\n\n const handleNotesChange = useCallback((id: string, notes: string) => {\n setAttachments((prev) => prev.map((f) => (f.id === id ? { ...f, notes } : f)));\n }, []);\n\n const formRef = useRef<HTMLFormElement>(null);\n\n const handleKeyDown = useCallback((e: React.KeyboardEvent) => {\n if ((e.ctrlKey || e.metaKey) && e.key === 'Enter') {\n e.preventDefault();\n formRef.current?.requestSubmit();\n }\n }, []);\n\n const handlePromptFocus = useCallback(() => {\n setIsPromptFocused(true);\n }, []);\n\n const handlePromptBlur = useCallback(() => {\n // Defer the check so focus has time to settle on the new target.\n // This correctly handles Radix portals (e.g. AgentModelPicker popover) that\n // render outside the container DOM but are logically part of the prompt area.\n setTimeout(() => {\n const withinContainer = promptContainerRef.current?.contains(document.activeElement);\n const pickerPopoverOpen =\n promptContainerRef.current?.querySelector('[aria-expanded=\"true\"]') !== null;\n if (!withinContainer && !pickerPopoverOpen) {\n setIsPromptFocused(false);\n }\n }, 0);\n }, []);\n\n const hasFeatures = features && features.length > 0;\n const needsRepo = !validRepoPath && !selectedRepoPath;\n const showRepoSelector = !validRepoPath && repositories !== undefined;\n\n const AUTO_APPROVE_OPTIONS = [\n { id: 'allowPrd', label: t('createDrawer.prd'), description: t('createDrawer.prdDescription') },\n {\n id: 'allowPlan',\n label: t('createDrawer.plan'),\n description: t('createDrawer.planDescription'),\n },\n {\n id: 'allowMerge',\n label: t('createDrawer.merge'),\n description: t('createDrawer.mergeDescription'),\n },\n ];\n\n return (\n <BaseDrawer\n open={open}\n onClose={attemptClose}\n size=\"md\"\n modal={false}\n dismissOnOutsideClick\n data-testid=\"feature-create-drawer\"\n header={\n <>\n <div className=\"flex items-center gap-2\">\n <div className=\"h-2.5 w-2.5 shrink-0 rounded-full bg-blue-500\" />\n <DrawerTitle>{t('createDrawer.title')}</DrawerTitle>\n </div>\n {isSubmitting ? (\n <DrawerDescription asChild>\n <div>\n <Badge variant=\"secondary\">{t('createDrawer.creating')}</Badge>\n </div>\n </DrawerDescription>\n ) : null}\n </>\n }\n footer={\n <div className=\"flex flex-row justify-end gap-2\">\n <Button variant=\"outline\" onClick={attemptClose} disabled={isSubmitting}>\n {t('createDrawer.cancel')}\n </Button>\n <Button\n type=\"submit\"\n form=\"create-feature-form\"\n disabled={!description.trim() || isSubmitting || needsRepo}\n >\n {isSubmitting ? t('createDrawer.creating') : t('createDrawer.createFeature')}\n </Button>\n </div>\n }\n >\n {/* Form body */}\n <div className=\"overflow-y-auto p-4\">\n <TooltipProvider delayDuration={400}>\n <form\n ref={formRef}\n id=\"create-feature-form\"\n onSubmit={handleSubmit}\n onKeyDown={handleKeyDown}\n className=\"flex flex-col gap-4\"\n >\n {/* Repository selector (only when opened from sidebar without repo context) */}\n {showRepoSelector ? (\n <div className=\"flex flex-col gap-1.5\" data-testid=\"repo-selector-section\">\n <Label className=\"text-muted-foreground text-xs font-semibold tracking-wider\">\n {t('createDrawer.repository')}\n </Label>\n <RepositoryCombobox\n repositories={localRepos}\n value={selectedRepoPath}\n onChange={setSelectedRepoPath}\n onAddRepository={(repo) => {\n setLocalRepos((prev) => [...prev, repo]);\n setSelectedRepoPath(repo.path);\n }}\n disabled={isSubmitting}\n />\n </div>\n ) : validRepoPath ? (\n <div className=\"flex flex-col gap-1.5\" data-testid=\"repo-readonly-section\">\n <Label className=\"text-muted-foreground text-xs font-semibold tracking-wider\">\n {t('createDrawer.repository')}\n </Label>\n <p className=\"text-sm\" data-testid=\"repo-readonly-label\">\n {repositories?.find((r) => r.path === validRepoPath)?.name ??\n validRepoPath.split('/').pop()}\n </p>\n </div>\n ) : null}\n\n {/* Description + inline controls with drop zone */}\n <div\n role=\"region\"\n aria-label={t('createDrawer.fileDropZone')}\n data-drag-over={isDragOver ? 'true' : 'false'}\n onDragEnter={handleDragEnter}\n onDragLeave={handleDragLeave}\n onDragOver={handleDragOver}\n onDrop={handleDrop}\n className={cn(\n 'flex flex-col gap-1.5 rounded-md border-2 border-transparent p-1 transition-colors',\n isDragOver && 'border-primary/50 bg-primary/5'\n )}\n >\n <Label\n htmlFor=\"feature-description\"\n className=\"text-muted-foreground text-xs font-semibold tracking-wider\"\n >\n {t('createDrawer.describeFeature')}\n </Label>\n <div\n ref={promptContainerRef}\n onFocus={handlePromptFocus}\n onBlur={handlePromptBlur}\n className={cn(\n 'border-input flex h-56 flex-col overflow-hidden rounded-md border shadow-xs transition-[color,box-shadow]',\n isPromptFocused && 'ring-ring/50 border-ring ring-[3px]'\n )}\n >\n <Textarea\n id=\"feature-description\"\n placeholder={t('createDrawer.featurePlaceholder')}\n value={description}\n onChange={(e) => setDescription(e.target.value)}\n onPaste={handlePaste}\n required\n disabled={isSubmitting}\n className=\"min-h-0 flex-1 resize-none rounded-none border-0 shadow-none focus-visible:ring-0\"\n />\n {/* Inline attachment chips — between textarea and controls */}\n {attachments.length > 0 && (\n <div className=\"flex flex-wrap items-center gap-1.5 px-3 py-2\">\n {attachments.map((file) => (\n <AttachmentChip\n key={file.id}\n name={file.name}\n size={file.size}\n mimeType={file.mimeType}\n path={file.path}\n onRemove={() => handleRemoveFile(file.id)}\n disabled={isSubmitting}\n loading={file.loading}\n notes={file.notes}\n onNotesChange={(notes) => handleNotesChange(file.id, notes)}\n />\n ))}\n </div>\n )}\n {uploadError ? (\n <p className=\"text-destructive px-3 pb-2 text-xs\">{uploadError}</p>\n ) : null}\n <div className=\"border-input flex items-center gap-3 border-t px-3 py-1.5\">\n <AgentModelPicker\n 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=\"pending-mode\"\n checked={pending}\n onCheckedChange={setPending}\n disabled={isSubmitting}\n />\n <Label\n htmlFor=\"pending-mode\"\n className=\"flex cursor-pointer items-center gap-1 text-sm font-medium\"\n >\n <Clock className=\"h-3.5 w-3.5\" />\n {t('createDrawer.pendingMode')}\n </Label>\n </div>\n </TooltipTrigger>\n <TooltipContent side=\"bottom\">\n {t('createDrawer.pendingModeDescription')}\n </TooltipContent>\n </Tooltip>\n <ModeSelector value={mode} onChange={setMode} disabled={isSubmitting} />\n <Tooltip>\n <TooltipTrigger asChild>\n <button\n type=\"button\"\n onClick={handleAddFiles}\n disabled={isSubmitting}\n aria-label={t('chat.attachFiles')}\n className=\"text-muted-foreground hover:text-foreground cursor-pointer rounded p-1 transition-colors\"\n >\n <PaperclipIcon className=\"h-4 w-4\" />\n </button>\n </TooltipTrigger>\n <TooltipContent side=\"bottom\">{t('chat.attachFiles')}</TooltipContent>\n </Tooltip>\n </div>\n </div>\n </div>\n\n {/* Parent feature selector (only when opened from a feature node) */}\n {hasFeatures && initialParentId !== undefined ? (\n <div className=\"flex flex-col gap-1.5\">\n <Label\n htmlFor=\"parent-feature\"\n className=\"text-muted-foreground text-xs font-semibold tracking-wider\"\n >\n {t('createDrawer.parentFeature')}\n </Label>\n <ParentFeatureCombobox\n features={features}\n value={parentId}\n onChange={setParentId}\n disabled={isSubmitting}\n />\n </div>\n ) : null}\n\n {/* Approve + Git — compact switch groups */}\n <div className=\"flex flex-col gap-2\">\n {/* Approve row — hidden for exploration mode (no SDLC gates) */}\n {mode !== FeatureMode.Exploration && (\n <div className=\"border-input flex items-center gap-4 rounded-md border px-3 py-2.5\">\n <Tooltip>\n <TooltipTrigger asChild>\n <span className=\"text-muted-foreground w-16 shrink-0 cursor-default text-xs font-semibold tracking-wider\">\n {t('createDrawer.approve')}\n </span>\n </TooltipTrigger>\n <TooltipContent side=\"bottom\">\n {t('createDrawer.approveDescription')}\n </TooltipContent>\n </Tooltip>\n <div className=\"flex flex-1 items-center gap-4\">\n {AUTO_APPROVE_OPTIONS.map((opt) => (\n <Tooltip key={opt.id}>\n <TooltipTrigger asChild>\n <div className=\"flex cursor-pointer items-center gap-1.5\">\n <Switch\n id={`approve-${opt.id}`}\n size=\"sm\"\n checked={approvalGates[opt.id] ?? false}\n onCheckedChange={(v) =>\n setApprovalGates((prev) => ({ ...prev, [opt.id]: v }))\n }\n disabled={\n isSubmitting ||\n (mode === FeatureMode.Fast &&\n (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 {mode === FeatureMode.Fast &&\n (opt.id === 'allowPrd' || opt.id === 'allowPlan')\n ? t('createDrawer.skippedInFastMode')\n : opt.description}\n </TooltipContent>\n </Tooltip>\n ))}\n </div>\n {/* Select all shortcut */}\n <Tooltip>\n <TooltipTrigger asChild>\n <button\n type=\"button\"\n onClick={() => {\n const allOn = AUTO_APPROVE_OPTIONS.every((o) => approvalGates[o.id]);\n const next: Record<string, boolean> = {};\n for (const o of AUTO_APPROVE_OPTIONS) next[o.id] = !allOn;\n setApprovalGates(next);\n }}\n disabled={isSubmitting}\n className={cn(\n 'text-muted-foreground hover:text-foreground cursor-pointer rounded px-1.5 py-0.5 text-[10px] font-semibold tracking-wider uppercase transition-colors',\n AUTO_APPROVE_OPTIONS.every((o) => approvalGates[o.id]) && 'text-primary'\n )}\n >\n {t('createDrawer.all')}\n </button>\n </TooltipTrigger>\n <TooltipContent side=\"bottom\">\n {t('createDrawer.toggleAllApprovalGates')}\n </TooltipContent>\n </Tooltip>\n </div>\n )}\n\n {/* Evidence row */}\n <div className=\"border-input flex items-center gap-4 rounded-md border px-3 py-2.5\">\n <Tooltip>\n <TooltipTrigger asChild>\n <span className=\"text-muted-foreground w-16 shrink-0 cursor-default text-xs font-semibold tracking-wider\">\n {t('createDrawer.evidence')}\n </span>\n </TooltipTrigger>\n <TooltipContent side=\"bottom\">\n {t('createDrawer.evidenceDescription')}\n </TooltipContent>\n </Tooltip>\n <div className=\"flex flex-1 items-center gap-4\">\n <Tooltip>\n <TooltipTrigger asChild>\n <div className=\"flex cursor-pointer items-center gap-1.5\">\n <Switch\n id=\"enable-evidence\"\n size=\"sm\"\n checked={enableEvidence}\n onCheckedChange={(v) => {\n setEnableEvidence(v);\n if (!v) setCommitEvidence(false);\n }}\n disabled={isSubmitting}\n />\n <Label\n htmlFor=\"enable-evidence\"\n className=\"cursor-pointer text-xs font-medium\"\n >\n {t('createDrawer.collect')}\n </Label>\n </div>\n </TooltipTrigger>\n <TooltipContent side=\"bottom\">\n {t('createDrawer.collectDescription')}\n </TooltipContent>\n </Tooltip>\n <Tooltip>\n <TooltipTrigger asChild>\n <div className=\"flex cursor-pointer items-center gap-1.5\">\n <Switch\n id=\"commit-evidence\"\n size=\"sm\"\n checked={commitEvidence}\n onCheckedChange={setCommitEvidence}\n disabled={isSubmitting || !enableEvidence || (!openPr && !forkAndPr)}\n />\n <Label\n htmlFor=\"commit-evidence\"\n className={cn(\n 'cursor-pointer text-xs font-medium',\n (!enableEvidence || (!openPr && !forkAndPr)) && 'opacity-50'\n )}\n >\n {t('createDrawer.addToPr')}\n </Label>\n </div>\n </TooltipTrigger>\n <TooltipContent side=\"bottom\">\n {!openPr && !forkAndPr\n ? t('createDrawer.requiresPr')\n : !enableEvidence\n ? t('createDrawer.requiresEvidence')\n : t('createDrawer.addToPrDescription')}\n </TooltipContent>\n </Tooltip>\n </div>\n </div>\n\n {/* Skills row */}\n <div className=\"border-input flex items-center gap-4 rounded-md border px-3 py-2.5\">\n <Tooltip>\n <TooltipTrigger asChild>\n <span className=\"text-muted-foreground w-16 shrink-0 cursor-default text-xs font-semibold tracking-wider\">\n {t('createDrawer.skills')}\n </span>\n </TooltipTrigger>\n <TooltipContent side=\"bottom\">\n {t('createDrawer.skillsDescription')}\n </TooltipContent>\n </Tooltip>\n <div className=\"flex flex-1 items-center gap-4\">\n <Tooltip>\n <TooltipTrigger asChild>\n <div className=\"flex cursor-pointer items-center gap-1.5\">\n <Switch\n id=\"inject-skills\"\n size=\"sm\"\n checked={injectSkills}\n onCheckedChange={setInjectSkills}\n disabled={isSubmitting}\n />\n <Label\n htmlFor=\"inject-skills\"\n className=\"flex cursor-pointer items-center gap-1 text-xs font-medium\"\n >\n <Puzzle className=\"h-3 w-3\" />\n {t('createDrawer.injectSkills')}\n </Label>\n </div>\n </TooltipTrigger>\n <TooltipContent side=\"bottom\">\n {t('createDrawer.injectSkillsDescription')}\n </TooltipContent>\n </Tooltip>\n </div>\n </div>\n\n {/* Git row */}\n <div className=\"border-input flex items-start gap-4 rounded-md border px-3 py-2.5\">\n <span className=\"text-muted-foreground w-16 shrink-0 pt-0.5 text-xs font-semibold tracking-wider\">\n {t('createDrawer.git')}\n </span>\n <div className=\"flex flex-1 flex-wrap items-center gap-4\">\n <Tooltip>\n <TooltipTrigger asChild>\n <div className=\"flex cursor-pointer items-center gap-1.5\">\n <Switch\n id=\"push\"\n size=\"sm\"\n checked={forkAndPr ? true : push || openPr}\n onCheckedChange={(v) => {\n setPush(v);\n if (!v && openPr) setOpenPr(false);\n }}\n disabled={isSubmitting || forkAndPr}\n />\n <Label\n htmlFor=\"push\"\n className={cn(\n 'cursor-pointer text-xs font-medium',\n forkAndPr && 'opacity-50'\n )}\n >\n {t('createDrawer.push')}\n </Label>\n </div>\n </TooltipTrigger>\n <TooltipContent side=\"bottom\">\n {forkAndPr\n ? 'Enabled — contributing to upstream'\n : t('createDrawer.pushDescription')}\n </TooltipContent>\n </Tooltip>\n <Tooltip>\n <TooltipTrigger asChild>\n <div className=\"flex cursor-pointer items-center gap-1.5\">\n <Switch\n id=\"open-pr\"\n size=\"sm\"\n checked={forkAndPr ? true : openPr}\n onCheckedChange={(v) => {\n setOpenPr(v);\n if (!v) setCommitEvidence(false);\n }}\n disabled={isSubmitting || forkAndPr}\n />\n <Label\n htmlFor=\"open-pr\"\n className={cn(\n 'cursor-pointer text-xs font-medium',\n forkAndPr && 'opacity-50'\n )}\n >\n {t('createDrawer.pr')}\n </Label>\n </div>\n </TooltipTrigger>\n <TooltipContent side=\"bottom\">\n {forkAndPr\n ? 'Enabled — contributing to upstream'\n : t('createDrawer.prDescription')}\n </TooltipContent>\n </Tooltip>\n <Tooltip>\n <TooltipTrigger asChild>\n <div className=\"flex cursor-pointer items-center gap-1.5\">\n <Switch\n id=\"ci-watch\"\n size=\"sm\"\n checked={ciWatchEnabled}\n onCheckedChange={setCiWatchEnabled}\n disabled={isSubmitting}\n />\n <Label htmlFor=\"ci-watch\" className=\"cursor-pointer text-xs font-medium\">\n {t('createDrawer.watch')}\n </Label>\n </div>\n </TooltipTrigger>\n <TooltipContent side=\"bottom\">\n {t('createDrawer.watchDescription')}\n </TooltipContent>\n </Tooltip>\n {/* Separator between standard git and repo options */}\n <div className=\"bg-border h-4 w-px shrink-0\" />\n <Tooltip>\n <TooltipTrigger asChild>\n <div className=\"flex cursor-pointer items-center gap-1.5\">\n <Switch\n id=\"rebase-before-branch\"\n size=\"sm\"\n checked={rebaseBeforeBranch}\n onCheckedChange={setRebaseBeforeBranch}\n disabled={isSubmitting}\n />\n <Label\n htmlFor=\"rebase-before-branch\"\n className=\"flex cursor-pointer items-center gap-1 text-xs font-medium\"\n >\n <RefreshCw className=\"h-3 w-3\" />\n {t('createDrawer.sync')}\n </Label>\n </div>\n </TooltipTrigger>\n <TooltipContent side=\"bottom\">\n {t('createDrawer.syncDescription')}\n </TooltipContent>\n </Tooltip>\n <Tooltip>\n <TooltipTrigger asChild>\n <div className=\"flex cursor-pointer items-center gap-1.5\">\n <Switch\n id=\"commit-specs\"\n size=\"sm\"\n checked={commitSpecs}\n onCheckedChange={setCommitSpecs}\n disabled={isSubmitting}\n />\n <Label\n htmlFor=\"commit-specs\"\n className=\"flex cursor-pointer items-center gap-1 text-xs font-medium\"\n >\n <FileText className=\"h-3 w-3\" />\n {t('createDrawer.commitSpecs')}\n </Label>\n </div>\n </TooltipTrigger>\n <TooltipContent side=\"bottom\">\n {t('createDrawer.commitSpecsDescription')}\n </TooltipContent>\n </Tooltip>\n {!canPush && (\n <Tooltip>\n <TooltipTrigger asChild>\n <div className=\"flex cursor-pointer items-center gap-1.5\">\n <Switch\n id=\"fork-and-pr\"\n size=\"sm\"\n checked={forkAndPr}\n onCheckedChange={(v) => {\n setForkAndPr(v);\n // Auto-flip commitSpecs to false when enabling contribute mode\n if (v) setCommitSpecs(false);\n }}\n disabled={isSubmitting}\n />\n <Label\n htmlFor=\"fork-and-pr\"\n className=\"flex cursor-pointer items-center gap-1 text-xs font-medium\"\n >\n <GitFork className=\"h-3 w-3\" />\n {t('createDrawer.forkAndPr')}\n </Label>\n </div>\n </TooltipTrigger>\n <TooltipContent side=\"bottom\">\n {t('createDrawer.forkAndPrDescription')}\n </TooltipContent>\n </Tooltip>\n )}\n </div>\n </div>\n </div>\n </form>\n </TooltipProvider>\n </div>\n </BaseDrawer>\n );\n}\n\n/* ---------------------------------------------------------------------------\n * ParentFeatureCombobox — searchable dropdown for parent feature selection\n * ------------------------------------------------------------------------- */\n\ninterface ParentFeatureComboboxProps {\n features: ParentFeatureOption[];\n value: string | undefined;\n onChange: (id: string | undefined) => void;\n disabled?: boolean;\n}\n\nfunction ParentFeatureCombobox({\n features,\n value,\n onChange,\n disabled,\n}: ParentFeatureComboboxProps) {\n const { t } = useTranslation('web');\n const [open, setOpen] = useState(false);\n const [query, setQuery] = useState('');\n const inputRef = useRef<HTMLInputElement>(null);\n\n const selectedFeature = features.find((f) => f.id === value);\n\n const filtered = query.trim()\n ? features.filter(\n (f) =>\n f.name.toLowerCase().includes(query.toLowerCase()) ||\n f.id.toLowerCase().includes(query.toLowerCase())\n )\n : features;\n\n const handleSelect = useCallback(\n (id: string | undefined) => {\n onChange(id);\n setOpen(false);\n setQuery('');\n },\n [onChange]\n );\n\n useEffect(() => {\n if (open) {\n setTimeout(() => inputRef.current?.focus(), 0);\n } else {\n setQuery('');\n }\n }, [open]);\n\n return (\n <Popover open={open} onOpenChange={setOpen}>\n <PopoverTrigger asChild>\n <button\n id=\"parent-feature\"\n type=\"button\"\n role=\"combobox\"\n aria-expanded={open}\n aria-label=\"Parent Feature\"\n disabled={disabled}\n data-testid=\"parent-feature-combobox\"\n className={cn(\n 'border-input bg-background ring-offset-background focus:ring-ring flex h-9 w-full items-center justify-between rounded-md border px-3 py-2 text-sm focus:ring-2 focus:ring-offset-2 focus:outline-none disabled:cursor-not-allowed disabled:opacity-50',\n !selectedFeature && 'text-muted-foreground'\n )}\n >\n <span className=\"truncate\">\n {selectedFeature\n ? `${selectedFeature.name} (${selectedFeature.id.slice(0, 8)})`\n : t('createDrawer.selectParent')}\n </span>\n <ChevronsUpDown className=\"ms-2 h-4 w-4 shrink-0 opacity-50\" />\n </button>\n </PopoverTrigger>\n <PopoverContent\n className=\"w-80 p-0\"\n align=\"start\"\n data-testid=\"parent-feature-combobox-content\"\n >\n <div className=\"flex flex-col\">\n {/* Search input */}\n <div className=\"border-b p-2\">\n <Input\n ref={inputRef}\n placeholder={t('createDrawer.searchFeatures')}\n value={query}\n onChange={(e) => setQuery(e.target.value)}\n className=\"h-8 border-0 p-0 text-sm shadow-none focus-visible:ring-0\"\n data-testid=\"parent-feature-search\"\n />\n </div>\n\n {/* Options list */}\n <div className=\"max-h-48 overflow-y-auto py-1\" role=\"listbox\" aria-label=\"Features\">\n {/* No parent option */}\n <button\n type=\"button\"\n role=\"option\"\n aria-selected={value === undefined}\n onClick={() => handleSelect(undefined)}\n className={cn(\n 'hover:bg-accent hover:text-accent-foreground flex w-full items-center gap-2 px-3 py-2 text-sm',\n value === undefined && 'bg-accent/50'\n )}\n data-testid=\"parent-feature-option-none\"\n >\n <CheckIcon className={cn('h-4 w-4 shrink-0', value !== undefined && 'invisible')} />\n <span className=\"text-muted-foreground italic\">{t('createDrawer.noParent')}</span>\n </button>\n\n {filtered.length === 0 && query ? (\n <p className=\"text-muted-foreground px-3 py-2 text-sm\">\n {t('createDrawer.noFeaturesFound')}\n </p>\n ) : (\n filtered.map((f) => (\n <button\n key={f.id}\n type=\"button\"\n role=\"option\"\n aria-selected={value === f.id}\n onClick={() => handleSelect(f.id)}\n className={cn(\n 'hover:bg-accent hover:text-accent-foreground flex w-full items-center gap-2 px-3 py-2 text-sm',\n value === f.id && 'bg-accent/50'\n )}\n data-testid={`parent-feature-option-${f.id}`}\n >\n <CheckIcon className={cn('h-4 w-4 shrink-0', value !== f.id && 'invisible')} />\n <span className=\"truncate\">\n {f.name}{' '}\n <span className=\"text-muted-foreground font-mono text-xs\">\n ({f.id.slice(0, 8)})\n </span>\n </span>\n </button>\n ))\n )}\n </div>\n </div>\n </PopoverContent>\n </Popover>\n );\n}\n\n/* ---------------------------------------------------------------------------\n * RepositoryCombobox — searchable dropdown for repository selection\n * ------------------------------------------------------------------------- */\n\nexport interface RepositoryComboboxProps {\n repositories: RepositoryOption[];\n value: string | undefined;\n onChange: (path: string | undefined) => void;\n onAddRepository?: (repo: RepositoryOption) => void;\n disabled?: boolean;\n}\n\nexport function RepositoryCombobox({\n repositories,\n value,\n onChange,\n onAddRepository,\n disabled,\n}: RepositoryComboboxProps) {\n const [open, setOpen] = useState(false);\n const [query, setQuery] = useState('');\n const [isAdding, setIsAdding] = useState(false);\n const [addError, setAddError] = useState<string | null>(null);\n const [showReactPicker, setShowReactPicker] = useState(false);\n const inputRef = useRef<HTMLInputElement>(null);\n const { reactFileManager: useReactFileManager } = useFeatureFlags();\n const { t } = useTranslation('web');\n\n const selectedRepo = repositories.find((r) => r.path === value);\n\n const filtered = query.trim()\n ? repositories.filter(\n (r) =>\n r.name.toLowerCase().includes(query.toLowerCase()) ||\n r.path.toLowerCase().includes(query.toLowerCase())\n )\n : repositories;\n\n const handleSelect = useCallback(\n (path: string | undefined) => {\n onChange(path);\n setOpen(false);\n setQuery('');\n },\n [onChange]\n );\n\n const addRepoFromPath = useCallback(\n async (folderPath: string) => {\n const result = await addRepository({ path: folderPath });\n if (result.error) {\n setAddError(result.error);\n setIsAdding(false);\n return;\n }\n if (result.repository) {\n const newRepo: RepositoryOption = {\n id: result.repository.id,\n name: result.repository.name,\n path: result.repository.path,\n };\n onAddRepository?.(newRepo);\n onChange(newRepo.path);\n setOpen(false);\n setQuery('');\n }\n },\n [onAddRepository, onChange]\n );\n\n const handleAddRepository = useCallback(async () => {\n if (isAdding) return;\n\n if (useReactFileManager) {\n setShowReactPicker(true);\n return;\n }\n\n setIsAdding(true);\n setAddError(null);\n try {\n const folderPath = await pickFolder();\n if (!folderPath) {\n setIsAdding(false);\n return;\n }\n await addRepoFromPath(folderPath);\n } catch {\n // Native picker failed — fall back to React file manager\n setShowReactPicker(true);\n } finally {\n setIsAdding(false);\n }\n }, [isAdding, useReactFileManager, addRepoFromPath]);\n\n const handleReactPickerSelect = useCallback(\n async (path: string | null) => {\n setShowReactPicker(false);\n if (!path) return;\n setIsAdding(true);\n setAddError(null);\n try {\n await addRepoFromPath(path);\n } catch (err: unknown) {\n setAddError(err instanceof Error ? err.message : 'Failed to add repository');\n } finally {\n setIsAdding(false);\n }\n },\n [addRepoFromPath]\n );\n\n useEffect(() => {\n if (open) {\n setTimeout(() => inputRef.current?.focus(), 0);\n } else {\n setQuery('');\n }\n }, [open]);\n\n return (\n <>\n <Popover open={open} onOpenChange={setOpen}>\n <PopoverTrigger asChild>\n <button\n type=\"button\"\n role=\"combobox\"\n aria-expanded={open}\n aria-label=\"Repository\"\n disabled={disabled}\n data-testid=\"repository-combobox\"\n className={cn(\n 'border-input bg-background ring-offset-background focus:ring-ring flex h-9 w-full items-center justify-between rounded-md border px-3 py-2 text-sm focus:ring-2 focus:ring-offset-2 focus:outline-none disabled:cursor-not-allowed disabled:opacity-50',\n !selectedRepo && 'text-muted-foreground'\n )}\n >\n <span className=\"truncate\">\n {selectedRepo ? selectedRepo.name : 'Select repository...'}\n </span>\n <ChevronsUpDown className=\"ms-2 h-4 w-4 shrink-0 opacity-50\" />\n </button>\n </PopoverTrigger>\n <PopoverContent\n className=\"w-80 p-0\"\n align=\"start\"\n data-testid=\"repository-combobox-content\"\n >\n <div className=\"flex flex-col\">\n {/* Search input */}\n <div className=\"border-b p-2\">\n <Input\n ref={inputRef}\n placeholder={t('createDrawer.searchRepositories')}\n value={query}\n onChange={(e) => setQuery(e.target.value)}\n className=\"h-8 border-0 p-0 text-sm shadow-none focus-visible:ring-0\"\n data-testid=\"repository-search\"\n />\n </div>\n\n {/* Options list */}\n <div className=\"max-h-48 overflow-y-auto py-1\" role=\"listbox\" aria-label=\"Repositories\">\n {filtered.length === 0 ? (\n <p\n className=\"text-muted-foreground px-3 py-2 text-sm\"\n data-testid=\"repository-empty\"\n >\n No repositories found.\n </p>\n ) : (\n filtered.map((r) => (\n <button\n key={r.id}\n type=\"button\"\n role=\"option\"\n aria-selected={value === r.path}\n onClick={() => handleSelect(r.path)}\n className={cn(\n 'hover:bg-accent hover:text-accent-foreground flex w-full items-center gap-2 px-3 py-2 text-sm',\n value === r.path && 'bg-accent/50'\n )}\n data-testid={`repository-option-${r.id}`}\n >\n <CheckIcon\n className={cn('h-4 w-4 shrink-0', value !== r.path && 'invisible')}\n />\n <span className=\"flex flex-col items-start truncate\">\n <span className=\"truncate\">{r.name}</span>\n <span className=\"text-muted-foreground truncate text-xs\">{r.path}</span>\n </span>\n </button>\n ))\n )}\n </div>\n\n {/* Add new repository — pinned outside scroll area */}\n <Separator />\n <button\n type=\"button\"\n onClick={handleAddRepository}\n disabled={isAdding}\n className=\"hover:bg-accent hover:text-accent-foreground flex w-full items-center gap-2 px-3 py-2 text-sm\"\n data-testid=\"add-repository-item\"\n >\n {isAdding ? (\n <Loader2 className=\"h-4 w-4 shrink-0 animate-spin\" />\n ) : (\n <FolderPlus className=\"h-4 w-4 shrink-0\" />\n )}\n <span>Add new repository...</span>\n </button>\n {addError ? (\n <p className=\"px-3 pb-2 text-xs text-red-500\" data-testid=\"add-repository-error\">\n {addError}\n </p>\n ) : null}\n </div>\n </PopoverContent>\n </Popover>\n <ReactFileManagerDialog\n open={showReactPicker}\n onOpenChange={(isOpen) => {\n if (!isOpen) setShowReactPicker(false);\n }}\n onSelect={handleReactPickerSelect}\n />\n </>\n );\n}\n"],"names":[],"mappings":"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","ignoreList":[2,3]}
1
+ {"version":3,"sources":["../../../../../../../src/presentation/web/components/common/control-center-drawer/create-drawer-client.tsx","../../../../../../../src/presentation/web/app/actions/data%3A91041f%20%3Ctext/javascript%3E","../../../../../../../src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.tsx","../../../../../../../src/presentation/web/app/actions/data%3Ac99359%20%3Ctext/javascript%3E"],"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 { RepositoryOption } 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 initialDescription?: string;\n features: ParentFeatureOption[];\n repositories?: RepositoryOption[];\n workflowDefaults?: WorkflowDefaults;\n currentAgentType?: string;\n currentModel?: string;\n canPushDirectly?: boolean;\n}\n\nexport function CreateDrawerClient({\n repositoryPath,\n initialParentId,\n initialDescription,\n features,\n repositories,\n workflowDefaults,\n currentAgentType,\n currentModel,\n canPushDirectly,\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 repositories={repositories}\n workflowDefaults={workflowDefaults}\n initialParentId={initialParentId}\n initialDescription={initialDescription}\n isSubmitting={isSubmitting}\n currentAgentType={currentAgentType}\n currentModel={currentModel}\n canPushDirectly={canPushDirectly}\n />\n );\n}\n","/* __next_internal_action_entry_do_not_use__ [{\"404e2a9af4caff7731c833d342a9dabb9429cf7f9b\":\"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(\"404e2a9af4caff7731c833d342a9dabb9429cf7f9b\",callServer,void 0,findSourceMapURL,\"createFeature\");export{$$RSC_SERVER_ACTION_0 as createFeature};","'use client';\n\nimport { useState, useCallback, useEffect, useRef } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport {\n PaperclipIcon,\n ChevronsUpDown,\n CheckIcon,\n Zap,\n Clock,\n FolderPlus,\n Loader2,\n GitFork,\n FileText,\n Puzzle,\n RefreshCw,\n} from 'lucide-react';\nimport { cn } from '@/lib/utils';\nimport { useSoundAction } from '@/hooks/use-sound-action';\nimport { BaseDrawer } from '@/components/common/base-drawer';\nimport { DrawerTitle, DrawerDescription } from '@/components/ui/drawer';\nimport { Button } from '@/components/ui/button';\nimport { Input } from '@/components/ui/input';\nimport { Textarea } from '@/components/ui/textarea';\nimport { Label } from '@/components/ui/label';\nimport { Badge } from '@/components/ui/badge';\nimport { Popover, PopoverContent, PopoverTrigger } from '@/components/ui/popover';\nimport { Switch } from '@/components/ui/switch';\nimport { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from '@/components/ui/tooltip';\nimport { useGuardedDrawerClose } from '@/hooks/drawer-close-guard';\nimport { AttachmentChip } from '@/components/common/attachment-chip';\nimport type { WorkflowDefaults } from '@/app/actions/get-workflow-defaults';\nimport { getViewerPermission } from '@/app/actions/get-viewer-permission';\nimport { AgentModelPicker } from '@/components/features/settings/AgentModelPicker';\nimport { Separator } from '@/components/ui/separator';\nimport { pickFolder } from '@/components/common/add-repository-button/pick-folder';\nimport { ReactFileManagerDialog } from '@/components/common/react-file-manager-dialog';\nimport { useFeatureFlags } from '@/hooks/feature-flags-context';\nimport { addRepository } from '@/app/actions/add-repository';\nimport { pickFiles } from './pick-files';\n\nexport type { FileAttachment } from '@shepai/core/infrastructure/services/file-dialog.service';\n\n/** Attachment record for the create form — supports both picker and upload sources. */\nexport interface FormAttachment {\n id: string;\n name: string;\n size: number;\n mimeType: string;\n path: string;\n loading?: boolean;\n /** Optional user notes or annotations for this image */\n notes?: string;\n}\n\n/** Minimal feature descriptor for the parent selector. */\nexport interface ParentFeatureOption {\n id: string;\n name: string;\n}\n\n/** Minimal repository descriptor for the repository selector. */\nexport interface RepositoryOption {\n id: string;\n name: string;\n path: string;\n}\n\nexport interface FeatureCreatePayload {\n description: string;\n attachments: FormAttachment[];\n repositoryPath: string;\n approvalGates: {\n allowPrd: boolean;\n allowPlan: boolean;\n allowMerge: boolean;\n };\n push: boolean;\n openPr: boolean;\n ciWatchEnabled: boolean;\n enableEvidence: boolean;\n commitEvidence: boolean;\n parentId?: string;\n /** When true, skip SDLC phases and implement directly from the prompt. */\n fast: boolean;\n /** When true, create the feature in pending state (no agent spawned). */\n pending?: boolean;\n /** Fork repo and create PR to upstream at merge time. */\n forkAndPr: boolean;\n /** Commit specs/evidences into the repo (defaults false when forkAndPr is enabled). */\n commitSpecs: boolean;\n /** Sync main from remote before creating the feature branch (default: true). */\n rebaseBeforeBranch: boolean;\n /** Inject curated skills into the feature worktree. */\n injectSkills: boolean;\n /** Optional agent type override for this feature run */\n agentType?: string;\n /** Optional model override for this feature run */\n model?: string;\n sessionId?: string;\n}\n\nconst MAX_FILE_SIZE = 10 * 1024 * 1024; // 10 MB\n\nconst ALLOWED_EXTENSIONS = new Set([\n '.png',\n '.jpg',\n '.jpeg',\n '.gif',\n '.webp',\n '.svg',\n '.bmp',\n '.ico',\n '.pdf',\n '.doc',\n '.docx',\n '.xls',\n '.xlsx',\n '.ppt',\n '.pptx',\n '.txt',\n '.md',\n '.csv',\n '.json',\n '.yaml',\n '.yml',\n '.xml',\n '.ts',\n '.tsx',\n '.js',\n '.jsx',\n '.py',\n '.rb',\n '.go',\n '.rs',\n '.java',\n '.c',\n '.cpp',\n '.h',\n '.hpp',\n '.cs',\n '.swift',\n '.kt',\n '.html',\n '.css',\n '.scss',\n '.less',\n '.sh',\n '.bash',\n '.zsh',\n '.fish',\n '.toml',\n '.ini',\n '.cfg',\n '.conf',\n '.env',\n '.zip',\n '.tar',\n '.gz',\n '.log',\n]);\n\nfunction getExtension(filename: string): string {\n const dot = filename.lastIndexOf('.');\n return dot >= 0 ? filename.slice(dot).toLowerCase() : '';\n}\n\nconst EMPTY_GATES: Record<string, boolean> = {\n allowPrd: false,\n allowPlan: false,\n allowMerge: false,\n};\n\nexport interface FeatureCreateDrawerProps {\n open: boolean;\n onClose: () => void;\n onSubmit: (data: FeatureCreatePayload) => void;\n repositoryPath: string;\n isSubmitting?: boolean;\n workflowDefaults?: WorkflowDefaults;\n /** List of existing features available for selection as a parent. */\n features?: ParentFeatureOption[];\n /** List of tracked repositories for selection when repo context is missing. */\n repositories?: RepositoryOption[];\n /** Pre-select a parent feature when the drawer opens (e.g. from (+) button on a feature node). */\n initialParentId?: string;\n /** Current global agent type from settings */\n currentAgentType?: string;\n /** Current global model from settings */\n currentModel?: string;\n /** Pre-fill the description textarea (e.g. from session context) */\n initialDescription?: string;\n /** When true, user has push access — Fork & PR toggle will be hidden. */\n canPushDirectly?: boolean;\n}\n\nexport function FeatureCreateDrawer({\n open,\n onClose,\n onSubmit,\n repositoryPath,\n isSubmitting = false,\n workflowDefaults,\n features,\n repositories,\n initialParentId,\n currentAgentType,\n currentModel,\n initialDescription,\n canPushDirectly,\n}: FeatureCreateDrawerProps) {\n const createSound = useSoundAction('create');\n const { t } = useTranslation('web');\n // Validate repositoryPath from URL against active repos — prevents stale URL params\n // from selecting deleted repos after add/delete/re-add cycles.\n // Trust the prop when: repos not loaded yet (undefined), empty list (no repos to check),\n // or the path matches an active repo.\n const validRepoPath = !repositoryPath\n ? ''\n : !repositories ||\n repositories.length === 0 ||\n repositories.some((r) => r.path === repositoryPath)\n ? repositoryPath\n : '';\n const defaultGates = workflowDefaults?.approvalGates ?? EMPTY_GATES;\n const defaultPush = workflowDefaults?.push ?? false;\n const defaultOpenPr = workflowDefaults?.openPr ?? false;\n const defaultCiWatch = workflowDefaults?.ciWatchEnabled !== false;\n const defaultEnableEvidence = workflowDefaults?.enableEvidence ?? false;\n const defaultCommitEvidence = workflowDefaults?.commitEvidence ?? false;\n const defaultFast = workflowDefaults?.fast !== false;\n\n const [description, setDescription] = useState(initialDescription ?? '');\n\n // Sync description when initialDescription prop changes (e.g. from session context)\n useEffect(() => {\n if (initialDescription) {\n setDescription(initialDescription);\n }\n }, [initialDescription]);\n\n const [attachments, setAttachments] = useState<FormAttachment[]>([]);\n const [approvalGates, setApprovalGates] = useState<Record<string, boolean>>({ ...defaultGates });\n const [push, setPush] = useState(defaultPush);\n const [openPr, setOpenPr] = useState(defaultOpenPr);\n const [ciWatchEnabled, setCiWatchEnabled] = useState(workflowDefaults?.ciWatchEnabled !== false);\n const [enableEvidence, setEnableEvidence] = useState(defaultEnableEvidence);\n const [commitEvidence, setCommitEvidence] = useState(defaultCommitEvidence);\n const [parentId, setParentId] = useState<string | undefined>(undefined);\n const [fast, setFast] = useState(defaultFast);\n const [pending, setPending] = useState(false);\n const [forkAndPr, setForkAndPr] = useState(false);\n const [commitSpecs, setCommitSpecs] = useState(true);\n const [rebaseBeforeBranch, setRebaseBeforeBranch] = useState(true);\n const [injectSkills, setInjectSkills] = useState(workflowDefaults?.injectSkills ?? false);\n const [overrideAgent, setOverrideAgent] = useState<string | undefined>(undefined);\n const [overrideModel, setOverrideModel] = useState<string | undefined>(undefined);\n const [selectedRepoPath, setSelectedRepoPath] = useState<string | undefined>(\n validRepoPath || undefined\n );\n const [localRepos, setLocalRepos] = useState<RepositoryOption[]>(repositories ?? []);\n const [isDragOver, setIsDragOver] = useState(false);\n const [uploadError, setUploadError] = useState<string | null>(null);\n const [isPromptFocused, setIsPromptFocused] = useState(false);\n\n // Stable sessionId per mount — used for upload dedup grouping\n const sessionIdRef = useRef(crypto.randomUUID());\n const dragCounterRef = useRef(0);\n const promptContainerRef = useRef<HTMLDivElement>(null);\n\n // Sync state when workflowDefaults load asynchronously\n useEffect(() => {\n if (workflowDefaults) {\n setApprovalGates({ ...workflowDefaults.approvalGates });\n setPush(workflowDefaults.push);\n setOpenPr(workflowDefaults.openPr);\n setCiWatchEnabled(workflowDefaults.ciWatchEnabled !== false);\n setEnableEvidence(workflowDefaults.enableEvidence);\n setCommitEvidence(workflowDefaults.commitEvidence);\n setFast(workflowDefaults.fast !== false);\n setInjectSkills(workflowDefaults.injectSkills ?? false);\n }\n }, [workflowDefaults]);\n\n // Sync localRepos when repositories prop changes\n useEffect(() => {\n setLocalRepos(repositories ?? []);\n }, [repositories]);\n\n // Pre-select parent when initialParentId changes (e.g. (+) button on feature node)\n useEffect(() => {\n if (open && initialParentId) {\n setParentId(initialParentId);\n }\n }, [open, initialParentId]);\n\n // Permission-aware Fork & PR toggle visibility\n const [canPush, setCanPush] = useState(canPushDirectly ?? false);\n\n // Sync canPush from prop when it changes (e.g. initial server-side value)\n useEffect(() => {\n setCanPush(canPushDirectly ?? false);\n }, [canPushDirectly]);\n\n // Re-check permission when user switches repos via the combobox\n const prevRepoRef = useRef(selectedRepoPath);\n useEffect(() => {\n if (selectedRepoPath && selectedRepoPath !== prevRepoRef.current) {\n prevRepoRef.current = selectedRepoPath;\n getViewerPermission(selectedRepoPath)\n .then((result) => setCanPush(result.canPushDirectly))\n .catch(() => setCanPush(false));\n }\n }, [selectedRepoPath]);\n\n // Auto-reset forkAndPr and dependent states when canPush becomes true\n useEffect(() => {\n if (canPush) {\n setForkAndPr(false);\n setPush(defaultPush);\n setOpenPr(defaultOpenPr);\n setCommitSpecs(true);\n }\n }, [canPush, defaultPush, defaultOpenPr]);\n\n const resetForm = useCallback(() => {\n setDescription('');\n setAttachments([]);\n setApprovalGates({ ...defaultGates });\n setPush(defaultPush);\n setOpenPr(defaultOpenPr);\n setCiWatchEnabled(defaultCiWatch);\n setEnableEvidence(defaultEnableEvidence);\n setCommitEvidence(defaultCommitEvidence);\n setParentId(undefined);\n setSelectedRepoPath(validRepoPath || undefined);\n setLocalRepos(repositories ?? []);\n setFast(defaultFast);\n setPending(false);\n setForkAndPr(false);\n setCommitSpecs(true);\n setRebaseBeforeBranch(true);\n setOverrideAgent(undefined);\n setOverrideModel(undefined);\n setUploadError(null);\n dragCounterRef.current = 0;\n setIsDragOver(false);\n }, [\n defaultGates,\n defaultPush,\n defaultOpenPr,\n defaultEnableEvidence,\n defaultCiWatch,\n defaultCommitEvidence,\n defaultFast,\n validRepoPath,\n repositories,\n ]);\n\n // Track whether the form has unsaved data\n const isDirty = description.trim() !== '' || attachments.length > 0;\n\n // Shared close guard — shows confirmation when dirty, prevents navigation\n const { attemptClose } = useGuardedDrawerClose({ open, isDirty, onClose, onReset: resetForm });\n\n /** Validate and upload files from drop or paste. */\n const handleFiles = useCallback(async (fileList: File[]) => {\n setUploadError(null);\n\n for (const file of fileList) {\n // Client-side size validation\n if (file.size > MAX_FILE_SIZE) {\n setUploadError(`\"${file.name}\" exceeds 10 MB limit`);\n return;\n }\n // Client-side extension validation\n const ext = getExtension(file.name);\n if (ext && !ALLOWED_EXTENSIONS.has(ext)) {\n setUploadError(`File type \"${ext}\" is not allowed`);\n return;\n }\n }\n\n for (const file of fileList) {\n const tempId = crypto.randomUUID();\n\n // Optimistic loading placeholder\n setAttachments((prev) => [\n ...prev,\n {\n id: tempId,\n name: file.name,\n size: file.size,\n mimeType: file.type || 'application/octet-stream',\n path: '',\n loading: true,\n },\n ]);\n\n try {\n const formData = new FormData();\n formData.append('file', file);\n formData.append('sessionId', sessionIdRef.current);\n\n const res = await fetch('/api/attachments/upload', {\n method: 'POST',\n body: formData,\n });\n\n if (!res.ok) {\n const body = await res.json().catch(() => ({ error: 'Upload failed' }));\n // Remove loading placeholder on error\n setAttachments((prev) => prev.filter((a) => a.id !== tempId));\n setUploadError(body.error ?? 'Upload failed');\n return;\n }\n\n const uploaded = await res.json();\n // Server dedup may return the same path for identical content — drop the duplicate.\n setAttachments((prev) => {\n const isDupe = prev.some((a) => a.id !== tempId && a.path === uploaded.path);\n if (isDupe) return prev.filter((a) => a.id !== tempId);\n return prev.map((a) =>\n a.id === tempId ? { ...uploaded, id: tempId, loading: false } : a\n );\n });\n } catch {\n setAttachments((prev) => prev.filter((a) => a.id !== tempId));\n setUploadError('Upload failed');\n }\n }\n }, []);\n\n const handleDragEnter = useCallback((e: React.DragEvent) => {\n e.preventDefault();\n e.stopPropagation();\n dragCounterRef.current += 1;\n if (dragCounterRef.current === 1) {\n setIsDragOver(true);\n }\n }, []);\n\n const handleDragLeave = useCallback((e: React.DragEvent) => {\n e.preventDefault();\n e.stopPropagation();\n dragCounterRef.current -= 1;\n if (dragCounterRef.current === 0) {\n setIsDragOver(false);\n }\n }, []);\n\n const handleDragOver = useCallback((e: React.DragEvent) => {\n e.preventDefault();\n e.stopPropagation();\n }, []);\n\n const handleDrop = useCallback(\n (e: React.DragEvent) => {\n e.preventDefault();\n e.stopPropagation();\n dragCounterRef.current = 0;\n setIsDragOver(false);\n\n const files = Array.from(e.dataTransfer.files);\n if (files.length > 0) {\n handleFiles(files);\n }\n },\n [handleFiles]\n );\n\n const handlePaste = useCallback(\n (e: React.ClipboardEvent) => {\n const items = e.clipboardData?.items;\n if (!items) return;\n\n const files: File[] = [];\n for (const item of Array.from(items)) {\n if (item.kind === 'file') {\n const file = item.getAsFile();\n if (file) files.push(file);\n }\n }\n\n if (files.length > 0) {\n e.preventDefault();\n handleFiles(files);\n }\n },\n [handleFiles]\n );\n\n const handleSubmit = useCallback(\n (e: React.FormEvent<HTMLFormElement>) => {\n e.preventDefault();\n if (!description.trim()) return;\n const effectiveRepoPath = selectedRepoPath ?? validRepoPath;\n if (!effectiveRepoPath) return;\n createSound.play();\n onSubmit({\n description: description.trim(),\n attachments: attachments.filter((a) => !a.loading),\n repositoryPath: effectiveRepoPath,\n approvalGates: {\n allowPrd: approvalGates.allowPrd ?? false,\n allowPlan: approvalGates.allowPlan ?? false,\n allowMerge: approvalGates.allowMerge ?? false,\n },\n push: forkAndPr ? true : push || openPr,\n openPr: forkAndPr ? true : openPr,\n ciWatchEnabled,\n enableEvidence,\n commitEvidence,\n fast,\n forkAndPr,\n commitSpecs,\n rebaseBeforeBranch,\n injectSkills,\n ...(pending ? { pending } : {}),\n ...(overrideAgent ? { agentType: overrideAgent } : {}),\n ...(overrideModel ? { model: overrideModel } : {}),\n ...(parentId ? { parentId } : {}),\n sessionId: sessionIdRef.current,\n });\n resetForm();\n },\n [\n description,\n attachments,\n approvalGates,\n selectedRepoPath,\n validRepoPath,\n onSubmit,\n push,\n openPr,\n enableEvidence,\n ciWatchEnabled,\n commitEvidence,\n fast,\n forkAndPr,\n commitSpecs,\n rebaseBeforeBranch,\n injectSkills,\n pending,\n overrideAgent,\n overrideModel,\n parentId,\n createSound,\n resetForm,\n ]\n );\n\n const handleAddFiles = useCallback(async () => {\n try {\n const files = await pickFiles();\n if (!files) return;\n\n for (const file of files) {\n const tempId = crypto.randomUUID();\n\n setAttachments((prev) => [\n ...prev,\n {\n id: tempId,\n name: file.name,\n size: file.size,\n mimeType: 'application/octet-stream',\n path: '',\n loading: true,\n },\n ]);\n\n try {\n const res = await fetch('/api/attachments/upload-from-path', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ path: file.path, sessionId: sessionIdRef.current }),\n });\n\n if (!res.ok) {\n const body = await res.json().catch(() => ({ error: 'Upload failed' }));\n setAttachments((prev) => prev.filter((a) => a.id !== tempId));\n setUploadError(body.error ?? 'Upload failed');\n return;\n }\n\n const uploaded = await res.json();\n setAttachments((prev) => {\n const isDupe = prev.some((a) => a.id !== tempId && a.path === uploaded.path);\n if (isDupe) return prev.filter((a) => a.id !== tempId);\n return prev.map((a) =>\n a.id === tempId ? { ...uploaded, id: tempId, loading: false } : a\n );\n });\n } catch {\n setAttachments((prev) => prev.filter((a) => a.id !== tempId));\n setUploadError('Upload failed');\n }\n }\n } catch {\n // Native dialog failed — silently ignore (user can retry)\n }\n }, []);\n\n const handleRemoveFile = useCallback((id: string) => {\n setAttachments((prev) => prev.filter((f) => f.id !== id));\n }, []);\n\n const handleNotesChange = useCallback((id: string, notes: string) => {\n setAttachments((prev) => prev.map((f) => (f.id === id ? { ...f, notes } : f)));\n }, []);\n\n const formRef = useRef<HTMLFormElement>(null);\n\n const handleKeyDown = useCallback((e: React.KeyboardEvent) => {\n if ((e.ctrlKey || e.metaKey) && e.key === 'Enter') {\n e.preventDefault();\n formRef.current?.requestSubmit();\n }\n }, []);\n\n const handlePromptFocus = useCallback(() => {\n setIsPromptFocused(true);\n }, []);\n\n const handlePromptBlur = useCallback(() => {\n // Defer the check so focus has time to settle on the new target.\n // This correctly handles Radix portals (e.g. AgentModelPicker popover) that\n // render outside the container DOM but are logically part of the prompt area.\n setTimeout(() => {\n const withinContainer = promptContainerRef.current?.contains(document.activeElement);\n const pickerPopoverOpen =\n promptContainerRef.current?.querySelector('[aria-expanded=\"true\"]') !== null;\n if (!withinContainer && !pickerPopoverOpen) {\n setIsPromptFocused(false);\n }\n }, 0);\n }, []);\n\n const hasFeatures = features && features.length > 0;\n const needsRepo = !validRepoPath && !selectedRepoPath;\n const showRepoSelector = !validRepoPath && repositories !== undefined;\n\n const AUTO_APPROVE_OPTIONS = [\n { id: 'allowPrd', label: t('createDrawer.prd'), description: t('createDrawer.prdDescription') },\n {\n id: 'allowPlan',\n label: t('createDrawer.plan'),\n description: t('createDrawer.planDescription'),\n },\n {\n id: 'allowMerge',\n label: t('createDrawer.merge'),\n description: t('createDrawer.mergeDescription'),\n },\n ];\n\n return (\n <BaseDrawer\n open={open}\n onClose={attemptClose}\n size=\"md\"\n modal={false}\n dismissOnOutsideClick\n data-testid=\"feature-create-drawer\"\n header={\n <>\n <div className=\"flex items-center gap-2\">\n <div className=\"h-2.5 w-2.5 shrink-0 rounded-full bg-blue-500\" />\n <DrawerTitle>{t('createDrawer.title')}</DrawerTitle>\n </div>\n {isSubmitting ? (\n <DrawerDescription asChild>\n <div>\n <Badge variant=\"secondary\">{t('createDrawer.creating')}</Badge>\n </div>\n </DrawerDescription>\n ) : null}\n </>\n }\n footer={\n <div className=\"flex flex-row justify-end gap-2\">\n <Button variant=\"outline\" onClick={attemptClose} disabled={isSubmitting}>\n {t('createDrawer.cancel')}\n </Button>\n <Button\n type=\"submit\"\n form=\"create-feature-form\"\n disabled={!description.trim() || isSubmitting || needsRepo}\n >\n {isSubmitting ? t('createDrawer.creating') : t('createDrawer.createFeature')}\n </Button>\n </div>\n }\n >\n {/* Form body */}\n <div className=\"overflow-y-auto p-4\">\n <TooltipProvider delayDuration={400}>\n <form\n ref={formRef}\n id=\"create-feature-form\"\n onSubmit={handleSubmit}\n onKeyDown={handleKeyDown}\n className=\"flex flex-col gap-4\"\n >\n {/* Repository selector (only when opened from sidebar without repo context) */}\n {showRepoSelector ? (\n <div className=\"flex flex-col gap-1.5\" data-testid=\"repo-selector-section\">\n <Label className=\"text-muted-foreground text-xs font-semibold tracking-wider\">\n {t('createDrawer.repository')}\n </Label>\n <RepositoryCombobox\n repositories={localRepos}\n value={selectedRepoPath}\n onChange={setSelectedRepoPath}\n onAddRepository={(repo) => {\n setLocalRepos((prev) => [...prev, repo]);\n setSelectedRepoPath(repo.path);\n }}\n disabled={isSubmitting}\n />\n </div>\n ) : validRepoPath ? (\n <div className=\"flex flex-col gap-1.5\" data-testid=\"repo-readonly-section\">\n <Label className=\"text-muted-foreground text-xs font-semibold tracking-wider\">\n {t('createDrawer.repository')}\n </Label>\n <p className=\"text-sm\" data-testid=\"repo-readonly-label\">\n {repositories?.find((r) => r.path === validRepoPath)?.name ??\n validRepoPath.split('/').pop()}\n </p>\n </div>\n ) : null}\n\n {/* Description + inline controls with drop zone */}\n <div\n role=\"region\"\n aria-label={t('createDrawer.fileDropZone')}\n data-drag-over={isDragOver ? 'true' : 'false'}\n onDragEnter={handleDragEnter}\n onDragLeave={handleDragLeave}\n onDragOver={handleDragOver}\n onDrop={handleDrop}\n className={cn(\n 'flex flex-col gap-1.5 rounded-md border-2 border-transparent p-1 transition-colors',\n isDragOver && 'border-primary/50 bg-primary/5'\n )}\n >\n <Label\n htmlFor=\"feature-description\"\n className=\"text-muted-foreground text-xs font-semibold tracking-wider\"\n >\n {t('createDrawer.describeFeature')}\n </Label>\n <div\n ref={promptContainerRef}\n onFocus={handlePromptFocus}\n onBlur={handlePromptBlur}\n className={cn(\n 'border-input flex h-56 flex-col overflow-hidden rounded-md border shadow-xs transition-[color,box-shadow]',\n isPromptFocused && 'ring-ring/50 border-ring ring-[3px]'\n )}\n >\n <Textarea\n id=\"feature-description\"\n placeholder={t('createDrawer.featurePlaceholder')}\n value={description}\n onChange={(e) => setDescription(e.target.value)}\n onPaste={handlePaste}\n required\n disabled={isSubmitting}\n className=\"min-h-0 flex-1 resize-none rounded-none border-0 shadow-none focus-visible:ring-0\"\n />\n {/* Inline attachment chips — between textarea and controls */}\n {attachments.length > 0 && (\n <div className=\"flex flex-wrap items-center gap-1.5 px-3 py-2\">\n {attachments.map((file) => (\n <AttachmentChip\n key={file.id}\n name={file.name}\n size={file.size}\n mimeType={file.mimeType}\n path={file.path}\n onRemove={() => handleRemoveFile(file.id)}\n disabled={isSubmitting}\n loading={file.loading}\n notes={file.notes}\n onNotesChange={(notes) => handleNotesChange(file.id, notes)}\n />\n ))}\n </div>\n )}\n {uploadError ? (\n <p className=\"text-destructive px-3 pb-2 text-xs\">{uploadError}</p>\n ) : null}\n <div className=\"border-input flex items-center gap-3 border-t px-3 py-1.5\">\n <AgentModelPicker\n 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=\"pending-mode\"\n checked={pending}\n onCheckedChange={setPending}\n disabled={isSubmitting}\n />\n <Label\n htmlFor=\"pending-mode\"\n className=\"flex cursor-pointer items-center gap-1 text-sm font-medium\"\n >\n <Clock className=\"h-3.5 w-3.5\" />\n {t('createDrawer.pendingMode')}\n </Label>\n </div>\n </TooltipTrigger>\n <TooltipContent side=\"bottom\">\n {t('createDrawer.pendingModeDescription')}\n </TooltipContent>\n </Tooltip>\n <Tooltip>\n <TooltipTrigger asChild>\n <div className=\"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\n htmlFor=\"fast-mode\"\n className=\"flex cursor-pointer items-center gap-1 text-sm font-medium\"\n >\n <Zap className=\"h-3.5 w-3.5\" />\n {t('createDrawer.fastModeLabel')}\n </Label>\n </div>\n </TooltipTrigger>\n <TooltipContent side=\"bottom\">\n {t('createDrawer.fastModeDescription')}\n </TooltipContent>\n </Tooltip>\n <Tooltip>\n <TooltipTrigger asChild>\n <button\n type=\"button\"\n onClick={handleAddFiles}\n disabled={isSubmitting}\n aria-label={t('chat.attachFiles')}\n className=\"text-muted-foreground hover:text-foreground cursor-pointer rounded p-1 transition-colors\"\n >\n <PaperclipIcon className=\"h-4 w-4\" />\n </button>\n </TooltipTrigger>\n <TooltipContent side=\"bottom\">{t('chat.attachFiles')}</TooltipContent>\n </Tooltip>\n </div>\n </div>\n </div>\n\n {/* Parent feature selector (only when opened from a feature node) */}\n {hasFeatures && initialParentId !== undefined ? (\n <div className=\"flex flex-col gap-1.5\">\n <Label\n htmlFor=\"parent-feature\"\n className=\"text-muted-foreground text-xs font-semibold tracking-wider\"\n >\n {t('createDrawer.parentFeature')}\n </Label>\n <ParentFeatureCombobox\n features={features}\n value={parentId}\n onChange={setParentId}\n disabled={isSubmitting}\n />\n </div>\n ) : null}\n\n {/* Approve + Git — compact switch groups */}\n <div className=\"flex flex-col gap-2\">\n {/* Approve row */}\n <div className=\"border-input flex items-center gap-4 rounded-md border px-3 py-2.5\">\n <Tooltip>\n <TooltipTrigger asChild>\n <span className=\"text-muted-foreground w-16 shrink-0 cursor-default text-xs font-semibold tracking-wider\">\n {t('createDrawer.approve')}\n </span>\n </TooltipTrigger>\n <TooltipContent side=\"bottom\">\n {t('createDrawer.approveDescription')}\n </TooltipContent>\n </Tooltip>\n <div className=\"flex flex-1 items-center gap-4\">\n {AUTO_APPROVE_OPTIONS.map((opt) => (\n <Tooltip key={opt.id}>\n <TooltipTrigger asChild>\n <div className=\"flex cursor-pointer items-center gap-1.5\">\n <Switch\n id={`approve-${opt.id}`}\n size=\"sm\"\n checked={approvalGates[opt.id] ?? false}\n onCheckedChange={(v) =>\n setApprovalGates((prev) => ({ ...prev, [opt.id]: v }))\n }\n disabled={\n isSubmitting ||\n (fast && (opt.id === 'allowPrd' || opt.id === 'allowPlan'))\n }\n />\n <Label\n htmlFor={`approve-${opt.id}`}\n className=\"cursor-pointer text-xs font-medium\"\n >\n {opt.label}\n </Label>\n </div>\n </TooltipTrigger>\n <TooltipContent side=\"bottom\">\n {fast && (opt.id === 'allowPrd' || opt.id === 'allowPlan')\n ? t('createDrawer.skippedInFastMode')\n : opt.description}\n </TooltipContent>\n </Tooltip>\n ))}\n </div>\n {/* Select all shortcut */}\n <Tooltip>\n <TooltipTrigger asChild>\n <button\n type=\"button\"\n onClick={() => {\n const allOn = AUTO_APPROVE_OPTIONS.every((o) => approvalGates[o.id]);\n const next: Record<string, boolean> = {};\n for (const o of AUTO_APPROVE_OPTIONS) next[o.id] = !allOn;\n setApprovalGates(next);\n }}\n disabled={isSubmitting}\n className={cn(\n 'text-muted-foreground hover:text-foreground cursor-pointer rounded px-1.5 py-0.5 text-[10px] font-semibold tracking-wider uppercase transition-colors',\n AUTO_APPROVE_OPTIONS.every((o) => approvalGates[o.id]) && 'text-primary'\n )}\n >\n {t('createDrawer.all')}\n </button>\n </TooltipTrigger>\n <TooltipContent side=\"bottom\">\n {t('createDrawer.toggleAllApprovalGates')}\n </TooltipContent>\n </Tooltip>\n </div>\n\n {/* Evidence row */}\n <div className=\"border-input flex items-center gap-4 rounded-md border px-3 py-2.5\">\n <Tooltip>\n <TooltipTrigger asChild>\n <span className=\"text-muted-foreground w-16 shrink-0 cursor-default text-xs font-semibold tracking-wider\">\n {t('createDrawer.evidence')}\n </span>\n </TooltipTrigger>\n <TooltipContent side=\"bottom\">\n {t('createDrawer.evidenceDescription')}\n </TooltipContent>\n </Tooltip>\n <div className=\"flex flex-1 items-center gap-4\">\n <Tooltip>\n <TooltipTrigger asChild>\n <div className=\"flex cursor-pointer items-center gap-1.5\">\n <Switch\n id=\"enable-evidence\"\n size=\"sm\"\n checked={enableEvidence}\n onCheckedChange={(v) => {\n setEnableEvidence(v);\n if (!v) setCommitEvidence(false);\n }}\n disabled={isSubmitting}\n />\n <Label\n htmlFor=\"enable-evidence\"\n className=\"cursor-pointer text-xs font-medium\"\n >\n {t('createDrawer.collect')}\n </Label>\n </div>\n </TooltipTrigger>\n <TooltipContent side=\"bottom\">\n {t('createDrawer.collectDescription')}\n </TooltipContent>\n </Tooltip>\n <Tooltip>\n <TooltipTrigger asChild>\n <div className=\"flex cursor-pointer items-center gap-1.5\">\n <Switch\n id=\"commit-evidence\"\n size=\"sm\"\n checked={commitEvidence}\n onCheckedChange={setCommitEvidence}\n disabled={isSubmitting || !enableEvidence || (!openPr && !forkAndPr)}\n />\n <Label\n htmlFor=\"commit-evidence\"\n className={cn(\n 'cursor-pointer text-xs font-medium',\n (!enableEvidence || (!openPr && !forkAndPr)) && 'opacity-50'\n )}\n >\n {t('createDrawer.addToPr')}\n </Label>\n </div>\n </TooltipTrigger>\n <TooltipContent side=\"bottom\">\n {!openPr && !forkAndPr\n ? t('createDrawer.requiresPr')\n : !enableEvidence\n ? t('createDrawer.requiresEvidence')\n : t('createDrawer.addToPrDescription')}\n </TooltipContent>\n </Tooltip>\n </div>\n </div>\n\n {/* Skills row */}\n <div className=\"border-input flex items-center gap-4 rounded-md border px-3 py-2.5\">\n <Tooltip>\n <TooltipTrigger asChild>\n <span className=\"text-muted-foreground w-16 shrink-0 cursor-default text-xs font-semibold tracking-wider\">\n {t('createDrawer.skills')}\n </span>\n </TooltipTrigger>\n <TooltipContent side=\"bottom\">\n {t('createDrawer.skillsDescription')}\n </TooltipContent>\n </Tooltip>\n <div className=\"flex flex-1 items-center gap-4\">\n <Tooltip>\n <TooltipTrigger asChild>\n <div className=\"flex cursor-pointer items-center gap-1.5\">\n <Switch\n id=\"inject-skills\"\n size=\"sm\"\n checked={injectSkills}\n onCheckedChange={setInjectSkills}\n disabled={isSubmitting}\n />\n <Label\n htmlFor=\"inject-skills\"\n className=\"flex cursor-pointer items-center gap-1 text-xs font-medium\"\n >\n <Puzzle className=\"h-3 w-3\" />\n {t('createDrawer.injectSkills')}\n </Label>\n </div>\n </TooltipTrigger>\n <TooltipContent side=\"bottom\">\n {t('createDrawer.injectSkillsDescription')}\n </TooltipContent>\n </Tooltip>\n </div>\n </div>\n\n {/* Git row */}\n <div className=\"border-input flex items-start gap-4 rounded-md border px-3 py-2.5\">\n <span className=\"text-muted-foreground w-16 shrink-0 pt-0.5 text-xs font-semibold tracking-wider\">\n {t('createDrawer.git')}\n </span>\n <div className=\"flex flex-1 flex-wrap items-center gap-4\">\n <Tooltip>\n <TooltipTrigger asChild>\n <div className=\"flex cursor-pointer items-center gap-1.5\">\n <Switch\n id=\"push\"\n size=\"sm\"\n checked={forkAndPr ? true : push || openPr}\n onCheckedChange={(v) => {\n setPush(v);\n if (!v && openPr) setOpenPr(false);\n }}\n disabled={isSubmitting || forkAndPr}\n />\n <Label\n htmlFor=\"push\"\n className={cn(\n 'cursor-pointer text-xs font-medium',\n forkAndPr && 'opacity-50'\n )}\n >\n {t('createDrawer.push')}\n </Label>\n </div>\n </TooltipTrigger>\n <TooltipContent side=\"bottom\">\n {forkAndPr\n ? 'Enabled — contributing to upstream'\n : t('createDrawer.pushDescription')}\n </TooltipContent>\n </Tooltip>\n <Tooltip>\n <TooltipTrigger asChild>\n <div className=\"flex cursor-pointer items-center gap-1.5\">\n <Switch\n id=\"open-pr\"\n size=\"sm\"\n checked={forkAndPr ? true : openPr}\n onCheckedChange={(v) => {\n setOpenPr(v);\n if (!v) setCommitEvidence(false);\n }}\n disabled={isSubmitting || forkAndPr}\n />\n <Label\n htmlFor=\"open-pr\"\n className={cn(\n 'cursor-pointer text-xs font-medium',\n forkAndPr && 'opacity-50'\n )}\n >\n {t('createDrawer.pr')}\n </Label>\n </div>\n </TooltipTrigger>\n <TooltipContent side=\"bottom\">\n {forkAndPr\n ? 'Enabled — contributing to upstream'\n : t('createDrawer.prDescription')}\n </TooltipContent>\n </Tooltip>\n <Tooltip>\n <TooltipTrigger asChild>\n <div className=\"flex cursor-pointer items-center gap-1.5\">\n <Switch\n id=\"ci-watch\"\n size=\"sm\"\n checked={ciWatchEnabled}\n onCheckedChange={setCiWatchEnabled}\n disabled={isSubmitting}\n />\n <Label htmlFor=\"ci-watch\" className=\"cursor-pointer text-xs font-medium\">\n {t('createDrawer.watch')}\n </Label>\n </div>\n </TooltipTrigger>\n <TooltipContent side=\"bottom\">\n {t('createDrawer.watchDescription')}\n </TooltipContent>\n </Tooltip>\n {/* Separator between standard git and repo options */}\n <div className=\"bg-border h-4 w-px shrink-0\" />\n <Tooltip>\n <TooltipTrigger asChild>\n <div className=\"flex cursor-pointer items-center gap-1.5\">\n <Switch\n id=\"rebase-before-branch\"\n size=\"sm\"\n checked={rebaseBeforeBranch}\n onCheckedChange={setRebaseBeforeBranch}\n disabled={isSubmitting}\n />\n <Label\n htmlFor=\"rebase-before-branch\"\n className=\"flex cursor-pointer items-center gap-1 text-xs font-medium\"\n >\n <RefreshCw className=\"h-3 w-3\" />\n {t('createDrawer.sync')}\n </Label>\n </div>\n </TooltipTrigger>\n <TooltipContent side=\"bottom\">\n {t('createDrawer.syncDescription')}\n </TooltipContent>\n </Tooltip>\n <Tooltip>\n <TooltipTrigger asChild>\n <div className=\"flex cursor-pointer items-center gap-1.5\">\n <Switch\n id=\"commit-specs\"\n size=\"sm\"\n checked={commitSpecs}\n onCheckedChange={setCommitSpecs}\n disabled={isSubmitting}\n />\n <Label\n htmlFor=\"commit-specs\"\n className=\"flex cursor-pointer items-center gap-1 text-xs font-medium\"\n >\n <FileText className=\"h-3 w-3\" />\n {t('createDrawer.commitSpecs')}\n </Label>\n </div>\n </TooltipTrigger>\n <TooltipContent side=\"bottom\">\n {t('createDrawer.commitSpecsDescription')}\n </TooltipContent>\n </Tooltip>\n {!canPush && (\n <Tooltip>\n <TooltipTrigger asChild>\n <div className=\"flex cursor-pointer items-center gap-1.5\">\n <Switch\n id=\"fork-and-pr\"\n size=\"sm\"\n checked={forkAndPr}\n onCheckedChange={(v) => {\n setForkAndPr(v);\n // Auto-flip commitSpecs to false when enabling contribute mode\n if (v) setCommitSpecs(false);\n }}\n disabled={isSubmitting}\n />\n <Label\n htmlFor=\"fork-and-pr\"\n className=\"flex cursor-pointer items-center gap-1 text-xs font-medium\"\n >\n <GitFork className=\"h-3 w-3\" />\n {t('createDrawer.forkAndPr')}\n </Label>\n </div>\n </TooltipTrigger>\n <TooltipContent side=\"bottom\">\n {t('createDrawer.forkAndPrDescription')}\n </TooltipContent>\n </Tooltip>\n )}\n </div>\n </div>\n </div>\n </form>\n </TooltipProvider>\n </div>\n </BaseDrawer>\n );\n}\n\n/* ---------------------------------------------------------------------------\n * ParentFeatureCombobox — searchable dropdown for parent feature selection\n * ------------------------------------------------------------------------- */\n\ninterface ParentFeatureComboboxProps {\n features: ParentFeatureOption[];\n value: string | undefined;\n onChange: (id: string | undefined) => void;\n disabled?: boolean;\n}\n\nfunction ParentFeatureCombobox({\n features,\n value,\n onChange,\n disabled,\n}: ParentFeatureComboboxProps) {\n const { t } = useTranslation('web');\n const [open, setOpen] = useState(false);\n const [query, setQuery] = useState('');\n const inputRef = useRef<HTMLInputElement>(null);\n\n const selectedFeature = features.find((f) => f.id === value);\n\n const filtered = query.trim()\n ? features.filter(\n (f) =>\n f.name.toLowerCase().includes(query.toLowerCase()) ||\n f.id.toLowerCase().includes(query.toLowerCase())\n )\n : features;\n\n const handleSelect = useCallback(\n (id: string | undefined) => {\n onChange(id);\n setOpen(false);\n setQuery('');\n },\n [onChange]\n );\n\n useEffect(() => {\n if (open) {\n setTimeout(() => inputRef.current?.focus(), 0);\n } else {\n setQuery('');\n }\n }, [open]);\n\n return (\n <Popover open={open} onOpenChange={setOpen}>\n <PopoverTrigger asChild>\n <button\n id=\"parent-feature\"\n type=\"button\"\n role=\"combobox\"\n aria-expanded={open}\n aria-label=\"Parent Feature\"\n disabled={disabled}\n data-testid=\"parent-feature-combobox\"\n className={cn(\n 'border-input bg-background ring-offset-background focus:ring-ring flex h-9 w-full items-center justify-between rounded-md border px-3 py-2 text-sm focus:ring-2 focus:ring-offset-2 focus:outline-none disabled:cursor-not-allowed disabled:opacity-50',\n !selectedFeature && 'text-muted-foreground'\n )}\n >\n <span className=\"truncate\">\n {selectedFeature\n ? `${selectedFeature.name} (${selectedFeature.id.slice(0, 8)})`\n : t('createDrawer.selectParent')}\n </span>\n <ChevronsUpDown className=\"ms-2 h-4 w-4 shrink-0 opacity-50\" />\n </button>\n </PopoverTrigger>\n <PopoverContent\n className=\"w-80 p-0\"\n align=\"start\"\n data-testid=\"parent-feature-combobox-content\"\n >\n <div className=\"flex flex-col\">\n {/* Search input */}\n <div className=\"border-b p-2\">\n <Input\n ref={inputRef}\n placeholder={t('createDrawer.searchFeatures')}\n value={query}\n onChange={(e) => setQuery(e.target.value)}\n className=\"h-8 border-0 p-0 text-sm shadow-none focus-visible:ring-0\"\n data-testid=\"parent-feature-search\"\n />\n </div>\n\n {/* Options list */}\n <div className=\"max-h-48 overflow-y-auto py-1\" role=\"listbox\" aria-label=\"Features\">\n {/* No parent option */}\n <button\n type=\"button\"\n role=\"option\"\n aria-selected={value === undefined}\n onClick={() => handleSelect(undefined)}\n className={cn(\n 'hover:bg-accent hover:text-accent-foreground flex w-full items-center gap-2 px-3 py-2 text-sm',\n value === undefined && 'bg-accent/50'\n )}\n data-testid=\"parent-feature-option-none\"\n >\n <CheckIcon className={cn('h-4 w-4 shrink-0', value !== undefined && 'invisible')} />\n <span className=\"text-muted-foreground italic\">{t('createDrawer.noParent')}</span>\n </button>\n\n {filtered.length === 0 && query ? (\n <p className=\"text-muted-foreground px-3 py-2 text-sm\">\n {t('createDrawer.noFeaturesFound')}\n </p>\n ) : (\n filtered.map((f) => (\n <button\n key={f.id}\n type=\"button\"\n role=\"option\"\n aria-selected={value === f.id}\n onClick={() => handleSelect(f.id)}\n className={cn(\n 'hover:bg-accent hover:text-accent-foreground flex w-full items-center gap-2 px-3 py-2 text-sm',\n value === f.id && 'bg-accent/50'\n )}\n data-testid={`parent-feature-option-${f.id}`}\n >\n <CheckIcon className={cn('h-4 w-4 shrink-0', value !== f.id && 'invisible')} />\n <span className=\"truncate\">\n {f.name}{' '}\n <span className=\"text-muted-foreground font-mono text-xs\">\n ({f.id.slice(0, 8)})\n </span>\n </span>\n </button>\n ))\n )}\n </div>\n </div>\n </PopoverContent>\n </Popover>\n );\n}\n\n/* ---------------------------------------------------------------------------\n * RepositoryCombobox — searchable dropdown for repository selection\n * ------------------------------------------------------------------------- */\n\nexport interface RepositoryComboboxProps {\n repositories: RepositoryOption[];\n value: string | undefined;\n onChange: (path: string | undefined) => void;\n onAddRepository?: (repo: RepositoryOption) => void;\n disabled?: boolean;\n}\n\nexport function RepositoryCombobox({\n repositories,\n value,\n onChange,\n onAddRepository,\n disabled,\n}: RepositoryComboboxProps) {\n const [open, setOpen] = useState(false);\n const [query, setQuery] = useState('');\n const [isAdding, setIsAdding] = useState(false);\n const [addError, setAddError] = useState<string | null>(null);\n const [showReactPicker, setShowReactPicker] = useState(false);\n const inputRef = useRef<HTMLInputElement>(null);\n const { reactFileManager: useReactFileManager } = useFeatureFlags();\n const { t } = useTranslation('web');\n\n const selectedRepo = repositories.find((r) => r.path === value);\n\n const filtered = query.trim()\n ? repositories.filter(\n (r) =>\n r.name.toLowerCase().includes(query.toLowerCase()) ||\n r.path.toLowerCase().includes(query.toLowerCase())\n )\n : repositories;\n\n const handleSelect = useCallback(\n (path: string | undefined) => {\n onChange(path);\n setOpen(false);\n setQuery('');\n },\n [onChange]\n );\n\n const addRepoFromPath = useCallback(\n async (folderPath: string) => {\n const result = await addRepository({ path: folderPath });\n if (result.error) {\n setAddError(result.error);\n setIsAdding(false);\n return;\n }\n if (result.repository) {\n const newRepo: RepositoryOption = {\n id: result.repository.id,\n name: result.repository.name,\n path: result.repository.path,\n };\n onAddRepository?.(newRepo);\n onChange(newRepo.path);\n setOpen(false);\n setQuery('');\n }\n },\n [onAddRepository, onChange]\n );\n\n const handleAddRepository = useCallback(async () => {\n if (isAdding) return;\n\n if (useReactFileManager) {\n setShowReactPicker(true);\n return;\n }\n\n setIsAdding(true);\n setAddError(null);\n try {\n const folderPath = await pickFolder();\n if (!folderPath) {\n setIsAdding(false);\n return;\n }\n await addRepoFromPath(folderPath);\n } catch {\n // Native picker failed — fall back to React file manager\n setShowReactPicker(true);\n } finally {\n setIsAdding(false);\n }\n }, [isAdding, useReactFileManager, addRepoFromPath]);\n\n const handleReactPickerSelect = useCallback(\n async (path: string | null) => {\n setShowReactPicker(false);\n if (!path) return;\n setIsAdding(true);\n setAddError(null);\n try {\n await addRepoFromPath(path);\n } catch (err: unknown) {\n setAddError(err instanceof Error ? err.message : 'Failed to add repository');\n } finally {\n setIsAdding(false);\n }\n },\n [addRepoFromPath]\n );\n\n useEffect(() => {\n if (open) {\n setTimeout(() => inputRef.current?.focus(), 0);\n } else {\n setQuery('');\n }\n }, [open]);\n\n return (\n <>\n <Popover open={open} onOpenChange={setOpen}>\n <PopoverTrigger asChild>\n <button\n type=\"button\"\n role=\"combobox\"\n aria-expanded={open}\n aria-label=\"Repository\"\n disabled={disabled}\n data-testid=\"repository-combobox\"\n className={cn(\n 'border-input bg-background ring-offset-background focus:ring-ring flex h-9 w-full items-center justify-between rounded-md border px-3 py-2 text-sm focus:ring-2 focus:ring-offset-2 focus:outline-none disabled:cursor-not-allowed disabled:opacity-50',\n !selectedRepo && 'text-muted-foreground'\n )}\n >\n <span className=\"truncate\">\n {selectedRepo ? selectedRepo.name : 'Select repository...'}\n </span>\n <ChevronsUpDown className=\"ms-2 h-4 w-4 shrink-0 opacity-50\" />\n </button>\n </PopoverTrigger>\n <PopoverContent\n className=\"w-80 p-0\"\n align=\"start\"\n data-testid=\"repository-combobox-content\"\n >\n <div className=\"flex flex-col\">\n {/* Search input */}\n <div className=\"border-b p-2\">\n <Input\n ref={inputRef}\n placeholder={t('createDrawer.searchRepositories')}\n value={query}\n onChange={(e) => setQuery(e.target.value)}\n className=\"h-8 border-0 p-0 text-sm shadow-none focus-visible:ring-0\"\n data-testid=\"repository-search\"\n />\n </div>\n\n {/* Options list */}\n <div className=\"max-h-48 overflow-y-auto py-1\" role=\"listbox\" aria-label=\"Repositories\">\n {filtered.length === 0 ? (\n <p\n className=\"text-muted-foreground px-3 py-2 text-sm\"\n data-testid=\"repository-empty\"\n >\n No repositories found.\n </p>\n ) : (\n filtered.map((r) => (\n <button\n key={r.id}\n type=\"button\"\n role=\"option\"\n aria-selected={value === r.path}\n onClick={() => handleSelect(r.path)}\n className={cn(\n 'hover:bg-accent hover:text-accent-foreground flex w-full items-center gap-2 px-3 py-2 text-sm',\n value === r.path && 'bg-accent/50'\n )}\n data-testid={`repository-option-${r.id}`}\n >\n <CheckIcon\n className={cn('h-4 w-4 shrink-0', value !== r.path && 'invisible')}\n />\n <span className=\"flex flex-col items-start truncate\">\n <span className=\"truncate\">{r.name}</span>\n <span className=\"text-muted-foreground truncate text-xs\">{r.path}</span>\n </span>\n </button>\n ))\n )}\n </div>\n\n {/* Add new repository — pinned outside scroll area */}\n <Separator />\n <button\n type=\"button\"\n onClick={handleAddRepository}\n disabled={isAdding}\n className=\"hover:bg-accent hover:text-accent-foreground flex w-full items-center gap-2 px-3 py-2 text-sm\"\n data-testid=\"add-repository-item\"\n >\n {isAdding ? (\n <Loader2 className=\"h-4 w-4 shrink-0 animate-spin\" />\n ) : (\n <FolderPlus className=\"h-4 w-4 shrink-0\" />\n )}\n <span>Add new repository...</span>\n </button>\n {addError ? (\n <p className=\"px-3 pb-2 text-xs text-red-500\" data-testid=\"add-repository-error\">\n {addError}\n </p>\n ) : null}\n </div>\n </PopoverContent>\n </Popover>\n <ReactFileManagerDialog\n open={showReactPicker}\n onOpenChange={(isOpen) => {\n if (!isOpen) setShowReactPicker(false);\n }}\n onSelect={handleReactPickerSelect}\n />\n </>\n );\n}\n","/* __next_internal_action_entry_do_not_use__ [{\"407f9c9f52480d814d142d29f5d641dcdc28ca4862\":\"getViewerPermission\"},\"src/presentation/web/app/actions/get-viewer-permission.ts\",\"\"] */\"use turbopack no side effects\";import{createServerReference,callServer,findSourceMapURL}from\"private-next-rsc-action-client-wrapper\";const $$RSC_SERVER_ACTION_0=/*#__PURE__*/createServerReference(\"407f9c9f52480d814d142d29f5d641dcdc28ca4862\",callServer,void 0,findSourceMapURL,\"getViewerPermission\");export{$$RSC_SERVER_ACTION_0 as getViewerPermission};"],"names":[],"mappings":"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"}