@shepai/cli 1.72.8 → 1.72.9-pr219.08421ee

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 (283) hide show
  1. package/dist/packages/core/src/application/ports/output/agents/feature-agent-process.interface.d.ts +2 -1
  2. package/dist/packages/core/src/application/ports/output/agents/feature-agent-process.interface.d.ts.map +1 -1
  3. package/dist/packages/core/src/application/use-cases/agents/approve-agent-run.use-case.d.ts.map +1 -1
  4. package/dist/packages/core/src/application/use-cases/agents/approve-agent-run.use-case.js +1 -0
  5. package/dist/packages/core/src/application/use-cases/features/resume-feature.use-case.d.ts.map +1 -1
  6. package/dist/packages/core/src/application/use-cases/features/resume-feature.use-case.js +1 -0
  7. package/dist/packages/core/src/domain/factories/settings-defaults.factory.js +1 -1
  8. package/dist/packages/core/src/infrastructure/services/agents/common/executors/dev-executor.service.d.ts.map +1 -1
  9. package/dist/packages/core/src/infrastructure/services/agents/common/executors/dev-executor.service.js +88 -13
  10. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/feature-agent-graph.d.ts +1 -1
  11. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/feature-agent-process.service.d.ts +2 -1
  12. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/feature-agent-process.service.d.ts.map +1 -1
  13. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/feature-agent-process.service.js +3 -0
  14. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/feature-agent-worker.d.ts +2 -0
  15. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/feature-agent-worker.d.ts.map +1 -1
  16. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/feature-agent-worker.js +16 -3
  17. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/merge/merge.node.d.ts.map +1 -1
  18. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/merge/merge.node.js +5 -1
  19. package/dist/src/presentation/web/app/actions/get-graph-data.d.ts +10 -0
  20. package/dist/src/presentation/web/app/actions/get-graph-data.d.ts.map +1 -0
  21. package/dist/src/presentation/web/app/actions/get-graph-data.js +10 -0
  22. package/dist/src/presentation/web/app/api/agent-events/route.d.ts.map +1 -1
  23. package/dist/src/presentation/web/app/api/agent-events/route.js +20 -1
  24. package/dist/src/presentation/web/components/common/control-center-drawer/create-drawer-client.d.ts.map +1 -1
  25. package/dist/src/presentation/web/components/common/control-center-drawer/create-drawer-client.js +9 -8
  26. package/dist/src/presentation/web/components/common/feature-node/derive-feature-state.d.ts.map +1 -1
  27. package/dist/src/presentation/web/components/common/feature-node/derive-feature-state.js +2 -0
  28. package/dist/src/presentation/web/components/common/repository-node/repository-node.js +1 -1
  29. package/dist/src/presentation/web/components/common/sidebar-section-header/sidebar-section-header.d.ts +1 -3
  30. package/dist/src/presentation/web/components/common/sidebar-section-header/sidebar-section-header.d.ts.map +1 -1
  31. package/dist/src/presentation/web/components/common/sidebar-section-header/sidebar-section-header.js +3 -7
  32. package/dist/src/presentation/web/components/common/sidebar-section-header/sidebar-section-header.stories.d.ts +0 -1
  33. package/dist/src/presentation/web/components/common/sidebar-section-header/sidebar-section-header.stories.d.ts.map +1 -1
  34. package/dist/src/presentation/web/components/common/sidebar-section-header/sidebar-section-header.stories.js +0 -11
  35. package/dist/src/presentation/web/components/features/control-center/use-control-center-state.d.ts.map +1 -1
  36. package/dist/src/presentation/web/components/features/control-center/use-control-center-state.js +140 -2
  37. package/dist/src/presentation/web/components/features/features-canvas/features-canvas.d.ts.map +1 -1
  38. package/dist/src/presentation/web/components/features/features-canvas/features-canvas.js +2 -2
  39. package/dist/src/presentation/web/components/layouts/app-sidebar/app-sidebar.d.ts +1 -3
  40. package/dist/src/presentation/web/components/layouts/app-sidebar/app-sidebar.d.ts.map +1 -1
  41. package/dist/src/presentation/web/components/layouts/app-sidebar/app-sidebar.js +2 -2
  42. package/dist/src/presentation/web/components/ui/scroll-area.js +1 -1
  43. package/dist/src/presentation/web/lib/layout-with-dagre.js +1 -1
  44. package/dist/tsconfig.build.tsbuildinfo +1 -1
  45. package/package.json +1 -1
  46. package/web/.next/BUILD_ID +1 -1
  47. package/web/.next/build-manifest.json +2 -2
  48. package/web/.next/cache/.previewinfo +1 -1
  49. package/web/.next/cache/.rscinfo +1 -1
  50. package/web/.next/cache/.tsbuildinfo +1 -1
  51. package/web/.next/cache/config.json +3 -3
  52. package/web/.next/fallback-build-manifest.json +2 -2
  53. package/web/.next/prerender-manifest.json +3 -3
  54. package/web/.next/required-server-files.js +1 -1
  55. package/web/.next/required-server-files.json +1 -1
  56. package/web/.next/server/app/(dashboard)/@drawer/create/page/server-reference-manifest.json +43 -28
  57. package/web/.next/server/app/(dashboard)/@drawer/create/page.js +3 -3
  58. package/web/.next/server/app/(dashboard)/@drawer/create/page.js.nft.json +1 -1
  59. package/web/.next/server/app/(dashboard)/@drawer/create/page_client-reference-manifest.js +1 -1
  60. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page/server-reference-manifest.json +49 -34
  61. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js +3 -3
  62. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js.nft.json +1 -1
  63. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page_client-reference-manifest.js +1 -1
  64. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page/server-reference-manifest.json +39 -24
  65. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js +3 -3
  66. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js.nft.json +1 -1
  67. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  68. package/web/.next/server/app/(dashboard)/create/page/server-reference-manifest.json +43 -28
  69. package/web/.next/server/app/(dashboard)/create/page.js +3 -3
  70. package/web/.next/server/app/(dashboard)/create/page.js.nft.json +1 -1
  71. package/web/.next/server/app/(dashboard)/create/page_client-reference-manifest.js +1 -1
  72. package/web/.next/server/app/(dashboard)/feature/[featureId]/page/server-reference-manifest.json +49 -34
  73. package/web/.next/server/app/(dashboard)/feature/[featureId]/page.js +3 -3
  74. package/web/.next/server/app/(dashboard)/feature/[featureId]/page.js.nft.json +1 -1
  75. package/web/.next/server/app/(dashboard)/feature/[featureId]/page_client-reference-manifest.js +1 -1
  76. package/web/.next/server/app/(dashboard)/page/server-reference-manifest.json +39 -24
  77. package/web/.next/server/app/(dashboard)/page.js +3 -3
  78. package/web/.next/server/app/(dashboard)/page.js.nft.json +1 -1
  79. package/web/.next/server/app/(dashboard)/page_client-reference-manifest.js +1 -1
  80. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page/server-reference-manifest.json +39 -24
  81. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js +3 -3
  82. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js.nft.json +1 -1
  83. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  84. package/web/.next/server/app/_global-error.html +2 -2
  85. package/web/.next/server/app/_global-error.rsc +1 -1
  86. package/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  87. package/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  88. package/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  89. package/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  90. package/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  91. package/web/.next/server/app/_not-found/page/server-reference-manifest.json +1 -1
  92. package/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  93. package/web/.next/server/app/skills/page/server-reference-manifest.json +6 -6
  94. package/web/.next/server/app/skills/page.js.nft.json +1 -1
  95. package/web/.next/server/app/skills/page_client-reference-manifest.js +1 -1
  96. package/web/.next/server/app/tools/page/server-reference-manifest.json +6 -6
  97. package/web/.next/server/app/tools/page.js.nft.json +1 -1
  98. package/web/.next/server/app/tools/page_client-reference-manifest.js +1 -1
  99. package/web/.next/server/app/version/page/server-reference-manifest.json +1 -1
  100. package/web/.next/server/app/version/page_client-reference-manifest.js +1 -1
  101. package/web/.next/server/chunks/403f9_next_dist_esm_build_templates_app-route_4d623b8e.js +2 -2
  102. package/web/.next/server/chunks/403f9_next_dist_esm_build_templates_app-route_4d623b8e.js.map +1 -1
  103. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js +1 -1
  104. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js.map +1 -1
  105. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_3a02d8a5.js +3 -0
  106. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_3a02d8a5.js.map +1 -0
  107. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_a3044852.js +3 -0
  108. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_a3044852.js.map +1 -0
  109. package/web/.next/server/chunks/ssr/[root-of-the-server]__17a611f0._.js +2 -2
  110. package/web/.next/server/chunks/ssr/[root-of-the-server]__17a611f0._.js.map +1 -1
  111. package/web/.next/server/chunks/ssr/[root-of-the-server]__249c74f6._.js +1 -1
  112. package/web/.next/server/chunks/ssr/[root-of-the-server]__45dbf93d._.js +2 -2
  113. package/web/.next/server/chunks/ssr/[root-of-the-server]__45dbf93d._.js.map +1 -1
  114. package/web/.next/server/chunks/ssr/[root-of-the-server]__6b17a22d._.js +1 -1
  115. package/web/.next/server/chunks/ssr/[root-of-the-server]__6b17a22d._.js.map +1 -1
  116. package/web/.next/server/chunks/ssr/[root-of-the-server]__6cbc1149._.js +2 -2
  117. package/web/.next/server/chunks/ssr/[root-of-the-server]__6cbc1149._.js.map +1 -1
  118. package/web/.next/server/chunks/ssr/[root-of-the-server]__804c006d._.js +1 -1
  119. package/web/.next/server/chunks/ssr/[root-of-the-server]__804c006d._.js.map +1 -1
  120. package/web/.next/server/chunks/ssr/[root-of-the-server]__aad040c0._.js +1 -1
  121. package/web/.next/server/chunks/ssr/[root-of-the-server]__aad040c0._.js.map +1 -1
  122. package/web/.next/server/chunks/ssr/[root-of-the-server]__cbae9863._.js +1 -1
  123. package/web/.next/server/chunks/ssr/[root-of-the-server]__cbae9863._.js.map +1 -1
  124. package/web/.next/server/chunks/ssr/[root-of-the-server]__e5e09f72._.js +1 -1
  125. package/web/.next/server/chunks/ssr/[root-of-the-server]__e5e09f72._.js.map +1 -1
  126. package/web/.next/server/chunks/ssr/_0e9d6bf7._.js +1 -1
  127. package/web/.next/server/chunks/ssr/_0e9d6bf7._.js.map +1 -1
  128. package/web/.next/server/chunks/ssr/{_47ef589d._.js → _4469c284._.js} +2 -2
  129. package/web/.next/server/chunks/ssr/{_47ef589d._.js.map → _4469c284._.js.map} +1 -1
  130. package/web/.next/server/chunks/ssr/_61351ed3._.js +1 -1
  131. package/web/.next/server/chunks/ssr/_61351ed3._.js.map +1 -1
  132. package/web/.next/server/chunks/ssr/_6e08ce21._.js +3 -0
  133. package/web/.next/server/chunks/ssr/_6e08ce21._.js.map +1 -0
  134. package/web/.next/server/chunks/ssr/_8400c8bb._.js +1 -1
  135. package/web/.next/server/chunks/ssr/_8400c8bb._.js.map +1 -1
  136. package/web/.next/server/chunks/ssr/_9f940437._.js +1 -1
  137. package/web/.next/server/chunks/ssr/_9f940437._.js.map +1 -1
  138. package/web/.next/{standalone/src/presentation/web/.next/server/chunks/ssr/src_presentation_web_1a32dbcb._.js → server/chunks/ssr/src_presentation_web_0a49d9ee._.js} +3 -3
  139. package/web/.next/server/chunks/ssr/{src_presentation_web_1a32dbcb._.js.map → src_presentation_web_0a49d9ee._.js.map} +1 -1
  140. package/web/.next/server/chunks/ssr/{src_presentation_web_398553b0._.js → src_presentation_web_5ea689db._.js} +2 -2
  141. package/web/.next/server/chunks/ssr/{src_presentation_web_398553b0._.js.map → src_presentation_web_5ea689db._.js.map} +1 -1
  142. package/web/.next/{standalone/src/presentation/web/.next/server/chunks/ssr/src_presentation_web_398553b0._.js → server/chunks/ssr/src_presentation_web_7188a290._.js} +2 -2
  143. package/web/.next/server/chunks/ssr/{src_presentation_web_5c87e8e4._.js.map → src_presentation_web_7188a290._.js.map} +1 -1
  144. package/web/.next/server/chunks/ssr/{src_presentation_web_1a32dbcb._.js → src_presentation_web_79b0305a._.js} +3 -3
  145. package/web/.next/server/chunks/ssr/{src_presentation_web_c1bc6240._.js.map → src_presentation_web_79b0305a._.js.map} +1 -1
  146. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_cc16bd01.js +3 -0
  147. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_cc16bd01.js.map +1 -0
  148. package/web/.next/server/chunks/ssr/src_presentation_web_app_(dashboard)_get-graph-data_ts_b018483e._.js +3 -0
  149. package/web/.next/server/chunks/ssr/src_presentation_web_app_(dashboard)_get-graph-data_ts_b018483e._.js.map +1 -0
  150. package/web/.next/server/chunks/ssr/src_presentation_web_components_e599bb8c._.js +1 -1
  151. package/web/.next/server/chunks/ssr/src_presentation_web_components_e599bb8c._.js.map +1 -1
  152. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js +1 -1
  153. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js.map +1 -1
  154. package/web/.next/server/pages/500.html +2 -2
  155. package/web/.next/server/server-reference-manifest.js +1 -1
  156. package/web/.next/server/server-reference-manifest.json +175 -118
  157. package/web/.next/standalone/src/presentation/web/.next/BUILD_ID +1 -1
  158. package/web/.next/standalone/src/presentation/web/.next/build-manifest.json +2 -2
  159. package/web/.next/standalone/src/presentation/web/.next/prerender-manifest.json +3 -3
  160. package/web/.next/standalone/src/presentation/web/.next/required-server-files.json +1 -1
  161. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/@drawer/create/page/server-reference-manifest.json +43 -28
  162. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/@drawer/create/page.js +3 -3
  163. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/@drawer/create/page.js.nft.json +1 -1
  164. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/@drawer/create/page_client-reference-manifest.js +1 -1
  165. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page/server-reference-manifest.json +49 -34
  166. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js +3 -3
  167. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js.nft.json +1 -1
  168. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page_client-reference-manifest.js +1 -1
  169. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page/server-reference-manifest.json +39 -24
  170. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js +3 -3
  171. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js.nft.json +1 -1
  172. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  173. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/create/page/server-reference-manifest.json +43 -28
  174. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/create/page.js +3 -3
  175. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/create/page.js.nft.json +1 -1
  176. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/create/page_client-reference-manifest.js +1 -1
  177. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/feature/[featureId]/page/server-reference-manifest.json +49 -34
  178. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/feature/[featureId]/page.js +3 -3
  179. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/feature/[featureId]/page.js.nft.json +1 -1
  180. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/feature/[featureId]/page_client-reference-manifest.js +1 -1
  181. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/page/server-reference-manifest.json +39 -24
  182. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/page.js +3 -3
  183. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/page.js.nft.json +1 -1
  184. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/page_client-reference-manifest.js +1 -1
  185. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/repository/[repositoryId]/page/server-reference-manifest.json +39 -24
  186. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js +3 -3
  187. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js.nft.json +1 -1
  188. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  189. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.html +2 -2
  190. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.rsc +1 -1
  191. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  192. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  193. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  194. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  195. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  196. package/web/.next/standalone/src/presentation/web/.next/server/app/_not-found/page/server-reference-manifest.json +1 -1
  197. package/web/.next/standalone/src/presentation/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  198. package/web/.next/standalone/src/presentation/web/.next/server/app/skills/page/server-reference-manifest.json +6 -6
  199. package/web/.next/standalone/src/presentation/web/.next/server/app/skills/page.js.nft.json +1 -1
  200. package/web/.next/standalone/src/presentation/web/.next/server/app/skills/page_client-reference-manifest.js +1 -1
  201. package/web/.next/standalone/src/presentation/web/.next/server/app/tools/page/server-reference-manifest.json +6 -6
  202. package/web/.next/standalone/src/presentation/web/.next/server/app/tools/page.js.nft.json +1 -1
  203. package/web/.next/standalone/src/presentation/web/.next/server/app/tools/page_client-reference-manifest.js +1 -1
  204. package/web/.next/standalone/src/presentation/web/.next/server/app/version/page/server-reference-manifest.json +1 -1
  205. package/web/.next/standalone/src/presentation/web/.next/server/app/version/page_client-reference-manifest.js +1 -1
  206. package/web/.next/standalone/src/presentation/web/.next/server/chunks/403f9_next_dist_esm_build_templates_app-route_4d623b8e.js +2 -2
  207. 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
  208. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_3a02d8a5.js +3 -0
  209. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_a3044852.js +3 -0
  210. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__17a611f0._.js +2 -2
  211. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__249c74f6._.js +1 -1
  212. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__45dbf93d._.js +2 -2
  213. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__6b17a22d._.js +1 -1
  214. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__6cbc1149._.js +2 -2
  215. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__804c006d._.js +1 -1
  216. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__aad040c0._.js +1 -1
  217. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__cbae9863._.js +1 -1
  218. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__e5e09f72._.js +1 -1
  219. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_0e9d6bf7._.js +1 -1
  220. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/{_47ef589d._.js → _4469c284._.js} +2 -2
  221. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_61351ed3._.js +1 -1
  222. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_6e08ce21._.js +3 -0
  223. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_8400c8bb._.js +1 -1
  224. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_9f940437._.js +1 -1
  225. package/web/.next/{server/chunks/ssr/src_presentation_web_c1bc6240._.js → standalone/src/presentation/web/.next/server/chunks/ssr/src_presentation_web_0a49d9ee._.js} +3 -3
  226. package/web/.next/{server/chunks/ssr/src_presentation_web_5c87e8e4._.js → standalone/src/presentation/web/.next/server/chunks/ssr/src_presentation_web_5ea689db._.js} +2 -2
  227. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/{src_presentation_web_5c87e8e4._.js → src_presentation_web_7188a290._.js} +2 -2
  228. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/{src_presentation_web_c1bc6240._.js → src_presentation_web_79b0305a._.js} +3 -3
  229. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_cc16bd01.js +3 -0
  230. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/src_presentation_web_app_(dashboard)_get-graph-data_ts_b018483e._.js +3 -0
  231. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/src_presentation_web_components_e599bb8c._.js +1 -1
  232. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js +1 -1
  233. package/web/.next/standalone/src/presentation/web/.next/server/pages/500.html +2 -2
  234. package/web/.next/standalone/src/presentation/web/.next/server/server-reference-manifest.js +1 -1
  235. package/web/.next/standalone/src/presentation/web/.next/server/server-reference-manifest.json +175 -118
  236. package/web/.next/standalone/src/presentation/web/CLAUDE.md +147 -0
  237. package/web/.next/standalone/src/presentation/web/app/actions/get-graph-data.ts +12 -0
  238. package/web/.next/standalone/src/presentation/web/app/api/agent-events/route.ts +23 -2
  239. package/web/.next/standalone/src/presentation/web/components/common/control-center-drawer/create-drawer-client.tsx +9 -8
  240. package/web/.next/standalone/src/presentation/web/components/common/feature-node/derive-feature-state.ts +2 -0
  241. package/web/.next/standalone/src/presentation/web/components/common/repository-node/repository-node.tsx +2 -2
  242. package/web/.next/standalone/src/presentation/web/components/common/sidebar-section-header/sidebar-section-header.stories.tsx +0 -13
  243. package/web/.next/standalone/src/presentation/web/components/common/sidebar-section-header/sidebar-section-header.tsx +1 -45
  244. package/web/.next/standalone/src/presentation/web/components/features/control-center/use-control-center-state.ts +164 -2
  245. package/web/.next/standalone/src/presentation/web/components/features/features-canvas/features-canvas.tsx +21 -23
  246. package/web/.next/standalone/src/presentation/web/components/layouts/app-sidebar/app-sidebar.tsx +2 -14
  247. package/web/.next/standalone/src/presentation/web/components/ui/scroll-area.tsx +1 -1
  248. package/web/.next/standalone/src/presentation/web/lib/layout-with-dagre.ts +1 -1
  249. package/web/.next/standalone/src/presentation/web/server.js +1 -1
  250. package/web/.next/static/chunks/{8682dcb376de62de.js → 073b31d7a4974504.js} +1 -1
  251. package/web/.next/static/chunks/{ebf172a84c9596ed.js → 0e588a3a4dd7d1c0.js} +1 -1
  252. package/web/.next/static/chunks/{fcafb841e3860687.js → 1d281f045b623a45.js} +1 -1
  253. package/web/.next/static/chunks/{71cf72022f08a8c9.js → 2433994d844b7d39.js} +1 -1
  254. package/web/.next/static/chunks/3e041a9008bac888.js +1 -0
  255. package/web/.next/static/chunks/{5cd24ca47061a21d.js → 798624a651d68855.js} +1 -1
  256. package/web/.next/static/chunks/{c71589df79020ecb.js → 977b9d2b9ef19f7d.js} +1 -1
  257. package/web/.next/static/chunks/9be617fc61b893f2.js +1 -0
  258. package/web/.next/static/chunks/{fabfa54940973cc7.js → a18b0561724d11d4.js} +1 -1
  259. package/web/.next/static/chunks/acce8a15d6896dea.css +2 -0
  260. package/web/.next/static/chunks/{1c07b21eb8b32f25.js → cd9099d3eae9dd04.js} +1 -1
  261. package/web/.next/trace +1 -1
  262. package/web/.next/trace-build +1 -1
  263. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_2b7834f6.js +0 -3
  264. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_2b7834f6.js.map +0 -1
  265. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_6923c575.js +0 -3
  266. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_6923c575.js.map +0 -1
  267. package/web/.next/server/chunks/ssr/_250a63ae._.js +0 -3
  268. package/web/.next/server/chunks/ssr/_250a63ae._.js.map +0 -1
  269. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_f4952172.js +0 -3
  270. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_f4952172.js.map +0 -1
  271. package/web/.next/server/chunks/ssr/src_presentation_web_ca99d62d._.js +0 -3
  272. package/web/.next/server/chunks/ssr/src_presentation_web_ca99d62d._.js.map +0 -1
  273. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_2b7834f6.js +0 -3
  274. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_6923c575.js +0 -3
  275. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_250a63ae._.js +0 -3
  276. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_f4952172.js +0 -3
  277. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/src_presentation_web_ca99d62d._.js +0 -3
  278. package/web/.next/static/chunks/3c79bca4d3f18f66.js +0 -1
  279. package/web/.next/static/chunks/67f2a7a5e8dc358a.css +0 -2
  280. package/web/.next/static/chunks/991d4490d7a338d8.js +0 -1
  281. /package/web/.next/static/{IKuYPxAuMvc4BtwKHlj30 → pzwrJGWI__eUhJsxxW2S-}/_buildManifest.js +0 -0
  282. /package/web/.next/static/{IKuYPxAuMvc4BtwKHlj30 → pzwrJGWI__eUhJsxxW2S-}/_clientMiddlewareManifest.json +0 -0
  283. /package/web/.next/static/{IKuYPxAuMvc4BtwKHlj30 → pzwrJGWI__eUhJsxxW2S-}/_ssgManifest.js +0 -0
