@shepai/cli 1.166.1 → 1.167.0-pr478.acc6626

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 (404) hide show
  1. package/dist/packages/core/src/application/index.d.ts +1 -0
  2. package/dist/packages/core/src/application/index.d.ts.map +1 -1
  3. package/dist/packages/core/src/application/index.js +1 -0
  4. package/dist/packages/core/src/application/ports/output/agents/agent-run-repository.interface.d.ts +12 -0
  5. package/dist/packages/core/src/application/ports/output/agents/agent-run-repository.interface.d.ts.map +1 -1
  6. package/dist/packages/core/src/application/ports/output/agents/interactive-agent-executor.interface.d.ts +38 -2
  7. package/dist/packages/core/src/application/ports/output/agents/interactive-agent-executor.interface.d.ts.map +1 -1
  8. package/dist/packages/core/src/application/ports/output/services/interactive-session-service.interface.d.ts +16 -1
  9. package/dist/packages/core/src/application/ports/output/services/interactive-session-service.interface.d.ts.map +1 -1
  10. package/dist/packages/core/src/application/use-cases/features/update-feature-pinned-config.use-case.d.ts +24 -0
  11. package/dist/packages/core/src/application/use-cases/features/update-feature-pinned-config.use-case.d.ts.map +1 -0
  12. package/dist/packages/core/src/application/use-cases/features/update-feature-pinned-config.use-case.js +107 -0
  13. package/dist/packages/core/src/application/use-cases/interactive/index.d.ts +2 -0
  14. package/dist/packages/core/src/application/use-cases/interactive/index.d.ts.map +1 -1
  15. package/dist/packages/core/src/application/use-cases/interactive/index.js +1 -0
  16. package/dist/packages/core/src/application/use-cases/interactive/respond-to-interaction.use-case.d.ts +17 -0
  17. package/dist/packages/core/src/application/use-cases/interactive/respond-to-interaction.use-case.d.ts.map +1 -0
  18. package/dist/packages/core/src/application/use-cases/interactive/respond-to-interaction.use-case.js +34 -0
  19. package/dist/packages/core/src/application/use-cases/repositories/delete-repository.use-case.d.ts.map +1 -1
  20. package/dist/packages/core/src/application/use-cases/repositories/delete-repository.use-case.js +6 -2
  21. package/dist/packages/core/src/infrastructure/di/container.d.ts.map +1 -1
  22. package/dist/packages/core/src/infrastructure/di/container.js +10 -0
  23. package/dist/packages/core/src/infrastructure/repositories/agent-run.repository.d.ts +2 -1
  24. package/dist/packages/core/src/infrastructure/repositories/agent-run.repository.d.ts.map +1 -1
  25. package/dist/packages/core/src/infrastructure/repositories/agent-run.repository.js +15 -0
  26. package/dist/packages/core/src/infrastructure/services/agents/common/executors/claude-code-interactive-executor.service.d.ts +3 -0
  27. package/dist/packages/core/src/infrastructure/services/agents/common/executors/claude-code-interactive-executor.service.d.ts.map +1 -1
  28. package/dist/packages/core/src/infrastructure/services/agents/common/executors/claude-code-interactive-executor.service.js +59 -6
  29. package/dist/packages/core/src/infrastructure/services/interactive/interactive-session.service.d.ts +7 -0
  30. package/dist/packages/core/src/infrastructure/services/interactive/interactive-session.service.d.ts.map +1 -1
  31. package/dist/packages/core/src/infrastructure/services/interactive/interactive-session.service.js +101 -1
  32. package/dist/packages/core/src/infrastructure/services/web-server.service.d.ts +3 -0
  33. package/dist/packages/core/src/infrastructure/services/web-server.service.d.ts.map +1 -1
  34. package/dist/packages/core/src/infrastructure/services/web-server.service.js +10 -0
  35. package/dist/src/presentation/web/app/actions/update-feature-pinned-config.d.ts +5 -0
  36. package/dist/src/presentation/web/app/actions/update-feature-pinned-config.d.ts.map +1 -0
  37. package/dist/src/presentation/web/app/actions/update-feature-pinned-config.js +29 -0
  38. package/dist/src/presentation/web/app/api/interactive/chat/[featureId]/respond/route.d.ts +19 -0
  39. package/dist/src/presentation/web/app/api/interactive/chat/[featureId]/respond/route.d.ts.map +1 -0
  40. package/dist/src/presentation/web/app/api/interactive/chat/[featureId]/respond/route.js +33 -0
  41. package/dist/src/presentation/web/app/api/interactive/chat/[featureId]/stream/route.d.ts.map +1 -1
  42. package/dist/src/presentation/web/app/api/interactive/chat/[featureId]/stream/route.js +7 -0
  43. package/dist/src/presentation/web/app/layout.d.ts +0 -1
  44. package/dist/src/presentation/web/app/layout.d.ts.map +1 -1
  45. package/dist/src/presentation/web/app/layout.js +0 -1
  46. package/dist/src/presentation/web/components/assistant-ui/thread.d.ts +3 -2
  47. package/dist/src/presentation/web/components/assistant-ui/thread.d.ts.map +1 -1
  48. package/dist/src/presentation/web/components/assistant-ui/thread.js +26 -3
  49. package/dist/src/presentation/web/components/common/control-center-drawer/feature-drawer-client.d.ts.map +1 -1
  50. package/dist/src/presentation/web/components/common/control-center-drawer/feature-drawer-client.js +100 -9
  51. package/dist/src/presentation/web/components/common/feature-drawer-tabs/feature-drawer-tabs.d.ts +4 -1
  52. package/dist/src/presentation/web/components/common/feature-drawer-tabs/feature-drawer-tabs.d.ts.map +1 -1
  53. package/dist/src/presentation/web/components/common/feature-drawer-tabs/feature-drawer-tabs.js +3 -3
  54. package/dist/src/presentation/web/components/common/feature-drawer-tabs/overview-tab.d.ts +3 -1
  55. package/dist/src/presentation/web/components/common/feature-drawer-tabs/overview-tab.d.ts.map +1 -1
  56. package/dist/src/presentation/web/components/common/feature-drawer-tabs/overview-tab.js +21 -10
  57. package/dist/src/presentation/web/components/common/feature-drawer-tabs/overview-tab.stories.d.ts +4 -0
  58. package/dist/src/presentation/web/components/common/feature-drawer-tabs/overview-tab.stories.d.ts.map +1 -1
  59. package/dist/src/presentation/web/components/common/feature-drawer-tabs/overview-tab.stories.js +33 -0
  60. package/dist/src/presentation/web/components/common/feature-drawer-tabs/pinned-config-utils.d.ts +18 -0
  61. package/dist/src/presentation/web/components/common/feature-drawer-tabs/pinned-config-utils.d.ts.map +1 -0
  62. package/dist/src/presentation/web/components/common/feature-drawer-tabs/pinned-config-utils.js +17 -0
  63. package/dist/src/presentation/web/components/common/react-file-manager-dialog/react-file-manager-dialog.d.ts.map +1 -1
  64. package/dist/src/presentation/web/components/common/react-file-manager-dialog/react-file-manager-dialog.js +68 -56
  65. package/dist/src/presentation/web/components/features/chat/ChatDotIndicator.d.ts +1 -0
  66. package/dist/src/presentation/web/components/features/chat/ChatDotIndicator.d.ts.map +1 -1
  67. package/dist/src/presentation/web/components/features/chat/ChatDotIndicator.js +7 -1
  68. package/dist/src/presentation/web/components/features/chat/ChatDotIndicator.stories.d.ts +1 -0
  69. package/dist/src/presentation/web/components/features/chat/ChatDotIndicator.stories.d.ts.map +1 -1
  70. package/dist/src/presentation/web/components/features/chat/ChatDotIndicator.stories.js +3 -0
  71. package/dist/src/presentation/web/components/features/chat/ChatSheet.d.ts.map +1 -1
  72. package/dist/src/presentation/web/components/features/chat/ChatSheet.js +3 -1
  73. package/dist/src/presentation/web/components/features/chat/ChatTab.d.ts.map +1 -1
  74. package/dist/src/presentation/web/components/features/chat/ChatTab.js +3 -2
  75. package/dist/src/presentation/web/components/features/chat/InteractionBubble.d.ts +33 -0
  76. package/dist/src/presentation/web/components/features/chat/InteractionBubble.d.ts.map +1 -0
  77. package/dist/src/presentation/web/components/features/chat/InteractionBubble.js +155 -0
  78. package/dist/src/presentation/web/components/features/chat/InteractionBubble.stories.d.ts +22 -0
  79. package/dist/src/presentation/web/components/features/chat/InteractionBubble.stories.d.ts.map +1 -0
  80. package/dist/src/presentation/web/components/features/chat/InteractionBubble.stories.js +107 -0
  81. package/dist/src/presentation/web/components/features/chat/useChatRuntime.d.ts +16 -0
  82. package/dist/src/presentation/web/components/features/chat/useChatRuntime.d.ts.map +1 -1
  83. package/dist/src/presentation/web/components/features/chat/useChatRuntime.js +62 -1
  84. package/dist/src/presentation/web/components/features/control-center/control-center-inner.d.ts.map +1 -1
  85. package/dist/src/presentation/web/components/features/control-center/control-center-inner.js +18 -3
  86. package/dist/src/presentation/web/components/features/control-center/use-control-center-state.d.ts +1 -0
  87. package/dist/src/presentation/web/components/features/control-center/use-control-center-state.d.ts.map +1 -1
  88. package/dist/src/presentation/web/components/features/control-center/use-control-center-state.js +1 -1
  89. package/dist/src/presentation/web/components/features/settings/AgentModelPicker/AgentModelPicker.stories.d.ts +2 -0
  90. package/dist/src/presentation/web/components/features/settings/AgentModelPicker/AgentModelPicker.stories.d.ts.map +1 -1
  91. package/dist/src/presentation/web/components/features/settings/AgentModelPicker/AgentModelPicker.stories.js +27 -0
  92. package/dist/src/presentation/web/components/features/settings/AgentModelPicker/index.d.ts +10 -1
  93. package/dist/src/presentation/web/components/features/settings/AgentModelPicker/index.d.ts.map +1 -1
  94. package/dist/src/presentation/web/components/features/settings/AgentModelPicker/index.js +33 -25
  95. package/dist/src/presentation/web/hooks/use-graph-state.d.ts.map +1 -1
  96. package/dist/src/presentation/web/hooks/use-graph-state.js +16 -0
  97. package/dist/src/presentation/web/hooks/use-turn-statuses.d.ts +1 -1
  98. package/dist/src/presentation/web/hooks/use-turn-statuses.d.ts.map +1 -1
  99. package/dist/src/presentation/web/hooks/use-turn-statuses.js +1 -1
  100. package/dist/tsconfig.build.tsbuildinfo +1 -1
  101. package/package.json +1 -1
  102. package/web/.next/BUILD_ID +1 -1
  103. package/web/.next/app-path-routes-manifest.json +1 -0
  104. package/web/.next/build-manifest.json +7 -7
  105. package/web/.next/fallback-build-manifest.json +2 -2
  106. package/web/.next/prerender-manifest.json +3 -3
  107. package/web/.next/required-server-files.js +3 -3
  108. package/web/.next/required-server-files.json +3 -3
  109. package/web/.next/routes-manifest.json +8 -0
  110. package/web/.next/server/app/(dashboard)/@drawer/adopt/page/build-manifest.json +5 -5
  111. package/web/.next/server/app/(dashboard)/@drawer/adopt/page/react-loadable-manifest.json +1 -8
  112. package/web/.next/server/app/(dashboard)/@drawer/adopt/page/server-reference-manifest.json +29 -29
  113. package/web/.next/server/app/(dashboard)/@drawer/adopt/page.js +1 -1
  114. package/web/.next/server/app/(dashboard)/@drawer/adopt/page.js.nft.json +1 -1
  115. package/web/.next/server/app/(dashboard)/@drawer/adopt/page_client-reference-manifest.js +1 -1
  116. package/web/.next/server/app/(dashboard)/@drawer/chat/page/build-manifest.json +5 -5
  117. package/web/.next/server/app/(dashboard)/@drawer/chat/page/react-loadable-manifest.json +1 -8
  118. package/web/.next/server/app/(dashboard)/@drawer/chat/page/server-reference-manifest.json +27 -27
  119. package/web/.next/server/app/(dashboard)/@drawer/chat/page.js +1 -1
  120. package/web/.next/server/app/(dashboard)/@drawer/chat/page.js.nft.json +1 -1
  121. package/web/.next/server/app/(dashboard)/@drawer/chat/page_client-reference-manifest.js +1 -1
  122. package/web/.next/server/app/(dashboard)/@drawer/create/page/build-manifest.json +5 -5
  123. package/web/.next/server/app/(dashboard)/@drawer/create/page/react-loadable-manifest.json +1 -8
  124. package/web/.next/server/app/(dashboard)/@drawer/create/page/server-reference-manifest.json +30 -30
  125. package/web/.next/server/app/(dashboard)/@drawer/create/page.js +1 -1
  126. package/web/.next/server/app/(dashboard)/@drawer/create/page.js.nft.json +1 -1
  127. package/web/.next/server/app/(dashboard)/@drawer/create/page_client-reference-manifest.js +1 -1
  128. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page/build-manifest.json +5 -5
  129. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page/react-loadable-manifest.json +1 -8
  130. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page/server-reference-manifest.json +89 -74
  131. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page.js +2 -2
  132. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page.js.nft.json +1 -1
  133. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page_client-reference-manifest.js +1 -1
  134. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page/build-manifest.json +5 -5
  135. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page/react-loadable-manifest.json +1 -8
  136. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page/server-reference-manifest.json +89 -74
  137. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js +2 -2
  138. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js.nft.json +1 -1
  139. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page_client-reference-manifest.js +1 -1
  140. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/[tab]/page/build-manifest.json +5 -5
  141. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/[tab]/page/react-loadable-manifest.json +1 -8
  142. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/[tab]/page/server-reference-manifest.json +28 -28
  143. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/[tab]/page.js +1 -1
  144. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/[tab]/page.js.nft.json +1 -1
  145. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/[tab]/page_client-reference-manifest.js +1 -1
  146. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page/build-manifest.json +5 -5
  147. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page/react-loadable-manifest.json +1 -8
  148. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page/server-reference-manifest.json +28 -28
  149. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js +1 -1
  150. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js.nft.json +1 -1
  151. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  152. package/web/.next/server/app/(dashboard)/chat/page/build-manifest.json +5 -5
  153. package/web/.next/server/app/(dashboard)/chat/page/react-loadable-manifest.json +1 -8
  154. package/web/.next/server/app/(dashboard)/chat/page/server-reference-manifest.json +27 -27
  155. package/web/.next/server/app/(dashboard)/chat/page.js +1 -1
  156. package/web/.next/server/app/(dashboard)/chat/page.js.nft.json +1 -1
  157. package/web/.next/server/app/(dashboard)/chat/page_client-reference-manifest.js +1 -1
  158. package/web/.next/server/app/(dashboard)/create/page/build-manifest.json +5 -5
  159. package/web/.next/server/app/(dashboard)/create/page/react-loadable-manifest.json +1 -8
  160. package/web/.next/server/app/(dashboard)/create/page/server-reference-manifest.json +30 -30
  161. package/web/.next/server/app/(dashboard)/create/page.js +1 -1
  162. package/web/.next/server/app/(dashboard)/create/page.js.nft.json +1 -1
  163. package/web/.next/server/app/(dashboard)/create/page_client-reference-manifest.js +1 -1
  164. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page/build-manifest.json +5 -5
  165. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page/react-loadable-manifest.json +1 -8
  166. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page/server-reference-manifest.json +89 -74
  167. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page.js +2 -2
  168. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page.js.nft.json +1 -1
  169. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page_client-reference-manifest.js +1 -1
  170. package/web/.next/server/app/(dashboard)/feature/[featureId]/page/build-manifest.json +5 -5
  171. package/web/.next/server/app/(dashboard)/feature/[featureId]/page/react-loadable-manifest.json +1 -8
  172. package/web/.next/server/app/(dashboard)/feature/[featureId]/page/server-reference-manifest.json +89 -74
  173. package/web/.next/server/app/(dashboard)/feature/[featureId]/page.js +2 -2
  174. package/web/.next/server/app/(dashboard)/feature/[featureId]/page.js.nft.json +1 -1
  175. package/web/.next/server/app/(dashboard)/feature/[featureId]/page_client-reference-manifest.js +1 -1
  176. package/web/.next/server/app/(dashboard)/page/build-manifest.json +5 -5
  177. package/web/.next/server/app/(dashboard)/page/react-loadable-manifest.json +1 -8
  178. package/web/.next/server/app/(dashboard)/page/server-reference-manifest.json +27 -27
  179. package/web/.next/server/app/(dashboard)/page.js +1 -1
  180. package/web/.next/server/app/(dashboard)/page.js.nft.json +1 -1
  181. package/web/.next/server/app/(dashboard)/page_client-reference-manifest.js +1 -1
  182. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/[tab]/page/build-manifest.json +5 -5
  183. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/[tab]/page/react-loadable-manifest.json +1 -8
  184. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/[tab]/page/server-reference-manifest.json +28 -28
  185. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/[tab]/page.js +1 -1
  186. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/[tab]/page.js.nft.json +1 -1
  187. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/[tab]/page_client-reference-manifest.js +1 -1
  188. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page/build-manifest.json +5 -5
  189. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page/react-loadable-manifest.json +1 -8
  190. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page/server-reference-manifest.json +28 -28
  191. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js +1 -1
  192. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js.nft.json +1 -1
  193. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  194. package/web/.next/server/app/_global-error/page/build-manifest.json +5 -5
  195. package/web/.next/server/app/_global-error/page.js +1 -1
  196. package/web/.next/server/app/_global-error/page.js.nft.json +1 -1
  197. package/web/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  198. package/web/.next/server/app/_global-error.html +2 -2
  199. package/web/.next/server/app/_global-error.rsc +7 -7
  200. package/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +2 -2
  201. package/web/.next/server/app/_global-error.segments/_full.segment.rsc +7 -7
  202. package/web/.next/server/app/_global-error.segments/_head.segment.rsc +3 -3
  203. package/web/.next/server/app/_global-error.segments/_index.segment.rsc +3 -3
  204. package/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  205. package/web/.next/server/app/_not-found/page/build-manifest.json +5 -5
  206. package/web/.next/server/app/_not-found/page/react-loadable-manifest.json +1 -8
  207. package/web/.next/server/app/_not-found/page/server-reference-manifest.json +6 -6
  208. package/web/.next/server/app/_not-found/page.js +1 -1
  209. package/web/.next/server/app/_not-found/page.js.nft.json +1 -1
  210. package/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  211. package/web/.next/server/app/api/attachments/preview/route.js.nft.json +1 -1
  212. package/web/.next/server/app/api/evidence/route.js.nft.json +1 -1
  213. package/web/.next/server/app/api/graph-data/route.js.nft.json +1 -1
  214. package/web/.next/server/app/api/interactive/chat/[featureId]/messages/route.js.nft.json +1 -1
  215. package/web/.next/server/app/api/interactive/chat/[featureId]/respond/route/app-paths-manifest.json +3 -0
  216. package/web/.next/server/app/api/interactive/chat/[featureId]/respond/route/build-manifest.json +11 -0
  217. package/web/.next/server/app/api/interactive/chat/[featureId]/respond/route/server-reference-manifest.json +4 -0
  218. package/web/.next/server/app/api/interactive/chat/[featureId]/respond/route.js +7 -0
  219. package/web/.next/server/app/api/interactive/chat/[featureId]/respond/route.js.map +5 -0
  220. package/web/.next/server/app/api/interactive/chat/[featureId]/respond/route.js.nft.json +1 -0
  221. package/web/.next/server/app/api/interactive/chat/[featureId]/respond/route_client-reference-manifest.js +2 -0
  222. package/web/.next/server/app/settings/page/build-manifest.json +5 -5
  223. package/web/.next/server/app/settings/page/react-loadable-manifest.json +1 -8
  224. package/web/.next/server/app/settings/page/server-reference-manifest.json +9 -9
  225. package/web/.next/server/app/settings/page.js +1 -1
  226. package/web/.next/server/app/settings/page.js.nft.json +1 -1
  227. package/web/.next/server/app/settings/page_client-reference-manifest.js +1 -1
  228. package/web/.next/server/app/skills/page/build-manifest.json +5 -5
  229. package/web/.next/server/app/skills/page/react-loadable-manifest.json +1 -8
  230. package/web/.next/server/app/skills/page/server-reference-manifest.json +11 -11
  231. package/web/.next/server/app/skills/page.js +1 -1
  232. package/web/.next/server/app/skills/page.js.nft.json +1 -1
  233. package/web/.next/server/app/skills/page_client-reference-manifest.js +1 -1
  234. package/web/.next/server/app/tools/page/build-manifest.json +5 -5
  235. package/web/.next/server/app/tools/page/react-loadable-manifest.json +1 -8
  236. package/web/.next/server/app/tools/page/server-reference-manifest.json +11 -11
  237. package/web/.next/server/app/tools/page.js +1 -1
  238. package/web/.next/server/app/tools/page.js.nft.json +1 -1
  239. package/web/.next/server/app/tools/page_client-reference-manifest.js +1 -1
  240. package/web/.next/server/app/version/page/build-manifest.json +5 -5
  241. package/web/.next/server/app/version/page/react-loadable-manifest.json +1 -8
  242. package/web/.next/server/app/version/page/server-reference-manifest.json +6 -6
  243. package/web/.next/server/app/version/page.js +1 -1
  244. package/web/.next/server/app/version/page.js.nft.json +1 -1
  245. package/web/.next/server/app/version/page_client-reference-manifest.js +1 -1
  246. package/web/.next/server/app-paths-manifest.json +1 -0
  247. package/web/.next/server/chunks/8ba4b_server_app_api_interactive_chat_[featureId]_respond_route_actions_990d51bd.js +3 -0
  248. package/web/.next/server/chunks/8ba4b_server_app_api_interactive_chat_[featureId]_respond_route_actions_990d51bd.js.map +1 -0
  249. package/web/.next/server/chunks/[root-of-the-server]__31944fa2._.js +3 -0
  250. package/web/.next/server/chunks/[root-of-the-server]__31944fa2._.js.map +1 -0
  251. package/web/.next/server/chunks/[root-of-the-server]__8a281f8d._.js +9 -3
  252. package/web/.next/server/chunks/[root-of-the-server]__8a281f8d._.js.map +1 -1
  253. package/web/.next/server/chunks/[root-of-the-server]__a402b567._.js +1 -1
  254. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js +1 -1
  255. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js.map +1 -1
  256. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_feature-drawer-client_tsx_e9755fc8._.js +3 -3
  257. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_feature-drawer-client_tsx_e9755fc8._.js.map +1 -1
  258. package/web/.next/server/chunks/ssr/[root-of-the-server]__1abe77bb._.js +2 -2
  259. package/web/.next/server/chunks/ssr/[root-of-the-server]__1abe77bb._.js.map +1 -1
  260. package/web/.next/server/chunks/ssr/[root-of-the-server]__1f389e5d._.js +1 -1
  261. package/web/.next/server/chunks/ssr/[root-of-the-server]__1f389e5d._.js.map +1 -1
  262. package/web/.next/server/chunks/ssr/[root-of-the-server]__357d99f9._.js +1 -1
  263. package/web/.next/server/chunks/ssr/[root-of-the-server]__4fb81977._.js +4 -0
  264. package/web/.next/server/chunks/ssr/[root-of-the-server]__4fb81977._.js.map +1 -0
  265. package/web/.next/server/chunks/ssr/[root-of-the-server]__7562afc6._.js +2 -2
  266. package/web/.next/server/chunks/ssr/[root-of-the-server]__7562afc6._.js.map +1 -1
  267. package/web/.next/server/chunks/ssr/[root-of-the-server]__7dcd0917._.js +4 -0
  268. package/web/.next/server/chunks/ssr/[root-of-the-server]__7dcd0917._.js.map +1 -0
  269. package/web/.next/server/chunks/ssr/[root-of-the-server]__86ff0bc5._.js +2 -2
  270. package/web/.next/server/chunks/ssr/[root-of-the-server]__86ff0bc5._.js.map +1 -1
  271. package/web/.next/server/chunks/ssr/[root-of-the-server]__8b0aac03._.js +1 -1
  272. package/web/.next/server/chunks/ssr/[root-of-the-server]__b7b96453._.js +1 -1
  273. package/web/.next/server/chunks/ssr/[root-of-the-server]__b7b96453._.js.map +1 -1
  274. package/web/.next/server/chunks/ssr/[root-of-the-server]__ba7f5873._.js +4 -0
  275. package/web/.next/server/chunks/ssr/[root-of-the-server]__ba7f5873._.js.map +1 -0
  276. package/web/.next/server/chunks/ssr/[root-of-the-server]__c5e09f6f._.js +4 -0
  277. package/web/.next/server/chunks/ssr/[root-of-the-server]__c5e09f6f._.js.map +1 -0
  278. package/web/.next/server/chunks/ssr/[root-of-the-server]__d5e22d1a._.js +3 -0
  279. package/web/.next/server/chunks/ssr/{[root-of-the-server]__efeeaed4._.js.map → [root-of-the-server]__d5e22d1a._.js.map} +1 -1
  280. package/web/.next/server/chunks/ssr/[root-of-the-server]__f2acfd0e._.js +3 -0
  281. package/web/.next/server/chunks/ssr/[root-of-the-server]__f2acfd0e._.js.map +1 -0
  282. package/web/.next/server/chunks/ssr/[root-of-the-server]__f5614810._.js +3 -0
  283. package/web/.next/server/chunks/ssr/{[root-of-the-server]__d1040bd1._.js.map → [root-of-the-server]__f5614810._.js.map} +1 -1
  284. package/web/.next/server/chunks/ssr/_02e01240._.js +1 -1
  285. package/web/.next/server/chunks/ssr/_02e01240._.js.map +1 -1
  286. package/web/.next/server/chunks/ssr/_05c23ad9._.js +1 -1
  287. package/web/.next/server/chunks/ssr/_05c23ad9._.js.map +1 -1
  288. package/web/.next/server/chunks/ssr/_0727935d._.js +1 -1
  289. package/web/.next/server/chunks/ssr/_0727935d._.js.map +1 -1
  290. package/web/.next/server/chunks/ssr/_0d2aa969._.js +3 -0
  291. package/web/.next/server/chunks/ssr/_0d2aa969._.js.map +1 -0
  292. package/web/.next/server/chunks/ssr/_0edaf547._.js +3 -0
  293. package/web/.next/server/chunks/ssr/_0edaf547._.js.map +1 -0
  294. package/web/.next/server/chunks/ssr/{_a65c54ca._.js → _10216838._.js} +2 -2
  295. package/web/.next/server/chunks/ssr/{_a65c54ca._.js.map → _10216838._.js.map} +1 -1
  296. package/web/.next/server/chunks/ssr/_16eb4fec._.js +1 -1
  297. package/web/.next/server/chunks/ssr/_16eb4fec._.js.map +1 -1
  298. package/web/.next/server/chunks/ssr/_18886033._.js +1 -1
  299. package/web/.next/server/chunks/ssr/_18886033._.js.map +1 -1
  300. package/web/.next/server/chunks/ssr/_1e08a336._.js.map +1 -1
  301. package/web/.next/server/chunks/ssr/_22e00a14._.js +1 -1
  302. package/web/.next/server/chunks/ssr/_22e00a14._.js.map +1 -1
  303. package/web/.next/server/chunks/ssr/_4cbb7f95._.js +3 -0
  304. package/web/.next/server/chunks/ssr/_4cbb7f95._.js.map +1 -0
  305. package/web/.next/server/chunks/ssr/_56b9d60f._.js +1 -1
  306. package/web/.next/server/chunks/ssr/_56b9d60f._.js.map +1 -1
  307. package/web/.next/server/chunks/ssr/{_506a3bc3._.js → _682fc996._.js} +2 -2
  308. package/web/.next/server/chunks/ssr/_682fc996._.js.map +1 -0
  309. package/web/.next/server/chunks/ssr/_a1068852._.js +3 -0
  310. package/web/.next/server/chunks/ssr/_a1068852._.js.map +1 -0
  311. package/web/.next/server/chunks/ssr/_a5a5901d._.js +1 -1
  312. package/web/.next/server/chunks/ssr/_a5a5901d._.js.map +1 -1
  313. package/web/.next/server/chunks/ssr/_ad09f271._.js +1 -1
  314. package/web/.next/server/chunks/ssr/_ad09f271._.js.map +1 -1
  315. package/web/.next/server/chunks/ssr/_c3f595c6._.js +1 -1
  316. package/web/.next/server/chunks/ssr/_c3f595c6._.js.map +1 -1
  317. package/web/.next/server/chunks/ssr/_ea9e1556._.js +1 -1
  318. package/web/.next/server/chunks/ssr/_ea9e1556._.js.map +1 -1
  319. package/web/.next/server/chunks/ssr/_f1ba9be6._.js +2 -2
  320. package/web/.next/server/chunks/ssr/_f1ba9be6._.js.map +1 -1
  321. package/web/.next/server/chunks/ssr/{_05dae8d0._.js → _f25dbb08._.js} +2 -2
  322. package/web/.next/server/chunks/ssr/{_05dae8d0._.js.map → _f25dbb08._.js.map} +1 -1
  323. package/web/.next/server/chunks/ssr/_f33cd07e._.js +2 -2
  324. package/web/.next/server/chunks/ssr/_f33cd07e._.js.map +1 -1
  325. package/web/.next/server/chunks/ssr/_f8b45233._.js +1 -1
  326. package/web/.next/server/chunks/ssr/_f8b45233._.js.map +1 -1
  327. package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_settings_settings-page-client_tsx_6ed9d5f8._.js +1 -1
  328. package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_settings_settings-page-client_tsx_6ed9d5f8._.js.map +1 -1
  329. package/web/.next/server/chunks/ssr/f3a1f_components_common_control-center-drawer_repository-drawer-client_tsx_39a00c03._.js +1 -1
  330. package/web/.next/server/chunks/ssr/f3a1f_components_common_control-center-drawer_repository-drawer-client_tsx_39a00c03._.js.map +1 -1
  331. package/web/.next/server/chunks/ssr/node_modules__pnpm_12a7ede0._.js +3 -0
  332. package/web/.next/server/chunks/ssr/node_modules__pnpm_12a7ede0._.js.map +1 -0
  333. package/web/.next/server/chunks/ssr/src_presentation_web_app_actions_open-ide_ts_baaca5d5._.js +1 -1
  334. package/web/.next/server/chunks/ssr/src_presentation_web_components_895e5bfa._.js +1 -1
  335. package/web/.next/server/chunks/ssr/src_presentation_web_components_895e5bfa._.js.map +1 -1
  336. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js +1 -1
  337. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js.map +1 -1
  338. package/web/.next/server/chunks/ssr/src_presentation_web_components_ui_select_tsx_45d6b8ae._.js +1 -1
  339. package/web/.next/server/chunks/ssr/src_presentation_web_components_ui_select_tsx_45d6b8ae._.js.map +1 -1
  340. package/web/.next/server/middleware-build-manifest.js +5 -5
  341. package/web/.next/server/pages/500.html +2 -2
  342. package/web/.next/server/server-reference-manifest.js +1 -1
  343. package/web/.next/server/server-reference-manifest.json +231 -195
  344. package/web/.next/static/chunks/{43eca8783fbc9558.js → 0286f25e23d42f0c.js} +1 -1
  345. package/web/.next/static/chunks/{345246551a96bdb2.js → 03900be2b55b7375.js} +1 -1
  346. package/web/.next/static/chunks/{fe70e73feb07bcfd.js → 08ec4c9ab61717aa.js} +1 -1
  347. package/web/.next/static/chunks/{dedf6ca63c5468fa.js → 09edd35d194bec06.js} +3 -3
  348. package/web/.next/static/chunks/{d4d8f0a137bd2eb4.js → 12803afee7d0afc8.js} +2 -2
  349. package/web/.next/static/chunks/{1cd31898fb6e763a.js → 186ae7bb70982cc7.js} +1 -1
  350. package/web/.next/static/chunks/197ab40a6e4be037.js +7 -0
  351. package/web/.next/static/chunks/1fe75f9dd488d557.css +1 -0
  352. package/web/.next/static/chunks/4b6b80d73048899b.js +3 -0
  353. package/web/.next/static/chunks/5e044b1f966ab2f5.js +1 -0
  354. package/web/.next/static/chunks/{18e8b12721a9316e.js → 7ab475ef5d67af41.js} +1 -1
  355. package/web/.next/static/chunks/84a181ff3270fd9f.js +1 -0
  356. package/web/.next/static/chunks/87a50da22a604a84.js +1 -0
  357. package/web/.next/static/chunks/{ee270565c4bdb7e1.js → 9375a48c30b82a74.js} +2 -2
  358. package/web/.next/static/chunks/9531dfbcff94c28b.js +1 -0
  359. package/web/.next/static/chunks/{44275180f9c50dbb.js → a36af696cef18a2a.js} +1 -1
  360. package/web/.next/static/chunks/a7d8ed763d7bbe63.js +5 -0
  361. package/web/.next/static/chunks/aea0279ddefd5f75.js +1 -0
  362. package/web/.next/static/chunks/{c60d6c2b2f7b0593.js → bf4eca879dc0c77a.js} +1 -1
  363. package/web/.next/static/chunks/ed3a602003bcb31b.js +1 -0
  364. package/web/.next/static/chunks/fa024fa35b1b47ff.js +1 -0
  365. package/web/.next/static/chunks/{turbopack-432ef324fc27240c.js → turbopack-8a46f5841d1dbe2e.js} +1 -1
  366. package/web/.next/server/chunks/ssr/[root-of-the-server]__2d0c3840._.js +0 -3
  367. package/web/.next/server/chunks/ssr/[root-of-the-server]__2d0c3840._.js.map +0 -1
  368. package/web/.next/server/chunks/ssr/[root-of-the-server]__563e4faf._.js +0 -4
  369. package/web/.next/server/chunks/ssr/[root-of-the-server]__563e4faf._.js.map +0 -1
  370. package/web/.next/server/chunks/ssr/[root-of-the-server]__821a11c1._.js +0 -4
  371. package/web/.next/server/chunks/ssr/[root-of-the-server]__821a11c1._.js.map +0 -1
  372. package/web/.next/server/chunks/ssr/[root-of-the-server]__98740ee4._.js +0 -4
  373. package/web/.next/server/chunks/ssr/[root-of-the-server]__98740ee4._.js.map +0 -1
  374. package/web/.next/server/chunks/ssr/[root-of-the-server]__ba9f9e11._.js +0 -4
  375. package/web/.next/server/chunks/ssr/[root-of-the-server]__ba9f9e11._.js.map +0 -1
  376. package/web/.next/server/chunks/ssr/[root-of-the-server]__d1040bd1._.js +0 -3
  377. package/web/.next/server/chunks/ssr/[root-of-the-server]__efeeaed4._.js +0 -3
  378. package/web/.next/server/chunks/ssr/_0a90d28b._.js +0 -3
  379. package/web/.next/server/chunks/ssr/_0a90d28b._.js.map +0 -1
  380. package/web/.next/server/chunks/ssr/_3bcda5d7._.js +0 -3
  381. package/web/.next/server/chunks/ssr/_3bcda5d7._.js.map +0 -1
  382. package/web/.next/server/chunks/ssr/_4d49a312._.js +0 -3
  383. package/web/.next/server/chunks/ssr/_4d49a312._.js.map +0 -1
  384. package/web/.next/server/chunks/ssr/_506a3bc3._.js.map +0 -1
  385. package/web/.next/server/chunks/ssr/_9215e9ec._.js +0 -3
  386. package/web/.next/server/chunks/ssr/_9215e9ec._.js.map +0 -1
  387. package/web/.next/server/chunks/ssr/node_modules__pnpm_1300ae39._.js +0 -3
  388. package/web/.next/server/chunks/ssr/node_modules__pnpm_1300ae39._.js.map +0 -1
  389. package/web/.next/static/chunks/0b732842dcca8b8d.js +0 -3
  390. package/web/.next/static/chunks/1e6609edc3367244.css +0 -1
  391. package/web/.next/static/chunks/3deefc76ea55047c.js +0 -1
  392. package/web/.next/static/chunks/40b6bcf1a2de4a0f.js +0 -1
  393. package/web/.next/static/chunks/5fde2118133bc2bb.js +0 -1
  394. package/web/.next/static/chunks/65440524d7ee7d13.js +0 -1
  395. package/web/.next/static/chunks/6d7b999c99d6d175.js +0 -9
  396. package/web/.next/static/chunks/8180973e9cd6a99e.css +0 -1
  397. package/web/.next/static/chunks/8c96c49aad817377.js +0 -1
  398. package/web/.next/static/chunks/9dbfc283af013ec1.js +0 -7
  399. package/web/.next/static/chunks/c7e793951b20a67f.js +0 -1
  400. package/web/.next/static/chunks/d5dcf6575f5f9dd8.js +0 -5
  401. package/web/.next/static/chunks/dd52a7ae78af4f7f.js +0 -1
  402. /package/web/.next/static/{RH3NxvKaE9Efp8ZrIyCm5 → jJMYzVAvBKZm_zDnl0h7J}/_buildManifest.js +0 -0
  403. /package/web/.next/static/{RH3NxvKaE9Efp8ZrIyCm5 → jJMYzVAvBKZm_zDnl0h7J}/_clientMiddlewareManifest.json +0 -0
  404. /package/web/.next/static/{RH3NxvKaE9Efp8ZrIyCm5 → jJMYzVAvBKZm_zDnl0h7J}/_ssgManifest.js +0 -0
