@shepai/cli 1.106.4 → 1.107.0-pr330.e164f47

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 (311) 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/(dashboard)/@drawer/feature/[featureId]/page.d.ts.map +1 -1
  38. package/dist/src/presentation/web/app/(dashboard)/@drawer/feature/[featureId]/page.js +5 -48
  39. package/dist/src/presentation/web/app/actions/get-feature-drawer-data.d.ts +8 -0
  40. package/dist/src/presentation/web/app/actions/get-feature-drawer-data.d.ts.map +1 -0
  41. package/dist/src/presentation/web/app/actions/get-feature-drawer-data.js +67 -0
  42. package/dist/src/presentation/web/app/actions/resume-feature.d.ts +5 -0
  43. package/dist/src/presentation/web/app/actions/resume-feature.d.ts.map +1 -0
  44. package/dist/src/presentation/web/app/actions/resume-feature.js +16 -0
  45. package/dist/src/presentation/web/app/api/agent-events/route.d.ts.map +1 -1
  46. package/dist/src/presentation/web/app/api/agent-events/route.js +17 -0
  47. package/dist/src/presentation/web/app/api/graph-data/route.d.ts +14 -0
  48. package/dist/src/presentation/web/app/api/graph-data/route.d.ts.map +1 -0
  49. package/dist/src/presentation/web/app/api/graph-data/route.js +14 -0
  50. package/dist/src/presentation/web/app/api/version/route.d.ts +3 -6
  51. package/dist/src/presentation/web/app/api/version/route.d.ts.map +1 -1
  52. package/dist/src/presentation/web/app/api/version/route.js +29 -15
  53. package/dist/src/presentation/web/app/build-feature-node-data.d.ts.map +1 -1
  54. package/dist/src/presentation/web/app/build-feature-node-data.js +6 -1
  55. package/dist/src/presentation/web/app/build-graph-nodes.d.ts.map +1 -1
  56. package/dist/src/presentation/web/app/build-graph-nodes.js +6 -1
  57. package/dist/src/presentation/web/components/common/control-center-drawer/feature-drawer-client.d.ts.map +1 -1
  58. package/dist/src/presentation/web/components/common/control-center-drawer/feature-drawer-client.js +30 -26
  59. package/dist/src/presentation/web/components/common/control-center-drawer/use-drawer-sync.d.ts +12 -0
  60. package/dist/src/presentation/web/components/common/control-center-drawer/use-drawer-sync.d.ts.map +1 -0
  61. package/dist/src/presentation/web/components/common/control-center-drawer/use-drawer-sync.js +75 -0
  62. package/dist/src/presentation/web/components/common/feature-drawer-tabs/feature-drawer-tabs.d.ts.map +1 -1
  63. package/dist/src/presentation/web/components/common/feature-drawer-tabs/feature-drawer-tabs.js +3 -1
  64. package/dist/src/presentation/web/components/common/feature-drawer-tabs/overview-tab.d.ts.map +1 -1
  65. package/dist/src/presentation/web/components/common/feature-drawer-tabs/overview-tab.js +2 -2
  66. package/dist/src/presentation/web/components/common/feature-drawer-tabs/overview-tab.stories.d.ts +2 -0
  67. package/dist/src/presentation/web/components/common/feature-drawer-tabs/overview-tab.stories.d.ts.map +1 -1
  68. package/dist/src/presentation/web/components/common/feature-drawer-tabs/overview-tab.stories.js +9 -0
  69. package/dist/src/presentation/web/components/common/feature-node/derive-feature-state.d.ts +4 -2
  70. package/dist/src/presentation/web/components/common/feature-node/derive-feature-state.d.ts.map +1 -1
  71. package/dist/src/presentation/web/components/common/feature-node/derive-feature-state.js +5 -3
  72. package/dist/src/presentation/web/components/common/feature-node/feature-node-state-config.d.ts +1 -0
  73. package/dist/src/presentation/web/components/common/feature-node/feature-node-state-config.d.ts.map +1 -1
  74. package/dist/src/presentation/web/components/common/feature-node/feature-node.d.ts.map +1 -1
  75. package/dist/src/presentation/web/components/common/feature-node/feature-node.js +11 -8
  76. package/dist/src/presentation/web/components/common/feature-node/feature-node.stories.d.ts +1 -0
  77. package/dist/src/presentation/web/components/common/feature-node/feature-node.stories.d.ts.map +1 -1
  78. package/dist/src/presentation/web/components/common/feature-node/feature-node.stories.js +13 -0
  79. package/dist/src/presentation/web/components/features/control-center/control-center-inner.d.ts.map +1 -1
  80. package/dist/src/presentation/web/components/features/control-center/control-center-inner.js +3 -1
  81. package/dist/src/presentation/web/components/features/control-center/use-control-center-state.d.ts +1 -0
  82. package/dist/src/presentation/web/components/features/control-center/use-control-center-state.d.ts.map +1 -1
  83. package/dist/src/presentation/web/components/features/control-center/use-control-center-state.js +27 -2
  84. package/dist/src/presentation/web/hooks/use-graph-state.d.ts.map +1 -1
  85. package/dist/src/presentation/web/hooks/use-graph-state.js +27 -0
  86. package/dist/src/presentation/web/hooks/use-sound.d.ts.map +1 -1
  87. package/dist/src/presentation/web/hooks/use-sound.js +13 -3
  88. package/dist/src/presentation/web/lib/derive-graph.d.ts +2 -0
  89. package/dist/src/presentation/web/lib/derive-graph.d.ts.map +1 -1
  90. package/dist/src/presentation/web/lib/derive-graph.js +5 -0
  91. package/dist/src/presentation/web/lib/version.d.ts +5 -5
  92. package/dist/src/presentation/web/lib/version.d.ts.map +1 -1
  93. package/dist/src/presentation/web/lib/version.js +26 -12
  94. package/dist/tsconfig.build.tsbuildinfo +1 -1
  95. package/package.json +1 -1
  96. package/web/.next/BUILD_ID +1 -1
  97. package/web/.next/app-path-routes-manifest.json +1 -0
  98. package/web/.next/build-manifest.json +2 -2
  99. package/web/.next/fallback-build-manifest.json +2 -2
  100. package/web/.next/prerender-manifest.json +3 -3
  101. package/web/.next/required-server-files.js +3 -3
  102. package/web/.next/required-server-files.json +3 -3
  103. package/web/.next/routes-manifest.json +6 -0
  104. package/web/.next/server/app/(dashboard)/@drawer/create/page/server-reference-manifest.json +53 -53
  105. package/web/.next/server/app/(dashboard)/@drawer/create/page.js +3 -3
  106. package/web/.next/server/app/(dashboard)/@drawer/create/page.js.nft.json +1 -1
  107. package/web/.next/server/app/(dashboard)/@drawer/create/page_client-reference-manifest.js +1 -1
  108. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page/server-reference-manifest.json +78 -63
  109. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page.js +4 -4
  110. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page.js.nft.json +1 -1
  111. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page_client-reference-manifest.js +1 -1
  112. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page/server-reference-manifest.json +78 -63
  113. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js +4 -4
  114. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js.nft.json +1 -1
  115. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page_client-reference-manifest.js +1 -1
  116. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page/server-reference-manifest.json +49 -49
  117. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js +3 -3
  118. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js.nft.json +1 -1
  119. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  120. package/web/.next/server/app/(dashboard)/create/page/server-reference-manifest.json +53 -53
  121. package/web/.next/server/app/(dashboard)/create/page.js +3 -3
  122. package/web/.next/server/app/(dashboard)/create/page.js.nft.json +1 -1
  123. package/web/.next/server/app/(dashboard)/create/page_client-reference-manifest.js +1 -1
  124. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page/server-reference-manifest.json +78 -63
  125. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page.js +4 -4
  126. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page.js.nft.json +1 -1
  127. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page_client-reference-manifest.js +1 -1
  128. package/web/.next/server/app/(dashboard)/feature/[featureId]/page/server-reference-manifest.json +78 -63
  129. package/web/.next/server/app/(dashboard)/feature/[featureId]/page.js +4 -4
  130. package/web/.next/server/app/(dashboard)/feature/[featureId]/page.js.nft.json +1 -1
  131. package/web/.next/server/app/(dashboard)/feature/[featureId]/page_client-reference-manifest.js +1 -1
  132. package/web/.next/server/app/(dashboard)/page/server-reference-manifest.json +49 -49
  133. package/web/.next/server/app/(dashboard)/page.js +3 -3
  134. package/web/.next/server/app/(dashboard)/page.js.nft.json +1 -1
  135. package/web/.next/server/app/(dashboard)/page_client-reference-manifest.js +1 -1
  136. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page/server-reference-manifest.json +49 -49
  137. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js +3 -3
  138. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js.nft.json +1 -1
  139. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  140. package/web/.next/server/app/_global-error.html +2 -2
  141. package/web/.next/server/app/_global-error.rsc +1 -1
  142. package/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  143. package/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  144. package/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  145. package/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  146. package/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  147. package/web/.next/server/app/_not-found/page/server-reference-manifest.json +1 -1
  148. package/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  149. package/web/.next/server/app/api/agent-events/route.js +1 -1
  150. package/web/.next/server/app/api/agent-events/route.js.nft.json +1 -1
  151. package/web/.next/server/app/api/attachments/preview/route.js.nft.json +1 -1
  152. package/web/.next/server/app/api/attachments/upload-from-path/route.js +1 -1
  153. package/web/.next/server/app/api/attachments/upload-from-path/route.js.nft.json +1 -1
  154. package/web/.next/server/app/api/evidence/route.js.nft.json +1 -1
  155. package/web/.next/server/app/api/feature-logs/route.js +1 -1
  156. package/web/.next/server/app/api/feature-logs/route.js.nft.json +1 -1
  157. package/web/.next/server/app/api/graph-data/route/app-paths-manifest.json +3 -0
  158. package/web/.next/server/app/api/graph-data/route/build-manifest.json +11 -0
  159. package/web/.next/server/app/api/graph-data/route/server-reference-manifest.json +4 -0
  160. package/web/.next/server/app/api/graph-data/route.js +8 -0
  161. package/web/.next/server/app/api/graph-data/route.js.map +5 -0
  162. package/web/.next/server/app/api/graph-data/route.js.nft.json +1 -0
  163. package/web/.next/server/app/api/graph-data/route_client-reference-manifest.js +2 -0
  164. package/web/.next/server/app/api/version/route.js +1 -1
  165. package/web/.next/server/app/api/version/route.js.nft.json +1 -1
  166. package/web/.next/server/app/settings/page/server-reference-manifest.json +5 -5
  167. package/web/.next/server/app/settings/page.js.nft.json +1 -1
  168. package/web/.next/server/app/settings/page_client-reference-manifest.js +1 -1
  169. package/web/.next/server/app/skills/page/server-reference-manifest.json +6 -6
  170. package/web/.next/server/app/skills/page.js.nft.json +1 -1
  171. package/web/.next/server/app/skills/page_client-reference-manifest.js +1 -1
  172. package/web/.next/server/app/tools/page/server-reference-manifest.json +6 -6
  173. package/web/.next/server/app/tools/page.js.nft.json +1 -1
  174. package/web/.next/server/app/tools/page_client-reference-manifest.js +1 -1
  175. package/web/.next/server/app/version/page/server-reference-manifest.json +1 -1
  176. package/web/.next/server/app/version/page.js +1 -1
  177. package/web/.next/server/app/version/page.js.nft.json +1 -1
  178. package/web/.next/server/app/version/page_client-reference-manifest.js +1 -1
  179. package/web/.next/server/app-paths-manifest.json +1 -0
  180. package/web/.next/server/chunks/403f9_next_dist_esm_build_templates_app-route_370c43b1.js +3 -0
  181. package/web/.next/server/chunks/403f9_next_dist_esm_build_templates_app-route_370c43b1.js.map +1 -0
  182. package/web/.next/server/chunks/403f9_next_dist_esm_build_templates_app-route_4d623b8e.js +2 -2
  183. package/web/.next/server/chunks/403f9_next_dist_esm_build_templates_app-route_4d623b8e.js.map +1 -1
  184. package/web/.next/server/chunks/744ca_web__next-internal_server_app_api_graph-data_route_actions_26df8a4e.js +3 -0
  185. package/web/.next/server/chunks/744ca_web__next-internal_server_app_api_graph-data_route_actions_26df8a4e.js.map +1 -0
  186. package/web/.next/server/chunks/[root-of-the-server]__7d5492a0._.js +3 -0
  187. package/web/.next/server/chunks/[root-of-the-server]__7d5492a0._.js.map +1 -0
  188. package/web/.next/server/chunks/[root-of-the-server]__a402b567._.js +3 -0
  189. package/web/.next/server/chunks/[root-of-the-server]__a402b567._.js.map +1 -0
  190. package/web/.next/server/chunks/{[root-of-the-server]__db04ed44._.js → [root-of-the-server]__a5879003._.js} +2 -2
  191. package/web/.next/server/chunks/[root-of-the-server]__cd67a84c._.js +3 -0
  192. package/web/.next/server/chunks/[root-of-the-server]__cd67a84c._.js.map +1 -0
  193. package/web/.next/server/chunks/{[root-of-the-server]__91d44424._.js → [root-of-the-server]__d8037e14._.js} +2 -2
  194. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js +1 -1
  195. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js.map +1 -1
  196. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_a1104008.js +3 -0
  197. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_a1104008.js.map +1 -0
  198. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_92642200.js +3 -0
  199. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_92642200.js.map +1 -0
  200. package/web/.next/server/chunks/ssr/[root-of-the-server]__039967e3._.js +3 -0
  201. package/web/.next/server/chunks/ssr/[root-of-the-server]__039967e3._.js.map +1 -0
  202. package/web/.next/server/chunks/ssr/[root-of-the-server]__07a39ff2._.js +3 -0
  203. package/web/.next/server/chunks/ssr/[root-of-the-server]__07a39ff2._.js.map +1 -0
  204. package/web/.next/server/chunks/ssr/[root-of-the-server]__11033878._.js +1 -1
  205. package/web/.next/server/chunks/ssr/[root-of-the-server]__11033878._.js.map +1 -1
  206. package/web/.next/server/chunks/ssr/[root-of-the-server]__24dd0927._.js +2 -2
  207. package/web/.next/server/chunks/ssr/[root-of-the-server]__24dd0927._.js.map +1 -1
  208. package/web/.next/server/chunks/ssr/[root-of-the-server]__2773312c._.js +3 -0
  209. package/web/.next/server/chunks/ssr/[root-of-the-server]__2773312c._.js.map +1 -0
  210. package/web/.next/server/chunks/ssr/[root-of-the-server]__5d87af2e._.js +1 -1
  211. package/web/.next/server/chunks/ssr/[root-of-the-server]__684a868c._.js +3 -0
  212. package/web/.next/server/chunks/ssr/[root-of-the-server]__684a868c._.js.map +1 -0
  213. package/web/.next/server/chunks/ssr/[root-of-the-server]__845a9d2a._.js +1 -1
  214. package/web/.next/server/chunks/ssr/[root-of-the-server]__845a9d2a._.js.map +1 -1
  215. package/web/.next/server/chunks/ssr/[root-of-the-server]__89e8a5cc._.js +2 -2
  216. package/web/.next/server/chunks/ssr/[root-of-the-server]__aad040c0._.js +2 -2
  217. package/web/.next/server/chunks/ssr/[root-of-the-server]__aad040c0._.js.map +1 -1
  218. package/web/.next/server/chunks/ssr/[root-of-the-server]__c16bf5de._.js +3 -0
  219. package/web/.next/server/chunks/ssr/[root-of-the-server]__c16bf5de._.js.map +1 -0
  220. package/web/.next/server/chunks/ssr/[root-of-the-server]__cbd8062c._.js +3 -0
  221. package/web/.next/server/chunks/ssr/[root-of-the-server]__cbd8062c._.js.map +1 -0
  222. package/web/.next/server/chunks/ssr/[root-of-the-server]__e70c5627._.js +3 -0
  223. package/web/.next/server/chunks/ssr/[root-of-the-server]__e70c5627._.js.map +1 -0
  224. package/web/.next/server/chunks/ssr/[root-of-the-server]__fdc75809._.js +1 -1
  225. package/web/.next/server/chunks/ssr/[root-of-the-server]__fdc75809._.js.map +1 -1
  226. package/web/.next/server/chunks/ssr/{_a8d9cc2f._.js → _0f2b39f5._.js} +2 -2
  227. package/web/.next/server/chunks/ssr/{_a8d9cc2f._.js.map → _0f2b39f5._.js.map} +1 -1
  228. package/web/.next/server/chunks/ssr/_135edb9c._.js +1 -1
  229. package/web/.next/server/chunks/ssr/_135edb9c._.js.map +1 -1
  230. package/web/.next/server/chunks/ssr/_250a63ae._.js +3 -0
  231. package/web/.next/server/chunks/ssr/_250a63ae._.js.map +1 -0
  232. package/web/.next/server/chunks/ssr/{_4059434a._.js → _7cb5afad._.js} +2 -2
  233. package/web/.next/server/chunks/ssr/{_4059434a._.js.map → _7cb5afad._.js.map} +1 -1
  234. package/web/.next/server/chunks/ssr/_8dacd1e7._.js +1 -1
  235. package/web/.next/server/chunks/ssr/_8dacd1e7._.js.map +1 -1
  236. package/web/.next/server/chunks/ssr/_cc77a143._.js +1 -1
  237. package/web/.next/server/chunks/ssr/_cc77a143._.js.map +1 -1
  238. package/web/.next/server/chunks/ssr/_e6f2da4f._.js.map +1 -1
  239. package/web/.next/server/chunks/ssr/{_0619c65b._.js → _e8deff2b._.js} +2 -2
  240. package/web/.next/server/chunks/ssr/_e8deff2b._.js.map +1 -0
  241. package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_settings_settings-page-client_tsx_6ed9d5f8._.js +1 -1
  242. package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_settings_settings-page-client_tsx_6ed9d5f8._.js.map +1 -1
  243. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_888633e1.js +3 -0
  244. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_888633e1.js.map +1 -0
  245. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_skills_page_actions_1fa8042e.js +1 -1
  246. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_skills_page_actions_1fa8042e.js.map +1 -1
  247. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_tools_page_actions_24684200.js +1 -1
  248. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_tools_page_actions_24684200.js.map +1 -1
  249. package/web/.next/server/chunks/ssr/src_presentation_web_ca99d62d._.js +3 -0
  250. package/web/.next/server/chunks/ssr/src_presentation_web_ca99d62d._.js.map +1 -0
  251. package/web/.next/server/chunks/ssr/{src_presentation_web_758dfa10._.js → src_presentation_web_ce7cbc3c._.js} +3 -3
  252. package/web/.next/server/chunks/ssr/{src_presentation_web_758dfa10._.js.map → src_presentation_web_ce7cbc3c._.js.map} +1 -1
  253. package/web/.next/server/chunks/ssr/src_presentation_web_components_bf50c527._.js +1 -1
  254. package/web/.next/server/chunks/ssr/src_presentation_web_components_de814675._.js +1 -1
  255. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js +1 -1
  256. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js.map +1 -1
  257. package/web/.next/server/chunks/ssr/{src_presentation_web_7275ce5d._.js → src_presentation_web_e2604413._.js} +3 -3
  258. package/web/.next/server/chunks/ssr/{src_presentation_web_7275ce5d._.js.map → src_presentation_web_e2604413._.js.map} +1 -1
  259. package/web/.next/server/pages/500.html +2 -2
  260. package/web/.next/server/server-reference-manifest.js +1 -1
  261. package/web/.next/server/server-reference-manifest.json +321 -285
  262. package/web/.next/static/chunks/{15e6c83214978e2a.js → 0822ebbebff2718d.js} +1 -1
  263. package/web/.next/static/chunks/{8a2e6fabcbb6720d.js → 14a2cef371a9f42d.js} +1 -1
  264. package/web/.next/static/chunks/{abb2cdec13050512.js → 262f024806123251.js} +1 -1
  265. package/web/.next/static/chunks/505ff1e0712e80f9.js +2 -0
  266. package/web/.next/static/chunks/5558a658fa82a01f.css +1 -0
  267. package/web/.next/static/chunks/{7f3823482bd3f594.js → 606cf866494330d2.js} +1 -1
  268. package/web/.next/static/chunks/{524307fe3f73c1cf.js → 7e2854d3352f7f50.js} +2 -2
  269. package/web/.next/static/chunks/{71733e636d34974a.js → bc638bb542a3718b.js} +1 -1
  270. package/web/.next/static/chunks/{9144d63a39898da5.js → e7cd8862950038a6.js} +1 -1
  271. package/web/.next/static/chunks/{229caf9bd06f0c45.js → ee097d181dc97a5d.js} +2 -2
  272. package/web/.next/static/chunks/{cacd384748cf0bd2.js → f20192b3d50908b7.js} +1 -1
  273. package/dist/src/presentation/web/app/actions/get-graph-data.d.ts +0 -10
  274. package/dist/src/presentation/web/app/actions/get-graph-data.d.ts.map +0 -1
  275. package/dist/src/presentation/web/app/actions/get-graph-data.js +0 -10
  276. package/web/.next/server/chunks/[root-of-the-server]__3b22a1eb._.js +0 -3
  277. package/web/.next/server/chunks/[root-of-the-server]__3b22a1eb._.js.map +0 -1
  278. package/web/.next/server/chunks/[root-of-the-server]__f47bb8a5._.js +0 -3
  279. package/web/.next/server/chunks/[root-of-the-server]__f47bb8a5._.js.map +0 -1
  280. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_0a7546ed.js +0 -3
  281. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_0a7546ed.js.map +0 -1
  282. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_978cbb4c.js +0 -3
  283. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_978cbb4c.js.map +0 -1
  284. package/web/.next/server/chunks/ssr/[root-of-the-server]__357d99f9._.js +0 -3
  285. package/web/.next/server/chunks/ssr/[root-of-the-server]__357d99f9._.js.map +0 -1
  286. package/web/.next/server/chunks/ssr/[root-of-the-server]__51fc98b0._.js +0 -3
  287. package/web/.next/server/chunks/ssr/[root-of-the-server]__51fc98b0._.js.map +0 -1
  288. package/web/.next/server/chunks/ssr/[root-of-the-server]__57f37786._.js +0 -3
  289. package/web/.next/server/chunks/ssr/[root-of-the-server]__57f37786._.js.map +0 -1
  290. package/web/.next/server/chunks/ssr/[root-of-the-server]__708dcad1._.js +0 -3
  291. package/web/.next/server/chunks/ssr/[root-of-the-server]__708dcad1._.js.map +0 -1
  292. package/web/.next/server/chunks/ssr/[root-of-the-server]__8e002910._.js +0 -3
  293. package/web/.next/server/chunks/ssr/[root-of-the-server]__8e002910._.js.map +0 -1
  294. package/web/.next/server/chunks/ssr/[root-of-the-server]__94128fa9._.js +0 -3
  295. package/web/.next/server/chunks/ssr/[root-of-the-server]__94128fa9._.js.map +0 -1
  296. package/web/.next/server/chunks/ssr/[root-of-the-server]__9bfb8e7c._.js +0 -3
  297. package/web/.next/server/chunks/ssr/[root-of-the-server]__9bfb8e7c._.js.map +0 -1
  298. package/web/.next/server/chunks/ssr/_0619c65b._.js.map +0 -1
  299. package/web/.next/server/chunks/ssr/_6e08ce21._.js +0 -3
  300. package/web/.next/server/chunks/ssr/_6e08ce21._.js.map +0 -1
  301. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_84803221.js +0 -3
  302. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_84803221.js.map +0 -1
  303. package/web/.next/server/chunks/ssr/src_presentation_web_app_(dashboard)_get-graph-data_ts_b018483e._.js +0 -3
  304. package/web/.next/server/chunks/ssr/src_presentation_web_app_(dashboard)_get-graph-data_ts_b018483e._.js.map +0 -1
  305. package/web/.next/static/chunks/a5bcb76c9dcfaee6.js +0 -2
  306. package/web/.next/static/chunks/db122a6247f69104.css +0 -1
  307. /package/web/.next/server/chunks/{[root-of-the-server]__db04ed44._.js.map → [root-of-the-server]__a5879003._.js.map} +0 -0
  308. /package/web/.next/server/chunks/{[root-of-the-server]__91d44424._.js.map → [root-of-the-server]__d8037e14._.js.map} +0 -0
  309. /package/web/.next/static/{ORc-CcNcyS9ide_AZZ8ay → cQ78pXvGiKF4oj7-Lefwt}/_buildManifest.js +0 -0
  310. /package/web/.next/static/{ORc-CcNcyS9ide_AZZ8ay → cQ78pXvGiKF4oj7-Lefwt}/_clientMiddlewareManifest.json +0 -0
  311. /package/web/.next/static/{ORc-CcNcyS9ide_AZZ8ay → cQ78pXvGiKF4oj7-Lefwt}/_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
  });
