@shepai/cli 1.106.5 → 1.107.0

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 (244) hide show
  1. package/dist/packages/core/src/application/ports/output/agents/feature-agent-process.interface.d.ts +1 -0
  2. package/dist/packages/core/src/application/ports/output/agents/feature-agent-process.interface.d.ts.map +1 -1
  3. package/dist/packages/core/src/application/ports/output/services/git-pr-service.interface.d.ts +12 -1
  4. package/dist/packages/core/src/application/ports/output/services/git-pr-service.interface.d.ts.map +1 -1
  5. package/dist/packages/core/src/application/use-cases/features/resume-feature.use-case.d.ts.map +1 -1
  6. package/dist/packages/core/src/application/use-cases/features/resume-feature.use-case.js +2 -0
  7. package/dist/packages/core/src/infrastructure/di/container.d.ts.map +1 -1
  8. package/dist/packages/core/src/infrastructure/di/container.js +3 -0
  9. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/fast-feature-agent-graph.d.ts +5 -0
  10. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/fast-feature-agent-graph.d.ts.map +1 -1
  11. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/feature-agent-graph.d.ts +17 -0
  12. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/feature-agent-graph.d.ts.map +1 -1
  13. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/feature-agent-process.service.d.ts +1 -0
  14. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/feature-agent-process.service.d.ts.map +1 -1
  15. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/feature-agent-process.service.js +3 -0
  16. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/feature-agent-worker.d.ts +1 -0
  17. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/feature-agent-worker.d.ts.map +1 -1
  18. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/feature-agent-worker.js +8 -1
  19. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/merge/merge.node.d.ts +5 -1
  20. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/merge/merge.node.d.ts.map +1 -1
  21. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/merge/merge.node.js +4 -1
  22. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/node-helpers.d.ts +7 -0
  23. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/node-helpers.d.ts.map +1 -1
  24. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/node-helpers.js +23 -1
  25. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/state.d.ts +1 -0
  26. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/state.d.ts.map +1 -1
  27. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/state.js +5 -0
  28. package/dist/packages/core/src/infrastructure/services/git/git-pr.service.d.ts +2 -1
  29. package/dist/packages/core/src/infrastructure/services/git/git-pr.service.d.ts.map +1 -1
  30. package/dist/packages/core/src/infrastructure/services/git/git-pr.service.js +22 -3
  31. package/dist/packages/core/src/infrastructure/services/process/is-process-alive.d.ts +8 -0
  32. package/dist/packages/core/src/infrastructure/services/process/is-process-alive.d.ts.map +1 -0
  33. package/dist/packages/core/src/infrastructure/services/process/is-process-alive.js +15 -0
  34. package/dist/src/presentation/cli/commands/status.command.d.ts +1 -1
  35. package/dist/src/presentation/cli/commands/status.command.d.ts.map +1 -1
  36. package/dist/src/presentation/cli/commands/status.command.js +2 -38
  37. package/dist/src/presentation/web/app/actions/resume-feature.d.ts +5 -0
  38. package/dist/src/presentation/web/app/actions/resume-feature.d.ts.map +1 -0
  39. package/dist/src/presentation/web/app/actions/resume-feature.js +16 -0
  40. package/dist/src/presentation/web/app/api/agent-events/route.d.ts.map +1 -1
  41. package/dist/src/presentation/web/app/api/agent-events/route.js +17 -0
  42. package/dist/src/presentation/web/app/build-feature-node-data.d.ts.map +1 -1
  43. package/dist/src/presentation/web/app/build-feature-node-data.js +6 -1
  44. package/dist/src/presentation/web/app/build-graph-nodes.d.ts.map +1 -1
  45. package/dist/src/presentation/web/app/build-graph-nodes.js +6 -1
  46. package/dist/src/presentation/web/components/common/control-center-drawer/feature-drawer-client.d.ts.map +1 -1
  47. package/dist/src/presentation/web/components/common/control-center-drawer/feature-drawer-client.js +21 -1
  48. package/dist/src/presentation/web/components/common/feature-drawer-tabs/overview-tab.d.ts.map +1 -1
  49. package/dist/src/presentation/web/components/common/feature-drawer-tabs/overview-tab.js +2 -2
  50. package/dist/src/presentation/web/components/common/feature-drawer-tabs/overview-tab.stories.d.ts +2 -0
  51. package/dist/src/presentation/web/components/common/feature-drawer-tabs/overview-tab.stories.d.ts.map +1 -1
  52. package/dist/src/presentation/web/components/common/feature-drawer-tabs/overview-tab.stories.js +9 -0
  53. package/dist/src/presentation/web/components/common/feature-node/derive-feature-state.d.ts +4 -2
  54. package/dist/src/presentation/web/components/common/feature-node/derive-feature-state.d.ts.map +1 -1
  55. package/dist/src/presentation/web/components/common/feature-node/derive-feature-state.js +5 -3
  56. package/dist/src/presentation/web/components/common/feature-node/feature-node-state-config.d.ts +1 -0
  57. package/dist/src/presentation/web/components/common/feature-node/feature-node-state-config.d.ts.map +1 -1
  58. package/dist/src/presentation/web/components/common/feature-node/feature-node.d.ts.map +1 -1
  59. package/dist/src/presentation/web/components/common/feature-node/feature-node.js +11 -8
  60. package/dist/src/presentation/web/components/common/feature-node/feature-node.stories.d.ts +1 -0
  61. package/dist/src/presentation/web/components/common/feature-node/feature-node.stories.d.ts.map +1 -1
  62. package/dist/src/presentation/web/components/common/feature-node/feature-node.stories.js +13 -0
  63. package/dist/src/presentation/web/components/features/control-center/control-center-inner.d.ts.map +1 -1
  64. package/dist/src/presentation/web/components/features/control-center/control-center-inner.js +3 -1
  65. package/dist/src/presentation/web/components/features/control-center/use-control-center-state.d.ts +1 -0
  66. package/dist/src/presentation/web/components/features/control-center/use-control-center-state.d.ts.map +1 -1
  67. package/dist/src/presentation/web/components/features/control-center/use-control-center-state.js +21 -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 +1 -0
  70. package/dist/src/presentation/web/lib/derive-graph.d.ts +2 -0
  71. package/dist/src/presentation/web/lib/derive-graph.d.ts.map +1 -1
  72. package/dist/src/presentation/web/lib/derive-graph.js +5 -0
  73. package/dist/tsconfig.build.tsbuildinfo +1 -1
  74. package/package.json +1 -1
  75. package/web/.next/BUILD_ID +1 -1
  76. package/web/.next/build-manifest.json +2 -2
  77. package/web/.next/fallback-build-manifest.json +2 -2
  78. package/web/.next/prerender-manifest.json +3 -3
  79. package/web/.next/required-server-files.js +2 -2
  80. package/web/.next/required-server-files.json +2 -2
  81. package/web/.next/server/app/(dashboard)/@drawer/create/page/server-reference-manifest.json +53 -38
  82. package/web/.next/server/app/(dashboard)/@drawer/create/page.js +1 -1
  83. package/web/.next/server/app/(dashboard)/@drawer/create/page.js.nft.json +1 -1
  84. package/web/.next/server/app/(dashboard)/@drawer/create/page_client-reference-manifest.js +1 -1
  85. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page/server-reference-manifest.json +65 -50
  86. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page.js +1 -1
  87. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page.js.nft.json +1 -1
  88. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page_client-reference-manifest.js +1 -1
  89. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page/server-reference-manifest.json +65 -50
  90. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js +1 -1
  91. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js.nft.json +1 -1
  92. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page_client-reference-manifest.js +1 -1
  93. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page/server-reference-manifest.json +49 -34
  94. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js +1 -1
  95. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js.nft.json +1 -1
  96. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  97. package/web/.next/server/app/(dashboard)/create/page/server-reference-manifest.json +53 -38
  98. package/web/.next/server/app/(dashboard)/create/page.js +1 -1
  99. package/web/.next/server/app/(dashboard)/create/page.js.nft.json +1 -1
  100. package/web/.next/server/app/(dashboard)/create/page_client-reference-manifest.js +1 -1
  101. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page/server-reference-manifest.json +65 -50
  102. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page.js +1 -1
  103. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page.js.nft.json +1 -1
  104. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page_client-reference-manifest.js +1 -1
  105. package/web/.next/server/app/(dashboard)/feature/[featureId]/page/server-reference-manifest.json +65 -50
  106. package/web/.next/server/app/(dashboard)/feature/[featureId]/page.js +1 -1
  107. package/web/.next/server/app/(dashboard)/feature/[featureId]/page.js.nft.json +1 -1
  108. package/web/.next/server/app/(dashboard)/feature/[featureId]/page_client-reference-manifest.js +1 -1
  109. package/web/.next/server/app/(dashboard)/page/server-reference-manifest.json +49 -34
  110. package/web/.next/server/app/(dashboard)/page.js +1 -1
  111. package/web/.next/server/app/(dashboard)/page.js.nft.json +1 -1
  112. package/web/.next/server/app/(dashboard)/page_client-reference-manifest.js +1 -1
  113. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page/server-reference-manifest.json +49 -34
  114. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js +1 -1
  115. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js.nft.json +1 -1
  116. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  117. package/web/.next/server/app/_global-error.html +2 -2
  118. package/web/.next/server/app/_global-error.rsc +1 -1
  119. package/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  120. package/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  121. package/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  122. package/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  123. package/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  124. package/web/.next/server/app/_not-found/page/server-reference-manifest.json +1 -1
  125. package/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  126. package/web/.next/server/app/api/agent-events/route.js +2 -1
  127. package/web/.next/server/app/api/agent-events/route.js.nft.json +1 -1
  128. package/web/.next/server/app/api/attachments/preview/route.js.nft.json +1 -1
  129. package/web/.next/server/app/api/evidence/route.js.nft.json +1 -1
  130. package/web/.next/server/app/settings/page/server-reference-manifest.json +5 -5
  131. package/web/.next/server/app/settings/page.js.nft.json +1 -1
  132. package/web/.next/server/app/settings/page_client-reference-manifest.js +1 -1
  133. package/web/.next/server/app/skills/page/server-reference-manifest.json +6 -6
  134. package/web/.next/server/app/skills/page.js.nft.json +1 -1
  135. package/web/.next/server/app/skills/page_client-reference-manifest.js +1 -1
  136. package/web/.next/server/app/tools/page/server-reference-manifest.json +6 -6
  137. package/web/.next/server/app/tools/page.js.nft.json +1 -1
  138. package/web/.next/server/app/tools/page_client-reference-manifest.js +1 -1
  139. package/web/.next/server/app/version/page/server-reference-manifest.json +1 -1
  140. package/web/.next/server/app/version/page_client-reference-manifest.js +1 -1
  141. package/web/.next/server/chunks/403f9_next_dist_esm_build_templates_app-route_370c43b1.js +1 -1
  142. package/web/.next/server/chunks/403f9_next_dist_esm_build_templates_app-route_370c43b1.js.map +1 -1
  143. package/web/.next/server/chunks/403f9_next_dist_esm_build_templates_app-route_4d623b8e.js +6 -0
  144. package/web/.next/server/chunks/403f9_next_dist_esm_build_templates_app-route_4d623b8e.js.map +1 -0
  145. package/web/.next/server/chunks/[root-of-the-server]__7d5492a0._.js +1 -1
  146. package/web/.next/server/chunks/[root-of-the-server]__7d5492a0._.js.map +1 -1
  147. package/web/.next/server/chunks/[root-of-the-server]__cd67a84c._.js +3 -0
  148. package/web/.next/server/chunks/[root-of-the-server]__cd67a84c._.js.map +1 -0
  149. package/web/.next/server/chunks/[root-of-the-server]__f47bb8a5._.js +1 -1
  150. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js +1 -1
  151. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js.map +1 -1
  152. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_a1104008.js +3 -0
  153. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_a1104008.js.map +1 -0
  154. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_92642200.js +3 -0
  155. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_92642200.js.map +1 -0
  156. package/web/.next/server/chunks/ssr/[root-of-the-server]__039967e3._.js +3 -0
  157. package/web/.next/server/chunks/ssr/[root-of-the-server]__039967e3._.js.map +1 -0
  158. package/web/.next/server/chunks/ssr/[root-of-the-server]__11033878._.js +1 -1
  159. package/web/.next/server/chunks/ssr/[root-of-the-server]__11033878._.js.map +1 -1
  160. package/web/.next/server/chunks/ssr/[root-of-the-server]__24dd0927._.js +2 -2
  161. package/web/.next/server/chunks/ssr/[root-of-the-server]__24dd0927._.js.map +1 -1
  162. package/web/.next/server/chunks/ssr/[root-of-the-server]__2773312c._.js +3 -0
  163. package/web/.next/server/chunks/ssr/[root-of-the-server]__2773312c._.js.map +1 -0
  164. package/web/.next/server/chunks/ssr/[root-of-the-server]__357d99f9._.js +1 -1
  165. package/web/.next/server/chunks/ssr/[root-of-the-server]__5d87af2e._.js +1 -1
  166. package/web/.next/server/chunks/ssr/[root-of-the-server]__845a9d2a._.js +1 -1
  167. package/web/.next/server/chunks/ssr/[root-of-the-server]__845a9d2a._.js.map +1 -1
  168. package/web/.next/server/chunks/ssr/[root-of-the-server]__89e8a5cc._.js +2 -2
  169. package/web/.next/server/chunks/ssr/[root-of-the-server]__aad040c0._.js +2 -2
  170. package/web/.next/server/chunks/ssr/[root-of-the-server]__aad040c0._.js.map +1 -1
  171. package/web/.next/server/chunks/ssr/[root-of-the-server]__cbd8062c._.js +3 -0
  172. package/web/.next/server/chunks/ssr/[root-of-the-server]__cbd8062c._.js.map +1 -0
  173. package/web/.next/server/chunks/ssr/[root-of-the-server]__e70c5627._.js +3 -0
  174. package/web/.next/server/chunks/ssr/[root-of-the-server]__e70c5627._.js.map +1 -0
  175. package/web/.next/server/chunks/ssr/[root-of-the-server]__fdc75809._.js +1 -1
  176. package/web/.next/server/chunks/ssr/[root-of-the-server]__fdc75809._.js.map +1 -1
  177. package/web/.next/server/chunks/ssr/_135edb9c._.js +1 -1
  178. package/web/.next/server/chunks/ssr/_135edb9c._.js.map +1 -1
  179. package/web/.next/server/chunks/ssr/_250a63ae._.js +1 -1
  180. package/web/.next/server/chunks/ssr/_250a63ae._.js.map +1 -1
  181. package/web/.next/server/chunks/ssr/{_4a13fd24._.js → _2f98781f._.js} +2 -2
  182. package/web/.next/server/chunks/ssr/{_4a13fd24._.js.map → _2f98781f._.js.map} +1 -1
  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/{_3bae8e09._.js → _966a446d._.js} +2 -2
  186. package/web/.next/server/chunks/ssr/_966a446d._.js.map +1 -0
  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/{_c98e033f._.js → _fa69c532._.js} +2 -2
  190. package/web/.next/server/chunks/ssr/{_c98e033f._.js.map → _fa69c532._.js.map} +1 -1
  191. package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_settings_settings-page-client_tsx_6ed9d5f8._.js +1 -1
  192. package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_settings_settings-page-client_tsx_6ed9d5f8._.js.map +1 -1
  193. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_888633e1.js +3 -0
  194. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_888633e1.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_ca99d62d._.js +1 -1
  200. package/web/.next/server/chunks/ssr/src_presentation_web_ca99d62d._.js.map +1 -1
  201. package/web/.next/server/chunks/ssr/{src_presentation_web_9f444130._.js → src_presentation_web_ce7cbc3c._.js} +3 -3
  202. package/web/.next/server/chunks/ssr/{src_presentation_web_d7392251._.js.map → src_presentation_web_ce7cbc3c._.js.map} +1 -1
  203. package/web/.next/server/chunks/ssr/src_presentation_web_components_bf50c527._.js +1 -1
  204. package/web/.next/server/chunks/ssr/src_presentation_web_components_de814675._.js +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_d7392251._.js → src_presentation_web_e2604413._.js} +3 -3
  208. package/web/.next/server/chunks/ssr/{src_presentation_web_9f444130._.js.map → src_presentation_web_e2604413._.js.map} +1 -1
  209. package/web/.next/server/pages/500.html +2 -2
  210. package/web/.next/server/server-reference-manifest.js +1 -1
  211. package/web/.next/server/server-reference-manifest.json +290 -219
  212. package/web/.next/static/chunks/{772fe887bd3200e4.js → 249bc4f5cd8521ea.js} +2 -2
  213. package/web/.next/static/chunks/5558a658fa82a01f.css +1 -0
  214. package/web/.next/static/chunks/{78f37724b73daecc.js → 5899695755eaa473.js} +1 -1
  215. package/web/.next/static/chunks/{7f53af94820dd254.js → 69aab1a047573cb4.js} +1 -1
  216. package/web/.next/static/chunks/{dcaecc4f31b2a9cf.js → 742a6e0450bd20f3.js} +1 -1
  217. package/web/.next/static/chunks/7c026a8c682b1a16.js +2 -0
  218. package/web/.next/static/chunks/{26d9daaa8e7ae994.js → 81c04fca969aebf0.js} +1 -1
  219. package/web/.next/static/chunks/{6fc75f45a90afaca.js → a1e6e3b5f8d5f78e.js} +1 -1
  220. package/web/.next/static/chunks/{8f29c6159bf2ace9.js → a9a3c672ca96cd12.js} +1 -1
  221. package/web/.next/static/chunks/{a941aad50e999afb.js → ab5b6ec6eeacc9bf.js} +1 -1
  222. package/web/.next/static/chunks/{9294c44a23259725.js → f6fafa215c01d77c.js} +1 -1
  223. package/web/.next/server/chunks/[root-of-the-server]__aae14de3._.js +0 -6
  224. package/web/.next/server/chunks/[root-of-the-server]__aae14de3._.js.map +0 -1
  225. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_7fc19e0a.js +0 -3
  226. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_7fc19e0a.js.map +0 -1
  227. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_c3aca900.js +0 -3
  228. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_c3aca900.js.map +0 -1
  229. package/web/.next/server/chunks/ssr/[root-of-the-server]__13dc8e37._.js +0 -3
  230. package/web/.next/server/chunks/ssr/[root-of-the-server]__13dc8e37._.js.map +0 -1
  231. package/web/.next/server/chunks/ssr/[root-of-the-server]__3a2d3067._.js +0 -3
  232. package/web/.next/server/chunks/ssr/[root-of-the-server]__3a2d3067._.js.map +0 -1
  233. package/web/.next/server/chunks/ssr/[root-of-the-server]__5f776c10._.js +0 -3
  234. package/web/.next/server/chunks/ssr/[root-of-the-server]__5f776c10._.js.map +0 -1
  235. package/web/.next/server/chunks/ssr/[root-of-the-server]__c03a4370._.js +0 -3
  236. package/web/.next/server/chunks/ssr/[root-of-the-server]__c03a4370._.js.map +0 -1
  237. package/web/.next/server/chunks/ssr/_3bae8e09._.js.map +0 -1
  238. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_85d37ebe.js +0 -3
  239. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_85d37ebe.js.map +0 -1
  240. package/web/.next/static/chunks/abe8df9f7d2e0ea2.js +0 -2
  241. package/web/.next/static/chunks/db122a6247f69104.css +0 -1
  242. /package/web/.next/static/{znGgra8ySC0iYcFiYbyxv → KzXiolX5g91WF6b-Yje6b}/_buildManifest.js +0 -0
  243. /package/web/.next/static/{znGgra8ySC0iYcFiYbyxv → KzXiolX5g91WF6b-Yje6b}/_clientMiddlewareManifest.json +0 -0
  244. /package/web/.next/static/{znGgra8ySC0iYcFiYbyxv → KzXiolX5g91WF6b-Yje6b}/_ssgManifest.js +0 -0
