@shepai/cli 1.95.0 → 1.96.0-pr281.fcbc0cd

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 (264) hide show
  1. package/README.md +132 -348
  2. package/apis/json-schema/Feature.yaml +1 -1
  3. package/apis/json-schema/SdlcLifecycle.yaml +1 -0
  4. package/dist/packages/core/src/application/ports/output/repositories/feature-repository.interface.d.ts +16 -4
  5. package/dist/packages/core/src/application/ports/output/repositories/feature-repository.interface.d.ts.map +1 -1
  6. package/dist/packages/core/src/application/use-cases/features/delete-feature.use-case.d.ts +17 -12
  7. package/dist/packages/core/src/application/use-cases/features/delete-feature.use-case.d.ts.map +1 -1
  8. package/dist/packages/core/src/application/use-cases/features/delete-feature.use-case.js +64 -31
  9. package/dist/packages/core/src/application/use-cases/settings/complete-web-onboarding.use-case.d.ts +19 -0
  10. package/dist/packages/core/src/application/use-cases/settings/complete-web-onboarding.use-case.d.ts.map +1 -0
  11. package/dist/packages/core/src/application/use-cases/settings/complete-web-onboarding.use-case.js +52 -0
  12. package/dist/packages/core/src/application/use-cases/settings/index.d.ts +2 -0
  13. package/dist/packages/core/src/application/use-cases/settings/index.d.ts.map +1 -1
  14. package/dist/packages/core/src/application/use-cases/settings/index.js +1 -0
  15. package/dist/packages/core/src/domain/generated/output.d.ts +3 -2
  16. package/dist/packages/core/src/domain/generated/output.d.ts.map +1 -1
  17. package/dist/packages/core/src/domain/generated/output.js +1 -0
  18. package/dist/packages/core/src/infrastructure/di/container.d.ts.map +1 -1
  19. package/dist/packages/core/src/infrastructure/di/container.js +5 -0
  20. package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/feature.mapper.d.ts +1 -0
  21. package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/feature.mapper.d.ts.map +1 -1
  22. package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/feature.mapper.js +4 -0
  23. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations.d.ts.map +1 -1
  24. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations.js +12 -0
  25. package/dist/packages/core/src/infrastructure/repositories/sqlite-feature.repository.d.ts +2 -0
  26. package/dist/packages/core/src/infrastructure/repositories/sqlite-feature.repository.d.ts.map +1 -1
  27. package/dist/packages/core/src/infrastructure/repositories/sqlite-feature.repository.js +13 -3
  28. package/dist/src/presentation/cli/commands/feat/ls.command.d.ts.map +1 -1
  29. package/dist/src/presentation/cli/commands/feat/ls.command.js +9 -2
  30. package/dist/src/presentation/cli/commands/feat/new.command.d.ts.map +1 -1
  31. package/dist/src/presentation/cli/commands/feat/new.command.js +9 -0
  32. package/dist/src/presentation/cli/index.js +0 -12
  33. package/dist/src/presentation/web/app/actions/agent-setup-flag.d.ts +6 -0
  34. package/dist/src/presentation/web/app/actions/agent-setup-flag.d.ts.map +1 -0
  35. package/dist/src/presentation/web/app/actions/agent-setup-flag.js +14 -0
  36. package/dist/src/presentation/web/app/actions/check-agent-tool.d.ts +11 -0
  37. package/dist/src/presentation/web/app/actions/check-agent-tool.d.ts.map +1 -0
  38. package/dist/src/presentation/web/app/actions/check-agent-tool.js +35 -0
  39. package/dist/src/presentation/web/app/actions/update-agent-and-model.d.ts.map +1 -1
  40. package/dist/src/presentation/web/app/actions/update-agent-and-model.js +6 -12
  41. package/dist/src/presentation/web/app/api/agent-events/route.d.ts.map +1 -1
  42. package/dist/src/presentation/web/app/api/agent-events/route.js +1 -0
  43. package/dist/src/presentation/web/components/common/control-center-drawer/feature-drawer-client.d.ts.map +1 -1
  44. package/dist/src/presentation/web/components/common/control-center-drawer/feature-drawer-client.js +5 -0
  45. package/dist/src/presentation/web/components/common/feature-node/derive-feature-state.d.ts.map +1 -1
  46. package/dist/src/presentation/web/components/common/feature-node/derive-feature-state.js +4 -0
  47. package/dist/src/presentation/web/components/common/feature-node/feature-node-state-config.d.ts +1 -1
  48. package/dist/src/presentation/web/components/common/feature-node/feature-node-state-config.d.ts.map +1 -1
  49. package/dist/src/presentation/web/components/common/feature-node/feature-node-state-config.js +11 -1
  50. package/dist/src/presentation/web/components/common/feature-node/feature-node.d.ts.map +1 -1
  51. package/dist/src/presentation/web/components/common/feature-node/feature-node.js +4 -4
  52. package/dist/src/presentation/web/components/common/feature-node/feature-node.stories.d.ts +1 -0
  53. package/dist/src/presentation/web/components/common/feature-node/feature-node.stories.d.ts.map +1 -1
  54. package/dist/src/presentation/web/components/common/feature-node/feature-node.stories.js +21 -0
  55. package/dist/src/presentation/web/components/features/control-center/control-center-empty-state.d.ts.map +1 -1
  56. package/dist/src/presentation/web/components/features/control-center/control-center-empty-state.js +20 -4
  57. package/dist/src/presentation/web/components/features/control-center/use-control-center-state.d.ts.map +1 -1
  58. package/dist/src/presentation/web/components/features/control-center/use-control-center-state.js +53 -16
  59. package/dist/src/presentation/web/components/features/control-center/welcome-agent-setup.d.ts +6 -0
  60. package/dist/src/presentation/web/components/features/control-center/welcome-agent-setup.d.ts.map +1 -0
  61. package/dist/src/presentation/web/components/features/control-center/welcome-agent-setup.js +222 -0
  62. package/dist/src/presentation/web/components/features/control-center/welcome-agent-setup.stories.d.ts +7 -0
  63. package/dist/src/presentation/web/components/features/control-center/welcome-agent-setup.stories.d.ts.map +1 -0
  64. package/dist/src/presentation/web/components/features/control-center/welcome-agent-setup.stories.js +20 -0
  65. package/dist/src/presentation/web/components/layouts/app-shell/app-shell.js +1 -1
  66. package/dist/src/presentation/web/hooks/sidebar-features-context.d.ts.map +1 -1
  67. package/dist/src/presentation/web/hooks/sidebar-features-context.js +1 -0
  68. package/dist/src/presentation/web/hooks/use-graph-state.d.ts.map +1 -1
  69. package/dist/src/presentation/web/hooks/use-graph-state.js +27 -0
  70. package/dist/tsconfig.build.tsbuildinfo +1 -1
  71. package/package.json +1 -1
  72. package/web/.next/BUILD_ID +1 -1
  73. package/web/.next/build-manifest.json +2 -2
  74. package/web/.next/fallback-build-manifest.json +2 -2
  75. package/web/.next/prerender-manifest.json +3 -3
  76. package/web/.next/required-server-files.js +3 -3
  77. package/web/.next/required-server-files.json +3 -3
  78. package/web/.next/server/app/(dashboard)/@drawer/create/page/server-reference-manifest.json +92 -62
  79. package/web/.next/server/app/(dashboard)/@drawer/create/page.js +2 -2
  80. package/web/.next/server/app/(dashboard)/@drawer/create/page.js.nft.json +1 -1
  81. package/web/.next/server/app/(dashboard)/@drawer/create/page_client-reference-manifest.js +1 -1
  82. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page/server-reference-manifest.json +102 -42
  83. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page.js +2 -2
  84. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page.js.nft.json +1 -1
  85. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page_client-reference-manifest.js +1 -1
  86. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page/server-reference-manifest.json +102 -42
  87. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js +2 -2
  88. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js.nft.json +1 -1
  89. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page_client-reference-manifest.js +1 -1
  90. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page/server-reference-manifest.json +88 -28
  91. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js +2 -2
  92. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js.nft.json +1 -1
  93. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  94. package/web/.next/server/app/(dashboard)/create/page/server-reference-manifest.json +92 -62
  95. package/web/.next/server/app/(dashboard)/create/page.js +2 -2
  96. package/web/.next/server/app/(dashboard)/create/page.js.nft.json +1 -1
  97. package/web/.next/server/app/(dashboard)/create/page_client-reference-manifest.js +1 -1
  98. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page/server-reference-manifest.json +102 -42
  99. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page.js +2 -2
  100. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page.js.nft.json +1 -1
  101. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page_client-reference-manifest.js +1 -1
  102. package/web/.next/server/app/(dashboard)/feature/[featureId]/page/server-reference-manifest.json +102 -42
  103. package/web/.next/server/app/(dashboard)/feature/[featureId]/page.js +2 -2
  104. package/web/.next/server/app/(dashboard)/feature/[featureId]/page.js.nft.json +1 -1
  105. package/web/.next/server/app/(dashboard)/feature/[featureId]/page_client-reference-manifest.js +1 -1
  106. package/web/.next/server/app/(dashboard)/page/server-reference-manifest.json +88 -28
  107. package/web/.next/server/app/(dashboard)/page.js +2 -2
  108. package/web/.next/server/app/(dashboard)/page.js.nft.json +1 -1
  109. package/web/.next/server/app/(dashboard)/page_client-reference-manifest.js +1 -1
  110. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page/server-reference-manifest.json +88 -28
  111. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js +2 -2
  112. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js.nft.json +1 -1
  113. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  114. package/web/.next/server/app/_global-error.html +2 -2
  115. package/web/.next/server/app/_global-error.rsc +1 -1
  116. package/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  117. package/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  118. package/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  119. package/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  120. package/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  121. package/web/.next/server/app/_not-found/page/server-reference-manifest.json +1 -1
  122. package/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  123. package/web/.next/server/app/api/attachments/preview/route.js.nft.json +1 -1
  124. package/web/.next/server/app/settings/page/server-reference-manifest.json +5 -5
  125. package/web/.next/server/app/settings/page.js.nft.json +1 -1
  126. package/web/.next/server/app/settings/page_client-reference-manifest.js +1 -1
  127. package/web/.next/server/app/skills/page/server-reference-manifest.json +6 -6
  128. package/web/.next/server/app/skills/page.js.nft.json +1 -1
  129. package/web/.next/server/app/skills/page_client-reference-manifest.js +1 -1
  130. package/web/.next/server/app/tools/page/server-reference-manifest.json +6 -6
  131. package/web/.next/server/app/tools/page.js.nft.json +1 -1
  132. package/web/.next/server/app/tools/page_client-reference-manifest.js +1 -1
  133. package/web/.next/server/app/version/page/server-reference-manifest.json +1 -1
  134. package/web/.next/server/app/version/page_client-reference-manifest.js +1 -1
  135. package/web/.next/server/chunks/403f9_next_dist_esm_build_templates_app-route_4d623b8e.js +1 -1
  136. package/web/.next/server/chunks/403f9_next_dist_esm_build_templates_app-route_4d623b8e.js.map +1 -1
  137. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js +1 -1
  138. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js.map +1 -1
  139. package/web/.next/server/chunks/ssr/7f428_lucide-react_dist_esm_icons_2b65878f._.js +3 -0
  140. package/web/.next/server/chunks/ssr/7f428_lucide-react_dist_esm_icons_2b65878f._.js.map +1 -0
  141. package/web/.next/server/chunks/ssr/7f428_lucide-react_dist_esm_icons_6ba7eb21._.js +3 -0
  142. package/web/.next/server/chunks/ssr/7f428_lucide-react_dist_esm_icons_6ba7eb21._.js.map +1 -0
  143. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_c757eb00.js +3 -0
  144. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_c757eb00.js.map +1 -0
  145. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_7eb49631.js +3 -0
  146. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_7eb49631.js.map +1 -0
  147. package/web/.next/server/chunks/ssr/[root-of-the-server]__11033878._.js +1 -1
  148. package/web/.next/server/chunks/ssr/[root-of-the-server]__11033878._.js.map +1 -1
  149. package/web/.next/server/chunks/ssr/{[root-of-the-server]__17143953._.js → [root-of-the-server]__19fb0bfe._.js} +2 -2
  150. package/web/.next/server/chunks/ssr/{[root-of-the-server]__5cc4752a._.js.map → [root-of-the-server]__19fb0bfe._.js.map} +1 -1
  151. package/web/.next/server/chunks/ssr/[root-of-the-server]__24dd0927._.js +4 -0
  152. package/web/.next/server/chunks/ssr/[root-of-the-server]__24dd0927._.js.map +1 -0
  153. package/web/.next/server/chunks/ssr/[root-of-the-server]__357d99f9._.js +1 -1
  154. package/web/.next/server/chunks/ssr/{[root-of-the-server]__45aad79d._.js → [root-of-the-server]__3d6f6b0e._.js} +2 -2
  155. package/web/.next/server/chunks/ssr/{[root-of-the-server]__17143953._.js.map → [root-of-the-server]__3d6f6b0e._.js.map} +1 -1
  156. package/web/.next/server/chunks/ssr/{[root-of-the-server]__5cc4752a._.js → [root-of-the-server]__42020c54._.js} +2 -2
  157. package/web/.next/server/chunks/ssr/{[root-of-the-server]__9de266fa._.js.map → [root-of-the-server]__42020c54._.js.map} +1 -1
  158. package/web/.next/server/chunks/ssr/[root-of-the-server]__5d87af2e._.js +1 -1
  159. package/web/.next/server/chunks/ssr/[root-of-the-server]__5d87af2e._.js.map +1 -1
  160. package/web/.next/server/chunks/ssr/[root-of-the-server]__7b49fcb3._.js +3 -0
  161. package/web/.next/server/chunks/ssr/[root-of-the-server]__7b49fcb3._.js.map +1 -0
  162. package/web/.next/server/chunks/ssr/[root-of-the-server]__845a9d2a._.js +1 -1
  163. package/web/.next/server/chunks/ssr/[root-of-the-server]__845a9d2a._.js.map +1 -1
  164. package/web/.next/server/chunks/ssr/[root-of-the-server]__89e8a5cc._.js +2 -2
  165. package/web/.next/server/chunks/ssr/[root-of-the-server]__89e8a5cc._.js.map +1 -1
  166. package/web/.next/server/chunks/ssr/{[root-of-the-server]__9de266fa._.js → [root-of-the-server]__9cb60e1e._.js} +2 -2
  167. package/web/.next/server/chunks/ssr/{[root-of-the-server]__45aad79d._.js.map → [root-of-the-server]__9cb60e1e._.js.map} +1 -1
  168. package/web/.next/server/chunks/ssr/[root-of-the-server]__aad040c0._.js +1 -1
  169. package/web/.next/server/chunks/ssr/[root-of-the-server]__aad040c0._.js.map +1 -1
  170. package/web/.next/server/chunks/ssr/[root-of-the-server]__fdc75809._.js +1 -1
  171. package/web/.next/server/chunks/ssr/[root-of-the-server]__fdc75809._.js.map +1 -1
  172. package/web/.next/server/chunks/ssr/_135edb9c._.js +1 -1
  173. package/web/.next/server/chunks/ssr/_135edb9c._.js.map +1 -1
  174. package/web/.next/server/chunks/ssr/_1bb131c4._.js.map +1 -1
  175. package/web/.next/server/chunks/ssr/_501b06da._.js +3 -0
  176. package/web/.next/server/chunks/ssr/_501b06da._.js.map +1 -0
  177. package/web/.next/server/chunks/ssr/_5e112f82._.js +3 -0
  178. package/web/.next/server/chunks/ssr/_5e112f82._.js.map +1 -0
  179. package/web/.next/server/chunks/ssr/_6e08ce21._.js +1 -1
  180. package/web/.next/server/chunks/ssr/_6e08ce21._.js.map +1 -1
  181. package/web/.next/server/chunks/ssr/{_3533fed7._.js → _7f1598ce._.js} +2 -2
  182. package/web/.next/server/chunks/ssr/_7f1598ce._.js.map +1 -0
  183. package/web/.next/server/chunks/ssr/_8dacd1e7._.js +1 -1
  184. package/web/.next/server/chunks/ssr/_8dacd1e7._.js.map +1 -1
  185. package/web/.next/server/chunks/ssr/{_c2399eb5._.js → _c1e8bc5a._.js} +2 -2
  186. package/web/.next/server/chunks/ssr/{_c2399eb5._.js.map → _c1e8bc5a._.js.map} +1 -1
  187. package/web/.next/server/chunks/ssr/_cc77a143._.js +1 -1
  188. package/web/.next/server/chunks/ssr/_cc77a143._.js.map +1 -1
  189. package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_settings_settings-page-client_tsx_6ed9d5f8._.js +1 -1
  190. package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_settings_settings-page-client_tsx_6ed9d5f8._.js.map +1 -1
  191. package/web/.next/server/chunks/ssr/src_presentation_web_3c53a23d._.js +5 -0
  192. package/web/.next/server/chunks/ssr/src_presentation_web_3c53a23d._.js.map +1 -0
  193. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_befd865a.js +3 -0
  194. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_befd865a.js.map +1 -0
  195. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_skills_page_actions_1fa8042e.js +1 -1
  196. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_skills_page_actions_1fa8042e.js.map +1 -1
  197. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_tools_page_actions_24684200.js +1 -1
  198. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_tools_page_actions_24684200.js.map +1 -1
  199. package/web/.next/server/chunks/ssr/src_presentation_web_components_bf50c527._.js +1 -1
  200. package/web/.next/server/chunks/ssr/src_presentation_web_components_bf50c527._.js.map +1 -1
  201. package/web/.next/server/chunks/ssr/src_presentation_web_components_de814675._.js +1 -1
  202. package/web/.next/server/chunks/ssr/src_presentation_web_components_de814675._.js.map +1 -1
  203. package/web/.next/server/chunks/ssr/src_presentation_web_components_e599bb8c._.js +1 -1
  204. package/web/.next/server/chunks/ssr/src_presentation_web_components_e599bb8c._.js.map +1 -1
  205. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js +1 -1
  206. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js.map +1 -1
  207. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_tools_tools-page-client_tsx_3d0aa70c._.js +1 -1
  208. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_tools_tools-page-client_tsx_3d0aa70c._.js.map +1 -1
  209. package/web/.next/server/chunks/ssr/src_presentation_web_ec8c7a4f._.js +5 -0
  210. package/web/.next/server/chunks/ssr/src_presentation_web_ec8c7a4f._.js.map +1 -0
  211. package/web/.next/server/pages/500.html +2 -2
  212. package/web/.next/server/server-reference-manifest.js +1 -1
  213. package/web/.next/server/server-reference-manifest.json +482 -242
  214. package/web/.next/static/chunks/0043b0813128e1ff.js +1 -0
  215. package/web/.next/static/chunks/158f9d833716f8e0.js +1 -0
  216. package/web/.next/static/chunks/{465f63a101981da8.js → 1e45f54397cd5d7f.js} +1 -1
  217. package/web/.next/static/chunks/{c4bbbfcfc008cba4.js → 275e1e0c565cc109.js} +1 -1
  218. package/web/.next/static/chunks/71d785d1de4b86f6.css +1 -0
  219. package/web/.next/static/chunks/7268e1087af4eaa0.js +1 -0
  220. package/web/.next/static/chunks/86a559935e43c119.js +1 -0
  221. package/web/.next/static/chunks/8bd300e88a189928.js +1 -0
  222. package/web/.next/static/chunks/{98767389c1aad0b2.js → 8d943a1a82db483d.js} +1 -1
  223. package/web/.next/static/chunks/a262fb8cb5f35ce3.js +1 -0
  224. package/web/.next/static/chunks/ae4e669485fb8d72.js +1 -0
  225. package/web/.next/static/chunks/b272ac93b52dceeb.js +1 -0
  226. package/web/.next/static/chunks/{f0bbc2f086d7d996.js → b42e2cd6fe3896c3.js} +2 -2
  227. package/web/.next/static/chunks/{59b988d41943386c.js → c4e8e94e8c2800b0.js} +1 -1
  228. package/web/.next/server/chunks/ssr/7f428_lucide-react_dist_esm_icons_81a06555._.js +0 -3
  229. package/web/.next/server/chunks/ssr/7f428_lucide-react_dist_esm_icons_81a06555._.js.map +0 -1
  230. package/web/.next/server/chunks/ssr/7f428_lucide-react_dist_esm_icons_rocket_1575cd4d.js +0 -3
  231. package/web/.next/server/chunks/ssr/7f428_lucide-react_dist_esm_icons_rocket_1575cd4d.js.map +0 -1
  232. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_da7eef33.js +0 -3
  233. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_da7eef33.js.map +0 -1
  234. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_0a9251aa.js +0 -3
  235. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_0a9251aa.js.map +0 -1
  236. package/web/.next/server/chunks/ssr/[root-of-the-server]__4be9a9bb._.js +0 -4
  237. package/web/.next/server/chunks/ssr/[root-of-the-server]__4be9a9bb._.js.map +0 -1
  238. package/web/.next/server/chunks/ssr/[root-of-the-server]__9dc40036._.js +0 -3
  239. package/web/.next/server/chunks/ssr/[root-of-the-server]__9dc40036._.js.map +0 -1
  240. package/web/.next/server/chunks/ssr/_3533fed7._.js.map +0 -1
  241. package/web/.next/server/chunks/ssr/_364346ad._.js +0 -3
  242. package/web/.next/server/chunks/ssr/_364346ad._.js.map +0 -1
  243. package/web/.next/server/chunks/ssr/_df15bd24._.js +0 -3
  244. package/web/.next/server/chunks/ssr/_df15bd24._.js.map +0 -1
  245. package/web/.next/server/chunks/ssr/_f50485a5._.js +0 -3
  246. package/web/.next/server/chunks/ssr/_f50485a5._.js.map +0 -1
  247. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_021a05f2.js +0 -3
  248. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_021a05f2.js.map +0 -1
  249. package/web/.next/server/chunks/ssr/src_presentation_web_c4348b8a._.js +0 -5
  250. package/web/.next/server/chunks/ssr/src_presentation_web_c4348b8a._.js.map +0 -1
  251. package/web/.next/server/chunks/ssr/src_presentation_web_e4510d10._.js +0 -5
  252. package/web/.next/server/chunks/ssr/src_presentation_web_e4510d10._.js.map +0 -1
  253. package/web/.next/static/chunks/2536dce61f55daad.js +0 -1
  254. package/web/.next/static/chunks/35b142afe3405da9.js +0 -1
  255. package/web/.next/static/chunks/3c68b85c9dd7f200.js +0 -1
  256. package/web/.next/static/chunks/42040482bd2ec9aa.js +0 -1
  257. package/web/.next/static/chunks/490407527f8234cb.js +0 -1
  258. package/web/.next/static/chunks/6d61b6eaca9f925a.js +0 -1
  259. package/web/.next/static/chunks/8ec10587d1c608a2.css +0 -1
  260. package/web/.next/static/chunks/d9247a52ae260218.js +0 -1
  261. package/web/.next/static/chunks/eb981f9e02a74f15.js +0 -1
  262. /package/web/.next/static/{AT8BmALAnMpq68TlqG9FY → mF-tWwVmRA3ztS3klC9lR}/_buildManifest.js +0 -0
  263. /package/web/.next/static/{AT8BmALAnMpq68TlqG9FY → mF-tWwVmRA3ztS3klC9lR}/_clientMiddlewareManifest.json +0 -0
  264. /package/web/.next/static/{AT8BmALAnMpq68TlqG9FY → mF-tWwVmRA3ztS3klC9lR}/_ssgManifest.js +0 -0
