@shepai/cli 1.72.9-pr220.ce0911d → 1.72.9-pr220.f17b60a

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 (232) hide show
  1. package/dist/src/presentation/web/app/build-feature-node-data.d.ts.map +1 -1
  2. package/dist/src/presentation/web/app/build-feature-node-data.js +2 -26
  3. package/dist/src/presentation/web/app/build-graph-nodes.d.ts.map +1 -1
  4. package/dist/src/presentation/web/app/build-graph-nodes.js +2 -26
  5. package/dist/src/presentation/web/components/common/control-center-drawer/create-drawer-client.d.ts.map +1 -1
  6. package/dist/src/presentation/web/components/common/control-center-drawer/create-drawer-client.js +0 -2
  7. package/dist/src/presentation/web/components/common/control-center-drawer/drawer-view.d.ts +2 -0
  8. package/dist/src/presentation/web/components/common/control-center-drawer/drawer-view.d.ts.map +1 -1
  9. package/dist/src/presentation/web/components/common/control-center-drawer/drawer-view.js +11 -11
  10. package/dist/src/presentation/web/components/common/control-center-drawer/feature-drawer-client.d.ts.map +1 -1
  11. package/dist/src/presentation/web/components/common/control-center-drawer/feature-drawer-client.js +17 -31
  12. package/dist/src/presentation/web/components/common/control-center-drawer/index.d.ts +0 -1
  13. package/dist/src/presentation/web/components/common/control-center-drawer/index.d.ts.map +1 -1
  14. package/dist/src/presentation/web/components/common/control-center-drawer/index.js +0 -1
  15. package/dist/src/presentation/web/components/common/feature-node/derive-feature-state.d.ts +25 -0
  16. package/dist/src/presentation/web/components/common/feature-node/derive-feature-state.d.ts.map +1 -1
  17. package/dist/src/presentation/web/components/common/feature-node/derive-feature-state.js +45 -2
  18. package/dist/src/presentation/web/components/common/index.d.ts +1 -1
  19. package/dist/src/presentation/web/components/common/index.d.ts.map +1 -1
  20. package/dist/src/presentation/web/components/common/index.js +1 -1
  21. package/dist/src/presentation/web/components/features/control-center/use-control-center-state.d.ts.map +1 -1
  22. package/dist/src/presentation/web/components/features/control-center/use-control-center-state.js +20 -30
  23. package/dist/src/presentation/web/components/features/features-canvas/features-canvas.d.ts.map +1 -1
  24. package/dist/src/presentation/web/components/features/features-canvas/features-canvas.js +2 -13
  25. package/dist/src/presentation/web/hooks/use-agent-events.d.ts.map +1 -1
  26. package/dist/src/presentation/web/hooks/use-agent-events.js +6 -3
  27. package/dist/tsconfig.build.tsbuildinfo +1 -1
  28. package/package.json +1 -1
  29. package/web/.next/BUILD_ID +1 -1
  30. package/web/.next/build-manifest.json +2 -2
  31. package/web/.next/cache/.previewinfo +1 -1
  32. package/web/.next/cache/.rscinfo +1 -1
  33. package/web/.next/cache/.tsbuildinfo +1 -1
  34. package/web/.next/cache/config.json +3 -3
  35. package/web/.next/fallback-build-manifest.json +2 -2
  36. package/web/.next/prerender-manifest.json +3 -3
  37. package/web/.next/server/app/(dashboard)/@drawer/create/page/server-reference-manifest.json +15 -15
  38. package/web/.next/server/app/(dashboard)/@drawer/create/page.js.nft.json +1 -1
  39. package/web/.next/server/app/(dashboard)/@drawer/create/page_client-reference-manifest.js +1 -1
  40. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page/server-reference-manifest.json +18 -18
  41. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js.nft.json +1 -1
  42. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page_client-reference-manifest.js +1 -1
  43. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page/server-reference-manifest.json +13 -13
  44. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js.nft.json +1 -1
  45. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  46. package/web/.next/server/app/(dashboard)/create/page/server-reference-manifest.json +15 -15
  47. package/web/.next/server/app/(dashboard)/create/page.js.nft.json +1 -1
  48. package/web/.next/server/app/(dashboard)/create/page_client-reference-manifest.js +1 -1
  49. package/web/.next/server/app/(dashboard)/feature/[featureId]/page/server-reference-manifest.json +18 -18
  50. package/web/.next/server/app/(dashboard)/feature/[featureId]/page.js.nft.json +1 -1
  51. package/web/.next/server/app/(dashboard)/feature/[featureId]/page_client-reference-manifest.js +1 -1
  52. package/web/.next/server/app/(dashboard)/page/server-reference-manifest.json +13 -13
  53. package/web/.next/server/app/(dashboard)/page.js.nft.json +1 -1
  54. package/web/.next/server/app/(dashboard)/page_client-reference-manifest.js +1 -1
  55. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page/server-reference-manifest.json +13 -13
  56. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js.nft.json +1 -1
  57. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  58. package/web/.next/server/app/_global-error.html +2 -2
  59. package/web/.next/server/app/_global-error.rsc +1 -1
  60. package/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  61. package/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  62. package/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  63. package/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  64. package/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  65. package/web/.next/server/app/_not-found/page/server-reference-manifest.json +1 -1
  66. package/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  67. package/web/.next/server/app/skills/page/server-reference-manifest.json +6 -6
  68. package/web/.next/server/app/skills/page.js.nft.json +1 -1
  69. package/web/.next/server/app/skills/page_client-reference-manifest.js +1 -1
  70. package/web/.next/server/app/tools/page/server-reference-manifest.json +6 -6
  71. package/web/.next/server/app/tools/page.js.nft.json +1 -1
  72. package/web/.next/server/app/tools/page_client-reference-manifest.js +1 -1
  73. package/web/.next/server/app/version/page/server-reference-manifest.json +1 -1
  74. package/web/.next/server/app/version/page_client-reference-manifest.js +1 -1
  75. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js +1 -1
  76. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js.map +1 -1
  77. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_816618e2.js +1 -1
  78. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_816618e2.js.map +1 -1
  79. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_ba2e050f.js +1 -1
  80. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_ba2e050f.js.map +1 -1
  81. package/web/.next/server/chunks/ssr/[root-of-the-server]__17a611f0._.js +2 -2
  82. package/web/.next/server/chunks/ssr/[root-of-the-server]__17a611f0._.js.map +1 -1
  83. package/web/.next/server/chunks/ssr/[root-of-the-server]__2018e25f._.js +1 -1
  84. package/web/.next/server/chunks/ssr/[root-of-the-server]__2018e25f._.js.map +1 -1
  85. package/web/.next/server/chunks/ssr/[root-of-the-server]__45dbf93d._.js +2 -2
  86. package/web/.next/server/chunks/ssr/[root-of-the-server]__45dbf93d._.js.map +1 -1
  87. package/web/.next/server/chunks/ssr/[root-of-the-server]__6258349c._.js +1 -1
  88. package/web/.next/server/chunks/ssr/[root-of-the-server]__6258349c._.js.map +1 -1
  89. package/web/.next/server/chunks/ssr/[root-of-the-server]__6b17a22d._.js +1 -1
  90. package/web/.next/server/chunks/ssr/[root-of-the-server]__6b17a22d._.js.map +1 -1
  91. package/web/.next/server/chunks/ssr/[root-of-the-server]__6cbc1149._.js +2 -2
  92. package/web/.next/server/chunks/ssr/[root-of-the-server]__804c006d._.js +1 -1
  93. package/web/.next/server/chunks/ssr/[root-of-the-server]__804c006d._.js.map +1 -1
  94. package/web/.next/server/chunks/ssr/[root-of-the-server]__94a6d275._.js +1 -1
  95. package/web/.next/server/chunks/ssr/[root-of-the-server]__94a6d275._.js.map +1 -1
  96. package/web/.next/server/chunks/ssr/[root-of-the-server]__aad040c0._.js +1 -1
  97. package/web/.next/server/chunks/ssr/[root-of-the-server]__aad040c0._.js.map +1 -1
  98. package/web/.next/server/chunks/ssr/_0e9d6bf7._.js +1 -1
  99. package/web/.next/server/chunks/ssr/_0e9d6bf7._.js.map +1 -1
  100. package/web/.next/server/chunks/ssr/_250a63ae._.js +1 -1
  101. package/web/.next/server/chunks/ssr/_250a63ae._.js.map +1 -1
  102. package/web/.next/server/chunks/ssr/_61351ed3._.js +1 -1
  103. package/web/.next/server/chunks/ssr/_61351ed3._.js.map +1 -1
  104. package/web/.next/server/chunks/ssr/_8400c8bb._.js +1 -1
  105. package/web/.next/server/chunks/ssr/_8400c8bb._.js.map +1 -1
  106. package/web/.next/server/chunks/ssr/{_1fae710b._.js → _8e87c87b._.js} +2 -2
  107. package/web/.next/server/chunks/ssr/{_1fae710b._.js.map → _8e87c87b._.js.map} +1 -1
  108. package/web/.next/server/chunks/ssr/_9f940437._.js +1 -1
  109. package/web/.next/server/chunks/ssr/_9f940437._.js.map +1 -1
  110. package/web/.next/server/chunks/ssr/src_presentation_web_2b91e4ec._.js +1 -1
  111. package/web/.next/server/chunks/ssr/src_presentation_web_2b91e4ec._.js.map +1 -1
  112. package/web/.next/server/chunks/ssr/src_presentation_web_5bcc1537._.js +1 -1
  113. package/web/.next/server/chunks/ssr/src_presentation_web_5bcc1537._.js.map +1 -1
  114. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_5955c012.js +1 -1
  115. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_5955c012.js.map +1 -1
  116. package/web/.next/server/chunks/ssr/src_presentation_web_ca99d62d._.js +1 -1
  117. package/web/.next/server/chunks/ssr/src_presentation_web_ca99d62d._.js.map +1 -1
  118. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js +1 -1
  119. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js.map +1 -1
  120. package/web/.next/server/chunks/ssr/src_presentation_web_d5b0cb86._.js +2 -2
  121. package/web/.next/server/chunks/ssr/src_presentation_web_d5b0cb86._.js.map +1 -1
  122. package/web/.next/server/chunks/ssr/src_presentation_web_e626b63c._.js +2 -2
  123. package/web/.next/server/chunks/ssr/src_presentation_web_e626b63c._.js.map +1 -1
  124. package/web/.next/server/pages/500.html +2 -2
  125. package/web/.next/server/server-reference-manifest.js +1 -1
  126. package/web/.next/server/server-reference-manifest.json +21 -21
  127. package/web/.next/standalone/src/presentation/web/.next/BUILD_ID +1 -1
  128. package/web/.next/standalone/src/presentation/web/.next/build-manifest.json +2 -2
  129. package/web/.next/standalone/src/presentation/web/.next/prerender-manifest.json +3 -3
  130. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/@drawer/create/page/server-reference-manifest.json +15 -15
  131. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/@drawer/create/page.js.nft.json +1 -1
  132. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/@drawer/create/page_client-reference-manifest.js +1 -1
  133. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page/server-reference-manifest.json +18 -18
  134. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js.nft.json +1 -1
  135. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page_client-reference-manifest.js +1 -1
  136. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page/server-reference-manifest.json +13 -13
  137. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js.nft.json +1 -1
  138. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  139. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/create/page/server-reference-manifest.json +15 -15
  140. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/create/page.js.nft.json +1 -1
  141. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/create/page_client-reference-manifest.js +1 -1
  142. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/feature/[featureId]/page/server-reference-manifest.json +18 -18
  143. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/feature/[featureId]/page.js.nft.json +1 -1
  144. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/feature/[featureId]/page_client-reference-manifest.js +1 -1
  145. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/page/server-reference-manifest.json +13 -13
  146. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/page.js.nft.json +1 -1
  147. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/page_client-reference-manifest.js +1 -1
  148. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/repository/[repositoryId]/page/server-reference-manifest.json +13 -13
  149. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js.nft.json +1 -1
  150. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  151. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.html +2 -2
  152. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.rsc +1 -1
  153. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  154. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  155. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  156. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  157. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  158. package/web/.next/standalone/src/presentation/web/.next/server/app/_not-found/page/server-reference-manifest.json +1 -1
  159. package/web/.next/standalone/src/presentation/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  160. package/web/.next/standalone/src/presentation/web/.next/server/app/skills/page/server-reference-manifest.json +6 -6
  161. package/web/.next/standalone/src/presentation/web/.next/server/app/skills/page.js.nft.json +1 -1
  162. package/web/.next/standalone/src/presentation/web/.next/server/app/skills/page_client-reference-manifest.js +1 -1
  163. package/web/.next/standalone/src/presentation/web/.next/server/app/tools/page/server-reference-manifest.json +6 -6
  164. package/web/.next/standalone/src/presentation/web/.next/server/app/tools/page.js.nft.json +1 -1
  165. package/web/.next/standalone/src/presentation/web/.next/server/app/tools/page_client-reference-manifest.js +1 -1
  166. package/web/.next/standalone/src/presentation/web/.next/server/app/version/page/server-reference-manifest.json +1 -1
  167. package/web/.next/standalone/src/presentation/web/.next/server/app/version/page_client-reference-manifest.js +1 -1
  168. 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
  169. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_816618e2.js +1 -1
  170. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_ba2e050f.js +1 -1
  171. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__17a611f0._.js +2 -2
  172. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__2018e25f._.js +1 -1
  173. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__45dbf93d._.js +2 -2
  174. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__6258349c._.js +1 -1
  175. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__6b17a22d._.js +1 -1
  176. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__6cbc1149._.js +2 -2
  177. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__804c006d._.js +1 -1
  178. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__94a6d275._.js +1 -1
  179. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__aad040c0._.js +1 -1
  180. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_0e9d6bf7._.js +1 -1
  181. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_250a63ae._.js +1 -1
  182. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_61351ed3._.js +1 -1
  183. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_8400c8bb._.js +1 -1
  184. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/{_1fae710b._.js → _8e87c87b._.js} +2 -2
  185. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_9f940437._.js +1 -1
  186. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/src_presentation_web_2b91e4ec._.js +1 -1
  187. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/src_presentation_web_5bcc1537._.js +1 -1
  188. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_5955c012.js +1 -1
  189. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/src_presentation_web_ca99d62d._.js +1 -1
  190. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js +1 -1
  191. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/src_presentation_web_d5b0cb86._.js +2 -2
  192. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/src_presentation_web_e626b63c._.js +2 -2
  193. package/web/.next/standalone/src/presentation/web/.next/server/pages/500.html +2 -2
  194. package/web/.next/standalone/src/presentation/web/.next/server/server-reference-manifest.js +1 -1
  195. package/web/.next/standalone/src/presentation/web/.next/server/server-reference-manifest.json +21 -21
  196. package/web/.next/standalone/src/presentation/web/app/build-feature-node-data.ts +3 -30
  197. package/web/.next/standalone/src/presentation/web/app/build-graph-nodes.ts +3 -30
  198. package/web/.next/standalone/src/presentation/web/components/common/control-center-drawer/create-drawer-client.tsx +0 -2
  199. package/web/.next/standalone/src/presentation/web/components/common/control-center-drawer/drawer-view.ts +12 -13
  200. package/web/.next/standalone/src/presentation/web/components/common/control-center-drawer/feature-drawer-client.tsx +21 -41
  201. package/web/.next/standalone/src/presentation/web/components/common/control-center-drawer/index.ts +0 -1
  202. package/web/.next/standalone/src/presentation/web/components/common/feature-node/derive-feature-state.ts +63 -2
  203. package/web/.next/standalone/src/presentation/web/components/common/index.ts +1 -6
  204. package/web/.next/standalone/src/presentation/web/components/features/control-center/use-control-center-state.ts +37 -43
  205. package/web/.next/standalone/src/presentation/web/components/features/features-canvas/features-canvas.tsx +1 -18
  206. package/web/.next/standalone/src/presentation/web/hooks/use-agent-events.ts +7 -3
  207. package/web/.next/static/chunks/0ffccd7be73305c8.css +2 -0
  208. package/web/.next/static/chunks/76827713cb2b7333.js +1 -0
  209. package/web/.next/static/chunks/{ce35cf93d71d1c1e.js → 792aac476adb5875.js} +1 -1
  210. package/web/.next/static/chunks/{f3d1b4bf5f83a7bb.js → 7c8adcfd920a8f74.js} +1 -1
  211. package/web/.next/static/chunks/{28ab1bfc2f001573.js → 83463b63971f5723.js} +1 -1
  212. package/web/.next/static/chunks/{145335ccbec019cd.js → 98ca891a5c156aa5.js} +3 -3
  213. package/web/.next/static/chunks/{cd256f1719637fae.js → 9b1770f05f1d95e5.js} +1 -1
  214. package/web/.next/static/chunks/{d8b549dcd668b553.js → a7f52757dff0cea0.js} +1 -1
  215. package/web/.next/static/chunks/b6becf0de992842a.js +1 -0
  216. package/web/.next/static/chunks/{5c1f5a37231b6108.js → d5e95c4482029a39.js} +1 -1
  217. package/web/.next/trace +1 -1
  218. package/web/.next/trace-build +1 -1
  219. package/dist/src/presentation/web/components/common/control-center-drawer/control-center-drawer.d.ts +0 -12
  220. package/dist/src/presentation/web/components/common/control-center-drawer/control-center-drawer.d.ts.map +0 -1
  221. package/dist/src/presentation/web/components/common/control-center-drawer/control-center-drawer.js +0 -337
  222. package/dist/src/presentation/web/components/common/control-center-drawer/control-center-drawer.stories.d.ts +0 -33
  223. package/dist/src/presentation/web/components/common/control-center-drawer/control-center-drawer.stories.d.ts.map +0 -1
  224. package/dist/src/presentation/web/components/common/control-center-drawer/control-center-drawer.stories.js +0 -214
  225. package/web/.next/standalone/src/presentation/web/components/common/control-center-drawer/control-center-drawer.stories.tsx +0 -293
  226. package/web/.next/standalone/src/presentation/web/components/common/control-center-drawer/control-center-drawer.tsx +0 -745
  227. package/web/.next/static/chunks/02f29f2542ce0260.js +0 -1
  228. package/web/.next/static/chunks/87bd8e61a05cb052.css +0 -2
  229. package/web/.next/static/chunks/da76b4d6b8a4cdb0.js +0 -1
  230. /package/web/.next/static/{DSNQz6BAG_GWooVc5rWTS → eg0FTlsA4z_7CXbFfMgAr}/_buildManifest.js +0 -0
  231. /package/web/.next/static/{DSNQz6BAG_GWooVc5rWTS → eg0FTlsA4z_7CXbFfMgAr}/_clientMiddlewareManifest.json +0 -0
  232. /package/web/.next/static/{DSNQz6BAG_GWooVc5rWTS → eg0FTlsA4z_7CXbFfMgAr}/_ssgManifest.js +0 -0
