@shepai/cli 1.152.0 → 1.153.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (209) 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/interactive-session-service.interface.d.ts +5 -0
  4. package/dist/packages/core/src/application/ports/output/services/interactive-session-service.interface.d.ts.map +1 -1
  5. package/dist/packages/core/src/infrastructure/repositories/sqlite-interactive-session.repository.d.ts +1 -0
  6. package/dist/packages/core/src/infrastructure/repositories/sqlite-interactive-session.repository.d.ts.map +1 -1
  7. package/dist/packages/core/src/infrastructure/repositories/sqlite-interactive-session.repository.js +15 -0
  8. package/dist/packages/core/src/infrastructure/services/agents/common/executors/claude-code-interactive-executor.service.d.ts.map +1 -1
  9. package/dist/packages/core/src/infrastructure/services/agents/common/executors/claude-code-interactive-executor.service.js +8 -0
  10. package/dist/packages/core/src/infrastructure/services/interactive/interactive-session.service.d.ts +1 -0
  11. package/dist/packages/core/src/infrastructure/services/interactive/interactive-session.service.d.ts.map +1 -1
  12. package/dist/packages/core/src/infrastructure/services/interactive/interactive-session.service.js +51 -5
  13. package/dist/src/presentation/web/app/api/interactive/chat/turn-statuses/route.d.ts +4 -5
  14. package/dist/src/presentation/web/app/api/interactive/chat/turn-statuses/route.d.ts.map +1 -1
  15. package/dist/src/presentation/web/app/api/interactive/chat/turn-statuses/route.js +5 -13
  16. package/dist/src/presentation/web/components/common/floating-action-button/floating-action-button.d.ts +8 -2
  17. package/dist/src/presentation/web/components/common/floating-action-button/floating-action-button.d.ts.map +1 -1
  18. package/dist/src/presentation/web/components/common/floating-action-button/floating-action-button.js +10 -7
  19. package/dist/src/presentation/web/components/common/repository-node/repository-node.d.ts.map +1 -1
  20. package/dist/src/presentation/web/components/common/repository-node/repository-node.js +2 -3
  21. package/dist/src/presentation/web/components/features/chat/ChatSheet.d.ts.map +1 -1
  22. package/dist/src/presentation/web/components/features/chat/ChatSheet.js +43 -30
  23. package/dist/src/presentation/web/components/features/control-center/control-center-inner.d.ts.map +1 -1
  24. package/dist/src/presentation/web/components/features/control-center/control-center-inner.js +66 -3
  25. package/dist/src/presentation/web/components/features/features-canvas/canvas-toolbar.d.ts +1 -6
  26. package/dist/src/presentation/web/components/features/features-canvas/canvas-toolbar.d.ts.map +1 -1
  27. package/dist/src/presentation/web/components/features/features-canvas/canvas-toolbar.js +5 -6
  28. package/dist/src/presentation/web/components/features/features-canvas/features-canvas.js +1 -1
  29. package/dist/src/presentation/web/components/layouts/app-shell/app-shell.d.ts.map +1 -1
  30. package/dist/src/presentation/web/components/layouts/app-shell/app-shell.js +9 -5
  31. package/dist/src/presentation/web/hooks/turn-statuses-provider.d.ts +4 -8
  32. package/dist/src/presentation/web/hooks/turn-statuses-provider.d.ts.map +1 -1
  33. package/dist/src/presentation/web/hooks/turn-statuses-provider.js +4 -4
  34. package/dist/src/presentation/web/hooks/use-turn-statuses.d.ts +4 -5
  35. package/dist/src/presentation/web/hooks/use-turn-statuses.d.ts.map +1 -1
  36. package/dist/src/presentation/web/hooks/use-turn-statuses.js +7 -12
  37. package/dist/tsconfig.build.tsbuildinfo +1 -1
  38. package/package.json +1 -1
  39. package/web/.next/BUILD_ID +1 -1
  40. package/web/.next/build-manifest.json +2 -2
  41. package/web/.next/fallback-build-manifest.json +2 -2
  42. package/web/.next/prerender-manifest.json +3 -3
  43. package/web/.next/required-server-files.js +2 -2
  44. package/web/.next/required-server-files.json +2 -2
  45. package/web/.next/server/app/(dashboard)/@drawer/adopt/page/server-reference-manifest.json +28 -28
  46. package/web/.next/server/app/(dashboard)/@drawer/adopt/page.js.nft.json +1 -1
  47. package/web/.next/server/app/(dashboard)/@drawer/adopt/page_client-reference-manifest.js +1 -1
  48. package/web/.next/server/app/(dashboard)/@drawer/chat/page/server-reference-manifest.json +26 -26
  49. package/web/.next/server/app/(dashboard)/@drawer/chat/page.js.nft.json +1 -1
  50. package/web/.next/server/app/(dashboard)/@drawer/chat/page_client-reference-manifest.js +1 -1
  51. package/web/.next/server/app/(dashboard)/@drawer/create/page/server-reference-manifest.json +29 -29
  52. package/web/.next/server/app/(dashboard)/@drawer/create/page.js.nft.json +1 -1
  53. package/web/.next/server/app/(dashboard)/@drawer/create/page_client-reference-manifest.js +1 -1
  54. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page/server-reference-manifest.json +36 -36
  55. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page.js.nft.json +1 -1
  56. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page_client-reference-manifest.js +1 -1
  57. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page/server-reference-manifest.json +36 -36
  58. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js.nft.json +1 -1
  59. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page_client-reference-manifest.js +1 -1
  60. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/[tab]/page/server-reference-manifest.json +26 -26
  61. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/[tab]/page.js.nft.json +1 -1
  62. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/[tab]/page_client-reference-manifest.js +1 -1
  63. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page/server-reference-manifest.json +26 -26
  64. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js.nft.json +1 -1
  65. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  66. package/web/.next/server/app/(dashboard)/chat/page/server-reference-manifest.json +26 -26
  67. package/web/.next/server/app/(dashboard)/chat/page.js.nft.json +1 -1
  68. package/web/.next/server/app/(dashboard)/chat/page_client-reference-manifest.js +1 -1
  69. package/web/.next/server/app/(dashboard)/create/page/server-reference-manifest.json +29 -29
  70. package/web/.next/server/app/(dashboard)/create/page.js.nft.json +1 -1
  71. package/web/.next/server/app/(dashboard)/create/page_client-reference-manifest.js +1 -1
  72. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page/server-reference-manifest.json +36 -36
  73. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page.js.nft.json +1 -1
  74. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page_client-reference-manifest.js +1 -1
  75. package/web/.next/server/app/(dashboard)/feature/[featureId]/page/server-reference-manifest.json +36 -36
  76. package/web/.next/server/app/(dashboard)/feature/[featureId]/page.js.nft.json +1 -1
  77. package/web/.next/server/app/(dashboard)/feature/[featureId]/page_client-reference-manifest.js +1 -1
  78. package/web/.next/server/app/(dashboard)/page/server-reference-manifest.json +26 -26
  79. package/web/.next/server/app/(dashboard)/page.js.nft.json +1 -1
  80. package/web/.next/server/app/(dashboard)/page_client-reference-manifest.js +1 -1
  81. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/[tab]/page/server-reference-manifest.json +26 -26
  82. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/[tab]/page.js.nft.json +1 -1
  83. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/[tab]/page_client-reference-manifest.js +1 -1
  84. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page/server-reference-manifest.json +26 -26
  85. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js.nft.json +1 -1
  86. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  87. package/web/.next/server/app/_global-error.html +2 -2
  88. package/web/.next/server/app/_global-error.rsc +1 -1
  89. package/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  90. package/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  91. package/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  92. package/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  93. package/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  94. package/web/.next/server/app/_not-found/page/server-reference-manifest.json +5 -5
  95. package/web/.next/server/app/_not-found/page.js.nft.json +1 -1
  96. package/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  97. package/web/.next/server/app/settings/page/server-reference-manifest.json +8 -8
  98. package/web/.next/server/app/settings/page.js.nft.json +1 -1
  99. package/web/.next/server/app/settings/page_client-reference-manifest.js +1 -1
  100. package/web/.next/server/app/skills/page/server-reference-manifest.json +10 -10
  101. package/web/.next/server/app/skills/page.js.nft.json +1 -1
  102. package/web/.next/server/app/skills/page_client-reference-manifest.js +1 -1
  103. package/web/.next/server/app/tools/page/server-reference-manifest.json +10 -10
  104. package/web/.next/server/app/tools/page.js.nft.json +1 -1
  105. package/web/.next/server/app/tools/page_client-reference-manifest.js +1 -1
  106. package/web/.next/server/app/version/page/server-reference-manifest.json +5 -5
  107. package/web/.next/server/app/version/page.js.nft.json +1 -1
  108. package/web/.next/server/app/version/page_client-reference-manifest.js +1 -1
  109. package/web/.next/server/chunks/[root-of-the-server]__a402b567._.js +1 -1
  110. package/web/.next/server/chunks/[root-of-the-server]__ab4951b1._.js +1 -1
  111. package/web/.next/server/chunks/[root-of-the-server]__ab4951b1._.js.map +1 -1
  112. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js +1 -1
  113. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js.map +1 -1
  114. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_feature-drawer-client_tsx_e9755fc8._.js +2 -2
  115. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_feature-drawer-client_tsx_e9755fc8._.js.map +1 -1
  116. package/web/.next/server/chunks/ssr/[root-of-the-server]__17ed7ed1._.js +1 -1
  117. package/web/.next/server/chunks/ssr/[root-of-the-server]__17ed7ed1._.js.map +1 -1
  118. package/web/.next/server/chunks/ssr/[root-of-the-server]__28d0d265._.js +2 -2
  119. package/web/.next/server/chunks/ssr/[root-of-the-server]__357d99f9._.js +1 -1
  120. package/web/.next/server/chunks/ssr/[root-of-the-server]__42bf1807._.js +1 -1
  121. package/web/.next/server/chunks/ssr/[root-of-the-server]__42bf1807._.js.map +1 -1
  122. package/web/.next/server/chunks/ssr/[root-of-the-server]__56b70465._.js +1 -1
  123. package/web/.next/server/chunks/ssr/[root-of-the-server]__56b70465._.js.map +1 -1
  124. package/web/.next/server/chunks/ssr/[root-of-the-server]__88f7e8e6._.js +1 -1
  125. package/web/.next/server/chunks/ssr/[root-of-the-server]__88f7e8e6._.js.map +1 -1
  126. package/web/.next/server/chunks/ssr/[root-of-the-server]__8b0aac03._.js +1 -1
  127. package/web/.next/server/chunks/ssr/[root-of-the-server]__c30f1f82._.js +1 -1
  128. package/web/.next/server/chunks/ssr/[root-of-the-server]__c30f1f82._.js.map +1 -1
  129. package/web/.next/server/chunks/ssr/[root-of-the-server]__f80bfc75._.js +1 -1
  130. package/web/.next/server/chunks/ssr/[root-of-the-server]__f80bfc75._.js.map +1 -1
  131. package/web/.next/server/chunks/ssr/[root-of-the-server]__f8dd4422._.js +3 -0
  132. package/web/.next/server/chunks/ssr/[root-of-the-server]__f8dd4422._.js.map +1 -0
  133. package/web/.next/server/chunks/ssr/_05c23ad9._.js +1 -1
  134. package/web/.next/server/chunks/ssr/_05c23ad9._.js.map +1 -1
  135. package/web/.next/server/chunks/ssr/_16eb4fec._.js +1 -1
  136. package/web/.next/server/chunks/ssr/_16eb4fec._.js.map +1 -1
  137. package/web/.next/server/chunks/ssr/_3a0b989f._.js +2 -2
  138. package/web/.next/server/chunks/ssr/_3a0b989f._.js.map +1 -1
  139. package/web/.next/server/chunks/ssr/_56b9d60f._.js +1 -1
  140. package/web/.next/server/chunks/ssr/_56b9d60f._.js.map +1 -1
  141. package/web/.next/server/chunks/ssr/_5f69c13f._.js +1 -1
  142. package/web/.next/server/chunks/ssr/_5f69c13f._.js.map +1 -1
  143. package/web/.next/server/chunks/ssr/{_cf1c5b73._.js → _65e76c9a._.js} +2 -2
  144. package/web/.next/server/chunks/ssr/{_cf1c5b73._.js.map → _65e76c9a._.js.map} +1 -1
  145. package/web/.next/server/chunks/ssr/{_5fce01a7._.js → _75a563a9._.js} +2 -2
  146. package/web/.next/server/chunks/ssr/{_5fce01a7._.js.map → _75a563a9._.js.map} +1 -1
  147. package/web/.next/server/chunks/ssr/_7c5b97c6._.js +1 -1
  148. package/web/.next/server/chunks/ssr/_7c5b97c6._.js.map +1 -1
  149. package/web/.next/server/chunks/ssr/_82c57f10._.js +1 -1
  150. package/web/.next/server/chunks/ssr/_82c57f10._.js.map +1 -1
  151. package/web/.next/server/chunks/ssr/_9495d50b._.js +1 -1
  152. package/web/.next/server/chunks/ssr/_9495d50b._.js.map +1 -1
  153. package/web/.next/server/chunks/ssr/_a0e3f7e4._.js +1 -1
  154. package/web/.next/server/chunks/ssr/_a0e3f7e4._.js.map +1 -1
  155. package/web/.next/server/chunks/ssr/_ac4a3873._.js +1 -1
  156. package/web/.next/server/chunks/ssr/_ca0aa7f0._.js +1 -1
  157. package/web/.next/server/chunks/ssr/_ca0aa7f0._.js.map +1 -1
  158. package/web/.next/server/chunks/ssr/_cb5a021e._.js +1 -1
  159. package/web/.next/server/chunks/ssr/_cb5a021e._.js.map +1 -1
  160. package/web/.next/server/chunks/ssr/_d86175ae._.js +1 -1
  161. package/web/.next/server/chunks/ssr/_d86175ae._.js.map +1 -1
  162. package/web/.next/server/chunks/ssr/_d8bedf13._.js +1 -1
  163. package/web/.next/server/chunks/ssr/_d8bedf13._.js.map +1 -1
  164. package/web/.next/server/chunks/ssr/_d9337063._.js +3 -0
  165. package/web/.next/server/chunks/ssr/{_f78b4b9d._.js.map → _d9337063._.js.map} +1 -1
  166. package/web/.next/server/chunks/ssr/_e9a73a63._.js +1 -1
  167. package/web/.next/server/chunks/ssr/_e9a73a63._.js.map +1 -1
  168. package/web/.next/server/chunks/ssr/_fa7efce3._.js +2 -2
  169. package/web/.next/server/chunks/ssr/_fa7efce3._.js.map +1 -1
  170. package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_settings_settings-page-client_tsx_6ed9d5f8._.js +1 -1
  171. package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_settings_settings-page-client_tsx_6ed9d5f8._.js.map +1 -1
  172. package/web/.next/server/chunks/ssr/src_presentation_web_324a47da._.js +3 -0
  173. package/web/.next/server/chunks/ssr/src_presentation_web_324a47da._.js.map +1 -0
  174. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_skills_page_actions_cdc632e3.js +1 -1
  175. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_skills_page_actions_cdc632e3.js.map +1 -1
  176. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_tools_page_actions_39ca0924.js +1 -1
  177. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_tools_page_actions_39ca0924.js.map +1 -1
  178. package/web/.next/server/chunks/ssr/src_presentation_web_app_actions_open-ide_ts_baaca5d5._.js +1 -1
  179. package/web/.next/server/chunks/ssr/src_presentation_web_components_357e3eb0._.js +1 -1
  180. package/web/.next/server/chunks/ssr/src_presentation_web_components_357e3eb0._.js.map +1 -1
  181. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js +1 -1
  182. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js.map +1 -1
  183. package/web/.next/server/pages/500.html +2 -2
  184. package/web/.next/server/server-reference-manifest.js +1 -1
  185. package/web/.next/server/server-reference-manifest.json +45 -45
  186. package/web/.next/static/chunks/{a2257ffb1349f838.js → 11074feeacea0319.js} +1 -1
  187. package/web/.next/static/chunks/18abd4f8b9c216a3.js +1 -0
  188. package/web/.next/static/chunks/2a54cf0384becb8f.js +7 -0
  189. package/web/.next/static/chunks/34417fd25d41b914.js +1 -0
  190. package/web/.next/static/chunks/{f33efe6a12242a8a.js → 51df7b00bbb7d365.js} +1 -1
  191. package/web/.next/static/chunks/{1b4429259bbf3064.js → 58adaad3bab50e74.js} +2 -2
  192. package/web/.next/static/chunks/{277a7f64d4ec189d.js → 634f6f485b81464a.js} +1 -1
  193. package/web/.next/static/chunks/8bbc916241b4c141.js +1 -0
  194. package/web/.next/static/chunks/{f9a80d3854a8d453.js → 9c45b599460d0f60.js} +1 -1
  195. package/web/.next/static/chunks/{80c4c8b3a5c8e0b6.js → a0101660264c178b.js} +2 -2
  196. package/web/.next/static/chunks/{ef1c9f43aafff65f.js → b70bc188ac05a8be.js} +2 -2
  197. package/web/.next/static/chunks/c86594475dcb03d5.css +1 -0
  198. package/web/.next/static/chunks/{6bf775818e4ad42e.js → ebdef1415f61f021.js} +1 -1
  199. package/web/.next/server/chunks/ssr/[root-of-the-server]__563f2f7a._.js +0 -3
  200. package/web/.next/server/chunks/ssr/[root-of-the-server]__563f2f7a._.js.map +0 -1
  201. package/web/.next/server/chunks/ssr/_f78b4b9d._.js +0 -3
  202. package/web/.next/static/chunks/4908997348bd55f8.js +0 -1
  203. package/web/.next/static/chunks/76858a51f2fbe99a.js +0 -7
  204. package/web/.next/static/chunks/a919a9df4ab12a5c.css +0 -1
  205. package/web/.next/static/chunks/bdd340ad42a34b41.js +0 -1
  206. package/web/.next/static/chunks/ee20803fb301d59e.js +0 -1
  207. /package/web/.next/static/{lPbWG8a1RwBDDcvRngp58 → zY7W9Btxu_CXSFrwelXeS}/_buildManifest.js +0 -0
  208. /package/web/.next/static/{lPbWG8a1RwBDDcvRngp58 → zY7W9Btxu_CXSFrwelXeS}/_clientMiddlewareManifest.json +0 -0
  209. /package/web/.next/static/{lPbWG8a1RwBDDcvRngp58 → zY7W9Btxu_CXSFrwelXeS}/_ssgManifest.js +0 -0
