@shepai/cli 1.135.3-pr425.d3fbb75 → 1.135.3

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 (219) hide show
  1. package/dist/src/presentation/web/app/actions/check-agent-auth.d.ts +0 -2
  2. package/dist/src/presentation/web/app/actions/check-agent-auth.d.ts.map +1 -1
  3. package/dist/src/presentation/web/app/actions/check-agent-auth.js +1 -8
  4. package/dist/src/presentation/web/app/build-graph-nodes.d.ts.map +1 -1
  5. package/dist/src/presentation/web/app/build-graph-nodes.js +9 -1
  6. package/dist/src/presentation/web/components/common/feature-node/feature-node-state-config.d.ts +0 -17
  7. package/dist/src/presentation/web/components/common/feature-node/feature-node-state-config.d.ts.map +1 -1
  8. package/dist/src/presentation/web/components/common/feature-node/feature-node-state-config.js +0 -91
  9. package/dist/src/presentation/web/components/common/feature-node/feature-node.d.ts.map +1 -1
  10. package/dist/src/presentation/web/components/common/feature-node/feature-node.js +64 -54
  11. package/dist/src/presentation/web/components/common/feature-node/feature-node.stories.d.ts.map +1 -1
  12. package/dist/src/presentation/web/components/common/feature-node/feature-node.stories.js +19 -85
  13. package/dist/src/presentation/web/components/common/repository-node/repository-node.d.ts.map +1 -1
  14. package/dist/src/presentation/web/components/common/repository-node/repository-node.js +4 -6
  15. package/dist/src/presentation/web/components/features/control-center/control-center-empty-state.d.ts.map +1 -1
  16. package/dist/src/presentation/web/components/features/control-center/control-center-empty-state.js +9 -35
  17. package/dist/src/presentation/web/components/features/control-center/control-center-empty-state.stories.d.ts +1 -17
  18. package/dist/src/presentation/web/components/features/control-center/control-center-empty-state.stories.d.ts.map +1 -1
  19. package/dist/src/presentation/web/components/features/control-center/control-center-empty-state.stories.js +1 -110
  20. package/dist/src/presentation/web/components/features/features-canvas/features-canvas.d.ts.map +1 -1
  21. package/dist/src/presentation/web/components/features/features-canvas/features-canvas.js +1 -1
  22. package/dist/src/presentation/web/components/features/features-canvas/features-canvas.stories.d.ts +0 -1
  23. package/dist/src/presentation/web/components/features/features-canvas/features-canvas.stories.d.ts.map +1 -1
  24. package/dist/src/presentation/web/components/features/features-canvas/features-canvas.stories.js +10 -443
  25. package/dist/src/presentation/web/lib/layout-with-dagre.js +1 -1
  26. package/dist/tsconfig.build.tsbuildinfo +1 -1
  27. package/package.json +1 -1
  28. package/web/.next/BUILD_ID +1 -1
  29. package/web/.next/build-manifest.json +2 -2
  30. package/web/.next/fallback-build-manifest.json +2 -2
  31. package/web/.next/prerender-manifest.json +3 -3
  32. package/web/.next/required-server-files.js +3 -3
  33. package/web/.next/required-server-files.json +3 -3
  34. package/web/.next/server/app/(dashboard)/@drawer/adopt/page/server-reference-manifest.json +48 -63
  35. package/web/.next/server/app/(dashboard)/@drawer/adopt/page.js +3 -3
  36. package/web/.next/server/app/(dashboard)/@drawer/adopt/page.js.nft.json +1 -1
  37. package/web/.next/server/app/(dashboard)/@drawer/adopt/page_client-reference-manifest.js +1 -1
  38. package/web/.next/server/app/(dashboard)/@drawer/create/page/server-reference-manifest.json +48 -63
  39. package/web/.next/server/app/(dashboard)/@drawer/create/page.js +3 -3
  40. package/web/.next/server/app/(dashboard)/@drawer/create/page.js.nft.json +1 -1
  41. package/web/.next/server/app/(dashboard)/@drawer/create/page_client-reference-manifest.js +1 -1
  42. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page/server-reference-manifest.json +60 -75
  43. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page.js +3 -3
  44. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page.js.nft.json +1 -1
  45. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page_client-reference-manifest.js +1 -1
  46. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page/server-reference-manifest.json +60 -75
  47. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js +3 -3
  48. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js.nft.json +1 -1
  49. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page_client-reference-manifest.js +1 -1
  50. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page/server-reference-manifest.json +44 -59
  51. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js +3 -3
  52. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js.nft.json +1 -1
  53. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  54. package/web/.next/server/app/(dashboard)/create/page/server-reference-manifest.json +48 -63
  55. package/web/.next/server/app/(dashboard)/create/page.js +3 -3
  56. package/web/.next/server/app/(dashboard)/create/page.js.nft.json +1 -1
  57. package/web/.next/server/app/(dashboard)/create/page_client-reference-manifest.js +1 -1
  58. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page/server-reference-manifest.json +60 -75
  59. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page.js +3 -3
  60. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page.js.nft.json +1 -1
  61. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page_client-reference-manifest.js +1 -1
  62. package/web/.next/server/app/(dashboard)/feature/[featureId]/page/server-reference-manifest.json +60 -75
  63. package/web/.next/server/app/(dashboard)/feature/[featureId]/page.js +3 -3
  64. package/web/.next/server/app/(dashboard)/feature/[featureId]/page.js.nft.json +1 -1
  65. package/web/.next/server/app/(dashboard)/feature/[featureId]/page_client-reference-manifest.js +1 -1
  66. package/web/.next/server/app/(dashboard)/page/server-reference-manifest.json +44 -59
  67. package/web/.next/server/app/(dashboard)/page.js +3 -3
  68. package/web/.next/server/app/(dashboard)/page.js.nft.json +1 -1
  69. package/web/.next/server/app/(dashboard)/page_client-reference-manifest.js +1 -1
  70. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page/server-reference-manifest.json +44 -59
  71. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js +3 -3
  72. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js.nft.json +1 -1
  73. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  74. package/web/.next/server/app/_global-error.html +2 -2
  75. package/web/.next/server/app/_global-error.rsc +1 -1
  76. package/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  77. package/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  78. package/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  79. package/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  80. package/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  81. package/web/.next/server/app/_not-found/page/server-reference-manifest.json +3 -3
  82. package/web/.next/server/app/_not-found/page.js.nft.json +1 -1
  83. package/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  84. package/web/.next/server/app/api/attachments/preview/route.js.nft.json +1 -1
  85. package/web/.next/server/app/api/evidence/route.js.nft.json +1 -1
  86. package/web/.next/server/app/api/graph-data/route.js.nft.json +1 -1
  87. package/web/.next/server/app/settings/page/server-reference-manifest.json +8 -8
  88. package/web/.next/server/app/settings/page.js.nft.json +1 -1
  89. package/web/.next/server/app/settings/page_client-reference-manifest.js +1 -1
  90. package/web/.next/server/app/skills/page/server-reference-manifest.json +8 -8
  91. package/web/.next/server/app/skills/page.js +1 -1
  92. package/web/.next/server/app/skills/page.js.nft.json +1 -1
  93. package/web/.next/server/app/skills/page_client-reference-manifest.js +1 -1
  94. package/web/.next/server/app/tools/page/server-reference-manifest.json +8 -8
  95. package/web/.next/server/app/tools/page.js +1 -1
  96. package/web/.next/server/app/tools/page.js.nft.json +1 -1
  97. package/web/.next/server/app/tools/page_client-reference-manifest.js +1 -1
  98. package/web/.next/server/app/version/page/server-reference-manifest.json +3 -3
  99. package/web/.next/server/app/version/page.js.nft.json +1 -1
  100. package/web/.next/server/app/version/page_client-reference-manifest.js +1 -1
  101. package/web/.next/server/chunks/403f9_next_dist_esm_build_templates_app-route_370c43b1.js +1 -1
  102. package/web/.next/server/chunks/403f9_next_dist_esm_build_templates_app-route_370c43b1.js.map +1 -1
  103. package/web/.next/server/chunks/[root-of-the-server]__a402b567._.js +1 -1
  104. package/web/.next/server/chunks/ssr/744ca_web__next-internal_server_app_(dashboard)_@drawer_adopt_page_actions_4e741df2.js +3 -0
  105. package/web/.next/server/chunks/ssr/744ca_web__next-internal_server_app_(dashboard)_@drawer_adopt_page_actions_4e741df2.js.map +1 -0
  106. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js +1 -1
  107. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js.map +1 -1
  108. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_026fdffa.js +3 -0
  109. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_026fdffa.js.map +1 -0
  110. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_8b91e197.js +3 -0
  111. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_8b91e197.js.map +1 -0
  112. package/web/.next/server/chunks/ssr/{[root-of-the-server]__47ded061._.js → [root-of-the-server]__31bc28da._.js} +2 -2
  113. package/web/.next/server/chunks/ssr/{[root-of-the-server]__47ded061._.js.map → [root-of-the-server]__31bc28da._.js.map} +1 -1
  114. package/web/.next/server/chunks/ssr/{[root-of-the-server]__68ce373c._.js → [root-of-the-server]__32ecbed9._.js} +2 -2
  115. package/web/.next/server/chunks/ssr/{[root-of-the-server]__fdd058b2._.js.map → [root-of-the-server]__32ecbed9._.js.map} +1 -1
  116. package/web/.next/server/chunks/ssr/[root-of-the-server]__357d99f9._.js +1 -1
  117. package/web/.next/server/chunks/ssr/[root-of-the-server]__3ef34e4c._.js +1 -1
  118. package/web/.next/server/chunks/ssr/[root-of-the-server]__43f51aa6._.js +1 -1
  119. package/web/.next/server/chunks/ssr/[root-of-the-server]__43f51aa6._.js.map +1 -1
  120. package/web/.next/server/chunks/ssr/[root-of-the-server]__7894f27f._.js +3 -0
  121. package/web/.next/server/chunks/ssr/{[root-of-the-server]__d48c5b11._.js.map → [root-of-the-server]__7894f27f._.js.map} +1 -1
  122. package/web/.next/server/chunks/ssr/[root-of-the-server]__815546bd._.js +1 -1
  123. package/web/.next/server/chunks/ssr/[root-of-the-server]__815546bd._.js.map +1 -1
  124. package/web/.next/server/chunks/ssr/{[root-of-the-server]__718766da._.js → [root-of-the-server]__90ce4b6d._.js} +2 -2
  125. package/web/.next/server/chunks/ssr/{[root-of-the-server]__718766da._.js.map → [root-of-the-server]__90ce4b6d._.js.map} +1 -1
  126. package/web/.next/server/chunks/ssr/{[root-of-the-server]__fdd058b2._.js → [root-of-the-server]__90f9ae71._.js} +2 -2
  127. package/web/.next/server/chunks/ssr/{[root-of-the-server]__68ce373c._.js.map → [root-of-the-server]__90f9ae71._.js.map} +1 -1
  128. package/web/.next/server/chunks/ssr/{[root-of-the-server]__a5f9c6e5._.js → [root-of-the-server]__96670392._.js} +3 -3
  129. package/web/.next/server/chunks/ssr/[root-of-the-server]__96670392._.js.map +1 -0
  130. package/web/.next/server/chunks/ssr/[root-of-the-server]__9c45d070._.js +3 -0
  131. package/web/.next/server/chunks/ssr/[root-of-the-server]__9c45d070._.js.map +1 -0
  132. package/web/.next/server/chunks/ssr/[root-of-the-server]__aad040c0._.js +2 -2
  133. package/web/.next/server/chunks/ssr/[root-of-the-server]__aad040c0._.js.map +1 -1
  134. package/web/.next/server/chunks/ssr/[root-of-the-server]__b3dbadca._.js +1 -1
  135. package/web/.next/server/chunks/ssr/[root-of-the-server]__b3dbadca._.js.map +1 -1
  136. package/web/.next/server/chunks/ssr/_02ec1aea._.js +1 -1
  137. package/web/.next/server/chunks/ssr/_02ec1aea._.js.map +1 -1
  138. package/web/.next/server/chunks/ssr/_313c9690._.js +3 -0
  139. package/web/.next/server/chunks/ssr/_313c9690._.js.map +1 -0
  140. package/web/.next/server/chunks/ssr/_7dca1882._.js +1 -1
  141. package/web/.next/server/chunks/ssr/_7dca1882._.js.map +1 -1
  142. package/web/.next/server/chunks/ssr/_a9f57758._.js +1 -1
  143. package/web/.next/server/chunks/ssr/_a9f57758._.js.map +1 -1
  144. package/web/.next/server/chunks/ssr/_b6960ca0._.js +4 -0
  145. package/web/.next/server/chunks/ssr/_b6960ca0._.js.map +1 -0
  146. package/web/.next/server/chunks/ssr/{_40c2d506._.js → _d17bc20a._.js} +2 -2
  147. package/web/.next/server/chunks/ssr/_d17bc20a._.js.map +1 -0
  148. package/web/.next/server/chunks/ssr/_d8575088._.js +1 -1
  149. package/web/.next/server/chunks/ssr/_d8575088._.js.map +1 -1
  150. package/web/.next/server/chunks/ssr/_f39a1adb._.js +1 -1
  151. package/web/.next/server/chunks/ssr/_f39a1adb._.js.map +1 -1
  152. package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_settings_settings-page-client_tsx_6ed9d5f8._.js +1 -1
  153. package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_settings_settings-page-client_tsx_6ed9d5f8._.js.map +1 -1
  154. package/web/.next/server/chunks/ssr/{src_presentation_web_8ac280c1._.js → src_presentation_web_127fb482._.js} +2 -2
  155. package/web/.next/server/chunks/ssr/{src_presentation_web_8ac280c1._.js.map → src_presentation_web_127fb482._.js.map} +1 -1
  156. package/web/.next/server/chunks/ssr/src_presentation_web_8e7fe0d1._.js +5 -0
  157. package/web/.next/server/chunks/ssr/{src_presentation_web_e4df6dd7._.js.map → src_presentation_web_8e7fe0d1._.js.map} +1 -1
  158. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_ca051134.js +3 -0
  159. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_ca051134.js.map +1 -0
  160. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_skills_page_actions_1b176e3c.js +1 -1
  161. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_skills_page_actions_1b176e3c.js.map +1 -1
  162. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_tools_page_actions_bd9f0dda.js +1 -1
  163. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_tools_page_actions_bd9f0dda.js.map +1 -1
  164. package/web/.next/server/chunks/ssr/src_presentation_web_b9023017._.js +5 -0
  165. package/web/.next/server/chunks/ssr/{src_presentation_web_53666118._.js.map → src_presentation_web_b9023017._.js.map} +1 -1
  166. package/web/.next/server/chunks/ssr/src_presentation_web_ca99d62d._.js +1 -1
  167. package/web/.next/server/chunks/ssr/src_presentation_web_ca99d62d._.js.map +1 -1
  168. package/web/.next/server/chunks/ssr/src_presentation_web_components_e599bb8c._.js +1 -1
  169. package/web/.next/server/chunks/ssr/src_presentation_web_components_e599bb8c._.js.map +1 -1
  170. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js +1 -1
  171. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js.map +1 -1
  172. package/web/.next/server/pages/500.html +2 -2
  173. package/web/.next/server/server-reference-manifest.js +1 -1
  174. package/web/.next/server/server-reference-manifest.json +296 -374
  175. package/web/.next/static/chunks/15e6a74ef39fda73.js +1 -0
  176. package/web/.next/static/chunks/{c80e7077c2e15d7a.js → 1a9dfc34432387f5.js} +1 -1
  177. package/web/.next/static/chunks/314b8314f77d6921.js +1 -0
  178. package/web/.next/static/chunks/3e2d7d07926b05bf.css +1 -0
  179. package/web/.next/static/chunks/55a1c86671bb1a5b.js +1 -0
  180. package/web/.next/static/chunks/{6df4c57bc78a94a7.js → 61f7d4f0f0f770a4.js} +1 -1
  181. package/web/.next/static/chunks/{5240821573a037e3.js → 7875a9370622a064.js} +1 -1
  182. package/web/.next/static/chunks/{a381d542a7ec04d9.js → 8c42b7752187f48c.js} +2 -2
  183. package/web/.next/static/chunks/{99351a301567a88e.js → 9154973d61eae190.js} +1 -1
  184. package/web/.next/static/chunks/c0c287da1631752f.js +1 -0
  185. package/web/.next/static/chunks/{b4e468a0f9370e0f.js → d5342f9be437afd9.js} +1 -1
  186. package/web/.next/static/chunks/{b966410b4e88dba6.js → d8a0dd9bfd0f22fa.js} +1 -1
  187. package/web/.next/static/chunks/e6b87832e1382949.js +1 -0
  188. package/web/.next/static/chunks/{b5545c62e743df83.js → fdc719494dcd9c92.js} +2 -2
  189. package/dist/src/presentation/web/app/actions/check-tool-status.d.ts +0 -14
  190. package/dist/src/presentation/web/app/actions/check-tool-status.d.ts.map +0 -1
  191. package/dist/src/presentation/web/app/actions/check-tool-status.js +0 -53
  192. package/web/.next/server/chunks/ssr/744ca_web__next-internal_server_app_(dashboard)_@drawer_adopt_page_actions_b49d9c97.js +0 -3
  193. package/web/.next/server/chunks/ssr/744ca_web__next-internal_server_app_(dashboard)_@drawer_adopt_page_actions_b49d9c97.js.map +0 -1
  194. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_28632197.js +0 -3
  195. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_28632197.js.map +0 -1
  196. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_10695d37.js +0 -3
  197. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_10695d37.js.map +0 -1
  198. package/web/.next/server/chunks/ssr/[root-of-the-server]__6ec59045._.js +0 -3
  199. package/web/.next/server/chunks/ssr/[root-of-the-server]__6ec59045._.js.map +0 -1
  200. package/web/.next/server/chunks/ssr/[root-of-the-server]__a5f9c6e5._.js.map +0 -1
  201. package/web/.next/server/chunks/ssr/[root-of-the-server]__d48c5b11._.js +0 -3
  202. package/web/.next/server/chunks/ssr/_0ef7c505._.js +0 -3
  203. package/web/.next/server/chunks/ssr/_0ef7c505._.js.map +0 -1
  204. package/web/.next/server/chunks/ssr/_40c2d506._.js.map +0 -1
  205. package/web/.next/server/chunks/ssr/_e69a26ba._.js +0 -4
  206. package/web/.next/server/chunks/ssr/_e69a26ba._.js.map +0 -1
  207. package/web/.next/server/chunks/ssr/src_presentation_web_53666118._.js +0 -5
  208. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_d95e128d.js +0 -3
  209. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_d95e128d.js.map +0 -1
  210. package/web/.next/server/chunks/ssr/src_presentation_web_e4df6dd7._.js +0 -5
  211. package/web/.next/static/chunks/3831dbe7ff6d5717.js +0 -1
  212. package/web/.next/static/chunks/74a9d144a3e27ce2.js +0 -1
  213. package/web/.next/static/chunks/8e293101ac271df2.js +0 -1
  214. package/web/.next/static/chunks/92cd6f523639a6fa.css +0 -1
  215. package/web/.next/static/chunks/99630cd36967c04f.js +0 -1
  216. package/web/.next/static/chunks/d0dff217a94d4ee1.js +0 -1
  217. /package/web/.next/static/{49taRTn4m6kJfWu7WRS6O → p0KCxpQ0DqKcttVypdnix}/_buildManifest.js +0 -0
  218. /package/web/.next/static/{49taRTn4m6kJfWu7WRS6O → p0KCxpQ0DqKcttVypdnix}/_clientMiddlewareManifest.json +0 -0
  219. /package/web/.next/static/{49taRTn4m6kJfWu7WRS6O → p0KCxpQ0DqKcttVypdnix}/_ssgManifest.js +0 -0
