@shepai/cli 1.152.0 → 1.153.0-pr477.9c7fcd0

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 (266) hide show
  1. package/dist/packages/core/src/application/ports/output/repositories/interactive-session-repository.interface.d.ts +5 -0
  2. package/dist/packages/core/src/application/ports/output/repositories/interactive-session-repository.interface.d.ts.map +1 -1
  3. package/dist/packages/core/src/application/ports/output/services/git-pr-service.interface.d.ts +37 -0
  4. package/dist/packages/core/src/application/ports/output/services/git-pr-service.interface.d.ts.map +1 -1
  5. package/dist/packages/core/src/application/ports/output/services/interactive-session-service.interface.d.ts +5 -0
  6. package/dist/packages/core/src/application/ports/output/services/interactive-session-service.interface.d.ts.map +1 -1
  7. package/dist/packages/core/src/application/use-cases/repositories/get-repository-commits.use-case.d.ts +18 -0
  8. package/dist/packages/core/src/application/use-cases/repositories/get-repository-commits.use-case.d.ts.map +1 -0
  9. package/dist/packages/core/src/application/use-cases/repositories/get-repository-commits.use-case.js +40 -0
  10. package/dist/packages/core/src/infrastructure/di/container.d.ts.map +1 -1
  11. package/dist/packages/core/src/infrastructure/di/container.js +5 -0
  12. package/dist/packages/core/src/infrastructure/repositories/sqlite-interactive-session.repository.d.ts +1 -0
  13. package/dist/packages/core/src/infrastructure/repositories/sqlite-interactive-session.repository.d.ts.map +1 -1
  14. package/dist/packages/core/src/infrastructure/repositories/sqlite-interactive-session.repository.js +15 -0
  15. package/dist/packages/core/src/infrastructure/services/agents/common/executors/claude-code-interactive-executor.service.d.ts.map +1 -1
  16. package/dist/packages/core/src/infrastructure/services/agents/common/executors/claude-code-interactive-executor.service.js +8 -0
  17. package/dist/packages/core/src/infrastructure/services/git/git-pr.service.d.ts +3 -1
  18. package/dist/packages/core/src/infrastructure/services/git/git-pr.service.d.ts.map +1 -1
  19. package/dist/packages/core/src/infrastructure/services/git/git-pr.service.js +40 -0
  20. package/dist/packages/core/src/infrastructure/services/interactive/interactive-session.service.d.ts +1 -0
  21. package/dist/packages/core/src/infrastructure/services/interactive/interactive-session.service.d.ts.map +1 -1
  22. package/dist/packages/core/src/infrastructure/services/interactive/interactive-session.service.js +51 -5
  23. package/dist/src/presentation/web/app/actions/get-repository-commits.d.ts +13 -0
  24. package/dist/src/presentation/web/app/actions/get-repository-commits.d.ts.map +1 -0
  25. package/dist/src/presentation/web/app/actions/get-repository-commits.js +16 -0
  26. package/dist/src/presentation/web/app/api/interactive/chat/turn-statuses/route.d.ts +4 -5
  27. package/dist/src/presentation/web/app/api/interactive/chat/turn-statuses/route.d.ts.map +1 -1
  28. package/dist/src/presentation/web/app/api/interactive/chat/turn-statuses/route.js +5 -13
  29. package/dist/src/presentation/web/components/common/commit-history-tree/commit-history-tree.d.ts +14 -0
  30. package/dist/src/presentation/web/components/common/commit-history-tree/commit-history-tree.d.ts.map +1 -0
  31. package/dist/src/presentation/web/components/common/commit-history-tree/commit-history-tree.js +120 -0
  32. package/dist/src/presentation/web/components/common/commit-history-tree/commit-history-tree.stories.d.ts +12 -0
  33. package/dist/src/presentation/web/components/common/commit-history-tree/commit-history-tree.stories.d.ts.map +1 -0
  34. package/dist/src/presentation/web/components/common/commit-history-tree/commit-history-tree.stories.js +140 -0
  35. package/dist/src/presentation/web/components/common/commit-history-tree/use-commit-history.d.ts +16 -0
  36. package/dist/src/presentation/web/components/common/commit-history-tree/use-commit-history.d.ts.map +1 -0
  37. package/dist/src/presentation/web/components/common/commit-history-tree/use-commit-history.js +33 -0
  38. package/dist/src/presentation/web/components/common/control-center-drawer/repository-drawer-client.d.ts +1 -1
  39. package/dist/src/presentation/web/components/common/control-center-drawer/repository-drawer-client.d.ts.map +1 -1
  40. package/dist/src/presentation/web/components/common/control-center-drawer/repository-drawer-client.js +11 -1
  41. package/dist/src/presentation/web/components/common/floating-action-button/floating-action-button.d.ts +8 -2
  42. package/dist/src/presentation/web/components/common/floating-action-button/floating-action-button.d.ts.map +1 -1
  43. package/dist/src/presentation/web/components/common/floating-action-button/floating-action-button.js +10 -7
  44. package/dist/src/presentation/web/components/common/repository-node/repository-node.d.ts.map +1 -1
  45. package/dist/src/presentation/web/components/common/repository-node/repository-node.js +2 -3
  46. package/dist/src/presentation/web/components/features/chat/ChatSheet.d.ts.map +1 -1
  47. package/dist/src/presentation/web/components/features/chat/ChatSheet.js +43 -30
  48. package/dist/src/presentation/web/components/features/control-center/control-center-inner.d.ts.map +1 -1
  49. package/dist/src/presentation/web/components/features/control-center/control-center-inner.js +66 -3
  50. package/dist/src/presentation/web/components/features/features-canvas/canvas-toolbar.d.ts +1 -6
  51. package/dist/src/presentation/web/components/features/features-canvas/canvas-toolbar.d.ts.map +1 -1
  52. package/dist/src/presentation/web/components/features/features-canvas/canvas-toolbar.js +5 -6
  53. package/dist/src/presentation/web/components/features/features-canvas/features-canvas.js +1 -1
  54. package/dist/src/presentation/web/components/layouts/app-shell/app-shell.d.ts.map +1 -1
  55. package/dist/src/presentation/web/components/layouts/app-shell/app-shell.js +9 -5
  56. package/dist/src/presentation/web/hooks/turn-statuses-provider.d.ts +4 -8
  57. package/dist/src/presentation/web/hooks/turn-statuses-provider.d.ts.map +1 -1
  58. package/dist/src/presentation/web/hooks/turn-statuses-provider.js +4 -4
  59. package/dist/src/presentation/web/hooks/use-turn-statuses.d.ts +4 -5
  60. package/dist/src/presentation/web/hooks/use-turn-statuses.d.ts.map +1 -1
  61. package/dist/src/presentation/web/hooks/use-turn-statuses.js +7 -12
  62. package/dist/tsconfig.build.tsbuildinfo +1 -1
  63. package/package.json +1 -1
  64. package/web/.next/BUILD_ID +1 -1
  65. package/web/.next/build-manifest.json +2 -2
  66. package/web/.next/fallback-build-manifest.json +2 -2
  67. package/web/.next/prerender-manifest.json +3 -3
  68. package/web/.next/required-server-files.js +3 -3
  69. package/web/.next/required-server-files.json +3 -3
  70. package/web/.next/server/app/(dashboard)/@drawer/adopt/page/server-reference-manifest.json +28 -28
  71. package/web/.next/server/app/(dashboard)/@drawer/adopt/page.js.nft.json +1 -1
  72. package/web/.next/server/app/(dashboard)/@drawer/adopt/page_client-reference-manifest.js +1 -1
  73. package/web/.next/server/app/(dashboard)/@drawer/chat/page/server-reference-manifest.json +26 -26
  74. package/web/.next/server/app/(dashboard)/@drawer/chat/page.js.nft.json +1 -1
  75. package/web/.next/server/app/(dashboard)/@drawer/chat/page_client-reference-manifest.js +1 -1
  76. package/web/.next/server/app/(dashboard)/@drawer/create/page/server-reference-manifest.json +29 -29
  77. package/web/.next/server/app/(dashboard)/@drawer/create/page.js.nft.json +1 -1
  78. package/web/.next/server/app/(dashboard)/@drawer/create/page_client-reference-manifest.js +1 -1
  79. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page/server-reference-manifest.json +36 -36
  80. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page.js.nft.json +1 -1
  81. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page_client-reference-manifest.js +1 -1
  82. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page/server-reference-manifest.json +36 -36
  83. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js.nft.json +1 -1
  84. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page_client-reference-manifest.js +1 -1
  85. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/[tab]/page/server-reference-manifest.json +67 -52
  86. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/[tab]/page.js +1 -1
  87. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/[tab]/page.js.nft.json +1 -1
  88. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/[tab]/page_client-reference-manifest.js +1 -1
  89. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page/server-reference-manifest.json +67 -52
  90. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js +1 -1
  91. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js.nft.json +1 -1
  92. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  93. package/web/.next/server/app/(dashboard)/chat/page/server-reference-manifest.json +26 -26
  94. package/web/.next/server/app/(dashboard)/chat/page.js.nft.json +1 -1
  95. package/web/.next/server/app/(dashboard)/chat/page_client-reference-manifest.js +1 -1
  96. package/web/.next/server/app/(dashboard)/create/page/server-reference-manifest.json +29 -29
  97. package/web/.next/server/app/(dashboard)/create/page.js.nft.json +1 -1
  98. package/web/.next/server/app/(dashboard)/create/page_client-reference-manifest.js +1 -1
  99. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page/server-reference-manifest.json +36 -36
  100. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page.js.nft.json +1 -1
  101. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page_client-reference-manifest.js +1 -1
  102. package/web/.next/server/app/(dashboard)/feature/[featureId]/page/server-reference-manifest.json +36 -36
  103. package/web/.next/server/app/(dashboard)/feature/[featureId]/page.js.nft.json +1 -1
  104. package/web/.next/server/app/(dashboard)/feature/[featureId]/page_client-reference-manifest.js +1 -1
  105. package/web/.next/server/app/(dashboard)/page/server-reference-manifest.json +26 -26
  106. package/web/.next/server/app/(dashboard)/page.js.nft.json +1 -1
  107. package/web/.next/server/app/(dashboard)/page_client-reference-manifest.js +1 -1
  108. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/[tab]/page/server-reference-manifest.json +67 -52
  109. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/[tab]/page.js +1 -1
  110. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/[tab]/page.js.nft.json +1 -1
  111. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/[tab]/page_client-reference-manifest.js +1 -1
  112. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page/server-reference-manifest.json +67 -52
  113. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js +1 -1
  114. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js.nft.json +1 -1
  115. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  116. package/web/.next/server/app/_global-error.html +2 -2
  117. package/web/.next/server/app/_global-error.rsc +1 -1
  118. package/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  119. package/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  120. package/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  121. package/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  122. package/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  123. package/web/.next/server/app/_not-found/page/server-reference-manifest.json +5 -5
  124. package/web/.next/server/app/_not-found/page.js.nft.json +1 -1
  125. package/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  126. package/web/.next/server/app/api/attachments/preview/route.js.nft.json +1 -1
  127. package/web/.next/server/app/api/evidence/route.js.nft.json +1 -1
  128. package/web/.next/server/app/api/graph-data/route.js.nft.json +1 -1
  129. package/web/.next/server/app/api/interactive/chat/[featureId]/messages/route.js.nft.json +1 -1
  130. package/web/.next/server/app/api/sessions/route.js.nft.json +1 -1
  131. package/web/.next/server/app/api/sessions-batch/route.js.nft.json +1 -1
  132. package/web/.next/server/app/settings/page/server-reference-manifest.json +8 -8
  133. package/web/.next/server/app/settings/page.js.nft.json +1 -1
  134. package/web/.next/server/app/settings/page_client-reference-manifest.js +1 -1
  135. package/web/.next/server/app/skills/page/server-reference-manifest.json +10 -10
  136. package/web/.next/server/app/skills/page.js.nft.json +1 -1
  137. package/web/.next/server/app/skills/page_client-reference-manifest.js +1 -1
  138. package/web/.next/server/app/tools/page/server-reference-manifest.json +10 -10
  139. package/web/.next/server/app/tools/page.js.nft.json +1 -1
  140. package/web/.next/server/app/tools/page_client-reference-manifest.js +1 -1
  141. package/web/.next/server/app/version/page/server-reference-manifest.json +5 -5
  142. package/web/.next/server/app/version/page.js.nft.json +1 -1
  143. package/web/.next/server/app/version/page_client-reference-manifest.js +1 -1
  144. package/web/.next/server/chunks/[root-of-the-server]__a402b567._.js +1 -1
  145. package/web/.next/server/chunks/[root-of-the-server]__ab4951b1._.js +1 -1
  146. package/web/.next/server/chunks/[root-of-the-server]__ab4951b1._.js.map +1 -1
  147. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js +1 -1
  148. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js.map +1 -1
  149. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_feature-drawer-client_tsx_e9755fc8._.js +2 -2
  150. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_feature-drawer-client_tsx_e9755fc8._.js.map +1 -1
  151. package/web/.next/server/chunks/ssr/7f428_lucide-react_dist_esm_icons_refresh-cw_2796b1f0.js +3 -0
  152. package/web/.next/server/chunks/ssr/7f428_lucide-react_dist_esm_icons_refresh-cw_2796b1f0.js.map +1 -0
  153. package/web/.next/server/chunks/ssr/[root-of-the-server]__17ed7ed1._.js +1 -1
  154. package/web/.next/server/chunks/ssr/[root-of-the-server]__17ed7ed1._.js.map +1 -1
  155. package/web/.next/server/chunks/ssr/[root-of-the-server]__28d0d265._.js +2 -2
  156. package/web/.next/server/chunks/ssr/[root-of-the-server]__357d99f9._.js +1 -1
  157. package/web/.next/server/chunks/ssr/[root-of-the-server]__42bf1807._.js +1 -1
  158. package/web/.next/server/chunks/ssr/[root-of-the-server]__42bf1807._.js.map +1 -1
  159. package/web/.next/server/chunks/ssr/[root-of-the-server]__56b70465._.js +1 -1
  160. package/web/.next/server/chunks/ssr/[root-of-the-server]__56b70465._.js.map +1 -1
  161. package/web/.next/server/chunks/ssr/[root-of-the-server]__88f7e8e6._.js +1 -1
  162. package/web/.next/server/chunks/ssr/[root-of-the-server]__88f7e8e6._.js.map +1 -1
  163. package/web/.next/server/chunks/ssr/[root-of-the-server]__8b0aac03._.js +1 -1
  164. package/web/.next/server/chunks/ssr/[root-of-the-server]__c30f1f82._.js +1 -1
  165. package/web/.next/server/chunks/ssr/[root-of-the-server]__c30f1f82._.js.map +1 -1
  166. package/web/.next/server/chunks/ssr/[root-of-the-server]__ce859680._.js +3 -0
  167. package/web/.next/server/chunks/ssr/[root-of-the-server]__ce859680._.js.map +1 -0
  168. package/web/.next/server/chunks/ssr/[root-of-the-server]__f80bfc75._.js +1 -1
  169. package/web/.next/server/chunks/ssr/[root-of-the-server]__f80bfc75._.js.map +1 -1
  170. package/web/.next/server/chunks/ssr/_05c23ad9._.js +1 -1
  171. package/web/.next/server/chunks/ssr/_05c23ad9._.js.map +1 -1
  172. package/web/.next/server/chunks/ssr/_16eb4fec._.js +1 -1
  173. package/web/.next/server/chunks/ssr/_16eb4fec._.js.map +1 -1
  174. package/web/.next/server/chunks/ssr/{_5fce01a7._.js → _29ca8860._.js} +2 -2
  175. package/web/.next/server/chunks/ssr/{_5fce01a7._.js.map → _29ca8860._.js.map} +1 -1
  176. package/web/.next/server/chunks/ssr/_3a0b989f._.js +2 -2
  177. package/web/.next/server/chunks/ssr/_3a0b989f._.js.map +1 -1
  178. package/web/.next/server/chunks/ssr/{_d8bedf13._.js → _48066275._.js} +2 -2
  179. package/web/.next/server/chunks/ssr/_48066275._.js.map +1 -0
  180. package/web/.next/server/chunks/ssr/{_d86175ae._.js → _4b41246e._.js} +2 -2
  181. package/web/.next/server/chunks/ssr/_4b41246e._.js.map +1 -0
  182. package/web/.next/server/chunks/ssr/_56b9d60f._.js +1 -1
  183. package/web/.next/server/chunks/ssr/_56b9d60f._.js.map +1 -1
  184. package/web/.next/server/chunks/ssr/{_8219712a._.js → _5eb64260._.js} +2 -2
  185. package/web/.next/server/chunks/ssr/_5eb64260._.js.map +1 -0
  186. package/web/.next/server/chunks/ssr/{_5f69c13f._.js → _6438bf2d._.js} +2 -2
  187. package/web/.next/server/chunks/ssr/_6438bf2d._.js.map +1 -0
  188. package/web/.next/server/chunks/ssr/_7c5b97c6._.js +1 -1
  189. package/web/.next/server/chunks/ssr/_7c5b97c6._.js.map +1 -1
  190. package/web/.next/server/chunks/ssr/_82c57f10._.js +1 -1
  191. package/web/.next/server/chunks/ssr/_82c57f10._.js.map +1 -1
  192. package/web/.next/server/chunks/ssr/{_cb5a021e._.js → _87761ee1._.js} +2 -2
  193. package/web/.next/server/chunks/ssr/_87761ee1._.js.map +1 -0
  194. package/web/.next/server/chunks/ssr/_9495d50b._.js +1 -1
  195. package/web/.next/server/chunks/ssr/_9495d50b._.js.map +1 -1
  196. package/web/.next/server/chunks/ssr/_a0e3f7e4._.js +1 -1
  197. package/web/.next/server/chunks/ssr/_a0e3f7e4._.js.map +1 -1
  198. package/web/.next/server/chunks/ssr/{_cf1c5b73._.js → _a3aa1eb6._.js} +2 -2
  199. package/web/.next/server/chunks/ssr/_a3aa1eb6._.js.map +1 -0
  200. package/web/.next/server/chunks/ssr/_ac4a3873._.js +1 -1
  201. package/web/.next/server/chunks/ssr/_ac4a3873._.js.map +1 -1
  202. package/web/.next/server/chunks/ssr/_c93c0cc6._.js +3 -0
  203. package/web/.next/server/chunks/ssr/_c93c0cc6._.js.map +1 -0
  204. package/web/.next/server/chunks/ssr/_ca0aa7f0._.js +1 -1
  205. package/web/.next/server/chunks/ssr/_ca0aa7f0._.js.map +1 -1
  206. package/web/.next/server/chunks/ssr/{_e9a73a63._.js → _e55a0378._.js} +2 -2
  207. package/web/.next/server/chunks/ssr/_e55a0378._.js.map +1 -0
  208. package/web/.next/server/chunks/ssr/_fa7efce3._.js +2 -2
  209. package/web/.next/server/chunks/ssr/_fa7efce3._.js.map +1 -1
  210. package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_settings_settings-page-client_tsx_6ed9d5f8._.js +1 -1
  211. package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_settings_settings-page-client_tsx_6ed9d5f8._.js.map +1 -1
  212. package/web/.next/server/chunks/ssr/f3a1f_components_common_control-center-drawer_repository-drawer-client_tsx_39a00c03._.js +3 -0
  213. package/web/.next/server/chunks/ssr/f3a1f_components_common_control-center-drawer_repository-drawer-client_tsx_39a00c03._.js.map +1 -0
  214. package/web/.next/server/chunks/ssr/src_presentation_web_324a47da._.js +3 -0
  215. package/web/.next/server/chunks/ssr/src_presentation_web_324a47da._.js.map +1 -0
  216. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_skills_page_actions_cdc632e3.js +1 -1
  217. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_skills_page_actions_cdc632e3.js.map +1 -1
  218. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_tools_page_actions_39ca0924.js +1 -1
  219. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_tools_page_actions_39ca0924.js.map +1 -1
  220. package/web/.next/server/chunks/ssr/src_presentation_web_app_actions_open-ide_ts_baaca5d5._.js +1 -1
  221. package/web/.next/server/chunks/ssr/src_presentation_web_components_357e3eb0._.js +1 -1
  222. package/web/.next/server/chunks/ssr/src_presentation_web_components_357e3eb0._.js.map +1 -1
  223. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js +1 -1
  224. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js.map +1 -1
  225. package/web/.next/server/pages/500.html +2 -2
  226. package/web/.next/server/server-reference-manifest.js +1 -1
  227. package/web/.next/server/server-reference-manifest.json +185 -149
  228. package/web/.next/static/chunks/0b347558818d2628.js +1 -0
  229. package/web/.next/static/chunks/{cd54b758f58061d0.js → 1406c2860e7fac9c.js} +1 -1
  230. package/web/.next/static/chunks/36208713ad011740.js +1 -0
  231. package/web/.next/static/chunks/3f21588c6956d5b4.css +1 -0
  232. package/web/.next/static/chunks/471bebfd8d0f0acd.js +1 -0
  233. package/web/.next/static/chunks/{277a7f64d4ec189d.js → 5a585a2f6bcff4a9.js} +1 -1
  234. package/web/.next/static/chunks/{1b4429259bbf3064.js → 65ece264fa8f6fe1.js} +2 -2
  235. package/web/.next/static/chunks/{f9a80d3854a8d453.js → 929ed61442b5e9f7.js} +1 -1
  236. package/web/.next/static/chunks/{80c4c8b3a5c8e0b6.js → a4ffe2d157f11ad3.js} +1 -1
  237. package/web/.next/static/chunks/{bdd340ad42a34b41.js → aaf8507271e6f018.js} +1 -1
  238. package/web/.next/static/chunks/b27aae090cd67337.js +7 -0
  239. package/web/.next/static/chunks/{ef1c9f43aafff65f.js → b2c3da92e5d7864b.js} +2 -2
  240. package/web/.next/static/chunks/bb831852c32a9e59.js +1 -0
  241. package/web/.next/static/chunks/{a2257ffb1349f838.js → d13a4b544b737cbc.js} +1 -1
  242. package/web/.next/static/chunks/eef9a6b627e39d41.js +1 -0
  243. package/web/.next/static/chunks/{f33efe6a12242a8a.js → fa08611a63bb5369.js} +1 -1
  244. package/web/.next/server/chunks/ssr/[root-of-the-server]__563f2f7a._.js +0 -3
  245. package/web/.next/server/chunks/ssr/[root-of-the-server]__563f2f7a._.js.map +0 -1
  246. package/web/.next/server/chunks/ssr/_5f69c13f._.js.map +0 -1
  247. package/web/.next/server/chunks/ssr/_8219712a._.js.map +0 -1
  248. package/web/.next/server/chunks/ssr/_cb5a021e._.js.map +0 -1
  249. package/web/.next/server/chunks/ssr/_cf1c5b73._.js.map +0 -1
  250. package/web/.next/server/chunks/ssr/_cfbd1d7e._.js +0 -3
  251. package/web/.next/server/chunks/ssr/_cfbd1d7e._.js.map +0 -1
  252. package/web/.next/server/chunks/ssr/_d86175ae._.js.map +0 -1
  253. package/web/.next/server/chunks/ssr/_d8bedf13._.js.map +0 -1
  254. package/web/.next/server/chunks/ssr/_e9a73a63._.js.map +0 -1
  255. package/web/.next/server/chunks/ssr/_f78b4b9d._.js +0 -3
  256. package/web/.next/server/chunks/ssr/_f78b4b9d._.js.map +0 -1
  257. package/web/.next/static/chunks/22c459f1877b1e4f.js +0 -1
  258. package/web/.next/static/chunks/4908997348bd55f8.js +0 -1
  259. package/web/.next/static/chunks/6bf775818e4ad42e.js +0 -1
  260. package/web/.next/static/chunks/76858a51f2fbe99a.js +0 -7
  261. package/web/.next/static/chunks/8ba1c07ef18b15a9.js +0 -1
  262. package/web/.next/static/chunks/a919a9df4ab12a5c.css +0 -1
  263. package/web/.next/static/chunks/ee20803fb301d59e.js +0 -1
  264. /package/web/.next/static/{lPbWG8a1RwBDDcvRngp58 → -_iF1islqFSzVifHA2Zlt}/_buildManifest.js +0 -0
  265. /package/web/.next/static/{lPbWG8a1RwBDDcvRngp58 → -_iF1islqFSzVifHA2Zlt}/_clientMiddlewareManifest.json +0 -0
  266. /package/web/.next/static/{lPbWG8a1RwBDDcvRngp58 → -_iF1islqFSzVifHA2Zlt}/_ssgManifest.js +0 -0