@@ -1 +1 @@
1
- {"version":3,"file":"page.d.ts","sourceRoot":"","sources":["../../../../../../../../../src/presentation/web/app/(dashboard)/@drawer/feature/[featureId]/page.tsx"],"names":[],"mappings":"AAiBA,oEAAoE;AACpE,eAAO,MAAM,OAAO,kBAAkB,CAAC;AAEvC,UAAU,sBAAsB;IAC9B,MAAM,EAAE,OAAO,CAAC;QAAE,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACxC;AAED,wBAA8B,iBAAiB,CAAC,EAAE,MAAM,EAAE,EAAE,sBAAsB,2DAyEjF"}
1
+ {"version":3,"file":"page.d.ts","sourceRoot":"","sources":["../../../../../../../../../src/presentation/web/app/(dashboard)/@drawer/feature/[featureId]/page.tsx"],"names":[],"mappings":"AAOA,oEAAoE;AACpE,eAAO,MAAM,OAAO,kBAAkB,CAAC;AAEvC,UAAU,sBAAsB;IAC9B,MAAM,EAAE,OAAO,CAAC;QAAE,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACxC;AAED,wBAA8B,iBAAiB,CAAC,EAAE,MAAM,EAAE,EAAE,sBAAsB,2DAmCjF"}
@@ -1,14 +1,8 @@
1
1
  import { jsx as _jsx } from "react/jsx-runtime";
