@shepai/cli 1.73.0 → 1.73.1-pr225.4fad6ad

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 (269) hide show
  1. package/dist/packages/core/src/application/ports/output/agents/agent-executor-provider.interface.d.ts +1 -1
  2. package/dist/packages/core/src/application/ports/output/agents/agent-executor-provider.interface.d.ts.map +1 -1
  3. package/dist/packages/core/src/infrastructure/di/container.d.ts.map +1 -1
  4. package/dist/packages/core/src/infrastructure/di/container.js +2 -1
  5. package/dist/packages/core/src/infrastructure/services/agents/common/agent-executor-provider.service.d.ts +4 -2
  6. package/dist/packages/core/src/infrastructure/services/agents/common/agent-executor-provider.service.d.ts.map +1 -1
  7. package/dist/packages/core/src/infrastructure/services/agents/common/agent-executor-provider.service.js +8 -4
  8. package/dist/packages/core/src/infrastructure/services/agents/common/agent-runner.service.js +1 -1
  9. package/dist/packages/core/src/infrastructure/services/agents/common/structured-agent-caller.service.js +1 -1
  10. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/feature-agent-worker.js +1 -1
  11. package/dist/src/presentation/web/app/actions/create-feature.d.ts +1 -2
  12. package/dist/src/presentation/web/app/actions/create-feature.d.ts.map +1 -1
  13. package/dist/src/presentation/web/app/actions/create-feature.js +6 -10
  14. package/dist/src/presentation/web/components/common/control-center-drawer/feature-drawer-client.d.ts.map +1 -1
  15. package/dist/src/presentation/web/components/common/control-center-drawer/feature-drawer-client.js +9 -0
  16. package/dist/src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.d.ts +1 -2
  17. package/dist/src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.d.ts.map +1 -1
  18. package/dist/src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.js +4 -9
  19. package/dist/src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.stories.d.ts +7 -8
  20. package/dist/src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.stories.d.ts.map +1 -1
  21. package/dist/src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.stories.js +12 -15
  22. package/dist/src/presentation/web/components/features/control-center/use-control-center-state.d.ts.map +1 -1
  23. package/dist/src/presentation/web/components/features/control-center/use-control-center-state.js +21 -0
  24. package/dist/src/presentation/web/hooks/use-agent-events.d.ts.map +1 -1
  25. package/dist/src/presentation/web/hooks/use-agent-events.js +3 -2
  26. package/dist/src/presentation/web/hooks/use-deploy-action.d.ts.map +1 -1
  27. package/dist/src/presentation/web/hooks/use-deploy-action.js +2 -10
  28. package/dist/tsconfig.build.tsbuildinfo +1 -1
  29. package/package.json +1 -1
  30. package/web/.next/BUILD_ID +1 -1
  31. package/web/.next/build-manifest.json +2 -2
  32. package/web/.next/cache/.previewinfo +1 -1
  33. package/web/.next/cache/.rscinfo +1 -1
  34. package/web/.next/cache/.tsbuildinfo +1 -1
  35. package/web/.next/cache/config.json +3 -3
  36. package/web/.next/fallback-build-manifest.json +2 -2
  37. package/web/.next/prerender-manifest.json +3 -3
  38. package/web/.next/required-server-files.js +1 -1
  39. package/web/.next/required-server-files.json +1 -1
  40. package/web/.next/server/app/(dashboard)/@drawer/create/page/server-reference-manifest.json +45 -30
  41. package/web/.next/server/app/(dashboard)/@drawer/create/page.js +3 -3
  42. package/web/.next/server/app/(dashboard)/@drawer/create/page.js.nft.json +1 -1
  43. package/web/.next/server/app/(dashboard)/@drawer/create/page_client-reference-manifest.js +1 -1
  44. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page/server-reference-manifest.json +51 -36
  45. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js +3 -3
  46. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js.nft.json +1 -1
  47. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page_client-reference-manifest.js +1 -1
  48. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page/server-reference-manifest.json +41 -26
  49. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js +3 -3
  50. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js.nft.json +1 -1
  51. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  52. package/web/.next/server/app/(dashboard)/create/page/server-reference-manifest.json +45 -30
  53. package/web/.next/server/app/(dashboard)/create/page.js +3 -3
  54. package/web/.next/server/app/(dashboard)/create/page.js.nft.json +1 -1
  55. package/web/.next/server/app/(dashboard)/create/page_client-reference-manifest.js +1 -1
  56. package/web/.next/server/app/(dashboard)/feature/[featureId]/page/server-reference-manifest.json +51 -36
  57. package/web/.next/server/app/(dashboard)/feature/[featureId]/page.js +3 -3
  58. package/web/.next/server/app/(dashboard)/feature/[featureId]/page.js.nft.json +1 -1
  59. package/web/.next/server/app/(dashboard)/feature/[featureId]/page_client-reference-manifest.js +1 -1
  60. package/web/.next/server/app/(dashboard)/page/server-reference-manifest.json +41 -26
  61. package/web/.next/server/app/(dashboard)/page.js +3 -3
  62. package/web/.next/server/app/(dashboard)/page.js.nft.json +1 -1
  63. package/web/.next/server/app/(dashboard)/page_client-reference-manifest.js +1 -1
  64. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page/server-reference-manifest.json +41 -26
  65. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js +3 -3
  66. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js.nft.json +1 -1
  67. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  68. package/web/.next/server/app/_global-error.html +2 -2
  69. package/web/.next/server/app/_global-error.rsc +1 -1
  70. package/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  71. package/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  72. package/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  73. package/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  74. package/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  75. package/web/.next/server/app/_not-found/page/server-reference-manifest.json +1 -1
  76. package/web/.next/server/app/_not-found/page.js.nft.json +1 -1
  77. package/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  78. package/web/.next/server/app/skills/page/server-reference-manifest.json +6 -6
  79. package/web/.next/server/app/skills/page.js.nft.json +1 -1
  80. package/web/.next/server/app/skills/page_client-reference-manifest.js +1 -1
  81. package/web/.next/server/app/tools/page/server-reference-manifest.json +6 -6
  82. package/web/.next/server/app/tools/page.js.nft.json +1 -1
  83. package/web/.next/server/app/tools/page_client-reference-manifest.js +1 -1
  84. package/web/.next/server/app/version/page/server-reference-manifest.json +1 -1
  85. package/web/.next/server/app/version/page.js.nft.json +1 -1
  86. package/web/.next/server/app/version/page_client-reference-manifest.js +1 -1
  87. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js +1 -1
  88. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js.map +1 -1
  89. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_da7eef33.js +3 -0
  90. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_da7eef33.js.map +1 -0
  91. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_0a9251aa.js +3 -0
  92. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_0a9251aa.js.map +1 -0
  93. package/web/.next/server/chunks/ssr/[root-of-the-server]__17a611f0._.js +2 -2
  94. package/web/.next/server/chunks/ssr/[root-of-the-server]__17a611f0._.js.map +1 -1
  95. package/web/.next/server/chunks/ssr/[root-of-the-server]__249c74f6._.js +1 -1
  96. package/web/.next/server/chunks/ssr/[root-of-the-server]__45dbf93d._.js +2 -2
  97. package/web/.next/server/chunks/ssr/[root-of-the-server]__45dbf93d._.js.map +1 -1
  98. package/web/.next/server/chunks/ssr/[root-of-the-server]__6258349c._.js +1 -1
  99. package/web/.next/server/chunks/ssr/[root-of-the-server]__6258349c._.js.map +1 -1
  100. package/web/.next/server/chunks/ssr/[root-of-the-server]__6b17a22d._.js +1 -1
  101. package/web/.next/server/chunks/ssr/[root-of-the-server]__6b17a22d._.js.map +1 -1
  102. package/web/.next/server/chunks/ssr/[root-of-the-server]__6cbc1149._.js +2 -2
  103. package/web/.next/server/chunks/ssr/[root-of-the-server]__6cbc1149._.js.map +1 -1
  104. package/web/.next/server/chunks/ssr/[root-of-the-server]__804c006d._.js +1 -1
  105. package/web/.next/server/chunks/ssr/[root-of-the-server]__804c006d._.js.map +1 -1
  106. package/web/.next/server/chunks/ssr/[root-of-the-server]__94a6d275._.js +1 -1
  107. package/web/.next/server/chunks/ssr/[root-of-the-server]__94a6d275._.js.map +1 -1
  108. package/web/.next/server/chunks/ssr/[root-of-the-server]__aad040c0._.js +1 -1
  109. package/web/.next/server/chunks/ssr/[root-of-the-server]__aad040c0._.js.map +1 -1
  110. package/web/.next/server/chunks/ssr/_0e9d6bf7._.js +1 -1
  111. package/web/.next/server/chunks/ssr/_0e9d6bf7._.js.map +1 -1
  112. package/web/.next/server/chunks/ssr/{_dee726e3._.js → _49f6575f._.js} +2 -2
  113. package/web/.next/server/chunks/ssr/{_dee726e3._.js.map → _49f6575f._.js.map} +1 -1
  114. package/web/.next/server/chunks/ssr/{_1978f325._.js → _5ee4f5a7._.js} +2 -2
  115. package/web/.next/server/chunks/ssr/_5ee4f5a7._.js.map +1 -0
  116. package/web/.next/server/chunks/ssr/_61351ed3._.js +1 -1
  117. package/web/.next/server/chunks/ssr/_61351ed3._.js.map +1 -1
  118. package/web/.next/server/chunks/ssr/_6e08ce21._.js +3 -0
  119. package/web/.next/server/chunks/ssr/_6e08ce21._.js.map +1 -0
  120. package/web/.next/server/chunks/ssr/_8400c8bb._.js +1 -1
  121. package/web/.next/server/chunks/ssr/_8400c8bb._.js.map +1 -1
  122. package/web/.next/server/chunks/ssr/_9f940437._.js +1 -1
  123. package/web/.next/server/chunks/ssr/_9f940437._.js.map +1 -1
  124. package/web/.next/server/chunks/ssr/src_presentation_web_163038ba._.js +6 -0
  125. package/web/.next/server/chunks/ssr/src_presentation_web_163038ba._.js.map +1 -0
  126. package/web/.next/server/chunks/ssr/{src_presentation_web_2b91e4ec._.js → src_presentation_web_30d7eeda._.js} +2 -2
  127. package/web/.next/server/chunks/ssr/{src_presentation_web_5bcc1537._.js.map → src_presentation_web_30d7eeda._.js.map} +1 -1
  128. package/web/.next/server/chunks/ssr/src_presentation_web_459cb687._.js +6 -0
  129. package/web/.next/server/chunks/ssr/src_presentation_web_459cb687._.js.map +1 -0
  130. package/web/.next/server/chunks/ssr/{src_presentation_web_5bcc1537._.js → src_presentation_web_565a14f8._.js} +2 -2
  131. package/web/.next/server/chunks/ssr/{src_presentation_web_2b91e4ec._.js.map → src_presentation_web_565a14f8._.js.map} +1 -1
  132. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_021a05f2.js +3 -0
  133. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_021a05f2.js.map +1 -0
  134. package/web/.next/server/chunks/ssr/src_presentation_web_app_(dashboard)_get-graph-data_ts_b018483e._.js +3 -0
  135. package/web/.next/server/chunks/ssr/src_presentation_web_app_(dashboard)_get-graph-data_ts_b018483e._.js.map +1 -0
  136. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js +1 -1
  137. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js.map +1 -1
  138. package/web/.next/server/pages/500.html +2 -2
  139. package/web/.next/server/server-reference-manifest.js +1 -1
  140. package/web/.next/server/server-reference-manifest.json +183 -126
  141. package/web/.next/standalone/src/presentation/web/.next/BUILD_ID +1 -1
  142. package/web/.next/standalone/src/presentation/web/.next/build-manifest.json +2 -2
  143. package/web/.next/standalone/src/presentation/web/.next/prerender-manifest.json +3 -3
  144. package/web/.next/standalone/src/presentation/web/.next/required-server-files.json +1 -1
  145. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/@drawer/create/page/server-reference-manifest.json +45 -30
  146. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/@drawer/create/page.js +3 -3
  147. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/@drawer/create/page.js.nft.json +1 -1
  148. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/@drawer/create/page_client-reference-manifest.js +1 -1
  149. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page/server-reference-manifest.json +51 -36
  150. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js +3 -3
  151. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js.nft.json +1 -1
  152. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page_client-reference-manifest.js +1 -1
  153. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page/server-reference-manifest.json +41 -26
  154. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js +3 -3
  155. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js.nft.json +1 -1
  156. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  157. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/create/page/server-reference-manifest.json +45 -30
  158. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/create/page.js +3 -3
  159. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/create/page.js.nft.json +1 -1
  160. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/create/page_client-reference-manifest.js +1 -1
  161. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/feature/[featureId]/page/server-reference-manifest.json +51 -36
  162. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/feature/[featureId]/page.js +3 -3
  163. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/feature/[featureId]/page.js.nft.json +1 -1
  164. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/feature/[featureId]/page_client-reference-manifest.js +1 -1
  165. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/page/server-reference-manifest.json +41 -26
  166. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/page.js +3 -3
  167. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/page.js.nft.json +1 -1
  168. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/page_client-reference-manifest.js +1 -1
  169. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/repository/[repositoryId]/page/server-reference-manifest.json +41 -26
  170. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js +3 -3
  171. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js.nft.json +1 -1
  172. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  173. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.html +2 -2
  174. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.rsc +1 -1
  175. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  176. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  177. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  178. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  179. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  180. package/web/.next/standalone/src/presentation/web/.next/server/app/_not-found/page/server-reference-manifest.json +1 -1
  181. package/web/.next/standalone/src/presentation/web/.next/server/app/_not-found/page.js.nft.json +1 -1
  182. package/web/.next/standalone/src/presentation/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  183. package/web/.next/standalone/src/presentation/web/.next/server/app/skills/page/server-reference-manifest.json +6 -6
  184. package/web/.next/standalone/src/presentation/web/.next/server/app/skills/page.js.nft.json +1 -1
  185. package/web/.next/standalone/src/presentation/web/.next/server/app/skills/page_client-reference-manifest.js +1 -1
  186. package/web/.next/standalone/src/presentation/web/.next/server/app/tools/page/server-reference-manifest.json +6 -6
  187. package/web/.next/standalone/src/presentation/web/.next/server/app/tools/page.js.nft.json +1 -1
  188. package/web/.next/standalone/src/presentation/web/.next/server/app/tools/page_client-reference-manifest.js +1 -1
  189. package/web/.next/standalone/src/presentation/web/.next/server/app/version/page/server-reference-manifest.json +1 -1
  190. package/web/.next/standalone/src/presentation/web/.next/server/app/version/page.js.nft.json +1 -1
  191. package/web/.next/standalone/src/presentation/web/.next/server/app/version/page_client-reference-manifest.js +1 -1
  192. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js +1 -1
  193. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_da7eef33.js +3 -0
  194. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_0a9251aa.js +3 -0
  195. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__17a611f0._.js +2 -2
  196. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__249c74f6._.js +1 -1
  197. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__45dbf93d._.js +2 -2
  198. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__6258349c._.js +1 -1
  199. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__6b17a22d._.js +1 -1
  200. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__6cbc1149._.js +2 -2
  201. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__804c006d._.js +1 -1
  202. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__94a6d275._.js +1 -1
  203. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__aad040c0._.js +1 -1
  204. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_0e9d6bf7._.js +1 -1
  205. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/{_dee726e3._.js → _49f6575f._.js} +2 -2
  206. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/{_1978f325._.js → _5ee4f5a7._.js} +2 -2
  207. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_61351ed3._.js +1 -1
  208. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_6e08ce21._.js +3 -0
  209. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_8400c8bb._.js +1 -1
  210. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_9f940437._.js +1 -1
  211. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/src_presentation_web_163038ba._.js +6 -0
  212. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/{src_presentation_web_2b91e4ec._.js → src_presentation_web_30d7eeda._.js} +2 -2
  213. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/src_presentation_web_459cb687._.js +6 -0
  214. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/{src_presentation_web_5bcc1537._.js → src_presentation_web_565a14f8._.js} +2 -2
  215. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_021a05f2.js +3 -0
  216. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/src_presentation_web_app_(dashboard)_get-graph-data_ts_b018483e._.js +3 -0
  217. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js +1 -1
  218. package/web/.next/standalone/src/presentation/web/.next/server/pages/500.html +2 -2
  219. package/web/.next/standalone/src/presentation/web/.next/server/server-reference-manifest.js +1 -1
  220. package/web/.next/standalone/src/presentation/web/.next/server/server-reference-manifest.json +183 -126
  221. package/web/.next/standalone/src/presentation/web/app/actions/create-feature.ts +7 -18
  222. package/web/.next/standalone/src/presentation/web/components/common/control-center-drawer/feature-drawer-client.tsx +11 -0
  223. package/web/.next/standalone/src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.stories.tsx +16 -15
  224. package/web/.next/standalone/src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.tsx +12 -31
  225. package/web/.next/standalone/src/presentation/web/components/features/control-center/use-control-center-state.ts +25 -0
  226. package/web/.next/standalone/src/presentation/web/hooks/use-agent-events.ts +3 -2
  227. package/web/.next/standalone/src/presentation/web/hooks/use-deploy-action.ts +2 -10
  228. package/web/.next/standalone/src/presentation/web/server.js +1 -1
  229. package/web/.next/static/chunks/{e69d79bd3f19dec8.js → 0a91a62af4813cbe.js} +1 -1
  230. package/web/.next/static/chunks/0c8d4bdd95ae45e7.js +1 -0
  231. package/web/.next/static/chunks/{c92e1360ada8ca94.js → 1f5c93a8b939416d.js} +2 -2
  232. package/web/.next/static/chunks/{9cbb42a6bd516d3b.js → 37c95269aa36cf41.js} +1 -1
  233. package/web/.next/static/chunks/{d7e0cd32364a8d76.js → 40baf05ad602fee7.js} +1 -1
  234. package/web/.next/static/chunks/4fbd01af2bfc46a0.js +1 -0
  235. package/web/.next/static/chunks/{8959112899679e25.js → a539a922a7ba0851.js} +1 -1
  236. package/web/.next/static/chunks/{6691ad02dc1efd1f.js → b2084d9c2260b140.js} +1 -1
  237. package/web/.next/static/chunks/b47db04e0dd7ff83.js +1 -0
  238. package/web/.next/static/chunks/ed768e1443066c95.js +1 -0
  239. package/web/.next/trace +1 -1
  240. package/web/.next/trace-build +1 -1
  241. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_816618e2.js +0 -3
  242. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_816618e2.js.map +0 -1
  243. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_ba2e050f.js +0 -3
  244. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_ba2e050f.js.map +0 -1
  245. package/web/.next/server/chunks/ssr/_1978f325._.js.map +0 -1
  246. package/web/.next/server/chunks/ssr/_250a63ae._.js +0 -3
  247. package/web/.next/server/chunks/ssr/_250a63ae._.js.map +0 -1
  248. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_5955c012.js +0 -3
  249. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_5955c012.js.map +0 -1
  250. package/web/.next/server/chunks/ssr/src_presentation_web_ca99d62d._.js +0 -3
  251. package/web/.next/server/chunks/ssr/src_presentation_web_ca99d62d._.js.map +0 -1
  252. package/web/.next/server/chunks/ssr/src_presentation_web_d5b0cb86._.js +0 -8
  253. package/web/.next/server/chunks/ssr/src_presentation_web_d5b0cb86._.js.map +0 -1
  254. package/web/.next/server/chunks/ssr/src_presentation_web_e626b63c._.js +0 -8
  255. package/web/.next/server/chunks/ssr/src_presentation_web_e626b63c._.js.map +0 -1
  256. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_816618e2.js +0 -3
  257. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_ba2e050f.js +0 -3
  258. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_250a63ae._.js +0 -3
  259. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_5955c012.js +0 -3
  260. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/src_presentation_web_ca99d62d._.js +0 -3
  261. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/src_presentation_web_d5b0cb86._.js +0 -8
  262. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/src_presentation_web_e626b63c._.js +0 -8
  263. package/web/.next/static/chunks/15ceb197ec725da2.js +0 -1
  264. package/web/.next/static/chunks/7bff5fbcbf157df5.js +0 -1
  265. package/web/.next/static/chunks/8f508ef906cbf0fa.js +0 -1
  266. package/web/.next/static/chunks/c5603ed8a95d460d.js +0 -1
  267. /package/web/.next/static/{1AvkeBASQdtzZt9cm9UYg → Xj_ABhg1MoIBpmI-Qeezj}/_buildManifest.js +0 -0
  268. /package/web/.next/static/{1AvkeBASQdtzZt9cm9UYg → Xj_ABhg1MoIBpmI-Qeezj}/_clientMiddlewareManifest.json +0 -0
  269. /package/web/.next/static/{1AvkeBASQdtzZt9cm9UYg → Xj_ABhg1MoIBpmI-Qeezj}/_ssgManifest.js +0 -0
