@shepai/cli 1.140.0 → 1.141.0-pr451.4e8c2b8

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 (214) hide show
  1. package/dist/src/presentation/web/app/layout.d.ts +1 -1
  2. package/dist/src/presentation/web/app/layout.d.ts.map +1 -1
  3. package/dist/src/presentation/web/app/layout.js +6 -13
  4. package/dist/src/presentation/web/components/common/feature-drawer-tabs/event-log-viewer.js +12 -10
  5. package/dist/src/presentation/web/components/common/feature-node/feature-node.d.ts.map +1 -1
  6. package/dist/src/presentation/web/components/common/feature-node/feature-node.js +8 -5
  7. package/dist/src/presentation/web/components/common/repository-node/repository-node.d.ts +2 -1
  8. package/dist/src/presentation/web/components/common/repository-node/repository-node.d.ts.map +1 -1
  9. package/dist/src/presentation/web/components/common/repository-node/repository-node.js +3 -4
  10. package/dist/src/presentation/web/components/features/control-center/control-center-inner.d.ts.map +1 -1
  11. package/dist/src/presentation/web/components/features/control-center/control-center-inner.js +3 -1
  12. package/dist/src/presentation/web/components/features/features-canvas/features-canvas.d.ts +5 -1
  13. package/dist/src/presentation/web/components/features/features-canvas/features-canvas.d.ts.map +1 -1
  14. package/dist/src/presentation/web/components/features/features-canvas/features-canvas.js +25 -8
  15. package/dist/src/presentation/web/components/layouts/app-shell/app-shell.d.ts +3 -1
  16. package/dist/src/presentation/web/components/layouts/app-shell/app-shell.d.ts.map +1 -1
  17. package/dist/src/presentation/web/components/layouts/app-shell/app-shell.js +4 -4
  18. package/dist/src/presentation/web/components/ui/sidebar.d.ts +2 -0
  19. package/dist/src/presentation/web/components/ui/sidebar.d.ts.map +1 -1
  20. package/dist/src/presentation/web/components/ui/sidebar.js +26 -28
  21. package/dist/src/presentation/web/components/ui/tooltip.d.ts +2 -0
  22. package/dist/src/presentation/web/components/ui/tooltip.d.ts.map +1 -1
  23. package/dist/src/presentation/web/components/ui/tooltip.js +3 -1
  24. package/dist/src/presentation/web/hooks/use-selected-repository.d.ts +13 -0
  25. package/dist/src/presentation/web/hooks/use-selected-repository.d.ts.map +1 -0
  26. package/dist/src/presentation/web/hooks/use-selected-repository.js +19 -0
  27. package/dist/tsconfig.build.tsbuildinfo +1 -1
  28. package/package.json +1 -1
  29. package/web/.next/BUILD_ID +1 -1
  30. package/web/.next/build-manifest.json +2 -2
  31. package/web/.next/fallback-build-manifest.json +2 -2
  32. package/web/.next/prerender-manifest.json +3 -3
  33. package/web/.next/required-server-files.js +3 -3
  34. package/web/.next/required-server-files.json +3 -3
  35. package/web/.next/server/app/(dashboard)/@drawer/adopt/page/server-reference-manifest.json +28 -28
  36. package/web/.next/server/app/(dashboard)/@drawer/adopt/page.js +6 -5
  37. package/web/.next/server/app/(dashboard)/@drawer/adopt/page.js.nft.json +1 -1
  38. package/web/.next/server/app/(dashboard)/@drawer/adopt/page_client-reference-manifest.js +1 -1
  39. package/web/.next/server/app/(dashboard)/@drawer/create/page/server-reference-manifest.json +28 -28
  40. package/web/.next/server/app/(dashboard)/@drawer/create/page.js +5 -3
  41. package/web/.next/server/app/(dashboard)/@drawer/create/page.js.nft.json +1 -1
  42. package/web/.next/server/app/(dashboard)/@drawer/create/page_client-reference-manifest.js +1 -1
  43. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page/server-reference-manifest.json +36 -36
  44. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page.js +6 -4
  45. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page.js.nft.json +1 -1
  46. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page_client-reference-manifest.js +1 -1
  47. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page/server-reference-manifest.json +36 -36
  48. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js +6 -4
  49. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js.nft.json +1 -1
  50. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page_client-reference-manifest.js +1 -1
  51. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page/server-reference-manifest.json +26 -26
  52. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js +5 -3
  53. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js.nft.json +1 -1
  54. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  55. package/web/.next/server/app/(dashboard)/create/page/server-reference-manifest.json +28 -28
  56. package/web/.next/server/app/(dashboard)/create/page.js +5 -3
  57. package/web/.next/server/app/(dashboard)/create/page.js.nft.json +1 -1
  58. package/web/.next/server/app/(dashboard)/create/page_client-reference-manifest.js +1 -1
  59. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page/server-reference-manifest.json +36 -36
  60. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page.js +6 -4
  61. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page.js.nft.json +1 -1
  62. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page_client-reference-manifest.js +1 -1
  63. package/web/.next/server/app/(dashboard)/feature/[featureId]/page/server-reference-manifest.json +36 -36
  64. package/web/.next/server/app/(dashboard)/feature/[featureId]/page.js +6 -4
  65. package/web/.next/server/app/(dashboard)/feature/[featureId]/page.js.nft.json +1 -1
  66. package/web/.next/server/app/(dashboard)/feature/[featureId]/page_client-reference-manifest.js +1 -1
  67. package/web/.next/server/app/(dashboard)/page/server-reference-manifest.json +26 -26
  68. package/web/.next/server/app/(dashboard)/page.js +5 -3
  69. package/web/.next/server/app/(dashboard)/page.js.nft.json +1 -1
  70. package/web/.next/server/app/(dashboard)/page_client-reference-manifest.js +1 -1
  71. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page/server-reference-manifest.json +26 -26
  72. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js +5 -3
  73. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js.nft.json +1 -1
  74. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  75. package/web/.next/server/app/_global-error/page.js +2 -2
  76. package/web/.next/server/app/_global-error/page.js.nft.json +1 -1
  77. package/web/.next/server/app/_global-error.html +2 -2
  78. package/web/.next/server/app/_global-error.rsc +1 -1
  79. package/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  80. package/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  81. package/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  82. package/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  83. package/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  84. package/web/.next/server/app/_not-found/page/server-reference-manifest.json +3 -3
  85. package/web/.next/server/app/_not-found/page.js +5 -3
  86. package/web/.next/server/app/_not-found/page.js.nft.json +1 -1
  87. package/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  88. package/web/.next/server/app/api/attachments/preview/route.js.nft.json +1 -1
  89. package/web/.next/server/app/api/evidence/route.js.nft.json +1 -1
  90. package/web/.next/server/app/api/graph-data/route.js.nft.json +1 -1
  91. package/web/.next/server/app/settings/page/server-reference-manifest.json +8 -8
  92. package/web/.next/server/app/settings/page.js +6 -5
  93. package/web/.next/server/app/settings/page.js.nft.json +1 -1
  94. package/web/.next/server/app/settings/page_client-reference-manifest.js +1 -1
  95. package/web/.next/server/app/skills/page/server-reference-manifest.json +8 -8
  96. package/web/.next/server/app/skills/page.js +8 -7
  97. package/web/.next/server/app/skills/page.js.nft.json +1 -1
  98. package/web/.next/server/app/skills/page_client-reference-manifest.js +1 -1
  99. package/web/.next/server/app/tools/page/server-reference-manifest.json +8 -8
  100. package/web/.next/server/app/tools/page.js +5 -3
  101. package/web/.next/server/app/tools/page.js.nft.json +1 -1
  102. package/web/.next/server/app/tools/page_client-reference-manifest.js +1 -1
  103. package/web/.next/server/app/version/page/server-reference-manifest.json +3 -3
  104. package/web/.next/server/app/version/page.js +5 -3
  105. package/web/.next/server/app/version/page.js.nft.json +1 -1
  106. package/web/.next/server/app/version/page_client-reference-manifest.js +1 -1
  107. package/web/.next/server/chunks/[root-of-the-server]__a402b567._.js +1 -1
  108. package/web/.next/server/chunks/ssr/{403f9_next_dist_compiled_dc550646._.js → 403f9_next_dist_compiled_@opentelemetry_api_index_5410770c.js} +2 -2
  109. package/web/.next/server/chunks/ssr/403f9_next_dist_compiled_@opentelemetry_api_index_5410770c.js.map +1 -0
  110. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js +1 -1
  111. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js.map +1 -1
  112. package/web/.next/server/chunks/ssr/{[root-of-the-server]__2bdf88a0._.js → [root-of-the-server]__29580090._.js} +2 -2
  113. package/web/.next/server/chunks/ssr/{[root-of-the-server]__42faf5ae._.js.map → [root-of-the-server]__29580090._.js.map} +1 -1
  114. package/web/.next/server/chunks/ssr/[root-of-the-server]__357d99f9._.js +1 -1
  115. package/web/.next/server/chunks/ssr/[root-of-the-server]__3ef34e4c._.js +1 -1
  116. package/web/.next/server/chunks/ssr/[root-of-the-server]__43f51aa6._.js +1 -1
  117. package/web/.next/server/chunks/ssr/[root-of-the-server]__43f51aa6._.js.map +1 -1
  118. package/web/.next/server/chunks/ssr/[root-of-the-server]__815546bd._.js +1 -1
  119. package/web/.next/server/chunks/ssr/[root-of-the-server]__815546bd._.js.map +1 -1
  120. package/web/.next/server/chunks/ssr/[root-of-the-server]__a5f9c6e5._.js +2 -2
  121. package/web/.next/server/chunks/ssr/[root-of-the-server]__aad040c0._.js +2 -2
  122. package/web/.next/server/chunks/ssr/[root-of-the-server]__aad040c0._.js.map +1 -1
  123. package/web/.next/server/chunks/ssr/{[root-of-the-server]__685ee565._.js → [root-of-the-server]__c094882b._.js} +2 -2
  124. package/web/.next/server/chunks/ssr/{[root-of-the-server]__685ee565._.js.map → [root-of-the-server]__c094882b._.js.map} +1 -1
  125. package/web/.next/server/chunks/ssr/[root-of-the-server]__d1040bd1._.js +3 -0
  126. package/web/.next/server/chunks/ssr/[root-of-the-server]__d1040bd1._.js.map +1 -0
  127. package/web/.next/server/chunks/ssr/[root-of-the-server]__d48c5b11._.js +1 -1
  128. package/web/.next/server/chunks/ssr/[root-of-the-server]__d48c5b11._.js.map +1 -1
  129. package/web/.next/server/chunks/ssr/{[root-of-the-server]__74756aae._.js → [root-of-the-server]__dac5dbf1._.js} +2 -2
  130. package/web/.next/server/chunks/ssr/{[root-of-the-server]__74756aae._.js.map → [root-of-the-server]__dac5dbf1._.js.map} +1 -1
  131. package/web/.next/server/chunks/ssr/[root-of-the-server]__efeeaed4._.js +3 -0
  132. package/web/.next/server/chunks/ssr/[root-of-the-server]__efeeaed4._.js.map +1 -0
  133. package/web/.next/server/chunks/ssr/{[root-of-the-server]__42faf5ae._.js → [root-of-the-server]__fae8b355._.js} +2 -2
  134. package/web/.next/server/chunks/ssr/{[root-of-the-server]__2bdf88a0._.js.map → [root-of-the-server]__fae8b355._.js.map} +1 -1
  135. package/web/.next/server/chunks/ssr/_0020fddd._.js +1 -1
  136. package/web/.next/server/chunks/ssr/_0020fddd._.js.map +1 -1
  137. package/web/.next/server/chunks/ssr/_0c5f56e3._.js +2 -2
  138. package/web/.next/server/chunks/ssr/_0c5f56e3._.js.map +1 -1
  139. package/web/.next/server/chunks/ssr/_1b719e7f._.js +1 -1
  140. package/web/.next/server/chunks/ssr/_1b719e7f._.js.map +1 -1
  141. package/web/.next/server/chunks/ssr/_37e8548b._.js +1 -1
  142. package/web/.next/server/chunks/ssr/_37e8548b._.js.map +1 -1
  143. package/web/.next/server/chunks/ssr/_4b432739._.js +3 -0
  144. package/web/.next/server/chunks/ssr/_4b432739._.js.map +1 -0
  145. package/web/.next/server/chunks/ssr/_55d763e2._.js +1 -1
  146. package/web/.next/server/chunks/ssr/_55d763e2._.js.map +1 -1
  147. package/web/.next/server/chunks/ssr/_6256a985._.js +21 -0
  148. package/web/.next/server/chunks/ssr/_6256a985._.js.map +1 -0
  149. package/web/.next/server/chunks/ssr/_64bdfc6f._.js +2 -2
  150. package/web/.next/server/chunks/ssr/_64bdfc6f._.js.map +1 -1
  151. package/web/.next/server/chunks/ssr/_6c7faa01._.js +3 -0
  152. package/web/.next/server/chunks/ssr/_6c7faa01._.js.map +1 -0
  153. package/web/.next/server/chunks/ssr/_7dca1882._.js +1 -1
  154. package/web/.next/server/chunks/ssr/_7dca1882._.js.map +1 -1
  155. package/web/.next/server/chunks/ssr/_a9f57758._.js +1 -1
  156. package/web/.next/server/chunks/ssr/_b71645b4._.js +1 -1
  157. package/web/.next/server/chunks/ssr/_b71645b4._.js.map +1 -1
  158. package/web/.next/server/chunks/ssr/{_bbb3a0fc._.js → _d1000f0f._.js} +2 -2
  159. package/web/.next/server/chunks/ssr/{_bbb3a0fc._.js.map → _d1000f0f._.js.map} +1 -1
  160. package/web/.next/server/chunks/ssr/_d8575088._.js +1 -1
  161. package/web/.next/server/chunks/ssr/_d8575088._.js.map +1 -1
  162. package/web/.next/server/chunks/ssr/{_0a69ebd5._.js → _ec8b9547._.js} +2 -2
  163. package/web/.next/server/chunks/ssr/_ec8b9547._.js.map +1 -0
  164. package/web/.next/server/chunks/ssr/_f39a1adb._.js +1 -1
  165. package/web/.next/server/chunks/ssr/_f39a1adb._.js.map +1 -1
  166. package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_settings_settings-page-client_tsx_6ed9d5f8._.js +1 -1
  167. package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_settings_settings-page-client_tsx_6ed9d5f8._.js.map +1 -1
  168. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_skills_page_actions_1b176e3c.js +1 -1
  169. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_skills_page_actions_1b176e3c.js.map +1 -1
  170. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_tools_page_actions_bd9f0dda.js +1 -1
  171. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_tools_page_actions_bd9f0dda.js.map +1 -1
  172. package/web/.next/server/chunks/ssr/src_presentation_web_app_actions_open-ide_ts_baaca5d5._.js +1 -1
  173. package/web/.next/server/chunks/ssr/{src_presentation_web_340a9d64._.js → src_presentation_web_b91e7ad9._.js} +2 -2
  174. package/web/.next/server/chunks/ssr/{src_presentation_web_340a9d64._.js.map → src_presentation_web_b91e7ad9._.js.map} +1 -1
  175. package/web/.next/server/chunks/ssr/src_presentation_web_components_e599bb8c._.js +1 -1
  176. package/web/.next/server/chunks/ssr/src_presentation_web_components_e599bb8c._.js.map +1 -1
  177. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js +1 -1
  178. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js.map +1 -1
  179. package/web/.next/server/pages/500.html +2 -2
  180. package/web/.next/server/server-reference-manifest.js +1 -1
  181. package/web/.next/server/server-reference-manifest.json +44 -44
  182. package/web/.next/static/chunks/{7e7537ab107a5ed5.js → 08baac5434d9528e.js} +1 -1
  183. package/web/.next/static/chunks/{8ae10749f2e8db60.js → 1c0d319e7b6b9da4.js} +1 -1
  184. package/web/.next/static/chunks/{b705d6e7529f010b.js → 413519e7b0c79890.js} +1 -1
  185. package/web/.next/static/chunks/74ee98538b63a4b2.css +1 -0
  186. package/web/.next/static/chunks/8839f95cf0bf7c47.js +1 -0
  187. package/web/.next/static/chunks/afc7da15e125a4c5.js +1 -0
  188. package/web/.next/static/chunks/{e65c4ae61b6f8045.js → b77cfc163ce74469.js} +1 -1
  189. package/web/.next/static/chunks/{5bea21d249dc35f8.js → bd0b30673ac2d2b1.js} +2 -2
  190. package/web/.next/static/chunks/{9eff18338e76d253.js → c4f72fce4d4d08fd.js} +2 -2
  191. package/web/.next/static/chunks/{523ad15a08ac9fe7.js → ce9d764d2b4b237e.js} +1 -1
  192. package/web/.next/static/chunks/{7b850f14e5ef6865.js → cf956bbe6f939f21.js} +1 -1
  193. package/web/.next/static/chunks/{2349b8618faac5df.js → e1f0c5c6da6ce871.js} +1 -1
  194. package/web/.next/static/chunks/{3c5c3a51c24cf5c8.js → eb26a1a363270c1d.js} +1 -1
  195. package/web/.next/static/chunks/ee590b04ba31caa5.js +1 -0
  196. package/web/.next/server/chunks/ssr/403f9_next_dist_31ea46d3._.js +0 -6
  197. package/web/.next/server/chunks/ssr/403f9_next_dist_31ea46d3._.js.map +0 -1
  198. package/web/.next/server/chunks/ssr/403f9_next_dist_compiled_dc550646._.js.map +0 -1
  199. package/web/.next/server/chunks/ssr/[root-of-the-server]__4af0afe0._.js +0 -3
  200. package/web/.next/server/chunks/ssr/[root-of-the-server]__4af0afe0._.js.map +0 -1
  201. package/web/.next/server/chunks/ssr/[root-of-the-server]__9bc1434f._.js +0 -3
  202. package/web/.next/server/chunks/ssr/[root-of-the-server]__9bc1434f._.js.map +0 -1
  203. package/web/.next/server/chunks/ssr/_02ec1aea._.js +0 -21
  204. package/web/.next/server/chunks/ssr/_02ec1aea._.js.map +0 -1
  205. package/web/.next/server/chunks/ssr/_0a69ebd5._.js.map +0 -1
  206. package/web/.next/server/chunks/ssr/_a37f5f18._.js +0 -13
  207. package/web/.next/server/chunks/ssr/_a37f5f18._.js.map +0 -1
  208. package/web/.next/static/chunks/1df0c0594135d736.css +0 -1
  209. package/web/.next/static/chunks/41e43675a8864a3f.js +0 -1
  210. package/web/.next/static/chunks/7ac8f98c0d991dda.js +0 -1
  211. package/web/.next/static/chunks/ec05de0bd9d358e4.js +0 -1
  212. /package/web/.next/static/{VLtWZeBgMjP_Lk91OEpmY → a3EHAucm2zcdyintMJkmG}/_buildManifest.js +0 -0
  213. /package/web/.next/static/{VLtWZeBgMjP_Lk91OEpmY → a3EHAucm2zcdyintMJkmG}/_clientMiddlewareManifest.json +0 -0
  214. /package/web/.next/static/{VLtWZeBgMjP_Lk91OEpmY → a3EHAucm2zcdyintMJkmG}/_ssgManifest.js +0 -0