@@ -69,5 +69,10 @@ export interface IInteractiveSessionRepository {
69
69
  * Returns a map of featureId → turnStatus for features that have an active session.
70
70
  */
71
71
  getTurnStatuses(featureIds: string[]): Promise<Map<string, string>>;
72
+ /**
73
+ * Get ALL non-idle turn statuses across all active sessions.
74
+ * Returns a map of featureId → turnStatus (only 'processing' | 'unread' entries).
75
+ */
76
+ getAllActiveTurnStatuses(): Promise<Map<string, string>>;
72
77
  }
73
78
  //# sourceMappingURL=interactive-session-repository.interface.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"interactive-session-repository.interface.d.ts","sourceRoot":"","sources":["../../../../../../../../packages/core/src/application/ports/output/repositories/interactive-session-repository.interface.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EACV,kBAAkB,EAClB,wBAAwB,EACzB,MAAM,wCAAwC,CAAC;AAEhD;;GAEG;AACH,MAAM,WAAW,6BAA6B;IAC5C;;OAEG;IACH,MAAM,CAAC,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEnD;;OAEG;IACH,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC,CAAC;IAEzD;;;;;OAKG;IACH,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC,CAAC;IAEvE;;;OAGG;IACH,aAAa,IAAI,OAAO,CAAC,kBAAkB,EAAE,CAAC,CAAC;IAE/C;;OAEG;IACH,YAAY,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,wBAAwB,EAAE,SAAS,CAAC,EAAE,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAE5F;;OAEG;IACH,kBAAkB,CAAC,EAAE,EAAE,MAAM,EAAE,cAAc,EAAE,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEpE;;;OAGG;IACH,oBAAoB,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAEtC;;;OAGG;IACH,mBAAmB,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;IAEvC;;;OAGG;IACH,oBAAoB,CAAC,EAAE,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAExE;;OAEG;IACH,iBAAiB,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAEtD;;;OAGG;IACH,gBAAgB,CAAC,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEhE;;;OAGG;IACH,eAAe,CAAC,UAAU,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;CACrE"}
