@shepai/cli 1.72.9-pr220.f17b60a → 1.73.0-pr222.ef53005

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 (274) hide show
  1. package/dist/packages/core/src/application/ports/output/agents/agent-executor-provider.interface.d.ts +1 -1
  2. package/dist/packages/core/src/application/ports/output/agents/agent-executor-provider.interface.d.ts.map +1 -1
  3. package/dist/packages/core/src/infrastructure/di/container.d.ts.map +1 -1
  4. package/dist/packages/core/src/infrastructure/di/container.js +2 -1
  5. package/dist/packages/core/src/infrastructure/services/agents/common/agent-executor-provider.service.d.ts +4 -2
  6. package/dist/packages/core/src/infrastructure/services/agents/common/agent-executor-provider.service.d.ts.map +1 -1
  7. package/dist/packages/core/src/infrastructure/services/agents/common/agent-executor-provider.service.js +8 -4
  8. package/dist/packages/core/src/infrastructure/services/agents/common/agent-runner.service.js +1 -1
  9. package/dist/packages/core/src/infrastructure/services/agents/common/structured-agent-caller.service.js +1 -1
  10. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/feature-agent-worker.js +1 -1
  11. package/dist/src/presentation/web/app/layout.js +1 -1
  12. package/dist/src/presentation/web/components/common/control-center-drawer/feature-drawer-client.d.ts.map +1 -1
  13. package/dist/src/presentation/web/components/common/control-center-drawer/feature-drawer-client.js +54 -124
  14. package/dist/src/presentation/web/components/common/control-center-drawer/use-artifact-fetch.d.ts +13 -0
  15. package/dist/src/presentation/web/components/common/control-center-drawer/use-artifact-fetch.d.ts.map +1 -0
  16. package/dist/src/presentation/web/components/common/control-center-drawer/use-artifact-fetch.js +46 -0
  17. package/dist/src/presentation/web/components/common/feature-drawer/use-feature-actions.d.ts.map +1 -1
  18. package/dist/src/presentation/web/components/common/feature-drawer/use-feature-actions.js +7 -10
  19. package/dist/src/presentation/web/components/common/repository-node/use-repository-actions.d.ts.map +1 -1
  20. package/dist/src/presentation/web/components/common/repository-node/use-repository-actions.js +14 -39
  21. package/dist/src/presentation/web/components/features/control-center/control-center-inner.js +6 -7
  22. package/dist/src/presentation/web/components/features/control-center/use-control-center-state.d.ts.map +1 -1
  23. package/dist/src/presentation/web/components/features/control-center/use-control-center-state.js +45 -8
  24. package/dist/src/presentation/web/hooks/agent-events-provider.d.ts.map +1 -1
  25. package/dist/src/presentation/web/hooks/agent-events-provider.js +3 -2
  26. package/dist/src/presentation/web/hooks/use-agent-events.d.ts.map +1 -1
  27. package/dist/src/presentation/web/hooks/use-agent-events.js +13 -2
  28. package/dist/src/presentation/web/hooks/use-deploy-action.d.ts.map +1 -1
  29. package/dist/src/presentation/web/hooks/use-deploy-action.js +10 -13
  30. package/dist/src/presentation/web/lib/logger.d.ts +7 -0
  31. package/dist/src/presentation/web/lib/logger.d.ts.map +1 -0
  32. package/dist/src/presentation/web/lib/logger.js +11 -0
  33. package/dist/tsconfig.build.tsbuildinfo +1 -1
  34. package/package.json +1 -1
  35. package/web/.next/BUILD_ID +1 -1
  36. package/web/.next/build-manifest.json +2 -2
  37. package/web/.next/cache/.previewinfo +1 -1
  38. package/web/.next/cache/.rscinfo +1 -1
  39. package/web/.next/cache/.tsbuildinfo +1 -1
  40. package/web/.next/cache/config.json +3 -3
  41. package/web/.next/fallback-build-manifest.json +2 -2
  42. package/web/.next/prerender-manifest.json +3 -3
  43. package/web/.next/required-server-files.js +1 -1
  44. package/web/.next/required-server-files.json +1 -1
  45. package/web/.next/server/app/(dashboard)/@drawer/create/page/server-reference-manifest.json +45 -30
  46. package/web/.next/server/app/(dashboard)/@drawer/create/page.js +3 -3
  47. package/web/.next/server/app/(dashboard)/@drawer/create/page.js.nft.json +1 -1
  48. package/web/.next/server/app/(dashboard)/@drawer/create/page_client-reference-manifest.js +1 -1
  49. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page/server-reference-manifest.json +51 -36
  50. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js +3 -3
  51. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js.nft.json +1 -1
  52. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page_client-reference-manifest.js +1 -1
  53. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page/server-reference-manifest.json +41 -26
  54. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js +3 -3
  55. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js.nft.json +1 -1
  56. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  57. package/web/.next/server/app/(dashboard)/create/page/server-reference-manifest.json +45 -30
  58. package/web/.next/server/app/(dashboard)/create/page.js +3 -3
  59. package/web/.next/server/app/(dashboard)/create/page.js.nft.json +1 -1
  60. package/web/.next/server/app/(dashboard)/create/page_client-reference-manifest.js +1 -1
  61. package/web/.next/server/app/(dashboard)/feature/[featureId]/page/server-reference-manifest.json +51 -36
  62. package/web/.next/server/app/(dashboard)/feature/[featureId]/page.js +3 -3
  63. package/web/.next/server/app/(dashboard)/feature/[featureId]/page.js.nft.json +1 -1
  64. package/web/.next/server/app/(dashboard)/feature/[featureId]/page_client-reference-manifest.js +1 -1
  65. package/web/.next/server/app/(dashboard)/page/server-reference-manifest.json +41 -26
  66. package/web/.next/server/app/(dashboard)/page.js +3 -3
  67. package/web/.next/server/app/(dashboard)/page.js.nft.json +1 -1
  68. package/web/.next/server/app/(dashboard)/page_client-reference-manifest.js +1 -1
  69. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page/server-reference-manifest.json +41 -26
  70. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js +3 -3
  71. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js.nft.json +1 -1
  72. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  73. package/web/.next/server/app/_global-error.html +2 -2
  74. package/web/.next/server/app/_global-error.rsc +1 -1
  75. package/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  76. package/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  77. package/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  78. package/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  79. package/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  80. package/web/.next/server/app/_not-found/page/server-reference-manifest.json +1 -1
  81. package/web/.next/server/app/_not-found/page.js.nft.json +1 -1
  82. package/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  83. package/web/.next/server/app/skills/page/server-reference-manifest.json +6 -6
  84. package/web/.next/server/app/skills/page.js.nft.json +1 -1
  85. package/web/.next/server/app/skills/page_client-reference-manifest.js +1 -1
  86. package/web/.next/server/app/tools/page/server-reference-manifest.json +6 -6
  87. package/web/.next/server/app/tools/page.js.nft.json +1 -1
  88. package/web/.next/server/app/tools/page_client-reference-manifest.js +1 -1
  89. package/web/.next/server/app/version/page/server-reference-manifest.json +1 -1
  90. package/web/.next/server/app/version/page.js.nft.json +1 -1
  91. package/web/.next/server/app/version/page_client-reference-manifest.js +1 -1
  92. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js +1 -1
  93. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js.map +1 -1
  94. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_da7eef33.js +3 -0
  95. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_da7eef33.js.map +1 -0
  96. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_0a9251aa.js +3 -0
  97. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_0a9251aa.js.map +1 -0
  98. package/web/.next/server/chunks/ssr/[root-of-the-server]__17a611f0._.js +2 -2
  99. package/web/.next/server/chunks/ssr/[root-of-the-server]__17a611f0._.js.map +1 -1
  100. package/web/.next/server/chunks/ssr/[root-of-the-server]__249c74f6._.js +1 -1
  101. package/web/.next/server/chunks/ssr/[root-of-the-server]__45dbf93d._.js +2 -2
  102. package/web/.next/server/chunks/ssr/[root-of-the-server]__45dbf93d._.js.map +1 -1
  103. package/web/.next/server/chunks/ssr/[root-of-the-server]__6258349c._.js +1 -1
  104. package/web/.next/server/chunks/ssr/[root-of-the-server]__6258349c._.js.map +1 -1
  105. package/web/.next/server/chunks/ssr/[root-of-the-server]__6b17a22d._.js +1 -1
  106. package/web/.next/server/chunks/ssr/[root-of-the-server]__6b17a22d._.js.map +1 -1
  107. package/web/.next/server/chunks/ssr/[root-of-the-server]__6cbc1149._.js +2 -2
  108. package/web/.next/server/chunks/ssr/[root-of-the-server]__6cbc1149._.js.map +1 -1
  109. package/web/.next/server/chunks/ssr/[root-of-the-server]__804c006d._.js +1 -1
  110. package/web/.next/server/chunks/ssr/[root-of-the-server]__804c006d._.js.map +1 -1
  111. package/web/.next/server/chunks/ssr/[root-of-the-server]__94a6d275._.js +1 -1
  112. package/web/.next/server/chunks/ssr/[root-of-the-server]__94a6d275._.js.map +1 -1
  113. package/web/.next/server/chunks/ssr/[root-of-the-server]__aad040c0._.js +1 -1
  114. package/web/.next/server/chunks/ssr/[root-of-the-server]__aad040c0._.js.map +1 -1
  115. package/web/.next/server/chunks/ssr/_0e9d6bf7._.js +1 -1
  116. package/web/.next/server/chunks/ssr/_0e9d6bf7._.js.map +1 -1
  117. package/web/.next/server/chunks/ssr/{_8e87c87b._.js → _4f7c70c9._.js} +2 -2
  118. package/web/.next/server/chunks/ssr/{_8e87c87b._.js.map → _4f7c70c9._.js.map} +1 -1
  119. package/web/.next/server/chunks/ssr/{_1978f325._.js → _5ee4f5a7._.js} +2 -2
  120. package/web/.next/server/chunks/ssr/_5ee4f5a7._.js.map +1 -0
  121. package/web/.next/server/chunks/ssr/_61351ed3._.js +1 -1
  122. package/web/.next/server/chunks/ssr/_61351ed3._.js.map +1 -1
  123. package/web/.next/server/chunks/ssr/_6e08ce21._.js +3 -0
  124. package/web/.next/server/chunks/ssr/_6e08ce21._.js.map +1 -0
  125. package/web/.next/server/chunks/ssr/_8400c8bb._.js +1 -1
  126. package/web/.next/server/chunks/ssr/_8400c8bb._.js.map +1 -1
  127. package/web/.next/server/chunks/ssr/_9f940437._.js +1 -1
  128. package/web/.next/server/chunks/ssr/_9f940437._.js.map +1 -1
  129. package/web/.next/{standalone/src/presentation/web/.next/server/chunks/ssr/src_presentation_web_d5b0cb86._.js → server/chunks/ssr/src_presentation_web_163038ba._.js} +3 -3
  130. package/web/.next/server/chunks/ssr/{src_presentation_web_d5b0cb86._.js.map → src_presentation_web_163038ba._.js.map} +1 -1
  131. package/web/.next/server/chunks/ssr/{src_presentation_web_2b91e4ec._.js → src_presentation_web_30d7eeda._.js} +2 -2
  132. package/web/.next/server/chunks/ssr/{src_presentation_web_5bcc1537._.js.map → src_presentation_web_30d7eeda._.js.map} +1 -1
  133. package/web/.next/server/chunks/ssr/{src_presentation_web_d5b0cb86._.js → src_presentation_web_459cb687._.js} +3 -3
  134. package/web/.next/server/chunks/ssr/{src_presentation_web_e626b63c._.js.map → src_presentation_web_459cb687._.js.map} +1 -1
  135. package/web/.next/server/chunks/ssr/{src_presentation_web_5bcc1537._.js → src_presentation_web_565a14f8._.js} +2 -2
  136. package/web/.next/server/chunks/ssr/{src_presentation_web_2b91e4ec._.js.map → src_presentation_web_565a14f8._.js.map} +1 -1
  137. package/web/.next/server/chunks/ssr/src_presentation_web_67178b88._.js +1 -1
  138. package/web/.next/server/chunks/ssr/src_presentation_web_67178b88._.js.map +1 -1
  139. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_021a05f2.js +3 -0
  140. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_021a05f2.js.map +1 -0
  141. package/web/.next/server/chunks/ssr/src_presentation_web_app_(dashboard)_get-graph-data_ts_b018483e._.js +3 -0
  142. package/web/.next/server/chunks/ssr/src_presentation_web_app_(dashboard)_get-graph-data_ts_b018483e._.js.map +1 -0
  143. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js +1 -1
  144. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js.map +1 -1
  145. package/web/.next/server/pages/500.html +2 -2
  146. package/web/.next/server/server-reference-manifest.js +1 -1
  147. package/web/.next/server/server-reference-manifest.json +183 -126
  148. package/web/.next/standalone/src/presentation/web/.next/BUILD_ID +1 -1
  149. package/web/.next/standalone/src/presentation/web/.next/build-manifest.json +2 -2
  150. package/web/.next/standalone/src/presentation/web/.next/prerender-manifest.json +3 -3
  151. package/web/.next/standalone/src/presentation/web/.next/required-server-files.json +1 -1
  152. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/@drawer/create/page/server-reference-manifest.json +45 -30
  153. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/@drawer/create/page.js +3 -3
  154. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/@drawer/create/page.js.nft.json +1 -1
  155. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/@drawer/create/page_client-reference-manifest.js +1 -1
  156. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page/server-reference-manifest.json +51 -36
  157. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js +3 -3
  158. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js.nft.json +1 -1
  159. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page_client-reference-manifest.js +1 -1
  160. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page/server-reference-manifest.json +41 -26
  161. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js +3 -3
  162. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js.nft.json +1 -1
  163. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  164. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/create/page/server-reference-manifest.json +45 -30
  165. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/create/page.js +3 -3
  166. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/create/page.js.nft.json +1 -1
  167. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/create/page_client-reference-manifest.js +1 -1
  168. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/feature/[featureId]/page/server-reference-manifest.json +51 -36
  169. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/feature/[featureId]/page.js +3 -3
  170. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/feature/[featureId]/page.js.nft.json +1 -1
  171. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/feature/[featureId]/page_client-reference-manifest.js +1 -1
  172. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/page/server-reference-manifest.json +41 -26
  173. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/page.js +3 -3
  174. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/page.js.nft.json +1 -1
  175. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/page_client-reference-manifest.js +1 -1
  176. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/repository/[repositoryId]/page/server-reference-manifest.json +41 -26
  177. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js +3 -3
  178. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js.nft.json +1 -1
  179. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  180. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.html +2 -2
  181. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.rsc +1 -1
  182. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  183. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  184. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  185. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  186. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  187. package/web/.next/standalone/src/presentation/web/.next/server/app/_not-found/page/server-reference-manifest.json +1 -1
  188. package/web/.next/standalone/src/presentation/web/.next/server/app/_not-found/page.js.nft.json +1 -1
  189. package/web/.next/standalone/src/presentation/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  190. package/web/.next/standalone/src/presentation/web/.next/server/app/skills/page/server-reference-manifest.json +6 -6
  191. package/web/.next/standalone/src/presentation/web/.next/server/app/skills/page.js.nft.json +1 -1
  192. package/web/.next/standalone/src/presentation/web/.next/server/app/skills/page_client-reference-manifest.js +1 -1
  193. package/web/.next/standalone/src/presentation/web/.next/server/app/tools/page/server-reference-manifest.json +6 -6
  194. package/web/.next/standalone/src/presentation/web/.next/server/app/tools/page.js.nft.json +1 -1
  195. package/web/.next/standalone/src/presentation/web/.next/server/app/tools/page_client-reference-manifest.js +1 -1
  196. package/web/.next/standalone/src/presentation/web/.next/server/app/version/page/server-reference-manifest.json +1 -1
  197. package/web/.next/standalone/src/presentation/web/.next/server/app/version/page.js.nft.json +1 -1
  198. package/web/.next/standalone/src/presentation/web/.next/server/app/version/page_client-reference-manifest.js +1 -1
  199. 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
  200. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_da7eef33.js +3 -0
  201. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_0a9251aa.js +3 -0
  202. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__17a611f0._.js +2 -2
  203. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__249c74f6._.js +1 -1
  204. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__45dbf93d._.js +2 -2
  205. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__6258349c._.js +1 -1
  206. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__6b17a22d._.js +1 -1
  207. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__6cbc1149._.js +2 -2
  208. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__804c006d._.js +1 -1
  209. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__94a6d275._.js +1 -1
  210. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__aad040c0._.js +1 -1
  211. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_0e9d6bf7._.js +1 -1
  212. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/{_8e87c87b._.js → _4f7c70c9._.js} +2 -2
  213. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/{_1978f325._.js → _5ee4f5a7._.js} +2 -2
  214. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_61351ed3._.js +1 -1
  215. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_6e08ce21._.js +3 -0
  216. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_8400c8bb._.js +1 -1
  217. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_9f940437._.js +1 -1
  218. package/web/.next/{server/chunks/ssr/src_presentation_web_e626b63c._.js → standalone/src/presentation/web/.next/server/chunks/ssr/src_presentation_web_163038ba._.js} +3 -3
  219. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/{src_presentation_web_2b91e4ec._.js → src_presentation_web_30d7eeda._.js} +2 -2
  220. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/{src_presentation_web_e626b63c._.js → src_presentation_web_459cb687._.js} +3 -3
  221. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/{src_presentation_web_5bcc1537._.js → src_presentation_web_565a14f8._.js} +2 -2
  222. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/src_presentation_web_67178b88._.js +1 -1
  223. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_021a05f2.js +3 -0
  224. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/src_presentation_web_app_(dashboard)_get-graph-data_ts_b018483e._.js +3 -0
  225. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js +1 -1
  226. package/web/.next/standalone/src/presentation/web/.next/server/pages/500.html +2 -2
  227. package/web/.next/standalone/src/presentation/web/.next/server/server-reference-manifest.js +1 -1
  228. package/web/.next/standalone/src/presentation/web/.next/server/server-reference-manifest.json +183 -126
  229. package/web/.next/standalone/src/presentation/web/app/layout.tsx +1 -1
  230. package/web/.next/standalone/src/presentation/web/components/common/control-center-drawer/feature-drawer-client.tsx +80 -115
  231. package/web/.next/standalone/src/presentation/web/components/common/control-center-drawer/use-artifact-fetch.ts +56 -0
  232. package/web/.next/standalone/src/presentation/web/components/common/feature-drawer/use-feature-actions.ts +6 -7
  233. package/web/.next/standalone/src/presentation/web/components/common/repository-node/use-repository-actions.ts +29 -54
  234. package/web/.next/standalone/src/presentation/web/components/features/control-center/control-center-inner.tsx +7 -7
  235. package/web/.next/standalone/src/presentation/web/components/features/control-center/use-control-center-state.ts +50 -8
  236. package/web/.next/standalone/src/presentation/web/hooks/agent-events-provider.tsx +7 -2
  237. package/web/.next/standalone/src/presentation/web/hooks/use-agent-events.ts +13 -2
  238. package/web/.next/standalone/src/presentation/web/hooks/use-deploy-action.ts +13 -13
  239. package/web/.next/standalone/src/presentation/web/lib/logger.ts +12 -0
  240. package/web/.next/standalone/src/presentation/web/server.js +1 -1
  241. package/web/.next/static/chunks/{98ca891a5c156aa5.js → 0cfed3c69c312c09.js} +3 -3
  242. package/web/.next/static/chunks/{c92e1360ada8ca94.js → 1f5c93a8b939416d.js} +2 -2
  243. package/web/.next/static/chunks/4c63764a2d06e45e.js +1 -0
  244. package/web/.next/static/chunks/{792aac476adb5875.js → 89e74b1c3eb43b03.js} +1 -1
  245. package/web/.next/static/chunks/{9b1770f05f1d95e5.js → 937d7d4d58942872.js} +1 -1
  246. package/web/.next/static/chunks/95e3f47abe8032e5.js +1 -0
  247. package/web/.next/static/chunks/{83463b63971f5723.js → b835e88cdc8c63d2.js} +1 -1
  248. package/web/.next/static/chunks/{d5e95c4482029a39.js → e2342af6b68c94c1.js} +1 -1
  249. package/web/.next/static/chunks/{a7f52757dff0cea0.js → ed69d6b172ae2bfe.js} +1 -1
  250. package/web/.next/static/chunks/fd46753cd16664a9.js +1 -0
  251. package/web/.next/trace +1 -1
  252. package/web/.next/trace-build +1 -1
  253. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_816618e2.js +0 -3
  254. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_816618e2.js.map +0 -1
  255. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_ba2e050f.js +0 -3
  256. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_ba2e050f.js.map +0 -1
  257. package/web/.next/server/chunks/ssr/_1978f325._.js.map +0 -1
  258. package/web/.next/server/chunks/ssr/_250a63ae._.js +0 -3
  259. package/web/.next/server/chunks/ssr/_250a63ae._.js.map +0 -1
  260. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_5955c012.js +0 -3
  261. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_5955c012.js.map +0 -1
  262. package/web/.next/server/chunks/ssr/src_presentation_web_ca99d62d._.js +0 -3
  263. package/web/.next/server/chunks/ssr/src_presentation_web_ca99d62d._.js.map +0 -1
  264. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_816618e2.js +0 -3
  265. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_ba2e050f.js +0 -3
  266. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_250a63ae._.js +0 -3
  267. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_5955c012.js +0 -3
  268. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/src_presentation_web_ca99d62d._.js +0 -3
  269. package/web/.next/static/chunks/76827713cb2b7333.js +0 -1
  270. package/web/.next/static/chunks/7c8adcfd920a8f74.js +0 -1
  271. package/web/.next/static/chunks/b6becf0de992842a.js +0 -1
  272. /package/web/.next/static/{eg0FTlsA4z_7CXbFfMgAr → 0yTXyENV4ko7rpM4-3vV8}/_buildManifest.js +0 -0
  273. /package/web/.next/static/{eg0FTlsA4z_7CXbFfMgAr → 0yTXyENV4ko7rpM4-3vV8}/_clientMiddlewareManifest.json +0 -0
  274. /package/web/.next/static/{eg0FTlsA4z_7CXbFfMgAr → 0yTXyENV4ko7rpM4-3vV8}/_ssgManifest.js +0 -0
