@shepai/cli 1.37.2 → 1.38.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (532) hide show
  1. package/README.md +1 -1
  2. package/dist/packages/core/src/application/use-cases/features/get-feature-artifact.use-case.d.ts +19 -0
  3. package/dist/packages/core/src/application/use-cases/features/get-feature-artifact.use-case.d.ts.map +1 -0
  4. package/dist/packages/core/src/application/use-cases/features/get-feature-artifact.use-case.js +52 -0
  5. package/dist/packages/core/src/application/use-cases/features/get-research-artifact.use-case.d.ts +19 -0
  6. package/dist/packages/core/src/application/use-cases/features/get-research-artifact.use-case.d.ts.map +1 -0
  7. package/dist/packages/core/src/application/use-cases/features/get-research-artifact.use-case.js +52 -0
  8. package/dist/packages/core/src/domain/factories/spec-yaml-parser.d.ts.map +1 -1
  9. package/dist/packages/core/src/domain/factories/spec-yaml-parser.js +3 -1
  10. package/dist/packages/core/src/domain/generated/output.d.ts +84 -0
  11. package/dist/packages/core/src/domain/generated/output.d.ts.map +1 -1
  12. package/dist/packages/core/src/infrastructure/di/container.d.ts.map +1 -1
  13. package/dist/packages/core/src/infrastructure/di/container.js +14 -2
  14. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/prompts/requirements.prompt.d.ts.map +1 -1
  15. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/prompts/requirements.prompt.js +27 -3
  16. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/prompts/research.prompt.d.ts.map +1 -1
  17. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/prompts/research.prompt.js +14 -1
  18. package/dist/packages/core/src/infrastructure/services/notifications/notification-bus.d.ts +2 -17
  19. package/dist/packages/core/src/infrastructure/services/notifications/notification-bus.d.ts.map +1 -1
  20. package/dist/packages/core/src/infrastructure/services/notifications/notification-bus.js +3 -27
  21. package/dist/src/presentation/cli/commands/feat/show.command.js +2 -2
  22. package/dist/src/presentation/web/app/actions/approve-feature.d.ts +5 -0
  23. package/dist/src/presentation/web/app/actions/approve-feature.d.ts.map +1 -0
  24. package/dist/src/presentation/web/app/actions/approve-feature.js +27 -0
  25. package/dist/src/presentation/web/app/actions/create-feature.d.ts +22 -0
  26. package/dist/src/presentation/web/app/actions/create-feature.d.ts.map +1 -0
  27. package/dist/src/presentation/web/app/actions/create-feature.js +41 -0
  28. package/dist/src/presentation/web/app/actions/delete-feature.d.ts +6 -0
  29. package/dist/src/presentation/web/app/actions/delete-feature.d.ts.map +1 -0
  30. package/dist/src/presentation/web/app/actions/delete-feature.js +16 -0
  31. package/dist/src/presentation/web/app/actions/get-feature-artifact.d.ts +10 -0
  32. package/dist/src/presentation/web/app/actions/get-feature-artifact.d.ts.map +1 -0
  33. package/dist/src/presentation/web/app/actions/get-feature-artifact.js +43 -0
  34. package/dist/src/presentation/web/app/actions/get-research-artifact.d.ts +14 -0
  35. package/dist/src/presentation/web/app/actions/get-research-artifact.d.ts.map +1 -0
  36. package/dist/src/presentation/web/app/actions/get-research-artifact.js +25 -0
  37. package/dist/src/presentation/web/app/actions/open-folder.d.ts +6 -0
  38. package/dist/src/presentation/web/app/actions/open-folder.d.ts.map +1 -0
  39. package/dist/src/presentation/web/app/actions/open-folder.js +39 -0
  40. package/dist/src/presentation/web/app/actions/open-ide.d.ts +12 -0
  41. package/dist/src/presentation/web/app/actions/open-ide.d.ts.map +1 -0
  42. package/dist/src/presentation/web/app/actions/open-ide.js +22 -0
  43. package/dist/src/presentation/web/app/actions/open-shell.d.ts +12 -0
  44. package/dist/src/presentation/web/app/actions/open-shell.d.ts.map +1 -0
  45. package/dist/src/presentation/web/app/actions/open-shell.js +45 -0
  46. package/dist/src/presentation/web/app/actions/pick-folder.d.ts +5 -0
  47. package/dist/src/presentation/web/app/actions/pick-folder.d.ts.map +1 -0
  48. package/dist/src/presentation/web/app/actions/pick-folder.js +13 -0
  49. package/dist/src/presentation/web/app/api/agent-events/route.d.ts +1 -1
  50. package/dist/src/presentation/web/app/api/agent-events/route.d.ts.map +1 -1
  51. package/dist/src/presentation/web/app/api/agent-events/route.js +2 -9
  52. package/dist/src/presentation/web/app/api/dialog/pick-files/route.d.ts +1 -9
  53. package/dist/src/presentation/web/app/api/dialog/pick-files/route.d.ts.map +1 -1
  54. package/dist/src/presentation/web/app/api/dialog/pick-files/route.js +3 -6
  55. package/dist/src/presentation/web/app/page.d.ts.map +1 -1
  56. package/dist/src/presentation/web/app/page.js +1 -0
  57. package/dist/src/presentation/web/components/common/add-repository-node/pick-folder.d.ts +1 -1
  58. package/dist/src/presentation/web/components/common/add-repository-node/pick-folder.d.ts.map +1 -1
  59. package/dist/src/presentation/web/components/common/add-repository-node/pick-folder.js +6 -7
  60. package/dist/src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.js +1 -1
  61. package/dist/src/presentation/web/components/common/feature-create-drawer/pick-files.d.ts +1 -1
  62. package/dist/src/presentation/web/components/common/feature-create-drawer/pick-files.d.ts.map +1 -1
  63. package/dist/src/presentation/web/components/common/feature-create-drawer/pick-files.js +6 -7
  64. package/dist/src/presentation/web/components/common/feature-drawer/feature-drawer.d.ts.map +1 -1
  65. package/dist/src/presentation/web/components/common/feature-drawer/feature-drawer.js +7 -7
  66. package/dist/src/presentation/web/components/common/feature-drawer/use-feature-actions.d.ts +4 -0
  67. package/dist/src/presentation/web/components/common/feature-drawer/use-feature-actions.d.ts.map +1 -1
  68. package/dist/src/presentation/web/components/common/feature-drawer/use-feature-actions.js +52 -14
  69. package/dist/src/presentation/web/components/common/feature-node/agent-type-icons.d.ts.map +1 -1
  70. package/dist/src/presentation/web/components/common/feature-node/agent-type-icons.js +2 -2
  71. package/dist/src/presentation/web/components/common/feature-node/feature-node-state-config.d.ts +2 -0
  72. package/dist/src/presentation/web/components/common/feature-node/feature-node-state-config.d.ts.map +1 -1
  73. package/dist/src/presentation/web/components/common/feature-node/feature-node.d.ts.map +1 -1
  74. package/dist/src/presentation/web/components/common/feature-node/feature-node.js +33 -2
  75. package/dist/src/presentation/web/components/common/feature-node/feature-node.stories.d.ts.map +1 -1
  76. package/dist/src/presentation/web/components/common/feature-node/feature-node.stories.js +10 -0
  77. package/dist/src/presentation/web/components/common/index.d.ts +3 -0
  78. package/dist/src/presentation/web/components/common/index.d.ts.map +1 -1
  79. package/dist/src/presentation/web/components/common/index.js +3 -0
  80. package/dist/src/presentation/web/components/common/notification-permission-banner/index.d.ts +2 -0
  81. package/dist/src/presentation/web/components/common/notification-permission-banner/index.d.ts.map +1 -0
  82. package/dist/src/presentation/web/components/common/notification-permission-banner/index.js +1 -0
  83. package/dist/src/presentation/web/components/common/notification-permission-banner/notification-permission-banner.d.ts +2 -0
  84. package/dist/src/presentation/web/components/common/notification-permission-banner/notification-permission-banner.d.ts.map +1 -0
  85. package/dist/src/presentation/web/components/common/notification-permission-banner/notification-permission-banner.js +33 -0
  86. package/dist/src/presentation/web/components/common/notification-permission-banner/notification-permission-banner.stories.d.ts +6 -0
  87. package/dist/src/presentation/web/components/common/notification-permission-banner/notification-permission-banner.stories.d.ts.map +1 -0
  88. package/dist/src/presentation/web/components/common/notification-permission-banner/notification-permission-banner.stories.js +24 -0
  89. package/dist/src/presentation/web/components/common/open-action-menu/config.d.ts +10 -0
  90. package/dist/src/presentation/web/components/common/open-action-menu/config.d.ts.map +1 -0
  91. package/dist/src/presentation/web/components/common/open-action-menu/config.js +1 -0
  92. package/dist/src/presentation/web/components/common/open-action-menu/index.d.ts +3 -0
  93. package/dist/src/presentation/web/components/common/open-action-menu/index.d.ts.map +1 -0
  94. package/dist/src/presentation/web/components/common/open-action-menu/index.js +1 -0
  95. package/dist/src/presentation/web/components/common/open-action-menu/open-action-menu.d.ts +3 -0
  96. package/dist/src/presentation/web/components/common/open-action-menu/open-action-menu.d.ts.map +1 -0
  97. package/dist/src/presentation/web/components/common/open-action-menu/open-action-menu.js +18 -0
  98. package/dist/src/presentation/web/components/common/open-action-menu/open-action-menu.stories.d.ts +14 -0
  99. package/dist/src/presentation/web/components/common/open-action-menu/open-action-menu.stories.d.ts.map +1 -0
  100. package/dist/src/presentation/web/components/common/open-action-menu/open-action-menu.stories.js +54 -0
  101. package/dist/src/presentation/web/components/common/prd-questionnaire/index.d.ts +4 -0
  102. package/dist/src/presentation/web/components/common/prd-questionnaire/index.d.ts.map +1 -0
  103. package/dist/src/presentation/web/components/common/prd-questionnaire/index.js +2 -0
  104. package/dist/src/presentation/web/components/common/prd-questionnaire/prd-questionnaire-config.d.ts +41 -0
  105. package/dist/src/presentation/web/components/common/prd-questionnaire/prd-questionnaire-config.d.ts.map +1 -0
  106. package/dist/src/presentation/web/components/common/prd-questionnaire/prd-questionnaire-config.js +1 -0
  107. package/dist/src/presentation/web/components/common/prd-questionnaire/prd-questionnaire-drawer.d.ts +3 -0
  108. package/dist/src/presentation/web/components/common/prd-questionnaire/prd-questionnaire-drawer.d.ts.map +1 -0
  109. package/dist/src/presentation/web/components/common/prd-questionnaire/prd-questionnaire-drawer.js +7 -0
  110. package/dist/src/presentation/web/components/common/prd-questionnaire/prd-questionnaire.d.ts +3 -0
  111. package/dist/src/presentation/web/components/common/prd-questionnaire/prd-questionnaire.d.ts.map +1 -0
  112. package/dist/src/presentation/web/components/common/prd-questionnaire/prd-questionnaire.js +42 -0
  113. package/dist/src/presentation/web/components/common/prd-questionnaire/prd-questionnaire.stories.d.ts +26 -0
  114. package/dist/src/presentation/web/components/common/prd-questionnaire/prd-questionnaire.stories.d.ts.map +1 -0
  115. package/dist/src/presentation/web/components/common/prd-questionnaire/prd-questionnaire.stories.js +267 -0
  116. package/dist/src/presentation/web/components/common/repository-node/repository-node.d.ts.map +1 -1
  117. package/dist/src/presentation/web/components/common/repository-node/repository-node.js +2 -2
  118. package/dist/src/presentation/web/components/common/repository-node/use-repository-actions.d.ts +3 -0
  119. package/dist/src/presentation/web/components/common/repository-node/use-repository-actions.d.ts.map +1 -1
  120. package/dist/src/presentation/web/components/common/repository-node/use-repository-actions.js +51 -14
  121. package/dist/src/presentation/web/components/common/review-drawer-shell/index.d.ts +3 -0
  122. package/dist/src/presentation/web/components/common/review-drawer-shell/index.d.ts.map +1 -0
  123. package/dist/src/presentation/web/components/common/review-drawer-shell/index.js +1 -0
  124. package/dist/src/presentation/web/components/common/review-drawer-shell/review-drawer-shell-config.d.ts +24 -0
  125. package/dist/src/presentation/web/components/common/review-drawer-shell/review-drawer-shell-config.d.ts.map +1 -0
  126. package/dist/src/presentation/web/components/common/review-drawer-shell/review-drawer-shell-config.js +1 -0
  127. package/dist/src/presentation/web/components/common/review-drawer-shell/review-drawer-shell.d.ts +3 -0
  128. package/dist/src/presentation/web/components/common/review-drawer-shell/review-drawer-shell.d.ts.map +1 -0
  129. package/dist/src/presentation/web/components/common/review-drawer-shell/review-drawer-shell.js +17 -0
  130. package/dist/src/presentation/web/components/common/review-drawer-shell/review-drawer-shell.stories.d.ts +14 -0
  131. package/dist/src/presentation/web/components/common/review-drawer-shell/review-drawer-shell.stories.d.ts.map +1 -0
  132. package/dist/src/presentation/web/components/common/review-drawer-shell/review-drawer-shell.stories.js +33 -0
  133. package/dist/src/presentation/web/components/common/tech-decisions-review/index.d.ts +4 -0
  134. package/dist/src/presentation/web/components/common/tech-decisions-review/index.d.ts.map +1 -0
  135. package/dist/src/presentation/web/components/common/tech-decisions-review/index.js +2 -0
  136. package/dist/src/presentation/web/components/common/tech-decisions-review/tech-decisions-drawer.d.ts +3 -0
  137. package/dist/src/presentation/web/components/common/tech-decisions-review/tech-decisions-drawer.d.ts.map +1 -0
  138. package/dist/src/presentation/web/components/common/tech-decisions-review/tech-decisions-drawer.js +7 -0
  139. package/dist/src/presentation/web/components/common/tech-decisions-review/tech-decisions-review-config.d.ts +39 -0
  140. package/dist/src/presentation/web/components/common/tech-decisions-review/tech-decisions-review-config.d.ts.map +1 -0
  141. package/dist/src/presentation/web/components/common/tech-decisions-review/tech-decisions-review-config.js +1 -0
  142. package/dist/src/presentation/web/components/common/tech-decisions-review/tech-decisions-review.d.ts +3 -0
  143. package/dist/src/presentation/web/components/common/tech-decisions-review/tech-decisions-review.d.ts.map +1 -0
  144. package/dist/src/presentation/web/components/common/tech-decisions-review/tech-decisions-review.js +39 -0
  145. package/dist/src/presentation/web/components/common/tech-decisions-review/tech-decisions-review.stories.d.ts +22 -0
  146. package/dist/src/presentation/web/components/common/tech-decisions-review/tech-decisions-review.stories.d.ts.map +1 -0
  147. package/dist/src/presentation/web/components/common/tech-decisions-review/tech-decisions-review.stories.js +108 -0
  148. package/dist/src/presentation/web/components/features/control-center/control-center-inner.d.ts.map +1 -1
  149. package/dist/src/presentation/web/components/features/control-center/control-center-inner.js +133 -2
  150. package/dist/src/presentation/web/components/features/control-center/use-control-center-state.d.ts.map +1 -1
  151. package/dist/src/presentation/web/components/features/control-center/use-control-center-state.js +28 -19
  152. package/dist/src/presentation/web/components/layouts/app-shell/app-shell.d.ts.map +1 -1
  153. package/dist/src/presentation/web/components/layouts/app-shell/app-shell.js +6 -1
  154. package/dist/src/presentation/web/components/ui/drawer.d.ts.map +1 -1
  155. package/dist/src/presentation/web/components/ui/drawer.js +3 -1
  156. package/dist/src/presentation/web/components/ui/dropdown-menu.d.ts +28 -0
  157. package/dist/src/presentation/web/components/ui/dropdown-menu.d.ts.map +1 -0
  158. package/dist/src/presentation/web/components/ui/dropdown-menu.js +33 -0
  159. package/dist/src/presentation/web/hooks/agent-events-provider.d.ts +13 -0
  160. package/dist/src/presentation/web/hooks/agent-events-provider.d.ts.map +1 -0
  161. package/dist/src/presentation/web/hooks/agent-events-provider.js +20 -0
  162. package/dist/src/presentation/web/hooks/use-agent-events.d.ts.map +1 -1
  163. package/dist/src/presentation/web/hooks/use-agent-events.js +21 -1
  164. package/dist/src/presentation/web/hooks/use-notifications.d.ts +1 -5
  165. package/dist/src/presentation/web/hooks/use-notifications.d.ts.map +1 -1
  166. package/dist/src/presentation/web/hooks/use-notifications.js +5 -10
  167. package/dist/src/presentation/web/next.config.d.ts.map +1 -1
  168. package/dist/src/presentation/web/next.config.js +5 -0
  169. package/dist/tsconfig.build.tsbuildinfo +1 -1
  170. package/package.json +2 -1
  171. package/web/.next/BUILD_ID +1 -1
  172. package/web/.next/app-path-routes-manifest.json +0 -5
  173. package/web/.next/build-manifest.json +6 -6
  174. package/web/.next/cache/.previewinfo +1 -1
  175. package/web/.next/cache/.rscinfo +1 -1
  176. package/web/.next/cache/.tsbuildinfo +1 -1
  177. package/web/.next/cache/config.json +3 -3
  178. package/web/.next/fallback-build-manifest.json +2 -2
  179. package/web/.next/prerender-manifest.json +3 -3
  180. package/web/.next/required-server-files.js +4 -4
  181. package/web/.next/required-server-files.json +4 -4
  182. package/web/.next/routes-manifest.json +1 -34
  183. package/web/.next/server/app/_global-error/page/build-manifest.json +4 -4
  184. package/web/.next/server/app/_global-error/page.js +1 -1
  185. package/web/.next/server/app/_global-error/page.js.nft.json +1 -1
  186. package/web/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  187. package/web/.next/server/app/_global-error.html +2 -2
  188. package/web/.next/server/app/_global-error.rsc +7 -7
  189. package/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +2 -2
  190. package/web/.next/server/app/_global-error.segments/_full.segment.rsc +7 -7
  191. package/web/.next/server/app/_global-error.segments/_head.segment.rsc +3 -3
  192. package/web/.next/server/app/_global-error.segments/_index.segment.rsc +3 -3
  193. package/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  194. package/web/.next/server/app/_not-found/page/build-manifest.json +4 -4
  195. package/web/.next/server/app/_not-found/page.js +1 -1
  196. package/web/.next/server/app/_not-found/page.js.nft.json +1 -1
  197. package/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  198. package/web/.next/server/app/api/agent-events/route.js +1 -1
  199. package/web/.next/server/app/api/agent-events/route.js.nft.json +1 -1
  200. package/web/.next/server/app/api/dialog/pick-files/route.js +2 -2
  201. package/web/.next/server/app/api/dialog/pick-files/route.js.nft.json +1 -1
  202. package/web/.next/server/app/page/build-manifest.json +4 -4
  203. package/web/.next/server/app/page/server-reference-manifest.json +137 -1
  204. package/web/.next/server/app/page.js +2 -2
  205. package/web/.next/server/app/page.js.nft.json +1 -1
  206. package/web/.next/server/app/page_client-reference-manifest.js +1 -1
  207. package/web/.next/server/app/version/page/build-manifest.json +4 -4
  208. package/web/.next/server/app/version/page.js +1 -1
  209. package/web/.next/server/app/version/page.js.nft.json +1 -1
  210. package/web/.next/server/app/version/page_client-reference-manifest.js +1 -1
  211. package/web/.next/server/app-paths-manifest.json +0 -5
  212. package/web/.next/server/chunks/{403f9_next_567de315._.js → 403f9_next_435614de._.js} +7 -6
  213. package/web/.next/server/chunks/403f9_next_435614de._.js.map +1 -0
  214. package/web/.next/server/chunks/[externals]__ba6223e5._.js +3 -0
  215. package/web/.next/server/chunks/[root-of-the-server]__7d5c8b74._.js +6 -0
  216. package/web/.next/server/chunks/[root-of-the-server]__7d5c8b74._.js.map +1 -0
  217. package/web/.next/server/chunks/ssr/[externals]_node:path_d28a9bfe._.js +3 -0
  218. package/web/.next/server/chunks/ssr/[root-of-the-server]__03a0dba7._.js +12 -0
  219. package/web/.next/server/chunks/ssr/[root-of-the-server]__03a0dba7._.js.map +1 -0
  220. package/web/.next/server/chunks/ssr/[root-of-the-server]__19354aea._.js +9 -0
  221. package/web/.next/server/chunks/ssr/[root-of-the-server]__19354aea._.js.map +1 -0
  222. package/web/.next/server/chunks/ssr/{[root-of-the-server]__685eaa45._.js → [root-of-the-server]__32472b89._.js} +2 -2
  223. package/web/.next/server/chunks/ssr/{[root-of-the-server]__a21ef212._.js → [root-of-the-server]__d21f0894._.js} +2 -2
  224. package/web/.next/server/chunks/ssr/[root-of-the-server]__d21f0894._.js.map +1 -0
  225. package/web/.next/server/chunks/ssr/[root-of-the-server]__e1c44885._.js +3 -0
  226. package/web/.next/server/chunks/ssr/[root-of-the-server]__f12b60be._.js +1 -1
  227. package/web/.next/server/chunks/ssr/[root-of-the-server]__f47a461b._.js +3 -0
  228. package/web/.next/server/chunks/ssr/_285de9aa._.js +3 -0
  229. package/web/.next/server/chunks/ssr/_285de9aa._.js.map +1 -0
  230. package/web/.next/{standalone/src/presentation/web/.next/server/chunks/ssr/_94d22d37._.js → server/chunks/ssr/_b1f2507a._.js} +4 -4
  231. package/web/.next/server/chunks/ssr/_b1f2507a._.js.map +1 -0
  232. package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_version_version-page-client_tsx_fe9db753._.js +1 -1
  233. package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_version_version-page-client_tsx_fe9db753._.js.map +1 -1
  234. package/web/.next/server/chunks/ssr/src_presentation_web_components_e599bb8c._.js +1 -1
  235. package/web/.next/server/chunks/ssr/src_presentation_web_components_e599bb8c._.js.map +1 -1
  236. package/web/.next/server/chunks/ssr/src_presentation_web_components_ui_badge_tsx_964c2a3b._.js +1 -1
  237. package/web/.next/server/chunks/ssr/src_presentation_web_components_ui_badge_tsx_964c2a3b._.js.map +1 -1
  238. package/web/.next/server/chunks/ssr/src_presentation_web_ed0934e5._.js +1 -1
  239. package/web/.next/server/chunks/ssr/src_presentation_web_ed0934e5._.js.map +1 -1
  240. package/web/.next/server/middleware-build-manifest.js +4 -4
  241. package/web/.next/server/pages/500.html +2 -2
  242. package/web/.next/server/server-reference-manifest.js +1 -1
  243. package/web/.next/server/server-reference-manifest.json +138 -2
  244. package/web/.next/standalone/src/presentation/web/.next/BUILD_ID +1 -1
  245. package/web/.next/standalone/src/presentation/web/.next/app-path-routes-manifest.json +0 -5
  246. package/web/.next/standalone/src/presentation/web/.next/build-manifest.json +6 -6
  247. package/web/.next/standalone/src/presentation/web/.next/prerender-manifest.json +3 -3
  248. package/web/.next/standalone/src/presentation/web/.next/required-server-files.json +4 -4
  249. package/web/.next/standalone/src/presentation/web/.next/routes-manifest.json +1 -34
  250. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error/page/build-manifest.json +4 -4
  251. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error/page.js +1 -1
  252. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error/page.js.nft.json +1 -1
  253. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  254. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.html +2 -2
  255. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.rsc +7 -7
  256. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +2 -2
  257. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/_full.segment.rsc +7 -7
  258. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/_head.segment.rsc +3 -3
  259. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/_index.segment.rsc +3 -3
  260. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  261. package/web/.next/standalone/src/presentation/web/.next/server/app/_not-found/page/build-manifest.json +4 -4
  262. package/web/.next/standalone/src/presentation/web/.next/server/app/_not-found/page.js +1 -1
  263. package/web/.next/standalone/src/presentation/web/.next/server/app/_not-found/page.js.nft.json +1 -1
  264. package/web/.next/standalone/src/presentation/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  265. package/web/.next/standalone/src/presentation/web/.next/server/app/api/agent-events/route.js +1 -1
  266. package/web/.next/standalone/src/presentation/web/.next/server/app/api/agent-events/route.js.nft.json +1 -1
  267. package/web/.next/standalone/src/presentation/web/.next/server/app/api/dialog/pick-files/route.js +2 -2
  268. package/web/.next/standalone/src/presentation/web/.next/server/app/api/dialog/pick-files/route.js.nft.json +1 -1
  269. package/web/.next/standalone/src/presentation/web/.next/server/app/page/build-manifest.json +4 -4
  270. package/web/.next/standalone/src/presentation/web/.next/server/app/page/server-reference-manifest.json +137 -1
  271. package/web/.next/standalone/src/presentation/web/.next/server/app/page.js +2 -2
  272. package/web/.next/standalone/src/presentation/web/.next/server/app/page.js.nft.json +1 -1
  273. package/web/.next/standalone/src/presentation/web/.next/server/app/page_client-reference-manifest.js +1 -1
  274. package/web/.next/standalone/src/presentation/web/.next/server/app/version/page/build-manifest.json +4 -4
  275. package/web/.next/standalone/src/presentation/web/.next/server/app/version/page.js +1 -1
  276. package/web/.next/standalone/src/presentation/web/.next/server/app/version/page.js.nft.json +1 -1
  277. package/web/.next/standalone/src/presentation/web/.next/server/app/version/page_client-reference-manifest.js +1 -1
  278. package/web/.next/standalone/src/presentation/web/.next/server/app-paths-manifest.json +0 -5
  279. package/web/.next/standalone/src/presentation/web/.next/server/chunks/{403f9_next_567de315._.js → 403f9_next_435614de._.js} +7 -6
  280. package/web/.next/standalone/src/presentation/web/.next/server/chunks/[externals]__ba6223e5._.js +3 -0
  281. package/web/.next/standalone/src/presentation/web/.next/server/chunks/[root-of-the-server]__7d5c8b74._.js +6 -0
  282. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[externals]_node:path_d28a9bfe._.js +3 -0
  283. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__03a0dba7._.js +12 -0
  284. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__19354aea._.js +9 -0
  285. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/{[root-of-the-server]__685eaa45._.js → [root-of-the-server]__32472b89._.js} +2 -2
  286. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/{[root-of-the-server]__a21ef212._.js → [root-of-the-server]__d21f0894._.js} +2 -2
  287. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__e1c44885._.js +3 -0
  288. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__f12b60be._.js +1 -1
  289. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__f47a461b._.js +3 -0
  290. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_285de9aa._.js +3 -0
  291. package/web/.next/{server/chunks/ssr/_94d22d37._.js → standalone/src/presentation/web/.next/server/chunks/ssr/_b1f2507a._.js} +4 -4
  292. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_version_version-page-client_tsx_fe9db753._.js +1 -1
  293. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/src_presentation_web_components_e599bb8c._.js +1 -1
  294. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/src_presentation_web_components_ui_badge_tsx_964c2a3b._.js +1 -1
  295. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/src_presentation_web_ed0934e5._.js +1 -1
  296. package/web/.next/standalone/src/presentation/web/.next/server/middleware-build-manifest.js +4 -4
  297. package/web/.next/standalone/src/presentation/web/.next/server/pages/500.html +2 -2
  298. package/web/.next/standalone/src/presentation/web/.next/server/server-reference-manifest.js +1 -1
  299. package/web/.next/standalone/src/presentation/web/.next/server/server-reference-manifest.json +138 -2
  300. package/web/.next/standalone/src/presentation/web/app/actions/approve-feature.ts +38 -0
  301. package/web/.next/standalone/src/presentation/web/app/actions/create-feature.ts +81 -0
  302. package/web/.next/standalone/src/presentation/web/app/actions/delete-feature.ts +22 -0
  303. package/web/.next/standalone/src/presentation/web/app/actions/get-feature-artifact.ts +55 -0
  304. package/web/.next/standalone/src/presentation/web/app/actions/get-research-artifact.ts +42 -0
  305. package/web/.next/standalone/src/presentation/web/app/actions/open-folder.ts +44 -0
  306. package/web/.next/standalone/src/presentation/web/app/actions/open-ide.ts +37 -0
  307. package/web/.next/standalone/src/presentation/web/app/{api/shell/open/route.ts → actions/open-shell.ts} +19 -27
  308. package/web/.next/standalone/src/presentation/web/app/{api/dialog/pick-folder/route.ts → actions/pick-folder.ts} +5 -9
  309. package/web/.next/standalone/src/presentation/web/app/api/agent-events/route.ts +2 -14
  310. package/web/.next/standalone/src/presentation/web/app/api/dialog/pick-files/route.ts +8 -10
  311. package/web/.next/standalone/src/presentation/web/app/globals.css +10 -0
  312. package/web/.next/standalone/src/presentation/web/app/page.tsx +1 -0
  313. package/web/.next/standalone/src/presentation/web/components/common/add-repository-node/pick-folder.ts +7 -7
  314. package/web/.next/standalone/src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.tsx +1 -1
  315. package/web/.next/standalone/src/presentation/web/components/common/feature-create-drawer/pick-files.ts +6 -7
  316. package/web/.next/standalone/src/presentation/web/components/common/feature-drawer/feature-drawer.tsx +15 -19
  317. package/web/.next/standalone/src/presentation/web/components/common/feature-drawer/use-feature-actions.ts +61 -17
  318. package/web/.next/standalone/src/presentation/web/components/common/feature-node/agent-type-icons.tsx +10 -2
  319. package/web/.next/standalone/src/presentation/web/components/common/feature-node/feature-node-state-config.ts +2 -0
  320. package/web/.next/standalone/src/presentation/web/components/common/feature-node/feature-node.stories.tsx +10 -0
  321. package/web/.next/standalone/src/presentation/web/components/common/feature-node/feature-node.tsx +38 -7
  322. package/web/.next/standalone/src/presentation/web/components/common/index.ts +18 -0
  323. package/web/.next/standalone/src/presentation/web/components/common/notification-permission-banner/index.ts +1 -0
  324. package/web/.next/standalone/src/presentation/web/components/common/notification-permission-banner/notification-permission-banner.stories.tsx +52 -0
  325. package/web/.next/standalone/src/presentation/web/components/common/notification-permission-banner/notification-permission-banner.tsx +55 -0
  326. package/web/.next/standalone/src/presentation/web/components/common/open-action-menu/config.ts +10 -0
  327. package/web/.next/standalone/src/presentation/web/components/common/open-action-menu/index.ts +2 -0
  328. package/web/.next/standalone/src/presentation/web/components/common/open-action-menu/open-action-menu.stories.tsx +64 -0
  329. package/web/.next/standalone/src/presentation/web/components/common/open-action-menu/open-action-menu.tsx +111 -0
  330. package/web/.next/standalone/src/presentation/web/components/common/prd-questionnaire/index.ts +10 -0
  331. package/web/.next/standalone/src/presentation/web/components/common/prd-questionnaire/prd-questionnaire-config.ts +48 -0
  332. package/web/.next/standalone/src/presentation/web/components/common/prd-questionnaire/prd-questionnaire-drawer.tsx +34 -0
  333. package/web/.next/standalone/src/presentation/web/components/common/prd-questionnaire/prd-questionnaire.stories.tsx +384 -0
  334. package/web/.next/standalone/src/presentation/web/components/common/prd-questionnaire/prd-questionnaire.tsx +216 -0
  335. package/web/.next/standalone/src/presentation/web/components/common/repository-node/repository-node.tsx +20 -1
  336. package/web/.next/standalone/src/presentation/web/components/common/repository-node/use-repository-actions.ts +83 -20
  337. package/web/.next/standalone/src/presentation/web/components/common/review-drawer-shell/index.ts +2 -0
  338. package/web/.next/standalone/src/presentation/web/components/common/review-drawer-shell/review-drawer-shell-config.ts +24 -0
  339. package/web/.next/standalone/src/presentation/web/components/common/review-drawer-shell/review-drawer-shell.stories.tsx +85 -0
  340. package/web/.next/standalone/src/presentation/web/components/common/review-drawer-shell/review-drawer-shell.tsx +139 -0
  341. package/web/.next/standalone/src/presentation/web/components/common/tech-decisions-review/index.ts +8 -0
  342. package/web/.next/standalone/src/presentation/web/components/common/tech-decisions-review/tech-decisions-drawer.tsx +34 -0
  343. package/web/.next/standalone/src/presentation/web/components/common/tech-decisions-review/tech-decisions-review-config.ts +42 -0
  344. package/web/.next/standalone/src/presentation/web/components/common/tech-decisions-review/tech-decisions-review.stories.tsx +177 -0
  345. package/web/.next/standalone/src/presentation/web/components/common/tech-decisions-review/tech-decisions-review.tsx +188 -0
  346. package/web/.next/standalone/src/presentation/web/components/features/control-center/control-center-inner.tsx +189 -2
  347. package/web/.next/standalone/src/presentation/web/components/features/control-center/use-control-center-state.ts +28 -19
  348. package/web/.next/standalone/src/presentation/web/components/layouts/app-shell/app-shell.tsx +11 -1
  349. package/web/.next/standalone/src/presentation/web/components/ui/drawer.tsx +4 -2
  350. package/web/.next/standalone/src/presentation/web/components/ui/dropdown-menu.tsx +187 -0
  351. package/web/.next/standalone/src/presentation/web/hooks/agent-events-provider.tsx +32 -0
  352. package/web/.next/standalone/src/presentation/web/hooks/use-agent-events.ts +23 -1
  353. package/web/.next/standalone/src/presentation/web/hooks/use-notifications.ts +5 -16
  354. package/web/.next/standalone/src/presentation/web/next.config.ts +6 -0
  355. package/web/.next/standalone/src/presentation/web/package.json +2 -1
  356. package/web/.next/standalone/src/presentation/web/server.js +1 -1
  357. package/web/.next/static/chunks/{70993ebedee7eab0.js → 084314470f2144d2.js} +1 -1
  358. package/web/.next/static/chunks/36bb03a0314fb990.css +2 -0
  359. package/web/.next/static/chunks/83ff3b6bbee54bce.js +1 -0
  360. package/web/.next/static/chunks/{fe5e04e707adb039.js → 8c0b96eb95dd31a9.js} +1 -1
  361. package/web/.next/static/chunks/{df7d29673e0ac11d.js → b13aa397579082e7.js} +1 -1
  362. package/web/.next/static/chunks/{f3b4460b1496ef52.js → cfe4dc9904fcfddb.js} +1 -1
  363. package/web/.next/static/chunks/e21d644e5a584136.js +1 -0
  364. package/web/.next/static/chunks/eca1959e083d0a45.js +10 -0
  365. package/web/.next/static/chunks/f9519a5c455143e6.js +1 -0
  366. package/web/.next/static/chunks/{c4b1e95eceaa36ca.js → fe6427c156bda6b0.js} +2 -2
  367. package/web/.next/static/chunks/{37bc3e283f734dca.js → fe70e73feb07bcfd.js} +1 -1
  368. package/web/.next/static/chunks/{turbopack-a5a88a85e7ac8e8d.js → turbopack-35ff53de4dab1e56.js} +2 -2
  369. package/web/.next/trace +1 -1
  370. package/web/.next/trace-build +1 -1
  371. package/web/.next/types/link.d.ts +1 -6
  372. package/web/.next/types/routes.d.ts +1 -6
  373. package/web/.next/types/validator.ts +0 -45
  374. package/web/package.json +2 -1
  375. package/dist/src/presentation/web/app/api/dialog/pick-folder/route.d.ts +0 -11
  376. package/dist/src/presentation/web/app/api/dialog/pick-folder/route.d.ts.map +0 -1
  377. package/dist/src/presentation/web/app/api/dialog/pick-folder/route.js +0 -16
  378. package/dist/src/presentation/web/app/api/features/[id]/route.d.ts +0 -11
  379. package/dist/src/presentation/web/app/api/features/[id]/route.d.ts.map +0 -1
  380. package/dist/src/presentation/web/app/api/features/[id]/route.js +0 -17
  381. package/dist/src/presentation/web/app/api/features/create/route.d.ts +0 -5
  382. package/dist/src/presentation/web/app/api/features/create/route.d.ts.map +0 -1
  383. package/dist/src/presentation/web/app/api/features/create/route.js +0 -65
  384. package/dist/src/presentation/web/app/api/ide/open/route.d.ts +0 -9
  385. package/dist/src/presentation/web/app/api/ide/open/route.d.ts.map +0 -1
  386. package/dist/src/presentation/web/app/api/ide/open/route.js +0 -36
  387. package/dist/src/presentation/web/app/api/shell/open/route.d.ts +0 -9
  388. package/dist/src/presentation/web/app/api/shell/open/route.d.ts.map +0 -1
  389. package/dist/src/presentation/web/app/api/shell/open/route.js +0 -57
  390. package/dist/src/presentation/web/app/api/validate-toolbar-input.d.ts +0 -18
  391. package/dist/src/presentation/web/app/api/validate-toolbar-input.d.ts.map +0 -1
  392. package/dist/src/presentation/web/app/api/validate-toolbar-input.js +0 -29
  393. package/web/.next/server/app/api/dialog/pick-folder/route/app-paths-manifest.json +0 -3
  394. package/web/.next/server/app/api/dialog/pick-folder/route/build-manifest.json +0 -11
  395. package/web/.next/server/app/api/dialog/pick-folder/route/server-reference-manifest.json +0 -4
  396. package/web/.next/server/app/api/dialog/pick-folder/route.js +0 -7
  397. package/web/.next/server/app/api/dialog/pick-folder/route.js.map +0 -5
  398. package/web/.next/server/app/api/dialog/pick-folder/route.js.nft.json +0 -1
  399. package/web/.next/server/app/api/dialog/pick-folder/route_client-reference-manifest.js +0 -2
  400. package/web/.next/server/app/api/features/[id]/route/app-paths-manifest.json +0 -3
  401. package/web/.next/server/app/api/features/[id]/route/build-manifest.json +0 -11
  402. package/web/.next/server/app/api/features/[id]/route/server-reference-manifest.json +0 -4
  403. package/web/.next/server/app/api/features/[id]/route.js +0 -7
  404. package/web/.next/server/app/api/features/[id]/route.js.map +0 -5
  405. package/web/.next/server/app/api/features/[id]/route.js.nft.json +0 -1
  406. package/web/.next/server/app/api/features/[id]/route_client-reference-manifest.js +0 -2
  407. package/web/.next/server/app/api/features/create/route/app-paths-manifest.json +0 -3
  408. package/web/.next/server/app/api/features/create/route/build-manifest.json +0 -11
  409. package/web/.next/server/app/api/features/create/route/server-reference-manifest.json +0 -4
  410. package/web/.next/server/app/api/features/create/route.js +0 -7
  411. package/web/.next/server/app/api/features/create/route.js.map +0 -5
  412. package/web/.next/server/app/api/features/create/route.js.nft.json +0 -1
  413. package/web/.next/server/app/api/features/create/route_client-reference-manifest.js +0 -2
  414. package/web/.next/server/app/api/ide/open/route/app-paths-manifest.json +0 -3
  415. package/web/.next/server/app/api/ide/open/route/build-manifest.json +0 -11
  416. package/web/.next/server/app/api/ide/open/route/server-reference-manifest.json +0 -4
  417. package/web/.next/server/app/api/ide/open/route.js +0 -7
  418. package/web/.next/server/app/api/ide/open/route.js.map +0 -5
  419. package/web/.next/server/app/api/ide/open/route.js.nft.json +0 -1
  420. package/web/.next/server/app/api/ide/open/route_client-reference-manifest.js +0 -2
  421. package/web/.next/server/app/api/shell/open/route/app-paths-manifest.json +0 -3
  422. package/web/.next/server/app/api/shell/open/route/build-manifest.json +0 -11
  423. package/web/.next/server/app/api/shell/open/route/server-reference-manifest.json +0 -4
  424. package/web/.next/server/app/api/shell/open/route.js +0 -7
  425. package/web/.next/server/app/api/shell/open/route.js.map +0 -5
  426. package/web/.next/server/app/api/shell/open/route.js.nft.json +0 -1
  427. package/web/.next/server/app/api/shell/open/route_client-reference-manifest.js +0 -2
  428. package/web/.next/server/chunks/403f9_next_567de315._.js.map +0 -1
  429. package/web/.next/server/chunks/744ca_web__next-internal_server_app_api_dialog_pick-folder_route_actions_375ed12f.js +0 -3
  430. package/web/.next/server/chunks/744ca_web__next-internal_server_app_api_features_[id]_route_actions_03b9a4b5.js +0 -3
  431. package/web/.next/server/chunks/744ca_web__next-internal_server_app_api_features_create_route_actions_de49a114.js +0 -3
  432. package/web/.next/server/chunks/744ca_web__next-internal_server_app_api_features_create_route_actions_de49a114.js.map +0 -1
  433. package/web/.next/server/chunks/744ca_web__next-internal_server_app_api_shell_open_route_actions_814dc5b6.js +0 -3
  434. package/web/.next/server/chunks/744ca_web__next-internal_server_app_api_shell_open_route_actions_814dc5b6.js.map +0 -1
  435. package/web/.next/server/chunks/[root-of-the-server]__04ae3a77._.js +0 -3
  436. package/web/.next/server/chunks/[root-of-the-server]__04ae3a77._.js.map +0 -1
  437. package/web/.next/server/chunks/[root-of-the-server]__3d63a020._.js +0 -8
  438. package/web/.next/server/chunks/[root-of-the-server]__3d63a020._.js.map +0 -1
  439. package/web/.next/server/chunks/[root-of-the-server]__a6bf88cc._.js +0 -4
  440. package/web/.next/server/chunks/[root-of-the-server]__a6bf88cc._.js.map +0 -1
  441. package/web/.next/server/chunks/[root-of-the-server]__acfd2769._.js +0 -3
  442. package/web/.next/server/chunks/[root-of-the-server]__acfd2769._.js.map +0 -1
  443. package/web/.next/server/chunks/[root-of-the-server]__ec87d735._.js +0 -3
  444. package/web/.next/server/chunks/[root-of-the-server]__ec87d735._.js.map +0 -1
  445. package/web/.next/server/chunks/[root-of-the-server]__ecaf05bc._.js +0 -3
  446. package/web/.next/server/chunks/[root-of-the-server]__ecaf05bc._.js.map +0 -1
  447. package/web/.next/server/chunks/[root-of-the-server]__f32c280c._.js +0 -3
  448. package/web/.next/server/chunks/[root-of-the-server]__f32c280c._.js.map +0 -1
  449. package/web/.next/server/chunks/b1a17_presentation_web__next-internal_server_app_api_ide_open_route_actions_9fe6e1cd.js +0 -3
  450. package/web/.next/server/chunks/b1a17_presentation_web__next-internal_server_app_api_ide_open_route_actions_9fe6e1cd.js.map +0 -1
  451. package/web/.next/server/chunks/ssr/[root-of-the-server]__1eade43f._.js +0 -3
  452. package/web/.next/server/chunks/ssr/[root-of-the-server]__1eade43f._.js.map +0 -1
  453. package/web/.next/server/chunks/ssr/[root-of-the-server]__97377864._.js +0 -3
  454. package/web/.next/server/chunks/ssr/[root-of-the-server]__a21ef212._.js.map +0 -1
  455. package/web/.next/server/chunks/ssr/[root-of-the-server]__f285e474._.js +0 -3
  456. package/web/.next/server/chunks/ssr/_09afa42a._.js +0 -10
  457. package/web/.next/server/chunks/ssr/_09afa42a._.js.map +0 -1
  458. package/web/.next/server/chunks/ssr/_4676cf52._.js +0 -3
  459. package/web/.next/server/chunks/ssr/_4676cf52._.js.map +0 -1
  460. package/web/.next/server/chunks/ssr/_94d22d37._.js.map +0 -1
  461. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_page_actions_a4e3cb6f.js +0 -3
  462. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_page_actions_a4e3cb6f.js.map +0 -1
  463. package/web/.next/standalone/src/presentation/web/.next/server/app/api/dialog/pick-folder/route/app-paths-manifest.json +0 -3
  464. package/web/.next/standalone/src/presentation/web/.next/server/app/api/dialog/pick-folder/route/build-manifest.json +0 -11
  465. package/web/.next/standalone/src/presentation/web/.next/server/app/api/dialog/pick-folder/route/server-reference-manifest.json +0 -4
  466. package/web/.next/standalone/src/presentation/web/.next/server/app/api/dialog/pick-folder/route.js +0 -7
  467. package/web/.next/standalone/src/presentation/web/.next/server/app/api/dialog/pick-folder/route.js.map +0 -5
  468. package/web/.next/standalone/src/presentation/web/.next/server/app/api/dialog/pick-folder/route.js.nft.json +0 -1
  469. package/web/.next/standalone/src/presentation/web/.next/server/app/api/dialog/pick-folder/route_client-reference-manifest.js +0 -2
  470. package/web/.next/standalone/src/presentation/web/.next/server/app/api/features/[id]/route/app-paths-manifest.json +0 -3
  471. package/web/.next/standalone/src/presentation/web/.next/server/app/api/features/[id]/route/build-manifest.json +0 -11
  472. package/web/.next/standalone/src/presentation/web/.next/server/app/api/features/[id]/route/server-reference-manifest.json +0 -4
  473. package/web/.next/standalone/src/presentation/web/.next/server/app/api/features/[id]/route.js +0 -7
  474. package/web/.next/standalone/src/presentation/web/.next/server/app/api/features/[id]/route.js.map +0 -5
  475. package/web/.next/standalone/src/presentation/web/.next/server/app/api/features/[id]/route.js.nft.json +0 -1
  476. package/web/.next/standalone/src/presentation/web/.next/server/app/api/features/[id]/route_client-reference-manifest.js +0 -2
  477. package/web/.next/standalone/src/presentation/web/.next/server/app/api/features/create/route/app-paths-manifest.json +0 -3
  478. package/web/.next/standalone/src/presentation/web/.next/server/app/api/features/create/route/build-manifest.json +0 -11
  479. package/web/.next/standalone/src/presentation/web/.next/server/app/api/features/create/route/server-reference-manifest.json +0 -4
  480. package/web/.next/standalone/src/presentation/web/.next/server/app/api/features/create/route.js +0 -7
  481. package/web/.next/standalone/src/presentation/web/.next/server/app/api/features/create/route.js.map +0 -5
  482. package/web/.next/standalone/src/presentation/web/.next/server/app/api/features/create/route.js.nft.json +0 -1
  483. package/web/.next/standalone/src/presentation/web/.next/server/app/api/features/create/route_client-reference-manifest.js +0 -2
  484. package/web/.next/standalone/src/presentation/web/.next/server/app/api/ide/open/route/app-paths-manifest.json +0 -3
  485. package/web/.next/standalone/src/presentation/web/.next/server/app/api/ide/open/route/build-manifest.json +0 -11
  486. package/web/.next/standalone/src/presentation/web/.next/server/app/api/ide/open/route/server-reference-manifest.json +0 -4
  487. package/web/.next/standalone/src/presentation/web/.next/server/app/api/ide/open/route.js +0 -7
  488. package/web/.next/standalone/src/presentation/web/.next/server/app/api/ide/open/route.js.map +0 -5
  489. package/web/.next/standalone/src/presentation/web/.next/server/app/api/ide/open/route.js.nft.json +0 -1
  490. package/web/.next/standalone/src/presentation/web/.next/server/app/api/ide/open/route_client-reference-manifest.js +0 -2
  491. package/web/.next/standalone/src/presentation/web/.next/server/app/api/shell/open/route/app-paths-manifest.json +0 -3
  492. package/web/.next/standalone/src/presentation/web/.next/server/app/api/shell/open/route/build-manifest.json +0 -11
  493. package/web/.next/standalone/src/presentation/web/.next/server/app/api/shell/open/route/server-reference-manifest.json +0 -4
  494. package/web/.next/standalone/src/presentation/web/.next/server/app/api/shell/open/route.js +0 -7
  495. package/web/.next/standalone/src/presentation/web/.next/server/app/api/shell/open/route.js.map +0 -5
  496. package/web/.next/standalone/src/presentation/web/.next/server/app/api/shell/open/route.js.nft.json +0 -1
  497. package/web/.next/standalone/src/presentation/web/.next/server/app/api/shell/open/route_client-reference-manifest.js +0 -2
  498. package/web/.next/standalone/src/presentation/web/.next/server/chunks/744ca_web__next-internal_server_app_api_dialog_pick-folder_route_actions_375ed12f.js +0 -3
  499. package/web/.next/standalone/src/presentation/web/.next/server/chunks/744ca_web__next-internal_server_app_api_features_[id]_route_actions_03b9a4b5.js +0 -3
  500. package/web/.next/standalone/src/presentation/web/.next/server/chunks/744ca_web__next-internal_server_app_api_features_create_route_actions_de49a114.js +0 -3
  501. package/web/.next/standalone/src/presentation/web/.next/server/chunks/744ca_web__next-internal_server_app_api_shell_open_route_actions_814dc5b6.js +0 -3
  502. package/web/.next/standalone/src/presentation/web/.next/server/chunks/[root-of-the-server]__04ae3a77._.js +0 -3
  503. package/web/.next/standalone/src/presentation/web/.next/server/chunks/[root-of-the-server]__3d63a020._.js +0 -8
  504. package/web/.next/standalone/src/presentation/web/.next/server/chunks/[root-of-the-server]__a6bf88cc._.js +0 -4
  505. package/web/.next/standalone/src/presentation/web/.next/server/chunks/[root-of-the-server]__acfd2769._.js +0 -3
  506. package/web/.next/standalone/src/presentation/web/.next/server/chunks/[root-of-the-server]__ec87d735._.js +0 -3
  507. package/web/.next/standalone/src/presentation/web/.next/server/chunks/[root-of-the-server]__ecaf05bc._.js +0 -3
  508. package/web/.next/standalone/src/presentation/web/.next/server/chunks/[root-of-the-server]__f32c280c._.js +0 -3
  509. package/web/.next/standalone/src/presentation/web/.next/server/chunks/b1a17_presentation_web__next-internal_server_app_api_ide_open_route_actions_9fe6e1cd.js +0 -3
  510. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__1eade43f._.js +0 -3
  511. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__97377864._.js +0 -3
  512. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__f285e474._.js +0 -3
  513. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_09afa42a._.js +0 -10
  514. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_4676cf52._.js +0 -3
  515. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_page_actions_a4e3cb6f.js +0 -3
  516. package/web/.next/standalone/src/presentation/web/app/api/features/[id]/route.ts +0 -20
  517. package/web/.next/standalone/src/presentation/web/app/api/features/create/route.ts +0 -103
  518. package/web/.next/standalone/src/presentation/web/app/api/ide/open/route.ts +0 -44
  519. package/web/.next/standalone/src/presentation/web/app/api/validate-toolbar-input.ts +0 -46
  520. package/web/.next/static/chunks/54743561bbaa307a.js +0 -8
  521. package/web/.next/static/chunks/74f27128e5fbfe52.css +0 -2
  522. package/web/.next/static/chunks/9993505b2a26c454.js +0 -1
  523. package/web/.next/static/chunks/c95b4cf170b7f301.js +0 -1
  524. package/web/.next/static/chunks/e78d1b265b8110c3.js +0 -1
  525. /package/web/.next/server/chunks/{744ca_web__next-internal_server_app_api_dialog_pick-folder_route_actions_375ed12f.js.map → [externals]__ba6223e5._.js.map} +0 -0
  526. /package/web/.next/server/chunks/{744ca_web__next-internal_server_app_api_features_[id]_route_actions_03b9a4b5.js.map → ssr/[externals]_node:path_d28a9bfe._.js.map} +0 -0
  527. /package/web/.next/server/chunks/ssr/{[root-of-the-server]__685eaa45._.js.map → [root-of-the-server]__32472b89._.js.map} +0 -0
  528. /package/web/.next/server/chunks/ssr/{[root-of-the-server]__f285e474._.js.map → [root-of-the-server]__e1c44885._.js.map} +0 -0
  529. /package/web/.next/server/chunks/ssr/{[root-of-the-server]__97377864._.js.map → [root-of-the-server]__f47a461b._.js.map} +0 -0
  530. /package/web/.next/static/{AaXDy79mMK8ywoCbOquJB → yvV-GEMagQiZhZAF0YqQs}/_buildManifest.js +0 -0
  531. /package/web/.next/static/{AaXDy79mMK8ywoCbOquJB → yvV-GEMagQiZhZAF0YqQs}/_clientMiddlewareManifest.json +0 -0
  532. /package/web/.next/static/{AaXDy79mMK8ywoCbOquJB → yvV-GEMagQiZhZAF0YqQs}/_ssgManifest.js +0 -0