@@ -7,5 +7,5 @@ export declare const dynamic = "force-dynamic";
7
7
  export declare const metadata: Metadata;
8
8
  export default function RootLayout({ children, }: Readonly<{
9
9
  children: React.ReactNode;
10
- }>): import("react/jsx-runtime").JSX.Element;
10
+ }>): Promise<import("react/jsx-runtime").JSX.Element>;
11
11
  //# sourceMappingURL=layout.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"layout.d.ts","sourceRoot":"","sources":["../../../../../src/presentation/web/app/layout.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,MAAM,CAAC;AACrC,OAAO,6BAA6B,CAAC;AACrC,OAAO,2CAA2C,CAAC;AACnD,OAAO,eAAe,CAAC;AAMvB,sFAAsF;AACtF,eAAO,MAAM,OAAO,kBAAkB,CAAC;AAEvC,eAAO,MAAM,QAAQ,EAAE,QAkBtB,CAAC;AAEF,MAAM,CAAC,OAAO,UAAU,UAAU,CAAC,EACjC,QAAQ,GACT,EAAE,QAAQ,CAAC;IACV,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;CAC3B,CAAC,2CA4BD"}
1
+ {"version":3,"file":"layout.d.ts","sourceRoot":"","sources":["../../../../../src/presentation/web/app/layout.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,MAAM,CAAC;AAErC,OAAO,6BAA6B,CAAC;AACrC,OAAO,2CAA2C,CAAC;AACnD,OAAO,eAAe,CAAC;AAMvB,sFAAsF;AACtF,eAAO,MAAM,OAAO,kBAAkB,CAAC;AAEvC,eAAO,MAAM,QAAQ,EAAE,QAkBtB,CAAC;AAEF,wBAA8B,UAAU,CAAC,EACvC,QAAQ,GACT,EAAE,QAAQ,CAAC;IACV,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;CAC3B,CAAC,oDAsBD"}
@@ -1,4 +1,5 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { cookies } from 'next/headers';
2
3
  import '@xyflow/react/dist/base.css';
3
4
  import '@cubone/react-file-manager/dist/style.css';
4
5
  import './globals.css';
@@ -26,18 +27,10 @@ export const metadata = {
26
27
  },
27
28
  ],