@@ -19,9 +19,14 @@ function loadPersistedState() {
19
19
  if (!raw)
20
20
  return { pos: null, size: null };
21
21
  const parsed = JSON.parse(raw);
22
+ let size = parsed.size ?? null;
23
+ // Clamp persisted size to minimums — prevents invisible panel from bad state
24
+ if (size && (size.w < MIN_W || size.h < MIN_H)) {
25
+ size = { w: Math.max(MIN_W, size.w), h: Math.max(MIN_H, size.h) };
26
+ }
22
27
  return {
23
28
  pos: parsed.pos ?? null,
24
- size: parsed.size ?? null,
29
+ size,
25
30
  };
26
31
  }
27
32
  catch {
@@ -119,13 +124,24 @@ export function GlobalChatPopup() {
119
124
  const timer = setTimeout(() => persistState(pos, size), 300);
120
125
  return () => clearTimeout(timer);
121
126
  }, [pos, size]);
127
+ /** Clamp position so the header (top 48px) stays within viewport. */
128
+ const clampPos = useCallback((x, y, w) => {
129
+ const vw = window.innerWidth;
130
+ const vh = window.innerHeight;
131
+ const HEADER_H = 48;
132
+ return {
133
+ // Keep at least 100px of width visible horizontally
134
+ x: Math.max(-w + 100, Math.min(x, vw - 100)),
135
+ // Keep header on screen: top >= 0, top <= viewport - header height
136
+ y: Math.max(0, Math.min(y, vh - HEADER_H)),
137
+ };
138
+ }, []);
122
139
  // ── Drag handling ──────────────────────────────────────────────────────