@@ -457,6 +457,18 @@ WHERE repository_path NOT IN (SELECT path FROM repositories WHERE path IS NOT NU
457
457
  }
458
458
  },
459
459
  },
460
+ {
461
+ version: 29,
462
+ // Migration 029: Add soft delete support to features table.
463
+ sql: '',
464
+ handler: (db) => {
465
+ const columns = db.pragma('table_info(features)');
466
+ if (!columns.some((c) => c.name === 'deleted_at')) {
467
+ db.exec('ALTER TABLE features ADD COLUMN deleted_at INTEGER');
468
+ db.exec('CREATE INDEX IF NOT EXISTS idx_features_deleted_at ON features(deleted_at)');
469
+ }
470
+ },
471
+ },
460
472
  ];
461
473
  /**
462
474
  * The latest schema version (highest migration version number).
@@ -3,6 +3,7 @@
3
3
  *
4
4
  * Implements IFeatureRepository using SQLite database.
5
5
  * Uses prepared statements to prevent SQL injection.
6
+ * Excludes soft-deleted features (deleted_at IS NOT NULL) from queries by default.
6
7
  */
7
8
  import type Database from 'better-sqlite3';
8
9
  import type { IFeatureRepository, FeatureListFilters } from '../../application/ports/output/repositories/feature-repository.interface.js';