@@ -9,7 +9,7 @@
9
9
  * - Application layer depends on this interface
10
10
  * - Infrastructure layer provides concrete implementation
11
11
  */
12
- import type { ApprovalGates } from '../../../../domain/generated/output.js';
12
+ import type { ApprovalGates, AgentType } from '../../../../domain/generated/output.js';
13
13
  /**
14
14
  * Service interface for feature agent background process management.
15
15
  */
@@ -31,6 +31,7 @@ export interface IFeatureAgentProcessService {
31
31
  push?: boolean;
32
32
  openPr?: boolean;
33
33
  resumePayload?: string;
34
+ agentType?: AgentType;
34
35
  }): number;
35
36
  /**
36
37
  * Check if a process is still alive.
@@ -1 +1 @@
1
- {"version":3,"file":"feature-agent-process.interface.d.ts","sourceRoot":"","sources":["../../../../../../../../packages/core/src/application/ports/output/agents/feature-agent-process.interface.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,wCAAwC,CAAC;AAE5E;;GAEG;AACH,MAAM,WAAW,2BAA2B;IAC1C;;;;;;;;OAQG;IACH,KAAK,CACH,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,EACf,YAAY,CAAC,EAAE,MAAM,EACrB,OAAO,CAAC,EAAE;QACR,aAAa,CAAC,EAAE,aAAa,CAAC;QAC9B,MAAM,CAAC,EAAE,OAAO,CAAC;QACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,mBAAmB,CAAC,EAAE,OAAO,CAAC;QAC9B,IAAI,CAAC,EAAE,OAAO,CAAC;QACf,MAAM,CAAC,EAAE,OAAO,CAAC;QACjB,aAAa,CAAC,EAAE,MAAM,CAAC;KACxB,GACA,MAAM,CAAC;IAEV;;;;;OAKG;IACH,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;IAE9B;;;;;OAKG;IACH,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACnD"}
1
+ {"version":3,"file":"feature-agent-process.interface.d.ts","sourceRoot":"","sources":["../../../../../../../../packages/core/src/application/ports/output/agents/feature-agent-process.interface.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,wCAAwC,CAAC;AAEvF;;GAEG;AACH,MAAM,WAAW,2BAA2B;IAC1C;;;;;;;;OAQG;IACH,KAAK,CACH,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,EACf,YAAY,CAAC,EAAE,MAAM,EACrB,OAAO,CAAC,EAAE;QACR,aAAa,CAAC,EAAE,aAAa,CAAC;QAC9B,MAAM,CAAC,EAAE,OAAO,CAAC;QACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,mBAAmB,CAAC,EAAE,OAAO,CAAC;QAC9B,IAAI,CAAC,EAAE,OAAO,CAAC;QACf,MAAM,CAAC,EAAE,OAAO,CAAC;QACjB,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB,SAAS,CAAC,EAAE,SAAS,CAAC;KACvB,GACA,MAAM,CAAC;IAEV;;;;;OAKG;IACH,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;IAE9B;;;;;OAKG;IACH,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACnD"}
@@ -1 +1 @@
1
- {"version":3,"file":"approve-agent-run.use-case.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/src/application/use-cases/agents/approve-agent-run.use-case.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAMH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,6DAA6D,CAAC;AACvG,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,8DAA8D,CAAC;AAChH,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,gEAAgE,CAAC;AAC7G,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,iEAAiE,CAAC;AAE1G,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,qCAAqC,CAAC;AAI9E,qBACa,sBAAsB;IAG/B,OAAO,CAAC,QAAQ,CAAC,kBAAkB;IAEnC,OAAO,CAAC,QAAQ,CAAC,cAAc;IAE/B,OAAO,CAAC,QAAQ,CAAC,iBAAiB;IAElC,OAAO,CAAC,QAAQ,CAAC,qBAAqB;gBANrB,kBAAkB,EAAE,mBAAmB,EAEvC,cAAc,EAAE,2BAA2B,EAE3C,iBAAiB,EAAE,kBAAkB,EAErC,qBAAqB,EAAE,sBAAsB;IAG1D,OAAO,CACX,EAAE,EAAE,MAAM,EACV,OAAO,CAAC,EAAE,kBAAkB,GAC3B,OAAO,CAAC;QAAE,QAAQ,EAAE,OAAO,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;CA6FlD"}
1
+ {"version":3,"file":"approve-agent-run.use-case.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/src/application/use-cases/agents/approve-agent-run.use-case.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAMH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,6DAA6D,CAAC;AACvG,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,8DAA8D,CAAC;AAChH,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,gEAAgE,CAAC;AAC7G,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,iEAAiE,CAAC;AAE1G,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,qCAAqC,CAAC;AAI9E,qBACa,sBAAsB;IAG/B,OAAO,CAAC,QAAQ,CAAC,kBAAkB;IAEnC,OAAO,CAAC,QAAQ,CAAC,cAAc;IAE/B,OAAO,CAAC,QAAQ,CAAC,iBAAiB;IAElC,OAAO,CAAC,QAAQ,CAAC,qBAAqB;gBANrB,kBAAkB,EAAE,mBAAmB,EAEvC,cAAc,EAAE,2BAA2B,EAE3C,iBAAiB,EAAE,kBAAkB,EAErC,qBAAqB,EAAE,sBAAsB;IAG1D,OAAO,CACX,EAAE,EAAE,MAAM,EACV,OAAO,CAAC,EAAE,kBAAkB,GAC3B,OAAO,CAAC;QAAE,QAAQ,EAAE,OAAO,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;CA8FlD"}
@@ -107,6 +107,7 @@ let ApproveAgentRunUseCase = class ApproveAgentRunUseCase {
107
107
  push: feature?.push ?? false,
108
108
  openPr: feature?.openPr ?? false,
109
109
  ...(payload ? { resumePayload: JSON.stringify(payload) } : {}),
110
+ agentType: run.agentType,
110
111
  });
111
112
  return { approved: true, reason: 'Approved and resumed' };
112
113
  }
@@ -1 +1 @@
1
- {"version":3,"file":"resume-feature.use-case.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/src/application/use-cases/features/resume-feature.use-case.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,qCAAqC,CAAC;AAE7E,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,iEAAiE,CAAC;AAC1G,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,6DAA6D,CAAC;AACvG,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,8DAA8D,CAAC;AAChH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,2DAA2D,CAAC;AAQlG,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,QAAQ,CAAC;CAClB;AAED,qBACa,oBAAoB;IAG7B,OAAO,CAAC,QAAQ,CAAC,WAAW;IAE5B,OAAO,CAAC,QAAQ,CAAC,OAAO;IAExB,OAAO,CAAC,QAAQ,CAAC,cAAc;IAE/B,OAAO,CAAC,QAAQ,CAAC,eAAe;gBANf,WAAW,EAAE,kBAAkB,EAE/B,OAAO,EAAE,mBAAmB,EAE5B,cAAc,EAAE,2BAA2B,EAE3C,eAAe,EAAE,gBAAgB;IAG9C,OAAO,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,CAAC;CAgG/D"}
1
+ {"version":3,"file":"resume-feature.use-case.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/src/application/use-cases/features/resume-feature.use-case.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,qCAAqC,CAAC;AAE7E,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,iEAAiE,CAAC;AAC1G,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,6DAA6D,CAAC;AACvG,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,8DAA8D,CAAC;AAChH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,2DAA2D,CAAC;AAQlG,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,QAAQ,CAAC;CAClB;AAED,qBACa,oBAAoB;IAG7B,OAAO,CAAC,QAAQ,CAAC,WAAW;IAE5B,OAAO,CAAC,QAAQ,CAAC,OAAO;IAExB,OAAO,CAAC,QAAQ,CAAC,cAAc;IAE/B,OAAO,CAAC,QAAQ,CAAC,eAAe;gBANf,WAAW,EAAE,kBAAkB,EAE/B,OAAO,EAAE,mBAAmB,EAE5B,cAAc,EAAE,2BAA2B,EAE3C,eAAe,EAAE,gBAAgB;IAG9C,OAAO,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,CAAC;CAiG/D"}
@@ -106,6 +106,7 @@ let ResumeFeatureUseCase = class ResumeFeatureUseCase {
106
106
  resumeFromInterrupt: lastRun.status === AgentRunStatus.waitingApproval,
107
107
  push: feature.push,
108
108
  openPr: feature.openPr,
109
+ agentType: lastRun.agentType,
109
110
  });
110
111
  return { feature, newRun };
111
112
  }
@@ -88,7 +88,7 @@ export function createDefaultSettings() {
88
88
  const notifications = {
89
89
  inApp: { enabled: true },
90
90
  browser: { enabled: true },
91
- desktop: { enabled: true },
91
+ desktop: { enabled: false },
92
92
  events: {
93
93
  agentStarted: true,
94
94
  phaseCompleted: true,
@@ -1 +1 @@
1
- {"version":3,"file":"dev-executor.service.d.ts","sourceRoot":"","sources":["../../../../../../../../../packages/core/src/infrastructure/services/agents/common/executors/dev-executor.service.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,2CAA2C,CAAC;AACzF,OAAO,KAAK,EACV,cAAc,EACd,qBAAqB,EACrB,oBAAoB,EACpB,yBAAyB,EAC1B,MAAM,4EAA4E,CAAC;AAqDpF,qBAAa,uBAAwB,YAAW,cAAc;IAC5D,QAAQ,CAAC,SAAS,EAAE,SAAS,CAAsB;IACnD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;;IAM3B,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,qBAAqB,GAAG,OAAO,CAAC,oBAAoB,CAAC;IAOvF,aAAa,CAClB,MAAM,EAAE,MAAM,EACd,OAAO,CAAC,EAAE,qBAAqB,GAC9B,aAAa,CAAC,yBAAyB,CAAC;IAK3C,eAAe,CAAC,QAAQ,EAAE,YAAY,GAAG,OAAO;IAIhD,OAAO,CAAC,QAAQ;CAmEjB"}
1
+ {"version":3,"file":"dev-executor.service.d.ts","sourceRoot":"","sources":["../../../../../../../../../packages/core/src/infrastructure/services/agents/common/executors/dev-executor.service.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,2CAA2C,CAAC;AACzF,OAAO,KAAK,EACV,cAAc,EACd,qBAAqB,EACrB,oBAAoB,EACpB,yBAAyB,EAC1B,MAAM,4EAA4E,CAAC;AAmIpF,qBAAa,uBAAwB,YAAW,cAAc;IAC5D,QAAQ,CAAC,SAAS,EAAE,SAAS,CAAsB;IACnD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;;IAM3B,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,qBAAqB,GAAG,OAAO,CAAC,oBAAoB,CAAC;IAOvF,aAAa,CAClB,MAAM,EAAE,MAAM,EACd,OAAO,CAAC,EAAE,qBAAqB,GAC9B,aAAa,CAAC,yBAAyB,CAAC;IAK3C,eAAe,CAAC,QAAQ,EAAE,YAAY,GAAG,OAAO;IAIhD,OAAO,CAAC,QAAQ;CAmEjB"}
@@ -9,15 +9,90 @@ import { RESEARCH_FIXTURE } from './fixtures/research.fixture.js';
9
9
  import { PLAN_FIXTURE } from './fixtures/plan.fixture.js';
10
10
  import { TASKS_FIXTURE } from './fixtures/tasks.fixture.js';
11
11
  const DEFAULT_DELAY_MS = 2000;
12
- const METADATA_RESULT = JSON.stringify({
13
- slug: 'dark-mode-toggle',
14
- name: 'Dark Mode Toggle',
15
- description: 'Add a dark-mode toggle to the Shep web UI settings panel',
16
- });
17
- // Satisfies merge-output-parser.ts COMMIT_SHA_RE and PR_URL_RE patterns
18
- const MERGE_COMMIT_RESULT = '[feat/042-dark-mode-toggle abc1234f] feat(ui): add dark-mode toggle\n' +
19
- 'https://github.com/shep-ai/shep/pull/42\nPull request #42 created successfully.';
20
- const MERGE_SQUASH_RESULT = 'Merged PR #42 with squash merge. Branch feat/042-dark-mode-toggle deleted.';
12
+ const ADJECTIVES = [
13
+ 'quantum',
14
+ 'blazing',
15
+ 'cosmic',
16
+ 'fuzzy',
17
+ 'turbo',
18
+ 'hyperbolic',
19
+ 'spectral',
20
+ 'chromatic',
21
+ 'orbital',
22
+ 'fractal',
23
+ 'velvet',
24
+ 'neon',
25
+ 'arctic',
26
+ 'molten',
27
+ 'prismatic',
28
+ 'phantom',
29
+ 'galactic',
30
+ 'atomic',
31
+ 'sonic',
32
+ 'ethereal',
33
+ ];
34
+ const NOUNS = [
35
+ 'widget',
36
+ 'pipeline',
37
+ 'dashboard',
38
+ 'renderer',
39
+ 'compiler',
40
+ 'beacon',
41
+ 'transformer',
42
+ 'navigator',
43
+ 'interceptor',
44
+ 'gateway',
45
+ 'synthesizer',
46
+ 'orchestrator',
47
+ 'resolver',
48
+ 'dispatcher',
49
+ 'emitter',
50
+ 'detector',
51
+ 'aggregator',
52
+ 'scheduler',
53
+ 'validator',
54
+ 'serializer',
55
+ ];
56
+ const VERBS = [
57
+ 'add',
58
+ 'implement',
59
+ 'integrate',
60
+ 'build',
61
+ 'create',
62
+ 'wire up',
63
+ 'introduce',
64
+ 'scaffold',
65
+ 'bootstrap',
66
+ 'enable',
67
+ ];
68
+ function randomMetadata() {
69
+ const adj = ADJECTIVES[Math.floor(Math.random() * ADJECTIVES.length)];
70
+ const noun = NOUNS[Math.floor(Math.random() * NOUNS.length)];
71
+ const verb = VERBS[Math.floor(Math.random() * VERBS.length)];
72
+ const slug = `${adj}-${noun}`;
73
+ const name = `${adj.charAt(0).toUpperCase() + adj.slice(1)} ${noun.charAt(0).toUpperCase() + noun.slice(1)}`;
74
+ return JSON.stringify({
75
+ slug,
76
+ name,
77
+ description: `${verb.charAt(0).toUpperCase() + verb.slice(1)} a ${adj} ${noun} to the application`,
78
+ });
79
+ }
80
+ function randomPrNumber() {
81
+ return Math.floor(Math.random() * 900) + 100;
82
+ }
83
+ function randomCommitHash() {
84
+ return Math.random().toString(16).slice(2, 10);
85
+ }
86
+ function mergeCommitResult() {
87
+ const pr = randomPrNumber();
88
+ const hash = randomCommitHash();
89
+ return (`[feat/dev-branch ${hash}] feat: dev implementation\n` +
90
+ `https://github.com/shep-ai/shep/pull/${pr}\nPull request #${pr} created successfully.`);
91
+ }
92
+ function mergeSquashResult() {
93
+ const pr = randomPrNumber();
94
+ return `Merged PR #${pr} with squash merge. Branch feat/dev-branch deleted.`;
95
+ }
21
96
  const IMPLEMENT_RESULT = 'Implementation complete. All tests pass.\npnpm test: 47 passed, 0 failed';
22
97
  const CI_FIX_RESULT = 'Fixed CI failure: corrected import path. All checks now passing.';
23
98
  /**
@@ -66,7 +141,7 @@ export class DevAgentExecutorService {
66
141
  dispatch(prompt) {
67
142
  // Metadata: mock-executor.service.ts extractUserInput pattern
68
143
  if (prompt.includes('User request:\n"'))
69
- return METADATA_RESULT;
144
+ return randomMetadata();
70
145
  // Analyze: analyze.prompt.ts:39
71
146
  if (prompt.includes('Write your analysis to:')) {
72
147
  const specDir = extractSpecDir(prompt);
@@ -113,13 +188,13 @@ export class DevAgentExecutorService {
113
188
  return IMPLEMENT_RESULT;
114
189
  // Merge commit/push/PR: merge-prompts.ts:88
115
190
  if (prompt.includes('performing git operations in a feature worktree'))
116
- return MERGE_COMMIT_RESULT;
191
+ return mergeCommitResult();
117
192
  // Merge squash (PR): merge-prompts.ts:131
118
193
  if (prompt.includes('merging a pull request via the GitHub CLI'))
119
- return MERGE_SQUASH_RESULT;
194
+ return mergeSquashResult();
120
195
  // Merge squash (local): merge-prompts.ts:168
121
196
  if (prompt.includes('performing a local merge'))
122
- return MERGE_SQUASH_RESULT;
197
+ return mergeSquashResult();
123
198
  // CI fix: merge.prompt.ts:28
124
199
  if (prompt.includes('fixing a CI failure'))
125
200
  return CI_FIX_RESULT;
@@ -71,7 +71,7 @@ export declare function createFeatureAgentGraph(depsOrExecutor: FeatureAgentGrap
71
71
  ciFixAttempts?: number | undefined;
72
72
  ciFixHistory?: import("../../../../domain/index.js").CiFixRecord[] | undefined;
73
73
  ciFixStatus?: "success" | "timeout" | "idle" | "watching" | "fixing" | "exhausted" | undefined;
74
- }, "__start__" | "analyze" | "requirements" | "research" | "plan" | "implement" | "validate_spec_analyze" | "validate_spec_requirements" | "validate_research" | "validate_plan_tasks" | "repair_spec_analyze" | "repair_spec_requirements" | "repair_research" | "repair_plan_tasks", {
74
+ }, "implement" | "__start__" | "analyze" | "requirements" | "research" | "plan" | "validate_spec_analyze" | "validate_spec_requirements" | "validate_research" | "validate_plan_tasks" | "repair_spec_analyze" | "repair_spec_requirements" | "repair_research" | "repair_plan_tasks", {
75
75
  featureId: {
76
76
  (): import("@langchain/langgraph").LastValue<string>;
77
77
  (annotation: import("@langchain/langgraph").SingleReducer<string, string>): import("@langchain/langgraph").BinaryOperatorAggregate<string, string>;
@@ -7,7 +7,7 @@
7
7
  */