@@ -8,8 +8,6 @@ export interface AgentAuthStatus {
8
8
  label: string;
9
9
  /** CLI binary name (e.g. "claude", "gemini") */
10
10
  binaryName: string | null;
11
- /** Shell command to install the tool (e.g. "npm install -g @anthropic-ai/claude-code") */
12
- installCommand: string | null;
13
11
  /** Instructions to authenticate if not authenticated */
14
12
  authCommand: string | null;
15
13
  }
@@ -1 +1 @@
1
- {"version":3,"file":"check-agent-auth.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/web/app/actions/check-agent-auth.ts"],"names":[],"mappings":"AAWA,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,+CAA+C;IAC/C,SAAS,EAAE,OAAO,CAAC;IACnB,8CAA8C;IAC9C,aAAa,EAAE,OAAO,CAAC;IACvB,yCAAyC;IACzC,KAAK,EAAE,MAAM,CAAC;IACd,gDAAgD;IAChD,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,0FAA0F;IAC1F,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,wDAAwD;IACxD,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B;AA6FD;;;GAGG;AACH,wBAAsB,cAAc,IAAI,OAAO,CAAC,eAAe,CAAC,CAwF/D"}
1
+ {"version":3,"file":"check-agent-auth.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/web/app/actions/check-agent-auth.ts"],"names":[],"mappings":"AAWA,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,+CAA+C;IAC/C,SAAS,EAAE,OAAO,CAAC;IACnB,8CAA8C;IAC9C,aAAa,EAAE,OAAO,CAAC;IACvB,yCAAyC;IACzC,KAAK,EAAE,MAAM,CAAC;IACd,gDAAgD;IAChD,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,wDAAwD;IACxD,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B;AA6FD;;;GAGG;AACH,wBAAsB,cAAc,IAAI,OAAO,CAAC,eAAe,CAAC,CAiF/D"}
@@ -114,7 +114,6 @@ export async function checkAgentAuth() {
114
114
  authenticated: false,
115
115
  label: 'Unknown',
116
116
  binaryName: null,
117
- installCommand: null,
118
117
  authCommand: null,
119
118
  };