@@ -1,5 +1,5 @@
1
1
  import type { IAgentExecutor } from './agent-executor.interface.js';
2
2
  export interface IAgentExecutorProvider {
3
- getExecutor(): IAgentExecutor;
3
+ getExecutor(): Promise<IAgentExecutor>;
4
4
  }
5
5
  //# sourceMappingURL=agent-executor-provider.interface.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"agent-executor-provider.interface.d.ts","sourceRoot":"","sources":["../../../../../../../../packages/core/src/application/ports/output/agents/agent-executor-provider.interface.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAEpE,MAAM,WAAW,sBAAsB;IACrC,WAAW,IAAI,cAAc,CAAC;CAC/B"}
1
+ {"version":3,"file":"agent-executor-provider.interface.d.ts","sourceRoot":"","sources":["../../../../../../../../packages/core/src/application/ports/output/agents/agent-executor-provider.interface.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAEpE,MAAM,WAAW,sBAAsB;IACrC,WAAW,IAAI,OAAO,CAAC,cAAc,CAAC,CAAC;CACxC"}
@@ -1 +1 @@
1
- {"version":3,"file":"container.d.ts","sourceRoot":"","sources":["../../../../../../packages/core/src/infrastructure/di/container.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,kBAAkB,CAAC;AAC1B,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAiHrC;;;;;;GAMG;AACH,wBAAsB,mBAAmB,IAAI,OAAO,CAAC,OAAO,SAAS,CAAC,CAuQrE;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,IAAI,OAAO,CAEhD;AAED;;;GAGG;AACH,OAAO,EAAE,SAAS,EAAE,CAAC"}
1
+ {"version":3,"file":"container.d.ts","sourceRoot":"","sources":["../../../../../../packages/core/src/infrastructure/di/container.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,kBAAkB,CAAC;AAC1B,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAiHrC;;;;;;GAMG;AACH,wBAAsB,mBAAmB,IAAI,OAAO,CAAC,OAAO,SAAS,CAAC,CAwQrE;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,IAAI,OAAO,CAEhD;AAED;;;GAGG;AACH,OAAO,EAAE,SAAS,EAAE,CAAC"}
@@ -171,7 +171,8 @@ export async function initializeContainer() {
171
171
  container.register('IAgentExecutorProvider', {
172
172
  useFactory: (c) => {
173
173
  const factory = c.resolve('IAgentExecutorFactory');
174
- return new AgentExecutorProvider(factory);
174
+ const settingsRepo = c.resolve('ISettingsRepository');
175
+ return new AgentExecutorProvider(factory, settingsRepo);
175
176
  },
176
177
  });
177
178
  container.register('IStructuredAgentCaller', {
@@ -1,9 +1,11 @@
1
1
  import type { IAgentExecutorProvider } from '../../../../application/ports/output/agents/agent-executor-provider.interface.js';
2
2
  import type { IAgentExecutorFactory } from '../../../../application/ports/output/agents/agent-executor-factory.interface.js';
3
3
  import type { IAgentExecutor } from '../../../../application/ports/output/agents/agent-executor.interface.js';
4
+ import type { ISettingsRepository } from '../../../../application/ports/output/repositories/settings.repository.interface.js';
4
5
  export declare class AgentExecutorProvider implements IAgentExecutorProvider {
5
6
  private readonly factory;
6
- constructor(factory: IAgentExecutorFactory);
7
- getExecutor(): IAgentExecutor;
7
+ private readonly settingsRepository;
8
+ constructor(factory: IAgentExecutorFactory, settingsRepository: ISettingsRepository);
9
+ getExecutor(): Promise<IAgentExecutor>;
8
10
  }
9
11
  //# sourceMappingURL=agent-executor-provider.service.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"agent-executor-provider.service.d.ts","sourceRoot":"","sources":["../../../../../../../../packages/core/src/infrastructure/services/agents/common/agent-executor-provider.service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,kFAAkF,CAAC;AAC/H,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,iFAAiF,CAAC;AAC7H,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yEAAyE,CAAC;AAG9G,qBAAa,qBAAsB,YAAW,sBAAsB;IACtD,OAAO,CAAC,QAAQ,CAAC,OAAO;gBAAP,OAAO,EAAE,qBAAqB;IAE3D,WAAW,IAAI,cAAc;CAI9B"}
1
+ {"version":3,"file":"agent-executor-provider.service.d.ts","sourceRoot":"","sources":["../../../../../../../../packages/core/src/infrastructure/services/agents/common/agent-executor-provider.service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,kFAAkF,CAAC;AAC/H,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,iFAAiF,CAAC;AAC7H,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yEAAyE,CAAC;AAC9G,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,oFAAoF,CAAC;AAE9H,qBAAa,qBAAsB,YAAW,sBAAsB;IAEhE,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,kBAAkB;gBADlB,OAAO,EAAE,qBAAqB,EAC9B,kBAAkB,EAAE,mBAAmB;IAGpD,WAAW,IAAI,OAAO,CAAC,cAAc,CAAC;CAO7C"}
@@ -1,11 +1,15 @@
1
- import { getSettings } from '../../settings.service.js';
2
1
  export class AgentExecutorProvider {
3
2
  factory;
4
- constructor(factory) {
3
+ settingsRepository;
4
+ constructor(factory, settingsRepository) {
5
5
  this.factory = factory;
6
+ this.settingsRepository = settingsRepository;
6
7
  }
7
- getExecutor() {
8
- const settings = getSettings();
8
+ async getExecutor() {
9
+ const settings = await this.settingsRepository.load();
10
+ if (!settings) {
11
+ throw new Error('Settings not found. Please run initialization first.');
12
+ }
9
13
  return this.factory.createExecutor(settings.agent.type, settings.agent);
10
14
  }
11
15
  }
@@ -76,7 +76,7 @@ export class AgentRunnerService {
76
76
  }
77
77
  const settings = getSettings();
78
78
  const agentType = settings.agent.type;
79
- const executor = this.executorProvider.getExecutor();
79
+ const executor = await this.executorProvider.getExecutor();
80
80
  const runId = crypto.randomUUID();
81
81
  const threadId = crypto.randomUUID();
82
82
  const now = new Date().toISOString();
@@ -25,7 +25,7 @@ let StructuredAgentCallerService = class StructuredAgentCallerService {
25
25
  this.executorProvider = executorProvider;
26
26
  }
27
27
  async call(prompt, schema, options) {
28
- const executor = this.executorProvider.getExecutor();
28
+ const executor = await this.executorProvider.getExecutor();
29
29
  if (executor.supportsFeature(AgentFeature.structuredOutput)) {
30
30
  return this.callWithNativeSchema(executor, prompt, schema, options);
31
31
  }
@@ -133,7 +133,7 @@ export async function runWorker(args) {
133
133
  }
134
134
  else {
135
135
  log('Creating executor from configured agent settings...');
136
- executor = executorProvider.getExecutor();
136
+ executor = await executorProvider.getExecutor();
137
137
  }
138
138
  // Resolve merge node dependencies
139
139
  const gitPrService = container.resolve('IGitPrService');
@@ -4,8 +4,7 @@ interface Attachment {
4
4
  name: string;
5
5
  }
6
6
  interface CreateFeatureInput {
7
- name: string;
8
- description?: string;
7
+ description: string;
9
8
  repositoryPath: string;
10
9
  attachments?: Attachment[];
11
10
  approvalGates?: {
@@ -1 +1 @@
1
- {"version":3,"file":"create-feature.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/web/app/actions/create-feature.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,sCAAsC,CAAC;AAEpE,UAAU,UAAU;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd;AAQD,UAAU,kBAAkB;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,CAAC,EAAE,UAAU,EAAE,CAAC;IAC3B,aAAa,CAAC,EAAE;QACd,QAAQ,EAAE,OAAO,CAAC;QAClB,SAAS,EAAE,OAAO,CAAC;QACnB,UAAU,CAAC,EAAE,OAAO,CAAC;KACtB,CAAC;IACF,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAqBD,wBAAsB,aAAa,CACjC,KAAK,EAAE,kBAAkB,GACxB,OAAO,CAAC;IAAE,OAAO,CAAC,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CA2DhD"}
1
+ {"version":3,"file":"create-feature.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/web/app/actions/create-feature.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,sCAAsC,CAAC;AAEpE,UAAU,UAAU;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd;AAQD,UAAU,kBAAkB;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,CAAC,EAAE,UAAU,EAAE,CAAC;IAC3B,aAAa,CAAC,EAAE;QACd,QAAQ,EAAE,OAAO,CAAC;QAClB,SAAS,EAAE,OAAO,CAAC;QACnB,UAAU,CAAC,EAAE,OAAO,CAAC;KACtB,CAAC;IACF,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAaD,wBAAsB,aAAa,CACjC,KAAK,EAAE,kBAAkB,GACxB,OAAO,CAAC;IAAE,OAAO,CAAC,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAyDhD"}
@@ -1,10 +1,7 @@
1
1
  'use server';
2
2
  import { resolve } from '../../lib/server-container.js';
3
- function composeUserInput(name, description, attachments) {
4
- let userInput = `Feature: ${name}`;
5
- if (description) {
6
- userInput += `\n\n${description}`;
7
- }
3
+ function composeUserInput(description, attachments) {
4
+ let userInput = description;
8
5
  if (attachments && attachments.length > 0) {
9
6
  const paths = attachments.map((a) => `- ${a.path}`).join('\n');
10
7
  userInput += `\n\nAttached files:\n${paths}`;
@@ -12,14 +9,14 @@ function composeUserInput(name, description, attachments) {
12
9
  return userInput;
13
10
  }
14
11
  export async function createFeature(input) {
15
- const { name, description, repositoryPath, attachments, approvalGates, push, openPr, parentId } = input;
16
- if (!name?.trim()) {
17
- return { error: 'name is required' };
12
+ const { description, repositoryPath, attachments, approvalGates, push, openPr, parentId } = input;
13
+ if (!description?.trim()) {
14
+ return { error: 'description is required' };
18
15
  }
19
16
  if (!repositoryPath?.trim()) {
20
17
  return { error: 'repositoryPath is required' };
21
18
  }
22
- const userInput = composeUserInput(name, description, attachments);
19
+ const userInput = composeUserInput(description, attachments);
23
20
  const gates = {
24
21
  allowPrd: approvalGates?.allowPrd ?? false,
25
22
  allowPlan: approvalGates?.allowPlan ?? false,
@@ -35,7 +32,6 @@ export async function createFeature(input) {
35
32
  push: push ?? false,
36
33
  openPr: openPr ?? false,
37
34
  ...(parentId ? { parentId } : {}),
38
- name,
39
35
  description,
40
36
  });
41
37
  // Phase 2 (background): metadata generation, worktree, spec, agent spawn
@@ -1 +1 @@
1
- {"version":3,"file":"feature-drawer-client.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/control-center-drawer/feature-drawer-client.tsx"],"names":[],"mappings":"AAyDA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAGhD,MAAM,WAAW,wBAAwB;IACvC,IAAI,EAAE,UAAU,CAAC;CAClB;AAED,wBAAgB,mBAAmB,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,EAAE,wBAAwB,2CA8jBlF"}
1
+ {"version":3,"file":"feature-drawer-client.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/control-center-drawer/feature-drawer-client.tsx"],"names":[],"mappings":"AAyDA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAGhD,MAAM,WAAW,wBAAwB;IACvC,IAAI,EAAE,UAAU,CAAC;CAClB;AAED,wBAAgB,mBAAmB,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,EAAE,wBAAwB,2CAykBlF"}
@@ -100,6 +100,15 @@ export function FeatureDrawerClient({ view: initialView }) {
100
100
  const pathname = usePathname();
101
101
  const isOpen = pathname.startsWith('/feature/');
102
102
  const isOpenRef = useRef(isOpen);
103
+ const wasOpenRef = useRef(isOpen);
104
+ // When the drawer re-opens, force a server refresh so the view is always fresh.
105
+ // SSE skips router.refresh() while the drawer is closed, so data can go stale.
106
+ useEffect(() => {
107
+ if (isOpen && !wasOpenRef.current) {
108
+ router.refresh();
109
+ }
110
+ wasOpenRef.current = isOpen;
111
+ }, [isOpen, router]);
103
112
  isOpenRef.current = isOpen;
104
113
  const onClose = useCallback(() => {
105
114
  router.push('/');
@@ -7,8 +7,7 @@ export interface ParentFeatureOption {
7
7
  name: string;
8
8
  }
9
9
  export interface FeatureCreatePayload {
10
- name: string;
11
- description?: string;
10
+ description: string;
12
11
  attachments: FileAttachment[];
13
12
  repositoryPath: string;
14
13
  approvalGates: {
@@ -1 +1 @@
1
- {"version":3,"file":"feature-create-drawer.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.tsx"],"names":[],"mappings":"AA2BA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,0DAA0D,CAAC;AAC/F,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,qCAAqC,CAAC;AAG5E,YAAY,EAAE,cAAc,EAAE,MAAM,0DAA0D,CAAC;AAE/F,0DAA0D;AAC1D,MAAM,WAAW,mBAAmB;IAClC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,cAAc,EAAE,CAAC;IAC9B,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa,EAAE;QACb,QAAQ,EAAE,OAAO,CAAC;QAClB,SAAS,EAAE,OAAO,CAAC;QACnB,UAAU,EAAE,OAAO,CAAC;KACrB,CAAC;IACF,IAAI,EAAE,OAAO,CAAC;IACd,MAAM,EAAE,OAAO,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAcD,MAAM,WAAW,wBAAwB;IACvC,IAAI,EAAE,OAAO,CAAC;IACd,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,QAAQ,EAAE,CAAC,IAAI,EAAE,oBAAoB,KAAK,IAAI,CAAC;IAC/C,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;IACpC,qEAAqE;IACrE,QAAQ,CAAC,EAAE,mBAAmB,EAAE,CAAC;IACjC,kGAAkG;IAClG,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,wBAAgB,mBAAmB,CAAC,EAClC,IAAI,EACJ,OAAO,EACP,QAAQ,EACR,cAAc,EACd,YAAoB,EACpB,gBAAgB,EAChB,QAAQ,EACR,eAAe,GAChB,EAAE,wBAAwB,2CA8Q1B"}
1
+ {"version":3,"file":"feature-create-drawer.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.tsx"],"names":[],"mappings":"AA2BA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,0DAA0D,CAAC;AAC/F,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,qCAAqC,CAAC;AAG5E,YAAY,EAAE,cAAc,EAAE,MAAM,0DAA0D,CAAC;AAE/F,0DAA0D;AAC1D,MAAM,WAAW,mBAAmB;IAClC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,oBAAoB;IACnC,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,cAAc,EAAE,CAAC;IAC9B,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa,EAAE;QACb,QAAQ,EAAE,OAAO,CAAC;QAClB,SAAS,EAAE,OAAO,CAAC;QACnB,UAAU,EAAE,OAAO,CAAC;KACrB,CAAC;IACF,IAAI,EAAE,OAAO,CAAC;IACd,MAAM,EAAE,OAAO,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAcD,MAAM,WAAW,wBAAwB;IACvC,IAAI,EAAE,OAAO,CAAC;IACd,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,QAAQ,EAAE,CAAC,IAAI,EAAE,oBAAoB,KAAK,IAAI,CAAC;IAC/C,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;IACpC,qEAAqE;IACrE,QAAQ,CAAC,EAAE,mBAAmB,EAAE,CAAC;IACjC,kGAAkG;IAClG,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,wBAAgB,mBAAmB,CAAC,EAClC,IAAI,EACJ,OAAO,EACP,QAAQ,EACR,cAAc,EACd,YAAoB,EACpB,gBAAgB,EAChB,QAAQ,EACR,eAAe,GAChB,EAAE,wBAAwB,2CA4P1B"}
@@ -31,7 +31,6 @@ export function FeatureCreateDrawer({ open, onClose, onSubmit, repositoryPath, i
31
31
  const defaultGates = workflowDefaults?.approvalGates ?? EMPTY_GATES;
32
32
  const defaultPush = workflowDefaults?.push ?? false;
33
33
  const defaultOpenPr = workflowDefaults?.openPr ?? false;
34
- const [name, setName] = useState('');
35
34
  const [description, setDescription] = useState('');
36
35
  const [attachments, setAttachments] = useState([]);
37
36
  const [approvalGates, setApprovalGates] = useState({ ...defaultGates });
@@ -53,7 +52,6 @@ export function FeatureCreateDrawer({ open, onClose, onSubmit, repositoryPath, i
53
52
  }
54
53
  }, [open, initialParentId]);
55
54
  const resetForm = useCallback(() => {
56
- setName('');
57
55
  setDescription('');
58
56
  setAttachments([]);
59
57
  setApprovalGates({ ...defaultGates });
@@ -62,18 +60,16 @@ export function FeatureCreateDrawer({ open, onClose, onSubmit, repositoryPath, i
62
60
  setParentId(undefined);
63
61
  }, [defaultGates, defaultPush, defaultOpenPr]);
64
62
  // Track whether the form has unsaved data
65
- const isDirty = name.trim() !== '' || description.trim() !== '' || attachments.length > 0;
63
+ const isDirty = description.trim() !== '' || attachments.length > 0;
66
64
  // Shared close guard — shows confirmation when dirty, prevents navigation
67
65
  const { attemptClose } = useGuardedDrawerClose({ open, isDirty, onClose, onReset: resetForm });
68
66
  const handleSubmit = useCallback((e) => {
69
67
  e.preventDefault();
70
- if (!name.trim())
68
+ if (!description.trim())
71
69
  return;
72
70
  createSound.play();
73
- const trimmedDescription = description.trim() || undefined;
74
71
  onSubmit({
75
- name: name.trim(),
76
- description: trimmedDescription,
72
+ description: description.trim(),
77
73
  attachments,
78
74
  repositoryPath,
79
75
  approvalGates: {
@@ -87,7 +83,6 @@ export function FeatureCreateDrawer({ open, onClose, onSubmit, repositoryPath, i
87
83
  });
88
84
  resetForm();
89
85
  }, [
90
- name,
91
86
  description,
92
87
  attachments,
93
88
  approvalGates,
@@ -114,7 +109,7 @@ export function FeatureCreateDrawer({ open, onClose, onSubmit, repositoryPath, i
114
109
  setAttachments((prev) => prev.filter((f) => f.path !== path));
115
110
  }, []);
116
111
  const hasFeatures = features && features.length > 0;
117
- return (_jsx(BaseDrawer, { open: open, onClose: attemptClose, size: "md", modal: false, dismissOnOutsideClick: true, "data-testid": "feature-create-drawer", header: _jsxs(_Fragment, { children: [_jsxs("div", { className: "flex items-center gap-2", children: [_jsx("div", { className: "h-2.5 w-2.5 shrink-0 rounded-full bg-blue-500" }), _jsx(DrawerTitle, { children: "NEW FEATURE" })] }), isSubmitting ? (_jsx(DrawerDescription, { asChild: true, children: _jsx("div", { children: _jsx(Badge, { variant: "secondary", children: "Creating..." }) }) })) : null] }), footer: _jsxs("div", { className: "flex flex-row justify-end gap-2", children: [_jsx(Button, { variant: "outline", onClick: attemptClose, disabled: isSubmitting, children: "Cancel" }), _jsx(Button, { type: "submit", form: "create-feature-form", disabled: !name.trim() || isSubmitting, children: isSubmitting ? 'Creating...' : '+ Create Feature' })] }), children: _jsx("div", { className: "overflow-y-auto p-4", children: _jsxs("form", { id: "create-feature-form", onSubmit: handleSubmit, className: "flex flex-col gap-4", children: [_jsxs("div", { className: "flex flex-col gap-1.5", children: [_jsx(Label, { htmlFor: "feature-name", className: "text-muted-foreground text-xs font-semibold tracking-wider", children: "FEATURE NAME" }), _jsx(Input, { id: "feature-name", placeholder: "e.g. GitHub OAuth Login", value: name, onChange: (e) => setName(e.target.value), required: true, disabled: isSubmitting })] }), _jsxs("div", { className: "flex flex-col gap-1.5", children: [_jsx(Label, { htmlFor: "feature-description", className: "text-muted-foreground text-xs font-semibold tracking-wider", children: "DESCRIPTION" }), _jsx(Textarea, { id: "feature-description", placeholder: "Describe what this feature does...", value: description, onChange: (e) => setDescription(e.target.value), rows: 4, disabled: isSubmitting })] }), hasFeatures ? (_jsxs("div", { className: "flex flex-col gap-1.5", children: [_jsx(Label, { htmlFor: "parent-feature", className: "text-muted-foreground text-xs font-semibold tracking-wider", children: "PARENT FEATURE" }), _jsx(ParentFeatureCombobox, { features: features, value: parentId, onChange: setParentId, disabled: isSubmitting })] })) : null, _jsxs("div", { className: "flex flex-col gap-1.5", children: [_jsx(Label, { className: "text-muted-foreground text-xs font-semibold tracking-wider", children: "APPROVE" }), _jsx(CheckboxGroup, { label: "Autonomous Mode", description: "YOLO!", parentAriaLabel: "Auto approve all", options: AUTO_APPROVE_OPTIONS, value: approvalGates, onValueChange: setApprovalGates, disabled: isSubmitting })] }), _jsxs("div", { className: "flex flex-col gap-1.5", children: [_jsx(Label, { className: "text-muted-foreground text-xs font-semibold tracking-wider", children: "GIT" }), _jsxs("div", { className: "flex flex-col gap-2", children: [_jsx(CheckboxGroupItem, { id: "push", label: "Push", description: "Push branch to remote after implementation.", checked: push || openPr, onCheckedChange: setPush, disabled: openPr || isSubmitting }), _jsx(CheckboxGroupItem, { id: "open-pr", label: "Create PR", description: "Open a pull request after pushing.", checked: openPr, onCheckedChange: setOpenPr, disabled: isSubmitting })] })] }), _jsxs("div", { className: "flex flex-col gap-2", children: [_jsxs("div", { className: "flex items-center justify-between", children: [_jsxs(Label, { className: "text-muted-foreground text-xs font-semibold tracking-wider", children: ["ATTACHMENTS", attachments.length > 0 && (_jsxs("span", { className: "text-muted-foreground/60 ml-1.5", children: ["(", attachments.length, ")"] }))] }), _jsxs(Button, { type: "button", variant: "outline", size: "xs", onClick: handleAddFiles, disabled: isSubmitting, children: [_jsx(PlusIcon, { className: "size-3" }), "Add Files"] })] }), attachments.length > 0 && (_jsx("div", { className: "flex flex-col gap-2", children: attachments.map((file) => (_jsx(AttachmentCard, { file: file, onRemove: () => handleRemoveFile(file.path), disabled: isSubmitting }, file.path))) }))] })] }) }) }));
112
+ return (_jsx(BaseDrawer, { open: open, onClose: attemptClose, size: "md", modal: false, dismissOnOutsideClick: true, "data-testid": "feature-create-drawer", header: _jsxs(_Fragment, { children: [_jsxs("div", { className: "flex items-center gap-2", children: [_jsx("div", { className: "h-2.5 w-2.5 shrink-0 rounded-full bg-blue-500" }), _jsx(DrawerTitle, { children: "NEW FEATURE" })] }), isSubmitting ? (_jsx(DrawerDescription, { asChild: true, children: _jsx("div", { children: _jsx(Badge, { variant: "secondary", children: "Creating..." }) }) })) : null] }), footer: _jsxs("div", { className: "flex flex-row justify-end gap-2", children: [_jsx(Button, { variant: "outline", onClick: attemptClose, disabled: isSubmitting, children: "Cancel" }), _jsx(Button, { type: "submit", form: "create-feature-form", disabled: !description.trim() || isSubmitting, children: isSubmitting ? 'Creating...' : '+ Create Feature' })] }), children: _jsx("div", { className: "overflow-y-auto p-4", children: _jsxs("form", { id: "create-feature-form", onSubmit: handleSubmit, className: "flex flex-col gap-4", children: [_jsxs("div", { className: "flex flex-col gap-1.5", children: [_jsx(Label, { htmlFor: "feature-description", className: "text-muted-foreground text-xs font-semibold tracking-wider", children: "DESCRIBE YOUR FEATURE" }), _jsx(Textarea, { id: "feature-description", placeholder: "e.g. Add GitHub OAuth login with callback handling and token refresh...", value: description, onChange: (e) => setDescription(e.target.value), rows: 4, required: true, disabled: isSubmitting })] }), hasFeatures ? (_jsxs("div", { className: "flex flex-col gap-1.5", children: [_jsx(Label, { htmlFor: "parent-feature", className: "text-muted-foreground text-xs font-semibold tracking-wider", children: "PARENT FEATURE" }), _jsx(ParentFeatureCombobox, { features: features, value: parentId, onChange: setParentId, disabled: isSubmitting })] })) : null, _jsxs("div", { className: "flex flex-col gap-1.5", children: [_jsx(Label, { className: "text-muted-foreground text-xs font-semibold tracking-wider", children: "APPROVE" }), _jsx(CheckboxGroup, { label: "Autonomous Mode", description: "YOLO!", parentAriaLabel: "Auto approve all", options: AUTO_APPROVE_OPTIONS, value: approvalGates, onValueChange: setApprovalGates, disabled: isSubmitting })] }), _jsxs("div", { className: "flex flex-col gap-1.5", children: [_jsx(Label, { className: "text-muted-foreground text-xs font-semibold tracking-wider", children: "GIT" }), _jsxs("div", { className: "flex flex-col gap-2", children: [_jsx(CheckboxGroupItem, { id: "push", label: "Push", description: "Push branch to remote after implementation.", checked: push || openPr, onCheckedChange: setPush, disabled: openPr || isSubmitting }), _jsx(CheckboxGroupItem, { id: "open-pr", label: "Create PR", description: "Open a pull request after pushing.", checked: openPr, onCheckedChange: setOpenPr, disabled: isSubmitting })] })] }), _jsxs("div", { className: "flex flex-col gap-2", children: [_jsxs("div", { className: "flex items-center justify-between", children: [_jsxs(Label, { className: "text-muted-foreground text-xs font-semibold tracking-wider", children: ["ATTACHMENTS", attachments.length > 0 && (_jsxs("span", { className: "text-muted-foreground/60 ml-1.5", children: ["(", attachments.length, ")"] }))] }), _jsxs(Button, { type: "button", variant: "outline", size: "xs", onClick: handleAddFiles, disabled: isSubmitting, children: [_jsx(PlusIcon, { className: "size-3" }), "Add Files"] })] }), attachments.length > 0 && (_jsx("div", { className: "flex flex-col gap-2", children: attachments.map((file) => (_jsx(AttachmentCard, { file: file, onRemove: () => handleRemoveFile(file.path), disabled: isSubmitting }, file.path))) }))] })] }) }) }));
118
113
  }
119
114
  function ParentFeatureCombobox({ features, value, onChange, disabled, }) {
120
115
  const [open, setOpen] = useState(false);
@@ -5,8 +5,7 @@ import { FeatureCreateDrawer } from './feature-create-drawer.js';
5
5
  * create a new feature in the Control Center.
6
6
  *
7
7
  * ### Form sections
8
- * - **Feature Name** (required) — text input, submit is disabled when empty
9
- * - **Description** (optional) — multi-line textarea
8
+ * - **Description** (required) — multi-line textarea, submit is disabled when empty
10
9
  * - **Auto Approve** — Tri-state parent checkbox with 3 child checkboxes (PRD, Plan, Merge).
11
10
  * Parent shows indeterminate when some children are selected, checks/unchecks all on click.
12
11
  * - **Attachments** (optional) — native OS file picker with extension-based icon system:
@@ -18,12 +17,12 @@ import { FeatureCreateDrawer } from './feature-create-drawer.js';
18
17
  * |------|------|-------------|
19
18
  * | `open` | `boolean` | Controls drawer visibility |
20
19
  * | `onClose` | `() => void` | Called on dismiss (close button, cancel, or backdrop) |
21
- * | `onSubmit` | `(data: FeatureCreatePayload) => void` | Called with `{ name, description, attachments, repositoryPath, approvalGates }` |
20
+ * | `onSubmit` | `(data: FeatureCreatePayload) => void` | Called with `{ description, attachments, repositoryPath, approvalGates }` |
22
21
  * | `repositoryPath` | `string` | Repository path (mandatory) included in the submitted data |
23
22
  *
24
23
  * ### Behavior
25
- * - Form resets (name, description, attachments, checkboxes) when the drawer closes
26
- * - Submit button is disabled when name is empty
24
+ * - Form resets (description, attachments, checkboxes) when the drawer closes
25
+ * - Submit button is disabled when description is empty
27
26
  * - `approvalGates` always included: `{ allowPrd, allowPlan, allowMerge }` (all false by default)
28
27
  * - Non-modal (`modal={false}`) — canvas stays interactive behind the drawer
29
28
  * - Fixed width: 448px (`w-xl`) — matches review drawers (PRD, Plan, Merge)
@@ -36,13 +35,13 @@ type Story = StoryObj<typeof FeatureCreateDrawer>;
36
35
  /** Default empty form — click the trigger button to open the create feature drawer. */
37
36
  export declare const Default: Story;
38
37
  /**
39
- * Pre-filled form — click to open, then name and description are typed in.
38
+ * Pre-filled form — click to open, then description is typed in.
40
39
  * Demonstrates the form in a "ready to submit" state.
41
40
  */
42
41
  export declare const PreFilled: Story;
43
42
  /**
44
- * Validation state — open the drawer with an empty name field.
45
- * The "+ Create Feature" button is disabled because name validation fails.
43
+ * Validation state — open the drawer with an empty description field.
44
+ * The "+ Create Feature" button is disabled because description validation fails.
46
45
  */
47
46
  export declare const ValidationDisabled: Story;
48
47
  /** Click to open the drawer for quick visual inspection. */
@@ -1 +1 @@
1
- {"version":3,"file":"feature-create-drawer.stories.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.stories.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAEvD,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAU9D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,QAAA,MAAM,IAAI,EAAE,IAAI,CAAC,OAAO,mBAAmB,CAgC1C,CAAC;AAEF,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,mBAAmB,CAAC,CAAC;AAiDlD,uFAAuF;AACvF,eAAO,MAAM,OAAO,EAAE,KAErB,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,SAAS,EAAE,KAiBvB,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,kBAAkB,EAAE,KAMhC,CAAC;AAEF,4DAA4D;AAC5D,eAAO,MAAM,SAAS,EAAE,KAMvB,CAAC;AAMF;;;GAGG;AACH,eAAO,MAAM,YAAY,EAAE,KAM1B,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,UAAU,EAAE,KAUxB,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,OAAO,EAAE,KAUrB,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,SAAS,EAAE,KAUvB,CAAC;AAMF;;;GAGG;AACH,eAAO,MAAM,QAAQ,EAAE,KAUtB,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,SAAS,EAAE,KAUvB,CAAC;AAYF;;;;GAIG;AACH,eAAO,MAAM,oBAAoB,EAAE,KAWlC,CAAC;AAgDF,+EAA+E;AAC/E,eAAO,MAAM,QAAQ,EAAE,KAEtB,CAAC;AAMF;;;GAGG;AACH,eAAO,MAAM,mBAAmB,EAAE,KAcjC,CAAC;AAMF,eAAO,MAAM,WAAW,EAAE,KAsCzB,CAAC"}
1
+ {"version":3,"file":"feature-create-drawer.stories.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.stories.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAEvD,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAU9D;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,QAAA,MAAM,IAAI,EAAE,IAAI,CAAC,OAAO,mBAAmB,CAgC1C,CAAC;AAEF,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,mBAAmB,CAAC,CAAC;AAiDlD,uFAAuF;AACvF,eAAO,MAAM,OAAO,EAAE,KAErB,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,SAAS,EAAE,KAiBvB,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,kBAAkB,EAAE,KAMhC,CAAC;AAEF,4DAA4D;AAC5D,eAAO,MAAM,SAAS,EAAE,KAMvB,CAAC;AAMF;;;GAGG;AACH,eAAO,MAAM,YAAY,EAAE,KAM1B,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,UAAU,EAAE,KAUxB,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,OAAO,EAAE,KAUrB,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,SAAS,EAAE,KAUvB,CAAC;AAMF;;;GAGG;AACH,eAAO,MAAM,QAAQ,EAAE,KAUtB,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,SAAS,EAAE,KAUvB,CAAC;AAYF;;;;GAIG;AACH,eAAO,MAAM,oBAAoB,EAAE,KAWlC,CAAC;AAgDF,+EAA+E;AAC/E,eAAO,MAAM,QAAQ,EAAE,KAEtB,CAAC;AAMF;;;GAGG;AACH,eAAO,MAAM,mBAAmB,EAAE,KAgBjC,CAAC;AAMF,eAAO,MAAM,WAAW,EAAE,KAsCzB,CAAC"}
@@ -12,8 +12,7 @@ import { DrawerCloseGuardProvider } from '../../../hooks/drawer-close-guard.js';
12
12
  * create a new feature in the Control Center.
13
13
  *
14
14
  * ### Form sections
15
- * - **Feature Name** (required) — text input, submit is disabled when empty
16
- * - **Description** (optional) — multi-line textarea
15
+ * - **Description** (required) — multi-line textarea, submit is disabled when empty
17
16
  * - **Auto Approve** — Tri-state parent checkbox with 3 child checkboxes (PRD, Plan, Merge).
18
17
  * Parent shows indeterminate when some children are selected, checks/unchecks all on click.
19
18
  * - **Attachments** (optional) — native OS file picker with extension-based icon system:
@@ -25,12 +24,12 @@ import { DrawerCloseGuardProvider } from '../../../hooks/drawer-close-guard.js';
25
24
  * |------|------|-------------|
26
25
  * | `open` | `boolean` | Controls drawer visibility |
27
26
  * | `onClose` | `() => void` | Called on dismiss (close button, cancel, or backdrop) |
28
- * | `onSubmit` | `(data: FeatureCreatePayload) => void` | Called with `{ name, description, attachments, repositoryPath, approvalGates }` |
27
+ * | `onSubmit` | `(data: FeatureCreatePayload) => void` | Called with `{ description, attachments, repositoryPath, approvalGates }` |
29
28
  * | `repositoryPath` | `string` | Repository path (mandatory) included in the submitted data |
30
29
  *
31
30
  * ### Behavior
32
- * - Form resets (name, description, attachments, checkboxes) when the drawer closes
33
- * - Submit button is disabled when name is empty
31
+ * - Form resets (description, attachments, checkboxes) when the drawer closes
32
+ * - Submit button is disabled when description is empty
34
33
  * - `approvalGates` always included: `{ allowPrd, allowPlan, allowMerge }` (all false by default)
35
34
  * - Non-modal (`modal={false}`) — canvas stays interactive behind the drawer
36
35
  * - Fixed width: 448px (`w-xl`) — matches review drawers (PRD, Plan, Merge)
@@ -56,7 +55,7 @@ const meta = {
56
55
  description: 'Callback fired when the drawer is dismissed (close button, cancel, or backdrop click).',
57
56
  },
58
57
  onSubmit: {
59
- description: 'Callback fired with `FeatureCreatePayload` when the form is submitted. Receives `{ name, description, attachments, repositoryPath, approvalGates }`.',
58
+ description: 'Callback fired with `FeatureCreatePayload` when the form is submitted. Receives `{ description, attachments, repositoryPath, approvalGates }`.',
60
59
  },
61
60
  repositoryPath: {
62
61
  control: 'text',
@@ -92,7 +91,7 @@ export const Default = {
92
91
  render: () => _jsx(CreateDrawerTrigger, {}),
93
92
  };
94
93
  /**
95
- * Pre-filled form — click to open, then name and description are typed in.
94
+ * Pre-filled form — click to open, then description is typed in.
96
95
  * Demonstrates the form in a "ready to submit" state.
97
96
  */
98
97
  export const PreFilled = {
@@ -102,15 +101,13 @@ export const PreFilled = {
102
101
  await userEvent.click(canvas.getByRole('button', { name: 'Open Pre-Filled' }));
103
102
  // Drawer renders in a portal — query from document body
104
103
  const body = within(canvasElement.ownerDocument.body);
105
- const nameInput = await body.findByPlaceholderText('e.g. GitHub OAuth Login');
106
- const descInput = body.getByPlaceholderText('Describe what this feature does...');
107
- await userEvent.type(nameInput, 'GitHub OAuth Login');
104
+ const descInput = await body.findByPlaceholderText('e.g. Add GitHub OAuth login with callback handling and token refresh...');
108
105
  await userEvent.type(descInput, 'Implement OAuth2 authentication with GitHub as the identity provider. Includes login, callback handling, and token refresh.');
109
106
  },
110
107
  };
111
108
  /**
112
- * Validation state — open the drawer with an empty name field.
113
- * The "+ Create Feature" button is disabled because name validation fails.
109
+ * Validation state — open the drawer with an empty description field.
110
+ * The "+ Create Feature" button is disabled because description validation fails.
114
111
  */
115
112
  export const ValidationDisabled = {
116
113
  render: () => _jsx(CreateDrawerTrigger, { label: "Open Validation Demo" }),
@@ -243,7 +240,7 @@ export const WithWorkflowDefaults = {
243
240
  * and click "Add Files" to attach files via the native OS file picker.
244
241
  *
245
242
  * **Submitted data** is displayed in a styled panel showing `FeatureCreatePayload`
246
- * with `{ name, description, attachments, repositoryPath, approvalGates }`.
243
+ * with `{ description, attachments, repositoryPath, approvalGates }`.
247
244
  *
248
245
  * In Storybook, the native picker won't work (no backend), but submitted data
249
246
  * would show the paths if files were attached programmatically.
@@ -278,8 +275,8 @@ export const DiscardConfirmation = {
278
275
  const canvas = within(canvasElement);
279
276
  await userEvent.click(canvas.getByRole('button', { name: 'Open (Discard Confirmation)' }));
280
277
  const body = within(canvasElement.ownerDocument.body);
281
- const nameInput = await body.findByPlaceholderText('e.g. GitHub OAuth Login');
282
- await userEvent.type(nameInput, 'My Feature');
278
+ const descInput = await body.findByPlaceholderText('e.g. Add GitHub OAuth login with callback handling and token refresh...');
279
+ await userEvent.type(descInput, 'My Feature');
283
280
  // Click Cancel — should show the discard confirmation dialog
284
281
  const cancelButton = body.getByRole('button', { name: 'Cancel' });
285
282
  await userEvent.click(cancelButton);
@@ -1 +1 @@
1
- {"version":3,"file":"use-control-center-state.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/features/control-center/use-control-center-state.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAClE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AACxE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,qCAAqC,CAAC;AAC9E,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uCAAuC,CAAC;AAC5E,OAAO,EAGL,KAAK,eAAe,EACrB,MAAM,yBAAyB,CAAC;AAWjC,OAAO,EAAiB,KAAK,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAG7E,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,cAAc,EAAE,CAAC;IACxB,KAAK,EAAE,IAAI,EAAE,CAAC;IACd,aAAa,EAAE,CAAC,OAAO,EAAE,UAAU,CAAC,cAAc,CAAC,EAAE,KAAK,IAAI,CAAC;IAC/D,aAAa,EAAE,CAAC,UAAU,EAAE,UAAU,KAAK,IAAI,CAAC;IAChD,mBAAmB,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAC5C,YAAY,EAAE,CAAC,SAAS,EAAE,eAAe,KAAK,IAAI,CAAC;IACnD,mBAAmB,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IACjD,sBAAsB,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAChE,iBAAiB,EAAE,CACjB,YAAY,EAAE,MAAM,GAAG,IAAI,EAC3B,YAAY,CAAC,EAAE,OAAO,CAAC,eAAe,CAAC,EACvC,QAAQ,CAAC,EAAE,MAAM,KACd,MAAM,CAAC;IACZ,wDAAwD;IACxD,wBAAwB,EAAE,CAAC,aAAa,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,CAAC;IACxE,gDAAgD;IAChD,iBAAiB,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,kBAAkB,GAAG,SAAS,CAAC;IACtE,0EAA0E;IAC1E,YAAY,EAAE,CAAC,SAAS,EAAE,cAAc,KAAK,IAAI,CAAC;CACnD;AAOD,wBAAgB,qBAAqB,CACnC,YAAY,EAAE,cAAc,EAAE,EAC9B,YAAY,EAAE,IAAI,EAAE,GACnB,kBAAkB,CAgWpB"}
1
+ {"version":3,"file":"use-control-center-state.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/features/control-center/use-control-center-state.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAClE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AACxE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,qCAAqC,CAAC;AAC9E,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uCAAuC,CAAC;AAC5E,OAAO,EAGL,KAAK,eAAe,EACrB,MAAM,yBAAyB,CAAC;AAcjC,OAAO,EAAiB,KAAK,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAM7E,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,cAAc,EAAE,CAAC;IACxB,KAAK,EAAE,IAAI,EAAE,CAAC;IACd,aAAa,EAAE,CAAC,OAAO,EAAE,UAAU,CAAC,cAAc,CAAC,EAAE,KAAK,IAAI,CAAC;IAC/D,aAAa,EAAE,CAAC,UAAU,EAAE,UAAU,KAAK,IAAI,CAAC;IAChD,mBAAmB,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAC5C,YAAY,EAAE,CAAC,SAAS,EAAE,eAAe,KAAK,IAAI,CAAC;IACnD,mBAAmB,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IACjD,sBAAsB,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAChE,iBAAiB,EAAE,CACjB,YAAY,EAAE,MAAM,GAAG,IAAI,EAC3B,YAAY,CAAC,EAAE,OAAO,CAAC,eAAe,CAAC,EACvC,QAAQ,CAAC,EAAE,MAAM,KACd,MAAM,CAAC;IACZ,wDAAwD;IACxD,wBAAwB,EAAE,CAAC,aAAa,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,CAAC;IACxE,gDAAgD;IAChD,iBAAiB,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,kBAAkB,GAAG,SAAS,CAAC;IACtE,0EAA0E;IAC1E,YAAY,EAAE,CAAC,SAAS,EAAE,cAAc,KAAK,IAAI,CAAC;CACnD;AAOD,wBAAgB,qBAAqB,CACnC,YAAY,EAAE,cAAc,EAAE,EAC9B,YAAY,EAAE,IAAI,EAAE,GACnB,kBAAkB,CAmXpB"}
@@ -7,10 +7,14 @@ import { deleteFeature } from '../../../app/actions/delete-feature.js';
7
7
  import { addRepository } from '../../../app/actions/add-repository.js';
8
8
  import { deleteRepository } from '../../../app/actions/delete-repository.js';
9
9
  import { getFeatureMetadata } from '../../../app/actions/get-feature-metadata.js';
10
+ import { fetchGraphData } from '../../../app/actions/get-graph-data.js';
10
11
  import { useAgentEventsContext } from '../../../hooks/agent-events-provider.js';
11
12
  import { useSoundAction } from '../../../hooks/use-sound-action.js';
13
+ import { createLogger } from '../../../lib/logger.js';
12
14
  import { mapEventTypeToState, resolveSseEventUpdates, } from '../../common/feature-node/derive-feature-state.js';
13
15
  import { useGraphState } from '../../../hooks/use-graph-state.js';
16
+ const log = createLogger('[Polling]');
17
+ const POLL_INTERVAL_MS = 3_000;
14
18
  /** Must match the message string emitted by the SSE route in agent-events/route.ts */
15
19
  const METADATA_UPDATED_MESSAGE = 'Feature metadata updated';
16
20
  let nextFeatureId = 0;
@@ -140,6 +144,23 @@ export function useControlCenterState(initialNodes, initialEdges) {
140
144
  });
141
145
  }
142
146
  }, [events, updateFeature]);
147
+ // --- Polling fallback: catch any SSE events that were missed ---
148
+ useEffect(() => {
149
+ log.debug(`polling enabled (${POLL_INTERVAL_MS}ms interval)`);
150
+ const timer = setInterval(async () => {
151
+ try {
152
+ const { nodes: freshNodes, edges: freshEdges } = await fetchGraphData();
153
+ reconcile(freshNodes, freshEdges);
154
+ }
155
+ catch {
156
+ log.warn('poll fetch failed — will retry next interval');
157
+ }
158
+ }, POLL_INTERVAL_MS);
159
+ return () => {
160
+ log.debug('polling disabled');
161
+ clearInterval(timer);
162
+ };
163
+ }, [reconcile]);
143
164
  // onNodesChange is a no-op: nodes are derived from domain Maps.
144
165
  // Since nodesDraggable=false and elementsSelectable=false, only React Flow's
145
166
  // internal replace/dimensions changes come through — we ignore them all.
@@ -1 +1 @@
1
- {"version":3,"file":"use-agent-events.d.ts","sourceRoot":"","sources":["../../../../../src/presentation/web/hooks/use-agent-events.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,sCAAsC,CAAC;AAE9E,MAAM,MAAM,gBAAgB,GAAG,WAAW,GAAG,YAAY,GAAG,cAAc,CAAC;AAE3E,MAAM,WAAW,qBAAqB;IACpC,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,oBAAoB;IACnC,MAAM,EAAE,iBAAiB,EAAE,CAAC;IAC5B,SAAS,EAAE,iBAAiB,GAAG,IAAI,CAAC;IACpC,gBAAgB,EAAE,gBAAgB,CAAC;CACpC;AAMD;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,OAAO,CAAC,EAAE,qBAAqB,GAAG,oBAAoB,CAoHpF"}
1
+ {"version":3,"file":"use-agent-events.d.ts","sourceRoot":"","sources":["../../../../../src/presentation/web/hooks/use-agent-events.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,sCAAsC,CAAC;AAG9E,MAAM,MAAM,gBAAgB,GAAG,WAAW,GAAG,YAAY,GAAG,cAAc,CAAC;AAE3E,MAAM,WAAW,qBAAqB;IACpC,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,oBAAoB;IACnC,MAAM,EAAE,iBAAiB,EAAE,CAAC;IAC5B,SAAS,EAAE,iBAAiB,GAAG,IAAI,CAAC;IACpC,gBAAgB,EAAE,gBAAgB,CAAC;CACpC;AAOD;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,OAAO,CAAC,EAAE,qBAAqB,GAAG,oBAAoB,CAmHpF"}
@@ -1,5 +1,7 @@
1
1
  'use client';
2
2
  import { useCallback, useEffect, useRef, useState } from 'react';
3
+ import { createLogger } from '../lib/logger.js';
4
+ const log = createLogger('[SSE]');
3
5
  const SW_PATH = '/agent-events-sw.js';
4
6
  const MAX_EVENTS = 500;
5
7
  const PRUNE_KEEP = 250;
@@ -22,8 +24,7 @@ export function useAgentEvents(options) {
22
24
  return;
23
25
  if (msg.type === 'notification') {
24
26
  const parsed = msg.data;
25
- // eslint-disable-next-line no-console
26
- console.log('[SSE] event received:', parsed.eventType, parsed);
27
+ log.debug('event received:', parsed.eventType, parsed);
27
28
  setEvents((prev) => {
28
29
  const next = [...prev, parsed];
29
30
  return next.length > MAX_EVENTS ? next.slice(-PRUNE_KEEP) : next;
@@ -1 +1 @@
1
- {"version":3,"file":"use-deploy-action.d.ts","sourceRoot":"","sources":["../../../../../src/presentation/web/hooks/use-deploy-action.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sCAAsC,CAAC;AAM5E,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,SAAS,GAAG,YAAY,CAAC;IACrC,cAAc,EAAE,MAAM,CAAC;IACvB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5B,IAAI,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1B,aAAa,EAAE,OAAO,CAAC;IACvB,WAAW,EAAE,OAAO,CAAC;IACrB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,MAAM,EAAE,eAAe,GAAG,IAAI,CAAC;IAC/B,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;CACpB;AAeD,wBAAgB,eAAe,CAAC,KAAK,EAAE,iBAAiB,GAAG,IAAI,GAAG,iBAAiB,CAwKlF"}
1
+ {"version":3,"file":"use-deploy-action.d.ts","sourceRoot":"","sources":["../../../../../src/presentation/web/hooks/use-deploy-action.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sCAAsC,CAAC;AAM5E,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,SAAS,GAAG,YAAY,CAAC;IACrC,cAAc,EAAE,MAAM,CAAC;IACvB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5B,IAAI,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1B,aAAa,EAAE,OAAO,CAAC;IACvB,WAAW,EAAE,OAAO,CAAC;IACrB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,MAAM,EAAE,eAAe,GAAG,IAAI,CAAC;IAC/B,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;CACpB;AAOD,wBAAgB,eAAe,CAAC,KAAK,EAAE,iBAAiB,GAAG,IAAI,GAAG,iBAAiB,CAwKlF"}
@@ -1,19 +1,11 @@
1
1
  'use client';
2
- /* eslint-disable no-console */
3
2
  import { useState, useCallback, useRef, useEffect } from 'react';
3
+ import { createLogger } from '../lib/logger.js';
4
4
  import { deployFeature } from '../app/actions/deploy-feature.js';
5
5
  import { deployRepository } from '../app/actions/deploy-repository.js';
6
6
  import { stopDeployment } from '../app/actions/stop-deployment.js';
7
7
  import { getDeploymentStatus } from '../app/actions/get-deployment-status.js';
8
- const PREFIX = '[useDeployAction]';
9
- const isDebug = !!process.env.NEXT_PUBLIC_DEBUG;
10
- const noop = () => undefined;
11
- const log = {
12
- info: isDebug ? (...args) => console.info(PREFIX, ...args) : noop,
13
- debug: isDebug ? (...args) => console.debug(PREFIX, ...args) : noop,
14
- warn: (...args) => console.warn(PREFIX, ...args),
15
- error: (...args) => console.error(PREFIX, ...args),
16
- };
8
+ const log = createLogger('[useDeployAction]');
17
9
  const ERROR_CLEAR_DELAY = 5000;
18
10
  const POLL_INTERVAL = 3000;
19
11
  export function useDeployAction(input) {