@@ -0,0 +1,34 @@
1
+ 'use client';
2
+
3
+ import { ReviewDrawerShell } from '@/components/common/review-drawer-shell';
4
+ import { TechDecisionsReview } from './tech-decisions-review';
5
+ import type { TechDecisionsDrawerProps } from './tech-decisions-review-config';
6
+
7
+ export function TechDecisionsDrawer({
8
+ open,
9
+ onClose,
10
+ featureName,
11
+ featureId,
12
+ repositoryPath,
13
+ branch,
14
+ specPath,
15
+ onDelete,
16
+ isDeleting,
17
+ ...reviewProps
18
+ }: TechDecisionsDrawerProps) {
19
+ return (
20
+ <ReviewDrawerShell
21
+ open={open}
22
+ onClose={onClose}
23
+ featureName={featureName}
24
+ featureId={featureId}
25
+ repositoryPath={repositoryPath}
26
+ branch={branch}
27
+ specPath={specPath}
28
+ onDelete={onDelete}
29
+ isDeleting={isDeleting}
30
+ >
31
+ <TechDecisionsReview {...reviewProps} />
32
+ </ReviewDrawerShell>
33
+ );
34
+ }
@@ -0,0 +1,42 @@
1
+ import type { TechDecision } from '@shepai/core/domain/generated/output';
2
+
3
+ export type { TechDecision };
4
+
5
+ export interface TechDecisionsReviewData {
6
+ name: string;
7
+ summary: string;
8
+ decisions: TechDecision[];
9
+ technologies: string[];
10
+ }
11
+
12
+ export interface TechDecisionsReviewProps {
13
+ /** Tech decisions data from the research artifact */
14
+ data: TechDecisionsReviewData;
15
+ /** Chat refinement callback — sends user feedback to the agent */
16
+ onRefine: (text: string) => void;
17
+ /** Approve plan callback */
18
+ onApprove: () => void;
19
+ /** Controls disabled state during loading */
20
+ isProcessing?: boolean;
21
+ }
22
+
23
+ export interface TechDecisionsDrawerProps extends TechDecisionsReviewProps {
24
+ /** Whether the drawer is open */
25
+ open: boolean;
26
+ /** Callback when drawer should close */
27
+ onClose: () => void;
28
+ /** Feature name shown in drawer header */
29
+ featureName: string;
30
+ /** Feature ID shown below the name */
31
+ featureId?: string;
32
+ /** Absolute path to the repository on disk */
33
+ repositoryPath?: string;
34
+ /** Git branch name for this feature */
35
+ branch?: string;
36
+ /** Absolute path to the specs folder on disk */
37
+ specPath?: string;
38
+ /** Callback to delete the feature — shows delete button when provided */
39
+ onDelete?: (featureId: string) => void;
40
+ /** Whether a delete operation is in progress */
41
+ isDeleting?: boolean;
42
+ }
@@ -0,0 +1,177 @@
1
+ import { useState } from 'react';
2
+ import type { Meta, StoryObj } from '@storybook/react';
3
+ import { fn } from '@storybook/test';
4
+ import { TechDecisionsReview } from './tech-decisions-review';
5
+ import { TechDecisionsDrawer } from './tech-decisions-drawer';
6
+ import type { TechDecisionsReviewData } from './tech-decisions-review-config';
7
+
8
+ const mockData: TechDecisionsReviewData = {
9
+ name: 'Agent Executor Abstraction',
10
+ summary:
11
+ 'Research into the best approach for abstracting agent executors to support multiple AI backends (Claude Code, Cursor, custom agents).',
12
+ technologies: ['TypeScript', 'tsyringe', 'LangGraph', 'Claude API'],
13
+ decisions: [
14
+ {
15
+ title: 'Agent Execution Framework',
16
+ chosen: 'LangGraph',
17
+ rejected: ['Custom state machine', 'Temporal.io', 'Step Functions'],
18
+ rationale:
19
+ 'LangGraph provides built-in checkpointing, human-in-the-loop support, and integrates natively with LangChain. The custom state machine approach was too low-level and would require rebuilding features LangGraph offers out of the box.',
20
+ },
21
+ {
22
+ title: 'Dependency Injection',
23
+ chosen: 'tsyringe',
24
+ rejected: ['InversifyJS', 'TypeDI', 'Manual DI'],
25
+ rationale:
26
+ 'tsyringe is lightweight, uses standard decorators, and has minimal overhead. InversifyJS was too complex for our needs, and manual DI would not scale well as the agent system grows.',
27
+ },
28
+ {
29
+ title: 'Inter-Process Communication',
30
+ chosen: 'Server-Sent Events (SSE)',
31
+ rejected: ['WebSockets', 'Long Polling', 'gRPC'],
32
+ rationale:
33
+ 'SSE provides a simple one-way streaming protocol that fits our use case perfectly — the agent streams status updates to the UI. WebSockets would add unnecessary complexity for bidirectional communication we do not need.',
34
+ },
35
+ {
36
+ title: 'Configuration Storage',
37
+ chosen: 'SQLite',
38
+ rejected: ['JSON files', 'LevelDB', 'PostgreSQL'],
39
+ rationale:
40
+ 'SQLite offers ACID transactions, SQL query support, and zero-config deployment. JSON files lack transactions and concurrent access support. PostgreSQL would be overkill for a local CLI tool.',
41
+ },
42
+ ],
43
+ };
44
+
45
+ /* ─── Standalone TechDecisionsReview ─── */
46
+
47
+ const meta: Meta<typeof TechDecisionsReview> = {
48
+ title: 'Composed/TechDecisionsReview',
49
+ component: TechDecisionsReview,
50
+ tags: ['autodocs'],
51
+ parameters: {
52
+ layout: 'fullscreen',
53
+ },
54
+ decorators: [
55
+ (Story) => (
56
+ <div style={{ height: '600px', width: '400px', border: '1px solid var(--color-border)' }}>
57
+ <Story />
58
+ </div>
59
+ ),
60
+ ],
61
+ };
62
+
63
+ export default meta;
64
+ type Story = StoryObj<typeof TechDecisionsReview>;
65
+
66
+ /** Default — scrollable list of decisions taken. */
67
+ export const Default: Story = {
68
+ args: {
69
+ data: mockData,
70
+ onRefine: fn().mockName('onRefine'),
71
+ onApprove: fn().mockName('onApprove'),
72
+ },
73
+ };
74
+
75
+ /** Processing state — approve button disabled. */
76
+ export const Processing: Story = {
77
+ args: {
78
+ data: mockData,
79
+ onApprove: fn().mockName('onApprove'),
80
+ isProcessing: true,
81
+ },
82
+ };
83
+
84
+ /** Single decision. */
85
+ export const SingleDecision: Story = {
86
+ args: {
87
+ data: { ...mockData, decisions: [mockData.decisions[0]] },
88
+ onRefine: fn().mockName('onRefine'),
89
+ onApprove: fn().mockName('onApprove'),
90
+ },
91
+ };
92
+
93
+ /** No technologies listed. */
94
+ export const NoTechnologies: Story = {
95
+ args: {
96
+ data: { ...mockData, technologies: [] },
97
+ onRefine: fn().mockName('onRefine'),
98
+ onApprove: fn().mockName('onApprove'),
99
+ },
100
+ };
101
+
102
+ /* ─── Drawer Variant ─── */
103
+
104
+ type DrawerStory = StoryObj<typeof TechDecisionsDrawer>;
105
+
106
+ const drawerMeta = {
107
+ title: 'Composed/TechDecisionsDrawer',
108
+ component: TechDecisionsDrawer,
109
+ tags: ['autodocs'],
110
+ parameters: {
111
+ layout: 'fullscreen',
112
+ },
113
+ };
114
+
115
+ function DrawerTemplate(
116
+ props: Omit<React.ComponentProps<typeof TechDecisionsDrawer>, 'open' | 'onClose'>
117
+ ) {
118
+ const [open, setOpen] = useState(true);
119
+
120
+ return (
121
+ <div style={{ height: '100vh', background: '#f8fafc', padding: '2rem' }}>
122
+ <button
123
+ type="button"
124
+ onClick={() => setOpen(true)}
125
+ style={{ padding: '8px 16px', border: '1px solid #ccc', borderRadius: '6px' }}
126
+ >
127
+ Open Drawer
128
+ </button>
129
+ <TechDecisionsDrawer {...props} open={open} onClose={() => setOpen(false)} />
130
+ </div>
131
+ );
132
+ }
133
+
134
+ /** Drawer with tech decisions list. */
135
+ export const InDrawer: DrawerStory = {
136
+ ...drawerMeta,
137
+ render: () => (
138
+ <DrawerTemplate
139
+ featureName="Agent Executor Abstraction"
140
+ featureId="FEAT-099"
141
+ data={mockData}
142
+ onRefine={fn().mockName('onRefine')}
143
+ onApprove={fn().mockName('onApprove')}
144
+ />
145
+ ),
146
+ };
147
+
148
+ /** Drawer with delete button visible. */
149
+ export const WithDeleteButton: DrawerStory = {
150
+ ...drawerMeta,
151
+ render: () => (
152
+ <DrawerTemplate
153
+ featureName="Agent Executor Abstraction"
154
+ featureId="FEAT-099"
155
+ data={mockData}
156
+ onRefine={fn().mockName('onRefine')}
157
+ onApprove={fn().mockName('onApprove')}
158
+ onDelete={fn().mockName('onDelete')}
159
+ />
160
+ ),
161
+ };
162
+
163
+ /** Drawer with delete in progress (button disabled). */
164
+ export const DeletingState: DrawerStory = {
165
+ ...drawerMeta,
166
+ render: () => (
167
+ <DrawerTemplate
168
+ featureName="Agent Executor Abstraction"
169
+ featureId="FEAT-099"
170
+ data={mockData}
171
+ onRefine={fn().mockName('onRefine')}
172
+ onApprove={fn().mockName('onApprove')}
173
+ onDelete={fn().mockName('onDelete')}
174
+ isDeleting
175
+ />
176
+ ),
177
+ };
@@ -0,0 +1,188 @@
1
+ 'use client';
2
+
3
+ import { useState } from 'react';
4
+ import type { Components } from 'react-markdown';
5
+ import Markdown from 'react-markdown';
6
+ import { Check, ChevronRight, GitCompareArrows, Layers, Send } from 'lucide-react';
7
+ import { Badge } from '@/components/ui/badge';
8
+ import { Button } from '@/components/ui/button';
9
+ import { Input } from '@/components/ui/input';
10
+ import type { TechDecisionsReviewProps, TechDecision } from './tech-decisions-review-config';
11
+
12
+ const markdownComponents: Components = {
13
+ p: ({ children }) => (
14
+ <p className="text-muted-foreground mb-2 text-xs leading-relaxed last:mb-0">{children}</p>
15
+ ),
16
+ strong: ({ children }) => <strong className="text-foreground font-semibold">{children}</strong>,
17
+ em: ({ children }) => <em className="italic">{children}</em>,
18
+ code: ({ children, className }) =>
19
+ className ? (
20
+ <code className={`${className} text-[11px]`}>{children}</code>
21
+ ) : (
22
+ <code className="bg-muted text-foreground rounded-md px-1.5 py-0.5 font-mono text-[11px]">
23
+ {children}
24
+ </code>
25
+ ),
26
+ pre: ({ children }) => (
27
+ <pre className="bg-muted my-2 overflow-x-auto rounded-lg border p-3">{children}</pre>
28
+ ),
29
+ ul: ({ children }) => (
30
+ <ul className="text-muted-foreground mb-2 list-disc space-y-1 pl-4 text-xs">{children}</ul>
31
+ ),
32
+ ol: ({ children }) => (
33
+ <ol className="text-muted-foreground mb-2 list-decimal space-y-1 pl-4 text-xs">{children}</ol>
34
+ ),
35
+ li: ({ children }) => <li className="leading-relaxed">{children}</li>,
36
+ a: ({ children, href }) => (
37
+ <a
38
+ href={href}
39
+ className="text-primary underline underline-offset-2"
40
+ target="_blank"
41
+ rel="noopener noreferrer"
42
+ >
43
+ {children}
44
+ </a>
45
+ ),
46
+ };
47
+
48
+ function DecisionCard({ decision, index }: { decision: TechDecision; index: number }) {
49
+ const [alternativesOpen, setAlternativesOpen] = useState(false);
50
+
51
+ return (
52
+ <div className="border-border rounded-lg border">
53
+ {/* Header: number + title + chosen badge */}
54
+ <div className="space-y-3 px-4 py-3">
55
+ <div className="flex items-start justify-between gap-3">
56
+ <div className="flex items-start gap-2.5">
57
+ <span className="bg-primary text-primary-foreground flex h-6 w-6 shrink-0 items-center justify-center rounded-full text-xs font-bold">
58
+ {index + 1}
59
+ </span>
60
+ <div className="min-w-0">
61
+ <h3 className="text-foreground text-sm leading-tight font-semibold">
62
+ {decision.title}
63
+ </h3>
64
+ <p className="text-muted-foreground mt-0.5 text-xs">{decision.chosen}</p>
65
+ </div>
66
+ </div>
67
+ {'decisionName' in decision &&
68
+ (decision as unknown as { decisionName?: string }).decisionName ? (
69
+ <Badge variant="secondary" className="bg-primary/10 text-primary shrink-0">
70
+ {(decision as unknown as { decisionName: string }).decisionName}
71
+ </Badge>
72
+ ) : null}
73
+ </div>
74
+
75
+ {/* Rationale */}
76
+ {decision.rationale ? (
77
+ <Markdown components={markdownComponents}>{decision.rationale}</Markdown>
78
+ ) : null}
79
+ </div>
80
+
81
+ {/* Rejected alternatives (collapsed by default) */}
82
+ {decision.rejected.length > 0 ? (
83
+ <div className="border-border border-t">
84
+ <button
85
+ type="button"
86
+ onClick={() => setAlternativesOpen((prev) => !prev)}
87
+ className="text-muted-foreground hover:bg-muted/50 flex w-full items-center gap-1.5 px-4 py-3 text-xs font-medium transition-colors"
88
+ >
89
+ <ChevronRight
90
+ className={`h-3.5 w-3.5 transition-transform ${alternativesOpen ? 'rotate-90' : ''}`}
91
+ />
92
+ <Layers className="h-3.5 w-3.5" />
93
+ Other Options Considered ({decision.rejected.length})
94
+ </button>
95
+ {alternativesOpen ? (
96
+ <div className="space-y-1.5 px-4 pb-3">
97
+ {decision.rejected.map((alt) => (
98
+ <div key={alt} className="bg-primary/5 rounded-md px-3 py-2">
99
+ <span className="text-foreground text-xs">{alt}</span>
100
+ </div>
101
+ ))}
102
+ </div>
103
+ ) : null}
104
+ </div>
105
+ ) : null}
106
+ </div>
107
+ );
108
+ }
109
+
110
+ export function TechDecisionsReview({
111
+ data,
112
+ onRefine,
113
+ onApprove,
114
+ isProcessing = false,
115
+ }: TechDecisionsReviewProps) {
116
+ const { summary, decisions } = data;
117
+ const [chatInput, setChatInput] = useState('');
118
+
119
+ function handleSubmit(e: { preventDefault: () => void }) {
120
+ e.preventDefault();
121
+ const text = chatInput.trim();
122
+ if (!text) return;
123
+ onRefine(text);
124
+ setChatInput('');
125
+ }
126
+
127
+ if (decisions.length === 0) return null;
128
+
129
+ return (
130
+ <div className="flex h-full flex-col">
131
+ <div className="flex-1 space-y-4 overflow-y-auto p-4">
132
+ {/* Header */}
133
+ <div className="flex items-start gap-3">
134
+ <div className="mt-1.5 h-2.5 w-2.5 shrink-0 rounded-full bg-blue-500" />
135
+ <div className="flex-1">
136
+ <h2 className="text-foreground text-sm font-bold">
137
+ Technical Implementation Plan Review
138
+ </h2>
139
+ {summary ? (
140
+ <p className="text-muted-foreground mt-1 text-xs leading-relaxed">{summary}</p>
141
+ ) : null}
142
+ </div>
143
+ </div>
144
+
145
+ {/* Section heading */}
146
+ <div className="flex items-center gap-2 pt-1">
147
+ <GitCompareArrows className="text-primary h-4 w-4" />
148
+ <h3 className="text-foreground text-sm font-bold">Technical Decisions</h3>
149
+ </div>
150
+
151
+ {/* Decision cards */}
152
+ {decisions.map((decision, i) => (
153
+ <DecisionCard key={decision.title} decision={decision} index={i} />
154
+ ))}
155
+ </div>
156
+
157
+ {/* Action bar: chat + approve */}
158
+ <div className="border-border shrink-0 border-t">
159
+ <form onSubmit={handleSubmit} className="flex items-center gap-2 p-4 pb-2">
160
+ <Input
161
+ type="text"
162
+ placeholder="Ask AI to revise the plan..."
163
+ aria-label="Ask AI to revise the plan"
164
+ disabled={isProcessing}
165
+ value={chatInput}
166
+ onChange={(e) => setChatInput(e.target.value)}
167
+ className="flex-1"
168
+ />
169
+ <Button
170
+ type="submit"
171
+ variant="secondary"
172
+ size="icon"
173
+ aria-label="Send"
174
+ disabled={isProcessing}
175
+ >
176
+ <Send />
177
+ </Button>
178
+ </form>
179
+ <div className="px-4 pt-2 pb-4">
180
+ <Button type="button" className="w-full" disabled={isProcessing} onClick={onApprove}>
181
+ <Check className="mr-1.5 h-4 w-4" />
182
+ Approve Plan
183
+ </Button>
184
+ </div>
185
+ </div>
186
+ </div>
187
+ );
188
+ }
@@ -1,10 +1,19 @@
1
1
  'use client';