1
+ {"version":3,"file":"interactive-session-repository.interface.d.ts","sourceRoot":"","sources":["../../../../../../../../packages/core/src/application/ports/output/repositories/interactive-session-repository.interface.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EACV,kBAAkB,EAClB,wBAAwB,EACzB,MAAM,wCAAwC,CAAC;AAEhD;;GAEG;AACH,MAAM,WAAW,6BAA6B;IAC5C;;OAEG;IACH,MAAM,CAAC,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEnD;;OAEG;IACH,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC,CAAC;IAEzD;;;;;OAKG;IACH,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC,CAAC;IAEvE;;;OAGG;IACH,aAAa,IAAI,OAAO,CAAC,kBAAkB,EAAE,CAAC,CAAC;IAE/C;;OAEG;IACH,YAAY,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,wBAAwB,EAAE,SAAS,CAAC,EAAE,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAE5F;;OAEG;IACH,kBAAkB,CAAC,EAAE,EAAE,MAAM,EAAE,cAAc,EAAE,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEpE;;;OAGG;IACH,oBAAoB,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAEtC;;;OAGG;IACH,mBAAmB,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;IAEvC;;;OAGG;IACH,oBAAoB,CAAC,EAAE,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAExE;;OAEG;IACH,iBAAiB,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAEtD;;;OAGG;IACH,gBAAgB,CAAC,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEhE;;;OAGG;IACH,eAAe,CAAC,UAAU,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IAEpE;;;OAGG;IACH,wBAAwB,IAAI,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;CAC1D"}
@@ -178,5 +178,10 @@ export interface IInteractiveSessionService {
178
178
  * Used by UI to show dot indicators on all chat buttons.
179
179
  */
180
180
  getTurnStatuses(featureIds: string[]): Promise<Map<string, string>>;
181
+ /**
182
+ * Get ALL non-idle turn statuses. No IDs needed — returns every
183
+ * active session's status ('processing' | 'unread').
184
+ */
185
+ getAllActiveTurnStatuses(): Promise<Map<string, string>>;
181
186
  }
182
187
  //# sourceMappingURL=interactive-session-service.interface.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"interactive-session-service.interface.d.ts","sourceRoot":"","sources":["../../../../../../../../packages/core/src/application/ports/output/services/interactive-session-service.interface.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"interactive-session-service.interface.d.ts","sourceRoot":"","sources":["../../../../../../../../packages/core/src/application/ports/output/services/interactive-session-service.interface.ts"],"names":[],"mappings":"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"}
@@ -23,5 +23,6 @@ export declare class SQLiteInteractiveSessionRepository implements IInteractiveS
23
23
  getAgentSessionId(id: string): Promise<string | null>;
24
24
  updateTurnStatus(id: string, turnStatus: string): Promise<void>;
25
25
  getTurnStatuses(featureIds: string[]): Promise<Map<string, string>>;
26
+ getAllActiveTurnStatuses(): Promise<Map<string, string>>;
26
27
  }