123
140
  const onDragStart = useCallback((e) => {
124
141
  e.preventDefault();
125
142
  const panel = panelRef.current;
126
143
  if (!panel)
127
144
  return;
128
- // If no custom position yet, compute from current DOM position
129
145
  const rect = panel.getBoundingClientRect();
130
146
  const currentX = pos?.x ?? rect.left;
131
147
  const currentY = pos?.y ?? rect.top;
@@ -135,15 +151,13 @@ export function GlobalChatPopup() {
135
151
  startPosX: currentX,
136
152
  startPosY: currentY,
137
153
  };
154
+ const panelW = size?.w ?? rect.width;
138
155
  const onMove = (ev) => {
139
156
  if (!dragRef.current)
140
157
  return;
141
158
  const dx = ev.clientX - dragRef.current.startX;
142
159
  const dy = ev.clientY - dragRef.current.startY;
143
- setPos({
144
- x: dragRef.current.startPosX + dx,
145
- y: dragRef.current.startPosY + dy,
146
- });
160
+ setPos(clampPos(dragRef.current.startPosX + dx, dragRef.current.startPosY + dy, panelW));
147
161
  };
148
162
  const onUp = () => {
149
163
  dragRef.current = null;
@@ -152,7 +166,7 @@ export function GlobalChatPopup() {
152
166
  };
153
167
  document.addEventListener('mousemove', onMove);
154
168
  document.addEventListener('mouseup', onUp);
155
- }, [pos, setPos]);
169
+ }, [pos, size, setPos, clampPos]);
156
170
  // ── Resize handling (from top-right corner) ────────────────────────────