2
2
 
3
- import { useEffect } from 'react';
3
+ import { useCallback, useEffect, useState } from 'react';
4
4
  import type { Edge } from '@xyflow/react';
5
+ import { toast } from 'sonner';
6
+ import { approveFeature } from '@/app/actions/approve-feature';
7
+ import { getFeatureArtifact } from '@/app/actions/get-feature-artifact';
8
+ import { getResearchArtifact } from '@/app/actions/get-research-artifact';
9
+ import type { TechDecisionsReviewData } from '@/components/common/tech-decisions-review';
5
10
  import { FeaturesCanvas } from '@/components/features/features-canvas';
6
11
  import type { CanvasNodeType } from '@/components/features/features-canvas';
7
12
  import { FeatureDrawer, FeatureCreateDrawer } from '@/components/common';
13
+ import { PrdQuestionnaireDrawer } from '@/components/common/prd-questionnaire';
14
+ import type { PrdQuestionnaireData } from '@/components/common/prd-questionnaire';
15
+ import { TechDecisionsDrawer } from '@/components/common/tech-decisions-review';
16
+ import { NotificationPermissionBanner } from '@/components/common/notification-permission-banner';
8
17
  import { ControlCenterEmptyState } from './control-center-empty-state';
9
18
  import { useControlCenterState } from './use-control-center-state';