@@ -122,6 +122,10 @@ let GitPrService = class GitPrService {
122
122
  throw new Error(`Unable to determine default branch for repository at ${cwd}. ` +
123
123
  `No remote HEAD, no main/master branch, and no init.defaultBranch configured.`);
124
124
  }
125
+ async revParse(cwd, ref) {
126
+ const { stdout } = await this.execFile('git', ['rev-parse', ref], { cwd });
127
+ return stdout.trim();
128
+ }
125
129
  async hasUncommittedChanges(cwd) {
126
130
  const { stdout } = await this.execFile('git', ['status', '--porcelain'], { cwd });
127
131
  return stdout.trim().length > 0;
@@ -413,7 +417,7 @@ let GitPrService = class GitPrService {
413
417
  throw this.parseGhError(error);
414
418
  }
415
419
  }
416
- async verifyMerge(cwd, featureBranch, baseBranch) {
420
+ async verifyMerge(cwd, featureBranch, baseBranch, premergeBaseSha) {
417
421
  // Resolve the feature branch ref — the local branch may have been deleted
418
422
  // after a squash merge (git branch -d succeeds when pushed to remote).
419
423
  // Fall back to the remote tracking branch if the local ref is gone.
@@ -438,9 +442,24 @@ let GitPrService = class GitPrService {
438
442
  return true;
439
443
  }
440
444
  catch {
441
- // Exit code 1 = diff exists (not merged), other errors also mean unverified
442
- return false;
445
+ // Exit code 1 = diff exists (not merged), other errors also mean unverified.
446
+ // Fall through to premergeBaseSha check if available.
447
+ }
448
+ // Third fallback: if the caller recorded the base branch HEAD before the merge
449
+ // agent ran, check whether it advanced. This handles agents that legitimately
450
+ // modify the tree during squash merge (e.g. adding .gitignore, removing
451
+ // node_modules). If baseBranch HEAD moved forward, the agent committed something.
452
+ if (premergeBaseSha) {
453
+ try {
454
+ const { stdout } = await this.execFile('git', ['rev-parse', baseBranch], { cwd });
455
+ const currentSha = stdout.trim();
456
+ return currentSha !== premergeBaseSha;
457
+ }
458
+ catch {
459
+ return false;
460
+ }
443
461
  }
462
+ return false;
444
463
  }
445
464
  /**
446
465
  * Resolve a branch name to a valid git ref, falling back to the remote
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Check whether a process with the given PID is still running.
3
+ *
4
+ * Uses `process.kill(pid, 0)` which sends signal 0 (no-op) to test existence.
5
+ * Returns false when the PID does not exist or belongs to a zombie.
6
+ */
7
+ export declare function isProcessAlive(pid: number): boolean;
8
+ //# sourceMappingURL=is-process-alive.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"is-process-alive.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/src/infrastructure/services/process/is-process-alive.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAOnD"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Check whether a process with the given PID is still running.
3
+ *
4
+ * Uses `process.kill(pid, 0)` which sends signal 0 (no-op) to test existence.
5
+ * Returns false when the PID does not exist or belongs to a zombie.
6
+ */
7
+ export function isProcessAlive(pid) {
8
+ try {
9
+ process.kill(pid, 0);
10
+ return true;
11
+ }
12
+ catch {
13
+ return false;
14
+ }
15
+ }
@@ -7,7 +7,7 @@
7
7
  * - PID, port, URL (from daemon.json)
8
8
  * - Uptime (computed from startedAt)
9
9
  * - CPU%, RSS memory (from ps shell-out via execFile — injection-safe)
10
- * - Environment: paths, versions, agent executor versions
10
+ * - Environment: paths, versions
11
11
  *
12
12
  * Flags:
13
13
  * --logs [N] Show last N lines of daemon.log (default 50)
@@ -1 +1 @@
1
- {"version":3,"file":"status.command.d.ts","sourceRoot":"","sources":["../../../../../src/presentation/cli/commands/status.command.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAwLpC;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,OAAO,CAqH7C"}
1
+ {"version":3,"file":"status.command.d.ts","sourceRoot":"","sources":["../../../../../src/presentation/cli/commands/status.command.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAkKpC;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,OAAO,CAoG7C"}
@@ -7,7 +7,7 @@
7
7
  * - PID, port, URL (from daemon.json)
8
8
  * - Uptime (computed from startedAt)
9
9
  * - CPU%, RSS memory (from ps shell-out via execFile — injection-safe)
10
- * - Environment: paths, versions, agent executor versions
10
+ * - Environment: paths, versions
11
11
  *
12
12
  * Flags:
13
13
  * --logs [N] Show last N lines of daemon.log (default 50)
@@ -28,7 +28,6 @@ import { container } from '../../../../packages/core/src/infrastructure/di/conta
28
28
  import { getShepHomeDir, getShepDbPath, getDaemonStatePath, getDaemonLogPath, } from '../../../../packages/core/src/infrastructure/services/filesystem/shep-directory.service.js';
29
29
  import { renderDetailView, messages, colors } from '../ui/index.js';
30
30
  const PS_TIMEOUT_MS = 2000;
31
- const VERSION_CMD_TIMEOUT_MS = 3000;
32
31
  const DEFAULT_LOG_LINES = 50;
33
32
  /**
34
33
  * Parse ps output: "pid cpu% rss_kb\n"
@@ -88,26 +87,6 @@ function fetchPsMetrics(pid) {
88
87
  });
89
88
  });
90
89
  }
91
- /**
92
- * Detect the version of an agent executor CLI.
93
- * Returns version string or 'not installed'.
94
- */
95
- function detectAgentVersion(cmd, args) {
96
- return new Promise((resolve) => {
97
- execFile(cmd, args, { timeout: VERSION_CMD_TIMEOUT_MS }, (err, stdout) => {
98
- if (err) {
99
- resolve('not installed');
100
- }
101
- else {
102
- // Extract first line, strip leading labels like "claude-code v1.2.3" → "v1.2.3"
103
- const line = stdout.trim().split('\n')[0] ?? '';
104
- // Try to extract version-like string
105
- const match = line.match(/v?\d+\.\d+[\w.-]*/);
106
- resolve(match ? match[0] : line || 'unknown');
107
- }
108
- });
109
- });
110
- }
111
90
  /**
112
91
  * Read the last N lines of a file.
113
92
  */
@@ -224,15 +203,7 @@ export function createStatusCommand() {
224
203
  const url = `http://localhost:${port}`;
225
204
  const uptimeMs = Date.now() - Date.parse(startedAt);
226
205
  const uptime = humanizeUptime(uptimeMs);
227
- // Get agent CLI info from the factory
228
- const factory = container.resolve('IAgentExecutorFactory');
229
- const agentClis = factory.getCliInfo();
230
- // Fetch ps metrics and agent versions in parallel
231
- const [psMetrics, ...agentVersions] = await Promise.all([
232
- fetchPsMetrics(pid),
233
- ...agentClis.map((a) => detectAgentVersion(a.cmd, a.versionArgs)),
234
- ]);
235
- const { cpu, rssMb } = psMetrics;
206
+ const { cpu, rssMb } = await fetchPsMetrics(pid);
236
207
  // Get CLI version
237
208
  let cliVersion = 'unknown';
238
209
  try {
@@ -270,13 +241,6 @@ export function createStatusCommand() {
270
241
  { label: 'Daemon Config', value: getDaemonStatePath() },
271
242
  ],
272
243
  },
273
- {
274
- title: 'Agent Executors',
275
- fields: agentClis.map((agent, i) => ({
276
- label: agent.agentType,
277
- value: agentVersions[i],
278
- })),
279
- },
280
244
  ],
281
245
  });
282
246
  });