8
8
  import type { IFeatureAgentProcessService } from '../../../../application/ports/output/agents/feature-agent-process.interface.js';
9
9
  import type { IAgentRunRepository } from '../../../../application/ports/output/agents/agent-run-repository.interface.js';
10
- import { type ApprovalGates } from '../../../../domain/generated/output.js';
10
+ import { type ApprovalGates, type AgentType } from '../../../../domain/generated/output.js';
11
11
  export declare class FeatureAgentProcessService implements IFeatureAgentProcessService {
12
12
  private readonly runRepository;
13
13
  constructor(runRepository: IAgentRunRepository);
@@ -19,6 +19,7 @@ export declare class FeatureAgentProcessService implements IFeatureAgentProcessS
19
19
  push?: boolean;
20
20
  openPr?: boolean;
21
21
  resumePayload?: string;
22
+ agentType?: AgentType;
22
23
  }): number;
23
24
  isAlive(pid: number): boolean;
24
25
  checkAndMarkCrashed(runId: string): Promise<void>;
@@ -1 +1 @@
1
- {"version":3,"file":"feature-agent-process.service.d.ts","sourceRoot":"","sources":["../../../../../../../../packages/core/src/infrastructure/services/agents/feature-agent/feature-agent-process.service.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AASH,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,sEAAsE,CAAC;AACxH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,qEAAqE,CAAC;AAC/G,OAAO,EAAkB,KAAK,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAYlF,qBAAa,0BAA2B,YAAW,2BAA2B;IAChE,OAAO,CAAC,QAAQ,CAAC,aAAa;gBAAb,aAAa,EAAE,mBAAmB;IAE/D,KAAK,CACH,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,EACf,YAAY,CAAC,EAAE,MAAM,EACrB,OAAO,CAAC,EAAE;QACR,aAAa,CAAC,EAAE,aAAa,CAAC;QAC9B,MAAM,CAAC,EAAE,OAAO,CAAC;QACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,mBAAmB,CAAC,EAAE,OAAO,CAAC;QAC9B,IAAI,CAAC,EAAE,OAAO,CAAC;QACf,MAAM,CAAC,EAAE,OAAO,CAAC;QACjB,aAAa,CAAC,EAAE,MAAM,CAAC;KACxB,GACA,MAAM;IA0DT,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IASvB,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAexD"}
1
+ {"version":3,"file":"feature-agent-process.service.d.ts","sourceRoot":"","sources":["../../../../../../../../packages/core/src/infrastructure/services/agents/feature-agent/feature-agent-process.service.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AASH,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,sEAAsE,CAAC;AACxH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,qEAAqE,CAAC;AAC/G,OAAO,EAAkB,KAAK,aAAa,EAAE,KAAK,SAAS,EAAE,MAAM,8BAA8B,CAAC;AAYlG,qBAAa,0BAA2B,YAAW,2BAA2B;IAChE,OAAO,CAAC,QAAQ,CAAC,aAAa;gBAAb,aAAa,EAAE,mBAAmB;IAE/D,KAAK,CACH,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,EACf,YAAY,CAAC,EAAE,MAAM,EACrB,OAAO,CAAC,EAAE;QACR,aAAa,CAAC,EAAE,aAAa,CAAC;QAC9B,MAAM,CAAC,EAAE,OAAO,CAAC;QACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,mBAAmB,CAAC,EAAE,OAAO,CAAC;QAC9B,IAAI,CAAC,EAAE,OAAO,CAAC;QACf,MAAM,CAAC,EAAE,OAAO,CAAC;QACjB,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB,SAAS,CAAC,EAAE,SAAS,CAAC;KACvB,GACA,MAAM;IA6DT,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IASvB,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAexD"}
@@ -62,6 +62,9 @@ export class FeatureAgentProcessService {
62
62
  if (options?.resumePayload) {
63
63
  args.push('--resume-payload', options.resumePayload);
64
64
  }
65
+ if (options?.agentType) {
66
+ args.push('--agent-type', options.agentType);
67
+ }
65
68
  // Create log file for worker output (for debugging)
66
69
  const logsDir = join(homedir(), '.shep', 'logs');
67
70
  mkdirSync(logsDir, { recursive: true });
@@ -9,6 +9,7 @@
9
9
  * CLI Args: --feature-id <id> --run-id <id> --repo <path> --spec-dir <path>
10
10
  */
11
11
  import 'reflect-metadata';
12
+ import { type AgentType } from '../../../../domain/generated/output.js';
12
13
  import type { ApprovalGates } from '../../../../domain/generated/output.js';
13
14
  export interface WorkerArgs {
14
15
  featureId: string;
@@ -23,6 +24,7 @@ export interface WorkerArgs {
23
24
  push?: boolean;
24
25
  openPr?: boolean;
25
26
  resumePayload?: string;
27
+ agentType?: AgentType;
26
28
  }
27
29
  /**
28
30
  * Parse CLI arguments into a WorkerArgs object.
@@ -1 +1 @@
1
- {"version":3,"file":"feature-agent-worker.d.ts","sourceRoot":"","sources":["../../../../../../../../packages/core/src/infrastructure/services/agents/feature-agent/feature-agent-worker.ts"],"names":[],"mappings":";AACA;;;;;;;;GAQG;AAEH,OAAO,kBAAkB,CAAC;AAqB1B,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAElE,MAAM,WAAW,UAAU;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,UAAU,CAoD1D;AAgCD;;;GAGG;AACH,wBAAsB,SAAS,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CA0M/D"}
1
+ {"version":3,"file":"feature-agent-worker.d.ts","sourceRoot":"","sources":["../../../../../../../../packages/core/src/infrastructure/services/agents/feature-agent/feature-agent-worker.ts"],"names":[],"mappings":";AACA;;;;;;;;GAQG;AAEH,OAAO,kBAAkB,CAAC;AAa1B,OAAO,EAAkB,KAAK,SAAS,EAAE,MAAM,8BAA8B,CAAC;AAS9E,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAElE,MAAM,WAAW,UAAU;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,SAAS,CAAC,EAAE,SAAS,CAAC;CACvB;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,UAAU,CA2D1D;AAgCD;;;GAGG;AACH,wBAAsB,SAAS,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAiN/D"}
@@ -53,6 +53,10 @@ export function parseWorkerArgs(args) {
53
53
  const openPr = args.includes('--open-pr');
54
54
  const threadIdx = args.indexOf('--thread-id');
55
55
  const threadId = threadIdx !== -1 && threadIdx + 1 < args.length ? args[threadIdx + 1] : undefined;
56
+ const agentTypeIdx = args.indexOf('--agent-type');
57
+ const agentType = agentTypeIdx !== -1 && agentTypeIdx + 1 < args.length
58
+ ? args[agentTypeIdx + 1]
59
+ : undefined;
56
60
  const resumePayloadIdx = args.indexOf('--resume-payload');
57
61
  const resumePayload = resumePayloadIdx !== -1 && resumePayloadIdx + 1 < args.length
58
62
  ? args[resumePayloadIdx + 1]
@@ -70,6 +74,7 @@ export function parseWorkerArgs(args) {
70
74
  push,
71
75
  openPr,
72
76
  resumePayload,
77
+ agentType,
73
78
  };
74
79
  }
75
80
  /** Simple worker logger — writes to stdout which is redirected to log file by the parent. */
@@ -119,9 +124,17 @@ export async function runWorker(args) {
119
124
  initializeSettings(settings);
120
125
  const runRepository = container.resolve('IAgentRunRepository');
121
126
  const executorProvider = container.resolve('IAgentExecutorProvider');
122
- // Create executor from configured agent settings
123
- log('Creating executor from configured agent settings...');
124
- const executor = executorProvider.getExecutor();
127
+ // Create executor use pinned agentType when resuming, otherwise fall back to settings
128
+ let executor;
129
+ if (args.agentType) {
130
+ log(`Creating executor from pinned agent type: ${args.agentType}`);
131
+ const factory = container.resolve('IAgentExecutorFactory');
132
+ executor = factory.createExecutor(args.agentType, settings.agent);
133
+ }
134
+ else {
135
+ log('Creating executor from configured agent settings...');
136
+ executor = executorProvider.getExecutor();
137
+ }
125
138
  // Resolve merge node dependencies
126
139
  const gitPrService = container.resolve('IGitPrService');
127
140
  const featureRepository = container.resolve('IFeatureRepository');
@@ -1 +1 @@
1
- {"version":3,"file":"merge.node.d.ts","sourceRoot":"","sources":["../../../../../../../../../../packages/core/src/infrastructure/services/agents/feature-agent/nodes/merge/merge.node.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAGH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,+DAA+D,CAAC;AACpG,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACxD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,yEAAyE,CAAC;AAClH,OAAO,KAAK,EACV,WAAW,EACX,aAAa,EACd,MAAM,iEAAiE,CAAC;AAmBzE,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,cAAc,CAAC;IACzB,cAAc,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,KAAK,OAAO,CAAC,WAAW,CAAC,CAAC;IAC1E,SAAS,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IAC7C,gBAAgB,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IACnD,iBAAiB,EAAE,IAAI,CAAC,kBAAkB,EAAE,UAAU,GAAG,QAAQ,CAAC,CAAC;IACnE;;;OAGG;IACH,WAAW,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IAC1F,YAAY,EAAE,aAAa,CAAC;CAC7B;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,aAAa,IAGnC,OAAO,iBAAiB,KAAG,OAAO,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC,CAkQ7E"}
1
+ {"version":3,"file":"merge.node.d.ts","sourceRoot":"","sources":["../../../../../../../../../../packages/core/src/infrastructure/services/agents/feature-agent/nodes/merge/merge.node.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAGH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,+DAA+D,CAAC;AACpG,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACxD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,yEAAyE,CAAC;AAClH,OAAO,KAAK,EACV,WAAW,EACX,aAAa,EACd,MAAM,iEAAiE,CAAC;AAmBzE,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,cAAc,CAAC;IACzB,cAAc,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,KAAK,OAAO,CAAC,WAAW,CAAC,CAAC;IAC1E,SAAS,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IAC7C,gBAAgB,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IACnD,iBAAiB,EAAE,IAAI,CAAC,kBAAkB,EAAE,UAAU,GAAG,QAAQ,CAAC,CAAC;IACnE;;;OAGG;IACH,WAAW,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IAC1F,YAAY,EAAE,aAAa,CAAC;CAC7B;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,aAAa,IAGnC,OAAO,iBAAiB,KAAG,OAAO,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC,CAsQ7E"}
@@ -36,9 +36,13 @@ export function createMergeNode(deps) {
36
36
  // --- Rejection detection on resume ---
37
37
  // Use DB lifecycle (Review) instead of feature.yaml completedPhases to detect
38
38
  // resume, because feature.yaml is in the worktree which was already pushed.
39
+ // Also require _approvalAction to be set — this distinguishes a genuine resume
40
+ // (where the worker sets _approvalAction via Command({update})) from a first run
41
+ // where updateNodeLifecycle('merge') already set lifecycle=Review in the DB.
39
42
  const featureForResume = await deps.featureRepository.findById(state.featureId);
40
43
  const isResumeAfterInterrupt = featureForResume?.lifecycle === SdlcLifecycle.Review &&
41
- shouldInterrupt('merge', state.approvalGates);
44
+ shouldInterrupt('merge', state.approvalGates) &&
45
+ state._approvalAction !== null;
42
46
  if (isResumeAfterInterrupt && state._approvalAction === 'rejected') {
43
47
  const feedback = state._rejectionFeedback ?? '(no feedback)';
44
48
  log.info(`Merge rejected with feedback: "${feedback}" — scheduling re-execution`);
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Server action that fetches fresh graph nodes and edges.
3
+ * Used as a lightweight polling fallback for active features,
4
+ * avoiding full router.refresh() page re-renders.
5
+ */
6
+ export declare function fetchGraphData(): Promise<{
7
+ nodes: import("../../components/features/features-canvas/index.js").CanvasNodeType[];
8
+ edges: import("@xyflow/react").Edge[];
9
+ }>;
10
+ //# sourceMappingURL=get-graph-data.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-graph-data.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/web/app/actions/get-graph-data.ts"],"names":[],"mappings":"AAIA;;;;GAIG;AACH,wBAAsB,cAAc;;;GAEnC"}
@@ -0,0 +1,10 @@
1
+ 'use server';
2
+ import { getGraphData } from '../(dashboard)/get-graph-data.js';
3
+ /**
4
+ * Server action that fetches fresh graph nodes and edges.
5
+ * Used as a lightweight polling fallback for active features,
6
+ * avoiding full router.refresh() page re-renders.
7
+ */
8
+ export async function fetchGraphData() {
9
+ return getGraphData();
10
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"route.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/app/api/agent-events/route.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAgBH,eAAO,MAAM,OAAO,kBAAkB,CAAC;AA4DvC,wBAAgB,GAAG,CAAC,OAAO,EAAE,OAAO,GAAG,QAAQ,CAkM9C"}
1
+ {"version":3,"file":"route.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/app/api/agent-events/route.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAgBH,eAAO,MAAM,OAAO,kBAAkB,CAAC;AA+DvC,wBAAgB,GAAG,CAAC,OAAO,EAAE,OAAO,GAAG,QAAQ,CAoN9C"}
@@ -24,12 +24,15 @@ const HEARTBEAT_INTERVAL_MS = 30_000;
24
24
  * can derive the correct FeatureLifecyclePhase via mapPhaseNameToLifecycle().
25
25
  */
26
26
  const LIFECYCLE_TO_NODE = {
27
+ [SdlcLifecycle.Started]: 'requirements',
27
28
  [SdlcLifecycle.Analyze]: 'analyze',
28
29
  [SdlcLifecycle.Requirements]: 'requirements',
29
30
  [SdlcLifecycle.Research]: 'research',
30
31
  [SdlcLifecycle.Planning]: 'plan',
31
32
  [SdlcLifecycle.Implementation]: 'implement',
32
33
  [SdlcLifecycle.Review]: 'merge',
34
+ [SdlcLifecycle.Maintain]: 'maintain',
35
+ [SdlcLifecycle.Blocked]: 'blocked',
33
36
  };
34
37
  const STATUS_TO_EVENT = {
35
38
  [AgentRunStatus.running]: {
@@ -112,7 +115,8 @@ export function GET(request) {
112
115
  continue;
113
116
  const prev = cache.get(feature.id);
114
117
  if (!prev) {
115
- // First time seeing this feature — seed cache, don't emit
118
+ // First time seeing this feature — seed cache and emit so
119
+ // clients discover features created outside the UI (e.g. CLI).
116
120
  const completedPhases = new Set();
117
121
  try {
118
122
  const timings = await phaseTimingRepo.findByRunId(run.id);
@@ -130,6 +134,21 @@ export function GET(request) {
130
134
  completedPhases,
131
135
  featureName: feature.name,
132
136
  });
137
+ // Emit initial state so the client learns about new features
138
+ const mapping = STATUS_TO_EVENT[run.status];
139
+ if (mapping) {
140
+ const phase = resultToPhase(run.result);
141
+ emitEvent({
142
+ eventType: mapping.eventType,
143
+ agentRunId: run.id,
144
+ featureId: feature.id,
145
+ featureName: feature.name,
146
+ ...(phase && { phaseName: phase }),
147
+ message: `Agent status: ${run.status}`,
148
+ severity: mapping.severity,
149
+ timestamp: new Date().toISOString(),
150
+ });
151
+ }
133
152
  continue;
134
153
  }
135
154
  // Check for status change
@@ -1 +1 @@
1
- {"version":3,"file":"create-drawer-client.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/control-center-drawer/create-drawer-client.tsx"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,iEAAiE,CAAC;AAC3G,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,qCAAqC,CAAC;AAG5E,MAAM,WAAW,uBAAuB;IACtC,cAAc,EAAE,MAAM,CAAC;IACvB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,EAAE,mBAAmB,EAAE,CAAC;IAChC,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;CACrC;AAED,wBAAgB,kBAAkB,CAAC,EACjC,cAAc,EACd,eAAe,EACf,QAAQ,EACR,gBAAgB,GACjB,EAAE,uBAAuB,2CA+EzB"}
1
+ {"version":3,"file":"create-drawer-client.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/control-center-drawer/create-drawer-client.tsx"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,iEAAiE,CAAC;AAC3G,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,qCAAqC,CAAC;AAG5E,MAAM,WAAW,uBAAuB;IACtC,cAAc,EAAE,MAAM,CAAC;IACvB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,EAAE,mBAAmB,EAAE,CAAC;IAChC,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;CACrC;AAED,wBAAgB,kBAAkB,CAAC,EACjC,cAAc,EACd,eAAe,EACf,QAAQ,EACR,gBAAgB,GACjB,EAAE,uBAAuB,2CAgFzB"}
@@ -17,14 +17,16 @@ export function CreateDrawerClient({ repositoryPath, initialParentId, features,
17
17
  // When submitting, force the drawer closed immediately — router.push('/')
18
18
  // is async and the pathname may not update before the next render.
19
19
  const pathname = usePathname();
20
- const isOpen = !isSubmitting && pathname.startsWith('/create');
21
- // Safety net: if the drawer is closed (e.g. via form submit + isSubmitting)
22
- // but router.push('/') hasn't taken effect yet, force-clear the route.
20
+ const isOnCreateRoute = pathname.startsWith('/create');
21
+ const isOpen = !isSubmitting && isOnCreateRoute;
22
+ // Reset isSubmitting once the route has actually changed away from /create,
23
+ // so the drawer can reopen on future visits. Without this, isSubmitting
24
+ // would stay true forever since parallel routes preserve component state.
23
25
  useEffect(() => {
24
- if (!isOpen && pathname.startsWith('/create')) {
25
- router.replace('/');
26
+ if (!isOnCreateRoute && isSubmitting) {
27
+ setIsSubmitting(false);
26
28
  }
27
- }, [isOpen, pathname, router]);
29
+ }, [isOnCreateRoute, isSubmitting]);
28
30
  const onClose = useCallback(() => {
29
31
  router.push('/');
30
32
  }, [router]);
@@ -55,8 +57,7 @@ export function CreateDrawerClient({ repositoryPath, initialParentId, features,
55
57
  .catch(() => {
56
58
  toast.error('Failed to create feature');
57
59
  window.dispatchEvent(new CustomEvent('shep:feature-create-failed'));
58
- })
59
- .finally(() => {
60
+ // Reset on error so the user can retry without navigating away
60
61
  setIsSubmitting(false);
61
62
  });
62
63
  }, [router, createSound]);
@@ -1 +1 @@
1
- {"version":3,"file":"derive-feature-state.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/feature-node/derive-feature-state.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAIL,qBAAqB,EACtB,MAAM,+BAA+B,CAAC;AACvC,OAAO,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,+BAA+B,CAAC;AACvE,OAAO,KAAK,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,MAAM,6BAA6B,CAAC;AAE3F;;;;;;;;;;GAUG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,OAAO,EAAE,QAAQ,CAAC,EAAE,QAAQ,GAAG,IAAI,GAAG,gBAAgB,CA4C9F;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,CAYvD;AAED,oGAAoG;AACpG,wBAAgB,mBAAmB,CAAC,SAAS,EAAE,qBAAqB,GAAG,gBAAgB,CAkBtF;AAYD,wBAAgB,uBAAuB,CACrC,SAAS,EAAE,MAAM,GAAG,SAAS,GAC5B,qBAAqB,GAAG,SAAS,CAGnC"}
1
+ {"version":3,"file":"derive-feature-state.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/feature-node/derive-feature-state.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAIL,qBAAqB,EACtB,MAAM,+BAA+B,CAAC;AACvC,OAAO,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,+BAA+B,CAAC;AACvE,OAAO,KAAK,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,MAAM,6BAA6B,CAAC;AAE3F;;;;;;;;;;GAUG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,OAAO,EAAE,QAAQ,CAAC,EAAE,QAAQ,GAAG,IAAI,GAAG,gBAAgB,CA4C9F;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,CAYvD;AAED,oGAAoG;AACpG,wBAAgB,mBAAmB,CAAC,SAAS,EAAE,qBAAqB,GAAG,gBAAgB,CAkBtF;AAcD,wBAAgB,uBAAuB,CACrC,SAAS,EAAE,MAAM,GAAG,SAAS,GAC5B,qBAAqB,GAAG,SAAS,CAGnC"}
@@ -101,6 +101,8 @@ const phaseNameToLifecycle = {
101
101
  plan: 'implementation',
102
102
  implement: 'implementation',
103
103
  merge: 'review',
104
+ maintain: 'maintain',
105
+ blocked: 'requirements',
104
106
  };
105
107
  export function mapPhaseNameToLifecycle(phaseName) {
106
108
  if (!phaseName)
@@ -23,7 +23,7 @@ export function RepositoryNode({ data }) {
23
23
  }
24
24
  : null);
25
25
  const isDeploymentActive = deployAction.status === 'Booting' || deployAction.status === 'Ready';
26
- return (_jsxs("div", { className: "group relative", children: [data.showHandles ? (_jsx(Handle, { type: "target", position: Position.Left, isConnectable: false, className: "opacity-0!" })) : null, data.onDelete && data.id ? (_jsxs(_Fragment, { children: [_jsx("div", { className: "absolute top-1/2 -left-10 -translate-y-1/2 opacity-0 transition-opacity group-hover:opacity-100", children: _jsx(TooltipProvider, { children: _jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx("button", { "aria-label": "Remove repository", "data-testid": "repository-node-delete-button", onClick: (e) => {
26
+ return (_jsxs("div", { className: cn('group relative', data.onDelete && data.id && 'pl-10'), children: [data.showHandles ? (_jsx(Handle, { type: "target", position: Position.Left, isConnectable: false, className: "opacity-0!" })) : null, data.onDelete && data.id ? (_jsxs(_Fragment, { children: [_jsx("div", { className: "absolute top-1/2 left-0 -translate-y-1/2 opacity-0 transition-opacity group-hover:opacity-100", children: _jsx(TooltipProvider, { children: _jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx("button", { "aria-label": "Remove repository", "data-testid": "repository-node-delete-button", onClick: (e) => {
27
27
  e.stopPropagation();
28
28
  setConfirmOpen(true);
29
29
  }, className: "bg-card text-muted-foreground hover:border-destructive hover:text-destructive flex h-7 w-7 cursor-pointer items-center justify-center rounded-full border shadow-sm transition-colors", children: _jsx(Trash2, { className: "h-3.5 w-3.5" }) }) }), _jsx(TooltipContent, { children: "Remove repository" })] }) }) }), _jsx(Dialog, { open: confirmOpen, onOpenChange: setConfirmOpen, children: _jsxs(DialogContent, { className: "max-w-xs", children: [_jsxs(DialogHeader, { children: [_jsx(DialogTitle, { children: "Remove repository?" }), _jsxs(DialogDescription, { children: ["This will remove ", _jsx("strong", { children: data.name }), " and all its features from your workspace. The repository files on disk won't be affected."] })] }), _jsxs(DialogFooter, { className: "grid grid-cols-2 gap-2 sm:flex-none", children: [_jsx(DialogClose, { asChild: true, children: _jsx(Button, { variant: "outline", children: "Cancel" }) }), _jsx(Button, { variant: "destructive", onClick: () => {
@@ -1,8 +1,6 @@
1
1
  export interface SidebarSectionHeaderProps {
2
2
  label: string;
3
- onFolderClick?: () => void;
4
- onMenuClick?: () => void;
5
3
  className?: string;
6
4
  }
7
- export declare function SidebarSectionHeader({ label, onFolderClick, onMenuClick, className, }: SidebarSectionHeaderProps): import("react/jsx-runtime").JSX.Element;
5
+ export declare function SidebarSectionHeader({ label, className }: SidebarSectionHeaderProps): import("react/jsx-runtime").JSX.Element;
8
6
  //# sourceMappingURL=sidebar-section-header.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"sidebar-section-header.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/sidebar-section-header/sidebar-section-header.tsx"],"names":[],"mappings":"AAQA,MAAM,WAAW,yBAAyB;IACxC,KAAK,EAAE,MAAM,CAAC;IACd,aAAa,CAAC,EAAE,MAAM,IAAI,CAAC;IAC3B,WAAW,CAAC,EAAE,MAAM,IAAI,CAAC;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,oBAAoB,CAAC,EACnC,KAAK,EACL,aAAa,EACb,WAAW,EACX,SAAS,GACV,EAAE,yBAAyB,2CA0C3B"}
1
+ {"version":3,"file":"sidebar-section-header.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/sidebar-section-header/sidebar-section-header.tsx"],"names":[],"mappings":"AAKA,MAAM,WAAW,yBAAyB;IACxC,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,oBAAoB,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE,yBAAyB,2CAQnF"}
@@ -1,11 +1,7 @@
1
1
  'use client';
2
- import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
- import { Folder, GripHorizontal } from 'lucide-react';
2
+ import { jsx as _jsx } from "react/jsx-runtime";
4
3
  import { SidebarGroup } from '../../ui/sidebar.js';
5
- import { Tooltip, TooltipContent, TooltipTrigger } from '../../ui/tooltip.js';
6
- import { useSidebar } from '../../ui/sidebar.js';
7
4
  import { cn } from '../../../lib/utils.js';
8
- export function SidebarSectionHeader({ label, onFolderClick, onMenuClick, className, }) {
9
- const { state, isMobile } = useSidebar();
10
- return (_jsx(SidebarGroup, { "data-testid": "sidebar-section-header", className: cn('px-2 py-1', className), children: _jsxs("div", { className: "text-sidebar-foreground flex h-7 w-full shrink-0 items-center px-2 text-sm font-medium", children: [_jsx("span", { className: "min-w-0 flex-1 truncate", children: label }), _jsxs("span", { className: "text-sidebar-foreground/70 flex shrink-0 items-center gap-0.5", children: [_jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx("button", { type: "button", onClick: onFolderClick, className: "ring-sidebar-ring hover:bg-sidebar-accent hover:text-sidebar-accent-foreground flex size-7 items-center justify-center rounded-md p-0 outline-hidden transition-colors focus-visible:ring-2 [&>svg]:size-4", "aria-label": "Open features folder", children: _jsx(Folder, { className: "size-4" }) }) }), _jsx(TooltipContent, { side: "right", align: "center", hidden: state !== 'collapsed' || isMobile, children: "Open features folder" })] }), _jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx("button", { type: "button", onClick: onMenuClick, className: "ring-sidebar-ring hover:bg-sidebar-accent hover:text-sidebar-accent-foreground flex size-7 items-center justify-center rounded-md p-0 outline-hidden transition-colors focus-visible:ring-2 [&>svg]:size-4", "aria-label": "Features options", children: _jsx(GripHorizontal, { className: "size-4" }) }) }), _jsx(TooltipContent, { side: "right", align: "center", hidden: state !== 'collapsed' || isMobile, children: "Features options" })] })] })] }) }));
5
+ export function SidebarSectionHeader({ label, className }) {
6
+ return (_jsx(SidebarGroup, { "data-testid": "sidebar-section-header", className: cn('px-2 py-1', className), children: _jsx("div", { className: "text-sidebar-foreground flex h-7 w-full shrink-0 items-center px-2 text-sm font-medium", children: _jsx("span", { className: "min-w-0 flex-1 truncate", children: label }) }) }));
11
7
  }
@@ -4,5 +4,4 @@ declare const meta: Meta<typeof SidebarSectionHeader>;
4
4
  export default meta;
5
5
  type Story = StoryObj<typeof meta>;
6
6
  export declare const Default: Story;
7
- export declare const WithActions: Story;
8
7
  //# sourceMappingURL=sidebar-section-header.stories.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"sidebar-section-header.stories.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/sidebar-section-header/sidebar-section-header.stories.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAEvD,OAAO,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAEhE,QAAA,MAAM,IAAI,EAAE,IAAI,CAAC,OAAO,oBAAoB,CAgB3C,CAAC;AAEF,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,IAAI,CAAC,CAAC;AAEnC,eAAO,MAAM,OAAO,EAAE,KAIrB,CAAC;AAOF,eAAO,MAAM,WAAW,EAAE,KAMzB,CAAC"}
1
+ {"version":3,"file":"sidebar-section-header.stories.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/sidebar-section-header/sidebar-section-header.stories.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAEvD,OAAO,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAEhE,QAAA,MAAM,IAAI,EAAE,IAAI,CAAC,OAAO,oBAAoB,CAgB3C,CAAC;AAEF,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,IAAI,CAAC,CAAC;AAEnC,eAAO,MAAM,OAAO,EAAE,KAIrB,CAAC"}
@@ -18,14 +18,3 @@ export const Default = {
18
18
  label: 'Features',
19
19
  },
20
20
  };
21
- function noop() {
22
- // Intentional no-op for Storybook interaction demos
23
- return;
24
- }
25
- export const WithActions = {
26
- args: {
27
- label: 'Features',
28
- onFolderClick: noop,
29
- onMenuClick: noop,
30
- },
31
- };
@@ -1 +1 @@
1
- {"version":3,"file":"use-control-center-state.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/features/control-center/use-control-center-state.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAClE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AACxE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uCAAuC,CAAC;AAC5E,OAAO,EAGL,KAAK,eAAe,EACrB,MAAM,yBAAyB,CAAC;AAWjC,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,cAAc,EAAE,CAAC;IACxB,KAAK,EAAE,IAAI,EAAE,CAAC;IACd,aAAa,EAAE,CAAC,OAAO,EAAE,UAAU,CAAC,cAAc,CAAC,EAAE,KAAK,IAAI,CAAC;IAC/D,aAAa,EAAE,CAAC,UAAU,EAAE,UAAU,KAAK,IAAI,CAAC;IAChD,mBAAmB,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAC5C,YAAY,EAAE,CAAC,SAAS,EAAE,eAAe,KAAK,IAAI,CAAC;IACnD,mBAAmB,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IACjD,sBAAsB,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAChE,iBAAiB,EAAE,CACjB,YAAY,EAAE,MAAM,GAAG,IAAI,EAC3B,YAAY,CAAC,EAAE,OAAO,CAAC,eAAe,CAAC,EACvC,QAAQ,CAAC,EAAE,MAAM,KACd,MAAM,CAAC;CACb;AAID,wBAAgB,qBAAqB,CACnC,YAAY,EAAE,cAAc,EAAE,EAC9B,YAAY,EAAE,IAAI,EAAE,GACnB,kBAAkB,CA+epB"}
1
+ {"version":3,"file":"use-control-center-state.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/features/control-center/use-control-center-state.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAClE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AACxE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uCAAuC,CAAC;AAC5E,OAAO,EAGL,KAAK,eAAe,EACrB,MAAM,yBAAyB,CAAC;AAYjC,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,cAAc,EAAE,CAAC;IACxB,KAAK,EAAE,IAAI,EAAE,CAAC;IACd,aAAa,EAAE,CAAC,OAAO,EAAE,UAAU,CAAC,cAAc,CAAC,EAAE,KAAK,IAAI,CAAC;IAC/D,aAAa,EAAE,CAAC,UAAU,EAAE,UAAU,KAAK,IAAI,CAAC;IAChD,mBAAmB,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAC5C,YAAY,EAAE,CAAC,SAAS,EAAE,eAAe,KAAK,IAAI,CAAC;IACnD,mBAAmB,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IACjD,sBAAsB,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAChE,iBAAiB,EAAE,CACjB,YAAY,EAAE,MAAM,GAAG,IAAI,EAC3B,YAAY,CAAC,EAAE,OAAO,CAAC,eAAe,CAAC,EACvC,QAAQ,CAAC,EAAE,MAAM,KACd,MAAM,CAAC;CACb;AAID,wBAAgB,qBAAqB,CACnC,YAAY,EAAE,cAAc,EAAE,EAC9B,YAAY,EAAE,IAAI,EAAE,GACnB,kBAAkB,CAgpBpB"}