10
19
 
@@ -34,6 +43,147 @@ export function ControlCenterInner({ initialNodes, initialEdges }: ControlCenter
34
43
  closeCreateDrawer,
35
44
  } = useControlCenterState(initialNodes, initialEdges);
36
45
 
46
+ // PRD questionnaire drawer state
47
+ const [prdSelections, setPrdSelections] = useState<Record<string, string>>({});
48
+ const [isPrdProcessing, setIsPrdProcessing] = useState(false);
49
+ const [questionnaireData, setQuestionnaireData] = useState<PrdQuestionnaireData | null>(null);
50
+ const [isLoadingQuestionnaire, setIsLoadingQuestionnaire] = useState(false);
51
+
52
+ // Tech decisions drawer state
53
+ const [techDecisionsData, setTechDecisionsData] = useState<TechDecisionsReviewData | null>(null);
54
+ const [isLoadingTechDecisions, setIsLoadingTechDecisions] = useState(false);
55
+
56
+ const showPrdDrawer =
57
+ selectedNode?.lifecycle === 'requirements' && selectedNode?.state === 'action-required';
58
+
59
+ const showTechDecisionsDrawer =
60
+ selectedNode?.lifecycle === 'implementation' && selectedNode?.state === 'action-required';
61
+
62
+ const handlePrdSelect = useCallback((questionId: string, optionId: string) => {
63
+ setPrdSelections((prev) => ({ ...prev, [questionId]: optionId }));
64
+ }, []);
65
+
66
+ const handlePrdRefine = useCallback(async (_text: string) => {
67
+ setIsPrdProcessing(true);
68
+ // TODO: Call API to refine requirements
69
+ // For now simulate a delay
70
+ await new Promise((resolve) => setTimeout(resolve, 1500));
71
+ setIsPrdProcessing(false);
72
+ }, []);
73
+
74
+ const handlePrdApprove = useCallback(
75
+ async (_actionId: string) => {
76
+ const featureId = selectedNode?.featureId;
77
+ if (!featureId) return;
78
+
79
+ const result = await approveFeature(featureId);
80
+
81
+ if (!result.approved) {
82
+ toast.error(result.error ?? 'Failed to approve requirements');
83
+ return;
84
+ }
85
+
86
+ toast.success('Requirements approved — agent resuming');
87
+ clearSelection();
88
+ setPrdSelections({});
89
+ },
90
+ [selectedNode?.featureId, clearSelection]
91
+ );
92
+
93
+ const handleTechDecisionsRefine = useCallback(async (_text: string) => {
94
+ setIsLoadingTechDecisions(true);
95
+ // TODO: Call API to refine tech decisions
96
+ await new Promise((resolve) => setTimeout(resolve, 1500));
97
+ setIsLoadingTechDecisions(false);
98
+ }, []);
99
+
100
+ const handleTechDecisionsApprove = useCallback(async () => {
101
+ const featureId = selectedNode?.featureId;
102
+ if (!featureId) return;
103
+
104
+ const result = await approveFeature(featureId);
105
+
106
+ if (!result.approved) {
107
+ toast.error(result.error ?? 'Failed to approve plan');
108
+ return;
109
+ }
110
+
111
+ toast.success('Plan approved — agent resuming');
112
+ clearSelection();
113
+ }, [selectedNode?.featureId, clearSelection]);
114
+
115
+ // Fetch questionnaire data and reset selections when a different feature is selected
116
+ const prdFeatureId = showPrdDrawer ? selectedNode?.featureId : null;
117
+ useEffect(() => {
118
+ setPrdSelections({});
119
+ setQuestionnaireData(null);
120
+
121
+ if (!prdFeatureId) return;
122
+
123
+ let cancelled = false;
124
+ setIsLoadingQuestionnaire(true);
125
+ getFeatureArtifact(prdFeatureId)
126
+ .then((result) => {
127
+ if (cancelled) return;
128
+ if (result.error) {
129
+ toast.error(result.error);
130
+ return;
131
+ }
132
+ if (result.questionnaire) {
133
+ setQuestionnaireData(result.questionnaire);
134
+ // Pre-select AI-recommended answers
135
+ const defaults: Record<string, string> = {};
136
+ for (const q of result.questionnaire.questions) {
137
+ const recommended = q.options.find((o) => o.recommended);
138
+ if (recommended) defaults[q.id] = recommended.id;
139
+ }
140
+ setPrdSelections(defaults);
141
+ }
142
+ })
143
+ .catch(() => {
144
+ if (!cancelled) toast.error('Failed to load questionnaire');
145
+ })
146
+ .finally(() => {
147
+ if (!cancelled) setIsLoadingQuestionnaire(false);
148
+ });
149
+
150
+ return () => {
151
+ cancelled = true;
152
+ };
153
+ }, [prdFeatureId]);
154
+
155
+ // Fetch tech decisions data when a feature is in research + action-required
156
+ const techDecisionsFeatureId = showTechDecisionsDrawer ? selectedNode?.featureId : null;
157
+ useEffect(() => {
158
+ setTechDecisionsData(null);
159
+
160
+ if (!techDecisionsFeatureId) return;
161
+
162
+ let cancelled = false;
163
+ setIsLoadingTechDecisions(true);
164
+ getResearchArtifact(techDecisionsFeatureId)
165
+ .then((result) => {
166
+ if (cancelled) return;
167
+ if (result.error) {
168
+ toast.error(result.error);
169
+ return;
170
+ }
171
+ if (result.techDecisions) {
172
+ setTechDecisionsData(result.techDecisions);
173
+ }
174
+ })
175
+ .catch(() => {
176
+ if (!cancelled) toast.error('Failed to load tech decisions');
177
+ })
178
+ .finally(() => {
179
+ if (!cancelled) setIsLoadingTechDecisions(false);
180
+ });
181
+
182
+ return () => {
183
+ cancelled = true;
184
+ };
185
+ }, [techDecisionsFeatureId]);
186
+
37
187
  // Listen for global "open create drawer" events from the sidebar