157
171
  const onResizeStart = useCallback((e) => {
158
172
  e.preventDefault();
@@ -161,29 +175,27 @@ export function GlobalChatPopup() {
161
175
  if (!panel)
162
176
  return;
163
177
  const rect = panel.getBoundingClientRect();
164
- resizeRef.current = {
165
- startX: e.clientX,
166
- startY: e.clientY,
167
- startW: size?.w ?? rect.width,
168
- startH: size?.h ?? rect.height,
169
- };
170
- // Also capture position if not set yet
178
+ const startW = size?.w ?? rect.width;
179
+ const startH = size?.h ?? rect.height;
180
+ const startX = e.clientX;
181
+ const startY = e.clientY;
182
+ const startPosY = pos?.y ?? rect.top;
183
+ resizeRef.current = { startX, startY, startW, startH };
184
+ // Capture position if not set yet
171
185
  if (!pos) {
172
186
  setPos({ x: rect.left, y: rect.top });
173
187
  }
174
188
  const onMove = (ev) => {
175
189
  if (!resizeRef.current)
176
190
  return;
177
- const dx = ev.clientX - resizeRef.current.startX;
178
- const dy = ev.clientY - resizeRef.current.startY;
179
- setSize({
180
- w: Math.max(MIN_W, resizeRef.current.startW + dx),
181
- h: Math.max(MIN_H, resizeRef.current.startH - dy),
182
- });
183
- // Move top edge up as height increases
184
- if (pos) {
185
- setPos((prev) => (prev ? { ...prev, y: (prev.y ?? 0) + dy } : prev));
186
- }
191
+ const dx = ev.clientX - startX;
192
+ const dy = ev.clientY - startY;
193
+ const newW = Math.max(MIN_W, startW + dx);
194
+ const newH = Math.max(MIN_H, startH - dy);
195
+ // Top edge moves with height change, clamped to viewport
196
+ const newY = Math.max(0, startPosY + dy);
197
+ setSize({ w: newW, h: newH });
198
+ setPos((prev) => clampPos(prev?.x ?? rect.left, newY, newW));
187
199
  };
188
200
  const onUp = () => {
189
201
  resizeRef.current = null;
@@ -192,7 +204,7 @@ export function GlobalChatPopup() {
192
204
  };
193
205
  document.addEventListener('mousemove', onMove);
194
206
  document.addEventListener('mouseup', onUp);
195
- }, [size, pos, setPos, setSize]);
207
+ }, [size, pos, setPos, setSize, clampPos]);
196
208
  // Reset position/size on close for clean reopen