@@ -22,5 +23,6 @@ export declare class SQLiteFeatureRepository implements IFeatureRepository {
22
23
  findByParentId(parentId: string): Promise<Feature[]>;
23
24
  update(feature: Feature): Promise<void>;
24
25
  delete(id: string): Promise<void>;
26
+ softDelete(id: string): Promise<void>;
25
27
  }
26
28
  //# sourceMappingURL=sqlite-feature.repository.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"sqlite-feature.repository.d.ts","sourceRoot":"","sources":["../../../../../../packages/core/src/infrastructure/repositories/sqlite-feature.repository.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAE3C,OAAO,KAAK,EACV,kBAAkB,EAClB,kBAAkB,EACnB,MAAM,6EAA6E,CAAC;AACrF,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,kCAAkC,CAAC;AAOhE;;;GAGG;AACH,qBACa,uBAAwB,YAAW,kBAAkB;IACpD,OAAO,CAAC,QAAQ,CAAC,EAAE;gBAAF,EAAE,EAAE,QAAQ,CAAC,QAAQ;IAE5C,MAAM,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IA8BvC,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC;IAW7C,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC;IAcvD,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC;IAWzE,IAAI,CAAC,OAAO,CAAC,EAAE,kBAAkB,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;IAqBtD,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;IAQpD,MAAM,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAuCvC,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAIxC"}