38
188
  useEffect(() => {
39
189
  const handler = () => handleAddFeature();
@@ -43,6 +193,7 @@ export function ControlCenterInner({ initialNodes, initialEdges }: ControlCenter
43
193
 
44
194
  return (
45
195
  <>
196
+ <NotificationPermissionBanner />
46
197
  <FeaturesCanvas
47
198
  nodes={nodes}
48
199
  edges={edges}
@@ -57,11 +208,47 @@ export function ControlCenterInner({ initialNodes, initialEdges }: ControlCenter
57
208
  emptyState={<ControlCenterEmptyState onRepositorySelect={handleAddRepository} />}
58
209
  />
59
210
  <FeatureDrawer
60
- selectedNode={selectedNode}
211
+ selectedNode={showPrdDrawer || showTechDecisionsDrawer ? null : selectedNode}
61
212
  onClose={clearSelection}
62
213
  onDelete={handleDeleteFeature}
63
214
  isDeleting={isDeleting}
64
215
  />
216
+ {questionnaireData ? (
217
+ <PrdQuestionnaireDrawer
218
+ open={showPrdDrawer}
219
+ onClose={clearSelection}
220
+ featureName={selectedNode?.name ?? ''}
221
+ featureId={selectedNode?.featureId}
222
+ repositoryPath={selectedNode?.repositoryPath}
223
+ branch={selectedNode?.branch}
224
+ specPath={selectedNode?.specPath}
225
+ data={questionnaireData}
226
+ selections={prdSelections}
227
+ onSelect={handlePrdSelect}
228
+ onRefine={handlePrdRefine}
229
+ onApprove={handlePrdApprove}
230
+ onDelete={handleDeleteFeature}
231
+ isDeleting={isDeleting}
232
+ isProcessing={isPrdProcessing || isLoadingQuestionnaire}
233
+ />
234
+ ) : null}
235
+ {techDecisionsData ? (
236
+ <TechDecisionsDrawer
237
+ open={showTechDecisionsDrawer}
238
+ onClose={clearSelection}
239
+ featureName={selectedNode?.name ?? ''}
240
+ featureId={selectedNode?.featureId}
241
+ repositoryPath={selectedNode?.repositoryPath}
242
+ branch={selectedNode?.branch}
243
+ specPath={selectedNode?.specPath}
244
+ data={techDecisionsData}
245
+ onRefine={handleTechDecisionsRefine}
246
+ onApprove={handleTechDecisionsApprove}
247
+ onDelete={handleDeleteFeature}
248
+ isDeleting={isDeleting}
249
+ isProcessing={isLoadingTechDecisions}
250
+ />
251
+ ) : null}
65
252
  <FeatureCreateDrawer
66
253
  open={isCreateDrawerOpen}
67
254
  onClose={closeCreateDrawer}