@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
@@ -27,6 +27,17 @@ export type DrawerView =
27
27
  /** Repository node actions */
28
28
  | { type: 'repository'; data: RepositoryNodeData };
29
29
 
30
+ /** Derives the feature-specific view type from node lifecycle + state. */
31
+ export function deriveFeatureViewType(
32
+ node: FeatureNodeData
33
+ ): 'feature' | 'prd-review' | 'tech-review' | 'merge-review' {
34
+ if (node.lifecycle === 'requirements' && node.state === 'action-required') return 'prd-review';
35
+ if (node.lifecycle === 'implementation' && node.state === 'action-required') return 'tech-review';
36
+ if (node.lifecycle === 'review' && (node.state === 'action-required' || node.state === 'error'))
37
+ return 'merge-review';
38
+ return 'feature';
39
+ }
40
+
30
41
  /**
31
42
  * Derives the active DrawerView from control-center state.
32
43
  * Priority: feature-create > selected-node (prd/tech/merge/feature) > repository
@@ -59,19 +70,7 @@ export function computeDrawerView({
59
70
  }
60
71
 
61
72
  if (selectedNode) {
62
- if (selectedNode.lifecycle === 'requirements' && selectedNode.state === 'action-required') {
63
- return { type: 'prd-review', node: selectedNode };
64
- }
65
- if (selectedNode.lifecycle === 'implementation' && selectedNode.state === 'action-required') {
66
- return { type: 'tech-review', node: selectedNode };
67
- }
68
- if (
69
- selectedNode.lifecycle === 'review' &&
70
- (selectedNode.state === 'action-required' || selectedNode.state === 'error')
71
- ) {
72
- return { type: 'merge-review', node: selectedNode };
73
- }
74
- return { type: 'feature', node: selectedNode };
73
+ return { type: deriveFeatureViewType(selectedNode), node: selectedNode };
75
74
  }
76
75
 
77
76
  if (selectedRepoNode) {
@@ -8,7 +8,7 @@ import type {
8
8
  PrdApprovalPayload,
9
9
  QuestionSelectionChange,
10
10
  } from '@shepai/core/domain/generated/output';
11
- import { PrStatus, NotificationEventType } from '@shepai/core/domain/generated/output';
11
+ import { PrStatus } from '@shepai/core/domain/generated/output';
12
12
  import { approveFeature } from '@/app/actions/approve-feature';
13
13
  import { rejectFeature } from '@/app/actions/reject-feature';
14
14
  import { getFeatureArtifact } from '@/app/actions/get-feature-artifact';
@@ -53,10 +53,8 @@ import { useFeatureActions } from '@/components/common/feature-drawer/use-featur
53
53
  import type { PrdQuestionnaireData } from '@/components/common/prd-questionnaire';
54
54
  import type { TechDecisionsReviewData } from '@/components/common/tech-decisions-review';
55
55
  import type { MergeReviewData } from '@/components/common/merge-review';
56
- import {
57
- mapEventTypeToState,
58
- mapPhaseNameToLifecycle,
59
- } from '@/components/common/feature-node/derive-feature-state';
56
+ import { resolveSseEventUpdates } from '@/components/common/feature-node/derive-feature-state';
57
+ import { deriveFeatureViewType } from './drawer-view';
60
58
  import type { DrawerView } from './drawer-view';
61
59
 
62
60
  export interface FeatureDrawerClientProps {
@@ -94,34 +92,15 @@ export function FeatureDrawerClient({ view: initialView }: FeatureDrawerClientPr
94
92
  const newEvents = events.slice(processedCountRef.current);
95
93
  processedCountRef.current = events.length;
96
94
 
97
- // When WaitingApproval and PhaseCompleted arrive in the same poll batch,
98
- // PhaseCompleted must be fully suppressed (both state AND lifecycle). Without this,
99
- // a phase-timing PhaseCompleted (e.g. phaseName='research') can regress the lifecycle
100
- // that WaitingApproval already set correctly (e.g. to 'implementation' for plan gate).
101
- const waitingApprovalInBatch = newEvents.some(
102
- (e) =>
103
- e.featureId === featureNode.featureId &&
104
- e.eventType === NotificationEventType.WaitingApproval
105
- );
106
-
107
- for (const event of newEvents) {
108
- if (event.featureId !== featureNode.featureId) continue;
109
-
110
- const isSuppressedPhaseCompleted =
111
- event.eventType === NotificationEventType.PhaseCompleted && waitingApprovalInBatch;
112
- const newState = isSuppressedPhaseCompleted
113
- ? undefined
114
- : mapEventTypeToState(event.eventType);
115
- const newLifecycle = isSuppressedPhaseCompleted
116
- ? undefined
117
- : mapPhaseNameToLifecycle(event.phaseName);
95
+ for (const update of resolveSseEventUpdates(newEvents)) {
96
+ if (update.featureId !== featureNode.featureId) continue;
118
97
 
119
98
  // Trigger a server refresh to get the latest drawer view,
120
99
  // but skip when the user has unsaved changes or a rejection is in-flight
121
100
  // to avoid the refresh interfering with the reject handler's navigation.
122
101
  if (!isDirtyRef.current && !isRejectingRef.current) router.refresh();
123
102
 
124
- if (newState !== undefined || newLifecycle !== undefined) {
103
+ if (update.state !== undefined || update.lifecycle !== undefined) {
125
104
  // Optimistically update the node data AND re-derive the view type so the
126
105
  // drawer switches immediately (e.g. prd-review → feature when agent resumes)
127
106
  // without waiting for the router.refresh() round-trip.
@@ -135,10 +114,10 @@ export function FeatureDrawerClient({ view: initialView }: FeatureDrawerClientPr
135
114
  return prev;
136
115
  const updatedNode = {
137
116
  ...prev.node,
138
- ...(newState !== undefined && { state: newState }),
139
- ...(newLifecycle !== undefined && { lifecycle: newLifecycle }),
117
+ ...(update.state !== undefined && { state: update.state }),
118
+ ...(update.lifecycle !== undefined && { lifecycle: update.lifecycle }),
140
119
  };
141
- return { ...prev, type: deriveViewType(updatedNode), node: updatedNode };
120
+ return { ...prev, type: deriveFeatureViewType(updatedNode), node: updatedNode };
142
121
  });
143
122
  }
144
123
  }
@@ -387,6 +366,12 @@ export function FeatureDrawerClient({ view: initialView }: FeatureDrawerClientPr
387
366
  }
388
367
  setChatInput('');
389
368
  toast.success(`${label} approved — agent resuming`);
369
+ // Optimistically update canvas node before SSE arrives (~500ms delay)
370
+ window.dispatchEvent(
371
+ new CustomEvent('shep:feature-approved', {
372
+ detail: { featureId: reviewNode.featureId },
373
+ })
374
+ );
390
375
  onClose();
391
376
  },
392
377
  [reviewNode, onClose]
@@ -414,6 +399,12 @@ export function FeatureDrawerClient({ view: initialView }: FeatureDrawerClientPr
414
399
  }
415
400
  setChatInput('');
416
401
  toast.success('Requirements approved — agent resuming');
402
+ // Optimistically update canvas node before SSE arrives (~500ms delay)
403
+ window.dispatchEvent(
404
+ new CustomEvent('shep:feature-approved', {
405
+ detail: { featureId: view.node.featureId },
406
+ })
407
+ );
417
408
  setPrdSelections({});
418
409
  onClose();
419
410
  },
@@ -784,14 +775,3 @@ function DetailRow({ label, value }: { label: string; value: string }) {
784
775
  </div>
785
776
  );
786
777
  }
787
-
788
- /** Mirrors computeDrawerView logic — derives view type from live node data. */
789
- function deriveViewType(
790
- node: FeatureNodeData
791
- ): 'feature' | 'prd-review' | 'tech-review' | 'merge-review' {
792
- if (node.lifecycle === 'requirements' && node.state === 'action-required') return 'prd-review';
793
- if (node.lifecycle === 'implementation' && node.state === 'action-required') return 'tech-review';
794
- if (node.lifecycle === 'review' && (node.state === 'action-required' || node.state === 'error'))
795
- return 'merge-review';
796
- return 'feature';
797
- }
@@ -1,2 +1 @@
1
- export { ControlCenterDrawer, type ControlCenterDrawerProps } from './control-center-drawer';
2
1
  export { computeDrawerView, type DrawerView } from './drawer-view';