@@ -1,3 +1,17 @@
1
+ /** Shape matching UserInteractionData from the agent executor interface. */
2
+ export interface InteractionData {
3
+ toolCallId: string;
4
+ questions: {
5
+ question: string;
6
+ header: string;
7
+ options: {
8
+ label: string;
9
+ description: string;
10
+ preview?: string;
11
+ }[];
12
+ multiSelect: boolean;
13
+ }[];
14
+ }
1
15
  interface SessionInfo {
2
16
  pid: number | null;
3
17
  sessionId: string | null;
@@ -45,6 +59,8 @@ export declare function useChatRuntime(featureId: string, worktreePath?: string,
45
59
  stopAgent: () => Promise<void>;
46
60
  sessionInfo: SessionInfo | null;
47
61
  isChatLoading: boolean;
62
+ pendingInteraction: InteractionData | null;
63
+ respondToInteraction: (answers: Record<string, string>) => Promise<void>;
48
64
  };
49
65
  export {};
50
66
  //# sourceMappingURL=useChatRuntime.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"useChatRuntime.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/features/chat/useChatRuntime.ts"],"names":[],"mappings":"AAkBA,UAAU,WAAW;IACnB,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACnB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;CAClC;AAkDD,MAAM,WAAW,UAAU;IACzB,4EAA4E;IAC5E,SAAS,EAAE,OAAO,CAAC;IACnB,qFAAqF;IACrF,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B;AAID,MAAM,WAAW,kBAAkB;IACjC,8EAA8E;IAC9E,gBAAgB,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,MAAM,CAAC;IAC/C,4EAA4E;IAC5E,aAAa,CAAC,EAAE,MAAM,IAAI,CAAC;IAC3B,kEAAkE;IAClE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,iEAAiE;IACjE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,6EAA6E;IAC7E,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,iEAAiE;AACjE,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,IAAI,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAC5B,SAAS,EAAE,MAAM,EACjB,YAAY,CAAC,EAAE,MAAM,EACrB,OAAO,CAAC,EAAE,kBAAkB;;;;;;;EAgW7B"}
1
+ {"version":3,"file":"useChatRuntime.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/features/chat/useChatRuntime.ts"],"names":[],"mappings":"AASA,4EAA4E;AAC5E,MAAM,WAAW,eAAe;IAC9B,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE;QACT,QAAQ,EAAE,MAAM,CAAC;QACjB,MAAM,EAAE,MAAM,CAAC;QACf,OAAO,EAAE;YAAE,KAAK,EAAE,MAAM,CAAC;YAAC,WAAW,EAAE,MAAM,CAAC;YAAC,OAAO,CAAC,EAAE,MAAM,CAAA;SAAE,EAAE,CAAC;QACpE,WAAW,EAAE,OAAO,CAAC;KACtB,EAAE,CAAC;CACL;AAYD,UAAU,WAAW;IACnB,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACnB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;CAClC;AAkDD,MAAM,WAAW,UAAU;IACzB,4EAA4E;IAC5E,SAAS,EAAE,OAAO,CAAC;IACnB,qFAAqF;IACrF,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B;AAID,MAAM,WAAW,kBAAkB;IACjC,8EAA8E;IAC9E,gBAAgB,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,MAAM,CAAC;IAC/C,4EAA4E;IAC5E,aAAa,CAAC,EAAE,MAAM,IAAI,CAAC;IAC3B,kEAAkE;IAClE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,iEAAiE;IACjE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,6EAA6E;IAC7E,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,iEAAiE;AACjE,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,IAAI,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAC5B,SAAS,EAAE,MAAM,EACjB,YAAY,CAAC,EAAE,MAAM,EACrB,OAAO,CAAC,EAAE,kBAAkB;;;;;;;;oCAgXV,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;EAmDzC"}
@@ -100,6 +100,19 @@ export function useChatRuntime(featureId, worktreePath, options) {
100
100
  const [awaitingResponse, setAwaitingResponse] = useState(false);
101
101
  const awaitingTimerRef = useRef(null);
102
102
  const eventSourceRef = useRef(null);
103
+ // ── Interaction state (AskUserQuestion) ─────────────────────────────
104
+ const [pendingInteraction, setPendingInteraction] = useState(null);
105
+ // Sync pending interaction from backend polling (fallback for missed SSE)
106
+ useEffect(() => {
107
+ const backendInteraction = chatState?.pendingInteraction ?? null;
108
+ if (backendInteraction) {
109
+ setPendingInteraction(backendInteraction);
110
+ }
111
+ else if (!backendInteraction && pendingInteraction) {
112
+ // Backend cleared it (e.g. agent continued) — clear local state
113
+ setPendingInteraction(null);
114
+ }
115
+ }, [chatState?.pendingInteraction, pendingInteraction]);
103
116
  // Delayed awaiting — only show Thinking bubble after 600ms to avoid flash
104
117
  const startAwaiting = useCallback(() => {
105
118
  if (awaitingTimerRef.current)
@@ -163,10 +176,24 @@ export function useChatRuntime(featureId, worktreePath, options) {
163
176
  // Ignore
164
177
  }
165
178
  });
179
+ es.addEventListener('interaction', (event) => {
180
+ try {
181
+ const data = JSON.parse(event.data);
182
+ if (data.interaction) {
183
+ cancelAwaiting();
184
+ setPendingInteraction(data.interaction);
185
+ }
186
+ }
187
+ catch {
188
+ // Ignore
189
+ }
190
+ });
166
191
  es.addEventListener('done', () => {
167
192
  setStatusLog(null);
168
193
  cancelAwaiting();
169
194
  pushDebug('turn_done');
195
+ // Agent turn completed — clear any lingering interaction state
196
+ setPendingInteraction(null);
170
197
  // Refetch first, THEN clear local streaming state so there's no gap
171
198
  void queryClient.invalidateQueries({ queryKey: chatQueryKey(featureId) }).then(() => {
172
199
  setStreamingText('');
@@ -335,6 +362,7 @@ export function useChatRuntime(featureId, worktreePath, options) {
335
362
  setDebugEvents([]);
336
363
  setStatusLog(null);
337
364
  cancelAwaiting();
365
+ setPendingInteraction(null);
338
366
  void queryClient.invalidateQueries({ queryKey: chatQueryKey(featureId) });
339
367
  }, [featureId, queryClient, cancelAwaiting]);
340
368
  // ── Stop agent ────────────────────────────────────────────────────────
@@ -347,6 +375,30 @@ export function useChatRuntime(featureId, worktreePath, options) {
347
375
  cancelAwaiting();
348
376
  void queryClient.invalidateQueries({ queryKey: chatQueryKey(featureId) });
349
377
  }, [featureId, queryClient, cancelAwaiting]);
378
+ // ── Respond to interaction (AskUserQuestion) ───────────────────────────
379
+ const respondToInteraction = useCallback(async (answers) => {
380
+ // Clear the bubble and status log immediately — answers are persisted as
381
+ // a user message by the backend, shown in conversation history on refetch.
382
+ setPendingInteraction(null);
383
+ setStatusLog(null);
384
+ try {
385
+ const res = await fetch(`/api/interactive/chat/${featureId}/respond`, {
386
+ method: 'POST',
387
+ headers: { 'Content-Type': 'application/json' },
388
+ body: JSON.stringify({ answers }),
389
+ });
390
+ if (!res.ok) {
391
+ // eslint-disable-next-line no-console
392
+ console.error(`[respondToInteraction] failed: ${res.status}`);
393
+ }
394
+ }
395
+ catch (err) {
396
+ // eslint-disable-next-line no-console
397
+ console.error('[respondToInteraction] error:', err);
398
+ }
399
+ // Refetch to show the persisted user message with answers
400
+ void queryClient.invalidateQueries({ queryKey: chatQueryKey(featureId) });
401
+ }, [featureId, queryClient]);
350
402
  // ── Build assistant-ui runtime ──────────────────────────────────────────
351
403
  const runtime = useExternalStoreRuntime({
352
404
  messages: threadMessages,
@@ -359,5 +411,14 @@ export function useChatRuntime(featureId, worktreePath, options) {
359
411
  cancelAwaiting();
360
412
  }, [cancelAwaiting]),
361
413
  });
362
- return { runtime, status, clearChat, stopAgent, sessionInfo, isChatLoading };
414
+ return {
415
+ runtime,
416
+ status,
417
+ clearChat,
418
+ stopAgent,
419
+ sessionInfo,
420
+ isChatLoading,
421
+ pendingInteraction,
422
+ respondToInteraction,
423
+ };
363
424
  }
@@ -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":"AAKA,OAAO,KAAK,EAAE,IAAI,EAAY,MAAM,eAAe,CAAC;AAIpD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uCAAuC,CAAC;AAgC5E,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,2CA+czF"}
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;AAgC5E,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,2CAiezF"}
@@ -143,13 +143,28 @@ export function ControlCenterInner({ initialNodes, initialEdges }) {
143
143
  }, AUTO_FOCUS_DRAWER_DELAY_MS);