120
119
  }
@@ -129,19 +128,16 @@ export async function checkAgentAuth() {
129
128
  authenticated: true,
130
129
  label,
131
130
  binaryName: null,
132
- installCommand: null,
133
131
  authCommand: null,
134
132
  };
135
133
  }
136
- // Check if tool is installed (also grab install command from metadata)
134
+ // Check if tool is installed
137
135
  let installed = false;
138
- let installCommand = null;
139
136
  try {
140
137
  const useCase = resolve('ListToolsUseCase');
141
138
  const tools = await useCase.execute();
142
139
  const tool = tools.find((t) => t.id === toolId);
143
140
  installed = tool?.status.status === 'available';
144
- installCommand = tool?.installCommand ?? null;
145
141
  }
146
142
  catch {
147
143
  installed = false;
@@ -153,7 +149,6 @@ export async function checkAgentAuth() {
153
149
  authenticated: false,
154
150
  label,
155
151
  binaryName,
156
- installCommand,
157
152
  authCommand: binaryName ? `Install ${label} first` : null,
158
153
  };
159
154
  }
@@ -166,7 +161,6 @@ export async function checkAgentAuth() {
166
161
  authenticated: false,
167
162
  label,
168
163
  binaryName,
169
- installCommand,
170
164
  authCommand: binaryName,
171
165
  };