2
2
  import { resolve } from '../../../../../lib/server-container.js';
3
- import { CiStatus } from '../../../../../../../../packages/core/src/domain/generated/output.js';
4
3
  import { buildFeatureNodeData } from '../../../../build-feature-node-data.js';
5
4
  import { computeDrawerView } from '../../../../../components/common/control-center-drawer/drawer-view.js';
6
5
  import { FeatureDrawerClient } from '../../../../../components/common/control-center-drawer/feature-drawer-client.js';
7
- const CI_STATUS_MAP = {
8
- success: CiStatus.Success,
9
- failure: CiStatus.Failure,
10
- pending: CiStatus.Pending,
11
- };
12
6
  /** Skip static pre-rendering since we need runtime DI container. */
13
7
  export const dynamic = 'force-dynamic';
14
8
  export default async function FeatureDrawerPage({ params }) {
@@ -16,52 +10,15 @@ export default async function FeatureDrawerPage({ params }) {
16
10
  try {
17
11
  const featureRepo = resolve('IFeatureRepository');
18
12
  const agentRunRepo = resolve('IAgentRunRepository');
19
- const repoRepo = resolve('IRepositoryRepository');
20
- const gitPrService = resolve('IGitPrService');
13
+ // Critical path only: feature + agent run (fast DB lookups).
14
+ // Expensive operations (git remote URL, GitHub CI/mergeable status,
15
+ // artifact, repo name, base branch) are deferred to useDrawerSync
16
+ // which runs client-side after the drawer is already visible.
21
17
  const feature = await featureRepo.findById(featureId);
22
18
  if (!feature)
23
19
  return null;
24
20
  const run = feature.agentRunId ? await agentRunRepo.findById(feature.agentRunId) : null;
25
- // Resolve repository name, base branch, and one-liner for the overview tab
26
- const getArtifact = resolve('GetFeatureArtifactUseCase');
27
- const [repo, baseBranch, artifact, remoteUrl, liveMergeable, liveCiResult] = await Promise.all([
28
- repoRepo.findByPath(feature.repositoryPath).catch(() => null),
29
- gitPrService.getDefaultBranch(feature.repositoryPath).catch(() => 'main'),
30
- getArtifact.execute(featureId).catch(() => null),
31
- gitPrService.getRemoteUrl(feature.repositoryPath).catch(() => null),
32
- feature.pr?.number
33
- ? gitPrService
34
- .getMergeableStatus(feature.repositoryPath, feature.pr.number)
35
- .catch(() => undefined)
36
- : Promise.resolve(undefined),
37
- feature.branch
38
- ? gitPrService.getCiStatus(feature.repositoryPath, feature.branch).catch(() => undefined)
39
- : Promise.resolve(undefined),
40
- ]);
41
- // Merge live PR status into feature data so the UI always reflects
42
- // the current GitHub state, even if the background watcher hasn't polled yet.
43
- if (feature.pr) {
44
- const liveCiStatus = liveCiResult
45
- ? (CI_STATUS_MAP[liveCiResult.status] ?? CiStatus.Pending)
46
- : undefined;
47
- const updates = {};
48
- if (liveMergeable !== undefined)
49
- updates.mergeable = liveMergeable;
50
- if (liveCiStatus !== undefined)
51
- updates.ciStatus = liveCiStatus;
52
- if (Object.keys(updates).length > 0) {
53
- feature.pr = { ...feature.pr, ...updates };
54
- featureRepo.update(feature).catch(() => {
55
- /* best-effort persist */
56
- });
57
- }
58
- }
59
- const nodeData = buildFeatureNodeData(feature, run, {
60
- repositoryName: repo?.name,
61
- baseBranch,
62
- oneLiner: artifact?.oneLiner,
63
- remoteUrl: remoteUrl ?? undefined,
64
- });
21
+ const nodeData = buildFeatureNodeData(feature, run);
65
22
  const view = computeDrawerView({
66
23
  selectedNode: nodeData,
67
24
  isCreateDrawerOpen: false,
@@ -0,0 +1,8 @@
1
+ import type { FeatureNodeData } from '../../components/common/feature-node/index.js';
2
+ /**
3
+ * Fetches full FeatureNodeData for a given feature ID.
4
+ * Used by the drawer for targeted data syncing without triggering
5
+ * a full router.refresh() / server component re-render.
6
+ */
7
+ export declare function getFeatureDrawerData(featureId: string): Promise<FeatureNodeData | null>;
8
+ //# sourceMappingURL=get-feature-drawer-data.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-feature-drawer-data.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/web/app/actions/get-feature-drawer-data.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AAQxE;;;;GAIG;AACH,wBAAsB,oBAAoB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC,CAsD7F"}
@@ -0,0 +1,67 @@
1
+ 'use server';
2
+ import { resolve } from '../../lib/server-container.js';
3
+ import { CiStatus } from '../../../../../packages/core/src/domain/generated/output.js';
4
+ import { buildFeatureNodeData } from '../build-feature-node-data.js';
5
+ const CI_STATUS_MAP = {
6
+ success: CiStatus.Success,
7
+ failure: CiStatus.Failure,
8
+ pending: CiStatus.Pending,
9
+ };
10
+ /**
11
+ * Fetches full FeatureNodeData for a given feature ID.
12
+ * Used by the drawer for targeted data syncing without triggering
13
+ * a full router.refresh() / server component re-render.
14
+ */
15
+ export async function getFeatureDrawerData(featureId) {
16
+ try {
17
+ const featureRepo = resolve('IFeatureRepository');
18
+ const agentRunRepo = resolve('IAgentRunRepository');
19
+ const repoRepo = resolve('IRepositoryRepository');
20
+ const gitPrService = resolve('IGitPrService');
21
+ const getArtifact = resolve('GetFeatureArtifactUseCase');
22
+ const feature = await featureRepo.findById(featureId);
23
+ if (!feature)
24
+ return null;
25
+ const run = feature.agentRunId ? await agentRunRepo.findById(feature.agentRunId) : null;
26
+ const [repo, baseBranch, artifact, remoteUrl, liveMergeable, liveCiResult] = await Promise.all([
27
+ repoRepo.findByPath(feature.repositoryPath).catch(() => null),
28
+ gitPrService.getDefaultBranch(feature.repositoryPath).catch(() => 'main'),
29
+ getArtifact.execute(featureId).catch(() => null),
30
+ gitPrService.getRemoteUrl(feature.repositoryPath).catch(() => null),
31
+ feature.pr?.number
32
+ ? gitPrService
33
+ .getMergeableStatus(feature.repositoryPath, feature.pr.number)
34
+ .catch(() => undefined)
35
+ : Promise.resolve(undefined),
36
+ feature.branch
37
+ ? gitPrService.getCiStatus(feature.repositoryPath, feature.branch).catch(() => undefined)
38
+ : Promise.resolve(undefined),
39
+ ]);
40
+ // Merge live PR status into feature data
41
+ if (feature.pr) {
42
+ const liveCiStatus = liveCiResult
43
+ ? (CI_STATUS_MAP[liveCiResult.status] ?? CiStatus.Pending)
44
+ : undefined;
45
+ const updates = {};
46
+ if (liveMergeable !== undefined)
47
+ updates.mergeable = liveMergeable;
48
+ if (liveCiStatus !== undefined)
49
+ updates.ciStatus = liveCiStatus;
50
+ if (Object.keys(updates).length > 0) {
51
+ feature.pr = { ...feature.pr, ...updates };
52
+ featureRepo.update(feature).catch(() => {
53
+ /* best-effort persist */
54
+ });
55
+ }
56
+ }
57
+ return buildFeatureNodeData(feature, run, {
58
+ repositoryName: repo?.name,
59
+ baseBranch,
60
+ oneLiner: artifact?.oneLiner,
61
+ remoteUrl: remoteUrl ?? undefined,
62
+ });
63
+ }
64
+ catch {
65
+ return null;
66
+ }
67
+ }
@@ -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;
@@ -0,0 +1,14 @@
1
+ import { NextResponse } from 'next/server';
2
+ /** Prevent Next.js from statically prerendering this route at build time. */
3
+ export declare const dynamic = "force-dynamic";
4
+ /**
5
+ * Returns fresh graph nodes and edges for the control-center canvas.
6
+ *
7
+ * Used by the client-side polling fallback instead of a server action
8
+ * so that periodic syncs don't trigger the Next.js "Rendering…" indicator.
9
+ */
10
+ export declare function GET(): Promise<NextResponse<{
11
+ nodes: import("../../../components/features/features-canvas/index.js").CanvasNodeType[];
12
+ edges: import("@xyflow/react").Edge[];
13
+ }>>;
14
+ //# sourceMappingURL=route.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"route.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/app/api/graph-data/route.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAG3C,6EAA6E;AAC7E,eAAO,MAAM,OAAO,kBAAkB,CAAC;AAEvC;;;;;GAKG;AACH,wBAAsB,GAAG;;;IAGxB"}
@@ -0,0 +1,14 @@
1
+ import { NextResponse } from 'next/server';
2
+ import { getGraphData } from '../../(dashboard)/get-graph-data.js';
3
+ /** Prevent Next.js from statically prerendering this route at build time. */
4
+ export const dynamic = 'force-dynamic';
5
+ /**
6
+ * Returns fresh graph nodes and edges for the control-center canvas.
7
+ *
8
+ * Used by the client-side polling fallback instead of a server action
9
+ * so that periodic syncs don't trigger the Next.js "Rendering…" indicator.
10
+ */
11
+ export async function GET() {
12
+ const data = await getGraphData();
13
+ return NextResponse.json(data);
14
+ }
@@ -4,12 +4,9 @@ export declare const dynamic = "force-dynamic";
4
4
  /**
5
5
  * Returns runtime version info.
6
6
  *
7
- * NEXT_PUBLIC_* env vars are inlined at build time for client components,
8
- * so client-side code sees the version from when the bundle was built
9
- * not the currently running CLI version.
10
- *
11
- * This API route reads the env vars at runtime on the server, ensuring
12
- * the client always gets the correct version.
7
+ * Reads the version from the DI container's VersionService the same source
8
+ * used by `shep --version`. This avoids stale values from NEXT_PUBLIC_* env
9
+ * vars which Next.js inlines at build time.
13
10
  */
14
11
  export declare function GET(): NextResponse;
15
12
  //# sourceMappingURL=route.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"route.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/app/api/version/route.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,6EAA6E;AAC7E,eAAO,MAAM,OAAO,kBAAkB,CAAC;AAEvC;;;;;;;;;GASG;AACH,wBAAgB,GAAG,IAAI,YAAY,CAUlC"}
1
+ {"version":3,"file":"route.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/app/api/version/route.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAK3C,6EAA6E;AAC7E,eAAO,MAAM,OAAO,kBAAkB,CAAC;AAEvC;;;;;;GAMG;AACH,wBAAgB,GAAG,IAAI,YAAY,CA0BlC"}
@@ -1,24 +1,38 @@
1
1
  import { NextResponse } from 'next/server';
2
+ import { resolve } from '../../../lib/server-container.js';
2
3
  /** Prevent Next.js from statically prerendering this route at build time. */
3
4
  export const dynamic = 'force-dynamic';
4
5
  /**
5
6
  * Returns runtime version info.
6
7
  *
7
- * NEXT_PUBLIC_* env vars are inlined at build time for client components,
8
- * so client-side code sees the version from when the bundle was built
9
- * not the currently running CLI version.
10
- *
11
- * This API route reads the env vars at runtime on the server, ensuring
12
- * the client always gets the correct version.
8
+ * Reads the version from the DI container's VersionService the same source
9
+ * used by `shep --version`. This avoids stale values from NEXT_PUBLIC_* env
10
+ * vars which Next.js inlines at build time.
13
11
  */
14
12
  export function GET() {
15
- return NextResponse.json({
16
- version: process.env.NEXT_PUBLIC_SHEP_VERSION ?? 'unknown',
17
- packageName: process.env.NEXT_PUBLIC_SHEP_PACKAGE_NAME ?? '@shepai/cli',
18
- description: process.env.NEXT_PUBLIC_SHEP_DESCRIPTION ?? 'Autonomous AI Native SDLC Platform',
19
- branch: process.env.NEXT_PUBLIC_SHEP_BRANCH ?? '',
20
- commitHash: process.env.NEXT_PUBLIC_SHEP_COMMIT ?? '',
21
- instancePath: process.env.NEXT_PUBLIC_SHEP_INSTANCE_PATH ?? '',
22
- isDev: process.env.NODE_ENV === 'development',
23
- });
13
+ try {
14
+ const versionService = resolve('IVersionService');
15
+ const { version, name, description } = versionService.getVersion();
16
+ return NextResponse.json({
17
+ version,
18
+ packageName: name,
19
+ description,
20
+ branch: process.env.NEXT_PUBLIC_SHEP_BRANCH ?? '',
21
+ commitHash: process.env.NEXT_PUBLIC_SHEP_COMMIT ?? '',
22
+ instancePath: process.env.NEXT_PUBLIC_SHEP_INSTANCE_PATH ?? '',
23
+ isDev: process.env.NODE_ENV === 'development',
24
+ });
25
+ }
26
+ catch {
27
+ // DI container not available (e.g. during build) — fall back to env vars
28
+ return NextResponse.json({
29
+ version: process.env.NEXT_PUBLIC_SHEP_VERSION ?? 'unknown',
30
+ packageName: process.env.NEXT_PUBLIC_SHEP_PACKAGE_NAME ?? '@shepai/cli',
31
+ description: process.env.NEXT_PUBLIC_SHEP_DESCRIPTION ?? 'Autonomous AI Native SDLC Platform',
32
+ branch: process.env.NEXT_PUBLIC_SHEP_BRANCH ?? '',
33
+ commitHash: process.env.NEXT_PUBLIC_SHEP_COMMIT ?? '',
34
+ instancePath: process.env.NEXT_PUBLIC_SHEP_INSTANCE_PATH ?? '',
35
+ isDev: process.env.NODE_ENV === 'development',
36
+ });
37
+ }
24
38
  }
@@ -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;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,2CA6iB1F"}
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"}