197
209
  const handleClose = useCallback(() => {
198
210
  setIsOpen(false);
@@ -214,8 +226,8 @@ export function GlobalChatPopup() {
214
226
  height: size?.h ?? `${DEFAULT_H_VH}vh`,
215
227
  };
216
228
  return (_jsxs(_Fragment, { children: [hasOpened ? (_jsxs("div", { ref: panelRef, className: cn(isMaximized
217
- ? 'bg-background absolute inset-0 z-30 flex flex-col overflow-hidden dark:bg-neutral-900'
218
- : cn(!pos && 'absolute bottom-24 left-4', 'z-30 flex flex-col overflow-hidden rounded-lg', 'border-border/60 border dark:border-white/10', 'bg-background dark:bg-neutral-900', 'shadow-[0_8px_40px_-8px_rgba(0,0,0,0.2)] dark:shadow-[0_8px_40px_-8px_rgba(0,0,0,0.6)]'), 'transition-opacity duration-300 ease-out', isOpen ? 'pointer-events-auto opacity-100' : 'pointer-events-none opacity-0'), style: panelStyle, children: [!isMaximized ? (_jsx("div", { className: "h-[2px] shrink-0 bg-gradient-to-r from-transparent via-violet-500/50 to-transparent" })) : null, !isMaximized ? (_jsx("div", { onMouseDown: onResizeStart, className: "absolute top-0 right-0 z-10 h-4 w-4 cursor-ne-resize" })) : null, _jsxs("div", { onMouseDown: isMaximized ? undefined : onDragStart, className: cn('relative flex h-11 shrink-0 items-center gap-2.5 border-b border-black/[0.06] px-3.5 dark:border-white/[0.06]', !isMaximized && 'cursor-grab active:cursor-grabbing'), children: [_jsx("div", { className: "from-foreground/[0.02] to-foreground/[0.02] pointer-events-none absolute inset-0 bg-gradient-to-r via-transparent" }), !isMaximized ? (_jsx(GripVertical, { className: "text-foreground/15 relative h-3.5 w-3.5 shrink-0" })) : null, _jsx("div", { className: "relative flex h-5 w-5 items-center justify-center", children: _jsx(Bot, { className: "text-foreground/50 h-4 w-4" }) }), _jsxs("div", { className: "relative flex items-baseline gap-2", children: [_jsx("span", { className: "text-foreground/90 text-base font-bold tracking-tight", children: "Shep" }), _jsx("span", { className: "text-foreground/30 text-xs font-medium tracking-widest uppercase", children: "global" })] }), _jsxs("div", { className: "relative ml-auto flex items-center gap-0.5", children: [_jsx("button", { type: "button", onClick: toggleMaximize, className: "text-foreground/30 hover:text-foreground/60 rounded-md p-1 transition-colors", title: isMaximized ? 'Restore (⌘⇧M)' : 'Maximize (⌘⇧M)', children: isMaximized ? (_jsx(Minimize2, { className: "h-3.5 w-3.5" })) : (_jsx(Maximize2, { className: "h-3.5 w-3.5" })) }), _jsx("button", { type: "button", onClick: handleClose, className: "text-foreground/30 hover:text-foreground/60 rounded-md p-1 transition-colors", title: "Close (\u2318\u21E7K)", children: _jsx(X, { className: "h-3.5 w-3.5" }) })] })] }), _jsx("div", { className: "flex min-h-0 flex-1 flex-col overflow-hidden", children: _jsx(ChatTab, { featureId: "global" }) }), !isMaximized ? (_jsx("div", { onMouseDown: (e) => {
229
+ ? 'bg-background fixed inset-0 z-[60] flex flex-col overflow-hidden dark:bg-neutral-900'
230
+ : cn(!pos && 'fixed right-8 bottom-24', 'z-[60] flex flex-col overflow-hidden rounded-lg', 'border-border/60 border dark:border-white/10', 'bg-background dark:bg-neutral-900', 'shadow-[0_8px_40px_-8px_rgba(0,0,0,0.2)] dark:shadow-[0_8px_40px_-8px_rgba(0,0,0,0.6)]'), 'transition-opacity duration-300 ease-out', isOpen ? 'pointer-events-auto opacity-100' : 'pointer-events-none opacity-0'), style: panelStyle, children: [!isMaximized ? (_jsx("div", { className: "h-[2px] shrink-0 bg-gradient-to-r from-transparent via-violet-500/50 to-transparent" })) : null, !isMaximized ? (_jsx("div", { onMouseDown: onResizeStart, className: "absolute top-0 right-0 z-10 h-4 w-4 cursor-ne-resize" })) : null, _jsxs("div", { onMouseDown: isMaximized ? undefined : onDragStart, className: cn('relative flex h-11 shrink-0 items-center gap-2.5 border-b border-black/[0.06] px-3.5 dark:border-white/[0.06]', !isMaximized && 'cursor-grab active:cursor-grabbing'), children: [_jsx("div", { className: "from-foreground/[0.02] to-foreground/[0.02] pointer-events-none absolute inset-0 bg-gradient-to-r via-transparent" }), !isMaximized ? (_jsx(GripVertical, { className: "text-foreground/15 relative h-3.5 w-3.5 shrink-0" })) : null, _jsx("div", { className: "relative flex h-5 w-5 items-center justify-center", children: _jsx(Bot, { className: "text-foreground/50 h-4 w-4" }) }), _jsxs("div", { className: "relative flex items-baseline gap-2", children: [_jsx("span", { className: "text-foreground/90 text-base font-bold tracking-tight", children: "Shep" }), _jsx("span", { className: "text-foreground/30 text-xs font-medium tracking-widest uppercase", children: "global" })] }), _jsxs("div", { className: "relative ml-auto flex items-center gap-0.5", children: [_jsx("button", { type: "button", onClick: toggleMaximize, className: "text-foreground/30 hover:text-foreground/60 rounded-md p-1 transition-colors", title: isMaximized ? 'Restore (⌘⇧M)' : 'Maximize (⌘⇧M)', children: isMaximized ? (_jsx(Minimize2, { className: "h-3.5 w-3.5" })) : (_jsx(Maximize2, { className: "h-3.5 w-3.5" })) }), _jsx("button", { type: "button", onClick: handleClose, className: "text-foreground/30 hover:text-foreground/60 rounded-md p-1 transition-colors", title: "Close (\u2318\u21E7K)", children: _jsx(X, { className: "h-3.5 w-3.5" }) })] })] }), _jsx("div", { className: "flex min-h-0 flex-1 flex-col overflow-hidden", children: _jsx(ChatTab, { featureId: "global" }) }), !isMaximized ? (_jsx("div", { onMouseDown: (e) => {
219
231
  e.preventDefault();
220
232
  e.stopPropagation();
221
233
  const panel = panelRef.current;
@@ -229,9 +241,10 @@ export function GlobalChatPopup() {
229
241
  if (!pos)
230
242
  setPos({ x: rect.left, y: rect.top });
231
243
  const onMove = (ev) => {
244
+ const maxH = window.innerHeight - (pos?.y ?? rect.top);
232
245
  setSize({
233
246
  w: Math.max(MIN_W, startW + (ev.clientX - startX)),
234
- h: Math.max(MIN_H, startH + (ev.clientY - startY)),
247
+ h: Math.max(MIN_H, Math.min(startH + (ev.clientY - startY), maxH)),
235
248
  });
236
249
  };
237
250
  const onUp = () => {
@@ -240,7 +253,7 @@ export function GlobalChatPopup() {
240
253
  };
241
254
  document.addEventListener('mousemove', onMove);
242
255
  document.addEventListener('mouseup', onUp);
243
- }, className: "absolute right-0 bottom-0 z-10 h-4 w-4 cursor-se-resize" })) : null] })) : null, _jsxs("div", { className: cn('group/fab absolute bottom-4 left-4 z-30 flex items-center', isMaximized && 'hidden'), children: [_jsxs(Button, { size: "icon", onClick: toggle, className: cn('relative h-14 w-14 rounded-full shadow-lg', 'transition-all duration-200 hover:scale-105 hover:shadow-xl active:scale-95', isOpen
256
+ }, className: "absolute right-0 bottom-0 z-10 h-4 w-4 cursor-se-resize" })) : null] })) : null, _jsxs("div", { className: cn('group/fab fixed right-8 bottom-6 z-30', isMaximized && 'hidden'), children: [_jsxs(Button, { size: "icon", onClick: toggle, className: cn('relative h-14 w-14 rounded-full shadow-lg', 'transition-all duration-200 hover:scale-105 hover:shadow-xl active:scale-95', isOpen
244
257
  ? 'bg-violet-600 text-white hover:bg-violet-500'
245
- : 'bg-violet-500 text-white hover:bg-violet-400 dark:bg-violet-500 dark:hover:bg-violet-400'), children: [_jsx(MessageSquare, { className: cn('absolute h-7 w-7 stroke-[2.5] transition-all duration-200', isOpen ? 'scale-0 rotate-90 opacity-0' : 'scale-100 rotate-0 opacity-100') }), _jsx(X, { className: cn('absolute h-6 w-6 stroke-[2.5] transition-all duration-200', isOpen ? 'scale-100 rotate-0 opacity-100' : 'scale-0 -rotate-90 opacity-0') }), !isOpen && _jsx(ChatDotIndicator, { status: globalChatTurnStatus, className: "top-0 right-0" })] }), _jsx("div", { className: "pointer-events-none ml-3 flex translate-x-[-4px] items-center gap-2 opacity-0 transition-all duration-200 group-hover/fab:translate-x-0 group-hover/fab:opacity-100", children: _jsxs("div", { className: "bg-foreground rounded-lg px-3 py-1.5 shadow-lg", children: [_jsx("p", { className: "text-background text-xs font-medium", children: "Shep Chat" }), _jsxs("p", { className: "text-background/50 mt-0.5 flex items-center gap-1 text-[10px]", children: [_jsx("kbd", { className: "bg-background/15 rounded px-1 py-px font-mono", children: "\u2318" }), _jsx("kbd", { className: "bg-background/15 rounded px-1 py-px font-mono", children: "\u21E7" }), _jsx("kbd", { className: "bg-background/15 rounded px-1 py-px font-mono", children: "K" })] })] }) })] })] }));
258
+ : 'bg-violet-500 text-white hover:bg-violet-400 dark:bg-violet-500 dark:hover:bg-violet-400'), children: [_jsx(MessageSquare, { className: cn('absolute h-7 w-7 stroke-[2.5] transition-all duration-200', isOpen ? 'scale-0 rotate-90 opacity-0' : 'scale-100 rotate-0 opacity-100') }), _jsx(X, { className: cn('absolute h-6 w-6 stroke-[2.5] transition-all duration-200', isOpen ? 'scale-100 rotate-0 opacity-100' : 'scale-0 -rotate-90 opacity-0') }), !isOpen && _jsx(ChatDotIndicator, { status: globalChatTurnStatus, className: "top-0 right-0" })] }), _jsx("div", { className: "pointer-events-none absolute bottom-[calc(100%+8px)] left-1/2 -translate-x-1/2 translate-y-1 opacity-0 transition-all duration-200 group-hover/fab:translate-y-0 group-hover/fab:opacity-100", children: _jsxs("div", { className: "bg-foreground rounded-lg px-3 py-1.5 text-center shadow-lg", children: [_jsx("p", { className: "text-background text-xs font-medium whitespace-nowrap", children: "Shep Chat" }), _jsxs("p", { className: "text-background/50 mt-0.5 flex items-center justify-center gap-1 text-[10px]", children: [_jsx("kbd", { className: "bg-background/15 rounded px-1 py-px font-mono", children: "\u2318" }), _jsx("kbd", { className: "bg-background/15 rounded px-1 py-px font-mono", children: "\u21E7" }), _jsx("kbd", { className: "bg-background/15 rounded px-1 py-px font-mono", children: "K" })] })] }) })] })] }));
246
259
  }
@@ -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;AAIpD,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,2CAmZzF"}
1
+ {"version":3,"file":"control-center-inner.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/features/control-center/control-center-inner.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,IAAI,EAAY,MAAM,eAAe,CAAC;AAIpD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uCAAuC,CAAC;AA8B5E,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,2CAwczF"}
@@ -1,16 +1,20 @@
1
1
  'use client';
2
- import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
3
3
  import { useCallback, useEffect, useMemo, useRef, useState } from 'react';
4
4
  import { useRouter, usePathname } from 'next/navigation';
5
+ import { Sparkles, FolderPlus, Github, GitBranch } from 'lucide-react';
5
6
  import { useReactFlow } from '@xyflow/react';