@@ -1,5 +1,5 @@
1
1
  import type { IAgentExecutor } from './agent-executor.interface.js';
2
2
  export interface IAgentExecutorProvider {
3
- getExecutor(): IAgentExecutor;
3
+ getExecutor(): Promise<IAgentExecutor>;
4
4
  }
5
5
  //# sourceMappingURL=agent-executor-provider.interface.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"agent-executor-provider.interface.d.ts","sourceRoot":"","sources":["../../../../../../../../packages/core/src/application/ports/output/agents/agent-executor-provider.interface.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAEpE,MAAM,WAAW,sBAAsB;IACrC,WAAW,IAAI,cAAc,CAAC;CAC/B"}
1
+ {"version":3,"file":"agent-executor-provider.interface.d.ts","sourceRoot":"","sources":["../../../../../../../../packages/core/src/application/ports/output/agents/agent-executor-provider.interface.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAEpE,MAAM,WAAW,sBAAsB;IACrC,WAAW,IAAI,OAAO,CAAC,cAAc,CAAC,CAAC;CACxC"}
@@ -1 +1 @@
1
- {"version":3,"file":"container.d.ts","sourceRoot":"","sources":["../../../../../../packages/core/src/infrastructure/di/container.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,kBAAkB,CAAC;AAC1B,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAiHrC;;;;;;GAMG;AACH,wBAAsB,mBAAmB,IAAI,OAAO,CAAC,OAAO,SAAS,CAAC,CAuQrE;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,IAAI,OAAO,CAEhD;AAED;;;GAGG;AACH,OAAO,EAAE,SAAS,EAAE,CAAC"}
1
+ {"version":3,"file":"container.d.ts","sourceRoot":"","sources":["../../../../../../packages/core/src/infrastructure/di/container.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,kBAAkB,CAAC;AAC1B,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAiHrC;;;;;;GAMG;AACH,wBAAsB,mBAAmB,IAAI,OAAO,CAAC,OAAO,SAAS,CAAC,CAwQrE;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,IAAI,OAAO,CAEhD;AAED;;;GAGG;AACH,OAAO,EAAE,SAAS,EAAE,CAAC"}
@@ -171,7 +171,8 @@ export async function initializeContainer() {
171
171
  container.register('IAgentExecutorProvider', {
172
172
  useFactory: (c) => {
173
173
  const factory = c.resolve('IAgentExecutorFactory');
174
- return new AgentExecutorProvider(factory);
174
+ const settingsRepo = c.resolve('ISettingsRepository');
175
+ return new AgentExecutorProvider(factory, settingsRepo);
175
176
  },
176
177
  });
177
178
  container.register('IStructuredAgentCaller', {
@@ -1,9 +1,11 @@
1
1
  import type { IAgentExecutorProvider } from '../../../../application/ports/output/agents/agent-executor-provider.interface.js';
2
2
  import type { IAgentExecutorFactory } from '../../../../application/ports/output/agents/agent-executor-factory.interface.js';
3
3
  import type { IAgentExecutor } from '../../../../application/ports/output/agents/agent-executor.interface.js';
4
+ import type { ISettingsRepository } from '../../../../application/ports/output/repositories/settings.repository.interface.js';
4
5
  export declare class AgentExecutorProvider implements IAgentExecutorProvider {
5
6
  private readonly factory;
6
- constructor(factory: IAgentExecutorFactory);
7
- getExecutor(): IAgentExecutor;
7
+ private readonly settingsRepository;
8
+ constructor(factory: IAgentExecutorFactory, settingsRepository: ISettingsRepository);
9
+ getExecutor(): Promise<IAgentExecutor>;
8
10
  }
9
11
  //# sourceMappingURL=agent-executor-provider.service.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"agent-executor-provider.service.d.ts","sourceRoot":"","sources":["../../../../../../../../packages/core/src/infrastructure/services/agents/common/agent-executor-provider.service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,kFAAkF,CAAC;AAC/H,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,iFAAiF,CAAC;AAC7H,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yEAAyE,CAAC;AAG9G,qBAAa,qBAAsB,YAAW,sBAAsB;IACtD,OAAO,CAAC,QAAQ,CAAC,OAAO;gBAAP,OAAO,EAAE,qBAAqB;IAE3D,WAAW,IAAI,cAAc;CAI9B"}
1
+ {"version":3,"file":"agent-executor-provider.service.d.ts","sourceRoot":"","sources":["../../../../../../../../packages/core/src/infrastructure/services/agents/common/agent-executor-provider.service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,kFAAkF,CAAC;AAC/H,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,iFAAiF,CAAC;AAC7H,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yEAAyE,CAAC;AAC9G,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,oFAAoF,CAAC;AAE9H,qBAAa,qBAAsB,YAAW,sBAAsB;IAEhE,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,kBAAkB;gBADlB,OAAO,EAAE,qBAAqB,EAC9B,kBAAkB,EAAE,mBAAmB;IAGpD,WAAW,IAAI,OAAO,CAAC,cAAc,CAAC;CAO7C"}
@@ -1,11 +1,15 @@
1
- import { getSettings } from '../../settings.service.js';
2
1
  export class AgentExecutorProvider {
3
2
  factory;
4
- constructor(factory) {
3
+ settingsRepository;
4
+ constructor(factory, settingsRepository) {
5
5
  this.factory = factory;
6
+ this.settingsRepository = settingsRepository;
6
7
  }
7
- getExecutor() {
8
- const settings = getSettings();
8
+ async getExecutor() {
9
+ const settings = await this.settingsRepository.load();
10
+ if (!settings) {
11
+ throw new Error('Settings not found. Please run initialization first.');
12
+ }
9
13
  return this.factory.createExecutor(settings.agent.type, settings.agent);
10
14
  }
11
15
  }
@@ -76,7 +76,7 @@ export class AgentRunnerService {
76
76
  }
77
77
  const settings = getSettings();
78
78
  const agentType = settings.agent.type;
79
- const executor = this.executorProvider.getExecutor();
79
+ const executor = await this.executorProvider.getExecutor();
80
80
  const runId = crypto.randomUUID();
81
81
  const threadId = crypto.randomUUID();
82
82
  const now = new Date().toISOString();
@@ -25,7 +25,7 @@ let StructuredAgentCallerService = class StructuredAgentCallerService {
25
25
  this.executorProvider = executorProvider;
26
26
  }
27
27
  async call(prompt, schema, options) {
28
- const executor = this.executorProvider.getExecutor();
28
+ const executor = await this.executorProvider.getExecutor();
29
29
  if (executor.supportsFeature(AgentFeature.structuredOutput)) {
30
30
  return this.callWithNativeSchema(executor, prompt, schema, options);
31
31
  }
@@ -133,7 +133,7 @@ export async function runWorker(args) {
133
133
  }
134
134
  else {
135
135
  log('Creating executor from configured agent settings...');
136
- executor = executorProvider.getExecutor();
136
+ executor = await executorProvider.getExecutor();
137
137
  }
138
138
  // Resolve merge node dependencies
139
139
  const gitPrService = container.resolve('IGitPrService');
@@ -36,5 +36,5 @@ export default function RootLayout({ children, }) {
36
36
  } catch (e) {}
37
37
  })();
38
38
  `,
39
- } }) }), _jsxs("body", { className: "min-h-screen antialiased", children: [_jsx(AppShell, { children: children }), _jsx(Toaster, {})] })] }));
39
+ } }) }), _jsxs("body", { className: "min-h-screen antialiased", children: [_jsx(AppShell, { children: children }), _jsx(Toaster, { position: "bottom-center" })] })] }));
40
40
  }
@@ -1 +1 @@
1
- {"version":3,"file":"feature-drawer-client.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/control-center-drawer/feature-drawer-client.tsx"],"names":[],"mappings":"AAyDA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAEhD,MAAM,WAAW,wBAAwB;IACvC,IAAI,EAAE,UAAU,CAAC;CAClB;AAED,wBAAgB,mBAAmB,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,EAAE,wBAAwB,2CA6mBlF"}
1
+ {"version":3,"file":"feature-drawer-client.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/control-center-drawer/feature-drawer-client.tsx"],"names":[],"mappings":"AAyDA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAGhD,MAAM,WAAW,wBAAwB;IACvC,IAAI,EAAE,UAAU,CAAC;CAClB;AAED,wBAAgB,mBAAmB,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,EAAE,wBAAwB,2CAykBlF"}
@@ -36,6 +36,7 @@ import { featureNodeStateConfig, lifecycleDisplayLabels } from '../../common/fea
36
36
  import { useFeatureActions } from '../../common/feature-drawer/use-feature-actions.js';
37
37
  import { resolveSseEventUpdates } from '../../common/feature-node/derive-feature-state.js';
38
38
  import { deriveFeatureViewType } from './drawer-view.js';
39
+ import { useArtifactFetch } from './use-artifact-fetch.js';
39
40
  export function FeatureDrawerClient({ view: initialView }) {
40
41
  const router = useRouter();
41
42
  const deleteSound = useSoundAction('delete');
@@ -56,6 +57,10 @@ export function FeatureDrawerClient({ view: initialView }) {
56
57
  const { events } = useAgentEventsContext();
57
58
  const processedCountRef = useRef(0);
58
59
  useEffect(() => {
60
+ // Clamp cursor if events were pruned
61
+ if (processedCountRef.current > events.length) {
62
+ processedCountRef.current = 0;
63
+ }
59
64
  if (!featureNode || events.length <= processedCountRef.current)
60
65
  return;
61
66
  const newEvents = events.slice(processedCountRef.current);
@@ -64,9 +69,9 @@ export function FeatureDrawerClient({ view: initialView }) {
64
69
  if (update.featureId !== featureNode.featureId)
65
70
  continue;
66
71
  // Trigger a server refresh to get the latest drawer view,
67
- // but skip when the user has unsaved changes or a rejection is in-flight
68
- // to avoid the refresh interfering with the reject handler's navigation.
69
- if (!isDirtyRef.current && !isRejectingRef.current)
72
+ // but skip when the drawer is closed, the user has unsaved changes,
73
+ // or a rejection is in-flight to avoid unnecessary refreshes.
74
+ if (isOpenRef.current && !isDirtyRef.current && !isRejectingRef.current)
70
75
  router.refresh();
71
76
  if (update.state !== undefined || update.lifecycle !== undefined) {
72
77
  // Optimistically update the node data AND re-derive the view type so the
@@ -94,6 +99,17 @@ export function FeatureDrawerClient({ view: initialView }) {
94
99
  // the close animation when the path no longer matches a feature route.
95
100
  const pathname = usePathname();
96
101
  const isOpen = pathname.startsWith('/feature/');
102
+ const isOpenRef = useRef(isOpen);
103
+ const wasOpenRef = useRef(isOpen);
104
+ // When the drawer re-opens, force a server refresh so the view is always fresh.
105
+ // SSE skips router.refresh() while the drawer is closed, so data can go stale.
106
+ useEffect(() => {
107
+ if (isOpen && !wasOpenRef.current) {
108
+ router.refresh();
109
+ }
110
+ wasOpenRef.current = isOpen;
111
+ }, [isOpen, router]);
112
+ isOpenRef.current = isOpen;
97
113
  const onClose = useCallback(() => {
98
114
  router.push('/');
99
115
  }, [router]);
@@ -103,16 +119,12 @@ export function FeatureDrawerClient({ view: initialView }) {
103
119
  const [prdData, setPrdData] = useState(null);
104
120
  const [prdSelections, setPrdSelections] = useState({});
105
121
  const [prdDefaultSelections, setPrdDefaultSelections] = useState({});
106
- const [isLoadingPrd, setIsLoadingPrd] = useState(false);
107
122
  // ── Tech state ─────────────────────────────────────────────────────────
108
123
  const [techData, setTechData] = useState(null);
109
- const [isLoadingTech, setIsLoadingTech] = useState(false);
110
124
  // ── Product decisions state (for tech review Product tab) ─────────────
111
125
  const [techProductData, setTechProductData] = useState(undefined);
112
- const [isLoadingTechProduct, setIsLoadingTechProduct] = useState(false);
113
126
  // ── Merge state ────────────────────────────────────────────────────────
114
127
  const [mergeData, setMergeData] = useState(null);
115
- const [isLoadingMerge, setIsLoadingMerge] = useState(false);
116
128
  // ── Delete state ───────────────────────────────────────────────────────
117
129
  const [isDeleting, setIsDeleting] = useState(false);
118
130
  // ── Shared reject state ────────────────────────────────────────────────
@@ -125,130 +137,48 @@ export function FeatureDrawerClient({ view: initialView }) {
125
137
  }, [viewType]);
126
138
  // ── Data fetching ─────────────────────────────────────────────────────
127
139
  const prdFeatureId = view.type === 'prd-review' ? view.node.featureId : null;
128
- useEffect(() => {
140
+ const isLoadingPrd = useArtifactFetch(prdFeatureId, getFeatureArtifact, (result) => {
141
+ if (result.error) {
142
+ toast.error(result.error);
143
+ return;
144
+ }
145
+ if (result.questionnaire) {
146
+ setPrdData(result.questionnaire);
147
+ const defaults = {};
148
+ for (const q of result.questionnaire.questions) {
149
+ const recommended = q.options.find((o) => o.recommended);
150
+ if (recommended)
151
+ defaults[q.id] = recommended.id;
152
+ }
153
+ setPrdSelections(defaults);
154
+ setPrdDefaultSelections(defaults);
155
+ }
156
+ }, () => {
129
157
  setPrdSelections({});
130
158
  setPrdDefaultSelections({});
131
159
  setPrdData(null);
132
- if (!prdFeatureId)
133
- return;
134
- let cancelled = false;
135
- setIsLoadingPrd(true);
136
- getFeatureArtifact(prdFeatureId)
137
- .then((result) => {
138
- if (cancelled)
139
- return;
140
- if (result.error) {
141
- toast.error(result.error);
142
- return;
143
- }
144
- if (result.questionnaire) {
145
- setPrdData(result.questionnaire);
146
- const defaults = {};
147
- for (const q of result.questionnaire.questions) {
148
- const recommended = q.options.find((o) => o.recommended);
149
- if (recommended)
150
- defaults[q.id] = recommended.id;
151
- }
152
- setPrdSelections(defaults);
153
- setPrdDefaultSelections(defaults);
154
- }
155
- })
156
- .catch(() => {
157
- if (!cancelled)
158
- toast.error('Failed to load questionnaire');
159
- })
160
- .finally(() => {
161
- if (!cancelled)
162
- setIsLoadingPrd(false);
163
- });
164
- return () => {
165
- cancelled = true;
166
- };
167
- }, [prdFeatureId]);
160
+ }, 'Failed to load questionnaire');
168
161
  const techFeatureId = view.type === 'tech-review' ? view.node.featureId : null;
169
- useEffect(() => {
170
- setTechData(null);
171
- if (!techFeatureId)
162
+ const isLoadingTech = useArtifactFetch(techFeatureId, getResearchArtifact, (result) => {
163
+ if (result.error) {
164
+ toast.error(result.error);
172
165
  return;
173
- let cancelled = false;
174
- setIsLoadingTech(true);
175
- getResearchArtifact(techFeatureId)
176
- .then((result) => {
177
- if (cancelled)
178
- return;
179
- if (result.error) {
180
- toast.error(result.error);
181
- return;
182
- }
183
- if (result.techDecisions)
184
- setTechData(result.techDecisions);
185
- })
186
- .catch(() => {
187
- if (!cancelled)
188
- toast.error('Failed to load tech decisions');
189
- })
190
- .finally(() => {
191
- if (!cancelled)
192
- setIsLoadingTech(false);
193
- });
194
- return () => {
195
- cancelled = true;
196
- };
197
- }, [techFeatureId]);
198
- useEffect(() => {
199
- setTechProductData(undefined);
200
- if (!techFeatureId)
201
- return;
202
- let cancelled = false;
203
- setIsLoadingTechProduct(true);
204
- getFeatureArtifact(techFeatureId)
205
- .then((result) => {
206
- if (cancelled)
207
- return;
208
- if (result.productDecisions) {
209
- setTechProductData(result.productDecisions);
210
- }
211
- })
212
- .catch(() => {
213
- // Silent failure — the product tab is supplementary
214
- })
215
- .finally(() => {
216
- if (!cancelled)
217
- setIsLoadingTechProduct(false);
218
- });
219
- return () => {
220
- cancelled = true;
221
- };
222
- }, [techFeatureId]);
166
+ }
167
+ if (result.techDecisions)
168
+ setTechData(result.techDecisions);
169
+ }, () => setTechData(null), 'Failed to load tech decisions');
170
+ const isLoadingTechProduct = useArtifactFetch(techFeatureId, getFeatureArtifact, (result) => {
171
+ if (result.productDecisions)
172
+ setTechProductData(result.productDecisions);
173
+ }, () => setTechProductData(undefined));
223
174
  const mergeFeatureId = view.type === 'merge-review' ? view.node.featureId : null;
224
- useEffect(() => {
225
- setMergeData(null);
226
- if (!mergeFeatureId)
175
+ const isLoadingMerge = useArtifactFetch(mergeFeatureId, getMergeReviewData, (result) => {
176
+ if ('error' in result) {
177
+ toast.error(result.error);
227
178
  return;
228
- let cancelled = false;
229
- setIsLoadingMerge(true);
230
- getMergeReviewData(mergeFeatureId)
231
- .then((result) => {
232
- if (cancelled)
233
- return;
234
- if ('error' in result) {
235
- toast.error(result.error);
236
- return;
237
- }
238
- setMergeData(result);
239
- })
240
- .catch(() => {
241
- if (!cancelled)
242
- toast.error('Failed to load merge review data');
243
- })
244
- .finally(() => {
245
- if (!cancelled)
246
- setIsLoadingMerge(false);
247
- });
248
- return () => {
249
- cancelled = true;
250
- };
251
- }, [mergeFeatureId]);
179
+ }
180
+ setMergeData(result);
181
+ }, () => setMergeData(null), 'Failed to load merge review data');
252
182
  // ── Close guard ──────────────────────────────────────────────────────
253
183
  const isChatDirty = chatInput.trim().length > 0;
254
184
  const isPrdDirty = view.type === 'prd-review' &&
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Generic hook for fetching drawer artifact data when a feature ID changes.
3
+ * Handles loading state, cancellation on unmount/re-fetch, and error toasting.
4
+ *
5
+ * @param featureId - The feature ID to fetch for, or null to reset.
6
+ * @param fetcher - Async function that fetches the artifact data.
7
+ * @param onSuccess - Called with the fetch result when successful and not cancelled.
8
+ * @param onReset - Called immediately when featureId changes (before fetching).
9
+ * @param errorMessage - Optional toast message shown on fetch failure.
10
+ * @returns Whether the fetch is currently in progress.
11
+ */
12
+ export declare function useArtifactFetch<TResult>(featureId: string | null, fetcher: (id: string) => Promise<TResult>, onSuccess: (result: TResult) => void, onReset: () => void, errorMessage?: string): boolean;
13
+ //# sourceMappingURL=use-artifact-fetch.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-artifact-fetch.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/control-center-drawer/use-artifact-fetch.ts"],"names":[],"mappings":"AAKA;;;;;;;;;;GAUG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EACtC,SAAS,EAAE,MAAM,GAAG,IAAI,EACxB,OAAO,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,EACzC,SAAS,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,IAAI,EACpC,OAAO,EAAE,MAAM,IAAI,EACnB,YAAY,CAAC,EAAE,MAAM,GACpB,OAAO,CAiCT"}
@@ -0,0 +1,46 @@
1
+ 'use client';
2
+ import { useState, useEffect, useRef } from 'react';
3
+ import { toast } from 'sonner';
4
+ /**
5
+ * Generic hook for fetching drawer artifact data when a feature ID changes.
6
+ * Handles loading state, cancellation on unmount/re-fetch, and error toasting.
7
+ *
8
+ * @param featureId - The feature ID to fetch for, or null to reset.
9
+ * @param fetcher - Async function that fetches the artifact data.
10
+ * @param onSuccess - Called with the fetch result when successful and not cancelled.
11
+ * @param onReset - Called immediately when featureId changes (before fetching).
12
+ * @param errorMessage - Optional toast message shown on fetch failure.
13
+ * @returns Whether the fetch is currently in progress.
14
+ */
15
+ export function useArtifactFetch(featureId, fetcher, onSuccess, onReset, errorMessage) {
16
+ const [isLoading, setIsLoading] = useState(false);
17
+ // Use refs to avoid stale callbacks in the effect without triggering re-runs.
18
+ const onSuccessRef = useRef(onSuccess);
19
+ const onResetRef = useRef(onReset);
20
+ onSuccessRef.current = onSuccess;
21
+ onResetRef.current = onReset;
22
+ useEffect(() => {
23
+ onResetRef.current();
24
+ if (!featureId)
25
+ return;
26
+ let cancelled = false;
27
+ setIsLoading(true);
28
+ fetcher(featureId)
29
+ .then((result) => {
30
+ if (!cancelled)
31
+ onSuccessRef.current(result);
32
+ })
33
+ .catch(() => {
34
+ if (!cancelled && errorMessage)
35
+ toast.error(errorMessage);
36
+ })
37
+ .finally(() => {
38
+ if (!cancelled)
39
+ setIsLoading(false);
40
+ });
41
+ return () => {
42
+ cancelled = true;
43
+ };
44
+ }, [featureId, fetcher, errorMessage]);
45
+ return isLoading;
46
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"use-feature-actions.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/feature-drawer/use-feature-actions.ts"],"names":[],"mappings":"AAOA,MAAM,WAAW,mBAAmB;IAClC,cAAc,EAAE,MAAM,CAAC;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,mBAAmB;IAClC,SAAS,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/B,WAAW,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IACjC,eAAe,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IACrC,UAAU,EAAE,OAAO,CAAC;IACpB,YAAY,EAAE,OAAO,CAAC;IACtB,YAAY,EAAE,OAAO,CAAC;IACtB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B;AAID,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,mBAAmB,GAAG,IAAI,GAAG,mBAAmB,CA+GxF"}
1
+ {"version":3,"file":"use-feature-actions.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/feature-drawer/use-feature-actions.ts"],"names":[],"mappings":"AAOA,MAAM,WAAW,mBAAmB;IAClC,cAAc,EAAE,MAAM,CAAC;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,mBAAmB;IAClC,SAAS,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/B,WAAW,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IACjC,eAAe,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IACrC,UAAU,EAAE,OAAO,CAAC;IACpB,YAAY,EAAE,OAAO,CAAC;IACtB,YAAY,EAAE,OAAO,CAAC;IACtB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B;AAID,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,mBAAmB,GAAG,IAAI,GAAG,mBAAmB,CA8GxF"}
@@ -14,18 +14,15 @@ export function useFeatureActions(input) {
14
14
  const ideTimerRef = useRef(null);
15
15
  const shellTimerRef = useRef(null);
16
16
  const specsTimerRef = useRef(null);
17
- // Clear timers on unmount
17
+ // Clear timers on unmount — read .current inside cleanup so we get the
18
+ // actual timer value at teardown time, not the always-null value at mount.
18
19
  useEffect(() => {
19
- const ideTimer = ideTimerRef.current;
20
- const shellTimer = shellTimerRef.current;
21
- const specsTimer = specsTimerRef.current;
20
+ const refs = [ideTimerRef, shellTimerRef, specsTimerRef];
22
21
  return () => {
23
- if (ideTimer)
24
- clearTimeout(ideTimer);
25
- if (shellTimer)
26
- clearTimeout(shellTimer);
27
- if (specsTimer)
28
- clearTimeout(specsTimer);
22
+ for (const ref of refs) {
23
+ if (ref.current)
24
+ clearTimeout(ref.current);
25
+ }
29
26
  };
30
27
  }, []);
31
28
  const performAction = useCallback(async (action, setLoading, setError, timerRef, isLoading) => {
@@ -1 +1 @@
1
- {"version":3,"file":"use-repository-actions.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/repository-node/use-repository-actions.ts"],"names":[],"mappings":"AAOA,MAAM,WAAW,sBAAsB;IACrC,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,sBAAsB;IACrC,SAAS,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/B,WAAW,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IACjC,UAAU,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAChC,UAAU,EAAE,OAAO,CAAC;IACpB,YAAY,EAAE,OAAO,CAAC;IACtB,aAAa,EAAE,OAAO,CAAC;IACvB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B;AAID,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,sBAAsB,GAAG,IAAI,GAAG,sBAAsB,CAkIjG"}
1
+ {"version":3,"file":"use-repository-actions.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/repository-node/use-repository-actions.ts"],"names":[],"mappings":"AAOA,MAAM,WAAW,sBAAsB;IACrC,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,sBAAsB;IACrC,SAAS,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/B,WAAW,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IACjC,UAAU,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAChC,UAAU,EAAE,OAAO,CAAC;IACpB,YAAY,EAAE,OAAO,CAAC;IACtB,aAAa,EAAE,OAAO,CAAC;IACvB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B;AAID,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,sBAAsB,GAAG,IAAI,GAAG,sBAAsB,CAyGjG"}
@@ -16,28 +16,27 @@ export function useRepositoryActions(input) {
16
16
  const folderTimerRef = useRef(null);
17
17
  // Clear timers on unmount
18
18
  useEffect(() => {
19
- const ideTimer = ideTimerRef.current;
20
- const shellTimer = shellTimerRef.current;
21
- const folderTimer = folderTimerRef.current;
19
+ const ideRef = ideTimerRef;
20
+ const shellRef = shellTimerRef;
21
+ const folderRef = folderTimerRef;
22
22
  return () => {
23
- if (ideTimer)
24
- clearTimeout(ideTimer);
25
- if (shellTimer)
26
- clearTimeout(shellTimer);
27
- if (folderTimer)
28
- clearTimeout(folderTimer);
23
+ if (ideRef.current)
24
+ clearTimeout(ideRef.current);
25
+ if (shellRef.current)
26
+ clearTimeout(shellRef.current);
27
+ if (folderRef.current)
28
+ clearTimeout(folderRef.current);
29
29
  };
30
30
  }, []);
31
- const performToolbarAction = useCallback(async (action, setLoading, setError, timerRef, isLoading) => {
31
+ const performAction = useCallback(async (action, setLoading, setError, timerRef, isLoading) => {
32
32
  if (!input || isLoading)
33
33
  return;
34
- // Clear any existing timer
35
34
  if (timerRef.current)
36
35
  clearTimeout(timerRef.current);
37
36
  setLoading(true);
38
37
  setError(null);
39
38
  try {
40
- const result = await action({ repositoryPath: input.repositoryPath });
39
+ const result = await action();
41
40
  if (!result.success) {
42
41
  const errorMessage = result.error ?? 'An unexpected error occurred';
43
42
  setError(errorMessage);
@@ -53,33 +52,9 @@ export function useRepositoryActions(input) {
53
52
  setLoading(false);
54
53
  }
55
54
  }, [input]);
56
- const performFolderAction = useCallback(async (action, setLoading, setError, timerRef, isLoading) => {
57
- if (!input || isLoading)
58
- return;
59
- if (timerRef.current)
60
- clearTimeout(timerRef.current);
61
- setLoading(true);
62
- setError(null);
63
- try {
64
- const result = await action(input.repositoryPath);
65
- if (!result.success) {
66
- const errorMessage = result.error ?? 'An unexpected error occurred';
67
- setError(errorMessage);
68
- timerRef.current = setTimeout(() => setError(null), ERROR_CLEAR_DELAY);
69
- }
70
- }
71
- catch (err) {
72
- const errorMessage = err instanceof Error ? err.message : 'An unexpected error occurred';
73
- setError(errorMessage);
74
- timerRef.current = setTimeout(() => setError(null), ERROR_CLEAR_DELAY);
75
- }
76
- finally {
77
- setLoading(false);
78
- }
79
- }, [input]);
80
- const handleOpenIde = useCallback(() => performToolbarAction(openIde, setIdeLoading, setIdeError, ideTimerRef, ideLoading), [performToolbarAction, ideLoading]);
81
- const handleOpenShell = useCallback(() => performToolbarAction(openShell, setShellLoading, setShellError, shellTimerRef, shellLoading), [performToolbarAction, shellLoading]);
82
- const handleOpenFolder = useCallback(() => performFolderAction(openFolder, setFolderLoading, setFolderError, folderTimerRef, folderLoading), [performFolderAction, folderLoading]);
55
+ const handleOpenIde = useCallback(() => performAction(() => openIde({ repositoryPath: input.repositoryPath }), setIdeLoading, setIdeError, ideTimerRef, ideLoading), [performAction, ideLoading, input]);
56
+ const handleOpenShell = useCallback(() => performAction(() => openShell({ repositoryPath: input.repositoryPath }), setShellLoading, setShellError, shellTimerRef, shellLoading), [performAction, shellLoading, input]);
57
+ const handleOpenFolder = useCallback(() => performAction(() => openFolder(input.repositoryPath), setFolderLoading, setFolderError, folderTimerRef, folderLoading), [performAction, folderLoading, input]);
83
58
  return {
84
59
  openInIde: handleOpenIde,
85
60
  openInShell: handleOpenShell,
@@ -18,19 +18,18 @@ export function ControlCenterInner({ initialNodes, initialEdges }) {
18
18
  const { nodes, edges, onNodesChange, handleConnect, handleAddRepository, handleDeleteFeature, handleDeleteRepository, createFeatureNode, setCallbacks, } = useControlCenterState(initialNodes, initialEdges);
19
19
  // Publish sidebar features to context whenever feature node data changes
20
20
  const { setFeatures: setSidebarFeatures } = useSidebarFeaturesContext();
21
+ const featureNodes = useMemo(() => nodes.filter((n) => n.type === 'featureNode'), [nodes]);
21
22
  const sidebarKey = useMemo(() => {
22
- return nodes
23
- .filter((n) => n.type === 'featureNode')
23
+ return featureNodes
24
24
  .map((n) => {
25
25
  const d = n.data;
26
- return `${d.featureId}:${d.state}:${d.runtime ?? ''}:${d.startedAt ?? ''}`;
26
+ return `${d.featureId}:${d.state}:${d.name}`;
27
27
  })
28
28
  .sort()
29
29
  .join(',');
30
- }, [nodes]);
30
+ }, [featureNodes]);
31
31
  useEffect(() => {
32
- const sidebarItems = nodes
33
- .filter((n) => n.type === 'featureNode')
32
+ const sidebarItems = featureNodes
34
33
  .map((n) => {
35
34
  const d = n.data;
36
35
  const status = mapNodeStateToSidebarStatus(d.state);
@@ -46,7 +45,7 @@ export function ControlCenterInner({ initialNodes, initialEdges }) {
46
45
  })
47
46
  .filter(Boolean);
48
47
  setSidebarFeatures(sidebarItems);
49
- }, [sidebarKey, nodes, setSidebarFeatures]);
48
+ }, [sidebarKey, featureNodes, setSidebarFeatures]);
50
49
  // ── URL-based navigation handlers ────────────────────────────────────
51
50
  const handleNodeClick = useCallback((_event, node) => {
52
51
  if (node.type === 'featureNode') {
@@ -1 +1 @@
1
- {"version":3,"file":"use-control-center-state.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/features/control-center/use-control-center-state.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAClE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AACxE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,qCAAqC,CAAC;AAC9E,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uCAAuC,CAAC;AAC5E,OAAO,EAGL,KAAK,eAAe,EACrB,MAAM,yBAAyB,CAAC;AAWjC,OAAO,EAAiB,KAAK,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAG7E,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,cAAc,EAAE,CAAC;IACxB,KAAK,EAAE,IAAI,EAAE,CAAC;IACd,aAAa,EAAE,CAAC,OAAO,EAAE,UAAU,CAAC,cAAc,CAAC,EAAE,KAAK,IAAI,CAAC;IAC/D,aAAa,EAAE,CAAC,UAAU,EAAE,UAAU,KAAK,IAAI,CAAC;IAChD,mBAAmB,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAC5C,YAAY,EAAE,CAAC,SAAS,EAAE,eAAe,KAAK,IAAI,CAAC;IACnD,mBAAmB,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IACjD,sBAAsB,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAChE,iBAAiB,EAAE,CACjB,YAAY,EAAE,MAAM,GAAG,IAAI,EAC3B,YAAY,CAAC,EAAE,OAAO,CAAC,eAAe,CAAC,EACvC,QAAQ,CAAC,EAAE,MAAM,KACd,MAAM,CAAC;IACZ,wDAAwD;IACxD,wBAAwB,EAAE,CAAC,aAAa,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,CAAC;IACxE,gDAAgD;IAChD,iBAAiB,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,kBAAkB,GAAG,SAAS,CAAC;IACtE,0EAA0E;IAC1E,YAAY,EAAE,CAAC,SAAS,EAAE,cAAc,KAAK,IAAI,CAAC;CACnD;AAOD,wBAAgB,qBAAqB,CACnC,YAAY,EAAE,cAAc,EAAE,EAC9B,YAAY,EAAE,IAAI,EAAE,GACnB,kBAAkB,CA+UpB"}
1
+ {"version":3,"file":"use-control-center-state.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/features/control-center/use-control-center-state.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAClE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AACxE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,qCAAqC,CAAC;AAC9E,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uCAAuC,CAAC;AAC5E,OAAO,EAGL,KAAK,eAAe,EACrB,MAAM,yBAAyB,CAAC;AAcjC,OAAO,EAAiB,KAAK,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAM7E,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,cAAc,EAAE,CAAC;IACxB,KAAK,EAAE,IAAI,EAAE,CAAC;IACd,aAAa,EAAE,CAAC,OAAO,EAAE,UAAU,CAAC,cAAc,CAAC,EAAE,KAAK,IAAI,CAAC;IAC/D,aAAa,EAAE,CAAC,UAAU,EAAE,UAAU,KAAK,IAAI,CAAC;IAChD,mBAAmB,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAC5C,YAAY,EAAE,CAAC,SAAS,EAAE,eAAe,KAAK,IAAI,CAAC;IACnD,mBAAmB,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IACjD,sBAAsB,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAChE,iBAAiB,EAAE,CACjB,YAAY,EAAE,MAAM,GAAG,IAAI,EAC3B,YAAY,CAAC,EAAE,OAAO,CAAC,eAAe,CAAC,EACvC,QAAQ,CAAC,EAAE,MAAM,KACd,MAAM,CAAC;IACZ,wDAAwD;IACxD,wBAAwB,EAAE,CAAC,aAAa,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,CAAC;IACxE,gDAAgD;IAChD,iBAAiB,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,kBAAkB,GAAG,SAAS,CAAC;IACtE,0EAA0E;IAC1E,YAAY,EAAE,CAAC,SAAS,EAAE,cAAc,KAAK,IAAI,CAAC;CACnD;AAOD,wBAAgB,qBAAqB,CACnC,YAAY,EAAE,cAAc,EAAE,EAC9B,YAAY,EAAE,IAAI,EAAE,GACnB,kBAAkB,CAmXpB"}