@@ -0,0 +1,5 @@
1
+ export declare function resumeFeature(featureId: string): Promise<{
2
+ resumed: boolean;
3
+ error?: string;
4
+ }>;
5
+ //# sourceMappingURL=resume-feature.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resume-feature.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/web/app/actions/resume-feature.ts"],"names":[],"mappings":"AAKA,wBAAsB,aAAa,CACjC,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAa/C"}
@@ -0,0 +1,16 @@
1
+ 'use server';
2
+ import { resolve } from '../../lib/server-container.js';
3
+ export async function resumeFeature(featureId) {
4
+ if (!featureId.trim()) {
5
+ return { resumed: false, error: 'Feature id is required' };
6
+ }
7
+ try {
8
+ const useCase = resolve('ResumeFeatureUseCase');
9
+ await useCase.execute(featureId);
10
+ return { resumed: true };
11
+ }
12
+ catch (error) {
13
+ const message = error instanceof Error ? error.message : 'Failed to resume feature';
14
+ return { resumed: false, error: message };
15
+ }
16
+ }
@@ -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;AAmEvC,wBAAgB,GAAG,CAAC,OAAO,EAAE,OAAO,GAAG,QAAQ,CAqP9C"}
1
+ {"version":3,"file":"route.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/app/api/agent-events/route.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAiBH,eAAO,MAAM,OAAO,kBAAkB,CAAC;AAqEvC,wBAAgB,GAAG,CAAC,OAAO,EAAE,OAAO,GAAG,QAAQ,CAuQ9C"}
@@ -15,6 +15,7 @@
15
15
  */