@@ -1,337 +0,0 @@
1
- 'use client';
2
- import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
3
- import { useState, useCallback, useEffect } from 'react';
4
- import { toast } from 'sonner';
5
- import { Loader2, Trash2, ExternalLink, GitCommitHorizontal, Code2, Terminal, FolderOpen, Play, Square, } from 'lucide-react';
6
- import { PrStatus } from '../../../../../../packages/core/src/domain/generated/output.js';
7
- import { approveFeature } from '../../../app/actions/approve-feature.js';
8
- import { rejectFeature } from '../../../app/actions/reject-feature.js';
9
- import { getFeatureArtifact } from '../../../app/actions/get-feature-artifact.js';
10
- import { getResearchArtifact } from '../../../app/actions/get-research-artifact.js';
11
- import { getMergeReviewData } from '../../../app/actions/get-merge-review-data.js';
12
- import { cn } from '../../../lib/utils.js';
13
- import { featureFlags } from '../../../lib/feature-flags.js';
14
- import { useSoundAction } from '../../../hooks/use-sound-action.js';
15
- import { useDeployAction } from '../../../hooks/use-deploy-action.js';
16
- import { BaseDrawer } from '../../common/base-drawer/index.js';
17
- import { DeploymentStatusBadge } from '../../common/deployment-status-badge/index.js';
18
- import { DrawerTitle, DrawerDescription } from '../../ui/drawer.js';
19
- import { Button } from '../../ui/button.js';
20
- import { Badge } from '../../ui/badge.js';
21
- import { Separator } from '../../ui/separator.js';
22
- import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from '../../ui/tooltip.js';
23
- import { CometSpinner } from '../../ui/comet-spinner.js';
24
- import { AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogTitle, AlertDialogTrigger, } from '../../ui/alert-dialog.js';
25
- import { CiStatusBadge } from '../../common/ci-status-badge/index.js';
26
- import { ActionButton } from '../../common/action-button/index.js';
27
- import { OpenActionMenu } from '../../common/open-action-menu/index.js';
28
- import { FeatureCreateDrawer } from '../../common/feature-create-drawer/index.js';
29
- import { PrdQuestionnaire } from '../../common/prd-questionnaire/index.js';
30
- import { TechReviewTabs } from '../../common/tech-review-tabs/index.js';
31
- import { MergeReview } from '../../common/merge-review/index.js';
32
- import { featureNodeStateConfig, lifecycleDisplayLabels } from '../../common/feature-node/index.js';
33
- import { useFeatureActions } from '../../common/feature-drawer/use-feature-actions.js';
34
- import { useRepositoryActions } from '../../common/repository-node/use-repository-actions.js';
35
- export function ControlCenterDrawer({ view, onClose, onDelete, isDeleting, onCreateSubmit, isSubmitting, }) {
36
- // ── PRD questionnaire state ─────────────────────────────────────────────
37
- const [prdData, setPrdData] = useState(null);
38
- const [prdSelections, setPrdSelections] = useState({});
39
- const [isLoadingPrd, setIsLoadingPrd] = useState(false);
40
- // ── Tech decisions state ────────────────────────────────────────────────
41
- const [techData, setTechData] = useState(null);
42
- const [isLoadingTech, setIsLoadingTech] = useState(false);
43
- // ── Product decisions state (for tech review Product tab) ─────────────
44
- const [techProductData, setTechProductData] = useState(undefined);
45
- const [isLoadingTechProduct, setIsLoadingTechProduct] = useState(false);
46
- // ── Merge review state ──────────────────────────────────────────────────
47
- const [mergeData, setMergeData] = useState(null);
48
- const [isLoadingMerge, setIsLoadingMerge] = useState(false);
49
- // ── Shared reject state ─────────────────────────────────────────────────
50
- const [isRejecting, setIsRejecting] = useState(false);
51
- const rejectSound = useSoundAction('reject');
52
- // ── Data fetching ───────────────────────────────────────────────────────
53
- const prdFeatureId = view?.type === 'prd-review' ? view.node.featureId : null;
54
- useEffect(() => {
55
- setPrdSelections({});
56
- setPrdData(null);
57
- if (!prdFeatureId)
58
- return;
59
- let cancelled = false;
60
- setIsLoadingPrd(true);
61
- getFeatureArtifact(prdFeatureId)
62
- .then((result) => {
63
- if (cancelled)
64
- return;
65
- if (result.error) {
66
- toast.error(result.error);
67
- return;
68
- }
69
- if (result.questionnaire) {
70
- setPrdData(result.questionnaire);
71
- const defaults = {};
72
- for (const q of result.questionnaire.questions) {
73
- const recommended = q.options.find((o) => o.recommended);
74
- if (recommended)
75
- defaults[q.id] = recommended.id;
76
- }
77
- setPrdSelections(defaults);
78
- }
79
- })
80
- .catch(() => {
81
- if (!cancelled)
82
- toast.error('Failed to load questionnaire');
83
- })
84
- .finally(() => {
85
- if (!cancelled)
86
- setIsLoadingPrd(false);
87
- });
88
- return () => {
89
- cancelled = true;
90
- };
91
- }, [prdFeatureId]);
92
- const techFeatureId = view?.type === 'tech-review' ? view.node.featureId : null;
93
- useEffect(() => {
94
- setTechData(null);
95
- if (!techFeatureId)
96
- return;
97
- let cancelled = false;
98
- setIsLoadingTech(true);
99
- getResearchArtifact(techFeatureId)
100
- .then((result) => {
101
- if (cancelled)
102
- return;
103
- if (result.error) {
104
- toast.error(result.error);
105
- return;
106
- }
107
- if (result.techDecisions)
108
- setTechData(result.techDecisions);
109
- })
110
- .catch(() => {
111
- if (!cancelled)
112
- toast.error('Failed to load tech decisions');
113
- })
114
- .finally(() => {
115
- if (!cancelled)
116
- setIsLoadingTech(false);
117
- });
118
- return () => {
119
- cancelled = true;
120
- };
121
- }, [techFeatureId]);
122
- // Fetch product decisions for the Product tab in tech review
123
- useEffect(() => {
124
- setTechProductData(undefined);
125
- if (!techFeatureId)
126
- return;
127
- let cancelled = false;
128
- setIsLoadingTechProduct(true);
129
- getFeatureArtifact(techFeatureId)
130
- .then((result) => {
131
- if (cancelled)
132
- return;
133
- if (result.productDecisions) {
134
- setTechProductData(result.productDecisions);
135
- }
136
- // Silent failure — product tab shows "not available"
137
- })
138
- .catch(() => {
139
- // Silent failure — the product tab is supplementary
140
- })
141
- .finally(() => {
142
- if (!cancelled)
143
- setIsLoadingTechProduct(false);
144
- });
145
- return () => {
146
- cancelled = true;
147
- };
148
- }, [techFeatureId]);
149
- const mergeFeatureId = view?.type === 'merge-review' ? view.node.featureId : null;
150
- useEffect(() => {
151
- setMergeData(null);
152
- if (!mergeFeatureId)
153
- return;
154
- let cancelled = false;
155
- setIsLoadingMerge(true);
156
- getMergeReviewData(mergeFeatureId)
157
- .then((result) => {
158
- if (cancelled)
159
- return;
160
- if ('error' in result) {
161
- toast.error(result.error);
162
- return;
163
- }
164
- setMergeData(result);
165
- })
166
- .catch(() => {
167
- if (!cancelled)
168
- toast.error('Failed to load merge review data');
169
- })
170
- .finally(() => {
171
- if (!cancelled)
172
- setIsLoadingMerge(false);
173
- });
174
- return () => {
175
- cancelled = true;
176
- };
177
- }, [mergeFeatureId]);
178
- // ── Approve / reject handlers ───────────────────────────────────────────
179
- const reviewNode = view?.type === 'prd-review' || view?.type === 'tech-review' || view?.type === 'merge-review'
180
- ? view.node
181
- : null;
182
- const handleReject = useCallback(async (feedback, label, onDone) => {
183
- if (!reviewNode?.featureId)
184
- return;
185
- setIsRejecting(true);
186
- try {
187
- const result = await rejectFeature(reviewNode.featureId, feedback);
188
- if (!result.rejected) {
189
- toast.error(result.error ?? `Failed to reject ${label.toLowerCase()}`);
190
- return;
191
- }
192
- rejectSound.play();
193
- toast.success(`${label} rejected — agent re-iterating (iteration ${result.iteration})`);
194
- if (result.iterationWarning) {
195
- toast.warning(`Iteration ${result.iteration} — consider approving or adjusting feedback to avoid excessive iterations`);
196
- }
197
- onClose();
198
- onDone?.();
199
- }
200
- finally {
201
- setIsRejecting(false);
202
- }
203
- }, [reviewNode, onClose, rejectSound]);
204
- const handlePrdReject = useCallback((feedback) => handleReject(feedback, 'Requirements', () => setPrdSelections({})), [handleReject]);
205
- const handleTechReject = useCallback((feedback) => handleReject(feedback, 'Plan'), [handleReject]);
206
- const handleMergeReject = useCallback((feedback) => handleReject(feedback, 'Merge'), [handleReject]);
207
- const handleSimpleApprove = useCallback(async (label) => {
208
- if (!reviewNode?.featureId)
209
- return;
210
- const result = await approveFeature(reviewNode.featureId);
211
- if (!result.approved) {
212
- toast.error(result.error ?? `Failed to approve ${label.toLowerCase()}`);
213
- return;
214
- }
215
- toast.success(`${label} approved — agent resuming`);
216
- onClose();
217
- }, [reviewNode, onClose]);
218
- const handlePrdApprove = useCallback(async (_actionId) => {
219
- if (view?.type !== 'prd-review')
220
- return;
221
- let payload;
222
- if (prdData) {
223
- const changedSelections = [];
224
- for (const [questionId, optionId] of Object.entries(prdSelections)) {
225
- const question = prdData.questions.find((q) => q.id === questionId);
226
- const option = question?.options.find((o) => o.id === optionId);
227
- if (question && option) {
228
- changedSelections.push({ questionId: question.question, selectedOption: option.label });
229
- }
230
- }
231
- payload = { approved: true, changedSelections };
232
- }
233
- const result = await approveFeature(view.node.featureId, payload);
234
- if (!result.approved) {
235
- toast.error(result.error ?? 'Failed to approve requirements');
236
- return;
237
- }
238
- toast.success('Requirements approved — agent resuming');
239
- setPrdSelections({});
240
- onClose();
241
- }, [view, prdData, prdSelections, onClose]);
242
- const handleTechApprove = useCallback(() => handleSimpleApprove('Plan'), [handleSimpleApprove]);
243
- const handleMergeApprove = useCallback(() => handleSimpleApprove('Merge'), [handleSimpleApprove]);
244
- // ── Derived view data ───────────────────────────────────────────────────
245
- const isCreateView = view?.type === 'feature-create';
246
- const createView = isCreateView ? view : null;
247
- const featureNode = view?.type === 'feature' ||
248
- view?.type === 'prd-review' ||
249
- view?.type === 'tech-review' ||
250
- view?.type === 'merge-review'
251
- ? view.node
252
- : null;
253
- const repoData = view?.type === 'repository' ? view.data : null;
254
- // ── Hooks (always called unconditionally per Rules of Hooks) ────────────
255
- const featureActionsInput = featureNode?.repositoryPath && featureNode?.branch
256
- ? {
257
- repositoryPath: featureNode.repositoryPath,
258
- branch: featureNode.branch,
259
- specPath: featureNode.specPath,
260
- }
261
- : null;
262
- const featureActions = useFeatureActions(featureActionsInput);
263
- const repoActions = useRepositoryActions(repoData?.repositoryPath ? { repositoryPath: repoData.repositoryPath } : null);
264
- // ── Deploy targets ──────────────────────────────────────────────────────
265
- // Feature deploy is rendered inline in the header; repo deploy uses BaseDrawer's bar.
266
- const featureDeployTarget = featureNode?.repositoryPath && featureNode.branch
267
- ? {
268
- targetId: featureNode.featureId,
269
- targetType: 'feature',
270
- repositoryPath: featureNode.repositoryPath,
271
- branch: featureNode.branch,
272
- }
273
- : null;
274
- const repoDeployTarget = repoData?.repositoryPath
275
- ? {
276
- targetId: repoData.repositoryPath,
277
- targetType: 'repository',
278
- repositoryPath: repoData.repositoryPath,
279
- }
280
- : undefined;
281
- const deployAction = useDeployAction(featureDeployTarget);
282
- const isFeatureDeployActive = deployAction.status === 'Booting' || deployAction.status === 'Ready';
283
- // ── Header ──────────────────────────────────────────────────────────────
284
- let header = undefined;
285
- if (featureNode) {
286
- header = (_jsxs(_Fragment, { children: [_jsxs("div", { "data-testid": "feature-drawer-header", children: [_jsx(DrawerTitle, { children: featureNode.name }), featureNode.description ? (_jsx(DrawerDescription, { children: featureNode.description })) : featureNode.featureId ? (_jsx(DrawerDescription, { className: "sr-only", children: featureNode.featureId })) : null] }), featureActionsInput ? (_jsxs("div", { className: "flex items-center gap-2 pt-2", children: [_jsx(OpenActionMenu, { actions: featureActions, repositoryPath: featureActionsInput.repositoryPath, showSpecs: !!featureActionsInput.specPath }), featureFlags.envDeploy && featureDeployTarget ? (_jsxs(_Fragment, { children: [_jsx(TooltipProvider, { children: _jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx("span", { children: _jsx(ActionButton, { label: isFeatureDeployActive ? 'Stop Dev Server' : 'Start Dev Server', onClick: isFeatureDeployActive ? deployAction.stop : deployAction.deploy, loading: deployAction.deployLoading || deployAction.stopLoading, error: !!deployAction.deployError, icon: isFeatureDeployActive ? Square : Play, iconOnly: true, variant: "outline", size: "icon-sm" }) }) }), _jsx(TooltipContent, { children: isFeatureDeployActive ? 'Stop Dev Server' : 'Start Dev Server' })] }) }), isFeatureDeployActive ? (_jsx(DeploymentStatusBadge, { status: deployAction.status, url: deployAction.url, targetId: featureDeployTarget?.targetId })) : null] })) : null, onDelete && featureNode.featureId ? (_jsxs(AlertDialog, { children: [_jsx(AlertDialogTrigger, { asChild: true, children: _jsx(Button, { variant: "ghost", size: "icon-sm", "aria-label": "Delete feature", disabled: isDeleting, className: "text-muted-foreground hover:text-destructive ml-auto", "data-testid": "feature-drawer-delete", children: isDeleting ? (_jsx(Loader2, { className: "size-4 animate-spin" })) : (_jsx(Trash2, { className: "size-4" })) }) }), _jsxs(AlertDialogContent, { children: [_jsxs(AlertDialogHeader, { children: [_jsx(AlertDialogTitle, { children: "Delete feature?" }), _jsxs(AlertDialogDescription, { children: ["This will permanently delete ", _jsx("strong", { children: featureNode.name }), " (", featureNode.featureId, "). This action cannot be undone.", featureNode.state === 'running' ? (_jsx(_Fragment, { children: " This feature has a running agent that will be stopped." })) : null] })] }), _jsxs(AlertDialogFooter, { children: [_jsx(AlertDialogCancel, { disabled: isDeleting, children: "Cancel" }), _jsx(AlertDialogAction, { variant: "destructive", disabled: isDeleting, onClick: () => onDelete(featureNode.featureId), children: isDeleting ? (_jsxs(_Fragment, { children: [_jsx(Loader2, { className: "mr-2 h-4 w-4 animate-spin" }), "Deleting\u2026"] })) : ('Delete') })] })] })] })) : null] })) : null] }));
287
- }
288
- else if (repoData) {
289
- header = (_jsxs("div", { "data-testid": "repository-drawer-header", children: [_jsx(DrawerTitle, { children: repoData.name }), repoData.repositoryPath ? (_jsx(DrawerDescription, { className: "truncate font-mono text-xs", children: repoData.repositoryPath })) : null] }));
290
- }
291
- // ── Body ────────────────────────────────────────────────────────────────
292
- let body = null;
293
- if (view?.type === 'feature' && featureNode) {
294
- body = (_jsxs("div", { className: "flex-1 overflow-y-auto", children: [_jsxs("div", { "data-testid": "feature-drawer-status", className: "flex flex-col gap-3 p-4", children: [_jsx("div", { className: "text-muted-foreground text-xs font-semibold tracking-wider", children: lifecycleDisplayLabels[featureNode.lifecycle] }), _jsx(FeatureStateBadge, { data: featureNode }), featureNode.progress > 0 ? (_jsxs("div", { "data-testid": "feature-drawer-progress", className: "flex flex-col gap-1", children: [_jsxs("div", { className: "text-muted-foreground flex items-center justify-between text-xs", children: [_jsx("span", { children: "Progress" }), _jsxs("span", { children: [featureNode.progress, "%"] })] }), _jsx("div", { className: "bg-muted h-2 w-full overflow-hidden rounded-full", children: _jsx("div", { className: cn('h-full rounded-full transition-all', featureNodeStateConfig[featureNode.state].progressClass), style: { width: `${featureNode.progress}%` } }) })] })) : null] }), featureNode.pr ? (_jsxs(_Fragment, { children: [_jsx(Separator, {}), _jsx(FeaturePrInfo, { pr: featureNode.pr })] })) : null, _jsx(FeatureDetails, { data: featureNode })] }));
295
- }
296
- else if (view?.type === 'prd-review') {
297
- body = prdData ? (_jsx(PrdQuestionnaire, { data: prdData, selections: prdSelections, onSelect: (qId, oId) => setPrdSelections((prev) => ({ ...prev, [qId]: oId })), onApprove: handlePrdApprove, onReject: handlePrdReject, isProcessing: isLoadingPrd, isRejecting: isRejecting })) : (_jsx("div", { className: "flex items-center justify-center p-8", children: _jsx(Loader2, { className: "text-muted-foreground h-6 w-6 animate-spin" }) }));
298
- }
299
- else if (view?.type === 'tech-review') {
300
- body = techData ? (_jsx(TechReviewTabs, { techData: techData, productData: isLoadingTechProduct ? null : techProductData, onApprove: handleTechApprove, onReject: handleTechReject, isProcessing: isLoadingTech, isRejecting: isRejecting })) : (_jsx("div", { className: "flex items-center justify-center p-8", children: _jsx(Loader2, { className: "text-muted-foreground h-6 w-6 animate-spin" }) }));
301
- }
302
- else if (view?.type === 'merge-review') {
303
- body = mergeData ? (_jsx(MergeReview, { data: mergeData, onApprove: handleMergeApprove, onReject: handleMergeReject, isProcessing: isLoadingMerge, isRejecting: isRejecting })) : (_jsx("div", { className: "flex items-center justify-center p-8", children: _jsx(Loader2, { className: "text-muted-foreground h-6 w-6 animate-spin" }) }));
304
- }
305
- else if (view?.type === 'repository' && repoData?.repositoryPath) {
306
- body = (_jsxs("div", { className: "flex-1 overflow-y-auto", children: [_jsx(Separator, {}), _jsxs("div", { className: "flex flex-col gap-3 p-4", children: [_jsx("div", { className: "text-muted-foreground text-xs font-semibold tracking-wider", children: "OPEN WITH" }), _jsxs("div", { className: "flex flex-col gap-2", children: [_jsx(ActionButton, { label: "Open in IDE", onClick: repoActions.openInIde, loading: repoActions.ideLoading, error: !!repoActions.ideError, icon: Code2, variant: "outline", size: "sm" }), _jsx(ActionButton, { label: "Open in Shell", onClick: repoActions.openInShell, loading: repoActions.shellLoading, error: !!repoActions.shellError, icon: Terminal, variant: "outline", size: "sm" }), _jsx(ActionButton, { label: "Open Folder", onClick: repoActions.openFolder, loading: repoActions.folderLoading, error: !!repoActions.folderError, icon: FolderOpen, variant: "outline", size: "sm" })] })] })] }));
307
- }
308
- // ── Render ──────────────────────────────────────────────────────────────
309
- return (_jsxs(_Fragment, { children: [_jsx(BaseDrawer, { open: view !== null && !isCreateView, onClose: onClose, size: "md", modal: false, header: header, deployTarget: repoDeployTarget, "data-testid": view?.type === 'feature'
310
- ? 'feature-drawer'
311
- : view?.type === 'repository'
312
- ? 'repository-drawer'
313
- : 'review-drawer', children: body }), _jsx(FeatureCreateDrawer, { open: isCreateView, onClose: onClose, onSubmit: onCreateSubmit, repositoryPath: createView?.repositoryPath ?? '', features: createView?.features ?? [], workflowDefaults: createView?.workflowDefaults, initialParentId: createView?.initialParentId, isSubmitting: isSubmitting })] }));
314
- }
315
- // ── Private sub-components ────────────────────────────────────────────────────
316
- function FeatureStateBadge({ data }) {
317
- const config = featureNodeStateConfig[data.state];
318
- const Icon = config.icon;
319
- return (_jsxs("div", { className: cn('flex items-center gap-2 rounded-full px-3 py-1.5 text-sm font-medium', config.badgeBgClass, config.badgeClass), children: [data.state === 'running' ? (_jsx(CometSpinner, { size: "sm", className: "shrink-0" })) : (_jsx(Icon, { className: "h-4 w-4 shrink-0" })), _jsx("span", { children: config.label })] }));
320
- }
321
- const prStatusStyles = {
322
- [PrStatus.Open]: 'border-transparent bg-blue-50 text-blue-700 hover:bg-blue-50',
323
- [PrStatus.Merged]: 'border-transparent bg-purple-50 text-purple-700 hover:bg-purple-50',
324
- [PrStatus.Closed]: 'border-transparent bg-red-50 text-red-700 hover:bg-red-50',
325
- };
326
- function FeaturePrInfo({ pr }) {
327
- return (_jsx("div", { "data-testid": "feature-drawer-pr", className: "border-border mx-4 rounded-lg border", children: _jsxs("div", { className: "space-y-3 px-4 py-3", children: [_jsxs("div", { className: "flex items-center justify-between", children: [_jsxs("a", { href: pr.url, target: "_blank", rel: "noopener noreferrer", className: "text-primary flex items-center gap-1.5 text-sm font-semibold underline underline-offset-2", children: ["PR #", pr.number, _jsx(ExternalLink, { className: "h-3.5 w-3.5" })] }), _jsx(Badge, { className: prStatusStyles[pr.status], children: pr.status })] }), pr.ciStatus ? (_jsxs("div", { className: "flex items-center justify-between", children: [_jsx("span", { className: "text-muted-foreground text-xs font-medium", children: "CI Status" }), _jsx(CiStatusBadge, { status: pr.ciStatus })] })) : null, pr.commitHash ? (_jsxs("div", { className: "flex items-center justify-between", children: [_jsx("span", { className: "text-muted-foreground text-xs font-medium", children: "Commit" }), _jsxs("div", { className: "flex items-center gap-1.5", children: [_jsx(GitCommitHorizontal, { className: "text-muted-foreground h-3.5 w-3.5" }), _jsx("code", { className: "bg-muted text-foreground rounded-md px-1.5 py-0.5 font-mono text-[11px]", children: pr.commitHash.slice(0, 7) })] })] })) : null] }) }));
328
- }
329
- function FeatureDetails({ data }) {
330
- const hasAnyDetail = data.agentType ?? data.runtime ?? data.blockedBy ?? data.errorMessage;
331
- if (!hasAnyDetail)
332
- return null;
333
- return (_jsxs(_Fragment, { children: [_jsx(Separator, {}), _jsxs("div", { "data-testid": "feature-drawer-details", className: "flex flex-col gap-3 p-4", children: [data.agentType ? _jsx(DetailRow, { label: "Agent", value: data.agentType }) : null, data.runtime ? _jsx(DetailRow, { label: "Runtime", value: data.runtime }) : null, data.blockedBy ? _jsx(DetailRow, { label: "Blocked by", value: data.blockedBy }) : null, data.errorMessage ? _jsx(DetailRow, { label: "Error", value: data.errorMessage }) : null] })] }));
334
- }
335
- function DetailRow({ label, value }) {
336
- return (_jsxs("div", { className: "flex flex-col gap-0.5", children: [_jsx("span", { className: "text-muted-foreground text-xs font-medium", children: label }), _jsx("span", { className: "text-sm", children: value })] }));
337
- }
@@ -1,33 +0,0 @@
1
- import type { Meta, StoryObj } from '@storybook/react';
2
- import { ControlCenterDrawer } from './control-center-drawer.js';
3
- declare const meta: Meta<typeof ControlCenterDrawer>;
4
- export default meta;
5
- type Story = StoryObj<typeof ControlCenterDrawer>;
6
- /** Feature info view — running state with progress. Default story. */
7
- export declare const Default: Story;
8
- /** Feature info view — completed (maintain lifecycle, done state, merged PR). */
9
- export declare const FeatureDone: Story;
10
- /** Feature info view — error state. */
11
- export declare const FeatureError: Story;
12
- /**
13
- * PRD review view — loads questionnaire data via server action.
14
- * Shows spinner in Storybook (no real API available).
15
- */
16
- export declare const PrdReview: Story;
17
- /**
18
- * Tech decisions review view — loads research artifact via server action.
19
- * Shows spinner in Storybook.
20
- */
21
- export declare const TechReview: Story;
22
- /**
23
- * Merge review view — loads merge review data via server action.
24
- * Shows spinner in Storybook.
25
- */
26
- export declare const MergeReview: Story;
27
- /** Feature create form. */
28
- export declare const FeatureCreate: Story;
29
- /** Repository actions view. */
30
- export declare const Repository: Story;
31
- /** Interactive — click any view type to open that drawer panel. */
32
- export declare const AllViews: Story;
33
- //# sourceMappingURL=control-center-drawer.stories.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"control-center-drawer.stories.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/control-center-drawer/control-center-drawer.stories.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAIvD,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAG9D,QAAA,MAAM,IAAI,EAAE,IAAI,CAAC,OAAO,mBAAmB,CAc1C,CAAC;AAEF,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,mBAAmB,CAAC,CAAC;AA+JlD,sEAAsE;AACtE,eAAO,MAAM,OAAO,EAAE,KAErB,CAAC;AAEF,iFAAiF;AACjF,eAAO,MAAM,WAAW,EAAE,KAEzB,CAAC;AAEF,uCAAuC;AACvC,eAAO,MAAM,YAAY,EAAE,KAE1B,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,SAAS,EAAE,KAEvB,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,UAAU,EAAE,KAExB,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,WAAW,EAAE,KAEzB,CAAC;AAEF,2BAA2B;AAC3B,eAAO,MAAM,aAAa,EAAE,KAE3B,CAAC;AAEF,+BAA+B;AAC/B,eAAO,MAAM,UAAU,EAAE,KAExB,CAAC;AA0DF,mEAAmE;AACnE,eAAO,MAAM,QAAQ,EAAE,KAEtB,CAAC"}
@@ -1,214 +0,0 @@
1
- import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
- import { useState } from 'react';
3
- import { PrStatus, CiStatus } from '../../../../../../packages/core/src/domain/generated/output.js';
4
- import { Button } from '../../ui/button.js';
5
- import { DrawerCloseGuardProvider } from '../../../hooks/drawer-close-guard.js';
6
- import { ControlCenterDrawer } from './control-center-drawer.js';
7
- const meta = {
8
- title: 'Drawers/ControlCenterDrawer',
9
- component: ControlCenterDrawer,
10
- tags: ['autodocs'],
11
- decorators: [
12
- (Story) => (_jsx(DrawerCloseGuardProvider, { children: _jsx(Story, {}) })),
13
- ],
14
- parameters: {
15
- layout: 'fullscreen',
16
- },
17
- };
18
- export default meta;
19
- /* ---------------------------------------------------------------------------
20
- * Fixtures
21
- * ------------------------------------------------------------------------- */
22
- const featureView = {
23
- type: 'feature',
24
- node: {
25
- name: 'Auth Module',
26
- description: 'Implement OAuth2 authentication flow',
27
- featureId: '#f1',
28
- lifecycle: 'implementation',
29
- state: 'running',
30
- progress: 45,
31
- agentType: 'claude-code',
32
- repositoryPath: '/home/user/my-repo',
33
- branch: 'feat/auth-module',
34
- specPath: '/home/user/my-repo/specs/001-auth-module',
35
- },
36
- };
37
- const featureDoneView = {
38
- type: 'feature',
39
- node: {
40
- name: 'Payment Gateway',
41
- description: 'Stripe integration for subscriptions',
42
- featureId: '#f3',
43
- lifecycle: 'maintain',
44
- state: 'done',
45
- progress: 100,
46
- runtime: '1h 42m',
47
- repositoryPath: '/home/user/my-repo',
48
- branch: 'feat/payment-gateway',
49
- pr: {
50
- url: 'https://github.com/org/repo/pull/42',
51
- number: 42,
52
- status: PrStatus.Merged,
53
- ciStatus: CiStatus.Success,
54
- commitHash: 'abc1234567890',
55
- },
56
- },
57
- };
58
- const featureErrorView = {
59
- type: 'feature',
60
- node: {
61
- name: 'Email Service',
62
- description: 'Transactional email with SendGrid',
63
- featureId: '#f5',
64
- lifecycle: 'review',
65
- state: 'error',
66
- progress: 30,
67
- errorMessage: 'Build failed: type mismatch in auth middleware',
68
- repositoryPath: '/home/user/my-repo',
69
- branch: 'feat/email-service',
70
- },
71
- };
72
- const prdReviewView = {
73
- type: 'prd-review',
74
- node: {
75
- name: 'API Rate Limiting',
76
- description: 'Sliding window rate limiting for public endpoints',
77
- featureId: 'feat-abc123',
78
- lifecycle: 'requirements',
79
- state: 'action-required',
80
- progress: 0,
81
- repositoryPath: '/home/user/my-repo',
82
- branch: 'feat/api-rate-limiting',
83
- specPath: '/home/user/my-repo/specs/002-rate-limiting',
84
- },
85
- };
86
- const techReviewView = {
87
- type: 'tech-review',
88
- node: {
89
- name: 'Search Index',
90
- description: 'Elasticsearch full-text search integration',
91
- featureId: 'feat-def456',
92
- lifecycle: 'implementation',
93
- state: 'action-required',
94
- progress: 0,
95
- repositoryPath: '/home/user/my-repo',
96
- branch: 'feat/search-index',
97
- specPath: '/home/user/my-repo/specs/003-search',
98
- },
99
- };
100
- const mergeReviewView = {
101
- type: 'merge-review',
102
- node: {
103
- name: 'Auth Module',
104
- description: 'OAuth2 authentication flow',
105
- featureId: 'feat-ghi789',
106
- lifecycle: 'review',
107
- state: 'action-required',
108
- progress: 100,
109
- repositoryPath: '/home/user/my-repo',
110
- branch: 'feat/auth-module',
111
- specPath: '/home/user/my-repo/specs/001-auth-module',
112
- pr: {
113
- url: 'https://github.com/org/repo/pull/17',
114
- number: 17,
115
- status: PrStatus.Open,
116
- ciStatus: CiStatus.Success,
117
- },
118
- },
119
- };
120
- const createView = {
121
- type: 'feature-create',
122
- repositoryPath: '/home/user/my-repo',
123
- features: [
124
- { id: 'feat-abc123', name: 'API Rate Limiting' },
125
- { id: 'feat-def456', name: 'Search Index' },
126
- ],
127
- workflowDefaults: {
128
- approvalGates: { allowPrd: true, allowPlan: false, allowMerge: false },
129
- push: true,
130
- openPr: false,
131
- },
132
- };
133
- const repositoryView = {
134
- type: 'repository',
135
- data: {
136
- id: 'repo-1',
137
- name: 'my-awesome-app',
138
- repositoryPath: '/home/user/my-awesome-app',
139
- },
140
- };
141
- /* ---------------------------------------------------------------------------
142
- * Trigger wrapper
143
- * ------------------------------------------------------------------------- */
144
- function Trigger({ view, label }) {
145
- const [activeView, setActiveView] = useState(null);
146
- return (_jsxs("div", { className: "flex h-screen items-start p-4", children: [_jsx(Button, { variant: "outline", onClick: () => setActiveView(view), children: label }), _jsx(ControlCenterDrawer, { view: activeView, onClose: () => setActiveView(null), onDelete: (_id) => undefined, onCreateSubmit: () => setActiveView(null) })] }));
147
- }
148
- /* ---------------------------------------------------------------------------
149
- * Stories — one per view type
150
- * ------------------------------------------------------------------------- */
151
- /** Feature info view — running state with progress. Default story. */
152
- export const Default = {
153
- render: () => _jsx(Trigger, { view: featureView, label: "Open Feature (Running)" }),
154
- };
155
- /** Feature info view — completed (maintain lifecycle, done state, merged PR). */
156
- export const FeatureDone = {
157
- render: () => _jsx(Trigger, { view: featureDoneView, label: "Open Feature (Done + PR)" }),
158
- };
159
- /** Feature info view — error state. */
160
- export const FeatureError = {
161
- render: () => _jsx(Trigger, { view: featureErrorView, label: "Open Feature (Error)" }),
162
- };
163
- /**
164
- * PRD review view — loads questionnaire data via server action.
165
- * Shows spinner in Storybook (no real API available).
166
- */
167
- export const PrdReview = {
168
- render: () => _jsx(Trigger, { view: prdReviewView, label: "Open PRD Review" }),
169
- };
170
- /**
171
- * Tech decisions review view — loads research artifact via server action.
172
- * Shows spinner in Storybook.
173
- */
174
- export const TechReview = {
175
- render: () => _jsx(Trigger, { view: techReviewView, label: "Open Tech Review" }),
176
- };
177
- /**
178
- * Merge review view — loads merge review data via server action.
179
- * Shows spinner in Storybook.
180
- */
181
- export const MergeReview = {
182
- render: () => _jsx(Trigger, { view: mergeReviewView, label: "Open Merge Review" }),
183
- };
184
- /** Feature create form. */
185
- export const FeatureCreate = {
186
- render: () => _jsx(Trigger, { view: createView, label: "Open Create Feature" }),
187
- };
188
- /** Repository actions view. */
189
- export const Repository = {
190
- render: () => _jsx(Trigger, { view: repositoryView, label: "Open Repository" }),
191
- };
192
- /* ---------------------------------------------------------------------------
193
- * Interactive switcher — cycle through all views
194
- * ------------------------------------------------------------------------- */
195
- const allViews = [
196
- { label: 'Feature (Running)', view: featureView },
197
- { label: 'Feature (Done)', view: featureDoneView },
198
- { label: 'Feature (Error)', view: featureErrorView },
199
- { label: 'PRD Review', view: prdReviewView },
200
- { label: 'Tech Review', view: techReviewView },
201
- { label: 'Merge Review', view: mergeReviewView },
202
- { label: 'Create Feature', view: createView },
203
- { label: 'Repository', view: repositoryView },
204
- ];
205
- function AllViewsSwitcher() {
206
- const [activeView, setActiveView] = useState(null);
207
- return (_jsxs("div", { className: "flex h-screen", children: [_jsxs("div", { className: "flex flex-col gap-2 p-4", children: [_jsx("span", { className: "text-muted-foreground mb-2 text-xs font-semibold tracking-wider uppercase", children: "Select view" }), allViews.map(({ label, view }) => (_jsx("button", { type: "button", onClick: () => setActiveView(view), className: `rounded-md px-3 py-1.5 text-left text-sm ${activeView?.type === view.type
208
- ? 'bg-primary text-primary-foreground'
209
- : 'bg-muted hover:bg-muted/80'}`, children: label }, label))), _jsx("button", { type: "button", onClick: () => setActiveView(null), className: "bg-destructive/10 text-destructive hover:bg-destructive/20 mt-2 rounded-md px-3 py-1.5 text-left text-sm", children: "Close drawer" })] }), _jsx(ControlCenterDrawer, { view: activeView, onClose: () => setActiveView(null), onDelete: (_id) => undefined, onCreateSubmit: () => setActiveView(null) })] }));
210
- }
211
- /** Interactive — click any view type to open that drawer panel. */
212
- export const AllViews = {
213
- render: () => _jsx(AllViewsSwitcher, {}),
214
- };