28
29
  };
29
- export default function RootLayout({ children, }) {
30
+ export default async function RootLayout({ children, }) {
31
+ const cookieStore = await cookies();
32
+ const sidebarOpen = cookieStore.get('shep-sidebar-open')?.value === 'true';
30
33
  return (_jsxs("html", { lang: "en", suppressHydrationWarning: true, children: [_jsx("head", { children: _jsx("script", { dangerouslySetInnerHTML: {
31
- __html: `
32
- (function() {
33
- try {
34
- const theme = localStorage.getItem('shep-theme');
35
- const systemDark = window.matchMedia('(prefers-color-scheme: dark)').matches;
36
- if (theme === 'dark' || (theme === 'system' && systemDark) || (!theme && systemDark)) {
37
- document.documentElement.classList.add('dark');
38
- }
39
- } catch (e) {}
40
- })();
41
- `,
42
- } }) }), _jsxs("body", { className: "min-h-screen antialiased", children: [_jsx(FeatureFlagsProvider, { flags: getFeatureFlags(), children: _jsx(AppShell, { children: children }) }), _jsx(Toaster, { position: "bottom-center" })] })] }));
34
+ __html: `(function(){try{var d=document.documentElement,t=localStorage.getItem('shep-theme'),s=window.matchMedia('(prefers-color-scheme: dark)').matches;if(t==='dark'||(t==='system'&&s)||(!t&&s)){d.classList.add('dark')}}catch(e){}})();`,
35
+ } }) }), _jsxs("body", { className: "min-h-screen antialiased", children: [_jsx(FeatureFlagsProvider, { flags: getFeatureFlags(), children: _jsx(AppShell, { sidebarOpen: sidebarOpen, children: children }) }), _jsx(Toaster, { position: "bottom-center" })] })] }));
43
36
  }