27
28
  //# sourceMappingURL=sqlite-interactive-session.repository.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"sqlite-interactive-session.repository.d.ts","sourceRoot":"","sources":["../../../../../../packages/core/src/infrastructure/repositories/sqlite-interactive-session.repository.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAE3C,OAAO,KAAK,EAAE,6BAA6B,EAAE,MAAM,yFAAyF,CAAC;AAC7I,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,kCAAkC,CAAC;AAC3E,OAAO,EAAE,wBAAwB,EAAE,MAAM,kCAAkC,CAAC;AAO5E,qBACa,kCAAmC,YAAW,6BAA6B;IAC1E,OAAO,CAAC,QAAQ,CAAC,EAAE;gBAAF,EAAE,EAAE,QAAQ,CAAC,QAAQ;IAE5C,MAAM,CAAC,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC;IAYlD,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC;IAOxD,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC;IAStE,aAAa,IAAI,OAAO,CAAC,kBAAkB,EAAE,CAAC;IAO9C,YAAY,CAChB,EAAE,EAAE,MAAM,EACV,MAAM,EAAE,wBAAwB,EAChC,SAAS,CAAC,EAAE,IAAI,GACf,OAAO,CAAC,IAAI,CAAC;IAeV,kBAAkB,CAAC,EAAE,EAAE,MAAM,EAAE,cAAc,EAAE,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAUnE,oBAAoB,IAAI,OAAO,CAAC,IAAI,CAAC;IAUrC,mBAAmB,IAAI,OAAO,CAAC,MAAM,CAAC;IAStC,oBAAoB,CAAC,EAAE,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAQvE,iBAAiB,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAOrD,gBAAgB,CAAC,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAQ/D,eAAe,CAAC,UAAU,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAwB1E"}