16
16
  import { resolve } from '../../../lib/server-container.js';
17
17
  import { AgentRunStatus, SdlcLifecycle, NotificationEventType, NotificationSeverity, } from '../../../../../../packages/core/src/domain/generated/output.js';
18
+ import { isProcessAlive } from '../../../../../../packages/core/src/infrastructure/services/process/is-process-alive.js';
18
19
  // Force dynamic — SSE streams must never be statically optimized or cached
19
20
  export const dynamic = 'force-dynamic';
20
21
  const POLL_INTERVAL_MS = 500;
@@ -157,6 +158,22 @@ export function GET(request) {
157
158
  });
158
159
  }
159
160
  }
161
+ // Check for crashed agent: status is running/pending but PID is dead
162
+ const isActive = run.status === AgentRunStatus.running || run.status === AgentRunStatus.pending;
163
+ if (isActive && run.pid && !prev.crashEmitted && !isProcessAlive(run.pid)) {
164
+ prev.crashEmitted = true;
165
+ const phase = resultToPhase(run.result);
166
+ emitEvent({
167
+ eventType: NotificationEventType.AgentFailed,
168
+ agentRunId: run.id,
169
+ featureId: feature.id,
170
+ featureName: feature.name,
171
+ ...(phase && { phaseName: phase }),
172
+ message: `Agent crashed (PID ${run.pid} dead)`,
173
+ severity: NotificationSeverity.Error,
174
+ timestamp: new Date().toISOString(),
175
+ });
176
+ }
160
177
  // Check for feature name change (AI metadata generation updates name)