@@ -39,13 +39,16 @@ function LogLineRow({ line }) {
39
39
  function Timestamp({ value }) {
40
40
  if (!value)
41
41
  return null;
42
- const time = value.replace(/^.*T/, '').replace('Z', '');
43
- return (_jsx("span", { className: "text-muted-foreground/60 w-20 shrink-0 font-mono text-[10px]", children: time }));
42
+ // Show only MM:SS — compact, hours rarely change in a session
43
+ const full = value.replace(/^.*T/, '').replace('Z', '');
44
+ const parts = full.split(':');
45
+ const compact = parts.length >= 3 ? `${parts[1]}:${parts[2].split('.')[0]}` : full;
46
+ return (_jsx("span", { className: "text-muted-foreground/60 w-11 shrink-0 font-mono text-[10px]", children: compact }));
44
47
  }
45
48
  function PhaseBadge({ phase }) {
46
49
  if (!phase)
47
- return null;
48
- return (_jsx("span", { className: "bg-muted text-muted-foreground shrink-0 rounded px-1.5 py-0.5 font-mono text-[10px] font-medium", children: phase }));
50
+ return _jsx("span", { className: "w-20 shrink-0" });
51
+ return (_jsx("span", { className: "bg-muted text-muted-foreground w-20 shrink-0 truncate rounded px-1.5 py-0.5 font-mono text-[10px] font-medium", title: phase, children: phase }));
49
52
  }
50
53
  /* ---------------------------------------------------------------------------
51
54
  * Event-specific rows
@@ -54,7 +57,7 @@ function ToolCallRow({ line }) {
54
57
  const { toolName, args } = parseToolCall(line.message);
55
58
  // Try to extract a key detail from args for common tools
56
59
  const detail = getToolDetail(toolName, args);
57
- return (_jsxs("div", { className: "hover:bg-muted/50 flex items-start gap-2 border-b border-transparent px-3 py-1.5 transition-colors", children: [_jsx(Timestamp, { value: line.timestamp }), _jsx(PhaseBadge, { phase: line.phase }), _jsxs("div", { className: "flex min-w-0 flex-1 items-start gap-1.5", children: [_jsx(ToolIcon, { toolName: toolName }), _jsx("span", { className: "text-xs font-semibold text-violet-600 dark:text-violet-400", children: toolName }), detail ? (_jsx("span", { className: "text-muted-foreground min-w-0 truncate font-mono text-xs", children: detail })) : null] })] }));
60
+ return (_jsxs("div", { className: "hover:bg-muted/50 flex items-start gap-2 border-b border-transparent px-3 py-1.5 transition-colors", children: [_jsx(Timestamp, { value: line.timestamp }), _jsx(PhaseBadge, { phase: line.phase }), _jsxs("div", { className: "flex min-w-0 flex-1 items-start gap-1.5", children: [_jsx(ToolIcon, { toolName: toolName }), _jsx("span", { className: "text-xs font-semibold text-violet-600 dark:text-violet-400", children: toolName }), detail ? (_jsx("span", { className: "text-muted-foreground min-w-0 font-mono text-xs break-all", children: detail })) : null] })] }));
58
61
  }
59
62
  function ToolIcon({ toolName }) {
60
63
  const lower = toolName.toLowerCase();
@@ -80,8 +83,7 @@ function getToolDetail(toolName, args) {
80
83
  if (toolName === 'Grep' && parsed.pattern)
81
84
  return parsed.pattern;
82
85
  if (toolName === 'Bash' && parsed.command) {
83
- const cmd = parsed.command;
84
- return cmd.length > 80 ? `${cmd.slice(0, 80)}...` : cmd;
86
+ return parsed.command;
85
87
  }
86
88
  if (toolName === 'Task' && parsed.description)
87
89
  return parsed.description;
@@ -89,7 +91,7 @@ function getToolDetail(toolName, args) {
89
91
  catch {
90
92
  // Not JSON — show truncated raw args
91
93
  if (args.length > 0)
92
- return args.length > 80 ? `${args.slice(0, 80)}...` : args;
94
+ return args;
93
95
  }
94
96
  return null;
95
97
  }
@@ -105,10 +107,10 @@ function TokensRow({ line }) {
105
107
  return (_jsxs("div", { className: "hover:bg-muted/50 flex items-start gap-2 px-3 py-1.5 transition-colors", children: [_jsx(Timestamp, { value: line.timestamp }), _jsx(PhaseBadge, { phase: line.phase }), _jsxs("div", { className: "flex min-w-0 flex-1 items-start gap-1.5", children: [_jsx(Coins, { className: "mt-0.5 h-3 w-3 shrink-0 text-amber-500" }), _jsxs("span", { className: "text-muted-foreground text-xs", children: [_jsx("span", { className: "text-amber-600 dark:text-amber-400", children: inputTokens.toLocaleString() }), ' in / ', _jsx("span", { className: "text-amber-600 dark:text-amber-400", children: outputTokens.toLocaleString() }), ' out'] })] })] }));
106
108
  }
107
109
  function WorkerRow({ line }) {
108
- return (_jsxs("div", { className: "hover:bg-muted/50 flex items-start gap-2 bg-zinc-50 px-3 py-1.5 transition-colors dark:bg-zinc-900/50", children: [_jsx(Timestamp, { value: line.timestamp }), _jsxs("div", { className: "flex min-w-0 flex-1 items-start gap-1.5", children: [_jsx(Server, { className: "mt-0.5 h-3 w-3 shrink-0 text-zinc-500" }), _jsx("span", { className: "text-muted-foreground text-xs font-medium", children: line.message })] })] }));
110
+ return (_jsxs("div", { className: "hover:bg-muted/50 flex items-start gap-2 bg-zinc-50 px-3 py-1.5 transition-colors dark:bg-zinc-900/50", children: [_jsx(Timestamp, { value: line.timestamp }), _jsx(PhaseBadge, { phase: line.phase }), _jsxs("div", { className: "flex min-w-0 flex-1 items-start gap-1.5", children: [_jsx(Server, { className: "mt-0.5 h-3 w-3 shrink-0 text-zinc-500" }), _jsx("span", { className: "text-muted-foreground text-xs font-medium break-all", children: line.message })] })] }));
109
111
  }
110
112
  function InfoRow({ line }) {
111
- return (_jsxs("div", { className: "hover:bg-muted/50 flex items-start gap-2 px-3 py-1.5 transition-colors", children: [_jsx(Timestamp, { value: line.timestamp }), _jsx(PhaseBadge, { phase: line.phase }), _jsx("span", { className: "text-muted-foreground min-w-0 text-xs", children: line.message })] }));
113
+ return (_jsxs("div", { className: "hover:bg-muted/50 flex items-start gap-2 px-3 py-1.5 transition-colors", children: [_jsx(Timestamp, { value: line.timestamp }), _jsx(PhaseBadge, { phase: line.phase }), _jsx("span", { className: "text-muted-foreground min-w-0 text-xs break-all", children: line.message })] }));
112
114
  }
113
115
  function RawRow({ line }) {
114
116
  return (_jsx("div", { className: "px-3 py-0.5", children: _jsx("span", { className: "text-muted-foreground/70 font-mono text-[11px] break-all whitespace-pre-wrap", children: line.raw }) }));
@@ -1 +1 @@
1
- {"version":3,"file":"feature-node.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/feature-node/feature-node.tsx"],"names":[],"mappings":"AAoCA,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,2CAqdA"}
1
+ {"version":3,"file":"feature-node.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/feature-node/feature-node.tsx"],"names":[],"mappings":"AAoCA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AA6CnE,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,2CA8dA"}
@@ -10,6 +10,7 @@ import { AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent,
10
10
  import { DeleteFeatureDialog } from '../../common/delete-feature-dialog/index.js';
11
11
  import { featureNodeStateConfig, lifecycleRunningVerbs, lifecyclePhaseBadge, } from './feature-node-state-config.js';
12
12
  import { getAgentTypeIcon } from './agent-type-icons.js';
13
+ import { FeatureSessionsDropdown } from './feature-sessions-dropdown.js';
13
14
  import { DeploymentState } from '../../../../../../packages/core/src/domain/generated/output.js';
14
15
  function AgentIcon({ agentType, className }) {
15
16
  const IconComponent = getAgentTypeIcon(agentType);
@@ -77,10 +78,12 @@ export function FeatureNode({ data, selected, }) {
77
78
  data.state !== 'archived' ? (_jsx(AlertDialog, { open: archiveConfirmOpen, onOpenChange: setArchiveConfirmOpen, children: _jsxs(AlertDialogContent, { onCloseAutoFocus: (e) => e.preventDefault(), children: [_jsxs(AlertDialogHeader, { children: [_jsx(AlertDialogTitle, { children: "Archive feature?" }), _jsxs(AlertDialogDescription, { children: [_jsx("strong", { children: data.name }), " will be hidden from the canvas. You can unarchive it later to restore it."] })] }), _jsxs(AlertDialogFooter, { children: [_jsx(AlertDialogCancel, { onClick: () => setArchiveConfirmOpen(false), children: "Cancel" }), _jsx(AlertDialogAction, { onClick: () => {
78
79
  setArchiveConfirmOpen(false);
79
80
  data.onArchive?.(data.featureId);
80
- }, children: "Archive" })] })] }) })) : 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' &&
81
+ }, children: "Archive" })] })] }) })) : 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 transition-[border-color] duration-200 dark:bg-neutral-800/80', data.state === 'action-required' &&
81
82
  'border-l-[3px] border-l-rose-400 dark:border-l-amber-500', data.state === 'action-required' &&
82
83
  selected &&
83
- 'border-t-rose-400 border-r-rose-400 border-b-rose-400 dark:border-t-amber-500 dark:border-r-amber-500 dark:border-b-amber-500', selected && data.state !== 'action-required' && 'ring-primary ring-1', data.state === 'deleting' && 'opacity-60', data.state === 'archived' && 'opacity-50'), 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: "right", className: "max-w-56", 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 pr-24", 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 &&
84
+ 'border-t-rose-400 border-r-rose-400 border-b-rose-400 dark:border-t-amber-500 dark:border-r-amber-500 dark:border-b-amber-500', selected &&
85
+ data.state !== 'action-required' &&
86
+ 'border-blue-400 dark:border-amber-500/60', data.state === 'deleting' && 'opacity-60', data.state === 'archived' && 'opacity-50'), 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: "right", className: "max-w-56", 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 pr-24", 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 &&
84
87
  ![
85
88
  'deleting',
86
89
  'creating',
@@ -97,7 +100,7 @@ export function FeatureNode({ data, selected, }) {
97
100
  navigator.clipboard.writeText(data.featureId);
98
101
  setIdCopied(true);
99
102
  setTimeout(() => setIdCopied(false), 1500);
100
- }, children: [_jsx("span", { className: "text-muted-foreground/50 font-sans text-[10px]", children: "ID" }), idCopied ? (_jsx("span", { className: "text-emerald-500", children: "Copied!" })) : (data.featureId.slice(0, 6))] }) }), _jsxs(TooltipContent, { side: "bottom", children: ["Click to copy: ", data.featureId] })] }) })) : 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
103
+ }, children: [_jsx("span", { className: "text-muted-foreground/50 font-sans text-[10px]", children: "ID" }), idCopied ? (_jsx("span", { className: "text-emerald-500", children: "Copied!" })) : (data.featureId.slice(0, 6))] }) }), _jsxs(TooltipContent, { side: "top", children: ["Click to copy: ", data.featureId] })] }) })) : 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
101
104
  ? 'Deploying'
102
105
  : 'Open dev server', "data-testid": "feature-node-deployment-indicator", onClick: (e) => {
103
106
  e.stopPropagation();
@@ -107,9 +110,9 @@ export function FeatureNode({ data, selected, }) {
107
110
  }
108
111
  }, className: cn('nodrag', data.deployment.status === DeploymentState.Ready && data.deployment.url
109
112
  ? 'cursor-pointer opacity-80 transition-opacity hover:opacity-100'
110
- : '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: "bottom", children: data.deployment.status === DeploymentState.Booting
113
+ : '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
111
114
  ? 'Deploying...'
112
- : (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: "bottom", 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, { variant: "default", size: "xs", "aria-label": getActionRequiredLabel(data), "data-testid": "feature-node-approve-button",
115
+ : (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.repositoryPath ? (_jsx(FeatureSessionsDropdown, { repositoryPath: data.repositoryPath })) : 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 text-teal-600 dark:text-teal-400" }), _jsx("span", { className: "font-medium text-teal-600 dark:text-teal-400", 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 text-teal-600 dark:text-teal-400" }), _jsx("span", { className: "font-medium text-teal-600 dark:text-teal-400", children: getBadgeText(data) })] })) : data.state === 'action-required' ? (_jsxs(Button, { variant: "default", size: "xs", "aria-label": getActionRequiredLabel(data), "data-testid": "feature-node-approve-button",
113
116
  // eslint-disable-next-line @typescript-eslint/no-empty-function -- click bubbles to card's onNodeClick
114
117
  onClick: () => { }, className: "nodrag dark:bg-primary dark:text-primary-foreground dark:hover:bg-primary/90 cursor-pointer bg-neutral-900 text-[11px] text-white hover:bg-neutral-800", children: [_jsx(Eye, { className: "h-3 w-3" }), getActionRequiredLabel(data)] })) : data.state === 'error' && data.onRetry ? (_jsxs(Button, { variant: "outline", size: "xs", "aria-label": "Retry", "data-testid": "feature-node-retry-button", onClick: (e) => {
115
118
  e.stopPropagation();
@@ -1,6 +1,7 @@
1
1
  import type { RepositoryNodeData } from './repository-node-config.js';
2
- export declare function RepositoryNode({ data }: {
2
+ export declare function RepositoryNode({ data, selected, }: {
3
3
  data: RepositoryNodeData;
4
+ selected?: boolean;
4
5
  [key: string]: unknown;
5
6
  }): import("react/jsx-runtime").JSX.Element;
6
7
  //# sourceMappingURL=repository-node.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"repository-node.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/repository-node/repository-node.tsx"],"names":[],"mappings":"AAmCA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAOnE,wBAAgB,cAAc,CAAC,EAAE,IAAI,EAAE,EAAE;IAAE,IAAI,EAAE,kBAAkB,CAAC;IAAC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;CAAE,2CAqa5F"}
1
+ {"version":3,"file":"repository-node.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/repository-node/repository-node.tsx"],"names":[],"mappings":"AAmCA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAOnE,wBAAgB,cAAc,CAAC,EAC7B,IAAI,EACJ,QAAQ,GACT,EAAE;IACD,IAAI,EAAE,kBAAkB,CAAC;IACzB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB,2CAyaA"}
@@ -13,7 +13,7 @@ import { useDeployAction } from '../../../hooks/use-deploy-action.js';
13
13
  import { useFeatureFlags } from '../../../hooks/feature-flags-context.js';
14
14
  import { useRepositoryActions } from './use-repository-actions.js';
15
15
  import { FeatureSessionsDropdown, } from '../../common/feature-node/feature-sessions-dropdown.js';
16
- export function RepositoryNode({ data }) {
16
+ export function RepositoryNode({ data, selected, }) {
17
17
  const router = useRouter();
18
18
  const featureFlags = useFeatureFlags();
19
19
  const [confirmOpen, setConfirmOpen] = useState(false);
@@ -71,11 +71,10 @@ export function RepositoryNode({ data }) {
71
71
  e.stopPropagation();
72
72
  data.onClick?.();
73
73
  }
74
- }, className: "nodrag bg-card flex w-[26rem] cursor-pointer flex-col overflow-hidden rounded-xl border shadow-sm dark:bg-neutral-800/80", children: [_jsxs("div", { className: "flex items-center gap-3 px-4 py-3", children: [_jsx(Github, { className: "text-muted-foreground h-5 w-5 shrink-0" }), _jsx("span", { "data-testid": "repository-node-name", className: "min-w-0 truncate text-sm font-medium", children: data.name }), _jsxs("div", { className: cn('flex shrink-0 items-center gap-2', (data.repositoryPath ?? data.onAdd) && 'ml-auto'), onClick: (e) => e.stopPropagation(), children: [data.repositoryPath ? (_jsxs(_Fragment, { children: [_jsx(TooltipProvider, { children: _jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx("span", { className: "flex items-center", children: _jsx(ActionButton, { label: "Open in IDE", onClick: actions.openInIde, loading: actions.ideLoading, error: !!actions.ideError, icon: Code2, iconOnly: true, variant: "ghost", size: "icon-xs" }) }) }), _jsx(TooltipContent, { children: "Open in IDE" })] }) }), _jsx(TooltipProvider, { children: _jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx("span", { className: "flex items-center", children: _jsx(ActionButton, { label: "Open in Shell", onClick: actions.openInShell, loading: actions.shellLoading, error: !!actions.shellError, icon: Terminal, iconOnly: true, variant: "ghost", size: "icon-xs" }) }) }), _jsx(TooltipContent, { children: "Open in Shell" })] }) }), _jsx(TooltipProvider, { children: _jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx("span", { className: "flex items-center", children: _jsx(ActionButton, { label: "Open Folder", onClick: actions.openFolder, loading: actions.folderLoading, error: !!actions.folderError, icon: FolderOpen, iconOnly: true, variant: "ghost", size: "icon-xs" }) }) }), _jsx(TooltipContent, { children: "Open Folder" })] }) }), _jsx(FeatureSessionsDropdown, { repositoryPath: data.repositoryPath, onCreateFromSession: handleCreateFromSession })] })) : null, data.onAdd ? (_jsx(TooltipProvider, { children: _jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx("button", { "aria-label": "Add feature", "data-testid": "repository-node-add-button", onClick: (e) => {
74
+ }, className: cn('nodrag bg-card flex w-[26rem] cursor-pointer flex-col overflow-hidden rounded-xl border shadow-sm transition-[border-color,box-shadow] duration-200 dark:bg-neutral-800/80', selected && 'border-blue-400 dark:border-amber-500/60'), children: [_jsxs("div", { className: "flex items-center gap-3 px-4 py-3", children: [_jsx(Github, { className: "text-muted-foreground h-5 w-5 shrink-0" }), _jsx("span", { "data-testid": "repository-node-name", className: "min-w-0 truncate text-sm font-medium", children: data.name }), _jsxs("div", { className: cn('flex shrink-0 items-center gap-2', (data.repositoryPath ?? data.onAdd) && 'ml-auto'), onClick: (e) => e.stopPropagation(), children: [data.repositoryPath ? (_jsxs(_Fragment, { children: [_jsx(TooltipProvider, { children: _jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx("span", { className: "flex items-center", children: _jsx(ActionButton, { label: "Open in IDE", onClick: actions.openInIde, loading: actions.ideLoading, error: !!actions.ideError, icon: Code2, iconOnly: true, variant: "ghost", size: "icon-xs" }) }) }), _jsx(TooltipContent, { children: "Open in IDE" })] }) }), _jsx(TooltipProvider, { children: _jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx("span", { className: "flex items-center", children: _jsx(ActionButton, { label: "Open in Shell", onClick: actions.openInShell, loading: actions.shellLoading, error: !!actions.shellError, icon: Terminal, iconOnly: true, variant: "ghost", size: "icon-xs" }) }) }), _jsx(TooltipContent, { children: "Open in Shell" })] }) }), _jsx(TooltipProvider, { children: _jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx("span", { className: "flex items-center", children: _jsx(ActionButton, { label: "Open Folder", onClick: actions.openFolder, loading: actions.folderLoading, error: !!actions.folderError, icon: FolderOpen, iconOnly: true, variant: "ghost", size: "icon-xs" }) }) }), _jsx(TooltipContent, { children: "Open Folder" })] }) }), _jsx(FeatureSessionsDropdown, { repositoryPath: data.repositoryPath, onCreateFromSession: handleCreateFromSession })] })) : null, data.onAdd ? _jsx("div", { className: "ml-1.5" }) : null, data.onAdd ? (_jsx(TooltipProvider, { children: _jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsxs("button", { "aria-label": "New feature", "data-testid": "repository-node-add-button", onClick: (e) => {
75
75
  e.stopPropagation();
76
76
  data.onAdd?.();
77
- }, className: cn('text-muted-foreground hover:bg-accent dark:hover:bg-accent/50 flex h-6 w-6 shrink-0 cursor-pointer items-center justify-center rounded-full transition-colors hover:text-blue-500', data.pulseAdd &&
78
- 'animate-pulse-cta bg-blue-100 text-blue-500 dark:bg-blue-900/40'), children: _jsx(Plus, { className: "h-3.5 w-3.5" }) }) }), _jsx(TooltipContent, { children: "Add feature" })] }) })) : null] })] }), data.branch ? (_jsxs(_Fragment, { children: [_jsx("div", { "data-testid": "repository-node-git-info", className: "text-muted-foreground border-border/50 border-t px-4 py-2", children: _jsxs("div", { className: "flex items-center gap-3 text-xs", children: [_jsxs("span", { className: "flex items-center gap-1 truncate", "data-testid": "repository-node-branch", children: [_jsx(GitBranch, { className: "h-3 w-3 shrink-0" }), _jsx("span", { className: "truncate", children: data.branch })] }), data.behindCount != null && data.behindCount > 0 ? (_jsxs("span", { className: "flex shrink-0 items-center gap-1 whitespace-nowrap text-amber-500", "data-testid": "repository-node-behind", children: [_jsx(ArrowDown, { className: "h-3 w-3 shrink-0" }), data.behindCount, " behind"] })) : null] }) }), data.commitMessage ? (_jsx("div", { "data-testid": "repository-node-commit-info", className: "text-muted-foreground border-border/50 border-t px-4 py-2", children: _jsxs("div", { className: "flex items-center gap-2 text-xs", children: [_jsx(GitCommitHorizontal, { className: "h-3 w-3 shrink-0" }), _jsx("span", { className: "min-w-0 truncate", "data-testid": "repository-node-commit-message", children: data.commitMessage }), data.committer ? (_jsxs("span", { className: "text-muted-foreground/70 ml-auto flex shrink-0 items-center gap-1", "data-testid": "repository-node-committer", children: [_jsx(User, { className: "h-3 w-3 shrink-0" }), _jsx("span", { children: data.committer })] })) : null] }) })) : null] })) : data.gitInfoStatus === 'not-a-repo' ? (
77
+ }, className: cn('flex h-6 shrink-0 cursor-pointer items-center gap-0.5 rounded bg-blue-500 px-1.5 text-[11px] font-bold text-white transition-colors hover:bg-blue-600 dark:bg-amber-500 dark:hover:bg-amber-400', data.pulseAdd && 'animate-pulse-cta'), children: [_jsx(Plus, { className: "h-3 w-3" }), _jsx("span", { className: "translate-y-px", children: "New" })] }) }), _jsx(TooltipContent, { side: "top", children: "New feature" })] }) })) : null] })] }), data.branch ? (_jsxs(_Fragment, { children: [_jsx("div", { "data-testid": "repository-node-git-info", className: "text-muted-foreground border-border/50 border-t px-4 py-2", children: _jsxs("div", { className: "flex items-center gap-3 text-xs", children: [_jsxs("span", { className: "flex items-center gap-1 truncate", "data-testid": "repository-node-branch", children: [_jsx(GitBranch, { className: "h-3 w-3 shrink-0" }), _jsx("span", { className: "truncate", children: data.branch })] }), data.behindCount != null && data.behindCount > 0 ? (_jsxs("span", { className: "flex shrink-0 items-center gap-1 whitespace-nowrap text-amber-500", "data-testid": "repository-node-behind", children: [_jsx(ArrowDown, { className: "h-3 w-3 shrink-0" }), data.behindCount, " behind"] })) : null] }) }), data.commitMessage ? (_jsx("div", { "data-testid": "repository-node-commit-info", className: "text-muted-foreground border-border/50 border-t px-4 py-2", children: _jsxs("div", { className: "flex items-center gap-2 text-xs", children: [_jsx(GitCommitHorizontal, { className: "h-3 w-3 shrink-0" }), _jsx("span", { className: "min-w-0 truncate", "data-testid": "repository-node-commit-message", children: data.commitMessage }), data.committer ? (_jsxs("span", { className: "text-muted-foreground/70 ml-auto flex shrink-0 items-center gap-1", "data-testid": "repository-node-committer", children: [_jsx(User, { className: "h-3 w-3 shrink-0" }), _jsx("span", { children: data.committer })] })) : null] }) })) : null] })) : data.gitInfoStatus === 'not-a-repo' ? (
79
78
  /* Not a git repo — two rows for consistency with loading/ready states */
80
79
  _jsxs(_Fragment, { children: [_jsx("div", { "data-testid": "repository-node-not-repo", className: "text-muted-foreground border-border/50 border-t px-4 py-2", children: _jsxs("div", { className: "flex items-center gap-2 text-xs", children: [_jsx(FolderOpen, { className: "h-3 w-3 shrink-0" }), _jsx("span", { className: "min-w-0 truncate opacity-60", children: data.repositoryPath ?? 'Unknown path' })] }) }), _jsx("div", { className: "text-muted-foreground border-border/50 border-t px-4 py-2", children: _jsxs("div", { className: "flex items-center gap-2 text-xs opacity-40", children: [_jsx(GitBranch, { className: "h-3 w-3 shrink-0" }), _jsx("span", { children: "Not a git repository" })] }) })] })) : data.gitInfoStatus !== 'ready' ? (
81
80
  /* Loading — show skeleton placeholders for both rows */
@@ -1 +1 @@
1
- {"version":3,"file":"control-center-inner.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/features/control-center/control-center-inner.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,IAAI,EAAY,MAAM,eAAe,CAAC;AAKpD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uCAAuC,CAAC;AAuB5E,UAAU,uBAAuB;IAC/B,YAAY,EAAE,cAAc,EAAE,CAAC;IAC/B,YAAY,EAAE,IAAI,EAAE,CAAC;CACtB;AAED,wBAAgB,kBAAkB,CAAC,EAAE,YAAY,EAAE,YAAY,EAAE,EAAE,uBAAuB,2CAoYzF"}
1
+ {"version":3,"file":"control-center-inner.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/features/control-center/control-center-inner.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,IAAI,EAAY,MAAM,eAAe,CAAC;AAKpD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uCAAuC,CAAC;AAwB5E,UAAU,uBAAuB;IAC/B,YAAY,EAAE,cAAc,EAAE,CAAC;IAC/B,YAAY,EAAE,IAAI,EAAE,CAAC;CACtB;AAED,wBAAgB,kBAAkB,CAAC,EAAE,YAAY,EAAE,YAAY,EAAE,EAAE,uBAAuB,2CAsYzF"}
@@ -8,6 +8,7 @@ import { cn } from '../../../lib/utils.js';
8
8
  import { FeaturesCanvas } from '../../features/features-canvas/index.js';
9
9
  import { useSidebarFeaturesContext, mapNodeStateToSidebarStatus, } from '../../../hooks/sidebar-features-context.js';
10
10
  import { useSelectedFeatureId } from '../../../hooks/use-selected-feature-id.js';
11
+ import { useSelectedRepository } from '../../../hooks/use-selected-repository.js';
11
12
  import { useSoundAction } from '../../../hooks/use-sound-action.js';
12
13
  import { useDrawerCloseGuard } from '../../../hooks/drawer-close-guard.js';
13
14
  import { useViewportPersistence } from '../../../hooks/use-viewport-persistence.js';
@@ -23,6 +24,7 @@ export function ControlCenterInner({ initialNodes, initialEdges }) {
23
24
  const router = useRouter();
24
25
  const pathname = usePathname();
25
26
  const selectedFeatureId = useSelectedFeatureId();
27
+ const selectedRepository = useSelectedRepository();
26
28
  const clickSound = useSoundAction('click');
27
29
  const { guardedNavigate } = useDrawerCloseGuard();
28
30
  const { fitView } = useReactFlow();
@@ -272,5 +274,5 @@ export function ControlCenterInner({ initialNodes, initialEdges }) {
272
274
  const archiveToggle = (_jsx(Panel, { position: "top-right", children: _jsxs("button", { type: "button", "aria-label": showArchived ? 'Hide archived features' : 'Show archived features', "data-testid": "archive-toggle-button", onClick: () => setShowArchived(!showArchived), className: cn('bg-card flex items-center gap-1.5 rounded-md border px-2.5 py-1.5 text-xs font-medium shadow-sm transition-colors', showArchived
273
275
  ? 'border-primary/30 text-primary'
274
276
  : 'text-muted-foreground hover:text-foreground'), children: [showArchived ? _jsx(Eye, { className: "h-3.5 w-3.5" }) : _jsx(EyeOff, { className: "h-3.5 w-3.5" }), showArchived ? 'Archived visible' : 'Show archived'] }) }));
275
- return (_jsx(FeaturesCanvas, { nodes: showCanvas ? displayNodes : [], edges: showCanvas ? edges : [], selectedFeatureId: selectedFeatureId, defaultViewport: defaultViewport, onNodesChange: onNodesChange, onConnect: handleConnect, onAddFeature: handleAddFeature, onNodeClick: handleNodeClick, onPaneClick: handleClearDrawers, onMoveEnd: handleMoveEnd, onResetViewport: resetViewport, toolbar: archiveToggle, emptyState: _jsx(ControlCenterEmptyState, { onRepositorySelect: addRepoAndFocus }) }));
277
+ return (_jsx(FeaturesCanvas, { nodes: showCanvas ? displayNodes : [], edges: showCanvas ? edges : [], selectedFeatureId: selectedFeatureId, selectedRepository: selectedRepository, defaultViewport: defaultViewport, onNodesChange: onNodesChange, onConnect: handleConnect, onAddFeature: handleAddFeature, onNodeClick: handleNodeClick, onPaneClick: handleClearDrawers, onMoveEnd: handleMoveEnd, onResetViewport: resetViewport, toolbar: archiveToggle, emptyState: _jsx(ControlCenterEmptyState, { onRepositorySelect: addRepoAndFocus }) }));
276
278
  }
@@ -6,6 +6,10 @@ export interface FeaturesCanvasProps {
6
6
  nodes: CanvasNodeType[];
7
7
  edges: Edge[];
8
8
  selectedFeatureId?: string | null;
9
+ selectedRepository?: {
10
+ id: string | null;
11
+ path: string | null;
12
+ };
9
13
  defaultViewport?: Viewport;
10
14
  onNodesChange?: (changes: NodeChange<CanvasNodeType>[]) => void;
11
15
  onAddFeature?: () => void;
@@ -18,5 +22,5 @@ export interface FeaturesCanvasProps {
18
22
  toolbar?: React.ReactNode;
19
23
  emptyState?: React.ReactNode;
20
24
  }
21
- export declare function FeaturesCanvas({ nodes, edges, selectedFeatureId, defaultViewport, onNodesChange, onAddFeature, onConnect, onNodeClick, onPaneClick, onCanvasDrag, onMoveEnd, onResetViewport, toolbar, emptyState, }: FeaturesCanvasProps): import("react/jsx-runtime").JSX.Element;
25
+ export declare function FeaturesCanvas({ nodes, edges, selectedFeatureId, selectedRepository, defaultViewport, onNodesChange, onAddFeature, onConnect, onNodeClick, onPaneClick, onCanvasDrag, onMoveEnd, onResetViewport, toolbar, emptyState, }: FeaturesCanvasProps): import("react/jsx-runtime").JSX.Element;
22
26
  //# sourceMappingURL=features-canvas.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"features-canvas.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/features/features-canvas/features-canvas.tsx"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,UAAU,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAMvF,OAAO,KAAK,EAAE,eAAe,EAAmB,MAAM,kCAAkC,CAAC;AAEzF,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,qCAAqC,CAAC;AAG9E,MAAM,MAAM,cAAc,GAAG,eAAe,GAAG,kBAAkB,CAAC;AAElE,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,cAAc,EAAE,CAAC;IACxB,KAAK,EAAE,IAAI,EAAE,CAAC;IACd,iBAAiB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,eAAe,CAAC,EAAE,QAAQ,CAAC;IAC3B,aAAa,CAAC,EAAE,CAAC,OAAO,EAAE,UAAU,CAAC,cAAc,CAAC,EAAE,KAAK,IAAI,CAAC;IAChE,YAAY,CAAC,EAAE,MAAM,IAAI,CAAC;IAC1B,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,UAAU,EAAE,IAAI,EAAE,cAAc,KAAK,IAAI,CAAC;IACtE,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,UAAU,KAAK,IAAI,CAAC;IAChD,SAAS,CAAC,EAAE,CAAC,UAAU,EAAE,UAAU,KAAK,IAAI,CAAC;IAC7C,YAAY,CAAC,EAAE,MAAM,IAAI,CAAC;IAC1B,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,eAAe,CAAC,EAAE,MAAM,QAAQ,CAAC;IACjC,OAAO,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,UAAU,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;CAC9B;AAmBD,wBAAgB,cAAc,CAAC,EAC7B,KAAK,EACL,KAAK,EACL,iBAAiB,EACjB,eAAe,EACf,aAAa,EACb,YAAY,EACZ,SAAS,EACT,WAAW,EACX,WAAW,EACX,YAAY,EACZ,SAAS,EACT,eAAe,EACf,OAAO,EACP,UAAU,GACX,EAAE,mBAAmB,2CA4HrB"}
1
+ {"version":3,"file":"features-canvas.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/features/features-canvas/features-canvas.tsx"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,UAAU,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAMvF,OAAO,KAAK,EAAE,eAAe,EAAmB,MAAM,kCAAkC,CAAC;AAEzF,OAAO,KAAK,EAAE,kBAAkB,EAAsB,MAAM,qCAAqC,CAAC;AAGlG,MAAM,MAAM,cAAc,GAAG,eAAe,GAAG,kBAAkB,CAAC;AAElE,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,cAAc,EAAE,CAAC;IACxB,KAAK,EAAE,IAAI,EAAE,CAAC;IACd,iBAAiB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,kBAAkB,CAAC,EAAE;QAAE,EAAE,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CAAC;IAChE,eAAe,CAAC,EAAE,QAAQ,CAAC;IAC3B,aAAa,CAAC,EAAE,CAAC,OAAO,EAAE,UAAU,CAAC,cAAc,CAAC,EAAE,KAAK,IAAI,CAAC;IAChE,YAAY,CAAC,EAAE,MAAM,IAAI,CAAC;IAC1B,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,UAAU,EAAE,IAAI,EAAE,cAAc,KAAK,IAAI,CAAC;IACtE,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,UAAU,KAAK,IAAI,CAAC;IAChD,SAAS,CAAC,EAAE,CAAC,UAAU,EAAE,UAAU,KAAK,IAAI,CAAC;IAC7C,YAAY,CAAC,EAAE,MAAM,IAAI,CAAC;IAC1B,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,eAAe,CAAC,EAAE,MAAM,QAAQ,CAAC;IACjC,OAAO,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,UAAU,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;CAC9B;AAmBD,wBAAgB,cAAc,CAAC,EAC7B,KAAK,EACL,KAAK,EACL,iBAAiB,EACjB,kBAAkB,EAClB,eAAe,EACf,aAAa,EACb,YAAY,EACZ,SAAS,EACT,WAAW,EACX,WAAW,EACX,YAAY,EACZ,SAAS,EACT,eAAe,EACf,OAAO,EACP,UAAU,GACX,EAAE,mBAAmB,2CA0IrB"}
@@ -18,7 +18,7 @@ function ResetButton({ onResetViewport }) {
18
18
  }, [onResetViewport, setViewport]);
19
19
  return (_jsx(ControlButton, { onClick: handleReset, title: "Reset view", "aria-label": "Reset view", children: _jsx(RotateCcw, { style: { fill: 'none' } }) }));
20
20
  }
21
- export function FeaturesCanvas({ nodes, edges, selectedFeatureId, defaultViewport, onNodesChange, onAddFeature, onConnect, onNodeClick, onPaneClick, onCanvasDrag, onMoveEnd, onResetViewport, toolbar, emptyState, }) {
21
+ export function FeaturesCanvas({ nodes, edges, selectedFeatureId, selectedRepository, defaultViewport, onNodesChange, onAddFeature, onConnect, onNodeClick, onPaneClick, onCanvasDrag, onMoveEnd, onResetViewport, toolbar, emptyState, }) {
22
22
  const nodeTypes = useMemo(() => ({
23
23
  featureNode: FeatureNode,
24
24
  repositoryNode: RepositoryNode,
@@ -27,13 +27,30 @@ export function FeaturesCanvas({ nodes, edges, selectedFeatureId, defaultViewpor
27
27
  dependencyEdge: DependencyEdge,
28
28
  }), []);
29
29
  // Callbacks and showHandles are already injected into node.data by deriveGraph.
30
- // Only selectedFeatureId highlighting needs to be applied here.
31
- const enrichedNodes = useMemo(() => selectedFeatureId == null
32
- ? nodes
33
- : nodes.map((node) => node.type === 'featureNode' &&
34
- node.data.featureId === selectedFeatureId
35
- ? { ...node, selected: true }
36
- : node), [nodes, selectedFeatureId]);
30
+ // Apply selectedFeatureId and selectedRepository highlighting here.
31
+ const enrichedNodes = useMemo(() => {
32
+ const hasFeatureSel = selectedFeatureId != null;
33
+ const hasRepoSel = selectedRepository != null &&
34
+ (selectedRepository.id != null || selectedRepository.path != null);
35
+ if (!hasFeatureSel && !hasRepoSel)
36
+ return nodes;
37
+ return nodes.map((node) => {
38
+ if (hasFeatureSel &&
39
+ node.type === 'featureNode' &&
40
+ node.data.featureId === selectedFeatureId) {
41
+ return { ...node, selected: true };
42
+ }
43
+ if (hasRepoSel && node.type === 'repositoryNode') {
44
+ const rd = node.data;
45
+ const matchById = selectedRepository.id != null &&
46
+ (node.id === selectedRepository.id || rd.id === selectedRepository.id);
47
+ const matchByPath = selectedRepository.path != null && rd.repositoryPath === selectedRepository.path;
48
+ if (matchById || matchByPath)
49
+ return { ...node, selected: true };
50
+ }
51
+ return node;
52
+ });
53
+ }, [nodes, selectedFeatureId, selectedRepository]);
37
54
  const isEmpty = nodes.length === 0;
38
55
  // Track empty→populated transition for exit animation.
39
56
  // When isEmpty flips from true to false, keep the overlay mounted
@@ -1,7 +1,9 @@
1
1
  import { type ReactNode } from 'react';
2
2
  interface AppShellProps {
3
3
  children: ReactNode;
4
+ /** Server-read sidebar state from cookie. */
5
+ sidebarOpen?: boolean;
4
6
  }
5
- export declare function AppShell({ children }: AppShellProps): import("react/jsx-runtime").JSX.Element;
7
+ export declare function AppShell({ children, sidebarOpen }: AppShellProps): import("react/jsx-runtime").JSX.Element;
6
8
  export {};
7
9
  //# sourceMappingURL=app-shell.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"app-shell.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/layouts/app-shell/app-shell.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAkC,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAsBvE,UAAU,aAAa;IACrB,QAAQ,EAAE,SAAS,CAAC;CACrB;AA+JD,wBAAgB,QAAQ,CAAC,EAAE,QAAQ,EAAE,EAAE,aAAa,2CAUnD"}
1
+ {"version":3,"file":"app-shell.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/layouts/app-shell/app-shell.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAkC,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAsBvE,UAAU,aAAa;IACrB,QAAQ,EAAE,SAAS,CAAC;IACpB,6CAA6C;IAC7C,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AA+JD,wBAAgB,QAAQ,CAAC,EAAE,QAAQ,EAAE,WAAW,EAAE,EAAE,aAAa,2CAUhE"}
@@ -19,7 +19,7 @@ const CONTROL_CENTER_PREFIXES = ['/', '/create', '/adopt', '/feature', '/reposit
19
19
  function isControlCenterRoute(pathname) {
20
20
  return CONTROL_CENTER_PREFIXES.some((prefix) => pathname === prefix || (prefix !== '/' && pathname.startsWith(`${prefix}/`)));
21
21
  }
22
- function AppShellInner({ children }) {
22
+ function AppShellInner({ children, sidebarOpen }) {
23
23
  const router = useRouter();
24
24
  const pathname = usePathname();
25
25
  const { guardedNavigate } = useDrawerCloseGuard();
@@ -119,11 +119,11 @@ function AppShellInner({ children }) {
119
119
  featureFlags.githubImport,
120
120
  featureFlags.adoptBranch,
121
121
  ]);
122
- return (_jsxs(SidebarProvider, { defaultOpen: false, children: [_jsx(AppSidebar, { features: features, featureFlags: featureFlags, onFeatureClick: handleFeatureClick }), _jsx(SidebarInset, { children: _jsxs("div", { className: "relative h-full", children: [_jsx("main", { className: "h-full", children: children }), isControlCenterRoute(pathname) && hasRepositories ? (_jsx(FloatingActionButton, { actions: fabActions })) : null, featureFlags.githubImport ? (_jsx(GitHubImportDialog, { open: githubDialogOpen, onOpenChange: setGithubDialogOpen, onImportComplete: handleGitHubImportComplete })) : null] }) }), _jsx(ReactFileManagerDialog, { open: showReactPicker, onOpenChange: (open) => {
122
+ return (_jsxs(SidebarProvider, { defaultOpen: sidebarOpen ?? false, children: [_jsx(AppSidebar, { features: features, featureFlags: featureFlags, onFeatureClick: handleFeatureClick }), _jsx(SidebarInset, { children: _jsxs("div", { className: "relative h-full", children: [_jsx("main", { className: "h-full", children: children }), isControlCenterRoute(pathname) && hasRepositories ? (_jsx(FloatingActionButton, { actions: fabActions })) : null, featureFlags.githubImport ? (_jsx(GitHubImportDialog, { open: githubDialogOpen, onOpenChange: setGithubDialogOpen, onImportComplete: handleGitHubImportComplete })) : null] }) }), _jsx(ReactFileManagerDialog, { open: showReactPicker, onOpenChange: (open) => {
123
123
  if (!open)
124
124
  setShowReactPicker(false);
125
125
  }, onSelect: handleReactPickerSelect })] }));
126
126
  }
127
- export function AppShell({ children }) {
128
- return (_jsx(AgentEventsProvider, { children: _jsx(DrawerCloseGuardProvider, { children: _jsx(SidebarFeaturesProvider, { children: _jsx(AppShellInner, { children: children }) }) }) }));
127
+ export function AppShell({ children, sidebarOpen }) {
128
+ return (_jsx(AgentEventsProvider, { children: _jsx(DrawerCloseGuardProvider, { children: _jsx(SidebarFeaturesProvider, { children: _jsx(AppShellInner, { sidebarOpen: sidebarOpen, children: children }) }) }) }));
129
129
  }
@@ -13,6 +13,8 @@ interface SidebarContextProps {
13
13
  setOpenMobile: (open: boolean) => void;
14
14
  isMobile: boolean;
15
15
  toggleSidebar: () => void;
16
+ /** Whether transitions should be enabled (false until first user toggle). */
17
+ animated: boolean;
16
18
  }
17
19
  declare function useSidebar(): SidebarContextProps;
18
20
  declare function SidebarProvider({ defaultOpen, open: openProp, onOpenChange: setOpenProp, className, style, children, ...props }: React.ComponentProps<'div'> & {
@@ -1 +1 @@
1
- {"version":3,"file":"sidebar.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/web/components/ui/sidebar.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"sidebar.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/web/components/ui/sidebar.tsx"],"names":[],"mappings":"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"}
@@ -25,36 +25,15 @@ function useSidebar() {
25
25
  }
26
26
  return context;
27
27
  }
28
- function readSidebarState(fallback) {
29
- try {
30
- const stored = localStorage.getItem(SIDEBAR_STORAGE_KEY);
31
- if (stored === 'true')
32
- return true;
33
- if (stored === 'false')
34
- return false;
35
- return fallback;
36
- }
37
- catch {
38
- return fallback;
39
- }
40
- }
41
28
  function SidebarProvider({ defaultOpen = true, open: openProp, onOpenChange: setOpenProp, className, style, children, ...props }) {
42
29
  const isMobile = useIsMobile();
43
30
  const [openMobile, setOpenMobile] = React.useState(false);
31
+ const [animated, setAnimated] = React.useState(false);
44
32
  // This is the internal state of the sidebar.
45
33
  // We use openProp and setOpenProp for control from outside the component.
46
- // Initialize with defaultOpen to match SSR localStorage is read after hydration.
34
+ // defaultOpen comes from server-side cookie reading, so SSR and client agree.
47
35
  const [_open, _setOpen] = React.useState(defaultOpen);
48
36
  const open = openProp ?? _open;
49
- // After hydration, sync state from localStorage to avoid SSR mismatch.
50
- React.useEffect(() => {
51
- if (openProp !== undefined)
52
- return; // controlled mode — skip
53
- const stored = readSidebarState(defaultOpen);
54
- if (stored !== defaultOpen) {
55
- _setOpen(stored);
56
- }
57
- }, []); // eslint-disable-line react-hooks/exhaustive-deps
58
37
  const setOpen = React.useCallback((value) => {
59
38
  const openState = typeof value === 'function' ? value(open) : value;
60
39
  if (setOpenProp) {
@@ -63,9 +42,11 @@ function SidebarProvider({ defaultOpen = true, open: openProp, onOpenChange: set
63
42
  else {
64
43
  _setOpen(openState);
65
44
  }
66
- // Persist sidebar state to localStorage.
45
+ // Persist sidebar state to localStorage and a cookie (so the server can
46
+ // read it on the next request and render the correct initial state).
67
47
  try {
68
48
  localStorage.setItem(SIDEBAR_STORAGE_KEY, String(openState));
49
+ document.cookie = `${SIDEBAR_STORAGE_KEY}=${openState}; path=/; max-age=31536000; SameSite=Lax`;
69
50
  }
70
51
  catch {
71
52
  // Silently ignore storage errors (e.g. quota exceeded, private browsing).
@@ -73,8 +54,24 @@ function SidebarProvider({ defaultOpen = true, open: openProp, onOpenChange: set
73
54
  }, [setOpenProp, open]);
74
55
  // Helper to toggle the sidebar.
75
56
  const toggleSidebar = React.useCallback(() => {
57
+ setAnimated(true);
76
58
  return isMobile ? setOpenMobile((open) => !open) : setOpen((open) => !open);
77
59
  }, [isMobile, setOpen, setOpenMobile]);
60
+ // Seed cookie from localStorage for existing users who have localStorage
61
+ // but no cookie yet (one-time migration).
62
+ React.useEffect(() => {
63
+ try {
64
+ if (!document.cookie.includes(SIDEBAR_STORAGE_KEY)) {
65
+ const stored = localStorage.getItem(SIDEBAR_STORAGE_KEY);
66
+ if (stored != null) {
67
+ document.cookie = `${SIDEBAR_STORAGE_KEY}=${stored}; path=/; max-age=31536000; SameSite=Lax`;
68
+ }
69
+ }
70
+ }
71
+ catch {
72
+ // Ignore
73
+ }
74
+ }, []);
78
75
  // Adds a keyboard shortcut to toggle the sidebar.
79
76
  React.useEffect(() => {
80
77
  const handleKeyDown = (event) => {
@@ -97,7 +94,8 @@ function SidebarProvider({ defaultOpen = true, open: openProp, onOpenChange: set
97
94
  openMobile,
98
95
  setOpenMobile,
99
96
  toggleSidebar,
100
- }), [state, open, setOpen, isMobile, openMobile, setOpenMobile, toggleSidebar]);
97
+ animated,
98
+ }), [state, open, setOpen, isMobile, openMobile, setOpenMobile, toggleSidebar, animated]);
101
99
  return (_jsx(SidebarContext.Provider, { value: contextValue, children: _jsx(TooltipProvider, { delayDuration: 0, children: _jsx("div", { "data-slot": "sidebar-wrapper", style: {
102
100
  '--sidebar-width': SIDEBAR_WIDTH,
103
101
  '--sidebar-width-icon': SIDEBAR_WIDTH_ICON,
@@ -105,7 +103,7 @@ function SidebarProvider({ defaultOpen = true, open: openProp, onOpenChange: set
105
103
  }, className: cn('group/sidebar-wrapper has-data-[variant=inset]:bg-sidebar flex min-h-svh w-full', className), ...props, children: children }) }) }));
106
104
  }
107
105
  function Sidebar({ side = 'left', variant = 'sidebar', collapsible = 'offcanvas', className, children, ...props }) {
108
- const { isMobile, state, openMobile, setOpenMobile } = useSidebar();
106
+ const { isMobile, state, openMobile, setOpenMobile, animated } = useSidebar();
109
107
  if (collapsible === 'none') {
110
108
  return (_jsx("div", { "data-slot": "sidebar", className: cn('bg-sidebar text-sidebar-foreground flex h-full w-(--sidebar-width) flex-col', className), ...props, children: children }));
111
109
  }
@@ -114,9 +112,9 @@ function Sidebar({ side = 'left', variant = 'sidebar', collapsible = 'offcanvas'
114
112
  '--sidebar-width': SIDEBAR_WIDTH_MOBILE,
115
113
  }, side: side, children: [_jsxs(SheetHeader, { className: "sr-only", children: [_jsx(SheetTitle, { children: "Sidebar" }), _jsx(SheetDescription, { children: "Displays the mobile sidebar." })] }), _jsx("div", { className: "flex h-full w-full flex-col", children: children })] }) }));
116
114
  }
117
- return (_jsxs("div", { className: "group peer text-sidebar-foreground hidden md:block", "data-state": state, "data-collapsible": state === 'collapsed' ? collapsible : '', "data-variant": variant, "data-side": side, "data-slot": "sidebar", children: [_jsx("div", { "data-slot": "sidebar-gap", className: cn('relative w-(--sidebar-width) bg-transparent transition-[width] duration-200 ease-linear', 'group-data-[collapsible=offcanvas]:w-0', 'group-data-[side=right]:rotate-180', variant === 'floating' || variant === 'inset'
115
+ return (_jsxs("div", { className: "group peer text-sidebar-foreground hidden md:block", "data-state": state, "data-collapsible": state === 'collapsed' ? collapsible : '', "data-variant": variant, "data-side": side, "data-slot": "sidebar", children: [_jsx("div", { "data-slot": "sidebar-gap", className: cn('relative w-(--sidebar-width) bg-transparent', animated && 'transition-[width] duration-200 ease-linear', 'group-data-[collapsible=offcanvas]:w-0', 'group-data-[side=right]:rotate-180', variant === 'floating' || variant === 'inset'
118
116
  ? 'group-data-[collapsible=icon]:w-[calc(var(--sidebar-width-icon)+(--spacing(4)))]'
119
- : 'group-data-[collapsible=icon]:w-(--sidebar-width-icon)') }), _jsx("div", { "data-slot": "sidebar-container", className: cn('fixed inset-y-0 z-10 hidden h-svh w-(--sidebar-width) transition-[left,right,width] duration-200 ease-linear md:flex', side === 'left'
117
+ : 'group-data-[collapsible=icon]:w-(--sidebar-width-icon)') }), _jsx("div", { "data-slot": "sidebar-container", className: cn('fixed inset-y-0 z-10 hidden h-svh w-(--sidebar-width) md:flex', animated && 'transition-[left,right,width] duration-200 ease-linear', side === 'left'
120
118
  ? 'left-0 group-data-[collapsible=offcanvas]:left-[calc(var(--sidebar-width)*-1)]'
121
119
  : 'right-0 group-data-[collapsible=offcanvas]:right-[calc(var(--sidebar-width)*-1)]',
122
120
  // Adjust the padding for floating and inset variants.
@@ -1,5 +1,7 @@
1
1
  import * as React from 'react';
2
2
  import { Tooltip as TooltipPrimitive } from 'radix-ui';
3
+ /** Default tooltip hover delay (ms) for canvas nodes and UI controls. */
4
+ export declare const TOOLTIP_DELAY_MS = 400;
3
5
  declare function TooltipProvider({ delayDuration, ...props }: React.ComponentProps<typeof TooltipPrimitive.Provider>): import("react/jsx-runtime").JSX.Element;
4
6
  declare function Tooltip({ ...props }: React.ComponentProps<typeof TooltipPrimitive.Root>): import("react/jsx-runtime").JSX.Element;
5
7
  declare function TooltipTrigger({ ...props }: React.ComponentProps<typeof TooltipPrimitive.Trigger>): import("react/jsx-runtime").JSX.Element;
@@ -1 +1 @@
1
- {"version":3,"file":"tooltip.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/web/components/ui/tooltip.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAAE,OAAO,IAAI,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAIvD,iBAAS,eAAe,CAAC,EACvB,aAAiB,EACjB,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,gBAAgB,CAAC,QAAQ,CAAC,2CAQxD;AAED,iBAAS,OAAO,CAAC,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,gBAAgB,CAAC,IAAI,CAAC,2CAEhF;AAED,iBAAS,cAAc,CAAC,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,gBAAgB,CAAC,OAAO,CAAC,2CAE1F;AAED,iBAAS,cAAc,CAAC,EACtB,SAAS,EACT,UAAc,EACd,QAAQ,EACR,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,gBAAgB,CAAC,OAAO,CAAC,2CAiBvD;AAED,OAAO,EAAE,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,eAAe,EAAE,CAAC"}
1
+ {"version":3,"file":"tooltip.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/web/components/ui/tooltip.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAAE,OAAO,IAAI,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAIvD,yEAAyE;AACzE,eAAO,MAAM,gBAAgB,MAAM,CAAC;AAEpC,iBAAS,eAAe,CAAC,EACvB,aAAgC,EAChC,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,gBAAgB,CAAC,QAAQ,CAAC,2CAQxD;AAED,iBAAS,OAAO,CAAC,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,gBAAgB,CAAC,IAAI,CAAC,2CAEhF;AAED,iBAAS,cAAc,CAAC,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,gBAAgB,CAAC,OAAO,CAAC,2CAE1F;AAED,iBAAS,cAAc,CAAC,EACtB,SAAS,EACT,UAAc,EACd,QAAQ,EACR,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,gBAAgB,CAAC,OAAO,CAAC,2CAiBvD;AAED,OAAO,EAAE,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,eAAe,EAAE,CAAC"}
@@ -2,7 +2,9 @@
2
2
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
3
  import { Tooltip as TooltipPrimitive } from 'radix-ui';
4
4
  import { cn } from '../../lib/utils.js';
5
- function TooltipProvider({ delayDuration = 0, ...props }) {
5
+ /** Default tooltip hover delay (ms) for canvas nodes and UI controls. */
6
+ export const TOOLTIP_DELAY_MS = 400;
7
+ function TooltipProvider({ delayDuration = TOOLTIP_DELAY_MS, ...props }) {
6
8
  return (_jsx(TooltipPrimitive.Provider, { "data-slot": "tooltip-provider", delayDuration: delayDuration, ...props }));
7
9
  }
8
10
  function Tooltip({ ...props }) {
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Extracts the selected repository context from the current URL.
3
+ * Returns `{ id, path }` — either or both may be set depending on the route.
4
+ *
5
+ * Matches:
6
+ * - `/repository/<id>` → id is set
7
+ * - `/create?repo=<path>` → path is set
8
+ */
9
+ export declare function useSelectedRepository(): {
10
+ id: string | null;
11
+ path: string | null;
12
+ };
13
+ //# sourceMappingURL=use-selected-repository.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-selected-repository.d.ts","sourceRoot":"","sources":["../../../../../src/presentation/web/hooks/use-selected-repository.ts"],"names":[],"mappings":"AAIA;;;;;;;GAOG;AACH,wBAAgB,qBAAqB,IAAI;IAAE,EAAE,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAWlF"}