144
144
  }, 0);
145
145
  }, [fitView, guardedNavigate, router]);
146
- // Wrapper: add repo + auto-focus if canvas was empty
146
+ // Smoothly pan/zoom to a specific node after it appears on canvas
147
+ const focusOnNode = useCallback((nodeId) => {
148
+ // Wait for next render so the node exists in the DOM
149
+ setTimeout(() => {
150
+ fitView({
151
+ nodes: [{ id: nodeId }],
152
+ maxZoom: 1.0,
153
+ padding: 0.4,
154
+ duration: 600,
155
+ });
156
+ }, 0);
157
+ }, [fitView]);
158
+ // Wrapper: add repo + auto-focus on the new node
147
159
  const addRepoAndFocus = useCallback((path) => {
148
- const { wasEmpty, repoPath } = handleAddRepository(path);
160
+ const { wasEmpty, repoPath, tempNodeId } = handleAddRepository(path);
149
161
  if (wasEmpty) {
150
162
  focusAndOpenDrawer(repoPath);
151
163
  }
152
- }, [handleAddRepository, focusAndOpenDrawer]);
164
+ else {
165
+ focusOnNode(tempNodeId);
166
+ }
167
+ }, [handleAddRepository, focusAndOpenDrawer, focusOnNode]);
153
168
  // Listen for global "add repository" events from the top bar button