1
+ {"version":3,"file":"sqlite-interactive-session.repository.d.ts","sourceRoot":"","sources":["../../../../../../packages/core/src/infrastructure/repositories/sqlite-interactive-session.repository.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAE3C,OAAO,KAAK,EAAE,6BAA6B,EAAE,MAAM,yFAAyF,CAAC;AAC7I,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,kCAAkC,CAAC;AAC3E,OAAO,EAAE,wBAAwB,EAAE,MAAM,kCAAkC,CAAC;AAO5E,qBACa,kCAAmC,YAAW,6BAA6B;IAC1E,OAAO,CAAC,QAAQ,CAAC,EAAE;gBAAF,EAAE,EAAE,QAAQ,CAAC,QAAQ;IAE5C,MAAM,CAAC,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC;IAYlD,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC;IAOxD,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC;IAStE,aAAa,IAAI,OAAO,CAAC,kBAAkB,EAAE,CAAC;IAO9C,YAAY,CAChB,EAAE,EAAE,MAAM,EACV,MAAM,EAAE,wBAAwB,EAChC,SAAS,CAAC,EAAE,IAAI,GACf,OAAO,CAAC,IAAI,CAAC;IAeV,kBAAkB,CAAC,EAAE,EAAE,MAAM,EAAE,cAAc,EAAE,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAUnE,oBAAoB,IAAI,OAAO,CAAC,IAAI,CAAC;IAUrC,mBAAmB,IAAI,OAAO,CAAC,MAAM,CAAC;IAStC,oBAAoB,CAAC,EAAE,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAQvE,iBAAiB,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAOrD,gBAAgB,CAAC,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAQ/D,eAAe,CAAC,UAAU,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAyBnE,wBAAwB,IAAI,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAkB/D"}
@@ -114,6 +114,21 @@ let SQLiteInteractiveSessionRepository = class SQLiteInteractiveSessionRepositor
114
114
  }
115
115
  return result;
116
116
  }
117
+ async getAllActiveTurnStatuses() {
118
+ const result = new Map();
119
+ const rows = this.db
120
+ .prepare(`SELECT feature_id, turn_status FROM interactive_sessions
121
+ WHERE status IN ('booting','ready')
122
+ AND turn_status != 'idle'
123
+ ORDER BY created_at DESC`)
124
+ .all();
125
+ for (const row of rows) {
126
+ if (!result.has(row.feature_id)) {
127
+ result.set(row.feature_id, row.turn_status);
128
+ }
129
+ }
130
+ return result;
131
+ }
117
132
  };