@@ -41,7 +41,7 @@ export function deriveNodeState(feature: Feature, agentRun?: AgentRun | null): F
41
41
  case AgentRunStatus.cancelled:
42
42
  return 'blocked';
43
43
  case AgentRunStatus.completed:
44
- return feature.lifecycle === SdlcLifecycle.Maintain ? 'done' : 'done';
44
+ return 'done';
45
45
  case AgentRunStatus.running:
46
46
  case AgentRunStatus.pending:
47
47
  return 'running';
@@ -112,7 +112,17 @@ export function mapEventTypeToState(eventType: NotificationEventType): FeatureNo
112
112
  }
113
113
  }
114
114
 
115
- /** Maps an SSE event phaseName to a FeatureLifecyclePhase. Mirrors page.tsx nodeToLifecyclePhase. */
115
+ /** Map domain SdlcLifecycle enum values to UI FeatureLifecyclePhase. */
116
+ export const sdlcLifecycleMap: Record<string, FeatureLifecyclePhase> = {
117
+ Requirements: 'requirements',
118
+ Research: 'research',
119
+ Implementation: 'implementation',
120
+ Review: 'review',
121
+ 'Deploy & QA': 'deploy',
122
+ Maintain: 'maintain',
123
+ };
124
+
125
+ /** Map agent graph node names (from agent_run.result or SSE phaseName) to UI lifecycle phases. */
116
126
  const phaseNameToLifecycle: Record<string, FeatureLifecyclePhase> = {
117
127
  analyze: 'requirements',
118
128
  requirements: 'requirements',
@@ -124,6 +134,57 @@ const phaseNameToLifecycle: Record<string, FeatureLifecyclePhase> = {
124
134
  blocked: 'requirements',
125
135
  };
126
136
 
137
+ /**
138
+ * Derives the UI lifecycle phase from a Feature + AgentRun.
139
+ * Shared by build-feature-node-data.ts and build-graph-nodes.ts.
140
+ */
141
+ export function deriveLifecycle(feature: Feature, run: AgentRun | null): FeatureLifecyclePhase {
142
+ if (run?.status === 'completed') return 'maintain';
143
+ const agentNode = run?.result?.startsWith('node:') ? run.result.slice(5) : undefined;
144
+ return (
145
+ (agentNode ? phaseNameToLifecycle[agentNode] : undefined) ??
146
+ sdlcLifecycleMap[feature.lifecycle] ??
147
+ 'requirements'
148
+ );
149
+ }
150
+
151
+ export interface SseEventUpdate {
152
+ featureId: string;
153
+ state: FeatureNodeState | undefined;
154
+ lifecycle: FeatureLifecyclePhase | undefined;
155
+ eventType: NotificationEventType;
156
+ phaseName?: string;
157
+ }
158
+
159
+ /**
160
+ * Resolves state/lifecycle updates from a batch of SSE events, applying
161
+ * the WaitingApproval batch-suppression rule: when WaitingApproval and
162
+ * PhaseCompleted arrive in the same batch for a feature, PhaseCompleted
163
+ * is fully suppressed to prevent lifecycle regression.
164
+ */
165
+ export function resolveSseEventUpdates(
166
+ events: readonly { featureId: string; eventType: NotificationEventType; phaseName?: string }[]
167
+ ): SseEventUpdate[] {
168
+ const waitingApprovalFeatures = new Set(
169
+ events
170
+ .filter((e) => e.eventType === NotificationEventType.WaitingApproval)
171
+ .map((e) => e.featureId)
172
+ );
173
+
174
+ return events.map((event) => {
175
+ const isSuppressed =
176
+ event.eventType === NotificationEventType.PhaseCompleted &&
177
+ waitingApprovalFeatures.has(event.featureId);
178
+ return {
179
+ featureId: event.featureId,
180
+ state: isSuppressed ? undefined : mapEventTypeToState(event.eventType),
181
+ lifecycle: isSuppressed ? undefined : mapPhaseNameToLifecycle(event.phaseName),
182
+ eventType: event.eventType,
183
+ phaseName: event.phaseName,
184
+ };
185
+ });
186
+ }
187
+
127
188
  export function mapPhaseNameToLifecycle(
128
189
  phaseName: string | undefined
129
190
  ): FeatureLifecyclePhase | undefined {
@@ -1,9 +1,4 @@
1
- export {
2
- ControlCenterDrawer,
3
- type ControlCenterDrawerProps,
4
- computeDrawerView,
5
- type DrawerView,
6
- } from './control-center-drawer';
1
+ export { computeDrawerView, type DrawerView } from './control-center-drawer';
7
2
  export { AddRepositoryButton } from './add-repository-button';
8
3
  export { ElapsedTime, formatElapsed } from './elapsed-time';
9
4
  export { EmptyState, type EmptyStateProps } from './empty-state';
@@ -1,6 +1,6 @@
1
1
  'use client';
2
2
 
3
- import { useCallback, useEffect, useRef } from 'react';
3
+ import { useCallback, useEffect, useMemo, useRef } from 'react';
4
4
  import { useRouter } from 'next/navigation';
5
5
  import { toast } from 'sonner';
6
6
  import type { Connection, Edge, NodeChange } from '@xyflow/react';
@@ -20,9 +20,8 @@ import { useAgentEventsContext } from '@/hooks/agent-events-provider';
20
20
  import { useSoundAction } from '@/hooks/use-sound-action';
21
21
  import {
22
22
  mapEventTypeToState,
23
- mapPhaseNameToLifecycle,
23
+ resolveSseEventUpdates,
24
24
  } from '@/components/common/feature-node/derive-feature-state';
25
- import { NotificationEventType } from '@shepai/core/domain/generated/output';
26
25
  import { useGraphState, type GraphCallbacks } from '@/hooks/use-graph-state';
27
26
  import type { FeatureEntry } from '@/lib/derive-graph';
28
27
 
@@ -79,18 +78,26 @@ export function useControlCenterState(
79
78
 
80
79
  // Sync server props into domain Maps when initialNodes/initialEdges change.
81
80
  // Keyed by a stable string so we don't re-reconcile on every render.
82
- const initialNodeKey = initialNodes
83
- .map((n) => n.id)
84
- .sort()
85
- .join(',');
86
- const initialDataKey = initialNodes
87
- .filter((n) => n.type === 'featureNode')
88
- .map((n) => {
89
- const d = n.data as FeatureNodeData;
90
- return `${n.id}:${d.state}:${d.lifecycle}`;
91
- })
92
- .sort()
93
- .join(',');
81
+ const initialNodeKey = useMemo(
82
+ () =>
83
+ initialNodes
84
+ .map((n) => n.id)
85
+ .sort()
86
+ .join(','),
87
+ [initialNodes]
88
+ );
89
+ const initialDataKey = useMemo(
90
+ () =>
91
+ initialNodes
92
+ .filter((n) => n.type === 'featureNode')
93
+ .map((n) => {
94
+ const d = n.data as FeatureNodeData;
95
+ return `${n.id}:${d.state}:${d.lifecycle}`;
96
+ })
97
+ .sort()
98
+ .join(','),
99
+ [initialNodes]
100
+ );
94
101
 
95
102
  const prevReconcileKey = useRef('');
96
103
 
@@ -145,39 +152,26 @@ export function useControlCenterState(
145
152
  const newEvents = events.slice(processedEventCountRef.current);
146
153
  processedEventCountRef.current = events.length;
147
154
 
148
- // When WaitingApproval and PhaseCompleted arrive in the same poll batch for a feature,
149
- // PhaseCompleted must be fully suppressed (both state AND lifecycle). Without this,
150
- // a phase-timing PhaseCompleted (e.g. phaseName='research') can regress the lifecycle
151
- // that WaitingApproval already set correctly (e.g. to 'implementation' for plan gate).
152
- // When PhaseCompleted arrives WITHOUT WaitingApproval (e.g. after approval), we allow
153
- // it to update both state and lifecycle as a fallback for any missed AgentStarted event.
154
- const waitingApprovalFeatures = new Set(
155
- newEvents
156
- .filter((e) => e.eventType === NotificationEventType.WaitingApproval)
157
- .map((e) => e.featureId)
158
- );
159
-
160
- for (const event of newEvents) {
161
- const isSuppressedPhaseCompleted =
162
- event.eventType === NotificationEventType.PhaseCompleted &&
163
- waitingApprovalFeatures.has(event.featureId);
164
- const newState = isSuppressedPhaseCompleted
165
- ? undefined
166
- : mapEventTypeToState(event.eventType);
167
- const newLifecycle = isSuppressedPhaseCompleted
168
- ? undefined
169
- : mapPhaseNameToLifecycle(event.phaseName);
170
-
171
- const nodeId = `feat-${event.featureId}`;
172
- if (newState !== undefined || newLifecycle !== undefined) {
173
- updateFeature(nodeId, {
174
- ...(newState !== undefined && { state: newState }),
175
- ...(newLifecycle !== undefined && { lifecycle: newLifecycle }),
155
+ for (const { featureId, state, lifecycle } of resolveSseEventUpdates(newEvents)) {
156
+ if (state !== undefined || lifecycle !== undefined) {
157
+ updateFeature(`feat-${featureId}`, {
158
+ ...(state !== undefined && { state }),
159
+ ...(lifecycle !== undefined && { lifecycle }),
176
160
  });
177
161
  }
178
162
  }
179
163
  }, [events, updateFeature]);
180
164
 
165
+ // Listen for optimistic approval events from the drawer (fires before SSE arrives)
166
+ useEffect(() => {
167
+ const handler = (e: Event) => {
168
+ const { featureId } = (e as CustomEvent<{ featureId: string }>).detail;
169
+ updateFeature(`feat-${featureId}`, { state: 'running' });
170
+ };
171
+ window.addEventListener('shep:feature-approved', handler);
172
+ return () => window.removeEventListener('shep:feature-approved', handler);
173
+ }, [updateFeature]);
174
+
181
175
  // Separate effect: fetch metadata (name + description) when SSE reports it changed
182
176
  const metadataFetchedRef = useRef<Set<string>>(new Set());
183
177
  const processedMetadataCountRef = useRef(0);
@@ -1,6 +1,6 @@
1
1
  'use client';
2
2
 
3
- import { useMemo, useCallback } from 'react';
3
+ import { useMemo } from 'react';
4
4
  import { ReactFlow, Background, Controls } from '@xyflow/react';
5
5
  import type { Connection, Edge, NodeChange } from '@xyflow/react';
6
6
  import { Plus } from 'lucide-react';
@@ -56,22 +56,6 @@ export function FeaturesCanvas({
56
56
  []
57
57
  );
58
58
 
59
- // Prevent a feature from having more than one source repository
60
- const isValidConnection = useCallback(
61
- (connection: Edge | Connection) => {
62
- const sourceNode = nodes.find((n) => n.id === connection.source);
63
- if (sourceNode?.type !== 'repositoryNode') return true;
64
-
65
- const targetAlreadyHasRepo = edges.some((e) => {
66
- const edgeSourceNode = nodes.find((n) => n.id === e.source);
67
- return edgeSourceNode?.type === 'repositoryNode' && e.target === connection.target;
68
- });
69
-
70
- return !targetAlreadyHasRepo;
71
- },
72
- [nodes, edges]
73
- );
74
-
75
59
  // Callbacks and showHandles are already injected into node.data by deriveGraph.
76
60
  // Only selectedFeatureId highlighting needs to be applied here.
77
61
  const enrichedNodes = useMemo(
@@ -122,7 +106,6 @@ export function FeaturesCanvas({
122
106
  edges={edges}
123
107
  nodeTypes={nodeTypes}
124
108
  edgeTypes={edgeTypes}
125
- isValidConnection={isValidConnection}
126
109
  onConnect={onConnect}
127
110
  onNodesChange={onNodesChange}
128
111
  onNodeClick={onNodeClick}
@@ -103,9 +103,13 @@ export function useAgentEvents(options?: UseAgentEventsOptions): UseAgentEventsR
103
103
  if (sw.state === 'activated') {
104
104
  subscribeToWorker(sw);
105
105
  } else {
106
- sw.addEventListener('statechange', () => {
107
- if (sw.state === 'activated') subscribeToWorker(sw);
108
- });
106
+ const onStateChange = () => {
107
+ if (sw.state === 'activated') {
108
+ sw.removeEventListener('statechange', onStateChange);
109
+ subscribeToWorker(sw);
110
+ }
111
+ };
112
+ sw.addEventListener('statechange', onStateChange);
109
113
  }
110
114
  })
111
115
  .catch(() => {