1
+ {"version":3,"file":"sqlite-feature.repository.d.ts","sourceRoot":"","sources":["../../../../../../packages/core/src/infrastructure/repositories/sqlite-feature.repository.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAE3C,OAAO,KAAK,EACV,kBAAkB,EAClB,kBAAkB,EACnB,MAAM,6EAA6E,CAAC;AACrF,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,kCAAkC,CAAC;AAOhE;;;GAGG;AACH,qBACa,uBAAwB,YAAW,kBAAkB;IACpD,OAAO,CAAC,QAAQ,CAAC,EAAE;gBAAF,EAAE,EAAE,QAAQ,CAAC,QAAQ;IAE5C,MAAM,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IA8BvC,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC;IAW7C,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC;IAcvD,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC;IAazE,IAAI,CAAC,OAAO,CAAC,EAAE,kBAAkB,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;IAyBtD,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;IAQpD,MAAM,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAwCvC,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAKjC,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAK5C"}
@@ -3,6 +3,7 @@
3
3
  *
4
4
  * Implements IFeatureRepository using SQLite database.
5
5
  * Uses prepared statements to prevent SQL injection.
6
+ * Excludes soft-deleted features (deleted_at IS NOT NULL) from queries by default.
6
7
  */
7
8
  var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
8
9
  var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
@@ -52,7 +53,7 @@ let SQLiteFeatureRepository = class SQLiteFeatureRepository {
52
53
  stmt.run(row);
53
54
  }
54
55
  async findById(id) {
55
- const stmt = this.db.prepare('SELECT * FROM features WHERE id = ?');
56
+ const stmt = this.db.prepare('SELECT * FROM features WHERE id = ? AND deleted_at IS NULL');
56
57
  const row = stmt.get(id);
57
58
  if (!row) {
58
59
  return null;
@@ -60,7 +61,7 @@ let SQLiteFeatureRepository = class SQLiteFeatureRepository {
60
61
  return fromDatabase(row);
61
62
  }
62
63
  async findByIdPrefix(prefix) {
63
- const stmt = this.db.prepare('SELECT * FROM features WHERE id LIKE ?');
64
+ const stmt = this.db.prepare('SELECT * FROM features WHERE id LIKE ? AND deleted_at IS NULL');
64
65
  const rows = stmt.all(`${prefix}%`);
65
66
  if (rows.length === 0)
66
67
  return null;
@@ -70,7 +71,7 @@ let SQLiteFeatureRepository = class SQLiteFeatureRepository {
70
71
  return fromDatabase(rows[0]);
71
72
  }
72
73
  async findBySlug(slug, repositoryPath) {
73
- const stmt = this.db.prepare('SELECT * FROM features WHERE slug = ? AND repository_path = ?');
74
+ const stmt = this.db.prepare('SELECT * FROM features WHERE slug = ? AND repository_path = ? AND deleted_at IS NULL');
74
75
  const row = stmt.get(slug, repositoryPath);
75
76
  if (!row) {
76
77
  return null;
@@ -80,6 +81,9 @@ let SQLiteFeatureRepository = class SQLiteFeatureRepository {
80
81
  async list(filters) {
81
82
  const conditions = [];
82
83
  const params = [];
84
+ if (!filters?.includeDeleted) {
85
+ conditions.push('deleted_at IS NULL');
86
+ }
83
87
  if (filters?.repositoryPath) {
84
88
  conditions.push('repository_path = ?');
85
89
  params.push(filters.repositoryPath);
@@ -129,6 +133,7 @@ let SQLiteFeatureRepository = class SQLiteFeatureRepository {
129
133
  ci_fix_attempts = @ci_fix_attempts,
130
134
  ci_fix_history = @ci_fix_history,
131
135
  parent_id = @parent_id,
136
+ deleted_at = @deleted_at,
132
137
  updated_at = @updated_at
133
138
  WHERE id = @id
134
139
  `);
@@ -138,6 +143,11 @@ let SQLiteFeatureRepository = class SQLiteFeatureRepository {
138
143
  const stmt = this.db.prepare('DELETE FROM features WHERE id = ?');
139
144
  stmt.run(id);
140
145
  }
146
+ async softDelete(id) {
147
+ const now = Date.now();
148
+ const stmt = this.db.prepare('UPDATE features SET deleted_at = ?, updated_at = ? WHERE id = ?');
149
+ stmt.run(now, now, id);
150
+ }
141
151
  };
142
152
  SQLiteFeatureRepository = __decorate([
143
153
  injectable(),
@@ -1 +1 @@
1
- {"version":3,"file":"ls.command.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/cli/commands/feat/ls.command.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAGH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAoKpC,wBAAgB,eAAe,IAAI,OAAO,CAgGzC"}
1
+ {"version":3,"file":"ls.command.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/cli/commands/feat/ls.command.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAGH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAyKpC,wBAAgB,eAAe,IAAI,OAAO,CAsGzC"}
@@ -48,6 +48,9 @@ const STATUS_PRIORITY = {
48
48
  */
49
49
  function formatStatus(feature, run) {
50
50
  // Blocked features show "Waiting" — the parent relationship is conveyed by tree indentation
51
+ if (feature.lifecycle === 'Deleting') {
52
+ return `${colors.muted(symbols.spinner[0])} ${colors.muted('Deleting')}`;
53
+ }
51
54
  if (feature.lifecycle === 'Blocked') {
52
55
  return `${colors.warning(symbols.dotEmpty)} ${colors.warning('Blocked')}`;
53
56
  }
@@ -161,13 +164,17 @@ export function createLsCommand() {
161
164
  return new Command('ls')
162
165
  .description('List features')
163
166
  .option('-r, --repo <path>', 'Filter by repository path')
167
+ .option('--include-deleted', 'Include soft-deleted features')
164
168
  .action(async (options) => {
165
169
  try {
166
170
  const useCase = container.resolve(ListFeaturesUseCase);
167
171
  const runRepo = container.resolve('IAgentRunRepository');
168
172
  const phaseRepo = container.resolve('IPhaseTimingRepository');
169
- const filters = options.repo ? { repositoryPath: options.repo } : undefined;
170
- const features = await useCase.execute(filters);
173
+ const filters = {
174
+ ...(options.repo && { repositoryPath: options.repo }),
175
+ ...(options.includeDeleted && { includeDeleted: true }),
176
+ };
177
+ const features = await useCase.execute(Object.keys(filters).length > 0 ? filters : undefined);
171
178
  // Load agent runs and phase timings for all features in parallel
172
179
  const [runs, timings] = await Promise.all([
173
180
  Promise.all(features.map((f) => f.agentRunId ? runRepo.findById(f.agentRunId) : Promise.resolve(null))),
@@ -1 +1 @@
1
- {"version":3,"file":"new.command.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/cli/commands/feat/new.command.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA0DpC;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,OAAO,CAgI1C"}
1
+ {"version":3,"file":"new.command.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/cli/commands/feat/new.command.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA4DpC;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,OAAO,CAwI1C"}
@@ -19,6 +19,8 @@ import { SdlcLifecycle } from '../../../../../packages/core/src/domain/generated
19
19
  import { colors, messages, spinner } from '../../ui/index.js';
20
20
  import { getShepHomeDir } from '../../../../../packages/core/src/infrastructure/services/filesystem/shep-directory.service.js';
21
21
  import { getSettings, hasSettings } from '../../../../../packages/core/src/infrastructure/services/settings.service.js';
22
+ import { CheckOnboardingStatusUseCase } from '../../../../../packages/core/src/application/use-cases/settings/check-onboarding-status.use-case.js';
23
+ import { onboardingWizard } from '../../../tui/wizards/onboarding/onboarding.wizard.js';
22
24
  /** Commander collect pattern for repeatable options. */
23
25
  function collect(value, previous) {
24
26
  return [...previous, value];
@@ -58,6 +60,13 @@ export function createNewCommand() {
58
60
  .option('--attach <path>', 'Attach a file (repeatable)', collect, [])
59
61
  .action(async (description, options) => {
60
62
  try {
63
+ // First-run onboarding gate — only for interactive terminals
64
+ if (process.stdin.isTTY) {
65
+ const { isComplete } = await new CheckOnboardingStatusUseCase().execute();
66
+ if (!isComplete) {
67
+ await onboardingWizard();
68
+ }
69
+ }
61
70
  const useCase = container.resolve(CreateFeatureUseCase);
62
71
  const repoPath = options.repo ?? process.cwd();
63
72
  // Resolve openPr from CLI flags or settings defaults
@@ -54,7 +54,6 @@ import { startDaemon } from './commands/daemon/start-daemon.js';
54
54
  import { initializeContainer, container } from '../../../packages/core/src/infrastructure/di/container.js';
55
55
  import { InitializeSettingsUseCase } from '../../../packages/core/src/application/use-cases/settings/initialize-settings.use-case.js';
56
56
  import { initializeSettings } from '../../../packages/core/src/infrastructure/services/settings.service.js';
57
- import { CheckOnboardingStatusUseCase } from '../../../packages/core/src/application/use-cases/settings/check-onboarding-status.use-case.js';
58
57
  /**
59
58
  * Bootstrap function - initializes all dependencies before CLI starts.
60
59
  * Performs async initialization (database, settings) before parsing commands.
@@ -83,17 +82,6 @@ async function bootstrap() {
83
82
  messages.error('Failed to initialize settings', err);
84
83
  throw error;
85
84
  }
86
- // Step 2.5: First-run onboarding gate
87
- // Only run in interactive terminals (the wizard needs TTY for prompts)
88
- if (process.stdin.isTTY) {
89
- const onboardingCheck = new CheckOnboardingStatusUseCase();
90
- const { isComplete } = await onboardingCheck.execute();
91
- if (!isComplete) {
92
- // Lazy-import to avoid ~460ms startup cost when onboarding is already complete
93
- const { onboardingWizard } = await import('../tui/wizards/onboarding/onboarding.wizard.js');
94
- await onboardingWizard();
95
- }
96
- }
97
85
  // Step 3: Set up Commander CLI
98
86
  const versionService = container.resolve('IVersionService');
99
87
  const { version, description } = versionService.getVersion();
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Check whether onboarding has been completed.
3
+ * Delegates to the in-memory settings singleton (zero DB overhead).
4
+ */
5
+ export declare function isAgentSetupComplete(): Promise<boolean>;
6
+ //# sourceMappingURL=agent-setup-flag.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-setup-flag.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/web/app/actions/agent-setup-flag.ts"],"names":[],"mappings":"AAIA;;;GAGG;AACH,wBAAsB,oBAAoB,IAAI,OAAO,CAAC,OAAO,CAAC,CAM7D"}
@@ -0,0 +1,14 @@
1
+ 'use server';
2
+ import { getSettings } from '../../../../../packages/core/src/infrastructure/services/settings.service.js';
3
+ /**
4
+ * Check whether onboarding has been completed.
5
+ * Delegates to the in-memory settings singleton (zero DB overhead).
6
+ */
7
+ export async function isAgentSetupComplete() {
8
+ try {
9
+ return getSettings().onboardingComplete;
10
+ }
11
+ catch {
12
+ return false;
13
+ }
14
+ }
@@ -0,0 +1,11 @@
1
+ import type { ToolItem } from '../../../../../packages/core/src/application/use-cases/tools/list-tools.use-case.js';
2
+ export interface AgentToolStatus {
3
+ agentType: string;
4
+ toolId: string | null;
5
+ tool: ToolItem | null;
6
+ installed: boolean;
7
+ /** CLI binary name for manual run instructions (e.g. "claude", "gemini") */
8
+ binaryName: string | null;
9
+ }
10
+ export declare function checkAgentTool(agentType: string): Promise<AgentToolStatus>;
11
+ //# sourceMappingURL=check-agent-tool.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"check-agent-tool.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/web/app/actions/check-agent-tool.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,8DAA8D,CAAC;AAmB7F,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,IAAI,EAAE,QAAQ,GAAG,IAAI,CAAC;IACtB,SAAS,EAAE,OAAO,CAAC;IACnB,4EAA4E;IAC5E,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B;AAED,wBAAsB,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC,CAmBhF"}
@@ -0,0 +1,35 @@
1
+ 'use server';
2
+ import { resolve } from '../../lib/server-container.js';
3
+ /**
4
+ * Maps agent types to their corresponding tool IDs in the tool registry.
5
+ * These IDs match the JSON file names in tool-installer/tools/.
6
+ */
7
+ const AGENT_TOOL_MAP = {
8
+ 'claude-code': 'claude-code',
9
+ cursor: 'cursor-cli',
10
+ 'gemini-cli': 'gemini-cli',
11
+ };
12
+ /** CLI binary names matching the `binary` field in each tool JSON */
13
+ const AGENT_BINARY_MAP = {
14
+ 'claude-code': 'claude',
15
+ cursor: 'cursor',
16
+ 'gemini-cli': 'gemini',
17
+ };
18
+ export async function checkAgentTool(agentType) {
19
+ const toolId = AGENT_TOOL_MAP[agentType] ?? null;
20
+ const binaryName = AGENT_BINARY_MAP[agentType] ?? null;
21
+ // Dev agent and unknown agents don't need a tool
22
+ if (!toolId) {
23
+ return { agentType, toolId: null, tool: null, installed: true, binaryName: null };
24
+ }
25
+ try {
26
+ const useCase = resolve('ListToolsUseCase');
27
+ const tools = await useCase.execute();
28
+ const tool = tools.find((t) => t.id === toolId) ?? null;
29
+ const installed = tool?.status.status === 'available';
30
+ return { agentType, toolId, tool, installed, binaryName };
31
+ }
32
+ catch {
33
+ return { agentType, toolId, tool: null, installed: false, binaryName };
34
+ }
35
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"update-agent-and-model.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/web/app/actions/update-agent-and-model.ts"],"names":[],"mappings":"AAUA,wBAAsB,mBAAmB,CACvC,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,MAAM,GAAG,IAAI,GACnB,OAAO,CAAC;IAAE,EAAE,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CA2B1C"}
1
+ {"version":3,"file":"update-agent-and-model.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/web/app/actions/update-agent-and-model.ts"],"names":[],"mappings":"AAUA,wBAAsB,mBAAmB,CACvC,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,MAAM,GAAG,IAAI,GACnB,OAAO,CAAC;IAAE,EAAE,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAoB1C"}
@@ -1,22 +1,16 @@
1
1
  'use server';
2
2
  import { resolve } from '../../lib/server-container.js';
3
- import { getSettings, resetSettings, initializeSettings, } from '../../../../../packages/core/src/infrastructure/services/settings.service.js';
3
+ import { resetSettings, initializeSettings, } from '../../../../../packages/core/src/infrastructure/services/settings.service.js';
4
4
  export async function updateAgentAndModel(agentType, model) {
5
5
  if (!agentType.trim()) {
6
6
  return { ok: false, error: 'agent type is required' };
7
7
  }
8
8
  try {
9
- const currentSettings = getSettings();
10
- const updatedSettings = {
11
- ...currentSettings,
12
- agent: {
13
- ...currentSettings.agent,
14
- type: agentType.trim(),
15
- },
16
- models: { default: model?.trim() ?? currentSettings.models.default },
17
- };
18
- const updateUseCase = resolve('UpdateSettingsUseCase');
19
- await updateUseCase.execute(updatedSettings);
9
+ const useCase = resolve('CompleteWebOnboardingUseCase');
10
+ const updatedSettings = await useCase.execute({
11
+ agentType: agentType.trim(),
12
+ model,
13
+ });
20
14
  resetSettings();
21
15
  initializeSettings(updatedSettings);
22
16
  return { ok: true };
@@ -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;AA+DvC,wBAAgB,GAAG,CAAC,OAAO,EAAE,OAAO,GAAG,QAAQ,CAmN9C"}
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;AAgEvC,wBAAgB,GAAG,CAAC,OAAO,EAAE,OAAO,GAAG,QAAQ,CAmN9C"}
@@ -33,6 +33,7 @@ const LIFECYCLE_TO_NODE = {
33
33
  [SdlcLifecycle.Review]: 'merge',
34
34
  [SdlcLifecycle.Maintain]: 'maintain',
35
35
  [SdlcLifecycle.Blocked]: 'blocked',
36
+ [SdlcLifecycle.Deleting]: 'blocked',
36
37
  };
37
38
  const STATUS_TO_EVENT = {
38
39
  [AgentRunStatus.running]: {
@@ -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":"AAsCA,OAAO,KAAK,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAG/D,MAAM,WAAW,wBAAwB;IACvC,IAAI,EAAE,UAAU,CAAC;IACjB,8FAA8F;IAC9F,MAAM,CAAC,EAAE,aAAa,CAAC;CACxB;AAED,wBAAgB,mBAAmB,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,EAAE,wBAAwB,2CAuiB1F"}
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":"AAsCA,OAAO,KAAK,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAG/D,MAAM,WAAW,wBAAwB;IACvC,IAAI,EAAE,UAAU,CAAC;IACjB,8FAA8F;IAC9F,MAAM,CAAC,EAAE,aAAa,CAAC;CACxB;AAED,wBAAgB,mBAAmB,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,EAAE,wBAAwB,2CA4iB1F"}
@@ -55,6 +55,11 @@ export function FeatureDrawerClient({ view: initialView, urlTab }) {
55
55
  for (const update of resolveSseEventUpdates(newEvents)) {
56
56
  if (update.featureId !== featureNode.featureId)
57
57
  continue;
58
+ // Skip SSE updates for features in 'deleting' state — prevents stale
59
+ // events from overwriting the delete animation or triggering artifact
60
+ // fetches (which would fail with "not found" for soft-deleted features).
61
+ if (featureNode.state === 'deleting')
62
+ continue;
58
63
  // Trigger a server refresh to get the latest drawer view,
59
64
  // but skip when the drawer is closed, the user has unsaved changes,
60
65
  // or a rejection is in-flight to avoid unnecessary refreshes.
@@ -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;AAED,wEAAwE;AACxE,eAAO,MAAM,gBAAgB,EAAE,MAAM,CAAC,MAAM,EAAE,qBAAqB,CAOlE,CAAC;AAcF;;;GAGG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,GAAG,IAAI,GAAG,qBAAqB,CAQ7F;AAED,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,gBAAgB,GAAG,SAAS,CAAC;IACpC,SAAS,EAAE,qBAAqB,GAAG,SAAS,CAAC;IAC7C,SAAS,EAAE,qBAAqB,CAAC;IACjC,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;;GAKG;AACH,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,SAAS;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,qBAAqB,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,EAAE,GAC7F,cAAc,EAAE,CAmBlB;AAED,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,CAiD9F;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,CAYvD;AAED,oGAAoG;AACpG,wBAAgB,mBAAmB,CAAC,SAAS,EAAE,qBAAqB,GAAG,gBAAgB,CAkBtF;AAED,wEAAwE;AACxE,eAAO,MAAM,gBAAgB,EAAE,MAAM,CAAC,MAAM,EAAE,qBAAqB,CAOlE,CAAC;AAcF;;;GAGG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,GAAG,IAAI,GAAG,qBAAqB,CAQ7F;AAED,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,gBAAgB,GAAG,SAAS,CAAC;IACpC,SAAS,EAAE,qBAAqB,GAAG,SAAS,CAAC;IAC7C,SAAS,EAAE,qBAAqB,CAAC;IACjC,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;;GAKG;AACH,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,SAAS;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,qBAAqB,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,EAAE,GAC7F,cAAc,EAAE,CAmBlB;AAED,wBAAgB,uBAAuB,CACrC,SAAS,EAAE,MAAM,GAAG,SAAS,GAC5B,qBAAqB,GAAG,SAAS,CAGnC"}
@@ -17,6 +17,10 @@ import { SdlcLifecycle, AgentRunStatus, TaskState, NotificationEventType, } from
17
17
  * 6. No agent run → fall back to plan tasks / lifecycle
18
18
  */
19
19
  export function deriveNodeState(feature, agentRun) {
20
+ // Deleting lifecycle takes top priority — feature is being removed
21
+ if (feature.lifecycle === SdlcLifecycle.Deleting) {
22
+ return 'deleting';
23
+ }
20
24
  // Blocked lifecycle takes priority — child waiting on parent regardless of agent run
21
25
  if (feature.lifecycle === SdlcLifecycle.Blocked) {
22
26
  return 'blocked';
@@ -2,7 +2,7 @@ import { type LucideIcon } from 'lucide-react';
2
2
  import type { Node } from '@xyflow/react';
3
3
  import type { PrStatus, CiStatus, DeploymentState } from '../../../../../../packages/core/src/domain/generated/output.js';
4
4
  import type { AgentTypeValue } from './agent-type-icons.js';
5
- export type FeatureNodeState = 'creating' | 'running' | 'action-required' | 'done' | 'blocked' | 'error';
5
+ export type FeatureNodeState = 'creating' | 'running' | 'action-required' | 'done' | 'blocked' | 'error' | 'deleting';
6
6
  export type FeatureLifecyclePhase = 'requirements' | 'research' | 'implementation' | 'review' | 'deploy' | 'maintain';
7
7
  /** Human-readable display labels for lifecycle phases. */
8
8
  export declare const lifecycleDisplayLabels: Record<FeatureLifecyclePhase, string>;
@@ -1 +1 @@
1
- {"version":3,"file":"feature-node-state-config.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/feature-node/feature-node-state-config.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"feature-node-state-config.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/feature-node/feature-node-state-config.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { Loader2, CircleAlert, CircleCheck, Ban, CircleX } from 'lucide-react';
1
+ import { Loader2, CircleAlert, CircleCheck, Ban, CircleX, Trash2, } from 'lucide-react';
2
2
  /** Human-readable display labels for lifecycle phases. */
3
3
  export const lifecycleDisplayLabels = {
4
4
  requirements: 'REQUIREMENTS',
@@ -78,4 +78,14 @@ export const featureNodeStateConfig = {
78
78
  label: 'Error',
79
79
  showProgressBar: false,
80
80
  },
81
+ deleting: {
82
+ icon: Trash2,
83
+ borderClass: 'border-l-gray-400',
84
+ labelClass: 'text-gray-400',
85
+ progressClass: 'bg-gray-400',
86
+ badgeClass: 'text-gray-600',
87
+ badgeBgClass: 'bg-gray-100',
88
+ label: 'Deleting...',
89
+ showProgressBar: false,
90
+ },
81
91
  };
@@ -1 +1 @@
1
- {"version":3,"file":"feature-node.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/feature-node/feature-node.tsx"],"names":[],"mappings":"AAuBA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AA0DnE,wBAAgB,WAAW,CAAC,EAC1B,IAAI,EACJ,QAAQ,GACT,EAAE;IACD,IAAI,EAAE,eAAe,CAAC;IACtB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB,2CAgRA"}
1
+ {"version":3,"file":"feature-node.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/feature-node/feature-node.tsx"],"names":[],"mappings":"AAuBA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AA0DnE,wBAAgB,WAAW,CAAC,EAC1B,IAAI,EACJ,QAAQ,GACT,EAAE;IACD,IAAI,EAAE,eAAe,CAAC;IACtB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB,2CAiSA"}
@@ -67,13 +67,13 @@ export function FeatureNode({ data, selected, }) {
67
67
  const config = featureNodeStateConfig[data.state];
68
68
  const Icon = config.icon;
69
69
  const [confirmOpen, setConfirmOpen] = useState(false);
70
- 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.featureId ? (_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": "Delete feature", "data-testid": "feature-node-delete-button", onClick: (e) => {
70
+ 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.featureId && data.state !== 'deleting' ? (_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": "Delete feature", "data-testid": "feature-node-delete-button", onClick: (e) => {
71
71
  e.stopPropagation();
72
72
  setConfirmOpen(true);
73
73
  }, 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: "Delete feature" })] }) }) }), _jsx(DeleteFeatureDialog, { open: confirmOpen, onOpenChange: setConfirmOpen, onConfirm: (cleanup) => {
74
74
  setConfirmOpen(false);
75
75
  data.onDelete?.(data.featureId, cleanup);
76
- }, isDeleting: false, featureName: data.name ?? 'this feature', featureId: data.featureId })] })) : null, _jsxs("div", { "data-testid": "feature-node-card", "aria-busy": data.state === 'creating' ? 'true' : undefined, className: cn('bg-card flex min-h-35 w-72 cursor-pointer flex-col rounded-lg border p-3 shadow-sm', selected && 'ring-primary ring-2'), children: [_jsxs("div", { className: "flex items-center justify-between", children: [_jsx("span", { "data-testid": "feature-node-lifecycle-label", className: cn('text-[10px] font-semibold tracking-wider'), children: data.state === 'blocked' ? 'BLOCKED' : lifecycleDisplayLabels[data.lifecycle] }), _jsxs("div", { className: "flex items-center gap-0.5", children: [data.fastMode ? (_jsx(TooltipProvider, { children: _jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx("span", { "data-testid": "feature-node-fast-mode-badge", className: "-mt-1 p-1", children: _jsx(Zap, { className: "h-3.5 w-3.5 text-amber-500" }) }) }), _jsx(TooltipContent, { side: "bottom", children: "Fast Mode" })] }) })) : null, data.agentType ? (_jsx(TooltipProvider, { children: _jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx("button", { type: "button", "aria-label": agentTypeLabels[data.agentType] ?? data.agentType, "data-testid": "feature-node-agent-badge", onClick: (e) => {
76
+ }, isDeleting: false, featureName: data.name ?? 'this feature', featureId: data.featureId })] })) : null, _jsxs("div", { "data-testid": "feature-node-card", "aria-busy": data.state === 'creating' || data.state === 'deleting' ? 'true' : undefined, className: cn('bg-card flex min-h-35 w-72 cursor-pointer flex-col rounded-lg border p-3 shadow-sm', selected && 'ring-primary ring-2', data.state === 'deleting' && 'opacity-60'), children: [_jsxs("div", { className: "flex items-center justify-between", children: [_jsx("span", { "data-testid": "feature-node-lifecycle-label", className: cn('text-[10px] font-semibold tracking-wider'), children: data.state === 'blocked' ? 'BLOCKED' : lifecycleDisplayLabels[data.lifecycle] }), _jsxs("div", { className: "flex items-center gap-0.5", children: [data.fastMode ? (_jsx(TooltipProvider, { children: _jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx("span", { "data-testid": "feature-node-fast-mode-badge", className: "-mt-1 p-1", children: _jsx(Zap, { className: "h-3.5 w-3.5 text-amber-500" }) }) }), _jsx(TooltipContent, { side: "bottom", children: "Fast Mode" })] }) })) : null, data.agentType ? (_jsx(TooltipProvider, { children: _jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx("button", { type: "button", "aria-label": agentTypeLabels[data.agentType] ?? data.agentType, "data-testid": "feature-node-agent-badge", onClick: (e) => {
77
77
  e.stopPropagation();
78
78
  data.onSettings?.();
79
79
  }, className: cn('nodrag -mt-1 -mr-1 p-1', data.onSettings
@@ -82,13 +82,13 @@ export function FeatureNode({ data, selected, }) {
82
82
  ? 'bg-blue-50 text-blue-700'
83
83
  : 'bg-green-50 text-green-700'), children: [data.deployment.status === DeploymentState.Booting ? (_jsx(Loader2, { className: "h-3 w-3 animate-spin" })) : (_jsx(Globe, { className: "h-3 w-3" })), _jsx("span", { className: "truncate", children: data.deployment.status === DeploymentState.Booting
84
84
  ? 'Deploying...'
85
- : (data.deployment.url ?? 'Live') })] })) : null, _jsx("div", { className: "mt-auto pt-2", children: data.state === 'creating' ? (_jsxs(_Fragment, { children: [_jsxs("div", { className: "mt-1.5 flex items-center gap-1.5 text-xs", children: [_jsx(Icon, { className: "h-3.5 w-3.5 shrink-0 animate-spin" }), _jsx("span", { className: "text-muted-foreground", children: getBadgeText(data) })] }), _jsx("div", { "data-testid": "feature-node-progress-bar", className: "bg-muted mt-1.5 h-1 w-full overflow-hidden rounded-full", children: _jsx("div", { className: "motion-safe:animate-indeterminate-progress bg-foreground/30 h-full w-1/3 rounded-full" }) })] })) : data.state === 'running' ? (_jsxs(_Fragment, { children: [_jsxs("div", { className: "mt-1.5 flex items-center gap-1.5 text-xs", children: [_jsx(AgentIcon, { agentType: data.agentType, className: "h-3.5 w-3.5 shrink-0" }), _jsx("span", { className: "text-muted-foreground", children: getBadgeText(data) })] }), _jsx("div", { "data-testid": "feature-node-progress-bar", className: "bg-muted mt-1.5 h-1 w-full overflow-hidden rounded-full", children: _jsx("div", { className: "animate-indeterminate-progress bg-foreground/30 h-full w-1/3 rounded-full" }) })] })) : config.showProgressBar ? (_jsxs(_Fragment, { children: [_jsx("div", { className: "text-muted-foreground flex items-center justify-end text-[10px]", children: _jsxs("span", { children: [data.progress, "%"] }) }), _jsx("div", { "data-testid": "feature-node-progress-bar", className: "bg-muted mt-1.5 h-1 w-full overflow-hidden rounded-full", children: _jsx("div", { className: cn('h-full rounded-full transition-all', config.progressClass), style: { width: `${data.progress}%` } }) })] })) : (_jsxs(_Fragment, { children: [_jsx("div", { className: "text-muted-foreground text-[10px]", children: _jsx("span", { children: data.featureId }) }), _jsxs("div", { "data-testid": "feature-node-badge", className: (() => {
85
+ : (data.deployment.url ?? 'Live') })] })) : null, _jsx("div", { className: "mt-auto pt-2", children: data.state === 'deleting' ? (_jsxs(_Fragment, { children: [_jsxs("div", { className: "mt-1.5 flex items-center gap-1.5 text-xs", children: [_jsx(Trash2, { className: "h-3.5 w-3.5 shrink-0 text-gray-400" }), _jsx("span", { className: "text-muted-foreground", children: "Deleting\u2026" })] }), _jsx("div", { "data-testid": "feature-node-progress-bar", className: "bg-muted mt-1.5 h-1 w-full overflow-hidden rounded-full", children: _jsx("div", { className: "motion-safe:animate-indeterminate-progress bg-foreground/30 h-full w-1/3 rounded-full" }) })] })) : data.state === 'creating' ? (_jsxs(_Fragment, { children: [_jsxs("div", { className: "mt-1.5 flex items-center gap-1.5 text-xs", children: [_jsx(Icon, { className: "h-3.5 w-3.5 shrink-0 animate-spin" }), _jsx("span", { className: "text-muted-foreground", children: getBadgeText(data) })] }), _jsx("div", { "data-testid": "feature-node-progress-bar", className: "bg-muted mt-1.5 h-1 w-full overflow-hidden rounded-full", children: _jsx("div", { className: "motion-safe:animate-indeterminate-progress bg-foreground/30 h-full w-1/3 rounded-full" }) })] })) : data.state === 'running' ? (_jsxs(_Fragment, { children: [_jsxs("div", { className: "mt-1.5 flex items-center gap-1.5 text-xs", children: [_jsx(AgentIcon, { agentType: data.agentType, className: "h-3.5 w-3.5 shrink-0" }), _jsx("span", { className: "text-muted-foreground", children: getBadgeText(data) })] }), _jsx("div", { "data-testid": "feature-node-progress-bar", className: "bg-muted mt-1.5 h-1 w-full overflow-hidden rounded-full", children: _jsx("div", { className: "animate-indeterminate-progress bg-foreground/30 h-full w-1/3 rounded-full" }) })] })) : config.showProgressBar ? (_jsxs(_Fragment, { children: [_jsx("div", { className: "text-muted-foreground flex items-center justify-end text-[10px]", children: _jsxs("span", { children: [data.progress, "%"] }) }), _jsx("div", { "data-testid": "feature-node-progress-bar", className: "bg-muted mt-1.5 h-1 w-full overflow-hidden rounded-full", children: _jsx("div", { className: cn('h-full rounded-full transition-all', config.progressClass), style: { width: `${data.progress}%` } }) })] })) : (_jsxs(_Fragment, { children: [_jsx("div", { className: "text-muted-foreground text-[10px]", children: _jsx("span", { children: data.featureId }) }), _jsxs("div", { "data-testid": "feature-node-badge", className: (() => {
86
86
  const override = getActionRequiredBadgeClasses(data);
87
87
  return cn('mt-1.5 flex items-center justify-center gap-1.5 rounded-full px-2.5 py-1 text-[11px] font-medium', override?.badgeBgClass ?? config.badgeBgClass, override?.badgeClass ?? config.badgeClass);
88
88
  })(), children: [(() => {
89
89
  const BadgeIcon = getBadgeIcon(data);
90
90
  return _jsx(BadgeIcon, { className: "h-3.5 w-3.5 shrink-0" });
91
- })(), _jsx("span", { className: "truncate", children: getBadgeText(data) })] })] })) })] }), data.onAction ? (_jsx(Handle, { type: "source", position: Position.Right, className: "h-0! w-0! border-0! bg-transparent!", children: _jsx("button", { type: "button", "aria-label": "Add", "data-testid": "feature-node-action-button", onClick: (e) => {
91
+ })(), _jsx("span", { className: "truncate", children: getBadgeText(data) })] })] })) })] }), data.onAction && data.state !== 'deleting' ? (_jsx(Handle, { type: "source", position: Position.Right, className: "h-0! w-0! border-0! bg-transparent!", children: _jsx("button", { type: "button", "aria-label": "Add", "data-testid": "feature-node-action-button", onClick: (e) => {
92
92
  e.stopPropagation();
93
93
  data.onAction?.();
94
94
  }, className: "nodrag absolute top-1/2 left-1/2 flex h-6 w-6 -translate-x-1/2 -translate-y-1/2 cursor-pointer items-center justify-center rounded-full bg-blue-500 text-white opacity-0 shadow-md transition-opacity group-hover:opacity-100 hover:bg-blue-600", children: _jsx(Plus, { className: "h-3.5 w-3.5" }) }) })) : data.showHandles ? (_jsx(Handle, { type: "source", position: Position.Right, isConnectable: false, className: "opacity-0!" })) : null] }));
@@ -13,6 +13,7 @@ export declare const DoneWithRuntime: Story;
13
13
  export declare const BlockedByFeature: Story;
14
14
  export declare const Creating: Story;
15
15
  export declare const MergeReviewActionRequired: Story;
16
+ export declare const Deleting: Story;
16
17
  export declare const ErrorWithMessage: Story;
17
18
  export declare const WithDeleteButton: Story;
18
19
  export declare const FastMode: Story;
@@ -1 +1 @@
1
- {"version":3,"file":"feature-node.stories.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/feature-node/feature-node.stories.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAMvD,OAAO,KAAK,EACV,eAAe,EAIhB,MAAM,6BAA6B,CAAC;AAiCrC,QAAA,MAAM,IAAI,EAAE,IAAI,CAAC,eAAe,CAc/B,CAAC;AAEF,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,eAAe,CAAC,CAAC;AAEvC,eAAO,MAAM,OAAO,EAAE,KAErB,CAAC;AAsGF,eAAO,MAAM,SAAS,EAAE,KAQvB,CAAC;AAWF,eAAO,MAAM,aAAa,EAAE,KAqB3B,CAAC;AA2EF,eAAO,MAAM,aAAa,EAAE,KAQ3B,CAAC;AAEF,eAAO,MAAM,UAAU,EAAE,KAMxB,CAAC;AAEF,eAAO,MAAM,WAAW,EAAE,KAOzB,CAAC;AAEF,eAAO,MAAM,eAAe,EAAE,KAW7B,CAAC;AAEF,eAAO,MAAM,gBAAgB,EAAE,KAW9B,CAAC;AAEF,eAAO,MAAM,QAAQ,EAAE,KAUtB,CAAC;AAEF,eAAO,MAAM,yBAAyB,EAAE,KAUvC,CAAC;AAEF,eAAO,MAAM,gBAAgB,EAAE,KAW9B,CAAC;AAEF,eAAO,MAAM,gBAAgB,EAAE,KAW9B,CAAC;AAEF,eAAO,MAAM,QAAQ,EAAE,KAatB,CAAC;AAEF,eAAO,MAAM,YAAY,EAAE,KAc1B,CAAC;AAEF,eAAO,MAAM,iBAAiB,EAAE,KAY/B,CAAC;AAEF,eAAO,MAAM,eAAe,EAAE,KAa7B,CAAC;AAEF,eAAO,MAAM,oBAAoB,EAAE,KAYlC,CAAC;AA4EF,eAAO,MAAM,WAAW,EAAE,KAOzB,CAAC"}
1
+ {"version":3,"file":"feature-node.stories.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/feature-node/feature-node.stories.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAMvD,OAAO,KAAK,EACV,eAAe,EAIhB,MAAM,6BAA6B,CAAC;AAiCrC,QAAA,MAAM,IAAI,EAAE,IAAI,CAAC,eAAe,CAc/B,CAAC;AAEF,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,eAAe,CAAC,CAAC;AAEvC,eAAO,MAAM,OAAO,EAAE,KAErB,CAAC;AAgHF,eAAO,MAAM,SAAS,EAAE,KAQvB,CAAC;AAWF,eAAO,MAAM,aAAa,EAAE,KAqB3B,CAAC;AA2EF,eAAO,MAAM,aAAa,EAAE,KAQ3B,CAAC;AAEF,eAAO,MAAM,UAAU,EAAE,KAMxB,CAAC;AAEF,eAAO,MAAM,WAAW,EAAE,KAOzB,CAAC;AAEF,eAAO,MAAM,eAAe,EAAE,KAW7B,CAAC;AAEF,eAAO,MAAM,gBAAgB,EAAE,KAW9B,CAAC;AAEF,eAAO,MAAM,QAAQ,EAAE,KAUtB,CAAC;AAEF,eAAO,MAAM,yBAAyB,EAAE,KAUvC,CAAC;AAEF,eAAO,MAAM,QAAQ,EAAE,KAUtB,CAAC;AAEF,eAAO,MAAM,gBAAgB,EAAE,KAW9B,CAAC;AAEF,eAAO,MAAM,gBAAgB,EAAE,KAW9B,CAAC;AAEF,eAAO,MAAM,QAAQ,EAAE,KAatB,CAAC;AAEF,eAAO,MAAM,YAAY,EAAE,KAc1B,CAAC;AAEF,eAAO,MAAM,iBAAiB,EAAE,KAY/B,CAAC;AAEF,eAAO,MAAM,eAAe,EAAE,KAa7B,CAAC;AAEF,eAAO,MAAM,oBAAoB,EAAE,KAYlC,CAAC;AA4EF,eAAO,MAAM,WAAW,EAAE,KAOzB,CAAC"}
@@ -127,6 +127,16 @@ const allStatesData = [
127
127
  repositoryPath: '/home/user/my-repo',
128
128
  branch: 'feat/email-service',
129
129
  },
130
+ {
131
+ name: 'Legacy API Cleanup',
132
+ description: 'Remove deprecated REST endpoints',
133
+ featureId: '#f6',
134
+ lifecycle: 'implementation',
135
+ state: 'deleting',
136
+ progress: 0,
137
+ repositoryPath: '/home/user/my-repo',
138
+ branch: 'feat/legacy-api-cleanup',
139
+ },
130
140
  ];
131
141
  export const AllStates = {
132
142
  render: () => (_jsx("div", { className: "flex flex-wrap gap-6", children: allStatesData.map((data) => (_jsx(FeatureNodeCanvas, { style: { width: 500, height: 350 }, data: data }, data.featureId))) })),
@@ -286,6 +296,17 @@ export const MergeReviewActionRequired = {
286
296
  },
287
297
  render: (args) => _jsx(FeatureNodeCanvas, { data: args }),
288
298
  };
299
+ export const Deleting = {
300
+ args: {
301
+ name: 'Legacy API Cleanup',
302
+ description: 'Remove deprecated REST endpoints',
303
+ featureId: '#f6',
304
+ lifecycle: 'implementation',
305
+ state: 'deleting',
306
+ progress: 0,
307
+ },
308
+ render: (args) => _jsx(FeatureNodeCanvas, { data: args }),
309
+ };
289
310
  export const ErrorWithMessage = {
290
311
  args: {
291
312
  name: 'Email Service',
@@ -1 +1 @@
1
- {"version":3,"file":"control-center-empty-state.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/features/control-center/control-center-empty-state.tsx"],"names":[],"mappings":"AAOA,MAAM,WAAW,4BAA4B;IAC3C,kBAAkB,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAC5C,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAID,wBAAgB,uBAAuB,CAAC,EACtC,kBAAkB,EAClB,SAAS,GACV,EAAE,4BAA4B,2CAsG9B"}
1
+ {"version":3,"file":"control-center-empty-state.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/features/control-center/control-center-empty-state.tsx"],"names":[],"mappings":"AASA,MAAM,WAAW,4BAA4B;IAC3C,kBAAkB,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAC5C,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAID,wBAAgB,uBAAuB,CAAC,EACtC,kBAAkB,EAClB,SAAS,GACV,EAAE,4BAA4B,2CAiI9B"}
@@ -1,13 +1,22 @@
1
1
  'use client';
2
- import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
- import { useState, useCallback } from 'react';
2
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
3
+ import { useState, useCallback, useEffect } from 'react';
4
4
  import { Github, Plus, TerminalSquare, Copy, Check, Loader2 } from 'lucide-react';
5
5
  import { cn } from '../../../lib/utils.js';
6
6
  import { pickFolder } from '../../common/add-repository-button/pick-folder.js';
7
- const commands = ['cd ~/my-repo', 'shep feat new "create modern, sleek dashboards"'];
7
+ import { isAgentSetupComplete } from '../../../app/actions/agent-setup-flag.js';
8
+ import { WelcomeAgentSetup } from './welcome-agent-setup.js';
9
+ const commands = ['cd ~/my-repo', 'shep feat new "sleek dashboard"'];
8
10
  export function ControlCenterEmptyState({ onRepositorySelect, className, }) {
9
11
  const [copied, setCopied] = useState(false);
10
12
  const [loading, setLoading] = useState(false);
13
+ const [agentReady, setAgentReady] = useState(false);
14
+ useEffect(() => {
15
+ isAgentSetupComplete().then((done) => {
16
+ if (done)
17
+ setAgentReady(true);
18
+ });
19
+ }, []);
11
20
  async function handlePickerClick() {
12
21
  if (loading)
13
22
  return;
@@ -27,5 +36,12 @@ export function ControlCenterEmptyState({ onRepositorySelect, className, }) {
27
36
  setCopied(true);
28
37
  setTimeout(() => setCopied(false), 2000);
29
38
  }, []);
30
- return (_jsxs("div", { "data-testid": "control-center-empty-state", className: cn('relative h-full w-full', className), children: [_jsx("div", { className: "absolute inset-0 [background-image:radial-gradient(circle,_var(--color-border)_1px,_transparent_1px)] [background-size:24px_24px]" }), _jsxs("div", { className: "absolute top-8 left-8 z-10", children: [_jsx("h1", { className: "text-4xl font-bold tracking-tight", children: "Features" }), _jsx("p", { className: "text-muted-foreground text-3xl font-light", children: "Control Center" })] }), _jsx("div", { className: "relative z-10 flex h-full items-center justify-center", children: _jsxs("div", { className: "flex max-w-lg flex-col items-center gap-6", children: [_jsxs("div", { className: "text-muted-foreground flex items-center gap-2", children: [_jsx(Github, { className: "h-4 w-4" }), _jsx("span", { className: "text-xs font-semibold tracking-widest uppercase", children: "Repositories" })] }), _jsxs("button", { type: "button", "data-testid": "empty-state-add-repository", onClick: handlePickerClick, disabled: loading, className: "border-muted-foreground/30 hover:border-primary hover:text-primary flex cursor-pointer items-center gap-3 rounded-lg border-2 border-dashed px-8 py-4 transition-colors disabled:cursor-wait disabled:opacity-60", children: [loading ? _jsx(Loader2, { className: "h-5 w-5 animate-spin" }) : _jsx(Plus, { className: "h-5 w-5" }), _jsx("span", { className: "text-sm font-medium", children: loading ? 'Opening...' : 'Add Repository' })] }), _jsxs("div", { className: "text-muted-foreground flex items-center gap-3", children: [_jsx("div", { className: "bg-border h-px w-16" }), _jsxs("div", { className: "flex items-center gap-1.5", children: [_jsx(TerminalSquare, { className: "h-3.5 w-3.5" }), _jsx("span", { className: "text-xs font-semibold tracking-widest uppercase", children: "Or start from the command line" })] }), _jsx("div", { className: "bg-border h-px w-16" })] }), _jsxs("div", { "data-testid": "cli-code-block", className: "relative w-full rounded-lg bg-zinc-900 px-5 py-4 font-mono text-sm text-zinc-100", children: [_jsx("button", { type: "button", "data-testid": "cli-code-block-copy", onClick: handleCopy, className: "absolute top-3 right-3 cursor-pointer rounded p-1.5 text-zinc-400 transition-colors hover:bg-zinc-800 hover:text-zinc-200", "aria-label": "Copy commands", children: copied ? _jsx(Check, { className: "h-4 w-4" }) : _jsx(Copy, { className: "h-4 w-4" }) }), _jsx("div", { className: "space-y-1", children: commands.map((cmd) => (_jsxs("div", { children: [_jsx("span", { className: "text-zinc-500 select-none", children: "$ " }), _jsx("span", { children: cmd })] }, cmd))) })] }), _jsx("p", { className: "text-muted-foreground text-sm", children: "Feature will appear on canvas once created" })] }) })] }));
39
+ const handleAgentSetupComplete = useCallback(() => {
40
+ setAgentReady(true);
41
+ }, []);
42
+ return (_jsxs("div", { "data-testid": "control-center-empty-state", className: cn('relative h-full w-full', className), children: [_jsx("div", { className: "absolute inset-0 [background-image:radial-gradient(circle,_var(--color-border)_1px,_transparent_1px)] [background-size:24px_24px]" }), _jsxs("div", { className: "absolute top-8 left-8 z-10", children: [_jsx("h1", { className: "text-4xl font-bold tracking-tight", children: "Features" }), _jsx("p", { className: "text-muted-foreground text-3xl font-light", children: "Control Center" })] }), _jsx("div", { className: "relative z-10 flex h-full items-center justify-center", children: _jsx("div", { className: "flex w-72 flex-col items-center gap-4", children: !agentReady ? (
43
+ /* Step 1: Agent setup */
44
+ _jsx(WelcomeAgentSetup, { onComplete: handleAgentSetupComplete })) : (
45
+ /* Step 2: Add repository (shown after agent is configured) */
46
+ _jsxs(_Fragment, { children: [_jsxs("div", { className: "text-muted-foreground flex items-center gap-2", children: [_jsx(Github, { className: "h-3.5 w-3.5" }), _jsx("span", { className: "text-[10px] font-semibold tracking-widest uppercase", children: "Repositories" })] }), _jsxs("button", { type: "button", "data-testid": "empty-state-add-repository", onClick: handlePickerClick, disabled: loading, className: "border-border hover:border-foreground/40 flex w-full cursor-pointer items-center gap-2.5 rounded-md border border-dashed px-4 py-2.5 transition-colors disabled:cursor-wait disabled:opacity-50", children: [loading ? (_jsx(Loader2, { className: "text-muted-foreground h-4 w-4 animate-spin" })) : (_jsx(Plus, { className: "text-muted-foreground h-4 w-4" })), _jsx("span", { className: "text-xs font-medium", children: loading ? 'Opening…' : 'Add Repository' })] }), _jsxs("div", { className: "text-muted-foreground flex items-center gap-2", children: [_jsx("div", { className: "bg-border h-px w-10" }), _jsxs("div", { className: "flex items-center gap-1", children: [_jsx(TerminalSquare, { className: "h-3 w-3" }), _jsx("span", { className: "text-[10px] font-semibold tracking-widest uppercase", children: "Or via CLI" })] }), _jsx("div", { className: "bg-border h-px w-10" })] }), _jsxs("div", { "data-testid": "cli-code-block", className: "relative w-full rounded-md bg-zinc-900 px-3 py-2 font-mono text-[11px] text-zinc-300", children: [_jsx("button", { type: "button", "data-testid": "cli-code-block-copy", onClick: handleCopy, className: "absolute top-2 right-2 cursor-pointer rounded p-1 text-zinc-500 transition-colors hover:bg-zinc-800 hover:text-zinc-300", "aria-label": "Copy commands", children: copied ? _jsx(Check, { className: "h-3 w-3" }) : _jsx(Copy, { className: "h-3 w-3" }) }), _jsx("div", { className: "space-y-0.5", children: commands.map((cmd) => (_jsxs("div", { className: "whitespace-nowrap", children: [_jsx("span", { className: "text-zinc-500 select-none", children: "$ " }), _jsx("span", { children: cmd })] }, cmd))) })] }), _jsx("p", { className: "text-muted-foreground text-[10px]", children: "Feature will appear on canvas once created" })] })) }) })] }));
31
47
  }
@@ -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;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;QAAE,QAAQ,EAAE,OAAO,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC;IAC/E,YAAY,EAAE,CAAC,SAAS,EAAE,eAAe,KAAK,IAAI,CAAC;IACnD,mBAAmB,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,KAAK,IAAI,CAAC;IACpE,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;AAQD,wBAAgB,qBAAqB,CACnC,YAAY,EAAE,cAAc,EAAE,EAC9B,YAAY,EAAE,IAAI,EAAE,GACnB,kBAAkB,CAuXpB"}
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;QAAE,QAAQ,EAAE,OAAO,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC;IAC/E,YAAY,EAAE,CAAC,SAAS,EAAE,eAAe,KAAK,IAAI,CAAC;IACnD,mBAAmB,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,KAAK,IAAI,CAAC;IACpE,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;AAQD,wBAAgB,qBAAqB,CACnC,YAAY,EAAE,cAAc,EAAE,EAC9B,YAAY,EAAE,IAAI,EAAE,GACnB,kBAAkB,CA4ZpB"}