161
178
  if (prev.featureName !== feature.name) {
162
179
  prev.featureName = feature.name;
@@ -1 +1 @@
1
- {"version":3,"file":"build-feature-node-data.d.ts","sourceRoot":"","sources":["../../../../../src/presentation/web/app/build-feature-node-data.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,sCAAsC,CAAC;AAM9E,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AAExE,MAAM,WAAW,2BAA2B;IAC1C,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,kDAAkD;IAClD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,4CAA4C;IAC5C,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,OAAO,EAChB,GAAG,EAAE,QAAQ,GAAG,IAAI,EACpB,OAAO,CAAC,EAAE,2BAA2B,GACpC,eAAe,CAiCjB"}
1
+ {"version":3,"file":"build-feature-node-data.d.ts","sourceRoot":"","sources":["../../../../../src/presentation/web/app/build-feature-node-data.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,sCAAsC,CAAC;AAQ9E,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AAExE,MAAM,WAAW,2BAA2B;IAC1C,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,kDAAkD;IAClD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,4CAA4C;IAC5C,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,OAAO,EAChB,GAAG,EAAE,QAAQ,GAAG,IAAI,EACpB,OAAO,CAAC,EAAE,2BAA2B,GACpC,eAAe,CAyCjB"}
@@ -1,9 +1,14 @@
1
+ import { AgentRunStatus } from '../../../../packages/core/src/domain/generated/output.js';
1
2
  import { deriveNodeState, deriveProgress, deriveLifecycle, } from '../components/common/feature-node/derive-feature-state.js';
3
+ import { isProcessAlive } from '../../../../packages/core/src/infrastructure/services/process/is-process-alive.js';
2
4
  /**
3
5
  * Builds a FeatureNodeData object from a Feature entity and optional AgentRun.
4
6
  * This is the single-feature version of the logic in `buildGraphNodes`.
5
7
  */
6
8
  export function buildFeatureNodeData(feature, run, options) {
9
+ // Detect crashed agents: DB says running/pending but PID is dead
10
+ const isActive = run?.status === AgentRunStatus.running || run?.status === AgentRunStatus.pending;
11
+ const pidAlive = isActive && run?.pid ? isProcessAlive(run.pid) : undefined;
7
12
  return {
8
13
  name: feature.name,
9
14
  description: feature.description ?? feature.slug,
@@ -12,7 +17,7 @@ export function buildFeatureNodeData(feature, run, options) {
12
17
  repositoryPath: feature.repositoryPath,
13
18
  branch: feature.branch,
14
19
  specPath: feature.specPath,
15
- state: deriveNodeState(feature, run),
20
+ state: deriveNodeState(feature, run, pidAlive !== undefined ? { isPidAlive: pidAlive } : undefined),
16
21
  progress: deriveProgress(feature),
17
22
  summary: feature.description,
18
23
  userQuery: feature.userQuery,
@@ -1 +1 @@
1
- {"version":3,"file":"build-graph-nodes.d.ts","sourceRoot":"","sources":["../../../../../src/presentation/web/app/build-graph-nodes.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,sCAAsC,CAAC;AAM1F,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uCAAuC,CAAC;AAC5E,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAG1C,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,OAAO,CAAC;IACjB,GAAG,EAAE,QAAQ,GAAG,IAAI,CAAC;CACtB;AAED;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAC7B,YAAY,EAAE,UAAU,EAAE,EAC1B,gBAAgB,EAAE,cAAc,EAAE,GACjC;IAAE,KAAK,EAAE,cAAc,EAAE,CAAC;IAAC,KAAK,EAAE,IAAI,EAAE,CAAA;CAAE,CAuE5C"}
1
+ {"version":3,"file":"build-graph-nodes.d.ts","sourceRoot":"","sources":["../../../../../src/presentation/web/app/build-graph-nodes.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,sCAAsC,CAAC;AAQ1F,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uCAAuC,CAAC;AAC5E,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAG1C,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,OAAO,CAAC;IACjB,GAAG,EAAE,QAAQ,GAAG,IAAI,CAAC;CACtB;AAED;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAC7B,YAAY,EAAE,UAAU,EAAE,EAC1B,gBAAgB,EAAE,cAAc,EAAE,GACjC;IAAE,KAAK,EAAE,cAAc,EAAE,CAAC;IAAC,KAAK,EAAE,IAAI,EAAE,CAAA;CAAE,CAuE5C"}
@@ -1,4 +1,6 @@
1
+ import { AgentRunStatus } from '../../../../packages/core/src/domain/generated/output.js';
1
2
  import { deriveNodeState, deriveProgress, deriveLifecycle, } from '../components/common/feature-node/derive-feature-state.js';
3
+ import { isProcessAlive } from '../../../../packages/core/src/infrastructure/services/process/is-process-alive.js';
2
4
  /**
3
5
  * Builds React Flow nodes and edges from persisted repositories and features.
4
6
  *
@@ -90,6 +92,9 @@ function appendFeatureNodes(repoFeatures, repoNodeId, allFeaturesWithRuns, nodes
90
92
  blockedBy = parentEntry.feature.name;
91
93
  }
92
94
  }
95
+ // Detect crashed agents: DB says running/pending but PID is dead
96
+ const isActive = run?.status === AgentRunStatus.running || run?.status === AgentRunStatus.pending;
97
+ const pidAlive = isActive && run?.pid ? isProcessAlive(run.pid) : undefined;
93
98
  const nodeData = {
94
99
  name: feature.name,
95
100
  description: feature.description ?? feature.slug,
@@ -98,7 +103,7 @@ function appendFeatureNodes(repoFeatures, repoNodeId, allFeaturesWithRuns, nodes
98
103
  repositoryPath: feature.repositoryPath,
99
104
  branch: feature.branch,
100
105
  specPath: feature.specPath,
101
- state: deriveNodeState(feature, run),
106
+ state: deriveNodeState(feature, run, pidAlive !== undefined ? { isPidAlive: pidAlive } : undefined),
102
107
  progress: deriveProgress(feature),
103
108
  summary: feature.description,
104
109
  userQuery: feature.userQuery,
@@ -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;AAI/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,2CA0hB1F"}
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":"AAuCA,OAAO,KAAK,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAI/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,2CAgjB1F"}
@@ -5,6 +5,7 @@ import { useRouter, usePathname } from 'next/navigation';
5
5
  import { toast } from 'sonner';
6
6
  import { Loader2, Trash2, Play, Square, Copy, Check, Code2, ExternalLink } from 'lucide-react';
7
7
  import { approveFeature } from '../../../app/actions/approve-feature.js';
8
+ import { resumeFeature } from '../../../app/actions/resume-feature.js';
8
9
  import { rejectFeature } from '../../../app/actions/reject-feature.js';
9
10
  import { getFeatureArtifact } from '../../../app/actions/get-feature-artifact.js';
10
11
  import { getResearchArtifact } from '../../../app/actions/get-research-artifact.js';
@@ -272,6 +273,24 @@ export function FeatureDrawerClient({ view: initialView, urlTab }) {
272
273
  setIsDeleting(false);
273
274
  }
274
275
  }, [router, deleteSound]);
276
+ const handleRetry = useCallback(async (featureId) => {
277
+ const result = await resumeFeature(featureId);
278
+ if (result.error) {
279
+ toast.error(result.error);
280
+ return;
281
+ }
282
+ toast.success('Feature resumed — agent restarting');
283
+ // Optimistically update canvas node
284
+ window.dispatchEvent(new CustomEvent('shep:feature-approved', {
285
+ detail: { featureId },
286
+ }));
287
+ // Optimistically update the drawer view
288
+ setView((prev) => {
289
+ if (prev.type !== 'feature')
290
+ return prev;
291
+ return { ...prev, node: { ...prev.node, state: 'running' } };
292
+ });
293
+ }, []);
275
294
  // ── Hooks (always called unconditionally per Rules of Hooks) ──────────
276
295
  const featureActionsInput = featureNode?.repositoryPath && featureNode?.branch
277
296
  ? {
@@ -313,7 +332,8 @@ export function FeatureDrawerClient({ view: initialView, urlTab }) {
313
332
  // ── Body ──────────────────────────────────────────────────────────────
314
333
  let body = null;
315
334
  if (view.type === 'feature' && featureNode) {
316
- body = (_jsx(FeatureDrawerTabs, { featureNode: featureNode, featureId: featureNode.featureId, initialTab: view.initialTab, urlTab: urlTab, sseEvents: events, prdData: prdData, prdSelections: prdSelections, onPrdSelect: (qId, oId) => setPrdSelections((prev) => ({ ...prev, [qId]: oId })), onPrdApprove: handlePrdApprove, onPrdReject: handlePrdReject, isPrdLoading: isLoadingPrd, techData: techData, onTechApprove: handleTechApprove, onTechReject: handleTechReject, isTechLoading: isLoadingTech, productData: isLoadingTechProduct ? null : techProductData, mergeData: mergeData, onMergeApprove: handleMergeApprove, onMergeReject: handleMergeReject, isMergeLoading: isLoadingMerge, isRejecting: isRejecting, chatInput: chatInput, onChatInputChange: setChatInput }));
335
+ const enrichedNode = featureNode.state === 'error' ? { ...featureNode, onRetry: handleRetry } : featureNode;
336
+ body = (_jsx(FeatureDrawerTabs, { featureNode: enrichedNode, featureId: featureNode.featureId, initialTab: view.initialTab, urlTab: urlTab, sseEvents: events, prdData: prdData, prdSelections: prdSelections, onPrdSelect: (qId, oId) => setPrdSelections((prev) => ({ ...prev, [qId]: oId })), onPrdApprove: handlePrdApprove, onPrdReject: handlePrdReject, isPrdLoading: isLoadingPrd, techData: techData, onTechApprove: handleTechApprove, onTechReject: handleTechReject, isTechLoading: isLoadingTech, productData: isLoadingTechProduct ? null : techProductData, mergeData: mergeData, onMergeApprove: handleMergeApprove, onMergeReject: handleMergeReject, isMergeLoading: isLoadingMerge, isRejecting: isRejecting, chatInput: chatInput, onChatInputChange: setChatInput }));
317
337
  }
318
338
  return (_jsx(BaseDrawer, { open: isOpen, onClose: attemptClose, size: "md", modal: false, header: header, "data-testid": view.type === 'feature' ? 'feature-drawer' : 'repository-drawer', children: body }));
319
339
  }
@@ -1 +1 @@
1
- {"version":3,"file":"overview-tab.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/feature-drawer-tabs/overview-tab.tsx"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AAOxE,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,eAAe,CAAC;CACvB;AAED,wBAAgB,WAAW,CAAC,EAAE,IAAI,EAAE,EAAE,gBAAgB,2CAwCrD"}
1
+ {"version":3,"file":"overview-tab.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/feature-drawer-tabs/overview-tab.tsx"],"names":[],"mappings":"AAmBA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AAOxE,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,eAAe,CAAC;CACvB;AAED,wBAAgB,WAAW,CAAC,EAAE,IAAI,EAAE,EAAE,gBAAgB,2CAoDrD"}
@@ -1,7 +1,7 @@
1
1
  'use client';
2
2
  import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
3
3
  import { useState, useEffect, useRef } from 'react';
4
- import { AlertTriangle, ExternalLink, GitBranch, GitCommitHorizontal, Zap } from 'lucide-react';
4
+ import { AlertTriangle, ExternalLink, GitBranch, GitCommitHorizontal, RotateCcw, Zap, } from 'lucide-react';
5
5
  import { InlineAttachments } from '../../common/inline-attachments/index.js';
6
6
  import { PrStatus } from '../../../../../../packages/core/src/domain/generated/output.js';
7
7
  import { cn } from '../../../lib/utils.js';
@@ -14,7 +14,7 @@ import { getAgentTypeIcon, agentTypeLabels, } from '../../common/feature-node/ag
14
14
  import { formatDuration } from '../../../lib/format-duration.js';
15
15
  export function OverviewTab({ data }) {
16
16
  const isCompleted = data.lifecycle === 'maintain';
17
- return (_jsxs(_Fragment, { children: [_jsxs("div", { "data-testid": "feature-drawer-status", className: "flex flex-col gap-3 p-4", children: [_jsx("div", { className: "text-muted-foreground text-xs font-semibold tracking-wider", children: lifecycleDisplayLabels[data.lifecycle] }), _jsx(FeatureStateBadge, { data: data }), !isCompleted && data.progress > 0 ? (_jsxs("div", { "data-testid": "feature-drawer-progress", className: "flex flex-col gap-1", children: [_jsxs("div", { className: "text-muted-foreground flex items-center justify-between text-xs", children: [_jsx("span", { children: "Progress" }), _jsxs("span", { children: [data.progress, "%"] })] }), _jsx("div", { className: "bg-muted h-2 w-full overflow-hidden rounded-full", children: _jsx("div", { className: cn('h-full rounded-full transition-all', featureNodeStateConfig[data.state].progressClass), style: { width: `${data.progress}%` } }) })] })) : null, isCompleted && data.pr ? _jsx(FeaturePrInfo, { pr: data.pr }) : null] }), _jsx(FeatureInfo, { data: data }), !isCompleted && data.pr ? (_jsxs(_Fragment, { children: [_jsx(Separator, {}), _jsx("div", { className: "p-4", children: _jsx(FeaturePrInfo, { pr: data.pr }) })] })) : null, _jsx(FeatureDetails, { data: data })] }));
17
+ return (_jsxs(_Fragment, { children: [_jsxs("div", { "data-testid": "feature-drawer-status", className: "flex flex-col gap-3 p-4", children: [_jsx("div", { className: "text-muted-foreground text-xs font-semibold tracking-wider", children: lifecycleDisplayLabels[data.lifecycle] }), _jsxs("div", { className: "flex items-center gap-2", children: [_jsx(FeatureStateBadge, { data: data }), data.state === 'error' && data.onRetry ? (_jsxs("button", { "data-testid": "feature-drawer-retry-button", onClick: () => data.onRetry(data.featureId), className: "flex shrink-0 cursor-pointer items-center gap-1.5 rounded-full bg-red-50 px-3 py-1.5 text-sm font-medium text-red-700 transition-colors hover:bg-red-100", children: [_jsx(RotateCcw, { className: "h-3.5 w-3.5" }), "Retry"] })) : null] }), !isCompleted && data.progress > 0 ? (_jsxs("div", { "data-testid": "feature-drawer-progress", className: "flex flex-col gap-1", children: [_jsxs("div", { className: "text-muted-foreground flex items-center justify-between text-xs", children: [_jsx("span", { children: "Progress" }), _jsxs("span", { children: [data.progress, "%"] })] }), _jsx("div", { className: "bg-muted h-2 w-full overflow-hidden rounded-full", children: _jsx("div", { className: cn('h-full rounded-full transition-all', featureNodeStateConfig[data.state].progressClass), style: { width: `${data.progress}%` } }) })] })) : null, isCompleted && data.pr ? _jsx(FeaturePrInfo, { pr: data.pr }) : null] }), _jsx(FeatureInfo, { data: data }), !isCompleted && data.pr ? (_jsxs(_Fragment, { children: [_jsx(Separator, {}), _jsx("div", { className: "p-4", children: _jsx(FeaturePrInfo, { pr: data.pr }) })] })) : null, _jsx(FeatureDetails, { data: data })] }));
18
18
  }
19
19
  function FeatureStateBadge({ data }) {
20
20
  const config = featureNodeStateConfig[data.state];
@@ -15,6 +15,8 @@ export declare const DoneWithMergedPr: Story;
15
15
  export declare const Blocked: Story;
16
16
  /** Error state showing error message detail. */
17
17
  export declare const Error: Story;
18
+ /** Error state with retry button visible. */
19
+ export declare const ErrorWithRetry: Story;
18
20
  /** Minimal data — only required fields, no optional details or PR. */
19
21
  export declare const Minimal: Story;
20
22
  /** Fast mode feature — shows lightning icon in details section. */
@@ -1 +1 @@
1
- {"version":3,"file":"overview-tab.stories.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/feature-drawer-tabs/overview-tab.stories.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAEvD,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAG7C,QAAA,MAAM,IAAI,EAAE,IAAI,CAAC,OAAO,WAAW,CAclC,CAAC;AAEF,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,WAAW,CAAC,CAAC;AA0G1C,uEAAuE;AACvE,eAAO,MAAM,OAAO,EAAE,KAErB,CAAC;AAEF,8CAA8C;AAC9C,eAAO,MAAM,IAAI,EAAE,KAElB,CAAC;AAEF,yDAAyD;AACzD,eAAO,MAAM,UAAU,EAAE,KAExB,CAAC;AAEF,wDAAwD;AACxD,eAAO,MAAM,gBAAgB,EAAE,KAE9B,CAAC;AAEF,iDAAiD;AACjD,eAAO,MAAM,OAAO,EAAE,KAErB,CAAC;AAEF,gDAAgD;AAChD,eAAO,MAAM,KAAK,EAAE,KAEnB,CAAC;AAEF,sEAAsE;AACtE,eAAO,MAAM,OAAO,EAAE,KAErB,CAAC;AAwBF,mEAAmE;AACnE,eAAO,MAAM,QAAQ,EAAE,KAEtB,CAAC;AAMF,0BAA0B;AAC1B,eAAO,MAAM,iBAAiB,EAAE,KAE/B,CAAC;AAEF,sBAAsB;AACtB,eAAO,MAAM,aAAa,EAAE,KAE3B,CAAC;AAEF,oBAAoB;AACpB,eAAO,MAAM,WAAW,EAAE,KAEzB,CAAC;AAEF,sBAAsB;AACtB,eAAO,MAAM,aAAa,EAAE,KAE3B,CAAC;AAEF,gEAAgE;AAChE,eAAO,MAAM,oBAAoB,EAAE,KAclC,CAAC;AAqBF,4DAA4D;AAC5D,eAAO,MAAM,sBAAsB,EAAE,KAEpC,CAAC;AAEF,sDAAsD;AACtD,eAAO,MAAM,gBAAgB,EAAE,KAO9B,CAAC;AAEF,+FAA+F;AAC/F,eAAO,MAAM,eAAe,EAAE,KAgB7B,CAAC"}
1
+ {"version":3,"file":"overview-tab.stories.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/feature-drawer-tabs/overview-tab.stories.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAGvD,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAG7C,QAAA,MAAM,IAAI,EAAE,IAAI,CAAC,OAAO,WAAW,CAclC,CAAC;AAEF,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,WAAW,CAAC,CAAC;AA0G1C,uEAAuE;AACvE,eAAO,MAAM,OAAO,EAAE,KAErB,CAAC;AAEF,8CAA8C;AAC9C,eAAO,MAAM,IAAI,EAAE,KAElB,CAAC;AAEF,yDAAyD;AACzD,eAAO,MAAM,UAAU,EAAE,KAExB,CAAC;AAEF,wDAAwD;AACxD,eAAO,MAAM,gBAAgB,EAAE,KAE9B,CAAC;AAEF,iDAAiD;AACjD,eAAO,MAAM,OAAO,EAAE,KAErB,CAAC;AAEF,gDAAgD;AAChD,eAAO,MAAM,KAAK,EAAE,KAEnB,CAAC;AAOF,6CAA6C;AAC7C,eAAO,MAAM,cAAc,EAAE,KAE5B,CAAC;AAEF,sEAAsE;AACtE,eAAO,MAAM,OAAO,EAAE,KAErB,CAAC;AAwBF,mEAAmE;AACnE,eAAO,MAAM,QAAQ,EAAE,KAEtB,CAAC;AAMF,0BAA0B;AAC1B,eAAO,MAAM,iBAAiB,EAAE,KAE/B,CAAC;AAEF,sBAAsB;AACtB,eAAO,MAAM,aAAa,EAAE,KAE3B,CAAC;AAEF,oBAAoB;AACpB,eAAO,MAAM,WAAW,EAAE,KAEzB,CAAC;AAEF,sBAAsB;AACtB,eAAO,MAAM,aAAa,EAAE,KAE3B,CAAC;AAEF,gEAAgE;AAChE,eAAO,MAAM,oBAAoB,EAAE,KAclC,CAAC;AAqBF,4DAA4D;AAC5D,eAAO,MAAM,sBAAsB,EAAE,KAEpC,CAAC;AAEF,sDAAsD;AACtD,eAAO,MAAM,gBAAgB,EAAE,KAO9B,CAAC;AAEF,+FAA+F;AAC/F,eAAO,MAAM,eAAe,EAAE,KAgB7B,CAAC"}
@@ -1,4 +1,5 @@
1
1
  import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { fn } from '@storybook/test';
2
3
  import { PrStatus, CiStatus } from '../../../../../../packages/core/src/domain/generated/output.js';
3
4
  import { OverviewTab } from './overview-tab.js';
4
5
  const meta = {
@@ -132,6 +133,14 @@ export const Blocked = {
132
133
  export const Error = {
133
134
  args: { data: errorData },
134
135
  };
136
+ const errorWithRetryData = {
137
+ ...errorData,
138
+ onRetry: fn(),
139
+ };
140
+ /** Error state with retry button visible. */
141
+ export const ErrorWithRetry = {
142
+ args: { data: errorWithRetryData },
143
+ };
135
144
  /** Minimal data — only required fields, no optional details or PR. */
136
145
  export const Minimal = {
137
146
  args: { data: minimalData },
@@ -13,12 +13,14 @@ import type { FeatureNodeState, FeatureLifecyclePhase } from './feature-node-sta
13
13
  * Priority (mirrors CLI formatStatus):
14
14
  * 1. Agent waiting_approval → action-required
15
15
  * 2. Agent failed → error
16
- * 3. Agent interrupted/cancelled → blocked
16
+ * 3. Agent interrupted/cancelled → error
17
17
  * 4. Agent completed + Maintain lifecycle → done
18
18
  * 5. Agent running/pending → running
19
19
  * 6. No agent run → fall back to plan tasks / lifecycle
20
20
  */
21
- export declare function deriveNodeState(feature: Feature, agentRun?: AgentRun | null): FeatureNodeState;
21
+ export declare function deriveNodeState(feature: Feature, agentRun?: AgentRun | null, options?: {
22
+ isPidAlive?: boolean;
23
+ }): FeatureNodeState;
22
24
  /**
23
25
  * Derives progress percentage from Feature.plan.tasks.
24
26
  *
@@ -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,CAiD9F;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,CAYvD;AAED,oGAAoG;AACpG,wBAAgB,mBAAmB,CAAC,SAAS,EAAE,qBAAqB,GAAG,gBAAgB,CAoBtF;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,CAC7B,OAAO,EAAE,OAAO,EAChB,QAAQ,CAAC,EAAE,QAAQ,GAAG,IAAI,EAC1B,OAAO,CAAC,EAAE;IAAE,UAAU,CAAC,EAAE,OAAO,CAAA;CAAE,GACjC,gBAAgB,CAkDlB;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,CAYvD;AAED,oGAAoG;AACpG,wBAAgB,mBAAmB,CAAC,SAAS,EAAE,qBAAqB,GAAG,gBAAgB,CAoBtF;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"}
@@ -11,12 +11,12 @@ import { SdlcLifecycle, AgentRunStatus, TaskState, NotificationEventType, } from
11
11
  * Priority (mirrors CLI formatStatus):
12
12
  * 1. Agent waiting_approval → action-required
13
13
  * 2. Agent failed → error
14
- * 3. Agent interrupted/cancelled → blocked
14
+ * 3. Agent interrupted/cancelled → error
15
15
  * 4. Agent completed + Maintain lifecycle → done
16
16
  * 5. Agent running/pending → running
17
17
  * 6. No agent run → fall back to plan tasks / lifecycle
18
18
  */
19
- export function deriveNodeState(feature, agentRun) {
19
+ export function deriveNodeState(feature, agentRun, options) {
20
20
  // Deleting lifecycle takes top priority — feature is being removed
21
21
  if (feature.lifecycle === SdlcLifecycle.Deleting) {
22
22
  return 'deleting';
@@ -33,11 +33,13 @@ export function deriveNodeState(feature, agentRun) {
33
33
  return 'error';
34
34
  case AgentRunStatus.interrupted:
35
35
  case AgentRunStatus.cancelled:
36
- return 'blocked';
36
+ return 'error';
37
37
  case AgentRunStatus.completed:
38
38
  return 'done';
39
39
  case AgentRunStatus.running:
40
40
  case AgentRunStatus.pending:
41
+ if (options?.isPidAlive === false)
42
+ return 'error';
41
43
  return 'running';
42
44
  }
43
45
  }
@@ -67,6 +67,7 @@ export interface FeatureNodeData {
67
67
  onAction?: () => void;
68
68
  onSettings?: () => void;
69
69
  onDelete?: (featureId: string, cleanup?: boolean) => void;
70
+ onRetry?: (featureId: string) => void;
70
71
  showHandles?: boolean;
71
72
  }
72
73
  export type FeatureNodeType = Node<FeatureNodeData, 'featureNode'>;
@@ -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 +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,2CAoSA"}
1
+ {"version":3,"file":"feature-node.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/feature-node/feature-node.tsx"],"names":[],"mappings":"AAwBA,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,2CAqTA"}
@@ -2,7 +2,7 @@
2
2
  import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
3
3
  import { useState } from 'react';
4
4
  import { Handle, Position } from '@xyflow/react';
5
- import { Plus, FileText, Wrench, GitMerge, Trash2, Zap, Loader2, Globe, } from 'lucide-react';
5
+ import { Plus, FileText, Wrench, GitMerge, Trash2, Zap, Loader2, Globe, RotateCcw, } from 'lucide-react';
6
6
  import { cn } from '../../../lib/utils.js';
7
7
  import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from '../../ui/tooltip.js';
8
8
  import { DeleteFeatureDialog } from '../../common/delete-feature-dialog/index.js';
@@ -82,13 +82,16 @@ 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 === '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
- const override = getActionRequiredBadgeClasses(data);
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
- })(), children: [(() => {
89
- const BadgeIcon = getBadgeIcon(data);
90
- return _jsx(BadgeIcon, { className: "h-3.5 w-3.5 shrink-0" });
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) => {
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", { className: "mt-1.5 flex items-center gap-1.5", children: [_jsxs("div", { "data-testid": "feature-node-badge", className: (() => {
86
+ const override = getActionRequiredBadgeClasses(data);
87
+ return cn('flex min-w-0 flex-1 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
+ })(), children: [(() => {
89
+ const BadgeIcon = getBadgeIcon(data);
90
+ return _jsx(BadgeIcon, { className: "h-3.5 w-3.5 shrink-0" });
91
+ })(), _jsx("span", { className: "truncate", children: getBadgeText(data) })] }), data.state === 'error' && data.onRetry ? (_jsxs("button", { type: "button", "aria-label": "Retry feature", "data-testid": "feature-node-retry-button", onClick: (e) => {
92
+ e.stopPropagation();
93
+ data.onRetry(data.featureId);
94
+ }, className: "nodrag flex shrink-0 cursor-pointer items-center gap-1 rounded-full bg-red-100 px-2.5 py-1 text-[11px] font-medium text-red-700 transition-colors hover:bg-red-200", children: [_jsx(RotateCcw, { className: "h-3 w-3" }), "Retry"] })) : null] })] })) })] }), 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
95
  e.stopPropagation();