118
133
  SQLiteInteractiveSessionRepository = __decorate([
119
134
  injectable(),
@@ -1 +1 @@
1
- {"version":3,"file":"claude-code-interactive-executor.service.d.ts","sourceRoot":"","sources":["../../../../../../../../../packages/core/src/infrastructure/services/agents/common/executors/claude-code-interactive-executor.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAOH,OAAO,KAAK,EACV,yBAAyB,EACzB,uBAAuB,EACvB,6BAA6B,EAE9B,MAAM,wFAAwF,CAAC;AAKhG,qBAAa,6BAA8B,YAAW,yBAAyB;IACvE,aAAa,CAAC,OAAO,EAAE,uBAAuB,GAAG,OAAO,CAAC,6BAA6B,CAAC;IAOvF,aAAa,CACjB,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,uBAAuB,GAC/B,OAAO,CAAC,6BAA6B,CAAC;IAOzC;;;;;OAKG;IACH,OAAO,CAAC,OAAO;IAUf,OAAO,CAAC,eAAe;IAUvB,OAAO,CAAC,WAAW;YAiBJ,SAAS;IASxB;;;;;;;;;;;;OAYG;IACH,OAAO,CAAC,aAAa;CA0MtB"}
1
+ {"version":3,"file":"claude-code-interactive-executor.service.d.ts","sourceRoot":"","sources":["../../../../../../../../../packages/core/src/infrastructure/services/agents/common/executors/claude-code-interactive-executor.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAOH,OAAO,KAAK,EACV,yBAAyB,EACzB,uBAAuB,EACvB,6BAA6B,EAE9B,MAAM,wFAAwF,CAAC;AAKhG,qBAAa,6BAA8B,YAAW,yBAAyB;IACvE,aAAa,CAAC,OAAO,EAAE,uBAAuB,GAAG,OAAO,CAAC,6BAA6B,CAAC;IAOvF,aAAa,CACjB,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,uBAAuB,GAC/B,OAAO,CAAC,6BAA6B,CAAC;IAOzC;;;;;OAKG;IACH,OAAO,CAAC,OAAO;IAUf,OAAO,CAAC,eAAe;IAkBvB,OAAO,CAAC,WAAW;YAiBJ,SAAS;IASxB;;;;;;;;;;;;OAYG;IACH,OAAO,CAAC,aAAa;CA0MtB"}
@@ -46,6 +46,14 @@ export class ClaudeCodeInteractiveExecutor {
46
46
  model: options.model ?? DEFAULT_MODEL,
47
47
  permissionMode: 'bypassPermissions',
48
48
  env: cleanEnv,
49
+ // Forward system prompt using preset+append pattern
50
+ ...(options.systemPrompt && {
51
+ systemPrompt: {
52
+ type: 'preset',
53
+ preset: 'claude_code',
54
+ append: options.systemPrompt,
55
+ },
56
+ }),
49
57
  };
50
58
  }
51
59
  wrapSession(sdkSession) {
@@ -66,6 +66,7 @@ export declare class InteractiveSessionService implements IInteractiveSessionSer
66
66
  stopByFeature(featureId: string): Promise<void>;
67
67
  markRead(featureId: string): Promise<void>;
68
68
  getTurnStatuses(featureIds: string[]): Promise<Map<string, string>>;
69
+ getAllActiveTurnStatuses(): Promise<Map<string, string>>;
69
70
  /** Find the in-memory state for an active session for a feature. */
70
71
  private findActiveStateForFeature;
71
72
  /** Resolve the agent type from an explicit override or settings. */
@@ -1 +1 @@
1
- {"version":3,"file":"interactive-session.service.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/src/infrastructure/services/interactive/interactive-session.service.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"interactive-session.service.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/src/infrastructure/services/interactive/interactive-session.service.ts"],"names":[],"mappings":"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"}
@@ -103,6 +103,8 @@ export class InteractiveSessionService {
103
103
  currentAssistantBuffer: '',
104
104
  toolEventsLog: [],
105
105
  subscribers: new Set(),
106
+ turnInProgress: false,
107
+ turnQueue: [],
106
108
  };
107
109
  this.sessions.set(session.id, state);
108
110
  // Fire-and-forget the async boot sequence. The API returns the session
@@ -343,11 +345,13 @@ export class InteractiveSessionService {
343
345
  }
344
346
  // eslint-disable-next-line no-console
345
347
  console.log(`[InteractiveSession] stopSession called for ${sessionId} (feature: ${state.featureId})`, new Error().stack?.split('\n').slice(1, 4).join(' <- '));
346
- // Abort any active stream iteration
348
+ // Abort any active stream iteration and clear pending turns
347
349
  if (state.streamAbort) {
348
350
  state.streamAbort.abort();
349
351
  state.streamAbort = undefined;
350
352
  }
353
+ state.turnQueue.length = 0;
354
+ state.turnInProgress = false;
351
355
  this.clearTimer(state);
352
356
  // Cache agentSessionId so resumption works when session restarts
353
357
  if (state.agentSessionId) {
@@ -391,8 +395,14 @@ export class InteractiveSessionService {
391
395
  // Reset idle timer on user activity
392
396
  this.resetTimer(state);
393
397
  await this.sessionRepo.updateLastActivity(sessionId, now);
394
- // Execute turn via SDK handle fire-and-forget, response streams to subscribers
395
- void this.executeAndPersistTurn(state, content);
398
+ // Guard: only one turn at a time per session (SDK stream is not concurrent-safe)
399
+ if (state.turnInProgress) {
400
+ state.turnQueue.push(content);
401
+ }
402
+ else {
403
+ state.turnInProgress = true;
404
+ void this.executeAndPersistTurn(state, content);
405
+ }
396
406
  return message;
397
407
  }
398
408
  /**
@@ -555,6 +565,24 @@ export class InteractiveSessionService {
555
565
  state.toolEventsLog = [];
556
566
  state.subscribers.forEach((sub) => sub({ delta: '', done: true }));
557
567
  }
568
+ else if (!responseText) {
569
+ // Stream ended without any response — SDK session likely died.
570
+ // Mark as error so the next message triggers a fresh session.
571
+ // eslint-disable-next-line no-console
572
+ console.error(`[InteractiveSession] stream ended without response for session ${state.sessionId} — session may have died`);
573
+ state.subscribers.forEach((sub) => sub({ delta: '', done: true, log: 'Session disconnected — will restart on next message' }));
574
+ if (state.agentSessionId) {
575
+ this.stoppedAgentSessionIds.set(state.featureId, state.agentSessionId);
576
+ }
577
+ this.sessions.delete(state.sessionId);
578
+ try {
579
+ await this.sessionRepo.updateStatus(state.sessionId, InteractiveSessionStatus.error);
580
+ }
581
+ catch {
582
+ // Best-effort DB update
583
+ }
584
+ return; // Skip queue drain — session is dead
585
+ }
558
586
  }
559
587
  catch (err) {
560
588
  // If session was already stopped, ignore
@@ -563,6 +591,15 @@ export class InteractiveSessionService {
563
591
  // eslint-disable-next-line no-console
564
592
  console.error(`[InteractiveSession] turn failed for session ${state.sessionId}:`, err);
565
593
  }
594
+ finally {
595
+ // Release the turn lock and drain the queue
596
+ state.turnInProgress = false;
597
+ if (this.sessions.has(state.sessionId) && state.turnQueue.length > 0) {
598
+ const nextContent = state.turnQueue.shift();
599
+ state.turnInProgress = true;
600
+ void this.executeAndPersistTurn(state, nextContent);
601
+ }
602
+ }
566
603
  }
567
604
  async getMessages(featureId, limit) {
568
605
  return this.messageRepo.findByFeatureId(featureId, limit);
@@ -609,10 +646,16 @@ export class InteractiveSessionService {
609
646
  if (state) {
610
647
  const dbSession = await this.sessionRepo.findById(state.sessionId);
611
648
  if (dbSession?.status === InteractiveSessionStatus.ready) {
612
- // Session ready — send to agent
649
+ // Session ready — send to agent (guarded: one turn at a time)
613
650
  this.resetTimer(state);
614
651
  await this.sessionRepo.updateLastActivity(state.sessionId, now);
615
- void this.executeAndPersistTurn(state, content);
652
+ if (state.turnInProgress) {
653
+ state.turnQueue.push(content);
654
+ }
655
+ else {
656
+ state.turnInProgress = true;
657
+ void this.executeAndPersistTurn(state, content);
658
+ }
616
659
  }
617
660
  else if (dbSession?.status === InteractiveSessionStatus.booting) {
618
661
  // Session booting — queue the message
@@ -750,6 +793,9 @@ export class InteractiveSessionService {
750
793
  async getTurnStatuses(featureIds) {
751
794
  return this.sessionRepo.getTurnStatuses(featureIds);
752
795
  }
796
+ async getAllActiveTurnStatuses() {
797
+ return this.sessionRepo.getAllActiveTurnStatuses();
798
+ }
753
799
  /** Find the in-memory state for an active session for a feature. */
754
800
  findActiveStateForFeature(featureId) {
755
801
  for (const state of this.sessions.values()) {
@@ -1,13 +1,12 @@
1
1
  /**
2
2
  * Bulk turn-status API.
3
3
  *
4
- * GET /api/interactive/chat/turn-statuses?featureIds=id1,id2,...
4
+ * GET /api/interactive/chat/turn-statuses
5
5
  *
6
- * Returns a map of featureId turnStatus ('idle' | 'processing' | 'unread')
7
- * for all requested features. Used by UI dot indicators on chat buttons.
6
+ * Returns ALL non-idle turn statuses as { featureId: turnStatus }.
7
+ * No parameters needed the backend knows which sessions are active.
8
8
  */
9
- import type { NextRequest } from 'next/server';
10
9
  import { NextResponse } from 'next/server';
11
10
  export declare const dynamic = "force-dynamic";
12
- export declare function GET(request: NextRequest): Promise<NextResponse>;
11
+ export declare function GET(): Promise<NextResponse>;
13
12
  //# sourceMappingURL=route.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"route.d.ts","sourceRoot":"","sources":["../../../../../../../../../src/presentation/web/app/api/interactive/chat/turn-statuses/route.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAI3C,eAAO,MAAM,OAAO,kBAAkB,CAAC;AAEvC,wBAAsB,GAAG,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,YAAY,CAAC,CA8BrE"}
1
+ {"version":3,"file":"route.d.ts","sourceRoot":"","sources":["../../../../../../../../../src/presentation/web/app/api/interactive/chat/turn-statuses/route.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAI3C,eAAO,MAAM,OAAO,kBAAkB,CAAC;AAEvC,wBAAsB,GAAG,IAAI,OAAO,CAAC,YAAY,CAAC,CAoBjD"}
@@ -1,26 +1,18 @@
1
1
  /**
2
2
  * Bulk turn-status API.
3
3
  *
4
- * GET /api/interactive/chat/turn-statuses?featureIds=id1,id2,...
4
+ * GET /api/interactive/chat/turn-statuses
5
5
  *
6
- * Returns a map of featureId turnStatus ('idle' | 'processing' | 'unread')
7
- * for all requested features. Used by UI dot indicators on chat buttons.
6
+ * Returns ALL non-idle turn statuses as { featureId: turnStatus }.
7
+ * No parameters needed the backend knows which sessions are active.
8
8
  */
9
9
  import { NextResponse } from 'next/server';
10
10
  import { resolve } from '../../../../../lib/server-container.js';
11
11
  export const dynamic = 'force-dynamic';
12
- export async function GET(request) {
12
+ export async function GET() {
13
13
  try {
14
- const featureIdsParam = request.nextUrl.searchParams.get('featureIds');
15
- if (!featureIdsParam) {
16
- return NextResponse.json({});
17
- }
18
- const featureIds = featureIdsParam.split(',').filter(Boolean);
19
- if (featureIds.length === 0) {
20
- return NextResponse.json({});
21
- }
22
14
  const service = resolve('IInteractiveSessionService');
23
- const statuses = await service.getTurnStatuses(featureIds);
15
+ const statuses = await service.getAllActiveTurnStatuses();
24
16
  // Convert Map to plain object for JSON serialization
25
17
  const result = {};
26
18
  for (const [id, status] of statuses) {
@@ -16,8 +16,14 @@ export interface FloatingActionButtonAction {
16
16
  export interface FloatingActionButtonProps {
17
17
  /** Action items shown when the FAB is expanded. */
18
18
  actions: FloatingActionButtonAction[];
19
- /** Additional CSS classes for the container. */
19
+ /** Additional CSS classes for the wrapper. */
20
20
  className?: string;
21
+ /** Inline styles for the wrapper (e.g. dynamic positioning). */
22
+ style?: React.CSSProperties;
21
23
  }
22
- export declare function FloatingActionButton({ actions, className }: FloatingActionButtonProps): import("react/jsx-runtime").JSX.Element;
24
+ /**
25
+ * (+) FAB with expandable action menu.
26
+ * Renders inline — parent controls positioning.
27
+ */
28
+ export declare function FloatingActionButton({ actions, className, style }: FloatingActionButtonProps): import("react/jsx-runtime").JSX.Element;
23
29
  //# sourceMappingURL=floating-action-button.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"floating-action-button.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/floating-action-button/floating-action-button.tsx"],"names":[],"mappings":"AAEA,OAAO,KAA8B,MAAM,OAAO,CAAC;AAKnD,MAAM,WAAW,0BAA0B;IACzC,iCAAiC;IACjC,EAAE,EAAE,MAAM,CAAC;IACX,+CAA+C;IAC/C,KAAK,EAAE,MAAM,CAAC;IACd,6BAA6B;IAC7B,IAAI,EAAE,KAAK,CAAC,SAAS,CAAC;IACtB,yCAAyC;IACzC,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,+CAA+C;IAC/C,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,sCAAsC;IACtC,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,yBAAyB;IACxC,mDAAmD;IACnD,OAAO,EAAE,0BAA0B,EAAE,CAAC;IACtC,gDAAgD;IAChD,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAQD,wBAAgB,oBAAoB,CAAC,EAAE,OAAO,EAAE,SAAS,EAAE,EAAE,yBAAyB,2CA2GrF"}
1
+ {"version":3,"file":"floating-action-button.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/floating-action-button/floating-action-button.tsx"],"names":[],"mappings":"AAEA,OAAO,KAA8B,MAAM,OAAO,CAAC;AAKnD,MAAM,WAAW,0BAA0B;IACzC,iCAAiC;IACjC,EAAE,EAAE,MAAM,CAAC;IACX,+CAA+C;IAC/C,KAAK,EAAE,MAAM,CAAC;IACd,6BAA6B;IAC7B,IAAI,EAAE,KAAK,CAAC,SAAS,CAAC;IACtB,yCAAyC;IACzC,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,+CAA+C;IAC/C,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,sCAAsC;IACtC,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,yBAAyB;IACxC,mDAAmD;IACnD,OAAO,EAAE,0BAA0B,EAAE,CAAC;IACtC,8CAA8C;IAC9C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,gEAAgE;IAChE,KAAK,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;CAC7B;AAQD;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,EAAE,yBAAyB,2CAyG5F"}
@@ -8,7 +8,11 @@ import { Button } from '../../ui/button.js';
8
8
  const STAGGER_MS = 50;
9
9
  /** Total animation duration in ms. */
10
10
  const DURATION_MS = 250;
11
- export function FloatingActionButton({ actions, className }) {
11
+ /**
12
+ * (+) FAB with expandable action menu.
13
+ * Renders inline — parent controls positioning.
14
+ */
15
+ export function FloatingActionButton({ actions, className, style }) {
12
16
  const [open, setOpen] = useState(false);
13
17
  // Close on Escape key
14
18
  useEffect(() => {
@@ -22,14 +26,13 @@ export function FloatingActionButton({ actions, className }) {
22
26
  document.addEventListener('keydown', handleKeyDown);
23
27
  return () => document.removeEventListener('keydown', handleKeyDown);
24
28
  }, [open]);
25
- return (_jsxs(_Fragment, { children: [open ? (_jsx("div", { "data-testid": "fab-overlay", className: "fixed inset-0 z-40", onClick: () => setOpen(false), "aria-hidden": "true" })) : null, _jsxs("div", { "data-testid": "floating-action-button", className: cn('fixed right-6 bottom-6 z-50', className), children: [_jsx("div", { className: cn('absolute right-[calc(100%+12px)] bottom-0 flex flex-col items-end gap-2', !open && 'pointer-events-none'), "data-testid": "fab-actions", children: actions.map((action, i) => {
29
+ return (_jsxs(_Fragment, { children: [open ? (_jsx("div", { "data-testid": "fab-overlay", className: "fixed inset-0 z-40", onClick: () => setOpen(false), "aria-hidden": "true" })) : null, _jsxs("div", { "data-testid": "floating-action-button", className: cn('relative z-50', className), style: style, children: [_jsx("div", { className: cn('absolute bottom-[calc(100%+24px)] left-0 flex flex-col items-start gap-2', !open && 'pointer-events-none'), "data-testid": "fab-actions", children: actions.map((action, i) => {
26
30
  const openDelay = (actions.length - 1 - i) * STAGGER_MS;
27
- const closeDelay = i * STAGGER_MS;
28
- return (_jsxs("button", { "data-testid": `fab-action-${action.id}`, "aria-label": action.label, disabled: action.disabled ?? action.loading, className: cn('flex h-12 w-52 items-center justify-center gap-3 rounded-full px-4', 'bg-background text-foreground shadow-sm', 'border-border border', 'hover:bg-accent hover:text-accent-foreground', 'disabled:pointer-events-none disabled:opacity-50', open ? 'translate-x-0 opacity-100' : 'pointer-events-none translate-x-0 opacity-0'), style: {
29
- transition: `opacity ${open ? DURATION_MS : 150}ms ease-out ${open ? openDelay : closeDelay}ms`,
31
+ return (_jsxs("button", { "data-testid": `fab-action-${action.id}`, "aria-label": action.label, disabled: action.disabled ?? action.loading, className: cn('flex h-10 items-center gap-2.5 rounded-full px-4', 'bg-background text-foreground shadow-md', 'border-border border', 'hover:bg-accent hover:text-accent-foreground', 'disabled:pointer-events-none disabled:opacity-50', 'text-sm font-medium whitespace-nowrap', open ? 'translate-y-0 opacity-100' : 'pointer-events-none translate-y-0 opacity-0'), style: {
32
+ transition: `opacity ${open ? DURATION_MS : 120}ms ease-out ${open ? openDelay : 0}ms, transform ${open ? DURATION_MS : 120}ms ease-out ${open ? openDelay : 0}ms`,
30
33
  }, onClick: () => {
31
34
  action.onClick();
32
35
  setOpen(false);
33
- }, children: [_jsx("span", { className: "flex h-5 w-5 shrink-0 items-center justify-center", children: action.loading ? _jsx(Loader2, { className: "h-5 w-5 animate-spin" }) : action.icon }), _jsx("span", { className: "text-sm font-medium whitespace-nowrap", children: action.label })] }, action.id));
34
- }) }), _jsx("div", { className: "flex items-center", children: _jsxs(Button, { size: "icon", "data-testid": "fab-trigger", "aria-label": open ? 'Close actions' : 'Open actions', className: cn('relative h-14 w-14 rounded-full shadow-lg', 'bg-indigo-500 text-white hover:bg-indigo-400 dark:bg-indigo-500 dark:hover:bg-indigo-400', 'transition-all duration-200 hover:scale-105 hover:shadow-xl active:scale-95'), onClick: () => setOpen((prev) => !prev), children: [_jsx(Plus, { className: cn('absolute h-8 w-8 stroke-[2.5] transition-all', open ? 'scale-0 rotate-90 opacity-0' : 'scale-100 rotate-0 opacity-100'), style: { transitionDuration: `${DURATION_MS}ms` } }), _jsx(X, { className: cn('absolute h-8 w-8 stroke-[2.5] transition-all', open ? 'scale-100 rotate-0 opacity-100' : 'scale-0 -rotate-90 opacity-0'), style: { transitionDuration: `${DURATION_MS}ms` } })] }) })] })] }));
36
+ }, children: [_jsx("span", { className: "flex h-5 w-5 shrink-0 items-center justify-center", children: action.loading ? _jsx(Loader2, { className: "h-4 w-4 animate-spin" }) : action.icon }), _jsx("span", { children: action.label })] }, action.id));
37
+ }) }), _jsxs(Button, { size: "icon", "data-testid": "fab-trigger", "aria-label": open ? 'Close actions' : 'Create new', className: cn('relative h-14 w-14 rounded-full shadow-lg', 'bg-indigo-500 text-white hover:bg-indigo-400 dark:bg-indigo-500 dark:hover:bg-indigo-400', 'transition-all duration-200 hover:scale-105 hover:shadow-xl active:scale-95'), onClick: () => setOpen((prev) => !prev), children: [_jsx(Plus, { className: cn('absolute h-7 w-7 stroke-[2.5] transition-all', open ? 'scale-0 rotate-90 opacity-0' : 'scale-100 rotate-0 opacity-100'), style: { transitionDuration: `${DURATION_MS}ms` } }), _jsx(X, { className: cn('absolute h-6 w-6 stroke-[2.5] transition-all', open ? 'scale-100 rotate-0 opacity-100' : 'scale-0 -rotate-90 opacity-0'), style: { transitionDuration: `${DURATION_MS}ms` } })] })] })] }));
35
38
  }
@@ -1 +1 @@
1
- {"version":3,"file":"repository-node.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/repository-node/repository-node.tsx"],"names":[],"mappings":"AAoCA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AASnE,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,2CAicA"}
1
+ {"version":3,"file":"repository-node.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/repository-node/repository-node.tsx"],"names":[],"mappings":"AAoCA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AASnE,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,2CAgcA"}
@@ -13,15 +13,14 @@ 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 { ChatDotIndicator } from '../../features/chat/ChatDotIndicator.js';
16
- import { useTurnStatuses } from '../../../hooks/use-turn-statuses.js';
16
+ import { useTurnStatus } from '../../../hooks/turn-statuses-provider.js';
17
17
  import { FeatureSessionsDropdown, } from '../../common/feature-node/feature-sessions-dropdown.js';
18
18
  export function RepositoryNode({ data, selected, }) {
19
19
  const router = useRouter();
20
20
  const featureFlags = useFeatureFlags();
21
21
  const [confirmOpen, setConfirmOpen] = useState(false);
22
22
  const repoScopeId = data.id ? `repo-${data.id}` : `repo-${data.name}`;
23
- const turnStatuses = useTurnStatuses([repoScopeId]);
24
- const chatTurnStatus = turnStatuses[repoScopeId] ?? 'idle';
23
+ const chatTurnStatus = useTurnStatus(repoScopeId);
25
24
  const actions = useRepositoryActions(data.repositoryPath ? { repositoryId: data.id, repositoryPath: data.repositoryPath } : null);
26
25
  const deployAction = useDeployAction(data.repositoryPath
27
26
  ? {
@@ -1 +1 @@
1
- {"version":3,"file":"ChatSheet.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/features/chat/ChatSheet.tsx"],"names":[],"mappings":"AAmDA,wBAAgB,eAAe,4CAyX9B"}
1
+ {"version":3,"file":"ChatSheet.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/features/chat/ChatSheet.tsx"],"names":[],"mappings":"AAwDA,wBAAgB,eAAe,4CA+X9B"}
@@ -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"}