172
166
  }
@@ -181,7 +175,6 @@ export async function checkAgentAuth() {
181
175
  authenticated,
182
176
  label,
183
177
  binaryName,
184
- installCommand,
185
178
  authCommand: authenticated ? null : binaryName,
186
179
  };
187
180
  }
@@ -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;AAS1F,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,MAAM,WAAW,sBAAsB;IACrC,uEAAuE;IACvE,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,6EAA6E;IAC7E,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,qEAAqE;IACrE,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,0FAA0F;IAC1F,WAAW,CAAC,EAAE,GAAG,CACf,MAAM,EACN;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,aAAa,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CACzF,CAAC;IACF,0DAA0D;IAC1D,aAAa,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,SAAS,GAAG,OAAO,GAAG,YAAY,CAAC,CAAC;CACjE;AAED,wBAAgB,eAAe,CAC7B,YAAY,EAAE,UAAU,EAAE,EAC1B,gBAAgB,EAAE,cAAc,EAAE,EAClC,OAAO,CAAC,EAAE,sBAAsB,GAC/B;IAAE,KAAK,EAAE,cAAc,EAAE,CAAC;IAAC,KAAK,EAAE,IAAI,EAAE,CAAA;CAAE,CAoG5C"}
1
+ {"version":3,"file":"build-graph-nodes.d.ts","sourceRoot":"","sources":["../../../../../src/presentation/web/app/build-graph-nodes.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,sCAAsC,CAAC;AAS1F,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uCAAuC,CAAC;AAC5E,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAU1C,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,OAAO,CAAC;IACjB,GAAG,EAAE,QAAQ,GAAG,IAAI,CAAC;CACtB;AAED;;;;;;;GAOG;AACH,MAAM,WAAW,sBAAsB;IACrC,uEAAuE;IACvE,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,6EAA6E;IAC7E,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,qEAAqE;IACrE,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,0FAA0F;IAC1F,WAAW,CAAC,EAAE,GAAG,CACf,MAAM,EACN;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,aAAa,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CACzF,CAAC;IACF,0DAA0D;IAC1D,aAAa,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,SAAS,GAAG,OAAO,GAAG,YAAY,CAAC,CAAC;CACjE;AAED,wBAAgB,eAAe,CAC7B,YAAY,EAAE,UAAU,EAAE,EAC1B,gBAAgB,EAAE,cAAc,EAAE,EAClC,OAAO,CAAC,EAAE,sBAAsB,GAC/B;IAAE,KAAK,EAAE,cAAc,EAAE,CAAC;IAAC,KAAK,EAAE,IAAI,EAAE,CAAA;CAAE,CAoG5C"}
@@ -1,7 +1,15 @@
1
+ import { createHash } from 'node:crypto';
2
+ import path from 'node:path';
1
3
  import { AgentRunStatus } from '../../../../packages/core/src/domain/generated/output.js';
2
4
  import { deriveNodeState, deriveProgress, deriveLifecycle, } from '../components/common/feature-node/derive-feature-state.js';
3
5
  import { isProcessAlive } from '../../../../packages/core/src/infrastructure/services/process/is-process-alive.js';
4
- import { computeWorktreePath } from '../../../../packages/core/src/infrastructure/services/ide-launchers/compute-worktree-path.js';
6
+ import { getShepHomeDir } from '../../../../packages/core/src/infrastructure/services/filesystem/shep-directory.service.js';
7
+ /** Compute the worktree path for a feature, matching WorktreeService.getWorktreePath() */
8
+ function computeWorktreePath(repoPath, branch) {
9
+ const repoHash = createHash('sha256').update(repoPath).digest('hex').slice(0, 16);
10
+ const slug = branch.replace(/\//g, '-');
11
+ return path.join(getShepHomeDir(), 'repos', repoHash, 'wt', slug).replace(/\\/g, '/');
12
+ }
5
13
  export function buildGraphNodes(repositories, featuresWithRuns, options) {
6
14
  // Normalize path separators so Windows backslash paths match forward-slash paths
7
15
  const normalizePath = (p) => p.replace(/\\/g, '/');
@@ -6,23 +6,6 @@ export type FeatureNodeState = 'creating' | 'running' | 'action-required' | 'don
6
6
  export type FeatureLifecyclePhase = 'pending' | 'requirements' | 'research' | 'implementation' | 'review' | 'deploy' | 'maintain';
7
7
  /** Human-readable display labels for lifecycle phases. */
8
8
  export declare const lifecycleDisplayLabels: Record<FeatureLifecyclePhase, string>;
9
- /** Left border color for each lifecycle phase. */
10
- export declare const lifecycleBorderColors: Record<FeatureLifecyclePhase, string>;
11
- /** Accent bar background color for each lifecycle phase. */
12
- export declare const lifecycleAccentColors: Record<FeatureLifecyclePhase, string>;
13
- /** Phase badge: short letter, color classes, and user-friendly tooltip. */
14
- export declare const lifecyclePhaseBadge: Record<FeatureLifecyclePhase, {
15
- letter: string;
16
- bg: string;
17
- text: string;
18
- dot: string;
19
- tooltip: string;
20
- description: string;
21
- }>;
22
- /** State-based left border overrides (takes precedence over lifecycle). */
23
- export declare const stateBorderColors: Partial<Record<FeatureNodeState, string>>;
24
- /** State-based accent bar overrides (takes precedence over lifecycle). */
25
- export declare const stateAccentColors: Partial<Record<FeatureNodeState, string>>;
26
9
  /** Present-participle verbs for the running badge, keyed by lifecycle phase. */
27
10
  export declare const lifecycleRunningVerbs: Record<FeatureLifecyclePhase, string>;
28
11
  export interface FeatureNodeData {
@@ -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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"}
@@ -9,97 +9,6 @@ export const lifecycleDisplayLabels = {
9
9
  deploy: 'DEPLOY & QA',
10
10
  maintain: 'COMPLETED',
11
11
  };
12
- /** Left border color for each lifecycle phase. */
13
- export const lifecycleBorderColors = {
14
- pending: 'border-l-slate-400',
15
- requirements: 'border-l-violet-500',
16
- research: 'border-l-cyan-500',
17
- implementation: 'border-l-blue-500',
18
- review: 'border-l-amber-500',
19
- deploy: 'border-l-emerald-500',
20
- maintain: 'border-l-gray-400',
21
- };
22
- /** Accent bar background color for each lifecycle phase. */
23
- export const lifecycleAccentColors = {
24
- pending: 'bg-slate-400',
25
- requirements: 'bg-violet-500',
26
- research: 'bg-cyan-500',
27
- implementation: 'bg-blue-500',
28
- review: 'bg-amber-500',
29
- deploy: 'bg-emerald-500',
30
- maintain: 'bg-gray-400',
31
- };
32
- /** Phase badge: short letter, color classes, and user-friendly tooltip. */
33
- export const lifecyclePhaseBadge = {
34
- pending: {
35
- letter: 'P',
36
- bg: 'bg-stone-100 dark:bg-stone-800',
37
- text: 'text-stone-500 dark:text-stone-400',
38
- dot: 'bg-stone-400',
39
- tooltip: 'Pending',
40
- description: 'Waiting to start — the feature is queued and ready to go.',
41
- },
42
- requirements: {
43
- letter: 'R',
44
- bg: 'bg-fuchsia-100 dark:bg-fuchsia-900/40',
45
- text: 'text-fuchsia-600 dark:text-fuchsia-300',
46
- dot: 'bg-fuchsia-500',
47
- tooltip: 'Requirements',
48
- description: 'Gathering what to build — the AI is writing a product requirements document (PRD) based on your request.',
49
- },
50
- research: {
51
- letter: 'D',
52
- bg: 'bg-teal-100 dark:bg-teal-900/40',
53
- text: 'text-teal-600 dark:text-teal-300',
54
- dot: 'bg-teal-500',
55
- tooltip: 'Research',
56
- description: 'Exploring your codebase — the AI is analyzing existing code, patterns, and dependencies to plan the best approach.',
57
- },
58
- implementation: {
59
- letter: 'I',
60
- bg: 'bg-indigo-100 dark:bg-indigo-900/40',
61
- text: 'text-indigo-600 dark:text-indigo-300',
62
- dot: 'bg-indigo-500',
63
- tooltip: 'Implementation',
64
- description: 'Writing code — the AI is implementing the feature, writing tests, and making sure everything compiles.',
65
- },
66
- review: {
67
- letter: 'M',
68
- bg: 'bg-orange-100 dark:bg-orange-900/40',
69
- text: 'text-orange-600 dark:text-orange-300',
70
- dot: 'bg-orange-500',
71
- tooltip: 'Merge Review',
72
- description: 'Ready to merge — the code is complete. Review the changes and approve to merge into your repository.',
73
- },
74
- deploy: {
75
- letter: 'Q',
76
- bg: 'bg-lime-100 dark:bg-lime-900/40',
77
- text: 'text-lime-600 dark:text-lime-300',
78
- dot: 'bg-lime-500',
79
- tooltip: 'Deploy & QA',
80
- description: 'Deploying and testing — the feature is being deployed to a preview environment for quality checks.',
81
- },
82
- maintain: {
83
- letter: '✓',
84
- bg: 'bg-emerald-100 dark:bg-emerald-900/40',
85
- text: 'text-emerald-500 dark:text-emerald-400',
86
- dot: 'bg-emerald-500',
87
- tooltip: 'Completed',
88
- description: 'All done — the feature has been merged and delivered successfully.',
89
- },
90
- };
91
- /** State-based left border overrides (takes precedence over lifecycle). */
92
- export const stateBorderColors = {
93
- blocked: 'border-l-gray-400',
94
- error: 'border-l-red-500',
95
- deleting: 'border-l-gray-300',
96
- };
97
- /** State-based accent bar overrides (takes precedence over lifecycle). */
98
- export const stateAccentColors = {
99
- blocked: 'bg-gray-400',
100
- error: 'bg-red-500',
101
- deleting: 'bg-gray-300',
102
- };
103
12
  /** Present-participle verbs for the running badge, keyed by lifecycle phase. */
104
13
  export const lifecycleRunningVerbs = {
105
14
  pending: 'Waiting to start',
@@ -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;AA4CnE,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,2CA6WA"}
1
+ {"version":3,"file":"feature-node.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/feature-node/feature-node.tsx"],"names":[],"mappings":"AAyBA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AA6DnE,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,2CAqWA"}
@@ -2,30 +2,42 @@
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, Trash2, Zap, Loader2, Globe, RotateCcw, Play, Eye, } from 'lucide-react';
5
+ import { Plus, FileText, Wrench, GitMerge, Trash2, Zap, Loader2, Globe, RotateCcw, Play, } 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';
9
- import { featureNodeStateConfig, lifecycleRunningVerbs, lifecyclePhaseBadge, } from './feature-node-state-config.js';
10
- import { getAgentTypeIcon } from './agent-type-icons.js';
9
+ import { featureNodeStateConfig, lifecycleDisplayLabels, lifecycleRunningVerbs, } from './feature-node-state-config.js';
10
+ import { getAgentTypeIcon, agentTypeLabels } from './agent-type-icons.js';
11
+ import { getModelMeta } from '../../../lib/model-metadata.js';
11
12
  import { DeploymentState } from '../../../../../../packages/core/src/domain/generated/output.js';
13
+ import { FeatureSessionsDropdown } from './feature-sessions-dropdown.js';
12
14
  function AgentIcon({ agentType, className }) {
13
15
  const IconComponent = getAgentTypeIcon(agentType);
14
16
  return _jsx(IconComponent, { className: className });
15
17
  }
16
18
  function getBadgeIcon(data) {
17
19
  const config = featureNodeStateConfig[data.state];
20
+ if (data.state === 'action-required') {
21
+ if (data.lifecycle === 'requirements')
22
+ return FileText;
23
+ if (data.lifecycle === 'implementation')
24
+ return Wrench;
25
+ if (data.lifecycle === 'review')
26
+ return GitMerge;
27
+ }
18
28
  return config.icon;
19
29
  }
20
- /** Short, friendly label for each action-required gate. */
21
- function getActionRequiredLabel(data) {
22
- if (data.lifecycle === 'requirements')
23
- return 'Review Requirements';
24
- if (data.lifecycle === 'implementation')
25
- return 'Review Technical Plan';
26
- if (data.lifecycle === 'review')
27
- return 'Review Changes';
28
- return 'Review';
30
+ /** Returns override badge classes for action-required based on lifecycle phase. */
31
+ function getActionRequiredBadgeClasses(data) {
32
+ if (data.state !== 'action-required')
33
+ return null;
34
+ if (data.lifecycle === 'implementation') {
35
+ return { badgeClass: 'text-indigo-700', badgeBgClass: 'bg-indigo-50' };
36
+ }
37
+ if (data.lifecycle === 'review') {
38
+ return { badgeClass: 'text-emerald-700', badgeBgClass: 'bg-emerald-50' };
39
+ }
40
+ return null; // requirements stays amber (default)
29
41
  }
30
42
  function getBadgeText(data) {
31
43
  const config = featureNodeStateConfig[data.state];
@@ -41,7 +53,13 @@ function getBadgeText(data) {
41
53
  case 'pending':
42
54
  return 'Pending';
43
55
  case 'action-required':
44
- return getActionRequiredLabel(data);
56
+ if (data.lifecycle === 'requirements')
57
+ return 'Review Product Requirements';
58
+ if (data.lifecycle === 'implementation')
59
+ return 'Review Technical Planning';
60
+ if (data.lifecycle === 'review')
61
+ return 'Review Merge Request';
62
+ return config.label;
45
63
  case 'error':
46
64
  return data.errorMessage ?? 'Something went wrong';
47
65
  default:
@@ -58,48 +76,40 @@ export function FeatureNode({ data, selected, }) {
58
76
  }, className: "bg-card text-muted-foreground hover:border-destructive hover:text-destructive flex h-7 w-7 cursor-pointer items-center justify-center rounded-full border shadow-sm transition-colors", children: _jsx(Trash2, { className: "h-3.5 w-3.5" }) }) }), _jsx(TooltipContent, { children: "Delete feature" })] }) }) }), _jsx(DeleteFeatureDialog, { open: confirmOpen, onOpenChange: setConfirmOpen, onConfirm: (cleanup, cascadeDelete, closePr) => {
59
77
  setConfirmOpen(false);
60
78
  data.onDelete?.(data.featureId, cleanup, cascadeDelete, closePr);
61
- }, isDeleting: false, featureName: data.name ?? 'this feature', featureId: data.featureId, hasChildren: data.hasChildren, hasOpenPr: !!data.pr && data.pr.status === 'Open' })] })) : null, _jsxs("div", { "data-testid": "feature-node-card", "aria-busy": data.state === 'creating' || data.state === 'deleting' ? 'true' : undefined, className: cn('bg-card flex min-h-35 w-97 cursor-pointer flex-col rounded-lg border p-3 shadow-sm dark:bg-neutral-800/80', data.state === 'action-required' && 'border-amber-300/60 dark:border-amber-700/40', selected && 'ring-primary ring-2', data.state === 'deleting' && 'opacity-60'), children: [data.state !== 'creating' ? (_jsx("div", { className: "absolute top-3 right-4", children: _jsx(TooltipProvider, { children: _jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsxs("span", { "data-testid": "feature-node-phase-badge", className: "flex items-center gap-1.5", children: [_jsx("span", { className: "text-muted-foreground text-[10px]", children: lifecyclePhaseBadge[data.lifecycle].tooltip }), _jsx("span", { className: cn('h-1.5 w-1.5 -translate-y-px rounded-full', lifecyclePhaseBadge[data.lifecycle].dot) })] }) }), _jsxs(TooltipContent, { side: "bottom", className: "max-w-56 bg-white text-neutral-900 shadow-lg dark:bg-neutral-100 dark:text-neutral-900", children: [_jsx("p", { className: "font-semibold", children: lifecyclePhaseBadge[data.lifecycle].tooltip }), _jsx("p", { className: "mt-1 text-xs leading-relaxed text-neutral-500", children: lifecyclePhaseBadge[data.lifecycle].description })] })] }) }) })) : null, _jsxs("div", { className: "flex items-center gap-1.5", children: [data.agentType ? (_jsx(AgentIcon, { agentType: data.agentType, className: "h-4 w-4 shrink-0" })) : null, _jsx("h3", { className: "min-w-0 truncate text-sm font-bold", children: data.name })] }), data.description ? (_jsx("p", { "data-testid": "feature-node-description", className: "text-muted-foreground mt-1 line-clamp-2 text-xs", children: data.description })) : null, _jsxs("div", { className: "mt-auto pt-2", children: [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}%` } }) })] })) : null, !config.showProgressBar &&
62
- ![
63
- 'deleting',
64
- 'creating',
65
- 'running',
66
- 'done',
67
- 'action-required',
68
- 'pending',
69
- 'blocked',
70
- ].includes(data.state) ? (_jsxs("div", { "data-testid": "feature-node-badge", className: "relative flex min-w-0 items-center gap-1.5 text-xs", children: [(() => {
71
- const BadgeIcon = getBadgeIcon(data);
72
- return _jsx(BadgeIcon, { className: cn('h-3.5 w-3.5 shrink-0', config.badgeClass) });
73
- })(), _jsx("span", { className: cn('translate-y-px truncate text-[11px] font-medium', config.badgeClass), children: getBadgeText(data) })] })) : null, _jsxs("div", { className: "mt-1.5 flex min-h-[26px] items-center justify-between gap-2", children: [_jsxs("div", { className: "flex items-center gap-1.5", style: { transform: 'translateY(1px)' }, children: [data.featureId ? (_jsxs("div", { className: "flex items-baseline gap-1", children: [_jsx("span", { className: "text-muted-foreground/50 text-[10px]", children: "ID" }), _jsx("button", { type: "button", "data-testid": "feature-node-id", className: "nodrag text-muted-foreground/60 hover:text-muted-foreground cursor-pointer font-mono text-[10px] transition-colors", onClick: (e) => {
79
+ }, isDeleting: false, featureName: data.name ?? 'this feature', featureId: data.featureId, hasChildren: data.hasChildren, hasOpenPr: !!data.pr && data.pr.status === 'Open' })] })) : null, _jsxs("div", { "data-testid": "feature-node-card", "aria-busy": data.state === 'creating' || data.state === 'deleting' ? 'true' : undefined, className: cn('bg-card flex min-h-35 w-72 cursor-pointer flex-col rounded-lg border p-3 shadow-sm', selected && 'ring-primary ring-2', data.state === 'deleting' && 'opacity-60'), children: [_jsxs("div", { className: "flex items-center justify-between", children: [_jsx("span", { "data-testid": "feature-node-lifecycle-label", className: cn('text-[10px] font-semibold tracking-wider'), children: data.state === 'blocked'
80
+ ? 'BLOCKED'
81
+ : data.state === 'pending'
82
+ ? 'PENDING'
83
+ : lifecycleDisplayLabels[data.lifecycle] }), _jsxs("div", { className: "flex items-center gap-0.5", children: [data.deployment ? (_jsx(TooltipProvider, { children: _jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx("button", { type: "button", "aria-label": data.deployment.status === DeploymentState.Booting
84
+ ? 'Deploying'
85
+ : 'Open dev server', "data-testid": "feature-node-deployment-indicator", onClick: (e) => {
74
86
  e.stopPropagation();
75
- navigator.clipboard.writeText(data.featureId);
76
- }, title: `Click to copy: ${data.featureId}`, children: data.featureId.slice(0, 6) })] })) : null, data.deployment ? (_jsx(TooltipProvider, { children: _jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx("button", { type: "button", "aria-label": data.deployment.status === DeploymentState.Booting
77
- ? 'Deploying'
78
- : 'Open dev server', "data-testid": "feature-node-deployment-indicator", onClick: (e) => {
79
- e.stopPropagation();
80
- if (data.deployment?.status === DeploymentState.Ready &&
81
- data.deployment.url) {
82
- window.open(data.deployment.url, '_blank', 'noopener,noreferrer');
83
- }
84
- }, className: cn('nodrag', data.deployment.status === DeploymentState.Ready && data.deployment.url
85
- ? 'cursor-pointer opacity-80 transition-opacity hover:opacity-100'
86
- : 'cursor-default'), children: data.deployment.status === DeploymentState.Booting ? (_jsx(Loader2, { className: "h-3 w-3 animate-spin text-blue-500" })) : (_jsx(Globe, { className: "h-3 w-3 text-green-600" })) }) }), _jsx(TooltipContent, { side: "top", children: data.deployment.status === DeploymentState.Booting
87
- ? 'Deploying...'
88
- : (data.deployment.url ?? 'Live') })] }) })) : null, data.fastMode ? (_jsx(TooltipProvider, { children: _jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx("span", { "data-testid": "feature-node-fast-mode-badge", children: _jsx(Zap, { className: "h-3 w-3 text-amber-500" }) }) }), _jsx(TooltipContent, { side: "top", children: "Fast Mode" })] }) })) : null] }), data.state === 'deleting' ? (_jsxs("div", { className: "flex items-center gap-1.5 text-xs", children: [_jsx(Loader2, { className: "h-3.5 w-3.5 shrink-0 animate-spin text-gray-400" }), _jsx("span", { className: "text-muted-foreground", children: "Deleting\u2026" })] })) : data.state === 'creating' ? (_jsxs("div", { className: "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) })] })) : data.state === 'running' ? (_jsxs("div", { className: "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) })] })) : data.state === 'action-required' ? (_jsxs("button", { type: "button", "aria-label": getActionRequiredLabel(data), "data-testid": "feature-node-approve-button",
89
- // eslint-disable-next-line @typescript-eslint/no-empty-function -- click bubbles to card's onNodeClick
90
- onClick: () => { }, className: "nodrag relative inline-flex shrink-0 cursor-pointer items-center gap-1.5 overflow-hidden rounded-md bg-gradient-to-b from-neutral-800 via-neutral-900 to-neutral-950 px-3 py-1.5 text-[11px] font-semibold transition-all hover:from-neutral-700 hover:via-neutral-800 hover:to-neutral-900 active:from-neutral-900 active:to-black", children: [_jsx("span", { className: "animate-shimmer pointer-events-none absolute inset-0 bg-gradient-to-r from-transparent via-white/15 to-transparent bg-[length:200%_100%]" }), _jsx(Eye, { className: "relative h-3 w-3 text-amber-400" }), _jsx("span", { className: "animate-shimmer relative bg-gradient-to-r from-amber-400 via-yellow-200 to-amber-400 bg-[length:200%_100%] bg-clip-text text-transparent", children: getActionRequiredLabel(data) })] })) : data.state === 'error' && data.onRetry ? (_jsxs("button", { type: "button", "aria-label": "Retry", "data-testid": "feature-node-retry-button", onClick: (e) => {
91
- e.stopPropagation();
92
- data.onRetry(data.featureId);
93
- }, className: "nodrag inline-flex shrink-0 cursor-pointer items-center gap-1 rounded-md bg-neutral-800 px-2.5 py-1 text-[11px] font-medium text-white shadow-sm transition-all hover:bg-neutral-700 active:bg-neutral-900 dark:bg-neutral-200 dark:text-neutral-900 dark:hover:bg-neutral-300", children: [_jsx(RotateCcw, { className: "h-3 w-3" }), "Retry"] })) : data.state === 'blocked' ? (_jsxs("div", { className: "flex items-center gap-1.5 text-xs", "data-testid": "feature-node-badge", children: [(() => {
94
- const BadgeIcon = getBadgeIcon(data);
95
- return _jsx(BadgeIcon, { className: cn('h-3.5 w-3.5 shrink-0', config.badgeClass) });
96
- })(), _jsx("span", { className: cn('truncate text-[11px] font-medium', config.badgeClass), children: getBadgeText(data) })] })) : data.state === 'done' ? (_jsxs("div", { className: "flex items-center gap-1.5 text-xs", "data-testid": "feature-node-badge", children: [(() => {
97
- const BadgeIcon = getBadgeIcon(data);
98
- return _jsx(BadgeIcon, { className: cn('h-3.5 w-3.5 shrink-0', config.badgeClass) });
99
- })(), _jsx("span", { className: cn('text-[11px] font-medium', config.badgeClass), children: getBadgeText(data) })] })) : data.state === 'pending' && data.onStart ? (_jsxs("button", { type: "button", "aria-label": "Start", "data-testid": "feature-node-start-button", onClick: (e) => {
100
- e.stopPropagation();
101
- data.onStart(data.featureId);
102
- }, className: "nodrag inline-flex shrink-0 cursor-pointer items-center gap-1 rounded-md bg-neutral-800 px-2.5 py-1 text-[11px] font-medium text-white shadow-sm transition-all hover:bg-neutral-700 active:bg-neutral-900 dark:bg-neutral-200 dark:text-neutral-900 dark:hover:bg-neutral-300", children: [_jsx(Play, { className: "h-3 w-3" }), "Start"] })) : null] })] })] }), data.onAction && data.state !== 'deleting' ? (_jsx(Handle, { type: "source", position: Position.Right, className: "h-0! w-0! border-0! bg-transparent!", style: { top: 70 }, children: _jsx("button", { type: "button", "aria-label": "Add", "data-testid": "feature-node-action-button", onClick: (e) => {
87
+ if (data.deployment?.status === DeploymentState.Ready &&
88
+ data.deployment.url) {
89
+ window.open(data.deployment.url, '_blank', 'noopener,noreferrer');
90
+ }
91
+ }, className: cn('nodrag -mt-1 p-1', data.deployment.status === DeploymentState.Ready && data.deployment.url
92
+ ? 'cursor-pointer opacity-80 transition-opacity hover:opacity-100'
93
+ : 'cursor-default'), children: data.deployment.status === DeploymentState.Booting ? (_jsx(Loader2, { className: "h-3.5 w-3.5 animate-spin text-blue-500" })) : (_jsx(Globe, { className: "h-3.5 w-3.5 text-green-600" })) }) }), _jsx(TooltipContent, { side: "bottom", children: data.deployment.status === DeploymentState.Booting
94
+ ? 'Deploying...'
95
+ : (data.deployment.url ?? 'Live') })] }) })) : null, data.fastMode ? (_jsx(TooltipProvider, { children: _jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx("span", { "data-testid": "feature-node-fast-mode-badge", className: "-mt-1 p-1", children: _jsx(Zap, { className: "h-3.5 w-3.5 text-amber-500" }) }) }), _jsx(TooltipContent, { side: "bottom", children: "Fast Mode" })] }) })) : null, data.agentType ? (_jsx(TooltipProvider, { children: _jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx("button", { type: "button", "aria-label": agentTypeLabels[data.agentType] ?? data.agentType, "data-testid": "feature-node-agent-badge", onClick: (e) => {
96
+ e.stopPropagation();
97
+ data.onSettings?.();
98
+ }, className: cn('nodrag -mt-1 -mr-1 p-1', data.onSettings
99
+ ? 'cursor-pointer opacity-80 transition-opacity hover:opacity-100'
100
+ : 'cursor-default'), children: _jsx(AgentIcon, { agentType: data.agentType, className: "h-3.5 w-3.5" }) }) }), _jsxs(TooltipContent, { side: "bottom", children: [_jsx("span", { className: "font-medium", children: agentTypeLabels[data.agentType] ?? data.agentType }), data.modelId ? (_jsxs("span", { className: "ml-1 opacity-70", children: ["\u00B7 ", getModelMeta(data.modelId).displayName || data.modelId] })) : null] })] }) })) : null] })] }), _jsx("h3", { className: "mt-1 truncate text-sm font-bold", children: data.name }), data.description ? (_jsx("p", { "data-testid": "feature-node-description", className: "text-muted-foreground mt-0.5 truncate text-xs", children: data.description })) : 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: [_jsxs("div", { className: "text-muted-foreground flex items-center justify-between text-[10px]", children: [_jsx("span", { children: data.featureId }), (data.worktreePath ?? data.repositoryPath) ? (_jsx(FeatureSessionsDropdown, { repositoryPath: data.worktreePath ?? data.repositoryPath })) : null] }), _jsxs("div", { className: "mt-1.5 flex items-center gap-1.5", children: [_jsxs("div", { "data-testid": "feature-node-badge", className: (() => {
101
+ const override = getActionRequiredBadgeClasses(data);
102
+ 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);
103
+ })(), children: [(() => {
104
+ const BadgeIcon = getBadgeIcon(data);
105
+ return _jsx(BadgeIcon, { className: "h-3.5 w-3.5 shrink-0" });
106
+ })(), _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) => {
107
+ e.stopPropagation();
108
+ data.onRetry(data.featureId);
109
+ }, 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.state === 'pending' && data.onStart ? (_jsxs("button", { type: "button", "aria-label": "Start feature", "data-testid": "feature-node-start-button", onClick: (e) => {
110
+ e.stopPropagation();
111
+ data.onStart(data.featureId);
112
+ }, className: "nodrag flex shrink-0 cursor-pointer items-center gap-1 rounded-full bg-slate-100 px-2.5 py-1 text-[11px] font-medium text-slate-700 transition-colors hover:bg-slate-200", children: [_jsx(Play, { className: "h-3 w-3" }), "Start"] })) : null] })] })) })] }), data.onAction && data.state !== 'deleting' ? (_jsx(Handle, { type: "source", position: Position.Right, className: "h-0! w-0! border-0! bg-transparent!", style: { top: 70 }, children: _jsx("button", { type: "button", "aria-label": "Add", "data-testid": "feature-node-action-button", onClick: (e) => {
103
113
  e.stopPropagation();
104
114
  data.onAction?.();
105
115
  }, 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!", style: { top: 70 } })) : null] }));
@@ -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;AAoCrC,QAAA,MAAM,IAAI,EAAE,IAAI,CAAC,eAAe,CAqB/B,CAAC;AAEF,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,eAAe,CAAC,CAAC;AAEvC,eAAO,MAAM,OAAO,EAAE,KAErB,CAAC;AAqLF,eAAO,MAAM,SAAS,EAAE,KAQvB,CAAC;AAYF,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;AAEF,eAAO,MAAM,8BAA8B,EAAE,KAe5C,CAAC;AA4EF,eAAO,MAAM,WAAW,EAAE,KAOzB,CAAC;AAEF,eAAO,MAAM,OAAO,EAAE,KAUrB,CAAC;AAEF,eAAO,MAAM,gBAAgB,EAAE,KAW9B,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;AA0HF,eAAO,MAAM,SAAS,EAAE,KAQvB,CAAC;AAYF,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;AAEF,eAAO,MAAM,8BAA8B,EAAE,KAe5C,CAAC;AA4EF,eAAO,MAAM,WAAW,EAAE,KAOzB,CAAC;AAEF,eAAO,MAAM,OAAO,EAAE,KAUrB,CAAC;AAEF,eAAO,MAAM,gBAAgB,EAAE,KAW9B,CAAC"}