93
96
  data.onAction?.();
94
97
  }, 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] }));
@@ -15,6 +15,7 @@ export declare const Creating: Story;
15
15
  export declare const MergeReviewActionRequired: Story;
16
16
  export declare const Deleting: Story;
17
17
  export declare const ErrorWithMessage: Story;
18
+ export declare const ErrorWithRetry: Story;
18
19
  export declare const WithDeleteButton: Story;
19
20
  export declare const FastMode: Story;
20
21
  export declare const FastModeDone: 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;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"}
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,cAAc,EAAE,KAY5B,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"}
@@ -319,6 +319,19 @@ export const ErrorWithMessage = {
319
319
  },
320
320
  render: (args) => _jsx(FeatureNodeCanvas, { data: args }),
321
321
  };
322
+ export const ErrorWithRetry = {
323
+ args: {
324
+ name: 'Email Service',
325
+ description: 'Transactional email with SendGrid',
326
+ featureId: '#f5',
327
+ lifecycle: 'review',
328
+ state: 'error',
329
+ progress: 30,
330
+ errorMessage: 'Build failed: type mismatch',
331
+ onRetry: fn(),
332
+ },
333
+ render: (args) => _jsx(FeatureNodeCanvas, { data: args }),
334
+ };
322
335
  export const WithDeleteButton = {
323
336
  args: {
324
337
  name: 'Auth Module',
@@ -1 +1 @@
1
- {"version":3,"file":"control-center-inner.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/features/control-center/control-center-inner.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,IAAI,EAAY,MAAM,eAAe,CAAC;AAGpD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uCAAuC,CAAC;AAsB5E,UAAU,uBAAuB;IAC/B,YAAY,EAAE,cAAc,EAAE,CAAC;IAC/B,YAAY,EAAE,IAAI,EAAE,CAAC;CACtB;AAED,wBAAgB,kBAAkB,CAAC,EAAE,YAAY,EAAE,YAAY,EAAE,EAAE,uBAAuB,2CAoTzF"}
1
+ {"version":3,"file":"control-center-inner.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/features/control-center/control-center-inner.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,IAAI,EAAY,MAAM,eAAe,CAAC;AAGpD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uCAAuC,CAAC;AAsB5E,UAAU,uBAAuB;IAC/B,YAAY,EAAE,cAAc,EAAE,CAAC;IAC/B,YAAY,EAAE,IAAI,EAAE,CAAC;CACtB;AAED,wBAAgB,kBAAkB,CAAC,EAAE,YAAY,EAAE,YAAY,EAAE,EAAE,uBAAuB,2CAuTzF"}