6
7
  import { FeaturesCanvas } from '../../features/features-canvas/index.js';
7
8
  import { CanvasToolbar } from '../../features/features-canvas/canvas-toolbar.js';
9
+ import { FloatingActionButton, } from '../../common/floating-action-button/index.js';
8
10
  import { useSidebarFeaturesContext, mapNodeStateToSidebarStatus, } from '../../../hooks/sidebar-features-context.js';
11
+ import { useFeatureFlags } from '../../../hooks/feature-flags-context.js';
9
12
  import { useSelectedFeatureId } from '../../../hooks/use-selected-feature-id.js';
10
13
  import { useSelectedRepository } from '../../../hooks/use-selected-repository.js';
11
14
  import { useSoundAction } from '../../../hooks/use-sound-action.js';
12
15
  import { useDrawerCloseGuard } from '../../../hooks/drawer-close-guard.js';
13
16
  import { useViewportPersistence } from '../../../hooks/use-viewport-persistence.js';
17
+ import { useSidebar } from '../../ui/sidebar.js';
14
18
  import { ControlCenterEmptyState } from './control-center-empty-state.js';
15
19
  import { useControlCenterState } from './use-control-center-state.js';
16
20
  const AUTO_FOCUS_OPTIONS = {
@@ -291,6 +295,65 @@ export function ControlCenterInner({ initialNodes, initialEdges }) {
291
295
  const handlePickFolder = useCallback(() => {
292
296
  window.dispatchEvent(new CustomEvent('shep:pick-folder'));
293
297
  }, []);
294
- const canvasToolbar = (_jsx(CanvasToolbar, { showArchived: showArchived, onToggleArchived: () => setShowArchived(!showArchived), onAddFeature: handleAddFeature, onAddRepository: handlePickFolder, onResetViewport: resetViewport }));
295
- 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, toolbar: canvasToolbar, emptyState: _jsx(ControlCenterEmptyState, { onRepositorySelect: addRepoAndFocus }) }));
298
+ const featureFlags = useFeatureFlags();
299
+ // (+) FAB actions only visible on control center
300
+ const fabActions = useMemo(() => {
301
+ const actions = [
302
+ {
303
+ id: 'new-feature',
304
+ label: 'New Feature',
305
+ icon: _jsx(Sparkles, { className: "h-4 w-4" }),
306
+ onClick: () => {
307
+ clickSound.play();
308
+ guardedNavigate(() => router.push('/create'));
309
+ },
310
+ },
311
+ {
312
+ id: 'add-local-repo',
313
+ label: 'Local Folder',
314
+ icon: _jsx(FolderPlus, { className: "h-4 w-4" }),
315
+ onClick: handlePickFolder,
316
+ },
317
+ ];
318
+ if (featureFlags.adoptBranch) {
319
+ actions.push({
320
+ id: 'adopt-branch',
321
+ label: 'Adopt Branch',
322
+ icon: _jsx(GitBranch, { className: "h-4 w-4" }),
323
+ onClick: () => {
324
+ guardedNavigate(() => router.push('/adopt'));
325
+ },
326
+ });
327
+ }
328
+ if (featureFlags.githubImport) {
329
+ actions.push({
330
+ id: 'add-github-repo',
331
+ label: 'From GitHub',
332
+ icon: _jsx(Github, { className: "h-4 w-4" }),
333
+ onClick: () => {
334
+ window.dispatchEvent(new CustomEvent('shep:open-github-import'));
335
+ },
336
+ });
337
+ }
338
+ return actions;
339
+ }, [
340
+ clickSound,
341
+ guardedNavigate,
342
+ router,
343
+ handlePickFolder,
344
+ featureFlags.adoptBranch,
345
+ featureFlags.githubImport,
346
+ ]);
347
+ const canvasToolbar = (_jsx(CanvasToolbar, { showArchived: showArchived, onToggleArchived: () => setShowArchived(!showArchived), onResetViewport: resetViewport }));
348
+ return (_jsxs(_Fragment, { children: [_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, toolbar: canvasToolbar, emptyState: _jsx(ControlCenterEmptyState, { onRepositorySelect: addRepoAndFocus }) }), showCanvas ? _jsx(CreateFab, { actions: fabActions }) : null] }));
349
+ }
350
+ /** (+) FAB that tracks sidebar width via CSS var + transition. */
351
+ function CreateFab({ actions }) {
352
+ const { state } = useSidebar();
353
+ // Sidebar expanded = var(--sidebar-width) = 16rem, collapsed = var(--sidebar-width-icon) = 3rem
354
+ // Position just outside the sidebar edge with 16px gap
355
+ const left = state === 'expanded'
356
+ ? 'calc(var(--sidebar-width) + 32px)'
357
+ : 'calc(var(--sidebar-width-icon) + 32px)';
358
+ return (_jsx(FloatingActionButton, { actions: actions, className: "!fixed bottom-6", style: { left, transition: 'left 200ms ease-in-out' } }));
296
359
  }
@@ -2,12 +2,7 @@ import type { Viewport } from '@xyflow/react';
2
2
  export interface CanvasToolbarProps {
3
3
  showArchived: boolean;
4
4
  onToggleArchived: () => void;
5
- onAddFeature: () => void;
6
- onAddRepository: () => void;
7
- addingRepo?: boolean;
8
5
  onResetViewport?: () => Viewport;
9
- /** Extra action buttons (adopt branch, github import, etc.) */
10
- extraActions?: React.ReactNode;
11
6
  }
12
- export declare function CanvasToolbar({ showArchived, onToggleArchived, onAddFeature, onAddRepository, addingRepo, onResetViewport, extraActions, }: CanvasToolbarProps): import("react/jsx-runtime").JSX.Element;
7
+ export declare function CanvasToolbar({ showArchived, onToggleArchived, onResetViewport, }: CanvasToolbarProps): import("react/jsx-runtime").JSX.Element;
13
8
  //# sourceMappingURL=canvas-toolbar.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"canvas-toolbar.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/features/features-canvas/canvas-toolbar.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAK9C,MAAM,WAAW,kBAAkB;IACjC,YAAY,EAAE,OAAO,CAAC;IACtB,gBAAgB,EAAE,MAAM,IAAI,CAAC;IAC7B,YAAY,EAAE,MAAM,IAAI,CAAC;IACzB,eAAe,EAAE,MAAM,IAAI,CAAC;IAC5B,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,eAAe,CAAC,EAAE,MAAM,QAAQ,CAAC;IACjC,+DAA+D;IAC/D,YAAY,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;CAChC;AAED,wBAAgB,aAAa,CAAC,EAC5B,YAAY,EACZ,gBAAgB,EAChB,YAAY,EACZ,eAAe,EACf,UAAU,EACV,eAAe,EACf,YAAY,GACb,EAAE,kBAAkB,2CAoEpB"}
1
+ {"version":3,"file":"canvas-toolbar.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/features/features-canvas/canvas-toolbar.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAI9C,MAAM,WAAW,kBAAkB;IACjC,YAAY,EAAE,OAAO,CAAC;IACtB,gBAAgB,EAAE,MAAM,IAAI,CAAC;IAC7B,eAAe,CAAC,EAAE,MAAM,QAAQ,CAAC;CAClC;AAED,wBAAgB,aAAa,CAAC,EAC5B,YAAY,EACZ,gBAAgB,EAChB,eAAe,GAChB,EAAE,kBAAkB,2CAqDpB"}
@@ -2,10 +2,9 @@
2
2
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
3
  import { useCallback } from 'react';
4
4
  import { useReactFlow } from '@xyflow/react';
5
- import { Plus, FolderPlus, Eye, EyeOff, ZoomIn, ZoomOut, Maximize, RotateCcw } from 'lucide-react';
5
+ import { Eye, EyeOff, ZoomIn, ZoomOut, Maximize, RotateCcw } from 'lucide-react';
6
6
  import { cn } from '../../../lib/utils.js';