154
169
  useEffect(() => {
155
170
  const handler = (e) => {
@@ -12,6 +12,7 @@ export interface ControlCenterState {
12
12
  handleAddRepository: (path: string) => {
13
13
  wasEmpty: boolean;
14
14
  repoPath: string;
15
+ tempNodeId: string;
15
16
  };
16
17
  handleLayout: (direction: LayoutDirection) => void;
17
18
  handleArchiveFeature: (featureId: string) => void;
@@ -1 +1 @@
1
- {"version":3,"file":"use-control-center-state.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/features/control-center/use-control-center-state.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAClE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AACxE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,qCAAqC,CAAC;AAC9E,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uCAAuC,CAAC;AAC5E,OAAO,EAGL,KAAK,eAAe,EACrB,MAAM,yBAAyB,CAAC;AAkBjC,OAAO,EAAiB,KAAK,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAM7E,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,cAAc,EAAE,CAAC;IACxB,KAAK,EAAE,IAAI,EAAE,CAAC;IACd,aAAa,EAAE,CAAC,OAAO,EAAE,UAAU,CAAC,cAAc,CAAC,EAAE,KAAK,IAAI,CAAC;IAC/D,aAAa,EAAE,CAAC,UAAU,EAAE,UAAU,KAAK,IAAI,CAAC;IAChD,mBAAmB,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK;QAAE,QAAQ,EAAE,OAAO,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC;IAC/E,YAAY,EAAE,CAAC,SAAS,EAAE,eAAe,KAAK,IAAI,CAAC;IACnD,oBAAoB,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IAClD,mBAAmB,EAAE,CACnB,SAAS,EAAE,MAAM,EACjB,OAAO,CAAC,EAAE,OAAO,EACjB,aAAa,CAAC,EAAE,OAAO,EACvB,OAAO,CAAC,EAAE,OAAO,KACd,IAAI,CAAC;IACV,kBAAkB,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IAChD,kBAAkB,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IAChD,iBAAiB,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IAC/C,sBAAsB,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IACpD,sBAAsB,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAChE,iBAAiB,EAAE,CACjB,YAAY,EAAE,MAAM,GAAG,IAAI,EAC3B,YAAY,CAAC,EAAE,OAAO,CAAC,eAAe,CAAC,EACvC,QAAQ,CAAC,EAAE,MAAM,KACd,MAAM,CAAC;IACZ,yDAAyD;IACzD,YAAY,EAAE,OAAO,CAAC;IACtB,0CAA0C;IAC1C,eAAe,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IACzC,wDAAwD;IACxD,wBAAwB,EAAE,CAAC,aAAa,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,CAAC;IACxE,gDAAgD;IAChD,iBAAiB,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,kBAAkB,GAAG,SAAS,CAAC;IACtE,0EAA0E;IAC1E,YAAY,EAAE,CAAC,SAAS,EAAE,cAAc,KAAK,IAAI,CAAC;CACnD;AAQD,wBAAgB,qBAAqB,CACnC,YAAY,EAAE,cAAc,EAAE,EAC9B,YAAY,EAAE,IAAI,EAAE,GACnB,kBAAkB,CAilBpB"}
1
+ {"version":3,"file":"use-control-center-state.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/features/control-center/use-control-center-state.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAClE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AACxE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,qCAAqC,CAAC;AAC9E,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uCAAuC,CAAC;AAC5E,OAAO,EAGL,KAAK,eAAe,EACrB,MAAM,yBAAyB,CAAC;AAkBjC,OAAO,EAAiB,KAAK,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAM7E,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,cAAc,EAAE,CAAC;IACxB,KAAK,EAAE,IAAI,EAAE,CAAC;IACd,aAAa,EAAE,CAAC,OAAO,EAAE,UAAU,CAAC,cAAc,CAAC,EAAE,KAAK,IAAI,CAAC;IAC/D,aAAa,EAAE,CAAC,UAAU,EAAE,UAAU,KAAK,IAAI,CAAC;IAChD,mBAAmB,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK;QACrC,QAAQ,EAAE,OAAO,CAAC;QAClB,QAAQ,EAAE,MAAM,CAAC;QACjB,UAAU,EAAE,MAAM,CAAC;KACpB,CAAC;IACF,YAAY,EAAE,CAAC,SAAS,EAAE,eAAe,KAAK,IAAI,CAAC;IACnD,oBAAoB,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IAClD,mBAAmB,EAAE,CACnB,SAAS,EAAE,MAAM,EACjB,OAAO,CAAC,EAAE,OAAO,EACjB,aAAa,CAAC,EAAE,OAAO,EACvB,OAAO,CAAC,EAAE,OAAO,KACd,IAAI,CAAC;IACV,kBAAkB,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IAChD,kBAAkB,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IAChD,iBAAiB,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IAC/C,sBAAsB,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IACpD,sBAAsB,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAChE,iBAAiB,EAAE,CACjB,YAAY,EAAE,MAAM,GAAG,IAAI,EAC3B,YAAY,CAAC,EAAE,OAAO,CAAC,eAAe,CAAC,EACvC,QAAQ,CAAC,EAAE,MAAM,KACd,MAAM,CAAC;IACZ,yDAAyD;IACzD,YAAY,EAAE,OAAO,CAAC;IACtB,0CAA0C;IAC1C,eAAe,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IACzC,wDAAwD;IACxD,wBAAwB,EAAE,CAAC,aAAa,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,CAAC;IACxE,gDAAgD;IAChD,iBAAiB,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,kBAAkB,GAAG,SAAS,CAAC;IACtE,0EAA0E;IAC1E,YAAY,EAAE,CAAC,SAAS,EAAE,cAAc,KAAK,IAAI,CAAC;CACnD;AAQD,wBAAgB,qBAAqB,CACnC,YAAY,EAAE,cAAc,EAAE,EAC9B,YAAY,EAAE,IAAI,EAAE,GACnB,kBAAkB,CAilBpB"}
@@ -486,7 +486,7 @@ export function useControlCenterState(initialNodes, initialEdges) {
486
486
  toast.error('Failed to add repository');
487
487
  })
488
488
  .finally(() => endMutation());
489
- return { wasEmpty, repoPath: path };
489
+ return { wasEmpty, repoPath: path, tempNodeId: tempId };
490
490
  }, [
491
491
  addRepositoryToMap,
492
492
  removeRepository,
@@ -10,4 +10,6 @@ export declare const CodexCliSelected: Story;
10
10
  export declare const DemoAgent: Story;
11
11
  export declare const OverrideMode: Story;
12
12
  export declare const Disabled: Story;
13
+ export declare const SavingState: Story;
14
+ export declare const ParentDrivenSelection: Story;
13
15
  //# sourceMappingURL=AgentModelPicker.stories.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"AgentModelPicker.stories.d.ts","sourceRoot":"","sources":["../../../../../../../../src/presentation/web/components/features/settings/AgentModelPicker/AgentModelPicker.stories.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAEvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAE3C,QAAA,MAAM,IAAI,EAAE,IAAI,CAAC,OAAO,gBAAgB,CAevC,CAAC;AAEF,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,IAAI,CAAC,CAAC;AAEnC,eAAO,MAAM,iBAAiB,EAAE,KAM/B,CAAC;AAEF,eAAO,MAAM,cAAc,EAAE,KAM5B,CAAC;AAEF,eAAO,MAAM,SAAS,EAAE,KAMvB,CAAC;AAEF,eAAO,MAAM,gBAAgB,EAAE,KAM9B,CAAC;AAEF,eAAO,MAAM,SAAS,EAAE,KAMvB,CAAC;AAEF,eAAO,MAAM,YAAY,EAAE,KAM1B,CAAC;AAEF,eAAO,MAAM,QAAQ,EAAE,KAOtB,CAAC"}
1
+ {"version":3,"file":"AgentModelPicker.stories.d.ts","sourceRoot":"","sources":["../../../../../../../../src/presentation/web/components/features/settings/AgentModelPicker/AgentModelPicker.stories.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAEvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAE3C,QAAA,MAAM,IAAI,EAAE,IAAI,CAAC,OAAO,gBAAgB,CAevC,CAAC;AAEF,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,IAAI,CAAC,CAAC;AAqBnC,eAAO,MAAM,iBAAiB,EAAE,KAM/B,CAAC;AAEF,eAAO,MAAM,cAAc,EAAE,KAM5B,CAAC;AAEF,eAAO,MAAM,SAAS,EAAE,KAMvB,CAAC;AAEF,eAAO,MAAM,gBAAgB,EAAE,KAM9B,CAAC;AAEF,eAAO,MAAM,SAAS,EAAE,KAMvB,CAAC;AAEF,eAAO,MAAM,YAAY,EAAE,KAM1B,CAAC;AAEF,eAAO,MAAM,QAAQ,EAAE,KAOtB,CAAC;AAEF,eAAO,MAAM,WAAW,EAAE,KAOzB,CAAC;AAEF,eAAO,MAAM,qBAAqB,EAAE,KASnC,CAAC"}
@@ -1,4 +1,5 @@
1
1
  import { jsx as _jsx } from "react/jsx-runtime";
2
+ import * as React from 'react';
2
3
  import { fn } from '@storybook/test';
3
4
  import { AgentModelPicker } from './index.js';
4
5
  const meta = {
@@ -14,6 +15,16 @@ const meta = {
14
15
  },
15
16
  };
16
17
  export default meta;
18
+ function ParentDrivenSelectionDemo(props) {
19
+ const [selection, setSelection] = React.useState({
20
+ agentType: props.initialAgentType,
21
+ model: props.initialModel,
22
+ });
23
+ return (_jsx(AgentModelPicker, { ...props, agentType: selection.agentType, model: selection.model, onSave: async (agentType, model) => {
24
+ setSelection({ agentType, model });
25
+ return { ok: true };
26
+ } }));
27
+ }
17
28
  export const ClaudeCodeDefault = {
18
29
  args: {
19
30
  initialAgentType: 'claude-code',
@@ -64,3 +75,19 @@ export const Disabled = {
64
75
  disabled: true,
65
76
  },
66
77
  };
78
+ export const SavingState = {
79
+ args: {
80
+ initialAgentType: 'codex-cli',
81
+ initialModel: 'gpt-5.4',
82
+ mode: 'settings',
83
+ saving: true,
84
+ },
85
+ };
86
+ export const ParentDrivenSelection = {
87
+ render: (args) => (_jsx(ParentDrivenSelectionDemo, { ...args })),
88
+ args: {
89
+ initialAgentType: 'claude-code',
90
+ initialModel: 'claude-sonnet-4-6',
91
+ mode: 'settings',
92
+ },
93
+ };
@@ -1,11 +1,20 @@
1
1
  export interface AgentModelPickerProps {
2
2
  initialAgentType: string;
3
3
  initialModel: string;
4
+ agentType?: string;
5
+ model?: string;
4
6
  onAgentModelChange?: (agentType: string, model: string) => void;
7
+ onSave?: (agentType: string, model: string) => Promise<AgentModelPickerSaveResult | void>;
8
+ saveError?: string | null;
9
+ saving?: boolean;
5
10
  disabled?: boolean;
6
11
  className?: string;
7
12
  /** 'settings' persists to DB; 'override' only calls onAgentModelChange */
8
13
  mode: 'settings' | 'override';
9
14
  }
10
- export declare function AgentModelPicker({ initialAgentType, initialModel, onAgentModelChange, disabled, className, mode, }: AgentModelPickerProps): import("react/jsx-runtime").JSX.Element;
15
+ export interface AgentModelPickerSaveResult {
16
+ ok: boolean;
17
+ error?: string;
18
+ }
19
+ export declare function AgentModelPicker({ initialAgentType, initialModel, agentType: controlledAgentType, model: controlledModel, onAgentModelChange, onSave, saveError, saving, disabled, className, mode, }: AgentModelPickerProps): import("react/jsx-runtime").JSX.Element;
11
20
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../../../src/presentation/web/components/features/settings/AgentModelPicker/index.tsx"],"names":[],"mappings":"AAaA,MAAM,WAAW,qBAAqB;IACpC,gBAAgB,EAAE,MAAM,CAAC;IACzB,YAAY,EAAE,MAAM,CAAC;IACrB,kBAAkB,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAChE,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,0EAA0E;IAC1E,IAAI,EAAE,UAAU,GAAG,UAAU,CAAC;CAC/B;AAED,wBAAgB,gBAAgB,CAAC,EAC/B,gBAAgB,EAChB,YAAY,EACZ,kBAAkB,EAClB,QAAQ,EACR,SAAS,EACT,IAAI,GACL,EAAE,qBAAqB,2CAqNvB"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../../../src/presentation/web/components/features/settings/AgentModelPicker/index.tsx"],"names":[],"mappings":"AAaA,MAAM,WAAW,qBAAqB;IACpC,gBAAgB,EAAE,MAAM,CAAC;IACzB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,kBAAkB,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAChE,MAAM,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,0BAA0B,GAAG,IAAI,CAAC,CAAC;IAC1F,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,0EAA0E;IAC1E,IAAI,EAAE,UAAU,GAAG,UAAU,CAAC;CAC/B;AAED,MAAM,WAAW,0BAA0B;IACzC,EAAE,EAAE,OAAO,CAAC;IACZ,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,wBAAgB,gBAAgB,CAAC,EAC/B,gBAAgB,EAChB,YAAY,EACZ,SAAS,EAAE,mBAAmB,EAC9B,KAAK,EAAE,eAAe,EACtB,kBAAkB,EAClB,MAAM,EACN,SAAS,EACT,MAAM,EACN,QAAQ,EACR,SAAS,EACT,IAAI,GACL,EAAE,qBAAqB,2CAiOvB"}
@@ -9,13 +9,14 @@ import { getModelMeta } from '../../../../lib/model-metadata.js';
9
9
  import { Button } from '../../../ui/button.js';
10
10
  import { Popover, PopoverContent, PopoverTrigger } from '../../../ui/popover.js';
11
11
  import { cn } from '../../../../lib/utils.js';
12
- export function AgentModelPicker({ initialAgentType, initialModel, onAgentModelChange, disabled, className, mode, }) {
12
+ export function AgentModelPicker({ initialAgentType, initialModel, agentType: controlledAgentType, model: controlledModel, onAgentModelChange, onSave, saveError, saving, disabled, className, mode, }) {
13
13
  const [open, setOpen] = React.useState(false);
14
14
  const [groups, setGroups] = React.useState([]);
15
15
  const [loading, setLoading] = React.useState(true);
16
- const [agentType, setAgentType] = React.useState(initialAgentType);
17
- const [model, setModel] = React.useState(initialModel);
18
- const [error, setError] = React.useState(null);
16
+ const [agentType, setAgentType] = React.useState(controlledAgentType ?? initialAgentType);
17
+ const [model, setModel] = React.useState(controlledModel ?? initialModel);
18
+ const [internalSaving, setInternalSaving] = React.useState(false);
19
+ const [internalError, setInternalError] = React.useState(null);
19
20
  // 0 = agent list visible, 1 = model list visible
20
21
  const [level, setLevel] = React.useState(0);
21
22
  // Which agent's models to show (kept separate from level for animation)
@@ -25,9 +26,18 @@ export function AgentModelPicker({ initialAgentType, initialModel, onAgentModelC
25
26
  .then(setGroups)
26
27
  .finally(() => setLoading(false));
27
28
  }, []);
28
- // Reset drill-down when popover closes
29
29
  React.useEffect(() => {
30
- if (!open) {
30
+ setAgentType(controlledAgentType ?? initialAgentType);
31
+ }, [controlledAgentType, initialAgentType]);
32
+ React.useEffect(() => {
33
+ setModel(controlledModel ?? initialModel);
34
+ }, [controlledModel, initialModel]);
35
+ // Reset drill-down when popover transitions from open → closed (not on initial mount)
36
+ const prevOpenRef = React.useRef(open);
37
+ React.useEffect(() => {
38
+ const wasOpen = prevOpenRef.current;
39
+ prevOpenRef.current = open;
40
+ if (wasOpen && !open) {
31
41
  const t = setTimeout(() => {
32
42
  setLevel(0);
33
43
  setDrillAgent(null);
@@ -49,37 +59,35 @@ export function AgentModelPicker({ initialAgentType, initialModel, onAgentModelC
49
59
  setOpen(false);
50
60
  if (newAgentType === agentType && newModel === model)
51
61
  return;
62
+ setInternalError(null);
52
63
  if (mode === 'override') {
53
64
  setAgentType(newAgentType);
54
65
  setModel(newModel);
55
66
  onAgentModelChange?.(newAgentType, newModel);
56
67
  return;
57
68
  }
58
- // mode === 'settings' — optimistically update, then persist
59
- const prevAgent = agentType;
60
- const prevModel = model;
61
- setAgentType(newAgentType);
62
- setModel(newModel);
63
- onAgentModelChange?.(newAgentType, newModel);
64
- setError(null);
69
+ const persistSelection = onSave ??
70
+ (async (nextAgentType, nextModel) => updateAgentAndModel(nextAgentType, nextModel || null));
71
+ setInternalSaving(true);
65
72
  try {
66
- const result = await updateAgentAndModel(newAgentType, newModel || null);
67
- if (!result.ok) {
68
- // Revert on failure
69
- setAgentType(prevAgent);
70
- setModel(prevModel);
71
- onAgentModelChange?.(prevAgent, prevModel);
72
- setError(result.error ?? 'Failed to save');
73
+ const result = await persistSelection(newAgentType, newModel);
74
+ if (result && 'ok' in result && !result.ok) {
75
+ setInternalError(result.error ?? 'Failed to save');
76
+ return;
73
77
  }
78
+ setAgentType(newAgentType);
79
+ setModel(newModel);
80
+ onAgentModelChange?.(newAgentType, newModel);
74
81
  }
75
82
  catch {
76
- setAgentType(prevAgent);
77
- setModel(prevModel);
78
- onAgentModelChange?.(prevAgent, prevModel);
79
- setError('Failed to save');
83
+ setInternalError('Failed to save');
84
+ }
85
+ finally {
86
+ setInternalSaving(false);
80
87
  }
81
88
  };
82
- const isDisabled = (disabled ?? false) || loading;
89
+ const isDisabled = (disabled ?? false) || loading || (saving ?? false) || internalSaving;
90
+ const error = saveError ?? internalError;
83
91
  const AgentIcon = getAgentTypeIcon(agentType);
84
92
  const agentLabel = groups.find((g) => g.agentType === agentType)?.label ?? agentType;
85
93
  const modelName = model ? getModelMeta(model).displayName || model : null;
@@ -1 +1 @@
1
- {"version":3,"file":"use-graph-state.d.ts","sourceRoot":"","sources":["../../../../../src/presentation/web/hooks/use-graph-state.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,IAAI,EAAY,MAAM,eAAe,CAAC;AACpD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uCAAuC,CAAC;AAC5E,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AACxE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,qCAAqC,CAAC;AAC9E,OAAO,EAEL,KAAK,YAAY,EAEjB,KAAK,cAAc,EACpB,MAAM,oBAAoB,CAAC;AAG5B,YAAY,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAEzD,MAAM,WAAW,mBAAmB;IAClC,mDAAmD;IACnD,KAAK,EAAE,cAAc,EAAE,CAAC;IACxB,mDAAmD;IACnD,KAAK,EAAE,IAAI,EAAE,CAAC;IACd;;;;OAIG;IACH,SAAS,EAAE,CAAC,QAAQ,EAAE,cAAc,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,IAAI,CAAC;IAClE,uEAAuE;IACvE,aAAa,EAAE,CAAC,aAAa,EAAE,MAAM,EAAE,OAAO,EAAE,kBAAkB,KAAK,IAAI,CAAC;IAC5E,kEAAkE;IAClE,iBAAiB,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,eAAe,EAAE,YAAY,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IAC1F,yDAAyD;IACzD,oBAAoB,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IAC/C,sDAAsD;IACtD,aAAa,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC,uDAAuD;IACvD,cAAc,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,YAAY,KAAK,IAAI,CAAC;IAC9D,2DAA2D;IAC3D,aAAa,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,kBAAkB,KAAK,IAAI,CAAC;IAClE,gCAAgC;IAChC,gBAAgB,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IAC3C,yDAAyD;IACzD,iBAAiB,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,kBAAkB,KAAK,IAAI,CAAC;IACtF,gEAAgE;IAChE,wBAAwB,EAAE,CAAC,aAAa,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,CAAC;IACxE,yDAAyD;IACzD,iBAAiB,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,kBAAkB,GAAG,SAAS,CAAC;IACtE,+EAA+E;IAC/E,cAAc,EAAE,MAAM,MAAM,CAAC;IAC7B,6EAA6E;IAC7E,YAAY,EAAE,CAAC,SAAS,EAAE,cAAc,KAAK,IAAI,CAAC;IAClD;;;;OAIG;IACH,aAAa,EAAE,MAAM,IAAI,CAAC;IAC1B;;;OAGG;IACH,WAAW,EAAE,CAAC,UAAU,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IAC3C,0EAA0E;IAC1E,UAAU,EAAE,MAAM,OAAO,CAAC;CAC3B;AAuCD,KAAK,kBAAkB,GAAG,OAAO,CAC/B,IAAI,CAAC,eAAe,EAAE,OAAO,GAAG,WAAW,GAAG,MAAM,GAAG,aAAa,CAAC,CACtE,CAAC;AA8BF,wBAAgB,aAAa,CAC3B,YAAY,EAAE,cAAc,EAAE,EAC9B,YAAY,EAAE,IAAI,EAAE,EACpB,YAAY,UAAQ,GACnB,mBAAmB,CAgbrB"}
1
+ {"version":3,"file":"use-graph-state.d.ts","sourceRoot":"","sources":["../../../../../src/presentation/web/hooks/use-graph-state.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,IAAI,EAAY,MAAM,eAAe,CAAC;AACpD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uCAAuC,CAAC;AAC5E,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AACxE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,qCAAqC,CAAC;AAC9E,OAAO,EAEL,KAAK,YAAY,EAEjB,KAAK,cAAc,EACpB,MAAM,oBAAoB,CAAC;AAG5B,YAAY,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAEzD,MAAM,WAAW,mBAAmB;IAClC,mDAAmD;IACnD,KAAK,EAAE,cAAc,EAAE,CAAC;IACxB,mDAAmD;IACnD,KAAK,EAAE,IAAI,EAAE,CAAC;IACd;;;;OAIG;IACH,SAAS,EAAE,CAAC,QAAQ,EAAE,cAAc,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,IAAI,CAAC;IAClE,uEAAuE;IACvE,aAAa,EAAE,CAAC,aAAa,EAAE,MAAM,EAAE,OAAO,EAAE,kBAAkB,KAAK,IAAI,CAAC;IAC5E,kEAAkE;IAClE,iBAAiB,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,eAAe,EAAE,YAAY,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IAC1F,yDAAyD;IACzD,oBAAoB,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IAC/C,sDAAsD;IACtD,aAAa,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC,uDAAuD;IACvD,cAAc,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,YAAY,KAAK,IAAI,CAAC;IAC9D,2DAA2D;IAC3D,aAAa,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,kBAAkB,KAAK,IAAI,CAAC;IAClE,gCAAgC;IAChC,gBAAgB,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IAC3C,yDAAyD;IACzD,iBAAiB,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,kBAAkB,KAAK,IAAI,CAAC;IACtF,gEAAgE;IAChE,wBAAwB,EAAE,CAAC,aAAa,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,CAAC;IACxE,yDAAyD;IACzD,iBAAiB,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,kBAAkB,GAAG,SAAS,CAAC;IACtE,+EAA+E;IAC/E,cAAc,EAAE,MAAM,MAAM,CAAC;IAC7B,6EAA6E;IAC7E,YAAY,EAAE,CAAC,SAAS,EAAE,cAAc,KAAK,IAAI,CAAC;IAClD;;;;OAIG;IACH,aAAa,EAAE,MAAM,IAAI,CAAC;IAC1B;;;OAGG;IACH,WAAW,EAAE,CAAC,UAAU,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IAC3C,0EAA0E;IAC1E,UAAU,EAAE,MAAM,OAAO,CAAC;CAC3B;AAuCD,KAAK,kBAAkB,GAAG,OAAO,CAC/B,IAAI,CAAC,eAAe,EAAE,OAAO,GAAG,WAAW,GAAG,MAAM,GAAG,aAAa,CAAC,CACtE,CAAC;AA8BF,wBAAgB,aAAa,CAC3B,YAAY,EAAE,cAAc,EAAE,EAC9B,YAAY,EAAE,IAAI,EAAE,EACpB,YAAY,UAAQ,GACnB,mBAAmB,CAicrB"}
@@ -82,6 +82,9 @@ export function useGraphState(initialNodes, initialEdges, showArchived = false)
82
82
  // Retained for one extra reconcile cycle so the user sees the deleting state
83
83
  // before the node disappears from the canvas.
84
84
  const deletingRetainedRef = useRef(new Set());
85
+ // Track deleted repo IDs so reconcile doesn't resurrect them from stale server data.
86
+ // Cleared once reconcile sees the repo is gone from server data.
87
+ const deletedRepoIdsRef = useRef(new Set());
85
88
  // Callbacks stored in a ref so changing them doesn't trigger re-render.
86
89
  // The stable wrapper object reads from the ref so node closures always use latest callbacks.
87
90
  const callbacksRef = useRef({});
@@ -254,6 +257,17 @@ export function useGraphState(initialNodes, initialEdges, showArchived = false)
254
257
  setRepoMap((currentRepoMap) => {
255
258
  // Start with everything the server returned
256
259
  const merged = new Map(newRepoMap);
260
+ // Remove repos that were deleted client-side but the server still returns
261
+ // (stale data). Once the server stops returning the repo, clear the tombstone.
262
+ for (const deletedId of deletedRepoIdsRef.current) {
263
+ if (merged.has(deletedId)) {
264
+ merged.delete(deletedId);
265
+ }
266
+ else {
267
+ // Server confirmed deletion — no longer need the tombstone
268
+ deletedRepoIdsRef.current.delete(deletedId);
269
+ }
270
+ }
257
271
  // Build a set of repositoryPaths present in server data for dedup
258
272
  const serverPaths = new Set([...newRepoMap.values()].map((e) => e.data.repositoryPath));
259
273
  for (const [id, entry] of currentRepoMap) {
@@ -343,6 +357,7 @@ export function useGraphState(initialNodes, initialEdges, showArchived = false)
343
357
  }, []);
344
358
  const addRepository = useCallback((nodeId, data) => {
345
359
  protectedRepoIdsRef.current.add(nodeId);
360
+ deletedRepoIdsRef.current.delete(nodeId);
346
361
  setRepoMap((prev) => {
347
362
  const next = new Map(prev);
348
363
  next.set(nodeId, { nodeId, data });
@@ -351,6 +366,7 @@ export function useGraphState(initialNodes, initialEdges, showArchived = false)
351
366
  }, []);
352
367
  const removeRepository = useCallback((nodeId) => {
353
368
  protectedRepoIdsRef.current.delete(nodeId);
369
+ deletedRepoIdsRef.current.add(nodeId);
354
370
  setRepoMap((prev) => {
355
371
  if (!prev.has(nodeId))
356
372
  return prev;
@@ -1,4 +1,4 @@
1
- export type TurnStatus = 'idle' | 'processing' | 'unread';
1
+ export type TurnStatus = 'idle' | 'processing' | 'unread' | 'awaiting_input';
2
2
  /**
3
3
  * Polls ALL active turn statuses from the backend.
4
4
  * No IDs needed — the backend returns every non-idle session status.
@@ -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;;;;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
+ {"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,GAAG,gBAAgB,CAAC;AAE7E;;;;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"}
@@ -14,7 +14,7 @@ export function useAllTurnStatuses() {
14
14
  return {};
15
15
  return res.json();
16
16
  },
17
- refetchInterval: 5_000,
17
+ refetchInterval: 2_000,
18
18
  });
19
19
  return data ?? {};
20
20
  }