7
- import { Separator } from '../../ui/separator.js';
8
- export function CanvasToolbar({ showArchived, onToggleArchived, onAddFeature, onAddRepository, addingRepo, onResetViewport, extraActions, }) {
7
+ export function CanvasToolbar({ showArchived, onToggleArchived, onResetViewport, }) {
9
8
  const { zoomIn, zoomOut, fitView, setViewport } = useReactFlow();
10
9
  const handleZoomIn = useCallback(() => {
11
10
  zoomIn({ duration: 200 });
@@ -22,9 +21,9 @@ export function CanvasToolbar({ showArchived, onToggleArchived, onAddFeature, on
22
21
  setViewport(viewport, { duration: 400 });
23
22
  }
24
23
  }, [onResetViewport, setViewport]);
25
- return (_jsxs("div", { className: "bg-background flex items-center gap-1 rounded-xl border px-2 py-1.5 shadow-md dark:bg-neutral-900", children: [_jsx(ToolbarButton, { onClick: onAddFeature, title: "New Feature", label: "New", children: _jsx(Plus, { className: "h-4 w-4" }) }), _jsx(ToolbarButton, { onClick: onAddRepository, title: "Add Repository", label: "Repo", disabled: addingRepo, children: _jsx(FolderPlus, { className: "h-4 w-4" }) }), extraActions, _jsx(Separator, { orientation: "vertical", className: "mx-1 h-6" }), _jsx(ToolbarButton, { onClick: onToggleArchived, title: showArchived ? 'Hide archived' : 'Show archived', active: showArchived, children: showArchived ? _jsx(Eye, { className: "h-4 w-4" }) : _jsx(EyeOff, { className: "h-4 w-4" }) }), _jsx(Separator, { orientation: "vertical", className: "mx-1 h-6" }), _jsx(ToolbarButton, { onClick: handleZoomOut, title: "Zoom out", children: _jsx(ZoomOut, { className: "h-4 w-4" }) }), _jsx(ToolbarButton, { onClick: handleZoomIn, title: "Zoom in", children: _jsx(ZoomIn, { className: "h-4 w-4" }) }), _jsx(ToolbarButton, { onClick: handleFitView, title: "Fit view", children: _jsx(Maximize, { className: "h-4 w-4" }) }), onResetViewport ? (_jsx(ToolbarButton, { onClick: handleReset, title: "Reset view", children: _jsx(RotateCcw, { className: "h-4 w-4" }) })) : null] }));
24
+ return (_jsxs("div", { className: "bg-background flex items-center gap-1 rounded-xl border px-2 py-1.5 shadow-md dark:bg-neutral-900", children: [_jsx(ToolbarButton, { onClick: onToggleArchived, title: showArchived ? 'Hide archived' : 'Show archived', active: showArchived, label: showArchived ? 'Hide Archived' : 'Show Archived', children: showArchived ? _jsx(Eye, { className: "h-4 w-4" }) : _jsx(EyeOff, { className: "h-4 w-4" }) }), _jsx("div", { className: "bg-border mx-1 h-5 w-px" }), _jsx(ToolbarButton, { onClick: handleZoomOut, title: "Zoom out", children: _jsx(ZoomOut, { className: "h-4 w-4" }) }), _jsx(ToolbarButton, { onClick: handleZoomIn, title: "Zoom in", children: _jsx(ZoomIn, { className: "h-4 w-4" }) }), _jsx(ToolbarButton, { onClick: handleFitView, title: "Fit view", children: _jsx(Maximize, { className: "h-4 w-4" }) }), onResetViewport ? (_jsx(ToolbarButton, { onClick: handleReset, title: "Reset view", children: _jsx(RotateCcw, { className: "h-4 w-4" }) })) : null] }));
26
25
  }
27
26
  // ── Internal button ──────────────────────────────────────────────────────
28
- function ToolbarButton({ children, onClick, title, label, active, disabled, }) {
29
- return (_jsxs("button", { type: "button", onClick: onClick, title: title, disabled: disabled, className: cn('inline-flex items-center gap-1.5 rounded-lg px-2 py-1.5 text-xs font-medium transition-colors', 'hover:bg-accent hover:text-accent-foreground', 'disabled:pointer-events-none disabled:opacity-50', active ? 'text-primary bg-primary/10' : 'text-muted-foreground'), children: [children, label ? _jsx("span", { children: label }) : null] }));
27
+ function ToolbarButton({ children, onClick, title, label, active, }) {
28
+ return (_jsxs("button", { type: "button", onClick: onClick, title: title, className: cn('inline-flex items-center gap-1.5 rounded-lg px-2 py-1.5 text-xs font-medium transition-colors', 'hover:bg-accent hover:text-accent-foreground', active ? 'text-primary bg-primary/10' : 'text-muted-foreground'), children: [children, label ? _jsx("span", { children: label }) : null] }));
30
29
  }
@@ -69,5 +69,5 @@ export function FeaturesCanvas({ nodes, edges, selectedFeatureId, selectedReposi
69
69
  }, [isEmpty]);
70
70
  const fallbackEmptyState = isEmpty && !emptyState ? (_jsx(EmptyState, { title: "No features yet", description: "Get started by creating your first feature.", action: _jsxs(Button, { onClick: onAddFeature, children: [_jsx(Plus, { className: "mr-2 h-4 w-4" }), "New Feature"] }) })) : null;
71
71
  const overlayContent = emptyState ?? fallbackEmptyState;
72
- return (_jsxs("div", { "data-testid": isEmpty ? 'features-canvas-empty' : 'features-canvas', "data-no-drawer-close": true, className: "dark:bg-background pointer-events-auto relative h-full w-full bg-[#f6f7f8]", children: [_jsxs(ReactFlow, { nodes: enrichedNodes, edges: edges, nodeTypes: nodeTypes, edgeTypes: edgeTypes, onConnect: onConnect, onNodesChange: onNodesChange, onNodeClick: onNodeClick, onPaneClick: onPaneClick, onMoveStart: onCanvasDrag, onMoveEnd: onMoveEnd, defaultViewport: defaultViewport ?? FALLBACK_VIEWPORT, nodesDraggable: false, nodesConnectable: false, elementsSelectable: false, proOptions: { hideAttribution: true }, className: "[&_.react-flow__pane]:!cursor-default", children: [_jsx(Background, { variant: BackgroundVariant.Dots, gap: 24, size: 1, color: "#b8bcc4", className: "dark:[&_circle]:!fill-white/[0.1]" }), !isEmpty && toolbar ? (_jsx(Panel, { position: "bottom-center", className: "!mb-4", children: toolbar })) : null] }), showOverlay && overlayContent ? (_jsx("div", { className: cn('pointer-events-none absolute inset-0 z-10 flex items-center justify-center transition-opacity duration-300', overlayExiting ? 'opacity-0' : 'animate-in fade-in opacity-100 duration-200'), children: _jsx("div", { className: "pointer-events-auto h-full w-full", children: overlayContent }) })) : null] }));
72
+ return (_jsxs("div", { "data-testid": isEmpty ? 'features-canvas-empty' : 'features-canvas', "data-no-drawer-close": true, className: "dark:bg-background pointer-events-auto relative h-full w-full bg-[#f6f7f8]", children: [_jsxs(ReactFlow, { nodes: enrichedNodes, edges: edges, nodeTypes: nodeTypes, edgeTypes: edgeTypes, onConnect: onConnect, onNodesChange: onNodesChange, onNodeClick: onNodeClick, onPaneClick: onPaneClick, onMoveStart: onCanvasDrag, onMoveEnd: onMoveEnd, defaultViewport: defaultViewport ?? FALLBACK_VIEWPORT, nodesDraggable: false, nodesConnectable: false, elementsSelectable: false, proOptions: { hideAttribution: true }, className: "[&_.react-flow__pane]:!cursor-default", children: [_jsx(Background, { variant: BackgroundVariant.Dots, gap: 24, size: 1, color: "#b8bcc4", className: "dark:[&_circle]:!fill-white/[0.1]" }), !isEmpty && toolbar ? (_jsx(Panel, { position: "top-right", className: "!mt-3 !mr-3", children: toolbar })) : null] }), showOverlay && overlayContent ? (_jsx("div", { className: cn('pointer-events-none absolute inset-0 z-10 flex items-center justify-center transition-opacity duration-300', overlayExiting ? 'opacity-0' : 'animate-in fade-in opacity-100 duration-200'), children: _jsx("div", { className: "pointer-events-auto h-full w-full", children: overlayContent }) })) : null] }));
73
73
  }
@@ -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,EAA6C,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAmBlF,UAAU,aAAa;IACrB,QAAQ,EAAE,SAAS,CAAC;IACpB,6CAA6C;IAC7C,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AA4GD,wBAAgB,QAAQ,CAAC,EAAE,QAAQ,EAAE,WAAW,EAAE,EAAE,aAAa,2CAYhE"}
1
+ {"version":3,"file":"app-shell.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/layouts/app-shell/app-shell.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAoC,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAmBzE,UAAU,aAAa;IACrB,QAAQ,EAAE,SAAS,CAAC;IACpB,6CAA6C;IAC7C,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAiHD,wBAAgB,QAAQ,CAAC,EAAE,QAAQ,EAAE,WAAW,EAAE,EAAE,aAAa,2CAYhE"}
@@ -1,6 +1,6 @@
1
1
  'use client';
2
2
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
- import { useCallback, useEffect, useMemo, useState } from 'react';
3
+ import { useCallback, useEffect, useState } from 'react';
4
4
  import { useRouter } from 'next/navigation';
5
5
  import { SidebarProvider, SidebarInset } from '../../ui/sidebar.js';
6
6
  import { AppSidebar } from '../../layouts/app-sidebar/index.js';
@@ -57,6 +57,12 @@ function AppShellInner({ children, sidebarOpen }) {
57
57
  window.addEventListener('shep:pick-folder', handler);
58
58
  return () => window.removeEventListener('shep:pick-folder', handler);
59
59
  }, [handleAddRepository]);
60
+ // Listen for GitHub import event from (+) FAB
61
+ useEffect(() => {
62
+ const handler = () => setGithubDialogOpen(true);
63
+ window.addEventListener('shep:open-github-import', handler);
64
+ return () => window.removeEventListener('shep:open-github-import', handler);
65
+ }, []);
60
66
  const handleReactPickerSelect = useCallback((path) => {
61
67
  if (path) {
62
68
  window.dispatchEvent(new CustomEvent('shep:add-repository', { detail: { path } }));
@@ -73,11 +79,9 @@ function AppShellInner({ children, sidebarOpen }) {
73
79
  setShowReactPicker(false);
74
80
  }, onSelect: handleReactPickerSelect })] }));
75
81
  }
76
- /** Wraps children with TurnStatusesProvider, collecting scope IDs from sidebar features. */
82
+ /** Wraps children with TurnStatusesProvider (polls all active statuses from backend). */
77
83
  function TurnStatusesBridge({ children }) {
78
- const { features } = useSidebarFeaturesContext();
79
- const scopeIds = useMemo(() => ['global', ...features.map((f) => f.featureId)], [features]);
80
- return _jsx(TurnStatusesProvider, { scopeIds: scopeIds, children: children });
84
+ return _jsx(TurnStatusesProvider, { children: children });
81
85
  }
82
86
  export function AppShell({ children, sidebarOpen }) {
83
87
  return (_jsx(AgentEventsProvider, { children: _jsx(DrawerCloseGuardProvider, { children: _jsx(SidebarFeaturesProvider, { children: _jsx(TurnStatusesBridge, { children: _jsx(AppShellInner, { sidebarOpen: sidebarOpen, children: children }) }) }) }) }));
@@ -1,19 +1,15 @@
1
1
  import { type ReactNode } from 'react';
2
2
  import { type TurnStatus } from './use-turn-statuses.js';
3
- interface TurnStatusesProviderProps {
4
- /** All scope IDs to poll turn statuses for */
5
- scopeIds: string[];
6
- children: ReactNode;
7
- }
8
3
  /**
9
- * Polls turn statuses for all provided scope IDs in a single API call.
4
+ * Polls ALL active turn statuses in a single API call (no IDs needed).
10
5
  * Children use `useTurnStatus(scopeId)` to read individual statuses.
11
6
  */
12
- export declare function TurnStatusesProvider({ scopeIds, children }: TurnStatusesProviderProps): import("react/jsx-runtime").JSX.Element;
7
+ export declare function TurnStatusesProvider({ children }: {
8
+ children: ReactNode;
9
+ }): import("react/jsx-runtime").JSX.Element;
13
10
  /**
14
11
  * Get the turn status for a specific scope ID.
15
12
  * Must be used within a TurnStatusesProvider.
16
13
  */
17
14
  export declare function useTurnStatus(scopeId: string): TurnStatus;
18
- export {};
19
15
  //# sourceMappingURL=turn-statuses-provider.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"turn-statuses-provider.d.ts","sourceRoot":"","sources":["../../../../../src/presentation/web/hooks/turn-statuses-provider.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAsC,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAC3E,OAAO,EAAmB,KAAK,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAWvE,UAAU,yBAAyB;IACjC,8CAA8C;IAC9C,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,QAAQ,EAAE,SAAS,CAAC;CACrB;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,EAAE,yBAAyB,2CAWrF;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,UAAU,CAGzD"}
1
+ {"version":3,"file":"turn-statuses-provider.d.ts","sourceRoot":"","sources":["../../../../../src/presentation/web/hooks/turn-statuses-provider.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAsC,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAC3E,OAAO,EAAsB,KAAK,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAW1E;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,EAAE,QAAQ,EAAE,EAAE;IAAE,QAAQ,EAAE,SAAS,CAAA;CAAE,2CAWzE;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,UAAU,CAGzD"}
@@ -1,16 +1,16 @@
1
1
  'use client';
2
2
  import { jsx as _jsx } from "react/jsx-runtime";
3
3
  import { createContext, useContext, useMemo } from 'react';
4
- import { useTurnStatuses } from './use-turn-statuses.js';
4
+ import { useAllTurnStatuses } from './use-turn-statuses.js';
5
5
  const TurnStatusesContext = createContext({
6
6
  getStatus: () => 'idle',
7
7
  });
8
8
  /**
9
- * Polls turn statuses for all provided scope IDs in a single API call.
9
+ * Polls ALL active turn statuses in a single API call (no IDs needed).
10
10
  * Children use `useTurnStatus(scopeId)` to read individual statuses.
11
11
  */
12
- export function TurnStatusesProvider({ scopeIds, children }) {
13
- const statuses = useTurnStatuses(scopeIds);
12
+ export function TurnStatusesProvider({ children }) {
13
+ const statuses = useAllTurnStatuses();
14
14
  const value = useMemo(() => ({
15
15
  getStatus: (scopeId) => statuses[scopeId] ?? 'idle',
16
16
  }), [statuses]);
@@ -1,11 +1,10 @@
1
1
  export type TurnStatus = 'idle' | 'processing' | 'unread';
2
2
  /**
3
- * Polls turn statuses for multiple feature/scope IDs.
4
- * Returns a map of featureId TurnStatus for dot indicator rendering.
5
- *
6
- * Polls every 3 seconds to keep indicators responsive.
3
+ * Polls ALL active turn statuses from the backend.
4
+ * No IDs needed the backend returns every non-idle session status.
5
+ * Returns a map of scopeId → TurnStatus.
7
6
  */
8
- export declare function useTurnStatuses(featureIds: string[]): Record<string, TurnStatus>;
7
+ export declare function useAllTurnStatuses(): Record<string, TurnStatus>;
9
8
  /**
10
9
  * Marks a feature's chat as read (clears 'unread' → 'idle').
11
10
  */
@@ -1 +1 @@
1
- {"version":3,"file":"use-turn-statuses.d.ts","sourceRoot":"","sources":["../../../../../src/presentation/web/hooks/use-turn-statuses.ts"],"names":[],"mappings":"AAIA,MAAM,MAAM,UAAU,GAAG,MAAM,GAAG,YAAY,GAAG,QAAQ,CAAC;AAE1D;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,UAAU,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAgBhF;AAED;;GAEG;AACH,wBAAsB,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAEnE"}
1
+ {"version":3,"file":"use-turn-statuses.d.ts","sourceRoot":"","sources":["../../../../../src/presentation/web/hooks/use-turn-statuses.ts"],"names":[],"mappings":"AAIA,MAAM,MAAM,UAAU,GAAG,MAAM,GAAG,YAAY,GAAG,QAAQ,CAAC;AAE1D;;;;GAIG;AACH,wBAAgB,kBAAkB,IAAI,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAY/D;AAED;;GAEG;AACH,wBAAsB,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAEnE"}
@@ -1,25 +1,20 @@
1
1
  'use client';
2
2
  import { useQuery } from '@tanstack/react-query';
3
3
  /**
4
- * Polls turn statuses for multiple feature/scope IDs.
5
- * Returns a map of featureId TurnStatus for dot indicator rendering.
6
- *
7
- * Polls every 3 seconds to keep indicators responsive.
4
+ * Polls ALL active turn statuses from the backend.
5
+ * No IDs needed the backend returns every non-idle session status.
6
+ * Returns a map of scopeId → TurnStatus.
8
7
  */
9
- export function useTurnStatuses(featureIds) {
10
- const sortedIds = [...featureIds].sort().join(',');
8
+ export function useAllTurnStatuses() {
11
9
  const { data } = useQuery({
12
- queryKey: ['turn-statuses', sortedIds],
10
+ queryKey: ['turn-statuses'],
13
11
  queryFn: async () => {
14
- if (!sortedIds)
15
- return {};
16
- const res = await fetch(`/api/interactive/chat/turn-statuses?featureIds=${sortedIds}`);
12
+ const res = await fetch('/api/interactive/chat/turn-statuses');
17
13
  if (!res.ok)
18
14
  return {};
19
15
  return res.json();
20
16
  },
21
- refetchInterval: 3_000,
22
- enabled: featureIds.length > 0,
17
+ refetchInterval: 5_000,
23
18
  });
24
19
  return data ?? {};
25
20
  }